From fd62e8e0b11ee1029bd1ebe003d218eee4224542 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 21:48:59 -0500 Subject: [PATCH 0001/4235] Popups: don't dedicate window if has :same t rule #309 --- core/autoload/popups.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/popups.el b/core/autoload/popups.el index c903a964b..a413119cd 100644 --- a/core/autoload/popups.el +++ b/core/autoload/popups.el @@ -308,7 +308,8 @@ without leaving any trace behind (muahaha)." ;; `switch-to-buffer-other-window' won't use this window). (set-window-parameter window 'no-other-window doom-popup-mode) ;; Makes popup window resist interactively changing its buffer. - (set-window-dedicated-p window doom-popup-mode) + (unless (plist-get doom-popup-rules :same) + (set-window-dedicated-p window doom-popup-mode)) (cond (doom-popup-mode (when doom-popup-no-fringes (set-window-fringes window 0 0 fringes-outside-margins)) From 50c1ad0875ef87e7833199ed0eda82169487932a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Jan 2018 22:42:41 -0500 Subject: [PATCH 0002/4235] Fix esc not exiting snippets Caused by a custom ESC keybind overriding +evil-esc-hook --- modules/feature/snippets/config.el | 2 +- modules/private/default/+bindings.el | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 68c1a9a97..ec8adc255 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -37,7 +37,7 @@ (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) ;; Exit snippets on ESC from normal mode - (add-hook '+evil-esc-hook #'yas-exit-all-snippets)) + (add-hook '+evil-esc-hook #'yas-abort-snippet)) (def-package! auto-yasnippet diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index a525a5a1c..d17193caa 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -603,7 +603,6 @@ "" #'+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 From 92e52fafd1c6174212ed0e2312dbd47e38adcef5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Jan 2018 13:50:35 -0500 Subject: [PATCH 0003/4235] Fix expand-region misplacing cursor on cancel/C-g #317 --- core/core-editor.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 96de4e8ab..92344479c 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -223,7 +223,12 @@ extension, try to guess one." command-log-mode-open-log-turns-on-mode t)) (def-package! expand-region - :commands (er/expand-region er/contract-region er/mark-symbol er/mark-word)) + :commands (er/expand-region er/contract-region er/mark-symbol er/mark-word) + :config + (defun doom*quit-expand-region () + (when (memq last-command '(er/expand-region er/contract-region)) + (er/contract-region 0))) + (advice-add #'evil-escape :before #'doom*quit-expand-region)) (def-package! help-fns+ ; Improved help commands :commands (describe-buffer describe-command describe-file From e261df378242da4482940bc16d84b55b7d43c884 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Jan 2018 14:41:10 -0500 Subject: [PATCH 0004/4235] Update issue/pr templates --- .github/ISSUE_TEMPLATE | 27 ++++++++++++--------------- .github/PULL_REQUEST_TEMPLATE | 2 +- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE index ff0b5bb67..ed296fa16 100644 --- a/.github/ISSUE_TEMPLATE +++ b/.github/ISSUE_TEMPLATE @@ -1,23 +1,23 @@ -Here are some things you should try before filing a bug report: +Please check off the following before submitting your issue: -+ 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. ++ [ ] I ran `make clean && make` and restarted Emacs, but the issue persists. ++ [ ] I ran `make doctor` and it produced nothing conclusive. ++ [ ] [The troubleshooting section of the FAQ](/wiki/FAQ#troubleshooting) says + nothing about my issue. ++ [ ] I read the README.org files of any modules that are relevant (that I am + aware of). ++ [ ] I filled out the four fields in the template below. ++ [ ] I have deleted this checklist and message. --- ### 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). +Describe what happened. ### Expected behavior -Describe what you _expected_ to happen. +Describe what you expected to happen. ### Steps to reproduce @@ -31,9 +31,6 @@ Describe what you _expected_ to happen. 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) +Replace this line with the output of `M-x doom/info` OR `DEBUG=1 make doctor` ``` diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE index c7cab1bfb..ee07642c4 100644 --- a/.github/PULL_REQUEST_TEMPLATE +++ b/.github/PULL_REQUEST_TEMPLATE @@ -1,5 +1,5 @@ Thank you for contributing to Doom! -Before you submit this PR, please make sure your PR is targeted at develop, not +Before you submit this PR, please make sure it 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 edc53706baea8ba19ce6d42e224c6380a5b99a10 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Jan 2018 20:36:15 -0500 Subject: [PATCH 0005/4235] feature/snippets: temporarily monkey-patch regression in yasnippet See https://github.com/joaotavora/yasnippet/issues/883 --- modules/feature/snippets/config.el | 53 +++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index ec8adc255..885783656 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -37,7 +37,58 @@ (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) ;; Exit snippets on ESC from normal mode - (add-hook '+evil-esc-hook #'yas-abort-snippet)) + (add-hook '+evil-esc-hook #'yas-abort-snippet) + + ;; Monkey patch yas-expand-snippet until #883 is resolved. See + ;; https://github.com/joaotavora/yasnippet/issues/883 + (defun +snippets*yas-expand-snippet (content &optional start end expand-env) + "Expand snippet CONTENT at current point. + +Text between START and END will be deleted before inserting +template. EXPAND-ENV is a list of (SYM VALUE) let-style dynamic bindings +considered when expanding the snippet." + (cl-assert (and yas-minor-mode (memq 'yas--post-command-handler post-command-hook)) + nil "[yas] `yas-expand-snippet' needs properly setup `yas-minor-mode'") + (run-hooks 'yas-before-expand-snippet-hook) + (let* ((yas-selected-text (or yas-selected-text + (and (region-active-p) + (buffer-substring-no-properties (region-beginning) + (region-end))))) + (start (or start (and (region-active-p) (region-beginning)) (point))) + (end (or end (and (region-active-p) (region-end)) (point))) + (to-delete (and start end (buffer-substring-no-properties start end))) + snippet) + (goto-char start) + (setq yas--indent-original-column (current-column)) + (when (and to-delete (> end start)) + (delete-region start end)) + (cond ((listp content) (yas--eval-for-effect content)) + (t + (setq yas--start-column (current-column)) + (let ((yas--inhibit-overlay-hooks t)) + (setq snippet + (yas--snippet-create content expand-env start (point)))) + (let ((existing-field (and yas--active-field-overlay + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field)))) + (when existing-field + (setf (yas--snippet-previous-active-field snippet) existing-field) + (yas--advance-end-maybe existing-field (overlay-end yas--active-field-overlay)))) + (unless (yas--snippet-fields snippet) + (yas-exit-snippet snippet)) + (let ((first-field (car (yas--snippet-fields snippet)))) + (when first-field + (sit-for 0) + (yas--letenv (yas--snippet-expand-env snippet) + (yas--move-to-field snippet first-field)) + (when (and (eq (yas--field-number first-field) 0) + (> (length (yas--field-text-for-display + first-field)) + 0)) + (setq deactivate-mark nil)))) + (yas--message 4 "snippet %d expanded." (yas--snippet-id snippet)) + t)))) + (advice-add #'yas-expand-snippet :override #'+snippets*yas-expand-snippet)) (def-package! auto-yasnippet From 3d5d1b65b39a2ec8573f4040d45d7901248f357b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 03:32:19 -0500 Subject: [PATCH 0006/4235] Move misplaced doom--buffer-narrowed-origin to correct place --- core/autoload/buffers.el | 2 -- core/autoload/editor.el | 9 +++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 83369cd4c..5c6bef38d 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -1,7 +1,5 @@ ;;; core/autoload/buffers.el -*- lexical-binding: t; -*- -(defvar-local doom-buffer--narrowed-origin nil) - ;;;###autoload (defvar doom-real-buffer-functions '() "A list of predicate functions run to determine if a buffer is real. These diff --git a/core/autoload/editor.el b/core/autoload/editor.el index b98d53e75..5f83b80bc 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -218,6 +218,7 @@ consistent throughout a selected region, depending on `indent-tab-mode'." (tabify beg end) (untabify beg end))) +(defvar-local doom--buffer-narrowed-origin nil) ;;;###autoload (defun doom/narrow-buffer (beg end &optional clone-p) "Restrict editing in this buffer to the current region, indirectly. With CLONE-P, @@ -231,12 +232,12 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" (when clone-p (let ((old-buf (current-buffer))) (switch-to-buffer (clone-indirect-buffer nil nil)) - (setq doom-buffer--narrowed-origin old-buf))) + (setq doom--buffer-narrowed-origin old-buf))) (narrow-to-region beg end)) - (doom-buffer--narrowed-origin + (doom--buffer-narrowed-origin (kill-this-buffer) - (switch-to-buffer doom-buffer--narrowed-origin) - (setq doom-buffer--narrowed-origin nil)) + (switch-to-buffer doom--buffer-narrowed-origin) + (setq doom--buffer-narrowed-origin nil)) (t (widen)))) From e0c8e6daef1fd0fb957e8a7e716c12d9d8048495 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 03:38:35 -0500 Subject: [PATCH 0007/4235] New doom-unreal-buffer-functions function & doom-real-buffer-p spec --- core/autoload/buffers.el | 51 ++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 5c6bef38d..beaf8b51f 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -2,10 +2,22 @@ ;;;###autoload (defvar doom-real-buffer-functions '() - "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.") + "A list of predicate functions run to determine if a buffer is real, unlike +`doom-unreal-buffer-functions'. They are passed one argument: the buffer to be +tested. + +Should any of its function returns non-nil, the rest of the functions are +ignored and the buffer is considered real.") + +;;;###autoload +(defvar doom-unreal-buffer-functions + '(minibufferp doom-special-buffer-p doom-non-file-visiting-buffer-p) + "A list of predicate functions run to determine if a buffer is *not* real, +unlike `doom-real-buffer-functions'. They are passed one argument: the buffer to +be tested. + +Should any of these functions return non-nil, the rest of the functions are +ignored and the buffer is considered unreal.") ;;;###autoload (defvar-local doom-real-buffer-p nil @@ -42,6 +54,16 @@ If no project is active, return all buffers." collect buf) buffers))) +;;;###autoload +(defun doom-special-buffer-p (buf) + "Returns non-nil if BUF's name starts and ends with an *." + (string-match-p "^\\s-*\\*" (buffer-name buf))) + +;;;###autoload +(defun doom-non-file-visiting-buffer-p (buf) + "Returns non-nil if BUF does not have a value for `buffer-file-name'." + (not (buffer-file-name buf))) + ;;;###autoload (defun doom-real-buffer-list (&optional buffer-list) "Return a list of buffers that satify `doom-real-buffer-p'." @@ -51,25 +73,20 @@ If no project is active, return all buffers." ;;;###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: + "Returns t if BUFFER-OR-NAME is a 'real' buffer. The 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*) + 1. A non-nil value for the buffer-local value of the `doom-real-buffer-p' + variable OR + 2. Any function in `doom-real-buffer-functions' returns non-nil OR + 3. None of the functions in `doom-unreal-buffer-functions' must return + non-nil. 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))))))) + (not (run-hook-with-args-until-success 'doom-unreal-buffer-functions buf))))) ;;;###autoload (defun doom-buffers-in-mode (modes &optional buffer-list derived-p) From 8e7b822062305b353f3e375a9e510b4df7e660a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 03:44:32 -0500 Subject: [PATCH 0008/4235] Remove core-popup coupling New popup management system coming soon! --- core/autoload/buffers.el | 4 +--- .../feature/workspaces/autoload/workspaces.el | 19 +++++++++---------- modules/lang/emacs-lisp/autoload.el | 2 +- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index beaf8b51f..269573274 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -105,9 +105,7 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." ;;;###autoload (defun doom-visible-windows (&optional window-list) "Return a list of the visible, non-popup windows." - (cl-loop for win in (or window-list (window-list)) - unless (doom-popup-p win) - collect win)) + (cl-remove-if #'window-at-side-p (or window-list (window-list)))) ;;;###autoload (defun doom-visible-buffers (&optional buffer-list) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 7aff9382c..f72fc182f 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -405,16 +405,15 @@ end of the workspace list." "Close the selected window. If it's the last window in the workspace, close the workspace and move to the next." (interactive) - (if (doom-popup-p) - (doom/popup-close) - (let ((current-persp-name (+workspace-current-name))) - (cond ((or (+workspace--protected-p current-persp-name) - (> (length (doom-visible-windows)) 1)) - (if (bound-and-true-p evil-mode) - (evil-window-delete) - (delete-window))) - ((> (length (+workspace-list-names)) 1) - (+workspace/delete current-persp-name)))))) + (let ((delete-window-fn (if (featurep 'evil) #'evil-window-delete #'delete-window))) + (if (window-at-side-p) + (funcall delete-window-fn) + (let ((current-persp-name (+workspace-current-name))) + (cond ((or (+workspace--protected-p current-persp-name) + (cdr (doom-visible-windows))) + (funcall delete-window-fn)) + ((cdr (+workspace-list-names)) + (+workspace/delete current-persp-name))))))) ;;;###autoload (defun +workspace/close-workspace-or-frame () diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 949a401fc..6b0af7015 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -30,6 +30,6 @@ to a pop up buffer." (setq lines (count-lines (point-min) (point-max))) (goto-char (point-min)) (if (> lines 1) - (doom-popup-buffer buf) + (pop-to-buffer buf t) (message "%s" (buffer-substring (point-min) (point-max))) (kill-buffer buf))))) From 9f884bf998beb3bc3f6c6fa748379dcd5ec977d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 12:51:09 -0500 Subject: [PATCH 0009/4235] Move delayed-warnings deferral to core.el Possibly addresses #319 --- core/core.el | 7 +++++++ modules/feature/workspaces/config.el | 7 +------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/core.el b/core/core.el index fbcc2348d..b087e12f6 100644 --- a/core/core.el +++ b/core/core.el @@ -146,6 +146,10 @@ ability to invoke the debugger in debug mode." ;;; ;; Initialize (eval-and-compile + ;; Defer warnings during the Doom startup process, giving other modules more + ;; time to initialize and make mistakes. + (remove-hook 'delayed-warnings-hook #'display-delayed-warnings) + (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, @@ -184,6 +188,9 @@ ability to invoke the debugger in debug mode." (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook))) + ;; We're ready to display warnings now. + (add-hook 'delayed-warnings-hook #'display-delayed-warnings t) + ;; If you forget to reset this, you'll get stuttering and random freezes! (setq gc-cons-threshold 16777216 gc-cons-percentage 0.1 diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index f03fb236f..a6365e7f9 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -74,10 +74,6 @@ Ensures the scratch (or dashboard) buffers are CDed into the project's root." (advice-remove #'doom-buffer-list #'+workspace-buffer-list))) (add-hook 'persp-mode-hook #'+workspaces|on-persp-mode) - ;; Defer delayed warnings even further, so they appear after persp-mode is - ;; started and the main workspace is ready to display them. Otherwise, warning - ;; buffers will be hidden on startup. - (remove-hook 'delayed-warnings-hook #'display-delayed-warnings) (defun +workspaces|init (&optional frame) (unless persp-mode (persp-mode +1) @@ -95,8 +91,7 @@ Ensures the scratch (or dashboard) buffers are CDed into the project's root." ;; Switch to it if we aren't auto-loading the last session (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main frame))) - (add-hook 'delayed-warnings-hook #'display-delayed-warnings t))) + (persp-frame-switch +workspaces-main frame))))) (defun +workspaces*auto-add-buffer (buffer &rest _) "Auto-associate buffers with perspectives upon opening them. From db5910da3c33400aedfc11fc8238b27b42621155 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:15:25 -0500 Subject: [PATCH 0010/4235] lang/org: don't error out if +org-dir doesn't exist --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 1f0096f43..6412459e5 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -121,7 +121,7 @@ unfold to point on startup." (setq-default org-adapt-indentation nil org-agenda-dim-blocked-tasks nil - org-agenda-files (directory-files +org-dir t "\\.org$" t) + org-agenda-files (ignore-errors (directory-files +org-dir t "\\.org$" t)) org-agenda-inhibit-startup t org-agenda-skip-unavailable-files nil org-cycle-include-plain-lists t From 052cee93dbbd5dfa5975e61ec3ca954e0ece0eae Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Thu, 4 Jan 2018 15:49:18 +0800 Subject: [PATCH 0011/4235] fix ivy. Due to this commit https://github.com/abo-abo/swiper/commit/4f57b5a9eb3f9c971d48fb33dca54af43bd497ca --- modules/completion/ivy/autoload/ivy.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 8a008348d..005271855 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -141,7 +141,7 @@ counsel-rg)." (setq extra-ag-args "")) (if (< (length string) 1) ;; #1 (counsel-more-chars 1) - (let ((default-directory counsel--git-dir) + (let ((default-directory (ivy-state-directory ivy-last)) (regex (counsel-unquote-regex-parens (setq ivy--old-re (ivy--regex string))))) @@ -200,7 +200,7 @@ counsel-rg)." (with-ivy-window (let ((file-name (match-string-no-properties 1 x)) (line-number (match-string-no-properties 2 x))) - (find-file-other-window (expand-file-name file-name counsel--git-dir)) + (find-file-other-window (expand-file-name file-name (ivy-state-directory ivy-last))) (goto-char (point-min)) (forward-line (1- (string-to-number line-number))) (re-search-forward (ivy--regex ivy-text t) (line-end-position) t) From f3562eb038ea48c5a01f51b6c8a60b592fed5ddd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:24:11 -0500 Subject: [PATCH 0012/4235] feature/workspaces: refactor persp-mode init --- .../feature/workspaces/autoload/workspaces.el | 43 ++++++++-- modules/feature/workspaces/config.el | 81 +++++++++---------- .../workspaces/test/autoload-workspaces.el | 60 ++++++++++---- 3 files changed, 118 insertions(+), 66 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index f72fc182f..de2a4984d 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -187,6 +187,13 @@ buffers." +workspaces-main))) (persp-frame-switch name)) +;;;###autoload +(defun +workspace-on-new-frame (frame &optional _new-frame-p) + "Spawn a perspective for each new frame." + (select-frame frame) + (+workspace/new) + (set-frame-parameter frame 'assoc-persp (+workspace-current-name))) + ;; ;; Interactive commands @@ -473,12 +480,10 @@ the workspace and move to the next." (interactive) (message "%s" (+workspace--tabline))) -;;;###autoload -(defun +workspace-on-new-frame (frame &optional _new-frame-p) - "Spawn a perspective for each new frame." - (select-frame frame) - (+workspace/new) - (set-frame-parameter frame 'assoc-persp (+workspace-current-name))) + +;; +;; Hooks +;; ;;;###autoload (defun +workspaces|delete-associated-workspace-maybe (frame) @@ -489,6 +494,32 @@ the workspace and move to the next." (not (equal frame-persp +workspaces-main))) (+workspace/delete frame-persp))))) +;;;###autoload +(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)))) + +;;;###autoload +(defun +workspaces|cleanup-unassociated-buffers () + (cl-loop for buf in (buffer-list) + unless (persp--buffer-in-persps buf) + if (kill-buffer buf) + do (cl-incf n))) + + +;; +;; Advice +;; + ;;;###autoload (defun +workspaces*autosave-real-buffers (orig-fn &rest args) "Don't autosave if no real buffers are open." diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index a6365e7f9..c66148228 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -42,56 +42,51 @@ renamed.") ;; Bootstrap (add-hook 'doom-post-init-hook #'+workspaces|init) (add-hook 'after-make-frame-functions #'+workspaces|init) - + (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) + ;; only auto-save when real buffers are present + (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) + ;; Modify `delete-window' to close the workspace if used on the last window (define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace) + ;; For `doom/cleanup-session' + (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) - ;; per-frame and per-project workspaces + ;; per-frame workspaces (setq persp-init-new-frame-behaviour-override nil persp-interactive-init-frame-behaviour-override #'+workspace-on-new-frame) (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace-maybe) - - (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)))) + ;; Per-project workspaces (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) - - (defun +workspaces|on-persp-mode () - ;; Remap `buffer-list' to current workspace's buffers in `doom-buffer-list' - (if persp-mode - (advice-add #'doom-buffer-list :override #'+workspace-buffer-list) - (advice-remove #'doom-buffer-list #'+workspace-buffer-list))) - (add-hook 'persp-mode-hook #'+workspaces|on-persp-mode) - + ;; (defun +workspaces|init (&optional frame) (unless persp-mode - (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 - ;; `persp-nil-name') is special and doesn't actually represent a real - ;; persp object, so buffers can't really be assigned to it, among other - ;; quirks. We create a *real* main workspace to fill this role. - (unless (persp-with-name-exists-p +workspaces-main) - (persp-add-new +workspaces-main)) - ;; Switch to it if we aren't auto-loading the last session - (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) - (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main frame))))) + (persp-mode +1)) + (unless noninteractive + ;; The default perspective persp-mode makes (defined by + ;; `persp-nil-name') is special and doesn't actually represent a real + ;; persp object, so buffers can't really be assigned to it, among other + ;; quirks. We create a *real* main workspace to fill this role. + (unless (persp-with-name-exists-p +workspaces-main) + (persp-add-new +workspaces-main)) + ;; Switch to it if we aren't auto-loading the last session + (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) + (= persp-auto-resume-time -1)) + (persp-frame-switch +workspaces-main (or frame (selected-frame)))))) + + (defun +workspaces|init-persp-mode () + ;; Remap `buffer-list' to current workspace's buffers in `doom-buffer-list' + (cond (persp-mode + ;; 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) + + (advice-add #'switch-to-buffer :after #'+workspaces*auto-add-buffer) + (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) + (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) + (t + (advice-remove #'switch-to-buffer #'+workspaces*auto-add-buffer) + (advice-remove #'display-buffer #'+workspaces*auto-add-buffer) + (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) (defun +workspaces*auto-add-buffer (buffer &rest _) "Auto-associate buffers with perspectives upon opening them. @@ -101,7 +96,5 @@ Allows a perspective-specific buffer list via `+workspaces-buffer-list'." (not persp-temporarily-display-buffer) (doom-real-buffer-p buffer)) (persp-add-buffer buffer (get-current-persp) nil) - (force-mode-line-update t))) - (advice-add #'switch-to-buffer :after #'+workspaces*auto-add-buffer) - (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer)) + (force-mode-line-update t)))) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index ff69bfb67..25701711b 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -1,6 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/workspaces/test/autoload-workspaces.el +(load "persp-mode.el" nil t) (require! :feature workspaces) (defmacro with-workspace!! (buffer-args &rest body) @@ -8,28 +9,30 @@ (let ((buffers (cl-loop for bsym in buffer-args collect `(,bsym (get-buffer-create ,(symbol-name bsym)))))) - `(let (noninteractive) + `(let ((persp-auto-resume-time -1) + (persp-auto-save-opt 0) + persp-autokill-buffer-on-remove + persp-names-cache + noninteractive) (+workspaces|init) - (save-window-excursion - (let* (,@buffers) - (cl-loop with persp = (get-current-persp) - for buf in (list ,@(mapcar #'car buffers)) - do (persp-add-buffer buf persp) - do (with-current-buffer buf - (setq buffer-file-name (make-temp-file "workspaces-test-")))) - ,@body - (dolist (buf (list ,@(mapcar #'car buffers))) - (persp-remove-buffer buf) - (kill-buffer buf)))) - (persp-mode -1) - (setq *persp-hash* nil - persp-buffer-props-hash nil)))) + (let* (,@buffers) + (cl-loop with persp = (get-current-persp) + for buf in (list ,@(mapcar #'car buffers)) + do (persp-add-buffer buf persp) + do (with-current-buffer buf + (setq buffer-file-name (make-temp-file "workspaces-test-")))) + ,@body + (+workspace-delete +workspaces-main) + (let (kill-buffer-query-functions kill-buffer-hook) + (mapc #'kill-buffer (list ,@(mapcar #'car buffers))))) + (persp-mode -1)))) -;; +;; `+workspaces|init' (def-test! init (with-workspace!! () (should (equal (+workspace-current-name) +workspaces-main)))) +;; `+workspaces*auto-add-buffer' (def-test! auto-add-buffer-to-persp (let ((a (generate-new-buffer "a"))) (doom-set-buffer-real a t) @@ -38,6 +41,8 @@ (switch-to-buffer a) (should (+workspace-contains-buffer-p a))))) +;; `+workspace-current' +;; `+workspace-current-name' (def-test! current (with-workspace!! () (should (equal (+workspace-current-name) +workspaces-main)) @@ -49,6 +54,8 @@ (should (+workspace-p current-workspace)) (should (equal workspace current-workspace))))) +;; `+workspace-list' +;; `+workspace-list-names' (def-test! workspace-list (with-workspace!! () (should (equal (+workspace-list-names) @@ -56,6 +63,9 @@ (should (equal (+workspace-list) (list (+workspace-current)))))) +;; `+workspace-new' +;; `+workspace-rename' +;; `+workspace-delete' (def-test! workspace-crud "Creating, reading, updating and deleting workspaces." (with-workspace!! () @@ -71,6 +81,7 @@ (+workspace-delete renamed-workspace-name) (should (= (length (+workspace-list-names)) 1))))) +;; `+workspace-switch' (def-test! workspace-switch (with-workspace!! () (let ((new-workspace-name "*new-test*")) @@ -78,6 +89,8 @@ (should (+workspace-switch new-workspace-name t)) (should (equal (+workspace-current-name) new-workspace-name))))) +;; `+workspace-buffer-list' +;; `+workspace-contains-buffer-p' (def-test! buffer-list (with-workspace!! (a b) (let ((c (get-buffer-create "c")) @@ -93,3 +106,18 @@ (switch-to-buffer "d") (should-not (+workspace-contains-buffer-p d))))) +;; `+workspace/close-window-or-workspace' +(def-test! close-window-or-workspace + (with-workspace!! (a b) + (let ((ws (+workspace-current-name)) + (inhibit-message t)) + (+workspace-switch "test" t) + (split-window) + (should (equal (+workspace-current-name) "test")) + (should (= (length (doom-visible-windows)) 2)) + ;; kill window if more than one + (+workspace/close-window-or-workspace) + (should (= (length (doom-visible-windows)) 1)) + ;; kill workspace on last window + (+workspace/close-window-or-workspace) + (should (equal (+workspace-current-name) "main"))))) From e9a012af343d10dc221d5600b193675dcbf23642 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:43:08 -0500 Subject: [PATCH 0013/4235] doom-visible-windows: fix predicate for 'popup window' --- core/autoload/buffers.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 269573274..48c310c55 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -105,7 +105,9 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." ;;;###autoload (defun doom-visible-windows (&optional window-list) "Return a list of the visible, non-popup windows." - (cl-remove-if #'window-at-side-p (or window-list (window-list)))) + (cl-loop for window in (or window-list (window-list)) + unless (eq (window-dedicated-p window) 'side) + collect window)) ;;;###autoload (defun doom-visible-buffers (&optional buffer-list) From fa72e8d09bf533867330216fd7f167109bfe8ba1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:43:33 -0500 Subject: [PATCH 0014/4235] Simplify doom-buried-buffers & doom-real-buffer-list --- core/autoload/buffers.el | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 48c310c55..2fd38ff72 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -67,9 +67,7 @@ If no project is active, return all buffers." ;;;###autoload (defun doom-real-buffer-list (&optional buffer-list) "Return a list of buffers that satify `doom-real-buffer-p'." - (cl-loop for buf in (or buffer-list (doom-buffer-list)) - if (doom-real-buffer-p buf) - collect buf)) + (cl-remove-if-not #'doom-real-buffer-p (or buffer-list (doom-buffer-list)))) ;;;###autoload (defun doom-real-buffer-p (&optional buffer-or-name) @@ -119,9 +117,7 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." ;;;###autoload (defun doom-buried-buffers (&optional buffer-list) "Get a list of buffers that are buried." - (cl-loop for buf in (or buffer-list (doom-buffer-list)) - unless (get-buffer-window buf) - collect buf)) + (cl-remove-if #'get-buffer-window (or buffer-list (doom-buffer-list)))) ;;;###autoload (defun doom-matching-buffers (pattern &optional buffer-list) From 00cc57a2bdf4f658455240d9022fd90d6f7f7751 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:44:14 -0500 Subject: [PATCH 0015/4235] doom--cycle-real-buffers: if n=0, switch to fallback buffer --- core/autoload/buffers.el | 42 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 2fd38ff72..7aae88a6f 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -126,29 +126,31 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." when (string-match-p pattern (buffer-name buf)) collect buf)) -(defun doom--cycle-real-buffers (&optional n) +(defun doom--cycle-real-buffers (n) "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)))) - (cond ((or (not buffers) - (zerop (% n (1+ (length buffers))))) - (switch-to-buffer (doom-fallback-buffer) nil t)) - ((= (length buffers) 1) - (switch-to-buffer (car buffers) nil t)) - (t - ;; Why this instead of switching straight to the Nth buffer in - ;; BUFFERS? Because `switch-to-next-buffer' and - ;; `switch-to-prev-buffer' properly update buffer list order. - (cl-loop with move-func = - (if (> n 0) #'switch-to-next-buffer #'switch-to-prev-buffer) - for i to 20 - while (not (memq (current-buffer) buffers)) - do - (dotimes (_i (abs n)) - (funcall move-func))))) - (force-mode-line-update) - (current-buffer))) + (if (null n) + (switch-to-buffer (doom-fallback-buffer) nil t) + (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)) + ((= (length buffers) 1) + (switch-to-buffer (car buffers) nil t)) + (t + ;; Why this instead of switching straight to the Nth buffer in + ;; BUFFERS? Because `switch-to-next-buffer' and + ;; `switch-to-prev-buffer' properly update buffer list order. + (cl-loop with move-func = + (if (> n 0) #'switch-to-next-buffer #'switch-to-prev-buffer) + for i to 20 + while (not (memq (current-buffer) buffers)) + do + (dotimes (_i (abs n)) + (funcall move-func))))))) + (force-mode-line-update) + (current-buffer)) ;;;###autoload (defun doom-set-buffer-real (buffer flag) From ecc8051378510d512ce322b4a6dd8cf67a4b1b01 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:48:58 -0500 Subject: [PATCH 0016/4235] Refactor doom/kill-all-buffers & decouple from core-popup --- core/autoload/buffers.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 7aae88a6f..466811746 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -243,12 +243,13 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." If PROJECT-P (universal argument), kill only buffers that belong to the current project." (interactive "P") - (doom/popup-kill-all) - (let ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list)))) - (mapc #'doom-kill-buffer-and-windows buffers) - (unless (doom-real-buffer-p) - (switch-to-buffer (doom-fallback-buffer))) - (message "Killed %s buffers" (length buffers)))) + (let ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list))) + (ignore-window-parameters t)) + (delete-other-windows) + (switch-to-buffer (doom-fallback-buffer)) + (let (kill-buffer-query-functions) + (message "Killed %s buffers" + (length (delq nil (mapcar #'kill-buffer buffers))))))) ;;;###autoload (defun doom/kill-other-buffers (&optional project-p) From 8e875bfa0e5e8d4b40cc13d95ee18f29af9db10f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:52:17 -0500 Subject: [PATCH 0017/4235] Phase out doom-kill-buffer --- core/autoload/buffers.el | 49 +++------------------------- modules/app/irc/config.el | 2 +- modules/app/regex/autoload/regex.el | 2 -- modules/app/rss/config.el | 1 - modules/completion/helm/config.el | 4 +-- modules/private/default/+bindings.el | 2 +- 6 files changed, 8 insertions(+), 52 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 466811746..0548757be 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -158,41 +158,6 @@ buffers. If there's nothing left, switch to `doom-fallback-buffer'. See (with-current-buffer buffer (setq doom-real-buffer-p flag))) -;;;###autoload -(defun doom-kill-buffer (&optional buffer dont-save) - "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." - (unless buffer - (setq buffer (current-buffer))) - (when (and (bufferp buffer) - (buffer-live-p buffer)) - (let ((buffer-win (get-buffer-window buffer))) - ;; deal with modified buffers - (when (and (buffer-file-name buffer) - (buffer-modified-p buffer)) - (with-current-buffer buffer - (if (and (not dont-save) - (yes-or-no-p "Buffer is unsaved, save it?")) - (save-buffer) - (set-buffer-modified-p nil)))) - ;; 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 (defun doom-kill-buffer-and-windows (buffer) "Kill the buffer and delete all the windows it's displayed in." @@ -207,20 +172,13 @@ See `doom-real-buffer-p' for what 'real' means." regex PATTERN. Returns the number of killed buffers." (let ((buffers (doom-matching-buffers pattern buffer-list))) (dolist (buf buffers (length buffers)) - (doom-kill-buffer buf t)))) + (kill-buffer buf t)))) ;; ;; Interactive commands ;; -;;;###autoload -(defun doom/kill-this-buffer (&optional interactive-p) - "Use `doom-kill-buffer' on the current buffer." - (interactive (list 'interactive)) - (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 @@ -231,7 +189,10 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." (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) + (when (and (buffer-modified-p buffer) dont-save) + (with-current-buffer buffer + (set-buffer-modified-p nil))) + (kill-buffer buffer) (cl-loop for win in windows if (doom-real-buffer-p (window-buffer win)) do (with-selected-window win (doom/previous-buffer))))) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 35d02432c..0b98053cc 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -84,7 +84,7 @@ playback.") (add-hook 'circe-channel-mode-hook #'turn-on-visual-line-mode) ;; Let `+irc/quit' and `circe' handle buffer cleanup - (map! :map circe-mode-map [remap doom/kill-this-buffer] #'bury-buffer) + (map! :map circe-mode-map [remap kill-buffer] #'bury-buffer) (defun +irc*circe-truncate-nicks () "Truncate long nicknames in chat output non-destructively." diff --git a/modules/app/regex/autoload/regex.el b/modules/app/regex/autoload/regex.el index 7e43db77e..a54a210a5 100644 --- a/modules/app/regex/autoload/regex.el +++ b/modules/app/regex/autoload/regex.el @@ -33,8 +33,6 @@ (define-key map "\C-c\C-c" #'+regex-update-buffers) (define-key map "\C-c\C-r" #'=regex/replace) (define-key map "\C-c\C-k" #'+regex/quit) - (define-key map [remap doom-kill-buffer] #'+regex/quit) - (define-key map [remap doom/kill-this-buffer] #'+regex/quit) (define-key map [remap kill-this-buffer] #'+regex/quit) (define-key map [remap kill-buffer] #'+regex/quit) map) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 6cdce9a3c..bfd25007f 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -35,7 +35,6 @@ (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) (map! (:map (elfeed-search-mode-map elfeed-show-mode-map) - [remap doom/kill-this-buffer] "q" [remap kill-this-buffer] "q" [remap kill-buffer] "q") diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 33890f1b1..116c49c63 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -97,9 +97,7 @@ (def-package! helm-ag :defer t :config - (map! :map helm-ag-edit-map - [remap doom/kill-this-buffer] #'helm-ag--edit-abort - [remap quit-window] #'helm-ag--edit-abort)) + (map! :map helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort)) (def-package! helm-css-scss ; https://github.com/ShingoFukuyama/helm-css-scss diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index d17193caa..dc8beb3e4 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -289,7 +289,7 @@ ;; --- Personal vim-esque bindings ------------------ - :n "zx" #'doom/kill-this-buffer + :n "zx" #'kill-this-buffer :n "ZX" #'bury-buffer :n "]b" #'doom/next-buffer :n "[b" #'doom/previous-buffer From 69385fac1a145bbf2e49dcef3c9cd7cbab199d9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 13:54:51 -0500 Subject: [PATCH 0018/4235] Major rewrite of core-ui Phases out dependence on the doom-kill-buffer workflow, which ensured the user would always land on a real buffer (or the fallback buffer) after killing a buffer. This required all quit-window, kill-this-buffer and various buffer-killing commands be advised or remapped. There was no need, kill-buffer-query-functions is better. Also introduces a new hook: doom-init-theme-hook. doom-init-ui-hook still exists, but is used for UI initialization (surprise), while theme hooks should be moved over. --- core/core-editor.el | 13 -- core/core-ui.el | 424 +++++++++++++++++++++++++------------------- 2 files changed, 237 insertions(+), 200 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 92344479c..1592efdc2 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -52,18 +52,6 @@ modes are active and the buffer is read-only.") ediff-split-window-function #'split-window-horizontally ediff-window-setup-function #'ediff-setup-windows-plain) -(defun doom|dont-kill-scratch-buffer () - "Don't kill the scratch buffer." - (or (not (string= (buffer-name) "*scratch*")) - (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 @@ -218,7 +206,6 @@ extension, try to guess one." (def-package! command-log-mode :commands (command-log-mode global-command-log-mode) :config - (set! :popup "*command-log*" :size 40 :align 'right :noselect t) (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode t)) diff --git a/core/core-ui.el b/core/core-ui.el index ecf053cae..ccf600037 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -30,8 +30,11 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; Hook(s) (defvar doom-init-ui-hook nil - "List of hooks to run when the theme and font is initialized (or reloaded with -`doom//reload-theme').") + "List of hooks to run when core-ui is initialized.") + +(defvar doom-init-theme-hook nil + "List of hooks to run when the theme (and font) is initialized (or reloaded +with `doom//reload-theme').") (setq-default @@ -72,45 +75,36 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no -(defun doom-quit-p (&optional prompt) - "Return t if this session should be killed. Prompts the user for -confirmation." - (if (ignore-errors (doom-real-buffer-list)) - (or (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) - (ignore (message "Aborted"))) - t)) -(setq confirm-kill-emacs nil) -(add-hook 'kill-emacs-query-functions #'doom-quit-p) -;; show typed keystrokes in minibuffer -(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) -(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) -(doom|enable-ui-keystrokes) -;; ...but hide them while isearch is active -(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) -(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) +;; +;; A minor mode for hiding the mode-line +;; -;; A minor mode for toggling the mode-line (defvar-local doom--modeline-format nil "The modeline format to use when `doom-hide-modeline-mode' is active. Don't set this directly. Let-bind it instead.") + (defvar-local doom--old-modeline-format nil "The old modeline format, so `doom-hide-modeline-mode' can revert when it's disabled.") + (define-minor-mode doom-hide-modeline-mode "Minor mode to hide the mode-line in the current buffer." :init-value nil :global nil - (if doom-hide-modeline-mode - (setq doom--old-modeline-format mode-line-format - mode-line-format doom--modeline-format) - (setq mode-line-format doom--old-modeline-format - doom--old-modeline-format nil)) + (if (not doom-hide-modeline-mode) + (setq mode-line-format doom--old-modeline-format + doom--old-modeline-format nil) + (setq doom--old-modeline-format mode-line-format + mode-line-format doom--modeline-format) + (add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset nil t)) (force-mode-line-update)) + ;; Ensure major-mode or theme changes don't overwrite these variables (put 'doom--modeline-format 'permanent-local t) (put 'doom--old-modeline-format 'permanent-local t) (put 'doom-hide-modeline-mode 'permanent-local t) +(put 'doom-hide-modeline-mode 'permanent-local-hook t) (defun doom|hide-modeline-mode-reset () "Sometimes, a major-mode is activated after `doom-hide-modeline-mode' is @@ -121,121 +115,72 @@ local value, whether or not it's permanent-local. Therefore, we cycle (when doom-hide-modeline-mode (doom-hide-modeline-mode -1) (doom-hide-modeline-mode +1))) -(add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset) - -;; no modeline in completion popups -(add-hook 'completion-list-mode-hook #'doom-hide-modeline-mode) - -;; undo/redo changes to Emacs' window layout -(defvar winner-dont-bind-my-keys t) ; I'll bind keys myself -(autoload 'winner-mode "winner" nil t) -(add-hook 'doom-init-ui-hook #'winner-mode) - -;; highlight matching delimiters -(setq show-paren-delay 0.1 - show-paren-highlight-openparen t - show-paren-when-point-inside-paren t) -(add-hook 'doom-init-ui-hook #'show-paren-mode) - -;;; More reliable inter-window border -;; The native border "consumes" a pixel of the fringe on righter-most splits, -;; `window-divider' does not. Available since Emacs 25.1. -(setq-default window-divider-default-places t - window-divider-default-bottom-width 0 - window-divider-default-right-width 1) -(add-hook 'doom-init-ui-hook #'window-divider-mode) - -;; like diminish, but for major-modes. [pedantry intensifies] -(defun doom|set-mode-name () - "Set the major mode's `mode-name', as dictated by `doom-major-mode-names'." - (when-let* ((name (cdr (assq major-mode doom-major-mode-names)))) - (setq mode-name - (cond ((functionp name) (funcall name)) - ((stringp name) name) - (t (error "'%s' isn't a valid name for %s" name major-mode)))))) -(add-hook 'after-change-major-mode-hook #'doom|set-mode-name) ;; -;; Themes & fonts +;; Modeline library ;; -;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and -;; daemon Emacs is hairy. -;; -;; + Running `doom|init-ui' directly sorts out the initial GUI frame. -;; + Attaching it to `after-make-frame-functions' sorts out daemon Emacs. -;; + Waiting for 0.1s in `doom|reload-ui-in-daemon' fixes daemon Emacs started -;; with `server-start' in an interactive session of Emacs AND in tty Emacs. -(defun doom|init-ui (&optional frame) - "Set the theme and load the font, in that order." - (when doom-theme - (load-theme doom-theme t)) - (condition-case-unless-debug ex - (when (display-graphic-p) - (when (fontp doom-font) - (set-frame-font doom-font nil (if frame (list frame) t)) - (set-face-attribute 'fixed-pitch frame :font doom-font)) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) - ('error - (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)) +(defmacro def-modeline-segment! (name &rest forms) + "Defines a modeline segment and byte compiles it." + (declare (indent defun) (doc-string 2)) + (let ((sym (intern (format "doom-modeline-segment--%s" name)))) + `(progn + (defun ,sym () ,@forms) + ,(unless (bound-and-true-p byte-compile-current-file) + `(let (byte-compile-warnings) + (byte-compile #',sym)))))) -(defun doom|reload-ui-in-daemon (frame) - "Reload the theme (and font) in an daemon frame." - (when (or (daemonp) (not (display-graphic-p))) - (with-selected-frame frame - (run-with-timer 0.1 nil #'doom|init-ui)))) +(defsubst doom--prepare-modeline-segments (segments) + (cl-loop for seg in segments + if (stringp seg) + collect seg + else + collect (list (intern (format "doom-modeline-segment--%s" (symbol-name seg)))))) -;; register UI init hooks -(add-hook 'doom-post-init-hook #'doom|init-ui) -(add-hook! 'after-make-frame-functions #'(doom|init-ui doom|reload-ui-in-daemon)) +(defmacro def-modeline! (name lhs &optional rhs) + "Defines a modeline format and byte-compiles it. NAME is a symbol to identify +it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of +modeline segments defined with `def-modeline-segment!'. +Example: + (def-modeline! minimal + (bar matches \" \" buffer-info) + (media-info major-mode)) + (doom-set-modeline 'minimal t)" + (let ((sym (intern (format "doom-modeline-format--%s" name))) + (lhs-forms (doom--prepare-modeline-segments lhs)) + (rhs-forms (doom--prepare-modeline-segments rhs))) + `(progn + (defun ,sym () + (let ((lhs (list ,@lhs-forms)) + (rhs (list ,@rhs-forms))) + (let ((rhs-str (format-mode-line rhs))) + (list lhs + (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(+ 1 (string-width rhs-str)))))) + rhs-str)))) + ,(unless (bound-and-true-p byte-compile-current-file) + `(let (byte-compile-warnings) + (byte-compile #',sym)))))) -;; -;; Bootstrap -;; +(defun doom-modeline (key) + "Returns a mode-line configuration associated with KEY (a symbol). Throws an +error if it doesn't exist." + (let ((fn (intern (format "doom-modeline-format--%s" key)))) + (when (functionp fn) + `(:eval (,fn))))) -;; prompts the user for confirmation when deleting a non-empty frame -(define-key global-map [remap delete-frame] #'doom/delete-frame) -;; simple name in frame title -(setq-default frame-title-format '("DOOM Emacs")) -;; auto-enabled in Emacs 25+; I'll do it myself -(global-eldoc-mode -1) -;; a good indicator that Emacs isn't frozen -(add-hook 'doom-post-init-hook #'blink-cursor-mode) -;; standardize default fringe width -(if (fboundp 'fringe-mode) (fringe-mode doom-fringe-size)) -;; draw me like one of your French editors -(tooltip-mode -1) ; relegate tooltips to echo area only -(menu-bar-mode -1) -(if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) -(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) - -(defun doom|no-fringes-in-minibuffer () - "Disable fringes in the minibuffer window." - (set-window-fringes (minibuffer-window) 0 0 nil)) -(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 (delq (selected-window) - (get-buffer-window-list nil nil t)))) -(add-hook! doom-post-init - (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers)) +(defun doom-set-modeline (key &optional default) + "Set the modeline format. Does nothing if the modeline KEY doesn't exist. If +DEFAULT is non-nil, set the default mode-line for all buffers." + (when-let* ((modeline (doom-modeline key))) + (setf (if default + (default-value 'mode-line-format) + (buffer-local-value 'mode-line-format (current-buffer))) + modeline))) ;; @@ -331,6 +276,38 @@ instead)." fill-column))) +;; +;; Built-in packages +;; + +;; show typed keystrokes in minibuffer +(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) +(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) +(doom|enable-ui-keystrokes) +;; ...but hide them while isearch is active +(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) +(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) + +;; undo/redo changes to Emacs' window layout +(defvar winner-dont-bind-my-keys t) ; I'll bind keys myself +(autoload 'winner-mode "winner" nil t) +(add-hook 'doom-init-ui-hook #'winner-mode) + +;; highlight matching delimiters +(setq show-paren-delay 0.1 + show-paren-highlight-openparen t + show-paren-when-point-inside-paren t) +(add-hook 'doom-init-ui-hook #'show-paren-mode) + +;;; More reliable inter-window border +;; The native border "consumes" a pixel of the fringe on righter-most splits, +;; `window-divider' does not. Available since Emacs 25.1. +(setq-default window-divider-default-places t + window-divider-default-bottom-width 0 + window-divider-default-right-width 1) +(add-hook 'doom-init-ui-hook #'window-divider-mode) + + ;; ;; Line numbers ;; @@ -366,8 +343,6 @@ See `doom-line-numbers-style' to control the style of line numbers to display." "Disable the display of line numbers." (doom|enable-line-numbers -1)) -(add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) - ;; Emacs 26+ has native line number support. ;; Line number column. A faster (or equivalent, in the worst case) line number ;; plugin than `linum-mode'. @@ -442,69 +417,144 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; -;; Modeline +;; Theme & font ;; -(defmacro def-modeline-segment! (name &rest forms) - "Defines a modeline segment and byte compiles it." - (declare (indent defun) (doc-string 2)) - (let ((sym (intern (format "doom-modeline-segment--%s" name)))) - `(progn - (defun ,sym () ,@forms) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))) +(defun doom|init-theme (&optional frame) + "Set the theme and load the font, in that order." + (when doom-theme + (load-theme doom-theme t)) + (condition-case-unless-debug ex + (when (display-graphic-p) + (when (fontp doom-font) + (set-frame-font doom-font nil (if frame (list frame) t)) + (set-face-attribute 'fixed-pitch frame :font doom-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t 'unicode doom-unicode-font frame)) + ;; ...and for variable-pitch-mode: + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + ('error + (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))))) -(defsubst doom--prepare-modeline-segments (segments) - (cl-loop for seg in segments - if (stringp seg) - collect seg - else - collect (list (intern (format "doom-modeline-segment--%s" (symbol-name seg)))))) + (run-hooks 'doom-init-theme-hook)) -(defmacro def-modeline! (name lhs &optional rhs) - "Defines a modeline format and byte-compiles it. NAME is a symbol to identify -it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of -modeline segments defined with `def-modeline-segment!'. +;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and +;; daemon Emacs is hairy. +;; +;; + Running `doom|init-theme' directly sorts out the initial GUI frame. +;; + Attaching it to `after-make-frame-functions' sorts out daemon Emacs. +;; + Waiting for 0.1s in `doom|reload-ui-in-daemon' fixes daemon Emacs started +;; with `server-start' in an interactive session of Emacs AND in tty Emacs. +(add-hook 'doom-init-ui-hook #'doom|init-theme) -Example: - (def-modeline! minimal - (bar matches \" \" buffer-info) - (media-info major-mode)) - (doom-set-modeline 'minimal t)" - (let ((sym (intern (format "doom-modeline-format--%s" name))) - (lhs-forms (doom--prepare-modeline-segments lhs)) - (rhs-forms (doom--prepare-modeline-segments rhs))) - `(progn - (defun ,sym () - (let ((lhs (list ,@lhs-forms)) - (rhs (list ,@rhs-forms))) - (let ((rhs-str (format-mode-line rhs))) - (list lhs - (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(+ 1 (string-width rhs-str)))))) - rhs-str)))) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))) +(defun doom|reload-ui-in-daemon (frame) + "Reload the theme (and font) in an daemon frame." + (when (or (daemonp) (not (display-graphic-p))) + (with-selected-frame frame + (run-with-timer 0.1 nil #'doom|init-ui)))) +(add-hook! 'after-make-frame-functions #'(doom|init-theme doom|reload-ui-in-daemon)) -(defun doom-modeline (key) - "Returns a mode-line configuration associated with KEY (a symbol). Throws an -error if it doesn't exist." - (let ((fn (intern (format "doom-modeline-format--%s" key)))) - (when (functionp fn) - `(:eval (,fn))))) -(defun doom-set-modeline (key &optional default) - "Set the modeline format. Does nothing if the modeline KEY doesn't exist. If -DEFAULT is non-nil, set the default mode-line for all buffers." - (when-let* ((modeline (doom-modeline key))) - (setf (if default - (default-value 'mode-line-format) - (buffer-local-value 'mode-line-format (current-buffer))) - modeline))) +;; +;; Bootstrap +;; + +;; auto-enabled in Emacs 25+; I'll do it myself +(global-eldoc-mode -1) +;; simple name in frame title +(setq-default frame-title-format '("DOOM Emacs")) +;; draw me like one of your French editors +(tooltip-mode -1) ; relegate tooltips to echo area only +(menu-bar-mode -1) +(if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) +(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) +;; standardize default fringe width +(if (fboundp 'fringe-mode) (fringe-mode doom-fringe-size)) +;; prompts the user for confirmation when deleting a non-empty frame +(define-key global-map [remap delete-frame] #'doom/delete-frame) + +;; a good indicator that Emacs isn't frozen +(add-hook 'doom-init-ui-hook #'blink-cursor-mode) +;; no modeline in completion popups +(add-hook 'completion-list-mode-hook #'doom-hide-modeline-mode) +;; line numbers in most modes +(add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) + + +;; Customized confirmation prompt for quitting Emacs +(defun doom-quit-p (&optional prompt) + "Return t if this session should be killed. Prompts the user for +confirmation." + (if (ignore-errors (doom-real-buffer-list)) + (or (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) + (ignore (message "Aborted"))) + t)) +(setq confirm-kill-emacs #'doom-quit-p) + +(defun doom|no-fringes-in-minibuffer () + "Disable fringes in the minibuffer window." + (set-window-fringes (minibuffer-window) 0 0 nil)) +(add-hook! '(doom-init-ui-hook minibuffer-setup-hook) + #'doom|no-fringes-in-minibuffer) + +(defun doom|set-mode-name () + "Set the major mode's `mode-name', as dictated by `doom-major-mode-names'." + (when-let* ((name (cdr (assq major-mode doom-major-mode-names)))) + (setq mode-name + (cond ((functionp name) (funcall name)) + ((stringp name) name) + (t (error "'%s' isn't a valid name for %s" name major-mode)))))) + +(defun doom|protect-visible-buffers () + "Don't kill the current buffer if it is visible in another window (bury it +instead)." + (not (delq (selected-window) (get-buffer-window-list nil nil t)))) + +(defun doom|protect-fallback-buffer () + "Don't kill the scratch buffer." + (not (eq (current-buffer) (doom-fallback-buffer)))) + +(defun doom*switch-to-fallback-buffer-maybe (orig-fn) + "Advice for `kill-this-buffer'. If there are no real buffers left, switch to +`doom-fallback-buffer'." + (let ((buf (current-buffer))) + (cond ((window-at-side-p) + (quit-window)) + ((eq buf (doom-fallback-buffer)) + (bury-buffer)) + (t + (let ((real-p (doom-real-buffer-p buf))) + (funcall orig-fn) + (cond ((eq buf (current-buffer)) + (doom--cycle-real-buffers nil)) + ((and real-p (not (doom-real-buffer-p))) + (doom--cycle-real-buffers -1)) + (t + (message "Nowhere to go!")))))))) + + +(defun doom|init-ui () + "Initialize Doom's user interface by applying all its advice and hooks." + ;; Switch to `doom-fallback-buffer' if on last real buffer + (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) + ;; Don't kill the fallback buffer + (add-hook 'kill-buffer-query-functions #'doom|protect-fallback-buffer) + ;; Don't kill buffers that are visible else, only bury them + (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) + ;; Renames major-modes [pedantry intensifies] + (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) + ;; + (run-hooks 'doom-init-ui-hook)) + +(add-hook 'doom-init-hook #'doom|init-ui) (provide 'core-ui) ;;; core-ui.el ends here From e688bd8c85df57e9d24eaeda467379317d4298ac Mon Sep 17 00:00:00 2001 From: Oliver Charles Date: Thu, 4 Jan 2018 11:06:05 +0000 Subject: [PATCH 0019/4235] haskell: Fix warning about ghc-mod The warning confusingly states that `ghc-mode` couldn't be found, implying it's some kind of emacs mode. However, the predicate is actually checking for the `ghc-mod` executable, which is something entirely different. --- modules/lang/haskell/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 8cc1fc152..ed5c84b50 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -33,7 +33,7 @@ :config (if (executable-find "ghc-mod") (set! :company-backend 'haskell-mode #'company-ghc) - (warn "haskell-mode: couldn't find ghc-mode") + (warn "haskell-mode: couldn't find ghc-mod on PATH") (remove-hook 'haskell-mode-hook #'ghc-comp-init)) (setq company-ghc-show-info 'oneline)) From ab0223144c804ba6f37efe018e3e78b8df8e7d3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:08:41 -0500 Subject: [PATCH 0020/4235] Refactor doom/cleanup-session & corresponding evil command --- core/autoload/buffers.el | 11 ++++++----- modules/private/default/+evil-commands.el | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 0548757be..0433fa706 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -242,18 +242,19 @@ project." (message "Killed %s buffers" n)))) ;;;###autoload -(defun doom/cleanup-session (&optional all-p) +(defun doom/cleanup-session (&optional all-p interactive-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) + (interactive (list current-prefix-arg 'interactive)) (let ((buffers (doom-buried-buffers (if all-p (buffer-list)))) (n 0) kill-buffer-query-functions) (mapc #'kill-buffer buffers) (setq n (+ n (length buffers) (doom/cleanup-processes))) - (when (called-interactively-p 'interactive) - (message "Cleaned up %s buffers" n)))) + (run-hooks 'doom-cleanup-hook) + (when interactive-p + (message "Cleaned up %s buffers" n)) + n)) ;;;###autoload (defun doom/cleanup-processes () diff --git a/modules/private/default/+evil-commands.el b/modules/private/default/+evil-commands.el index 306ea8834..2ee09ea6c 100644 --- a/modules/private/default/+evil-commands.el +++ b/modules/private/default/+evil-commands.el @@ -2,11 +2,20 @@ (defalias 'ex! 'evil-ex-define-cmd) - ;;; Commands defined elsewhere +(evil-define-command doom:cleanup-session (&optional bang) + (interactive "") + (doom/cleanup-session bang)) + + +;; +;; Commands +;; + +;;; Commands defined elsewhere ;;(ex! "al[ign]" #'+evil:align) ;;(ex! "g[lobal]" #'+evil:global) - ;;; Custom commands +;;; Custom commands ;; Editing (ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me (ex! "al[ign]" #'+evil:align) @@ -39,7 +48,7 @@ (ex! "gblame" #'magit-blame) (ex! "grevert" #'git-gutter:revert-hunk) ;; Dealing with buffers -(ex! "clean[up]" #'doom/cleanup-session) +(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) From f1268b130ff9aee6219e6b1ca07f65b3ede2e808 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:04:41 -0500 Subject: [PATCH 0021/4235] Update & refactor core-popups Updates core-popups for new doom-kill-buffer-less workflow, and gives it is last refactor. Within the next couple of days core-popups will be replaced with a new and improved feature/popup module. --- core/autoload/popups.el | 33 +++++++++++------------ core/core-popups.el | 58 +++++++++++++++++++++++------------------ 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/core/autoload/popups.el b/core/autoload/popups.el index a413119cd..3130e698a 100644 --- a/core/autoload/popups.el +++ b/core/autoload/popups.el @@ -199,7 +199,7 @@ available), it will select the nearest popup window." property." (interactive) (when (doom-popup-p window) - (delete-window (or window (selected-window))))) + (delete-window window))) ;;;###autoload (defun doom/popup-close-all (&optional force-p) @@ -217,19 +217,9 @@ If FORCE-P is non-nil (or this function is called interactively), ignore popups' (setq doom-popup-history (delq nil (mapcar #'doom--popup-data popups))) (dolist (window popups success) (when (or force-p (doom-popup-property :autoclose window)) - (delete-window window) + (kill-buffer (window-buffer window)) (setq success t)))))) -;;;###autoload -(defun doom/popup-kill-all () - "Like `doom/popup-close-all', but kill *all* popups, including :static ones, -without leaving any trace behind (muahaha)." - (interactive) - (when-let* ((popups (doom-popup-windows))) - (let (doom-popup-remember-history) - (setq doom-popup-history nil) - (mapc #'delete-window popups)))) - ;;;###autoload (defun doom/popup-close-maybe () "Close the current popup *if* its window doesn't have a noesc parameter." @@ -239,7 +229,18 @@ without leaving any trace behind (muahaha)." (if (featurep 'evil) #'evil-force-normal-state #'keyboard-quit)) - (quit-restore-window nil 'kill))) + (kill-this-buffer))) + +;;;###autoload +(defun doom/popup-kill-all () + "Like `doom/popup-close-all', but kill *all* popups, including :static ones, +without leaving any trace behind (muahaha)." + (interactive) + (when-let* ((popups (doom-popup-windows))) + (let (doom-popup-remember-history) + (setq doom-popup-history nil) + (dolist (win popups) + (kill-buffer (window-buffer win)))))) ;;;###autoload (defun doom/popup-this-buffer () @@ -408,9 +409,9 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;;;###autoload (defun doom*delete-popup-window (&optional window) - "Ensure that popups are deleted properly, and killed if they have :autokill -properties." - (or window (setq window (selected-window))) + "Do popup bookkeeping before the popup window is deleted." + (unless window + (setq window (selected-window))) (when (doom-popup-p window) (setq doom-popup-windows (delq window doom-popup-windows)) (when doom-popup-remember-history diff --git a/core/core-popups.el b/core/core-popups.el index 5ca2fd044..f9ef11bb4 100644 --- a/core/core-popups.el +++ b/core/core-popups.el @@ -133,6 +133,8 @@ recognized by DOOM's popup system. They are: ("^ ?\\*" :regexp t :size 15 :noselect t :autokill t :autoclose t))) :config + (add-hook 'doom-unreal-buffer-p #'doom-popup-p) + ;; NOTE This is a temporary fix while I rewrite core-popups (defun doom-display-buffer-condition (buffer _action) (and (cl-loop for re in doom-popup-blacklist @@ -145,42 +147,46 @@ recognized by DOOM's popup system. They are: (shackle-display-buffer buffer alist (shackle-match buffer))) (defun doom|autokill-popups () + "TODO" (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)))) + (if (and (not doom-popup-inhibit-autokill) + (plist-get doom-popup-rules :autokill)) + (progn + (when-let* ((process (get-buffer-process (current-buffer)))) + (set-process-query-on-exit-flag process nil)) + t) + (doom-popup-mode -1) + (delete-window) + nil))) - (add-hook! doom-post-init + (defun doom|init-popups () + "TODO" (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) - ;; ensure every rule without an :align, :same or :frame property has an - ;; implicit :align (see `shackle-default-alignment') - (advice-add #'shackle--match :filter-return #'doom*shackle-always-align) - - ;; bootstrap popup system - (advice-add #'shackle-display-buffer :around #'doom*popup-init) - (advice-add #'balance-windows :around #'doom*popups-save) - (advice-add #'delete-window :before #'doom*delete-popup-window) - - ;; Tell `window-state-get' and `current-window-configuration' to recognize - ;; these custom parameters. Helpful for `persp-mode' and persisting window - ;; configs that have popups in them. - (dolist (param `(popup ,@doom-popup-window-parameters)) - (push (cons param 'writable) window-persistent-parameters)) + ;; bootstrap popup system + (advice-add #'shackle-display-buffer :around #'doom*popup-init) + (advice-add #'balance-windows :around #'doom*popups-save) + (advice-add #'delete-window :before #'doom*delete-popup-window) + ;; ensure every rule without an :align, :same or :frame property has an + ;; implicit :align (see `shackle-default-alignment') + (advice-add #'shackle--match :filter-return #'doom*shackle-always-align) + ;; autokill popups with a non-nil :autokill property + (add-hook 'kill-buffer-query-functions #'doom|autokill-popups) + ;; no modeline in popups + (add-hook 'doom-popup-mode-hook #'doom|hide-modeline-in-popup) + ;; Tell `window-state-get' and `current-window-configuration' to recognize + ;; these custom parameters. Helpful for `persp-mode' and persisting window + ;; configs that have popups in them. + (dolist (param `(popup ,@doom-popup-window-parameters)) + (push (cons param 'writable) window-persistent-parameters))) + (add-hook 'doom-post-init-hook #'doom|init-popups) (let ((map doom-popup-mode-map)) (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] #'doom/popup-close-maybe) + (define-key map [remap kill-buffer] #'doom/popup-close) (define-key map [remap split-window-right] #'ignore) (define-key map [remap split-window-below] #'ignore) (define-key map [remap split-window-horizontally] #'ignore) From b7d21fb25636b0473850968fcdc62422e9fe8eb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:10:31 -0500 Subject: [PATCH 0022/4235] Add let-advice!! test macro --- core/autoload/test.el | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index e41cd424c..dd2ea3796 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -159,8 +159,21 @@ marker. e.g. {2} can be retrieved with (point!! 2)." marker-list))) (defmacro with-minor-mode!! (mode &rest body) - "TODO" + "Activate a minor mode while in BODY, deactivating it after." (declare (indent defun)) `(progn (,mode +1) ,@body (,mode -1))) + +(defmacro let-advice!! (binds &rest body) + "Temporarily bind advice in BINDS while in BODY. + +e.g. (old-fn :before advice-fn) + (old-fn :around advice-fn)" + (declare (indent defun)) + `(progn + ,@(cl-loop for (target type advice) in binds + collect `(advice-add #',target ,type #',advice)) + ,@body + ,@(cl-loop for (target type advice) in binds + collect `(advice-remove #',target #',advice)))) From 4d51a1ab09075ac1ae5302d9506bcb154f9150e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 19:59:15 -0500 Subject: [PATCH 0023/4235] Fix :skip property in def-test! --- core/autoload/test.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index dd2ea3796..5e1dc8bd8 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -76,10 +76,9 @@ If neither is available, run all tests in all enabled modules." (declare (indent defun) (doc-string 2)) (let (plist) (while (keywordp (car body)) + (push (pop body) plist) (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))))) @@ -94,10 +93,12 @@ If neither is available, run all tests in all enabled modules." do (setq path (replace-regexp-in-string rep with path t t)) finally return (intern (format "%s::%s" path name))) () - (with-temp-buffer - (save-mark-and-excursion - (save-window-excursion - ,@body)))))) + ,(if (plist-get plist :skip) + `(ert-skip ,(plist-get plist :skip)) + `(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. From 83d25071380d84c87e569412fad116e6dcb15bc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:10:45 -0500 Subject: [PATCH 0024/4235] Update buffer api unit tests --- core/test/autoload-buffers.el | 63 +++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index b39c75b3c..94e57e24e 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -10,10 +10,13 @@ `(cl-flet ((buffer-list (lambda () (cl-remove-if-not #'buffer-live-p (list ,@(reverse (mapcar #'car buffers))))))) - (let* (persp-mode + (let* ((split-width-threshold 0) + (window-min-width 0) + persp-mode ,@buffers) ,@body - (mapc #'kill-buffer (buffer-list)))))) + (let (kill-buffer-query-functions kill-buffer-hook) + (mapc #'kill-buffer (buffer-list))))))) ;; (def-test! get-buffers @@ -100,34 +103,44 @@ (should (= 2 (length el-buffers))) (should (= 3 (length txt-buffers)))))) -;; `doom-kill-buffer' -(def-test! kill-buffer - (with-temp-buffers!! (a b) - (doom-kill-buffer a) - (should-not (buffer-live-p a)) - ;; modified buffer - (with-current-buffer b - (set-buffer-modified-p t)) - (doom-kill-buffer b t) - (should-not (buffer-live-p a)))) +;; `doom-fallback-buffer' +(def-test! fallback-buffer + (let ((fallback (doom-fallback-buffer))) + (should (buffer-live-p fallback)) + (should (equal (buffer-name fallback) doom-fallback-buffer)))) ;; `doom--cycle-real-buffers' (def-test! kill-buffer-then-show-real-buffer (with-temp-buffers!! (a b c d) - (dolist (buf (list a b d)) - (with-current-buffer buf - (setq-local buffer-file-name "x"))) - (should (cl-every #'buffer-live-p (buffer-list))) + (let-advice!! ((kill-this-buffer :around doom*switch-to-fallback-buffer-maybe)) + (dolist (buf (list a b d)) + (with-current-buffer buf + (setq-local buffer-file-name "x"))) + (should (cl-every #'buffer-live-p (buffer-list))) + (switch-to-buffer a) + (should (eq (current-buffer) a)) + (should (eq (selected-window) (get-buffer-window a))) + (should (kill-this-buffer)) + ;; eventually end up in the fallback buffer + (let ((fallback (doom-fallback-buffer))) + (while (not (eq (current-buffer) fallback)) + (should (doom-real-buffer-p)) + (kill-this-buffer)) + (should (eq (current-buffer) fallback)))))) + +;; `doom-kill-buffer-and-windows' +(def-test! kill-buffer-and-windows + (with-temp-buffers!! (a b) + (switch-to-buffer a) (split-window-horizontally) + (switch-to-buffer b) (split-window-horizontally) (switch-to-buffer a) - (should (eq (current-buffer) a)) - (should (eq (selected-window) (get-buffer-window a))) - (should (doom-kill-buffer a)) - ;; eventually end up in the fallback buffer - (let ((fallback (doom-fallback-buffer))) - (while (not (eq (current-buffer) fallback)) - (should (doom-real-buffer-p)) - (doom-kill-buffer)) - (should (eq (current-buffer) fallback))))) + + (should (= (length (doom-visible-windows)) 3)) + (should (= (length (doom-buffer-list)) 2)) + + (doom-kill-buffer-and-windows a) + (should-not (buffer-live-p a)) + (should (= (length (doom-visible-windows)) 1)))) ;; TODO doom/kill-all-buffers ;; TODO doom/kill-other-buffers From 9c9e9b2b597469f9cf33817e7d5bfcdfec3cd595 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:17:01 -0500 Subject: [PATCH 0025/4235] feature/snippets: remove monkey patch (fix merged upstream) --- modules/feature/snippets/autoload/snippets.el | 1 - modules/feature/snippets/config.el | 53 +------------------ 2 files changed, 1 insertion(+), 53 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index 7c972e4ae..f7aa07288 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -56,4 +56,3 @@ buggy behavior when is pressed in an empty field." (sof (marker-position (yas--field-start field)))) (when (and field (> (point) sof)) (delete-region sof (point))))) - diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 885783656..ec8adc255 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -37,58 +37,7 @@ (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) ;; Exit snippets on ESC from normal mode - (add-hook '+evil-esc-hook #'yas-abort-snippet) - - ;; Monkey patch yas-expand-snippet until #883 is resolved. See - ;; https://github.com/joaotavora/yasnippet/issues/883 - (defun +snippets*yas-expand-snippet (content &optional start end expand-env) - "Expand snippet CONTENT at current point. - -Text between START and END will be deleted before inserting -template. EXPAND-ENV is a list of (SYM VALUE) let-style dynamic bindings -considered when expanding the snippet." - (cl-assert (and yas-minor-mode (memq 'yas--post-command-handler post-command-hook)) - nil "[yas] `yas-expand-snippet' needs properly setup `yas-minor-mode'") - (run-hooks 'yas-before-expand-snippet-hook) - (let* ((yas-selected-text (or yas-selected-text - (and (region-active-p) - (buffer-substring-no-properties (region-beginning) - (region-end))))) - (start (or start (and (region-active-p) (region-beginning)) (point))) - (end (or end (and (region-active-p) (region-end)) (point))) - (to-delete (and start end (buffer-substring-no-properties start end))) - snippet) - (goto-char start) - (setq yas--indent-original-column (current-column)) - (when (and to-delete (> end start)) - (delete-region start end)) - (cond ((listp content) (yas--eval-for-effect content)) - (t - (setq yas--start-column (current-column)) - (let ((yas--inhibit-overlay-hooks t)) - (setq snippet - (yas--snippet-create content expand-env start (point)))) - (let ((existing-field (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field)))) - (when existing-field - (setf (yas--snippet-previous-active-field snippet) existing-field) - (yas--advance-end-maybe existing-field (overlay-end yas--active-field-overlay)))) - (unless (yas--snippet-fields snippet) - (yas-exit-snippet snippet)) - (let ((first-field (car (yas--snippet-fields snippet)))) - (when first-field - (sit-for 0) - (yas--letenv (yas--snippet-expand-env snippet) - (yas--move-to-field snippet first-field)) - (when (and (eq (yas--field-number first-field) 0) - (> (length (yas--field-text-for-display - first-field)) - 0)) - (setq deactivate-mark nil)))) - (yas--message 4 "snippet %d expanded." (yas--snippet-id snippet)) - t)))) - (advice-add #'yas-expand-snippet :override #'+snippets*yas-expand-snippet)) + (add-hook '+evil-esc-hook #'yas-abort-snippet)) (def-package! auto-yasnippet From 790eed0abd78dbb01d52ddc472b795959155db81 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:22:27 -0500 Subject: [PATCH 0026/4235] feature/workspaces: run +workspace-change-hook when updating ws list --- .../feature/workspaces/autoload/workspaces.el | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index de2a4984d..9a0ca388f 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -3,6 +3,9 @@ (defvar +workspace-data-file "_workspaces" "The file basename in which to store single workspace perspectives.") +(defvar +workspace-change-hook () + "Hooks run when workspaces are added, removed, renamed or switched to.") + (defvar +workspace--last nil) (defvar +workspace--index 0) @@ -152,7 +155,9 @@ Otherwise return t on success, nil otherwise." (error "Can't create a new '%s' workspace" name)) (when (+workspace-exists-p name) (error "A workspace named '%s' already exists" name)) - (and (persp-add-new name) t)) + (when (persp-add-new name) + (run-hooks '+workspace-change-hook) + t)) ;;;###autoload (defun +workspace-rename (name new-name) @@ -160,7 +165,9 @@ Otherwise return t on success, nil otherwise." success, nil otherwise." (when (+workspace--protected-p name) (error "Can't rename '%s' workspace" name)) - (persp-rename new-name (+workspace-get name))) + (when (persp-rename new-name (+workspace-get name)) + (run-hooks '+workspace-change-hook) + name)) ;;;###autoload (defun +workspace-delete (name &optional inhibit-kill-p) @@ -171,7 +178,9 @@ buffers." (error "Can't delete '%s' workspace" name)) (+workspace-get name) ; error checking (persp-kill name inhibit-kill-p) - (not (+workspace-exists-p name))) + (unless (+workspace-exists-p name) + (run-hooks '+workspace-change-hook) + t)) ;;;###autoload (defun +workspace-switch (name &optional auto-create-p) @@ -185,7 +194,10 @@ buffers." (or (and (not (string= old-name persp-nil-name)) old-name) +workspaces-main))) - (persp-frame-switch name)) + (persp-frame-switch name) + (when (equal (+workspace-current-name) name) + (run-hooks '+workspace-change-hook) + t)) ;;;###autoload (defun +workspace-on-new-frame (frame &optional _new-frame-p) From 565726b76564bf9dcd16935daeb8293a1337d451 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:26:39 -0500 Subject: [PATCH 0027/4235] ui/doom-quit: use confirm-kill-emacs var instead --- modules/ui/doom-quit/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-quit/config.el b/modules/ui/doom-quit/config.el index 8e9bc50fe..4f6d7bc0e 100644 --- a/modules/ui/doom-quit/config.el +++ b/modules/ui/doom-quit/config.el @@ -26,12 +26,11 @@ "A list of quit messages, picked randomly by `+doom-quit'. Taken from http://doom.wikia.com/wiki/Quit_messages and elsewhere.") -(defun +doom|quit (&rest _) +(defun +doom-quit (&rest _) (doom-quit-p (format "%s Quit?" (nth (random (length +doom-quit-messages)) +doom-quit-messages)))) ;; -(remove-hook 'kill-emacs-query-functions #'doom-quit-p) -(add-hook 'kill-emacs-query-functions #'+doom|quit) +(setq confirm-kill-emacs #'+doom-quit) From 93f3f0ef38144afd27fcb37bf5e74830f59473d9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:28:00 -0500 Subject: [PATCH 0028/4235] ui/doom: update hooks, refactor & simplify + doom-init-ui-hook => doom-init-theme-hook + Remove specific mode hooks for solaire-mode (need to revisit this) + Preemptive removal of doom-popup-mode hook + Use function for hs-set-up-overlay instead of lambda --- modules/ui/doom/config.el | 42 +++++++++++++++------------------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 0e73270c9..55666a769 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -6,25 +6,21 @@ (unless doom-theme (setq doom-theme 'doom-one) (after! solaire-mode - (add-hook 'doom-init-ui-hook #'solaire-mode-swap-bg t))) + (add-hook 'doom-init-theme-hook #'solaire-mode-swap-bg t))) ;; Ensure `doom/reload-load-path' reloads common faces (defun +doom|reload-theme () (load "doom-themes-common.el" nil t)) (add-hook 'doom-pre-reload-theme-hook #'+doom|reload-theme) ;; improve integration w/ org-mode - (add-hook 'doom-init-ui-hook #'doom-themes-org-config) + (add-hook 'doom-init-theme-hook #'doom-themes-org-config) ;; more Atom-esque file icons for neotree - (add-hook 'doom-init-ui-hook #'doom-themes-neotree-config) + (add-hook 'doom-init-theme-hook #'doom-themes-neotree-config) (setq doom-neotree-enable-variable-pitch t doom-neotree-file-icons 'simple doom-neotree-line-spacing 2) - ;; blink mode-line on errors - ;; FIXME Breaks modeline - ;; (add-hook 'doom-init-ui-hook #'doom-themes-visual-bell-config) - (after! neotree (defun +doom|neotree-fix-popup () "Ensure the fringe settings are maintained on popup restore." @@ -35,16 +31,10 @@ (def-package! solaire-mode :hook (after-change-major-mode . turn-on-solaire-mode) - :hook (doom-popup-mode . turn-off-solaire-mode) :config (setq solaire-mode-real-buffer-fn #'doom-real-buffer-p) - ;; Prevent color glitches when reloading either DOOM or the theme - (add-hook! '(doom-init-ui-hook doom-reload-hook) #'solaire-mode-reset) - - (add-hook! - (gist-mode twittering-mode mu4e-view-mode org-tree-slide-mode +regex-mode) - #'solaire-mode)) + (add-hook! '(doom-init-theme-hook doom-reload-hook) #'solaire-mode-reset)) (after! hideshow @@ -57,18 +47,18 @@ :group 'doom) ;; Nicer code-folding overlays (with fringe indicators) - (setq hs-set-up-overlay - (lambda (ov) - (when (eq 'code (overlay-get ov 'hs)) - (when (featurep 'vimish-fold) - (overlay-put - ov 'before-string - (propertize "…" 'display - (list vimish-fold-indication-mode - 'empty-line - 'vimish-fold-fringe)))) - (overlay-put - ov 'display (propertize " [...] " 'face '+doom-folded-face)))))) + (defun +doom-set-up-overlay (ov) + (when (eq 'code (overlay-get ov 'hs)) + (when (featurep 'vimish-fold) + (overlay-put + ov 'before-string + (propertize "…" 'display + (list vimish-fold-indication-mode + 'empty-line + 'vimish-fold-fringe)))) + (overlay-put + ov 'display (propertize " [...] " 'face '+doom-folded-face)))) + (setq hs-set-up-overlay #'+doom-set-up-overlay)) ;; NOTE Adjust these bitmaps if you change `doom-fringe-size' From e9d4e50c0a4de32115e8dd7e56a513116a52cbc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 14:29:51 -0500 Subject: [PATCH 0029/4235] Update core-ui tests --- core/test/core-ui.el | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/core/test/core-ui.el b/core/test/core-ui.el index c1c82a01d..9491628a7 100644 --- a/core/test/core-ui.el +++ b/core/test/core-ui.el @@ -3,18 +3,18 @@ (defmacro with-temp-windows!! (&rest body) (declare (indent defun)) - `(progn + `(cl-flet ((split-window (symbol-function #'split-window-horizontally))) (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)))) + (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") + (let ((after-change-major-mode-hook '(doom|set-mode-name)) + (doom-major-mode-names '((text-mode . "abc") (lisp-mode . (lambda () "xyz")) (js-mode . t)))) (text-mode) @@ -32,14 +32,3 @@ (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 87e1108f96fd6acea7183f432b5c15b6c271fcd0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 19:59:48 -0500 Subject: [PATCH 0030/4235] Update buffer api tests + Update for new real buffer spec + Remove coupling with core-popup --- core/test/autoload-buffers.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index 94e57e24e..b1c39fc6e 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -46,13 +46,12 @@ (def-test! real-buffers (let (doom-real-buffer-functions) (with-temp-buffers!! (a b c d) - (dolist (buf (list a b)) - (with-current-buffer buf - (setq-local buffer-file-name "x"))) + (with-current-buffer a + (setq-local buffer-file-name "x")) + (with-current-buffer b + (setq-local doom-real-buffer-p t)) (with-current-buffer c (rename-buffer "*C*")) - (with-current-buffer d - (doom-popup-mode +1)) (should (doom-real-buffer-p a)) (should (doom-real-buffer-p b)) (should-not (doom-real-buffer-p c)) @@ -120,7 +119,9 @@ (switch-to-buffer a) (should (eq (current-buffer) a)) (should (eq (selected-window) (get-buffer-window a))) - (should (kill-this-buffer)) + (kill-this-buffer) + (should-not (eq (current-buffer) a)) + (should-not (buffer-live-p a)) ;; eventually end up in the fallback buffer (let ((fallback (doom-fallback-buffer))) (while (not (eq (current-buffer) fallback)) From 824393043cb3f08fff0ef5228c79304e7cba5d97 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 19:29:29 -0500 Subject: [PATCH 0031/4235] lang/emacs-lisp: add imenu support for def-test!/ert-deftest --- modules/lang/emacs-lisp/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index f602a494b..5a8692db9 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -36,6 +36,7 @@ "Improve imenu support with better expression regexps and Doom-specific forms." (setq imenu-generic-expression '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|def-test!\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) From e74a95de32fe6df176ece97487b11b98a86bb11d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 20:13:27 -0500 Subject: [PATCH 0032/4235] feature/workspaces: fix tests --- .../feature/workspaces/test/autoload-workspaces.el | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index 25701711b..d76cb3448 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -1,7 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/workspaces/test/autoload-workspaces.el -(load "persp-mode.el" nil t) (require! :feature workspaces) (defmacro with-workspace!! (buffer-args &rest body) @@ -10,11 +9,10 @@ (cl-loop for bsym in buffer-args collect `(,bsym (get-buffer-create ,(symbol-name bsym)))))) `(let ((persp-auto-resume-time -1) - (persp-auto-save-opt 0) - persp-autokill-buffer-on-remove - persp-names-cache - noninteractive) - (+workspaces|init) + (persp-auto-save-opt 0)) + (let (noninteractive) + (persp-mode +1)) + (+workspace-switch +workspaces-main t) (let* (,@buffers) (cl-loop with persp = (get-current-persp) for buf in (list ,@(mapcar #'car buffers)) @@ -22,10 +20,10 @@ do (with-current-buffer buf (setq buffer-file-name (make-temp-file "workspaces-test-")))) ,@body - (+workspace-delete +workspaces-main) (let (kill-buffer-query-functions kill-buffer-hook) (mapc #'kill-buffer (list ,@(mapcar #'car buffers))))) - (persp-mode -1)))) + (let (noninteractive) + (persp-mode -1))))) ;; `+workspaces|init' (def-test! init From 776533adb7a1aa5936e15feff2b83cfc7d0fc350 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 00:40:41 -0500 Subject: [PATCH 0033/4235] feature/evil: fix unit tests --- modules/feature/evil/test/autoload-files.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/feature/evil/test/autoload-files.el b/modules/feature/evil/test/autoload-files.el index b14185cd1..48fd0905a 100644 --- a/modules/feature/evil/test/autoload-files.el +++ b/modules/feature/evil/test/autoload-files.el @@ -9,16 +9,17 @@ affects your Emacs packages)." (other ,dest)) (with-temp-file it (insert "Hello world")) - (unwind-protect - (progn - (should (file-exists-p it)) - (find-file-literally it) - (should (equal (buffer-string) "Hello world")) - (should (equal (buffer-file-name) it)) - (let ((inhibit-message (not doom-debug-mode))) - ,@body)) - (ignore-errors (delete-file it)) - ,(if dest `(ignore-errors (delete-file other)))))) + (with-minor-mode!! projectile-mode + (unwind-protect + (progn + (should (file-exists-p it)) + (find-file-literally it) + (should (equal (buffer-string) "Hello world")) + (should (equal (buffer-file-name) it)) + (let ((inhibit-message (not doom-debug-mode))) + ,@body)) + (ignore-errors (delete-file it)) + ,(if dest `(ignore-errors (delete-file other))))))) ;; (def-test! move-this-file From e9b5ab2385a73eb538db30204b904ebd4cf03224 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Jan 2018 20:10:00 -0500 Subject: [PATCH 0034/4235] Fix +workspace/close-window-or-workspace treating everything as a popup --- modules/feature/workspaces/autoload/workspaces.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 9a0ca388f..de75ed19a 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -425,7 +425,7 @@ end of the workspace list." the workspace and move to the next." (interactive) (let ((delete-window-fn (if (featurep 'evil) #'evil-window-delete #'delete-window))) - (if (window-at-side-p) + (if (window-dedicated-p) (funcall delete-window-fn) (let ((current-persp-name (+workspace-current-name))) (cond ((or (+workspace--protected-p current-persp-name) From 815fc6ef0232c22da5e9ff3002e0ac3b82fa7d05 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 03:03:32 -0500 Subject: [PATCH 0035/4235] Update +ivy*counsel-ag-function b/c of upstream changes --- modules/completion/ivy/autoload/ivy.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 005271855..e2467a099 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -139,8 +139,8 @@ NOTE This may need to be updated frequently, to meet changes upstream (in counsel-rg)." (when (null extra-ag-args) (setq extra-ag-args "")) - (if (< (length string) 1) ;; #1 - (counsel-more-chars 1) + (if (< (length string) 1) ; <-- modified the character limit + (counsel-more-chars 1) ; <-- (let ((default-directory (ivy-state-directory ivy-last)) (regex (counsel-unquote-regex-parens (setq ivy--old-re @@ -157,10 +157,8 @@ counsel-rg)." " -- " (shell-quote-argument regex) file)))) - (if (file-remote-p default-directory) - (split-string (shell-command-to-string ag-cmd) "\n" t) - (counsel--async-command ag-cmd) - nil))))) + (counsel--async-command ag-cmd) + nil)))) ;;;###autoload (defun +ivy/wgrep-occur () From 58573a0ce795e804b4b4e1813e716eed306d3f4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 03:24:00 -0500 Subject: [PATCH 0036/4235] Refactor/revise ui/window-select And bind SPC w C-w (or C-w C-w) to other-window. --- modules/private/default/+bindings.el | 2 +- modules/ui/window-select/README.org | 44 +++++++++++++++++++++------- modules/ui/window-select/config.el | 44 ++++++++++++++-------------- 3 files changed, 56 insertions(+), 34 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index dc8beb3e4..75c59770a 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -320,7 +320,7 @@ "C-j" #'evil-window-down "C-k" #'evil-window-up "C-l" #'evil-window-right - "C-w" #'ace-window + "C-w" #'other-window ;; Swapping windows "H" #'+evil/window-move-left "J" #'+evil/window-move-down diff --git a/modules/ui/window-select/README.org b/modules/ui/window-select/README.org index 57cba1db9..9d70524b2 100644 --- a/modules/ui/window-select/README.org +++ b/modules/ui/window-select/README.org @@ -2,22 +2,44 @@ This module provides the user with a visual way to switch windows. By default, the module only kicks in if there are more than two windows open at the same time. -* Keybindings -The default function to switch windows is automatically changed to work with this module. More specifically, the function ~other-window~ is automatically remapped. This function is bounded by default to ~C-x o~. +* Table of Contents :TOC: +- [[#install][Install]] + - [[#module-flags][Module flags]] +- [[#usage][Usage]] +- [[#configuration][Configuration]] + - [[#ace-window][ace-window]] + - [[#switch-window][switch-window]] -* Customization -There are two packages that accomplish the same but with a different visual queue. +* Install +Add =:feature lookup= to your init.el. + +** Module flags +This module provides two flags: + ++ ~+ace-window~ Use avy (and ace-window) as the backend. ++ ~+switch-window~ Use switch-window as the backend. + +If neither flag is specified, ~+ace-window~ will be used. + +* Usage +This module remaps the function ~other-window~ to either ~switch-window~ or +~ace-window~, depending on which backend you've enabled. + +~other-window~ is bound to ~C-x o~ and ~SPC w o~. + +* Configuration +This module provides two backends, both providing the same functionality, but +with different visual cues. They are =ace-window= and =switch-window=. ** ace-window -The first character of the buffers change to a user selectable character. +The first character of the buffers changes to a highlighted, user-selectable +character. + + Pros: The content of the buffers are always visible. + Cons: The displayed characters are small and difficult to see. -This is the module's default if no module flag is specified. To explicitly enable this, write in *init.el*: ~(doom! :ui (window-select +ace-window))~ - ** switch-window -The entire buffer is replaced by big letters than enable the user to easily select a desired window. - + Pros: The displayed characters are easy to see. They will never be missed. - + Cons: The contents of the buffers is entirely replaced by a big character. +Replaces the entire buffer with large letters. -To enable this, write in *init.el*: ~(doom! :ui (window-select +switch-window))~ + + Pros: The displayed characters are /really/ easy to see. + + Cons: You can't see the contents of the buffers. diff --git a/modules/ui/window-select/config.el b/modules/ui/window-select/config.el index 4436b4fa6..eff60aa08 100644 --- a/modules/ui/window-select/config.el +++ b/modules/ui/window-select/config.el @@ -1,24 +1,24 @@ ;;; ui/window-select/config.el -*- lexical-binding: t; -*- -(cond ((featurep! +switch-window) - ;; Configure switch-window if that flag is found - (def-package! switch-window - :commands (switch-window switch-window-then-maximize switch-window-then-split-below - switch-window-then-split-right switch-window-then-delete - switch-window-then-swap-buffer) - :init - (setq switch-window-shortcut-style 'qwerty - switch-window-qwerty-shortcuts '("a" "s" "d" "f" "g" "h" "j" "k" "l")) - ;; Redefine how we switch windows with switch-window - (define-key global-map [remap other-window] #'switch-window))) - ((or (featurep! +ace-window) t) - ;; Configure ace-window if that flag or no flag is found - (def-package! ace-window - :commands (ace-window ace-swap-window ace-delete-window - ace-select-window ace-delete-other-windows) - :init - (define-key global-map [remap other-window] #'ace-window) - :config - (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) - aw-scope 'frame - aw-background t)))) +(cond + ((featurep! +switch-window) + (def-package! switch-window + :commands (switch-window switch-window-then-maximize switch-window-then-split-below + switch-window-then-split-right switch-window-then-delete + switch-window-then-swap-buffer) + :init + (define-key global-map [remap other-window] #'switch-window) + :config + (setq switch-window-shortcut-style 'qwerty + switch-window-qwerty-shortcuts '("a" "s" "d" "f" "g" "h" "j" "k" "l")))) + + ((or (featurep! +ace-window) t) ; default to ace-window + (def-package! ace-window + :commands (ace-window ace-swap-window ace-delete-window + ace-select-window ace-delete-other-windows) + :init + (define-key global-map [remap other-window] #'ace-window) + :config + (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) + aw-scope 'frame + aw-background t)))) From 8ef3cf8ea73cf94c9685e0c564855280d39246de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 03:38:46 -0500 Subject: [PATCH 0037/4235] lang/python: fix anaconda-mode-find-references typo --- modules/lang/python/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 1b2ff7983..a87ebf991 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -90,7 +90,7 @@ environment variables." (set! :company-backend 'python-mode '(company-anaconda)) (set! :jump 'python-mode :definition #'anaconda-mode-find-definitions - :references #'anaconda-mode-find-referenences + :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) (map! :map python-mode-map :localleader From 88f8c27a7d071980653f9c057118a79a2a6a6b1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 03:55:25 -0500 Subject: [PATCH 0038/4235] Fix doom/cleanup-session & +workspaces|cleanup-unassociated-buffers Resolve void n variable errors and silent message. --- core/autoload/buffers.el | 10 +++++----- modules/feature/workspaces/autoload/workspaces.el | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 0433fa706..edcc3de5d 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -242,18 +242,18 @@ project." (message "Killed %s buffers" n)))) ;;;###autoload -(defun doom/cleanup-session (&optional all-p interactive-p) +(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 (list current-prefix-arg 'interactive)) + (interactive (list current-prefix-arg)) (let ((buffers (doom-buried-buffers (if all-p (buffer-list)))) (n 0) kill-buffer-query-functions) (mapc #'kill-buffer buffers) (setq n (+ n (length buffers) (doom/cleanup-processes))) - (run-hooks 'doom-cleanup-hook) - (when interactive-p - (message "Cleaned up %s buffers" n)) + (dolist (hook doom-cleanup-hook) + (setq n (+ n (or (funcall hook) 1)))) + (message "Cleaned up %s buffers" n) n)) ;;;###autoload diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index de75ed19a..410757a9c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -525,7 +525,7 @@ Ensures the scratch (or dashboard) buffers are CDed into the project's root." (cl-loop for buf in (buffer-list) unless (persp--buffer-in-persps buf) if (kill-buffer buf) - do (cl-incf n))) + sum 1)) ;; From feff92c62671f2d014530330086867ebaab4adf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 13:26:37 -0500 Subject: [PATCH 0039/4235] Fix company-auctex not initializing properly in Auctex buffers #326 Caused because AucTex's LaTeX-mode reports its major-mode as 'latex-mode. A check in :company-backends expects major modes to have matching hooks (e.g. LaTeX-mode-hook => LaTeX-mode). --- modules/lang/latex/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 75d10c658..ea27a60f9 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -40,7 +40,12 @@ (def-package! company-auctex :when (featurep! :completion company) :init - (set! :company-backend 'LaTeX-mode '(company-auctex)))) + ;; We can't use the (set! :company-backend ...) because Auctex reports its + ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which + ;; is :company-backend doesn't anticipate (and shouldn't have to!) + (add-hook! LaTeX-mode + (make-variable-buffer-local 'company-backends) + (company-auctex-init)))) (def-package! reftex ; built-in From 7556762d98df471234634f5a9433acfb92c86ae7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 14:50:59 -0500 Subject: [PATCH 0040/4235] lang/latex: refactor (WIP) --- modules/lang/latex/config.el | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index ea27a60f9..2d4fafb04 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -8,7 +8,7 @@ ;; -;; Plugins +;; AucTex/LaTeX bootstrap ;; ;; Because tex-mode is built-in and AucTex has conflicting components, we need @@ -17,6 +17,9 @@ (load "auctex-autoloads" nil t) (push '("\\.[tT]e[xX]\\'" . TeX-latex-mode) auto-mode-alist) +(add-hook! (latex-mode LaTeX-mode) #'turn-on-auto-fill) +(add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode TeX-source-correlate-mode)) + (add-transient-hook! 'LaTeX-mode-hook (setq TeX-auto-save t TeX-parse-self t @@ -30,23 +33,13 @@ LaTeX-section-section LaTeX-section-label)) - (add-hook! (latex-mode LaTeX-mode) #'turn-on-auto-fill) - (add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode TeX-source-correlate-mode)) - (set! :popup " output\\*$" :regexp t :size 15 :noselect t :autoclose t :autokill t) + (map! :map LaTeX-mode-map "C-j" nil)) - (map! :map LaTeX-mode-map "C-j" nil) - - (def-package! company-auctex - :when (featurep! :completion company) - :init - ;; We can't use the (set! :company-backend ...) because Auctex reports its - ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which - ;; is :company-backend doesn't anticipate (and shouldn't have to!) - (add-hook! LaTeX-mode - (make-variable-buffer-local 'company-backends) - (company-auctex-init)))) +;; +;; Plugins +;; (def-package! reftex ; built-in :commands (turn-on-reftex reftex-mode) @@ -91,3 +84,14 @@ :when (featurep! :completion helm) :commands helm-bibtex) + +(def-package! company-auctex + :when (featurep! :completion company) + :commands company-auctex-init + :init + ;; We can't use the (set! :company-backend ...) because Auctex reports its + ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is + ;; :company-backend doesn't anticipate (and shouldn't have to!) + (add-hook! LaTeX-mode + (make-variable-buffer-local 'company-backends) + (company-auctex-init))) From 2598d48bba46435249402693edacfe65f22bdb2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:04:48 -0500 Subject: [PATCH 0041/4235] Add org elpa archive + update lang/org #327 Now that the org ELPA archive has https support, we can add it to package-archives. This fixes some 'org is unavailable' errors when installing org packages that have declared earlier versions of org as a dependency. This also makes installing a newer version of org-mode much simpler. Woo! --- core/core-packages.el | 3 ++- modules/lang/org/config.el | 7 ++++--- modules/lang/org/packages.el | 8 ++------ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index c40ef27b5..d486c5faf 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -92,7 +92,8 @@ base by `doom!' and for calculating how many packages exist.") package-enable-at-startup nil package-archives '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/")) + ("melpa" . "https://melpa.org/packages/") + ("org" . "https://orgmode.org/elpa/")) ;; I omit Marmalade because its packages are manually submitted rather ;; than pulled, so packages are often out of date with upstream. diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 6412459e5..422e0ea59 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -4,9 +4,10 @@ "The directory where org files are kept.") ;; Ensure ELPA org is prioritized above built-in org. -(when-let* ((path (locate-library "org" nil doom--package-load-path))) - (setq load-path (delete path load-path)) - (push (file-name-directory path) load-path)) +(when-let* ((path (locate-library "org" nil doom--base-load-path))) + (setq load-path + (delete (substring (file-name-directory path) 0 -1) + load-path))) ;; Sub-modules (if (featurep! +attach) (load! +attach)) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 37f729a8f..d6a7eca04 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -1,12 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/org/packages.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")))) +;; Installs a cutting-edge version of org-mode +(package! org-plus-contrib) (package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets")) (package! toc-org) From a29bc54c63ba87f147eff1a42564d85fc837e58c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:08:48 -0500 Subject: [PATCH 0042/4235] Install packages in the order they are declared --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c2049afdd..0011c1600 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -326,7 +326,7 @@ package.el as appropriate." "Interactive command for installing missing packages." (interactive) (message! "Looking for packages to install...") - (let ((packages (doom-get-missing-packages))) + (let ((packages (reverse (doom-get-missing-packages)))) (cond ((not packages) (message! (green "No packages to install!"))) From f3bad40fdfb664e8bb5e084708fd99f4c1519da3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:09:20 -0500 Subject: [PATCH 0043/4235] Packages api: simpler error handling --- core/autoload/packages.el | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 0011c1600..51c39dbbe 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -235,14 +235,10 @@ Used by `doom//packages-install'." (quiet! (doom-refresh-packages t)) ,@body)) ('user-error - (message! (bold (red " ERROR: (%s) %s" - (car ex) - (error-message-string ex))))) + (message! (bold (red " ERROR: %s" ex)))) ('error (doom-refresh-clear-cache) - (message! (bold (red " FATAL ERROR: (%s) %s" - (car ex) - (error-message-string ex))))))) + (message! (bold (red " FATAL ERROR: %s" ex)))))) ;; From 5d186d10b4cd9b8ee0c49065dd5804ac97e477e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:09:40 -0500 Subject: [PATCH 0044/4235] doom-install-package: don't try to uninstall built-in packages --- core/autoload/packages.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 51c39dbbe..1e59fb4dd 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -249,10 +249,11 @@ Used by `doom//packages-install'." "Installs package NAME with optional quelpa RECIPE (see `quelpa-recipe' for an example; the package name can be omitted)." (doom-initialize-packages) - (when (package-installed-p name) - (when (doom-package-different-backend-p name) - (doom-delete-package name t)) - (user-error "%s is already installed" name)) + (when (and (package-installed-p name) + (not (package-built-in-p name))) + (if (doom-package-different-backend-p name) + (doom-delete-package name t) + (user-error "%s is already installed" name))) (let* ((inhibit-message (not doom-debug-mode)) (plist (or plist (cdr (assq name doom-packages)))) (recipe (plist-get plist :recipe)) From 20a8f2cbadb47a58e15004cd44b929363a48e78f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:09:54 -0500 Subject: [PATCH 0045/4235] Fix kill-this-buffer advice thinking everything is a popup --- 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 ccf600037..b980c0788 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -526,7 +526,7 @@ instead)." "Advice for `kill-this-buffer'. If there are no real buffers left, switch to `doom-fallback-buffer'." (let ((buf (current-buffer))) - (cond ((window-at-side-p) + (cond ((window-dedicated-p) (quit-window)) ((eq buf (doom-fallback-buffer)) (bury-buffer)) From c6764e0f24888e55e81b6486828749a11ae749b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:12:35 -0500 Subject: [PATCH 0046/4235] Fix file search opening files from wrong default-directory --- modules/completion/ivy/autoload/evil.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index b287a273a..67b9fb9af 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -44,7 +44,8 @@ ((equal directory project-root) (projectile-project-name)) (t - (file-relative-name directory project-root)))))) + (file-relative-name directory project-root))))) + (default-directory directory)) (setq +ivy--file-last-search query) (pcase engine ('ag From b3b31e4bd452942ce5238c2f9c29a7d858f2836b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 16:55:00 -0500 Subject: [PATCH 0047/4235] Display *Warnings* buffer in main workspace after startup #319 The creation of the main workspace would swallow the Warnings buffer, so we forcibly display it (if it exists) on startup. --- core/core.el | 7 ------- modules/feature/workspaces/config.el | 6 +++++- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/core/core.el b/core/core.el index b087e12f6..fbcc2348d 100644 --- a/core/core.el +++ b/core/core.el @@ -146,10 +146,6 @@ ability to invoke the debugger in debug mode." ;;; ;; Initialize (eval-and-compile - ;; Defer warnings during the Doom startup process, giving other modules more - ;; time to initialize and make mistakes. - (remove-hook 'delayed-warnings-hook #'display-delayed-warnings) - (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, @@ -188,9 +184,6 @@ ability to invoke the debugger in debug mode." (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook))) - ;; We're ready to display warnings now. - (add-hook 'delayed-warnings-hook #'display-delayed-warnings t) - ;; If you forget to reset this, you'll get stuttering and random freezes! (setq gc-cons-threshold 16777216 gc-cons-percentage 0.1 diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index c66148228..5cd106696 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -71,7 +71,11 @@ renamed.") ;; Switch to it if we aren't auto-loading the last session (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main (or frame (selected-frame)))))) + (persp-frame-switch +workspaces-main (or frame (selected-frame)))) + ;; Make sure warnings are visible (fix #319) + (when-let* ((warnings (get-buffer "*Warnings*"))) + (display-buffer-in-side-window + warnings '((window-height . shrink-window-if-larger-than-buffer)))))) (defun +workspaces|init-persp-mode () ;; Remap `buffer-list' to current workspace's buffers in `doom-buffer-list' From 1371d341492c5b72e7c08365c1e55622e11b288d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 17:05:37 -0500 Subject: [PATCH 0048/4235] :boom: Replace feature/jump with feature/lookup + Adds Dash docset integration (with helm or ivy support) + Adds devdocs.io integration + Three new settings: :lookup, :devdocs and :docset --- init.example.el | 4 +- modules/feature/jump/autoload/evil.el | 11 - modules/feature/jump/autoload/jump.el | 146 ------------- modules/feature/jump/config.el | 106 ---------- modules/feature/jump/packages.el | 8 - modules/feature/lookup/README.org | 182 +++++++++++++++++ modules/feature/lookup/autoload/evil.el | 22 ++ modules/feature/lookup/autoload/lookup.el | 237 ++++++++++++++++++++++ modules/feature/lookup/config.el | 189 +++++++++++++++++ modules/feature/lookup/packages.el | 17 ++ modules/lang/javascript/config.el | 4 +- modules/lang/javascript/packages.el | 2 +- modules/private/default/+bindings.el | 18 +- modules/private/default/+evil-commands.el | 4 +- 14 files changed, 666 insertions(+), 284 deletions(-) delete mode 100644 modules/feature/jump/autoload/evil.el delete mode 100644 modules/feature/jump/autoload/jump.el delete mode 100644 modules/feature/jump/config.el delete mode 100644 modules/feature/jump/packages.el create mode 100644 modules/feature/lookup/README.org create mode 100644 modules/feature/lookup/autoload/evil.el create mode 100644 modules/feature/lookup/autoload/lookup.el create mode 100644 modules/feature/lookup/config.el create mode 100644 modules/feature/lookup/packages.el diff --git a/init.example.el b/init.example.el index 3a7a691a7..b683638f8 100644 --- a/init.example.el +++ b/init.example.el @@ -34,7 +34,9 @@ eval ; run code, run (also, repls) evil ; come to the dark side, we have cookies file-templates ; auto-snippets for empty files - jump ; helping you get around + (lookup ; helps you navigate your code and documentation + +devdocs ; ...on devdocs.io online + +docsets) ; ...or in Dash docsets locally services ; TODO managing external services & code builders snippets ; my elves. They type so I don't have to spellcheck ; tasing you for misspelling mispelling diff --git a/modules/feature/jump/autoload/evil.el b/modules/feature/jump/autoload/evil.el deleted file mode 100644 index 51142c206..000000000 --- a/modules/feature/jump/autoload/evil.el +++ /dev/null @@ -1,11 +0,0 @@ -;;; feature/jump/autoload/evil.el -*- lexical-binding: t; -*- -;;;###if (featurep! :feature evil) - -;;;###autoload (autoload '+jump:online "feature/jump/autoload/evil" nil t) -(evil-define-command +jump:online (query &optional bang) - "Look up QUERY online. Will prompt for search engine the first time, then -reuse it on consecutive uses of this command. If BANG, always prompt for search -engine." - (interactive "") - (+jump/online (or query (thing-at-point 'symbol t)) - (+jump--online-get-provider bang))) diff --git a/modules/feature/jump/autoload/jump.el b/modules/feature/jump/autoload/jump.el deleted file mode 100644 index 36ad3c49c..000000000 --- a/modules/feature/jump/autoload/jump.el +++ /dev/null @@ -1,146 +0,0 @@ -;;; feature/jump/autoload.el -*- lexical-binding: t; -*- - -(defvar +jump--rg-installed-p (executable-find "rg")) -(defvar +jump--ag-installed-p (executable-find "ag")) - -(defun +jump-to (prop identifier &optional other-window) - (with-selected-window - (if other-window - (save-excursion (other-window 1) (selected-window)) - (selected-window)) - (let ((fn (plist-get +jump-current-functions prop))) - (if (commandp fn) - (call-interactively fn) - (funcall fn identifier))))) - -;;;###autoload -(defun +jump/definition (identifier &optional other-window) - "Jump to the definition of the symbol at point. - -Tries xref and falls back to `dumb-jump', then rg/ag, then -`evil-goto-definition' (if evil is active)." - (interactive - (list (thing-at-point 'symbol t) - current-prefix-arg)) - (cond ((null identifier) - (user-error "Nothing under point")) - - ((plist-member +jump-current-functions :definition) - (+jump-to :definition identifier)) - - ((ignore-errors (if other-window - (xref-find-definitions-other-window identifier) - (xref-find-definitions identifier)) - t)) - - ((and (require 'dumb-jump nil t) - ;; dumb-jump doesn't tell us if it succeeded or not - (let ((old-fn (symbol-function 'dumb-jump-get-results)) - successful) - (cl-letf (((symbol-function 'dumb-jump-get-results) - (lambda (&optional prompt) - (let* ((plist (funcall old-fn prompt)) - (results (plist-get plist :results))) - (when (and results (> (length results) 0)) - (setq successful t)) - plist)))) - (if other-window - (dumb-jump-go-other-window) - (dumb-jump-go)) - successful)))) - - ((and identifier - (featurep 'counsel) - (let ((regex (rxt-quote-pcre identifier))) - (or (and +jump--rg-installed-p - (counsel-rg regex (doom-project-root))) - (and +jump--ag-installed-p - (counsel-ag regex (doom-project-root))))))) - - ((and (featurep 'evil) - evil-mode - (cl-destructuring-bind (beg . end) - (bounds-of-thing-at-point 'symbol) - (evil-goto-definition) - (let ((pt (point))) - (not (and (>= pt beg) - (< pt end))))))) - - (t (user-error "Couldn't find '%s'" identifier)))) - -;;;###autoload -(defun +jump/references (identifier) - "Show a list of references to the symbol at point. - -Tries `xref-find-references' and falls back to rg/ag." - (interactive (list (thing-at-point 'symbol t))) - (cond ((plist-member +jump-current-functions :references) - (+jump-to :references identifier)) - - ((ignore-errors (xref-find-references identifier) - t)) - - ((and identifier - (featurep 'counsel) - (let ((regex (rxt-quote-pcre identifier))) - (or (and (executable-find "rg") - (counsel-rg regex (doom-project-root))) - (and (executable-find "ag") - (counsel-ag regex (doom-project-root))))))) - - (t (error "Couldn't find '%s'" identifier)))) - -;;;###autoload -(defun +jump/documentation (identifier) - "Show documentation for the symbol at point, if available." - (interactive (list (thing-at-point 'symbol t))) - (cond ((plist-member +jump-current-functions :documentation) - (+jump-to :documentation identifier)) - (t - (+jump/online - identifier - (+jump--online-get-provider (not current-prefix-arg)))))) - -(defun +jump--online-get-provider (&optional force-p) - (or (and (not force-p) - +jump--online-last) - (completing-read "Search on: " - (mapcar #'car +jump-search-provider-alist) - nil t))) - -(defvar +jump--online-last nil) -;;;###autoload -(defun +jump/online (search &optional provider) - "Looks up SEARCH (a string) in you browser using PROVIDER. - -PROVIDER should be a key of `+jump-search-provider-alist'. - -When used interactively, it will prompt for a query and, for the first time, the -provider from `+jump-search-provider-alist'. On consecutive uses, the last -provider will be reused. If the universal argument is supplied, always prompt -for the provider." - (interactive - (list (or (and (region-active-p) - (buffer-substring-no-properties (region-beginning) - (region-end))) - (read-string "Search for: " (thing-at-point 'symbol t))) - (+jump--online-get-provider current-prefix-arg))) - (condition-case _ex - (let ((url (cdr (assoc provider +jump-search-provider-alist)))) - (unless url - (error "'%s' is an invalid search engine" provider)) - (when (or (functionp url) (symbolp url)) - (setq url (funcall url))) - (cl-assert (and (stringp url) (not (string-empty-p url)))) - (when (string-empty-p search) - (user-error "The search query is empty")) - (setq +jump--online-last provider) - (funcall +jump-search-browser-fn (format url (url-encode-url search)))) - ('error (setq +jump--online-last nil)))) - -;;;###autoload -(defun +jump/online-select () - "Runs `+jump/online', but always prompts for the provider to use." - (interactive) - (let ((current-prefix-arg t)) - (call-interactively #'+jump/online))) diff --git a/modules/feature/jump/config.el b/modules/feature/jump/config.el deleted file mode 100644 index f4e005446..000000000 --- a/modules/feature/jump/config.el +++ /dev/null @@ -1,106 +0,0 @@ -;;; feature/jump/config.el -*- lexical-binding: t; -*- - -;; "What am I looking at?" -;; -;; This module helps you answer that question. It helps you look up whatever -;; you're looking at. -;; -;; + `+jump/definition': a jump-to-definition that should 'just work' -;; + `+jump/references': find a symbol's references in the current project -;; + `+jump/online'; look up a symbol on online resources, like stackoverflow, -;; devdocs.io or google. -;; -;; This module uses `xref', an experimental new library in Emacs. It may change -;; in the future. When xref can't be depended on it will fall back to -;; `dumb-jump' to find what you want. - -(defvar +jump-search-provider-alist - '(("Google" . "https://google.com/search?q=%s") - ("Google images" . "https://google.com/images?q=%s") - ("Google maps" . "https://maps.google.com/maps?q=%s") - ("Project Gutenberg" . "http://www.gutenberg.org/ebooks/search/?query=%s") - ("DuckDuckGo" . "https://duckduckgo.com/?q=%s") - ("DevDocs.io" . "http://devdocs.io/#q=%s") - ("StackOverflow" . "https://stackoverflow.com/search?q=%s") - ("Github" . "https://github.com/search?ref=simplesearch&q=%s") - ("Youtube" . "https://youtube.com/results?aq=f&oq=&search_query=%s") - ("Wolfram alpha" . "https://wolframalpha.com/input/?i=%s") - ("Wikipedia" . "https://wikipedia.org/search-redirect.php?language=en&go=Go&search=%s")) - "An alist that maps online resources to their search url or a function that -produces an url. Used by `+jump/online'.") - -(defvar +jump-search-browser-fn #'browse-url - "Function to use to open search urls.") - -(defvar +jump-function-alist nil - "An alist mapping major modes to jump function plists, describing what to do -with `+jump/definition', `+jump/references' and `+jump/documentation' are -called.") - -(defvar-local +jump-current-functions nil - "The enabled jump functions for the current buffer.") - -(def-setting! :jump (modes &rest plist) - "Definies a jump target for major MODES. PLIST accepts the following -properties: - - :definition FN - Run when jumping to a symbol's definition. - Used by `+jump/definition'. - :references FN - Run when looking for usage references of a symbol in the current project. - Used by `+jump/references'. - :documentation FN - Run when looking up documentation for a symbol. - Used by `+jump/documentation'." - `(dolist (mode (doom-enlist ,modes)) - (push (cons mode (list ,@plist)) +jump-function-alist))) - -;; Let me control what backends to fall back on -(setq-default xref-backend-functions '(t)) - -(set! :popup "*xref*" :noselect t :autokill t :autoclose t) - -;; Recenter after certain jumps -(add-hook! - '(imenu-after-jump-hook evil-jumps-post-jump-hook - counsel-grep-post-action-hook dumb-jump-after-jump-hook) - #'recenter) - -(defun +jump|init () - "Initialize `+jump-current-functions', used by `+jump/definition', -`+jump/references' and `+jump/documentation'." - (when-let* ((plist (cdr (assq major-mode +jump-function-alist)))) - (when-let* ((backend (plist-get plist :xref-backend))) - (make-variable-buffer-local 'xref-backend-functions) - (cl-pushnew backend xref-backend-functions :test #'eq)) - (setq-local +jump-current-functions plist))) -(add-hook 'after-change-major-mode-hook #'+jump|init) - - -;; -;; 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) - :config - (setq dumb-jump-default-project doom-emacs-dir - dumb-jump-aggressive nil - dumb-jump-selector (cond ((featurep! :completion ivy) 'ivy) - ((featurep! :completion helm) 'helm) - (t 'popup)))) - diff --git a/modules/feature/jump/packages.el b/modules/feature/jump/packages.el deleted file mode 100644 index 712158bb2..000000000 --- a/modules/feature/jump/packages.el +++ /dev/null @@ -1,8 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; feature/jump/packages.el - -(package! dumb-jump) -(when (featurep! :completion ivy) - (package! ivy-xref)) -(when (featurep! :completion helm) - (package! helm-xref)) diff --git a/modules/feature/lookup/README.org b/modules/feature/lookup/README.org new file mode 100644 index 000000000..8ca362370 --- /dev/null +++ b/modules/feature/lookup/README.org @@ -0,0 +1,182 @@ +#+TITLE: :feature lookup + +Integrates with code navigation and documentation tools to help you quickly look +up definitions, references and documentation. + ++ Integration with devdocs.io ++ Integration with Dash.app docsets. ++ Jump-to-definition and find-references implementations that just work. ++ Powerful xref integration for languages that support it. + +* Table of Contents :TOC: +- [[#install][Install]] + - [[#module-flags][Module flags]] + - [[#dependencies][Dependencies]] +- [[#usage][Usage]] + - [[#jump-to-definition][Jump to definition]] + - [[#find-references][Find references]] + - [[#look-up-documentation][Look up documentation]] + - [[#search-a-specific-documentation-backend][Search a specific documentation backend]] +- [[#configuration][Configuration]] + - [[#settings][Settings]] + - [[#open-in-eww-instead-of-browser][Open in eww instead of browser]] +- [[#appendix][Appendix]] + - [[#commands][Commands]] + +* Install +To enable the module add =:feature lookup= to your ~doom!~ block in +=~/.emacs.d/init.el=. + +** Module flags +This module provides two flags: + ++ ~+docsets~ Enables integration with Dash docsets. ++ ~+devdocs~ Enables integration with devdocs.io search. + +** Dependencies +This module has several soft dependencies: + ++ ~the_silver_searcher~ and/or ~ripgrep~ as a last-resort fallback for + jump-to-definition/find-references. ++ ~sqlite3~ for Dash docset support. + +*** MacOS +#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +brew install the_silver_searcher ripgrep + +# An older version of sqlite is included in MacOS. If it causes you problems (and +# it has been reported that it will), install it through homebrew: +brew install sqlite +# Note that it's keg-only, meaning it isn't symlinked to /usr/local/bin. You'll +# have to add it to PATH yourself (or symlink it into your PATH somewhere). e.g. +export PATH="/usr/local/opt/sqlite/bin:$PATH" +#+END_SRC + +*** Arch Linux +#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") +sudo pacman --needed --noconfirm -S sqlite the_silver_searcher ripgrep +#+END_SRC + +* Usage +** Jump to definition +Use ~+lookup/definition~ (bound to =gd= in normal mode) to jump to the +definition of the symbol at point + +This module provides a goto-definition implementation that will try the +following sources before giving up: + +1. Whatever ~:definition~ function is registered for the current buffer with the + ~:lookup~ setting (see "Configuration" section). +2. Any available xref backends. +3. ~dumb-jump~ (a text search with aides to reduce false positives). +3. An ordinary project-wide text search with ripgrep or the_silver_searcher. +5. If ~evil-mode~ is active, use ~evil-goto-definition~, which preforms a simple + text search within the current buffer. + +If there are multiple results, you will be prompted to select one. + +** Find references +Use ~+lookup/references~ (bound to =gD= in normal mode) to see a list of +references for the symbol at point from throughout your project. + +Like ~+lookup/definition~, this tries a number of sources before giving up. It +will try: + +1. Whatever ~:references~ function is registered for the current buffer with the + ~:lookup~ setting (see "Configuration" section). +2. Any available xref backends. +3. An ordinary project-wide text search with ripgrep or the_silver_searcher. + +If there are multiple results, you will be prompted to select one. + +** Look up documentation +~+lookup/documentation~ (bound to =gh= in normal mode) will open documentation +for the symbol at point. + +Depending on your configuration, this will try a list of sources: + +1. Whatever ~:documentation~ function is registered for the current buffer with + the ~:lookup~ setting (see "Configuration" section). +2. Any Dash.app docsets, if any are installed for the current major mode. +3. devdocs.io, if it has a docset for the current mode. +4. An online search; using the last engine used (it will prompt you the first + time, or if ~current-prefix-arg~ is non-nil). + +** Search a specific documentation backend +You can perform a documentation lookup on any backends directly: + ++ Dash Docsets: ~+lookup/in-docsets~, or ~:dash QUERY~ for evil users. ++ devdocs.io: ~+lookup/in-devdocs~, or ~:dd QUERY~ for evil users. ++ Online (generic): ~+lookup/online~ or ~+lookup/online-select~ (bound to =SPC / + o=), or ~:lo[okup] QUERY~ for evil users. + +* Configuration +** Settings +This module provides three settings: ~:lookup~, ~:docset~ and ~:devdocs~. + +*** ~:lookup MODES &rest PLIST~ +Defines a lookup target for major MODES (one major-mode symbol or a list +thereof). PLIST accepts the following optional properties: + ++ ~:definition FN~ :: Run when jumping to a symbol's definition. Used by + ~+lookup/definition~. ++ ~:references FN~ :: Run when looking for usage references of a symbol in the + current project. Used by ~+lookup/references~. ++ ~:documentation FN~ :: Run when looking up documentation for a symbol. Used by + ~+lookup/documentation~. ++ ~:xref-backend FN~ :: Defines an xref backend for a major-mode. With this, + :definition and :references are unnecessary. + +**** Example +#+BEGIN_SRC emacs-lisp +;; For python-mode, anaconda-mode offers a backend for all three lookup +;; functions. We can register them like so: +(set! :lookup 'python-mode + :definition #'anaconda-mode-find-definitions + :references #'anaconda-mode-find-references + :documentation #'anaconda-mode-show-doc) + +;; If a language or plugin provides a custom xref backend available for it, use +;; that instead. It will provide the best jump-to-definition and find-references +;; experience. You can specify custom xref backends with: +(set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend) +;; NOTE: xref doesn't provide a :documentation backend. +#+END_SRC + +*** ~:docset MODES &rest DOCSETS~ +Registers a list of DOCSETS (strings) for MODES (either one major mode symbol or +a list of them). Used by ~+lookup/in-docsets~ and ~+lookup/documentation~. + +#+BEGIN_SRC emacs-lisp +(set! :docset 'js2-mode "JavaScript" "JQuery") +;; Add docsets to minor modes by starting DOCSETS with :add +(set! :docset 'rjsx-mode :add "React") +;; Or remove docsets from minor modes +(set! :docset 'nodejs-mode :remove "JQuery") +#+END_SRC + +*** ~:devdocs MODES DOCSET~ +Registers a devdocs DOCset (one string) to search when in MODES (either one +major mode symbol or a list). Used by ~+lookup/in-devdocs~ and +~+lookup/documentation~. With devdocs you can only search one docset at a time. + +#+BEGIN_SRC emacs-lisp +(set! :devdocs 'js2-mode "javascript") +;; works on minor modes too +(set! :devdocs 'rjsx-mode "react") +#+END_SRC + +** Open in eww instead of browser +#+BEGIN_SRC emacs-lisp +(setq +lookup-open-url-fn 'eww) +#+END_SRC + +* Appendix +** Commands ++ ~+lookup/definition~ ++ ~+lookup/references~ ++ ~+lookup/documentation~ ++ ~+lookup/online~ ++ ~+lookup/online-select~ ++ ~+lookup/in-devdocs~ ++ ~+lookup/in-docsets~ diff --git a/modules/feature/lookup/autoload/evil.el b/modules/feature/lookup/autoload/evil.el new file mode 100644 index 000000000..72c193fcc --- /dev/null +++ b/modules/feature/lookup/autoload/evil.el @@ -0,0 +1,22 @@ +;;; feature/lookup/autoload/evil.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) + +;;;###autoload (autoload '+lookup:online "feature/lookup/autoload/evil" nil t) +(evil-define-command +lookup:online (query &optional bang) + "Look up QUERY online. Will prompt for search engine the first time, then +reuse it on consecutive uses of this command. If BANG, always prompt for search +engine." + (interactive "") + (+lookup/online query (+lookup--online-provider bang 'evil-ex))) + +;;;###autoload (autoload '+lookup:dash "feature/lookup/autoload/evil" nil t) +(evil-define-command +lookup:dash (query &optional bang) + "TODO" + (interactive "") + (+lookup/in-docsets query (if bang 'blank))) + +;;;###autoload (autoload '+lookup:devdocs "feature/lookup/autoload/evil" nil t) +(evil-define-command +lookup:devdocs (query &optional bang) + "TODO" + (interactive "") + (+lookup/in-devdocs query (if bang 'blank))) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el new file mode 100644 index 000000000..03b19fe12 --- /dev/null +++ b/modules/feature/lookup/autoload/lookup.el @@ -0,0 +1,237 @@ +;;; feature/lookup/autoload/lookup.el -*- lexical-binding: t; -*- + +(defvar +lookup--rg-installed-p (executable-find "rg")) +(defvar +lookup--ag-installed-p (executable-find "ag")) +(defvar +lookup--last-provider nil) + +;; Helpers +(defun +lookup--online-provider (&optional force-p namespace) + (let ((key (or namespace major-mode))) + (or (and (not force-p) + (cdr (assq key +lookup--last-provider))) + (when-let* ((provider + (completing-read + "Search on: " + (mapcar #'car +lookup-provider-url-alist) + nil t))) + (push (cons key provider) + (assq-delete-all key +lookup--last-provider)))))) + +(defun +lookup--symbol-or-region (&optional initial) + (cond (initial) + ((use-region-p) + (buffer-substring-no-properties (region-beginning) + (region-end))) + ((thing-at-point 'symbol t)))) + +(defun +lookup--jump-to (prop identifier &optional other-window) + (with-selected-window + (if other-window + (save-excursion (other-window 1) (selected-window)) + (selected-window)) + (let ((fn (plist-get +lookup-current-functions prop)) + (origin (point-marker))) + (condition-case e + (or (if (commandp fn) + (call-interactively fn) + (funcall fn identifier)) + (/= (point-marker) origin)) + ('error + (message "%s" e) + nil))))) + + +;; +;; Main commands +;; + +;;;###autoload +(defun +lookup/definition (identifier &optional other-window) + "Jump to the definition of the symbol at point. It will try several things +to find it: + +1. It will try whatever function that has been set for the current buffer, in + `+lookup-current-functions'. +2. Then try any available xref backends, +3. Then `dumb-jump', +4. Then a plain project-wide text search, using ripgrep or the_silver_searcher. +5. Then, if `evil-mode' is active, use `evil-goto-definition', + +Failing all that, it will give up with an error." + (interactive + (list (thing-at-point 'symbol t) + current-prefix-arg)) + (cond ((null identifier) + (user-error "Nothing under point")) + + ((and (plist-member +lookup-current-functions :definition) + (+lookup--jump-to :definition identifier))) + + ((ignore-errors (if other-window + (xref-find-definitions-other-window identifier) + (xref-find-definitions identifier)) + t)) + + ((and (require 'dumb-jump nil t) + ;; dumb-jump doesn't tell us if it succeeded or not + (let ((old-fn (symbol-function 'dumb-jump-get-results)) + successful) + (cl-letf (((symbol-function 'dumb-jump-get-results) + (lambda (&optional prompt) + (let* ((plist (funcall old-fn prompt)) + (results (plist-get plist :results))) + (when (and results (> (length results) 0)) + (setq successful t)) + plist)))) + (if other-window + (dumb-jump-go-other-window) + (dumb-jump-go)) + successful)))) + + ((and identifier + (featurep 'counsel) + (let ((regex (rxt-quote-pcre identifier))) + (or (and +lookup--rg-installed-p + (counsel-rg regex (doom-project-root))) + (and +lookup--ag-installed-p + (counsel-ag regex (doom-project-root))))))) + + ((and (featurep 'evil) + evil-mode + (cl-destructuring-bind (beg . end) + (bounds-of-thing-at-point 'symbol) + (evil-goto-definition) + (let ((pt (point))) + (not (and (>= pt beg) + (< pt end))))))) + + (t (user-error "Couldn't find '%s'" identifier)))) + +;;;###autoload +(defun +lookup/references (identifier) + "Show a list of references to the symbol at point. + +Tries `xref-find-references' and falls back to rg/ag." + (interactive (list (thing-at-point 'symbol t))) + (cond ((and (plist-member +lookup-current-functions :references) + (+lookup--jump-to :references identifier))) + + ((ignore-errors (xref-find-references identifier) + t)) + + ((and identifier + (featurep 'counsel) + (let ((regex (rxt-quote-pcre identifier))) + (or (and (executable-find "rg") + (counsel-rg regex (doom-project-root))) + (and (executable-find "ag") + (counsel-ag regex (doom-project-root))))))) + + (t (error "Couldn't find '%s'" identifier)))) + +;;;###autoload +(defun +lookup/documentation (identifier) + "Show documentation for IDENTIFIER (defaults to symbol at point or selection. + +Goes down a list of possible backends: + +1. The :documentation spec defined with by `doom--set:lookup' +2. If the +docsets flag is active for :feature lookup, use `+lookup/in-docsets' +3. If the +devdocs flag is active for :feature lookup, run `+lookup/in-devdocs' +4. Fall back to an online search, with `+lookup/online'" + (interactive + (list (+lookup--symbol-or-region))) + (cond ((and (plist-member +lookup-current-functions :documentation) + (+lookup--jump-to :documentation identifier))) + + ((and (featurep! :feature lookup +docsets) + (cl-find-if #'helm-dash-docset-installed-p + (or (bound-and-true-p counsel-dash-docsets) + (bound-and-true-p helm-dash-docsets)))) + (+lookup/in-docsets identifier)) + + ((featurep! :feature lookup +devdocs) + (+lookup/in-devdocs identifier)) + + ((+lookup/online + identifier + (+lookup--online-provider (not current-prefix-arg)))))) + + +;; +;; Source-specific commands +;; + +;;;###autoload +(defun +lookup/in-devdocs (&optional query docs) + "TODO" + (interactive) + (require 'devdocs) + (let* ((docs + (unless (eq docs 'blank) + (or docs (cdr (assq major-mode devdocs-alist)) ""))) + (query (or query (+lookup--symbol-or-region) "")) + (pattern (string-trim-left (format "%s %s" docs query)))) + (unless (and current-prefix-arg docs) + (setq pattern (read-string "Lookup on devdocs.io: " pattern))) + (funcall +lookup-open-url-fn + (format "%s/#q=%s" devdocs-url + (url-hexify-string pattern))) + (unless (string-empty-p pattern) + (cl-pushnew pattern devdocs-search-history)))) + +;;;###autoload +(defun +lookup/in-docsets (&optional query docsets) + "TODO" + (interactive) + (let* ((counsel-dash-docsets + (unless (eq docsets 'blank) + (or docsets + (or (bound-and-true-p counsel-dash-docsets) + (bound-and-true-p helm-dash-docsets))))) + (helm-dash-docsets counsel-dash-docsets) + (query (or query (+lookup--symbol-or-region) ""))) + (cond ((featurep! :completion helm) + (helm-dash query)) + ((featurep! :completion ivy) + (counsel-dash query)) + (t + (user-error "No dash backend is installed, enable ivy or helm."))))) + +;;;###autoload +(defun +lookup/online (search &optional provider) + "Looks up SEARCH (a string) in you browser using PROVIDER. + +PROVIDER should be a key of `+lookup-provider-url-alist'. + +When used interactively, it will prompt for a query and, for the first time, the +provider from `+lookup-provider-url-alist'. On consecutive uses, the last +provider will be reused. If the universal argument is supplied, always prompt +for the provider." + (interactive + (list (or (and (use-region-p) + (buffer-substring-no-properties (region-beginning) + (region-end))) + (read-string "Search for: " (thing-at-point 'symbol t))) + (+lookup--online-provider current-prefix-arg))) + (condition-case _ex + (let ((url (cdr (assoc provider +lookup-provider-url-alist)))) + (unless url + (error "'%s' is an invalid search engine" provider)) + (when (or (functionp url) (symbolp url)) + (setq url (funcall url))) + (cl-assert (and (stringp url) (not (string-empty-p url)))) + (when (string-empty-p search) + (user-error "The search query is empty")) + (funcall +lookup-open-url-fn (format url (url-encode-url search)))) + ('error + (setq +lookup--last-provider + (assq-delete-all major-mode +lookup--last-provider))))) + +;;;###autoload +(defun +lookup/online-select () + "Runs `+lookup/online', but always prompts for the provider to use." + (interactive) + (let ((current-prefix-arg t)) + (call-interactively #'+lookup/online))) + diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el new file mode 100644 index 000000000..b51032a28 --- /dev/null +++ b/modules/feature/lookup/config.el @@ -0,0 +1,189 @@ +;;; feature/lookup/config.el -*- lexical-binding: t; -*- + +;; "What am I looking at?" This module helps you answer this question. +;; +;; + `+lookup/definition': a jump-to-definition that should 'just work' +;; + `+lookup/references': find a symbol's references in the current project +;; + `+lookup/online'; look up a symbol on online resources +;; + `+lookup/docs-at-point' +;; + `+lookup/docs-dash' +;; + `+lookup/docs-dash-at-point' +;; + `+lookup/devdocs' +;; + `+lookup/devdocs-at-point' +;; +;; This module uses `xref', an experimental new library in Emacs. It may change +;; in the future. When xref can't be depended on it will fall back to +;; `dumb-jump' to find what you want. + +(defvar +lookup-provider-url-alist + '(("Google" . "https://google.com/search?q=%s") + ("Google images" . "https://google.com/images?q=%s") + ("Google maps" . "https://maps.google.com/maps?q=%s") + ("Project Gutenberg" . "http://www.gutenberg.org/ebooks/search/?query=%s") + ("DuckDuckGo" . "https://duckduckgo.com/?q=%s") + ("DevDocs.io" . "https://devdocs.io/#q=%s") + ("StackOverflow" . "https://stackoverflow.com/search?q=%s") + ("Github" . "https://github.com/search?ref=simplesearch&q=%s") + ("Youtube" . "https://youtube.com/results?aq=f&oq=&search_query=%s") + ("Wolfram alpha" . "https://wolframalpha.com/input/?i=%s") + ("Wikipedia" . "https://wikipedia.org/search-redirect.php?language=en&go=Go&search=%s")) + "An alist that maps online resources to their search url or a function that +produces an url. Used by `+lookup/online'.") + +(defvar +lookup-open-url-fn #'browse-url + "Function to use to open search urls.") + +(defvar +lookup-function-alist nil + "An alist mapping major modes to jump function plists, describing what to do +with `+lookup/definition', `+lookup/references' and `+lookup/documentation' are +called.") + +(defvar-local +lookup-current-functions nil + "The enabled jump functions for the current buffer.") + +(def-setting! :lookup (modes &rest plist) + "Defines a jump target for major MODES. PLIST accepts the following +properties: + + :definition FN + Run when jumping to a symbol's definition. + Used by `+lookup/definition'. + :references FN + Run when looking for usage references of a symbol in the current project. + Used by `+lookup/references'. + :documentation FN + Run when looking up documentation for a symbol. + Used by `+lookup/documentation'. + :xref-backend FN + Defines an xref backend for a major-mode. With this, :definition and + :references are unnecessary." + `(dolist (mode (doom-enlist ,modes)) + (push (cons mode (list ,@plist)) + +lookup-function-alist))) + +;; Recenter buffer after certain jumps +(add-hook! + '(imenu-after-jump-hook evil-jumps-post-jump-hook + counsel-grep-post-action-hook dumb-jump-after-jump-hook) + #'recenter) + + +;; +;; dumb-jump +;; + +(def-package! dumb-jump + :commands (dumb-jump-go dumb-jump-quick-look + dumb-jump-back dumb-jump-result-follow) + :config + (setq dumb-jump-default-project doom-emacs-dir + dumb-jump-aggressive nil + dumb-jump-selector + (cond ((featurep! :completion ivy) 'ivy) + ((featurep! :completion helm) 'helm) + (t 'popup)))) + + +;; +;; xref +;; + +(after! xref + ;; By default, `etags--xref-backend' is the default xref backend. No need. + ;; We'll set these up ourselves in other modules. + (setq-default xref-backend-functions '(t)) + (set! :popup "*xref*" :noselect t :autokill t :autoclose t)) + +(defun +lookup|init-xref-backends () + "Set `+lookup-current-functions' for the current buffer. + +This variable is used by `+lookup/definition',`+lookup/references' and +`+lookup/documentation'." + (when-let* ((plist (cdr (assq major-mode +lookup-function-alist)))) + (when-let* ((backend (plist-get plist :xref-backend))) + (make-variable-buffer-local 'xref-backend-functions) + (cl-pushnew backend xref-backend-functions :test #'eq)) + (setq-local +lookup-current-functions plist))) +(add-hook 'after-change-major-mode-hook #'+lookup|init-xref-backends) + + +(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)) + + +;; +;; Dash docset integration +;; + +(when (featurep! +docsets) + (def-setting! :docset (modes &rest docsets) + "Registers a list of DOCSETS (strings) for MODES (either one major mode +symbol or a list of them). + +If MODES is a minor mode, you can use :add or :remove as the first element of +DOCSETS, to instruct it to append (or remove) those from the docsets already set +by a major-mode, if any. + +Used by `+lookup/in-docsets' and `+lookup/documentation'." + (cl-loop with ivy-p = (featurep! :completion ivy) + for mode in (doom-enlist (doom-unquote modes)) + for hook-sym = (intern (format "+docs|init-for-%s" mode)) + for var-sym = (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets) + collect hook-sym into hooks + collect + `(defun ,hook-sym () + (make-variable-buffer-local ',var-sym) + (cond ((eq (car docsets) :add) + `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) + ((eq (car docsets) :remove) + `(setq ,var-sym + (cl-loop with to-delete = (list ,@(cdr docsets)) + for docset in ,var-sym + unless (member docset to-delete) + collect docset))) + (`(setq ,var-sym (list ,@docsets))))) + into forms + finally return `(progn ,@forms (add-hook! ,modes ',hooks)))) + + ;; Both packages depend on helm-dash + (def-package! helm-dash + :commands (helm-dash helm-dash-install-docset helm-dash-at-point + helm-dash-docset-installed-p) + :config + ;; Obey XDG conventions + (when-let* ((xdg-data-home (getenv "XDG_DATA_HOME"))) + (setq helm-dash-docsets-path (expand-file-name "docsets" xdg-data-home))) + (unless (file-directory-p helm-dash-docsets-path) + (make-directory helm-dash-docsets-path t)) + (setq helm-dash-enable-debugging doom-debug-mode)) + + (def-package! counsel-dash + :when (featurep! :completion ivy) + :commands (counsel-dash counsel-dash-install-docset) + :after helm-dash + :config (setq counsel-dash-min-length 2))) + + +;; +;; devdocs.io integration +;; + +(when (featurep! +devdocs) + (def-setting! :devdocs (modes docset) + "Map major MODES (one major-mode symbol or a list of them) to a devdocs +DOCSET (a string). + +See `devdocs-alist' for the defaults. " + `(dolist (mode ',modes) + (push (cons mode ,docset) devdocs-alist))) + + (def-package! devdocs :defer t)) + diff --git a/modules/feature/lookup/packages.el b/modules/feature/lookup/packages.el new file mode 100644 index 000000000..3d54bd1a4 --- /dev/null +++ b/modules/feature/lookup/packages.el @@ -0,0 +1,17 @@ +;; -*- no-byte-compile: t; -*- +;;; feature/lookup/packages.el + +(package! dumb-jump) +(when (featurep! :completion ivy) + (package! ivy-xref)) +(when (featurep! :completion helm) + (package! helm-xref)) + +(when (featurep! +docsets) + (when (featurep! :completion helm) + (package! helm-dash)) + (when (featurep! :completion ivy) + (package! counsel-dash))) + +(when (featurep! +devdocs) + (package! devdocs)) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 772976ae9..c775bd034 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -45,7 +45,9 @@ ;; A find-{definition,references} backend for js2-mode. NOTE The xref API is ;; unstable and may break with an Emacs update. -(def-package! xref-js2 :commands xref-js2-xref-backend) +(def-package! xref-js2 + :when (featurep! :feature lookup) + :commands xref-js2-xref-backend) (def-package! nodejs-repl :commands nodejs-repl) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index c89f3bd09..22358eb9a 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -16,6 +16,6 @@ (when (featurep! :completion company) (package! company-tern)) -(when (featurep! :feature jump) +(when (featurep! :feature lookup) (package! xref-js2)) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 75c59770a..759d1e967 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -113,7 +113,7 @@ :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 "Online providers" :nv "o" #'+lookup/online-select) (:desc "workspace" :prefix "TAB" :desc "Display tab bar" :n "TAB" #'+workspace/display @@ -159,8 +159,8 @@ :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 "Jump to definition" :n "d" #'+lookup/definition + :desc "Jump to references" :n "D" #'+lookup/references :desc "Open REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl) @@ -205,9 +205,9 @@ :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 "Find definition" :n "." #'+lookup/definition + :desc "Find references" :n "/" #'+lookup/references + :desc "Find documentation" :n "h" #'+lookup/documentation :desc "What face" :n "'" #'doom/what-face :desc "What minor modes" :n ";" #'doom/what-minor-mode :desc "Info" :n "i" #'info @@ -297,9 +297,9 @@ :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 + :m "gd" #'+lookup/definition + :m "gD" #'+lookup/references + :m "gh" #'+lookup/documentation :n "gp" #'+evil/reselect-paste :n "gr" #'+eval:region :n "gR" #'+eval/buffer diff --git a/modules/private/default/+evil-commands.el b/modules/private/default/+evil-commands.el index 2ee09ea6c..9dfda8bc8 100644 --- a/modules/private/default/+evil-commands.el +++ b/modules/private/default/+evil-commands.el @@ -29,7 +29,9 @@ ;; 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! "lo[okup]" #'+lookup:online) +(ex! "dash" #'+lookup:dash) +(ex! "dd" #'+lookup:devdocs) (ex! "http" #'httpd-start) ; start http server (ex! "repl" #'+eval:repl) ; invoke or send to repl ;; TODO (ex! "rx" 'doom:regex) ; open re-builder From df37f987fbcb4178940df49c897e5e35c553040d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 22:00:15 -0500 Subject: [PATCH 0049/4235] Delete autoloads file on error + simpler error code This should prevent getting locked out of Doom due to a little errant code sneaking into your autoloads file. --- core/core.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index fbcc2348d..2372c20f9 100644 --- a/core/core.el +++ b/core/core.el @@ -166,9 +166,9 @@ ability to invoke the debugger in debug mode." (condition-case-unless-debug ex (require 'autoloads doom-autoload-file t) ('error + (delete-file doom-autoload-file) (lwarn 'doom-autoloads :warning - "%s in autoloads.el -> %s" - (car ex) (error-message-string ex)))) + "Error in autoloads.el -> %s" ex))) (unless noninteractive (load! core-ui) ; draw me like one of your French editors From 764620aa11aa382ec8080c9b9106c25d4b473888 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Jan 2018 22:02:10 -0500 Subject: [PATCH 0050/4235] Remove +ace-window module flag This is already the module's default. --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index b683638f8..9cdb36e6c 100644 --- a/init.example.el +++ b/init.example.el @@ -61,7 +61,7 @@ ;unicode ; extended unicode support for various languages ;tabbar ; FIXME an (incomplete) tab bar for Emacs vi-tilde-fringe ; fringe tildes to mark beyond EOB - (window-select +ace-window) ; visually switch windows + window-select ; visually switch windows :tools dired ; making dired pretty [functional] From bee80c1a24d0de218228ebfaa2c8380229d5123d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 04:31:44 -0500 Subject: [PATCH 0051/4235] ui/doom-dashboard: don't cd into non-existent directories Causes CDPATH errors. --- modules/ui/doom-dashboard/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index debcc73fc..5353d257e 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -124,8 +124,9 @@ whose dimensions may not be fully initialized by the time this is run." (defun +doom-dashboard-update-pwd () "TODO" (with-current-buffer (doom-fallback-buffer) - (cd (or (+doom-dashboard--get-pwd) - default-directory)))) + (let ((new-pwd (+doom-dashboard--get-pwd))) + (when (and new-pwd (file-directory-p new-pwd)) + (setq default-directory new-pwd))))) (defun +doom-dashboard-reload (&optional force) "Update the DOOM scratch buffer (or create it, if it doesn't exist)." From dd7a26352b1bdc8cdcde2da8d2122e34c8b984fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 13:13:07 -0500 Subject: [PATCH 0052/4235] lang/cc: remove unused arg in +cc/reload-compile-db Appeases the byte-compiler (praise be!) --- 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 d40bcd104..896d61377 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -1,9 +1,9 @@ ;;; lang/cc/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +cc/reload-compile-db (&optional force-p) +(defun +cc/reload-compile-db () "Reload the current project's JSON compilation database." - (interactive "P") + (interactive) (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") From fab6fb1270d37ea325015f1bdf6c9887f7ceacc7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 13:16:42 -0500 Subject: [PATCH 0053/4235] ui/window-select: use use-package :when/:unless instead of cond Appease the byte-compiler. --- modules/ui/window-select/config.el | 42 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/modules/ui/window-select/config.el b/modules/ui/window-select/config.el index eff60aa08..b055bb779 100644 --- a/modules/ui/window-select/config.el +++ b/modules/ui/window-select/config.el @@ -1,24 +1,24 @@ ;;; ui/window-select/config.el -*- lexical-binding: t; -*- -(cond - ((featurep! +switch-window) - (def-package! switch-window - :commands (switch-window switch-window-then-maximize switch-window-then-split-below - switch-window-then-split-right switch-window-then-delete - switch-window-then-swap-buffer) - :init - (define-key global-map [remap other-window] #'switch-window) - :config - (setq switch-window-shortcut-style 'qwerty - switch-window-qwerty-shortcuts '("a" "s" "d" "f" "g" "h" "j" "k" "l")))) +(def-package! switch-window + :when (featurep! +switch-window) + :commands (switch-window switch-window-then-maximize switch-window-then-split-below + switch-window-then-split-right switch-window-then-delete + switch-window-then-swap-buffer) + :init + (define-key global-map [remap other-window] #'switch-window) + :config + (setq switch-window-shortcut-style 'qwerty + switch-window-qwerty-shortcuts '("a" "s" "d" "f" "g" "h" "j" "k" "l"))) - ((or (featurep! +ace-window) t) ; default to ace-window - (def-package! ace-window - :commands (ace-window ace-swap-window ace-delete-window - ace-select-window ace-delete-other-windows) - :init - (define-key global-map [remap other-window] #'ace-window) - :config - (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) - aw-scope 'frame - aw-background t)))) + +(def-package! ace-window + :unless (featurep! +switch-window) + :commands (ace-window ace-swap-window ace-delete-window + ace-select-window ace-delete-other-windows) + :init + (define-key global-map [remap other-window] #'ace-window) + :config + (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) + aw-scope 'frame + aw-background t)) From 55ad843a09f9064f38af067da217da2f740cdadd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 13:32:39 -0500 Subject: [PATCH 0054/4235] lang/org: fix byte-compiler using outdated, built-in org #327 During runtime, the new version of org (installed via ELPA) is added to load-path, but this doesn't happen during compile-time. Wrap it in eval-and-compile and that changes. --- modules/lang/org/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 422e0ea59..d43e6ccb4 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -4,10 +4,11 @@ "The directory where org files are kept.") ;; Ensure ELPA org is prioritized above built-in org. -(when-let* ((path (locate-library "org" nil doom--base-load-path))) - (setq load-path - (delete (substring (file-name-directory path) 0 -1) - load-path))) +(eval-and-compile + (when-let* ((path (locate-library "org" nil doom--base-load-path))) + (setq load-path + (delete (substring (file-name-directory path) 0 -1) + load-path)))) ;; Sub-modules (if (featurep! +attach) (load! +attach)) From a568f950043cde2381957ff113b0e221d4c625e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 13:37:05 -0500 Subject: [PATCH 0055/4235] Fix doom//reload-autoloads #328 `get-file-buffer` returns nil if no buffer for that file already exists. In an edge case on Windows, `update-file-autoloads` doesn't leave a hanging buffer, possibly ignoring its SAVE-AFTER argument. Using `find-file-noselect` fixes this, which will open a buffer if one doesn't already exist. --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index d486c5faf..c454ce6fd 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -567,7 +567,7 @@ This should be run whenever init.el or an autoload file is modified. Running "✓ 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)) + (let ((buf (find-file-noselect doom-autoload-file t)) current-sexp) (unwind-protect (condition-case-unless-debug ex From f277eddf1b2377aa4e61f1a7385026c003392f00 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 14:43:44 -0500 Subject: [PATCH 0056/4235] feature/syntax-checker: use flycheck-popup-tip on MacOS #318 pos-tip.el (what flycheck-pos-tip's uses) is buggy on MacOS, with no guarantee where a popup may appear. --- modules/feature/syntax-checker/config.el | 7 +++++++ modules/feature/syntax-checker/packages.el | 5 +++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 2fb58bbad..4267f0a60 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -22,9 +22,16 @@ (def-package! flycheck-pos-tip + :unless IS-MAC :after flycheck :config (setq flycheck-pos-tip-timeout 10 flycheck-display-errors-delay 0.5) (flycheck-pos-tip-mode +1)) + +(def-package! flycheck-popup-tip + :when IS-MAC + :after flycheck + :hook (flycheck-mode . flycheck-popup-tip-mode)) + diff --git a/modules/feature/syntax-checker/packages.el b/modules/feature/syntax-checker/packages.el index 540671c12..ae0d38629 100644 --- a/modules/feature/syntax-checker/packages.el +++ b/modules/feature/syntax-checker/packages.el @@ -2,5 +2,6 @@ ;;; feature/syntax-checker/packages.el (package! flycheck) -(package! flycheck-pos-tip) - +(if IS-MAC + (package! flycheck-popup-tip) + (package! flycheck-pos-tip)) From 23ff93703c2987958145a8c509aa3d16d863ee82 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 14:54:45 -0500 Subject: [PATCH 0057/4235] Append slash to default-directory in doom dashboard ...And give +doom-dashboard-update-pwd a docstring --- modules/ui/doom-dashboard/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 5353d257e..ea678def2 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -122,10 +122,13 @@ whose dimensions may not be fully initialized by the time this is run." (doom-fallback-buffer))) (defun +doom-dashboard-update-pwd () - "TODO" + "Update `default-directory' in the Doom dashboard buffer. What it is set to is +controlled by `+doom-dashboard-pwd-policy'." (with-current-buffer (doom-fallback-buffer) (let ((new-pwd (+doom-dashboard--get-pwd))) (when (and new-pwd (file-directory-p new-pwd)) + (unless (string-suffix-p "/" new-pwd) + (setq new-pwd (concat new-pwd "/"))) (setq default-directory new-pwd))))) (defun +doom-dashboard-reload (&optional force) From 1583ca573dc1993de67af2f46d473c23e4f7bbd0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 14:55:21 -0500 Subject: [PATCH 0058/4235] Fix ui/doom-dashboard tests --- modules/ui/doom-dashboard/test/doom-dashboard.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/doom-dashboard/test/doom-dashboard.el b/modules/ui/doom-dashboard/test/doom-dashboard.el index b08188837..966487ff7 100644 --- a/modules/ui/doom-dashboard/test/doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/doom-dashboard.el @@ -28,6 +28,7 @@ (should (+doom-dashboard-p))))) (def-test! get-pwd + :minor-mode projectile-mode (let ((default-directory doom-core-dir) (+doom-dashboard--last-cwd doom-core-dir) projectile-enable-caching) @@ -40,6 +41,7 @@ (should (equal (+doom-dashboard--get-pwd) (cdr spec))))))) (def-test! pwd-policy + :minor-mode projectile-mode (dolist (spec (list (cons 'last-project doom-emacs-dir) (cons 'last doom-core-dir) (cons "~" (expand-file-name "~/")) From 9cc762ffbe380a240d81dabf6bcea81c4f6af505 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 14:56:55 -0500 Subject: [PATCH 0059/4235] Remove unnecessary +doom-dashboard|init from test --- modules/ui/doom-dashboard/test/doom-dashboard.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/doom-dashboard/test/doom-dashboard.el b/modules/ui/doom-dashboard/test/doom-dashboard.el index 966487ff7..336a5daad 100644 --- a/modules/ui/doom-dashboard/test/doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/doom-dashboard.el @@ -2,7 +2,6 @@ ;;; ui/doom-dashboard/test/doom-dashboard.el (require! :ui doom-dashboard) -(+doom-dashboard|init) (defun -dashboard-test-pwd (spec file) (let ((kill-buffer-query-functions '(+doom-dashboard|reload-on-kill)) From 42cee2e046a909f7a9adde41e9aeb566cbdb61be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 23:55:04 -0500 Subject: [PATCH 0060/4235] Update :jump => :lookup --- modules/lang/cc/config.el | 2 +- modules/lang/elixir/config.el | 2 +- modules/lang/emacs-lisp/config.el | 5 ++++- modules/lang/go/config.el | 2 +- modules/lang/haskell/+intero.el | 2 +- modules/lang/java/+eclim.el | 2 +- modules/lang/java/+meghanada.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/python/config.el | 2 +- modules/lang/rust/config.el | 2 +- modules/lang/typescript/config.el | 2 +- 11 files changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index f5b61e172..bc63b9a71 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -210,7 +210,7 @@ compilation database is present in the project.") (if (/= (length bins) 2) (warn "cc-mode: couldn't find %s, disabling rtags support" bins) (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) - (set! :jump '(c-mode c++-mode) + (set! :lookup '(c-mode c++-mode) :definition #'rtags-find-symbol-at-point :references #'rtags-find-references-at-point))) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 7e332d5ce..bfcc5818e 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -18,7 +18,7 @@ :after elixir-mode :hook (elixir-mode . alchemist-mode) :config - (set! :jump 'elixir-mode + (set! :lookup 'elixir-mode :definition #'alchemist-goto-definition-at-point :documentation #'alchemist-help-search-at-point) (set! :eval 'elixir-mode #'alchemist-eval-region)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 5a8692db9..4f1e02586 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -5,7 +5,10 @@ :config (set! :repl 'emacs-lisp-mode #'+emacs-lisp/repl) (set! :eval 'emacs-lisp-mode #'+emacs-lisp-eval) - (set! :jump 'emacs-lisp-mode :documentation #'describe-symbol) + + ;; An xref backend is set up automatically for emacs-lisp-mode + (set! :lookup 'emacs-lisp-mode :documentation #'describe-symbol) + (set! :rotate 'emacs-lisp-mode :symbols '(("t" "nil") ("let" "let*") diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 2cb8222a9..a04c1b870 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -12,7 +12,7 @@ (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t))) (set! :repl 'go-mode #'gorepl-run) - (set! :jump 'go-mode + (set! :lookup 'go-mode :definition #'go-guru-definition :references #'go-guru-referrers :documentation #'godoc-at-point) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 666ef0355..9359f6b8c 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -11,7 +11,7 @@ (add-hook! 'intero-mode-hook #'(flycheck-mode eldoc-mode)) (set! :popup "^intero:backend:" :regex t :size 12) - (set! :jump 'haskell-mode :definition #'intero-goto-definition)) + (set! :lookup 'haskell-mode :definition #'intero-goto-definition)) (def-package! hindent diff --git a/modules/lang/java/+eclim.el b/modules/lang/java/+eclim.el index 8bacaa9d6..f44a4dcba 100644 --- a/modules/lang/java/+eclim.el +++ b/modules/lang/java/+eclim.el @@ -6,7 +6,7 @@ (def-package! eclim :hook (java-mode . eclim-mode) :config - (set! :jump 'java-mode + (set! :lookup 'java-mode :definition #'eclim-java-find-declaration :references #'eclim-java-find-references :documentation #'eclim-java-show-documentation-for-current-element) diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 70fc4d404..8ef176d51 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -10,7 +10,7 @@ meghanada-use-eldoc t meghanada-use-auto-start t) - (set! :jump 'java-mode + (set! :lookup 'java-mode :definition #'meghanada-jump-declaration :references #'meghanada-reference) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index c775bd034..f3c70e186 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -13,7 +13,7 @@ (set! :repl 'js2-mode #'+javascript/repl) (set! :electric 'js2-mode :chars '(?\} ?\) ?.)) - (set! :jump 'js2-mode :xref-backend #'xref-js2-xref-backend) + (set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend) ;; Conform switch-case indentation to js2 normal indent (defvaralias 'js-switch-indent-offset 'js2-basic-offset) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index a87ebf991..82c20f506 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -88,7 +88,7 @@ environment variables." :after anaconda-mode :config (set! :company-backend 'python-mode '(company-anaconda)) - (set! :jump 'python-mode + (set! :lookup 'python-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index bde7c4602..4faadda6c 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -32,7 +32,7 @@ (unless (file-exists-p racer-cmd) (warn "rust-mode: racer binary can't be found; auto-completion is disabled")) - (set! :jump 'rust-mode :definition #'racer-find-definition)) + (set! :lookup 'rust-mode :definition #'racer-find-definition)) (def-package! company-racer diff --git a/modules/lang/typescript/config.el b/modules/lang/typescript/config.el index 5c42d36e9..526ff0612 100644 --- a/modules/lang/typescript/config.el +++ b/modules/lang/typescript/config.el @@ -23,7 +23,7 @@ :after typescript-mode :config (set! :company-backend 'typescript-mode '(company-tide)) - (set! :jump 'typescript-mode + (set! :lookup 'typescript-mode :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) From 4b8315466b24632a7f0c30b4bcd77520a051b610 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Jan 2018 23:59:39 -0500 Subject: [PATCH 0061/4235] private/default: fix void variable errors when evil module is disabled Evil keymaps don't exist if the evil module is off, so wrap evil-mode keymap bindings in (:after evil ...) --- modules/private/default/+bindings.el | 67 ++++++++++++++-------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 759d1e967..24e346a0e 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -314,28 +314,6 @@ ;; 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" #'other-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 @@ -384,6 +362,36 @@ "C-SPC" #'ivy-call-and-recenter ; preview "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))) + ;; evil + (:after evil + :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 + + (: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" #'other-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)) + ;; evil-commentary :n "gc" #'evil-commentary @@ -619,14 +627,6 @@ "" 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 @@ -709,8 +709,6 @@ 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 @@ -725,8 +723,9 @@ "M-;" #'eval-expression "A-;" #'eval-expression) - (:map tabulated-list-mode-map - [remap evil-record-macro] #'doom/popup-close-maybe) + (:after tabulated-list + (:map tabulated-list-mode-map + [remap evil-record-macro] #'quit-window)) (:after view (:map view-mode-map "" #'View-quit-all))) From 9e3682535af61f37e78a8c61f3935ad50c103284 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 00:07:07 -0500 Subject: [PATCH 0062/4235] Fix describe-(function|variable) and ivy-resume describe-(function|variable) weren't remapped to their counsel variants, so ivy-resume wouldn't resume those sessions properly. --- modules/completion/ivy/autoload/ivy.el | 9 --------- modules/completion/ivy/config.el | 3 ++- modules/private/default/+bindings.el | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index e2467a099..aba051707 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -204,12 +204,3 @@ counsel-rg)." (re-search-forward (ivy--regex ivy-text t) (line-end-position) t) (run-hooks 'counsel-grep-post-action-hook) (selected-window)))))) - -;;;###autoload -(defun +ivy-quit-and-resume () - "Close the current popup window and resume ivy." - (interactive) - (when (doom-popup-p) - (doom/popup-close)) - (ivy-resume)) - diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index fa707c5ea..7ac6ba1b9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -54,7 +54,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap projectile-find-file] #'counsel-projectile-find-file [remap imenu-anywhere] #'ivy-imenu-anywhere [remap execute-extended-command] #'counsel-M-x - [remap describe-face] #'counsel-describe-face) + [remap describe-function] #'counsel-describe-function + [remap describe-variable] #'counsel-describe-variable) ;; Show more buffer information in switch-buffer commands (ivy-set-display-transformer #'ivy-switch-buffer #'+ivy-buffer-transformer) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 24e346a0e..1bfaa4f0c 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -645,7 +645,7 @@ :n "]]" #'help-go-forward :n "o" #'ace-link-help :n "q" #'quit-window - :n "Q" #'+ivy-quit-and-resume) + :n "Q" #'ivy-resume) (:after vc-annotate :map vc-annotate-mode-map From 065091bdcab141601ba72dd1d49c137263b0f73e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 01:10:33 -0500 Subject: [PATCH 0063/4235] flycheck: use pos-tip in GUI Emacs (linux), popup-tip everywhere else Long story short, `flycheck-popup-tip' works everywhere but only looks *ok*. `flycheck-pos-tip' looks great, but only in GUI Emacs on Linux. So we want: + GUI Emacs (Linux): pos-tip + GUI Emacs (MacOS): popup-tip + tty Emacs (anywhere): popup-tip --- modules/feature/syntax-checker/config.el | 43 +++++++++++++--------- modules/feature/syntax-checker/packages.el | 5 +-- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 4267f0a60..816d81589 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -1,37 +1,44 @@ ;;; feature/syntax-checker/config.el -*- lexical-binding: t; -*- -;; pkg-info doesn't get autoloaded when `flycheck-version' needs it, so we do -;; it ourselves: -(autoload 'pkg-info-version-info "pkg-info") - (def-package! flycheck :commands (flycheck-mode flycheck-list-errors flycheck-buffer) :config - ;; Emacs feels snappier without checks on idle/change - (setq flycheck-check-syntax-automatically '(save mode-enabled)) - - (set! :popup 'flycheck-error-list-mode :select t :autokill t) + ;; Emacs feels snappier without checks on newline + (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) (after! evil - ;; Flycheck buffer on ESC in normal mode. (defun +syntax-checkers|flycheck-buffer () + "Flycheck buffer on ESC in normal mode." (when flycheck-mode (ignore-errors (flycheck-buffer)) nil)) - (add-hook '+evil-esc-hook #'+syntax-checkers|flycheck-buffer t))) + (add-hook '+evil-esc-hook #'+syntax-checkers|flycheck-buffer t) + ;; With the option of flychecking the buffer on escape, so we don't need + ;; auto-flychecking on idle-change: + (delq 'idle-change flycheck-check-syntax-automatically))) + + +;; Long story short, `flycheck-popup-tip' works everywhere but only looks *ok*. +;; `flycheck-pos-tip' looks great, but only in GUI Emacs on Linux. So we want: +;; +;; + GUI Emacs (Linux): pos-tip +;; + GUI Emacs (MacOS): popup-tip +;; + tty Emacs (anywhere): popup-tip (def-package! flycheck-pos-tip - :unless IS-MAC - :after flycheck + :commands (flycheck-pos-tip-mode) :config (setq flycheck-pos-tip-timeout 10 - flycheck-display-errors-delay 0.5) - (flycheck-pos-tip-mode +1)) - + ;; fallback to flycheck-popup-tip in terminal Emacs + flycheck-pos-tip-display-errors-tty-function + #'flycheck-popup-tip-show-popup + flycheck-display-errors-delay 0.5)) (def-package! flycheck-popup-tip - :when IS-MAC - :after flycheck - :hook (flycheck-mode . flycheck-popup-tip-mode)) + :commands (flycheck-popup-tip-mode flycheck-popup-tip-show-popup)) +(after! flycheck + (if IS-MAC + (flycheck-popup-tip) + (flycheck-pos-tip-mode))) diff --git a/modules/feature/syntax-checker/packages.el b/modules/feature/syntax-checker/packages.el index ae0d38629..46532dabd 100644 --- a/modules/feature/syntax-checker/packages.el +++ b/modules/feature/syntax-checker/packages.el @@ -2,6 +2,5 @@ ;;; feature/syntax-checker/packages.el (package! flycheck) -(if IS-MAC - (package! flycheck-popup-tip) - (package! flycheck-pos-tip)) +(package! flycheck-pos-tip) +(package! flycheck-popup-tip) From 91357a3e5d8ac065d8bce8af9e59731f956b82e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 01:23:22 -0500 Subject: [PATCH 0064/4235] :boom: Replace core-popup with new feature/popup module This is a breaking change! Update your :popup settings. Old ones will throw errors! Doom's new popup management system casts off its shackles (hur hur) and replaces them with the monster that is `display-buffer-alist`, and window parameters. However, this is highly experimental! Expect edge cases. Particularly with org-mode and magit (or anything that does its own window management). Relevant to #261, #263, #325 --- core/autoload/popups.el | 418 ----------------- core/autoload/scratch.el | 12 +- core/core-popups.el | 544 ---------------------- core/core.el | 1 - init.example.el | 1 + modules/app/regex/config.el | 5 +- modules/app/twitter/config.el | 2 - modules/completion/helm/config.el | 1 - modules/completion/ivy/config.el | 1 - modules/feature/debugger/config.el | 4 +- modules/feature/eval/config.el | 7 +- modules/feature/evil/autoload/evil.el | 8 +- modules/feature/evil/config.el | 5 +- modules/feature/lookup/config.el | 3 +- modules/feature/popup/README.org | 49 ++ modules/feature/popup/autoload.el | 328 +++++++++++++ modules/feature/popup/config.el | 196 ++++++++ modules/feature/version-control/+git.el | 2 +- modules/feature/version-control/config.el | 6 +- modules/lang/clojure/config.el | 2 +- modules/lang/emacs-lisp/config.el | 3 +- modules/lang/haskell/+intero.el | 1 - modules/lang/latex/config.el | 2 +- modules/lang/plantuml/config.el | 2 +- modules/lang/python/config.el | 4 +- modules/lang/rest/config.el | 2 +- modules/private/default/+bindings.el | 14 +- modules/tools/gist/config.el | 1 - modules/tools/imenu/config.el | 26 +- modules/tools/neotree/config.el | 4 + modules/tools/password-store/config.el | 2 +- modules/ui/doom/config.el | 9 +- modules/ui/tabbar/config.el | 4 +- 33 files changed, 631 insertions(+), 1038 deletions(-) delete mode 100644 core/autoload/popups.el delete mode 100644 core/core-popups.el create mode 100644 modules/feature/popup/README.org create mode 100644 modules/feature/popup/autoload.el create mode 100644 modules/feature/popup/config.el diff --git a/core/autoload/popups.el b/core/autoload/popups.el deleted file mode 100644 index 3130e698a..000000000 --- a/core/autoload/popups.el +++ /dev/null @@ -1,418 +0,0 @@ -;;; core/autoload/popups.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun doom-popup-p (&optional target) - "Return t if TARGET (a window or buffer) is a popup. Uses current window if -omitted." - (when-let* ((target (or target (selected-window)))) - (cond ((bufferp target) - (and (buffer-live-p target) - (buffer-local-value 'doom-popup-mode target))) - ((windowp target) - (and (window-live-p target) - (window-parameter target 'popup)))))) - -;;;###autoload -(defun doom-popup-buffer (buffer &optional plist extend-p) - "Display BUFFER in a shackle popup with PLIST rules. See `shackle-rules' for -possible rules. If EXTEND-P is non-nil, don't overwrite the original rules for -this popup, just the specified properties. Returns the new popup window." - (declare (indent defun)) - (unless (bufferp buffer) - (error "%s is not a valid buffer" buffer)) - (shackle-display-buffer - buffer - nil (or (if extend-p - (append plist (shackle-match buffer)) - plist) - (shackle-match buffer)))) - -;;;###autoload -(defun doom-popup-switch-to-buffer (buffer) - "Switch the current (or closest) pop-up window to BUFFER." - (unless (doom-popup-p) - (if-let* ((popups (doom-popup-windows))) - (select-window (car popups)) - (error "No popups to switch to"))) - (set-window-dedicated-p nil nil) - (switch-to-buffer buffer nil t) - (prog1 (selected-window) - (set-window-dedicated-p nil t))) - -;;;###autoload -(defun doom-popup-fit-to-buffer (&optional window max-size) - "Fit WINDOW to the size of its content." - (unless (string-empty-p (buffer-string)) - (let* ((window-size (doom-popup-size window)) - (max-size (or max-size (doom-popup-property :size window))) - (size (+ 2 (if (floatp max-size) (truncate (* max-size window-size)) window-size)))) - (fit-window-to-buffer window size nil size)))) - -;;;###autoload -(defun doom-popup-move (direction) - "Move a popup window to another side of the frame, in DIRECTION, which can be -one of the following: 'left 'right 'above 'below" - (when (doom-popup-p) - (let ((buffer (current-buffer)) - (doom-popup-inhibit-autokill t)) - (doom/popup-close) - (doom-popup-buffer buffer `(:align ,direction) 'extend)))) - -;;;###autoload -(defun doom-popup-file (file &optional plist extend-p) - "Display FILE in a shackle popup, with PLIST rules. See `shackle-rules' for -possible rules." - (unless (file-exists-p file) - (user-error "Can't display file in popup, it doesn't exist: %s" file)) - (doom-popup-buffer (find-file-noselect file t) plist extend-p)) - -;;;###autoload -(defun doom-popup-windows (&optional filter-static-p) - "Get a list of open pop up windows." - (cl-loop for window in doom-popup-windows - if (and (doom-popup-p window) - (not (and filter-static-p - (doom-popup-property :static window)))) - collect window)) - -;;;###autoload -(defun doom-popup-properties (window-or-buffer) - "Returns a window's popup property list, if possible. The buffer-local -`doom-popup-rules' always takes priority, but this will fall back to the popup -window parameter." - (cond ((windowp window-or-buffer) - (or (window-parameter window-or-buffer 'popup) - (doom-popup-properties (window-buffer window-or-buffer)))) - ((bufferp window-or-buffer) - (buffer-local-value 'doom-popup-rules window-or-buffer)))) - -;;;###autoload -(defun doom-popup-property (prop &optional window) - "Returns a `doom-popup-rules' PROPerty from WINDOW." - (or (plist-get (doom-popup-properties (or window (selected-window))) - prop) - (pcase prop - (:size shackle-default-size) - (:align shackle-default-alignment)))) - -;;;###autoload -(defun doom-popup-side (&optional window) - "Return what side a popup WINDOW came from ('left 'right 'above or 'below)." - (let ((align (doom-popup-property :align window))) - (when (eq align t) - (setq align shackle-default-alignment)) - (when (functionp align) - (setq align (funcall align))) - align)) - -;;;###autoload -(defun doom-popup-size (&optional window) - "Return the size of a popup WINDOW." - (pcase (doom-popup-side window) - ((or 'left 'right) (window-width window)) - ((or 'above 'below) (window-height window)))) - -(defun doom--popup-data (window) - (when-let* ((buffer (window-buffer window))) - `(,(buffer-name buffer) - :file ,(buffer-file-name buffer) - :rules ,(window-parameter window 'popup) - :size ,(doom-popup-size window)))) - -;;;###autoload -(defmacro with-popup-rules! (rules &rest body) - "TODO" - (declare (indent defun)) - `(let (shackle-rules) - ,@(cl-loop for rule in rules - collect `(set! :popup ,@rule)) - ,@body)) - -;;;###autoload -(defmacro save-popups! (&rest body) - "Sets aside all popups before executing the original function, usually to -prevent the popup(s) from messing up the UI (or vice versa)." - `(let ((in-popup-p (doom-popup-p)) - (popups (doom-popup-windows)) - (doom-popup-remember-history t) - (doom-popup-inhibit-autokill t)) - (when popups - (mapc #'doom/popup-close popups)) - (unwind-protect - (progn ,@body) - (when popups - (let ((origin (selected-window))) - (doom/popup-restore) - (unless in-popup-p - (select-window origin))))))) - - -;; --- Commands --------------------------- - -;;;###autoload -(defun doom/popup-restore () - "Restore the last open popups. If the buffers have been killed, and -represented real files, they will be restored. Dead special buffers or buffers -with non-nil :autokill properties will not be. - -Returns t if popups were restored, nil otherwise." - (interactive) - (unless doom-popup-history - (error "No popups to restore")) - (let (any-p) - (dolist (spec doom-popup-history) - (let ((buffer (get-buffer (car spec))) - (file (plist-get (cdr spec) :file)) - (rules (plist-get (cdr spec) :rules)) - (size (plist-get (cdr spec) :size))) - (when (and (not buffer) file) - (setq buffer - (if-let* ((buf (get-file-buffer file))) - (clone-indirect-buffer (buffer-name buf) nil t) - (find-file-noselect file t)))) - (when size - (setq rules (plist-put rules :size size))) - (when (and buffer (doom-popup-buffer buffer rules) (not any-p)) - (setq any-p t)))) - (when any-p - (setq doom-popup-history '())) - any-p)) - -;;;###autoload -(defun doom/popup-toggle () - "Toggle popups on and off. If used outside of popups (and popups are -available), it will select the nearest popup window." - (interactive) - (when (doom-popup-p) - (if doom-popup-other-window - (select-window doom-popup-other-window) - (other-window 1))) - (if (doom-popup-windows t) - (let ((doom-popup-inhibit-autokill t)) - (doom/popup-close-all t)) - (doom/popup-restore))) - -;;;###autoload -(defun doom/popup-close (&optional window) - "Find and close WINDOW if it's a popup. If WINDOW is omitted, defaults to -`selected-window'. The contained buffer is buried, unless it has an :autokill -property." - (interactive) - (when (doom-popup-p window) - (delete-window window))) - -;;;###autoload -(defun doom/popup-close-all (&optional force-p) - "Closes most open popups. - -Does not close popups that are :static or don't have an :autoclose property (see -`shackle-rules'). - -If FORCE-P is non-nil (or this function is called interactively), ignore popups' -:autoclose property. This command will never close :static popups." - (interactive - (list (called-interactively-p 'interactive))) - (when-let* ((popups (doom-popup-windows t))) - (let (success doom-popup-remember-history) - (setq doom-popup-history (delq nil (mapcar #'doom--popup-data popups))) - (dolist (window popups success) - (when (or force-p (doom-popup-property :autoclose window)) - (kill-buffer (window-buffer window)) - (setq success t)))))) - -;;;###autoload -(defun doom/popup-close-maybe () - "Close the current popup *if* its window doesn't have a noesc parameter." - (interactive) - (if (doom-popup-property :noesc) - (call-interactively - (if (featurep 'evil) - #'evil-force-normal-state - #'keyboard-quit)) - (kill-this-buffer))) - -;;;###autoload -(defun doom/popup-kill-all () - "Like `doom/popup-close-all', but kill *all* popups, including :static ones, -without leaving any trace behind (muahaha)." - (interactive) - (when-let* ((popups (doom-popup-windows))) - (let (doom-popup-remember-history) - (setq doom-popup-history nil) - (dolist (win popups) - (kill-buffer (window-buffer win)))))) - -;;;###autoload -(defun doom/popup-this-buffer () - "Display currently selected buffer in a popup window." - (interactive) - (doom-popup-buffer (current-buffer) '(:align t :autokill t))) - -;;;###autoload -(defun doom/popup-toggle-messages () - "Toggle *Messages* buffer." - (interactive) - (if-let* ((win (get-buffer-window "*Messages*"))) - (doom/popup-close win) - (doom-popup-buffer (get-buffer "*Messages*")))) - -;;;###autoload -(defun doom/other-popup (count) - "Cycle through popup windows. Like `other-window', but for popups." - (interactive "p") - (if-let* ((popups (if (doom-popup-p) - (cdr (memq (selected-window) doom-popup-windows)) - (setq doom-popup-other-window (selected-window)) - doom-popup-windows))) - (ignore-errors (select-window (nth (mod (1- count) (length popups)) popups))) - (unless (eq (selected-window) doom-popup-other-window) - (when doom-popup-other-window - (select-window doom-popup-other-window t) - (cl-decf count)) - (when (/= count 0) - (other-window count))))) - -;;;###autoload -(defalias 'other-popup #'doom/other-popup) - -;;;###autoload -(defun doom/popup-raise (&optional window) - "Turn a popup window into a normal window." - (interactive) - (let ((window (or window (selected-window)))) - (unless (doom-popup-p window) - (user-error "Not a valid popup to raise")) - (with-selected-window window - (doom-popup-mode -1)))) - -;;;###autoload -(defun doom/popup-move-top () "See `doom-popup-move'." (interactive) (doom-popup-move 'above)) -;;;###autoload -(defun doom/popup-move-bottom () "See `doom-popup-move'." (interactive) (doom-popup-move 'below)) -;;;###autoload -(defun doom/popup-move-left () "See `doom-popup-move'." (interactive) (doom-popup-move 'left)) -;;;###autoload -(defun doom/popup-move-right () "See `doom-popup-move'." (interactive) (doom-popup-move 'right)) - - -;; --- doom-popup-mode -------------------- - -;;;###autoload -(define-minor-mode doom-popup-mode - "Minor mode for popup windows." - :init-value nil - :keymap doom-popup-mode-map - (let ((window (selected-window))) - ;; If `doom-popup-rules' isn't set for some reason, try to set it - (setq-local doom-popup-rules (doom-popup-properties window)) - ;; Ensure that buffer-opening functions/commands (like - ;; `switch-to-buffer-other-window' won't use this window). - (set-window-parameter window 'no-other-window doom-popup-mode) - ;; Makes popup window resist interactively changing its buffer. - (unless (plist-get doom-popup-rules :same) - (set-window-dedicated-p window doom-popup-mode)) - (cond (doom-popup-mode - (when doom-popup-no-fringes - (set-window-fringes window 0 0 fringes-outside-margins)) - ;; Save metadata into window parameters so it can be saved by window - ;; config persisting plugins like workgroups or persp-mode. - (set-window-parameter window 'popup (or doom-popup-rules t)) - (when doom-popup-rules - (cl-loop for param in doom-popup-window-parameters - when (plist-get doom-popup-rules param) - do (set-window-parameter window param it)))) - - (t - (when doom-popup-no-fringes - (set-window-fringes window - doom-fringe-size doom-fringe-size - fringes-outside-margins)) - ;; Ensure window parameters are cleaned up - (set-window-parameter window 'popup nil) - (dolist (param doom-popup-window-parameters) - (set-window-parameter window param nil)))))) -(put 'doom-popup-mode 'permanent-local t) - -;;;###autoload -(defun doom|hide-modeline-in-popup () - "Don't show modeline in popup windows without a :modeline rule. If one exists -and it's a symbol, use `doom-modeline' to grab the format. If non-nil, show the -mode-line as normal. If nil (or omitted, by default), then hide the modeline -entirely." - (if doom-popup-mode - (let ((modeline (plist-get doom-popup-rules :modeline))) - (cond ((or (eq modeline 'nil) - (not modeline)) - (doom-hide-modeline-mode +1)) - ((and (symbolp modeline) - (not (eq modeline 't))) - (setq-local doom--modeline-format (doom-modeline modeline)) - (when doom--modeline-format - (doom-hide-modeline-mode +1))))) - (when doom-hide-modeline-mode - (doom-hide-modeline-mode -1)))) - - -;; --- Advice functions ------------------- - -;;;###autoload -(defun doom*shackle-always-align (plist) - "Ensure popups are always aligned and selected by default. Eliminates the need -for :align t on every rule." - (when plist - (unless (or (plist-member plist :align) - (plist-member plist :same) - (plist-member plist :frame)) - (plist-put plist :align t)) - (unless (or (plist-member plist :select) - (plist-member plist :noselect)) - (plist-put plist :select t))) - plist) - -;;;###autoload -(defun doom*popup-init (orig-fn &rest args) - "Initializes a window as a popup window by enabling `doom-popup-mode' in it -and setting `doom-popup-rules' within it. Returns the window." - (unless (doom-popup-p) - (setq doom-popup-other-window (selected-window))) - (let* ((target (car args)) - (plist (or (nth 2 args) - (cond ((windowp target) - (and (window-live-p target) - (shackle-match (window-buffer target)))) - ((bufferp target) - (and (buffer-live-p target) - (shackle-match target)))))) - (buffer (get-buffer target)) - (window-min-height (if (plist-get plist :modeline) 4 2)) - window) - (when (and (doom-real-buffer-p buffer) - (get-buffer-window-list buffer nil t)) - (setq plist (append (list :autokill t) plist)) - (setcar args (clone-indirect-buffer (buffer-name target) nil t))) - (unless (setq window (apply orig-fn args)) - (error "No popup window was found for %s: %s" target plist)) - (cl-pushnew window doom-popup-windows :test #'eq) - (with-selected-window window - (unless (eq plist t) - (setq-local doom-popup-rules plist)) - (doom-popup-mode +1) - (when (plist-get plist :autofit) - (doom-popup-fit-to-buffer window))) - window)) - -;;;###autoload -(defun doom*popups-save (orig-fn &rest args) - "Sets aside all popups before executing the original function, usually to -prevent the popup(s) from messing up the UI (or vice versa)." - (save-popups! (apply orig-fn args))) - -;;;###autoload -(defun doom*delete-popup-window (&optional window) - "Do popup bookkeeping before the popup window is deleted." - (unless window - (setq window (selected-window))) - (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)))))) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index b0bd510c5..acdca74a9 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -37,11 +37,11 @@ (current-buffer)))) ;;;###autoload -(defun doom/open-scratch-buffer () - "Opens a temporary scratch buffer in a popup window. It is discarded once it -is closed. If a region is active, copy it to the scratch buffer." - (interactive) - (doom-popup-buffer (doom--create-scratch-buffer))) +(defun doom/open-scratch-buffer (&optional in-project-p) + "Opens a temporary scratch buffer. It is discarded once it is closed. If a +region is active, copy it to the scratch buffer." + (interactive "P") + (pop-to-buffer (doom--create-scratch-buffer in-project-p))) ;;;###autoload (defun doom/open-project-scratch-buffer () @@ -49,5 +49,5 @@ is closed. If a region is active, copy it to the scratch buffer." popup window. Scratch buffers are stored in `doom-scratch-files-dir'. If a region is active, copy it to the scratch buffer." (interactive) - (doom-popup-buffer (doom--create-scratch-buffer t))) + (doom/open-scratch-buffer 'in-project)) diff --git a/core/core-popups.el b/core/core-popups.el deleted file mode 100644 index f9ef11bb4..000000000 --- a/core/core-popups.el +++ /dev/null @@ -1,544 +0,0 @@ -;;; core-popups.el -*- lexical-binding: t; -*- - -;; I want a "real"-buffer-first policy in my Emacsian utpoia; popup buffers -;; ought to be second-class citizens to "real" buffers. No need for a wall or -;; controversial immigration policies -- all we need is `shackle' (and it will -;; actually work). -;; -;; The gist is: popups should be displayed on one side of the frame, away from -;; 'real' buffers. They should be easy to dispose of when we don't want to see -;; them and easily brought back in case we change our minds. Also, popups should -;; typically have no mode-line. -;; -;; Be warned, this requires a lot of hackery voodoo that could break with an -;; emacs update or an update to any of the packages it tries to tame (like helm -;; or org-mode). - -(defvar doom-popup-history nil - "A list of popups that were last closed. Used by `doom/popup-restore' and -`doom*popups-save'.") - -(defvar doom-popup-other-window nil - "The last window selected before a popup was opened.") - -(defvar doom-popup-no-fringes t - "If non-nil, disable fringes in popup windows.") - -(defvar doom-popup-windows () - "A list of open popup windows.") - -(defvar-local doom-popup-rules nil - "The shackle rule that caused this buffer to be recognized as a popup. Don't -edit this directly.") -(put 'doom-popup-rules 'permanent-local t) - -(defvar doom-popup-window-parameters - '(:noesc :modeline :autokill :autoclose :autofit :static) - "A list of window parameters that are set (and cleared) when `doom-popup-mode -is enabled/disabled.'") - -(defvar doom-popup-remember-history t - "Don't modify this directly. If non-nil, DOOM will remember the last popup(s) -that was/were open in `doom-popup-history'.") - -(defvar doom-popup-inhibit-autokill nil - "Don't modify this directly. When it is non-nil, no buffers will be killed -when their associated popup windows are closed, despite their :autokill -property.") - -(defvar doom-popup-mode-map (make-sparse-keymap) - "Active keymap in popup windows.") - - -(def-setting! :popup (&rest rules) - "Prepend a new popup rule to `shackle-rules' (see for format details). - -Several custom properties have been added that are not part of shackle, but are -recognized by DOOM's popup system. They are: - -:noesc If non-nil, the popup won't be closed if you press ESC from *inside* - its window. Used by `doom/popup-close-maybe'. - -:modeline By default, mode-lines are hidden in popups unless this is non-nil. - If it is a symbol, it'll use `doom-modeline' to fetch a modeline - config (in `doom-popup-mode'). - -:autokill If non-nil, the popup's buffer will be killed when the popup is - closed. Used by `doom*delete-popup-window'. NOTE - `doom/popup-restore' can't restore non-file popups that have an - :autokill property. - -:autoclose If non-nil, close popup if ESC is pressed from outside the popup - window. - -:autofit If non-nil, resize the popup to fit its content. Uses the value of - the :size property as the maximum height/width. This will not work - if the popup has no content when displayed. - -:static If non-nil, don't treat this window like a popup. This makes it - impervious to being automatically closed or tracked in popup - history. Excellent for permanent sidebars." - (if (cl-every #'listp (mapcar #'doom-unquote rules)) - `(setq shackle-rules (nconc (list ,@rules) shackle-rules)) - `(push (list ,@rules) shackle-rules))) - - -;; -;; -;; - -;; (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-blacklist - '("^\\*magit") - "TODO") - - -;; -;; Bootstrap -;; - -(def-package! shackle - :init - (setq shackle-default-alignment 'below - shackle-default-size 8 - shackle-rules - '(("^\\*eww" :regexp t :size 0.5 :select t :autokill t :noesc t) - ("^\\*ftp " :noselect t :autokill t :noesc t) - ;; doom - ("^\\*doom:scratch" :regexp t :size 15 :noesc t :select t :modeline t :autokill t :static t) - ("^\\*doom:" :regexp t :size 0.35 :noesc t :select t) - ("^ ?\\*doom " :regexp t :noselect t :autokill t :autoclose t :autofit t) - ;; built-in (emacs) - ("*compilation*" :size 0.25 :noselect t :autokill t :autoclose t) - ("*ert*" :same t :modeline t) - ("*info*" :size 0.5 :select t :autokill t) - ("*Backtrace*" :size 20 :noselect t) - ("*Warnings*" :size 12 :noselect t :autofit t) - ("*Messages*" :size 12 :noselect t) - ("*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) - (comint-mode :noesc t) - (grep-mode :size 25 :noselect t :autokill t) - (profiler-report-mode :size 0.3 :regexp t :autokill t :modeline minimal) - (tabulated-list-mode :noesc t) - ("^ ?\\*" :regexp t :size 15 :noselect t :autokill t :autoclose t))) - - :config - (add-hook 'doom-unreal-buffer-p #'doom-popup-p) - - ;; NOTE This is a temporary fix while I rewrite core-popups - (defun doom-display-buffer-condition (buffer _action) - (and (cl-loop for re in doom-popup-blacklist - when (string-match-p re buffer) - return nil - finally return t) - (shackle-match buffer))) - - (defun doom-display-buffer-action (buffer alist) - (shackle-display-buffer buffer alist (shackle-match buffer))) - - (defun doom|autokill-popups () - "TODO" - (or (not (doom-popup-p)) - (if (and (not doom-popup-inhibit-autokill) - (plist-get doom-popup-rules :autokill)) - (progn - (when-let* ((process (get-buffer-process (current-buffer)))) - (set-process-query-on-exit-flag process nil)) - t) - (doom-popup-mode -1) - (delete-window) - nil))) - - (defun doom|init-popups () - "TODO" - (setq display-buffer-alist - (cons '(doom-display-buffer-condition doom-display-buffer-action) - display-buffer-alist)) - ;; bootstrap popup system - (advice-add #'shackle-display-buffer :around #'doom*popup-init) - (advice-add #'balance-windows :around #'doom*popups-save) - (advice-add #'delete-window :before #'doom*delete-popup-window) - ;; ensure every rule without an :align, :same or :frame property has an - ;; implicit :align (see `shackle-default-alignment') - (advice-add #'shackle--match :filter-return #'doom*shackle-always-align) - ;; autokill popups with a non-nil :autokill property - (add-hook 'kill-buffer-query-functions #'doom|autokill-popups) - ;; no modeline in popups - (add-hook 'doom-popup-mode-hook #'doom|hide-modeline-in-popup) - ;; Tell `window-state-get' and `current-window-configuration' to recognize - ;; these custom parameters. Helpful for `persp-mode' and persisting window - ;; configs that have popups in them. - (dolist (param `(popup ,@doom-popup-window-parameters)) - (push (cons param 'writable) window-persistent-parameters))) - (add-hook 'doom-post-init-hook #'doom|init-popups) - - (let ((map doom-popup-mode-map)) - (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 kill-buffer] #'doom/popup-close) - (define-key map [remap split-window-right] #'ignore) - (define-key map [remap split-window-below] #'ignore) - (define-key map [remap split-window-horizontally] #'ignore) - (define-key map [remap split-window-vertically] #'ignore) - (define-key map [remap mouse-split-window-horizontally] #'ignore) - (define-key map [remap mouse-split-window-vertically] #'ignore))) - - -;; -;; Hacks -;; - -(progn ; hacks for built-in functions - (defun doom*suppress-pop-to-buffer-same-window (orig-fn &rest args) - (cl-letf (((symbol-function 'pop-to-buffer-same-window) - (symbol-function 'pop-to-buffer))) - (apply orig-fn args))) - (advice-add #'info :around #'doom*suppress-pop-to-buffer-same-window) - (advice-add #'eww :around #'doom*suppress-pop-to-buffer-same-window) - (advice-add #'eww-browse-url :around #'doom*suppress-pop-to-buffer-same-window) - - (defun doom*popup-buffer-menu (&optional arg) - "Open `buffer-menu' in a popup window." - (interactive "P") - (with-selected-window (doom-popup-buffer (list-buffers-noselect arg)) - (setq mode-line-format "Commands: d, s, x, u; f, o, 1, 2, m, v; ~, %; q to quit; ? for help."))) - (advice-add #'buffer-menu :override #'doom*popup-buffer-menu)) - - -(after! comint - (defun doom|popup-close-comint-buffer () - (when (and (doom-popup-p) - (derived-mode-p 'comint-mode) - (not (process-live-p (get-buffer-process (current-buffer))))) - (delete-window))) - (add-hook '+evil-esc-hook #'doom|popup-close-comint-buffer t)) - - -(after! eshell - ;; By tying buffer life to its process, we ensure that we land back in the - ;; eshell buffer after term dies. May cause problems with short-lived - ;; processes. - ;; FIXME replace with a 'kill buffer' keybinding. - (setq eshell-destroy-buffer-when-process-dies t) - - ;; When eshell runs a visual command (see `eshell-visual-commands'), it spawns - ;; a term buffer to run it in, but where it spawns it is the problem... - (defun doom*eshell-undedicate-popup (orig-fn &rest args) - "Force spawned term buffer to share with the eshell popup (if necessary)." - (when (doom-popup-p) - (set-window-dedicated-p nil nil) - (add-transient-hook! #'eshell-query-kill-processes :after - (set-window-dedicated-p nil t))) - (apply orig-fn args)) - (advice-add #'eshell-exec-visual :around #'doom*eshell-undedicate-popup)) - - -(after! evil - (let ((map doom-popup-mode-map)) - (define-key map [remap evil-window-delete] #'doom/popup-close-maybe) - (define-key map [remap evil-save-modified-and-close] #'doom/popup-close-maybe) - (define-key map [remap evil-window-move-very-bottom] #'doom/popup-move-bottom) - (define-key map [remap evil-window-move-very-top] #'doom/popup-move-top) - (define-key map [remap evil-window-move-far-left] #'doom/popup-move-left) - (define-key map [remap evil-window-move-far-right] #'doom/popup-move-right) - (define-key map [remap evil-window-split] #'ignore) - (define-key map [remap evil-window-vsplit] #'ignore)) - - (defun doom|popup-close-maybe () - "If current window is a popup, close it. If minibuffer is open, close it. If -not in a popup, close all popups with an :autoclose property." - (if (doom-popup-p) - (unless (doom-popup-property :noesc) - (delete-window)) - (doom/popup-close-all))) - (add-hook '+evil-esc-hook #'doom|popup-close-maybe t) - - ;; Make evil-mode cooperate with popups - (advice-add #'evil-command-window :override #'doom*popup-evil-command-window) - (advice-add #'evil-command-window-execute :override #'doom*popup-evil-command-window-execute) - - (defun doom*popup-evil-command-window (hist cmd-key execute-fn) - "The evil command window has a mind of its own (uses `switch-to-buffer'). We -monkey patch it to use pop-to-buffer, and to remember the previous window." - (when (eq major-mode 'evil-command-window-mode) - (user-error "Cannot recursively open command line window")) - (dolist (win (window-list)) - (when (equal (buffer-name (window-buffer win)) - "*Command Line*") - (kill-buffer (window-buffer win)) - (delete-window win))) - (setq evil-command-window-current-buffer (current-buffer)) - (ignore-errors (kill-buffer "*Command Line*")) - (with-current-buffer (pop-to-buffer "*Command Line*") - (setq-local evil-command-window-execute-fn execute-fn) - (setq-local evil-command-window-cmd-key cmd-key) - (evil-command-window-mode) - (evil-command-window-insert-commands hist))) - - (defun doom*popup-evil-command-window-execute () - "Execute the command under the cursor in the appropriate buffer, rather than -the command buffer." - (interactive) - (let ((result (buffer-substring (line-beginning-position) - (line-end-position))) - (execute-fn evil-command-window-execute-fn) - (popup (selected-window))) - (select-window doom-popup-other-window) - (unless (equal evil-command-window-current-buffer (current-buffer)) - (user-error "Originating buffer is no longer active")) - ;; (kill-buffer "*Command Line*") - (doom/popup-close popup) - (funcall execute-fn result) - (setq evil-command-window-current-buffer nil))) - - ;; Don't mess with popups - (advice-add #'doom-evil-window-move :around #'doom*popups-save) - (advice-add #'evil-window-move-very-bottom :around #'doom*popups-save) - (advice-add #'evil-window-move-very-top :around #'doom*popups-save) - (advice-add #'evil-window-move-far-left :around #'doom*popups-save) - (advice-add #'evil-window-move-far-right :around #'doom*popups-save) - - ;; Don't block moving to/from popup windows - (defun doom*ignore-window-parameters-in-popups (dir &optional arg window) - (window-in-direction (cond ((eq dir 'up) 'above) - ((eq dir 'down) 'below) - (t dir)) - window t arg windmove-wrap-around t)) - (advice-add #'windmove-find-other-window :override #'doom*ignore-window-parameters-in-popups)) - - -(after! helm - ;; Helm tries to clean up after itself, but shackle has already done this, - ;; causing problems. This fixes that. To reproduce, add a helm rule in - ;; `shackle-rules', open two splits side-by-side, move to the buffer on the - ;; right and invoke helm. It will close all but the left-most buffer. - (setq-default helm-reuse-last-window-split-state t - helm-split-window-in-side-p t) - - (after! helm-swoop - (setq helm-swoop-split-window-function #'pop-to-buffer)) - - (after! helm-ag - ;; This prevents helm-ag from switching between windows and buffers. - (defun doom*helm-ag-edit-done (orig-fn &rest args) - (cl-letf (((symbol-function 'select-window) #'ignore)) - (apply orig-fn args)) - (doom/popup-close)) - (advice-add #'helm-ag--edit-commit :around #'doom*helm-ag-edit-done) - (advice-add #'helm-ag--edit-abort :around #'doom*helm-ag-edit-done) - - (defun doom*helm-ag-edit (orig-fn &rest args) - (cl-letf (((symbol-function 'other-window) #'ignore) - ((symbol-function 'switch-to-buffer) #'doom-popup-buffer)) - (apply orig-fn args) - (with-current-buffer (get-buffer "*helm-ag-edit*") - (use-local-map helm-ag-edit-map)))) - (advice-add #'helm-ag--edit :around #'doom*helm-ag-edit))) - - -(defsubst doom--switch-from-popup (location) - (doom/popup-close) - (switch-to-buffer (car location) nil t) - (if (not (cdr location)) - (message "Unable to find location in file") - (goto-char (cdr location)) - (recenter))) - -(after! help-mode - ;; Help buffers use `other-window' to decide where to open followed links, - ;; which can be unpredictable. It should *only* replace the original buffer we - ;; opened the popup from. To fix this these three button types need to be - ;; redefined to set aside the popup before following a link. - (define-button-type 'help-function-def - :supertype 'help-xref - 'help-function - (lambda (fun file) - (require 'find-func) - (when (eq file 'C-source) - (setq file (help-C-file-name (indirect-function fun) 'fun))) - (doom--switch-from-popup (find-function-search-for-symbol fun nil file)))) - - (define-button-type 'help-variable-def - :supertype 'help-xref - 'help-function - (lambda (var &optional file) - (when (eq file 'C-source) - (setq file (help-C-file-name var 'var))) - (doom--switch-from-popup (find-variable-noselect var file)))) - - (define-button-type 'help-face-def - :supertype 'help-xref - 'help-function - (lambda (fun file) - (require 'find-func) - (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) - - -(after! magit - (add-hook 'magit-mode-hook #'doom-hide-modeline-mode)) - - -(after! mu4e - (defun doom*mu4e-popup-window (buf _height) - (doom-popup-buffer buf '(:size 10 :noselect t)) - buf) - (advice-add #'mu4e~temp-window :override #'doom*mu4e-popup-window)) - - -(after! multi-term - (setq multi-term-buffer-name "doom:terminal")) - - -(after! neotree - ;; Neotree has its own window/popup management built-in, which is difficult to - ;; police. For example, switching perspectives will cause neotree to forget it - ;; is a neotree pane. - ;; - ;; By handing neotree over to shackle, which is better integrated into the - ;; rest of my config (and persp-mode), this is no longer a problem. - (set! :popup " *NeoTree*" :align neo-window-position :size neo-window-width :static t) - - (defun +evil-neotree-display-fn (buf _alist) - "Hand neotree off to shackle." - (let ((win (doom-popup-buffer buf))) - (setq neo-global--buffer (window-buffer win) - neo-global--window win))) - (setq neo-display-action '(+evil-neotree-display-fn)) - - (defun +evil|neotree-fix-popup () - "Repair neotree state whenever its popup state is restored. This ensures -that `doom*popup-save' won't break it." - (when (equal (buffer-name) neo-buffer-name) - (setq neo-global--window (selected-window)) - ;; Fix neotree shrinking when closing nearby vertical splits - (when neo-window-fixed-size - (doom-resize-window neo-global--window neo-window-width t t)))) - (add-hook 'doom-popup-mode-hook #'+evil|neotree-fix-popup)) - - -(after! persp-mode - (defun doom*persp-mode-restore-popups (&rest _) - "Restore popup windows when loading a perspective from file." - (dolist (window (window-list)) - (when-let* ((plist (doom-popup-properties window))) - (with-selected-window window - (unless doom-popup-mode - (setq-local doom-popup-rules plist) - (doom-popup-mode +1)))))) - (advice-add #'persp-load-state-from-file :after #'doom*persp-mode-restore-popups)) - - -(after! quickrun - ;; don't auto-focus quickrun windows, shackle handles that - (setq quickrun-focus-p nil)) - - -(after! twittering-mode - (setq twittering-pop-to-buffer-function #'pop-to-buffer)) - - -(after! wgrep - ;; close the popup after you're done with a wgrep buffer - (advice-add #'wgrep-abort-changes :after #'doom/popup-close) - (advice-add #'wgrep-finish-edit :after #'doom/popup-close)) - - -(after! xref - (defun doom*xref-follow-and-close (orig-fn &rest args) - "Jump to the xref on the current line, select its window and close the popup -you came from." - (interactive) - (let ((popup-p (doom-popup-p)) - (window (selected-window))) - (apply orig-fn args) - (when popup-p (doom/popup-close window)))) - (advice-add #'xref-goto-xref :around #'doom*xref-follow-and-close)) - - -;; -;; Major modes -;; - -(after! plantuml-mode - (defun doom*plantuml-preview-in-popup-window (orig-fn &rest args) - (save-window-excursion - (apply orig-fn args)) - (pop-to-buffer plantuml-preview-buffer)) - (advice-add #'plantuml-preview-string - :around #'doom*plantuml-preview-in-popup-window)) - -;; Ensure these settings are loaded as late as possible, giving other modules a -;; chance to reconfigure org popup settings before the defaults kick in. -(defun doom|init-org-popups () - (add-hook! org-load - (set! :popup - '("*Calendar*" :size 0.4 :noselect t) - '(" *Org todo*" :size 5 :noselect t) - '("*Org Note*" :size 10) - '("*Org Select*" :size 20 :noselect t) - '("*Org Links*" :size 5 :noselect t) - '("*Org Export Dispatcher*" :noselect t) - '(" *Agenda Commands*" :noselect t) - '("^\\*Org Agenda" :regexp t :size 20) - '("*Org Clock*" :noselect t) - '("^\\*Org Src" :regexp t :size 0.35 :noesc t) - '("*Edit Formulas*" :size 10) - '("^\\*Org-Babel" :regexp t :size 25 :noselect t) - '("^CAPTURE.*\\.org$" :regexp t :size 20)) - - ;; Org has a scorched-earth window management system I'm not fond of. i.e. - ;; it kills all windows and monopolizes the frame. No thanks. We can do - ;; better with shackle's help. - (defun doom*suppress-delete-other-windows (orig-fn &rest args) - (cl-letf (((symbol-function 'delete-other-windows) - (symbol-function 'ignore))) - (apply orig-fn args))) - (advice-add #'org-add-log-note :around #'doom*suppress-delete-other-windows) - (advice-add #'org-capture-place-template :around #'doom*suppress-delete-other-windows) - (advice-add #'org-export--dispatch-ui :around #'doom*suppress-delete-other-windows) - - ;; Hand off the src-block window to a shackle popup window. - (defun doom*org-src-pop-to-buffer (buffer _context) - "Open the src-edit in a way that shackle can detect." - (if (eq org-src-window-setup 'switch-invisibly) - (set-buffer buffer) - (pop-to-buffer buffer))) - (advice-add #'org-src-switch-to-buffer :override #'doom*org-src-pop-to-buffer) - - ;; Ensure todo, agenda, and other minor popups are delegated to shackle. - (defun doom*org-pop-to-buffer (&rest args) - "Use `pop-to-buffer' instead of `switch-to-buffer' to open buffer.'" - (let ((buf (car args))) - (pop-to-buffer - (cond ((stringp buf) (get-buffer-create buf)) - ((bufferp buf) buf) - (t (error "Invalid buffer %s" buf)))))) - (advice-add #'org-switch-to-buffer-other-window :override #'doom*org-pop-to-buffer) - - ;; org-agenda - (setq org-agenda-window-setup 'other-window - org-agenda-restore-windows-after-quit nil) - ;; Hide modeline in org-agenda - (add-hook 'org-agenda-finalize-hook #'doom-hide-modeline-mode) - (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) - ;; Don't monopolize frame! - (advice-add #'org-agenda :around #'doom*suppress-delete-other-windows) - ;; ensure quit keybindings work propertly - (map! :map* org-agenda-mode-map - :m [escape] 'org-agenda-Quit - :m "ESC" 'org-agenda-Quit))) -(add-hook 'doom-init-hook #'doom|init-org-popups) - -(provide 'core-popups) -;;; core-popups.el ends here diff --git a/core/core.el b/core/core.el index 2372c20f9..c61b84233 100644 --- a/core/core.el +++ b/core/core.el @@ -172,7 +172,6 @@ ability to invoke the debugger in debug mode." (unless noninteractive (load! core-ui) ; draw me like one of your French editors - (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 diff --git a/init.example.el b/init.example.el index 9cdb36e6c..5de1a7e19 100644 --- a/init.example.el +++ b/init.example.el @@ -30,6 +30,7 @@ (require 'core (concat user-emacs-directory "core/core")) (doom! :feature + popup ; tame sudden yet inevitable temporary windows ;debugger ; FIXME stepping through code, to help you add bugs eval ; run code, run (also, repls) evil ; come to the dark side, we have cookies diff --git a/modules/app/regex/config.el b/modules/app/regex/config.el index cc073013b..64ebebd1a 100644 --- a/modules/app/regex/config.el +++ b/modules/app/regex/config.el @@ -46,7 +46,6 @@ http://regexr.com/foo.html?q=bar https://mediatemple.net" "TODO") -(set! :popup - '("*doom-regex*" :size 4 :select t :noesc t) - '("*doom-regex-groups*" :align left :size 30 :noselect t :noesc t)) +(set! :popup "^\\*doom-regex\\*$" '((size . 4)) '((escape-quit))) +(set! :popup "^\\*doom-regex-groups" '((side . left)) '((select) (escape-quit))) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index 23aef2356..12385631d 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -16,8 +16,6 @@ twittering-initial-timeline-spec-string '(":home" ":mentions" ":direct_messages")) - (set! :popup "*twittering-edit*" :size 12 :select t) - (add-hook! twittering-mode (setq header-line-format (or (doom-modeline 'twitter) mode-line-format) mode-line-format nil)) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 116c49c63..a247cc1f2 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -42,7 +42,6 @@ (after! helm-mode (add-to-list 'helm-completing-read-handlers-alist '(find-file-at-point . nil))) - (set! :popup "\\` ?\\*[hH]elm.*?\\*\\'" :size 14 :regexp t) (setq projectile-completion-system 'helm) ;;; Helm hacks diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 7ac6ba1b9..139a7dbf0 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -84,7 +84,6 @@ immediately runs it on the current candidate (ending the ivy session)." (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") ;; Configure `counsel-rg', `counsel-ag' & `counsel-pt' - (set! :popup 'ivy-occur-grep-mode :size (+ 2 ivy-height) :regexp t :autokill t) (dolist (cmd '(counsel-ag counsel-rg counsel-pt)) (ivy-add-actions cmd diff --git a/modules/feature/debugger/config.el b/modules/feature/debugger/config.el index 384975d2f..1b7ef587d 100644 --- a/modules/feature/debugger/config.el +++ b/modules/feature/debugger/config.el @@ -3,9 +3,7 @@ (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (set! :popup - '("^\\*\\(g\\|zsh\\|bash\\)db.*?\\*$" :size 20 :regexp t) - '("^\\*trepanjs.*?\\*$" :size 20 :regexp t)) + (set! :popup "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" '((size . 20))) ;; TODO Temporary Ex commands for the debugger ;; (def-tmp-excmd! doom:def-debug-on doom:def-debug-off diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index ba954353c..00b2526ed 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -16,10 +16,6 @@ function that creates and returns the REPL buffer." `(push (cons ,mode ,command) +eval-repls)) -(set! :popup - '(:custom (lambda (b &rest _) (buffer-local-value '+eval-repl-mode b))) - :size 16 :noesc t) - ;; ;; Evaluation @@ -70,7 +66,8 @@ function that creates and returns the REPL buffer." (unless (boundp 'display-line-numbers) (add-hook 'quickrun--mode-hook #'nlinum-mode)) :config - (set! :popup "*quickrun*" :size 6 :autokill t :autoclose t) + (set! :popup "^\\*\\(?:doom eval\\|Pp Eval Output\\|quickrun\\)" + '((window-height . 10)) '((transient . 0))) (defun +eval*quickrun-auto-close (&rest _) "Allows us to silently re-run quickrun from within the quickrun buffer." diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 7e1d6d773..893cf10bc 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -32,14 +32,14 @@ there and there is only one window, split in that direction and place this window there. If there are no windows and this isn't the only window, use evil-window-move-* (e.g. `evil-window-move-far-left')" - (when (doom-popup-p) - (doom/popup-raise)) - (let* ((this-window (get-buffer-window)) + (when (window-dedicated-p) + (user-error "Cannot swap a dedicated window")) + (let* ((this-window (selected-window)) (this-buffer (current-buffer)) (that-window (windmove-find-other-window direction nil this-window)) (that-buffer (window-buffer that-window))) (when (or (minibufferp that-buffer) - (doom-popup-p that-window)) + (window-dedicated-p this-window)) (setq that-buffer nil that-window nil)) (if (not (or that-window (one-window-p t))) (funcall (pcase direction diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bf0efc808..3c538f20f 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -42,9 +42,8 @@ (add-hook 'doom-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) - (set! :popup - '("*evil-registers*" :size 0.3) - '("*Command Line*" :size 8)) + (set! :popup "^\\*evil-registers" '((size . 0.3))) + (set! :popup "^\\*Command Line" '((size . 8))) ;; Don't interfere with localleader key (define-key evil-motion-state-map "\\" nil) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index b51032a28..6ab555868 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -91,8 +91,7 @@ properties: (after! xref ;; By default, `etags--xref-backend' is the default xref backend. No need. ;; We'll set these up ourselves in other modules. - (setq-default xref-backend-functions '(t)) - (set! :popup "*xref*" :noselect t :autokill t :autoclose t)) + (setq-default xref-backend-functions '(t))) (defun +lookup|init-xref-backends () "Set `+lookup-current-functions' for the current buffer. diff --git a/modules/feature/popup/README.org b/modules/feature/popup/README.org new file mode 100644 index 000000000..69dbd236a --- /dev/null +++ b/modules/feature/popup/README.org @@ -0,0 +1,49 @@ +#+TITLE: :feature popup + +A short summary about what this module does. + +If necessary, include a longer description below it that goes into more detail. This may be as long as you like. + ++ If possible, include a list of features ++ Include links to major plugins that the module uses, if applicable ++ Use links whenever you can ++ Mention dependencies on other modules here + +* Table of Contents :TOC: +- [[#install][Install]] + - [[#main-dependencies][Main dependencies]] + - [[#extra-dependencies][Extra Dependencies]] +- [[#configuration][Configuration]] +- [[#usage][Usage]] +- [[#appendix][Appendix]] + - [[#commands][Commands]] + - [[#hacks][Hacks]] + +* Install +** Main dependencies +*** MacOS +#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +brew install x +#+END_SRC + +*** Arch Linux +#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") +sudo pacman --needed --noconfirm -S X +#+END_SRC + +** Extra Dependencies ++ A ++ B ++ C + +#+BEGIN_SRC sh +Y install A B C +#+END_SRC + +* Configuration + +* Usage + +* Appendix +** Commands +** Hacks diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el new file mode 100644 index 000000000..c0de798f0 --- /dev/null +++ b/modules/feature/popup/autoload.el @@ -0,0 +1,328 @@ +;;; feature/popup/autoload.el -*- lexical-binding: t; -*- + +(defun +popup--cancel-buffer-timer () + "Cancel the current buffer's transient timer." + (when (timerp +popup--timer) + (message "Cancelled timer") + (cancel-timer +popup--timer) + (setq +popup--timer nil)) + t) + +(defun +popup--remember (windows) + "Remember WINDOWS (a list of windows) for later restoration." + (cl-assert (cl-every #'windowp windows) t) + (setq +popup--last + (cl-loop for w in windows + collect (list (window-buffer w) + (window-parameter w 'alist) + (window-state-get w))))) + +(defun +popup--kill-buffer (buffer) + "Tries to kill BUFFER, as was requested by a transient timer. If it fails, eg. +the buffer is visible, then set another timer and try again later." + (when (buffer-live-p buffer) + (if (get-buffer-window buffer) + (with-current-buffer buffer + (setq +popup--timer + (run-at-time (timer--time +popup--timer) + nil #'+popup--kill-buffer buffer))) + (with-demoted-errors "Error killing transient buffer: %s" + (let ((inhibit-message (not doom-debug-mode))) + (message "Cleaned up transient buffer: %s" buffer)) + (kill-buffer buffer))))) + +(defun +popup--init (window alist) + "Initializes a popup window. Run any time a popup is opened. It sets the +default window parameters for popup windows, clears leftover transient timers +and enables `+popup-buffer-mode'." + (with-selected-window window + (set-window-parameter window 'no-other-window t) + (set-window-parameter window 'delete-window #'+popup--destroy) + (set-window-parameter window 'alist alist) + (window-preserve-size + window (memq (window-parameter window 'window-side) '(left right)) t) + (+popup--cancel-buffer-timer) + (+popup-buffer-mode +1))) + +(defun +popup--destroy (window) + "Do housekeeping before destroying a popup window. + ++ Disables `+popup-buffer-mode' so that any hooks attached to it get a chance to + run and do cleanup of its own. ++ Either kills the buffer or sets a transient timer, if the window has a + `transient' window parameter (see `+popup-window-parameters'). ++ And finally deletes the window!" + (let ((ttl (+popup-parameter 'transient window)) + (buffer (window-buffer window))) + (let ((ignore-window-parameters t)) + (delete-window window)) + (unless (window-live-p window) + (with-current-buffer buffer + (+popup-buffer-mode -1) + ;; t = default + ;; integer = ttl + ;; nil = no timer + (when ttl + (when (eq ttl t) + (setq ttl +popup-ttl)) + (cl-assert (integerp ttl) t) + (if (= ttl 0) + (+popup--kill-buffer buffer) + (setq +popup--timer + (run-at-time ttl nil #'+popup--kill-buffer buffer)))))))) + +(defun +popup--normalize-alist (alist) + "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." + (if (not alist) + (setq alist +popup-default-alist) + (let* ((alist (map-merge 'list +popup-default-alist alist)) + (params (map-merge 'list + +popup-default-parameters + (cdr (assq 'window-parameters alist))))) + (setq alist (assq-delete-all 'window-parameters alist)) + (push (cons 'window-parameters params) alist) + (nreverse alist)))) + + +;; +;; Public library +;; + +;;;###autoload +(defun +popup-p (&optional target) + "Return t if TARGET is a popup window or buffer. If TARGET is nil, use the +current buffer." + (unless target + (setq target (current-buffer))) + (cond ((windowp target) + (+popup-p (window-buffer target))) + ((bufferp target) + (buffer-local-value '+popup-buffer-mode target)) + (t + (error "Expected a window/buffer, got %s (%s)" + (type-of target) target)))) + +;;;###autoload +(defun +popup-buffer (buffer &optional alist) + "Open BUFFER in a popup window. ALIST describes its features." + (let* ((old-window (selected-window)) + (alist (+popup--normalize-alist alist)) + (new-window (or (display-buffer-reuse-window buffer alist) + (display-buffer-in-side-window buffer alist)))) + (+popup--init new-window alist) + (select-window + (if (+popup-parameter 'select new-window) + new-window + old-window)) + new-window)) + +;;;###autoload +(defun +popup-parameter (parameter &optional window) + "Fetch the window parameter of WINDOW" + (window-parameter (or window (selected-window)) parameter)) + +;;;###autoload +(defun +popup-windows () + "Returns a list of all popup windows." + (cl-remove-if-not #'+popup-p (window-list))) + + +;; +;; Minor mode +;; + +;;;###autoload +(define-minor-mode +popup-mode + "Global minor mode for popups." + :init-value nil + :global t + :keymap +popup-mode-map + (cond (+popup-mode + (add-hook 'doom-unreal-buffer-functions #'+popup-p) + (add-hook '+evil-esc-hook #'+popup|close-on-escape t) + (setq +popup--old-display-buffer-alist display-buffer-alist + display-buffer-alist +popup--display-buffer-alist) + (dolist (prop +popup-window-parameters) + (push (cons prop 'writeable) window-persistent-parameters))) + (t + (remove-hook 'doom-unreal-buffer-functions #'+popup-p) + (remove-hook '+evil-esc-hook #'+popup|close-on-escape) + (setq display-buffer-alist +popup--old-display-buffer-alist) + (dolist (prop +popup-window-parameters) + (assq-delete-all prop window-persistent-parameters))))) + +;;;###autoload +(define-minor-mode +popup-buffer-mode + "Minor mode for popup windows." + :init-value nil + :keymap +popup-buffer-mode-map) + + +;; +;; Hooks +;; + +;;;###autoload +(defun +popup|adjust-fringes () + "Hides the fringe in popup windows, restoring them if `+popup-buffer-mode' is +disabled." + (let ((f (if +popup-buffer-mode 0 doom-fringe-size))) + (set-window-fringes nil f f fringes-outside-margins))) + +;;;###autoload +(defun +popup|set-modeline () + "Don't show modeline in popup windows without a `modeline' window-parameter. + ++ If one exists and it's a symbol, use `doom-modeline' to grab the format. ++ If non-nil, show the mode-line as normal. ++ If nil (or omitted), then hide the modeline entirely (the default)." + (if +popup-buffer-mode + (let ((modeline (+popup-parameter 'modeline))) + (cond ((or (eq modeline 'nil) + (not modeline)) + (doom-hide-modeline-mode +1)) + ((and (symbolp modeline) + (not (eq modeline 't))) + (setq-local doom--modeline-format (doom-modeline modeline)) + (when doom--modeline-format + (doom-hide-modeline-mode +1))))) + (when doom-hide-modeline-mode + (doom-hide-modeline-mode -1)))) + +;;;###autoload +(defun +popup|close-on-escape () + "If called inside a popup, try to close that popup window (see +`+popup/close'). If called outside, try to close all popup windows (see +`+popup/close-all')." + (call-interactively + (if (+popup-p) + #'+popup/close + #'+popup/close-all))) + + +;; +;; Commands +;; + +;;;###autoload +(defalias 'other-popup #'+popup/other) + +;;;###autoload +(defun +popup/other () + "Cycle through popup windows, like `other-window'. Ignores regular windows." + (interactive) + (let ((popups (+popup-windows)) + (window (selected-window))) + (unless popups + (user-error "No popups are open")) + (select-window (if (+popup-p) + (or (car-safe (cdr (memq window popups))) + (car (delq window popups)) + (car popups)) + (car popups))))) + +;;;###autoload +(defun +popup/close (&optional window force-p) + "Close WINDOW, if it's a popup window. + +This will do nothing if the popup's `escape-quit' window parameter is either nil +or 'other. This window parameter is ignored if FORCE-P is non-nil." + (interactive + (list (selected-window) + current-prefix-arg)) + (unless window + (setq window (selected-window))) + (when (and (+popup-p window) + (or force-p + (memq (+popup-parameter 'escape-quit window) + '(t current)))) + (when +popup--remember-last + (+popup--remember (list window))) + (delete-window window) + t)) + +;;;###autoload +(defun +popup/close-all (&optional force-p) + "Close all open popup windows. + +This will ignore popups with an `escape-quit' parameter that is either nil or +'current. This window parameter is ignored if FORCE-P is non-nil." + (interactive "P") + (let (targets +popup--remember-last) + (dolist (window (+popup-windows)) + (when (or force-p + (memq (+popup-parameter 'escape-quit window) + '(t other))) + (push window targets))) + (when targets + (+popup--remember targets) + (mapc #'delete-window targets) + t))) + +;;;###autoload +(defun +popup/toggle () + "If popups are open, close them. If they aren't, restore the last one or open +the message buffer in a popup window." + (interactive) + (cond ((+popup-windows) + (+popup/close-all)) + ((ignore-errors (+popup/restore))) + ((display-buffer (get-buffer "*Messages*"))))) + +;;;###autoload +(defun +popup/restore () + "Restore the last popups that were closed, if any." + (interactive) + (unless +popup--last + (error "No popups to restore")) + (cl-loop for (buffer alist state) in +popup--last + if (and (buffer-live-p buffer) + (+popup-buffer buffer alist)) + do (window-state-put state it)) + (setq +popup--last nil)) + +;;;###autoload +(defun +popup/raise () + "Raise the current popup window into a regular window." + (interactive) + (unless (+popup-p) + (user-error "Cannot raise a non-popup window")) + (let ((window (selected-window)) + (buffer (current-buffer)) + +popup--remember-last) + (set-window-parameter window 'transient nil) + (+popup/close window 'force) + (display-buffer-pop-up-window buffer nil))) + + +;; +;; Macros +;; + +;;;###autoload +(defmacro without-popups! (&rest body) + "Run BODY with a default `display-buffer-alist', ignoring the popup rules set +with the :popup setting." + `(let ((display-buffer-alist +popup--old-display-buffer-alist)) + ,@body)) + +;;;###autoload +(defmacro save-popups! (&rest body) + "Sets aside all popups before executing the original function, usually to +prevent the popup(s) from messing up the UI (or vice versa)." + `(let* ((in-popup-p (+popup-p)) + (popups (+popup-windows)) + (popup-states + (cl-loop for p in popups + collect (cons (window-buffer p) (window-state-get p)))) + +popup--last) + (dolist (p popups) + (+popup/close p 'force)) + (unwind-protect + (progn ,@body) + (when popups + (let ((origin (selected-window))) + (+popup/restore) + (unless in-popup-p + (select-window origin))))))) + diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el new file mode 100644 index 000000000..482281c0a --- /dev/null +++ b/modules/feature/popup/config.el @@ -0,0 +1,196 @@ +;;; config.el -*- lexical-binding: t; -*- + +(defconst +popup-window-parameters + '(transient escape-quit select modeline alist) + "A list of custom parameters to be added to `window-persistent-parameters'. +Modifying this has no effect, unless done before feature/popup loads. + +(transient . CDR) + CDR can be t, an integer or nil. It represents the number of seconds before + the buffer belonging to a closed popup window is killed. + + If t, CDR will default to `+popup-ttl'. + If 0, the buffer is immediately killed. + If nil, the buffer won't be killed. + +(escape-quit . CDR) + CDR can be t, 'other, 'current or nil. This determines the behavior of the + escape key in or outside of popup windows. + + If t, close the popup if escape is pressed inside or outside of popups. + If 'other, close this popup if escape is pressed outside of any popup. This is + great for popups you just want to peek at and discard. + If 'current, close the current popup if escape is pressed from inside of + the popup. + If nil, pressing escape will never close this buffer. + +(select . BOOl) + CDR is a boolean that determines whether to focus the popup window after it + opens. + +(modeline . CDR) + CDR can be t (show the default modeline), a symbol representing the name of a + modeline defined with `def-modeline!', or nil (show no modeline). + +(alist . CDR) + This is an internal parameter and should not be set or modified. + +Since I can't find this information anywhere but the Emacs manual, I'll include +a brief description of some native window parameters that Emacs uses: + +(delete-window . CDR) +(delete-other-window . CDR) +(split-window . CDR) +(other-window . CDR) + This applies to all four of the above: CDR can be t or a function. If t, using + those functions on this window will ignore all window parameters. + + If CDR is a function, it will replace the native function when used on this + window. e.g. if CDR is #'ignore (delete-window popup) will run (ignore popup) + instead of deleting the window! +(no-other-window . BOOL) + If CDR is non-nil, this window becomes invisible to `other-window' and + `pop-to-buffer'. Doom popups sets this. The default is nil.") + +(defvar +popup-default-alist + '((slot . 1) + (window-height . 0.14) + (window-width . 26) + (reusable-frames . visible)) + "The default alist for `display-buffer-alist' rules.") + +(defvar +popup-default-parameters + '((transient . t) + (escape-quit . t)) + "The default window parameters to add alists fed to `display-buffer-alist'.") + +(defvar +popup-ttl 10 + "The default time-to-live for transient buffers whose popup buffers have been +deleted.") + +(defvar +popup-mode-map (make-sparse-keymap) + "Active keymap in a session with the popup system enabled. See +`+popup-mode'.") + +(defvar +popup-buffer-mode-map (make-sparse-keymap) + "Active keymap in popup windows. See `+popup-buffer-mode'.") + + +(defvar +popup--display-buffer-alist nil) +(defvar +popup--old-display-buffer-alist nil) +(defvar +popup--remember-last t) +(defvar +popup--last nil) +(defvar-local +popup--timer nil) + + +;; +(def-setting! :popup (condition &optional alist parameters) + "Register a popup rule. + +CONDITION can be a regexp string or a function. See `display-buffer' for a list +of possible entries for ALIST, which tells the display system how to initialize +the popup window. PARAMETERS is an alist of window parameters. See +`+popup-window-parameters' for a list of custom parameters provided by the popup +module." + `(let ((alist ,alist) + (parameters ,parameters)) + ,(when alist + '(when-let* ((size (cdr (assq 'size alist)))) + (setq alist (assq-delete-all 'size alist)) + (push (cons (pcase (cdr (or (assq 'side alist) + (assq 'side +popup-default-alist))) + ((or `left `right) 'window-width) + (_ 'window-height)) + size) + alist))) + (prog1 (push (append (list ,condition '(+popup-buffer)) + alist + (list (cons 'window-parameters parameters))) + +popup--display-buffer-alist) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist))))) + + +;; +;; Default popup rules & bootstrap +;; + +(eval-when-compile + (set! :popup "^ \\*") + (set! :popup "^\\*" nil '((select . t))) + (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) + (set! :popup "^\\*Help" + '((window-height . 0.2)) + '((select . t))) + (set! :+popup "^\\*doom:" + '((window-height . 0.35)) + '((select . t) (escape-quit) (transient)))) + +(setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) +(add-hook 'doom-init-ui-hook #'+popup-mode) + +(add-hook '+popup-buffer-mode-hook #'+popup|adjust-fringes) +(add-hook '+popup-buffer-mode-hook #'+popup|set-modeline) + + +;; +;; Hacks +;; + +(defun doom*ignore-window-parameters (orig-fn &rest args) + "Allow *interactive* window moving commands to traverse popups." + (cl-letf (((symbol-function #'windmove-find-other-window) + (lambda (direction &optional window ignore sign wrap mini) + (window-in-direction + (pcase dir (`up 'above) (`down 'below) (_ dir)) + window (bound-and-true-p +popup-mode) arg windmove-wrap-around t)))) + (apply orig-fn args))) +(advice-add #'windmove-up :around #'doom*ignore-window-parameters) +(advice-add #'windmove-down :around #'doom*ignore-window-parameters) +(advice-add #'windmove-left :around #'doom*ignore-window-parameters) +(advice-add #'windmove-right :around #'doom*ignore-window-parameters) + + +(after! help-mode + (defun doom--switch-from-popup (location) + (let (origin) + (save-popups! + (switch-to-buffer (car location) nil t) + (if (not (cdr location)) + (message "Unable to find location in file") + (goto-char (cdr location)) + (recenter) + (setq origin (selected-window)))) + (+popup/close) + (select-window origin))) + + ;; Help buffers use `pop-to-window' to decide where to open followed links, + ;; which can be unpredictable. It should *only* replace the original buffer we + ;; opened the popup from. To fix this these three button types need to be + ;; redefined to set aside the popup before following a link. + (define-button-type 'help-function-def + :supertype 'help-xref + 'help-function + (lambda (fun file) + (require 'find-func) + (when (eq file 'C-source) + (setq file (help-C-file-name (indirect-function fun) 'fun))) + (doom--switch-from-popup (find-function-search-for-symbol fun nil file)))) + + (define-button-type 'help-variable-def + :supertype 'help-xref + 'help-function + (lambda (var &optional file) + (when (eq file 'C-source) + (setq file (help-C-file-name var 'var))) + (doom--switch-from-popup (find-variable-noselect var file)))) + + (define-button-type 'help-face-def + :supertype 'help-xref + 'help-function + (lambda (fun file) + (require 'find-func) + (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) + +(provide 'config) +;;; config.el ends here diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 8a8770880..4adc26ca8 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -24,7 +24,7 @@ (git-gutter-mode +1))) (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) :config - (set! :popup "^\\*git-gutter.+\\*$" :regexp t :size 15 :noselect t) + (set! :popup "^\\*git-gutter" nil '((select))) ;; Update git-gutter on focus (in case I was using git externally) (add-hook 'focus-in-hook #'git-gutter:update-all-windows) diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index f13540e2e..b3e72e557 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -11,10 +11,8 @@ (after! vc-annotate - (set! :popup - '("*vc-diff*" :size 15 :noselect t) - '("*vc-change-log*" :size 15) - '(vc-annotate-mode :same t)) + (set! :popup "^\\vc-d" nil '((select))) ; *vc-diff* + (set! :popup "^\\vc-c" nil '((select . t))) ; *vc-change-log* (set! :evil-state 'vc-annotate-mode 'normal) (set! :evil-state 'vc-git-log-view-mode 'normal)) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 5dd2ec8c5..d54754467 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -35,7 +35,7 @@ (setq nrepl-hide-special-buffers t) ;; settings for cider repl as a popup (prevent it from being closed on escape, especially.) - (set! :popup "^\\*cider" :regexp t :noselect t :noesc t) + (set! :popup "^\\*cider" nil '((escape-quit) (select))) ;; Setup cider for clojurescript / figwheel dev. (setq cider-cljs-lein-repl diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 4f1e02586..c84354f5f 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -115,8 +115,7 @@ (def-package! overseer - :commands overseer-test - :init (set! :popup "*overseer*" :size 12)) + :commands overseer-test) ;; diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 9359f6b8c..e3b3ab643 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -10,7 +10,6 @@ (add-hook! 'intero-mode-hook #'(flycheck-mode eldoc-mode)) - (set! :popup "^intero:backend:" :regex t :size 12) (set! :lookup 'haskell-mode :definition #'intero-goto-definition)) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 2d4fafb04..94e781d82 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -33,7 +33,7 @@ LaTeX-section-section LaTeX-section-label)) - (set! :popup " output\\*$" :regexp t :size 15 :noselect t :autoclose t :autokill t) + (set! :popup " output\\*$" '((size . 15))) (map! :map LaTeX-mode-map "C-j" nil)) diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index 13353d1ab..457f2872d 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -4,7 +4,7 @@ :mode "\\.p\\(lant\\)?uml$" :config (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar")) - (set! :popup "*PLANTUML Preview*" :size 25 :noselect t :autokill t) + (set! :popup "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0))) (unless (executable-find "java") (warn "plantuml-mode: can't find java, preview disabled.")) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 82c20f506..90bf1e83d 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -78,7 +78,7 @@ environment variables." anaconda-mode-eldoc-as-single-line t) :config (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) - (set! :popup "*anaconda-mode*" :size 10 :noselect t :autoclose t :autokill t) + (set! :popup "^\\*anaconda-mode" nil '((select))) (map! :map anaconda-mode-map :m "gd" #'anaconda-mode-find-definitions) (advice-add #'anaconda-mode-doc-buffer :after #'doom*anaconda-mode-doc-buffer)) @@ -113,7 +113,7 @@ environment variables." :init (associate! nose-mode :match "/test_.+\\.py$" :modes (python-mode)) :config - (set! :popup "*nosetests*" :size 0.4 :noselect t) + (set! :popup "^\\*nosetests" '((size . 0.4)) '((select))) (set! :yas-minor-mode 'nose-mode) (map! :map nose-mode-map :localleader diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 4af59d251..79c81c85c 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -4,7 +4,7 @@ :commands restclient-mode :mode ("\\.http$" . restclient-mode) :config - (set! :popup "*HTTP Response*" :size 30 :select t :noesc t :autokill t) + (set! :popup "^\\*HTTP Response" '((size . 0.4)) '((escape-quit . other))) (map! :mode restclient-mode :n [M-return] 'restclient-http-send-current :localleader diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 1bfaa4f0c..ca24e00dc 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -24,8 +24,8 @@ "M--" #'text-scale-decrease ;; Simple window navigation/manipulation - "C-`" #'doom/popup-toggle - "C-~" #'doom/popup-raise + "C-`" #'+popup/toggle + "C-~" #'+popup/raise "M-t" #'+workspace/new "M-T" #'+workspace/display "M-w" #'delete-window @@ -63,7 +63,7 @@ :en "C-k" #'evil-window-up :en "C-l" #'evil-window-right - "C-x p" #'doom/other-popup + "C-x p" #'+popup/other ;; --- ------------------------------------- @@ -78,7 +78,7 @@ :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 "Toggle last popup" :n "~" #'+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 @@ -195,7 +195,7 @@ :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 "Toggle Emacs log" :n "m" #'view-echo-area-messages :desc "Command log" :n "L" #'global-command-log-mode :desc "Describe function" :n "f" #'describe-function :desc "Describe key" :n "k" #'describe-key @@ -723,6 +723,10 @@ "M-;" #'eval-expression "A-;" #'eval-expression) + (:when (featurep! :feature popup) + (:map +popup-mode-map + "M-w" #'delete-window)) + (:after tabulated-list (:map tabulated-list-mode-map [remap evil-record-macro] #'quit-window)) diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index cc7837de3..d0864b08f 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -7,7 +7,6 @@ (def-package! gist :commands (gist-list gist-region-or-buffer-private gist-region-or-buffer) :config - (set! :popup "*github:gists*" :size 15 :select t :autokill t) (set! :evil-state 'gist-list-mode 'normal) (defun +gist*list-render (orig-fn &rest args) diff --git a/modules/tools/imenu/config.el b/modules/tools/imenu/config.el index cbef99643..5cfb68b59 100644 --- a/modules/tools/imenu/config.el +++ b/modules/tools/imenu/config.el @@ -8,18 +8,16 @@ (def-package! imenu-list :commands imenu-list-minor-mode :config - (setq imenu-list-focus-after-activation t) - (set! :popup imenu-list-buffer-name :size 35 :align 'right) + (set! :popup "^\\*Ilist" + '((side . right) (size . 35)) + '((escape-quit . current) (select) (transient . 0))) - ;; use popups - (defun doom*imenu-list-show () - (doom-popup-buffer (get-buffer imenu-list-buffer-name))) - (advice-add #'imenu-list-show :override #'doom*imenu-list-show) - (advice-add #'imenu-list-show-noselect :override #'doom*imenu-list-show) - - ;; auto kill imenu-list on deactivation - (defun doom|kill-imenu-list () - (when (and (not imenu-list-minor-mode) - (get-buffer imenu-list-buffer-name)) - (kill-buffer (get-buffer imenu-list-buffer-name)))) - (add-hook 'imenu-list-minor-mode-hook #'doom|kill-imenu-list)) + (defun +imenu|cleanup-on-popup-close () + "Clean up after `imenu-list-minor-mode' when killing the list window." + (unless +popup-buffer-mode + (when imenu-list--displayed-buffer + (with-current-buffer imenu-list--displayed-buffer + (imenu-list-minor-mode -1))) + (when (equal (buffer-name) imenu-list-buffer-name) + (kill-buffer (get-buffer imenu-list-buffer-name))))) + (add-hook '+popup-buffer-mode-hook #'+imenu|cleanup-on-popup-close)) diff --git a/modules/tools/neotree/config.el b/modules/tools/neotree/config.el index fb8a88086..988717aba 100644 --- a/modules/tools/neotree/config.el +++ b/modules/tools/neotree/config.el @@ -33,5 +33,9 @@ "~$" "^#.*#$")) + (set! :popup "^ ?\\*NeoTree" + `((side . ,neo-window-position) (width-width . ,neo-window-width)) + '((escape-quit . current) (select . t))) + (when (bound-and-true-p winner-mode) (push neo-buffer-name winner-boring-buffers))) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 28a69a17a..d63313582 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -21,7 +21,7 @@ :commands pass :config (set! :evil-state 'pass-mode 'emacs) - (set! :popup "*Password-Store*" :align 'left :size 32 :select t :autokill t :noesc t) + (set! :popup "^\\*Password-Store" '((side . left)) '((escape-quit))) (map! :map pass-mode-map "j" #'pass-next-entry "k" #'pass-prev-entry diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 55666a769..139328fba 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -19,14 +19,7 @@ (add-hook 'doom-init-theme-hook #'doom-themes-neotree-config) (setq doom-neotree-enable-variable-pitch t doom-neotree-file-icons 'simple - doom-neotree-line-spacing 2) - - (after! neotree - (defun +doom|neotree-fix-popup () - "Ensure the fringe settings are maintained on popup restore." - (neo-global--when-window - (doom--neotree-no-fringes))) - (add-hook 'doom-popup-mode-hook #'+doom|neotree-fix-popup))) + doom-neotree-line-spacing 2)) (def-package! solaire-mode diff --git a/modules/ui/tabbar/config.el b/modules/ui/tabbar/config.el index bb694c5c4..296d5d04d 100644 --- a/modules/ui/tabbar/config.el +++ b/modules/ui/tabbar/config.el @@ -10,10 +10,10 @@ (tabbar-mode) (defun +tabbar|disable-in-popups () - (when tabbar-mode + (when (and +popup-buffer-mode tabbar-mode) (tabbar-local-mode -1) (setq-local header-line-format nil))) - (add-hook 'doom-popup-mode-hook #'+tabbar|disable-in-popups) + (add-hook '+popup-buffer-mode-hook #'+tabbar|disable-in-popups) (defun +tabbar-display-tab (tab) "Return a label for TAB that resembles tabs in Atom." From c8768f512df627298fb013259119bda4e2af6e0a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 02:22:34 -0500 Subject: [PATCH 0065/4235] private/default: bind M-w to +popup-buffer-mode-map --- modules/private/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index ca24e00dc..eb915ba20 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -724,7 +724,7 @@ "A-;" #'eval-expression) (:when (featurep! :feature popup) - (:map +popup-mode-map + (:map +popup-buffer-mode-map "M-w" #'delete-window)) (:after tabulated-list From 3cbddbfd88c50d88d361f05e8c8f518a76d13530 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 02:38:34 -0500 Subject: [PATCH 0066/4235] Generalize +evil-esc-hook into doom-escape-hook This lets vanilla Emacs users in on having a universal "escape" key. --- core/core-keybinds.el | 24 ++++++++++++++++++++++++ modules/feature/evil/config.el | 22 ++-------------------- modules/feature/popup/autoload.el | 4 ++-- modules/feature/snippets/config.el | 2 +- modules/feature/syntax-checker/config.el | 2 +- modules/feature/version-control/+git.el | 4 ++-- modules/lang/org/config.el | 2 +- modules/ui/doom-modeline/config.el | 2 +- 8 files changed, 34 insertions(+), 28 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 0b1310017..942c9b475 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -21,6 +21,30 @@ (?g . global)) "A list of cons cells that map a letter to a evil state symbol.") +;; +(defvar doom-escape-hook nil + "A hook run after C-g is pressed (or ESC in normal mode, for evil users). Both +keys trigger `doom/escape'. + +If any hook returns non-nil, all hooks after it are ignored.") + +(defun doom/escape () + "Run the `doom-escape-hook'." + (interactive) + (cond ((minibuffer-window-active-p (minibuffer-window)) + ;; quit the minibuffer if open. + (abort-recursive-edit)) + ((and (featurep 'evil) (evil-ex-hl-active-p 'evil-ex-search)) + ;; disable ex search buffer highlights. + (evil-ex-nohighlight)) + ;; Run all escape hooks. If any returns non-nil, then stop there. + ((run-hook-with-args-until-success 'doom-escape-hook)) + ;; Back to the default + (t (keyboard-quit)))) + +(global-set-key [remap keyboard-quit] #'doom/escape) +(advice-add #'evil-force-normal-state :after #'doom/escape) + ;; (def-package! which-key diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 3c538f20f..86269f6d9 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -88,24 +88,6 @@ ;; --- evil hacks ------------------------- - (defvar +evil-esc-hook '(t) - "A hook run after ESC is pressed in normal mode (invoked by -`evil-force-normal-state'). If any hook returns non-nil, all hooks after it are -ignored.") - - (defun +evil*attach-escape-hook () - "Run the `+evil-esc-hook'." - (cond ((minibuffer-window-active-p (minibuffer-window)) - ;; quit the minibuffer if open. - (abort-recursive-edit)) - ((evil-ex-hl-active-p 'evil-ex-search) - ;; disable ex search buffer highlights. - (evil-ex-nohighlight)) - (t - ;; Run all escape hooks. If any returns non-nil, then stop there. - (run-hook-with-args-until-success '+evil-esc-hook)))) - (advice-add #'evil-force-normal-state :after #'+evil*attach-escape-hook) - (defun +evil*restore-normal-state-on-windmove (orig-fn &rest args) "If in anything but normal or motion mode when moving to another window, restore normal mode. This prevents insert state from bleeding into other modes @@ -246,7 +228,7 @@ across windows." (when evil-exchange--overlays (evil-exchange-cancel) t)) - (add-hook '+evil-esc-hook #'+evil|escape-exchange)) + (add-hook 'doom-escape-hook #'+evil|escape-exchange)) (def-package! evil-matchit @@ -309,7 +291,7 @@ the new algorithm is confusing, like in python or ruby." (evil-mc-undo-all-cursors) (evil-mc-resume-cursors) t)) - (add-hook '+evil-esc-hook #'+evil|escape-multiple-cursors)) + (add-hook 'doom-escape-hook #'+evil|escape-multiple-cursors)) (def-package! evil-snipe diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index c0de798f0..f40f3fb19 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -139,14 +139,14 @@ current buffer." :keymap +popup-mode-map (cond (+popup-mode (add-hook 'doom-unreal-buffer-functions #'+popup-p) - (add-hook '+evil-esc-hook #'+popup|close-on-escape t) + (add-hook 'doom-escape-hook #'+popup|close-on-escape t) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist) (dolist (prop +popup-window-parameters) (push (cons prop 'writeable) window-persistent-parameters))) (t (remove-hook 'doom-unreal-buffer-functions #'+popup-p) - (remove-hook '+evil-esc-hook #'+popup|close-on-escape) + (remove-hook 'doom-escape-hook #'+popup|close-on-escape) (setq display-buffer-alist +popup--old-display-buffer-alist) (dolist (prop +popup-window-parameters) (assq-delete-all prop window-persistent-parameters))))) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index ec8adc255..5d4a23349 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -37,7 +37,7 @@ (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) ;; Exit snippets on ESC from normal mode - (add-hook '+evil-esc-hook #'yas-abort-snippet)) + (add-hook 'doom-escape-hook #'yas-abort-snippet)) (def-package! auto-yasnippet diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 816d81589..0e90127b8 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -12,7 +12,7 @@ (when flycheck-mode (ignore-errors (flycheck-buffer)) nil)) - (add-hook '+evil-esc-hook #'+syntax-checkers|flycheck-buffer t) + (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) ;; With the option of flychecking the buffer on escape, so we don't need ;; auto-flychecking on idle-change: diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 4adc26ca8..eb112cfe8 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -32,10 +32,10 @@ (after! evil (defun +version-control|update-git-gutter () "Refresh git-gutter on ESC. Return nil to prevent shadowing other -`+evil-esc-hook' hooks." +`doom-escape-hook' hooks." (when git-gutter-mode (ignore (git-gutter)))) - (add-hook '+evil-esc-hook #'+version-control|update-git-gutter t)) + (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t)) (def-hydra! +version-control@git-gutter (:body-pre (git-gutter-mode 1) :hint nil) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index d43e6ccb4..e46fe9c42 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -256,7 +256,7 @@ between the two." (when (and (derived-mode-p 'org-mode) org-occur-highlights) (org-remove-occur-highlights))) - (add-hook '+evil-esc-hook #'+org|remove-occur-highlights) + (add-hook 'doom-escape-hook #'+org|remove-occur-highlights) (after! recentf ;; Don't clobber recentf with agenda files diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 5e21e6bf8..3e9106018 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -42,7 +42,7 @@ anzu--last-isearch-string anzu--overflow-p)) ;; Ensure anzu state is cleared when searches & iedit are done (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook '+evil-esc-hook #'anzu--reset-status t) + (add-hook 'doom-escape-hook #'anzu--reset-status t) (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) From 08b479b06fc40fb2a3b1c6a95b162b99d352b2f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 02:42:53 -0500 Subject: [PATCH 0067/4235] Rename popup parameter escape-quit => quit --- modules/app/regex/config.el | 4 ++-- modules/feature/popup/autoload.el | 8 ++++---- modules/feature/popup/config.el | 22 +++++++++++----------- modules/lang/clojure/config.el | 2 +- modules/lang/rest/config.el | 2 +- modules/tools/imenu/config.el | 2 +- modules/tools/neotree/config.el | 2 +- modules/tools/password-store/config.el | 2 +- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/app/regex/config.el b/modules/app/regex/config.el index 64ebebd1a..350875a6f 100644 --- a/modules/app/regex/config.el +++ b/modules/app/regex/config.el @@ -46,6 +46,6 @@ http://regexr.com/foo.html?q=bar https://mediatemple.net" "TODO") -(set! :popup "^\\*doom-regex\\*$" '((size . 4)) '((escape-quit))) -(set! :popup "^\\*doom-regex-groups" '((side . left)) '((select) (escape-quit))) +(set! :popup "^\\*doom-regex\\*$" '((size . 4)) '((quit))) +(set! :popup "^\\*doom-regex-groups" '((side . left)) '((select) (quit))) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index f40f3fb19..0460b965b 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -234,7 +234,7 @@ or 'other. This window parameter is ignored if FORCE-P is non-nil." (setq window (selected-window))) (when (and (+popup-p window) (or force-p - (memq (+popup-parameter 'escape-quit window) + (memq (+popup-parameter 'quit window) '(t current)))) (when +popup--remember-last (+popup--remember (list window))) @@ -245,13 +245,13 @@ or 'other. This window parameter is ignored if FORCE-P is non-nil." (defun +popup/close-all (&optional force-p) "Close all open popup windows. -This will ignore popups with an `escape-quit' parameter that is either nil or -'current. This window parameter is ignored if FORCE-P is non-nil." +This will ignore popups with an `quit' parameter that is either nil or 'current. +This window parameter is ignored if FORCE-P is non-nil." (interactive "P") (let (targets +popup--remember-last) (dolist (window (+popup-windows)) (when (or force-p - (memq (+popup-parameter 'escape-quit window) + (memq (+popup-parameter 'quit window) '(t other))) (push window targets))) (when targets diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 482281c0a..81e2d53ff 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -1,7 +1,7 @@ ;;; config.el -*- lexical-binding: t; -*- (defconst +popup-window-parameters - '(transient escape-quit select modeline alist) + '(transient quit select modeline alist) "A list of custom parameters to be added to `window-persistent-parameters'. Modifying this has no effect, unless done before feature/popup loads. @@ -13,16 +13,16 @@ Modifying this has no effect, unless done before feature/popup loads. If 0, the buffer is immediately killed. If nil, the buffer won't be killed. -(escape-quit . CDR) +(quit . CDR) CDR can be t, 'other, 'current or nil. This determines the behavior of the - escape key in or outside of popup windows. + ESC/C-g keys in or outside of popup windows. - If t, close the popup if escape is pressed inside or outside of popups. - If 'other, close this popup if escape is pressed outside of any popup. This is - great for popups you just want to peek at and discard. - If 'current, close the current popup if escape is pressed from inside of - the popup. - If nil, pressing escape will never close this buffer. + If t, close the popup if ESC/C-g is pressed inside or outside of popups. + If 'other, close this popup if ESC/C-g is pressed outside of any popup. This + is great for popups you just want to peek at and discard. + If 'current, close the current popup if ESC/C-g is pressed from inside of the + popup. + If nil, pressing ESC/C-g will never close this buffer. (select . BOOl) CDR is a boolean that determines whether to focus the popup window after it @@ -61,7 +61,7 @@ a brief description of some native window parameters that Emacs uses: (defvar +popup-default-parameters '((transient . t) - (escape-quit . t)) + (quit . t)) "The default window parameters to add alists fed to `display-buffer-alist'.") (defvar +popup-ttl 10 @@ -124,7 +124,7 @@ module." '((select . t))) (set! :+popup "^\\*doom:" '((window-height . 0.35)) - '((select . t) (escape-quit) (transient)))) + '((select . t) (quit) (transient)))) (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) (add-hook 'doom-init-ui-hook #'+popup-mode) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index d54754467..4f72c68f8 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -35,7 +35,7 @@ (setq nrepl-hide-special-buffers t) ;; settings for cider repl as a popup (prevent it from being closed on escape, especially.) - (set! :popup "^\\*cider" nil '((escape-quit) (select))) + (set! :popup "^\\*cider" nil '((quit) (select))) ;; Setup cider for clojurescript / figwheel dev. (setq cider-cljs-lein-repl diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 79c81c85c..c3781d2b1 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -4,7 +4,7 @@ :commands restclient-mode :mode ("\\.http$" . restclient-mode) :config - (set! :popup "^\\*HTTP Response" '((size . 0.4)) '((escape-quit . other))) + (set! :popup "^\\*HTTP Response" '((size . 0.4)) '((quit . other))) (map! :mode restclient-mode :n [M-return] 'restclient-http-send-current :localleader diff --git a/modules/tools/imenu/config.el b/modules/tools/imenu/config.el index 5cfb68b59..c761d1a44 100644 --- a/modules/tools/imenu/config.el +++ b/modules/tools/imenu/config.el @@ -10,7 +10,7 @@ :config (set! :popup "^\\*Ilist" '((side . right) (size . 35)) - '((escape-quit . current) (select) (transient . 0))) + '((quit . current) (select) (transient . 0))) (defun +imenu|cleanup-on-popup-close () "Clean up after `imenu-list-minor-mode' when killing the list window." diff --git a/modules/tools/neotree/config.el b/modules/tools/neotree/config.el index 988717aba..38ae318e8 100644 --- a/modules/tools/neotree/config.el +++ b/modules/tools/neotree/config.el @@ -35,7 +35,7 @@ (set! :popup "^ ?\\*NeoTree" `((side . ,neo-window-position) (width-width . ,neo-window-width)) - '((escape-quit . current) (select . t))) + '((quit . current) (select . t))) (when (bound-and-true-p winner-mode) (push neo-buffer-name winner-boring-buffers))) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index d63313582..71c5f1dbf 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -21,7 +21,7 @@ :commands pass :config (set! :evil-state 'pass-mode 'emacs) - (set! :popup "^\\*Password-Store" '((side . left)) '((escape-quit))) + (set! :popup "^\\*Password-Store" '((side . left)) '((quit))) (map! :map pass-mode-map "j" #'pass-next-entry "k" #'pass-prev-entry From a88cb1e4eba2586c60f49dd5a799ea9791931d39 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 02:48:01 -0500 Subject: [PATCH 0068/4235] require map library for +popup--normalize-alist --- modules/feature/popup/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 0460b965b..a4d942321 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -75,6 +75,7 @@ and enables `+popup-buffer-mode'." "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." (if (not alist) (setq alist +popup-default-alist) + (require 'map) (let* ((alist (map-merge 'list +popup-default-alist alist)) (params (map-merge 'list +popup-default-parameters From 60cded00e6ef5fc921ea7a66f629c13df744b94e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:00:45 -0500 Subject: [PATCH 0069/4235] Decouple doom/escape & evil --- core/core-keybinds.el | 6 +----- modules/feature/evil/config.el | 9 +++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 942c9b475..9bd8070c5 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -24,7 +24,7 @@ ;; (defvar doom-escape-hook nil "A hook run after C-g is pressed (or ESC in normal mode, for evil users). Both -keys trigger `doom/escape'. +trigger `doom/escape'. If any hook returns non-nil, all hooks after it are ignored.") @@ -34,16 +34,12 @@ If any hook returns non-nil, all hooks after it are ignored.") (cond ((minibuffer-window-active-p (minibuffer-window)) ;; quit the minibuffer if open. (abort-recursive-edit)) - ((and (featurep 'evil) (evil-ex-hl-active-p 'evil-ex-search)) - ;; disable ex search buffer highlights. - (evil-ex-nohighlight)) ;; Run all escape hooks. If any returns non-nil, then stop there. ((run-hook-with-args-until-success 'doom-escape-hook)) ;; Back to the default (t (keyboard-quit)))) (global-set-key [remap keyboard-quit] #'doom/escape) -(advice-add #'evil-force-normal-state :after #'doom/escape) ;; diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 86269f6d9..7ca2fff24 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -88,6 +88,15 @@ ;; --- evil hacks ------------------------- + (advice-add #'evil-force-normal-state :after #'doom/escape) + + (defun +evil|disable-highlights () + "Disable ex search buffer highlights." + (when (evil-ex-hl-active-p 'evil-ex-search) + (evil-ex-nohighlight) + t)) + (add-hook 'doom-escape-hook #'+evil|disable-highlights) + (defun +evil*restore-normal-state-on-windmove (orig-fn &rest args) "If in anything but normal or motion mode when moving to another window, restore normal mode. This prevents insert state from bleeding into other modes From b17cafc4f7e408ef9157a251486a3ff47f766943 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:02:12 -0500 Subject: [PATCH 0070/4235] feature/evil: recenter after splitting --- modules/feature/evil/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7ca2fff24..1b6f086ad 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -143,8 +143,10 @@ across windows." ;; `evil-vsplit-window-right' to non-nil mimics this, but that doesn't update ;; window history. That means when you delete a new split, Emacs leaves you on ;; the 2nd to last window on the history stack, which is jarring. - (defun +evil*window-follow (&rest _) (evil-window-down 1)) - (defun +evil*window-vfollow (&rest _) (evil-window-right 1)) + ;; + ;; Also recenters window on cursor in new split + (defun +evil*window-follow (&rest _) (evil-window-down 1) (recenter)) + (defun +evil*window-vfollow (&rest _) (evil-window-right 1) (recenter)) (advice-add #'evil-window-split :after #'+evil*window-follow) (advice-add #'evil-window-vsplit :after #'+evil*window-vfollow)) From b28f6ed4772665e647ed2967fccfef6f2cd848b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:03:02 -0500 Subject: [PATCH 0071/4235] General minor refactor & comment revision --- core/core-lib.el | 11 +++++------ modules/feature/popup/autoload.el | 4 ++-- modules/feature/workspaces/config.el | 3 ++- modules/lang/org/autoload/org-babel.el | 13 ------------- 4 files changed, 9 insertions(+), 22 deletions(-) delete mode 100644 modules/lang/org/autoload/org-babel.el diff --git a/core/core-lib.el b/core/core-lib.el index d812d2b3e..5fbe58daf 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -301,12 +301,11 @@ Do not use this for configuring Doom core." (declare (indent defun)) (unless values (error "Empty set! for %s" keyword)) - (let ((fn (cdr (assq keyword doom-settings)))) - (if fn - (apply fn values) - (when doom-debug-mode - (message "No setting found for %s" keyword) - nil)))) + (if-let* ((fn (cdr (assq keyword doom-settings)))) + (apply fn values) + (when doom-debug-mode + (message "No setting found for %s" keyword) + nil))) (provide 'core-lib) ;;; core-lib.el ends here diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index a4d942321..afee7594e 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -226,8 +226,8 @@ disabled." (defun +popup/close (&optional window force-p) "Close WINDOW, if it's a popup window. -This will do nothing if the popup's `escape-quit' window parameter is either nil -or 'other. This window parameter is ignored if FORCE-P is non-nil." +This will do nothing if the popup's `quit' window parameter is either nil or +'other. This window parameter is ignored if FORCE-P is non-nil." (interactive (list (selected-window) current-prefix-arg)) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 5cd106696..871c9ca12 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -72,7 +72,8 @@ renamed.") (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) (= persp-auto-resume-time -1)) (persp-frame-switch +workspaces-main (or frame (selected-frame)))) - ;; Make sure warnings are visible (fix #319) + ;; The warnings buffer gets swallowed by creating `+workspaces-main', so + ;; we display it manually, if it exists (fix #319). (when-let* ((warnings (get-buffer "*Warnings*"))) (display-buffer-in-side-window warnings '((window-height . shrink-window-if-larger-than-buffer)))))) diff --git a/modules/lang/org/autoload/org-babel.el b/modules/lang/org/autoload/org-babel.el deleted file mode 100644 index 8bf723f4e..000000000 --- a/modules/lang/org/autoload/org-babel.el +++ /dev/null @@ -1,13 +0,0 @@ -;;; lang/org/autoload/org-babel.el -*- lexical-binding: t; -*- -;;;###if (featurep! +babel) - -;;;###autoload -(defun +org-babel/edit (arg) - "Edit the source block at point in a popup. - -If ARG is non-nil (universal argument), use the current window." - (interactive "P") - (if arg - (call-interactively #'org-edit-special) - (with-popup-rules! (("^\\*Org Src" :regexp t :select t :noesc t :same t)) - (call-interactively #'org-edit-special)))) From 8531b5245eb2c1b276c45ce1199caeabce6f7f43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:03:24 -0500 Subject: [PATCH 0072/4235] ui/vi-tilde-fringe: use minor mode instead of global mode The global mode is a tad greedy, affecting buffers I don't want it to. So only activate it in certain places. This may change. --- modules/ui/vi-tilde-fringe/config.el | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/ui/vi-tilde-fringe/config.el b/modules/ui/vi-tilde-fringe/config.el index 25ec00771..1f099b7aa 100644 --- a/modules/ui/vi-tilde-fringe/config.el +++ b/modules/ui/vi-tilde-fringe/config.el @@ -2,10 +2,5 @@ ;; indicators for empty lines past EOF (def-package! vi-tilde-fringe - :commands vi-tilde-fringe-mode - :hook (doom-init-ui . global-vi-tilde-fringe-mode) - :config - (add-hook! +doom-dashboard-mode - (when (bound-and-true-p vi-tilde-fringe-mode) - (vi-tilde-fringe-mode -1)))) + :hook ((prog-mode text-mode conf-mode) . vi-tilde-fringe-mode)) From 4fdf4a58b451af7715906a174d5e3519f65d273c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:09:15 -0500 Subject: [PATCH 0073/4235] feature/popup: mention custom 'size parameter in :popup --- modules/feature/popup/config.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 81e2d53ff..7e693a65d 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -91,7 +91,10 @@ CONDITION can be a regexp string or a function. See `display-buffer' for a list of possible entries for ALIST, which tells the display system how to initialize the popup window. PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for a list of custom parameters provided by the popup -module." +module. + +ALIST supports one custom parameter: `size', which will resolve to +`window-height' or `window-width' depending on `side'." `(let ((alist ,alist) (parameters ,parameters)) ,(when alist @@ -120,10 +123,10 @@ module." (set! :popup "^\\*" nil '((select . t))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) (set! :popup "^\\*Help" - '((window-height . 0.2)) + '((size . 0.2)) '((select . t))) (set! :+popup "^\\*doom:" - '((window-height . 0.35)) + '((size . 0.35)) '((select . t) (quit) (transient)))) (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) From b681917082874a7fb7810bb308249f73fdf21606 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:27:23 -0500 Subject: [PATCH 0074/4235] Remove/replace references to doom-popup-buffer --- core/autoload/menu.el | 5 ++--- core/autoload/message.el | 4 ++-- modules/app/regex/autoload/regex.el | 4 ++-- modules/app/rss/autoload.el | 10 ---------- modules/app/rss/config.el | 2 +- modules/feature/eval/autoload/repl.el | 4 ++-- modules/feature/eval/config.el | 3 ++- modules/tools/eshell/autoload/eshell.el | 2 +- modules/tools/gist/config.el | 2 +- modules/tools/term/autoload.el | 2 +- 10 files changed, 14 insertions(+), 24 deletions(-) diff --git a/core/autoload/menu.el b/core/autoload/menu.el index c0ad798f2..bd19bbc43 100644 --- a/core/autoload/menu.el +++ b/core/autoload/menu.el @@ -31,9 +31,8 @@ PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") (setq header-line-format (concat (propertize "$ " 'face 'font-lock-doc-face) (propertize command 'face 'font-lock-preprocessor-face))) - (doom-resize-window - (doom-popup-buffer (current-buffer) - '(:autokill t :autoclose t)) 12))) + (doom-resize-window (get-buffer-window (pop-to-buffer (current-buffer))) + 12))) ((or (symbolp command) (functionp command)) (call-interactively command)) diff --git a/core/autoload/message.el b/core/autoload/message.el index 8924264ca..d84d40a92 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -66,8 +66,8 @@ interactive session." (insert "\n") (setq end (point)) (ansi-color-apply-on-region beg end))) - (with-selected-window (doom-popup-buffer buf) - (goto-char (point-max)))))) + (pop-to-buffer buf) + (goto-char (point-max))))) ;;;###autoload (defmacro debug! (message &rest args) diff --git a/modules/app/regex/autoload/regex.el b/modules/app/regex/autoload/regex.el index a54a210a5..87178f29a 100644 --- a/modules/app/regex/autoload/regex.el +++ b/modules/app/regex/autoload/regex.el @@ -64,8 +64,8 @@ (switch-to-buffer +regex--text-buffer) (with-current-buffer +regex--text-buffer (insert +regex-dummy-text))) - (doom-popup-buffer +regex--groups-buffer) - (doom-popup-buffer +regex--expr-buffer) + (pop-to-buffer +regex--groups-buffer) + (pop-to-buffer +regex--expr-buffer) (with-current-buffer +regex--expr-buffer (conf-mode) (rainbow-delimiters-mode +1) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index ed9e10fbe..38e79fc02 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -33,16 +33,6 @@ (kill-buffer buff) (delete-window window))) -;;;###autoload -(defun +rss-popup-pane (buf) - "Display BUF in a popup." - (doom-popup-buffer buf - '(:align +rss-split-direction - :size 0.75 - :select t - :autokill t - :autoclose t))) - ;;;###autoload (defun +rss/open (entry) "Display the currently selected item in a buffer." diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index bfd25007f..1aa6cd903 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -21,7 +21,7 @@ (setq elfeed-search-filter "@2-week-ago " elfeed-db-directory (concat doom-local-dir "elfeed/db/") elfeed-enclosure-default-dir (concat doom-local-dir "elfeed/enclosures/") - elfeed-show-entry-switch #'+rss-popup-pane + elfeed-show-entry-switch #'pop-to-buffer elfeed-show-entry-delete #'+rss/delete-pane shr-max-image-proportion 0.6) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 5655a64f3..8e75e402d 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -9,14 +9,14 @@ (if (and +eval-repl-buffer (buffer-live-p +eval-repl-buffer)) (if-let* ((win (get-buffer-window +eval-repl-buffer))) (select-window win) - (doom-popup-buffer +eval-repl-buffer)) + (pop-to-buffer +eval-repl-buffer)) (when command (let ((repl-buffer (save-window-excursion (call-interactively command)))) (unless (bufferp repl-buffer) (error "REPL command didn't return a buffer")) (with-current-buffer repl-buffer (+eval-repl-mode +1)) (setq +eval-repl-buffer repl-buffer) - (select-window (doom-popup-buffer repl-buffer))))) + (pop-to-buffer repl-buffer)))) (when (eq (current-buffer) +eval-repl-buffer) (goto-char (if (and (derived-mode-p 'comint-mode) (cdr comint-last-prompt)) diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 00b2526ed..227e04d2c 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -83,6 +83,7 @@ function that creates and returns the REPL buffer." "Ensures window is scrolled to BOF on invocation." (with-selected-window (get-buffer-window quickrun--buffer-name) (goto-char (point-min)) - (doom-popup-fit-to-buffer))) + (let ((ignore-window-parameters t)) + (shrink-window-if-larger-than-buffer)))) (add-hook 'quickrun-after-run-hook #'+eval|quickrun-scroll-to-bof)) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 84a8e54b8..b15c4aa76 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -28,7 +28,7 @@ (let ((buf (get-buffer-create +eshell-buffer-name))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) - (doom-popup-buffer buf '(:autokill t) t) + (pop-to-buffer buf) (when command (+eshell-run-command command)))) diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index d0864b08f..46473990a 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -12,5 +12,5 @@ (defun +gist*list-render (orig-fn &rest args) (funcall orig-fn (car args) t) (unless (cadr args) - (doom-popup-buffer (current-buffer)))) + (pop-to-buffer (current-buffer)))) (advice-add #'gist-list-render :around #'+gist*list-render)) diff --git a/modules/tools/term/autoload.el b/modules/tools/term/autoload.el index efab41c95..25125e906 100644 --- a/modules/tools/term/autoload.el +++ b/modules/tools/term/autoload.el @@ -16,7 +16,7 @@ current project's root." (require 'multi-term) (let ((default-directory (if project-root (doom-project-root) default-directory)) (buffer (multi-term-get-buffer current-prefix-arg))) - (select-window (doom-popup-buffer buffer)) + (pop-to-buffer buffer) (setq multi-term-buffer-list (nconc multi-term-buffer-list (list buffer))) (multi-term-internal))) From d76f991c0ced99ed29d455746144bdc04fc9fe6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:30:27 -0500 Subject: [PATCH 0075/4235] feature/popup: clean up buffer processes too, if any --- modules/feature/popup/autoload.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index afee7594e..745dbaf7b 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -29,6 +29,8 @@ the buffer is visible, then set another timer and try again later." (with-demoted-errors "Error killing transient buffer: %s" (let ((inhibit-message (not doom-debug-mode))) (message "Cleaned up transient buffer: %s" buffer)) + (when-let* ((process (get-buffer-process (current-buffer)))) + (kill-process process)) (kill-buffer buffer))))) (defun +popup--init (window alist) From 5f9eb8c978400754b02685a3d437fc1d2e63fd91 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:48:10 -0500 Subject: [PATCH 0076/4235] Rewrite .travis.yml --- .travis.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index d1ba2d6a3..171d19996 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,13 @@ -language: emacs-lisp +language: generic sudo: false +branches: + only: + - master + - develop before_install: - - git clone https://github.com/rejeep/evm.git /home/travis/.evm - - export PATH="/home/travis/.evm/bin:$PATH" + - if [ ! -z "$EVM_EMACS" ]; then curl -fsSkL https://raw.github.com/rejeep/evm/master/go > x.sh && source ./x.sh; fi + - evm install $EVM_EMACS --use --skip - evm config path /tmp - - evm install $EVM_EMACS --use - cp init.test.el init.el - INSECURE=1 YES=1 make install env: @@ -13,4 +16,4 @@ env: - EVM_EMACS=emacs-25.3-travis script: - emacs --version - - make test + - DEBUG=1 make test From 24c2d3727d7b97c93b5804ec9542d1180ee24a1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:50:57 -0500 Subject: [PATCH 0077/4235] .travis.yml; forgot the PATH, remove condition --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 171d19996..88355604b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,8 @@ branches: - master - develop before_install: - - if [ ! -z "$EVM_EMACS" ]; then curl -fsSkL https://raw.github.com/rejeep/evm/master/go > x.sh && source ./x.sh; fi + - curl -fsSkL https://raw.github.com/rejeep/evm/master/go > x.sh && source ./x.sh + - export PATH="$EVM_DIR:$PATH" - evm install $EVM_EMACS --use --skip - evm config path /tmp - cp init.test.el init.el From 7ab7885edcb9768ae50b1d80547ed64042dfd5b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 03:51:51 -0500 Subject: [PATCH 0078/4235] Rewrite .travis.yml. Again. I need sleep. --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 88355604b..106b671b5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,10 @@ branches: - master - develop before_install: - - curl -fsSkL https://raw.github.com/rejeep/evm/master/go > x.sh && source ./x.sh - - export PATH="$EVM_DIR:$PATH" - - evm install $EVM_EMACS --use --skip + - git clone https://github.com/rejeep/evm.git /home/travis/.evm + - export PATH="/home/travis/.evm/bin:$PATH" - evm config path /tmp + - evm install $EVM_EMACS --use --skip - cp init.test.el init.el - INSECURE=1 YES=1 make install env: From 185bf58c9e8193dde85078ffe1b594148a92b9e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:01:48 -0500 Subject: [PATCH 0079/4235] lang/org: add elpa org to load-path in init.el #327 Let's try to change the load-path sooner... --- modules/lang/org/config.el | 7 ------- modules/lang/org/init.el | 9 +++++++++ 2 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 modules/lang/org/init.el diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index e46fe9c42..e9ce28cb3 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -3,13 +3,6 @@ (defvar +org-dir (expand-file-name "~/work/org/") "The directory where org files are kept.") -;; Ensure ELPA org is prioritized above built-in org. -(eval-and-compile - (when-let* ((path (locate-library "org" nil doom--base-load-path))) - (setq load-path - (delete (substring (file-name-directory path) 0 -1) - load-path)))) - ;; Sub-modules (if (featurep! +attach) (load! +attach)) (if (featurep! +babel) (load! +babel)) diff --git a/modules/lang/org/init.el b/modules/lang/org/init.el new file mode 100644 index 000000000..184da000b --- /dev/null +++ b/modules/lang/org/init.el @@ -0,0 +1,9 @@ +;;; lang/org/init.el -*- lexical-binding: t; -*- + +;; Ensure ELPA org is prioritized above built-in org. +(eval-and-compile + (when-let* ((path (locate-library "org" nil doom--base-load-path))) + (setq load-path + (delete (substring (file-name-directory path) 0 -1) + load-path)))) + From e894c074530036a3909f49098a6881b9326e0987 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:14:44 -0500 Subject: [PATCH 0080/4235] Load module init.el too from require! macro --- core/core-packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index c454ce6fd..ac09e0340 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -401,7 +401,9 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." module submodule) (doom-module-enable module submodule flags) `(condition-case-unless-debug ex - (load! config ,module-path t) + (progn + (load! init ,module-path t) + (load! config ,module-path t)) ('error (lwarn 'doom-modules :error "%s in '%s %s' -> %s" From 82abc8647a2b65c0c871050f59256e95ebef5d02 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:15:19 -0500 Subject: [PATCH 0081/4235] lang/org: remove recursive require (not necessary anymore?) --- modules/lang/org/config.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index e9ce28cb3..b287e2048 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -34,11 +34,6 @@ ;; (after! org - ;; Occasionally, Emacs encounters an error loading the built-in org, aborting - ;; the load. This results in a broken, partially loaded state. This require - ;; tries to set it straight. - (require 'org) - (defvaralias 'org-directory '+org-dir) (org-crypt-use-before-save-magic) From d738a8d13aa785d638633cdcc276c0d7d76f5a72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:15:36 -0500 Subject: [PATCH 0082/4235] lang/org: fix unit test --- modules/lang/org/test/org.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/lang/org/test/org.el b/modules/lang/org/test/org.el index 9b77e67db..b74e7f16e 100644 --- a/modules/lang/org/test/org.el +++ b/modules/lang/org/test/org.el @@ -1,9 +1,5 @@ ;;; lang/org/test/org.el -*- lexical-binding: t; -*- -(when (featurep 'org) - (unload-feature 'org t)) (require! :lang org) -(require 'org (locate-library "org" nil doom--package-load-path)) - ;; From 48b0a468d138a7e547385b23d507d06111be1ddc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:24:37 -0500 Subject: [PATCH 0083/4235] THOU SHALT NOT WORSHIP FALSE IDOLS, said the byte compiler And I obeyed. --- modules/feature/lookup/autoload/lookup.el | 2 ++ modules/feature/lookup/config.el | 4 ++-- modules/feature/popup/autoload.el | 3 --- modules/feature/popup/config.el | 2 +- modules/feature/workspaces/autoload/workspaces.el | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 03b19fe12..f219d00fb 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -180,6 +180,8 @@ Goes down a list of possible backends: (unless (string-empty-p pattern) (cl-pushnew pattern devdocs-search-history)))) +(defvar counsel-dash-docsets) +(defvar helm-dash-docsets) ;;;###autoload (defun +lookup/in-docsets (&optional query docsets) "TODO" diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 6ab555868..1b3f6a263 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -140,9 +140,9 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." collect `(defun ,hook-sym () (make-variable-buffer-local ',var-sym) - (cond ((eq (car docsets) :add) + (cond ((eq ',(car docsets) :add) `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) - ((eq (car docsets) :remove) + ((eq ',(car docsets) :remove) `(setq ,var-sym (cl-loop with to-delete = (list ,@(cdr docsets)) for docset in ,var-sym diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 745dbaf7b..50eca0535 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -315,9 +315,6 @@ with the :popup setting." prevent the popup(s) from messing up the UI (or vice versa)." `(let* ((in-popup-p (+popup-p)) (popups (+popup-windows)) - (popup-states - (cl-loop for p in popups - collect (cons (window-buffer p) (window-state-get p)))) +popup--last) (dolist (p popups) (+popup/close p 'force)) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 7e693a65d..a21b49770 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -143,7 +143,7 @@ ALIST supports one custom parameter: `size', which will resolve to (defun doom*ignore-window-parameters (orig-fn &rest args) "Allow *interactive* window moving commands to traverse popups." (cl-letf (((symbol-function #'windmove-find-other-window) - (lambda (direction &optional window ignore sign wrap mini) + (lambda (dir &optional arg window) (window-in-direction (pcase dir (`up 'above) (`down 'below) (_ dir)) window (bound-and-true-p +popup-mode) arg windmove-wrap-around t)))) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 410757a9c..d978d6981 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -507,7 +507,7 @@ the workspace and move to the next." (+workspace/delete frame-persp))))) ;;;###autoload -(defun +workspaces|per-project (&optional root) +(defun +workspaces|per-project () "Open a new workspace when switching to another project. Ensures the scratch (or dashboard) buffers are CDed into the project's root." From 45bc438c374378600d66cf117206876c0b1e1620 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:42:20 -0500 Subject: [PATCH 0084/4235] feature/popup: fix typo (writeable => writable) This prevented window parameters from being saved. --- modules/feature/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 50eca0535..ed256a132 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -146,7 +146,7 @@ current buffer." (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist) (dolist (prop +popup-window-parameters) - (push (cons prop 'writeable) window-persistent-parameters))) + (push (cons prop 'writable) window-persistent-parameters))) (t (remove-hook 'doom-unreal-buffer-functions #'+popup-p) (remove-hook 'doom-escape-hook #'+popup|close-on-escape) From f087f731ef602b0b4e55a7409eae3f8b97ab7bb3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:42:54 -0500 Subject: [PATCH 0085/4235] feature/popup: fix +popup/toggle --- modules/feature/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index ed256a132..4dfd02c76 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -268,7 +268,7 @@ This window parameter is ignored if FORCE-P is non-nil." the message buffer in a popup window." (interactive) (cond ((+popup-windows) - (+popup/close-all)) + (+popup/close-all t)) ((ignore-errors (+popup/restore))) ((display-buffer (get-buffer "*Messages*"))))) From 4df471e53a4299be4189ef0ab1e03a0d2d33a7d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:52:37 -0500 Subject: [PATCH 0086/4235] feature/popup: fix arrayp errors when killing transient buffers --- modules/feature/popup/autoload.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 4dfd02c76..cdf6b7af8 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -17,15 +17,14 @@ (window-parameter w 'alist) (window-state-get w))))) -(defun +popup--kill-buffer (buffer) +(defun +popup--kill-buffer (buffer ttl) "Tries to kill BUFFER, as was requested by a transient timer. If it fails, eg. the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) (if (get-buffer-window buffer) (with-current-buffer buffer (setq +popup--timer - (run-at-time (timer--time +popup--timer) - nil #'+popup--kill-buffer buffer))) + (run-at-time ttl nil #'+popup--kill-buffer buffer ttl))) (with-demoted-errors "Error killing transient buffer: %s" (let ((inhibit-message (not doom-debug-mode))) (message "Cleaned up transient buffer: %s" buffer)) @@ -71,7 +70,7 @@ and enables `+popup-buffer-mode'." (if (= ttl 0) (+popup--kill-buffer buffer) (setq +popup--timer - (run-at-time ttl nil #'+popup--kill-buffer buffer)))))))) + (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))))))) (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." From a9a731c1eb6f7d8738c5ee2e9728d5c704cd6115 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:56:12 -0500 Subject: [PATCH 0087/4235] feature/popup: replace alist param with popup --- modules/feature/popup/autoload.el | 7 +++---- modules/feature/popup/config.el | 7 ++++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index cdf6b7af8..616526f0f 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -14,7 +14,6 @@ (setq +popup--last (cl-loop for w in windows collect (list (window-buffer w) - (window-parameter w 'alist) (window-state-get w))))) (defun +popup--kill-buffer (buffer ttl) @@ -37,9 +36,9 @@ the buffer is visible, then set another timer and try again later." default window parameters for popup windows, clears leftover transient timers and enables `+popup-buffer-mode'." (with-selected-window window + (set-window-parameter window 'popup t) (set-window-parameter window 'no-other-window t) (set-window-parameter window 'delete-window #'+popup--destroy) - (set-window-parameter window 'alist alist) (window-preserve-size window (memq (window-parameter window 'window-side) '(left right)) t) (+popup--cancel-buffer-timer) @@ -277,9 +276,9 @@ the message buffer in a popup window." (interactive) (unless +popup--last (error "No popups to restore")) - (cl-loop for (buffer alist state) in +popup--last + (cl-loop for (buffer . state) in +popup--last if (and (buffer-live-p buffer) - (+popup-buffer buffer alist)) + (+popup-buffer buffer)) do (window-state-put state it)) (setq +popup--last nil)) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a21b49770..a93f844a9 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -1,7 +1,7 @@ ;;; config.el -*- lexical-binding: t; -*- (defconst +popup-window-parameters - '(transient quit select modeline alist) + '(transient quit select modeline popup) "A list of custom parameters to be added to `window-persistent-parameters'. Modifying this has no effect, unless done before feature/popup loads. @@ -32,8 +32,9 @@ Modifying this has no effect, unless done before feature/popup loads. CDR can be t (show the default modeline), a symbol representing the name of a modeline defined with `def-modeline!', or nil (show no modeline). -(alist . CDR) - This is an internal parameter and should not be set or modified. +(popup . BOOL) + If CDR is non-nil, this window is identified as a popup window. For internal + use! Do not change this. Since I can't find this information anywhere but the Emacs manual, I'll include a brief description of some native window parameters that Emacs uses: From eedd86135e1e8afcf15a26e1d65d442e04ecfa43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:56:39 -0500 Subject: [PATCH 0088/4235] feature/popup: add hacks for wgrep, org, persp-mode & balance-windows Plus +popup*close and +popup*save advice functions. --- modules/feature/popup/autoload.el | 15 +++++++++ modules/feature/popup/config.el | 54 ++++++++++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 616526f0f..bfc731cf3 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -324,3 +324,18 @@ prevent the popup(s) from messing up the UI (or vice versa)." (unless in-popup-p (select-window origin))))))) + +;; +;; Advice +;; + +;;;###autoload +(defun +popup*close (&rest _) + "TODO" + (+popup/close)) + +;;;###autoload +(defun +popup*save (orig-fn &rest args) + "Sets aside all popups before executing the original function, usually to +prevent the popup(s) from messing up the UI (or vice versa)." + (save-popups! (apply orig-fn args))) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a93f844a9..b4c45f0c1 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -141,6 +141,8 @@ ALIST supports one custom parameter: `size', which will resolve to ;; Hacks ;; +(advice-add #'balance-windows :around #'+popup*save) + (defun doom*ignore-window-parameters (orig-fn &rest args) "Allow *interactive* window moving commands to traverse popups." (cl-letf (((symbol-function #'windmove-find-other-window) @@ -154,7 +156,7 @@ ALIST supports one custom parameter: `size', which will resolve to (advice-add #'windmove-left :around #'doom*ignore-window-parameters) (advice-add #'windmove-right :around #'doom*ignore-window-parameters) - +;; `help-mode' (after! help-mode (defun doom--switch-from-popup (location) (let (origin) @@ -196,5 +198,55 @@ ALIST supports one custom parameter: `size', which will resolve to (require 'find-func) (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) +;; `wgrep' +(after! wgrep + ;; close the popup after you're done with a wgrep buffer + (advice-add #'wgrep-abort-changes :after #'+popup*close) + (advice-add #'wgrep-finish-edit :after #'+popup*close)) + +;; `org' +(after! org + (set! :popup "^ \\*Org todo" '((size . 5)) '((transient . 0))) + (set! :popup "^\\*Org Agenda" '((size . 20))) + + ;; Org has a scorched-earth window management system I'm not fond of. i.e. + ;; it kills all windows and monopolizes the frame. No thanks. We can do + ;; better with shackle's help. + (defun +popup*suppress-delete-other-windows (orig-fn &rest args) + (cl-letf (((symbol-function 'delete-other-windows) + (symbol-function 'ignore))) + (apply orig-fn args))) + (advice-add #'org-add-log-note :around #'+popup*suppress-delete-other-windows) + (advice-add #'org-capture-place-template :around #'+popup*suppress-delete-other-windows) + (advice-add #'org-export--dispatch-ui :around #'+popup*suppress-delete-other-windows) + + (defun +popup*org-pop-to-buffer (&rest args) + "Use `pop-to-buffer' instead of `switch-to-buffer' to open buffer.'" + (let ((buf (car args))) + (pop-to-buffer + (cond ((stringp buf) (get-buffer-create buf)) + ((bufferp buf) buf) + (t (error "Invalid buffer %s" buf)))))) + (advice-add #'org-switch-to-buffer-other-window :override #'+popup*org-pop-to-buffer) + + ;; `org-agenda' + (setq org-agenda-window-setup 'other-window + org-agenda-restore-windows-after-quit nil) + ;; Hide modeline in org-agenda + (add-hook 'org-agenda-finalize-hook #'doom-hide-modeline-mode) + (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) + ;; Don't monopolize frame! + (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) + +;; `persp-mode' +(after! persp-mode + (defun +popup*persp-mode-restore-popups (&rest _) + "Restore popup windows when loading a perspective from file." + (dolist (window (window-list)) + (when (+popup-parameter 'popup window) + (with-selected-window window + (+popup-buffer-mode +1))))) + (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) + (provide 'config) ;;; config.el ends here From 4f605d26cd06ce65a80b5a49fb6aedd1ad33734f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 04:57:54 -0500 Subject: [PATCH 0089/4235] (put '+popup-buffer-mode permanent-local{,-hook} t) --- modules/feature/popup/autoload.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index bfc731cf3..724d07548 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -158,6 +158,9 @@ current buffer." :init-value nil :keymap +popup-buffer-mode-map) +(put '+popup-buffer-mode 'permanent-local t) +(put '+popup-buffer-mode 'permanent-local-hook t) + ;; ;; Hooks From 25ec2bdcbb851d4639db620a74552e14494cd993 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 16:30:48 -0500 Subject: [PATCH 0090/4235] Fix kill-this-buffer killing popup buffer instead of window --- 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 b980c0788..6e73a38fc 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -527,7 +527,7 @@ instead)." `doom-fallback-buffer'." (let ((buf (current-buffer))) (cond ((window-dedicated-p) - (quit-window)) + (delete-window)) ((eq buf (doom-fallback-buffer)) (bury-buffer)) (t From eef808d795b8651371bab1d558c4c2bdfe338391 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 13:30:59 -0500 Subject: [PATCH 0091/4235] feature/popup: reduce state in window parameters & fix popup continuity + Fix list where cons should be + Update +popup-window-parameters docstring + Use display-buffer instead of +popup-buffer (no need to remember alist). This ensures restored popups (with +popup/restore) are truly identical to their former selves. --- modules/feature/popup/autoload.el | 8 ++++---- modules/feature/popup/config.el | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 724d07548..b10b53d9d 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -13,7 +13,7 @@ (cl-assert (cl-every #'windowp windows) t) (setq +popup--last (cl-loop for w in windows - collect (list (window-buffer w) + collect (cons (window-buffer w) (window-state-get w))))) (defun +popup--kill-buffer (buffer ttl) @@ -31,7 +31,7 @@ the buffer is visible, then set another timer and try again later." (kill-process process)) (kill-buffer buffer))))) -(defun +popup--init (window alist) +(defun +popup--init (window) "Initializes a popup window. Run any time a popup is opened. It sets the default window parameters for popup windows, clears leftover transient timers and enables `+popup-buffer-mode'." @@ -110,7 +110,7 @@ current buffer." (alist (+popup--normalize-alist alist)) (new-window (or (display-buffer-reuse-window buffer alist) (display-buffer-in-side-window buffer alist)))) - (+popup--init new-window alist) + (+popup--init new-window) (select-window (if (+popup-parameter 'select new-window) new-window @@ -281,7 +281,7 @@ the message buffer in a popup window." (error "No popups to restore")) (cl-loop for (buffer . state) in +popup--last if (and (buffer-live-p buffer) - (+popup-buffer buffer)) + (display-buffer buffer)) do (window-state-put state it)) (setq +popup--last nil)) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index b4c45f0c1..5ee9f3345 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -32,9 +32,9 @@ Modifying this has no effect, unless done before feature/popup loads. CDR can be t (show the default modeline), a symbol representing the name of a modeline defined with `def-modeline!', or nil (show no modeline). -(popup . BOOL) - If CDR is non-nil, this window is identified as a popup window. For internal - use! Do not change this. +(popup . t) + This is for internal use, do not change this. It simply marks a window as a + popup window. Since I can't find this information anywhere but the Emacs manual, I'll include a brief description of some native window parameters that Emacs uses: From eab079724deebd6c7eca42ad59da9b01a58b58c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 16:37:31 -0500 Subject: [PATCH 0092/4235] feature/popup: add inhibit-timers letvar Allows us to disable timer functionality when we're simply setting popup buffers aside temporarily. --- modules/feature/popup/autoload.el | 5 +++-- modules/feature/popup/config.el | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index b10b53d9d..a27655b55 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -62,12 +62,12 @@ and enables `+popup-buffer-mode'." ;; t = default ;; integer = ttl ;; nil = no timer - (when ttl + (when (and ttl (not +popup--inhibit-transient)) (when (eq ttl t) (setq ttl +popup-ttl)) (cl-assert (integerp ttl) t) (if (= ttl 0) - (+popup--kill-buffer buffer) + (+popup--kill-buffer buffer 0) (setq +popup--timer (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))))))) @@ -316,6 +316,7 @@ with the :popup setting." prevent the popup(s) from messing up the UI (or vice versa)." `(let* ((in-popup-p (+popup-p)) (popups (+popup-windows)) + (+popup--inhibit-transient t) +popup--last) (dolist (p popups) (+popup/close p 'force)) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 5ee9f3345..316a50e88 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -77,6 +77,7 @@ deleted.") "Active keymap in popup windows. See `+popup-buffer-mode'.") +(defvar +popup--inhibit-transient nil) (defvar +popup--display-buffer-alist nil) (defvar +popup--old-display-buffer-alist nil) (defvar +popup--remember-last t) From 03d77c0bef564a23d032c0c66499cfd93be6ebe5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 16:38:37 -0500 Subject: [PATCH 0093/4235] feature/popup: fix 'Cancelled timer' spam https://youtu.be/fn4jIlFwuLU --- modules/feature/popup/autoload.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index a27655b55..add331eb7 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -3,7 +3,8 @@ (defun +popup--cancel-buffer-timer () "Cancel the current buffer's transient timer." (when (timerp +popup--timer) - (message "Cancelled timer") + (let ((inhibit-message (not doom-debug-mode))) + (message "Cancelled timer in %s" (current-buffer))) (cancel-timer +popup--timer) (setq +popup--timer nil)) t) From fcd87f6f6901ea2bbd725a26eb83d26f5e1c2d44 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 16:40:16 -0500 Subject: [PATCH 0094/4235] feature/popup: fix balance-windows freezes with neotree neotree's own advice around balance-windows caused little freezes while splitting/closing windows, while a neotree pane was open. Not on my watch. --- modules/feature/popup/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 316a50e88..e4d3569f0 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -199,6 +199,10 @@ ALIST supports one custom parameter: `size', which will resolve to (require 'find-func) (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) +;; `neotree' +(after! neotree + (advice-remove #'balance-windows #'ad-Advice-balance-windows)) + ;; `wgrep' (after! wgrep ;; close the popup after you're done with a wgrep buffer From 0042a56d02912813cf267e5b3bc7d11e22b4e3b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 17:00:14 -0500 Subject: [PATCH 0095/4235] Add new cache library (persistent-soft wrapper) --- core/autoload/cache.el | 97 ++++++++++++++++++++++++++++++ core/autoload/packages.el | 10 +-- core/core-lib.el | 1 - modules/feature/services/config.el | 12 +--- 4 files changed, 104 insertions(+), 16 deletions(-) create mode 100644 core/autoload/cache.el diff --git a/core/autoload/cache.el b/core/autoload/cache.el new file mode 100644 index 000000000..c4392be0a --- /dev/null +++ b/core/autoload/cache.el @@ -0,0 +1,97 @@ +;;; ../core/autoload/cache.el -*- lexical-binding: t; -*- + +;; This little library thinly wraps around persistent-soft (which is a pcache +;; wrapper, how about that). It has three purposes: +;; +;; + To encapsulate the cache backend (persistent-soft/pcache in this case), in +;; case it needs to change. +;; + To provide `doom-cache-persist': a mechanism for easily persisting +;; variables across Emacs sessions. +;; + To lazy-load persistent-soft until it is really needed. +;; +;; Like persistent-soft, caches assume a 2-tier structure, where all caches are +;; namespaced by location. + +(require 'persistent-soft) + +(defvar doom-cache-alists () + "An alist of alists, containing lists of variables for the doom cache library +to persist across Emacs sessions.") + +(defvar doom-cache-location 'doom + "The default location for cache files. This symbol is translated into a file +name under `pcache-directory' (by default a subdirectory under +`doom-cache-dir'). One file may contain multiple cache entries.") + +(defun doom|save-persistent-cache () + "Hook to run when an Emacs session is killed. Saves all persisted variables +listed in `doom-cache-alists' to files." + (dolist (alist doom-cache-alists) + (cl-loop with key = (car alist) + for var in (cdr alist) + if (symbol-value var) + do (doom-cache-set var it nil key)))) +(add-hook 'kill-emacs-hook #'doom|save-persistent-cache) + + +;; +;; Library +;; + +;;;###autoload +(defmacro with-cache! (location &rest body) + "Runs BODY with a different default `doom-cache-location'." + (declare (indent defun)) + `(let ((doom-cache-location ',location)) + ,@body)) + +;;;###autoload +(defun doom-cache-persist (location variables) + "Persist VARIABLES (list of symbols) in LOCATION (symbol). + +This populates these variables with cached values, if one exists, and saves them +to file when Emacs quits. + +Warning: this is incompatible with buffer-local variables." + (dolist (var variables) + (when (doom-cache-exists var location) + (set var (doom-cache-get var location)))) + (map-put doom-cache-alists location + (append variables (cdr (assq location doom-cache-alists))))) + +;;;###autoload +(defun doom-cache-desist (location &optional variables) + "Unregisters VARIABLES (list of symbols) in LOCATION (symbol) from +`doom-cache-alists', thus preventing them from being saved between sessions. +Does not affect the actual variables themselves or their values." + (if variables + (map-put doom-cache-alists location + (cl-set-difference (cdr (assq location doom-cache-alists)) + variables)) + (map-delete doom-cache-alists location))) + +;;;###autoload +(defun doom-cache-get (key &optional location) + "Retrieve KEY from LOCATION (defaults to `doom-cache-location'), if it exists +and hasn't expired." + (persistent-soft-fetch + key (symbol-name (or location doom-cache-location)))) + +;;;###autoload +(defun doom-cache-set (key value &optional ttl location) + "Set KEY to VALUE in the cache. TTL is the time (in seconds) until this cache +entry expires. LOCATION is the super-key to store this cache item under; the +default is `doom-cache-location'. " + (persistent-soft-store + key value + (symbol-name (or location doom-cache-location)) ttl)) + +;;;###autoload +(defun doom-cache-exists (key &optional location) + "Returns t if KEY exists at LOCATION (defaults to `doom-cache-location')." + (persistent-soft-exists-p key (or location doom-cache-location))) + +;;;###autoload +(defun doom-cache-clear (&optional location) + "Clear a cache LOCATION (defaults to `doom-cache-location')." + (persistent-soft-flush (or location doom-cache-location))) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 1e59fb4dd..1eb4ec417 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -1,22 +1,22 @@ ;;; core/autoload/packages.el -*- lexical-binding: t; -*- +(load! cache) (require 'use-package) (require 'quelpa) - -(defvar doom--last-refresh nil) +(require 'async) ;;;###autoload (defun doom-refresh-packages (&optional force-p) "Refresh ELPA packages." (when force-p (doom-refresh-clear-cache)) - (unless (or (persistent-soft-fetch 'last-pkg-refresh "emacs") + (unless (or (doom-cache-get 'last-pkg-refresh) doom--refreshed-p) (condition-case-unless-debug ex (progn (message "Refreshing package archives") (package-refresh-contents) - (persistent-soft-store 'last-pkg-refresh t "emacs" 900)) + (doom-cache-set 'last-pkg-refresh t 900)) ('error (doom-refresh-clear-cache) (message "Failed to refresh packages: (%s) %s" @@ -26,7 +26,7 @@ (defun doom-refresh-clear-cache () "Clear the cache for `doom-refresh-packages'." (setq doom--refreshed-p nil) - (persistent-soft-store 'last-pkg-refresh nil "emacs")) + (doom-cache-set 'last-pkg-refresh nil)) ;;;###autoload (defun doom-package-backend (name &optional noerror) diff --git a/core/core-lib.el b/core/core-lib.el index 5fbe58daf..61f1ea589 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -2,7 +2,6 @@ (require 'subr-x) (load "async-autoloads" nil t) -(load "persistent-soft-autoloads" nil t) (dolist (sym '(json-read json-read-file json-read-from-string json-encode)) (autoload sym "json")) (eval-and-compile diff --git a/modules/feature/services/config.el b/modules/feature/services/config.el index 6430a8864..8d8dcacfd 100644 --- a/modules/feature/services/config.el +++ b/modules/feature/services/config.el @@ -16,16 +16,8 @@ (set! :evil-state 'prodigy-mode 'emacs) ;; Make services, etc persistent between Emacs sessions - (setq prodigy-services (persistent-soft-fetch 'prodigy-services "prodigy") - prodigy-tags (persistent-soft-fetch 'prodigy-tags "prodigy") - prodigy-filters (persistent-soft-fetch 'prodigy-filters "prodigy")) - - (defun +services|save () - "Save all services, tags and filters to files." - (+services/cleanup) - (cl-loop for sym in '(prodigy-services prodigy-tags prodigy-filters) - do (persistent-soft-store sym (symbol-value sym) "prodigy"))) - (add-hook 'kill-emacs-hook #'+services|save) + (doom-cache-persist + :prodigy '(prodigy-services prodigy-tags prodigy-filters)) (defun +services*prodigy-services (orig-fn &rest args) "Adds a new :project property to prodigy services, which hides the service From 31a42446860e90261f3b45c5a93579850cdf0904 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 17:02:57 -0500 Subject: [PATCH 0096/4235] Rethink what Doom loads at startup and manually Better to simply load what we need, when we need it, rather than set up autoloads for every litte thing. --- core/autoload/packages.el | 1 + core/core-lib.el | 19 ++++++++++--------- core/core.el | 1 - modules/lang/go/autoload.el | 1 + modules/lang/javascript/autoload.el | 1 + modules/lang/php/autoload.el | 1 + modules/lang/php/config.el | 1 + 7 files changed, 15 insertions(+), 10 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 1eb4ec417..c335a4f3c 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -133,6 +133,7 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom//packages-update'." + (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages (dolist (pkg (doom-get-packages t)) diff --git a/core/core-lib.el b/core/core-lib.el index 61f1ea589..6ea99c594 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,14 +1,15 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(require 'subr-x) -(load "async-autoloads" nil t) -(dolist (sym '(json-read json-read-file json-read-from-string json-encode)) - (autoload sym "json")) -(eval-and-compile - (when (version< emacs-version "26") - (with-no-warnings - (defalias 'if-let* #'if-let) - (defalias 'when-let* #'when-let)))) +(let ((load-path doom--site-load-path)) + (require 'subr-x) + (require 'cl-lib) + (require 'map) + (eval-when-compile (require 'use-package))) + +(when (version< emacs-version "26") + (with-no-warnings + (defalias 'if-let* #'if-let) + (defalias 'when-let* #'when-let))) ;; diff --git a/core/core.el b/core/core.el index c61b84233..61d222d76 100644 --- a/core/core.el +++ b/core/core.el @@ -155,7 +155,6 @@ ability to invoke the debugger in debug mode." gc-cons-percentage 0.6 file-name-handler-alist nil)) - (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)) diff --git a/modules/lang/go/autoload.el b/modules/lang/go/autoload.el index 18a3e1ca6..5532e757c 100644 --- a/modules/lang/go/autoload.el +++ b/modules/lang/go/autoload.el @@ -8,6 +8,7 @@ "The last test run.") (defun +go--run-tests (args) + (require 'async) (save-selected-window (async-shell-command (concat "go test " args)))) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 3df1ecd03..cfc42d65c 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -11,6 +11,7 @@ ignore the cache." (gethash project-root +javascript-npm-conf)) (let ((package-file (expand-file-name "package.json" project-root))) (when-let* ((json (and (file-exists-p package-file) + (require 'json) (json-read-file package-file)))) (puthash project-root json +javascript-npm-conf)))))) diff --git a/modules/lang/php/autoload.el b/modules/lang/php/autoload.el index fc2fd8ca9..53ce77a57 100644 --- a/modules/lang/php/autoload.el +++ b/modules/lang/php/autoload.el @@ -10,5 +10,6 @@ ignore the cache." (or (and (not refresh-p) (gethash project-root +php-composer-conf)) (let ((package-file (expand-file-name "composer.json" project-root))) (when-let* ((data (and (file-exists-p package-file) + (require 'json) (json-read-file package-file)))) (puthash project-root data +php-composer-conf)))))) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 3dfc1aa4e..86d6ba3e2 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -58,6 +58,7 @@ ;; Make expensive php-extras generation async (unless (file-exists-p (concat php-extras-eldoc-functions-file ".el")) (message "Generating PHP eldoc files...") + (require 'async) (async-start `(lambda () ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") (require 'php-extras-gen-eldoc) From 0c3484414c068df807feeb3d732e4ad2cd807159 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 18:45:20 -0500 Subject: [PATCH 0097/4235] Fix dashboard replacing warnings buffer in popup at startup It makes the dashboard screen a mess! --- modules/feature/workspaces/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 871c9ca12..ecb41dd47 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -75,8 +75,9 @@ renamed.") ;; The warnings buffer gets swallowed by creating `+workspaces-main', so ;; we display it manually, if it exists (fix #319). (when-let* ((warnings (get-buffer "*Warnings*"))) - (display-buffer-in-side-window - warnings '((window-height . shrink-window-if-larger-than-buffer)))))) + (save-excursion + (display-buffer-in-side-window + warnings '((window-height . shrink-window-if-larger-than-buffer))))))) (defun +workspaces|init-persp-mode () ;; Remap `buffer-list' to current workspace's buffers in `doom-buffer-list' From 5cd29479f449c2918e808bd4891e81f833467605 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 18:50:49 -0500 Subject: [PATCH 0098/4235] Refactor feature/evil hacks & advice; fix tests --- core/autoload/menu.el | 1 - core/core-lib.el | 75 --------------------- core/test/core-lib.el | 42 ------------ modules/feature/evil/autoload/evil.el | 96 +++++++++++++++++++++++++++ modules/feature/evil/config.el | 72 ++++++++------------ modules/feature/evil/test/evil.el | 43 +++++++++++- 6 files changed, 166 insertions(+), 163 deletions(-) diff --git a/core/autoload/menu.el b/core/autoload/menu.el index bd19bbc43..325595187 100644 --- a/core/autoload/menu.el +++ b/core/autoload/menu.el @@ -25,7 +25,6 @@ PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") (t default-directory)))) (cond ((stringp command) (with-current-buffer (get-buffer-create "*compilation*") - (setq command (doom-resolve-vim-path command)) (save-window-excursion (compile command)) (setq header-line-format diff --git a/core/core-lib.el b/core/core-lib.el index 6ea99c594..75eb54efc 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -48,81 +48,6 @@ "Return EXP wrapped in a list, or as-is if already a list." (if (listp exp) exp (list exp))) -(defun doom-resolve-vim-path (file-name) - "Take a path and resolve any vim-like filename modifiers in it. On top of the -classical vim modifiers, this adds support for: - - %:P Resolves to `doom-project-root'. - -See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers." - (let* (case-fold-search - (regexp (concat "\\(?:^\\|[^\\\\]\\)" - "\\([#%]\\)" - "\\(\\(?::\\(?:[PphtreS~.]\\|g?s[^:\t\n ]+\\)\\)*\\)")) - (matches - (cl-loop with i = 0 - while (and (< i (length file-name)) - (string-match regexp file-name i)) - do (setq i (1+ (match-beginning 0))) - and collect - (cl-loop for j to (/ (length (match-data)) 2) - collect (match-string j file-name))))) - (dolist (match matches) - (let ((flags (split-string (car (cdr (cdr match))) ":" t)) - (path (and buffer-file-name - (pcase (car (cdr match)) - ("%" (file-relative-name buffer-file-name)) - ("#" (save-excursion (other-window 1) (file-relative-name buffer-file-name)))))) - flag global) - (if (not path) - (setq path "") - (while flags - (setq flag (pop flags)) - (when (string-suffix-p "\\" flag) - (setq flag (concat flag (pop flags)))) - (when (string-prefix-p "gs" flag) - (setq global t - flag (substring flag 1))) - (setq path - (or (pcase (substring flag 0 1) - ("p" (expand-file-name path)) - ("~" (concat "~/" (file-relative-name path "~"))) - ("." (file-relative-name path default-directory)) - ("t" (file-name-nondirectory (directory-file-name path))) - ("r" (file-name-sans-extension path)) - ("e" (file-name-extension path)) - ("S" (shell-quote-argument path)) - ("h" - (let ((parent (file-name-directory (expand-file-name path)))) - (unless (equal (file-truename path) - (file-truename parent)) - (if (file-name-absolute-p path) - (directory-file-name parent) - (file-relative-name parent))))) - ("s" - (if (featurep 'evil) - (when-let* ((args (evil-delimited-arguments (substring flag 1) 2))) - (let ((pattern (evil-transform-vim-style-regexp (car args))) - (replace (cadr args))) - (replace-regexp-in-string - (if global pattern (concat "\\(" pattern "\\).*\\'")) - (evil-transform-vim-style-regexp replace) path t t - (unless global 1)))) - path)) - ("P" - (let ((default-directory (file-name-directory (expand-file-name path)))) - (abbreviate-file-name (doom-project-root)))) - (_ path)) - ""))) - ;; strip trailing slash, if applicable - (when (and (not (string= path "")) (equal (substring path -1) "/")) - (setq path (substring path 0 -1)))) - (setq file-name - (replace-regexp-in-string (format "\\(?:^\\|[^\\\\]\\)\\(%s\\)" - (regexp-quote (string-trim-left (car match)))) - path file-name t t 1)))) - (replace-regexp-in-string regexp "\\1" file-name t))) - ;; ;; Library diff --git a/core/test/core-lib.el b/core/test/core-lib.el index 30e59a690..d001f0aa9 100644 --- a/core/test/core-lib.el +++ b/core/test/core-lib.el @@ -32,48 +32,6 @@ (should (equal (doom-enlist 'a) '(a))) (should (equal (doom-enlist '(a)) '(a)))) -;; `doom-resolve-vim-path' -(def-test! resolve-vim-path - (cl-flet ((do-it #'doom-resolve-vim-path)) - ;; file modifiers - (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") - (default-directory "~/.emacs.d/test/modules/")) - (should (equal (do-it "%") "feature/test-evil.el")) - (should (equal (do-it "%:r") "feature/test-evil")) - (should (equal (do-it "%:r.elc") "feature/test-evil.elc")) - (should (equal (do-it "%:e") "el")) - (should (equal (do-it "%:p") (expand-file-name buffer-file-name))) - (should (equal (do-it "%:h") "feature")) - (should (equal (do-it "%:t") "test-evil.el")) - (should (equal (do-it "%:.") "feature/test-evil.el")) - (should (equal (do-it "%:~") "~/.emacs.d/test/modules/feature/test-evil.el")) - (should (equal (file-truename (do-it "%:p")) - (file-truename buffer-file-name)))) - ;; nested file modifiers - (let ((buffer-file-name "~/vim/src/version.c") - (default-directory "~/vim/")) - (should (equal (do-it "%:p") (expand-file-name "~/vim/src/version.c"))) - (should (equal (do-it "%:p:.") "src/version.c")) - (should (equal (do-it "%:p:~") "~/vim/src/version.c")) - (should (equal (do-it "%:h") "src")) - (should (equal (do-it "%:p:h") (expand-file-name "~/vim/src"))) - (should (equal (do-it "%:p:h:h") (expand-file-name "~/vim"))) - (should (equal (do-it "%:t") "version.c")) - (should (equal (do-it "%:p:t") "version.c")) - (should (equal (do-it "%:r") "src/version")) - (should (equal (do-it "%:p:r") (expand-file-name "~/vim/src/version"))) - (should (equal (do-it "%:t:r") "version"))) - ;; empty file modifiers - (let (buffer-file-name default-directory) - (should (equal (do-it "%") "")) - (should (equal (do-it "%:r") "")) - (should (equal (do-it "%:e") "")) - (should (equal (do-it "%:h") "")) - (should (equal (do-it "%:t") "")) - (should (equal (do-it "%:.") "")) - (should (equal (do-it "%:~") "")) - (should (equal (do-it "%:P") ""))))) - ;; --- Macros ----------------------------- diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 893cf10bc..ea6c0a0c4 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -193,3 +193,99 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" (goto-char beg) (call-interactively #'wgrep-mark-deletion)) beg (1- end) nil)))) + + +;; +;; Advice +;; + +;;;###autoload +(defun +evil*static-reindent (orig-fn &rest args) + "Don't move cursor on indent." + (save-excursion (apply orig-fn args))) + +;;;###autoload +(defun +evil*restore-normal-state-on-windmove (orig-fn &rest args) + "If in anything but normal or motion mode when moving to another window, +restore normal mode. This prevents insert state from bleeding into other modes +across windows." + (unless (memq evil-state '(normal motion emacs)) + (evil-normal-state +1)) + (apply orig-fn args)) + +;;;###autoload +(defun +evil*resolve-vim-path (file-name) + "Take a path and resolve any vim-like filename modifiers in it. This adds +support for most vim file modifiers, as well as: + + %:P Resolves to `doom-project-root'. + +See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for +more information on modifiers." + (let* (case-fold-search + (regexp (concat "\\(?:^\\|[^\\\\]\\)" + "\\([#%]\\)" + "\\(\\(?::\\(?:[PphtreS~.]\\|g?s[^:\t\n ]+\\)\\)*\\)")) + (matches + (cl-loop with i = 0 + while (and (< i (length file-name)) + (string-match regexp file-name i)) + do (setq i (1+ (match-beginning 0))) + and collect + (cl-loop for j to (/ (length (match-data)) 2) + collect (match-string j file-name))))) + (dolist (match matches) + (let ((flags (split-string (car (cdr (cdr match))) ":" t)) + (path (and buffer-file-name + (pcase (car (cdr match)) + ("%" (file-relative-name buffer-file-name)) + ("#" (save-excursion (other-window 1) (file-relative-name buffer-file-name)))))) + flag global) + (if (not path) + (setq path "") + (while flags + (setq flag (pop flags)) + (when (string-suffix-p "\\" flag) + (setq flag (concat flag (pop flags)))) + (when (string-prefix-p "gs" flag) + (setq global t + flag (substring flag 1))) + (setq path + (or (pcase (substring flag 0 1) + ("p" (expand-file-name path)) + ("~" (concat "~/" (file-relative-name path "~"))) + ("." (file-relative-name path default-directory)) + ("t" (file-name-nondirectory (directory-file-name path))) + ("r" (file-name-sans-extension path)) + ("e" (file-name-extension path)) + ("S" (shell-quote-argument path)) + ("h" + (let ((parent (file-name-directory (expand-file-name path)))) + (unless (equal (file-truename path) + (file-truename parent)) + (if (file-name-absolute-p path) + (directory-file-name parent) + (file-relative-name parent))))) + ("s" + (if (featurep 'evil) + (when-let* ((args (evil-delimited-arguments (substring flag 1) 2))) + (let ((pattern (evil-transform-vim-style-regexp (car args))) + (replace (cadr args))) + (replace-regexp-in-string + (if global pattern (concat "\\(" pattern "\\).*\\'")) + (evil-transform-vim-style-regexp replace) path t t + (unless global 1)))) + path)) + ("P" + (let ((default-directory (file-name-directory (expand-file-name path)))) + (abbreviate-file-name (doom-project-root)))) + (_ path)) + ""))) + ;; strip trailing slash, if applicable + (when (and (not (string= path "")) (equal (substring path -1) "/")) + (setq path (substring path 0 -1)))) + (setq file-name + (replace-regexp-in-string (format "\\(?:^\\|[^\\\\]\\)\\(%s\\)" + (regexp-quote (string-trim-left (car match)))) + path file-name t t 1)))) + (replace-regexp-in-string regexp "\\1" file-name t))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 1b6f086ad..e2116ad26 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -45,9 +45,6 @@ (set! :popup "^\\*evil-registers" '((size . 0.3))) (set! :popup "^\\*Command Line" '((size . 8))) - ;; Don't interfere with localleader key - (define-key evil-motion-state-map "\\" nil) - ;; Set cursor colors later, once theme is loaded (defun +evil*init-cursors (&rest _) (setq evil-default-cursor (face-background 'cursor nil t) @@ -63,19 +60,11 @@ (dolist (mode '(help-mode debugger-mode)) (evil-set-initial-state mode 'normal)) - ;; make `try-expand-dabbrev' from `hippie-expand' work in minibuffer - ;; @see `he-dabbrev-beg', so we need re-define syntax for '/' - (defun minibuffer-inactive-mode-hook-setup () - (set-syntax-table (let* ((table (make-syntax-table))) - (modify-syntax-entry ?/ "." table) - table))) - (add-hook 'minibuffer-inactive-mode-hook #'minibuffer-inactive-mode-hook-setup) - ;; --- keybind fixes ---------------------- (map! (:after wgrep - ;; a wrapper that invokes `wgrep-mark-deletion' across lines - ;; you use `evil-delete' on. + ;; A wrapper that invokes `wgrep-mark-deletion' across lines you use + ;; `evil-delete' in wgrep buffers. :map wgrep-mode-map [remap evil-delete] #'+evil-delete) ;; replace native folding commands @@ -86,10 +75,6 @@ [remap evil-close-folds] #'+evil:fold-close-all [remap evil-open-folds] #'+evil:fold-open-all) - - ;; --- evil hacks ------------------------- - (advice-add #'evil-force-normal-state :after #'doom/escape) - (defun +evil|disable-highlights () "Disable ex search buffer highlights." (when (evil-ex-hl-active-p 'evil-ex-search) @@ -97,28 +82,40 @@ t)) (add-hook 'doom-escape-hook #'+evil|disable-highlights) - (defun +evil*restore-normal-state-on-windmove (orig-fn &rest args) - "If in anything but normal or motion mode when moving to another window, -restore normal mode. This prevents insert state from bleeding into other modes -across windows." - (unless (memq evil-state '(normal motion emacs)) - (evil-normal-state +1)) - (apply orig-fn args)) + + ;; --- evil hacks ------------------------- + ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. + (advice-add #'evil-force-normal-state :after #'doom/escape) + ;; Ensure buffer is in normal mode when we leave it and return to it. (advice-add #'windmove-do-window-select :around #'+evil*restore-normal-state-on-windmove) - - (defun +evil*static-reindent (orig-fn &rest args) - "Don't move cursor on indent." - (save-excursion (apply orig-fn args))) + ;; Don't move cursor when indenting (advice-add #'evil-indent :around #'+evil*static-reindent) - ;; monkey patch `evil-ex-replace-special-filenames' to add more ex ;; substitution flags to evil-mode - (advice-add #'evil-ex-replace-special-filenames :override #'doom-resolve-vim-path) + (advice-add #'evil-ex-replace-special-filenames :override #'+evil*resolve-vim-path) + + ;; make `try-expand-dabbrev' from `hippie-expand' work in minibuffer + ;; @see `he-dabbrev-beg', so we need re-define syntax for '/' + (defun +evil*fix-dabbrev-in-minibuffer () + (set-syntax-table (let* ((table (make-syntax-table))) + (modify-syntax-entry ?/ "." table) + table))) + (add-hook 'minibuffer-inactive-mode-hook #'+evil*fix-dabbrev-in-minibuffer) + + ;; Move to new split -- setting `evil-split-window-below' & + ;; `evil-vsplit-window-right' to non-nil mimics this, but that doesn't update + ;; window history. That means when you delete a new split, Emacs leaves you on + ;; the 2nd to last window on the history stack, which is jarring. + ;; + ;; Also recenters window on cursor in new split + (defun +evil*window-follow (&rest _) (evil-window-down 1) (recenter)) + (advice-add #'evil-window-split :after #'+evil*window-follow) + (defun +evil*window-vfollow (&rest _) (evil-window-right 1) (recenter)) + (advice-add #'evil-window-vsplit :after #'+evil*window-vfollow) ;; These arg types will highlight matches in the current buffer (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) - ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've ;; got to write my own argument type and interactive code to get it to do so. (evil-ex-define-argument-type global-delim-match :runner +evil-ex-global-delim-match) @@ -137,18 +134,7 @@ across windows." (evil-set-command-properties '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t) - - ;; Move to new split -- setting `evil-split-window-below' & - ;; `evil-vsplit-window-right' to non-nil mimics this, but that doesn't update - ;; window history. That means when you delete a new split, Emacs leaves you on - ;; the 2nd to last window on the history stack, which is jarring. - ;; - ;; Also recenters window on cursor in new split - (defun +evil*window-follow (&rest _) (evil-window-down 1) (recenter)) - (defun +evil*window-vfollow (&rest _) (evil-window-right 1) (recenter)) - (advice-add #'evil-window-split :after #'+evil*window-follow) - (advice-add #'evil-window-vsplit :after #'+evil*window-vfollow)) + '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t)) ;; diff --git a/modules/feature/evil/test/evil.el b/modules/feature/evil/test/evil.el index ffe6f92a1..9cad36c70 100644 --- a/modules/feature/evil/test/evil.el +++ b/modules/feature/evil/test/evil.el @@ -5,8 +5,47 @@ ;; ;; `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. +(def-test! resolve-vim-path + (cl-flet ((do-it #'evil-ex-replace-special-filenames)) + ;; file modifiers + (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") + (default-directory "~/.emacs.d/test/modules/")) + (should (equal (do-it "%") "feature/test-evil.el")) + (should (equal (do-it "%:r") "feature/test-evil")) + (should (equal (do-it "%:r.elc") "feature/test-evil.elc")) + (should (equal (do-it "%:e") "el")) + (should (equal (do-it "%:p") (expand-file-name buffer-file-name))) + (should (equal (do-it "%:h") "feature")) + (should (equal (do-it "%:t") "test-evil.el")) + (should (equal (do-it "%:.") "feature/test-evil.el")) + (should (equal (do-it "%:~") "~/.emacs.d/test/modules/feature/test-evil.el")) + (should (equal (file-truename (do-it "%:p")) + (file-truename buffer-file-name)))) + ;; nested file modifiers + (let ((buffer-file-name "~/vim/src/version.c") + (default-directory "~/vim/")) + (should (equal (do-it "%:p") (expand-file-name "~/vim/src/version.c"))) + (should (equal (do-it "%:p:.") "src/version.c")) + (should (equal (do-it "%:p:~") "~/vim/src/version.c")) + (should (equal (do-it "%:h") "src")) + (should (equal (do-it "%:p:h") (expand-file-name "~/vim/src"))) + (should (equal (do-it "%:p:h:h") (expand-file-name "~/vim"))) + (should (equal (do-it "%:t") "version.c")) + (should (equal (do-it "%:p:t") "version.c")) + (should (equal (do-it "%:r") "src/version")) + (should (equal (do-it "%:p:r") (expand-file-name "~/vim/src/version"))) + (should (equal (do-it "%:t:r") "version"))) + ;; empty file modifiers + (let (buffer-file-name default-directory) + (should (equal (do-it "%") "")) + (should (equal (do-it "%:r") "")) + (should (equal (do-it "%:e") "")) + (should (equal (do-it "%:h") "")) + (should (equal (do-it "%:t") "")) + (should (equal (do-it "%:.") "")) + (should (equal (do-it "%:~") "")) + (should (equal (do-it "%:P") ""))))) + (def-test! file-modifiers (cl-flet ((do-it #'evil-ex-replace-special-filenames)) (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") From 379914ccd7642543546a6020611f7940e21beca4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 22:46:07 -0500 Subject: [PATCH 0099/4235] doom-initialize: letbind load-path to site load-path instead PREMATURE OPTIMIZATION DETECTED. EXTERMINATE. EXTERMINATE. EXTERMINATE. --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index ac09e0340..de289fc59 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -134,7 +134,7 @@ startup." ;; Called early during initialization; only use native (and cl-lib) functions! (when (or force-p (not doom-init-p)) ;; Speed things up with a `load-path' for only the bare essentials - (let ((load-path doom--base-load-path)) + (let ((load-path doom--site-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) From 2eeb6ce0d95cdb589296fea70c23dcd35538cf8a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 23:49:58 -0500 Subject: [PATCH 0100/4235] :memo: Write feature/popup's readme --- modules/feature/popup/README.org | 145 ++++++++++++++++++++++++------- 1 file changed, 113 insertions(+), 32 deletions(-) diff --git a/modules/feature/popup/README.org b/modules/feature/popup/README.org index 69dbd236a..faeb51d73 100644 --- a/modules/feature/popup/README.org +++ b/modules/feature/popup/README.org @@ -1,49 +1,130 @@ #+TITLE: :feature popup -A short summary about what this module does. +This module provides a highly customizable popup window management system. -If necessary, include a longer description below it that goes into more detail. This may be as long as you like. +#+begin_quote +Not all windows are created equally. Some are less important. Some I want gone +once they have served their purpose, like code output or a help buffer. Others I +want to stick around, like a scratch buffer or org-capture popup. -+ If possible, include a list of features -+ Include links to major plugins that the module uses, if applicable -+ Use links whenever you can -+ Mention dependencies on other modules here +More than that, popups ought to be be the second class citizens of my editor; +spawned off to the side, discarded with the simple push of a button +(Escape/C-g), and easily restored if I want to see them again. Of course, this +system should clean up after itself and kill off buffers I mark as transient. +#+end_quote * Table of Contents :TOC: -- [[#install][Install]] - - [[#main-dependencies][Main dependencies]] - - [[#extra-dependencies][Extra Dependencies]] - [[#configuration][Configuration]] -- [[#usage][Usage]] + - [[#the-popup-setting][The ~:popup~ setting]] + - [[#disabling-aggressive-mode-line-hiding-in-popups][Disabling aggressive mode-line hiding in popups]] - [[#appendix][Appendix]] - [[#commands][Commands]] - [[#hacks][Hacks]] -* Install -** Main dependencies -*** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") -brew install x -#+END_SRC - -*** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S X -#+END_SRC - -** Extra Dependencies -+ A -+ B -+ C - -#+BEGIN_SRC sh -Y install A B C -#+END_SRC - * Configuration +** The ~:popup~ setting +This module has one setting for defining your own rules for popups: -* Usage +#+BEGIN_SRC emacs-lisp +(set! :popup CONDITION &optional ALIST PARAMETERS) +#+END_SRC + ++ ~CONDITION~ can be a function or regexp string. If the function returns + non-nil, or the regexp string matches the buffer's name, it will be opened in + a popup window. ++ ~ALIST~ dictates the characteristics of the popup, such as what side to spawn + it on and what size to make it. See ~display-buffer~'s documentation to see + what parameters are supported. + + This supports one custom parameter: ~size~, which will map to ~window-width~ + or ~window-height~ depending on what ~side~ you (or the defaults) specify. ++ ~PARAMETERS~ dictate what window parameters are set on the popup window. See + ~+popup-window-parameters~'s documentation and the [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Parameters.html#Window-Parameters][Window Parameters section + of the Emacs manual]] for what parameters are supported. + + This supports four custom parameters: =transient=, =quit=, =select= and + =modeline=. For details on these, look at the documentation for + ~+popup-window-parameters.~ + +Rules are added to ~display-buffer-alist~, which instructs ~display-buffer~ +calls on how to set up windows for buffers that meet certain conditions. + +#+begin_quote +The ~switch-to-buffer~ command (and its ~switch-to-buffer-*~ variants) are not +affected by ~display-buffer-alist~. +#+end_quote + +Here are a couple example rules: + +#+BEGIN_SRC emacs-lisp +(set! :popup "^ \\*") ; a fallback for special buffers +(set! :popup "^\\*" nil '((select . t))) +(set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) +(set! :popup "^\\*Help" + '((size . 0.2)) + '((select . t))) +(set! :+popup "^\\*doom:" + '((size . 0.35)) + '((select . t) (quit) (transient))) +#+END_SRC + +And here are the default settings for ALIST and PARAMETERS, which will be +overwritten if specified in your ~:popup~ rules. + +#+BEGIN_SRC emacs-lisp +(defvar +popup-default-alist + '((slot . 1) + (window-height . 0.14) + (window-width . 26) + (reusable-frames . visible)) + "The default alist for `display-buffer-alist' rules.") + +(defvar +popup-default-parameters + '((transient . t) + (quit . t)) + "The default window parameters.") +#+END_SRC + +** Disabling aggressive mode-line hiding in popups +There are two ways to go about this. You can turn on modelines by changing the +default ~'modeline~ window parameter in ~+popup-default-parameters~: + +#+BEGIN_SRC emacs-lisp +;; put in private/$USER/config.el +(map-put +popup-default-parameters 'modeline t) +#+END_SRC + +This will ensure all popups have a modeline /by default/, but allows you to override this on a per-popup basis. + +*Alternatively*, you can disable modeline-hiding entirely: + +#+BEGIN_SRC emacs-lisp +;; put in private/$USER/config.el +(remove-hook '+popup-buffer-mode-hook '+popup|set-modeline) +#+END_SRC * Appendix ** Commands ++ ~+popup/other~ (aliased to ~other-popup~, bound to ~C-x p~) ++ ~+popup/toggle~ ++ ~+popup/close~ ++ ~+popup/close-all~ ++ ~+popup/toggle~ ++ ~+popup/restore~ ++ ~+popup/raise~ ++ ~without-popups!~ ++ ~save-popups!~ ** Hacks ++ =help-mode= has been advised to follow file links in the buffer you were in + before entering the popup, rather than in a new window. ++ =wgrep= buffers are advised to close themselves when aborting or committing + changes. ++ =persp-mode= is advised to restore popup windows when loading a session from + file. ++ Interactive calls to ~windmove-*~ commands (used by ~evil-window-*~ commands) + will ignore the ~no-other-window~ window parameter, allowing you to switch to + popup windows as if they're ordinary windows. ++ ~balance-windows~ has been advised to close popups while it does its business, + then restores them afterwards. ++ =neotree= advises ~balance-windows~, which causes major slow-downs when paired + with our ~balance-window~ advice, so we removes neotree's advice. From 392f04446fc683e64f22f9e9bf86140f6e474e61 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 23:54:12 -0500 Subject: [PATCH 0101/4235] General refactor (use map.el more) + map-delete is shorter and faster than assq-delete-all + map-put is simpler than the delete-then-set workflow + map-merge is great for merging default and user settings --- core/autoload/packages.el | 4 ++-- core/core-editor.el | 3 +-- core/core-packages.el | 8 ++----- modules/app/email/config.el | 27 +++++++++-------------- modules/feature/lookup/autoload/lookup.el | 6 ++--- modules/feature/popup/autoload.el | 6 ++--- modules/feature/popup/config.el | 15 ++++++------- 7 files changed, 27 insertions(+), 42 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c335a4f3c..331eca2e7 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -205,7 +205,7 @@ Used by `doom//packages-install'." (when (and (not (package-installed-p name)) (quelpa-setup-p) (assq name quelpa-cache)) - (setq quelpa-cache (assq-delete-all name quelpa-cache)) + (map-delete quelpa-cache name) (quelpa-save-cache) (let ((path (expand-file-name (symbol-name name) quelpa-build-dir))) (when (file-exists-p path) @@ -304,7 +304,7 @@ package.el as appropriate." (unless (quelpa-setup-p) (error "Could not initialize QUELPA")) (when (assq name quelpa-cache) - (setq quelpa-cache (assq-delete-all name quelpa-cache)) + (map-delete quelpa-cache name) (quelpa-save-cache) (setq quelpa-p t)) (package-delete (cadr (assq name package-alist)) force-p) diff --git a/core/core-editor.el b/core/core-editor.el index 1592efdc2..a53f9b254 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -146,8 +146,7 @@ extension, try to guess one." ;; editorconfig to ignore indentation. I prefer dynamic indentation support ;; built into Emacs. (dolist (mode '(emacs-lisp-mode lisp-mode)) - (setq editorconfig-indentation-alist - (assq-delete-all mode editorconfig-indentation-alist))) + (map-delete editorconfig-indentation-alist mode)) (defvar whitespace-style) (defun doom|editorconfig-whitespace-mode-maybe (&rest _) diff --git a/core/core-packages.el b/core/core-packages.el index de289fc59..812b8e440 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -463,12 +463,8 @@ Accepts the following properties: (when-let* ((val (plist-get plist prop))) (plist-put plist prop (eval val)))) `(progn - (when ,(and pkg-pin t) - (cl-pushnew (cons ',name ,pkg-pin) package-pinned-packages - :test #'eq :key #'car)) - (when ,(and old-plist t) - (assq-delete-all ',name doom-packages)) - (push ',(cons name plist) doom-packages)))) + ,(if (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) + (map-put doom-packages ',name ',plist)))) (defmacro depends-on! (module submodule) "Declares that this module depends on another. diff --git a/modules/app/email/config.el b/modules/app/email/config.el index c447d2b0b..6805f0c3a 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -119,25 +119,20 @@ default/fallback account." ;; However, the real magic happens in `+email|gmail-fix-flags'. ;; ;; Gmail will handle the rest. - (setq mu4e-marks (assq-delete-all 'delete mu4e-marks)) - (setq mu4e-marks (assq-delete-all 'trash mu4e-marks)) - (push '(trash :char ("d" . "▼") - :prompt "dtrash" - :dyn-target (lambda (target msg) (mu4e-get-trash-folder msg)) - :action - (lambda (docid msg target) - (mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N"))) - mu4e-marks) + (defun +email--mark-seen (docid msg target) + (mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N")) + (map-delete mu4e-marks 'delete) + (map-put mu4e-marks 'trash + (list :char '("d" . "▼") + :prompt "dtrash" + :dyn-target (lambda (target msg) (mu4e-get-trash-folder msg)) + :action #'+email--mark-seen)) ;; Refile will be my "archive" function. - (setq mu4e-marks (assq-delete-all 'refile mu4e-marks)) - (push '(refile :char ("r" . "▶") - :prompt "refile" + (map-put mu4e-marks 'refile + (list :char '("r" . "▶") :prompt "refile" :show-target (lambda (target) "archive") - :action - (lambda (docid msg target) - (mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N"))) - mu4e-marks) + :action #'+email--mark-seen)) ;; This hook correctly modifies gmail flags on emails when they are marked. ;; Without it, refiling (archiving), trashing, and flagging (starring) email diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index f219d00fb..04896f3dc 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -14,8 +14,7 @@ "Search on: " (mapcar #'car +lookup-provider-url-alist) nil t))) - (push (cons key provider) - (assq-delete-all key +lookup--last-provider)))))) + (map-put +lookup--last-provider key provider))))) (defun +lookup--symbol-or-region (&optional initial) (cond (initial) @@ -227,8 +226,7 @@ for the provider." (user-error "The search query is empty")) (funcall +lookup-open-url-fn (format url (url-encode-url search)))) ('error - (setq +lookup--last-provider - (assq-delete-all major-mode +lookup--last-provider))))) + (map-delete +lookup--last-provider major-mode)))) ;;;###autoload (defun +lookup/online-select () diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index add331eb7..3864a71c2 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -76,13 +76,11 @@ and enables `+popup-buffer-mode'." "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." (if (not alist) (setq alist +popup-default-alist) - (require 'map) (let* ((alist (map-merge 'list +popup-default-alist alist)) (params (map-merge 'list +popup-default-parameters (cdr (assq 'window-parameters alist))))) - (setq alist (assq-delete-all 'window-parameters alist)) - (push (cons 'window-parameters params) alist) + (map-put alist 'window-parameters params) (nreverse alist)))) @@ -151,7 +149,7 @@ current buffer." (remove-hook 'doom-escape-hook #'+popup|close-on-escape) (setq display-buffer-alist +popup--old-display-buffer-alist) (dolist (prop +popup-window-parameters) - (assq-delete-all prop window-persistent-parameters))))) + (map-delete prop window-persistent-parameters))))) ;;;###autoload (define-minor-mode +popup-buffer-mode diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index e4d3569f0..4fb69c621 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -100,14 +100,13 @@ ALIST supports one custom parameter: `size', which will resolve to `(let ((alist ,alist) (parameters ,parameters)) ,(when alist - '(when-let* ((size (cdr (assq 'size alist)))) - (setq alist (assq-delete-all 'size alist)) - (push (cons (pcase (cdr (or (assq 'side alist) - (assq 'side +popup-default-alist))) - ((or `left `right) 'window-width) - (_ 'window-height)) - size) - alist))) + `(when-let* ((size (cdr (assq 'size alist))) + (side (cdr (assq 'side (append alist +popup-default-alist))))) + (map-delete alist 'size) + (map-put alist (if (memq side '(left right)) + 'window-width + 'window-height) + size))) (prog1 (push (append (list ,condition '(+popup-buffer)) alist (list (cons 'window-parameters parameters))) From 2734810060b846dc57d526a2d75bc3585eef3157 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 23:56:37 -0500 Subject: [PATCH 0102/4235] Show error when looking up dependency trees for built-in packages There's no obvious way to do this, and I don't think it's important enough to accommodate it. --- core/autoload/packages.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 331eca2e7..ad65dbf25 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -117,12 +117,16 @@ 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." + (when (package-built-in-p name) + (error "Can't get the dependency tree for built-in packages")) (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." + (when (package-built-in-p name) + (error "Can't get the dependency tree for built-in packages")) (package--get-deps name only)) ;;;###autoload From c0680e6fa30ad80fb91be520f20e98d56076e5a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Jan 2018 23:58:01 -0500 Subject: [PATCH 0103/4235] lang/org: refactor load-path mods & don't forget it Previously, Doom would forget lang/org's modification of the load-path if you call doom//reload-load-path (which is called when you do package management with an open Emacs session). No more! --- modules/lang/org/init.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/init.el b/modules/lang/org/init.el index 184da000b..52c15127d 100644 --- a/modules/lang/org/init.el +++ b/modules/lang/org/init.el @@ -2,8 +2,10 @@ ;; Ensure ELPA org is prioritized above built-in org. (eval-and-compile - (when-let* ((path (locate-library "org" nil doom--base-load-path))) - (setq load-path - (delete (substring (file-name-directory path) 0 -1) - load-path)))) + (when-let* ((old-path (locate-library "org" nil doom--base-load-path))) + (setq old-path (substring (file-name-directory old-path) 0 -1)) + (delete old-path load-path) + ;; We remove it from the base load path too so that `doom//reload-load-path' + ;; won't undo this modification. + (delete old-path doom--base-load-path))) From 25619908a27c9ceba176553ffade2ee345dab913 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 00:03:34 -0500 Subject: [PATCH 0104/4235] Narrow down the purpose of init & post-init hooks Essential hooks should be added to doom-init-hook. Non-essential and extra hooks should be added to doom-psot-init-hook. --- core/core-editor.el | 2 +- core/core-packages.el | 2 +- core/core.el | 5 +++-- modules/completion/ivy/config.el | 2 +- modules/feature/workspaces/config.el | 2 +- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index a53f9b254..4a882a67c 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -161,8 +161,8 @@ extension, try to guess one." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :hook (doom-init . smartparens-global-mode) :config + (smartparens-global-mode +1) (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 812b8e440..d05ed10aa 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -318,7 +318,7 @@ MODULES is an malformed plist of modules to load." (require 'server) (unless (server-running-p) (server-start))) - (add-hook 'doom-init-hook #'doom-packages--display-benchmark t) + (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark t) (message "Doom modules initialized")))) (defmacro def-package! (name &rest plist) diff --git a/core/core.el b/core/core.el index 61d222d76..ce7b07ea4 100644 --- a/core/core.el +++ b/core/core.el @@ -122,11 +122,12 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." ;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and ;; `window-setup-hook'. (defvar doom-init-hook nil - "A list of hooks run when DOOM is initialized, before `doom-post-init-hook'.") + "A list of hooks run when DOOM is initialized, before `doom-post-init-hook'. +Use this for essential functionality.") (defvar doom-post-init-hook nil "A list of hooks run after DOOM initialization is complete, and after -`doom-init-hook'.") +`doom-init-hook'. Use this for extra, non-essential functionality.") (defun doom-try-run-hook (fn hook) "Runs a hook wrapped in a `condition-case-unless-debug' block; its objective diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 139a7dbf0..d860a3a57 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -25,7 +25,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy :init - (add-hook 'doom-post-init-hook #'ivy-mode) + (add-hook 'doom-init-hook #'ivy-mode) :config (setq ivy-height 12 ivy-do-completion-in-region nil diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index ecb41dd47..3e3cdcbd9 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -40,7 +40,7 @@ renamed.") persp-auto-save-opt (if noninteractive 0 1)) ;; Bootstrap - (add-hook 'doom-post-init-hook #'+workspaces|init) + (add-hook 'doom-init-hook #'+workspaces|init) (add-hook 'after-make-frame-functions #'+workspaces|init) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) ;; only auto-save when real buffers are present From 2d9e63d5bb4ab7ed755c6fe5f3662f1f833253f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 00:08:30 -0500 Subject: [PATCH 0105/4235] General & minor refactoring --- core/test/autoload-package.el | 3 +-- modules/completion/company/config.el | 11 ++++------- modules/feature/eval/config.el | 2 +- modules/feature/popup/config.el | 14 +++++++------- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/core/test/autoload-package.el b/core/test/autoload-package.el index 5d074b0b7..22103070f 100644 --- a/core/test/autoload-package.el +++ b/core/test/autoload-package.el @@ -31,8 +31,7 @@ (should (eq (doom-package-backend 'org) 'emacs)))) (def-test! elpa-outdated-detection - (let* ((doom--last-refresh (current-time)) - (package-alist + (let* ((package-alist `((doom-dummy ,(-pkg 'doom-dummy '(20160405 1234))))) (package-archive-contents `((doom-dummy ,(-pkg 'doom-dummy '(20170405 1234)))))) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 6644ae417..2e2a44410 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -35,12 +35,9 @@ MODES should be one major-mode symbol or a list of them." company-require-match 'never company-global-modes '(not eshell-mode comint-mode erc-mode message-mode help-mode gud-mode) company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) - company-backends '(company-capf company-dabbrev company-ispell) + company-backends '(company-capf company-dabbrev company-ispell company-yasnippet) company-transformers '(company-sort-by-occurrence)) - (after! yasnippet - (nconc company-backends '(company-yasnippet))) - (global-company-mode +1)) @@ -71,16 +68,16 @@ MODES should be one major-mode symbol or a list of them." ;; -;; Autoloads +;; Included with company.el ;; (autoload 'company-capf "company-capf") -(autoload 'company-yasnippet "company-yasnippet") (autoload 'company-dabbrev "company-dabbrev") (autoload 'company-dabbrev-code "company-dabbrev-code") -(autoload 'company-etags "company-etags") (autoload 'company-elisp "company-elisp") +(autoload 'company-etags "company-etags") (autoload 'company-files "company-files") (autoload 'company-gtags "company-gtags") (autoload 'company-ispell "company-ispell") +(autoload 'company-yasnippet "company-yasnippet") diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 227e04d2c..1a2565dd6 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -67,7 +67,7 @@ function that creates and returns the REPL buffer." (add-hook 'quickrun--mode-hook #'nlinum-mode)) :config (set! :popup "^\\*\\(?:doom eval\\|Pp Eval Output\\|quickrun\\)" - '((window-height . 10)) '((transient . 0))) + '((window-height . 0.2)) '((transient . 0))) (defun +eval*quickrun-auto-close (&rest _) "Allows us to silently re-run quickrun from within the quickrun buffer." diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 4fb69c621..91849ec51 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -19,7 +19,8 @@ Modifying this has no effect, unless done before feature/popup loads. If t, close the popup if ESC/C-g is pressed inside or outside of popups. If 'other, close this popup if ESC/C-g is pressed outside of any popup. This - is great for popups you just want to peek at and discard. + is great for popups you just want to peek at and discard, but might also + want to poke around in, without the risk of closing it from the inside. If 'current, close the current popup if ESC/C-g is pressed from inside of the popup. If nil, pressing ESC/C-g will never close this buffer. @@ -63,7 +64,7 @@ a brief description of some native window parameters that Emacs uses: (defvar +popup-default-parameters '((transient . t) (quit . t)) - "The default window parameters to add alists fed to `display-buffer-alist'.") + "The default window parameters.") (defvar +popup-ttl 10 "The default time-to-live for transient buffers whose popup buffers have been @@ -133,8 +134,7 @@ ALIST supports one custom parameter: `size', which will resolve to (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) (add-hook 'doom-init-ui-hook #'+popup-mode) -(add-hook '+popup-buffer-mode-hook #'+popup|adjust-fringes) -(add-hook '+popup-buffer-mode-hook #'+popup|set-modeline) +(add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes +popup|set-modeline)) ;; @@ -213,9 +213,9 @@ ALIST supports one custom parameter: `size', which will resolve to (set! :popup "^ \\*Org todo" '((size . 5)) '((transient . 0))) (set! :popup "^\\*Org Agenda" '((size . 20))) - ;; Org has a scorched-earth window management system I'm not fond of. i.e. - ;; it kills all windows and monopolizes the frame. No thanks. We can do - ;; better with shackle's help. + ;; Org has a scorched-earth window management system I'm not fond of. i.e. it + ;; kills all windows and monopolizes the frame. No thanks. We can do better + ;; ourselves. (defun +popup*suppress-delete-other-windows (orig-fn &rest args) (cl-letf (((symbol-function 'delete-other-windows) (symbol-function 'ignore))) From 7872faad3ac2c2e2e49ef9ceb8ddf7410140fd85 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 00:20:07 -0500 Subject: [PATCH 0106/4235] feature/popup: don't forcibly hide modeline in org-agenda popups --- modules/feature/popup/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 91849ec51..a8ae88dfd 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -237,7 +237,6 @@ ALIST supports one custom parameter: `size', which will resolve to (setq org-agenda-window-setup 'other-window org-agenda-restore-windows-after-quit nil) ;; Hide modeline in org-agenda - (add-hook 'org-agenda-finalize-hook #'doom-hide-modeline-mode) (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) ;; Don't monopolize frame! (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) From a5bb69cf6a73729d3192234f3be25ff09d3149c3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 00:35:23 -0500 Subject: [PATCH 0107/4235] Ensure *Messages* and *scratch* have a modeline --- modules/ui/doom-modeline/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 3e9106018..c4d16bdc1 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -604,10 +604,11 @@ Returns \"\" to not break --no-window-system." "Set the default modeline." (doom-set-modeline 'main t) - ;; This scratch buffer is already created and doesn't get a modeline. For the - ;; love of Emacs, someone give the man a modeline! - (with-current-buffer "*scratch*" - (doom-set-modeline 'main))) + ;; These buffers are already created and don't get modelines. For the love of + ;; Emacs, someone give the man a modeline! + (dolist (bname '("*scratch*" "*Messages*")) + (with-current-buffer bname + (doom-set-modeline 'main)))) (defun +doom-modeline|set-special-modeline () (doom-set-modeline 'special)) From 4024437cfb1e38fbf1ddfeed0a643e98b07c052d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 00:35:52 -0500 Subject: [PATCH 0108/4235] lang/latex: don't forcibly hide modeline --- modules/lang/latex/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 94e781d82..1c1876086 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -56,7 +56,6 @@ (add-hook! 'reftex-toc-mode-hook (reftex-toc-rescan) - (doom-hide-modeline-mode +1) (map! :local :e "j" #'next-line :e "k" #'previous-line From af58e321ddef7857f120b567228596bbef7ba699 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 00:36:46 -0500 Subject: [PATCH 0109/4235] Remove vestigial comment --- modules/feature/popup/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a8ae88dfd..4c6247107 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -236,7 +236,6 @@ ALIST supports one custom parameter: `size', which will resolve to ;; `org-agenda' (setq org-agenda-window-setup 'other-window org-agenda-restore-windows-after-quit nil) - ;; Hide modeline in org-agenda (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) ;; Don't monopolize frame! (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) From 29e25f5ea8ed9fc665937bb87edaadf1531456e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 01:51:42 -0500 Subject: [PATCH 0110/4235] feature/popup: use window-toggle-side-window Neat. `window-toggle-side-window` exists and essentially does what I wanted +popup/toggle to do. --- modules/feature/popup/autoload.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 3864a71c2..bd79154de 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -267,10 +267,9 @@ This window parameter is ignored if FORCE-P is non-nil." "If popups are open, close them. If they aren't, restore the last one or open the message buffer in a popup window." (interactive) - (cond ((+popup-windows) - (+popup/close-all t)) - ((ignore-errors (+popup/restore))) - ((display-buffer (get-buffer "*Messages*"))))) + (condition-case _ + (window-toggle-side-windows) + ('error (display-buffer (get-buffer "*Messages*"))))) ;;;###autoload (defun +popup/restore () From 60fdbf8643bb1ced6dd8bcf8a0a57274e4e1f2da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 01:58:37 -0500 Subject: [PATCH 0111/4235] doom/window-enlargen: use maximize-window instead Just discovered maximize-window, which I've been doing manually in doom/window-zoom. Bueno. --- core/autoload/ui.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 912a2bef6..e8d3673bc 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -58,8 +58,7 @@ windows (unlike `doom/window-zoom') Activate again to undo." (assoc ?_ register-alist)) (ignore (jump-to-register ?_)) (window-configuration-to-register ?_) - (doom-resize-window nil (truncate (/ (frame-width) 1.2)) t) - (doom-resize-window nil (truncate (/ (frame-height) 1.2))) + (maximize-window) t))) ;;;###autoload From 25a2973c52177c85240b2d9c2b8b8e32b56a4b86 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 02:33:57 -0500 Subject: [PATCH 0112/4235] feature/popup: make parameters support functions Now, the transient, quit, select and modeline parameters now accept a function FN. See `+popup-window-parameters` for details. (transient . (FN popup-buffer)) (quit . (FN popup-window)) (select . (FN popup-window)) (modeline . (FN popup-buffer)) --- modules/feature/popup/autoload.el | 58 +++++++++++++++++++------------ modules/feature/popup/config.el | 28 ++++++++++----- 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index bd79154de..60ffba420 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -53,8 +53,8 @@ and enables `+popup-buffer-mode'." + Either kills the buffer or sets a transient timer, if the window has a `transient' window parameter (see `+popup-window-parameters'). + And finally deletes the window!" - (let ((ttl (+popup-parameter 'transient window)) - (buffer (window-buffer window))) + (let ((buffer (window-buffer window)) + ttl) (let ((ignore-window-parameters t)) (delete-window window)) (unless (window-live-p window) @@ -63,14 +63,17 @@ and enables `+popup-buffer-mode'." ;; t = default ;; integer = ttl ;; nil = no timer - (when (and ttl (not +popup--inhibit-transient)) - (when (eq ttl t) - (setq ttl +popup-ttl)) - (cl-assert (integerp ttl) t) - (if (= ttl 0) - (+popup--kill-buffer buffer 0) - (setq +popup--timer - (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))))))) + (unless +popup--inhibit-transient + (setq ttl (+popup-parameter-fn 'transient window buffer)) + (when ttl + (when (eq ttl t) + (setq ttl +popup-ttl)) + (cl-assert (integerp ttl) t) + (if (= ttl 0) + (+popup--kill-buffer buffer 0) + (setq +popup--timer + (run-at-time ttl nil #'+popup--kill-buffer + buffer ttl))))))))) (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." @@ -110,10 +113,10 @@ current buffer." (new-window (or (display-buffer-reuse-window buffer alist) (display-buffer-in-side-window buffer alist)))) (+popup--init new-window) - (select-window - (if (+popup-parameter 'select new-window) - new-window - old-window)) + (let ((select (+popup-parameter 'select new-window))) + (if (functionp select) + (funcall select new-window old-window) + (select-window (if select new-window old-window)))) new-window)) ;;;###autoload @@ -121,6 +124,15 @@ current buffer." "Fetch the window parameter of WINDOW" (window-parameter (or window (selected-window)) parameter)) +;;;###autoload +(defun +popup-parameter-fn (parameter &optional window &rest args) + "Fetch the window PARAMETER (symbol) of WINDOW. If it is a function, run it +with ARGS to get its return value." + (let ((val (+popup-parameter parameter window))) + (if (functionp val) + (apply val args) + val))) + ;;;###autoload (defun +popup-windows () "Returns a list of all popup windows." @@ -178,15 +190,17 @@ disabled." + If one exists and it's a symbol, use `doom-modeline' to grab the format. + If non-nil, show the mode-line as normal. -+ If nil (or omitted), then hide the modeline entirely (the default)." ++ If nil (or omitted), then hide the modeline entirely (the default). ++ If a function, it takes the current buffer as its argument and must return one + of the above values." (if +popup-buffer-mode - (let ((modeline (+popup-parameter 'modeline))) - (cond ((or (eq modeline 'nil) + (let ((modeline (+popup-parameter-fn 'modeline nil (current-buffer)))) + (cond ((eq modeline 't)) + ((or (eq modeline 'nil) (not modeline)) (doom-hide-modeline-mode +1)) - ((and (symbolp modeline) - (not (eq modeline 't))) - (setq-local doom--modeline-format (doom-modeline modeline)) + ((symbolp modeline) + (setq doom--modeline-format (doom-modeline modeline)) (when doom--modeline-format (doom-hide-modeline-mode +1))))) (when doom-hide-modeline-mode @@ -237,7 +251,7 @@ This will do nothing if the popup's `quit' window parameter is either nil or (setq window (selected-window))) (when (and (+popup-p window) (or force-p - (memq (+popup-parameter 'quit window) + (memq (+popup-parameter-fn 'quit window window) '(t current)))) (when +popup--remember-last (+popup--remember (list window))) @@ -254,7 +268,7 @@ This window parameter is ignored if FORCE-P is non-nil." (let (targets +popup--remember-last) (dolist (window (+popup-windows)) (when (or force-p - (memq (+popup-parameter 'quit window) + (memq (+popup-parameter-fn 'quit window window) '(t other))) (push window targets))) (when targets diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 4c6247107..797f244c9 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -6,16 +6,20 @@ Modifying this has no effect, unless done before feature/popup loads. (transient . CDR) - CDR can be t, an integer or nil. It represents the number of seconds before - the buffer belonging to a closed popup window is killed. + CDR can be t, an integer, nil or a function that returns one of these. It + represents the number of seconds before the buffer belonging to a closed popup + window is killed. If t, CDR will default to `+popup-ttl'. If 0, the buffer is immediately killed. If nil, the buffer won't be killed. + If a function, it must return one of the other possible values above. It takes + the popup buffer as its sole argument. (quit . CDR) - CDR can be t, 'other, 'current or nil. This determines the behavior of the - ESC/C-g keys in or outside of popup windows. + CDR can be t, 'other, 'current, nil, or a function that returns one of these. + This determines the behavior of the ESC/C-g keys in or outside of popup + windows. If t, close the popup if ESC/C-g is pressed inside or outside of popups. If 'other, close this popup if ESC/C-g is pressed outside of any popup. This @@ -24,14 +28,22 @@ Modifying this has no effect, unless done before feature/popup loads. If 'current, close the current popup if ESC/C-g is pressed from inside of the popup. If nil, pressing ESC/C-g will never close this buffer. + If a function, it is checked each time ESC/C-g is pressed to determine the + fate of the popup window. This function takes one argument: the popup + window and must return one of the other possible values. -(select . BOOl) - CDR is a boolean that determines whether to focus the popup window after it - opens. +(select . CDR) + CDR can be a boolean or function. The boolean determines whether to focus the + popup window after it opens (non-nil) or focus the origin window (nil). + + If a function, it takes two arguments: the popup window and the source window + (where you were before the popup was opened). It does nothing else, and + ignores its return value. (modeline . CDR) CDR can be t (show the default modeline), a symbol representing the name of a - modeline defined with `def-modeline!', or nil (show no modeline). + modeline defined with `def-modeline!', nil (show no modeline) or a function + that returns one of these. The function takes one argument: the popup buffer. (popup . t) This is for internal use, do not change this. It simply marks a window as a From 84cba91e50a0c998c9b18b04773a1b9ab06b5455 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:39:28 -0500 Subject: [PATCH 0113/4235] feature/popup: remove default slot & window-width ...and fix :popup not mapping the size parameter to the correct dimension when no side is specified. --- modules/app/regex/config.el | 4 +++- modules/feature/popup/config.el | 6 ++---- modules/tools/password-store/config.el | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/app/regex/config.el b/modules/app/regex/config.el index 350875a6f..ba3912e35 100644 --- a/modules/app/regex/config.el +++ b/modules/app/regex/config.el @@ -47,5 +47,7 @@ https://mediatemple.net" "TODO") (set! :popup "^\\*doom-regex\\*$" '((size . 4)) '((quit))) -(set! :popup "^\\*doom-regex-groups" '((side . left)) '((select) (quit))) +(set! :popup "^\\*doom-regex-groups" + '((side . left) (size . 28)) + '((select) (quit))) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 797f244c9..89d24e051 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -67,9 +67,7 @@ a brief description of some native window parameters that Emacs uses: `pop-to-buffer'. Doom popups sets this. The default is nil.") (defvar +popup-default-alist - '((slot . 1) - (window-height . 0.14) - (window-width . 26) + '((window-height . 0.16) (reusable-frames . visible)) "The default alist for `display-buffer-alist' rules.") @@ -114,7 +112,7 @@ ALIST supports one custom parameter: `size', which will resolve to (parameters ,parameters)) ,(when alist `(when-let* ((size (cdr (assq 'size alist))) - (side (cdr (assq 'side (append alist +popup-default-alist))))) + (side (or (cdr (assq 'side (append alist +popup-default-alist))) 'bottom))) (map-delete alist 'size) (map-put alist (if (memq side '(left right)) 'window-width diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 71c5f1dbf..5463b4112 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -21,7 +21,7 @@ :commands pass :config (set! :evil-state 'pass-mode 'emacs) - (set! :popup "^\\*Password-Store" '((side . left)) '((quit))) + (set! :popup "^\\*Password-Store" '((side . left) (size . 0.25)) '((quit))) (map! :map pass-mode-map "j" #'pass-next-entry "k" #'pass-prev-entry From 878b5ae4e243468337e07c11a8cdb217644f6e1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:40:20 -0500 Subject: [PATCH 0114/4235] feature/popup: rethink default rules --- modules/feature/popup/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 89d24e051..82e76664a 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -131,15 +131,16 @@ ALIST supports one custom parameter: `size', which will resolve to ;; (eval-when-compile - (set! :popup "^ \\*") + (set! :popup "^ \\*" '((slot . -1))) (set! :popup "^\\*" nil '((select . t))) + (set! :popup "^\\*Completions" '((slot . -1)) '((transient . 0))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) (set! :popup "^\\*Help" - '((size . 0.2)) + '((slot . -1) (size . 0.2)) '((select . t))) - (set! :+popup "^\\*doom:" + (set! :popup "^\\*doom:" '((size . 0.35)) - '((select . t) (quit) (transient)))) + '((select . t) (modeline . t) (quit) (transient)))) (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) (add-hook 'doom-init-ui-hook #'+popup-mode) From 43c48a085f08480ac6fbbf2586ee3edb34e23868 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:40:50 -0500 Subject: [PATCH 0115/4235] feature/popup: improve org compatibility (fix #330) This update should fix Org Src buffers, as well as those todo/agenda commans/links mini popups. --- modules/feature/popup/config.el | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 82e76664a..a16dc1954 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -221,8 +221,9 @@ ALIST supports one custom parameter: `size', which will resolve to ;; `org' (after! org - (set! :popup "^ \\*Org todo" '((size . 5)) '((transient . 0))) - (set! :popup "^\\*Org Agenda" '((size . 20))) + (set! :popup "^ ?\\*Org \\(todo\\|Links\\)" '((slot . -1) (size . shrink-window-if-larger-than-buffer))) + (set! :popup "^\\*Org Agenda" '((slot . -1) (size . 20))) + (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) ;; Org has a scorched-earth window management system I'm not fond of. i.e. it ;; kills all windows and monopolizes the frame. No thanks. We can do better @@ -235,13 +236,22 @@ ALIST supports one custom parameter: `size', which will resolve to (advice-add #'org-capture-place-template :around #'+popup*suppress-delete-other-windows) (advice-add #'org-export--dispatch-ui :around #'+popup*suppress-delete-other-windows) - (defun +popup*org-pop-to-buffer (&rest args) + (defun doom*org-src-pop-to-buffer (buffer _context) + "Hand off the src-block window to the popup system by using `display-buffer' +instead of switch-to-buffer-*." + (if (eq org-src-window-setup 'switch-invisibly) ; for internal calls + (set-buffer buffer) + (display-buffer buffer))) + (advice-add #'org-src-switch-to-buffer :override #'doom*org-src-pop-to-buffer) + (setq org-src-window-setup 'other-window) + + ;; Ensure todo, agenda, and other minor popups are delegated to the popup system. + (defun +popup*org-pop-to-buffer (buf &optional _norecord) "Use `pop-to-buffer' instead of `switch-to-buffer' to open buffer.'" - (let ((buf (car args))) - (pop-to-buffer - (cond ((stringp buf) (get-buffer-create buf)) - ((bufferp buf) buf) - (t (error "Invalid buffer %s" buf)))))) + (pop-to-buffer + (cond ((stringp buf) (get-buffer-create buf)) + ((bufferp buf) buf) + (t (error "Invalid buffer %s" buf))))) (advice-add #'org-switch-to-buffer-other-window :override #'+popup*org-pop-to-buffer) ;; `org-agenda' From e481a2891ac9bd6969f3d1315e8167487c092805 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:42:33 -0500 Subject: [PATCH 0116/4235] feature/popup: minor refactor & remove provide --- modules/feature/popup/autoload.el | 2 +- modules/feature/popup/config.el | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 60ffba420..f8e3a5a9a 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -121,7 +121,7 @@ current buffer." ;;;###autoload (defun +popup-parameter (parameter &optional window) - "Fetch the window parameter of WINDOW" + "Fetch the window PARAMETER (symbol) of WINDOW" (window-parameter (or window (selected-window)) parameter)) ;;;###autoload diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a16dc1954..eefd87353 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -267,9 +267,6 @@ instead of switch-to-buffer-*." "Restore popup windows when loading a perspective from file." (dolist (window (window-list)) (when (+popup-parameter 'popup window) - (with-selected-window window - (+popup-buffer-mode +1))))) + (+popup--init window)))) (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) -(provide 'config) -;;; config.el ends here From dff4b03fff73d05706ad18c15d9b2c91d299f133 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:42:54 -0500 Subject: [PATCH 0117/4235] feature/popup: support user-defined delete-window parameter --- modules/feature/popup/autoload.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index f8e3a5a9a..f4549615a 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -39,10 +39,15 @@ and enables `+popup-buffer-mode'." (with-selected-window window (set-window-parameter window 'popup t) (set-window-parameter window 'no-other-window t) - (set-window-parameter window 'delete-window #'+popup--destroy) + (set-window-parameter + window 'delete-window + ;; if set, we still want to call `+popup--destroy' afterwards. + (if-let* ((fn (window-parameter window 'delete-window))) + (lambda (window) (funcall fn window) (+popup--destroy window)) + #'+popup--destroy)) (window-preserve-size - window (memq (window-parameter window 'window-side) '(left right)) t) - (+popup--cancel-buffer-timer) + window (memq (window-parameter window 'window-side) + '(left right)) t) (+popup-buffer-mode +1))) (defun +popup--destroy (window) From 81453de0c426242d42bdaf4a600182c16b7bf132 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:43:13 -0500 Subject: [PATCH 0118/4235] feature/popup: prompt to save unsaved buffers in popups --- modules/feature/popup/autoload.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index f4549615a..370248270 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -60,6 +60,12 @@ and enables `+popup-buffer-mode'." + And finally deletes the window!" (let ((buffer (window-buffer window)) ttl) + (when (and (buffer-file-name buffer) + (buffer-modified-p buffer)) + (with-current-buffer buffer + (if (y-or-n-p "Popup buffer is modified. Save it?") + (save-buffer) + (set-buffer-modified-p nil)))) (let ((ignore-window-parameters t)) (delete-window window)) (unless (window-live-p window) From 1c6d39db7f4f26c9097e37852a2d23c9e62081a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:43:41 -0500 Subject: [PATCH 0119/4235] feature/popup: ensure popups can get as small as they like Popups without modelines can take advantage of the extra lines bought with a smaller window-min-height. --- modules/feature/popup/autoload.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 370248270..367fbdc91 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -121,8 +121,9 @@ current buffer." "Open BUFFER in a popup window. ALIST describes its features." (let* ((old-window (selected-window)) (alist (+popup--normalize-alist alist)) - (new-window (or (display-buffer-reuse-window buffer alist) - (display-buffer-in-side-window buffer alist)))) + (new-window (let ((window-min-height 3)) + (or (display-buffer-reuse-window buffer alist) + (display-buffer-in-side-window buffer alist))))) (+popup--init new-window) (let ((select (+popup-parameter 'select new-window))) (if (functionp select) From a76de01f4fb1f673c5b639cdeaa20a32bbf8c239 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:44:43 -0500 Subject: [PATCH 0120/4235] feature/popup: move timer clearing into +popup-buffer-mode --- modules/feature/popup/autoload.el | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 367fbdc91..0913ac937 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -1,14 +1,5 @@ ;;; feature/popup/autoload.el -*- lexical-binding: t; -*- -(defun +popup--cancel-buffer-timer () - "Cancel the current buffer's transient timer." - (when (timerp +popup--timer) - (let ((inhibit-message (not doom-debug-mode))) - (message "Cancelled timer in %s" (current-buffer))) - (cancel-timer +popup--timer) - (setq +popup--timer nil)) - t) - (defun +popup--remember (windows) "Remember WINDOWS (a list of windows) for later restoration." (cl-assert (cl-every #'windowp windows) t) @@ -179,7 +170,12 @@ with ARGS to get its return value." (define-minor-mode +popup-buffer-mode "Minor mode for popup windows." :init-value nil - :keymap +popup-buffer-mode-map) + :keymap +popup-buffer-mode-map + (when (and +popup-buffer-mode (timerp +popup--timer)) + (let ((inhibit-message (not doom-debug-mode))) + (message "Cancelled timer in %s" (current-buffer))) + (cancel-timer +popup--timer) + (setq +popup--timer nil))) (put '+popup-buffer-mode 'permanent-local t) (put '+popup-buffer-mode 'permanent-local-hook t) From d2a4408877c09137383b37513d7d225aac17c12f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:44:58 -0500 Subject: [PATCH 0121/4235] feature/popup: add +popup|cleanup-rules hook --- modules/feature/popup/autoload.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 0913ac937..dd8385289 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -155,6 +155,7 @@ with ARGS to get its return value." (cond (+popup-mode (add-hook 'doom-unreal-buffer-functions #'+popup-p) (add-hook 'doom-escape-hook #'+popup|close-on-escape t) + (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist) (dolist (prop +popup-window-parameters) @@ -162,7 +163,9 @@ with ARGS to get its return value." (t (remove-hook 'doom-unreal-buffer-functions #'+popup-p) (remove-hook 'doom-escape-hook #'+popup|close-on-escape) + (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq display-buffer-alist +popup--old-display-buffer-alist) + (+popup|cleanup-rules) (dolist (prop +popup-window-parameters) (map-delete prop window-persistent-parameters))))) @@ -224,6 +227,16 @@ disabled." #'+popup/close #'+popup/close-all))) +;;;###autoload +(defun +popup|cleanup-rules () + "Cleans up any duplicate popup rules." + (interactive) + (cl-delete-duplicates + +popup--display-buffer-alist + :key #'car :test #'equal :from-end t) + (when +popup-mode + (setq display-buffer-alist +popup--display-buffer-alist))) + ;; ;; Commands From 5824e6795a678a5f303155cfee55135d7c2272c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:45:54 -0500 Subject: [PATCH 0122/4235] :memo: feature/popup: update readme --- modules/feature/popup/README.org | 53 +++++++++++++++++++------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/modules/feature/popup/README.org b/modules/feature/popup/README.org index faeb51d73..06a72e94f 100644 --- a/modules/feature/popup/README.org +++ b/modules/feature/popup/README.org @@ -19,6 +19,7 @@ system should clean up after itself and kill off buffers I mark as transient. - [[#disabling-aggressive-mode-line-hiding-in-popups][Disabling aggressive mode-line hiding in popups]] - [[#appendix][Appendix]] - [[#commands][Commands]] + - [[#library][Library]] - [[#hacks][Hacks]] * Configuration @@ -57,33 +58,20 @@ affected by ~display-buffer-alist~. Here are a couple example rules: #+BEGIN_SRC emacs-lisp -(set! :popup "^ \\*") ; a fallback for special buffers +(set! :popup "^ \\*" '((slot . -1))) ; fallback rule for special buffers (set! :popup "^\\*" nil '((select . t))) +(set! :popup "^\\*Completions" '((slot . -1)) '((transient . 0))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) (set! :popup "^\\*Help" - '((size . 0.2)) + '((slot . -1) (size . 0.2)) '((select . t))) -(set! :+popup "^\\*doom:" +(set! :popup "^\\*doom:" '((size . 0.35)) - '((select . t) (quit) (transient))) + '((select . t) (modeline . t) (quit) (transient))) #+END_SRC -And here are the default settings for ALIST and PARAMETERS, which will be -overwritten if specified in your ~:popup~ rules. - -#+BEGIN_SRC emacs-lisp -(defvar +popup-default-alist - '((slot . 1) - (window-height . 0.14) - (window-width . 26) - (reusable-frames . visible)) - "The default alist for `display-buffer-alist' rules.") - -(defvar +popup-default-parameters - '((transient . t) - (quit . t)) - "The default window parameters.") -#+END_SRC +Omitted parameters in a ~:popup~ rule will use the defaults set in +~+popup-default-alist~ and ~+popup-default-parameters~. ** Disabling aggressive mode-line hiding in popups There are two ways to go about this. You can turn on modelines by changing the @@ -112,8 +100,24 @@ This will ensure all popups have a modeline /by default/, but allows you to over + ~+popup/toggle~ + ~+popup/restore~ + ~+popup/raise~ -+ ~without-popups!~ -+ ~save-popups!~ +** Library ++ Functions + + ~+popup-p WINDOW~ + + ~+popup-buffer BUFFER &optional ALIST~ + + ~+popup-parameter PARAMETER &optional WINDOW~ + + ~+popup-parameter-fn PARAMETER &optional WINDOW~ + + ~+popup-windows~ ++ Macros + + ~without-popups!~ + + ~save-popups!~ ++ Hooks + + ~+popup|adjust-fringes~ + + ~+popup|set-modeline~ + + ~+popup|close-on-escape~ + + ~+popup|cleanup-rules~ ++ Minor modes + + ~+popup-mode~ + + ~+popup-buffer-mode~ ** Hacks + =help-mode= has been advised to follow file links in the buffer you were in before entering the popup, rather than in a new window. @@ -128,3 +132,8 @@ This will ensure all popups have a modeline /by default/, but allows you to over then restores them afterwards. + =neotree= advises ~balance-windows~, which causes major slow-downs when paired with our ~balance-window~ advice, so we removes neotree's advice. ++ =org-mode= is an ongoing (and huge) effort. It has a scorched-earth window + management system I'm not fond of. ie. it kills all windows and monopolizes + the frame. On top of that, it /really/ likes to use ~switch-to-buffer~ for + most of its buffer management, which completely bypasses + ~display-buffer-alist~. From 50abff78c8822b02b21d896bcd4fdf5d9a51c5c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:54:11 -0500 Subject: [PATCH 0123/4235] Fix doom-hide-modeline-mode not respecting doom--modeline-format feature/popup is using this mode to give certain windows special modelines. --- core/core-ui.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 6e73a38fc..dafb94739 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -92,12 +92,14 @@ disabled.") "Minor mode to hide the mode-line in the current buffer." :init-value nil :global nil - (if (not doom-hide-modeline-mode) - (setq mode-line-format doom--old-modeline-format - doom--old-modeline-format nil) - (setq doom--old-modeline-format mode-line-format - mode-line-format doom--modeline-format) - (add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset nil t)) + (cond (doom-hide-modeline-mode + (add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset nil t) + (setq mode-line-format (or doom--old-modeline-format doom--modeline-format) + doom--old-modeline-format nil)) + (t + (remove-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset t) + (setq mode-line-format doom--old-modeline-format + doom--old-modeline-format nil))) (force-mode-line-update)) ;; Ensure major-mode or theme changes don't overwrite these variables @@ -105,6 +107,7 @@ disabled.") (put 'doom--old-modeline-format 'permanent-local t) (put 'doom-hide-modeline-mode 'permanent-local t) (put 'doom-hide-modeline-mode 'permanent-local-hook t) +(put 'doom|hide-modeline-mode-reset 'permanent-local-hook t) (defun doom|hide-modeline-mode-reset () "Sometimes, a major-mode is activated after `doom-hide-modeline-mode' is From c586eee602a7f3895043fa197a1fda427c5853f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 05:55:45 -0500 Subject: [PATCH 0124/4235] ui/doom-modeline: don't forcibly hide modeline in org-src-mode --- modules/ui/doom-modeline/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index c4d16bdc1..992078d6e 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -629,5 +629,4 @@ Returns \"\" to not break --no-window-system." (add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) (add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) -(add-hook 'org-src-mode-hook #'+doom-modeline|set-special-modeline) (add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) From 8520c1243415e2feab35da275ed7ccfc256d820d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 06:19:54 -0500 Subject: [PATCH 0125/4235] which-key: don't replace current popup --- core/core-keybinds.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 9bd8070c5..056192185 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -49,7 +49,8 @@ If any hook returns non-nil, all hooks after it are ignored.") which-key-sort-uppercase-first nil which-key-add-column-padding 1 which-key-max-display-columns nil - which-key-min-display-lines 5) + which-key-min-display-lines 5 + which-key-side-window-slot -10) ;; embolden local bindings (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) From 51084852a6a3f74fdfcb0cd38bbbadfc1e9deed7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 06:24:56 -0500 Subject: [PATCH 0126/4235] Revert "feature/popup: use window-toggle-side-window" #298 This reverts commit 29e25f5ea8ed9fc665937bb87edaadf1531456e7. window-toggle-side-window isn't as robust as I had hoped. --- modules/feature/popup/autoload.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index dd8385289..f7a358f8f 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -302,9 +302,10 @@ This window parameter is ignored if FORCE-P is non-nil." "If popups are open, close them. If they aren't, restore the last one or open the message buffer in a popup window." (interactive) - (condition-case _ - (window-toggle-side-windows) - ('error (display-buffer (get-buffer "*Messages*"))))) + (cond ((+popup-windows) + (+popup/close-all t)) + ((ignore-errors (+popup/restore))) + ((display-buffer (get-buffer "*Messages*"))))) ;;;###autoload (defun +popup/restore () From 5f52e217960c8f4908060c7fbe17044efd401eb1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 06:44:32 -0500 Subject: [PATCH 0127/4235] feature/popup: fix incorrect delete-window window parameter #261 A bug that could make popup windows invulnerable to being closed. The horror! --- modules/feature/popup/autoload.el | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index f7a358f8f..5e069fd7d 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -30,12 +30,7 @@ and enables `+popup-buffer-mode'." (with-selected-window window (set-window-parameter window 'popup t) (set-window-parameter window 'no-other-window t) - (set-window-parameter - window 'delete-window - ;; if set, we still want to call `+popup--destroy' afterwards. - (if-let* ((fn (window-parameter window 'delete-window))) - (lambda (window) (funcall fn window) (+popup--destroy window)) - #'+popup--destroy)) + (set-window-parameter window 'delete-window #'+popup--destroy) (window-preserve-size window (memq (window-parameter window 'window-side) '(left right)) t) From e02f01b694befd306641fa9696676bacdbe91a12 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 06:46:41 -0500 Subject: [PATCH 0128/4235] feature/popup: make extra sure escape=>doom/escape in popups #261 --- modules/feature/popup/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index eefd87353..6ab3576a9 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -84,7 +84,13 @@ deleted.") "Active keymap in a session with the popup system enabled. See `+popup-mode'.") -(defvar +popup-buffer-mode-map (make-sparse-keymap) +(defvar +popup-buffer-mode-map + (let ((map (make-sparse-keymap))) + (when (featurep! :feature evil) + ;; for maximum escape coverage in emacs state buffers + (define-key map [escape] #'doom/escape) + (define-key map (kbd "ESC") #'doom/escape)) + map) "Active keymap in popup windows. See `+popup-buffer-mode'.") From 750f6ca1f580c40b8979ef9b5d3a353d1b5f7955 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 06:48:04 -0500 Subject: [PATCH 0129/4235] private/default: remove popup-buffer bindings Fixes prefix errors too --- modules/private/default/+bindings.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index eb915ba20..ded8ff005 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -723,10 +723,6 @@ "M-;" #'eval-expression "A-;" #'eval-expression) - (:when (featurep! :feature popup) - (:map +popup-buffer-mode-map - "M-w" #'delete-window)) - (:after tabulated-list (:map tabulated-list-mode-map [remap evil-record-macro] #'quit-window)) From 8f9175c25eb358928e5b32817bc1599c3ad7d0eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 13:06:42 -0500 Subject: [PATCH 0130/4235] feature/popup: fix popup window-parameters in Emacs 25.x #261 The window parameters of popup windows weren't being set in Emacs 25.x. Turns out `display-buffer-alist`'s ALIST argument didn't support the windows-parameters alist entry until Emacs 26. --- modules/feature/popup/autoload.el | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 5e069fd7d..2aece169c 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -1,5 +1,7 @@ ;;; feature/popup/autoload.el -*- lexical-binding: t; -*- +(defvar +popup--populate-wparams (version< emacs-version "26.1")) + (defun +popup--remember (windows) "Remember WINDOWS (a list of windows) for later restoration." (cl-assert (cl-every #'windowp windows) t) @@ -23,18 +25,24 @@ the buffer is visible, then set another timer and try again later." (kill-process process)) (kill-buffer buffer))))) -(defun +popup--init (window) +(defun +popup--init (window alist) "Initializes a popup window. Run any time a popup is opened. It sets the default window parameters for popup windows, clears leftover transient timers and enables `+popup-buffer-mode'." (with-selected-window window - (set-window-parameter window 'popup t) - (set-window-parameter window 'no-other-window t) - (set-window-parameter window 'delete-window #'+popup--destroy) (window-preserve-size window (memq (window-parameter window 'window-side) '(left right)) t) - (+popup-buffer-mode +1))) + (when +popup--populate-wparams + ;; Emacs 26+ will automatically map the window-parameters alist entry to + ;; the popup window, so we need this for Emacs 25.x users + (dolist (param (cdr (assq 'window-parameters alist))) + (set-window-parameter window (car param) (cdr param)))) + (set-window-parameter window 'popup t) + (set-window-parameter window 'no-other-window t) + (set-window-parameter window 'delete-window #'+popup--destroy) + (+popup-buffer-mode +1) + (run-hooks '+popup-create-window-hook))) (defun +popup--destroy (window) "Do housekeeping before destroying a popup window. @@ -110,7 +118,7 @@ current buffer." (new-window (let ((window-min-height 3)) (or (display-buffer-reuse-window buffer alist) (display-buffer-in-side-window buffer alist))))) - (+popup--init new-window) + (+popup--init new-window alist) (let ((select (+popup-parameter 'select new-window))) (if (functionp select) (funcall select new-window old-window) From 4bd74d96531aeda94f37c1d41f81787a6eceae82 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 15:03:45 -0500 Subject: [PATCH 0131/4235] Fix doom-cleanup-hook breaking if hook didn't return an integer --- core/autoload/buffers.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index edcc3de5d..fb893aeaa 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -252,7 +252,9 @@ ALL-P (universal argument), clean them up globally." (mapc #'kill-buffer buffers) (setq n (+ n (length buffers) (doom/cleanup-processes))) (dolist (hook doom-cleanup-hook) - (setq n (+ n (or (funcall hook) 1)))) + (let ((m (funcall hook))) + (when (integerp m) + (setq n (+ n m))))) (message "Cleaned up %s buffers" n) n)) From d675ade45df9b28f62ca50ff1c12fc44b7d52b8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 15:04:33 -0500 Subject: [PATCH 0132/4235] feature/popup: move hacks to +hacks.el --- modules/feature/popup/+hacks.el | 163 ++++++++++++++++++++++++++++++++ modules/feature/popup/config.el | 119 +---------------------- 2 files changed, 164 insertions(+), 118 deletions(-) create mode 100644 modules/feature/popup/+hacks.el diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el new file mode 100644 index 000000000..a34324e15 --- /dev/null +++ b/modules/feature/popup/+hacks.el @@ -0,0 +1,163 @@ +;;; feature/popup/+hacks.el -*- lexical-binding: t; -*- + +;; What follows are all the hacks needed to get various parts of Emacs and other +;; plugins to cooperate with the popup management system. Essentially, it comes +;; down to: +;; +;; 1. Making plugins that control their own window environment less greedy (e.g. +;; org agenda, trying to reconfigure the entire frame to pop up one tiny +;; window). +;; 2. Forcing plugins to use `display-buffer' and `pop-to-buffer' instead of +;; `switch-to-buffer' (which is unaffected by `display-buffer-alist', which +;; this module heavily relies on). +;; 3. Closing popups (temporarily) before functions that are highly destructive +;; to the illusion of popup control get run (with the use of the +;; `save-popups!' macro). +;; +;; Keep in mind, all this black magic may break in future updates, and will need +;; to be watched carefully for corner cases. +;; +;; Hacks should be kept in alphabetical order, named after the feature they +;; modify, and should follow a ;; `package-name' header line. + +;; +;; Core functions +;; + +;; Don't try to resize popup windows +(advice-add #'balance-windows :around #'+popup*save) + + +;; +;; External functions +;; + +;; `help-mode' +(after! help-mode + (defun doom--switch-from-popup (location) + (let (origin) + (save-popups! + (switch-to-buffer (car location) nil t) + (if (not (cdr location)) + (message "Unable to find location in file") + (goto-char (cdr location)) + (recenter) + (setq origin (selected-window)))) + (+popup/close) + (select-window origin))) + + ;; Help buffers use `pop-to-window' to decide where to open followed links, + ;; which can be unpredictable. It should *only* replace the original buffer we + ;; opened the popup from. To fix this these three button types need to be + ;; redefined to set aside the popup before following a link. + (define-button-type 'help-function-def + :supertype 'help-xref + 'help-function + (lambda (fun file) + (require 'find-func) + (when (eq file 'C-source) + (setq file (help-C-file-name (indirect-function fun) 'fun))) + (doom--switch-from-popup (find-function-search-for-symbol fun nil file)))) + + (define-button-type 'help-variable-def + :supertype 'help-xref + 'help-function + (lambda (var &optional file) + (when (eq file 'C-source) + (setq file (help-C-file-name var 'var))) + (doom--switch-from-popup (find-variable-noselect var file)))) + + (define-button-type 'help-face-def + :supertype 'help-xref + 'help-function + (lambda (fun file) + (require 'find-func) + (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) + + +;; `neotree' +(after! neotree + (advice-remove #'balance-windows #'ad-Advice-balance-windows)) + + +;; `org' +(after! org + (set! :popup "^ ?\\*Org \\(todo\\|Links\\)" '((slot . -1) (size . shrink-window-if-larger-than-buffer))) + (set! :popup "^\\*Org Agenda" '((slot . -1) (size . 20))) + (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) + + ;; Org has a scorched-earth window management system I'm not fond of. i.e. it + ;; kills all windows and monopolizes the frame. No thanks. We can do better + ;; ourselves. + (defun +popup*suppress-delete-other-windows (orig-fn &rest args) + (if +popup-mode + (cl-letf (((symbol-function 'delete-other-windows) + (symbol-function 'ignore))) + (apply orig-fn args)) + (apply orig-fn args))) + (advice-add #'org-add-log-note :around #'+popup*suppress-delete-other-windows) + (advice-add #'org-capture-place-template :around #'+popup*suppress-delete-other-windows) + (advice-add #'org-export--dispatch-ui :around #'+popup*suppress-delete-other-windows) + + (defun +popup*org-src-pop-to-buffer (orig-fn buffer _context) + "Hand off the src-block window to the popup system by using `display-buffer' +instead of switch-to-buffer-*." + (if +popup-mode + (if (eq org-src-window-setup 'switch-invisibly) ; for internal calls + (set-buffer buffer) + (display-buffer buffer)) + (funcall orig-fn buffer context))) + (advice-add #'org-src-switch-to-buffer :around #'+popup*org-src-pop-to-buffer) + (setq org-src-window-setup 'other-window) + + ;; Ensure todo, agenda, and other minor popups are delegated to the popup system. + (defun +popup*org-pop-to-buffer (orig-fn buf &optional norecord) + "Use `pop-to-buffer' instead of `switch-to-buffer' to open buffer.'" + (if +popup-mode + (pop-to-buffer + (cond ((stringp buf) (get-buffer-create buf)) + ((bufferp buf) buf) + (t (error "Invalid buffer %s" buf)))) + (funcall orig-fn buf norecord))) + (advice-add #'org-switch-to-buffer-other-window :around #'+popup*org-pop-to-buffer) + + ;; `org-agenda' + (setq org-agenda-window-setup 'other-window + org-agenda-restore-windows-after-quit nil) + (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) + ;; Don't monopolize frame! + (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) + + +;; `persp-mode' +(progn + (defun +popup*persp-mode-restore-popups (&rest _) + "Restore popup windows when loading a perspective from file." + (dolist (window (window-list)) + (when (+popup-parameter 'popup window) + (+popup--init window)))) + (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) + + +;; `wgrep' +(progn + ;; close the popup after you're done with a wgrep buffer + (advice-add #'wgrep-abort-changes :after #'+popup*close) + (advice-add #'wgrep-finish-edit :after #'+popup*close)) + + +;; `windmove' +(progn + ;; Users should be about to hop into popups easily, but Elisp shouldn't. + (defun doom*ignore-window-parameters (orig-fn &rest args) + "Allow *interactive* window moving commands to traverse popups." + (cl-letf (((symbol-function #'windmove-find-other-window) + (lambda (dir &optional arg window) + (window-in-direction + (pcase dir (`up 'above) (`down 'below) (_ dir)) + window (bound-and-true-p +popup-mode) arg windmove-wrap-around t)))) + (apply orig-fn args))) + (advice-add #'windmove-up :around #'doom*ignore-window-parameters) + (advice-add #'windmove-down :around #'doom*ignore-window-parameters) + (advice-add #'windmove-left :around #'doom*ignore-window-parameters) + (advice-add #'windmove-right :around #'doom*ignore-window-parameters)) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 6ab3576a9..a5a1cd889 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -158,121 +158,4 @@ ALIST supports one custom parameter: `size', which will resolve to ;; Hacks ;; -(advice-add #'balance-windows :around #'+popup*save) - -(defun doom*ignore-window-parameters (orig-fn &rest args) - "Allow *interactive* window moving commands to traverse popups." - (cl-letf (((symbol-function #'windmove-find-other-window) - (lambda (dir &optional arg window) - (window-in-direction - (pcase dir (`up 'above) (`down 'below) (_ dir)) - window (bound-and-true-p +popup-mode) arg windmove-wrap-around t)))) - (apply orig-fn args))) -(advice-add #'windmove-up :around #'doom*ignore-window-parameters) -(advice-add #'windmove-down :around #'doom*ignore-window-parameters) -(advice-add #'windmove-left :around #'doom*ignore-window-parameters) -(advice-add #'windmove-right :around #'doom*ignore-window-parameters) - -;; `help-mode' -(after! help-mode - (defun doom--switch-from-popup (location) - (let (origin) - (save-popups! - (switch-to-buffer (car location) nil t) - (if (not (cdr location)) - (message "Unable to find location in file") - (goto-char (cdr location)) - (recenter) - (setq origin (selected-window)))) - (+popup/close) - (select-window origin))) - - ;; Help buffers use `pop-to-window' to decide where to open followed links, - ;; which can be unpredictable. It should *only* replace the original buffer we - ;; opened the popup from. To fix this these three button types need to be - ;; redefined to set aside the popup before following a link. - (define-button-type 'help-function-def - :supertype 'help-xref - 'help-function - (lambda (fun file) - (require 'find-func) - (when (eq file 'C-source) - (setq file (help-C-file-name (indirect-function fun) 'fun))) - (doom--switch-from-popup (find-function-search-for-symbol fun nil file)))) - - (define-button-type 'help-variable-def - :supertype 'help-xref - 'help-function - (lambda (var &optional file) - (when (eq file 'C-source) - (setq file (help-C-file-name var 'var))) - (doom--switch-from-popup (find-variable-noselect var file)))) - - (define-button-type 'help-face-def - :supertype 'help-xref - 'help-function - (lambda (fun file) - (require 'find-func) - (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) - -;; `neotree' -(after! neotree - (advice-remove #'balance-windows #'ad-Advice-balance-windows)) - -;; `wgrep' -(after! wgrep - ;; close the popup after you're done with a wgrep buffer - (advice-add #'wgrep-abort-changes :after #'+popup*close) - (advice-add #'wgrep-finish-edit :after #'+popup*close)) - -;; `org' -(after! org - (set! :popup "^ ?\\*Org \\(todo\\|Links\\)" '((slot . -1) (size . shrink-window-if-larger-than-buffer))) - (set! :popup "^\\*Org Agenda" '((slot . -1) (size . 20))) - (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) - - ;; Org has a scorched-earth window management system I'm not fond of. i.e. it - ;; kills all windows and monopolizes the frame. No thanks. We can do better - ;; ourselves. - (defun +popup*suppress-delete-other-windows (orig-fn &rest args) - (cl-letf (((symbol-function 'delete-other-windows) - (symbol-function 'ignore))) - (apply orig-fn args))) - (advice-add #'org-add-log-note :around #'+popup*suppress-delete-other-windows) - (advice-add #'org-capture-place-template :around #'+popup*suppress-delete-other-windows) - (advice-add #'org-export--dispatch-ui :around #'+popup*suppress-delete-other-windows) - - (defun doom*org-src-pop-to-buffer (buffer _context) - "Hand off the src-block window to the popup system by using `display-buffer' -instead of switch-to-buffer-*." - (if (eq org-src-window-setup 'switch-invisibly) ; for internal calls - (set-buffer buffer) - (display-buffer buffer))) - (advice-add #'org-src-switch-to-buffer :override #'doom*org-src-pop-to-buffer) - (setq org-src-window-setup 'other-window) - - ;; Ensure todo, agenda, and other minor popups are delegated to the popup system. - (defun +popup*org-pop-to-buffer (buf &optional _norecord) - "Use `pop-to-buffer' instead of `switch-to-buffer' to open buffer.'" - (pop-to-buffer - (cond ((stringp buf) (get-buffer-create buf)) - ((bufferp buf) buf) - (t (error "Invalid buffer %s" buf))))) - (advice-add #'org-switch-to-buffer-other-window :override #'+popup*org-pop-to-buffer) - - ;; `org-agenda' - (setq org-agenda-window-setup 'other-window - org-agenda-restore-windows-after-quit nil) - (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) - ;; Don't monopolize frame! - (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) - -;; `persp-mode' -(after! persp-mode - (defun +popup*persp-mode-restore-popups (&rest _) - "Restore popup windows when loading a perspective from file." - (dolist (window (window-list)) - (when (+popup-parameter 'popup window) - (+popup--init window)))) - (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) - +(load! +hacks) From 742f5b26ed30b47412cad2b89d96f31e7d7b8579 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 15:25:35 -0500 Subject: [PATCH 0133/4235] Improve popup compatibility for eshell & multi-term --- modules/feature/popup/config.el | 3 +++ modules/tools/eshell/autoload/eshell.el | 2 +- modules/tools/eshell/config.el | 5 +---- modules/tools/term/config.el | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a5a1cd889..f48ec8f07 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -144,6 +144,9 @@ ALIST supports one custom parameter: `size', which will resolve to (set! :popup "^\\*Help" '((slot . -1) (size . 0.2)) '((select . t))) + (set! :popup "^\\*\\(?:term\\|doom eshell\\)" + '((size . 0.25)) + '((select . t) (quit) (transient . 0))) (set! :popup "^\\*doom:" '((size . 0.35)) '((select . t) (modeline . t) (quit) (transient)))) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index b15c4aa76..2b2fa81df 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -3,7 +3,7 @@ (defvar +eshell-buffers () "List of open eshell buffers.") -(defvar +eshell-buffer-name "*doom:eshell*" +(defvar +eshell-buffer-name "*doom eshell*" "The name to use for custom eshell buffers. This only affects `+eshell/open', `+eshell/open-popup' and `+eshell/open-workspace'.") diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 49efa7074..cc7ea5d6c 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -60,11 +60,8 @@ redefines its keys every time `eshell-mode' is enabled." :i "C-n" #'eshell-next-input :i "" #'eshell-next-input :m "" #'+eshell/evil-append - :n [remap evil-window-split] #'+eshell/split - :n [remap evil-window-vsplit] #'+eshell/vsplit :n [remap evil-record-macro] #'eshell-life-is-too-much - [remap kill-this-buffer] #'eshell-life-is-too-much - [remap +workspace/close-window-or-workspace] #'eshell-life-is-too-much)) + [remap kill-this-buffer] #'eshell-life-is-too-much)) (add-hook 'eshell-mode-hook #'+eshell|init-keymap) ;; Aliases diff --git a/modules/tools/term/config.el b/modules/tools/term/config.el index c3588e746..adb1d470b 100644 --- a/modules/tools/term/config.el +++ b/modules/tools/term/config.el @@ -4,4 +4,5 @@ :commands (multi-term multi-term-next multi-term-prev) :config (setq multi-term-program (getenv "SHELL") + multi-term-dedicated-window-height 20 multi-term-switch-after-close 'PREVIOUS)) From b11101d9cf7c5f9966ccd685cf4406bc216062da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 15:26:20 -0500 Subject: [PATCH 0134/4235] feature/popup: add rule for Compilation buffer --- modules/feature/popup/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index f48ec8f07..a270e01bb 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -140,6 +140,7 @@ ALIST supports one custom parameter: `size', which will resolve to (set! :popup "^ \\*" '((slot . -1))) (set! :popup "^\\*" nil '((select . t))) (set! :popup "^\\*Completions" '((slot . -1)) '((transient . 0))) + (set! :popup "^\\*Compilation" nil '((transient . 0) (quit . t))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) (set! :popup "^\\*Help" '((slot . -1) (size . 0.2)) From 5a420faa0fa8ecff7c3e0b0af608fd82d40b7bef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 18:22:56 -0500 Subject: [PATCH 0135/4235] feature/popup: tweak popup rules, add +popup-shrink-to-fit +popup-shrink-to-fit wraps shrink-window-if-larger-than-buffer, and won't do anything if the buffer is empty. --- modules/feature/popup/+hacks.el | 6 ++++-- modules/feature/popup/autoload.el | 10 ++++++++++ modules/feature/popup/config.el | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index a34324e15..74bebc3d4 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -82,9 +82,11 @@ ;; `org' (after! org - (set! :popup "^ ?\\*Org \\(todo\\|Links\\)" '((slot . -1) (size . shrink-window-if-larger-than-buffer))) + (set! :popup "^\\*Org \\(?:Links\\|Export Dispatcher\\|Select\\)" + '((slot . -1) (size . +popup-shrink-to-fit)) + '((select))) (set! :popup "^\\*Org Agenda" '((slot . -1) (size . 20))) - (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) + (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) ;; Org has a scorched-earth window management system I'm not fond of. i.e. it ;; kills all windows and monopolizes the frame. No thanks. We can do better diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 2aece169c..b68dc94fd 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -144,6 +144,16 @@ with ARGS to get its return value." "Returns a list of all popup windows." (cl-remove-if-not #'+popup-p (window-list))) +;;;###autoload +(defun +popup-shrink-to-fit (&optional window) + "Shrinks WINDOW to fit the buffer contents, if the buffer isn't empty. + +Uses `shrink-window-if-larger-than-buffer'." + (unless window + (setq window (selected-window))) + (unless (= (- (point-max) (point-min)) 0) + (shrink-window-if-larger-than-buffer window))) + ;; ;; Minor mode diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a270e01bb..34c157f0d 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -137,7 +137,7 @@ ALIST supports one custom parameter: `size', which will resolve to ;; (eval-when-compile - (set! :popup "^ \\*" '((slot . -1))) + (set! :popup "^ \\*" '((slot . -1) (size . +popup-shrink-to-fit))) (set! :popup "^\\*" nil '((select . t))) (set! :popup "^\\*Completions" '((slot . -1)) '((transient . 0))) (set! :popup "^\\*Compilation" nil '((transient . 0) (quit . t))) From 031e31c03c613e8b8fe0e003b04748e99b6fcfe9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 18:39:42 -0500 Subject: [PATCH 0136/4235] feature/popup: minor refactor --- modules/feature/popup/autoload.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index b68dc94fd..3c14b6da3 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -224,8 +224,7 @@ disabled." (not modeline)) (doom-hide-modeline-mode +1)) ((symbolp modeline) - (setq doom--modeline-format (doom-modeline modeline)) - (when doom--modeline-format + (when-let* ((doom--modeline-format (doom-modeline modeline))) (doom-hide-modeline-mode +1))))) (when doom-hide-modeline-mode (doom-hide-modeline-mode -1)))) @@ -235,10 +234,9 @@ disabled." "If called inside a popup, try to close that popup window (see `+popup/close'). If called outside, try to close all popup windows (see `+popup/close-all')." - (call-interactively - (if (+popup-p) - #'+popup/close - #'+popup/close-all))) + (if (+popup-p) + (+popup/close) + (+popup/close-all))) ;;;###autoload (defun +popup|cleanup-rules () @@ -315,10 +313,11 @@ This window parameter is ignored if FORCE-P is non-nil." "If popups are open, close them. If they aren't, restore the last one or open the message buffer in a popup window." (interactive) - (cond ((+popup-windows) - (+popup/close-all t)) - ((ignore-errors (+popup/restore))) - ((display-buffer (get-buffer "*Messages*"))))) + (let ((+popup--inhibit-transient t)) + (cond ((+popup-windows) + (+popup/close-all t)) + ((ignore-errors (+popup/restore))) + ((display-buffer (get-buffer "*Messages*")))))) ;;;###autoload (defun +popup/restore () From f9ab0cf767d693d8f3ee213fbbb35c0ac13a8c52 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 20:21:43 -0500 Subject: [PATCH 0137/4235] feature/popup: add multi-term, eshell and evil hacks --- modules/feature/popup/+hacks.el | 68 +++++++++++++++++++++++++++++++++ modules/feature/popup/config.el | 4 +- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 74bebc3d4..cc76bf96d 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -32,6 +32,69 @@ ;; External functions ;; +(after! eshell + (setq eshell-destroy-buffer-when-process-dies t) + + ;; When eshell runs a visual command (see `eshell-visual-commands'), it spawns + ;; a term buffer to run it in, but where it spawns it is the problem... + (defun +popup*eshell-undedicate-popup (orig-fn &rest args) + "Force spawned term buffer to share with the eshell popup (if necessary)." + (when (+popup-p) + (set-window-dedicated-p nil nil) + (add-transient-hook! #'eshell-query-kill-processes :after + (set-window-dedicated-p nil t))) + (apply orig-fn args)) + (advice-add #'eshell-exec-visual :around #'+popup*eshell-undedicate-popup)) + + +;; `evil' +(after! evil + (defun +popup*evil-command-window (hist cmd-key execute-fn) + "The evil command window has a mind of its own (uses `switch-to-buffer'). We +monkey patch it to use pop-to-buffer, and to remember the previous window." + (when (eq major-mode 'evil-command-window-mode) + (user-error "Cannot recursively open command line window")) + (dolist (win (window-list)) + (when (equal (buffer-name (window-buffer win)) + "*Command Line*") + (kill-buffer (window-buffer win)) + (delete-window win))) + (setq evil-command-window-current-buffer (current-buffer)) + (ignore-errors (kill-buffer "*Command Line*")) + (with-current-buffer (pop-to-buffer "*Command Line*") + (setq-local evil-command-window-execute-fn execute-fn) + (setq-local evil-command-window-cmd-key cmd-key) + (evil-command-window-mode) + (evil-command-window-insert-commands hist))) + + (defun +popup*evil-command-window-execute () + "Execute the command under the cursor in the appropriate buffer, rather than +the command buffer." + (interactive) + (let ((result (buffer-substring (line-beginning-position) + (line-end-position))) + (execute-fn evil-command-window-execute-fn) + (popup (selected-window))) + (select-window doom-popup-other-window) + (unless (equal evil-command-window-current-buffer (current-buffer)) + (user-error "Originating buffer is no longer active")) + ;; (kill-buffer "*Command Line*") + (doom/popup-close popup) + (funcall execute-fn result) + (setq evil-command-window-current-buffer nil))) + + ;; Make evil-mode cooperate with popups + (advice-add #'evil-command-window :override #'+popup*evil-command-window) + (advice-add #'evil-command-window-execute :override #'+popup*evil-command-window-execute) + + ;; Don't mess with popups + (advice-add #'+evil--window-swap :around #'+popup*save) + (advice-add #'evil-window-move-very-bottom :around #'+popup*save) + (advice-add #'evil-window-move-very-top :around #'+popup*save) + (advice-add #'evil-window-move-far-left :around #'+popup*save) + (advice-add #'evil-window-move-far-right :around #'+popup*save)) + + ;; `help-mode' (after! help-mode (defun doom--switch-from-popup (location) @@ -141,6 +204,11 @@ instead of switch-to-buffer-*." (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) +;; `multi-term' +(after! multi-term + (setq multi-term-buffer-name "doom terminal")) + + ;; `wgrep' (progn ;; close the popup after you're done with a wgrep buffer diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 34c157f0d..5897fb75b 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -145,9 +145,9 @@ ALIST supports one custom parameter: `size', which will resolve to (set! :popup "^\\*Help" '((slot . -1) (size . 0.2)) '((select . t))) - (set! :popup "^\\*\\(?:term\\|doom eshell\\)" + (set! :popup "^\\*doom \\(?:term\\|eshell\\)" '((size . 0.25)) - '((select . t) (quit) (transient . 0))) + '((quit) (transient . 0))) (set! :popup "^\\*doom:" '((size . 0.35)) '((select . t) (modeline . t) (quit) (transient)))) From 7ca2e1593ee4cc034f614c9549614a7c8d4e2989 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 21:52:54 -0500 Subject: [PATCH 0138/4235] feature/popup: split +popup-p into two functions Better to be explicit about what we want, especially when using one or the other with no arguments. --- modules/feature/popup/+hacks.el | 2 +- modules/feature/popup/README.org | 3 +- modules/feature/popup/autoload.el | 46 +++++++++++++++++-------------- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index cc76bf96d..6bddc3694 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -39,7 +39,7 @@ ;; a term buffer to run it in, but where it spawns it is the problem... (defun +popup*eshell-undedicate-popup (orig-fn &rest args) "Force spawned term buffer to share with the eshell popup (if necessary)." - (when (+popup-p) + (when (+popup-window-p) (set-window-dedicated-p nil nil) (add-transient-hook! #'eshell-query-kill-processes :after (set-window-dedicated-p nil t))) diff --git a/modules/feature/popup/README.org b/modules/feature/popup/README.org index 06a72e94f..4b872e31e 100644 --- a/modules/feature/popup/README.org +++ b/modules/feature/popup/README.org @@ -102,7 +102,8 @@ This will ensure all popups have a modeline /by default/, but allows you to over + ~+popup/raise~ ** Library + Functions - + ~+popup-p WINDOW~ + + ~+popup-window-p WINDOW~ + + ~+popup-buffer-p BUFFER~ + ~+popup-buffer BUFFER &optional ALIST~ + ~+popup-parameter PARAMETER &optional WINDOW~ + ~+popup-parameter-fn PARAMETER &optional WINDOW~ diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 3c14b6da3..8c03679c4 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -97,18 +97,24 @@ and enables `+popup-buffer-mode'." ;; ;;;###autoload -(defun +popup-p (&optional target) - "Return t if TARGET is a popup window or buffer. If TARGET is nil, use the -current buffer." - (unless target - (setq target (current-buffer))) - (cond ((windowp target) - (+popup-p (window-buffer target))) - ((bufferp target) - (buffer-local-value '+popup-buffer-mode target)) - (t - (error "Expected a window/buffer, got %s (%s)" - (type-of target) target)))) +(defun +popup-buffer-p (&optional buffer) + "Return t if BUFFER is a popup buffer. Defaults to the current buffer." + (unless buffer + (setq buffer (current-buffer))) + (cl-assert (bufferp buffer) t) + (and (buffer-live-p buffer) + (buffer-local-value '+popup-buffer-mode buffer) + buffer)) + +;;;###autoload +(defun +popup-window-p (&optional window) + "Return t if WINDOW is a popup window. Defaults to the current window." + (unless window + (setq window (selected-window))) + (cl-assert (windowp window) t) + (and (window-live-p window) + (window-parameter window 'popup) + window)) ;;;###autoload (defun +popup-buffer (buffer &optional alist) @@ -142,7 +148,7 @@ with ARGS to get its return value." ;;;###autoload (defun +popup-windows () "Returns a list of all popup windows." - (cl-remove-if-not #'+popup-p (window-list))) + (cl-remove-if-not #'+popup-window-p (window-list))) ;;;###autoload (defun +popup-shrink-to-fit (&optional window) @@ -166,7 +172,7 @@ Uses `shrink-window-if-larger-than-buffer'." :global t :keymap +popup-mode-map (cond (+popup-mode - (add-hook 'doom-unreal-buffer-functions #'+popup-p) + (add-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) (add-hook 'doom-escape-hook #'+popup|close-on-escape t) (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq +popup--old-display-buffer-alist display-buffer-alist @@ -174,7 +180,7 @@ Uses `shrink-window-if-larger-than-buffer'." (dolist (prop +popup-window-parameters) (push (cons prop 'writable) window-persistent-parameters))) (t - (remove-hook 'doom-unreal-buffer-functions #'+popup-p) + (remove-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) (remove-hook 'doom-escape-hook #'+popup|close-on-escape) (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq display-buffer-alist +popup--old-display-buffer-alist) @@ -234,7 +240,7 @@ disabled." "If called inside a popup, try to close that popup window (see `+popup/close'). If called outside, try to close all popup windows (see `+popup/close-all')." - (if (+popup-p) + (if (+popup-window-p) (+popup/close) (+popup/close-all))) @@ -264,7 +270,7 @@ disabled." (window (selected-window))) (unless popups (user-error "No popups are open")) - (select-window (if (+popup-p) + (select-window (if (+popup-window-p) (or (car-safe (cdr (memq window popups))) (car (delq window popups)) (car popups)) @@ -281,7 +287,7 @@ This will do nothing if the popup's `quit' window parameter is either nil or current-prefix-arg)) (unless window (setq window (selected-window))) - (when (and (+popup-p window) + (when (and (+popup-window-p window) (or force-p (memq (+popup-parameter-fn 'quit window window) '(t current)))) @@ -335,7 +341,7 @@ the message buffer in a popup window." (defun +popup/raise () "Raise the current popup window into a regular window." (interactive) - (unless (+popup-p) + (unless (+popup-window-p) (user-error "Cannot raise a non-popup window")) (let ((window (selected-window)) (buffer (current-buffer)) @@ -360,7 +366,7 @@ with the :popup setting." (defmacro save-popups! (&rest body) "Sets aside all popups before executing the original function, usually to prevent the popup(s) from messing up the UI (or vice versa)." - `(let* ((in-popup-p (+popup-p)) + `(let* ((in-popup-p (+popup-buffer-p)) (popups (+popup-windows)) (+popup--inhibit-transient t) +popup--last) From 395af731d978e036b665fdf140f8d80e5903dc72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 21:55:37 -0500 Subject: [PATCH 0139/4235] feature/popup: tweak org rules + add org-capture rule --- modules/feature/popup/+hacks.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 6bddc3694..53ba593d8 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -145,11 +145,12 @@ the command buffer." ;; `org' (after! org - (set! :popup "^\\*Org \\(?:Links\\|Export Dispatcher\\|Select\\)" + (set! :popup "^\\*\\(?:Agenda Com\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" '((slot . -1) (size . +popup-shrink-to-fit)) - '((select))) - (set! :popup "^\\*Org Agenda" '((slot . -1) (size . 20))) + '((transient))) + (set! :popup "^\\*Org Agenda" '((size . 20)) '((select . t) (transient))) (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) + (set! :popup "^CAPTURE.*\\.org$" '((size . 0.2)) '((quit) (select . t))) ;; Org has a scorched-earth window management system I'm not fond of. i.e. it ;; kills all windows and monopolizes the frame. No thanks. We can do better @@ -164,7 +165,7 @@ the command buffer." (advice-add #'org-capture-place-template :around #'+popup*suppress-delete-other-windows) (advice-add #'org-export--dispatch-ui :around #'+popup*suppress-delete-other-windows) - (defun +popup*org-src-pop-to-buffer (orig-fn buffer _context) + (defun +popup*org-src-pop-to-buffer (orig-fn buffer context) "Hand off the src-block window to the popup system by using `display-buffer' instead of switch-to-buffer-*." (if +popup-mode @@ -189,7 +190,6 @@ instead of switch-to-buffer-*." ;; `org-agenda' (setq org-agenda-window-setup 'other-window org-agenda-restore-windows-after-quit nil) - (add-hook 'org-agenda-finalize-hook #'org-fit-window-to-buffer) ;; Don't monopolize frame! (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) From bf7055a7db6decef4a5226efbc343804a8b665d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 22:13:42 -0500 Subject: [PATCH 0140/4235] feature/popup: make extra sure popups die safely A buffer can find other, unexpected ways to kill itself, so we set up a kill-buffer-hook to make sure we're there to catch them. Not all heroes wear capes. --- modules/feature/popup/autoload.el | 36 ++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 8c03679c4..21c7b4d77 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -14,16 +14,18 @@ "Tries to kill BUFFER, as was requested by a transient timer. If it fails, eg. the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) - (if (get-buffer-window buffer) - (with-current-buffer buffer - (setq +popup--timer - (run-at-time ttl nil #'+popup--kill-buffer buffer ttl))) - (with-demoted-errors "Error killing transient buffer: %s" - (let ((inhibit-message (not doom-debug-mode))) - (message "Cleaned up transient buffer: %s" buffer)) - (when-let* ((process (get-buffer-process (current-buffer)))) - (kill-process process)) - (kill-buffer buffer))))) + (let ((kill-buffer-hook (delq '+popup|kill-buffer-hook kill-buffer-hook))) + (cond ((eq ttl 0) + (kill-buffer buffer)) + ((get-buffer-window buffer) + (with-current-buffer buffer + (setq +popup--timer + (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) + (t + (with-demoted-errors "Error killing transient buffer: %s" + (when-let* ((process (get-buffer-process (current-buffer)))) + (kill-process process)) + (kill-buffer buffer))))))) (defun +popup--init (window alist) "Initializes a popup window. Run any time a popup is opened. It sets the @@ -76,6 +78,7 @@ and enables `+popup-buffer-mode'." (cl-assert (integerp ttl) t) (if (= ttl 0) (+popup--kill-buffer buffer 0) + (add-hook 'kill-buffer-hook #'+popup|kill-buffer-hook nil t) (setq +popup--timer (run-at-time ttl nil #'+popup--kill-buffer buffer ttl))))))))) @@ -194,8 +197,7 @@ Uses `shrink-window-if-larger-than-buffer'." :init-value nil :keymap +popup-buffer-mode-map (when (and +popup-buffer-mode (timerp +popup--timer)) - (let ((inhibit-message (not doom-debug-mode))) - (message "Cancelled timer in %s" (current-buffer))) + (remove-hook 'kill-buffer-hook #'+popup|kill-buffer-hook t) (cancel-timer +popup--timer) (setq +popup--timer nil))) @@ -254,6 +256,16 @@ disabled." (when +popup-mode (setq display-buffer-alist +popup--display-buffer-alist))) +;;;###autoload +(defun +popup|kill-buffer-hook () + "TODO" + (let ((buf (current-buffer)) + (+popup--inhibit-transient t)) + (when (+popup-buffer-p buf) + (when-let* ((window (get-buffer-window buf))) + (when (+popup-window-p window) + (+popup--destroy window)))))) + ;; ;; Commands From 35594f07293fca65c5e29d29e76398b2004d0eb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Jan 2018 22:20:11 -0500 Subject: [PATCH 0141/4235] lang/org: fix todo(t) capture target (incorrect path) --- modules/lang/org/+capture.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 5debb99a4..eeb9b2ee2 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -29,7 +29,8 @@ (after! org (defvaralias 'org-default-notes-file '+org-default-notes-file) - (setq org-default-notes-file (expand-file-name +org-default-notes-file +org-dir)) + (setq org-default-notes-file (expand-file-name +org-default-notes-file +org-dir) + +org-default-todo-file (expand-file-name +org-default-todo-file +org-dir)) (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) From e91cb1124391541f7b6b62d2fa67ce78d3a24a66 Mon Sep 17 00:00:00 2001 From: Undead Kernel Date: Mon, 1 Jan 2018 20:48:23 +0100 Subject: [PATCH 0142/4235] Latex module revamped Latex language module with previews, latexmk, reftex, bibtex and others. Completion with company mode. Selection of bibliography using Ivy or Helm. Later preview panel or okular as viewers. LatexMk for compiling code. Prettified indentation with adaptive-wrap along with good indentation of environments. Additional fontification of common commands. --- modules/lang/latex/+fontification.el | 89 +++++++++++ modules/lang/latex/README.org | 53 +++++++ modules/lang/latex/autoload.el | 43 ++++++ modules/lang/latex/config.el | 220 +++++++++++++++++++++------ modules/lang/latex/packages.el | 14 +- 5 files changed, 372 insertions(+), 47 deletions(-) create mode 100644 modules/lang/latex/+fontification.el create mode 100644 modules/lang/latex/README.org create mode 100644 modules/lang/latex/autoload.el diff --git a/modules/lang/latex/+fontification.el b/modules/lang/latex/+fontification.el new file mode 100644 index 000000000..fa853e726 --- /dev/null +++ b/modules/lang/latex/+fontification.el @@ -0,0 +1,89 @@ +;;; lang/latex/+fontification.el -*- lexical-binding: t; -*- + +;; Fontification taken from https://tex.stackexchange.com/a/86119/81279 +(setq font-latex-match-reference-keywords + '( + ;; biblatex + ("printbibliography" "[{") + ("addbibresource" "[{") + ;; Standard commands + ("cite" "[{") + ("Cite" "[{") + ("parencite" "[{") + ("Parencite" "[{") + ("footcite" "[{") + ("footcitetext" "[{") + ;; Style-specific commands + ("textcite" "[{") + ("Textcite" "[{") + ("smartcite" "[{") + ("Smartcite" "[{") + ("cite*" "[{") + ("parencite*" "[{") + ("supercite" "[{") + ;; Qualified citation lists + ("cites" "[{") + ("Cites" "[{") + ("parencites" "[{") + ("Parencites" "[{") + ("footcites" "[{") + ("footcitetexts" "[{") + ("smartcites" "[{") + ("Smartcites" "[{") + ("textcites" "[{") + ("Textcites" "[{") + ("supercites" "[{") + ;; Style-independent commands + ("autocite" "[{") + ("Autocite" "[{") + ("autocite*" "[{") + ("Autocite*" "[{") + ("autocites" "[{") + ("Autocites" "[{") + ;; Text commands + ("citeauthor" "[{") + ("Citeauthor" "[{") + ("citetitle" "[{") + ("citetitle*" "[{") + ("citeyear" "[{") + ("citedate" "[{") + ("citeurl" "[{") + ;; Special commands + ("fullcite" "[{") + ;; cleveref + ("cref" "{") + ("Cref" "{") + ("cpageref" "{") + ("Cpageref" "{") + ("cpagerefrange" "{") + ("Cpagerefrange" "{") + ("crefrange" "{") + ("Crefrange" "{") + ("labelcref" "{"))) + +(setq font-latex-match-textual-keywords + '( + ;; biblatex brackets + ("parentext" "{") + ("brackettext" "{") + ("hybridblockquote" "[{") + ;; Auxiliary Commands + ("textelp" "{") + ("textelp*" "{") + ("textins" "{") + ("textins*" "{") + ;; subcaption + ("subcaption" "[{"))) + +(setq font-latex-match-variable-keywords + '( + ;; amsmath + ("numberwithin" "{") + ;; enumitem + ("setlist" "[{") + ("setlist*" "[{") + ("newlist" "{") + ("renewlist" "{") + ("setlistdepth" "{") + ("restartlist" "{") + ("crefname" "{"))) diff --git a/modules/lang/latex/README.org b/modules/lang/latex/README.org new file mode 100644 index 000000000..620669f40 --- /dev/null +++ b/modules/lang/latex/README.org @@ -0,0 +1,53 @@ +#+TITLE: :lang latex + +* Module Description +Provide a helping hand when working with LaTeX documents. + +** Feature: ++ Sane defaults ++ Fontification of many popular commands ++ Pretty indentation of wrapped lines using the ~adaptive-wrap~ package ++ Spell checking with ~flyschek~ ++ Change PDF viewer to Okular or ~latex-preview-pane~ ++ Bibtex editor ++ Autocompletion using ~company-mode~ ++ Ivy or Helm for selecting bibliography ++ Compile your .tex code only once using LatexMk + + +* Customization + +** Custom Variables +Two custom variables state where AUCTeX will search for bibliography files and their corresponding PDFs. +Set these variables in your private configuration with: +#+BEGIN_SRC emacs_lisp +(set! :latex-bibtex-file "./your/bib/file.bib") +(set! :latex-bibtex-pdfs-dir "./dir/with/bib/pdfs/") +#+END_SRC +If the variables are not set, they are ignored. + +** LatexMk +Use LatexMk instead of normal LaTeX to compile documents. LatexMk only needs to run once to get all references, bibliography and other things right. + +Activate with the flag '+latexmk' of the latex module in init.el. +#+BEGIN_SRC emacs_lisp +(latex +latexmk) +#+END_SRC + +** Okular +Use Okular as default PDF viewer. + +Activate with the flag '+okular' of the latex module in init.el. +#+BEGIN_SRC emacs_lisp +(latex +okular) +#+END_SRC + +** Preivew-Pane +Instead of using an external program to display rendered .tex files, use an emacs window to display the rendered file. + +This flag is incompatible with the ~+okular~ flag. + +Activate with the flag '+preview-pane' of the latex module in init.el. +#+BEGIN_SRC emacs_lisp +(latex +preview-pane) +#+END_SRC diff --git a/modules/lang/latex/autoload.el b/modules/lang/latex/autoload.el new file mode 100644 index 000000000..6e95a3ff6 --- /dev/null +++ b/modules/lang/latex/autoload.el @@ -0,0 +1,43 @@ +;;; lang/latex/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +latex/LaTeX-indent-item () + "Provide proper indentation for LaTeX \"itemize\",\"enumerate\", and \"description\" environments. + + \"\\item\" is indented `LaTeX-indent-level' spaces relative to + the the beginning of the environment. + + Continuation lines are indented either twice + `LaTeX-indent-level', or `LaTeX-indent-level-item-continuation' + if the latter is bound." + (save-match-data + (let* ((offset LaTeX-indent-level) + (contin (or (and (boundp '+latex-indent-level-item-continuation) + +latex-indent-level-item-continuation) + (* 4 LaTeX-indent-level))) + (re-beg "\\\\begin{") + (re-end "\\\\end{") + (re-env "\\(itemize\\|\\enumerate\\|description\\)") + (indent (save-excursion + (when (looking-at (concat re-beg re-env "}")) + (end-of-line)) + (LaTeX-find-matching-begin) + (current-column)))) + (cond ((looking-at (concat re-beg re-env "}")) + (or (save-excursion + (beginning-of-line) + (ignore-errors + (LaTeX-find-matching-begin) + (+ (current-column) + (if (looking-at (concat re-beg re-env "}")) + contin + offset)))) + indent)) + ((looking-at (concat re-end re-env "}")) + indent) + ((looking-at "\\\\item") + (+ offset indent)) + (t + (+ contin indent)))))) + + diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 1c1876086..7b483be15 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -1,96 +1,224 @@ ;;; lang/latex/config.el -*- lexical-binding: t; -*- -(defvar +latex-bibtex-dir "~/work/writing/biblio/" +(defvar +latex-bibtex-file "" + "File AUCTeX (specifically RefTeX) uses to search for citations.") + +(defvar +latex-bibtex-pdfs-dir "" "Where bibtex files are kept.") -(defvar +latex-bibtex-default-file "default.bib" - "TODO") +(defvar +latex-indent-level-item-continuation 8 + "Custom indentation level for items in enumeration-type environments") -;; -;; AucTex/LaTeX bootstrap -;; +(def-setting! :latex-bibtex-file file + "Sets the default file RefTeX uses to search for citations." + (setq +latex-bibtex-file file)) -;; Because tex-mode is built-in and AucTex has conflicting components, we need -;; to ensure that auctex gets loaded instead of tex-mode. -(load "auctex" nil t) -(load "auctex-autoloads" nil t) -(push '("\\.[tT]e[xX]\\'" . TeX-latex-mode) auto-mode-alist) +(def-setting! :latex-bibtex-pdfs dir + "Sets the default file AUXTeX uses to search for PDF files associated to citations.." + (setq +latex-bibtex-pdfs-dir dir)) -(add-hook! (latex-mode LaTeX-mode) #'turn-on-auto-fill) -(add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode TeX-source-correlate-mode)) -(add-transient-hook! 'LaTeX-mode-hook - (setq TeX-auto-save t +(def-package! tex-site + :init + ;; Manually load the AUCTEX autoloads. This is normally done by package-initialize, + ;; ... which we do not use. + (load "auctex.el" nil t t) + (load "auctex-autoloads.el" nil t t) + :config + ;; Set some varibles to fontify common LaTeX commands. + (load! +fontification) + (setq + ;; Enable parse on load. TeX-parse-self t + ;; When running TeX, just save, don't ask TeX-save-query nil + ;; Enable parse on save. + TeX-auto-save t + ;; Use hidden directories for AUCTeX files. + TeX-auto-local ".auctex-auto" + TeX-style-local ".auctex-style" + ;; When correlating sources to rendered PDFs, don't start the emacs server TeX-source-correlate-start-server nil - LaTeX-fill-break-at-separators nil - LaTeX-section-hook - '(LaTeX-section-heading - LaTeX-section-title - LaTeX-section-toc - LaTeX-section-section - LaTeX-section-label)) - + TeX-source-correlate-mode t + TeX-source-correlate-method 'synctex + ;; Fonts for section, subsection, etc + font-latex-fontify-sectioning 1.15) + (setq-default TeX-master nil) + ;; Display the output of the latex commands in a popup. (set! :popup " output\\*$" '((size . 15))) - (map! :map LaTeX-mode-map "C-j" nil)) + ;; TeX Font Styling + (def-package! tex-style + :defer t) -;; -;; Plugins -;; + ;; TeX Folding + (def-package! tex-fold + :defer t + :init + (add-hook! 'TeX-mode-hook 'TeX-fold-mode)) -(def-package! reftex ; built-in - :commands (turn-on-reftex reftex-mode) + (def-package! latex + :defer t + :init + (setq + ;; Add the toc entry to the sectioning hooks. + LaTeX-section-hook + '(LaTeX-section-heading + LaTeX-section-title + LaTeX-section-toc + LaTeX-section-section + LaTeX-section-label) + LaTeX-fill-break-at-separators nil + ;; Item indentation. + LaTeX-item-indent 0) + :config + (map! :map LaTeX-mode-map "C-j" nil) + ;; Do not prompt for Master files, this allows auto-insert to add templates to .tex files + (add-hook! '(LaTeX-mode TeX-mode) '(lambda () (remove-hook 'find-file-hooks (car find-file-hooks) 'local))) + ;; Adding useful things for latex + (add-hook! LaTeX-mode (LaTeX-math-mode) (TeX-source-correlate-mode)(TeX-global-PDF-mode t) + (TeX-PDF-mode t) (visual-line-mode +1)) + (when (featurep! :feature spellcheck) + (add-hook! LaTeX-mode (flyspell-mode t))) + ;; Default language setting. + (setq ispell-dictionary "english") + ;; Use chktex to search for errors in a latex file. + (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") + ;; Set a custom item indentation + (setq LaTeX-indent-environment-list + (nconc '(("itemize" +latex/LaTeX-indent-item) + ("enumerate" +latex/LaTeX-indent-item) + ("description" +latex/LaTeX-indent-item)) + LaTeX-indent-environment-list)))) + +(after! latex + ;; Use Okular is the user says so. + (when (featurep! +okular) + ;; Configure Okular as viewer. Including a bug fix (https://bugs.kde.org/show_bug.cgi?id=373855) + (add-to-list 'TeX-view-program-list + '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) + (add-to-list 'TeX-view-program-selection + '(output-pdf "Okular")))) + +(def-package! preview + ;; The preview package is currently broken with the latest AUCTeX version ("11.90.2.2017-07-25) + ;; ... and Ghostscript 9.22. It's now fixed in AUCTeX master, so we just have to wait. + :init + (progn + (setq-default preview-scale 1.4 + preview-scale-function '(lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) + (add-hook! LaTeX-mode #'LaTeX-preview-setup)) + +(def-package! reftex + :commands turn-on-reftex :init (setq reftex-plug-into-AUCTeX t - reftex-default-bibliography (list +latex-bibtex-default-file) - reftex-toc-split-windows-fraction 0.2) - + reftex-toc-split-windows-fraction 0.3) + (unless (s-blank? +latex-bibtex-file) + (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) + ; Get ReTeX working with biblatex + ; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 + (setq reftex-cite-format + '((?t . "\\textcite[]{%l}") + (?a . "\\autocite[]{%l}") + (?c . "\\cite[]{%l}") + (?s . "\\smartcite[]{%l}") + (?f . "\\footcite[]{%l}") + (?n . "\\nocite{%l}") + (?b . "\\blockcquote[]{%l}{}"))) (add-hook! (latex-mode LaTeX-mode) #'turn-on-reftex) - :config (map! :map reftex-mode-map :localleader :n ";" 'reftex-toc) - (add-hook! 'reftex-toc-mode-hook (reftex-toc-rescan) (map! :local :e "j" #'next-line :e "k" #'previous-line :e "q" #'kill-buffer-and-window - :e "ESC" #'kill-buffer-and-window))) + :e "ESC" #'kill-buffer-and-window + "C-g" #'reftex-toc-quit))) - -(def-package! bibtex ; built-in +(def-package! bibtex :defer t + :mode ("\\.bib" . bibtex-mode) :config (setq bibtex-dialect 'biblatex bibtex-align-at-equal-sign t bibtex-text-indentation 20 - bibtex-completion-bibliography (list +latex-bibtex-default-file)) - + bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))) (map! :map bibtex-mode-map "C-c \\" #'bibtex-fill-entry)) +(def-package! latex-preview-pane + :when (featurep! +preview-pane) + :commands latex-preview-pane-enable + :init + (setq latex-preview-pane-multifile-mode 'auctex) + (add-hook! (latex-mode LaTeX-mode) #'latex-preview-pane-enable) + (add-to-list 'TeX-view-program-list + '("preview-pane" + latex-preview-pane-mode)) + (add-to-list 'TeX-view-program-selection + '(output-pdf "preview-pane")) + :config + (map! :map doc-view-mode-map + "ESC" #'delete-window + "q" #'delete-window + "k" (λ! (quit-window) (delete-window)))) + +;; Enable latexmk only if the user explicitly says so with the module flag '+latexmk'. +(def-package! auctex-latexmk + :when (featurep! +latexmk) + :init + ;; Pass the -pdf flag when TeX-PDF-mode is active + (setq auctex-latexmk-inherit-TeX-PDF-mode t) + ;; Set LatexMk as the default + (add-hook 'LaTeX-mode-hook '(lambda () (setq TeX-command-default "LatexMk"))) + :config + ;; Add latexmk as a TeX target + (auctex-latexmk-setup)) (def-package! ivy-bibtex :when (featurep! :completion ivy) - :commands ivy-bibtex) - + :commands ivy-bibtex + :config + (unless (s-blank? +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) + (unless (s-blank? +latex-bibtex-pdfs-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-pdfs-dir) + bibtex-completion-pdf-field "file" + bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-pdfs-dir) + bibtex-completion-pdf-open-function + (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))) (def-package! helm-bibtex :when (featurep! :completion helm) - :commands helm-bibtex) - + :commands helm-bibtex + :config + (unless (s-blank? +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) + (unless (s-blank? +latex-bibtex-pdfs-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-pdfs-dir) + bibtex-completion-pdf-field "file" + bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-pdfs-dir) + bibtex-completion-pdf-open-function + (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))) (def-package! company-auctex :when (featurep! :completion company) - :commands company-auctex-init + :commands (company-auctex-init) :init ;; We can't use the (set! :company-backend ...) because Auctex reports its - ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is - ;; :company-backend doesn't anticipate (and shouldn't have to!) + ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which + ;; is not anticipated by :company-backend (and shouldn't have to!) (add-hook! LaTeX-mode (make-variable-buffer-local 'company-backends) (company-auctex-init))) + +;; Nicely indent lines that have wrapped when visual line mode is activated +(def-package! adaptive-wrap + :commands (adaptive-wrap-prefix-mode) + :init + (add-hook! LaTeX-mode 'adaptive-wrap-prefix-mode) + (setq-default adaptive-wrap-extra-indent 0)) diff --git a/modules/lang/latex/packages.el b/modules/lang/latex/packages.el index ebf26c035..9939c2366 100644 --- a/modules/lang/latex/packages.el +++ b/modules/lang/latex/packages.el @@ -2,7 +2,18 @@ ;;; lang/latex/packages.el (package! auctex) -;; (package! auctex-latexmk) +(package! flyspell) +(package! adaptive-wrap) + +;; Optional module features: + +(when (featurep! +latexmk) + (package! auctex-latexmk)) + +(when (featurep! +preview-pane) + (package! latex-preview-pane)) + +;; Features according to other user selected options (when (featurep! :completion company) (package! company-auctex)) @@ -10,3 +21,4 @@ (package! ivy-bibtex)) (when (featurep! :completion helm) (package! helm-bibtex)) + From 1c2683ce9de7c41ab7ca55b4851a8d4289c59788 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 14:41:41 -0500 Subject: [PATCH 0143/4235] completion/ivy: add ivy-rich; rewrite custom transformer #331 +ivy-buffer-transformer does *most* of what ivy-rich does, so lets cut down on our own code, bring in ivy-rich, and add our customizations on top of it. This fixes ivy-use-virtual-buffers support, too. --- modules/completion/ivy/autoload/ivy.el | 64 ++++++++++++++------------ modules/completion/ivy/config.el | 22 ++++++--- modules/completion/ivy/packages.el | 1 + 3 files changed, 51 insertions(+), 36 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index aba051707..49ec0e9fd 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -1,36 +1,42 @@ -;;; completion/ivy/autoload/ivy.el -*- lexical-binding: t; -*- +;;; completion/ivy/autoload/ivy.el -*- lexical-binding: nil; -*- -(defsubst +ivy--icon-for-mode (mode) - "Apply `all-the-icons-for-mode' on MODE but either return an icon or nil." - (let ((icon (all-the-icons-icon-for-mode mode))) - (unless (symbolp icon) icon))) +(defun +ivy--is-workspace-or-other-buffer-p (buffer) + (let ((buffer (car buffer))) + (when (stringp buffer) + (setq buffer (get-buffer buffer))) + (and (not (eq buffer (current-buffer))) + (+workspace-contains-buffer-p buffer)))) + + +;; +;; Library +;; ;;;###autoload (defun +ivy-buffer-transformer (str) - (let* ((buf (get-buffer str)) - (path (buffer-file-name buf)) - (mode (buffer-local-value 'major-mode buf)) - (faces - (with-current-buffer buf - (cond ((string-match-p "^ ?\\*" (buffer-name buf)) - 'font-lock-comment-face) - ((buffer-modified-p buf) - 'doom-modeline-buffer-modified) - (buffer-read-only - 'error))))) - (propertize - (format "%-40s %s%-20s %s" - str - (if +ivy-buffer-icons - (concat (propertize " " 'display - (or (+ivy--icon-for-mode mode) - (+ivy--icon-for-mode (get mode 'derived-mode-parent)))) - "\t") - "") - mode - (or (and path (abbreviate-file-name (file-name-directory (file-truename path)))) - "")) - 'face faces))) + (let ((buf (get-buffer str)) + (project-root (doom-project-root))) + (require 'ivy-rich) + (cond (buf + (with-current-buffer buf + (let* ((indicator (ivy-rich-switch-buffer-indicators)) + (size (ivy-rich-switch-buffer-size)) + (buf-name (ivy-rich-switch-buffer-buffer-name)) + (mode (ivy-rich-switch-buffer-major-mode)) + (project (ivy-rich-switch-buffer-project)) + (path (ivy-rich-switch-buffer-path project))) + (cond ((string-match-p "^ ?\\*" (buffer-name buf)) + (setq buf-name (propertize buf-name 'face 'font-lock-comment-face))) + ((and buffer-file-name + (not (file-in-directory-p (buffer-file-name buf) project-root))) + (setq buf-name (propertize buf-name 'face 'ivy-remote)))) + (ivy-rich-switch-buffer-format (list buf-name size indicator mode project path))))) + ((and (eq ivy-virtual-abbreviate 'full) + ivy-rich-switch-buffer-align-virtual-buffer) + (ivy-rich-switch-buffer-virtual-buffer)) + ((eq ivy-virtual-abbreviate 'full) + (propertize (abbreviate-file-name str) 'str 'ivy-virtual)) + (t (propertize str 'face 'ivy-virtual))))) ;;;###autoload (defun +ivy/switch-workspace-buffer (&optional arg) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index d860a3a57..a9bc09ee9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -38,7 +38,11 @@ immediately runs it on the current candidate (ending the ivy session)." ;; highlight til EOL ivy-format-function #'ivy-format-function-line ;; disable magic slash on non-match - ivy-magic-slash-non-match-action nil) + ivy-magic-slash-non-match-action nil + ;; don't show recent files in switch-buffer + ivy-use-virtual-buffers nil + ;; ...but if that ever changes, show their full path + ivy-virtual-abbreviate 'full) (after! magit (setq magit-completing-read-function #'ivy-completing-read)) (after! yasnippet (push #'+ivy-yas-prompt yas-prompt-functions)) @@ -57,12 +61,6 @@ immediately runs it on the current candidate (ending the ivy session)." [remap describe-function] #'counsel-describe-function [remap describe-variable] #'counsel-describe-variable) - ;; Show more buffer information in switch-buffer commands - (ivy-set-display-transformer #'ivy-switch-buffer #'+ivy-buffer-transformer) - (ivy-set-display-transformer #'ivy-switch-buffer-other-window #'+ivy-buffer-transformer) - (ivy-set-display-transformer #'+ivy/switch-workspace-buffer #'+ivy-buffer-transformer) - (ivy-set-display-transformer #'counsel-recentf #'abbreviate-file-name) - (nconc ivy-sort-functions-alist '((persp-kill-buffer . nil) (persp-remove-buffer . nil) @@ -74,12 +72,22 @@ immediately runs it on the current candidate (ending the ivy session)." (+workspace/delete . nil)))) +;; Show more buffer information in switch-buffer commands +(def-package! ivy-rich + :after ivy + :config + (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer)) + (ivy-set-display-transformer cmd '+ivy-buffer-transformer))) + + (def-package! swiper :commands (swiper swiper-all)) (def-package! counsel :requires ivy :config + (ivy-set-display-transformer #'counsel-recentf #'abbreviate-file-name) + (require 'counsel-projectile) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 8ec066214..9777d1000 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -7,3 +7,4 @@ (package! smex) (package! swiper) (package! ivy-hydra) +(package! ivy-rich) From f2e5321ce1d761da76dd13271475a9a7568d3e67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 14:43:56 -0500 Subject: [PATCH 0144/4235] feature/ivy: fix virtual buffers in +ivy/switch-workspace-buffer #331 The former +ivy/switch-workspace-buffer constructed its own collection of buffers, so ivy-use-virtual-buffers would have no effect on it. Use internal-complete-buffer instead and ivy-read will know what to do under the hood. --- modules/completion/ivy/autoload/ivy.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 49ec0e9fd..fc7292032 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -45,7 +45,8 @@ If ARG (universal argument), open selection in other-window." (interactive "P") (ivy-read "Switch to workspace buffer: " - (mapcar #'buffer-name (delq (current-buffer) (doom-buffer-list))) + 'internal-complete-buffer + :predicate #'+ivy--is-workspace-or-other-buffer-p :action (if arg #'ivy--switch-buffer-other-window-action #'ivy--switch-buffer-action) From 7777f9940ece771921094e689c56ff6d57fe399e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 14:55:54 -0500 Subject: [PATCH 0145/4235] Change add-hook! macro to retain hook order (add-hook! hook '(1 2 3)) should set hook to `(1 2 3 ,@old-hooks). Before this, they would be pushed sequentially, resulting in hook = `(3 2 1 ,@old hooks)` --- core/core-lib.el | 2 +- core/test/core-lib.el | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 75eb54efc..2d77fac8d 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -157,7 +157,7 @@ Body forms can access the hook's arguments through the let-bound variable `(remove-hook ',hook ,fn ,local-p) `(add-hook ',hook ,fn ,append-p ,local-p)) forms))) - `(progn ,@(nreverse forms))))) + `(progn ,@forms)))) (defmacro remove-hook! (&rest args) "Convenience macro for `remove-hook'. Takes the same arguments as diff --git a/core/test/core-lib.el b/core/test/core-lib.el index d001f0aa9..2fff1fd6e 100644 --- a/core/test/core-lib.el +++ b/core/test/core-lib.el @@ -37,14 +37,14 @@ ;; `add-hook!' (def-test! add-one-to-one-hook - (let (hooks) + (let ((hooks '(old-hook))) (add-hook! 'hooks 'a-hook) - (should (equal hooks '(a-hook))))) + (should (equal hooks '(a-hook old-hook))))) (def-test! add-many-to-one-hook - (let (hooks) + (let ((hooks '(hook-x))) (add-hook! 'hooks '(hook-a hook-b hook-c)) - (should (equal hooks '(hook-c hook-b hook-a))))) + (should (equal hooks '(hook-a hook-b hook-c hook-x))))) (def-test! add-one-to-many-hooks (let (hooks-a hooks-b hooks-c) @@ -56,9 +56,9 @@ (def-test! add-many-to-many-hooks (let (hooks-a hooks-b hooks-c) (add-hook! '(hooks-a hooks-b hooks-c) '(hook-a hook-b hook-c)) - (should (equal hooks-a '(hook-c hook-b hook-a))) - (should (equal hooks-b '(hook-c hook-b hook-a))) - (should (equal hooks-c '(hook-c hook-b hook-a))))) + (should (equal hooks-a '(hook-a hook-b hook-c))) + (should (equal hooks-b '(hook-a hook-b hook-c))) + (should (equal hooks-c '(hook-a hook-b hook-c))))) (def-test! add-non-literal-hooks (let (some-mode-hook) From 3beb1f098a33138149c2a8e430bd0beaa6ed05f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 15:02:54 -0500 Subject: [PATCH 0146/4235] completion/ivy: use font-lock-doc-face instead of ivy-remote --- modules/completion/ivy/autoload/ivy.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index fc7292032..fac60f388 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -29,7 +29,7 @@ (setq buf-name (propertize buf-name 'face 'font-lock-comment-face))) ((and buffer-file-name (not (file-in-directory-p (buffer-file-name buf) project-root))) - (setq buf-name (propertize buf-name 'face 'ivy-remote)))) + (setq buf-name (propertize buf-name 'face 'font-lock-doc-face)))) (ivy-rich-switch-buffer-format (list buf-name size indicator mode project path))))) ((and (eq ivy-virtual-abbreviate 'full) ivy-rich-switch-buffer-align-virtual-buffer) From 971e4904fead348e9254ddd3f8a7ea1402911ffe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 15:25:28 -0500 Subject: [PATCH 0147/4235] feature/services: -when-let => when-let* --- modules/feature/services/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/services/autoload.el b/modules/feature/services/autoload.el index dd2e7a8f3..23f357ab3 100644 --- a/modules/feature/services/autoload.el +++ b/modules/feature/services/autoload.el @@ -12,7 +12,7 @@ "Delete service at point. Asks for confirmation." (interactive "P") (prodigy-with-refresh - (-when-let (service (prodigy-service-at-pos)) + (when-let* ((service (prodigy-service-at-pos))) (let ((name (plist-get service :name))) (cond ((or arg (y-or-n-p (format "Delete '%s' service?" name))) From b6bf0d7afd9e7878aafc23a4f7ab2b626d4d8e04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 16:15:28 -0500 Subject: [PATCH 0148/4235] ui/doom-dashboard: major refactor; use initial-buffer-choice Much of my work getting dashboard to behave across GUI, tty and daemon Emacs is already done with initial-buffer-choice, so I cut down on my own code and exploit that instead. Needs more testing. --- modules/ui/doom-dashboard/config.el | 102 +++++++++++++++------------- 1 file changed, 55 insertions(+), 47 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index ea678def2..d9e256be3 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -35,46 +35,70 @@ Possible values: (defvar all-the-icons-default-adjust) ;; -(setq doom-fallback-buffer +doom-dashboard-name) +(setq doom-fallback-buffer +doom-dashboard-name + initial-buffer-choice #'+doom-dashboard) +;; +;; Commands +;; + +(defun +doom-dashboard/open (frame &optional noswitch) + (interactive (list (selected-frame))) + (unless (run-hook-with-args-until-success '+doom-dashboard-inhibit-functions) + (prog1 + (unless +doom-dashboard-inhibit-refresh + (with-selected-frame frame + (unless noswitch + (switch-to-buffer (doom-fallback-buffer))) + (+doom-dashboard-reload))) + (setq +doom-dashboard-inhibit-refresh nil) + (current-buffer)))) + + +;; +;; Library +;; + (define-derived-mode +doom-dashboard-mode special-mode (format "DOOM v%s" doom-version) "Major mode for the DOOM dashboard buffer." - (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))) +(add-hook '+doom-dashboard-mode-hook #'read-only-mode) -(map! :map +doom-dashboard-mode-map - "n" #'+doom-dashboard/next-button - "p" #'+doom-dashboard/previous-button - "N" #'+doom-dashboard/last-button - "P" #'+doom-dashboard/first-button - :em "j" #'+doom-dashboard/next-button - :em "k" #'+doom-dashboard/previous-button - :em "gg" #'+doom-dashboard/first-button - :em "G" #'+doom-dashboard/last-button - [remap evil-insert] #'evil-normal-state - [remap evil-change] #'evil-normal-state - [remap evil-visual-char] #'evil-normal-state - [remap evil-visual-line] #'evil-normal-state - [remap evil-delete] #'evil-normal-state - [remap evil-delete-char] #'evil-normal-state) +(defun +doom-dashboard () + "Initialize doom-dashboard and set up its hooks. Meant to be used with +`initial-buffer-choice'. Returns the resulting buffer." + (map! :map +doom-dashboard-mode-map + "n" #'+doom-dashboard/next-button + "p" #'+doom-dashboard/previous-button + "N" #'+doom-dashboard/last-button + "P" #'+doom-dashboard/first-button + :em "j" #'+doom-dashboard/next-button + :em "k" #'+doom-dashboard/previous-button + :em "gg" #'+doom-dashboard/first-button + :em "G" #'+doom-dashboard/last-button + [remap evil-insert] #'evil-normal-state + [remap evil-change] #'evil-normal-state + [remap evil-visual-char] #'evil-normal-state + [remap evil-visual-line] #'evil-normal-state + [remap evil-delete] #'evil-normal-state + [remap evil-delete-char] #'evil-normal-state) -;; -(defun +doom-dashboard|init () - "Initialize doom-dashboard and set up its hooks; possibly open the dashboard -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|reload-on-kill) - (when (and (display-graphic-p) (not (daemonp))) + (when (daemonp) + (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) + (if (doom-real-buffer-p) + (current-buffer) (let ((default-directory doom-emacs-dir)) - (+doom-dashboard/open (selected-frame))))) + (+doom-dashboard/open (selected-frame) t)))) (defun +doom-dashboard|reload-on-kill () "If this isn't a dashboard buffer, move along, but record its @@ -94,28 +118,8 @@ If this is the dashboard buffer, reload the dashboard." (defun +doom-dashboard|make-frame (frame) "Reload the dashboard after a brief pause. This is necessary for new frames, whose dimensions may not be fully initialized by the time this is run." - (run-with-timer 0.1 nil #'+doom-dashboard/open frame)) + (run-with-timer 0.1 nil #'+doom-dashboard frame)) -(defun +doom-dashboard|server-visit (&rest _) - "Inhibit dashboard refresh when opening files via emacsclient." - (setq +doom-dashboard-inhibit-refresh t)) - -(add-hook 'window-setup-hook #'+doom-dashboard|init) -(add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame) -(add-hook 'server-visit-hook #'+doom-dashboard|server-visit) - - -;; -(defun +doom-dashboard/open (frame) - (interactive (list (selected-frame))) - (unless (run-hook-with-args-until-success '+doom-dashboard-inhibit-functions) - (unless +doom-dashboard-inhibit-refresh - (with-selected-frame frame - (switch-to-buffer (doom-fallback-buffer)) - (+doom-dashboard-reload))) - (setq +doom-dashboard-inhibit-refresh nil))) - -; (defun +doom-dashboard-p (&optional buffer) "Returns t if BUFFER is the dashboard buffer." (eq (or buffer (current-buffer)) @@ -165,8 +169,8 @@ controlled by `+doom-dashboard-pwd-policy'." (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) + win (max 0 (/ (- (window-total-width win) +doom-dashboard--width) 2)))) + fallback-buffer)) ;; helpers (defun +doom-dashboard--center (len s) @@ -196,7 +200,11 @@ controlled by `+doom-dashboard-pwd-policy'." (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" policy))))) -;; widgets + +;; +;; Widgets +;; + (defun doom-dashboard-widget--banner () (mapc (lambda (line) (insert (propertize (+doom-dashboard--center +doom-dashboard--width line) From d443aed25c947342c6bd9039ffd4ec5034454aae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 16:18:16 -0500 Subject: [PATCH 0149/4235] feature/eval: improve compatibility with feature/popups This makes quickrun, *doom eval* and *Pp Eval Output* buffers behave better. Eval output buffers should a) shrink themselves to the size of their output (within reason), b) *not* grab focus, and c) be easy to close from afar with C-g/Escape. Gotchas: 1. Quickrun gets output asynchronously, so we shrink it on quickrun-after-run-hook, not in the popup rule. 2. *doom eval* and *Pp Eval Output* opens with its output ready, so the popup system may shrink those to fit. 3. *doom eval* and *Pp Eval Output* handle window selection themselves. Let them by setting the select window parameter to #'ignore. --- modules/feature/eval/config.el | 8 ++++++-- modules/lang/emacs-lisp/autoload.el | 13 ++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 1a2565dd6..ce7999af5 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -66,8 +66,12 @@ function that creates and returns the REPL buffer." (unless (boundp 'display-line-numbers) (add-hook 'quickrun--mode-hook #'nlinum-mode)) :config - (set! :popup "^\\*\\(?:doom eval\\|Pp Eval Output\\|quickrun\\)" - '((window-height . 0.2)) '((transient . 0))) + (setq quickrun-focus-p nil) + + (set! :popup "^\\*quickrun" + '((size . 0.3)) '((transient . 0))) + (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore))) (defun +eval*quickrun-auto-close (&rest _) "Allows us to silently re-run quickrun from within the quickrun buffer." diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 6b0af7015..795165eb7 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -28,8 +28,11 @@ to a pop up buffer." (prin1 result buf) (pp-buffer) (setq lines (count-lines (point-min) (point-max))) - (goto-char (point-min)) - (if (> lines 1) - (pop-to-buffer buf t) - (message "%s" (buffer-substring (point-min) (point-max))) - (kill-buffer buf))))) + (cond ((> lines 1) + (save-selected-window + (pop-to-buffer buf) + (with-current-buffer buf + (goto-char (point-min))))) + (t + (message "%s" (buffer-substring (point-min) (point-max))) + (kill-buffer buf)))))) From 3bdf1dd17489b5cc45b5b6b95aafa7587d08041d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 17:29:15 -0500 Subject: [PATCH 0150/4235] feature/popup: by default, don't handle window selection Plenty of special popups switch to a buffer and simply assume that that buffer is now focused. So best we don't interfere with that unless we must. --- modules/feature/popup/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 5897fb75b..e85db3b55 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -73,7 +73,8 @@ a brief description of some native window parameters that Emacs uses: (defvar +popup-default-parameters '((transient . t) - (quit . t)) + (quit . t) + (select . ignore)) "The default window parameters.") (defvar +popup-ttl 10 From 1f526696843bc1e6b0012e23a497f9f285bfa2fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 19:03:38 -0500 Subject: [PATCH 0151/4235] completion/ivy: refactor switch-buffer transformer #331 Also switches to my private fork of ivy-rich until the changes are merged upstream. --- modules/completion/ivy/autoload/ivy.el | 35 +++++++++++++------------- modules/completion/ivy/packages.el | 2 +- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index fac60f388..a612a426d 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -1,4 +1,6 @@ -;;; completion/ivy/autoload/ivy.el -*- lexical-binding: nil; -*- +;;; completion/ivy/autoload/ivy.el -*- lexical-binding: t; -*- + +(defvar doom--project-root nil) (defun +ivy--is-workspace-or-other-buffer-p (buffer) (let ((buffer (car buffer))) @@ -7,6 +9,16 @@ (and (not (eq buffer (current-buffer))) (+workspace-contains-buffer-p buffer)))) +(defun +ivy*rich-switch-buffer-buffer-name (str) + (propertize + (ivy-rich-switch-buffer-pad str ivy-rich-switch-buffer-name-max-length) + 'face (cond ((string-match-p "^ *\\*" str) + 'font-lock-comment-face) + ((not (file-in-directory-p buffer-file-truename doom--project-root)) + 'font-lock-doc-face) + (t nil)))) +(advice-add 'ivy-rich-switch-buffer-buffer-name :override #'+ivy*rich-switch-buffer-buffer-name) + ;; ;; Library @@ -14,26 +26,15 @@ ;;;###autoload (defun +ivy-buffer-transformer (str) + "Dim special buffers, buffers whose file aren't in the current buffer, and +virtual buffers. Uses `ivy-rich' under the hood." (let ((buf (get-buffer str)) - (project-root (doom-project-root))) + (doom--project-root (doom-project-root))) (require 'ivy-rich) - (cond (buf - (with-current-buffer buf - (let* ((indicator (ivy-rich-switch-buffer-indicators)) - (size (ivy-rich-switch-buffer-size)) - (buf-name (ivy-rich-switch-buffer-buffer-name)) - (mode (ivy-rich-switch-buffer-major-mode)) - (project (ivy-rich-switch-buffer-project)) - (path (ivy-rich-switch-buffer-path project))) - (cond ((string-match-p "^ ?\\*" (buffer-name buf)) - (setq buf-name (propertize buf-name 'face 'font-lock-comment-face))) - ((and buffer-file-name - (not (file-in-directory-p (buffer-file-name buf) project-root))) - (setq buf-name (propertize buf-name 'face 'font-lock-doc-face)))) - (ivy-rich-switch-buffer-format (list buf-name size indicator mode project path))))) + (cond (buf (ivy-rich-switch-buffer-transformer str)) ((and (eq ivy-virtual-abbreviate 'full) ivy-rich-switch-buffer-align-virtual-buffer) - (ivy-rich-switch-buffer-virtual-buffer)) + (ivy-rich-switch-buffer-virtual-buffer str)) ((eq ivy-virtual-abbreviate 'full) (propertize (abbreviate-file-name str) 'str 'ivy-virtual)) (t (propertize str 'face 'ivy-virtual))))) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 9777d1000..06468443a 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -7,4 +7,4 @@ (package! smex) (package! swiper) (package! ivy-hydra) -(package! ivy-rich) +(package! ivy-rich :recipe (:fetcher github :repo "hlissner/ivy-rich")) From 4b4447d31eeddf12c3b7f5b030a7e4c2b33e0c7c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 19:05:10 -0500 Subject: [PATCH 0152/4235] completion/ivy: dim non-project entries in counsel-recentf Added +ivy-recentf-transformer to counsel-recentf. Entries that aren't in the same project as the buffer recentf was opened from will be slightly dimmed. --- modules/completion/ivy/autoload/ivy.el | 9 +++++++++ modules/completion/ivy/config.el | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index a612a426d..0468be74f 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -24,6 +24,15 @@ ;; Library ;; +;;;###autoload +(defun +ivy-recentf-transformer (str) + "Dim recentf entries that are not in the current project of the buffer you +started `counsel-recentf' from. Also uses `abbreviate-file-name'." + (let ((str (abbreviate-file-name str))) + (if (file-in-directory-p str (doom-project-root)) + str + (propertize str 'face 'ivy-virtual)))) + ;;;###autoload (defun +ivy-buffer-transformer (str) "Dim special buffers, buffers whose file aren't in the current buffer, and diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index a9bc09ee9..c6b99de8e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -86,7 +86,8 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel :requires ivy :config - (ivy-set-display-transformer #'counsel-recentf #'abbreviate-file-name) + ;; Dim recentf entries that are not in the current project. + (ivy-set-display-transformer 'counsel-recentf '+ivy-recentf-transformer) (require 'counsel-projectile) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") From 865fe29a9dce05078ff29de4528b9b46f54b0477 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 19:07:21 -0500 Subject: [PATCH 0153/4235] completion/ivy: use switch-buffer transformer for projectile --- modules/completion/ivy/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index c6b99de8e..6072c696c 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -76,7 +76,8 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-rich :after ivy :config - (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer)) + (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer + counsel-projectile-switch-to-buffer)) (ivy-set-display-transformer cmd '+ivy-buffer-transformer))) From af37d430fb9c0e6571bfea9db3ef77679124b5e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 19:28:50 -0500 Subject: [PATCH 0154/4235] Fix kill-this-buffer's dashboard addiction Our kill-this-buffer advice, which tries to ensure the user will always land on a real buffer after killing another, would prematurely jump to the dashboard even though there were other available, real buffers. Also fixes an issue where kill-this-buffer would get stuck switching between the last buffers (because they aren't killed if they're visible in other windows). If the only buffers left are visible in other windows, it will now switch to the fallback buffer (dashboard or scratch). --- core/core-ui.el | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index dafb94739..163f931c9 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -531,17 +531,14 @@ instead)." (let ((buf (current-buffer))) (cond ((window-dedicated-p) (delete-window)) - ((eq buf (doom-fallback-buffer)) - (bury-buffer)) + ((or (eq buf (doom-fallback-buffer)) + (doom-real-buffer-p buf)) + (doom--cycle-real-buffers -1) + (kill-buffer buf) + (when (cdr (get-buffer-window-list (current-buffer) nil t)) + (doom--cycle-real-buffers nil))) (t - (let ((real-p (doom-real-buffer-p buf))) - (funcall orig-fn) - (cond ((eq buf (current-buffer)) - (doom--cycle-real-buffers nil)) - ((and real-p (not (doom-real-buffer-p))) - (doom--cycle-real-buffers -1)) - (t - (message "Nowhere to go!")))))))) + (funcall orig-fn))))) (defun doom|init-ui () From b57c2e2264f95d4cf638a3205268ca69da3f9a6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 19:36:00 -0500 Subject: [PATCH 0155/4235] Disarm doom/cleanup-session's oppressive regime It killed buffers a little too indiscriminantly. --- 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 fb893aeaa..c903849fd 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -247,8 +247,7 @@ project." ALL-P (universal argument), clean them up globally." (interactive (list current-prefix-arg)) (let ((buffers (doom-buried-buffers (if all-p (buffer-list)))) - (n 0) - kill-buffer-query-functions) + (n 0)) (mapc #'kill-buffer buffers) (setq n (+ n (length buffers) (doom/cleanup-processes))) (dolist (hook doom-cleanup-hook) From 6853196017ea1b4fe4230e0662f89bee0a1b5ad8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 20:38:46 -0500 Subject: [PATCH 0156/4235] lang/org: general refactor; split init into hooks lang/org's initialization process is now split up into hooks on org-load-hook. This approach is cleaner and easier to customize. I also removed the escape binding in org-agenda-mode-map, as the popup system makes it redundant. --- modules/lang/org/+attach.el | 4 ++- modules/lang/org/+babel.el | 4 ++- modules/lang/org/+capture.el | 6 ++-- modules/lang/org/+export.el | 4 ++- modules/lang/org/+present.el | 4 ++- modules/lang/org/config.el | 56 ++++++++++++++++++++---------------- 6 files changed, 48 insertions(+), 30 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 564bb02e8..0d31e3b91 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -1,5 +1,7 @@ ;;; lang/org/+attach.el -*- lexical-binding: t; -*- +(add-hook 'org-load-hook #'+org|init-attach) + ;; I believe Org's native attachment system is over-complicated and litters ;; files with metadata I don't want. So I wrote my own, which: ;; @@ -60,7 +62,7 @@ :filter-return #'+org-attach*download-fullname)) ;; -(after! org +(defun +org|init-attach () (setq org-attach-directory (expand-file-name +org-attach-dir +org-dir)) (push (car (last (split-string +org-attach-dir "/" t))) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 73a7dba78..06fdcc2c2 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -1,5 +1,7 @@ ;;; lang/org/+babel.el -*- lexical-binding: t; -*- +(add-hook 'org-load-hook #'+org|init-babel) + (defvar +org-babel-languages '(calc css @@ -23,7 +25,7 @@ "A list of org-babel languages to load.") -(after! org +(defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty org-src-preserve-indentation t ; use native major-mode indentation org-src-tab-acts-natively t diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index eeb9b2ee2..dd2039b98 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -1,5 +1,7 @@ ;;; lang/org/+capture.el -*- lexical-binding: t; -*- +(add-hook 'org-load-hook #'+org|init-capture) + ;; Sets up two `org-capture' workflows that I like: ;; ;; 1. The traditional way: invoking `org-capture' directly (or through a @@ -26,11 +28,11 @@ "* %u %?\n%i" :prepend t :kill-buffer t))) -(after! org +(defun +org|init-capture () (defvaralias 'org-default-notes-file '+org-default-notes-file) (setq org-default-notes-file (expand-file-name +org-default-notes-file +org-dir) - +org-default-todo-file (expand-file-name +org-default-todo-file +org-dir)) + +org-default-todo-file (expand-file-name +org-default-todo-file +org-dir)) (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index d2e69db4d..dad8588c9 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -1,5 +1,7 @@ ;;; lang/org/+export.el -*- lexical-binding: t; -*- +(add-hook 'org-load-hook #'+org|init-export) + ;; I don't have any beef with org's built-in export system, but I do wish it ;; would export to a central directory, rather than `default-directory'. This is ;; because all my org files are usually in one place, and I want to be able to @@ -16,7 +18,7 @@ (parse-raw . t)))) ;; -(after! org +(defun +org|init-export () (add-transient-hook! #'org-export-dispatch (require 'ox-pandoc)) (setq org-export-directory (expand-file-name ".export" +org-dir) diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index daec968aa..7a9a804d5 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -1,5 +1,7 @@ ;;; lang/org/+present.el -*- lexical-binding: t; -*- +(add-hook 'org-load-hook #'+org|init-present) + (defvar +org-present-text-scale 7 "The `text-scale-amount' for `org-tree-slide-mode'.") @@ -43,7 +45,7 @@ ;; Bootstrap ;; -(after! org +(defun +org|init-present () (require 'ox-reveal) (map! :map org-mode-map "" #'+org-present/start)) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b287e2048..c6f3c8c31 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -33,16 +33,15 @@ ;; Bootstrap ;; -(after! org - (defvaralias 'org-directory '+org-dir) +(add-hook! 'org-load-hook + #'(org-crypt-use-before-save-magic + +org|setup-ui + +org|setup-agenda + +org|setup-keybinds + +org|setup-hacks)) - (org-crypt-use-before-save-magic) - (+org-init-ui) - (+org-init-keybinds) - (+org-hacks)) - -(add-hook! org-mode - #'(doom|disable-line-numbers ; no line numbers +(add-hook! 'org-mode-hook + #'(doom|disable-line-numbers ; org doesn't really need em org-bullets-mode ; "prettier" bullets org-indent-mode ; margin-based indentation toc-org-enable ; auto-table of contents @@ -55,9 +54,15 @@ +org|show-paren-mode-compatibility )) +(after! org + (defvaralias 'org-directory '+org-dir)) + +(when (featurep 'org) + (run-hooks 'org-load-hook)) + ;; -;; Config hooks +;; `org-mode' hooks ;; (defun +org|unfold-to-2nd-level-or-point () @@ -106,18 +111,23 @@ unfold to point on startup." ;; -(defun +org-init-ui () - "Configures the UI for `org-mode'." +;; `org-load' hooks +;; + +(defun +org|setup-agenda () (setq-default - org-adapt-indentation nil org-agenda-dim-blocked-tasks nil org-agenda-files (ignore-errors (directory-files +org-dir t "\\.org$" t)) org-agenda-inhibit-startup t - org-agenda-skip-unavailable-files nil + org-agenda-skip-unavailable-files t)) + +(defun +org|setup-ui () + "Configures the UI for `org-mode'." + (setq-default + org-adapt-indentation nil org-cycle-include-plain-lists t org-cycle-separator-lines 1 org-entities-user '(("flat" "\\flat" nil "" "" "266D" "♭") ("sharp" "\\sharp" nil "" "" "266F" "♯")) - ;; org-ellipsis " ... " org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-fontify-whole-heading-line t @@ -147,8 +157,8 @@ unfold to point on startup." outline-blank-line t ;; LaTeX previews are too small and usually render to light backgrounds, so - ;; this enlargens them and ensures their background (and foreground) match the - ;; current theme. + ;; this enlargens them and ensures their background (and foreground) match + ;; the current theme. org-preview-latex-image-directory (concat doom-cache-dir "org-latex/") org-format-latex-options (plist-put org-format-latex-options :scale 1.5) org-format-latex-options @@ -167,7 +177,7 @@ unfold to point on startup." 'org-link 'error)))) -(defun +org-init-keybinds () +(defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies between the two." (map! :map org-mode-map @@ -195,6 +205,7 @@ between the two." :ni [M-return] (λ! (+org/insert-item 'below)) :ni [S-M-return] (λ! (+org/insert-item 'above)) + ;; Fix vim motion keys :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) :m "]l" #'org-next-link @@ -206,7 +217,6 @@ between the two." :n ">" #'org-metaright :v "<" (λ! (org-metaleft) (evil-visual-restore)) :v ">" (λ! (org-metaright) (evil-visual-restore)) - ;; Fix code-folding keybindings :n "za" #'+org/toggle-fold :n "zA" #'org-shifttab @@ -220,18 +230,16 @@ between the two." (:after org-agenda (:map org-agenda-mode-map - :e "" #'org-agenda-Quit :e "m" #'org-agenda-month-view :e "C-j" #'org-agenda-next-item :e "C-k" #'org-agenda-previous-item :e "C-n" #'org-agenda-next-item :e "C-p" #'org-agenda-previous-item)))) -;; -(defun +org-hacks () +(defun +org|setup-hacks () "Getting org to behave." ;; Don't open separate windows - (push '(file . find-file) org-link-frame-setup) + (map-put org-link-frame-setup 'file 'find-file) ;; Let OS decide what to do with files when opened (setq org-file-apps @@ -252,4 +260,4 @@ between the two." (cl-find (file-truename filename) org-agenda-files :key #'file-truename :test #'equal)) - (add-to-list 'recentf-exclude #'+org-is-agenda-file))) + (push #'+org-is-agenda-file recentf-exclude))) From 3dbf994871b6bb34fe62b287fea49e5e74302457 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 20:42:41 -0500 Subject: [PATCH 0157/4235] lang/org: close agenda buffers after org-agenda Experimental. Running org-agenda would leave leftover open buffers, this hook cleans them up. --- modules/lang/org/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c6f3c8c31..84b6abd44 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -241,6 +241,14 @@ between the two." ;; Don't open separate windows (map-put org-link-frame-setup 'file 'find-file) + (defun +org|cleanup-agenda-files () + "Close leftover agenda buffers after they've been indexed by org-agenda." + (cl-loop for file in org-agenda-files + for buf = (get-file-buffer file) + if (and file (not (get-buffer-window buf))) + do (kill-buffer buf))) + (add-hook 'org-agenda-finalize-hook #'+org|cleanup-agenda-files) + ;; Let OS decide what to do with files when opened (setq org-file-apps `(("\\.org$" . emacs) From ca3f955a93350eec03c3c0b2616a300eac6a2768 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 20:43:55 -0500 Subject: [PATCH 0158/4235] completion/ivy: use upstream ivy-rich My PR was merged upstream. --- modules/completion/ivy/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 06468443a..9777d1000 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -7,4 +7,4 @@ (package! smex) (package! swiper) (package! ivy-hydra) -(package! ivy-rich :recipe (:fetcher github :repo "hlissner/ivy-rich")) +(package! ivy-rich) From 42f4d10d6d7b851d89c4b0996def3b8765185d0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Jan 2018 22:46:57 -0500 Subject: [PATCH 0159/4235] Fix doom//reload-autoloads not reloading autoloads file doom-packages--async-run doesn't return anything. Whoops! --- 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 d05ed10aa..fe9e7ad4f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -538,8 +538,9 @@ This should be run whenever init.el or an autoload file is modified. Running (if (not noninteractive) ;; This is done in another instance to protect the current session's ;; state. `doom-initialize-packages' will have side effects otherwise. - (and (doom-packages--async-run 'doom//reload-autoloads) - (load doom-autoload-file)) + (progn + (doom-packages--async-run 'doom//reload-autoloads) + (load doom-autoload-file)) (doom-initialize-packages t) (let ((targets (file-expand-wildcards From eb927290b54c157506ba74119d55796aca9344b0 Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Tue, 9 Jan 2018 12:00:35 +0800 Subject: [PATCH 0160/4235] Call flycheck-popup-tip-mode correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix issue: Symbol’s function definition is void: flycheck-popup-tip --- modules/feature/syntax-checker/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 0e90127b8..c8d78f66a 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -40,5 +40,5 @@ (after! flycheck (if IS-MAC - (flycheck-popup-tip) + (flycheck-popup-tip-mode) (flycheck-pos-tip-mode))) From 565c4fa0f4295b6346558c03a7a82f4268cfee10 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 03:45:05 -0500 Subject: [PATCH 0161/4235] completion/ivy: fix stringp error from blank buffer-file-name --- modules/completion/ivy/autoload/ivy.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 0468be74f..e9f60d44c 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -14,7 +14,8 @@ (ivy-rich-switch-buffer-pad str ivy-rich-switch-buffer-name-max-length) 'face (cond ((string-match-p "^ *\\*" str) 'font-lock-comment-face) - ((not (file-in-directory-p buffer-file-truename doom--project-root)) + ((and buffer-file-truename + (not (file-in-directory-p buffer-file-truename doom--project-root))) 'font-lock-doc-face) (t nil)))) (advice-add 'ivy-rich-switch-buffer-buffer-name :override #'+ivy*rich-switch-buffer-buffer-name) From 233b2021ce5552ade647adf0611c22d51ab9f4de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 03:45:27 -0500 Subject: [PATCH 0162/4235] completion/ivy: add transformer for projectile-find-file --- modules/completion/ivy/autoload/ivy.el | 8 ++++++++ modules/completion/ivy/config.el | 2 ++ 2 files changed, 10 insertions(+) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index e9f60d44c..77b55093a 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -25,6 +25,14 @@ ;; Library ;; +;;;###autoload +(defun +ivy-projectile-find-file-transformer (str) + "Highlight entries that have been visited. This is the opposite of +`counsel-projectile-find-file'." + (cond ((get-file-buffer (projectile-expand-root str)) + (propertize str 'face '(:weight ultra-bold :slant italic))) + (t str))) + ;;;###autoload (defun +ivy-recentf-transformer (str) "Dim recentf entries that are not in the current project of the buffer you diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 6072c696c..9e20cc4f3 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -89,6 +89,8 @@ immediately runs it on the current candidate (ending the ivy session)." :config ;; Dim recentf entries that are not in the current project. (ivy-set-display-transformer 'counsel-recentf '+ivy-recentf-transformer) + ;; Highlight entries that have been visited + (ivy-set-display-transformer 'counsel-projectile-find-file '+ivy-projectile-find-file-transformer) (require 'counsel-projectile) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") From 0e0966a4ce4c027d34d6b70999f13944b2543e33 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 03:50:51 -0500 Subject: [PATCH 0163/4235] feature/evil: evil-respect-visual-line-mode = t Remaps line motions in visual-line-mode. --- modules/feature/evil/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e2116ad26..7fd02fa1a 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -33,6 +33,7 @@ evil-ex-visual-char-range t ; column range for ex commands evil-insert-skip-empty-lines t evil-mode-line-format 'nil + evil-respect-visual-line-mode t ;; more vim-like behavior evil-symbol-word-search t ;; don't activate mark on shift-click From d2bab1dc4dfc05e8c097a4b546336dfa09526115 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 04:05:29 -0500 Subject: [PATCH 0164/4235] Fix kill-this-buffer's dashboard addiction, the sequel Again, the dashboard was being switched to too early (there were still other real buffers to display). --- core/core-ui.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 163f931c9..5badb3a87 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -531,11 +531,14 @@ instead)." (let ((buf (current-buffer))) (cond ((window-dedicated-p) (delete-window)) - ((or (eq buf (doom-fallback-buffer)) - (doom-real-buffer-p buf)) + ((eq buf (doom-fallback-buffer)) + (bury-buffer) + (when (cdr (get-buffer-window-list)) + (doom--cycle-real-buffers nil))) + ((doom-real-buffer-p buf) (doom--cycle-real-buffers -1) (kill-buffer buf) - (when (cdr (get-buffer-window-list (current-buffer) nil t)) + (when (cdr (get-buffer-window-list)) (doom--cycle-real-buffers nil))) (t (funcall orig-fn))))) From 228b3a36e57adc8f0b8b27d8faa1f1c4091b8a0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 04:16:26 -0500 Subject: [PATCH 0165/4235] private/default: doom/kill-this-buffer => kill-this-buffer #334 Missed this when I removed doom/kill-this-buffer! --- modules/private/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index ded8ff005..731933f21 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -144,7 +144,7 @@ :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 buffer" :n "k" #'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 From 32c3dd847eb6746e63456d77f5b79acd6aad1424 Mon Sep 17 00:00:00 2001 From: Dragnucs Date: Tue, 9 Jan 2018 11:27:48 +0000 Subject: [PATCH 0166/4235] Add Vue file to web mode Support `.vue` Vue.js files in web-mode. --- modules/lang/web/+html.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 73ba50cf6..9b07432f8 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -8,6 +8,7 @@ :mode "\\.as[cp]x$" :mode "\\.mustache$" :mode "\\.tsx$" + :mode "\\.vue$" :mode "wp-content/themes/.+/.+\\.php$" :config (add-hook 'web-mode-hook #'turn-off-smartparens-mode) From 56a3c817789f1438aaac4a492c8c3ef551728d61 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Tue, 9 Jan 2018 14:19:02 +0100 Subject: [PATCH 0167/4235] Correct def-setting and use string-empty-p. Change default ivy-bibtex behavior to insert bibliography. --- modules/lang/latex/config.el | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 7b483be15..2f6690c8b 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -3,20 +3,20 @@ (defvar +latex-bibtex-file "" "File AUCTeX (specifically RefTeX) uses to search for citations.") -(defvar +latex-bibtex-pdfs-dir "" +(defvar +latex-bibtex-dir "" "Where bibtex files are kept.") (defvar +latex-indent-level-item-continuation 8 "Custom indentation level for items in enumeration-type environments") -(def-setting! :latex-bibtex-file file +(def-setting! :latex-bibtex-file (file) "Sets the default file RefTeX uses to search for citations." - (setq +latex-bibtex-file file)) + `(setq +latex-bibtex-file ,file)) -(def-setting! :latex-bibtex-pdfs dir - "Sets the default file AUXTeX uses to search for PDF files associated to citations.." - (setq +latex-bibtex-pdfs-dir dir)) +(def-setting! :latex-bibtex-dir (dir) + "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." + `(setq +latex-bibtex-dir ,dir)) (def-package! tex-site @@ -115,7 +115,7 @@ :init (setq reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) - (unless (s-blank? +latex-bibtex-file) + (unless (string-empty-p +latex-bibtex-file) (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) ; Get ReTeX working with biblatex ; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 @@ -183,12 +183,13 @@ :when (featurep! :completion ivy) :commands ivy-bibtex :config - (unless (s-blank? +latex-bibtex-file) + (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key) + (unless (string-empty-p +latex-bibtex-file) (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (s-blank? +latex-bibtex-pdfs-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-pdfs-dir) + (unless (string-empty-p +latex-bibtex-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-dir) bibtex-completion-pdf-field "file" - bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-pdfs-dir) + bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-dir) bibtex-completion-pdf-open-function (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))) @@ -196,12 +197,12 @@ :when (featurep! :completion helm) :commands helm-bibtex :config - (unless (s-blank? +latex-bibtex-file) + (unless (string-empty-p +latex-bibtex-file) (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (s-blank? +latex-bibtex-pdfs-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-pdfs-dir) + (unless (string-empty-p +latex-bibtex-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-dir) bibtex-completion-pdf-field "file" - bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-pdfs-dir) + bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-dir) bibtex-completion-pdf-open-function (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))) From 7bdf8cf8d9cdd6b2a4ffe7c5393d3e0b3ea8c5ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 16:40:44 -0500 Subject: [PATCH 0168/4235] feature/popup: add +popup-display-buffer-actions #337 Gives us more flexibility to control what display-buffer functions to use when trying to display the popup window. --- modules/feature/popup/autoload.el | 23 ++++++++++++----------- modules/feature/popup/config.el | 4 ++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 21c7b4d77..7acc9a00e 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -43,6 +43,7 @@ and enables `+popup-buffer-mode'." (set-window-parameter window 'popup t) (set-window-parameter window 'no-other-window t) (set-window-parameter window 'delete-window #'+popup--destroy) + (set-window-dedicated-p window 'popup) (+popup-buffer-mode +1) (run-hooks '+popup-create-window-hook))) @@ -122,17 +123,17 @@ and enables `+popup-buffer-mode'." ;;;###autoload (defun +popup-buffer (buffer &optional alist) "Open BUFFER in a popup window. ALIST describes its features." - (let* ((old-window (selected-window)) - (alist (+popup--normalize-alist alist)) - (new-window (let ((window-min-height 3)) - (or (display-buffer-reuse-window buffer alist) - (display-buffer-in-side-window buffer alist))))) - (+popup--init new-window alist) - (let ((select (+popup-parameter 'select new-window))) - (if (functionp select) - (funcall select new-window old-window) - (select-window (if select new-window old-window)))) - new-window)) + (let ((old-window (selected-window)) + (alist (+popup--normalize-alist alist)) + (window-min-height 3)) + (when-let* ((new-window (run-hook-with-args-until-success + '+popup-display-buffer-actions buffer alist))) + (+popup--init new-window alist) + (let ((select (+popup-parameter 'select new-window))) + (if (functionp select) + (funcall select new-window old-window) + (select-window (if select new-window old-window)))) + new-window))) ;;;###autoload (defun +popup-parameter (parameter &optional window) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index e85db3b55..a02137738 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -66,6 +66,10 @@ a brief description of some native window parameters that Emacs uses: If CDR is non-nil, this window becomes invisible to `other-window' and `pop-to-buffer'. Doom popups sets this. The default is nil.") +(defvar +popup-display-buffer-actions + '(display-buffer-reuse-window display-buffer-in-side-window) + "The functions to use to display the popup buffer.") + (defvar +popup-default-alist '((window-height . 0.16) (reusable-frames . visible)) From c03d0dbc06b684a18e20d5bfe8a75713e1286e7b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 16:43:07 -0500 Subject: [PATCH 0169/4235] feature/popup: add +popup-display-buffer action #337 This is experimental and disabled by default. It uses a slightly more primitive backend that will stack popups away from the edge of the frame. This will need more work to take window-slot into account. To use it: (remove-hook '+popup-display-buffer-actions 'display-buffer-in-side-window) (add-hook '+popup-display-buffer-actions #'+popup-display-buffer t) --- modules/feature/popup/autoload.el | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 7acc9a00e..0e75e4183 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -408,3 +408,44 @@ prevent the popup(s) from messing up the UI (or vice versa)." "Sets aside all popups before executing the original function, usually to prevent the popup(s) from messing up the UI (or vice versa)." (save-popups! (apply orig-fn args))) + + +;; +;; Popup actions +;; + +(defun +popup--dimension (side) + (if (memq side '(left right)) + 'window-width + 'window-height)) + +(defun +popup--side (side) + (pcase side (`bottom 'below) (`top 'above) (_ side))) + +(defun +popup--frame-splittable-p (frame) + (when (and (window--frame-usable-p frame) + (not (frame-parameter frame 'unsplittable))) + frame)) + +(defun +popup--splittable-frame () + (let ((selected-frame (selected-frame)) + (last-non-minibuffer-frame (last-nonminibuffer-frame))) + (or (+popup--frame-splittable-p selected-frame) + (+popup--frame-splittable-p last-non-minibuffer-frame)))) + +;;;###autoload +(defun +popup-display-buffer (buf alist) + "Highly experimental!" + (when-let* ((frame (+popup--splittable-frame))) + (let* ((-side (or (alist-get 'side alist) 'bottom)) + (side (+popup--side -side)) + (size (alist-get (+popup--dimension -side) alist)) + (old-size (window-size (frame-root-window frame) + (memq -side '(left right)))) + (new-size + (when (numberp size) + (round (if (>= size 1) + (- old-size size) + (* (- 1 size) old-size))))) + (window (split-window (frame-root-window frame) new-size side))) + (window--display-buffer buf window 'window alist t)))) From bfcbb9ca010ff253acf98b93667681a562adc3ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 16:42:08 -0500 Subject: [PATCH 0170/4235] feature/popup: fix +popup/toggle always opening *Messagse* Because +popup/restore would always return nil. --- modules/feature/popup/autoload.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 0e75e4183..4e3040205 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -348,7 +348,8 @@ the message buffer in a popup window." if (and (buffer-live-p buffer) (display-buffer buffer)) do (window-state-put state it)) - (setq +popup--last nil)) + (setq +popup--last nil) + t) ;;;###autoload (defun +popup/raise () From a4e22d48b81a28dbbed054b7a7eb053555cb9ddb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 17:42:08 -0500 Subject: [PATCH 0171/4235] feature/popup: add :ignore support to :popup Allows you to ignore certain buffers. Helpful for plugins that manage their own windows, like magit. To use: (set! :popup "^\\*magit" :ignore) Relevant to #337 --- modules/feature/popup/config.el | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a02137738..9fdf12302 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -121,20 +121,23 @@ ALIST supports one custom parameter: `size', which will resolve to `window-height' or `window-width' depending on `side'." `(let ((alist ,alist) (parameters ,parameters)) - ,(when alist - `(when-let* ((size (cdr (assq 'size alist))) - (side (or (cdr (assq 'side (append alist +popup-default-alist))) 'bottom))) - (map-delete alist 'size) - (map-put alist (if (memq side '(left right)) - 'window-width - 'window-height) - size))) - (prog1 (push (append (list ,condition '(+popup-buffer)) - alist - (list (cons 'window-parameters parameters))) - +popup--display-buffer-alist) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist))))) + (if (eq alist :ignore) + (push (list ,condition nil) +popup--display-buffer-alist) + ,(when alist + `(when-let* ((size (cdr (assq 'size alist))) + (side (or (cdr (assq 'side (append alist +popup-default-alist))) + 'bottom))) + (map-delete alist 'size) + (map-put alist (if (memq side '(left right)) + 'window-width + 'window-height) + size))) + (prog1 (push (append (list ,condition '(+popup-buffer)) + alist + (list (cons 'window-parameters parameters))) + +popup--display-buffer-alist))) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)))) ;; From 01b4a59f84b690e9cabdbf895818ac14291c5020 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Jan 2018 17:44:39 -0500 Subject: [PATCH 0172/4235] feature/version-control: don't manage magit popups --- modules/feature/version-control/+git.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index eb112cfe8..8186dc27f 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -81,6 +81,7 @@ (def-package! magit :commands (magit-status magit-blame) :config + (set! :popup "^\\*magit" :ignore) (set! :evil-state 'magit-status-mode 'emacs) (after! evil ;; Switch to emacs state only while in `magit-blame-mode', then back when From 8227f40d08524c7fcb98ecfeaf3f2279c893217e Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Wed, 10 Jan 2018 09:59:01 +0800 Subject: [PATCH 0173/4235] feature/popup: call +popup/close in +popup*evil-command-window-execute - doom/popup-close was renamed to +popup/close --- modules/feature/popup/+hacks.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 53ba593d8..958a9238d 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -79,7 +79,7 @@ the command buffer." (unless (equal evil-command-window-current-buffer (current-buffer)) (user-error "Originating buffer is no longer active")) ;; (kill-buffer "*Command Line*") - (doom/popup-close popup) + (+popup/close popup) (funcall execute-fn result) (setq evil-command-window-current-buffer nil))) From 4c310bfb17905e55b59fb21af298477dd4fd5a80 Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Wed, 10 Jan 2018 10:09:03 +0800 Subject: [PATCH 0174/4235] feature/popup: call get-buffer-window for evil-command execute-window - doom-popup-other-window was removed --- modules/feature/popup/+hacks.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 958a9238d..4696d0b74 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -74,9 +74,10 @@ the command buffer." (let ((result (buffer-substring (line-beginning-position) (line-end-position))) (execute-fn evil-command-window-execute-fn) + (execute-window (get-buffer-window evil-command-window-current-buffer)) (popup (selected-window))) - (select-window doom-popup-other-window) - (unless (equal evil-command-window-current-buffer (current-buffer)) + (if execute-window + (select-window execute-window) (user-error "Originating buffer is no longer active")) ;; (kill-buffer "*Command Line*") (+popup/close popup) From ea55fcfd0fb72e401669cee438be8e05227c9f7c Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Wed, 10 Jan 2018 17:39:12 +0800 Subject: [PATCH 0175/4235] feature/popup: use delete-window in +popup*evil-command-window-execute - +popup/close will pollute the popup history - see also https://github.com/hlissner/doom-emacs/pull/339#issuecomment-356544535 --- modules/feature/popup/+hacks.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 4696d0b74..b6e4dde61 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -80,7 +80,7 @@ the command buffer." (select-window execute-window) (user-error "Originating buffer is no longer active")) ;; (kill-buffer "*Command Line*") - (+popup/close popup) + (delete-window popup) (funcall execute-fn result) (setq evil-command-window-current-buffer nil))) From c24889d75e067cf3d7515d469e9be4aedbddd6af Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Thu, 11 Jan 2018 09:17:08 +0800 Subject: [PATCH 0176/4235] feature/evil: add mapping for evil-numbers --- modules/feature/evil/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7fd02fa1a..626c73e3c 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -229,6 +229,14 @@ (add-hook 'doom-escape-hook #'+evil|escape-exchange)) +(def-package! evil-numbers + :commands (evil-numbers/inc-at-pt evil-numbers/dec-at-pt) + :init + (map! + :nv "C-a" #'evil-numbers/inc-at-pt + :nv "C-x" #'evil-numbers/dec-at-pt)) + + (def-package! evil-matchit :commands (evilmi-jump-items evilmi-text-object global-evil-matchit-mode) :config (global-evil-matchit-mode 1) From 669b3cbbb0b3fb0e233ea6a88bda5e286ba66241 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Jan 2018 18:54:54 -0500 Subject: [PATCH 0177/4235] lang/cc: fix void-function irony-mode error #341 --- 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 bc63b9a71..7002c2b82 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -108,7 +108,7 @@ compilation database is present in the project.") (def-package! irony :after cc-mode - :commands irony-install-server + :commands (irony-install-server irony-mode) :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) :init (defun +cc|init-irony-mode () From 2b98e550e8b85d760a9cac172dcf4d6c3c307361 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Jan 2018 22:42:22 -0500 Subject: [PATCH 0178/4235] Reverse load-path to fix precedence issues Originally, I built the load-path with site-lisp paths first, then packages. There was a modest ~10% startup boost doing this, because there were considerably more site packages loaded at startup than plugins. However, this meant built-in packages would get precedence over plugins, which is undesirable. In org's case, I simply modified the load-path in lang/org/init.el. However, this issue has cropped up again in #340. Evidently, that 10% boost may not be worth the risk it imposes, so I've rearranged the load-path with packages first. --- core/core-packages.el | 2 +- modules/lang/org/init.el | 11 ----------- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 modules/lang/org/init.el diff --git a/core/core-packages.el b/core/core-packages.el index fe9e7ad4f..83c9e066e 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -169,7 +169,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 doom--base-load-path doom--package-load-path)))) + load-path (append doom--package-load-path doom--base-load-path)))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run diff --git a/modules/lang/org/init.el b/modules/lang/org/init.el deleted file mode 100644 index 52c15127d..000000000 --- a/modules/lang/org/init.el +++ /dev/null @@ -1,11 +0,0 @@ -;;; lang/org/init.el -*- lexical-binding: t; -*- - -;; Ensure ELPA org is prioritized above built-in org. -(eval-and-compile - (when-let* ((old-path (locate-library "org" nil doom--base-load-path))) - (setq old-path (substring (file-name-directory old-path) 0 -1)) - (delete old-path load-path) - - ;; We remove it from the base load path too so that `doom//reload-load-path' - ;; won't undo this modification. - (delete old-path doom--base-load-path))) From 471c68fc8a376ba1eae8ae8fe77c167fcdb65a23 Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Thu, 11 Jan 2018 11:50:55 +0800 Subject: [PATCH 0179/4235] feature/evil: move evil-numbers bindings to private/default/+bindings.el --- modules/feature/evil/config.el | 6 +----- modules/private/default/+bindings.el | 2 ++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 626c73e3c..6d34aec14 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -230,11 +230,7 @@ (def-package! evil-numbers - :commands (evil-numbers/inc-at-pt evil-numbers/dec-at-pt) - :init - (map! - :nv "C-a" #'evil-numbers/inc-at-pt - :nv "C-x" #'evil-numbers/dec-at-pt)) + :commands (evil-numbers/inc-at-pt evil-numbers/dec-at-pt)) (def-package! evil-matchit diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 731933f21..539be4d0c 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -314,6 +314,8 @@ ;; paste from recent yank register (which isn't overwritten) :v "C-p" "\"0p" + :nv "C-a" #'evil-numbers/inc-at-pt + :nv "C-x" #'evil-numbers/dec-at-pt ;; --- Plugin bindings ------------------------------ ;; auto-yasnippet From 991297b8e7a8281e17d67076a2eaa43fc4c1057a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 00:43:26 -0500 Subject: [PATCH 0180/4235] feature/popup: fix wrong-number-of-args error --- modules/feature/popup/+hacks.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index b6e4dde61..dd922a171 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -201,7 +201,7 @@ instead of switch-to-buffer-*." "Restore popup windows when loading a perspective from file." (dolist (window (window-list)) (when (+popup-parameter 'popup window) - (+popup--init window)))) + (+popup--init window nil)))) (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) From bff48e5ed797eb095005225c1074a1c446fd4fc7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 01:05:20 -0500 Subject: [PATCH 0181/4235] feature/popup: use new +popup-display-buffer #337 Adds support for `slot` and `vslot`, allowing for two dimensional control over where popups may spawn. Highly experimental. It's upsetting that I have to set `window--sides-inhibit-check`, I'd like to find a way around that, if possible. --- modules/feature/popup/+hacks.el | 6 +- modules/feature/popup/autoload.el | 167 +++++++++++++++++++++++------- modules/feature/popup/config.el | 12 +-- 3 files changed, 140 insertions(+), 45 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index dd922a171..e639383e3 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -146,9 +146,9 @@ the command buffer." ;; `org' (after! org - (set! :popup "^\\*\\(?:Agenda Com\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" - '((slot . -1) (size . +popup-shrink-to-fit)) - '((transient))) + (set! :popup "^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" + '((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) + '((transient . 0))) (set! :popup "^\\*Org Agenda" '((size . 20)) '((select . t) (transient))) (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) (set! :popup "^CAPTURE.*\\.org$" '((size . 0.2)) '((quit) (select . t))) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 4e3040205..917387486 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -180,14 +180,16 @@ Uses `shrink-window-if-larger-than-buffer'." (add-hook 'doom-escape-hook #'+popup|close-on-escape t) (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq +popup--old-display-buffer-alist display-buffer-alist - display-buffer-alist +popup--display-buffer-alist) + display-buffer-alist +popup--display-buffer-alist + window--sides-inhibit-check t) (dolist (prop +popup-window-parameters) (push (cons prop 'writable) window-persistent-parameters))) (t (remove-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) (remove-hook 'doom-escape-hook #'+popup|close-on-escape) (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) - (setq display-buffer-alist +popup--old-display-buffer-alist) + (setq display-buffer-alist +popup--old-display-buffer-alist + window--sides-inhibit-check nil) (+popup|cleanup-rules) (dolist (prop +popup-window-parameters) (map-delete prop window-persistent-parameters))))) @@ -415,38 +417,131 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; Popup actions ;; -(defun +popup--dimension (side) - (if (memq side '(left right)) - 'window-width - 'window-height)) - -(defun +popup--side (side) - (pcase side (`bottom 'below) (`top 'above) (_ side))) - -(defun +popup--frame-splittable-p (frame) - (when (and (window--frame-usable-p frame) - (not (frame-parameter frame 'unsplittable))) - frame)) - -(defun +popup--splittable-frame () - (let ((selected-frame (selected-frame)) - (last-non-minibuffer-frame (last-nonminibuffer-frame))) - (or (+popup--frame-splittable-p selected-frame) - (+popup--frame-splittable-p last-non-minibuffer-frame)))) - ;;;###autoload -(defun +popup-display-buffer (buf alist) - "Highly experimental!" - (when-let* ((frame (+popup--splittable-frame))) - (let* ((-side (or (alist-get 'side alist) 'bottom)) - (side (+popup--side -side)) - (size (alist-get (+popup--dimension -side) alist)) - (old-size (window-size (frame-root-window frame) - (memq -side '(left right)))) - (new-size - (when (numberp size) - (round (if (>= size 1) - (- old-size size) - (* (- 1 size) old-size))))) - (window (split-window (frame-root-window frame) new-size side))) - (window--display-buffer buf window 'window alist t)))) +(defun +popup-display-buffer (buffer alist) + "A `display-buffer' action that serves as an alternative to +`display-buffer-in-side-window', but allows for stacking popups not only +laterally with the `vslot' alist entry. + +Accepts the same arguments as `display-buffer-in-side-window'. You must set +`window--sides-inhibit-check' to non-nil for this work properly." + (let* ((side (or (cdr (assq 'side alist)) 'bottom)) + (slot (or (cdr (assq 'slot alist)) 0)) + (vslot (or (cdr (assq 'vslot alist)) 0)) + (left-or-right (memq side '(left right))) + (dedicated (or display-buffer-mark-dedicated 'popup))) + + (cond ((not (memq side '(top bottom left right))) + (error "Invalid side %s specified" side)) + ((not (numberp slot)) + (error "Invalid slot %s specified" slot)) + ((not (numberp vslot)) + (error "Invalid vslot %s specified" slot))) + + (let* ((major (get-window-with-predicate + (lambda (window) + (and (eq (window-parameter window 'window-side) side) + (eq (window-parameter window 'window-vslot) vslot))) + nil t)) + (reversed (window--sides-reverse-on-frame-p (selected-frame))) + (windows + (cond ((window-live-p major) + (list major)) + ((window-valid-p major) + (let* ((first (window-child major)) + (next (window-next-sibling first)) + (windows (list next first))) + (setq reversed (> (window-parameter first 'window-slot) + (window-parameter next 'window-slot))) + (while (setq next (window-next-sibling next)) + (setq windows (cons next windows))) + (if reversed windows (nreverse windows)))))) + (slots (if major (max 1 (window-child-count major)))) + (max-slots + (nth (plist-get '(left 0 top 1 right 2 bottom 3) side) + window-sides-slots)) + (window--sides-inhibit-check t) + window this-window this-slot prev-window next-window + best-window best-slot abs-slot) + + (cond ((and (numberp max-slots) (<= max-slots 0)) + nil) + ((not windows) + (cl-letf (((symbol-function 'window--make-major-side-window-next-to) + (lambda (_side) (frame-root-window (selected-frame))))) + (when-let* ((window (window--make-major-side-window buffer side slot alist))) + (set-window-parameter window 'window-vslot vslot) + (add-to-list 'window-persistent-parameters '(window-vslot . writable)) + window))) + (t + ;; Scan windows on SIDE. + (catch 'found + (dolist (window windows) + (setq this-slot (window-parameter window 'window-slot)) + (cond ((not (numberp this-slot))) + ((= this-slot slot) ; A window with a matching slot found + (setq this-window window) + (throw 'found t)) + (t + ;; Check if this window has a better slot value wrt the + ;; slot of the window we want. + (setq abs-slot + (if (or (and (> this-slot 0) (> slot 0)) + (and (< this-slot 0) (< slot 0))) + (abs (- slot this-slot)) + (+ (abs slot) (abs this-slot)))) + (unless (and best-slot (<= best-slot abs-slot)) + (setq best-window window) + (setq best-slot abs-slot)) + (if reversed + (cond + ((<= this-slot slot) + (setq next-window window)) + ((not prev-window) + (setq prev-window window))) + (cond + ((<= this-slot slot) + (setq prev-window window)) + ((not next-window) + (setq next-window window)))))))) + + ;; `this-window' is the first window with the same SLOT. + ;; `prev-window' is the window with the largest slot < SLOT. A new + ;; window will be created after it. + ;; `next-window' is the window with the smallest slot > SLOT. A new + ;; window will be created before it. + ;; `best-window' is the window with the smallest absolute + ;; difference of its slot and SLOT. + (or (and this-window + ;; Reuse `this-window'. + (with-current-buffer buffer + (setq window--sides-shown t)) + (window--display-buffer + buffer this-window 'reuse alist dedicated)) + (and (or (not max-slots) (< slots max-slots)) + (or (and next-window + ;; Make new window before `next-window'. + (let ((next-side (if left-or-right 'above 'left)) + (window-combination-resize 'side)) + (setq window (split-window-no-error + next-window nil next-side)))) + (and prev-window + ;; Make new window after `prev-window'. + (let ((prev-side (if left-or-right 'below 'right)) + (window-combination-resize 'side)) + (setq window (split-window-no-error + prev-window nil prev-side))))) + (set-window-parameter window 'window-slot slot) + (with-current-buffer buffer + (setq window--sides-shown t)) + (window--display-buffer + buffer window 'window alist dedicated)) + (and best-window + ;; Reuse `best-window'. + (progn + ;; Give best-window the new slot value. + (set-window-parameter best-window 'window-slot slot) + (with-current-buffer buffer + (setq window--sides-shown t)) + (window--display-buffer + buffer best-window 'reuse alist dedicated))))))))) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 9fdf12302..eda53a178 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -67,7 +67,7 @@ a brief description of some native window parameters that Emacs uses: `pop-to-buffer'. Doom popups sets this. The default is nil.") (defvar +popup-display-buffer-actions - '(display-buffer-reuse-window display-buffer-in-side-window) + '(display-buffer-reuse-window +popup-display-buffer) "The functions to use to display the popup buffer.") (defvar +popup-default-alist @@ -145,19 +145,19 @@ ALIST supports one custom parameter: `size', which will resolve to ;; (eval-when-compile - (set! :popup "^ \\*" '((slot . -1) (size . +popup-shrink-to-fit))) - (set! :popup "^\\*" nil '((select . t))) - (set! :popup "^\\*Completions" '((slot . -1)) '((transient . 0))) + (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t))) + (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) (set! :popup "^\\*Compilation" nil '((transient . 0) (quit . t))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) (set! :popup "^\\*Help" - '((slot . -1) (size . 0.2)) + '((slot . 2) (vslot . 2) (size . 0.2)) '((select . t))) (set! :popup "^\\*doom \\(?:term\\|eshell\\)" '((size . 0.25)) '((quit) (transient . 0))) (set! :popup "^\\*doom:" - '((size . 0.35)) + '((size . 0.35) (side . top)) '((select . t) (modeline . t) (quit) (transient)))) (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) From ad06eacdac9bf3948f969f2f1871c9b6348012d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 01:07:39 -0500 Subject: [PATCH 0182/4235] feature/popup: general refactor Adds +popup-origin-window, which contains the last non-popup you were in before a popup was opened. --- modules/feature/popup/+hacks.el | 4 +++- modules/feature/popup/autoload.el | 22 ++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index e639383e3..5e5398583 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -15,7 +15,9 @@ ;; `save-popups!' macro). ;; ;; Keep in mind, all this black magic may break in future updates, and will need -;; to be watched carefully for corner cases. +;; to be watched carefully for corner cases. Also, once this file is loaded, its +;; changes are irreversible without restarting Emacs! I don't like it either, +;; but I will address this over time. ;; ;; Hacks should be kept in alphabetical order, named after the feature they ;; modify, and should follow a ;; `package-name' header line. diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 917387486..1b7dfd191 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -27,7 +27,7 @@ the buffer is visible, then set another timer and try again later." (kill-process process)) (kill-buffer buffer))))))) -(defun +popup--init (window alist) +(defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the default window parameters for popup windows, clears leftover transient timers and enables `+popup-buffer-mode'." @@ -35,19 +35,20 @@ and enables `+popup-buffer-mode'." (window-preserve-size window (memq (window-parameter window 'window-side) '(left right)) t) - (when +popup--populate-wparams + (when (and alist +popup--populate-wparams) ;; Emacs 26+ will automatically map the window-parameters alist entry to ;; the popup window, so we need this for Emacs 25.x users (dolist (param (cdr (assq 'window-parameters alist))) (set-window-parameter window (car param) (cdr param)))) (set-window-parameter window 'popup t) (set-window-parameter window 'no-other-window t) - (set-window-parameter window 'delete-window #'+popup--destroy) + (set-window-parameter window 'delete-window #'+popup--delete-window) + (set-window-parameter window 'delete-other-windows #'+popup/close-all) (set-window-dedicated-p window 'popup) (+popup-buffer-mode +1) (run-hooks '+popup-create-window-hook))) -(defun +popup--destroy (window) +(defun +popup--delete-window (window) "Do housekeeping before destroying a popup window. + Disables `+popup-buffer-mode' so that any hooks attached to it get a chance to @@ -262,12 +263,10 @@ disabled." ;;;###autoload (defun +popup|kill-buffer-hook () "TODO" - (let ((buf (current-buffer)) - (+popup--inhibit-transient t)) - (when (+popup-buffer-p buf) - (when-let* ((window (get-buffer-window buf))) - (when (+popup-window-p window) - (+popup--destroy window)))))) + (when-let* ((window (get-buffer-window))) + (when (+popup-window-p window) + (let ((+popup--inhibit-transient t)) + (+popup--delete-window window))))) ;; @@ -335,8 +334,7 @@ This window parameter is ignored if FORCE-P is non-nil." the message buffer in a popup window." (interactive) (let ((+popup--inhibit-transient t)) - (cond ((+popup-windows) - (+popup/close-all t)) + (cond ((+popup-windows) (+popup/close-all t)) ((ignore-errors (+popup/restore))) ((display-buffer (get-buffer "*Messages*")))))) From c59f5844447ea8e3b8ac3a49badb718ba107973f Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 11 Jan 2018 15:49:50 +0100 Subject: [PATCH 0183/4235] Correctly report when rtags's client or server are not found. --- modules/lang/cc/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index bc63b9a71..182fef305 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -206,9 +206,9 @@ 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) - (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) + (let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) + (if (/= (length bins) 0) + (warn "cc-mode: couldn't find the rtag client and/or server programs %s, disabling rtags support" bins) (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) (set! :lookup '(c-mode c++-mode) :definition #'rtags-find-symbol-at-point From 637a678529004f4aa84a2f8f06600d3743a6d02d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 12:24:33 -0500 Subject: [PATCH 0184/4235] ui/doom-dashboard: fix unchanging default-directory #347 --- modules/ui/doom-dashboard/config.el | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index d9e256be3..92a20321f 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -26,6 +26,7 @@ Possible values: nil `default-directory' will never change") ;; +(defvar +doom-dashboard--first t) (defvar +doom-dashboard--last-cwd nil) (defvar +doom-dashboard--width 80) (defvar +doom-dashboard--height 0) @@ -95,10 +96,15 @@ Possible values: (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (when (daemonp) (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) - (if (doom-real-buffer-p) - (current-buffer) - (let ((default-directory doom-emacs-dir)) - (+doom-dashboard/open (selected-frame) t)))) + (cond ((doom-real-buffer-p) + (current-buffer)) + (+doom-dashboard--first + (prog1 + (let ((default-directory doom-emacs-dir)) + (+doom-dashboard/open (selected-frame) t)) + (setq +doom-dashboard--first nil))) + (t + (+doom-dashboard/open (selected-frame) t)))) (defun +doom-dashboard|reload-on-kill () "If this isn't a dashboard buffer, move along, but record its From 7f7dfb09599e693d90123f296f7f842db35e645a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 13:21:51 -0500 Subject: [PATCH 0185/4235] feature/evil: more vim-esque save messages Now when saving, you get a message like: "modules/feature/evil/config.el" 435L, 16678C written Instead of Wrote /home/hlissner/work/conf/doom-emacs/modules/feature/evil/config.el PEDANTRY INTENSIFIES --- modules/feature/evil/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 6d34aec14..d57a063a3 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -85,6 +85,14 @@ ;; --- evil hacks ------------------------- + (defun +evil|save-buffer () + "Shorter, vim-esque save messages." + (message "\"%s\" %dL, %dC written" + (file-relative-name buffer-file-truename (doom-project-root)) + (count-lines (point-min) (point-max)) + (buffer-size))) + (setq save-silently t) + (add-hook 'after-save-hook #'+evil|save-buffer) ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. (advice-add #'evil-force-normal-state :after #'doom/escape) ;; Ensure buffer is in normal mode when we leave it and return to it. From 2967b404d8b77baf0cbca484f39c539022395e15 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 22:17:35 -0500 Subject: [PATCH 0186/4235] feature/popup: don't let neotree reset its width Causes it to shrink everytime the wconf changes. --- modules/feature/popup/+hacks.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 5e5398583..1e8ad3170 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -143,6 +143,7 @@ the command buffer." ;; `neotree' (after! neotree + (advice-add #'neo-util--set-window-width :override #'ignore) (advice-remove #'balance-windows #'ad-Advice-balance-windows)) From 2f0822ed44cfd061ae6d9151b277ceea5873bb0a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Jan 2018 22:18:31 -0500 Subject: [PATCH 0187/4235] Remove aggressive load of use-package The autoload in core-packages takes care of it. --- core/core-lib.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 2d77fac8d..c1e4d6b89 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -3,8 +3,7 @@ (let ((load-path doom--site-load-path)) (require 'subr-x) (require 'cl-lib) - (require 'map) - (eval-when-compile (require 'use-package))) + (require 'map)) (when (version< emacs-version "26") (with-no-warnings From 507ee07513e56694eac9c9baf6249d169724fe77 Mon Sep 17 00:00:00 2001 From: Vikash Kathirvel Date: Fri, 12 Jan 2018 16:11:18 +0530 Subject: [PATCH 0188/4235] Fix race between eldoc and flycheck by delaying flycheck --- modules/feature/syntax-checker/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index c8d78f66a..42920bcc4 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -33,7 +33,7 @@ ;; fallback to flycheck-popup-tip in terminal Emacs flycheck-pos-tip-display-errors-tty-function #'flycheck-popup-tip-show-popup - flycheck-display-errors-delay 0.5)) + flycheck-display-errors-delay 0.7)) (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-mode flycheck-popup-tip-show-popup)) From 98fbbc533fe33f4b7f0b73b5a26bd48ea8a90ba4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jan 2018 14:05:15 -0500 Subject: [PATCH 0189/4235] feature/popup: improve emacs 25.x compatibility #349 --- modules/feature/popup/autoload.el | 88 +++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 1b7dfd191..f9d035fee 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -415,6 +415,94 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; Popup actions ;; +(when (version< emacs-version "26") + (defun window--sides-reverse-on-frame-p (frame) + "Return non-nil when side windows should appear reversed on FRAME. +This uses some heuristics to guess the user's intentions when the +selected window of FRAME is a side window ." + (cond + ;; Reverse when `window-sides-reversed' is t. Do not reverse when + ;; `window-sides-reversed' is nil. + ((memq window-sides-reversed '(nil t)) + window-sides-reversed) + ;; Reverse when FRAME's selected window shows a right-to-left buffer. + ((let ((window (frame-selected-window frame))) + (when (and (not (window-parameter window 'window-side)) + (or (not (window-minibuffer-p window)) + (setq window (minibuffer-selected-window)))) + (with-current-buffer (window-buffer window) + (eq bidi-paragraph-direction 'right-to-left))))) + ;; Reverse when FRAME's `window-sides-main-selected-window' parameter + ;; specifies a live window showing a right-to-left buffer. + ((let ((window (frame-parameter + frame 'window-sides-main-selected-window))) + (when (window-live-p window) + (with-current-buffer (window-buffer window) + (eq bidi-paragraph-direction 'right-to-left))))) + ;; Reverse when all windows in FRAME's main window show right-to-left + ;; buffers. + (t + (catch 'found + (walk-window-subtree + (lambda (window) + (with-current-buffer (window-buffer window) + (when (eq bidi-paragraph-direction 'left-to-right) + (throw 'found nil)))) + (window-main-window frame)) + t)))) + + (defun window--make-major-side-window (buffer side slot &optional alist) + "Display BUFFER in a new major side window on the selected frame. +SIDE must be one of `left', `top', `right' or `bottom'. SLOT +specifies the slot to use. ALIST is an association list of +symbols and values as passed to `display-buffer-in-side-window'. +Return the new window, nil if its creation failed. + +This is an auxiliary function of `display-buffer-in-side-window' +and may be called only if no window on SIDE exists yet." + (let* ((left-or-right (memq side '(left right))) + (next-to (window--make-major-side-window-next-to side)) + (on-side (cond + ((eq side 'top) 'above) + ((eq side 'bottom) 'below) + (t side))) + (window--sides-inhibit-check t) + ;; The following two bindings will tell `split-window' to take + ;; the space for the new window from the selected frame's main + ;; window and not make a new parent window unless needed. + (window-combination-resize 'side) + (window-combination-limit nil) + (window (split-window-no-error next-to nil on-side))) + (when window + ;; Initialize `window-side' parameter of new window to SIDE and + ;; make that parameter persistent. + (set-window-parameter window 'window-side side) + (add-to-list 'window-persistent-parameters '(window-side . writable)) + ;; Install `window-slot' parameter of new window and make that + ;; parameter persistent. + (set-window-parameter window 'window-slot slot) + (add-to-list 'window-persistent-parameters '(window-slot . writable)) + ;; Auto-adjust height/width of new window unless a size has been + ;; explicitly requested. + (unless (if left-or-right + (cdr (assq 'window-width alist)) + (cdr (assq 'window-height alist))) + (setq alist + (cons + (cons + (if left-or-right 'window-width 'window-height) + (/ (window-total-size (frame-root-window) left-or-right) + ;; By default use a fourth of the size of the frame's + ;; root window. + 4)) + alist))) + (with-current-buffer buffer + (setq window--sides-shown t)) + ;; Install BUFFER in new window and return WINDOW. + (window--display-buffer buffer window 'window alist 'side)))) + + (advice-add #'window--sides-check :override #'ignore)) + ;;;###autoload (defun +popup-display-buffer (buffer alist) "A `display-buffer' action that serves as an alternative to From 987805de5f28623f2909df28e205017c400c5f7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jan 2018 14:31:58 -0500 Subject: [PATCH 0190/4235] Fix recursive load errors with multiple doom! calls #352 --- core/core-packages.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 83c9e066e..f89ecf867 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -218,10 +218,9 @@ This aggressively reloads core autoload files." "Adds MODULES to `doom-modules'. MODULES must be in mplist format. e.g '(:feature evil :lang emacs-lisp javascript java)" - (unless doom-modules - (setq doom-modules (make-hash-table :test #'equal - :size (+ 5 (length modules)) - :rehash-threshold 1.0))) + (setq doom-modules (make-hash-table :test #'equal + :size (+ 5 (length modules)) + :rehash-threshold 1.0)) (let (mode) (dolist (m modules) (cond ((keywordp m) (setq mode m)) @@ -260,7 +259,9 @@ added, if the file exists." (defun doom-module-enabled-p (module submodule) "Returns t if MODULE->SUBMODULE is present in `doom-modules'." - (and (doom-module-get module submodule) t)) + (and (hash-table-p doom-modules) + (doom-module-get module submodule) + t)) (defun doom-module-enable (module submodule &optional flags) "Adds MODULE and SUBMODULE to `doom-modules', overwriting it if it exists. @@ -399,7 +400,8 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (if (not (file-directory-p module-path)) (lwarn 'doom-modules :warning "Couldn't find module '%s %s'" module submodule) - (doom-module-enable module submodule flags) + (when (hash-table-p doom-modules) + (doom-module-enable module submodule flags)) `(condition-case-unless-debug ex (progn (load! init ,module-path t) From 87856642674d8c34be94993df02f0f5fa24df9dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jan 2018 15:09:08 -0500 Subject: [PATCH 0191/4235] feature/popup: replace split-window-no-error calls #349 split-window-no-error is a Emacs 26+ function. --- modules/feature/popup/autoload.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index f9d035fee..035d9a83d 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -472,7 +472,7 @@ and may be called only if no window on SIDE exists yet." ;; window and not make a new parent window unless needed. (window-combination-resize 'side) (window-combination-limit nil) - (window (split-window-no-error next-to nil on-side))) + (window (ignore-errors (split-window next-to nil on-side)))) (when window ;; Initialize `window-side' parameter of new window to SIDE and ;; make that parameter persistent. @@ -609,14 +609,14 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set ;; Make new window before `next-window'. (let ((next-side (if left-or-right 'above 'left)) (window-combination-resize 'side)) - (setq window (split-window-no-error - next-window nil next-side)))) + (setq window + (ignore-errors (split-window next-window nil next-side))))) (and prev-window ;; Make new window after `prev-window'. (let ((prev-side (if left-or-right 'below 'right)) (window-combination-resize 'side)) - (setq window (split-window-no-error - prev-window nil prev-side))))) + (setq window + (ignore-errors (split-window prev-window nil prev-side)))))) (set-window-parameter window 'window-slot slot) (with-current-buffer buffer (setq window--sides-shown t)) From e6e1282346273010e7fb250fbbd3d76c3ae99658 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jan 2018 18:41:06 -0500 Subject: [PATCH 0192/4235] ui/doom-dashboard: fix recentf, project & bookmark buttons When none of these buttons' commands were remapped, you'd get a commandp nil error. --- modules/ui/doom-dashboard/config.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 92a20321f..a9058858e 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -274,10 +274,13 @@ controlled by `+doom-dashboard-pwd-policy'." '("See agenda for this week" "calendar" (call-interactively 'org-agenda-list))) ("Recently opened files" "file-text" - (call-interactively (command-remapping 'recentf-open-files))) + (call-interactively (or (command-remapping #'recentf-open-files) + #'recentf-open-files))) ("Open project" "briefcase" - (call-interactively (command-remapping 'projectile-switch-project))) + (call-interactively (or (command-remapping #'projectile-switch-project) + #'projectile-switch-project))) ("Jump to bookmark" "bookmark" - (call-interactively (command-remapping 'bookmark-jump))) + (call-interactively (or (command-remapping #'bookmark-jump) + #'bookmark-jump))) ("Edit emacs.d" "tools" (find-file (expand-file-name "init.el" doom-emacs-dir))))))) From 28ac52e4dbb280034f5401ee4b88674f967863d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jan 2018 19:13:01 -0500 Subject: [PATCH 0193/4235] feature/popup: define window-sides-reversed #349 --- modules/feature/popup/autoload.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 035d9a83d..5b0e9e386 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -416,6 +416,8 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; (when (version< emacs-version "26") + (defvar window-sides-reversed nil) + (defun window--sides-reverse-on-frame-p (frame) "Return non-nil when side windows should appear reversed on FRAME. This uses some heuristics to guess the user's intentions when the From c63aba39acdf531c3f571eeff389deddda21856d Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Sat, 13 Jan 2018 17:26:40 +0800 Subject: [PATCH 0194/4235] Add: =calendar app --- modules/app/calendar/autoload.el | 29 +++++++++++++ modules/app/calendar/config.el | 57 +++++++++++++++++++++++++ modules/app/calendar/packages.el | 7 ++++ modules/app/calendar/readme.org | 71 ++++++++++++++++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 modules/app/calendar/autoload.el create mode 100644 modules/app/calendar/config.el create mode 100644 modules/app/calendar/packages.el create mode 100644 modules/app/calendar/readme.org diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el new file mode 100644 index 000000000..24930754e --- /dev/null +++ b/modules/app/calendar/autoload.el @@ -0,0 +1,29 @@ +;;; private/calendar/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun =calendar () + "Activate (or switch to) `calendar' in its workspace." + (interactive) + (unless (featurep! :feature workspaces) + (user-error ":feature workspaces is required, but disabled")) + (+workspace-switch "Calendar" t) + (if-let* ((buf (cl-find-if (lambda (it) (string-match-p "^\\*cfw" (buffer-name (window-buffer it)))) + (doom-visible-windows)))) + (select-window (get-buffer-window buf)) (call-interactively '+calendar-open-calendar-function)) + (+workspace/display)) + +;;;###autoload +(defun +calendar/quit () + (interactive) + (+workspace/delete "Calendar")) + +;;;###autoload +(defun +calendar/open-calendar () + (interactive) + (cfw:open-calendar-buffer + ;; :custom-map cfw:my-cal-map + :contents-sources + (list + (cfw:org-create-source (doom-color 'fg)) ; orgmode source + ))) + diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el new file mode 100644 index 000000000..82bede916 --- /dev/null +++ b/modules/app/calendar/config.el @@ -0,0 +1,57 @@ +;;; private/calendar/config.el -*- lexical-binding: t; -*- + +(defvar +calendar-org-gcal-secret-file "~/.emacs.d/modules/private/org/secret.el") +(defvar +calendar-open-calendar-function '+calendar/open-calendar) +(def-package! calfw + :commands (cfw:open-calendar-buffer) + :config + + ;; better frame for calendar + (setq + cfw:face-item-separator-color nil + cfw:fchar-junction ?╋ + cfw:fchar-vertical-line ?┃ + cfw:fchar-horizontal-line ?━ + cfw:fchar-left-junction ?┣ + cfw:fchar-right-junction ?┫ + cfw:fchar-top-junction ?┯ + cfw:fchar-top-left-corner ?┏ + cfw:fchar-top-right-corner ?┓) + + + (defun cfw:render-button (title command &optional state) + "render-button + TITLE + COMMAND + STATE" + (let ((text (concat " " title " ")) + (keymap (make-sparse-keymap))) + (cfw:rt text (if state 'cfw:face-toolbar-button-on + 'cfw:face-toolbar-button-off)) + (define-key keymap [mouse-1] command) + (cfw:tp text 'keymap keymap) + (cfw:tp text 'mouse-face 'highlight) + text)) + + (add-hook! 'cfw:calendar-mode-hook (solaire-mode +1) + (doom-hide-modeline-mode))) + +(def-package! calfw-org + :commands (cfw:open-org-calendar + cfw:org-create-source + cfw:open-org-calendar-withkevin + my-open-calendar)) + +(def-package! org-gcal + :commands (org-gcal-sync + org-gcal-fetch + org-gcal-post-at-point + org-gcal-delete-at-point) + :config + (load-file '+calendar-org-gcal-secret-file) + ;; hack to avoid the deferred.el error + (defun org-gcal--notify (title mes) + (message "org-gcal::%s - %s" title mes))) + +;; (def-package! alert) + diff --git a/modules/app/calendar/packages.el b/modules/app/calendar/packages.el new file mode 100644 index 000000000..889ec263d --- /dev/null +++ b/modules/app/calendar/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; private/calendar/packages.el + + +(package! calfw) +(package! calfw-org) +(package! org-gcal) diff --git a/modules/app/calendar/readme.org b/modules/app/calendar/readme.org new file mode 100644 index 000000000..c10af46ea --- /dev/null +++ b/modules/app/calendar/readme.org @@ -0,0 +1,71 @@ +#+TITLE: `=Calendar App` +* Setup sync between google calendar and org file +:PROPERTIES: +:ID: 5E190E8A-CA26-4679-B5F8-BF9CFD289271 +:END: +- Checkout https://github.com/myuhe/org-gcal.el, put the following content in a file ~secret.el~ and set the variable `+calendar-org-gcal-secret-file` to the path of that file. + #+BEGIN_SRC emacs-lisp +(setq org-gcal-client-id "your-id-foo.apps.googleusercontent.com" + org-gcal-client-secret "your-secret" + org-gcal-file-alist '(("your-mail@gmail.com" . "~/schedule.org") + ("another-mail@gmail.com" . "~/task.org"))) + #+END_SRC +* Doom faces +:PROPERTIES: +:ID: 8223894E-EA68-4259-A2EA-AF7E3653C610 +:END: +I'm using the following setting: +#+BEGIN_SRC emacs-lisp +;; calfw +(cfw:face-title :foreground blue :bold bold :height 2.0 :inherit 'variable-pitch) +(cfw:face-header :foreground (doom-blend blue bg 0.8) :bold bold) +(cfw:face-sunday :foreground (doom-blend red bg 0.8) :bold bold) +(cfw:face-saturday :foreground (doom-blend red bg 0.8) :bold bold) +(cfw:face-holiday :foreground nil :background bg-alt :bold bold) +(cfw:face-grid :foreground vertical-bar) +(cfw:face-periods :foreground yellow) +(cfw:face-toolbar :foreground nil :background nil) +(cfw:face-toolbar-button-off :foreground base6 :bold bold :inherit 'variable-pitch) +(cfw:face-toolbar-button-on :foreground blue :bold bold :inherit 'variable-pitch) + +(cfw:face-default-content :foreground fg) +(cfw:face-day-title :foreground fg :bold bold) +(cfw:face-today-title :foreground bg :background blue :bold bold) +(cfw:face-default-day :bold bold) +(cfw:face-today :foreground nil :background nil :bold bold) +(cfw:face-annotation :foreground violet) +(cfw:face-disable :foreground grey) +(cfw:face-select :background region) +#+END_SRC +* Adjust calendar to be included +:PROPERTIES: +:ID: D734975C-4B49-4F66-A088-AB2707A77537 +:END: +Checkout example from https://github.com/kiwanami/emacs-calfw +#+BEGIN_SRC emacs-lisp +(defun my-open-calendar () + (interactive) + (cfw:open-calendar-buffer + :contents-sources + (list + (cfw:org-create-source "Green") ; orgmode source + (cfw:howm-create-source "Blue") ; howm source + (cfw:cal-create-source "Orange") ; diary source + (cfw:ical-create-source "Moon" "~/moon.ics" "Gray") ; ICS source1 + (cfw:ical-create-source "gcal" "https://..../basic.ics" "IndianRed") ; google calendar ICS + ))) +#+END_SRC +Specifically, if you want to adjust the org files to be included, use a ~let~ binding to set the ~org-agenda-files~ like below: +#+BEGIN_SRC emacs-lisp +;;;###autoload +(defun cfw:open-org-calendar-with-cal1 () + (interactive) + (let ((org-agenda-files '("/path/to/org/" "/path/to/cal1.org"))) + (call-interactively '+calendar/open-calendar))) + +;;;###autoload +(defun cfw:open-org-calendar-with-cal2 () + (interactive) + (let ((org-agenda-files '("/path/to/org/" "/path/to/cal2.org"))) + (call-interactively '+calendar/open-calendar))) +#+END_SRC From 7236404f6725d904c3cf63c2352925b7d046912f Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Sat, 13 Jan 2018 17:35:59 +0800 Subject: [PATCH 0195/4235] Fix: hotfix of +calendar-open-calendar-function --- modules/app/calendar/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 24930754e..76dbeeecb 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -9,7 +9,7 @@ (+workspace-switch "Calendar" t) (if-let* ((buf (cl-find-if (lambda (it) (string-match-p "^\\*cfw" (buffer-name (window-buffer it)))) (doom-visible-windows)))) - (select-window (get-buffer-window buf)) (call-interactively '+calendar-open-calendar-function)) + (select-window (get-buffer-window buf)) (call-interactively +calendar-open-calendar-function)) (+workspace/display)) ;;;###autoload From 5bfa36580967ead42e1994ae0d67458cc7f6266e Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Sat, 13 Jan 2018 17:57:38 +0800 Subject: [PATCH 0196/4235] Fix: hotfix of +calendar-org-gcal-secret-file --- modules/app/calendar/config.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index 82bede916..581412bae 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -9,6 +9,7 @@ ;; better frame for calendar (setq cfw:face-item-separator-color nil + cfw:render-line-breaker 'cfw:render-line-breaker-none cfw:fchar-junction ?╋ cfw:fchar-vertical-line ?┃ cfw:fchar-horizontal-line ?━ @@ -34,7 +35,10 @@ text)) (add-hook! 'cfw:calendar-mode-hook (solaire-mode +1) - (doom-hide-modeline-mode))) + (doom-hide-modeline-mode)) + (map! + :map cfw:calendar-mode-map + "q" #'+calendar/quit)) (def-package! calfw-org :commands (cfw:open-org-calendar @@ -48,10 +52,9 @@ org-gcal-post-at-point org-gcal-delete-at-point) :config - (load-file '+calendar-org-gcal-secret-file) + (load-file +calendar-org-gcal-secret-file) ;; hack to avoid the deferred.el error (defun org-gcal--notify (title mes) (message "org-gcal::%s - %s" title mes))) ;; (def-package! alert) - From b741d77e7897707a8739f2eae6b0ba083c5a0fad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 13 Jan 2018 15:09:09 -0500 Subject: [PATCH 0197/4235] feature/syntax-checker: autoload pkg-info-version-info #356 --- modules/feature/syntax-checker/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 42920bcc4..d55cc42c9 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -1,5 +1,9 @@ ;;; feature/syntax-checker/config.el -*- lexical-binding: t; -*- +;; pkg-info doesn't get autoloaded when `flycheck-version' needs it, so we do +;; it ourselves: +(autoload 'pkg-info-version-info "pkg-info") + (def-package! flycheck :commands (flycheck-mode flycheck-list-errors flycheck-buffer) :config From 0594f0798f1f308de61f49c4f187caa11565aa0b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 13 Jan 2018 15:10:38 -0500 Subject: [PATCH 0198/4235] tools/neotree: fix typo (width-width => size) #357 --- modules/tools/neotree/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/neotree/config.el b/modules/tools/neotree/config.el index 38ae318e8..5d0a9fc45 100644 --- a/modules/tools/neotree/config.el +++ b/modules/tools/neotree/config.el @@ -34,7 +34,7 @@ "^#.*#$")) (set! :popup "^ ?\\*NeoTree" - `((side . ,neo-window-position) (width-width . ,neo-window-width)) + `((side . ,neo-window-position) (size . ,neo-window-width)) '((quit . current) (select . t))) (when (bound-and-true-p winner-mode) From 47d15fdf8ac6db00d10eb53e375e2fd430c6ed63 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 13 Jan 2018 15:11:28 -0500 Subject: [PATCH 0199/4235] Make startup benchmark a little more accurate #353 Also sets doom-init-time first thing in doom-post-init-hook. --- core/core-packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index f89ecf867..7c1d9c936 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -292,7 +292,7 @@ include all modules, enabled or otherwise." ;; error in the plugin count in exchange for faster startup. (length doom--package-load-path) (hash-table-size doom-modules) - (setq doom-init-time (float-time (time-subtract after-init-time before-init-time))))) + (setq doom-init-time (float-time (time-subtract (current-time) before-init-time))))) ;; @@ -319,7 +319,7 @@ MODULES is an malformed plist of modules to load." (require 'server) (unless (server-running-p) (server-start))) - (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark t) + (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark) (message "Doom modules initialized")))) (defmacro def-package! (name &rest plist) From 1f454b56a411c7035c336a1cf11a9ecacb5c2e85 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 13 Jan 2018 15:30:01 -0500 Subject: [PATCH 0200/4235] feature/evil: ensure evil-embrace's hooks run sooner #345 evil-embrace's hooks would run too late (after evil-surround loads), requiring you to reload affected buffers. --- modules/feature/evil/config.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index d57a063a3..f7b4d0747 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -162,6 +162,17 @@ (def-package! evil-embrace :after evil-surround + :commands (embrace-add-pair embrace-add-pair-regexp) + :init + (add-hook 'LaTeX-mode-hook #'embrace-LaTeX-mode-hook) + (add-hook 'org-mode-hook #'embrace-org-mode-hook) + ;; Add extra pairs + (add-hook! emacs-lisp-mode + (embrace-add-pair ?\` "`" "'")) + (add-hook! (emacs-lisp-mode lisp-mode) + (embrace-add-pair-regexp ?f "([^ ]+ " ")" #'+evil--embrace-elisp-fn)) + (add-hook! (org-mode LaTeX-mode) + (embrace-add-pair-regexp ?l "\\[a-z]+{" "}" #'+evil--embrace-latex)) :config (setq evil-embrace-show-help-p nil) (evil-embrace-enable-evil-surround-integration) @@ -200,17 +211,7 @@ :read-function #'+evil--embrace-escaped :left-regexp "\\[[{(]" :right-regexp "\\[]})]")) - (default-value 'embrace--pairs-list)) - - ;; Add extra pairs - (add-hook 'LaTeX-mode-hook #'embrace-LaTeX-mode-hook) - (add-hook 'org-mode-hook #'embrace-org-mode-hook) - (add-hook! emacs-lisp-mode - (embrace-add-pair ?\` "`" "'")) - (add-hook! (emacs-lisp-mode lisp-mode) - (embrace-add-pair-regexp ?f "([^ ]+ " ")" #'+evil--embrace-elisp-fn)) - (add-hook! (org-mode LaTeX-mode) - (embrace-add-pair-regexp ?l "\\[a-z]+{" "}" #'+evil--embrace-latex))) + (default-value 'embrace--pairs-list))) (def-package! evil-escape From 41a84a3c6ddf3265a89f54eb7ae226122ffc51b6 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Sun, 14 Jan 2018 10:06:36 +0800 Subject: [PATCH 0201/4235] Add: +calendar/quit binding to "q" --- modules/app/calendar/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index 581412bae..a7d5132e6 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -34,6 +34,8 @@ (cfw:tp text 'mouse-face 'highlight) text)) + (map! :map cfw:calendar-mode-map + "q" #'+calendar/quit) (add-hook! 'cfw:calendar-mode-hook (solaire-mode +1) (doom-hide-modeline-mode)) (map! From 5ee50c6b53948555319eec7c5c862ab3d963085d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jan 2018 02:04:30 -0500 Subject: [PATCH 0202/4235] Move wgrep config from core-editor to completion/{ivy,helm} --- core/core-editor.el | 4 ---- core/packages.el | 1 - modules/completion/helm/config.el | 4 ++++ modules/completion/helm/packages.el | 1 + modules/completion/ivy/config.el | 5 +++++ modules/completion/ivy/packages.el | 1 + 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 4a882a67c..644e36fc4 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -226,9 +226,5 @@ extension, try to guess one." (def-package! smart-forward :commands (smart-up smart-down smart-backward smart-forward)) -(def-package! wgrep - :commands (wgrep-setup wgrep-change-to-wgrep-mode) - :config (setq wgrep-auto-save-buffer t)) - (provide 'core-editor) ;;; core-editor.el ends here diff --git a/core/packages.el b/core/packages.el index 054197e4a..8a1518f3f 100644 --- a/core/packages.el +++ b/core/packages.el @@ -34,7 +34,6 @@ (package! smart-forward) (package! smartparens) (package! undo-tree) -(package! wgrep) ;; core-projects.el (package! projectile) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index a247cc1f2..77f7a2855 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -119,3 +119,7 @@ (def-package! helm-describe-modes :commands helm-describe-modes) + +(def-package! wgrep + :commands (wgrep-setup wgrep-change-to-wgrep-mode) + :config (setq wgrep-auto-save-buffer t)) diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index ca7338972..b4199e698 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -9,3 +9,4 @@ (package! helm-describe-modes :recipe (:fetcher github :repo "emacs-helm/helm-describe-modes")) (package! helm-projectile) (package! helm-swoop) +(package! wgrep) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 9e20cc4f3..4281d0a10 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -162,3 +162,8 @@ immediately runs it on the current candidate (ending the ivy session)." ("t" (setq truncate-lines (not truncate-lines))) ("C" ivy-toggle-case-fold) ("o" ivy-occur :exit t))) + + +(def-package! wgrep + :commands (wgrep-setup wgrep-change-to-wgrep-mode) + :config (setq wgrep-auto-save-buffer t)) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 9777d1000..fab27d27e 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -8,3 +8,4 @@ (package! swiper) (package! ivy-hydra) (package! ivy-rich) +(package! wgrep) From ea97600507815649f57c00f1190dc88b62413ed1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jan 2018 13:40:11 -0500 Subject: [PATCH 0203/4235] feature/evil: refactor evil-embrace hooks #345 --- modules/feature/evil/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f7b4d0747..4f1789b0a 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -163,9 +163,9 @@ (def-package! evil-embrace :after evil-surround :commands (embrace-add-pair embrace-add-pair-regexp) + :hook (LaTeX-mode . embrace-LaTeX-mode-hook) + :hook (org-mode . embrace-org-mode-hook) :init - (add-hook 'LaTeX-mode-hook #'embrace-LaTeX-mode-hook) - (add-hook 'org-mode-hook #'embrace-org-mode-hook) ;; Add extra pairs (add-hook! emacs-lisp-mode (embrace-add-pair ?\` "`" "'")) From 10167b85b5f05f99a0f62e2b34e096801d3047b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jan 2018 16:21:18 -0500 Subject: [PATCH 0204/4235] feature/workspaces: remove +workspace-change-hook persp-mode provides the following hooks already (among many others): + persp-{before,after}-switch-functions + persp-renamed-functions + persp-created-functions + persp-before-kill-functions This makes +workspace-change-hook redundant. --- .../feature/workspaces/autoload/workspaces.el | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index d978d6981..4b4f5e20b 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -3,9 +3,6 @@ (defvar +workspace-data-file "_workspaces" "The file basename in which to store single workspace perspectives.") -(defvar +workspace-change-hook () - "Hooks run when workspaces are added, removed, renamed or switched to.") - (defvar +workspace--last nil) (defvar +workspace--index 0) @@ -155,9 +152,7 @@ Otherwise return t on success, nil otherwise." (error "Can't create a new '%s' workspace" name)) (when (+workspace-exists-p name) (error "A workspace named '%s' already exists" name)) - (when (persp-add-new name) - (run-hooks '+workspace-change-hook) - t)) + (persp-add-new name)) ;;;###autoload (defun +workspace-rename (name new-name) @@ -165,9 +160,7 @@ Otherwise return t on success, nil otherwise." success, nil otherwise." (when (+workspace--protected-p name) (error "Can't rename '%s' workspace" name)) - (when (persp-rename new-name (+workspace-get name)) - (run-hooks '+workspace-change-hook) - name)) + (persp-rename new-name (+workspace-get name))) ;;;###autoload (defun +workspace-delete (name &optional inhibit-kill-p) @@ -178,9 +171,7 @@ buffers." (error "Can't delete '%s' workspace" name)) (+workspace-get name) ; error checking (persp-kill name inhibit-kill-p) - (unless (+workspace-exists-p name) - (run-hooks '+workspace-change-hook) - t)) + (not (+workspace-exists-p name))) ;;;###autoload (defun +workspace-switch (name &optional auto-create-p) @@ -193,11 +184,9 @@ buffers." (setq +workspace--last (or (and (not (string= old-name persp-nil-name)) old-name) - +workspaces-main))) - (persp-frame-switch name) - (when (equal (+workspace-current-name) name) - (run-hooks '+workspace-change-hook) - t)) + +workspaces-main)) + (persp-frame-switch name) + (equal (+workspace-current-name) name))) ;;;###autoload (defun +workspace-on-new-frame (frame &optional _new-frame-p) From eece13f2ca39aaf58baed7593d56baabdb2765a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jan 2018 23:37:48 -0500 Subject: [PATCH 0205/4235] Lazy-load evil-easymotion properly via keybinds #335 The package wasn't set up properly to autoload until evil-snipe did, making its functionality inaccessible without an explicit (require 'evil-easymotion) --- modules/feature/evil/config.el | 3 +-- modules/private/default/config.el | 36 +++++++++++++++++-------------- 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 4f1789b0a..50f7aa972 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -156,8 +156,7 @@ (def-package! evil-easymotion - :after evil-snipe - :commands evilem-create) + :commands (evilem-create evilem-default-keybindings)) (def-package! evil-embrace diff --git a/modules/private/default/config.el b/modules/private/default/config.el index 4379a6955..ad2454c00 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -61,20 +61,24 @@ (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) + ;; lazy-load `evil-easymotion' + (map! :m "gs" #'+default/easymotion) + (defun +default/easymotion () + (interactive) + (let ((prefix (this-command-keys))) (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)))))) + (map! :map evilem-map + "n" (evilem-create #'evil-ex-search-next) + "N" (evilem-create #'evil-ex-search-previous) + "s" (evilem-create #'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))) + "S" (evilem-create #'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)))) + (set-transient-map evilem-map) + (which-key-reload-key-sequence prefix)))) From 227e7b095d27469b79a7e335fff94511086f7faf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Jan 2018 00:08:27 -0500 Subject: [PATCH 0206/4235] feature/evil: refactor how evil-snipe + bindings are autoloaded --- modules/feature/evil/config.el | 5 +++-- modules/private/default/+bindings.el | 17 ++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 50f7aa972..796c2cf55 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -307,6 +307,7 @@ the new algorithm is confusing, like in python or ruby." (def-package! evil-snipe :commands (evil-snipe-mode evil-snipe-override-mode evil-snipe-local-mode evil-snipe-override-local-mode) + :hook (doom-post-init . evil-snipe-mode) :init (setq evil-snipe-smart-case t evil-snipe-scope 'line @@ -316,8 +317,8 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-aliases '((?\[ "[[{(]") (?\] "[]})]") (?\; "[;:]"))) - (add-hook 'doom-post-init-hook #'evil-snipe-mode) - (add-hook 'doom-post-init-hook #'evil-snipe-override-mode)) + :config + (evil-snipe-override-mode +1)) (def-package! evil-surround diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 539be4d0c..1d2e31f1a 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -446,15 +446,14 @@ ;; 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))))))) + :map evil-snipe-parent-transient-map + ;; switch to evil-easymotion/avy after a snipe + "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 c166449f082374db4edc57ae1cc26fef7fb2969a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Jan 2018 00:39:23 -0500 Subject: [PATCH 0207/4235] feature/popup: preserve size later in init process So it can't be overwritten via ALIST. --- modules/feature/popup/autoload.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 5b0e9e386..714145b63 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -32,9 +32,6 @@ the buffer is visible, then set another timer and try again later." default window parameters for popup windows, clears leftover transient timers and enables `+popup-buffer-mode'." (with-selected-window window - (window-preserve-size - window (memq (window-parameter window 'window-side) - '(left right)) t) (when (and alist +popup--populate-wparams) ;; Emacs 26+ will automatically map the window-parameters alist entry to ;; the popup window, so we need this for Emacs 25.x users @@ -45,6 +42,10 @@ and enables `+popup-buffer-mode'." (set-window-parameter window 'delete-window #'+popup--delete-window) (set-window-parameter window 'delete-other-windows #'+popup/close-all) (set-window-dedicated-p window 'popup) + (window-preserve-size + window (memq (window-parameter window 'window-side) + '(left right)) + t) (+popup-buffer-mode +1) (run-hooks '+popup-create-window-hook))) From 6790d666e070c787ebf822270283401f7107952c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Jan 2018 00:40:22 -0500 Subject: [PATCH 0208/4235] ui/doom-modeline: init on doom-init-theme-hook Initialize modeline with the theme. --- modules/ui/doom-modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 992078d6e..8f6a586a4 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -624,7 +624,7 @@ Returns \"\" to not break --no-window-system." ;; Bootstrap ;; -(add-hook 'doom-init-ui-hook #'+doom-modeline|init) +(add-hook 'doom-init-theme-hook #'+doom-modeline|init) (add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) (add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) From 45c2221316f366023e7b2188cd2e56ca6834486f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Jan 2018 00:43:17 -0500 Subject: [PATCH 0209/4235] General update for docstrings and comments & minor refactor --- core/core-editor.el | 5 ++--- core/packages.el | 2 -- modules/completion/ivy/config.el | 7 ++++--- modules/feature/evil/config.el | 3 +-- modules/feature/syntax-checker/config.el | 4 ++-- modules/feature/workspaces/autoload/workspaces.el | 2 +- modules/tools/eshell/config.el | 3 ++- 7 files changed, 12 insertions(+), 14 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 644e36fc4..6f1bf5e9e 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -113,9 +113,8 @@ fundamental-mode) for performance sake." ;; Handles whitespace (tabs/spaces) settings externally. This way projects can ;; specify their own formatting rules. (def-package! editorconfig + :hook (doom-init . editorconfig-mode) :config - (add-hook 'doom-init-hook #'editorconfig-mode) - ;; editorconfig cannot procure the correct settings for extension-less files. ;; Executable scripts with a shebang line, for example. So why not use Emacs' ;; major mode to drop editorconfig a hint? This is accomplished by temporarily @@ -180,8 +179,8 @@ extension, try to guess one." ;; Branching undo (def-package! undo-tree + :hook (doom-init . global-undo-tree-mode) :config - (add-hook 'doom-init-hook #'global-undo-tree-mode) ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! (setq undo-tree-auto-save-history nil diff --git a/core/packages.el b/core/packages.el index 8a1518f3f..4b53245d1 100644 --- a/core/packages.el +++ b/core/packages.el @@ -2,8 +2,6 @@ ;;; core/packages.el ;; core-os.el -;; In case this config is shared across multiple computers (like mine is), let's -;; protect these from autoremoval. (package! exec-path-from-shell :ignore (not IS-MAC)) (package! osx-clipboard :ignore (not IS-MAC)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 4281d0a10..59ee560e7 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -101,9 +101,10 @@ immediately runs it on the current candidate (ending the ivy session)." cmd '(("O" +ivy-git-grep-other-window-action "open in other window")))) - ;; 1. Remove character limit from `counsel-ag-function' - ;; 2. This may need to be updated frequently, to meet changes upstream - ;; 3. counsel-ag, counsel-rg and counsel-pt all use this function + ;; Removes character limit from `counsel-ag-function' + ;; + ;; This may need to be updated frequently, to meet changes upstream + ;; counsel-ag, counsel-rg and counsel-pt all use this function (advice-add #'counsel-ag-function :override #'+ivy*counsel-ag-function)) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 796c2cf55..117f586e9 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -21,7 +21,7 @@ (autoload 'goto-last-change-reverse "goto-chg") (def-package! evil - :init + :config (setq evil-want-C-u-scroll t evil-want-visual-char-semi-exclusive t evil-want-Y-yank-to-eol t @@ -39,7 +39,6 @@ ;; don't activate mark on shift-click shift-select-mode nil) - :config (add-hook 'doom-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index d55cc42c9..109f82443 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -1,7 +1,7 @@ ;;; feature/syntax-checker/config.el -*- lexical-binding: t; -*- -;; pkg-info doesn't get autoloaded when `flycheck-version' needs it, so we do -;; it ourselves: +;; Since Doom doesn't use `package-initialize', pkg-info won't get autoloaded +;; when `flycheck-version' needs it, so we need this: (autoload 'pkg-info-version-info "pkg-info") (def-package! flycheck diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 4b4f5e20b..7119a4a77 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -52,7 +52,7 @@ ;;;###autoload (defun +workspace-get (name &optional noerror) - "Returns a workspace (perspective hash table) named NAME." + "Returns a workspace (perspective struct) named NAME." (when-let* ((persp (persp-get-by-name name))) (cond ((+workspace-p persp) persp) ((not noerror) (error "'%s' is an invalid workspace" name))))) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index cc7ea5d6c..8e34c8a50 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -5,7 +5,8 @@ ;; see: ;; + `+eshell/open': open in current buffer ;; + `+eshell/open-popup': open in a popup -;; + `+eshell/open-workspace': open in separate tab (requires :feature workspaces) +;; + `+eshell/open-workspace': open in separate tab (requires :feature +;; workspaces) (def-package! eshell ; built-in :commands eshell-mode From 322e6afd55068ce9bf989de8668859087b569aa1 Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Mon, 15 Jan 2018 16:40:04 +0800 Subject: [PATCH 0210/4235] feature/evil: fix +evil/matchit-or-toggle-fold in magit modes - this function only worked in magit-status-mode but not other modes like magit-log-mode, magit-process-mode --- modules/feature/evil/autoload/folds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index b4706abc1..00bd8c6fe 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -88,7 +88,7 @@ (interactive) (ignore-errors (call-interactively - (cond ((eq major-mode 'magit-status-mode) + (cond ((string-prefix-p "magit" (symbol-name major-mode)) #'magit-section-toggle) ((+evil-fold-p) #'+evil:fold-toggle) From 3ff85f6f373f4eb96eeee2d6408cb687f1cbc0eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Jan 2018 01:55:06 -0500 Subject: [PATCH 0211/4235] feature/spellcheck: auto-check buffer on flycheck-mode --- modules/feature/spellcheck/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 37e9b1cc0..9f2158a32 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -5,7 +5,13 @@ :config (setq ispell-program-name (executable-find "aspell") ispell-list-command "--list" - ispell-extr-args '("--dont-tex-check-comments"))) + ispell-extr-args '("--dont-tex-check-comments")) + + (defun +spellcheck|automatically () + "Spellcheck the buffer when `flyspell-mode' is enabled." + (when flyspell-mode + (flyspell-buffer))) + (add-hook 'flyspell-mode-hook #'+spellcheck|automatically)) (def-package! flyspell-correct From facfeb5f7ad5caad9819b28208f9257ee80b0544 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Jan 2018 01:55:49 -0500 Subject: [PATCH 0212/4235] Correct flyspell highlighted word on mouse-1 or RET RET will only trigger if cursor is on the highlighted word. --- modules/private/default/+bindings.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 1d2e31f1a..0a1944359 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -478,6 +478,11 @@ ;; flyspell :m "]S" #'flyspell-correct-word-generic :m "[S" #'flyspell-correct-previous-word-generic + (:after flyspell + ;; Press RET on misspelled words to correct them + (:map flyspell-mouse-map + "RET" #'flyspell-correct-word-generic + "" #'flyspell-correct-word-generic)) ;; git-gutter :m "]d" #'git-gutter:next-hunk From 59f33855dd0b3f6f2f54a16b5aae0f56d1f8b376 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Jan 2018 23:08:23 -0500 Subject: [PATCH 0213/4235] Fix kill-this-buffer switching to fallback buffer too soon (again) --- 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 5badb3a87..03d2c1eda 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -532,14 +532,11 @@ instead)." (cond ((window-dedicated-p) (delete-window)) ((eq buf (doom-fallback-buffer)) - (bury-buffer) - (when (cdr (get-buffer-window-list)) - (doom--cycle-real-buffers nil))) + (doom--cycle-real-buffers -1)) ((doom-real-buffer-p buf) - (doom--cycle-real-buffers -1) - (kill-buffer buf) - (when (cdr (get-buffer-window-list)) - (doom--cycle-real-buffers nil))) + (doom--cycle-real-buffers + (if (delq buf (doom-real-buffer-list)) -1)) + (kill-buffer buf)) (t (funcall orig-fn))))) From 6b164a6103c40cc4b9b5eb77fb7b9bb80788ea1e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Jan 2018 04:17:19 -0500 Subject: [PATCH 0214/4235] lang/csharp: adapt to :lookup --- modules/lang/csharp/config.el | 51 ++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 84f05ad68..d86ca508c 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -15,34 +15,37 @@ (set! :company-backend 'csharp-mode '(company-omnisharp)) + (set! :lookup 'csharp-mode + :definition #'omnisharp-go-to-definition + :references #'omnisharp-find-usages + :documentation #'omnisharp-current-type-documentation) + (map! :map omnisharp-mode-map - :m "gd" #'omnisharp-go-to-definition + :localleader + :n "b" #'omnisharp-recompile - (:localleader - :n "b" #'omnisharp-recompile + (:prefix "r" + :n "i" #'omnisharp-fix-code-issue-at-point + :n "u" #'omnisharp-fix-usings + :n "r" #'omnisharp-rename + :n "a" #'omnisharp-show-last-auto-complete-result + :n "o" #'omnisharp-show-overloads-at-point) - (:prefix "r" - :n "i" #'omnisharp-fix-code-issue-at-point - :n "u" #'omnisharp-fix-usings - :n "r" #'omnisharp-rename - :n "a" #'omnisharp-show-last-auto-complete-result - :n "o" #'omnisharp-show-overloads-at-point) + (:prefix "f" + :n "u" #'omnisharp-find-usages + :n "i" #'omnisharp-find-implementations + :n "f" #'omnisharp-navigate-to-current-file-member + :n "m" #'omnisharp-navigate-to-solution-member + :n "M" #'omnisharp-navigate-to-solution-file-then-file-member + :n "F" #'omnisharp-navigate-to-solution-file + :n "r" #'omnisharp-navigate-to-region + :n "ti" #'omnisharp-current-type-information + :n "td" #'omnisharp-current-type-documentation) - (:prefix "f" - :n "u" #'omnisharp-find-usages - :n "i" #'omnisharp-find-implementations - :n "f" #'omnisharp-navigate-to-current-file-member - :n "m" #'omnisharp-navigate-to-solution-member - :n "M" #'omnisharp-navigate-to-solution-file-then-file-member - :n "F" #'omnisharp-navigate-to-solution-file - :n "r" #'omnisharp-navigate-to-region - :n "ti" #'omnisharp-current-type-information - :n "td" #'omnisharp-current-type-documentation) - - (:prefix "t" - :n "r" (λ! (omnisharp-unit-test "fixture")) - :n "s" (λ! (omnisharp-unit-test "single")) - :n "a" (λ! (omnisharp-unit-test "all")))))) + (:prefix "t" + :n "r" (λ! (omnisharp-unit-test "fixture")) + :n "s" (λ! (omnisharp-unit-test "single")) + :n "a" (λ! (omnisharp-unit-test "all"))))) (def-package! shader-mode :mode "\\.shader$") ; unity shaders From 381a4416edeb44b1966b71d8730155459ba1b3b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Jan 2018 02:44:12 -0500 Subject: [PATCH 0215/4235] feature/workspaces: major refactor & various fixes + Rewrite projectile integration. + Fix per-frame workspaces not cleaning up after itself when an frame-associated workspace (or its frame) is destroyed. + Alias +workspace-p to perspective-p instead of persp-p (which isn't as accurate, because it counts nil as a valid perspective). + Extract orphaned-buffer list functionality in +workspace-buffer-list into seperate function: +workspace-orphaned-buffer-list. + Allow toggle-debug-on-error to catch workspace errors. + Remove +workspace/kill-session-and-quit (never used) + Ensure persp-mode is loaded as late as possible. --- .../feature/workspaces/autoload/workspaces.el | 250 ++++++++---------- modules/feature/workspaces/config.el | 76 +++--- .../workspaces/test/autoload-workspaces.el | 1 + modules/private/default/+bindings.el | 2 +- 4 files changed, 159 insertions(+), 170 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 7119a4a77..8a6050e05 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -34,7 +34,8 @@ ;; --- Predicates ------------------------- ;;;###autoload -(defalias #'+workspace-p #'persp-p "Return t if OBJ is a perspective hash table.") +(defalias #'+workspace-p #'perspective-p + "Return t if OBJ is a perspective hash table.") ;;;###autoload (defun +workspace-exists-p (name) @@ -51,48 +52,52 @@ ;; --- Getters ---------------------------- ;;;###autoload -(defun +workspace-get (name &optional noerror) - "Returns a workspace (perspective struct) named NAME." - (when-let* ((persp (persp-get-by-name name))) - (cond ((+workspace-p persp) persp) - ((not noerror) (error "'%s' is an invalid workspace" name))))) +(defalias '+workspace-current #'get-current-persp + "Return the currently active workspace.") ;;;###autoload -(defalias '+workspace-current #'get-current-persp) +(defun +workspace-get (name &optional noerror) + "Return a workspace named NAME. Unless NOERROR is non-nil, this throws an +error if NAME doesn't exist." + (when-let* ((persp (persp-get-by-name name))) + (cond ((+workspace-p persp) persp) + ((not noerror) + (error "No workspace called '%s' was found" name))))) ;;;###autoload (defun +workspace-current-name () "Get the name of the current workspace." - (safe-persp-name (get-current-persp))) + (safe-persp-name (+workspace-current))) ;;;###autoload (defun +workspace-list () - "Return a list of workspace structs." - (mapcar #'persp-get-by-name (+workspace-list-names))) + "Return a list of workspace structs (satisifes `+workspace-p')." + (cdr (cl-loop for persp being the hash-values of *persp-hash* + collect persp))) ;;;###autoload (defun +workspace-list-names () - "Return a list of workspace names (strings)." - (delete persp-nil-name (persp-names-current-frame-fast-ordered))) + "Return the list of names of open workspaces." + (cdr persp-names-cache)) ;;;###autoload (defun +workspace-buffer-list (&optional persp) - "Return a list of buffers in PERSP (defaults to the current perspective). + "Return a list of buffers in PERSP. The buffer list is ordered by recency (same as `buffer-list'). -PERSP can be a string (name of a workspace) or a perspective hash (satisfies -`+workspace-p'). - -If PERSP is t, then return a list of orphaned buffers associated with no -perspectives." +PERSP can be a string (name of a workspace) or a workspace (satisfies +`+workspace-p'). If nil or omitted, it defaults to the current workspace." (let ((persp (or persp (+workspace-current)))) - (if (eq persp t) - (cl-remove-if #'persp--buffer-in-persps (buffer-list)) - (cl-assert (+workspace-p persp) t) - (cl-loop for buf in (buffer-list) - if (+workspace-contains-buffer-p buf persp) - collect buf)))) + (cl-assert (+workspace-p persp) t) + (cl-loop for buf in (buffer-list) + if (+workspace-contains-buffer-p buf persp) + collect buf))) + +;;;###autoload +(defun +workspace-orphaned-buffer-list () + "Return a list of buffers that aren't associated with any perspective." + (cl-remove-if #'persp--buffer-in-persps (buffer-list))) ;; --- Actions ---------------------------- @@ -175,7 +180,10 @@ buffers." ;;;###autoload (defun +workspace-switch (name &optional auto-create-p) - "Switch to another workspace." + "Switch to another workspace named NAME (a string). + +If AUTO-CREATE-P is non-nil, create the workspace if it doesn't exist, otherwise +throws an error." (unless (+workspace-exists-p name) (if auto-create-p (+workspace-new name) @@ -188,35 +196,11 @@ buffers." (persp-frame-switch name) (equal (+workspace-current-name) name))) -;;;###autoload -(defun +workspace-on-new-frame (frame &optional _new-frame-p) - "Spawn a perspective for each new frame." - (select-frame frame) - (+workspace/new) - (set-frame-parameter frame 'assoc-persp (+workspace-current-name))) - ;; ;; Interactive commands ;; -;;;###autoload -(defun +workspace/load (name) - "Load a workspace and switch to it. If called with C-u, try to reload the -current workspace (by name) from session files." - (interactive - (list - (if current-prefix-arg - (+workspace-current-name) - (completing-read - "Workspace to load: " - (persp-list-persp-names-in-file - (expand-file-name +workspace-data-file persp-save-dir)))))) - (if (not (+workspace-load name)) - (+workspace-error (format "Couldn't load workspace %s" name)) - (+workspace/switch-to name) - (+workspace/display))) - ;;;###autoload (defun +workspace/load-session (&optional name) "Load a session and switch to it. If called with C-u, try to load the last @@ -234,19 +218,6 @@ session." (+workspace-message (format "'%s' workspace loaded" name) 'success)) '(error (+workspace-error (cadr ex) t)))) -;;;###autoload -(defun +workspace/save (name) - "Save the current workspace. If called with C-u, autosave the current -workspace." - (interactive - (list - (if current-prefix-arg - (+workspace-current-name) - (completing-read "Workspace to save: " (+workspace-list-names))))) - (if (+workspace-save name) - (+workspace-message (format "'%s' workspace saved" name) 'success) - (+workspace-error (format "Couldn't save workspace %s" name)))) - ;;;###autoload (defun +workspace/save-session (&optional name) "Save the current session. If called with C-u, prompt you for the name to save @@ -257,24 +228,24 @@ the session as." (completing-read "Save session as: " (directory-files persp-save-dir nil "^[^_.]"))))) - (condition-case ex + (condition-case-unless-debug ex (let ((name (or name persp-auto-save-fname))) (if (+workspace-save-session name) (+workspace-message (format "Saved session as '%s'" name) 'success) (error "Couldn't save session as '%s'" name))) - '(error (+workspace-error (cadr ex) t)))) + ('error (+workspace-error ex t)))) ;;;###autoload (defun +workspace/rename (new-name) "Rename the current workspace." (interactive (list (read-from-minibuffer "New workspace name: "))) - (condition-case ex + (condition-case-unless-debug ex (let* ((current-name (+workspace-current-name)) (old-name (+workspace-rename current-name new-name))) (unless old-name (error "Failed to rename %s" current-name)) (+workspace-message (format "Renamed '%s'->'%s'" old-name new-name) 'success)) - ('error (+workspace-error (cadr ex) t)))) + ('error (+workspace-error ex t)))) ;;;###autoload (defun +workspace/delete (name) @@ -288,7 +259,7 @@ workspace to delete." (+workspace-list-names) nil nil current-name) current-name)))) - (condition-case ex + (condition-case-unless-debug ex (+workspace-message (let ((workspaces (length (+workspace-list-names)))) (cond ((> workspaces 1) @@ -306,45 +277,37 @@ workspace to delete." (switch-to-buffer (doom-fallback-buffer)) (format "No workspaces detected! Auto-creating '%s' workspace" +workspaces-main)))) 'success) - ('error (+workspace-error (cadr ex) t)))) + ('error (+workspace-error ex t)))) ;;;###autoload (defun +workspace/kill-session () - "Delete the current session, clears all workspaces, windows and buffers." + "Delete the current session, all workspaces, windows and their buffers." (interactive) (unless (cl-every #'+workspace-delete (+workspace-list-names)) (+workspace-error "Could not clear session")) (+workspace-switch +workspaces-main t) (doom/kill-all-buffers) - (let ((fallback-buf (doom-fallback-buffer))) - (switch-to-buffer fallback-buf) - (doom/cleanup-session))) - -;;;###autoload -(defun +workspace/kill-session-and-quit () - "Forgets current session and quits." - (interactive) - (+workspace/kill-session) - (save-buffers-kill-terminal)) + (switch-to-buffer (doom-fallback-buffer)) + (doom/cleanup-session)) ;;;###autoload (defun +workspace/new (&optional name clone-p) - "Create a new workspace named NAME. If OVERWRITE-P is non-nil, clear any -pre-existing workspace." + "Create a new workspace named NAME. If CLONE-P is non-nil, clone the current +workspace, otherwise the new workspace is blank." (interactive "iP") (unless name (setq name (format "#%s" (+workspace--generate-id)))) - (condition-case ex - (let ((exists-p (+workspace-exists-p name))) - (if exists-p - (error "%s already exists" name) - (+workspace-switch name t) - (if clone-p + (condition-case-unless-debug ex + (if (+workspace-exists-p name) + (error "%s already exists" name) + (+workspace-switch name t) + (if clone-p + (let ((persp (+workspace-get name))) (dolist (window (window-list)) - (persp-add-buffer (window-buffer window) persp nil)) - (delete-other-windows-internal) - (switch-to-buffer (doom-fallback-buffer))) - (+workspace/display))) + (persp-add-buffer (window-buffer window) persp nil))) + (delete-other-windows-internal) + (switch-to-buffer (doom-fallback-buffer))) + (+workspace/display)) ('error (+workspace-error (cadr ex) t)))) ;;;###autoload @@ -390,7 +353,7 @@ end of the workspace list." (let ((current-name (+workspace-current-name))) (if (equal current-name persp-nil-name) (+workspace-switch +workspaces-main t) - (condition-case ex + (condition-case-unless-debug ex (let* ((persps (+workspace-list-names)) (perspc (length persps)) (index (cl-position current-name persps))) @@ -410,8 +373,9 @@ end of the workspace list." ;;;###autoload (defun +workspace/close-window-or-workspace () - "Close the selected window. If it's the last window in the workspace, close -the workspace and move to the next." + "Close the selected window. If it's the last window in the workspace, either +close the workspace (as well as its associated frame, if one exists) and move to +the next." (interactive) (let ((delete-window-fn (if (featurep 'evil) #'evil-window-delete #'delete-window))) (if (window-dedicated-p) @@ -420,21 +384,14 @@ the workspace and move to the next." (cond ((or (+workspace--protected-p current-persp-name) (cdr (doom-visible-windows))) (funcall delete-window-fn)) - ((cdr (+workspace-list-names)) - (+workspace/delete current-persp-name))))))) -;;;###autoload -(defun +workspace/close-workspace-or-frame () - "Close the current workspace. If it's the last, delete the frame instead." - (interactive) - (let ((frames (length (frame-list))) - (workspaces (length (+workspace-list-names)))) - (cond ((> workspaces 1) - (call-interactively #'+workspace/delete)) - ((> frames 1) - (call-interactively #'delete-frame)) - (t - (error "Can't delete last frame."))))) + ((cdr (+workspace-list-names)) + (let ((frame-persp (frame-parameter nil 'workspace))) + (if (string= frame-persp (+workspace-current-name)) + (delete-frame) + (+workspace/delete current-persp-name)))) + + (t (+workspace-error "Can't delete last workspace" t))))))) ;; @@ -455,7 +412,7 @@ the workspace and move to the next." '+workspace-tab-face))) " "))) -(defun +workspace--message-body (message &optional type) +(defun +workspace--message-body (message &optional type) (concat (+workspace--tabline) (propertize " | " 'face 'font-lock-comment-face) (propertize (format "%s" message) @@ -473,7 +430,8 @@ the workspace and move to the next." ;;;###autoload (defun +workspace-error (message &optional noerror) "Show an 'elegant' error in the echo area next to a listing of workspaces." - (funcall (if noerror #'message #'error) "%s" (+workspace--message-body message 'error))) + (funcall (if noerror #'message #'error) + "%s" (+workspace--message-body message 'error))) ;;;###autoload (defun +workspace/display () @@ -487,34 +445,56 @@ the workspace and move to the next." ;; ;;;###autoload -(defun +workspaces|delete-associated-workspace-maybe (frame) - "Delete workspace associated with current frame IF it has no real buffers." +(defun +workspaces|delete-associated-workspace (frame) + "Delete workspace associated with current frame. +A workspace gets associated with a frame when a new frame is interactively +created." (when persp-mode - (let ((frame-persp (frame-parameter frame 'assoc-persp))) - (when (and (equal frame-persp (+workspace-current-name)) - (not (equal frame-persp +workspaces-main))) + (let ((frame-persp (frame-parameter frame 'workspace))) + (when (string= frame-persp (+workspace-current-name)) (+workspace/delete frame-persp))))) ;;;###autoload -(defun +workspaces|per-project () - "Open a new workspace when switching to another project. - -Ensures the scratch (or dashboard) buffers are CDed into the project's root." +(defun +workspaces|cleanup-unassociated-buffers () + "Kill leftover buffers that are unassociated with any perspective." (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)))) + (cl-loop for buf in (buffer-list) + unless (persp--buffer-in-persps buf) + if (kill-buffer buf) + sum 1))) ;;;###autoload -(defun +workspaces|cleanup-unassociated-buffers () - (cl-loop for buf in (buffer-list) - unless (persp--buffer-in-persps buf) - if (kill-buffer buf) - sum 1)) +(defun +workspaces|associate-frame (frame &optional _new-frame-p) + "Create a blank, new perspective and associate it with FRAME." + (when persp-mode + (with-selected-frame frame + (+workspace/new) + (set-frame-parameter frame 'workspace (+workspace-current-name)) + (+workspace/display)))) + +(defvar +workspaces--project-dir nil) +;;;###autoload +(defun +workspaces|set-project-action () + "A `projectile-switch-project-action' that sets the project directory for +`+workspaces|switch-to-project'." + (setq +workspaces--project-dir default-directory)) + +;;;###autoload +(defun +workspaces|switch-to-project () + "Creates a workspace dedicated to a new project. Should be hooked to +`projectile-after-switch-project-hook'." + (when (and persp-mode +workspaces--project-dir) + (unwind-protect + (let* ((persp + (let ((default-directory +workspaces--project-dir)) + (+workspace-new (projectile-project-name)))) + (new-name (persp-name persp))) + (+workspace-switch new-name) + (switch-to-buffer (doom-fallback-buffer)) + (+workspace-message + (format "Switched to '%s' in new workspace" new-name) + 'success)) + (setq +workspaces--project-dir nil)))) ;; @@ -523,10 +503,10 @@ Ensures the scratch (or dashboard) buffers are CDed into the project's root." ;;;###autoload (defun +workspaces*autosave-real-buffers (orig-fn &rest args) - "Don't autosave if no real buffers are open." - (when (doom-real-buffer-list) - (apply orig-fn args)) - t) + "Don't autosave if no real buffers are open." + (when (doom-real-buffer-list) + (apply orig-fn args)) + t) ;;;###autoload (defun +workspaces*switch-project-by-name (orig-fn &rest args) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 3e3cdcbd9..3ccf63525 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -22,13 +22,39 @@ renamed.") ;; (def-package! persp-mode + :defer t + :init + (defun +workspaces|init (&optional frame) + (require 'persp-mode) + (unless persp-mode + (persp-mode +1)) + (unless noninteractive + (let (persp-before-switch-functions persp-activated-functions) + ;; The default perspective persp-mode makes (defined by + ;; `persp-nil-name') is special and doesn't actually represent a real + ;; persp object, so buffers can't really be assigned to it, among other + ;; quirks. We create a *real* main workspace to fill this role. + (unless (persp-get-by-name +workspaces-main) + (persp-add-new +workspaces-main)) + ;; Switch to it if we aren't auto-loading the last session + (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) + (= persp-auto-resume-time -1)) + (persp-frame-switch +workspaces-main))) + ;; The warnings buffer gets swallowed by creating `+workspaces-main', so + ;; we display it manually, if it exists (fix #319). + (when-let* ((warnings (get-buffer "*Warnings*"))) + (save-excursion + (display-buffer-in-side-window + warnings '((window-height . shrink-window-if-larger-than-buffer))))))) + + (add-hook 'doom-init-hook #'+workspaces|init) + (add-hook 'after-make-frame-functions #'+workspaces|init) :config (setq persp-autokill-buffer-on-remove 'kill-weak - persp-nil-name "nil" persp-nil-hidden t persp-auto-save-fname "autosave" persp-save-dir (concat doom-etc-dir "workspaces/") - persp-set-last-persp-for-new-frames nil + persp-set-last-persp-for-new-frames t persp-switch-to-added-buffer nil persp-remove-buffers-from-nil-persp-behaviour nil ;; Don't restore winconf on new frames @@ -39,53 +65,35 @@ renamed.") ;; auto-save on kill persp-auto-save-opt (if noninteractive 0 1)) - ;; Bootstrap - (add-hook 'doom-init-hook #'+workspaces|init) - (add-hook 'after-make-frame-functions #'+workspaces|init) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) - ;; only auto-save when real buffers are present - (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) ;; Modify `delete-window' to close the workspace if used on the last window (define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace) + (define-key persp-mode-map [remap evil-delete-window] #'+workspace/close-window-or-workspace) + ;; only auto-save when real buffers are present + (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) ;; For `doom/cleanup-session' (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) ;; per-frame workspaces (setq persp-init-new-frame-behaviour-override nil - persp-interactive-init-frame-behaviour-override #'+workspace-on-new-frame) - (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace-maybe) - ;; Per-project workspaces - (setq projectile-switch-project-action #'+workspaces|per-project) + persp-interactive-init-frame-behaviour-override #'+workspaces|associate-frame) + ;; delete frame associated with workspace, if it exists + (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) + + ;; per-project workspaces + (setq projectile-switch-project-action #'+workspaces|set-project-action) + (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) ;; - (defun +workspaces|init (&optional frame) - (unless persp-mode - (persp-mode +1)) - (unless noninteractive - ;; The default perspective persp-mode makes (defined by - ;; `persp-nil-name') is special and doesn't actually represent a real - ;; persp object, so buffers can't really be assigned to it, among other - ;; quirks. We create a *real* main workspace to fill this role. - (unless (persp-with-name-exists-p +workspaces-main) - (persp-add-new +workspaces-main)) - ;; Switch to it if we aren't auto-loading the last session - (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) - (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main (or frame (selected-frame)))) - ;; The warnings buffer gets swallowed by creating `+workspaces-main', so - ;; we display it manually, if it exists (fix #319). - (when-let* ((warnings (get-buffer "*Warnings*"))) - (save-excursion - (display-buffer-in-side-window - warnings '((window-height . shrink-window-if-larger-than-buffer))))))) - (defun +workspaces|init-persp-mode () - ;; Remap `buffer-list' to current workspace's buffers in `doom-buffer-list' (cond (persp-mode - ;; Ensure `persp-kill-buffer-query-function' is last in kill-buffer-query-functions + ;; 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) + ;; Remap `buffer-list' to current workspace's buffers in + ;; `doom-buffer-list' (advice-add #'switch-to-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index d76cb3448..e7cc2e9bd 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -10,6 +10,7 @@ collect `(,bsym (get-buffer-create ,(symbol-name bsym)))))) `(let ((persp-auto-resume-time -1) (persp-auto-save-opt 0)) + (require 'persp-mode) (let (noninteractive) (persp-mode +1)) (+workspace-switch +workspaces-main t) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 0a1944359..10ee780fc 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -29,7 +29,7 @@ "M-t" #'+workspace/new "M-T" #'+workspace/display "M-w" #'delete-window - "M-W" #'+workspace/close-workspace-or-frame + "M-W" #'delete-frame "M-n" #'evil-buffer-new "M-N" #'make-frame "M-1" (λ! (+workspace/switch-to 0)) From 0d83834ac7d5a165fd6bd70130017ce5dbf83828 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Jan 2018 02:53:06 -0500 Subject: [PATCH 0216/4235] ui/doom-dashboard: major refactor + Fix default-directory not being set properly when switching perspectives. ie. Add persp-mode integration (#347, #360) + Ensure dashboard initializes properly, at the right time to ensure benchmark is properly reported (fix #361) --- modules/ui/doom-dashboard/autoload.el | 12 + modules/ui/doom-dashboard/config.el | 236 ++++++++++-------- .../ui/doom-dashboard/test/doom-dashboard.el | 4 +- 3 files changed, 144 insertions(+), 108 deletions(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index 55331891c..f9c8d3b38 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -1,23 +1,35 @@ ;;; ui/doom-dashboard/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +doom-dashboard/open (frame) + "Switch to the dashboard in the current window, of the current FRAME." + (interactive (list (selected-frame))) + (with-selected-frame frame + (switch-to-buffer (doom-fallback-buffer)) + (+doom-dashboard-reload))) + ;;;###autoload (defun +doom-dashboard/next-button () + "Jump to the next button after cursor." (interactive) (ignore-errors (goto-char (next-button (point))))) ;;;###autoload (defun +doom-dashboard/previous-button () + "Jump to the previous button after cursor." (interactive) (ignore-errors (goto-char (previous-button (point))))) ;;;###autoload (defun +doom-dashboard/first-button () + "Jump to the first button on the dashboard." (interactive) (goto-char (point-min)) (+doom-dashboard/next-button)) ;;;###autoload (defun +doom-dashboard/last-button () + "Jump to the last button on the dashboard." (interactive) (goto-char (point-max)) (+doom-dashboard/previous-button) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a9058858e..35d6bc929 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -3,15 +3,22 @@ (defvar +doom-dashboard-name " *doom*" "The name to use for the dashboard buffer.") -(defvar +doom-dashboard-widgets '(banner shortmenu loaded) - "List of widgets to display in a blank scratch buffer.") +(defvar +doom-dashboard-functions '(doom-dashboard-widget-banner + doom-dashboard-widget-shortmenu + doom-dashboard-widget-loaded) + "List of widget functions to run in the dashboard buffer to construct the +dashboard. These functions take no arguments and the dashboard buffer is current +while they run.") (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 from -loading.") + "A list of functions which take no arguments. If any of them return non-nil, +dashboard reloading is inhibited.") + +(defvar +doom-dashboard-initial-pwd doom-emacs-dir + "The initial `default-directory' for the dashboard at startup.") (defvar +doom-dashboard-pwd-policy 'last-project "The policy to use when setting the `default-directory' in the dashboard. @@ -31,92 +38,81 @@ Possible values: (defvar +doom-dashboard--width 80) (defvar +doom-dashboard--height 0) (defvar +doom-dashboard--old-fringe-indicator fringe-indicator-alist) +(defvar +doom-dashboard--pwd-alist ()) (defvar all-the-icons-scale-factor) (defvar all-the-icons-default-adjust) + ;; +;; Bootstrap +;; + (setq doom-fallback-buffer +doom-dashboard-name - initial-buffer-choice #'+doom-dashboard) + initial-buffer-choice #'+doom-dashboard-initial-buffer) + +(add-hook 'window-setup-hook #'+doom-dashboard|init) ;; -;; Commands -;; - -(defun +doom-dashboard/open (frame &optional noswitch) - (interactive (list (selected-frame))) - (unless (run-hook-with-args-until-success '+doom-dashboard-inhibit-functions) - (prog1 - (unless +doom-dashboard-inhibit-refresh - (with-selected-frame frame - (unless noswitch - (switch-to-buffer (doom-fallback-buffer))) - (+doom-dashboard-reload))) - (setq +doom-dashboard-inhibit-refresh nil) - (current-buffer)))) - - -;; -;; Library +;; Major mode ;; (define-derived-mode +doom-dashboard-mode special-mode (format "DOOM v%s" doom-version) "Major mode for the DOOM dashboard buffer." + (read-only-mode +1) + (when (featurep 'evil) + (evil-emacs-state)) (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))) -(add-hook '+doom-dashboard-mode-hook #'read-only-mode) -(defun +doom-dashboard () - "Initialize doom-dashboard and set up its hooks. Meant to be used with -`initial-buffer-choice'. Returns the resulting buffer." - (map! :map +doom-dashboard-mode-map - "n" #'+doom-dashboard/next-button - "p" #'+doom-dashboard/previous-button - "N" #'+doom-dashboard/last-button - "P" #'+doom-dashboard/first-button +(map! :map +doom-dashboard-mode-map + "n" #'+doom-dashboard/next-button + "p" #'+doom-dashboard/previous-button + "N" #'+doom-dashboard/last-button + "P" #'+doom-dashboard/first-button + (:when (featurep! :feature evil) :em "j" #'+doom-dashboard/next-button :em "k" #'+doom-dashboard/previous-button :em "gg" #'+doom-dashboard/first-button - :em "G" #'+doom-dashboard/last-button - [remap evil-insert] #'evil-normal-state - [remap evil-change] #'evil-normal-state - [remap evil-visual-char] #'evil-normal-state - [remap evil-visual-line] #'evil-normal-state - [remap evil-delete] #'evil-normal-state - [remap evil-delete-char] #'evil-normal-state) + :em "G" #'+doom-dashboard/last-button)) - (add-hook 'window-configuration-change-hook #'+doom-dashboard-reload) + +;; +;; Hooks +;; + +(defun +doom-dashboard|init () + "Initializes Doom's dashboard." (add-hook 'focus-in-hook #'+doom-dashboard-reload) + (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (when (daemonp) (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) - (cond ((doom-real-buffer-p) - (current-buffer)) - (+doom-dashboard--first - (prog1 - (let ((default-directory doom-emacs-dir)) - (+doom-dashboard/open (selected-frame) t)) - (setq +doom-dashboard--first nil))) - (t - (+doom-dashboard/open (selected-frame) t)))) + ;; `persp-mode' integration: update `default-directory' when switching + (add-hook 'persp-created-functions #'+doom-dashboard|record-project) + (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) + (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project) + (+doom-dashboard-reload t) + (+doom-dashboard|resize)) (defun +doom-dashboard|reload-on-kill () - "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. + "A `kill-buffer-query-functions' hook. 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) - (+doom-dashboard-update-pwd)) - t) + (or (let ((buf (current-buffer))) + (unless (+doom-dashboard-p buf) + (when (doom-real-buffer-p buf) + (setq +doom-dashboard--last-cwd default-directory) + (+doom-dashboard-update-pwd)) + t)) (ignore (let (+doom-dashboard-inhibit-refresh) (ignore-errors (+doom-dashboard-reload)))))) @@ -124,59 +120,85 @@ If this is the dashboard buffer, reload the dashboard." (defun +doom-dashboard|make-frame (frame) "Reload the dashboard after a brief pause. This is necessary for new frames, whose dimensions may not be fully initialized by the time this is run." - (run-with-timer 0.1 nil #'+doom-dashboard frame)) + (run-with-timer 0.1 nil #'+doom-dashboard/open frame)) -(defun +doom-dashboard-p (&optional buffer) +(defun +doom-dashboard|resize () + "Resize the margins and fringes on 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))))) + +(defun +doom-dashboard|detect-project (&rest _) + "Check for a `last-project-root' parameter in the perspective, and set the +dashboard's `default-directory' to it if it exists. + +This and `+doom-dashboard|record-project' provides `persp-mode' integration with +the Doom dashboard. It ensures that the dashboard is always in the correct +project (which may be different across perspective)." + (when (bound-and-true-p persp-mode) + (when-let* ((pwd (persp-parameter 'last-project-root))) + (+doom-dashboard-update-pwd pwd)))) + +(defun +doom-dashboard|record-project (&optional persp &rest _) + "Record the last `doom-project-root' for the current perspective. See +`+doom-dashboard|detect-project' for more information." + (when (bound-and-true-p persp-mode) + (set-persp-parameter + 'last-project-root (doom-project-root) + (if (perspective-p persp) persp (get-current-persp))))) + + +;; +;; Library +;; + +(defun +doom-dashboard-initial-buffer () + "Returns buffer to display on startup. Designed for `initial-buffer-choice'." + (if (doom-real-buffer-p) + (current-buffer) + (doom-fallback-buffer))) + +(defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." - (eq (or buffer (current-buffer)) - (doom-fallback-buffer))) + (eq buffer (doom-fallback-buffer))) -(defun +doom-dashboard-update-pwd () +(defun +doom-dashboard-update-pwd (&optional pwd) "Update `default-directory' in the Doom dashboard buffer. What it is set to is controlled by `+doom-dashboard-pwd-policy'." (with-current-buffer (doom-fallback-buffer) - (let ((new-pwd (+doom-dashboard--get-pwd))) - (when (and new-pwd (file-directory-p new-pwd)) - (unless (string-suffix-p "/" new-pwd) - (setq new-pwd (concat new-pwd "/"))) - (setq default-directory new-pwd))))) + (if pwd + (setq-local default-directory pwd) + (let ((new-pwd (+doom-dashboard--get-pwd))) + (when (and new-pwd (file-directory-p new-pwd)) + (unless (string-suffix-p "/" new-pwd) + (setq new-pwd (concat new-pwd "/"))) + (setq-local default-directory new-pwd)))))) (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 + (when (or (and (not +doom-dashboard-inhibit-refresh) + (get-buffer-window (doom-fallback-buffer)) + (not (window-minibuffer-p (frame-selected-window))) + (not (run-hook-with-args-until-success '+doom-dashboard-inhibit-functions))) + force) + (with-current-buffer (doom-fallback-buffer) + (with-silent-modifications + (save-excursion (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)))) - fallback-buffer)) + (save-excursion (mapc #'funcall +doom-dashboard-functions)) + (insert + (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) + (/ (count-lines (point-min) (point-max)) 2))) + ?\n))) + (unless (button-at (point)) + (goto-char (next-button (point-min))))) + (+doom-dashboard|detect-project) + (+doom-dashboard|resize) + (+doom-dashboard-update-pwd) + (current-buffer)))) ;; helpers (defun +doom-dashboard--center (len s) @@ -186,7 +208,10 @@ controlled by `+doom-dashboard-pwd-policy'." (defun +doom-dashboard--get-pwd () (let ((lastcwd +doom-dashboard--last-cwd) (policy +doom-dashboard-pwd-policy)) - (cond ((null policy) + (cond (+doom-dashboard--first + (setq +doom-dashboard--first nil) + +doom-dashboard-initial-pwd) + ((null policy) default-directory) ((stringp policy) (expand-file-name policy lastcwd)) @@ -211,7 +236,7 @@ controlled by `+doom-dashboard-pwd-policy'." ;; Widgets ;; -(defun doom-dashboard-widget--banner () +(defun doom-dashboard-widget-banner () (mapc (lambda (line) (insert (propertize (+doom-dashboard--center +doom-dashboard--width line) 'face 'font-lock-comment-face) " ") @@ -236,22 +261,23 @@ controlled by `+doom-dashboard-pwd-policy'." "\\ _-' `-_ /" " `'' ``'"))) -(defun doom-dashboard-widget--loaded () +(defun doom-dashboard-widget-loaded () (insert - "\n" + "\n\n" (propertize (+doom-dashboard--center +doom-dashboard--width (format "Loaded %d packages in %d modules in %.02fs" (length doom--package-load-path) (hash-table-size doom-modules) - (if (floatp doom-init-time) doom-init-time 0.0))) + doom-init-time)) 'face 'font-lock-comment-face) - "\n")) + "\n\n")) -(defun doom-dashboard-widget--shortmenu () +(defun doom-dashboard-widget-shortmenu () (let ((all-the-icons-scale-factor 1.45) (all-the-icons-default-adjust -0.02)) + (insert "\n") (mapc (lambda (btn) (when btn (cl-destructuring-bind (label icon fn) btn diff --git a/modules/ui/doom-dashboard/test/doom-dashboard.el b/modules/ui/doom-dashboard/test/doom-dashboard.el index 336a5daad..cfa828ca9 100644 --- a/modules/ui/doom-dashboard/test/doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/doom-dashboard.el @@ -22,9 +22,7 @@ (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))))) + (should (+doom-dashboard-p fallback-buffer)))) (def-test! get-pwd :minor-mode projectile-mode From 1024cfa23cbad029dc764a57cef93e17657b65b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Jan 2018 21:43:23 -0500 Subject: [PATCH 0217/4235] feature/lookup: fix invalid search engine error in +lookup/online Caused because map-put returns the full provider cons cell, rather than just the provider. --- modules/feature/lookup/autoload/lookup.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 04896f3dc..8ff263aca 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -14,7 +14,8 @@ "Search on: " (mapcar #'car +lookup-provider-url-alist) nil t))) - (map-put +lookup--last-provider key provider))))) + (map-put +lookup--last-provider key provider) + provider)))) (defun +lookup--symbol-or-region (&optional initial) (cond (initial) From f663123f5a9e6ab3b24dd113d878dec2bf692e23 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Jan 2018 21:44:18 -0500 Subject: [PATCH 0218/4235] feature/lookup: properly report errors in +lookup/online --- modules/feature/lookup/autoload/lookup.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 8ff263aca..26b8250fa 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -216,7 +216,7 @@ for the provider." (region-end))) (read-string "Search for: " (thing-at-point 'symbol t))) (+lookup--online-provider current-prefix-arg))) - (condition-case _ex + (condition-case ex (let ((url (cdr (assoc provider +lookup-provider-url-alist)))) (unless url (error "'%s' is an invalid search engine" provider)) @@ -227,7 +227,8 @@ for the provider." (user-error "The search query is empty")) (funcall +lookup-open-url-fn (format url (url-encode-url search)))) ('error - (map-delete +lookup--last-provider major-mode)))) + (map-delete +lookup--last-provider major-mode) + (message "Failed: %s" ex)))) ;;;###autoload (defun +lookup/online-select () From abd3bc87fe5c015ed1a09fe5677908ea9f25adb1 Mon Sep 17 00:00:00 2001 From: Yiming Chen Date: Sun, 21 Jan 2018 11:51:29 +0800 Subject: [PATCH 0219/4235] feature/evil: use magit-section-toggle if mode is derived from magit-mode - Closes #359 - See also https://github.com/hlissner/doom-emacs/pull/359#issuecomment-359220633 --- modules/feature/evil/autoload/folds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index 00bd8c6fe..e913ca1b6 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -88,7 +88,7 @@ (interactive) (ignore-errors (call-interactively - (cond ((string-prefix-p "magit" (symbol-name major-mode)) + (cond ((derived-mode-p 'magit-mode) #'magit-section-toggle) ((+evil-fold-p) #'+evil:fold-toggle) From c5b72566eaf1a3f2b6c854faeb51a1a3be993b67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Jan 2018 21:37:15 -0500 Subject: [PATCH 0220/4235] Remove help-fns+, add helpful plugin #363 --- core/core-editor.el | 14 +++++++++++--- core/packages.el | 2 +- modules/feature/popup/+hacks.el | 13 ++++++++++++- modules/feature/popup/config.el | 2 +- modules/private/default/+bindings.el | 1 + 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 6f1bf5e9e..8df5381a2 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -215,9 +215,17 @@ extension, try to guess one." (er/contract-region 0))) (advice-add #'evil-escape :before #'doom*quit-expand-region)) -(def-package! help-fns+ ; Improved help commands - :commands (describe-buffer describe-command describe-file - describe-keymap describe-option describe-option-of-type)) +(def-package! helpful + :commands (helpful-callable helpful-function helpful-macro helpful-command + helpful-key helpful-variable helpful-at-point) + :init + (setq counsel-describe-function-function #'helpful-callable + counsel-describe-variable-function #'helpful-variable) + + (global-set-key [remap describe-function] #'helpful-callable) + (global-set-key [remap describe-command] #'helpful-command) + (global-set-key [remap describe-variable] #'helpful-variable) + (global-set-key [remap describe-key] #'helpful-key)) (def-package! pcre2el :commands rxt-quote-pcre) diff --git a/core/packages.el b/core/packages.el index 4b53245d1..a6b3292c4 100644 --- a/core/packages.el +++ b/core/packages.el @@ -27,7 +27,7 @@ (package! command-log-mode) (package! editorconfig) (package! expand-region) -(package! help-fns+) +(package! helpful) (package! pcre2el) (package! smart-forward) (package! smartparens) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 1e8ad3170..6c0e92095 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -109,7 +109,6 @@ the command buffer." (goto-char (cdr location)) (recenter) (setq origin (selected-window)))) - (+popup/close) (select-window origin))) ;; Help buffers use `pop-to-window' to decide where to open followed links, @@ -141,6 +140,18 @@ the command buffer." (doom--switch-from-popup (find-function-search-for-symbol fun 'defface file))))) +;; `helpful' +(after! helpful + (defun +popup*helpful--navigate (orig-fn &rest args) + (let (origin) + (save-popups! + (apply orig-fn args) + (setq origin (selected-window)) + (recenter)) + (select-window origin))) + (advice-add #'helpful--navigate :around #'+popup*helpful--navigate)) + + ;; `neotree' (after! neotree (advice-add #'neo-util--set-window-width :override #'ignore) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index eda53a178..8f8d4d917 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -150,7 +150,7 @@ ALIST supports one custom parameter: `size', which will resolve to (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) (set! :popup "^\\*Compilation" nil '((transient . 0) (quit . t))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) - (set! :popup "^\\*Help" + (set! :popup "^\\*[Hh]elp" '((slot . 2) (vslot . 2) (size . 0.2)) '((select . t))) (set! :popup "^\\*doom \\(?:term\\|eshell\\)" diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 10ee780fc..3fb5b1787 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -208,6 +208,7 @@ :desc "Find definition" :n "." #'+lookup/definition :desc "Find references" :n "/" #'+lookup/references :desc "Find documentation" :n "h" #'+lookup/documentation + :desc "Describe at point" :n "." #'helpful-at-point :desc "What face" :n "'" #'doom/what-face :desc "What minor modes" :n ";" #'doom/what-minor-mode :desc "Info" :n "i" #'info From 5dcd6736512a80485d0d74a60028fce9520ea520 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 00:57:52 -0500 Subject: [PATCH 0221/4235] feature/eval: refactor +eval/open-repl --- modules/feature/eval/autoload/repl.el | 60 ++++++++++++++------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 8e75e402d..687af1503 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -3,37 +3,41 @@ (defvar +eval-repl-buffer nil "The buffer of the last open repl.") -(defun +eval--ensure-in-repl-buffer (&optional command) - (or (eq (current-buffer) +eval-repl-buffer) - (progn - (if (and +eval-repl-buffer (buffer-live-p +eval-repl-buffer)) - (if-let* ((win (get-buffer-window +eval-repl-buffer))) - (select-window win) - (pop-to-buffer +eval-repl-buffer)) - (when command - (let ((repl-buffer (save-window-excursion (call-interactively command)))) - (unless (bufferp repl-buffer) - (error "REPL command didn't return a buffer")) - (with-current-buffer repl-buffer (+eval-repl-mode +1)) - (setq +eval-repl-buffer repl-buffer) - (pop-to-buffer repl-buffer)))) - (when (eq (current-buffer) +eval-repl-buffer) - (goto-char (if (and (derived-mode-p 'comint-mode) - (cdr comint-last-prompt)) - (cdr comint-last-prompt) - (point-max))) - t)))) +(defun +eval--ensure-in-repl-buffer (&optional command same-window-p) + (cond ((eq (current-buffer) +eval-repl-buffer)) + ((and +eval-repl-buffer + (buffer-live-p +eval-repl-buffer)) + (when-let* ((win (get-buffer-window +eval-repl-buffer))) + (select-window win))) + (command + (let ((repl-buffer (save-window-excursion (call-interactively command)))) + (unless (bufferp repl-buffer) + (error "REPL command didn't return a buffer")) + (with-current-buffer repl-buffer (+eval-repl-mode +1)) + (setq +eval-repl-buffer repl-buffer)))) + (unless (eq (current-buffer) +eval-repl-buffer) + (funcall (if same-window-p #'switch-to-buffer #'pop-to-buffer) + +eval-repl-buffer)) + (with-current-buffer +eval-repl-buffer + (goto-char (if (and (derived-mode-p 'comint-mode) + (cdr comint-last-prompt)) + (cdr comint-last-prompt) + (point-max))) + t)) ;;;###autoload -(defun +eval/open-repl () +(defun +eval/open-repl (&optional same-window-p) "Opens (or reopens) the REPL associated with the current major-mode and place -the cursor at the prompt." - (interactive) - (when-let* ((command (cdr (assq major-mode +eval-repls)))) - (when (+eval--ensure-in-repl-buffer command) - (when (bound-and-true-p evil-mode) - (call-interactively #'evil-append-line)) - t))) +the cursor at the prompt. + +If SAME-WINDOW-P is non-nil, open REPL in current window." + (interactive "P") + (if-let* ((command (cdr (assq major-mode +eval-repls)))) + (when (+eval--ensure-in-repl-buffer command same-window-p) + (when (bound-and-true-p evil-mode) + (call-interactively #'evil-append-line)) + t) + (user-error "No REPL is defined for %s" major-mode))) ;;;###autoload (defun +eval/send-region-to-repl (beg end &optional auto-execute-p) From 0e392372dfdd963dcd5a4f90dc2607eaecfa2f91 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 02:20:26 -0500 Subject: [PATCH 0222/4235] lang/org: fix relative file attachments #370 Affected non-image files having one-too-many ../ in its path. --- modules/lang/org/autoload/org-attach.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index 554549575..2a493bcfe 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -114,7 +114,7 @@ the cursor." (insert (format "%s [[./%s][%s]] " (+org-attach--icon filename) - (file-relative-name filename buffer-file-name) + (file-relative-name filename (file-name-directory buffer-file-name)) (file-name-nondirectory (directory-file-name filename))))))) ;;;###autoload From 12ac162276d256e011122c4361207510fd85a21d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 03:15:45 -0500 Subject: [PATCH 0223/4235] lang/python: set :company-backend sooner #369 company-anaconda was added to company-backends too late, causing code completion not to work in first-time python buffers. --- modules/lang/python/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 90bf1e83d..bb39481c3 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -24,8 +24,9 @@ is loaded.") :config (add-hook! 'python-mode-hook #'(flycheck-mode highlight-numbers-mode)) - (set! :repl 'python-mode #'+python/repl) + (set! :company-backend 'python-mode '(company-anaconda)) (set! :electric 'python-mode :chars '(?:)) + (set! :repl 'python-mode #'+python/repl) (when (executable-find "ipython") (setq python-shell-interpreter "ipython" @@ -87,7 +88,6 @@ environment variables." :when (featurep! :completion company) :after anaconda-mode :config - (set! :company-backend 'python-mode '(company-anaconda)) (set! :lookup 'python-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references From ac825754c60aefdbdf689e836db6b99a608fd439 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 03:16:36 -0500 Subject: [PATCH 0224/4235] lang/python: move :lookup setting to anaconda-mode block --- modules/lang/python/config.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index bb39481c3..629681e5a 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -80,7 +80,10 @@ environment variables." :config (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) (set! :popup "^\\*anaconda-mode" nil '((select))) - (map! :map anaconda-mode-map :m "gd" #'anaconda-mode-find-definitions) + (set! :lookup 'python-mode + :definition #'anaconda-mode-find-definitions + :references #'anaconda-mode-find-references + :documentation #'anaconda-mode-show-doc) (advice-add #'anaconda-mode-doc-buffer :after #'doom*anaconda-mode-doc-buffer)) @@ -88,10 +91,6 @@ environment variables." :when (featurep! :completion company) :after anaconda-mode :config - (set! :lookup 'python-mode - :definition #'anaconda-mode-find-definitions - :references #'anaconda-mode-find-references - :documentation #'anaconda-mode-show-doc) (map! :map python-mode-map :localleader :prefix "f" From c0084b5a930a659d5629cc4b8e9f3823602e2bc4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 14:07:46 -0500 Subject: [PATCH 0225/4235] ui/unicode: fix unicode-fonts-setup not running on startup Caused because of logic error in +unicode|init-fonts; a nil FRAME prevents unicode-fonts-setup from running. --- modules/ui/unicode/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/unicode/config.el b/modules/ui/unicode/config.el index 06636b3e9..a41ae6554 100644 --- a/modules/ui/unicode/config.el +++ b/modules/ui/unicode/config.el @@ -15,5 +15,5 @@ (add-hook! 'after-init-hook (if initial-window-system - (+unicode|init-fonts) + (+unicode|init-fonts (selected-frame)) (add-hook 'after-make-frame-functions #'+unicode|init-fonts)))) From b3c429d92ae517173863da44e09a0b2b08f5cb06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 15:08:43 -0500 Subject: [PATCH 0226/4235] Refactor app/email --- init.example.el | 2 +- modules/app/email/+gmail.el | 36 ++++++ modules/app/email/config.el | 217 ++++++++++-------------------------- 3 files changed, 98 insertions(+), 157 deletions(-) create mode 100644 modules/app/email/+gmail.el diff --git a/init.example.el b/init.example.el index 5de1a7e19..7fa0476d0 100644 --- a/init.example.el +++ b/init.example.el @@ -127,7 +127,7 @@ ;; toward a specific purpose. They may have additional dependencies and ;; should be loaded late. :app - ;email ; emacs as an email client + ;(email +gmail) ; emacs as an email client ;irc ; how neckbeards socialize ;rss ; emacs as an RSS reader ;twitter ; twitter client https://twitter.com/vnought diff --git a/modules/app/email/+gmail.el b/modules/app/email/+gmail.el new file mode 100644 index 000000000..7b001223b --- /dev/null +++ b/modules/app/email/+gmail.el @@ -0,0 +1,36 @@ +;;; app/email/+gmail.el -*- lexical-binding: t; -*- + +(after! mu4e + ;; don't save message to Sent Messages, Gmail/IMAP takes care of this + (setq mu4e-sent-messages-behavior 'delete) + + ;; In my workflow, emails won't be moved at all. Only their flags/labels are + ;; changed. Se we redefine the trash and refile marks not to do any moving. + ;; However, the real magic happens in `+email|gmail-fix-flags'. + ;; + ;; Gmail will handle the rest. + (defun +email--mark-seen (docid msg target) + (mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N")) + + (map-delete mu4e-marks 'delete) + (map-put mu4e-marks 'trash + (list :char '("d" . "▼") + :prompt "dtrash" + :dyn-target (lambda (target msg) (mu4e-get-trash-folder msg)) + :action #'+email--mark-seen)) + ;; Refile will be my "archive" function. + (map-put mu4e-marks 'refile + (list :char '("r" . "▶") :prompt "refile" + :show-target (lambda (target) "archive") + :action #'+email--mark-seen)) + + ;; This hook correctly modifies gmail flags on emails when they are marked. + ;; Without it, refiling (archiving), trashing, and flagging (starring) email + ;; won't properly result in the corresponding gmail action, since the marks + ;; are ineffectual otherwise. + (defun +email|gmail-fix-flags (mark msg) + (cond ((eq mark 'trash) (mu4e-action-retag-message msg "-\\Inbox,+\\Trash,-\\Draft")) + ((eq mark 'refile) (mu4e-action-retag-message msg "-\\Inbox")) + ((eq mark 'flag) (mu4e-action-retag-message msg "+\\Starred")) + ((eq mark 'unflag) (mu4e-action-retag-message msg "-\\Starred")))) + (add-hook 'mu4e-mark-execute-pre-hook #'+email|gmail-fix-flags)) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 6805f0c3a..ee404bb1c 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -4,13 +4,8 @@ ;; to give me the ability to read, search, write and send my email. It does so ;; with `mu4e', and requires `offlineimap' and `mu' to be installed. -(defvar +email-mu4e-mail-path "~/.mail" - "The directory path of mu's maildir.") - - -;; -;; Config -;; +(defvar +email-backend 'mbsync + "Which backend to use. Can either be offlineimap, mbsync or nil (manual).") (def-setting! :email (label letvars &optional default-p) "Registers an email address for mu4e. The LABEL is a string. LETVARS are a @@ -54,54 +49,68 @@ default/fallback account." (def-package! mu4e :commands (mu4e mu4e-compose-new) + :init + (setq mu4e-maildir "~/.mail" + mu4e-attachment-dir "~/.mail/.attachments" + mu4e-user-mail-address-list nil) :config - (setq mu4e-maildir +email-mu4e-mail-path - mu4e-attachment-dir "~/Downloads" - mu4e-user-mail-address-list nil - mu4e-update-interval nil + (pcase +email-backend + (`mbsync + (setq mu4e-get-mail-command "mbsync -a" + mu4e-change-filenames-when-moving t)) + (`offlineimap + (setq mu4e-get-mail-command "offlineimap -o -q"))) + + (setq mu4e-update-interval nil mu4e-compose-format-flowed t ; visual-line-mode + auto-fill upon sending mu4e-view-show-addresses t + mu4e-sent-messages-behavior 'sent + mu4e-index-cleanup nil + mu4e-index-lazy-check t + mu4e-hide-index-messages t ;; try to show images mu4e-view-show-images t mu4e-view-image-max-width 800 - ;; don't save message to Sent Messages, Gmail/IMAP takes care of this - mu4e-sent-messages-behavior 'delete - ;; allow for updating mail using 'U' in the main view: - ;; for mbsync - ;; mu4e-headers-skip-duplicates t - ;; mu4e-change-filenames-when-moving nil - ;; mu4e-get-mail-command "mbsync -a" - ;; for offlineimap - mu4e-get-mail-command "offlineimap -o -q" ;; configuration for sending mail message-send-mail-function #'smtpmail-send-it smtpmail-stream-type 'starttls + message-kill-buffer-on-exit t ; close after sending ;; start with the first (default) context; mu4e-context-policy 'pick-first ;; compose with the current context, or ask mu4e-compose-context-policy 'ask-if-none ;; use helm/ivy - mu4e-completing-read-function (cond ((featurep! :completion ivy) #'ivy-completing-read) - ((featurep! :completion helm) #'completing-read) - (t #'ido-completing-read)) - ;; close message after sending it - message-kill-buffer-on-exit t + mu4e-completing-read-function + (cond ((featurep! :completion ivy) #'ivy-completing-read) + ((featurep! :completion helm) #'completing-read) + (t #'ido-completing-read)) ;; no need to ask - mu4e-confirm-quit nil + mu4e-confirm-quit t ;; remove 'lists' column mu4e-headers-fields '((:account . 12) (:human-date . 12) (:flags . 4) (:from . 25) - (:subject)) - mu4e-bookmarks `(("\\\\Inbox" "Inbox" ?i) - ("\\\\Draft" "Drafts" ?d) - ("flag:unread AND \\\\Inbox" "Unread messages" ?u) - ("flag:flagged" "Starred messages" ?s) - ("date:today..now" "Today's messages" ?t) - ("date:7d..now" "Last 7 days" ?w) - ("mime:image/*" "Messages with images" ?p))) + (:subject))) + + ;; Use fancy icons + (setq mu4e-headers-has-child-prefix '("+" . "") + mu4e-headers-empty-parent-prefix '("-" . "") + mu4e-headers-first-child-prefix '("-" . "") + mu4e-headers-duplicate-prefix '("-" . "") + mu4e-headers-default-prefix '("-" . "") + mu4e-headers-draft-mark '("-" . "") + mu4e-headers-flagged-mark '("-" . "") + mu4e-headers-new-mark '("-" . "") + mu4e-headers-passed-mark '("-" . "") + mu4e-headers-replied-mark '("-" . "") + mu4e-headers-seen-mark '("-" . "") + mu4e-headers-trashed-mark '("-" . "") + mu4e-headers-attach-mark '("-" . "") + mu4e-headers-encrypted-mark '("-" . "") + mu4e-headers-signed-mark '("-" . "") + mu4e-headers-unread-mark '("-" . "")) ;; Add a column to display what email account the email belongs to. (add-to-list 'mu4e-header-info-custom @@ -114,37 +123,6 @@ default/fallback account." (let ((maildir (mu4e-message-field msg :maildir))) (format "%s" (substring maildir 1 (string-match-p "/" maildir 1))))))) - ;; In my workflow, emails won't be moved at all. Only their flags/labels are - ;; changed. Se we redefine the trash and refile marks not to do any moving. - ;; However, the real magic happens in `+email|gmail-fix-flags'. - ;; - ;; Gmail will handle the rest. - (defun +email--mark-seen (docid msg target) - (mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N")) - - (map-delete mu4e-marks 'delete) - (map-put mu4e-marks 'trash - (list :char '("d" . "▼") - :prompt "dtrash" - :dyn-target (lambda (target msg) (mu4e-get-trash-folder msg)) - :action #'+email--mark-seen)) - ;; Refile will be my "archive" function. - (map-put mu4e-marks 'refile - (list :char '("r" . "▶") :prompt "refile" - :show-target (lambda (target) "archive") - :action #'+email--mark-seen)) - - ;; This hook correctly modifies gmail flags on emails when they are marked. - ;; Without it, refiling (archiving), trashing, and flagging (starring) email - ;; won't properly result in the corresponding gmail action, since the marks - ;; are ineffectual otherwise. - (defun +email|gmail-fix-flags (mark msg) - (cond ((eq mark 'trash) (mu4e-action-retag-message msg "-\\Inbox,+\\Trash,-\\Draft")) - ((eq mark 'refile) (mu4e-action-retag-message msg "-\\Inbox")) - ((eq mark 'flag) (mu4e-action-retag-message msg "+\\Starred")) - ((eq mark 'unflag) (mu4e-action-retag-message msg "-\\Starred")))) - (add-hook 'mu4e-mark-execute-pre-hook #'+email|gmail-fix-flags) - ;; Refresh the current view after marks are executed (defun +email*refresh (&rest _) (mu4e-headers-rerun-search)) (advice-add #'mu4e-mark-execute-all :after #'+email*refresh) @@ -160,101 +138,22 @@ default/fallback account." (imagemagick-register-types)) (after! evil - (cl-loop for str in '((mu4e-main-mode . normal) - (mu4e-view-mode . normal) - (mu4e-headers-mode . normal) - (mu4e-compose-mode . normal) - (mu4e~update-mail-mode . normal)) - do (evil-set-initial-state (car str) (cdr str))) - - (setq mu4e-view-mode-map (make-sparse-keymap) - ;; mu4e-compose-mode-map (make-sparse-keymap) - mu4e-headers-mode-map (make-sparse-keymap) - mu4e-main-mode-map (make-sparse-keymap)) - - (map! (:map (mu4e-main-mode-map mu4e-view-mode-map) - :leader - :n "," #'mu4e-context-switch - :n "." #'mu4e-headers-search-bookmark - :n ">" #'mu4e-headers-search-bookmark-edit - :n "/" #'mu4e~headers-jump-to-maildir) - - (:map (mu4e-headers-mode-map mu4e-view-mode-map) - :localleader - :n "f" #'mu4e-compose-forward - :n "r" #'mu4e-compose-reply - :n "c" #'mu4e-compose-new - :n "e" #'mu4e-compose-edit) - - (:map mu4e-main-mode-map - :n "q" #'mu4e-quit - :n "u" #'mu4e-update-index - :n "U" #'mu4e-update-mail-and-index - :n "J" #'mu4e~headers-jump-to-maildir - :n "c" #'+email/compose - :n "b" #'mu4e-headers-search-bookmark) - - (:map mu4e-headers-mode-map - :n "q" #'mu4e~headers-quit-buffer - :n "r" #'mu4e-compose-reply - :n "c" #'mu4e-compose-edit - :n "s" #'mu4e-headers-search-edit - :n "S" #'mu4e-headers-search-narrow - :n "RET" #'mu4e-headers-view-message - :n "u" #'mu4e-headers-mark-for-unmark - :n "U" #'mu4e-mark-unmark-all - :n "v" #'evil-visual-line - :nv "d" #'+email/mark - :nv "=" #'+email/mark - :nv "-" #'+email/mark - :nv "+" #'+email/mark - :nv "!" #'+email/mark - :nv "?" #'+email/mark - :nv "r" #'+email/mark - :nv "m" #'+email/mark - :n "x" #'mu4e-mark-execute-all - - :n "]]" #'mu4e-headers-next-unread - :n "[[" #'mu4e-headers-prev-unread - - (:localleader - :n "s" 'mu4e-headers-change-sorting - :n "t" 'mu4e-headers-toggle-threading - :n "r" 'mu4e-headers-toggle-include-related - - :n "%" #'mu4e-headers-mark-pattern - :n "t" #'mu4e-headers-mark-subthread - :n "T" #'mu4e-headers-mark-thread)) - - (:map mu4e-view-mode-map - :n "q" #'mu4e~view-quit-buffer - :n "r" #'mu4e-compose-reply - :n "c" #'mu4e-compose-edit - :n "o" #'ace-link-mu4e - - :n "" #'mu4e-view-headers-prev - :n "" #'mu4e-view-headers-next - :n "[m" #'mu4e-view-headers-prev - :n "]m" #'mu4e-view-headers-next - :n "[u" #'mu4e-view-headers-prev-unread - :n "]u" #'mu4e-view-headers-next-unread - - (:localleader - :n "%" #'mu4e-view-mark-pattern - :n "t" #'mu4e-view-mark-subthread - :n "T" #'mu4e-view-mark-thread - - :n "d" #'mu4e-view-mark-for-trash - :n "r" #'mu4e-view-mark-for-refile - :n "m" #'mu4e-view-mark-for-move)) - - (:map mu4e~update-mail-mode-map - :n "q" #'mu4e-interrupt-update-mail)))) + (dolist (mode '(mu4e-main-mode mu4e-view-mode mu4e-headers-mode + mu4e-compose-mode mu4e~update-mail-mode)) + (evil-set-initial-state mode 'normal)))) (def-package! mu4e-maildirs-extension :after mu4e - :config (mu4e-maildirs-extension-load)) + :config + (mu4e-maildirs-extension-load) + (setq mu4e-maildirs-extension-title nil + ;; mu4e-maildirs-extension-ignored-regex "^*~*" + mu4e-maildirs-extension-buffer-name "*Mail*" + mu4e-maildirs-extension-insert-before-str "\n\t[c] Compose a message" + mu4e-maildirs-extension-action-text "\t[g] Update mail and index\n" + mu4e-maildirs-extension-maildir-expanded-prefix "-" + mu4e-maildirs-extension-maildir-default-prefix "|")) (def-package! org-mu4e @@ -268,3 +167,9 @@ default/fallback account." (add-hook! 'message-send-hook (setq-local org-mu4e-convert-to-html nil))) + +;; +;; Sub-modules +;; + +(if (featurep! +gmail) (load! +gmail)) From 64d41ed1d9618ac6e603cdbc8c2aebd18c28e1ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Jan 2018 17:37:39 -0500 Subject: [PATCH 0227/4235] Refactor & redesign app/twitter Inspired by UI changes by @fuxialexander, mentioned in https://github.com/hlissner/emacs-doom-themes/issues/131 --- modules/app/twitter/autoload.el | 48 ++++++++++++++++++++++++-------- modules/app/twitter/config.el | 49 +++++++++++++++++++++++++-------- 2 files changed, 74 insertions(+), 23 deletions(-) diff --git a/modules/app/twitter/autoload.el b/modules/app/twitter/autoload.el index f845154b3..54267d3d9 100644 --- a/modules/app/twitter/autoload.el +++ b/modules/app/twitter/autoload.el @@ -1,12 +1,32 @@ ;;; app/twitter/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +twitter-display-buffer (buf) + "A replacement display-buffer command for `twittering-pop-to-buffer-function' +that works with the feature/popup module." + (let ((win (selected-window))) + (display-buffer buf) + ;; This is required because the new window generated by `pop-to-buffer' + ;; may hide the region following the current position. + (twittering-ensure-whole-of-status-is-visible win))) + +;;;###autoload +(defun +twitter-buffer-p (buf) + "Return non-nil if BUF is a `twittering-mode' buffer." + (eq 'twittering-mode (buffer-local-value 'major-mode buf))) + + +;; +;; Commands +;; + ;;;###autoload (defun =twitter () + "Opens a workspace dedicated to `twittering-mode'." (interactive) - (+workspace-switch "*Twitter*" t) - (delete-other-windows) - (condition-case _ex + (condition-case _ (progn + (+workspace/new "*Twitter*") (call-interactively #'twit) (unless (get-buffer (car twittering-initial-timeline-spec-string)) (error "Failed to open twitter")) @@ -14,12 +34,13 @@ (dolist (name (cdr twittering-initial-timeline-spec-string)) (split-window-horizontally) (switch-to-buffer name)) - (balance-windows)) - ('error - (+twitter/quit-all)))) + (balance-windows) + (call-interactively #'+twitter/rerender-all)) + ('error (+twitter/quit-all)))) ;;;###autoload (defun +twitter/quit () + "Close the current `twitter-mode' buffer." (interactive) (when (eq major-mode 'twittering-mode) (twittering-kill-buffer) @@ -27,15 +48,18 @@ ;;;###autoload (defun +twitter/quit-all () + "Close all open `twitter-mode' buffers and the associated workspace, if any." (interactive) - (+workspace/delete "Twitter") - (dolist (buf (doom-buffers-in-mode 'twittering-mode)) - (with-current-buffer buf - (twittering-kill-buffer)))) + (+workspace/delete "*Twitter*") + (dolist (buf (doom-buffers-in-mode 'twittering-mode (buffer-list) t)) + (twittering-kill-buffer buf))) ;;;###autoload (defun +twitter/rerender-all () + "Rerender all `twittering-mode' buffers." (interactive) - (dolist (buf (doom-buffers-in-mode 'twittering-mode)) + (dolist (buf (doom-buffers-in-mode 'twittering-mode (buffer-list) t)) (with-current-buffer buf - (twittering-rerender-timeline-all buf)))) + (twittering-rerender-timeline-all buf) + (setq-local line-spacing 0.2) + (goto-line 0 buf)))) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index 12385631d..fab0d7ecb 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -3,19 +3,47 @@ (def-package! twittering-mode :commands twit :config - (setq twittering-use-master-password t - twittering-icon-mode nil + (setq twittering-private-info-file (expand-file-name "twittering-mode.gpg" doom-etc-dir) + twittering-use-master-password t + twittering-request-confirmation-on-posting t + ;; twittering-icon-mode t ;; twittering-use-icon-storage t ;; twittering-icon-storage-file (concat doom-cache-dir "twittering-mode-icons.gz") ;; twittering-convert-fix-size 12 twittering-timeline-header "" twittering-timeline-footer "" twittering-edit-skeleton 'inherit-any - twittering-status-format - "%RT{%FACE[bold]{RT }}%S (%FACE[bold]{@%s}), %@%r%R:\n%FOLD[ ]{%t %QT{\n+----\n%FOLD[|]{ %S (@%s), %@:\n%FOLD[ ]{%t}}\n+----}}\n " + twittering-status-format "%FACE[font-lock-function-name-face]{ @%s} %FACE[italic]{%@} %FACE[error]{%FIELD-IF-NONZERO[❤ %d]{favorite_count}} %FACE[warning]{%FIELD-IF-NONZERO[↺ %d]{retweet_count}} +%FOLD[ ]{%FILL{%t}%QT{ +%FOLD[ ]{%FACE[font-lock-function-name-face]{@%s}\t%FACE[shadow]{%@} +%FOLD[ ]{%FILL{%t}} +}}} + +%FACE[twitter-divider]{ } +" + ;; twittering-timeline-spec-alias '() twittering-initial-timeline-spec-string '(":home" ":mentions" ":direct_messages")) + (set! :popup "^\\*twittering-edit" nil '((transient) (quit) (select . t) (modeline . minimal))) + + (defface twitter-divider + `((t (:underline (:color ,(doom-darken 'vertical-bar 0.2))))) + "The vertical divider between tweets." + :group 'twittering-mode) + + (add-hook 'doom-real-buffer-functions #'+twitter-buffer-p) + (when (featurep! :feature popup) + (setq twittering-pop-to-buffer-function #'+twitter-display-buffer)) + + (after! solaire-mode + (add-hook 'twittering-mode-hook #'solaire-mode)) + + ;; Custom modeline for twitter buffers + (def-modeline! twitter + (bar matches " %b " selection-info) + ()) + (add-hook! twittering-mode (setq header-line-format (or (doom-modeline 'twitter) mode-line-format) mode-line-format nil)) @@ -24,11 +52,10 @@ [remap twittering-kill-buffer] #'+twitter/quit "Q" #'+twitter/quit-all "o" #'ace-link-addr - "j" #'evil-next-visual-line - "k" #'evil-previous-visual-line "J" #'twittering-goto-next-status - "K" #'twittering-goto-previous-status) - - (def-modeline! twitter - (bar matches " %b " selection-info) - ())) + "K" #'twittering-goto-previous-status + (:when (featurep! :feature evil) + "j" #'evil-next-visual-line + "k" #'evil-previous-visual-line + "h" #'evil-window-left + "l" #'evil-window-right))) From 3c6a76eef2e4906c80ec3a73e6e6b03b862adfdc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 Jan 2018 01:12:19 -0500 Subject: [PATCH 0228/4235] feature/eval: :repl! = open repl in same window --- modules/feature/eval/autoload/evil.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/eval/autoload/evil.el b/modules/feature/eval/autoload/evil.el index e36320976..aa76f73f1 100644 --- a/modules/feature/eval/autoload/evil.el +++ b/modules/feature/eval/autoload/evil.el @@ -19,5 +19,5 @@ :move-point nil (interactive "") (if (evil-normal-state-p) - (+eval/open-repl) + (+eval/open-repl bang) (+eval/send-region-to-repl beg end bang))) From 063016f2785ab90c36f6e1bad2d79c13dd59cccd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 Jan 2018 01:52:57 -0500 Subject: [PATCH 0229/4235] Add discord badge to README #373 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 241b8cc52..fc5c7eeaf 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![Master Build Status](https://img.shields.io/travis/hlissner/doom-emacs/master.svg?label=master&style=flat-square)](https://travis-ci.org/hlissner/doom-emacs) [![Develop Build Status](https://img.shields.io/travis/hlissner/doom-emacs/develop.svg?label=develop&style=flat-square)](https://travis-ci.org/hlissner/doom-emacs) [![MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat-square)](./LICENSE) +[![Chat on Discord](https://discordapp.com/api/guilds/406534637242810369/embed.png)](https://discord.gg/bcZ6P3y) [![Main screenshot](/../screenshots/main.png)](/../../tree/screenshots) From fcbfe352c41277e4d6ae68657ebd65b954a4c6e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 Jan 2018 14:43:10 -0500 Subject: [PATCH 0230/4235] Redo readme badges + Nicer discord badge + Remove license badge (redundant) --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index fc5c7eeaf..32b8f7d58 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -![Release tag](https://img.shields.io/github/tag/hlissner/doom-emacs.svg?label=release&style=flat-square) -[![Master Build Status](https://img.shields.io/travis/hlissner/doom-emacs/master.svg?label=master&style=flat-square)](https://travis-ci.org/hlissner/doom-emacs) -[![Develop Build Status](https://img.shields.io/travis/hlissner/doom-emacs/develop.svg?label=develop&style=flat-square)](https://travis-ci.org/hlissner/doom-emacs) -[![MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat-square)](./LICENSE) -[![Chat on Discord](https://discordapp.com/api/guilds/406534637242810369/embed.png)](https://discord.gg/bcZ6P3y) - -[![Main screenshot](/../screenshots/main.png)](/../../tree/screenshots) +

+ Current release + build status (master) + build status (develop) + Chat on discord + Main screenshot +

- - - From cedb8d0058521f480cbe52cc9796c433d6a8b96f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 Jan 2018 20:49:46 -0500 Subject: [PATCH 0231/4235] Refactor tools/dired; fix leader key in dired buffers --- modules/tools/dired/config.el | 85 ++++++++++++++++------------------- 1 file changed, 39 insertions(+), 46 deletions(-) diff --git a/modules/tools/dired/config.el b/modules/tools/dired/config.el index e7e7f5657..452d5c925 100644 --- a/modules/tools/dired/config.el +++ b/modules/tools/dired/config.el @@ -1,61 +1,54 @@ ;;; tools/dired/config.el -*- lexical-binding: t; -*- -(setq ;; Always copy/delete recursively - dired-recursive-copies 'always - dired-recursive-deletes 'top - ;; Auto refresh dired, but be quiet about it - global-auto-revert-non-file-buffers t - auto-revert-verbose nil - ;; files - image-dired-dir (concat doom-cache-dir "image-dired/") - image-dired-db-file (concat image-dired-dir "image-dired/db.el") - image-dired-gallery-dir (concat image-dired-dir "gallery/") - image-dired-temp-image-file (concat image-dired-dir "temp-image") - image-dired-temp-rotate-image-file (concat image-dired-dir "temp-rotate-image")) +(def-package! dired + :defer t + :init + (setq ;; Always copy/delete recursively + dired-recursive-copies 'always + dired-recursive-deletes 'top + ;; Auto refresh dired, but be quiet about it + global-auto-revert-non-file-buffers t + auto-revert-verbose nil + ;; files + image-dired-dir (concat doom-cache-dir "image-dired/") + image-dired-db-file (concat image-dired-dir "image-dired/db.el") + image-dired-gallery-dir (concat image-dired-dir "gallery/") + image-dired-temp-image-file (concat image-dired-dir "temp-image") + image-dired-temp-rotate-image-file (concat image-dired-dir "temp-rotate-image")) + :config + (defun +dired|sort-directories-first () + "List directories first in dired buffers." + (save-excursion + (let (buffer-read-only) + (forward-line 2) ;; beyond dir. header + (sort-regexp-fields t "^.*$" "[ ]*." (point) (point-max)))) + (and (featurep 'xemacs) + (fboundp 'dired-insert-set-properties) + (dired-insert-set-properties (point-min) (point-max))) + (set-buffer-modified-p nil)) + (add-hook 'dired-after-readin-hook #'+dired|sort-directories-first) -(defun +dired|sort-directories-first () - "List directories first in dired buffers." - (save-excursion - (let (buffer-read-only) - (forward-line 2) ;; beyond dir. header - (sort-regexp-fields t "^.*$" "[ ]*." (point) (point-max)))) - (and (featurep 'xemacs) - (fboundp 'dired-insert-set-properties) - (dired-insert-set-properties (point-min) (point-max))) - (set-buffer-modified-p nil)) -(add-hook 'dired-after-readin-hook #'+dired|sort-directories-first) + ;; Automatically create missing directories when creating new files + (defun +dired|create-non-existent-directory () + (let ((parent-directory (file-name-directory buffer-file-name))) + (when (and (not (file-exists-p parent-directory)) + (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory))) + (make-directory parent-directory t)))) + (push #'+dired|create-non-existent-directory find-file-not-found-functions) -;; Automatically create missing directories when creating new files -(defun +dired|create-non-existent-directory () - (let ((parent-directory (file-name-directory buffer-file-name))) - (when (and (not (file-exists-p parent-directory)) - (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory))) - (make-directory parent-directory t)))) -(push #'+dired|create-non-existent-directory find-file-not-found-functions) + ;; Don't interfere with leader key + (define-key dired-mode-map (kbd doom-leader-key) nil)) -(after! evil - (add-transient-hook! 'dired-mode-hook - (map! :map dired-mode-map - :n "c" #'find-file - :n "d" #'dired-do-delete - :n "r" #'dired-do-rename))) - - -;; -;; Packages -;; (def-package! dired-k :after dired :config (setq dired-k-style 'git) + (add-hook 'dired-initial-position-hook #'dired-k) + (add-hook 'dired-after-readin-hook #'dired-k-no-revert) (defun +dired*dired-k-highlight (orig-fn &rest args) "Butt out if the requested directory is remote (i.e. through tramp)." (unless (file-remote-p default-directory) (apply orig-fn args))) - (advice-add #'dired-k--highlight :around #'+dired*dired-k-highlight) - - (add-hook 'dired-initial-position-hook #'dired-k) - (add-hook 'dired-after-readin-hook #'dired-k-no-revert)) - + (advice-add #'dired-k--highlight :around #'+dired*dired-k-highlight)) From d556e1190e4c08bc3b1678610c1b5d12f50c2374 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 Jan 2018 20:57:02 -0500 Subject: [PATCH 0232/4235] completion/ivy: refactor; lazy-load counsel & counsel-projectile Counsel loads a number of other packages, like dired, etags, swiper and some of the eshell library. We're better off lazy-loading it. --- modules/completion/ivy/config.el | 59 +++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 59ee560e7..33cf81fe0 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -47,19 +47,9 @@ 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! [remap apropos] #'counsel-apropos - [remap describe-face] #'counsel-describe-face - [remap find-file] #'counsel-find-file - [remap switch-to-buffer] #'ivy-switch-buffer - [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer - [remap recentf-open-files] #'counsel-recentf - [remap imenu] #'counsel-imenu - [remap bookmark-jump] #'counsel-bookmark - [remap projectile-find-file] #'counsel-projectile-find-file - [remap imenu-anywhere] #'ivy-imenu-anywhere - [remap execute-extended-command] #'counsel-M-x - [remap describe-function] #'counsel-describe-function - [remap describe-variable] #'counsel-describe-variable) + (map! [remap switch-to-buffer] #'ivy-switch-buffer + [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer + [remap imenu-anywhere] #'ivy-imenu-anywhere) (nconc ivy-sort-functions-alist '((persp-kill-buffer . nil) @@ -85,16 +75,30 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel - :requires ivy + :commands (counsel-ag counsel-rg counsel-pt counsel-apropos counsel-bookmark + counsel-describe-function counsel-describe-variable + counsel-describe-face counsel-M-x counsel-file-jump + counsel-find-file counsel-find-library counsel-info-lookup-symbol + counsel-imenu counsel-recentf counsel-yank-pop) + :init + (map! [remap apropos] #'counsel-apropos + [remap bookmark-jump] #'counsel-bookmark + [remap describe-face] #'counsel-describe-face + [remap describe-function] #'counsel-describe-function + [remap describe-variable] #'counsel-describe-variable + [remap execute-extended-command] #'counsel-M-x + [remap find-file] #'counsel-find-file + [remap find-library] #'counsel-find-library + [remap yank-pop] #'counsel-yank-pop + [remap info-lookup-symbol] #'counsel-info-lookup-symbol + [remap imenu] #'counsel-imenu + [remap recentf-open-files] #'counsel-recentf) :config - ;; Dim recentf entries that are not in the current project. - (ivy-set-display-transformer 'counsel-recentf '+ivy-recentf-transformer) - ;; Highlight entries that have been visited - (ivy-set-display-transformer 'counsel-projectile-find-file '+ivy-projectile-find-file-transformer) - - (require 'counsel-projectile) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") + ;; Dim recentf entries that are not in the current project. + (ivy-set-display-transformer #'counsel-recentf #'+ivy-recentf-transformer) + ;; Configure `counsel-rg', `counsel-ag' & `counsel-pt' (dolist (cmd '(counsel-ag counsel-rg counsel-pt)) (ivy-add-actions @@ -108,6 +112,21 @@ immediately runs it on the current candidate (ending the ivy session)." (advice-add #'counsel-ag-function :override #'+ivy*counsel-ag-function)) +(def-package! counsel-projectile + :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer + counsel-projectile-grep counsel-projectile-ag) + :init + (map! [remap projectile-find-file] #'counsel-projectile-find-file + [remap projectile-find-dir] #'counsel-projectile-find-dir + [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer + [remap projectile-grep] #'counsel-projectile-grep + [remap projectile-ag] #'counsel-projectile-ag + [remap projectile-switch-project] #'counsel-projectile-switch-project) + :config + ;; Highlight entries that have been visited + (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) + + ;; Used by `counsel-M-x' (def-package! smex :commands (smex smex-major-mode-commands) From 2bdd1c98c5948f336b48e57e135519233dd919a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 27 Jan 2018 22:19:40 -0500 Subject: [PATCH 0233/4235] private/default: generalize yank-pop keybind completion/ivy remaps yank-pop to counsel-yank-pop anyhow. --- modules/private/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 3fb5b1787..c105a43ad 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -215,7 +215,7 @@ :desc "Toggle profiler" :n "p" #'doom/toggle-profiler) (:desc "insert" :prefix "i" - :desc "From kill-ring" :nv "y" #'counsel-yank-pop + :desc "From kill-ring" :nv "y" #'yank-pop :desc "From snippet" :nv "s" #'yas-insert-snippet) (:desc "notes" :prefix "n" From 4f983c139e8ca6ed88be653080c7ce76b7aebff4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 03:00:25 -0500 Subject: [PATCH 0234/4235] Improve doom/describe-{setting,module} commands Now grabs the setting/module at point --- core/autoload/help.el | 73 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 52ee799b6..e884c7f0f 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -1,13 +1,24 @@ ;;; core/autoload/help.el -*- lexical-binding: t; -*- +(defun doom--find-next (pred forward-fn end-fn) + (save-excursion + (catch 'found + (ignore-errors + (while (not (funcall end-fn)) + (when-let* ((ret (funcall pred))) + (throw 'found ret)) + (funcall forward-fn)))))) + ;;;###autoload (defun doom/describe-setting (setting) - "Open the documentation of SETTING (a keyword defined with `def-setting!')." + "Open the documentation of SETTING (a keyword defined with `def-setting!'). + +Defaults to the " (interactive - ;; TODO try to read setting from whole line - (list (completing-read "Describe setting%s: " - (sort (mapcar #'car doom-settings) #'string-lessp) - nil t nil nil))) + (let ((sym (symbol-at-point))) + (list (completing-read "Describe setting: " + (sort (mapcar #'car doom-settings) #'string-lessp) + nil t (if (keywordp sym) (symbol-name sym)))))) (let ((fn (cdr (assq (intern setting) doom-settings)))) (unless fn (error "'%s' is not a valid DOOM setting" setting)) @@ -16,13 +27,53 @@ ;;;###autoload (defun doom/describe-module (module) "Open the documentation of MODULE (a string that represents the category and -submodule in the format, e.g. ':feature evil')." +submodule in the format, e.g. ':feature evil'). + +Defaults to either a) the module at point (in init.el), b) the module derived +from a `featurep!' or `require!' call or c) the module that the current file is +in." (interactive - ;; TODO try to read module from whole line - (list (completing-read "Describe module: " - (cl-loop for (module . sub) in (reverse (hash-table-keys doom-modules)) - collect (format "%s %s" module sub)) - nil t))) + (let ((module + (cond ((string= (file-truename user-init-file) + (file-truename buffer-file-name)) + (let* ((category + (save-excursion + (goto-char (line-end-position)) + (doom--find-next + (lambda () + (and (not (sp-point-in-comment)) + (keywordp (symbol-at-point)) + (symbol-at-point))) + (lambda () (forward-symbol -1)) + #'bobp))) + (module + (save-excursion + (goto-char (line-beginning-position)) + (save-restriction + (narrow-to-region (point) (line-end-position)) + (doom--find-next + (lambda () + (and (not (sp-point-in-comment)) + (not (keywordp (symbol-at-point))) + (sexp-at-point))) + #'forward-sexp + #'eobp))))) + (when (and category module) + (format "%s %s" category module)))) + ((save-excursion + (sp-beginning-of-sexp) + (unless (eq (char-after) ?\() + (backward-char)) + (let ((sexp (sexp-at-point))) + (when (memq (car-safe sexp) '(featurep! require!)) + (format "%s %s" (nth 1 sexp) (nth 2 sexp)))))) + ((file-in-directory-p buffer-file-name doom-modules-dir) + (let ((module (doom-module-from-path buffer-file-name))) + (format "%s %s" (car module) (cdr module))))))) + (list (completing-read "Describe module: " + (cl-loop for (module . sub) in (reverse (hash-table-keys doom-modules)) + collect (format "%s %s" module sub)) + nil t module)))) (cl-destructuring-bind (category submodule) (mapcar #'intern (split-string module " ")) (unless (member (cons category submodule) (doom-module-pairs)) From bc6be597ecaa12e88a44c1086efd021128985d26 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 03:11:56 -0500 Subject: [PATCH 0235/4235] private/default: add imenu-list-minor-mode keybind --- modules/private/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index c105a43ad..8d8046e80 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -231,6 +231,7 @@ :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl :desc "Neotree" :n "n" #'+neotree/toggle + :desc "Imenu sidebar" :nv "i" #'imenu-list-minor-mode :desc "Terminal" :n "t" #'+term/open-popup :desc "Terminal in project" :n "T" #'+term/open-popup-in-project From d0cce3cafbe3edf430ee586d839634700b0b63bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 03:13:40 -0500 Subject: [PATCH 0236/4235] completion/ivy: remove projectile-switch-project remap --- 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 33cf81fe0..1c2dee592 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -120,8 +120,7 @@ immediately runs it on the current candidate (ending the ivy session)." [remap projectile-find-dir] #'counsel-projectile-find-dir [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer [remap projectile-grep] #'counsel-projectile-grep - [remap projectile-ag] #'counsel-projectile-ag - [remap projectile-switch-project] #'counsel-projectile-switch-project) + [remap projectile-ag] #'counsel-projectile-ag) :config ;; Highlight entries that have been visited (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) From 3578d433c2a2caaac60ebea86d8b9efadffd25a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 03:34:18 -0500 Subject: [PATCH 0237/4235] Integrate counsel-projectile-switch-project & restore file prompt when switching projects --- modules/completion/ivy/config.el | 5 +++-- .../feature/workspaces/autoload/workspaces.el | 16 ++++++++++++++++ modules/feature/workspaces/config.el | 3 ++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 1c2dee592..8eaaa1984 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -114,13 +114,14 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel-projectile :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer - counsel-projectile-grep counsel-projectile-ag) + counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init (map! [remap projectile-find-file] #'counsel-projectile-find-file [remap projectile-find-dir] #'counsel-projectile-find-dir [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer [remap projectile-grep] #'counsel-projectile-grep - [remap projectile-ag] #'counsel-projectile-ag) + [remap projectile-ag] #'counsel-projectile-ag + [remap projectile-switch-project] #'counsel-projectile-switch-project) :config ;; Highlight entries that have been visited (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8a6050e05..e601bf711 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -479,6 +479,19 @@ created." `+workspaces|switch-to-project'." (setq +workspaces--project-dir default-directory)) +;;;###autoload +(defun +workspaces|switch-counsel-project-action (project) + "A `counsel-projectile-switch-project-action' that creates a dedicated +workspace for a new project, before prompting to open a file." + (when persp-mode + (let ((+workspaces--project-dir project) + (inhibit-message t)) + (+workspaces|switch-to-project))) + (counsel-projectile-switch-project-action project) + (+workspace-message + (format "Switched to '%s' in new workspace" new-name) + 'success)) + ;;;###autoload (defun +workspaces|switch-to-project () "Creates a workspace dedicated to a new project. Should be hooked to @@ -491,6 +504,9 @@ created." (new-name (persp-name persp))) (+workspace-switch new-name) (switch-to-buffer (doom-fallback-buffer)) + (call-interactively + (or (command-remapping #'projectile-find-file) + #'projectile-find-file)) (+workspace-message (format "Switched to '%s' in new workspace" new-name) 'success)) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 3ccf63525..312632c4c 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -81,7 +81,8 @@ renamed.") (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) ;; per-project workspaces - (setq projectile-switch-project-action #'+workspaces|set-project-action) + (setq projectile-switch-project-action #'+workspaces|set-project-action + counsel-projectile-switch-project-action #'+workspaces|switch-counsel-project-action) (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) ;; From acb77c84070323a2f45423a33e70c8f8499ff895 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 04:28:15 -0500 Subject: [PATCH 0238/4235] lang/web: conditionally define js sub-modes --- modules/lang/web/config.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index 391063ba1..5fa06ba01 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -29,10 +29,6 @@ ;; Frameworks ;; -(def-project-mode! +web-angularjs-mode - :modes (+javascript-npm-mode) - :when (+javascript-npm-dep-p 'angular)) - (def-project-mode! +web-jekyll-mode :modes (web-mode js-mode coffee-mode css-mode haml-mode pug-mode) :files (and "config.yml" (or "_layouts/" "_posts/")) @@ -44,10 +40,15 @@ :modes (php-mode web-mode css-mode haml-mode pug-mode) :files (or "wp-config.php" "wp-config-sample.php")) -(def-project-mode! +web-react-mode - :modes (+javascript-npm-mode) - :when (+javascript-npm-dep-p 'react)) +(when (featurep! :lang javascript) + (def-project-mode! +web-angularjs-mode + :modes (+javascript-npm-mode) + :when (+javascript-npm-dep-p 'angular)) -(def-project-mode! +web-phaser-mode - :modes (+javascript-npm-mode) - :when (+javascript-npm-dep-p '(or phaser phaser-ce))) + (def-project-mode! +web-react-mode + :modes (+javascript-npm-mode) + :when (+javascript-npm-dep-p 'react)) + + (def-project-mode! +web-phaser-mode + :modes (+javascript-npm-mode) + :when (+javascript-npm-dep-p '(or phaser phaser-ce)))) From 294f858875284d077ee0b9aa84ac2248ed5eb29e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 04:29:10 -0500 Subject: [PATCH 0239/4235] lang/data: enable flycheck-mode for json-mode --- modules/lang/data/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 71f7078e5..b01d00d6f 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -18,6 +18,8 @@ (def-package! json-mode :mode "\\.js\\(on\\|[hl]int\\(rc\\)?\\)$" :config + (when (featurep! :feature syntax-checker) + (add-hook 'json-mode-hook #'flycheck-mode)) (set! :electric 'json-mode :chars '(?\n ?: ?{ ?}))) From d4c1050e32f422cc5f12b25482f2fa201e8a7f5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 04:31:14 -0500 Subject: [PATCH 0240/4235] core-project: fix projectile caching error when buffer-file-name is nil --- core/core-projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 24db2ee04..013064874 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -40,7 +40,7 @@ (defun doom*projectile-cache-current-file (orig-fun &rest args) "Don't cache ignored files." (unless (cl-loop for path in (projectile-ignored-directories) - if (string-prefix-p buffer-file-name (expand-file-name path)) + if (string-prefix-p (or buffer-file-name "") (expand-file-name path)) return t) (apply orig-fun args))) (advice-add #'projectile-cache-current-file :around #'doom*projectile-cache-current-file)) From 01a5e9a1d7870d5e4c1527c1e71619829e075595 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 15:10:45 -0500 Subject: [PATCH 0241/4235] lang/org: fix uninstallable centered-window-mode package Turns out centered-window-mode isn't in any ELPA repo. Was it removed? I'm not sure, so it's now fetched directly from its github repo. --- modules/lang/org/+present.el | 2 +- modules/lang/org/packages.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index 7a9a804d5..44dfc2cfd 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -38,7 +38,7 @@ :around #'+org-present*narrow-to-subtree)) -(def-package! centered-window-mode :commands centered-window-mode) +(def-package! centered-window :commands centered-window-mode) ;; diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index d6a7eca04..d69571211 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -23,7 +23,7 @@ (package! ox-pandoc)) (when (featurep! +present) - (package! centered-window-mode) + (package! centered-window :recipe (:fetcher github :repo "anler/centered-window-mode")) (package! org-tree-slide) (package! ox-reveal)) From 78cb47a0727290b26d4798f27efc49a70a6e4a83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 15:30:02 -0500 Subject: [PATCH 0242/4235] lang/org: lazy-load babel libraries Removes +org-babel-languages and no longer eagerly loads babel libraries. If an ob-*.el exists for the language, it will be loaded once you execute its src block. Warning: this may interfere with tangling. An unloaded library can't register a language extension in org-babel-tangle-lang-exts (if any). This means babel won't be able to figure out the correct file extension for certain src blocks. Either load the package explicitly or provide a filename + extension for the TARGET-FILE argument: (require 'ob-rust) (org-babel-tangle-file "notes.org") ;; or (org-babel-tangle-file "notes.org" "notes.rs") --- modules/lang/org/+babel.el | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 06fdcc2c2..099ecc6eb 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -2,29 +2,6 @@ (add-hook 'org-load-hook #'+org|init-babel) -(defvar +org-babel-languages - '(calc - css - emacs-lisp - haskell - js - latex - ledger - lilypond - lisp - matlab - plantuml - python - restclient ; ob-restclient - ruby - rust ; ob-rust - shell - sqlite - sql-mode ; ob-sql-mode - translate) ; ob-translate - "A list of org-babel languages to load.") - - (defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty org-src-preserve-indentation t ; use native major-mode indentation @@ -32,10 +9,15 @@ org-src-window-setup 'current-window org-confirm-babel-evaluate nil) ; you don't need my permission - (org-babel-do-load-languages - 'org-babel-load-languages - (cl-loop for sym in +org-babel-languages - collect (cons sym t))) + (defun +org*babel-execute-src-block (orig-fn &rest args) + "Load babel libraries as needed when babel blocks are executed." + (let* ((language (org-element-property :language (org-element-at-point))) + (lang-sym (intern language))) + (unless (cdr (assoc lang-sym org-babel-load-languages)) + (require (intern (format "ob-%s" language))) + (add-to-list 'org-babel-load-languages (cons lang-sym t))) + (apply orig-fn args))) + (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) ;; I prefer C-c C-c for confirming over the default C-c ' (map! :map org-src-mode-map "C-c C-c" #'org-edit-src-exit) From 3bd262117dc5f151ff6469369f81692c7e71f673 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 16:28:49 -0500 Subject: [PATCH 0243/4235] Initialize project-mode sooner Fixes a couple projectile errors when parts of Doom try to use projectile before it's loaded. --- core/core-projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 013064874..a6d43537d 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,7 +1,6 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile - :hook (doom-init . projectile-mode) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) @@ -12,6 +11,7 @@ projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o")) :config + (projectile-mode +1) (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) (add-hook 'find-file-hook #'doom|autoload-project-mode) From cd6fb816fd5448fd242a7b7b6c90523a506d9b28 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 16:50:19 -0500 Subject: [PATCH 0244/4235] ui/doom-modeline: set modeline sooner This may address scenarios where the modeline is unset, especially in terminal Emacs sessions (like when emacs -nw is your EDITOR). --- modules/ui/doom-modeline/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 8f6a586a4..7717fc531 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -601,9 +601,6 @@ Returns \"\" to not break --no-window-system." ;; (defun +doom-modeline|init () - "Set the default modeline." - (doom-set-modeline 'main t) - ;; These buffers are already created and don't get modelines. For the love of ;; Emacs, someone give the man a modeline! (dolist (bname '("*scratch*" "*Messages*")) @@ -624,6 +621,8 @@ Returns \"\" to not break --no-window-system." ;; Bootstrap ;; +(doom-set-modeline 'main t) + (add-hook 'doom-init-theme-hook #'+doom-modeline|init) (add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) (add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) From 0cc3b34fa26803e659ba9a134a95fbf9c7817689 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 17:20:23 -0500 Subject: [PATCH 0245/4235] lang/org: fix errors lazy-loading mismatched babel libraries The ob-C.el library takes care of C, C++ and D. This modifies the babel lazy-loader to take this into account. Name => library mappings are defined in +org-babel-mode-alist. --- modules/lang/org/+babel.el | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 099ecc6eb..d29c18a59 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -2,6 +2,14 @@ (add-hook 'org-load-hook #'+org|init-babel) +(defvar +org-babel-mode-alist + '(("cpp" . C) + ("C++" . C) + ("D" . C) + ("matlab" . octave)) + "An alist that maps languages to babel libraries. This is necessary for babel +libraries (ob-*.el) that don't match the name of the language.") + (defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty org-src-preserve-indentation t ; use native major-mode indentation @@ -13,8 +21,11 @@ "Load babel libraries as needed when babel blocks are executed." (let* ((language (org-element-property :language (org-element-at-point))) (lang-sym (intern language))) - (unless (cdr (assoc lang-sym org-babel-load-languages)) - (require (intern (format "ob-%s" language))) + (when (and (not (cdr (assq lang-sym org-babel-load-languages))) + (require + (intern (format "ob-%s" + (or (cdr (assoc (downcase language) +org-babel-mode-alist)) + language))))) (add-to-list 'org-babel-load-languages (cons lang-sym t))) (apply orig-fn args))) (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) From 7bfd7c1ade93ac16788eae90d72a182ddcd32987 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 18:14:41 -0500 Subject: [PATCH 0246/4235] ui/doom-dashboard: don't change default-directory on startup --- modules/ui/doom-dashboard/config.el | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 35d6bc929..d08d64570 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -17,9 +17,6 @@ while they run.") "A list of functions which take no arguments. If any of them return non-nil, dashboard reloading is inhibited.") -(defvar +doom-dashboard-initial-pwd doom-emacs-dir - "The initial `default-directory' for the dashboard at startup.") - (defvar +doom-dashboard-pwd-policy 'last-project "The policy to use when setting the `default-directory' in the dashboard. @@ -33,7 +30,6 @@ Possible values: nil `default-directory' will never change") ;; -(defvar +doom-dashboard--first t) (defvar +doom-dashboard--last-cwd nil) (defvar +doom-dashboard--width 80) (defvar +doom-dashboard--height 0) @@ -208,10 +204,7 @@ controlled by `+doom-dashboard-pwd-policy'." (defun +doom-dashboard--get-pwd () (let ((lastcwd +doom-dashboard--last-cwd) (policy +doom-dashboard-pwd-policy)) - (cond (+doom-dashboard--first - (setq +doom-dashboard--first nil) - +doom-dashboard-initial-pwd) - ((null policy) + (cond ((null policy) default-directory) ((stringp policy) (expand-file-name policy lastcwd)) From 4977d22b751efe820176bbc0356002f105d51cf0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 18:15:04 -0500 Subject: [PATCH 0247/4235] ui/doom-dashboard: don't hide dired-mode buffers on startup --- 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 d08d64570..a35e4868d 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -151,7 +151,8 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (if (doom-real-buffer-p) + (if (or (doom-real-buffer-p) + (derived-mode-p 'dired-mode)) (current-buffer) (doom-fallback-buffer))) From e3040c676b52943d440bf19b6c0a79dc0549f2bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 18:15:22 -0500 Subject: [PATCH 0248/4235] ui/doom-dashboard: reload at least once on startup --- modules/ui/doom-dashboard/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a35e4868d..fcdd6099a 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -94,8 +94,7 @@ Possible values: (add-hook 'persp-created-functions #'+doom-dashboard|record-project) (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project) - (+doom-dashboard-reload t) - (+doom-dashboard|resize)) + (+doom-dashboard-reload t)) (defun +doom-dashboard|reload-on-kill () "A `kill-buffer-query-functions' hook. If this isn't a dashboard buffer, move From 086a1659b4f5f276c4b44d69c3190396e5674fdb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 18:15:43 -0500 Subject: [PATCH 0249/4235] ui/doom-dashboard: edit emacs.d button => fuzzy find-file --- 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 fcdd6099a..db2ba5756 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -302,4 +302,4 @@ controlled by `+doom-dashboard-pwd-policy'." (call-interactively (or (command-remapping #'bookmark-jump) #'bookmark-jump))) ("Edit emacs.d" "tools" - (find-file (expand-file-name "init.el" doom-emacs-dir))))))) + (call-interactively #'+default/find-in-emacsd)))))) From 83b04b4f14ee3e425a59c8c10fe40d3457065692 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 18:26:32 -0500 Subject: [PATCH 0250/4235] feature/workspace: associate emacsclient frames with workspace too --- modules/feature/workspaces/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 312632c4c..44409386d 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -76,7 +76,8 @@ renamed.") ;; per-frame workspaces (setq persp-init-new-frame-behaviour-override nil - persp-interactive-init-frame-behaviour-override #'+workspaces|associate-frame) + persp-interactive-init-frame-behaviour-override #'+workspaces|associate-frame + persp-emacsclient-init-frame-behaviour-override #'+workspaces|associate-frame) ;; delete frame associated with workspace, if it exists (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) From 38c0a851555f6508d6c4b8b92804fadcba9301a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 20:30:41 -0500 Subject: [PATCH 0251/4235] feature/workspaces: display tab line in minibuffer This prevents the tabline from being mirrored across all frames. --- modules/feature/workspaces/autoload/workspaces.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index e601bf711..09620ad95 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -437,7 +437,7 @@ the next." (defun +workspace/display () "Display a list of workspaces (like tabs) in the echo area." (interactive) - (message "%s" (+workspace--tabline))) + (minibuffer-message "%s" (+workspace--tabline))) ;; From 22f44042103672f212b2241625da4ee1c315429f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 20:32:08 -0500 Subject: [PATCH 0252/4235] feature/workspace: improve daemon/frame compatibility This update fixes issues with frame-local perspectives, and ensures that a workspace is always selected in a daemon session's frames. --- .../feature/workspaces/autoload/workspaces.el | 6 ++- modules/feature/workspaces/config.el | 46 +++++++++++-------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 09620ad95..0d0ba2eee 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -468,8 +468,10 @@ created." "Create a blank, new perspective and associate it with FRAME." (when persp-mode (with-selected-frame frame - (+workspace/new) - (set-frame-parameter frame 'workspace (+workspace-current-name)) + (if (not (persp-frame-list-without-daemon)) + (+workspace-switch +workspaces-main t) + (+workspace/new) + (set-frame-parameter frame 'workspace (+workspace-current-name))) (+workspace/display)))) (defvar +workspaces--project-dir nil) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 44409386d..8e6e6d04a 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -24,31 +24,37 @@ renamed.") (def-package! persp-mode :defer t :init - (defun +workspaces|init (&optional frame) + (defun +workspaces|init () (require 'persp-mode) - (unless persp-mode - (persp-mode +1)) + (persp-mode +1) + (+workspaces|init-frame (selected-frame)) + (add-hook 'after-make-frame-functions #'+workspaces|init-frame)) + + (defun +workspaces|init-frame (frame) (unless noninteractive (let (persp-before-switch-functions persp-activated-functions) - ;; The default perspective persp-mode makes (defined by - ;; `persp-nil-name') is special and doesn't actually represent a real - ;; persp object, so buffers can't really be assigned to it, among other - ;; quirks. We create a *real* main workspace to fill this role. - (unless (persp-get-by-name +workspaces-main) - (persp-add-new +workspaces-main)) - ;; Switch to it if we aren't auto-loading the last session - (when (and (equal (safe-persp-name (get-current-persp)) persp-nil-name) - (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main))) - ;; The warnings buffer gets swallowed by creating `+workspaces-main', so - ;; we display it manually, if it exists (fix #319). - (when-let* ((warnings (get-buffer "*Warnings*"))) - (save-excursion - (display-buffer-in-side-window - warnings '((window-height . shrink-window-if-larger-than-buffer))))))) + (with-selected-frame frame + ;; The default perspective persp-mode makes (defined by + ;; `persp-nil-name') is special and doesn't actually represent a real + ;; persp object, so buffers can't really be assigned to it, among other + ;; quirks. We create a *real* main workspace to fill this role. + (unless (persp-get-by-name +workspaces-main) + (persp-add-new +workspaces-main)) + ;; Switch to it if we aren't auto-loading the last session + (when (and (string= (safe-persp-name (get-current-persp)) persp-nil-name) + (= persp-auto-resume-time -1)) + (persp-frame-switch +workspaces-main frame)) + ;; We want to know where we are in every new daemon frame + (when (daemonp) + (run-at-time 0.2 nil #'+workspace/display)) + ;; The warnings buffer gets swallowed by creating `+workspaces-main', so + ;; we display it manually, if it exists (fix #319). + (when-let* ((warnings (get-buffer "*Warnings*"))) + (save-excursion + (display-buffer-in-side-window + warnings '((window-height . shrink-window-if-larger-than-buffer))))))))) (add-hook 'doom-init-hook #'+workspaces|init) - (add-hook 'after-make-frame-functions #'+workspaces|init) :config (setq persp-autokill-buffer-on-remove 'kill-weak persp-nil-hidden t From 8b19e35ef653a75e525e14e743f7070a77dfe49f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 20:37:40 -0500 Subject: [PATCH 0253/4235] Consider dired-mode buffers real --- core/autoload/buffers.el | 8 +++++++- modules/ui/doom-dashboard/config.el | 3 +-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index c903849fd..1bbe3cff0 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -1,7 +1,8 @@ ;;; core/autoload/buffers.el -*- lexical-binding: t; -*- ;;;###autoload -(defvar doom-real-buffer-functions '() +(defvar doom-real-buffer-functions + '(doom-dired-buffer-p) "A list of predicate functions run to determine if a buffer is real, unlike `doom-unreal-buffer-functions'. They are passed one argument: the buffer to be tested. @@ -54,6 +55,11 @@ If no project is active, return all buffers." collect buf) buffers))) +;;;###autoload +(defun doom-dired-buffer-p (buf) + "Returns non-nil if BUF is a dired buffer." + (with-current-buffer buf (derived-mode-p 'dired-mode))) + ;;;###autoload (defun doom-special-buffer-p (buf) "Returns non-nil if BUF's name starts and ends with an *." diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index db2ba5756..618f522d8 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -150,8 +150,7 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (if (or (doom-real-buffer-p) - (derived-mode-p 'dired-mode)) + (if (doom-real-buffer-p) (current-buffer) (doom-fallback-buffer))) From 45a490882f1a2a8a0360f24b1386c023a5d5c8a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 20:38:14 -0500 Subject: [PATCH 0254/4235] lang/web: open templates/.+\.php$ in web-mode --- modules/lang/web/+html.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 9b07432f8..49165d98f 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -10,6 +10,7 @@ :mode "\\.tsx$" :mode "\\.vue$" :mode "wp-content/themes/.+/.+\\.php$" + :mode "templates/.+\\.php$" :config (add-hook 'web-mode-hook #'turn-off-smartparens-mode) (set! :company-backend 'web-mode '(company-web-html company-yasnippet)) From 15da107e04035935a28923158243bd0fac484459 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 21:36:42 -0500 Subject: [PATCH 0255/4235] lang/php: basic :lookup support & don't warn about missing phpctags Only adds :documentation support for now. --- modules/lang/php/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 86d6ba3e2..fd036bdc8 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -13,9 +13,12 @@ :config (add-hook! php-mode #'(ac-php-core-eldoc-setup flycheck-mode)) + ;; Disable HTML compatibility in php-mode. `web-mode' has superior support for + ;; php+html. Use the .phtml (setq php-template-compatibility nil) (set! :repl 'php-mode #'php-boris) + (set! :lookup 'php-mode :documentation #'php-search-documentation) ;; ac-php provides custom autocompletion, php-extras provides autocompletion ;; for built-in libraries @@ -82,10 +85,7 @@ (def-package! company-php :when (featurep! :completion company) :commands (company-ac-php-backend ac-php-remake-tags ac-php-remake-tags-all ac-php-core-eldoc-setup) - :config - (unless (executable-find "phpctags") - (warn "php-mode: phpctags isn't installed, auto-completion will be gimped")) - (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) + :config (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) ;; From 3146513442f0d4851a72d920730f4bbece26a0c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 21:38:17 -0500 Subject: [PATCH 0256/4235] ui/doom-modeline: define bar once A little faster (and simpler) than memoizing the xpm generator. --- modules/ui/doom-modeline/config.el | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 7717fc531..22ff91d51 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -4,10 +4,7 @@ :config (defun +doom-modeline-eldoc (text) (concat (when (display-graphic-p) - (+doom-modeline--make-xpm - (face-background 'doom-modeline-eldoc-bar nil t) - +doom-modeline-height - +doom-modeline-bar-width)) + (+doom-modeline--make-xpm 'doom-modeline-eldoc-bar)) text)) ;; Show eldoc in the mode-line with `eval-expression' @@ -176,12 +173,13 @@ active." (eq (selected-window) +doom-modeline-current-window)) ;; Inspired from `powerline's `pl/make-xpm'. -(def-memoized! +doom-modeline--make-xpm (color height width) +(defun +doom-modeline--make-xpm (face &optional height width) "Create an XPM bitmap." (propertize " " 'display - (let ((data (make-list height (make-list width 1))) - (color (or color "None"))) + (let ((data (make-list (or height +doom-modeline-height) + (make-list (or width +doom-modeline-bar-width) 1))) + (color (or (face-background face nil t) "None"))) (create-image (concat (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," @@ -557,17 +555,15 @@ with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." (image-size (image-get-display-property) :pixels) (format " %dx%d " width height))))) +(defvar +doom-modeline--bar-active nil) +(defvar +doom-modeline--bar-inactive nil) (def-modeline-segment! bar "The bar regulates the height of the mode-line in GUI Emacs. Returns \"\" to not break --no-window-system." - (if (display-graphic-p) - (+doom-modeline--make-xpm - (face-background (if (active) - 'doom-modeline-bar - 'doom-modeline-inactive-bar) - nil t) - +doom-modeline-height - +doom-modeline-bar-width) + (if window-system + (if (active) + +doom-modeline--bar-active + +doom-modeline--bar-inactive) "")) @@ -601,6 +597,10 @@ Returns \"\" to not break --no-window-system." ;; (defun +doom-modeline|init () + ;; Create bars + (setq +doom-modeline--bar-active (+doom-modeline--make-xpm 'doom-modeline-bar) + +doom-modeline--bar-inactive (+doom-modeline--make-xpm 'doom-modeline-inactive-bar)) + ;; These buffers are already created and don't get modelines. For the love of ;; Emacs, someone give the man a modeline! (dolist (bname '("*scratch*" "*Messages*")) From 0ae1f51db6544aa6af7eb0dcb04c2f3ac4f55dec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 22:21:37 -0500 Subject: [PATCH 0257/4235] feature/popup: force close in +popup*close advice --- modules/feature/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 714145b63..e186c2be5 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -403,7 +403,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;;;###autoload (defun +popup*close (&rest _) "TODO" - (+popup/close)) + (+popup/close nil t)) ;;;###autoload (defun +popup*save (orig-fn &rest args) From a8ab37e5eb8c3f1f24ef91216cdd036cee9a3267 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 22:24:16 -0500 Subject: [PATCH 0258/4235] completion/ivy: fix void-variable errors In case file search used too early. --- modules/completion/ivy/autoload/evil.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 67b9fb9af..2f04b57c1 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -47,6 +47,7 @@ (file-relative-name directory project-root))))) (default-directory directory)) (setq +ivy--file-last-search query) + (require 'counsel) (pcase engine ('ag (let ((args (concat From 272a34da45db6fc3b27eddfb31d4df4a56d801ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 22:24:45 -0500 Subject: [PATCH 0259/4235] completion/ivy: larger ivy-occur popup #375 --- modules/completion/ivy/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 8eaaa1984..f7fde31a3 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -94,6 +94,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap imenu] #'counsel-imenu [remap recentf-open-files] #'counsel-recentf) :config + (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) + (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") ;; Dim recentf entries that are not in the current project. From 84218386d88111d7447324b7157cd5c9159bc77f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 28 Jan 2018 22:30:33 -0500 Subject: [PATCH 0260/4235] feature/evil: open grep-mode buffers in normal mode #375 --- modules/feature/evil/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 117f586e9..85855eedc 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -55,9 +55,9 @@ (advice-add #'load-theme :after #'+evil*init-cursors) ;; default modes - (dolist (mode '(tabulated-list-mode view-mode comint-mode term-mode calendar-mode Man-mode grep-mode)) + (dolist (mode '(tabulated-list-mode view-mode comint-mode term-mode calendar-mode Man-mode)) (evil-set-initial-state mode 'emacs)) - (dolist (mode '(help-mode debugger-mode)) + (dolist (mode '(help-mode debugger-mode grep-mode)) (evil-set-initial-state mode 'normal)) From 5827186123ecfb51c256b767bfb67488fb0a4ed6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 01:02:24 -0500 Subject: [PATCH 0261/4235] ui/doom-dashboard: +default/find-in-emacsd => doom-project-find-file --- 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 618f522d8..b5c3d7303 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -301,4 +301,4 @@ controlled by `+doom-dashboard-pwd-policy'." (call-interactively (or (command-remapping #'bookmark-jump) #'bookmark-jump))) ("Edit emacs.d" "tools" - (call-interactively #'+default/find-in-emacsd)))))) + (doom-project-find-file doom-emacs-dir)))))) From 8deea285c5423fb05c8cb781e04eebc6cffbbd56 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 01:04:11 -0500 Subject: [PATCH 0262/4235] private/default: fix +default/browse-* commands #381 --- modules/private/default/autoload/default.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/autoload/default.el b/modules/private/default/autoload/default.el index 4381c044b..d51e8ebbd 100644 --- a/modules/private/default/autoload/default.el +++ b/modules/private/default/autoload/default.el @@ -11,7 +11,7 @@ ;;;###autoload (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)) () + `(defun ,(intern (format "+%s/browse-%s" prefix name)) () (interactive) (doom-project-browse ,dir)))) From 3a319494833be7d34d9e7136f1a2713fcba60364 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 16:55:23 -0500 Subject: [PATCH 0263/4235] Refactor doom! to support nested calls #352 Isolates doom! a little more to allow for nested doom! calls. --- core/core-packages.el | 44 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 7c1d9c936..719c2d806 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -54,7 +54,8 @@ this is nil after Emacs has started something is wrong.") (defvar doom-init-time nil "The time it took, in seconds, for DOOM Emacs to initialize.") -(defvar doom-modules () +(defvar doom-modules + (make-hash-table :test #'equal :size 90 :rehash-threshold 1.0) "A hash table of enabled modules. Set by `doom-initialize-modules'.") (defvar doom-packages () @@ -200,7 +201,7 @@ This aggressively reloads core autoload files." (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 (clrhash doom-modules) doom-packages nil) (_load (concat doom-core-dir "core.el") nil 'interactive) (_load (expand-file-name "init.el" doom-emacs-dir)) @@ -214,20 +215,6 @@ This aggressively reloads core autoload files." for path = (doom-module-path module submodule "packages.el") do (_load path 'noerror)))))) -(defun doom-initialize-modules (modules) - "Adds MODULES to `doom-modules'. MODULES must be in mplist format. - - e.g '(:feature evil :lang emacs-lisp javascript java)" - (setq doom-modules (make-hash-table :test #'equal - :size (+ 5 (length modules)) - :rehash-threshold 1.0)) - (let (mode) - (dolist (m modules) - (cond ((keywordp m) (setq mode m)) - ((not mode) (error "No namespace specified on `doom!' for %s" m)) - ((listp m) (doom-module-enable mode (car m) (cdr m))) - (t (doom-module-enable mode m)))))) - (defun doom-module-path (module submodule &optional file) "Get the full path to a module: e.g. :lang emacs-lisp maps to ~/.emacs.d/modules/lang/emacs-lisp/ and will append FILE if non-nil." @@ -305,22 +292,29 @@ include all modules, enabled or otherwise." "Bootstrap DOOM Emacs. MODULES is an malformed plist of modules to load." - (doom-initialize-modules modules) `(let (file-name-handler-alist) + ,@(let (init-forms config-forms mode) + (dolist (m modules) + (cond ((keywordp m) (setq mode m)) + ((not mode) (error "No namespace specified in `doom!' for %s" m)) + (t + (let* ((module mode) + (submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m))) + (path (doom-module-path module submodule))) + (doom-module-enable module submodule flags) + (push `(load! init ,path t) init-forms) + (unless noninteractive + (push `(load! config ,path t) config-forms)))))) + (nconc (nreverse init-forms) + (nreverse config-forms))) (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-post-init-hook #'doom-packages--display-benchmark) - (message "Doom modules initialized")))) + (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark)))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." From 735d129f924b1a044540ff6e9eaa9b5c39f919bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 17:06:20 -0500 Subject: [PATCH 0264/4235] Truly prevent unstyled mode-line flash at startup --- core/core-ui.el | 3 +++ core/core.el | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 03d2c1eda..4ffa7c8dd 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -36,6 +36,9 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") "List of hooks to run when the theme (and font) is initialized (or reloaded with `doom//reload-theme').") +;; Prevents the unstyled mode-line flash at startup +(with-current-buffer (switch-to-buffer "*scratch*") + (setq mode-line-format nil)) (setq-default bidi-display-reordering nil ; disable bidirectional text for tiny performance boost diff --git a/core/core.el b/core/core.el index ce7b07ea4..e91819052 100644 --- a/core/core.el +++ b/core/core.el @@ -116,8 +116,7 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." 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)) + initial-scratch-message nil)) ;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and ;; `window-setup-hook'. From 08908260831c4eaa32633f533ace9bcf95a92845 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 17:09:09 -0500 Subject: [PATCH 0265/4235] window-divider-default-bottom-width = 1 --- 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 4ffa7c8dd..5abe72e63 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -309,7 +309,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; The native border "consumes" a pixel of the fringe on righter-most splits, ;; `window-divider' does not. Available since Emacs 25.1. (setq-default window-divider-default-places t - window-divider-default-bottom-width 0 + window-divider-default-bottom-width 1 window-divider-default-right-width 1) (add-hook 'doom-init-ui-hook #'window-divider-mode) From 4e908bd525be778aaacc3343b784595af2433681 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 17:39:08 -0500 Subject: [PATCH 0266/4235] Minor refactor & correction --- core/autoload/menu.el | 3 +-- core/core-ui.el | 1 - modules/feature/popup/config.el | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/core/autoload/menu.el b/core/autoload/menu.el index 325595187..f6f916f11 100644 --- a/core/autoload/menu.el +++ b/core/autoload/menu.el @@ -30,8 +30,7 @@ PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") (setq header-line-format (concat (propertize "$ " 'face 'font-lock-doc-face) (propertize command 'face 'font-lock-preprocessor-face))) - (doom-resize-window (get-buffer-window (pop-to-buffer (current-buffer))) - 12))) + (pop-to-buffer (current-buffer)))) ((or (symbolp command) (functionp command)) (call-interactively command)) diff --git a/core/core-ui.el b/core/core-ui.el index 5abe72e63..9b2d00144 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -449,7 +449,6 @@ character that looks like a space that `whitespace-mode' won't affect.") (lwarn 'doom-ui :error "Unexpected error while initializing fonts: %s" (error-message-string ex))))) - (run-hooks 'doom-init-theme-hook)) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 8f8d4d917..2790902cc 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -1,4 +1,4 @@ -;;; config.el -*- lexical-binding: t; -*- +;;; feature/popup/config.el -*- lexical-binding: t; -*- (defconst +popup-window-parameters '(transient quit select modeline popup) From a3e39093683657d8acf081bcf2ad51a0f7974c18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 18:06:55 -0500 Subject: [PATCH 0267/4235] Set doom-modules sooner Fixes module lookups within modules (like featurep!). --- core/core-packages.el | 45 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 719c2d806..896b37a25 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -292,29 +292,28 @@ include all modules, enabled or otherwise." "Bootstrap DOOM Emacs. MODULES is an malformed plist of modules to load." - `(let (file-name-handler-alist) - ,@(let (init-forms config-forms mode) - (dolist (m modules) - (cond ((keywordp m) (setq mode m)) - ((not mode) (error "No namespace specified in `doom!' for %s" m)) - (t - (let* ((module mode) - (submodule (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m))) - (path (doom-module-path module submodule))) - (doom-module-enable module submodule flags) - (push `(load! init ,path t) init-forms) - (unless noninteractive - (push `(load! config ,path t) config-forms)))))) - (nconc (nreverse init-forms) - (nreverse config-forms))) - (setq doom-modules ',doom-modules) - (unless noninteractive - (when (display-graphic-p) - (require 'server) - (unless (server-running-p) - (server-start))) - (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark)))) + (let (init-forms config-forms mode) + (dolist (m modules) + (cond ((keywordp m) (setq mode m)) + ((not mode) (error "No namespace specified in `doom!' for %s" m)) + (t + (let* ((module mode) + (submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m))) + (path (doom-module-path module submodule))) + (doom-module-enable module submodule flags) + (push `(load! init ,path t) init-forms) + (unless noninteractive + (push `(load! config ,path t) config-forms)))))) + `(let (file-name-handler-alist) + (setq doom-modules ',doom-modules) + ,@(nconc (nreverse init-forms) (nreverse config-forms)) + (unless noninteractive + (when (display-graphic-p) + (require 'server) + (unless (server-running-p) + (server-start))) + (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." From e87809ab5916614a4b0ae500bd9bceca08fe5bfe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 18:24:59 -0500 Subject: [PATCH 0268/4235] Fix kill-buffer-and-windows unit test --- core/test/autoload-buffers.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index b1c39fc6e..1594426f5 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -14,6 +14,7 @@ (window-min-width 0) persp-mode ,@buffers) + (delete-other-windows) ,@body (let (kill-buffer-query-functions kill-buffer-hook) (mapc #'kill-buffer (buffer-list))))))) From e33e2b9c638e2cc4fd0bd0ea618eb99f0bcdec30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 18:38:40 -0500 Subject: [PATCH 0269/4235] Fix doom-project-* unit tests --- core/test/core-projects.el | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/test/core-projects.el b/core/test/core-projects.el index 3ebf2bc9b..d580b921e 100644 --- a/core/test/core-projects.el +++ b/core/test/core-projects.el @@ -7,19 +7,23 @@ ;; `doom-project-p' (def-test! project-p :minor-mode projectile-mode - (let ((default-directory doom-emacs-dir)) + (let ((buffer-file-name (expand-file-name "init.el" doom-emacs-dir)) + (default-directory doom-emacs-dir)) (should (doom-project-p))) - (let ((default-directory (expand-file-name "~"))) + (let ((buffer-file-name (expand-file-name "test" "~")) + (default-directory (expand-file-name "~"))) (should-not (doom-project-p)))) -;; `doom-project-p' +;; `doom-project-root' (def-test! project-root :minor-mode projectile-mode ;; Should resolve to project root - (let ((default-directory doom-core-dir)) + (let ((buffer-file-name (expand-file-name "core.el" doom-core-dir)) + (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 "~"))) + (let ((buffer-file-name (expand-file-name "test" "~")) + (default-directory (expand-file-name "~"))) (should (equal (doom-project-root) default-directory)))) ;; `doom-project-expand' From e0f6fde7c14ecc877a35d366a7bbfa935fe2b69e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 18:41:55 -0500 Subject: [PATCH 0270/4235] Update doom//run-tests for new doom! --- core/autoload/test.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 5e1dc8bd8..21a71279a 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -12,8 +12,7 @@ If neither is available, run all tests in all enabled modules." (let (targets) ;; ensure DOOM is initialized (let (noninteractive) - (load (expand-file-name "core/core.el" user-emacs-directory) nil t) - (doom-initialize-modules nil)) + (load (expand-file-name "core/core.el" user-emacs-directory) nil t)) ;; collect targets (cond ((and argv (equal (car argv) "--")) (cl-loop for arg in (cdr argv) @@ -37,8 +36,8 @@ If neither is available, run all tests in all enabled modules." (error "Expected a list of cons, got: %s" modules))) (t - (let ((noninteractive t) - doom-modules) + (let (noninteractive) + (clrhash doom-modules) (load (expand-file-name "init.test.el" user-emacs-directory) nil t) (setq modules (doom-module-pairs) targets (list (expand-file-name "test/" doom-core-dir)))))) From bd443322a2f55d459dd1df46d9bc760f05a1b949 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 19:34:06 -0500 Subject: [PATCH 0271/4235] A slightly more efficient unstyled-mode-line fix --- core/core-ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9b2d00144..538947633 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -37,8 +37,8 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") with `doom//reload-theme').") ;; Prevents the unstyled mode-line flash at startup -(with-current-buffer (switch-to-buffer "*scratch*") - (setq mode-line-format nil)) +(set-buffer "*scratch*") +(setq mode-line-format nil) (setq-default bidi-display-reordering nil ; disable bidirectional text for tiny performance boost From e55e7980489bf7149f25255e8fb9996f3282cb7b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 21:22:55 -0500 Subject: [PATCH 0272/4235] Fix doom! not loading modules after byte-compile --- 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 896b37a25..55d9416d8 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -302,13 +302,13 @@ MODULES is an malformed plist of modules to load." (flags (if (listp m) (cdr m))) (path (doom-module-path module submodule))) (doom-module-enable module submodule flags) - (push `(load! init ,path t) init-forms) - (unless noninteractive - (push `(load! config ,path t) config-forms)))))) + (push `(load! init ,path t) init-forms) + (push `(load! config ,path t) config-forms))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) - ,@(nconc (nreverse init-forms) (nreverse config-forms)) + ,@(nreverse init-forms) (unless noninteractive + ,@(nreverse config-forms) (when (display-graphic-p) (require 'server) (unless (server-running-p) From 1fda25ce9a8126f0a073c86a845b62a896e956fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Jan 2018 23:04:27 -0500 Subject: [PATCH 0273/4235] Force make commands to traverse symlinks too --- Makefile | 2 +- core/core-packages.el | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 937fbd275..092236014 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ EMACS_FLAGS=--eval '(setq user-emacs-directory default-directory)' -l core/core. EMACS=emacs --quick --batch $(EMACS_FLAGS) EMACSI=emacs -q $(EMACS_FLAGS) -MODULES=$(patsubst modules/%, %, $(shell find modules/ -maxdepth 2 -type d)) +MODULES=$(patsubst modules/%, %, $(shell find -L modules/ -maxdepth 2 -type d)) all: autoloads autoremove install diff --git a/core/core-packages.el b/core/core-packages.el index 55d9416d8..2444b091b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -496,6 +496,11 @@ loads MODULE SUBMODULE's packages.el file." (while compilation-in-progress (sit-for 1)))) +(defun doom-packages--files (dir pattern) + "Like `directory-files-recursively', but traverses symlinks." + (cl-letf (((symbol-function #'file-symlink-p) #'ignore)) + (directory-files-recursively dir pattern))) + (defun doom//reload-load-path () "Reload `load-path' and recompile files (if necessary). @@ -546,7 +551,7 @@ This should be run whenever init.el or an autoload file is modified. Running (when (file-exists-p auto-file) (push auto-file targets)) (when (file-directory-p auto-dir) - (dolist (file (directory-files-recursively auto-dir "\\.el$")) + (dolist (file (doom-packages--files auto-dir "\\.el$")) (push file targets))))) (when (file-exists-p doom-autoload-file) (delete-file doom-autoload-file) @@ -617,11 +622,11 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (cl-loop for target in (or modules (append (list doom-core-dir) (doom-module-paths))) if (equal target "core") - nconc (nreverse (directory-files-recursively doom-core-dir "\\.el$")) + nconc (nreverse (doom-packages--files doom-core-dir "\\.el$")) else if (file-directory-p target) - nconc (nreverse (directory-files-recursively target "\\.el$")) + nconc (nreverse (doom-packages--files target "\\.el$")) else if (file-directory-p (expand-file-name target doom-modules-dir)) - nconc (nreverse (directory-files-recursively (expand-file-name target doom-modules-dir) "\\.el$")) + nconc (nreverse (doom-packages--files (expand-file-name target doom-modules-dir) "\\.el$")) else if (file-exists-p target) collect target finally do (setq argv nil))) @@ -691,9 +696,10 @@ If RECOMPILE-P is non-nil, only recompile out-of-date core files." "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$"))) + (let ((targets + (append (list (expand-file-name "init.elc" doom-emacs-dir)) + (doom-packages--files doom-core-dir "\\.elc$") + (doom-packages--files doom-modules-dir "\\.elc$"))) (default-directory doom-emacs-dir)) (unless (cl-loop for path in targets if (file-exists-p path) From 01787fc8766b8af6e9cfdd8caeedf26bbd17edf6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 01:10:16 -0500 Subject: [PATCH 0274/4235] Change doom/toggle-line-numbers to cycle styles #376 Also fixes doom/toggle-line-numbers when doom-line-numbers-style is nil. --- core/autoload/ui.el | 41 +++++++++++++++++++++++++++-------------- core/core-ui.el | 23 ++++++++++------------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index e8d3673bc..35e84485a 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -9,21 +9,34 @@ (unless (frame-parameter nil 'fullscreen) 'fullboth))) +(defvar doom--line-number-style doom-line-numbers-style) ;;;###autoload -(defun doom/toggle-line-numbers (&optional arg) - "Toggle `linum-mode'." - (interactive "P") - (cond ((boundp 'display-line-numbers) - (setq display-line-numbers - (pcase arg - ('(4) 'relative) - (1 t) - (-1 nil) - (_ (not display-line-numbers))))) - ((featurep 'nlinum) - (nlinum-mode (or arg (if nlinum-mode -1 +1)))) - (t - (error "No line number plugin detected")))) +(defun doom/toggle-line-numbers () + "Toggle line numbers. + +Cycles through regular, relative and no line numbers. The order depends on what +`doom-line-numbers-style' is set to. + +Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." + (interactive) + (let* ((order (pcase doom-line-numbers-style + (`relative '(relative t nil)) + (`t '(t relative nil)) + (`nil '(nil t relative)))) + (queue (memq doom--line-number-style order)) + (next (if (= (length queue) 1) + (car order) + (car (cdr queue))))) + (setq doom--line-number-style next) + (cond ((boundp 'display-line-numbers) + (setq display-line-numbers next)) + ((featurep 'nlinum) + (pcase next + (`t (nlinum-relative-mode -1) (nlinum-mode +1)) + (`relative (nlinum-relative-mode +1)) + (`nil (nlinum-mode -1)))) + (t + (error "No line number plugin detected"))))) ;;;###autoload (defun doom-resize-window (window new-size &optional horizontal force-p) diff --git a/core/core-ui.el b/core/core-ui.el index 538947633..eda1a12ff 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -319,13 +319,15 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; (defvar doom-line-numbers-style t - "The style to use for the line number display. + "The default styles to use for the line number display. -Accepts the same arguments as `display-line-numbers', which are: +Takes the same argument as `display-line-numbers' in Emacs 26, which are: -nil No line numbers -t Ordinary line numbers -'relative Relative line numbers") + nil No line numbers + t Ordinary line numbers + 'relative Relative line numbers + +Use `doom/toggle-line-numbers' to cycle between these line number styles.") (defun doom|enable-line-numbers (&optional arg) "Enables the display of line numbers, using `display-line-numbers' (in Emacs @@ -333,13 +335,9 @@ t Ordinary line numbers See `doom-line-numbers-style' to control the style of line numbers to display." (cond ((boundp 'display-line-numbers) - (setq display-line-numbers - (pcase arg - (+1 doom-line-numbers-style) - (-1 nil) - (_ doom-line-numbers-style)))) + (setq display-line-numbers (unless (eq arg -1) doom-line-numbers-style))) ((eq doom-line-numbers-style 'relative) - (if (= arg -1) + (if (eq arg -1) (nlinum-relative-off) (nlinum-relative-on))) ((not (null doom-line-numbers-style)) @@ -418,8 +416,7 @@ character that looks like a space that `whitespace-mode' won't affect.") (def-package! nlinum-relative :unless (boundp 'display-line-numbers) :commands nlinum-relative-mode - :config - (after! evil (nlinum-relative-setup-evil))) + :config (after! evil (nlinum-relative-setup-evil))) ;; From 64a674dcc9bb6ab53f90823158d1d31648dece2b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 01:18:18 -0500 Subject: [PATCH 0275/4235] Fix nlinum-relative line numbering #376 Fixed padding; now relative line numbers look consistent with its non-relative counterpart. --- core/autoload/ui.el | 4 ++-- core/core-ui.el | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 35e84485a..26896ec0a 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -32,8 +32,8 @@ Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." (setq display-line-numbers next)) ((featurep 'nlinum) (pcase next - (`t (nlinum-relative-mode -1) (nlinum-mode +1)) - (`relative (nlinum-relative-mode +1)) + (`t (nlinum-relative-off) (nlinum-mode +1)) + (`relative (nlinum-relative-on)) (`nil (nlinum-mode -1)))) (t (error "No line number plugin detected"))))) diff --git a/core/core-ui.el b/core/core-ui.el index eda1a12ff..a69959d21 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -416,7 +416,9 @@ character that looks like a space that `whitespace-mode' won't affect.") (def-package! nlinum-relative :unless (boundp 'display-line-numbers) :commands nlinum-relative-mode - :config (after! evil (nlinum-relative-setup-evil))) + :config + (setq nlinum-format " %d ") + (after! evil (nlinum-relative-setup-evil))) ;; From bcef66b9476ead22a3e48e8688c9b3f68406315a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 03:27:38 -0500 Subject: [PATCH 0276/4235] Refactor doom/toggle-line-numbers; add doom-line-numbers-visual-style #376 doom-line-numbers-visual-style adds support for the visual display-line-numbers mode by setting it to a non-nil value. --- core/autoload/ui.el | 17 ++++++++++++----- core/core-ui.el | 13 ++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 26896ec0a..0d7476e29 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -19,16 +19,17 @@ Cycles through regular, relative and no line numbers. The order depends on what Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." (interactive) - (let* ((order (pcase doom-line-numbers-style - (`relative '(relative t nil)) - (`t '(t relative nil)) - (`nil '(nil t relative)))) + (let* ((styles '(t relative nil)) + (order (cons doom-line-numbers-style (delq doom-line-numbers-style styles))) (queue (memq doom--line-number-style order)) (next (if (= (length queue) 1) (car order) (car (cdr queue))))) (setq doom--line-number-style next) (cond ((boundp 'display-line-numbers) + (when (and (eq next 'relative) + doom-line-numbers-visual-style) + (setq next 'visual)) (setq display-line-numbers next)) ((featurep 'nlinum) (pcase next @@ -36,7 +37,13 @@ Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." (`relative (nlinum-relative-on)) (`nil (nlinum-mode -1)))) (t - (error "No line number plugin detected"))))) + (error "No line number plugin detected"))) + (message "Switched to %s line numbers" + (pcase next + (`t "normal") + (`relative "relative") + (`visual "visual") + (`nil "disabled"))))) ;;;###autoload (defun doom-resize-window (window new-size &optional horizontal force-p) diff --git a/core/core-ui.el b/core/core-ui.el index a69959d21..203d76cb4 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -319,9 +319,8 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; (defvar doom-line-numbers-style t - "The default styles to use for the line number display. - -Takes the same argument as `display-line-numbers' in Emacs 26, which are: + "The default styles to use for the line number display. Accepts one of the +following: nil No line numbers t Ordinary line numbers @@ -329,6 +328,14 @@ Takes the same argument as `display-line-numbers' in Emacs 26, which are: Use `doom/toggle-line-numbers' to cycle between these line number styles.") +(when (boundp 'display-line-numbers) + (defvar doom-line-numbers-visual-style nil + "If non-nil, relative line numbers will be countered by screen line, rather +than buffer line. Setting this to non-nil is the equivalent of using 'visual in +`display-line-numbers'. + +It has no effect on nlinum.")) + (defun doom|enable-line-numbers (&optional arg) "Enables the display of line numbers, using `display-line-numbers' (in Emacs 26+) or `nlinum-mode'. From ba2a6c93ac193295bbceb72896160c9124ad9c10 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 03:51:36 -0500 Subject: [PATCH 0277/4235] private/default: add +ivy/wgrep-occur keybind for swiper #375 --- modules/private/default/+bindings.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 8d8046e80..7cea5eacd 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -319,6 +319,7 @@ :nv "C-a" #'evil-numbers/inc-at-pt :nv "C-x" #'evil-numbers/dec-at-pt + ;; --- Plugin bindings ------------------------------ ;; auto-yasnippet :i [C-tab] #'aya-expand @@ -607,6 +608,11 @@ :m "g]" #'smart-forward :m "g[" #'smart-backward + ;; swiper + (:after swiper + (:map swiper-map + [backtab] #'+ivy/wgrep-occur)) + ;; undo-tree -- undo/redo for visual regions :v "C-u" #'undo-tree-undo :v "C-r" #'undo-tree-redo From f632ec3df10fca9a78dd05f0fa950d1371c48348 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Tue, 30 Jan 2018 13:13:45 +0100 Subject: [PATCH 0278/4235] Add 'counsel-descbinds' to councel defer commands. --- modules/completion/ivy/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index f7fde31a3..218ab0d7e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -79,7 +79,8 @@ immediately runs it on the current candidate (ending the ivy session)." counsel-describe-function counsel-describe-variable counsel-describe-face counsel-M-x counsel-file-jump counsel-find-file counsel-find-library counsel-info-lookup-symbol - counsel-imenu counsel-recentf counsel-yank-pop) + counsel-imenu counsel-recentf counsel-yank-pop + counsel-descbinds) :init (map! [remap apropos] #'counsel-apropos [remap bookmark-jump] #'counsel-bookmark From b88f28dbf8443cbd9161feaab238852188dbbd78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 14:05:39 -0500 Subject: [PATCH 0279/4235] Fix nlinum-relative-* void-function errors #376 --- 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 203d76cb4..f9c185d67 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -422,7 +422,7 @@ character that looks like a space that `whitespace-mode' won't affect.") (def-package! nlinum-relative :unless (boundp 'display-line-numbers) - :commands nlinum-relative-mode + :commands (nlinum-relative-mode nlinum-relative-on nlinum-relative-off) :config (setq nlinum-format " %d ") (after! evil (nlinum-relative-setup-evil))) From 54ca27efa98d43bdb316fd2b44d2753e036e8f8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 14:25:43 -0500 Subject: [PATCH 0280/4235] private/default: set expand-region-contract-fast-key to fix prompt --- modules/private/default/+bindings.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 7cea5eacd..2cd99605b 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -1,5 +1,10 @@ ;;; private/default/+bindings.el -*- lexical-binding: t; -*- +;; expand-region's prompt can't tell what key contract-region is bound to, so we +;; tell it explicitly. +(setq expand-region-contract-fast-key "V") + + ;; This files defines a Spacemacs-esque keybinding scheme (map! [remap evil-jump-to-tag] #'projectile-find-tag From 55cd9817efda8b07b82d2884e833b6eb85e9c7fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 15:59:10 -0500 Subject: [PATCH 0281/4235] Fix C-SPC keybind in terminal not triggering company --- modules/private/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 2cd99605b..4051e5049 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -331,6 +331,7 @@ :nv [C-tab] #'aya-create ;; company-mode (vim-like omnicompletion) + :i "C-@" #'+company/complete :i "C-SPC" #'+company/complete (:prefix "C-x" :i "C-l" #'+company/whole-lines From 834e92c46538305837f962ad3210496f996cb975 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 16:17:46 -0500 Subject: [PATCH 0282/4235] feature/workspaces: fix hash-table-p error on startup in daemon Emacs Because persp-mode initializes differently (and later) in daemon/noninteractive Emacs, +workspaces|init would fail while trying to use persp-mode features in a broken state. --- modules/feature/workspaces/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 8e6e6d04a..7c30f758e 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -25,12 +25,14 @@ renamed.") :defer t :init (defun +workspaces|init () + (add-hook 'after-make-frame-functions #'+workspaces|init-frame) (require 'persp-mode) - (persp-mode +1) - (+workspaces|init-frame (selected-frame)) - (add-hook 'after-make-frame-functions #'+workspaces|init-frame)) + (unless (daemonp) + (+workspaces|init-frame (selected-frame)))) (defun +workspaces|init-frame (frame) + (unless persp-mode + (persp-mode +1)) (unless noninteractive (let (persp-before-switch-functions persp-activated-functions) (with-selected-frame frame From 23f914916e14f42fe2f8369dcf9a623920ee6a51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 21:19:53 -0500 Subject: [PATCH 0283/4235] Refactor theme init across GUI, tty and daemon Emacs --- core/core-ui.el | 69 ++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index f9c185d67..b662aa220 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -434,44 +434,47 @@ character that looks like a space that `whitespace-mode' won't affect.") (defun doom|init-theme (&optional frame) "Set the theme and load the font, in that order." - (when doom-theme - (load-theme doom-theme t)) - (condition-case-unless-debug ex - (when (display-graphic-p) - (when (fontp doom-font) - (set-frame-font doom-font nil (if frame (list frame) t)) - (set-face-attribute 'fixed-pitch frame :font doom-font)) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) - ('error - (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-theme-hook)) + (with-selected-frame (or frame (selected-frame)) + (when doom-theme + (load-theme doom-theme t)) + (condition-case-unless-debug ex + (when (display-graphic-p) + (when (fontp doom-font) + (set-frame-font doom-font nil (if frame (list frame) t)) + (set-face-attribute 'fixed-pitch frame :font doom-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t 'unicode doom-unicode-font frame)) + ;; ...and for variable-pitch-mode: + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + ('error + (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-theme-hook) + (when frame + (remove-hook 'after-make-frame-functions #'doom|init-theme)))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and -;; daemon Emacs is hairy. +;; daemon Emacs is hairy. Running `doom|init-theme' sorts out the initial GUI +;; frame. ;; -;; + Running `doom|init-theme' directly sorts out the initial GUI frame. -;; + Attaching it to `after-make-frame-functions' sorts out daemon Emacs. -;; + Waiting for 0.1s in `doom|reload-ui-in-daemon' fixes daemon Emacs started -;; with `server-start' in an interactive session of Emacs AND in tty Emacs. -(add-hook 'doom-init-ui-hook #'doom|init-theme) - +;; `doom|init-theme-in-frame' sorts out daemon and emacsclient frames by +;; reloading the theme in those frame. However, if you open simultaneous +;; terminal and gui frames with emacsclient, you will get issues! There's always +;; `doom//reload-theme' if you need it. (defun doom|reload-ui-in-daemon (frame) - "Reload the theme (and font) in an daemon frame." + "Reloads the theme in new daemon or tty frames." (when (or (daemonp) (not (display-graphic-p))) - (with-selected-frame frame - (run-with-timer 0.1 nil #'doom|init-ui)))) -(add-hook! 'after-make-frame-functions #'(doom|init-theme doom|reload-ui-in-daemon)) + (doom|init-theme frame))) + +(add-hook 'doom-init-ui-hook #'doom|init-theme) +(add-hook 'after-make-frame-functions #'doom|reload-ui-in-daemon) ;; From 5210ee5f7e00887dcb517ec79be3fac414127422 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 21:21:33 -0500 Subject: [PATCH 0284/4235] feature/version-control: remove -git flag As much as possible, I'd prefer flags to be additive rather than subtractive. Meaning, specifying a flag should add features, rather than disable them; simply as a general Doom convention. --- modules/feature/version-control/+git.el | 1 - modules/feature/version-control/config.el | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 8186dc27f..244047b10 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,5 +1,4 @@ ;;; 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)) diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index b3e72e557..7970ebba1 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -1,7 +1,7 @@ ;;; feature/version-control/config.el -*- lexical-binding: t; -*- -(or (featurep! -git) (load! +git)) -;; TODO (or (featurep! -hg) (load! +hg)) +(load! +git) +;; TODO (load! +hg) ;; (setq vc-make-backup-files nil) From 26d1dd7991344e02b70e151d620a881fa7a64640 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 21:24:18 -0500 Subject: [PATCH 0285/4235] :boom: private/default: add +bindings, +snippets & +evil-commands features #383 This is a breaking change. You'll need to add these three flags to your init.el to restore the defaults. --- init.example.el | 3 +- modules/private/default/config.el | 116 +++++++++++++++--------------- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/init.example.el b/init.example.el index 7fa0476d0..e9b718ea9 100644 --- a/init.example.el +++ b/init.example.el @@ -138,5 +138,6 @@ ;; 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 default) + :private + (default +bindings +snippets +evil-commands)) diff --git a/modules/private/default/config.el b/modules/private/default/config.el index ad2454c00..b6d59293f 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -1,13 +1,15 @@ ;;; private/default/config.el -*- lexical-binding: t; -*- -(load! +bindings) +(if (featurep! +bindings) (load! +bindings)) ;; ;; Plugins ;; -(def-package! emacs-snippets :after yasnippet) +(def-package! emacs-snippets + :if (featurep! +snippets) + :after yasnippet) ;; @@ -22,63 +24,65 @@ (when (featurep 'evil) - (load! +evil-commands) + (when (featurep! +evil-commands) + (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)))) + (when (featurep! +bindings) + ;; 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) + ;; 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 ; + ;; 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)) + (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-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)) - ;; lazy-load `evil-easymotion' - (map! :m "gs" #'+default/easymotion) - (defun +default/easymotion () - (interactive) - (let ((prefix (this-command-keys))) - (evilem-default-keybindings prefix) - (map! :map evilem-map - "n" (evilem-create #'evil-ex-search-next) - "N" (evilem-create #'evil-ex-search-previous) - "s" (evilem-create #'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))) - "S" (evilem-create #'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)))) - (set-transient-map evilem-map) - (which-key-reload-key-sequence prefix)))) + ;; lazy-load `evil-easymotion' + (map! :m "gs" #'+default/easymotion) + (defun +default/easymotion () + (interactive) + (let ((prefix (this-command-keys))) + (evilem-default-keybindings prefix) + (map! :map evilem-map + "n" (evilem-create #'evil-ex-search-next) + "N" (evilem-create #'evil-ex-search-previous) + "s" (evilem-create #'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))) + "S" (evilem-create #'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)))) + (set-transient-map evilem-map) + (which-key-reload-key-sequence prefix))))) From 893bb6b3f754a4b6222a62131c65ac6008a0d455 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 21:25:29 -0500 Subject: [PATCH 0286/4235] Revert unstyled mode-line flash prevention (unreliable) --- core/core-ui.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index b662aa220..269765f83 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -36,10 +36,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") "List of hooks to run when the theme (and font) is initialized (or reloaded with `doom//reload-theme').") -;; Prevents the unstyled mode-line flash at startup -(set-buffer "*scratch*") -(setq mode-line-format nil) - (setq-default bidi-display-reordering nil ; disable bidirectional text for tiny performance boost blink-matching-paren nil ; don't blink--too distracting From 14080a1781fe8b55739a8a34b39f0c5ced82680b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 21:26:02 -0500 Subject: [PATCH 0287/4235] Update core-packages docstrings; rename doom-module-get => doom-module-flags --- core/core-packages.el | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 2444b091b..53e6354bf 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -127,8 +127,8 @@ base by `doom!' and for calculating how many packages exist.") ;; (defun doom-initialize (&optional force-p) - "Initialize installed packages (using package.el) and ensure the core packages -are installed. + "Initialize package.el, create all the essential directories, and ensure core +packages are installed. If you byte-compile core/core.el, this function will be avoided to speed up startup." @@ -162,6 +162,8 @@ startup." (setq doom-init-p t)))) (defun doom-initialize-load-path (&optional force-p) + "Populates `load-path', if it hasn't already been. If FORCE-P is non-nil, do +it anyway." (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 @@ -174,7 +176,7 @@ startup." (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run -`doom/reload-autoloads' to generate it." +`doom//reload-autoloads' to generate it. Used from Doom's Makefile." (unless (file-exists-p doom-autoload-file) (quiet! (doom//reload-autoloads)))) @@ -240,20 +242,23 @@ added, if the file exists." if (file-exists-p path) collect path)) -(defun doom-module-get (module submodule) +(defun doom-module-flags (module submodule) "Returns a list of flags provided for MODULE SUBMODULE." (gethash (cons module submodule) doom-modules)) (defun doom-module-enabled-p (module submodule) - "Returns t if MODULE->SUBMODULE is present in `doom-modules'." + "Returns t if MODULE SUBMODULE is enabled (ie. present in `doom-modules')." (and (hash-table-p doom-modules) - (doom-module-get module submodule) + (doom-module-flags module submodule) t)) (defun doom-module-enable (module submodule &optional flags) "Adds MODULE and SUBMODULE to `doom-modules', overwriting it if it exists. -MODULE is a keyword, SUBMODULE is a symbol. e.g. :lang 'emacs-lisp. +MODULE is a keyword, SUBMODULE is a symbol, FLAGS is a list of arbitrary +symbols: + + (doom-module-enable :lang 'haskell '(+intero)) Used by `require!' and `depends-on!'." (let ((key (cons module submodule))) @@ -264,9 +269,7 @@ Used by `require!' and `depends-on!'." doom-modules))) (defun doom-module-pairs () - "Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells. The list -is sorted by order of insertion unless ALL-P is non-nil. If ALL-P is non-nil, -include all modules, enabled or otherwise." + "Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells." (unless (hash-table-p doom-modules) (error "doom-modules is uninitialized")) (cl-loop for key being the hash-keys of doom-modules @@ -289,7 +292,7 @@ include all modules, enabled or otherwise." (autoload 'use-package "use-package" nil nil 'macro) (defmacro doom! (&rest modules) - "Bootstrap DOOM Emacs. + "Bootstraps DOOM Emacs and its modules. MODULES is an malformed plist of modules to load." (let (init-forms config-forms mode) @@ -406,8 +409,18 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (error-message-string ex)))))))) (defmacro featurep! (module &optional submodule flag) - "A convenience macro wrapper for `doom-module-enabled-p'. It is evaluated at -compile-time/macro-expansion time." + "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if +MODULE SUBMODULE has FLAG enabled. + + (featurep! :private default) + +Module FLAGs are set in your config's `doom!' block, typically in +~/.emacs.d/init.el. Like so: + + :private (default +flag1 -flag2) + +When this macro is used from inside a module, MODULE and SUBMODULE can be +omitted. eg. (featurep! +flag1)" (unless submodule (let* ((path (or load-file-name byte-compile-current-file)) (module-pair (doom-module-from-path path))) @@ -417,7 +430,7 @@ compile-time/macro-expansion time." module (car module-pair) submodule (cdr module-pair)))) (if flag - (and (memq flag (doom-module-get module submodule)) t) + (and (memq flag (doom-module-flags module submodule)) t) (doom-module-enabled-p module submodule))) From 1ab7301a1d28113a92859bd4523d83e86bf78af4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Jan 2018 22:01:19 -0500 Subject: [PATCH 0288/4235] feature/popup: add +popup-enable-*-rules options & delay init Initialization of the popup rules now happens later (on doom-init-ui-hook). The two new options are: + +popup-enable-fallback-rules: the popup module defines two catch-all fallback rules for buffers that match "^ \\*" and "^\\*". By setting this option to nil, you can disable that behavior, in case you want to set them yourself. + +popup-enable-default-rules: setting this to nil disable all default popup rules for various essential Emacs and Doom buffers that should be treated as popups. --- modules/feature/popup/config.el | 54 ++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 2790902cc..14db6c4b9 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -81,6 +81,15 @@ a brief description of some native window parameters that Emacs uses: (select . ignore)) "The default window parameters.") +(defvar +popup-enable-fallback-rules t + "If non-nil, feature/popup will declare fallback rules for any special buffer +that falls through all other rules. A special buffer starts with optional +whitespace and an asterix.") + +(defvar +popup-enable-default-rules t + "If non-nil, feature/popup will declare a set of default rules for various +core Emacs and Doom buffers that should be treated as popups.") + (defvar +popup-ttl 10 "The default time-to-live for transient buffers whose popup buffers have been deleted.") @@ -137,32 +146,41 @@ ALIST supports one custom parameter: `size', which will resolve to (list (cons 'window-parameters parameters))) +popup--display-buffer-alist))) (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)))) + (setq display-buffer-alist +popup--display-buffer-alist)) + nil)) ;; ;; Default popup rules & bootstrap ;; -(eval-when-compile - (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t))) - (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) - (set! :popup "^\\*Compilation" nil '((transient . 0) (quit . t))) - (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) - (set! :popup "^\\*[Hh]elp" - '((slot . 2) (vslot . 2) (size . 0.2)) - '((select . t))) - (set! :popup "^\\*doom \\(?:term\\|eshell\\)" - '((size . 0.25)) - '((quit) (transient . 0))) - (set! :popup "^\\*doom:" - '((size . 0.35) (side . top)) - '((select . t) (modeline . t) (quit) (transient)))) +(defun +popup|init () + (eval-when-compile + (when +popup-enable-fallback-rules + (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) -(setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) -(add-hook 'doom-init-ui-hook #'+popup-mode) + (when +popup-enable-default-rules + (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) + (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" nil '((transient . 0) (quit . t))) + (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) + (set! :popup "^\\*[Hh]elp" + '((slot . 2) (vslot . 2) (size . 0.2)) + '((select . t))) + (set! :popup "^\\*doom \\(?:term\\|eshell\\)" + '((size . 0.25)) + '((quit) (transient . 0))) + (set! :popup "^\\*doom:" + '((size . 0.35) (side . top)) + '((select . t) (modeline . t) (quit) (transient))) + (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) + nil) + (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) + (+popup-mode +1)) + +(add-hook 'doom-init-ui-hook #'+popup|init) (add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes +popup|set-modeline)) From 0bb1635a388f49a0f53908326a68e346d389671f Mon Sep 17 00:00:00 2001 From: Sergey Trofimov Date: Wed, 31 Jan 2018 06:41:51 +0300 Subject: [PATCH 0289/4235] Check if buffer-file-name is nil before passing it as argument. --- core/autoload/help.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index e884c7f0f..d7c50beb4 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -34,8 +34,9 @@ from a `featurep!' or `require!' call or c) the module that the current file is in." (interactive (let ((module - (cond ((string= (file-truename user-init-file) - (file-truename buffer-file-name)) + (cond ((and buffer-file-name + (string= (file-truename user-init-file) + (file-truename buffer-file-name))) (let* ((category (save-excursion (goto-char (line-end-position)) @@ -67,7 +68,8 @@ in." (let ((sexp (sexp-at-point))) (when (memq (car-safe sexp) '(featurep! require!)) (format "%s %s" (nth 1 sexp) (nth 2 sexp)))))) - ((file-in-directory-p buffer-file-name doom-modules-dir) + ((and buffer-file-name + (file-in-directory-p buffer-file-name doom-modules-dir)) (let ((module (doom-module-from-path buffer-file-name))) (format "%s %s" (car module) (cdr module))))))) (list (completing-read "Describe module: " From 81bba9c0bca275e60bc094ac89f0436dee145e2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 01:13:56 -0500 Subject: [PATCH 0290/4235] feature/workspace: fix frames incorrectly initialized via emacsclient A new workspace is now correctly created for files opened via emacsclient. This fixes #119. Again. --- modules/feature/workspaces/autoload/workspaces.el | 8 +++++--- modules/feature/workspaces/config.el | 6 ++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 0d0ba2eee..bc5ffbb67 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -445,11 +445,13 @@ the next." ;; ;;;###autoload -(defun +workspaces|delete-associated-workspace (frame) +(defun +workspaces|delete-associated-workspace (&optional frame) "Delete workspace associated with current frame. A workspace gets associated with a frame when a new frame is interactively created." (when persp-mode + (unless frame + (setq frame (selected-frame))) (let ((frame-persp (frame-parameter frame 'workspace))) (when (string= frame-persp (+workspace-current-name)) (+workspace/delete frame-persp))))) @@ -470,9 +472,9 @@ created." (with-selected-frame frame (if (not (persp-frame-list-without-daemon)) (+workspace-switch +workspaces-main t) - (+workspace/new) + (+workspace-switch (format "#%s" (+workspace--generate-id)) t) (set-frame-parameter frame 'workspace (+workspace-current-name))) - (+workspace/display)))) + (run-at-time 0.1 nil #'+workspace/display)))) (defvar +workspaces--project-dir nil) ;;;###autoload diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 7c30f758e..bcc76829a 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -65,9 +65,6 @@ renamed.") persp-set-last-persp-for-new-frames t persp-switch-to-added-buffer nil persp-remove-buffers-from-nil-persp-behaviour nil - ;; Don't restore winconf on new frames - persp-init-frame-behaviour t - persp-init-new-frame-behaviour-override 'auto-temp ;; Don't auto-load on startup persp-auto-resume-time -1 ;; auto-save on kill @@ -83,7 +80,8 @@ renamed.") (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) ;; per-frame workspaces - (setq persp-init-new-frame-behaviour-override nil + (setq persp-init-frame-behaviour t + persp-init-new-frame-behaviour-override nil persp-interactive-init-frame-behaviour-override #'+workspaces|associate-frame persp-emacsclient-init-frame-behaviour-override #'+workspaces|associate-frame) ;; delete frame associated with workspace, if it exists From dc2b9059337b3fe2b6e7328d9a7c2d90da1a2f74 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 01:26:01 -0500 Subject: [PATCH 0291/4235] feature/workspace: don't pop up warnings/display tabs on every new frame --- modules/feature/workspaces/config.el | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index bcc76829a..02cb7d6ec 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -31,6 +31,10 @@ renamed.") (+workspaces|init-frame (selected-frame)))) (defun +workspaces|init-frame (frame) + "Make sure a main workspace exists and is switched to, if FRAME isn't in any +workspace. Also ensures that the *Warnings* buffer will be visible in main. + +Uses `+workspaces-main' to determine the name of the main workspace." (unless persp-mode (persp-mode +1)) (unless noninteractive @@ -45,16 +49,17 @@ renamed.") ;; Switch to it if we aren't auto-loading the last session (when (and (string= (safe-persp-name (get-current-persp)) persp-nil-name) (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main frame)) - ;; We want to know where we are in every new daemon frame - (when (daemonp) - (run-at-time 0.2 nil #'+workspace/display)) - ;; The warnings buffer gets swallowed by creating `+workspaces-main', so - ;; we display it manually, if it exists (fix #319). - (when-let* ((warnings (get-buffer "*Warnings*"))) - (save-excursion - (display-buffer-in-side-window - warnings '((window-height . shrink-window-if-larger-than-buffer))))))))) + (persp-frame-switch +workspaces-main frame) + ;; We want to know where we are in every new daemon frame + (when (daemonp) + (run-at-time 0.1 nil #'+workspace/display)) + ;; The warnings buffer gets swallowed by creating + ;; `+workspaces-main', so we display it manually, if it exists (fix + ;; #319). + (when-let* ((warnings (get-buffer "*Warnings*"))) + (save-excursion + (display-buffer-in-side-window + warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))) (add-hook 'doom-init-hook #'+workspaces|init) :config From 523c6ae4ccf07070a9728ac21e1dad00cbb8a61b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 02:16:25 -0500 Subject: [PATCH 0292/4235] feature/eval: remove redundant popup rule --- modules/feature/eval/config.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index ce7999af5..3bf95ebf3 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -68,10 +68,7 @@ function that creates and returns the REPL buffer." :config (setq quickrun-focus-p nil) - (set! :popup "^\\*quickrun" - '((size . 0.3)) '((transient . 0))) - (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore))) + (set! :popup "^\\*quickrun" '((size . 0.3)) '((transient . 0))) (defun +eval*quickrun-auto-close (&rest _) "Allows us to silently re-run quickrun from within the quickrun buffer." From 50ce0836969c908334131fc71bce256f05346fa9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 04:23:17 -0500 Subject: [PATCH 0293/4235] ui/doom-modeline: add word-count to selection segment #364 Controlled by the buffer-local variable +doom-modeline-enable-word-count. Use +doom-modeline|enable-word-count to enable it in certain modes. By default, this is enabled in text-mode derived buffers. --- modules/ui/doom-modeline/config.el | 31 +++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 22ff91d51..04d58968b 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -443,6 +443,13 @@ icons." (save-excursion (goto-char pos) (current-column))) +(defvar-local +doom-modeline-enable-word-count nil + "If non-nil, a word count will be added to the selection-info modeline +segment.") + +(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) +(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) + (def-modeline-segment! selection-info "Information about the current selection, such as how many characters and lines are selected, or the NxM dimensions of a block selection." @@ -451,17 +458,19 @@ lines are selected, or the NxM dimensions of a block selection." (reg-end (region-end))) (propertize (let ((lines (count-lines reg-beg (min (1+ reg-end) (point-max))))) - (cond ((or (bound-and-true-p rectangle-mark-mode) - (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column reg-end) - (doom-column reg-beg))))) - (format "%dx%dB" lines cols))) - ((eq 'line evil-visual-selection) - (format "%dL" lines)) - ((> lines 1) - (format "%dC %dL" (- (1+ reg-end) reg-beg) lines)) - (t - (format "%dC" (- (1+ reg-end) reg-beg))))) + (concat (cond ((or (bound-and-true-p rectangle-mark-mode) + (eq 'block evil-visual-selection)) + (let ((cols (abs (- (doom-column reg-end) + (doom-column reg-beg))))) + (format "%dx%dB" lines cols))) + ((eq 'line evil-visual-selection) + (format "%dL" lines)) + ((> lines 1) + (format "%dC %dL" (- (1+ reg-end) reg-beg) lines)) + (t + (format "%dC" (- (1+ reg-end) reg-beg)))) + (when +doom-modeline-enable-word-count + (format " %dW" (count-words reg-beg reg-end))))) 'face 'doom-modeline-highlight)))) From c52cb38385a3423df32187ce36412e8bbb7fae7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 04:24:51 -0500 Subject: [PATCH 0294/4235] ui/doom-modeline: refactor flycheck segment (faster) --- modules/ui/doom-modeline/config.el | 34 +++++++++++++++++------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 04d58968b..7a8cdf86c 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -419,24 +419,28 @@ directory, the file name, and its state (modified, read-only or non-existent)." (propertize text 'face face)) (if vc-mode " " " "))) +(defvar-local +doom-modeline--flycheck nil) +(add-hook 'flycheck-after-syntax-check-hook #'+doom-modeline|update-flycheck-segment) +(defun +doom-modeline|update-flycheck-segment () + (setq +doom-modeline--flycheck + (pcase flycheck-last-status-change + ('finished (if flycheck-current-errors + (let-alist (flycheck-count-errors flycheck-current-errors) + (let ((sum (+ (or .error 0) (or .warning 0)))) + (+doom-ml-icon "do_not_disturb_alt" + (number-to-string sum) + (if .error 'doom-modeline-urgent 'doom-modeline-warning) + -0.25))) + (+doom-ml-icon "check" nil 'doom-modeline-info))) + ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) + ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) + ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) + ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) + (def-modeline-segment! flycheck "Displays color-coded flycheck error status in the current buffer with pretty icons." - (when (boundp 'flycheck-last-status-change) - (pcase flycheck-last-status-change - ('finished (if flycheck-current-errors - (let-alist (flycheck-count-errors flycheck-current-errors) - (let ((sum (+ (or .error 0) (or .warning 0)))) - (+doom-ml-icon "do_not_disturb_alt" - (number-to-string sum) - (if .error 'doom-modeline-urgent 'doom-modeline-warning) - -0.25))) - (+doom-ml-icon "check" nil 'doom-modeline-info))) - ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) - ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) - ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) - ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) - ;; ('interrupted (+doom-ml-icon "x" "Interrupted" 'font-lock-doc-face))))) + +doom-modeline--flycheck) ;; (defsubst doom-column (pos) From c97c460ce29e0960a451614f4272a4c2a8849c82 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 04:54:42 -0500 Subject: [PATCH 0295/4235] feature/workspaces: fix switch-project #388 + Fix recursive find-file-in-project prompt with counsel-projectile. + Fix duplicate-workspace error (just switches to that workspace, rather than trying to create one). + Fix dashboard replacing current buffer when switching to a pre-existing project workspace. --- .../feature/workspaces/autoload/workspaces.el | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index bc5ffbb67..241993512 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -490,30 +490,32 @@ workspace for a new project, before prompting to open a file." (when persp-mode (let ((+workspaces--project-dir project) (inhibit-message t)) - (+workspaces|switch-to-project))) - (counsel-projectile-switch-project-action project) - (+workspace-message - (format "Switched to '%s' in new workspace" new-name) - 'success)) + (+workspaces|switch-to-project)))) ;;;###autoload (defun +workspaces|switch-to-project () - "Creates a workspace dedicated to a new project. Should be hooked to -`projectile-after-switch-project-hook'." + "Creates a workspace dedicated to a new project. If one already exists, switch +to it. Should be hooked to `projectile-after-switch-project-hook'." (when (and persp-mode +workspaces--project-dir) (unwind-protect - (let* ((persp - (let ((default-directory +workspaces--project-dir)) - (+workspace-new (projectile-project-name)))) - (new-name (persp-name persp))) - (+workspace-switch new-name) - (switch-to-buffer (doom-fallback-buffer)) - (call-interactively - (or (command-remapping #'projectile-find-file) - #'projectile-find-file)) - (+workspace-message - (format "Switched to '%s' in new workspace" new-name) - 'success)) + (let (persp-p) + (let* ((persp + (let* ((default-directory +workspaces--project-dir) + projectile-project-name + projectile-require-project-root + projectile-cached-buffer-file-name + projectile-cached-project-root + (project-name (projectile-project-name))) + (or (setq persp-p (+workspace-get project-name t)) + (+workspace-new project-name)))) + (new-name (persp-name persp))) + (+workspace-switch new-name) + (unless persp-p + (switch-to-buffer (doom-fallback-buffer))) + (doom-project-find-file +workspaces--project-dir) + (+workspace-message + (format "Switched to '%s' in new workspace" new-name) + 'success))) (setq +workspaces--project-dir nil)))) From 6b453962d71ca032c571d9ef1f55ca8aab16726d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 05:00:08 -0500 Subject: [PATCH 0296/4235] ui/doom-modeline: silent xpm errors in tty emacs --- modules/ui/doom-modeline/config.el | 39 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 7a8cdf86c..d0aaee6de 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -180,25 +180,26 @@ active." (let ((data (make-list (or height +doom-modeline-height) (make-list (or width +doom-modeline-bar-width) 1))) (color (or (face-background face nil t) "None"))) - (create-image - (concat - (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," - (length (car data)) - (length data) - color - color) - (apply #'concat - (cl-loop with idx = 0 - with len = (length data) - for dl in data - do (cl-incf idx) - collect - (concat "\"" - (cl-loop for d in dl - if (= d 0) collect (string-to-char " ") - else collect (string-to-char ".")) - (if (eq idx len) "\"};" "\",\n"))))) - 'xpm t :ascent 'center)))) + (ignore-errors + (create-image + (concat + (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," + (length (car data)) + (length data) + color + color) + (apply #'concat + (cl-loop with idx = 0 + with len = (length data) + for dl in data + do (cl-incf idx) + collect + (concat "\"" + (cl-loop for d in dl + if (= d 0) collect (string-to-char " ") + else collect (string-to-char ".")) + (if (eq idx len) "\"};" "\",\n"))))) + 'xpm t :ascent 'center))))) (defun +doom-modeline-buffer-file-name () "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." From d01deb5545402b9bec656f6bcbc7260e3810585b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 05:03:28 -0500 Subject: [PATCH 0297/4235] ui/doom-modeline: minor refactor --- modules/ui/doom-modeline/config.el | 53 ++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index d0aaee6de..8738df1a4 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -42,6 +42,10 @@ (add-hook 'doom-escape-hook #'anzu--reset-status t) (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) +;; fish-style modeline +(def-package! shrink-path + :commands (shrink-path-prompt shrink-path-file-mixed)) + ;; Keep `+doom-modeline-current-window' up-to-date (defvar +doom-modeline-current-window (frame-selected-window)) @@ -56,10 +60,6 @@ (advice-add #'handle-switch-frame :after #'+doom-modeline|set-selected-window) (advice-add #'select-window :after #'+doom-modeline|set-selected-window) -;; fish-style modeline -(def-package! shrink-path - :commands (shrink-path-prompt shrink-path-file-mixed)) - ;; ;; Variables @@ -288,7 +288,7 @@ Example: ;; -;; Segments +;; buffer information ;; (def-modeline-segment! buffer-default-directory @@ -304,7 +304,6 @@ buffer where knowing the current project directory is important." (propertize (concat " " (abbreviate-file-name default-directory)) 'face face)))) -;; (def-modeline-segment! buffer-info "Combined information about the current buffer, including the current working directory, the file name, and its state (modified, read-only or non-existent)." @@ -337,7 +336,6 @@ directory, the file name, and its state (modified, read-only or non-existent)." (+doom-modeline-buffer-file-name) "%b"))) -;; (def-modeline-segment! buffer-info-simple "Display only the current buffer's name, but with fontification." (propertize @@ -346,7 +344,6 @@ directory, the file name, and its state (modified, read-only or non-existent)." 'doom-modeline-buffer-modified) ((active) 'doom-modeline-buffer-file)))) -;; (def-modeline-segment! buffer-encoding "Displays the encoding and eol style of the buffer the same way Atom does." (concat (pcase (coding-system-eol-type buffer-file-coding-system) @@ -359,7 +356,11 @@ directory, the file name, and its state (modified, read-only or non-existent)." (t (upcase (symbol-name (plist-get sys :name)))))) " ")) + ;; +;; major-mode +;; + (def-modeline-segment! major-mode "The major mode, including process, environment and text-scale info." (propertize @@ -371,7 +372,11 @@ directory, the file name, and its state (modified, read-only or non-existent)." (format " (%+d)" text-scale-mode-amount))) 'face (if (active) 'doom-modeline-buffer-major-mode))) + ;; +;; vcs +;; + (def-modeline-segment! vcs "Displays the current branch, colored based on its state." (when (and vc-mode buffer-file-name) @@ -407,7 +412,11 @@ directory, the file name, and its state (modified, read-only or non-existent)." 'face (if active face)) " "))))) + ;; +;; flycheck +;; + (defun +doom-ml-icon (icon &optional text face voffset) "Displays an octicon ICON with FACE, followed by TEXT. Uses `all-the-icons-octicon' to fetch the icon." @@ -416,8 +425,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." (concat (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) (if text +doom-modeline-vspc))) - (when text - (propertize text 'face face)) + (if text (propertize text 'face face)) (if vc-mode " " " "))) (defvar-local +doom-modeline--flycheck nil) @@ -443,7 +451,11 @@ directory, the file name, and its state (modified, read-only or non-existent)." icons." +doom-modeline--flycheck) + ;; +;; selection-info +;; + (defsubst doom-column (pos) (save-excursion (goto-char pos) (current-column))) @@ -480,6 +492,9 @@ lines are selected, or the NxM dimensions of a block selection." ;; +;; matches (anzu, evil-substitute, iedit, macro) +;; + (defun +doom-modeline--macro-recording () "Display current Emacs or evil macro being recorded." (when (and (active) (or defining-kbd-macro executing-kbd-macro)) @@ -561,14 +576,24 @@ with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." (or (and (not (equal meta "")) meta) (if buffer-file-name " %I ")))) -;; TODO Include other information + +;; +;; media-info +;; + (def-modeline-segment! media-info "Metadata regarding the current file, such as dimensions for images." + ;; TODO Include other information (cond ((eq major-mode 'image-mode) (cl-destructuring-bind (width . height) (image-size (image-get-display-property) :pixels) (format " %dx%d " width height))))) + +;; +;; bar +;; + (defvar +doom-modeline--bar-active nil) (defvar +doom-modeline--bar-inactive nil) (def-modeline-segment! bar @@ -612,7 +637,7 @@ Returns \"\" to not break --no-window-system." (defun +doom-modeline|init () ;; Create bars - (setq +doom-modeline--bar-active (+doom-modeline--make-xpm 'doom-modeline-bar) + (setq +doom-modeline--bar-active (+doom-modeline--make-xpm 'doom-modeline-bar) +doom-modeline--bar-inactive (+doom-modeline--make-xpm 'doom-modeline-inactive-bar)) ;; These buffers are already created and don't get modelines. For the love of @@ -641,5 +666,5 @@ Returns \"\" to not break --no-window-system." (add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) (add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) -(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) -(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) +(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) +(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) From e16ec5ae94595a186c531c5579a12f9b148b750e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 05:08:25 -0500 Subject: [PATCH 0298/4235] tool/dired: don't kill git process to abruptly This would leave behind index.lock files. This may potentially fix #389. --- modules/tools/dired/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/tools/dired/config.el b/modules/tools/dired/config.el index 452d5c925..4bccd2932 100644 --- a/modules/tools/dired/config.el +++ b/modules/tools/dired/config.el @@ -47,6 +47,14 @@ (add-hook 'dired-initial-position-hook #'dired-k) (add-hook 'dired-after-readin-hook #'dired-k-no-revert) + (defun +dired*interrupt-process (orig-fn &rest args) + "Fixes dired-k killing git processes too abruptly, leaving behind disruptive +.git/index.lock files." + (cl-letf (((symbol-function #'kill-process) + (symbol-function #'interrupt-process))) + (apply orig-fn args))) + (advice-add #'dired-k--start-git-status :around #'+dired*interrupt-process) + (defun +dired*dired-k-highlight (orig-fn &rest args) "Butt out if the requested directory is remote (i.e. through tramp)." (unless (file-remote-p default-directory) From 4dbca5b21fa0e380b70ae83d286ad56416d218b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 05:32:05 -0500 Subject: [PATCH 0299/4235] lang/python: kill anaconda processes after killing last python buffer --- modules/lang/python/config.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 629681e5a..334968423 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -84,7 +84,16 @@ environment variables." :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) - (advice-add #'anaconda-mode-doc-buffer :after #'doom*anaconda-mode-doc-buffer)) + (advice-add #'anaconda-mode-doc-buffer :after #'doom*anaconda-mode-doc-buffer) + + (defun +python|auto-kill-anaconda-processes () + "Kill anaconda processes if this buffer is the last python buffer." + (when (and (eq major-mode 'python-mode) + (not (delq (current-buffer) + (doom-buffers-in-mode 'python-mode (buffer-list))))) + (anaconda-mode-stop))) + (add-hook! 'python-mode-hook + (add-hook 'kill-buffer-hook #'+python|auto-kill-anaconda-processes nil t))) (def-package! company-anaconda From 32754a6d0771f8809a142bad05db5b38f408ae7f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Jan 2018 14:32:52 -0500 Subject: [PATCH 0300/4235] lang/org: fix html export by installing htmlize package --- modules/lang/org/packages.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index d69571211..3bbc89053 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -20,7 +20,8 @@ (package! ob-translate)) (when (featurep! +export) - (package! ox-pandoc)) + (package! ox-pandoc) + (package! htmlize)) (when (featurep! +present) (package! centered-window :recipe (:fetcher github :repo "anler/centered-window-mode")) From 2ab0072d83d7a45596867f571ae643ecf6feb33c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 01:24:19 -0500 Subject: [PATCH 0301/4235] ui/doom-dashboard: fix dashboard not updating pwd on kill-buffer --- modules/ui/doom-dashboard/config.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index b5c3d7303..9109fd1ab 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -161,14 +161,14 @@ project (which may be different across perspective)." (defun +doom-dashboard-update-pwd (&optional pwd) "Update `default-directory' in the Doom dashboard buffer. What it is set to is controlled by `+doom-dashboard-pwd-policy'." - (with-current-buffer (doom-fallback-buffer) - (if pwd - (setq-local default-directory pwd) - (let ((new-pwd (+doom-dashboard--get-pwd))) - (when (and new-pwd (file-directory-p new-pwd)) - (unless (string-suffix-p "/" new-pwd) - (setq new-pwd (concat new-pwd "/"))) - (setq-local default-directory new-pwd)))))) + (if pwd + (with-current-buffer (doom-fallback-buffer) + (setq-local default-directory pwd)) + (let ((new-pwd (+doom-dashboard--get-pwd))) + (when (and new-pwd (file-directory-p new-pwd)) + (unless (string-suffix-p "/" new-pwd) + (setq new-pwd (concat new-pwd "/"))) + (+doom-dashboard-update-pwd new-pwd))))) (defun +doom-dashboard-reload (&optional force) "Update the DOOM scratch buffer (or create it, if it doesn't exist)." From 7e31d1c5affeb61d41e40c214aa3940ea9d01a05 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 01:31:26 -0500 Subject: [PATCH 0302/4235] Add nocache arg to doom-project-* functions --- core/core-projects.el | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index a6d43537d..75b7ff91a 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -50,6 +50,15 @@ ;; Library ;; +(defmacro without-project-cache! (&rest body) + "Run BODY with projectile's project-root cache disabled. This is necessary if +you want to interactive with a project other than the one you're in." + `(let (projectile-project-name + projectile-require-project-root + projectile-cached-buffer-file-name + projectile-cached-project-root) + ,@body)) + (defun doom//reload-project () "Reload the project root cache." (interactive) @@ -58,17 +67,21 @@ (dolist (fn projectile-project-root-files-functions) (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) -(defun doom-project-p () +(defun doom-project-p (&optional nocache) "Whether or not this buffer is currently in a project or not." - (let ((projectile-require-project-root t)) - (projectile-project-p))) + (if nocache + (without-project-cache! (doom-project-p nil)) + (let ((projectile-require-project-root t)) + (projectile-project-p)))) -(defun doom-project-root () +(defun doom-project-root (&optional nocache) "Get the path to the root of your project. If STRICT-P, return nil if no project was found, otherwise return `default-directory'." - (let (projectile-require-project-root) - (projectile-project-root))) + (if nocache + (without-project-cache! (doom-project-root nil)) + (let (projectile-require-project-root) + (projectile-project-root)))) (defalias 'doom-project-expand #'projectile-expand-root) @@ -81,16 +94,12 @@ they are absolute." (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." - (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)))) + (let ((default-directory dir)) + (without-project-cache! + (call-interactively + ;; completion modules may remap this command + (or (command-remapping #'projectile-find-file) + #'projectile-find-file))))) (defun doom-project-browse (dir) "Traverse a file structure starting linearly from DIR." From 7fab94e095eb90326d0e4a555ea9b8262c939852 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 01:31:40 -0500 Subject: [PATCH 0303/4235] tools/neotree: fix neotree not opening in the right pwd --- modules/tools/neotree/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/neotree/autoload.el b/modules/tools/neotree/autoload.el index c24ebe1ff..4495b0480 100644 --- a/modules/tools/neotree/autoload.el +++ b/modules/tools/neotree/autoload.el @@ -5,7 +5,7 @@ "Toggle the neotree window." (interactive) (let ((path buffer-file-name) - (project-root (doom-project-root))) + (project-root (doom-project-root 'nocache))) (require 'neotree) (cond ((and (neo-global--window-exists-p) (get-buffer-window neo-buffer-name t)) From 562d80513687a194593fcadac49abf23a1e7bc93 Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Thu, 1 Feb 2018 14:46:17 +0800 Subject: [PATCH 0304/4235] Sensible alias --- core/core-lib.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-lib.el b/core/core-lib.el index c1e4d6b89..dcf94ba33 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -57,6 +57,8 @@ (declare (doc-string 1)) `(lambda () (interactive) ,@body)) +(defalias 'lambda! 'λ!) + (defmacro after! (feature &rest forms) "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation." From 1e9b49239922b19074201a96b99989849ae14312 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 01:49:13 -0500 Subject: [PATCH 0305/4235] Update license year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 5b1a7fdf5..93b8e4bb1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2017 Henrik Lissner. +Copyright (c) 2016-2018 Henrik Lissner. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From 7c48e7e5cc09c14a9f540b3d25365c41f13606bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 14:43:28 -0500 Subject: [PATCH 0306/4235] Improve visual-line-mode support in doom/backward-to-bol-or-indent #396 --- core/autoload/editor.el | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 5f83b80bc..8b26fbef2 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -17,17 +17,19 @@ ;;;###autoload (defun doom/backward-to-bol-or-indent () - "Move back to the current line's indentation. If already there, move to the -beginning of the line instead. If at bol, do nothing." + "Jump between the indentation column (first non-whitespace character) and the +beginning of the line. The opposite of +`doom/forward-to-last-non-comment-or-eol'." (interactive) - (if (bound-and-true-p visual-line-mode) - (beginning-of-visual-line) - (let ((ci (current-indentation)) - (cc (current-column))) - (cond ((or (> cc ci) (= cc 0)) - (back-to-indentation)) - ((<= cc ci) - (beginning-of-visual-line)))))) + (let ((pos (point)) + (indent (save-excursion + (beginning-of-visual-line) + (skip-chars-forward " \t\r") + (point)))) + (cond ((or (> pos indent) (= pos (line-beginning-position))) + (goto-char indent)) + ((<= pos indent) + (beginning-of-visual-line))))) ;;;###autoload (defun doom/forward-to-last-non-comment-or-eol () From dadfeec506773fde40fb82d3023230c5a0e7fe03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 16:35:55 -0500 Subject: [PATCH 0307/4235] Refactor & fix doom/forward-to-last-non-comment-or-eol --- core/autoload/editor.el | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 8b26fbef2..5289c1216 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -33,30 +33,30 @@ beginning of the line. The opposite of ;;;###autoload (defun doom/forward-to-last-non-comment-or-eol () - "Move forward to the last non-blank character in the line, ignoring comments -and trailing whitespace. If already there, move to the real end of the line. -If already there, do nothing." + "Jumps between the last non-blank, non-comment character in the line and the +true end of the line. The opposite of `doom/backward-to-bol-or-indent'." (interactive) - (let* ((point (point)) - (eol (save-excursion (end-of-visual-line) (point))) - (bol (save-excursion (beginning-of-visual-line) (point))) - (eoc (or (if (not comment-use-syntax) - (when (re-search-forward comment-start-skip eol t) - (or (match-end 1) (match-beginning 0))) - (save-excursion - (goto-char eol) - (while (and (sp-point-in-comment) - (> (point) point)) - (backward-char)) - (when (> (point) point) - (skip-chars-backward " " bol) - (point)))) - eol)) - (goto-char-fn (if (featurep 'evil) #'evil-goto-char #'goto-char))) - (if (= eoc point) - (funcall goto-char-fn eol) - (unless (= eol point) - (funcall goto-char-fn eoc))))) + (let ((eol (save-excursion (end-of-visual-line) (point)))) + (if (and (sp-point-in-comment) (not (= (point) eol))) + (goto-char eol) + (let* ((bol (save-excursion (beginning-of-visual-line) (point))) + (boc (or (save-excursion + (if (not comment-use-syntax) + (progn + (goto-char bol) + (when (re-search-forward comment-start-skip eol t) + (or (match-end 1) (match-beginning 0)))) + (goto-char eol) + (while (and (sp-point-in-comment) + (> (point) bol)) + (backward-char)) + (skip-chars-backward " " bol) + (point))) + eol))) + (cond ((= boc (point)) + (goto-char eol)) + ((/= bol boc) + (goto-char boc))))))) (defun doom--surrounded-p () (and (looking-back "[[{(]\\(\s+\\|\n\\)?\\(\s\\|\t\\)*" (line-beginning-position)) From 0fba37a1a1cc1a53e1712fa81fa324865c2d22a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 16:36:54 -0500 Subject: [PATCH 0308/4235] lang/org: refactor +export; improve central export logic Will use centralized export location only for exports that don't provide an explicit export location. --- modules/lang/org/+export.el | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index dad8588c9..5b3b1637c 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -3,15 +3,14 @@ (add-hook 'org-load-hook #'+org|init-export) ;; I don't have any beef with org's built-in export system, but I do wish it -;; would export to a central directory, rather than `default-directory'. This is -;; because all my org files are usually in one place, and I want to be able to -;; refer back to old exports if needed. +;; would export to a central directory (by default), rather than +;; `default-directory'. This is because all my org files are usually in one +;; place, and I want to be able to refer back to old exports if needed. (def-package! ox-pandoc :defer t :config - (when (executable-find "pandoc") - (push 'pandoc org-export-backends)) + (push 'pandoc org-export-backends) (setq org-pandoc-options '((standalone . t) (mathjax . t) @@ -19,20 +18,23 @@ ;; (defun +org|init-export () - (add-transient-hook! #'org-export-dispatch (require 'ox-pandoc)) + (setq org-export-backends '(ascii html latex md) + org-publish-timestamp-directory (concat doom-cache-dir "/org-timestamps/")) - (setq org-export-directory (expand-file-name ".export" +org-dir) - org-export-backends '(ascii html latex md) - org-export-with-toc t - org-export-with-author t) + (when (executable-find "pandoc") + (require 'ox-pandoc)) - ;; Always export to a central location + ;; Export to a central location by default or if target isn't in `+org-dir'. + (setq org-export-directory (expand-file-name ".export" +org-dir)) (unless (file-directory-p org-export-directory) (make-directory org-export-directory t)) + (defun +org*export-output-file-name (args) - "Return a centralized export location." - (unless (nth 2 args) + "Return a centralized export location unless one is provided or the current +file isn't in `+org-dir'." + (when (and (not (nth 2 args)) + buffer-file-name + (file-in-directory-p (file-truename buffer-file-name) (file-truename +org-dir))) (setq args (append args (list org-export-directory)))) args) - (advice-add #'org-export-output-file-name - :filter-args #'+org*export-output-file-name)) + (advice-add #'org-export-output-file-name :filter-args #'+org*export-output-file-name)) From 08b2cc8ea3cf22698ca84299b13a52fcd7747061 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 16:38:19 -0500 Subject: [PATCH 0309/4235] completion/company: add +auto flag (for as-you-type completion) --- modules/completion/company/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 2e2a44410..1b5609fd5 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -37,9 +37,12 @@ MODES should be one major-mode symbol or a list of them." company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) company-backends '(company-capf company-dabbrev company-ispell company-yasnippet) company-transformers '(company-sort-by-occurrence)) - (global-company-mode +1)) +(when (featurep! +auto) + (require 'company) + (setq company-idle-delay 0.2)) + (def-package! company-statistics :after company From c9e8be1f60165e6fdd608b0f33c497a06b3673d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 17:42:39 -0500 Subject: [PATCH 0310/4235] Improve doom/toggle-fullscreen #397 --- core/autoload/ui.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 0d7476e29..080ce05fd 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -2,12 +2,19 @@ ;;;###autoload (defun doom/toggle-fullscreen () - "Toggle fullscreen Emacs (non-native on MacOS)." + "Toggle fullscreen for the current frame using non-native fullscreen. If you +prefer native fullscreen, use `toggle-frame-fullscreen' instead." (interactive) - (set-frame-parameter - nil 'fullscreen - (unless (frame-parameter nil 'fullscreen) - 'fullboth))) + (modify-frame-parameters + nil + `((maximized + . ,(unless (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth)) + (frame-parameter nil 'fullscreen))) + (fullscreen + . ,(if (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth)) + (when (eq (frame-parameter nil 'maximized) 'maximized) + 'maximized) + 'fullboth))))) (defvar doom--line-number-style doom-line-numbers-style) ;;;###autoload From 2989296521a4e9f80c7a0574da84bcd9481f71d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:01:49 -0500 Subject: [PATCH 0311/4235] Use frame's buffer-predicate instead of doom/{next,previous}-buffer doom/{next,previous}-buffer was implemented so that these commands could skip over unreal buffers, and land us on either a real one or the dashboard. Using the frame's buffer-predicate parameter accomplishes exactly this, natively. --- core/autoload/buffers.el | 21 +++++++------------ core/core-ui.el | 5 +++-- .../feature/workspaces/autoload/workspaces.el | 6 ++++++ modules/feature/workspaces/config.el | 9 ++++---- modules/private/default/+bindings.el | 12 +++++------ 5 files changed, 27 insertions(+), 26 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 1bbe3cff0..0d74fee1b 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -34,6 +34,13 @@ it if it doesn't exist).") ;; Functions ;; +;;;###autoload +(defun doom-buffer-frame-predicate (buf) + "To be used as the default frame buffer-predicate parameter. Returns nil if +BUF should be skipped over by functions like `next-buffer' and `other-buffer'." + (or (doom-real-buffer-p buf) + (eq buf (doom-fallback-buffer)))) + ;;;###autoload (defun doom-fallback-buffer () "Returns the fallback buffer, creating it if necessary. By default this is the @@ -279,17 +286,3 @@ processes killed." (delete-process p) (cl-incf n)))) n)) - -;;;###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)) diff --git a/core/core-ui.el b/core/core-ui.el index 269765f83..3d08dcdea 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -481,6 +481,8 @@ character that looks like a space that `whitespace-mode' won't affect.") (global-eldoc-mode -1) ;; simple name in frame title (setq-default frame-title-format '("DOOM Emacs")) +;; make `next-buffer', `other-buffer', etc. ignore unreal buffers +(push '(buffer-predicate . doom-buffer-frame-predicate) default-frame-alist) ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only (menu-bar-mode -1) @@ -538,9 +540,8 @@ instead)." (let ((buf (current-buffer))) (cond ((window-dedicated-p) (delete-window)) - ((eq buf (doom-fallback-buffer)) - (doom--cycle-real-buffers -1)) ((doom-real-buffer-p buf) + (previous-buffer) (doom--cycle-real-buffers (if (delq buf (doom-real-buffer-list)) -1)) (kill-buffer buf)) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 241993512..8e463ef53 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -48,6 +48,12 @@ "Return non-nil if buffer is in workspace (defaults to current workspace)." (persp-contain-buffer-p buffer (or workspace (+workspace-current)) nil)) +;;;###autoload +(defun +workspace-alien-buffer-p (buffer) + "Return non-nil if BUFFER isn't a member of the current workspace." + (and (get-buffer-window buffer) + (not (+workspace-contains-buffer-p buffer)))) + ;; --- Getters ---------------------------- diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 02cb7d6ec..a1c3c9023 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -70,10 +70,9 @@ Uses `+workspaces-main' to determine the name of the main workspace." persp-set-last-persp-for-new-frames t persp-switch-to-added-buffer nil persp-remove-buffers-from-nil-persp-behaviour nil - ;; Don't auto-load on startup - persp-auto-resume-time -1 - ;; auto-save on kill - persp-auto-save-opt (if noninteractive 0 1)) + persp-set-frame-buffer-predicate #'doom-buffer-frame-predicate + persp-auto-resume-time -1 ; Don't auto-load on startup + persp-auto-save-opt (if noninteractive 0 1)) ; auto-save on kill (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) ;; Modify `delete-window' to close the workspace if used on the last window @@ -100,6 +99,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; (defun +workspaces|init-persp-mode () (cond (persp-mode + (add-hook 'doom-unreal-buffer-functions #'+workspace-alien-buffer-p) ;; Ensure `persp-kill-buffer-query-function' is last in ;; kill-buffer-query-functions (remove-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function) @@ -111,6 +111,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) (t + (remove-hook 'doom-unreal-buffer-functions #'+workspace-alien-buffer-p) (advice-remove #'switch-to-buffer #'+workspaces*auto-add-buffer) (advice-remove #'display-buffer #'+workspaces*auto-add-buffer) (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 4051e5049..b8a894889 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -94,7 +94,7 @@ (:desc "previous..." :prefix "[" :desc "Text size" :nv "[" #'text-scale-decrease - :desc "Buffer" :nv "b" #'doom/previous-buffer + :desc "Buffer" :nv "b" #'previous-buffer :desc "Diff Hunk" :nv "d" #'git-gutter:previous-hunk :desc "Todo" :nv "t" #'hl-todo-previous :desc "Error" :nv "e" #'previous-error @@ -105,7 +105,7 @@ (:desc "next..." :prefix "]" :desc "Text size" :nv "]" #'text-scale-increase - :desc "Buffer" :nv "b" #'doom/next-buffer + :desc "Buffer" :nv "b" #'next-buffer :desc "Diff Hunk" :nv "d" #'git-gutter:next-hunk :desc "Todo" :nv "t" #'hl-todo-next :desc "Error" :nv "e" #'next-error @@ -154,8 +154,8 @@ :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 "Next buffer" :n "]" #'next-buffer + :desc "Previous buffer" :n "[" #'previous-buffer :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) (:desc "code" :prefix "c" @@ -298,8 +298,8 @@ ;; --- Personal vim-esque bindings ------------------ :n "zx" #'kill-this-buffer :n "ZX" #'bury-buffer - :n "]b" #'doom/next-buffer - :n "[b" #'doom/previous-buffer + :n "]b" #'next-buffer + :n "[b" #'previous-buffer :n "]w" #'+workspace/switch-right :n "[w" #'+workspace/switch-left :m "gt" #'+workspace/switch-right From 4567054aed5878aa87e06335000e71fc840bd026 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:45:20 -0500 Subject: [PATCH 0312/4235] ui/doom-dashboard: no emacs-state in dashboard --- modules/ui/doom-dashboard/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 9109fd1ab..a1f44180b 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -58,8 +58,6 @@ Possible values: (format "DOOM v%s" doom-version) "Major mode for the DOOM dashboard buffer." (read-only-mode +1) - (when (featurep 'evil) - (evil-emacs-state)) (setq truncate-lines t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) @@ -72,6 +70,11 @@ Possible values: "p" #'+doom-dashboard/previous-button "N" #'+doom-dashboard/last-button "P" #'+doom-dashboard/first-button + [remap evil-insert] #'ignore + [remap evil-replace] #'ignore + [remap evil-change] #'ignore + [remap evil-visual-char] #'ignore + [remap evil-visual-line] #'ignore (:when (featurep! :feature evil) :em "j" #'+doom-dashboard/next-button :em "k" #'+doom-dashboard/previous-button From 805f7e71751c2711572ec481426353e1a85e300c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:46:07 -0500 Subject: [PATCH 0313/4235] core-os: x-underline-at-descent-line = t --- core/core-os.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 08f356fb9..9b41c437e 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -49,9 +49,8 @@ (osx-clipboard-mode +1))))) (IS-LINUX - ;; native tooltips are ugly! - (setq x-gtk-use-system-tooltips nil) - )) + (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! + x-underline-at-descent-line t))) ; draw underline lower (provide 'core-os) ;;; core-os.el ends here From 005402efc0f8009671068076cd67ea9927c8716e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:49:37 -0500 Subject: [PATCH 0314/4235] Remove prompt if file is opened in other emacsclients --- core/core-ui.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index 3d08dcdea..a5ff2c765 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -309,6 +309,11 @@ DEFAULT is non-nil, set the default mode-line for all buffers." window-divider-default-right-width 1) (add-hook 'doom-init-ui-hook #'window-divider-mode) +;; remove prompt if the file is opened in other clients +(defun server-remove-kill-buffer-hook () + (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)) +(add-hook 'server-visit-hook 'server-remove-kill-buffer-hook) + ;; ;; Line numbers From 324a6440029ca939653f717d4dbbf0b116086d04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:50:35 -0500 Subject: [PATCH 0315/4235] Refactor; compilation-scroll-output=first-error; ffap-machine-p-known=reject --- core/core.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index e91819052..e5b5ce7ad 100644 --- a/core/core.el +++ b/core/core.el @@ -78,10 +78,11 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." apropos-do-all t ; make `apropos' more useful compilation-always-kill t ; kill compilation process before starting another compilation-ask-about-save nil ; save all buffers on `compile' - compilation-scroll-output t + compilation-scroll-output 'first-error confirm-nonexistent-file-or-buffer t - enable-recursive-minibuffers nil debug-on-error (and (not noninteractive) doom-debug-mode) + enable-recursive-minibuffers nil + ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often load-prefer-newer (or noninteractive doom-debug-mode) ;; keep the point out of the minibuffer @@ -90,7 +91,7 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." auto-save-default nil create-lockfiles nil history-length 500 - make-backup-files nil + make-backup-files nil ; don't create backup~ files ;; files abbrev-file-name (concat doom-local-dir "abbrev.el") auto-save-list-file-name (concat doom-cache-dir "autosave") From de1a955cd92c5cb05b02e72d66739e51a08226d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:55:29 -0500 Subject: [PATCH 0316/4235] private/default: remove C-a/C-e bind fixes in org-mode No longer necessary after dadfeec5 and 7c48e7e5. --- modules/private/default/+bindings.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index b8a894889..0f179b7d1 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -719,9 +719,7 @@ (: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)) + :i [remap doom/inflate-space-maybe] #'org-self-insert-command)) ;; Restore common editing keys (and ESC) in minibuffer (:map (minibuffer-local-map From b0a2e97baa2f42530d50380b682bee468d60eb55 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:56:33 -0500 Subject: [PATCH 0317/4235] private/default: fix C-a in evil-ex --- modules/private/default/+bindings.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 0f179b7d1..7714cadfe 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -737,6 +737,10 @@ "C-f" #'forward-word "M-z" #'doom/minibuffer-undo) + (:after evil + (:map evil-ex-completion-map + "C-a" #'move-beginning-of-line)) + (:map messages-buffer-mode-map "M-;" #'eval-expression "A-;" #'eval-expression) From 03a03853e42eeb05be5cbaeb631bc69c62694aed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 19:57:46 -0500 Subject: [PATCH 0318/4235] core-editor: reset expand-region on doom/escape #317 --- core/core-editor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 8df5381a2..7dc12a3ef 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -213,7 +213,8 @@ extension, try to guess one." (defun doom*quit-expand-region () (when (memq last-command '(er/expand-region er/contract-region)) (er/contract-region 0))) - (advice-add #'evil-escape :before #'doom*quit-expand-region)) + (advice-add #'evil-escape :before #'doom*quit-expand-region) + (advice-add #'doom/escape :before #'doom*quit-expand-region)) (def-package! helpful :commands (helpful-callable helpful-function helpful-macro helpful-command From 7b2bbb973af86e62e21d65ea765452d42e813cb9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 20:04:54 -0500 Subject: [PATCH 0319/4235] Improve real-buffer function docstrings --- core/autoload/buffers.el | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 0d74fee1b..f18169674 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -8,7 +8,9 @@ tested. Should any of its function returns non-nil, the rest of the functions are -ignored and the buffer is considered real.") +ignored and the buffer is considered real. + +See `doom-real-buffer-p' for more information.") ;;;###autoload (defvar doom-unreal-buffer-functions @@ -18,11 +20,14 @@ unlike `doom-real-buffer-functions'. They are passed one argument: the buffer to be tested. Should any of these functions return non-nil, the rest of the functions are -ignored and the buffer is considered unreal.") +ignored and the buffer is considered unreal. + +See `doom-real-buffer-p' for more information.") ;;;###autoload (defvar-local doom-real-buffer-p nil - "If non-nil, this buffer should be considered real no matter what.") + "If non-nil, this buffer should be considered real no matter what. See +`doom-real-buffer-p' for more information.") ;;;###autoload (defvar doom-fallback-buffer "*scratch*" @@ -84,8 +89,14 @@ If no project is active, return all buffers." ;;;###autoload (defun doom-real-buffer-p (&optional buffer-or-name) - "Returns t if BUFFER-OR-NAME is a 'real' buffer. The criteria for a real -buffer is: + "Returns t if BUFFER-OR-NAME is a 'real' buffer. + +A real buffer is a useful buffer; a first class citizen in Doom. Real ones +should get special treatment, because we will be spending most of our time in +them. Unreal ones should be low-profile and easy to cast aside, so we can focus +on real ones. + +The exact criteria for a real buffer is: 1. A non-nil value for the buffer-local value of the `doom-real-buffer-p' variable OR From ca262f5e4e8c0b6cab8507b25dc10af829cad837 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 20:06:00 -0500 Subject: [PATCH 0320/4235] Rename doom-fallback-buffer (variable) => doom-fallback-buffer-name --- core/autoload/buffers.el | 6 +++--- core/test/autoload-buffers.el | 2 +- modules/ui/doom-dashboard/config.el | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index f18169674..ea9f472f4 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -30,7 +30,7 @@ See `doom-real-buffer-p' for more information.") `doom-real-buffer-p' for more information.") ;;;###autoload -(defvar doom-fallback-buffer "*scratch*" +(defvar doom-fallback-buffer-name "*scratch*" "The name of the buffer to fall back to if no other buffers exist (will create it if it doesn't exist).") @@ -49,8 +49,8 @@ BUF should be skipped over by functions like `next-buffer' and `other-buffer'." ;;;###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)) +scratch buffer. See `doom-fallback-buffer-name' to change this." + (get-buffer-create doom-fallback-buffer-name)) ;;;###autoload (defalias 'doom-buffer-list #'buffer-list) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index 1594426f5..389231195 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -107,7 +107,7 @@ (def-test! fallback-buffer (let ((fallback (doom-fallback-buffer))) (should (buffer-live-p fallback)) - (should (equal (buffer-name fallback) doom-fallback-buffer)))) + (should (equal (buffer-name fallback) doom-fallback-buffer-name)))) ;; `doom--cycle-real-buffers' (def-test! kill-buffer-then-show-real-buffer diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a1f44180b..190da6f5f 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -44,7 +44,7 @@ Possible values: ;; Bootstrap ;; -(setq doom-fallback-buffer +doom-dashboard-name +(setq doom-fallback-buffer-name +doom-dashboard-name initial-buffer-choice #'+doom-dashboard-initial-buffer) (add-hook 'window-setup-hook #'+doom-dashboard|init) From 5b817727e24990f589e8b21f8aa5dc5f3e8a57f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 20:14:22 -0500 Subject: [PATCH 0321/4235] Use more informative frame title --- 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 a5ff2c765..c382166cf 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -485,7 +485,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; auto-enabled in Emacs 25+; I'll do it myself (global-eldoc-mode -1) ;; simple name in frame title -(setq-default frame-title-format '("DOOM Emacs")) +(setq frame-title-format '((:eval (abbreviate-file-name buffer-file-name)) " – " "Doom Emacs")) ;; make `next-buffer', `other-buffer', etc. ignore unreal buffers (push '(buffer-predicate . doom-buffer-frame-predicate) default-frame-alist) ;; draw me like one of your French editors From 5b19ad50a6f719e65f3f17cccb7c7bff8593a6cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 20:42:16 -0500 Subject: [PATCH 0322/4235] frame-title-format: just use filename A blank buffer-file-name causes an error. Rather than overcomplicate this, I'll just use %b. --- 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 c382166cf..906f3ddf0 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -485,7 +485,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; auto-enabled in Emacs 25+; I'll do it myself (global-eldoc-mode -1) ;; simple name in frame title -(setq frame-title-format '((:eval (abbreviate-file-name buffer-file-name)) " – " "Doom Emacs")) +(setq frame-title-format '("%b – Doom Emacs")) ;; make `next-buffer', `other-buffer', etc. ignore unreal buffers (push '(buffer-predicate . doom-buffer-frame-predicate) default-frame-alist) ;; draw me like one of your French editors From e0fd1b9043824eb47f39a9bae44ca52c38f57c23 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 23:17:18 -0500 Subject: [PATCH 0323/4235] feature/popup: replace +popup-enable-*-rules w/ +all/+defaults flags #394 --- init.example.el | 4 ++- modules/feature/popup/config.el | 55 +++++++++++++-------------------- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/init.example.el b/init.example.el index e9b718ea9..365ad6cc5 100644 --- a/init.example.el +++ b/init.example.el @@ -30,7 +30,9 @@ (require 'core (concat user-emacs-directory "core/core")) (doom! :feature - popup ; tame sudden yet inevitable temporary windows + (popup ; tame sudden yet inevitable temporary windows + +all ; catch all popups that start with an asterix + +defaults) ; default popup rules ;debugger ; FIXME stepping through code, to help you add bugs eval ; run code, run (also, repls) evil ; come to the dark side, we have cookies diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 14db6c4b9..1bce43413 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -81,15 +81,6 @@ a brief description of some native window parameters that Emacs uses: (select . ignore)) "The default window parameters.") -(defvar +popup-enable-fallback-rules t - "If non-nil, feature/popup will declare fallback rules for any special buffer -that falls through all other rules. A special buffer starts with optional -whitespace and an asterix.") - -(defvar +popup-enable-default-rules t - "If non-nil, feature/popup will declare a set of default rules for various -core Emacs and Doom buffers that should be treated as popups.") - (defvar +popup-ttl 10 "The default time-to-live for transient buffers whose popup buffers have been deleted.") @@ -154,33 +145,31 @@ ALIST supports one custom parameter: `size', which will resolve to ;; Default popup rules & bootstrap ;; -(defun +popup|init () - (eval-when-compile - (when +popup-enable-fallback-rules - (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) +(eval-when-compile + (when (featurep! +all) + (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) - (when +popup-enable-default-rules - (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) - (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" nil '((transient . 0) (quit . t))) - (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) - (set! :popup "^\\*[Hh]elp" - '((slot . 2) (vslot . 2) (size . 0.2)) - '((select . t))) - (set! :popup "^\\*doom \\(?:term\\|eshell\\)" - '((size . 0.25)) - '((quit) (transient . 0))) - (set! :popup "^\\*doom:" - '((size . 0.35) (side . top)) - '((select . t) (modeline . t) (quit) (transient))) - (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) - nil) + (when (featurep! +defaults) + (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) + (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" nil '((transient . 0) (quit . t))) + (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) + (set! :popup "^\\*[Hh]elp" + '((slot . 2) (vslot . 2) (size . 0.2)) + '((select . t))) + (set! :popup "^\\*doom \\(?:term\\|eshell\\)" + '((size . 0.25)) + '((quit) (transient . 0))) + (set! :popup "^\\*doom:" + '((size . 0.35) (side . bottom)) + '((select . t) (modeline . t) (quit) (transient))) + (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) + nil) - (setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) - (+popup-mode +1)) +(setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) -(add-hook 'doom-init-ui-hook #'+popup|init) +(add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes +popup|set-modeline)) From 53b7297c6d1fd48106424f3fef4952a9e9f4816c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Feb 2018 23:38:32 -0500 Subject: [PATCH 0324/4235] lang/org: fix M-RET not adjusting number bullets #390 --- modules/lang/org/autoload/org.el | 45 +++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index eb351f8cc..f2439599f 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -174,26 +174,41 @@ I use this instead of `org-insert-item' or `org-insert-heading' which are too opinionated and perform this simple task incorrectly (e.g. whitespace in the wrong places)." (interactive) - (let* ((context (org-element-lineage - (org-element-context) - '(table table-row headline inlinetask item plain-list) - t)) + (let* ((context + (save-excursion + (when (bolp) + (back-to-indentation) + (forward-char)) + (org-element-lineage + (org-element-context) + '(table table-row headline inlinetask item plain-list) + t))) (type (org-element-type context))) (cond ((memq type '(item plain-list)) (let ((marker (org-element-property :bullet context)) (pad (save-excursion (back-to-indentation) - (- (point) (line-beginning-position))))) - (pcase direction - ('below - (org-end-of-item) - (goto-char (line-beginning-position)) - (insert (make-string pad 32) (or marker "")) - (save-excursion (insert "\n"))) - ('above - (goto-char (line-beginning-position)) - (insert (make-string pad 32) (or marker "")) - (save-excursion (insert "\n"))))) + (- (point) (line-beginning-position)))) + afterp) + (save-match-data + (pcase direction + ('below + (org-end-of-item) + (backward-char) + (org-end-of-line) + (if (and marker (string-match "\\([0-9]+\\)\\([).] *\\)" marker)) + (let ((l (line-number-at-pos))) + (org-insert-item) + (when (= l (line-number-at-pos)) + (org-next-item) + (org-end-of-line))) + (insert "\n" (make-string pad 32) (or marker "")))) + ('above + (goto-char (line-beginning-position)) + (if (and marker (string-match-p "[0-9]+[).]" marker)) + (org-insert-item) + (insert (make-string pad 32) (or marker "")) + (save-excursion (insert "\n"))))))) (when (org-element-property :checkbox context) (insert "[ ] "))) From 97d0ff09660bee16995650b42216188bffdf5483 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 00:22:30 -0500 Subject: [PATCH 0325/4235] lang/org: fix cursor placement after M-RET in tables --- modules/lang/org/autoload/org.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index f2439599f..d7c633b58 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -214,8 +214,10 @@ wrong places)." ((memq type '(table table-row)) (pcase direction - ('below (org-table-insert-row t)) - ('above (org-shiftmetadown)))) + ('below (save-excursion (org-table-insert-row t)) + (org-table-next-row)) + ('above (save-excursion (org-shiftmetadown)) + (+org/table-previous-row)))) ((memq type '(headline inlinetask)) (let ((level (if (eq (org-element-type context) 'headline) @@ -244,7 +246,7 @@ wrong places)." (t (user-error "Not a valid list, heading or table"))) (when (bound-and-true-p evil-mode) - (evil-append-line 1)))) + (evil-insert 1)))) ;;;###autoload (defun +org-get-property (name &optional _file) ; TODO Add FILE From 5cb75da7e0617e1543c4572e710fb7197e15b620 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 02:34:46 -0500 Subject: [PATCH 0326/4235] lang/org: fix +org/insert-item single-line buffer edge-case --- modules/lang/org/autoload/org.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index d7c633b58..c876dd62c 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -195,7 +195,7 @@ wrong places)." ('below (org-end-of-item) (backward-char) - (org-end-of-line) + (end-of-line) (if (and marker (string-match "\\([0-9]+\\)\\([).] *\\)" marker)) (let ((l (line-number-at-pos))) (org-insert-item) From ec7f20589a8ed6378ff3fc73cabad397cebe6043 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 03:00:57 -0500 Subject: [PATCH 0327/4235] lang/go: don't popup gofmt errors (use flycheck instead) --- modules/lang/go/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index a04c1b870..e5761f16d 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -6,7 +6,8 @@ :config (add-hook 'go-mode-hook #'flycheck-mode) - (setq gofmt-command "goimports") + (setq gofmt-command "goimports" + gofmt-show-errors nil) (if (not (executable-find "goimports")) (warn "go-mode: couldn't find goimports; no code formatting/fixed imports on save") (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t))) From d1953e00c431c12af9e5c39f2ddb838f3ed73546 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 04:23:54 -0500 Subject: [PATCH 0328/4235] Remove doom--cycle-real-buffers; refactor kill-this-buffer advice cycle-real-buffers was a tidbit of complexity that was never necessary in the first place. This functionality was already available in the form of the frame buffer-predicate parameter, which controls where functions like next-buffer and other-buffer can land you. The only thing I have to do myself, is check for the condition where there are no more real buffers left to switch to, and in that case send you to the fallback-buffer. --- core/autoload/buffers.el | 26 -------------------------- core/core-ui.el | 16 ++++++++++------ core/test/autoload-buffers.el | 21 --------------------- 3 files changed, 10 insertions(+), 53 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index ea9f472f4..ce4a05866 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -150,32 +150,6 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." when (string-match-p pattern (buffer-name buf)) collect buf)) -(defun doom--cycle-real-buffers (n) - "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." - (if (null n) - (switch-to-buffer (doom-fallback-buffer) nil t) - (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)) - ((= (length buffers) 1) - (switch-to-buffer (car buffers) nil t)) - (t - ;; Why this instead of switching straight to the Nth buffer in - ;; BUFFERS? Because `switch-to-next-buffer' and - ;; `switch-to-prev-buffer' properly update buffer list order. - (cl-loop with move-func = - (if (> n 0) #'switch-to-next-buffer #'switch-to-prev-buffer) - for i to 20 - while (not (memq (current-buffer) buffers)) - do - (dotimes (_i (abs n)) - (funcall move-func))))))) - (force-mode-line-update) - (current-buffer)) - ;;;###autoload (defun doom-set-buffer-real (buffer flag) "Forcibly mark BUFFER as FLAG (non-nil = real)." diff --git a/core/core-ui.el b/core/core-ui.el index 906f3ddf0..c1767576d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -540,16 +540,20 @@ instead)." (not (eq (current-buffer) (doom-fallback-buffer)))) (defun doom*switch-to-fallback-buffer-maybe (orig-fn) - "Advice for `kill-this-buffer'. If there are no real buffers left, switch to -`doom-fallback-buffer'." + "Advice for `kill-this-buffer'. If in a dedicated window, delete it. If there +are no real buffers left, switch to `doom-fallback-buffer'. Otherwise, delegate +to original `kill-this-buffer'." (let ((buf (current-buffer))) (cond ((window-dedicated-p) (delete-window)) ((doom-real-buffer-p buf) - (previous-buffer) - (doom--cycle-real-buffers - (if (delq buf (doom-real-buffer-list)) -1)) - (kill-buffer buf)) + (or (kill-buffer buf) + (previous-buffer)) + ;; if there are no (real) buffers left to switch to, land on the + ;; fallback buffer. + (unless (cl-set-difference (doom-real-buffer-list) + (doom-visible-buffers)) + (switch-to-buffer (doom-fallback-buffer)))) (t (funcall orig-fn))))) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index 389231195..49f27c113 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -109,27 +109,6 @@ (should (buffer-live-p fallback)) (should (equal (buffer-name fallback) doom-fallback-buffer-name)))) -;; `doom--cycle-real-buffers' -(def-test! kill-buffer-then-show-real-buffer - (with-temp-buffers!! (a b c d) - (let-advice!! ((kill-this-buffer :around doom*switch-to-fallback-buffer-maybe)) - (dolist (buf (list a b d)) - (with-current-buffer buf - (setq-local buffer-file-name "x"))) - (should (cl-every #'buffer-live-p (buffer-list))) - (switch-to-buffer a) - (should (eq (current-buffer) a)) - (should (eq (selected-window) (get-buffer-window a))) - (kill-this-buffer) - (should-not (eq (current-buffer) a)) - (should-not (buffer-live-p a)) - ;; eventually end up in the fallback buffer - (let ((fallback (doom-fallback-buffer))) - (while (not (eq (current-buffer) fallback)) - (should (doom-real-buffer-p)) - (kill-this-buffer)) - (should (eq (current-buffer) fallback)))))) - ;; `doom-kill-buffer-and-windows' (def-test! kill-buffer-and-windows (with-temp-buffers!! (a b) From c319b606cd48cd96660abe3505523deae1360553 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 04:25:39 -0500 Subject: [PATCH 0329/4235] feature/workspaces: don't pollute *Messages* with tabbar output --- modules/feature/workspaces/autoload/workspaces.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8e463ef53..96fcfac82 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -443,7 +443,8 @@ the next." (defun +workspace/display () "Display a list of workspaces (like tabs) in the echo area." (interactive) - (minibuffer-message "%s" (+workspace--tabline))) + (let (message-log-max) + (minibuffer-message "%s" (+workspace--tabline)))) ;; From eaeb495b182004d0835d858b398fb63ba373433a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 04:26:00 -0500 Subject: [PATCH 0330/4235] lang/go: show annotations in code-completion popups --- modules/lang/go/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index e5761f16d..ec21d708f 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -91,6 +91,7 @@ :when (featurep! :completion company) :after go-mode :config + (setq company-go-show-annotation t) (if (executable-find command-go-gocode-command) (set! :company-backend 'go-mode '(company-go)) (warn "go-mode: couldn't find gocode, code completion won't work"))) From b9d8116734c3ae153e1406970916e1f3167be973 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 14:52:18 -0500 Subject: [PATCH 0331/4235] feature/evil: switch to initial state on change window This used to change to normal mode, but now it respects the buffer's initial state. --- modules/feature/evil/autoload/evil.el | 12 ++++++------ modules/feature/evil/config.el | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index ea6c0a0c4..5d6caa281 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -205,12 +205,12 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" (save-excursion (apply orig-fn args))) ;;;###autoload -(defun +evil*restore-normal-state-on-windmove (orig-fn &rest args) - "If in anything but normal or motion mode when moving to another window, -restore normal mode. This prevents insert state from bleeding into other modes -across windows." - (unless (memq evil-state '(normal motion emacs)) - (evil-normal-state +1)) +(defun +evil*restore-initial-state-on-windmove (orig-fn &rest args) + "Revert buffer to its initial state when switching to another window. This +prevents states from bleeding into other modes across windows." + (let ((initial-state (evil-initial-state major-mode 'normal))) + (unless (eq evil-state initial-state) + (evil-change-state initial-state))) (apply orig-fn args)) ;;;###autoload diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 85855eedc..c94ce0c76 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -94,8 +94,8 @@ (add-hook 'after-save-hook #'+evil|save-buffer) ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. (advice-add #'evil-force-normal-state :after #'doom/escape) - ;; Ensure buffer is in normal mode when we leave it and return to it. - (advice-add #'windmove-do-window-select :around #'+evil*restore-normal-state-on-windmove) + ;; Ensure buffer is in initial mode when we leave it and return to it. + (advice-add #'windmove-do-window-select :around #'+evil*restore-initial-state-on-windmove) ;; Don't move cursor when indenting (advice-add #'evil-indent :around #'+evil*static-reindent) ;; monkey patch `evil-ex-replace-special-filenames' to add more ex From c4244de05ef444be9ab74bbcb4f4f0bfae7459b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 15:11:03 -0500 Subject: [PATCH 0332/4235] feature/evil: don't override user cursor settings Slightly more flexible. If you change the evil cursors, but want to retain the color changes, you'll need to make `evil-default-cursor` and `evil-emacs-state-cursor` into lists and add `+evil-default-cursor` and `+evil-emacs-cursor` to them, respectively. --- modules/feature/evil/config.el | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index c94ce0c76..8e055601f 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -37,7 +37,13 @@ ;; more vim-like behavior evil-symbol-word-search t ;; don't activate mark on shift-click - shift-select-mode nil) + shift-select-mode nil + ;; cursor appearance + evil-default-cursor '+evil-default-cursor + evil-normal-state-cursor 'box + evil-emacs-state-cursor '(box +evil-emacs-cursor) + evil-insert-state-cursor 'bar + evil-visual-state-cursor 'hollow) (add-hook 'doom-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) @@ -45,14 +51,14 @@ (set! :popup "^\\*evil-registers" '((size . 0.3))) (set! :popup "^\\*Command Line" '((size . 8))) - ;; Set cursor colors later, once theme is loaded - (defun +evil*init-cursors (&rest _) - (setq evil-default-cursor (face-background 'cursor nil t) - evil-normal-state-cursor 'box - evil-emacs-state-cursor `(,(face-foreground 'warning) box) - evil-insert-state-cursor 'bar - evil-visual-state-cursor 'hollow)) - (advice-add #'load-theme :after #'+evil*init-cursors) + ;; Change the cursor color in emacs mode + (defvar +evil--default-cursor-color "#ffffff") + (defun +evil-default-cursor () (set-cursor-color +evil--default-cursor-color)) + (defun +evil-emacs-cursor () (set-cursor-color (face-foreground 'warning))) + + (defun +evil|update-cursor-color () + (setq +evil--default-cursor-color (face-background 'cursor))) + (add-hook 'doom-init-theme-hook #'+evil|update-cursor-color) ;; default modes (dolist (mode '(tabulated-list-mode view-mode comint-mode term-mode calendar-mode Man-mode)) From b488e4085f5a568e3b94d5b221f6f4d34ae611b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 15:57:38 -0500 Subject: [PATCH 0333/4235] completion/company: add +company/toggle-auto-completion command --- modules/completion/company/autoload.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index a235864e0..406b04333 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -1,5 +1,12 @@ ;;; completion/company/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +company/toggle-auto-completion () + "Toggle as-you-type code completion." + (interactive) + (require 'company) + (setq company-idle-delay (unless company-idle-delay 0.2))) + ;;;###autoload (defun +company/complete () "Bring up the completion popup. If only one result, complete it." From c788224946b750e6d442ddb0db59d0d2dbd095e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 15:57:49 -0500 Subject: [PATCH 0334/4235] completion/company: company-tooltip-limit = 14 --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 1b5609fd5..292570975 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -27,7 +27,7 @@ MODES should be one major-mode symbol or a list of them." company-complete-common company-manual-begin company-grab-line) :config (setq company-idle-delay nil - company-tooltip-limit 10 + company-tooltip-limit 14 company-dabbrev-downcase nil company-dabbrev-ignore-case nil company-dabbrev-code-other-buffers t From bae2287d5162fb864116b6934699ae407e284a77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 15:59:22 -0500 Subject: [PATCH 0335/4235] Recenter screen after save-place successfully loads point --- core/core-editor.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index 7dc12a3ef..b70117ada 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -90,6 +90,10 @@ fundamental-mode) for performance sake." savehist-additional-variables '(kill-ring search-ring regexp-search-ring) save-place-file (concat doom-cache-dir "saveplace")) (add-hook! 'doom-init-hook #'(savehist-mode save-place-mode)) +(defun doom*recenter-on-load-saveplace (&rest _) + "Recenter on cursor when loading a saved place." + (if buffer-file-name (ignore-errors (recenter)))) +(advice-add #'save-place-find-file-hook :after-while #'doom*recenter-on-load-saveplace) ;; Keep track of recently opened files (def-package! recentf From e71f28601a03eeb4510dc4f7c88095dcabde8944 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 16:56:34 -0500 Subject: [PATCH 0336/4235] Fix inconsistencies in fonts across frames #399 Also, minor refactor for doom|init-theme. --- core/core-ui.el | 72 ++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index c1767576d..2b3d09e37 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -436,46 +436,52 @@ character that looks like a space that `whitespace-mode' won't affect.") (defun doom|init-theme (&optional frame) "Set the theme and load the font, in that order." (with-selected-frame (or frame (selected-frame)) - (when doom-theme + (when (and (not (daemonp)) (symbolp doom-theme)) (load-theme doom-theme t)) - (condition-case-unless-debug ex - (when (display-graphic-p) - (when (fontp doom-font) - (set-frame-font doom-font nil (if frame (list frame) t)) - (set-face-attribute 'fixed-pitch frame :font doom-font)) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) - ('error - (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-theme-hook) - (when frame - (remove-hook 'after-make-frame-functions #'doom|init-theme)))) + (add-hook 'after-make-frame-functions #'doom|init-theme-in-daemon) + (run-hooks 'doom-init-theme-hook))) + +(defun doom|init-fonts (&optional frame) + "Initialize fonts." + (add-hook 'after-make-frame-functions #'doom|init-fonts) + (if (not frame) + (when (fontp doom-font) + (map-put default-frame-alist 'font (font-xlfd-name doom-font))) + (when (display-graphic-p) + (or frame (setq frame (selected-frame))) + (condition-case-unless-debug ex + (progn + (when (fontp doom-font) + (set-face-attribute 'fixed-pitch frame :font doom-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t 'unicode doom-unicode-font frame)) + ;; ...and for variable-pitch-mode: + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + ('error + (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)))))))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and -;; daemon Emacs is hairy. Running `doom|init-theme' sorts out the initial GUI -;; frame. +;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. +;; Attaching that hook to `after-make-frame-functions' sorts out daemon and +;; emacsclient frames. ;; -;; `doom|init-theme-in-frame' sorts out daemon and emacsclient frames by -;; reloading the theme in those frame. However, if you open simultaneous -;; terminal and gui frames with emacsclient, you will get issues! There's always -;; `doom//reload-theme' if you need it. -(defun doom|reload-ui-in-daemon (frame) +;; There will still be issues with simultaneous gui and terminal (emacsclient) +;; frames, however. There's always `doom//reload-theme' if you need it! +(defun doom|init-theme-in-daemon (frame) "Reloads the theme in new daemon or tty frames." (when (or (daemonp) (not (display-graphic-p))) - (doom|init-theme frame))) + (doom|init-theme frame) + (remove-hook 'after-make-frame-functions #'doom|init-theme-in-daemon))) -(add-hook 'doom-init-ui-hook #'doom|init-theme) -(add-hook 'after-make-frame-functions #'doom|reload-ui-in-daemon) +(add-hook! 'doom-init-ui-hook #'(doom|init-theme doom|init-fonts)) ;; From d0fa95f9a07526d5f226d61e3dda4c2b72b1514a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 18:56:57 -0500 Subject: [PATCH 0337/4235] feature/popup: change 'doom:' rule: transient = t --- modules/feature/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 1bce43413..a94792b59 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -162,7 +162,7 @@ ALIST supports one custom parameter: `size', which will resolve to '((quit) (transient . 0))) (set! :popup "^\\*doom:" '((size . 0.35) (side . bottom)) - '((select . t) (modeline . t) (quit) (transient))) + '((select . t) (modeline . t) (quit) (transient . t))) (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) nil) From bbb969fa59b491051b771135bead17b5cc93a7a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:10:43 -0500 Subject: [PATCH 0338/4235] Combine doom/open-scratch-buffer & doom/open-project-scratch-buffer These two are now doom/open-scratch-buffer. If you're in a project, a (persistent) scratch buffer is opened. Otherwise, a non-persistent, transient scratch buffer is opened. If ARG (universal argument) is non-nil, then use the current window instead of a new window (or popup, if feature/popup is enabled). Also, the ex command :x[!] is improved. The BANG = open in current window. --- core/autoload/scratch.el | 49 ++++++++++++----------- modules/private/default/+evil-commands.el | 8 +++- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index acdca74a9..3c8d0e3a9 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -7,27 +7,31 @@ (defvar doom-scratch-buffer-hook () "The hooks to run after a scratch buffer is made.") -(defun doom--create-scratch-buffer (&optional project-p) - (let ((text (and (region-active-p) - (buffer-substring-no-properties - (region-beginning) (region-end)))) - (mode major-mode) - (derived-p (derived-mode-p 'prog-mode 'text-mode)) - (old-project (doom-project-root))) +(defun doom--create-scratch-buffer () + (let* ((project-p (doom-project-p 'nocache)) + (text (and (region-active-p) + (buffer-substring-no-properties + (region-beginning) (region-end)))) + (mode major-mode) + (derived-p (derived-mode-p 'prog-mode 'text-mode)) + (project-root (if project-p (doom-project-root 'nocache))) + (id (projectile-project-name))) + (when (and id (string-empty-p id)) + (user-error "Invalid id for a scratch buffer (%s)" id)) (unless (file-directory-p doom-scratch-files-dir) - (mkdir doom-scratch-files-dir t)) + (make-directory doom-scratch-files-dir t)) (with-current-buffer (if project-p (find-file-noselect (expand-file-name (replace-regexp-in-string - "\\." "_" (projectile-project-name) + "\\." "_" id t t) doom-scratch-files-dir) nil t) (get-buffer-create "*doom:scratch*")) (when project-p - (rename-buffer (format "*doom:scratch (%s)*" (projectile-project-name)))) - (setq default-directory old-project) + (rename-buffer (format "*doom:scratch (%s)*" id)) + (setq default-directory project-root)) (when (and (not (eq major-mode mode)) derived-p (functionp mode)) @@ -37,17 +41,16 @@ (current-buffer)))) ;;;###autoload -(defun doom/open-scratch-buffer (&optional in-project-p) - "Opens a temporary scratch buffer. It is discarded once it is closed. If a -region is active, copy it to the scratch buffer." +(defun doom/open-scratch-buffer (&optional arg) + "Opens a persistent scratch buffer in the same major-mode, at the current +project root. If no project is found, scratch buffer will not be persistent. If +a selection is active, copy it to the scratch buffer. + +If ARG (universal argument) is non-nil, display the buffer in the current +window. Otherwise, display it in a pop up window. + +Persistent scratch buffers are stored in `doom-scratch-files-dir'." (interactive "P") - (pop-to-buffer (doom--create-scratch-buffer in-project-p))) - -;;;###autoload -(defun doom/open-project-scratch-buffer () - "Opens a (persistent) scratch buffer associated with the current project in a -popup window. Scratch buffers are stored in `doom-scratch-files-dir'. If a -region is active, copy it to the scratch buffer." - (interactive) - (doom/open-scratch-buffer 'in-project)) + (funcall (if arg #'switch-to-buffer #'display-buffer) + (doom--create-scratch-buffer))) diff --git a/modules/private/default/+evil-commands.el b/modules/private/default/+evil-commands.el index 9dfda8bc8..cf86594bd 100644 --- a/modules/private/default/+evil-commands.el +++ b/modules/private/default/+evil-commands.el @@ -2,10 +2,14 @@ (defalias 'ex! 'evil-ex-define-cmd) -(evil-define-command doom:cleanup-session (&optional bang) +(evil-define-command doom:cleanup-session (bang) (interactive "") (doom/cleanup-session bang)) +(evil-define-operator doom:open-scratch-buffer (bang) + (interactive "") + (doom/open-scratch-buffer bang)) + ;; ;; Commands @@ -38,7 +42,7 @@ (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) +(ex! "x" #'doom:open-scratch-buffer) ;; GIT (ex! "gist" #'+gist:send) ; send current buffer/region to gist (ex! "gistl" #'+gist:list) ; list gists by user From 11e2e1b55ecffd39781d72d5a2576f1d0ed418e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:44:17 -0500 Subject: [PATCH 0339/4235] lang/org: toc-org-hrefify-default = org gh-style links don't work in from within Emacs as well. --- modules/lang/org/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 84b6abd44..882666777 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -17,7 +17,8 @@ ;; (def-package! toc-org - :commands toc-org-enable) + :commands toc-org-enable + :config (setq toc-org-hrefify-default "org")) (def-package! org-crypt ; built-in :commands org-crypt-use-before-save-magic From 2d641bb059ba1bf9d38edac36af539a2121c57e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:45:25 -0500 Subject: [PATCH 0340/4235] lang/org: refresh ui settings when theme is changed --- modules/lang/org/config.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 882666777..eb230c366 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -128,7 +128,9 @@ unfold to point on startup." org-adapt-indentation nil org-cycle-include-plain-lists t org-cycle-separator-lines 1 - org-entities-user '(("flat" "\\flat" nil "" "" "266D" "♭") ("sharp" "\\sharp" nil "" "" "266F" "♯")) + org-entities-user + '(("flat" "\\flat" nil "" "" "266D" "♭") + ("sharp" "\\sharp" nil "" "" "266F" "♯")) org-fontify-done-headline t org-fontify-quote-and-verse-blocks t org-fontify-whole-heading-line t @@ -176,7 +178,10 @@ unfold to point on startup." :face (lambda (link) (if (file-exists-p (expand-file-name link +org-dir)) 'org-link - 'error)))) + 'error))) + + ;; Update UI when theme is changed + (add-hook 'doom-init-theme-hook #'+org|setup-ui)) (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies From d9a80a9520cd59bc651b7dad7b109b9900e693e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:47:28 -0500 Subject: [PATCH 0341/4235] feature/workspaces: fix buffer-bleedover from other workspaces The frame buffer-predicate wasn't discriminating against buffers that were in other perspectives, allowing you to `next-buffer` into them. UNACCEPTABLE. --- modules/feature/workspaces/autoload/workspaces.el | 8 ++------ modules/feature/workspaces/config.el | 10 +++++++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 96fcfac82..f5ded5f1d 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -48,12 +48,6 @@ "Return non-nil if buffer is in workspace (defaults to current workspace)." (persp-contain-buffer-p buffer (or workspace (+workspace-current)) nil)) -;;;###autoload -(defun +workspace-alien-buffer-p (buffer) - "Return non-nil if BUFFER isn't a member of the current workspace." - (and (get-buffer-window buffer) - (not (+workspace-contains-buffer-p buffer)))) - ;; --- Getters ---------------------------- @@ -274,6 +268,8 @@ workspace to delete." (if (+workspace-exists-p +workspace--last) +workspace--last (car (+workspace-list-names)))) + (unless (doom-buffer-frame-predicate (current-buffer)) + (switch-to-buffer (doom-fallback-buffer))) (format "Deleted '%s' workspace" name)) ((= workspaces 1) (format "Can't delete the last workspace!")) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index a1c3c9023..8499794fa 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -24,7 +24,14 @@ renamed.") (def-package! persp-mode :defer t :init + (defun +workspaces-buffer-predicate (buf) + (funcall (if persp-mode + (frame-parameter nil 'persp-buffer-predicate-generated) + #'doom-buffer-frame-predicate) + buf)) + (defun +workspaces|init () + (map-put default-frame-alist 'buffer-predicate #'+workspaces-buffer-predicate) (add-hook 'after-make-frame-functions #'+workspaces|init-frame) (require 'persp-mode) (unless (daemonp) @@ -70,7 +77,6 @@ Uses `+workspaces-main' to determine the name of the main workspace." persp-set-last-persp-for-new-frames t persp-switch-to-added-buffer nil persp-remove-buffers-from-nil-persp-behaviour nil - persp-set-frame-buffer-predicate #'doom-buffer-frame-predicate persp-auto-resume-time -1 ; Don't auto-load on startup persp-auto-save-opt (if noninteractive 0 1)) ; auto-save on kill @@ -99,7 +105,6 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; (defun +workspaces|init-persp-mode () (cond (persp-mode - (add-hook 'doom-unreal-buffer-functions #'+workspace-alien-buffer-p) ;; Ensure `persp-kill-buffer-query-function' is last in ;; kill-buffer-query-functions (remove-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function) @@ -111,7 +116,6 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) (t - (remove-hook 'doom-unreal-buffer-functions #'+workspace-alien-buffer-p) (advice-remove #'switch-to-buffer #'+workspaces*auto-add-buffer) (advice-remove #'display-buffer #'+workspaces*auto-add-buffer) (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) From cbd6bf190a3ded8783f0c4e09d99de4d533e29a8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:50:25 -0500 Subject: [PATCH 0342/4235] feature/workspaces: minor refactor --- modules/feature/workspaces/autoload/workspaces.el | 9 +++------ modules/feature/workspaces/config.el | 5 +++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index f5ded5f1d..c68e8d417 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -1,8 +1,5 @@ ;;; feature/workspaces/autoload/workspaces.el -*- lexical-binding: t; -*- -(defvar +workspace-data-file "_workspaces" - "The file basename in which to store single workspace perspectives.") - (defvar +workspace--last nil) (defvar +workspace--index 0) @@ -45,7 +42,7 @@ ;;;###autoload (defun +workspace-contains-buffer-p (buffer &optional workspace) - "Return non-nil if buffer is in workspace (defaults to current workspace)." + "Return non-nil if BUFFER is in WORKSPACE (defaults to current workspace)." (persp-contain-buffer-p buffer (or workspace (+workspace-current)) nil)) @@ -111,7 +108,7 @@ Returns t if successful, nil otherwise." (when (+workspace-exists-p name) (error "A workspace named '%s' already exists." name)) (persp-load-from-file-by-names - (expand-file-name +workspace-data-file persp-save-dir) + (expand-file-name +workspaces-data-file persp-save-dir) *persp-hash* (list name)) (+workspace-exists-p name)) @@ -131,7 +128,7 @@ perspective hash table. Returns t on success, nil otherwise." (unless (+workspace-exists-p name) (error "'%s' is an invalid workspace" name)) - (let ((fname (expand-file-name +workspace-data-file persp-save-dir))) + (let ((fname (expand-file-name +workspaces-data-file persp-save-dir))) (persp-save-to-file-by-names fname *persp-hash* (list name)) (and (member name (persp-list-persp-names-in-file fname)) t))) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 8499794fa..f804b6fe5 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -16,6 +16,11 @@ "The name of the primary and initial workspace, which cannot be deleted or renamed.") +;; FIXME actually use this for wconf bookmark system +(defvar +workspaces-data-file "_workspaces" + "The basename of the file to store single workspace perspectives. Will be +stored in `persp-save-dir'.") + ;; ;; Plugins From 46225e28304d9baa2ad6a4522c30eb9e3dd03440 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:50:37 -0500 Subject: [PATCH 0343/4235] core-ui: fix comment typo --- 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 2b3d09e37..feb651fab 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -570,7 +570,7 @@ to original `kill-this-buffer'." (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) ;; Don't kill the fallback buffer (add-hook 'kill-buffer-query-functions #'doom|protect-fallback-buffer) - ;; Don't kill buffers that are visible else, only bury them + ;; Don't kill buffers that are visible in another window, only bury them (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) ;; Renames major-modes [pedantry intensifies] (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) From 0c4a2cd713de8f276576a677db3b1eaafa7571e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:51:08 -0500 Subject: [PATCH 0344/4235] ui/nav-flash: blink after save-place jump --- modules/ui/nav-flash/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index cf2ce8be0..16617b423 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -8,6 +8,8 @@ (advice-add #'windmove-do-window-select :around #'+doom*blink-cursor-maybe) (advice-add #'recenter :around #'+doom*blink-cursor-maybe) + (advice-add #'save-place-find-file-hook :after #'+doom/blink-cursor) + (after! evil (advice-add #'evil--jumps-jump :after #'+doom/blink-cursor) From 160902bd18a902410d510db14b8da91effa405b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 19:54:56 -0500 Subject: [PATCH 0345/4235] Remove doom/toggle-fullsreen; redundant with toggle-frame-fullscreen --- core/autoload/ui.el | 16 ---------------- modules/private/default/+bindings.el | 6 +++--- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 080ce05fd..984ade45c 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -1,21 +1,5 @@ ;;; core/autoload/ui.el -*- lexical-binding: t; -*- -;;;###autoload -(defun doom/toggle-fullscreen () - "Toggle fullscreen for the current frame using non-native fullscreen. If you -prefer native fullscreen, use `toggle-frame-fullscreen' instead." - (interactive) - (modify-frame-parameters - nil - `((maximized - . ,(unless (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth)) - (frame-parameter nil 'fullscreen))) - (fullscreen - . ,(if (memq (frame-parameter nil 'fullscreen) '(fullscreen fullboth)) - (when (eq (frame-parameter nil 'maximized) 'maximized) - 'maximized) - 'fullboth))))) - (defvar doom--line-number-style doom-line-numbers-style) ;;;###autoload (defun doom/toggle-line-numbers () diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 7714cadfe..4e813f82e 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -28,13 +28,14 @@ "M-=" #'text-scale-increase "M--" #'text-scale-decrease - ;; Simple window navigation/manipulation + ;; Simple window/frame navigation/manipulation "C-`" #'+popup/toggle "C-~" #'+popup/raise "M-t" #'+workspace/new "M-T" #'+workspace/display "M-w" #'delete-window "M-W" #'delete-frame + "C-M-f" #'toggle-frame-fullscreen "M-n" #'evil-buffer-new "M-N" #'make-frame "M-1" (λ! (+workspace/switch-to 0)) @@ -56,7 +57,6 @@ :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 @@ -287,7 +287,7 @@ :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 "Frame fullscreen" :n "f" #'toggle-frame-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 From 8c5286f2dc318674bb4ed668a7978645d9fc1e47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 20:46:02 -0500 Subject: [PATCH 0346/4235] lang/sh: silence indentation messages --- modules/lang/sh/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 6a78ed628..79ed15e44 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -28,6 +28,11 @@ (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1)))) sh-imenu-generic-expression) + (defun +sh*silence-messages (orig-fn &rest args) + "`sh-set-shell' is chatty about it setting up indentation rules. Shut up." + (quiet! (apply orig-fn args))) + (advice-add #'sh-set-shell :around #'+sh*silence-messages) + ;; 1. Fontifies variables in double quotes ;; 2. Fontify command substitution in double quotes ;; 3. Fontify built-in/common commands (see `+sh-builtin-keywords') From 49a45ec0c80b7936aad700a8e4c4d012d0a44d43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 21:21:20 -0500 Subject: [PATCH 0347/4235] private/default: add :pwd[!] command (copy pwd to clipboard) --- modules/private/default/+evil-commands.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/private/default/+evil-commands.el b/modules/private/default/+evil-commands.el index cf86594bd..f4143d803 100644 --- a/modules/private/default/+evil-commands.el +++ b/modules/private/default/+evil-commands.el @@ -10,6 +10,13 @@ (interactive "") (doom/open-scratch-buffer bang)) +(evil-define-command doom:pwd (bang) + (interactive "") + (if (not bang) + (pwd) + (kill-new default-directory) + (message "Copied to clipboard"))) + ;; ;; Commands @@ -65,6 +72,7 @@ ;; Project navigation (ex! "a" #'projectile-find-other-file) (ex! "cd" #'+default:cd) +(ex! "pwd" #'doom:pwd) (cond ((featurep! :completion ivy) (ex! "ag" #'+ivy:ag) (ex! "agc[wd]" #'+ivy:ag-cwd) From 1dfe6c472aaa7daef1e7a02860d0af349176731e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 23:44:09 -0500 Subject: [PATCH 0348/4235] Rewrite doom/info for concise debug output --- core/autoload/debug.el | 62 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 8 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 9cd01271f..581d21229 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -89,12 +89,58 @@ selection of all minor-modes, active or not." ;;;###autoload (defun doom/info () - "Collects information about this session of Doom Emacs and copies it to the -clipboard. Helpful when filing bug reports!" + "Collects some debug information about your Emacs session, and copies it to +your clipboard. Use this when you are filing bug reports!" + (declare (interactive-only t)) (interactive) - (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 "Done. Copied to clipboard!"))) + (message "Generating Doom info...") + (let* ((default-directory doom-emacs-dir) + (str (format + (concat "### System Information\n" + "- OS: %s (%s)\n" + "- Emacs: %s\n" + "- Doom: %s (%s https://github.com/hlissner/doom-emacs/commit/%s)\n" + "- Graphic display: %s (daemon: %s)\n" + "- System features: %s\n" + "- Details:\n ```elisp\n modules:\t%s packages:\t%s compiled files:\t%s exec-path:\t%s ```\n") + system-type + emacs-version (format-time-string "%b %d, %Y" emacs-build-time) + doom-version + (vc-git--symbolic-ref "core/core.el") (vc-git-working-revision "core/core.el") + (display-graphic-p) (daemonp) + (bound-and-true-p system-configuration-features) + ;; details + (pp-to-string ; modules + (or (ignore-errors + (cl-loop with cat = nil + for key being the hash-keys of doom-modules + if (or (not cat) (not (eq cat (car key)))) + do (setq cat (car key)) and collect cat + else collect (cdr key))) + "n/a")) + (pp-to-string ; packages + (or (ignore-errors + (let (packages) + (require 'async) + (async-get + (async-start + `(lambda () + (setq load-path ',load-path) + (load ,(expand-file-name "core/core.el" doom-emacs-dir)) + (load ,(expand-file-name "init.el" doom-emacs-dir)) + (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) + (doom-get-packages)) + (lambda (p) (setq packages p)))) + (cl-sort (mapcar #'car packages) #'string-lessp :key #'symbol-name))) + "n/a")) + (pp-to-string ; compiled files + (or (ignore-errors + (cl-delete-duplicates + (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) + (reverse (directory-files-recursively doom-modules-dir "\\.elc$"))) + collect (file-relative-name (file-name-directory file) doom-emacs-dir)) + :test #'equal)) + "n/a")) + (pp-to-string exec-path)))) + (kill-new str) + (message "Done! Copied to your clipboard"))) From b40924a80bfb3a2986cdcdb5d9065d898e4fd564 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 23:45:52 -0500 Subject: [PATCH 0349/4235] core-os: add IS-WINDOWS & w32-get-true-file-attributes = nil First step in a long journey towards Windows support. --- core/core-os.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 9b41c437e..28206edb7 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -1,7 +1,8 @@ ;;; core-os.el -*- lexical-binding: t; -*- -(defconst IS-MAC (eq system-type 'darwin)) -(defconst IS-LINUX (eq system-type 'gnu/linux)) +(defconst IS-MAC (eq system-type 'darwin)) +(defconst IS-LINUX (eq system-type 'gnu/linux)) +(defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) ;; clipboard (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING) @@ -50,7 +51,11 @@ (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! - x-underline-at-descent-line t))) ; draw underline lower + x-underline-at-descent-line t)) ; draw underline lower + + (IS-WINDOWS + (setq w32-get-true-file-attributes nil) ; fix file io slowdowns + )) (provide 'core-os) ;;; core-os.el ends here From d714be0a164f820f5b920f3ce85d88e52f0f636e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Feb 2018 23:57:26 -0500 Subject: [PATCH 0350/4235] lang/org: +org/insert-item: unhide if point lands in invisible region --- modules/lang/org/autoload/org.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index c876dd62c..e27e99585 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -245,6 +245,8 @@ wrong places)." (t (user-error "Not a valid list, heading or table"))) + (when (org-invisible-p) + (org-show-subtree)) (when (bound-and-true-p evil-mode) (evil-insert 1)))) From 3bfb7fa17dc63b218ab6cdb0d5778a921c5f7910 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 01:32:04 -0500 Subject: [PATCH 0351/4235] Move init.test.el into core/autoload/test.el --- core/autoload/test.el | 11 ++++++++++- init.test.el | 23 ----------------------- 2 files changed, 10 insertions(+), 24 deletions(-) delete mode 100644 init.test.el diff --git a/core/autoload/test.el b/core/autoload/test.el index 21a71279a..7ce57e11f 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -1,5 +1,14 @@ ;;; core/autoload/test.el -*- lexical-binding: t; no-byte-compile: t; -*- +(defvar doom-test-modules + '(:feature evil workspaces + :completion company + :ui doom-dashboard + :tools password-store + :lang org web + :private hlissner) + "The `doom!' specs for the Doom unit test session.") + ;;;###autoload (defun doom//run-tests (&optional modules) "Run all loaded tests, specified by MODULES (a list of module cons cells) or @@ -38,7 +47,7 @@ If neither is available, run all tests in all enabled modules." (t (let (noninteractive) (clrhash doom-modules) - (load (expand-file-name "init.test.el" user-emacs-directory) nil t) + (eval `(doom! ,@doom-test-modules)) (setq modules (doom-module-pairs) targets (list (expand-file-name "test/" doom-core-dir)))))) ;; resolve targets to a list of test files and load them diff --git a/init.test.el b/init.test.el deleted file mode 100644 index 8d529cd2f..000000000 --- a/init.test.el +++ /dev/null @@ -1,23 +0,0 @@ -;;; init.test.el -- for automated unit tests -*- lexical-binding: t; -*- - -(require 'core (concat user-emacs-directory "core/core")) - -(doom! :feature - evil - workspaces - - :completion - company - - :ui - doom-dashboard - - :tools - password-store - - :lang - org - web - - :private - hlissner) From 7e21d66bf7ac7a48a7d8f05c0af3c22200284fce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 06:10:32 -0500 Subject: [PATCH 0352/4235] lang/org: fix opening file links --- modules/lang/org/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index eb230c366..fad584eba 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -257,7 +257,10 @@ between the two." ;; Let OS decide what to do with files when opened (setq org-file-apps - `(("\\.org$" . emacs) + `(("pdf" . default) + ("\\.x?html?\\'" . default) + (auto-mode . emacs) + (directory . emacs) (t . ,(cond (IS-MAC "open -R \"%s\"") (IS-LINUX "xdg-open \"%s\""))))) From 169cd809bc956b3f3eec1366e5541b0830421a0c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 06:12:04 -0500 Subject: [PATCH 0353/4235] lang/org: add more org links & abbrevs New org, doom, doom-module and doom-docs links, with completion and non-existing file highlights. --- modules/lang/org/config.el | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index fad584eba..d71abb9bc 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -171,14 +171,35 @@ unfold to point on startup." :background nil t))) ;; Custom links - (org-link-set-parameters - "org" - :complete (lambda () (+org-link-read-file "org" +org-dir)) - :follow (lambda (link) (find-file (expand-file-name link +org-dir))) - :face (lambda (link) - (if (file-exists-p (expand-file-name link +org-dir)) - 'org-link - 'error))) + (setq org-link-abbrev-alist + '(("github" . "https://github.com/%s") + ("youtube" . "https://youtube.com/watch?v=%s") + ("google" . "https://google.com/search?q=") + ("gimages" . "https://google.com/images?q=%s") + ("gmap" . "https://maps.google.com/maps?q=%s") + ("duckduckgo" . "https://duckduckgo.com/?q=%s") + ("wolfram" . "https://wolframalpha.com/input/?i=%s") + ("doom-repo" . "https://github.com/hlissner/doom-emacs/%s"))) + + (defun +org--relpath (path root) + (if (and buffer-file-name (file-in-directory-p buffer-file-name root)) + (file-relative-name path) + path)) + + (defmacro def-org-file-link! (key dir) + `(org-link-set-parameters + ,key + :complete (lambda () (+org--relpath (+org-link-read-file ,key ,dir) ,dir)) + :follow (lambda (link) (find-file (expand-file-name link ,dir))) + :face (lambda (link) + (if (file-exists-p (expand-file-name link ,dir)) + 'org-link + '(:inherit (error underline)))))) + + (def-org-file-link! "org" +org-dir) + (def-org-file-link! "doom" doom-emacs-dir) + (def-org-file-link! "doom-module" doom-modules-dir) + (def-org-file-link! "doom-docs" doom-docs-dir) ;; Update UI when theme is changed (add-hook 'doom-init-theme-hook #'+org|setup-ui)) From 4ce521e26b98f162fb14354c8fb70469f157518e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 15:07:18 -0500 Subject: [PATCH 0354/4235] feature/lookup: fix xref-backend-identifier error from projectile-find-tag #385 --- modules/feature/lookup/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 1b3f6a263..28cc3e650 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -91,7 +91,13 @@ properties: (after! xref ;; By default, `etags--xref-backend' is the default xref backend. No need. ;; We'll set these up ourselves in other modules. - (setq-default xref-backend-functions '(t))) + (setq-default xref-backend-functions '(t)) + + ;; ...however, it breaks `projectile-find-tag', unless we put it back. + (defun +lookup*projectile-find-tag (orig-fn) + (let ((xref-backend-functions '(etags--xref-backend t))) + (funcall orig-fn))) + (advice-add #'projectile-find-tag :around #'+lookup*projectile-find-tag)) (defun +lookup|init-xref-backends () "Set `+lookup-current-functions' for the current buffer. From 76a1e8a279b7e1cf98e321b6c06a2bf415393a7a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 17:57:41 -0500 Subject: [PATCH 0355/4235] Fix theme/font init in daemon Emacs Possibly addresses #399 and #400 --- core/core-ui.el | 66 ++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index feb651fab..c1c297518 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -433,53 +433,51 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defun doom|init-theme (&optional frame) +(defun doom|init-theme () "Set the theme and load the font, in that order." - (with-selected-frame (or frame (selected-frame)) - (when (and (not (daemonp)) (symbolp doom-theme)) - (load-theme doom-theme t)) - (add-hook 'after-make-frame-functions #'doom|init-theme-in-daemon) - (run-hooks 'doom-init-theme-hook))) + (when doom-theme + (load-theme doom-theme t)) + (add-hook 'after-make-frame-functions #'doom|init-theme-in-frame) + (run-hooks 'doom-init-theme-hook)) (defun doom|init-fonts (&optional frame) "Initialize fonts." (add-hook 'after-make-frame-functions #'doom|init-fonts) - (if (not frame) - (when (fontp doom-font) - (map-put default-frame-alist 'font (font-xlfd-name doom-font))) - (when (display-graphic-p) - (or frame (setq frame (selected-frame))) - (condition-case-unless-debug ex - (progn - (when (fontp doom-font) - (set-face-attribute 'fixed-pitch frame :font doom-font)) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) - ('error - (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)))))))) + (when (fontp doom-font) + (map-put default-frame-alist 'font (font-xlfd-name doom-font))) + (when (display-graphic-p) + (or frame (setq frame (selected-frame))) + (condition-case-unless-debug ex + (progn + (when (fontp doom-font) + (set-face-attribute 'fixed-pitch frame :font doom-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t 'unicode doom-unicode-font frame)) + ;; ...and for variable-pitch-mode: + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + ('error + (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))))))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and ;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. -;; Attaching that hook to `after-make-frame-functions' sorts out daemon and -;; emacsclient frames. +;; Attaching `doom|init-theme-in-frame' to `after-make-frame-functions' sorts +;; out daemon and emacsclient frames. ;; ;; There will still be issues with simultaneous gui and terminal (emacsclient) ;; frames, however. There's always `doom//reload-theme' if you need it! -(defun doom|init-theme-in-daemon (frame) +(defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." (when (or (daemonp) (not (display-graphic-p))) - (doom|init-theme frame) - (remove-hook 'after-make-frame-functions #'doom|init-theme-in-daemon))) + (with-selected-frame frame + (doom|init-theme)))) (add-hook! 'doom-init-ui-hook #'(doom|init-theme doom|init-fonts)) From 3830a8aba1ba1fb9804700d7aafe7e19d0bacca0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 18:06:44 -0500 Subject: [PATCH 0356/4235] feature/workspaces: fix infinite recursion in buffer-predicate #399 By refactoring so that the middle-man buffer predicate wasn't necessary. --- core/core-ui.el | 2 +- modules/feature/workspaces/config.el | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index c1c297518..66b437fbe 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -491,7 +491,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) ;; make `next-buffer', `other-buffer', etc. ignore unreal buffers -(push '(buffer-predicate . doom-buffer-frame-predicate) default-frame-alist) +(map-put default-frame-alist 'buffer-predicate #'doom-buffer-frame-predicate) ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only (menu-bar-mode -1) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index f804b6fe5..a52246a13 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -29,14 +29,9 @@ stored in `persp-save-dir'.") (def-package! persp-mode :defer t :init - (defun +workspaces-buffer-predicate (buf) - (funcall (if persp-mode - (frame-parameter nil 'persp-buffer-predicate-generated) - #'doom-buffer-frame-predicate) - buf)) - (defun +workspaces|init () - (map-put default-frame-alist 'buffer-predicate #'+workspaces-buffer-predicate) + ;; Remove default buffer predicate so persp-mode can put in its own + (setq default-frame-alist (map-delete default-frame-alist 'buffer-predicate)) (add-hook 'after-make-frame-functions #'+workspaces|init-frame) (require 'persp-mode) (unless (daemonp) From ee24aba0342e320355074489b7424052de83bf3e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 22:24:15 -0500 Subject: [PATCH 0357/4235] Fix whitespace inconsistencies in doom/info --- core/autoload/debug.el | 78 ++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 33 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 581d21229..70f41ae4f 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -102,7 +102,13 @@ your clipboard. Use this when you are filing bug reports!" "- Doom: %s (%s https://github.com/hlissner/doom-emacs/commit/%s)\n" "- Graphic display: %s (daemon: %s)\n" "- System features: %s\n" - "- Details:\n ```elisp\n modules:\t%s packages:\t%s compiled files:\t%s exec-path:\t%s ```\n") + "- Details:\n" + " ```elisp\n" + " modules: %s\n" + " packages: %s\n" + " elc files: %s\n" + " exec-path: %s\n" + " ```\n") system-type emacs-version (format-time-string "%b %d, %Y" emacs-build-time) doom-version @@ -110,37 +116,43 @@ your clipboard. Use this when you are filing bug reports!" (display-graphic-p) (daemonp) (bound-and-true-p system-configuration-features) ;; details - (pp-to-string ; modules - (or (ignore-errors - (cl-loop with cat = nil - for key being the hash-keys of doom-modules - if (or (not cat) (not (eq cat (car key)))) - do (setq cat (car key)) and collect cat - else collect (cdr key))) - "n/a")) - (pp-to-string ; packages - (or (ignore-errors - (let (packages) - (require 'async) - (async-get - (async-start - `(lambda () - (setq load-path ',load-path) - (load ,(expand-file-name "core/core.el" doom-emacs-dir)) - (load ,(expand-file-name "init.el" doom-emacs-dir)) - (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) - (doom-get-packages)) - (lambda (p) (setq packages p)))) - (cl-sort (mapcar #'car packages) #'string-lessp :key #'symbol-name))) - "n/a")) - (pp-to-string ; compiled files - (or (ignore-errors - (cl-delete-duplicates - (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) - (reverse (directory-files-recursively doom-modules-dir "\\.elc$"))) - collect (file-relative-name (file-name-directory file) doom-emacs-dir)) - :test #'equal)) - "n/a")) - (pp-to-string exec-path)))) + (or (cl-loop with cat = nil + for key being the hash-keys of doom-modules + if (or (not cat) (not (eq cat (car key)))) + do (setq cat (car key)) and collect cat + else collect + (let ((flags (doom-module-flags cat (cdr key)))) + (if (equal flags '(t)) + (cdr key) + (list (cdr key) flags)))) + "n/a") + (or (let (packages) + (ignore-errors + (require 'async) + ;; collect these in another session to protect this + ;; session's state + (async-get + (async-start + `(lambda () + (setq load-path ',load-path) + (load ,(expand-file-name "core/core.el" doom-emacs-dir)) + (load ,(expand-file-name "init.el" doom-emacs-dir)) + (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) + (doom-get-packages)) + (lambda (p) (setq packages p)))) + (mapcar (lambda (x) + (if (cdr x) + (format "%s" x) + (symbol-name (car x)))) + (cl-sort packages #'string-lessp :key (lambda (x) (symbol-name (car x))))))) + "n/a") + (or (ignore-errors + (cl-delete-duplicates + (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) + (reverse (directory-files-recursively doom-modules-dir "\\.elc$"))) + collect (file-relative-name (file-name-directory file) doom-emacs-dir)) + :test #'equal)) + "n/a") + exec-path))) (kill-new str) (message "Done! Copied to your clipboard"))) From c5837440d63d386db27f3cdf8718c9713e4bf80c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 22:36:39 -0500 Subject: [PATCH 0358/4235] Refactor kill-this-buffer advice And prevent it from switching to fallback buffer too early. Again. --- core/core-ui.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 66b437fbe..b47891fe5 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -545,19 +545,24 @@ instead)." (defun doom*switch-to-fallback-buffer-maybe (orig-fn) "Advice for `kill-this-buffer'. If in a dedicated window, delete it. If there -are no real buffers left, switch to `doom-fallback-buffer'. Otherwise, delegate -to original `kill-this-buffer'." +are no real buffers left OR if all remaining buffers are visible in other +windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original +`kill-this-buffer'." (let ((buf (current-buffer))) (cond ((window-dedicated-p) (delete-window)) + ((eq buf (doom-fallback-buffer)) + (message "Can't kill the fallback buffer.")) ((doom-real-buffer-p buf) - (or (kill-buffer buf) - (previous-buffer)) - ;; if there are no (real) buffers left to switch to, land on the - ;; fallback buffer. - (unless (cl-set-difference (doom-real-buffer-list) - (doom-visible-buffers)) - (switch-to-buffer (doom-fallback-buffer)))) + (when (or ;; if there aren't more real buffers than visible buffers, + ;; then there are no real, non-visible buffers left. + (not (cl-set-difference (doom-real-buffer-list) + (doom-visible-buffers))) + ;; if we end up back where we start (or previous-buffer + ;; returns nil), we have nowhere left to go + (memq (previous-buffer) (list buf 'nil))) + (switch-to-buffer (doom-fallback-buffer))) + (kill-buffer buf)) (t (funcall orig-fn))))) From 3a6388bb685a322d51fd11e2e57c6a9273916166 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 22:38:07 -0500 Subject: [PATCH 0359/4235] feature/evil: fix vars being set too late #401 Certain evil variables, like evil-respect-visual-line-mode, need to be set before evil is loaded for it to take effect. --- modules/feature/evil/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 8e055601f..bfa3f0c40 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -21,7 +21,7 @@ (autoload 'goto-last-change-reverse "goto-chg") (def-package! evil - :config + :init (setq evil-want-C-u-scroll t evil-want-visual-char-semi-exclusive t evil-want-Y-yank-to-eol t @@ -45,6 +45,7 @@ evil-insert-state-cursor 'bar evil-visual-state-cursor 'hollow) + :config (add-hook 'doom-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) From e2a60286439addcd388b162d098897e932842d9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 22:39:31 -0500 Subject: [PATCH 0360/4235] Add docstring to doom/toggle-profiler --- core/autoload/debug.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 70f41ae4f..efd152161 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -80,6 +80,8 @@ selection of all minor-modes, active or not." (defvar doom--profiler nil) ;;;###autoload (defun doom/toggle-profiler () + "Toggle the Emacs profiler. Starts it if isn't running. Stops it and pops up +the profiling report otherwise." (interactive) (if (not doom--profiler) (profiler-start 'cpu+mem) From 4262b9912c7cffb147396ca47f609923c1369851 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 22:46:18 -0500 Subject: [PATCH 0361/4235] Revert "Move init.test.el into core/autoload/test.el" This reverts commit 3bfb7fa17dc63b218ab6cdb0d5778a921c5f7910. --- core/autoload/test.el | 11 +---------- init.test.el | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 init.test.el diff --git a/core/autoload/test.el b/core/autoload/test.el index 7ce57e11f..21a71279a 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -1,14 +1,5 @@ ;;; core/autoload/test.el -*- lexical-binding: t; no-byte-compile: t; -*- -(defvar doom-test-modules - '(:feature evil workspaces - :completion company - :ui doom-dashboard - :tools password-store - :lang org web - :private hlissner) - "The `doom!' specs for the Doom unit test session.") - ;;;###autoload (defun doom//run-tests (&optional modules) "Run all loaded tests, specified by MODULES (a list of module cons cells) or @@ -47,7 +38,7 @@ If neither is available, run all tests in all enabled modules." (t (let (noninteractive) (clrhash doom-modules) - (eval `(doom! ,@doom-test-modules)) + (load (expand-file-name "init.test.el" user-emacs-directory) nil t) (setq modules (doom-module-pairs) targets (list (expand-file-name "test/" doom-core-dir)))))) ;; resolve targets to a list of test files and load them diff --git a/init.test.el b/init.test.el new file mode 100644 index 000000000..8d529cd2f --- /dev/null +++ b/init.test.el @@ -0,0 +1,23 @@ +;;; init.test.el -- for automated unit tests -*- lexical-binding: t; -*- + +(require 'core (concat user-emacs-directory "core/core")) + +(doom! :feature + evil + workspaces + + :completion + company + + :ui + doom-dashboard + + :tools + password-store + + :lang + org + web + + :private + hlissner) From 245ef02597798d6a230d546746b715ae987adde9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 01:38:59 -0500 Subject: [PATCH 0362/4235] Fix misplaced info in doom/info output And update its docstring --- core/autoload/debug.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index efd152161..383c7dfb3 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -91,8 +91,8 @@ the profiling report otherwise." ;;;###autoload (defun doom/info () - "Collects some debug information about your Emacs session, and copies it to -your clipboard. Use this when you are filing bug reports!" + "Collects some debug information about your Emacs session, formats it into +markdown and copies it to your clipboard, ready to be pasted into bug reports!" (declare (interactive-only t)) (interactive) (message "Generating Doom info...") @@ -100,7 +100,7 @@ your clipboard. Use this when you are filing bug reports!" (str (format (concat "### System Information\n" "- OS: %s (%s)\n" - "- Emacs: %s\n" + "- Emacs: %s (%s)\n" "- Doom: %s (%s https://github.com/hlissner/doom-emacs/commit/%s)\n" "- Graphic display: %s (daemon: %s)\n" "- System features: %s\n" @@ -108,10 +108,10 @@ your clipboard. Use this when you are filing bug reports!" " ```elisp\n" " modules: %s\n" " packages: %s\n" - " elc files: %s\n" + " elc dirs: %s\n" " exec-path: %s\n" " ```\n") - system-type + system-type system-configuration emacs-version (format-time-string "%b %d, %Y" emacs-build-time) doom-version (vc-git--symbolic-ref "core/core.el") (vc-git-working-revision "core/core.el") From b6ee578cda0c70e5e2577c0115afd2cc87151273 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 02:21:35 -0500 Subject: [PATCH 0363/4235] feature/workspace: fix new frames with unreal buffers + no buffer predicate --- modules/feature/workspaces/autoload/workspaces.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index c68e8d417..f2a814dc3 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -473,7 +473,11 @@ created." (if (not (persp-frame-list-without-daemon)) (+workspace-switch +workspaces-main t) (+workspace-switch (format "#%s" (+workspace--generate-id)) t) - (set-frame-parameter frame 'workspace (+workspace-current-name))) + (unless (doom-real-buffer-p) + (switch-to-buffer (doom-fallback-buffer))) + (set-frame-parameter frame 'workspace (+workspace-current-name)) + ;; ensure every buffer has a buffer-predicate + (persp-set-frame-buffer-predicate frame)) (run-at-time 0.1 nil #'+workspace/display)))) (defvar +workspaces--project-dir nil) From 414383e5f4e971e5f67098bc1c505ded2668e25d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 05:02:15 -0500 Subject: [PATCH 0364/4235] Remove vestigial references to doom/{next,previous}-buffer --- core/autoload/buffers.el | 2 +- core/core-keybinds.el | 4 ++-- modules/app/rss/config.el | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index ce4a05866..c5e06c209 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -193,7 +193,7 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." (kill-buffer buffer) (cl-loop for win in windows if (doom-real-buffer-p (window-buffer win)) - do (with-selected-window win (doom/previous-buffer))))) + do (with-selected-window win (previous-buffer))))) ;;;###autoload (defun doom/kill-all-buffers (&optional project-p) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 056192185..77bd2175f 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -91,8 +91,8 @@ If any hook returns non-nil, all hooks after it are ignored.") ("k" windmove-up) ("l" windmove-right) - ("p" doom/previous-buffer) - ("n" doom/next-buffer) + ("p" previous-buffer) + ("n" next-buffer) ("b" switch-to-buffer) ("f" find-file) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 1aa6cd903..11eb92618 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -48,8 +48,6 @@ :n "q" #'elfeed-kill-buffer :m "j" #'evil-next-visual-line :m "k" #'evil-previous-visual-line - [remap doom/next-buffer] #'+rss/next - [remap doom/previous-buffer] #'+rss/previous [remap next-buffer] #'+rss/next [remap previous-buffer] #'+rss/previous))) From 6650dcf6e706699bf761ffadd09f431239d9ca88 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 04:49:05 -0500 Subject: [PATCH 0365/4235] lang/csharp: fix omnisharp server integration --- modules/lang/csharp/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index d86ca508c..e15443f54 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -7,10 +7,11 @@ :after csharp-mode :preface (setq omnisharp-auto-complete-want-documentation nil - omnisharp-server-executable-path (concat doom-local-dir "OmniSharp.exe")) + omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (if (file-exists-p omnisharp-server-executable-path) - (add-hook! csharp-mode #'(eldoc-mode flycheck-mode omnisharp-mode)) + (add-hook! csharp-mode #'(eldoc-mode flycheck-mode omnisharp-mode)) + + (unless (file-exists-p (omnisharp--server-installation-path t)) (warn "csharp-mode: omnisharp server isn't installed, completion won't work")) (set! :company-backend 'csharp-mode '(company-omnisharp)) From 36c8db67b42e9c339b29a0cb43b992aa5094f2a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 05:02:41 -0500 Subject: [PATCH 0366/4235] lang/csharp: remove vestigial setup.sh --- modules/lang/csharp/setup.sh | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100755 modules/lang/csharp/setup.sh diff --git a/modules/lang/csharp/setup.sh b/modules/lang/csharp/setup.sh deleted file mode 100755 index 9d0ceb478..000000000 --- a/modules/lang/csharp/setup.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -source VARS - -# -echo "Setting up C# (omnisharp)" - -git-repo "https://github.com/OmniSharp/omnisharp-server" omnisharp -cd omnisharp && xbuild -mv omnisharp/bin/Debug/OmniSharp.exe ./OmniSharp.exe -rm -rf omnisharp From 64d0e28f8056bb0dd454db156d5a0c3581576c5c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 05:05:32 -0500 Subject: [PATCH 0367/4235] lang/csharp: add bare bones readme --- modules/lang/csharp/README.org | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 modules/lang/csharp/README.org diff --git a/modules/lang/csharp/README.org b/modules/lang/csharp/README.org new file mode 100644 index 000000000..6006e1689 --- /dev/null +++ b/modules/lang/csharp/README.org @@ -0,0 +1,28 @@ +#+TITLE: :lang csharp + +This module adds C# support to Emacs. + +#+begin_quote +I don't use C# for much else than Unity3D and, seldomly, for Mono game +development on Linux. +#+end_quote + +* Table of Contents :TOC: +- [[Install][Install]] + - [[MacOS][MacOS]] + - [[Arch Linux][Arch Linux]] + +* Install +This module needs: + ++ omnisharp-roslyn (install with ~M-x omnisharp-install-server~) ++ .NET SDKs (on Windows) ++ Mono (on UNIX platforms) + +** MacOS +=TODO= + +** Arch Linux +#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") +sudo pacman --needed --noconfirm -S mono +#+END_SRC From fb5fbf69dccb22f7d87367ee1443a68a2666eccf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 05:32:43 -0500 Subject: [PATCH 0368/4235] lang/csharp: clean up omnisharp server when killing last csharp-mode buffer --- modules/lang/csharp/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index e15443f54..e7907a32a 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -14,6 +14,12 @@ (unless (file-exists-p (omnisharp--server-installation-path t)) (warn "csharp-mode: omnisharp server isn't installed, completion won't work")) + (defun +csharp|cleanup-omnisharp-server () + "Clean up the omnisharp server once you kill the last csharp-mode buffer." + (unless (doom-buffers-in-mode 'csharp-mode (buffer-list)) + (omnisharp-stop-server))) + (add-hook! csharp-mode (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) + (set! :company-backend 'csharp-mode '(company-omnisharp)) (set! :lookup 'csharp-mode From 68e735938b62abe8efb6eea9cddf663970597871 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 17:29:03 -0500 Subject: [PATCH 0369/4235] core-keybinds: remove redundant quotes --- core/core-keybinds.el | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 77bd2175f..b8c83e8c9 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -134,18 +134,18 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See ;; Register keywords for proper indentation (see `map!') -(put ':after 'lisp-indent-function 'defun) -(put ':desc 'lisp-indent-function 'defun) -(put ':leader 'lisp-indent-function 'defun) -(put ':local 'lisp-indent-function 'defun) -(put ':localleader 'lisp-indent-function 'defun) -(put ':map 'lisp-indent-function 'defun) -(put ':map* 'lisp-indent-function 'defun) -(put ':mode 'lisp-indent-function 'defun) -(put ':prefix 'lisp-indent-function 'defun) -(put ':textobj 'lisp-indent-function 'defun) -(put ':unless 'lisp-indent-function 'defun) -(put ':when 'lisp-indent-function 'defun) +(put :after 'lisp-indent-function 'defun) +(put :desc 'lisp-indent-function 'defun) +(put :leader 'lisp-indent-function 'defun) +(put :local 'lisp-indent-function 'defun) +(put :localleader 'lisp-indent-function 'defun) +(put :map 'lisp-indent-function 'defun) +(put :map* 'lisp-indent-function 'defun) +(put :mode 'lisp-indent-function 'defun) +(put :prefix 'lisp-indent-function 'defun) +(put :textobj 'lisp-indent-function 'defun) +(put :unless 'lisp-indent-function 'defun) +(put :when 'lisp-indent-function 'defun) ;; specials (defvar doom--keymaps nil) From c2635d53db1b2ced0c4b7c101c10cde1004759e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 17:30:16 -0500 Subject: [PATCH 0370/4235] private/default: add prefix arg to def-{find-in|browse-in}! macros --- modules/private/default/autoload/default.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/private/default/autoload/default.el b/modules/private/default/autoload/default.el index d51e8ebbd..d1656dfec 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) - (let ((prefix (cdr (doom-module-from-path (or load-file-name byte-compile-current-file))))) +(defmacro +default--def-browse-in! (name dir &optional prefix) + (let ((prefix (or 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 (or load-file-name byte-compile-current-file))))) +(defmacro +default--def-find-in! (name dir &optional prefix) + (let ((prefix (or 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)))) @@ -25,6 +25,7 @@ ;;;###autoload (autoload '+default/browse-project "private/default/autoload/default" nil t) (+default--def-browse-in! project (doom-project-root)) +;; NOTE No need for find-in-project, use `projectile-find-file' ;;;###autoload (autoload '+default/find-in-templates "private/default/autoload/default" nil t) (+default--def-find-in! templates +file-templates-dir) From cee8baf1eeab0f395a66a368bef489d0b8788349 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 17:31:09 -0500 Subject: [PATCH 0371/4235] private/default: remove vestigial {find-in,browse}-dotfiles keybinds #403 These have been moved to my private module: https://github.com/hlissner/doom-emacs-private --- modules/private/default/+bindings.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 4e813f82e..5dea47f79 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -176,8 +176,6 @@ :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 From 7d9f2e50787ebac11d58978fff5d954ed553ce71 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 17:53:05 -0500 Subject: [PATCH 0372/4235] New doom/toggle-debug-mode command --- core/autoload/debug.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 383c7dfb3..c0720c740 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -158,3 +158,9 @@ markdown and copies it to your clipboard, ready to be pasted into bug reports!" exec-path))) (kill-new str) (message "Done! Copied to your clipboard"))) + +;;;###autoload +(defun doom/toggle-debug-mode () + (interactive) + (setq doom-debug-mode (not doom-debug-mode)) + (toggle-debug-on-error)) From 7e87ab3e29508dbabedd640ae741d78fe09e2eb7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 4 Feb 2018 17:53:20 -0500 Subject: [PATCH 0373/4235] New warn! macro; replace debug! with log! macro --- core/autoload/message.el | 26 ++++++++++++++++++++------ core/autoload/packages.el | 2 +- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index d84d40a92..0284d1f5f 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -69,12 +69,6 @@ interactive session." (pop-to-buffer buf) (goto-char (point-max))))) -;;;###autoload -(defmacro debug! (message &rest args) - "Out a debug message if `doom-debug-mode' is non-nil. Otherwise, ignore this." - (when doom-debug-mode - `(message ,message ,@args))) - ;;;###autoload (defun doom-ansi-apply (code format &rest args) (let ((rule (or (assq code doom-message-fg) @@ -85,3 +79,23 @@ interactive session." (apply #'format format args) 0))) +;;;###autoload +(defmacro warn! (message &rest args) + "Output a colored warning for the current module in the *Messages* buffer." + (let ((msg (format "WARNING: %s" (format message args)))) + (if (file-in-directory-p load-file-name doom-modules-dir) + `(cl-destructuring-bind (cat . mod) (doom-module-from-path load-file-name) + (message + "%s" + (propertize (format "%s %s" (list cat mod) ,msg) + 'face 'warning))) + `(message "%s" (propertize ,msg 'face 'warning))))) + +;;;###autoload +(defmacro log! (message &rest args) + "Output a debug message if `doom-debug-mode' is non-nil. Otherwise, ignore this." + (when doom-debug-mode + `(message + "LOG: %s" + (propertize (format ,message ,@args) + 'face 'font-lock-comment-face)))) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index ad65dbf25..e1dad42ed 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -154,7 +154,7 @@ Used by `doom//packages-update'." ;; asynchronously. (let (futures) (dolist (pkg quelpa-pkgs) - (debug! "New thread for: %s" pkg) + (log! "New thread for: %s" pkg) (push (async-start `(lambda () (setq user-emacs-directory ,user-emacs-directory) From 0a655e4f522bc75048a4bc49c3489e58d6901339 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Mon, 5 Feb 2018 10:32:18 +0800 Subject: [PATCH 0374/4235] Add: +skim as pdf viewer --- modules/lang/latex/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 2f6690c8b..21f085df2 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -101,6 +101,14 @@ (add-to-list 'TeX-view-program-selection '(output-pdf "Okular")))) +(after! latex + (when (featurep! +skim) + (add-to-list 'TeX-view-program-list + '("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) + (add-to-list 'TeX-view-program-selection + '(output-pdf "Skim")))) + + (def-package! preview ;; The preview package is currently broken with the latest AUCTeX version ("11.90.2.2017-07-25) ;; ... and Ghostscript 9.22. It's now fixed in AUCTeX master, so we just have to wait. From 31e2968d54aff2df74dd304b9d9e30a6959b0998 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Tue, 6 Feb 2018 02:18:49 +0800 Subject: [PATCH 0375/4235] Add: ESS module --- modules/lang/ess/README.org | 52 ++++++++++++++++++++++ modules/lang/ess/autoloads.el | 6 +++ modules/lang/ess/config.el | 81 +++++++++++++++++++++++++++++++++++ modules/lang/ess/packages.el | 3 ++ 4 files changed, 142 insertions(+) create mode 100644 modules/lang/ess/README.org create mode 100644 modules/lang/ess/autoloads.el create mode 100644 modules/lang/ess/config.el create mode 100644 modules/lang/ess/packages.el diff --git a/modules/lang/ess/README.org b/modules/lang/ess/README.org new file mode 100644 index 000000000..1ead01c4a --- /dev/null +++ b/modules/lang/ess/README.org @@ -0,0 +1,52 @@ +* map! +:PROPERTIES: +:ID: E27AED84-4D2D-4F67-B9D9-6A26026D4C65 +:END: +** :map ess-doc-map +:PROPERTIES: +:ID: 23857C0C-25BC-4DBA-8360-E2CAB2F98135 +:END: +| key | command | +|-----+----------------------------| +| "h" | ess-display-help-on-object | +| "p" | ess-R-dv-pprint | +| "t" | ess-R-dv-ctable | +** :map ess-mode-map +:PROPERTIES: +:ID: A5EA8086-C7BF-41BB-BFC4-9D8CC9A79163 +:END: +| key | command | +|--------------+-----------------------| +| "" | ess-eval-line | +| "" | comint-next-input | +| "" | comint-previous-input | +*** :localleader +:PROPERTIES: +:ID: 7F84D0BD-2F1B-4F1D-92F6-5559A2D0741D +:END: +| state | key | command | +|-------+-------------+---------------------------------------------------| +| :nv | "," | ess-eval-region-or-function-or-paragraph-and-step | +| :n | "'" | R | +| :n | "" | ess-switch-to-inferior-or-script-buffer | +| :n | "" | ess-switch-process | +| :n | "B" | ess-eval-buffer-and-go | +| :n | "b" | ess-eval-buffer | +| :nv | "d" | ess-eval-region-or-line-and-step | +| :n | "D" | ess-eval-function-or-paragraph-and-step | +| :n | "L" | ess-eval-line-and-go | +| :n | "l" | ess-eval-line | +| :nv | "R" | ess-eval-region-and-go | +| :nv | "r" | ess-eval-region | +| :n | "F" | ess-eval-function-and-go | +| :n | "f" | ess-eval-function | +| :n | "h" | ess-doc-map | +| :n | "x" | ess-extra-map | +| :n | "p" | ess-r-package-dev-map | +| :n | "v" | ess-dev-map | +| :n | "cC" | ess-eval-chunk-and-go | +| :n | "cc" | ess-eval-chunk | +| :n | "cd" | ess-eval-chunk-and-step | +| :n | "cm" | ess-noweb-mark-chunk | +| :n | "cp" | ess-noweb-previous-chunk | +| :n | "cn" | ess-noweb-next-chunk | diff --git a/modules/lang/ess/autoloads.el b/modules/lang/ess/autoloads.el new file mode 100644 index 000000000..44bafc685 --- /dev/null +++ b/modules/lang/ess/autoloads.el @@ -0,0 +1,6 @@ +;;; private/r/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +r/repl () + "Open the R REPL." + (interactive) + (inferior-ess nil nil t)) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el new file mode 100644 index 000000000..3ee10e398 --- /dev/null +++ b/modules/lang/ess/config.el @@ -0,0 +1,81 @@ +;; ** ESS +(setq ess-path (car (file-expand-wildcards "~/.emacs.d/.local/packages/elpa/ess*/lisp"))) +(def-package! ess-site :load-path ess-path + :mode (("\\.sp\\'" . S-mode) + ("/R/.*\\.q\\'" . R-mode) + ("\\.[qsS]\\'" . S-mode) + ("\\.ssc\\'" . S-mode) + ("\\.SSC\\'" . S-mode) + ("\\.[rR]\\'" . R-mode) + ("\\.[rR]nw\\'" . Rnw-mode) + ("\\.[sS]nw\\'" . Snw-mode) + ("\\.[rR]profile\\'" . R-mode) + ("NAMESPACE\\'" . R-mode) + ("CITATION\\'" . R-mode) + ("\\.omg\\'" . omegahat-mode) + ("\\.hat\\'" . omegahat-mode) + ("\\.lsp\\'" . XLS-mode) + ("\\.do\\'" . STA-mode) + ("\\.ado\\'" . STA-mode) + ("\\.[Ss][Aa][Ss]\\'" . SAS-mode) + ("\\.jl\\'" . ess-julia-mode) + ("\\.[Ss]t\\'" . S-transcript-mode) + ("\\.Sout" . S-transcript-mode) + ("\\.[Rr]out" . R-transcript-mode) + ("\\.Rd\\'" . Rd-mode) + ("\\.[Bb][Uu][Gg]\\'" . ess-bugs-mode) + ("\\.[Bb][Oo][Gg]\\'" . ess-bugs-mode) + ("\\.[Bb][Mm][Dd]\\'" . ess-bugs-mode) + ("\\.[Jj][Aa][Gg]\\'" . ess-jags-mode) + ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) + ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) + :commands (R stata julia SAS) + :config + (setq ess-first-continued-statement-offset 2 + ess-continued-statement-offset 0 + ess-expression-offset 2 + ess-nuke-trailing-whitespace-p t + ess-default-style 'DEFAULT) + (ess-toggle-underscore t) + (set! :repl 'ess-mode #'+r/repl) + (map! + (:map ess-doc-map + "h" #'ess-display-help-on-object + "p" #'ess-R-dv-pprint + "t" #'ess-R-dv-ctable) + (:map ess-mode-map + "" #'ess-eval-line + "" #'comint-next-input + "" #'comint-previous-input + (:localleader + :nv "," #'ess-eval-region-or-function-or-paragraph-and-step + :n "'" #'R + :n "" #'ess-switch-to-inferior-or-script-buffer + :n "" #'ess-switch-process + :n ;; REPL + :n "B" #'ess-eval-buffer-and-go + :n "b" #'ess-eval-buffer + :nv "d" #'ess-eval-region-or-line-and-step + :n "D" #'ess-eval-function-or-paragraph-and-step + :n "L" #'ess-eval-line-and-go + :n "l" #'ess-eval-line + :nv "R" #'ess-eval-region-and-go + :nv "r" #'ess-eval-region + :n "F" #'ess-eval-function-and-go + :n "f" #'ess-eval-function + ;; predefined keymaps + :n "h" #'ess-doc-map + :n "x" #'ess-extra-map + :n "p" #'ess-r-package-dev-map + :n "v" #'ess-dev-map + ;; noweb + :n "cC" #'ess-eval-chunk-and-go + :n "cc" #'ess-eval-chunk + :n "cd" #'ess-eval-chunk-and-step + :n "cm" #'ess-noweb-mark-chunk + :n "cp" #'ess-noweb-previous-chunk + :n "cn" #'ess-noweb-next-chunk)))) + +(def-package! ess-smart-equals + :hook ((ess-mode . ess-smart-equals-mode) + (inferior-ess-mode . ess-smart-equals-mode))) diff --git a/modules/lang/ess/packages.el b/modules/lang/ess/packages.el new file mode 100644 index 000000000..5b8a3f3b0 --- /dev/null +++ b/modules/lang/ess/packages.el @@ -0,0 +1,3 @@ +(package! ess) +(package! ess-smart-equals) +(package! ess-R-data-view) From d3167dfc199c282500c52227f2da34b7f0c08edb Mon Sep 17 00:00:00 2001 From: xarthurx Date: Tue, 6 Feb 2018 01:07:36 +0100 Subject: [PATCH 0376/4235] add pdf-tools settings --- modules/tools/pdf/config.el | 27 +++++++++++++++++++++++++++ modules/tools/pdf/packages.el | 3 +++ 2 files changed, 30 insertions(+) create mode 100644 modules/tools/pdf/config.el create mode 100644 modules/tools/pdf/packages.el diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el new file mode 100644 index 000000000..469600e27 --- /dev/null +++ b/modules/tools/pdf/config.el @@ -0,0 +1,27 @@ +;;; tools/pdf/config.el -*- lexical-binding: t; -*- + +(def-package! pdf-tools + :init + (load "pdf-tools-autoloads.el" nil t t) + :config + (pdf-tools-install) + (setq-default pdf-view-display-size 'fit-page) + ;; turn off cua so copy works + (add-hook 'pdf-view-mode-hook (lambda () (cua-mode 0))) + ) + +(after! latex + (when (featurep! :lang latex) + ;; add to the program list + (add-to-list 'TeX-view-program-selection + '(output-pdf "PDF Tools")) + (add-to-list 'TeX-view-program-list + '("PDF Tools" ("TeX-pdf-tools-sync-view"))) + ;; enable document revert + (add-hook 'TeX-after-compilation-finished-functions + 'TeX-revert-document-buffer) + + ;; correlated mode + (setq TeX-source-correlate-start-server t) + (setq TeX-source-correlate-mode t) + )) diff --git a/modules/tools/pdf/packages.el b/modules/tools/pdf/packages.el new file mode 100644 index 000000000..59861d19b --- /dev/null +++ b/modules/tools/pdf/packages.el @@ -0,0 +1,3 @@ +;;; tools/pdf/packages.el -*- lexical-binding: t; -*- + +(package! pdf-tools) From 76640b39357db8d9b215051a60699adf8e6dc288 Mon Sep 17 00:00:00 2001 From: xarthurx Date: Tue, 6 Feb 2018 01:11:20 +0100 Subject: [PATCH 0377/4235] add pdf in init.example.el. --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 365ad6cc5..0bb4f79de 100644 --- a/init.example.el +++ b/init.example.el @@ -77,6 +77,7 @@ make ; run make tasks from Emacs neotree ; a project drawer, like NERDTree for vim password-store ; password manager for nerds + pdf ; pdf enhancements rotate-text ; cycle region at point between text candidates term ; terminals in Emacs tmux ; an API for interacting with tmux From 27255d891ec4bf874d75248a698828b471338074 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 00:35:37 -0500 Subject: [PATCH 0378/4235] feature/popup: fix 'unsupported map' error when disabling +popup-mode --- modules/feature/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index e186c2be5..e2d999a44 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -194,7 +194,7 @@ Uses `shrink-window-if-larger-than-buffer'." window--sides-inhibit-check nil) (+popup|cleanup-rules) (dolist (prop +popup-window-parameters) - (map-delete prop window-persistent-parameters))))) + (map-delete window-persistent-parameters prop))))) ;;;###autoload (define-minor-mode +popup-buffer-mode From 0780c16f92ec15e0a8c602734aa00d239c2319fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 02:00:31 -0500 Subject: [PATCH 0379/4235] lang/org: tie babel plugins to their respective lang modules --- modules/lang/org/packages.el | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 3bbc89053..b7ac6d24b 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -11,13 +11,19 @@ (package! org-download)) (when (featurep! +babel) - (package! ob-go) (package! ob-mongo) (package! ob-redis) - (package! ob-restclient) - (package! ob-rust) (package! ob-sql-mode) - (package! ob-translate)) + (package! ob-translate) + + (when (featurep! :lang go) + (package! ob-go)) + (when (featurep! :lang rust) + (package! ob-rust)) + (when (featurep! :lang restclient) + (package! ob-restclient)) + (when (featurep! :lang crystal) + (package! ob-crystal))) (when (featurep! +export) (package! ox-pandoc) From a2feac51b2ea62e11cb82c6da1a80a00bc2f5263 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 02:04:58 -0500 Subject: [PATCH 0380/4235] lang/crystal: add inf-crystal --- modules/lang/crystal/config.el | 4 ++++ modules/lang/crystal/packages.el | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index 61618d2bf..6148d0685 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -13,3 +13,7 @@ (def-package! flycheck-crystal :after crystal-mode :config (add-hook 'crystal-mode-hook #'flycheck-mode)) + + +(def-package! inf-crystal + :commands (inf-crystal crystal-switch-to-inf)) diff --git a/modules/lang/crystal/packages.el b/modules/lang/crystal/packages.el index d0fd6e985..e9fd0086b 100644 --- a/modules/lang/crystal/packages.el +++ b/modules/lang/crystal/packages.el @@ -3,4 +3,4 @@ (package! crystal-mode) (package! flycheck-crystal) - +(package! inf-crystal) From 1db29a951ea7421c01e12cc3a60f067f1359f6e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 13:50:26 -0500 Subject: [PATCH 0381/4235] feature/workspaces: fix counsel-projectile-switch-project actions --- .../feature/workspaces/autoload/workspaces.el | 22 +++++++++---------- modules/feature/workspaces/config.el | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index f2a814dc3..1b6ee329a 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -488,16 +488,7 @@ created." (setq +workspaces--project-dir default-directory)) ;;;###autoload -(defun +workspaces|switch-counsel-project-action (project) - "A `counsel-projectile-switch-project-action' that creates a dedicated -workspace for a new project, before prompting to open a file." - (when persp-mode - (let ((+workspaces--project-dir project) - (inhibit-message t)) - (+workspaces|switch-to-project)))) - -;;;###autoload -(defun +workspaces|switch-to-project () +(defun +workspaces|switch-to-project (&optional inhibit-prompt) "Creates a workspace dedicated to a new project. If one already exists, switch to it. Should be hooked to `projectile-after-switch-project-hook'." (when (and persp-mode +workspaces--project-dir) @@ -516,7 +507,8 @@ to it. Should be hooked to `projectile-after-switch-project-hook'." (+workspace-switch new-name) (unless persp-p (switch-to-buffer (doom-fallback-buffer))) - (doom-project-find-file +workspaces--project-dir) + (unless inhibit-prompt + (doom-project-find-file +workspaces--project-dir)) (+workspace-message (format "Switched to '%s' in new workspace" new-name) 'success))) @@ -527,6 +519,14 @@ to it. Should be hooked to `projectile-after-switch-project-hook'." ;; Advice ;; +;;;###autoload +(defun +workspaces*switch-counsel-project-action (project) + "A `counsel-projectile-switch-project-action' that creates a dedicated +workspace for a new project, before prompting to open a file." + (let ((+workspaces--project-dir project) + (inhibit-message t)) + (+workspaces|switch-to-project 'inhibit-prompt))) + ;;;###autoload (defun +workspaces*autosave-real-buffers (orig-fn &rest args) "Don't autosave if no real buffers are open." diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index a52246a13..330b9b2d6 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -98,8 +98,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) ;; per-project workspaces - (setq projectile-switch-project-action #'+workspaces|set-project-action - counsel-projectile-switch-project-action #'+workspaces|switch-counsel-project-action) + (setq projectile-switch-project-action #'+workspaces|set-project-action) + (advice-add #'counsel-projectile-switch-project-by-name :before #'+workspaces*switch-counsel-project-action) (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) ;; From be56af82bfb4df191c48dc33e2a9cbd4ea7ff196 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 14:04:29 -0500 Subject: [PATCH 0382/4235] private/default: SPC X = org-capture (prompts for template) #407 --- modules/private/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 5dea47f79..cf4fd153c 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -76,7 +76,7 @@ :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 + :desc "Org Capture" :nv "X" #'org-capture ;; Most commonly used :desc "Find file in project" :n "SPC" #'projectile-find-file From 4658d22bf79975eadaf17bcd48939502b4ee612a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 14:05:06 -0500 Subject: [PATCH 0383/4235] completion/ivy: remap org-capture to counsel-org-capture #407 --- modules/completion/ivy/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 218ab0d7e..e592cb37a 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -93,7 +93,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap yank-pop] #'counsel-yank-pop [remap info-lookup-symbol] #'counsel-info-lookup-symbol [remap imenu] #'counsel-imenu - [remap recentf-open-files] #'counsel-recentf) + [remap recentf-open-files] #'counsel-recentf + [remap org-capture] #'counsel-org-capture) :config (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) From 508dbf7a5c64a362d8b5c217678b1c0f7eabdbc8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 17:30:03 -0500 Subject: [PATCH 0384/4235] Revise docstrings for doom-project-{root,p} --- core/core-projects.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 75b7ff91a..7a664bcc9 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -68,16 +68,16 @@ you want to interactive with a project other than the one you're in." (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) (defun doom-project-p (&optional nocache) - "Whether or not this buffer is currently in a project or not." + "Return t if this buffer is currently in a project. +If NOCACHE, don't fetch a cached answer." (if nocache (without-project-cache! (doom-project-p nil)) (let ((projectile-require-project-root t)) (projectile-project-p)))) (defun doom-project-root (&optional nocache) - "Get the path to the root of your project. -If STRICT-P, return nil if no project was found, otherwise return -`default-directory'." + "Returns the root of your project, or `default-directory' if none was found. +If NOCACHE, don't fetch a cached answer." (if nocache (without-project-cache! (doom-project-root nil)) (let (projectile-require-project-root) From f28a89f7011eb24220bd0cb77e9eef71b482de54 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 17:30:16 -0500 Subject: [PATCH 0385/4235] Add doom-project-name function --- core/core-projects.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/core-projects.el b/core/core-projects.el index 7a664bcc9..e598c241c 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -75,6 +75,13 @@ If NOCACHE, don't fetch a cached answer." (let ((projectile-require-project-root t)) (projectile-project-p)))) +(defun doom-project-name (&optional nocache) + "Return the name of the current project. +If NOCACHE, don't fetch a cached answer." + (if nocache + (without-project-cache! (doom-project-name nil)) + (projectile-project-name))) + (defun doom-project-root (&optional nocache) "Returns the root of your project, or `default-directory' if none was found. If NOCACHE, don't fetch a cached answer." From dce496e246a51153f5c88341a5c38275eed8b55c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 17:30:38 -0500 Subject: [PATCH 0386/4235] Change doom-project-p to return a boolean --- core/core-projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index e598c241c..3f2bec85c 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -73,7 +73,7 @@ If NOCACHE, don't fetch a cached answer." (if nocache (without-project-cache! (doom-project-p nil)) (let ((projectile-require-project-root t)) - (projectile-project-p)))) + (and (projectile-project-p) t)))) (defun doom-project-name (&optional nocache) "Return the name of the current project. From 68a4c850881fcd53f6f8449b9b8cb9e3047e352b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Feb 2018 17:49:51 -0500 Subject: [PATCH 0387/4235] feature/workspaces: have switch-project recycle empty workspaces If you're in an empty workspace, reuse it, rather than spawning a new one. This lets you create a new workspace *then* switch project. --- .../feature/workspaces/autoload/workspaces.el | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 1b6ee329a..8d71d4f2f 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -490,28 +490,33 @@ created." ;;;###autoload (defun +workspaces|switch-to-project (&optional inhibit-prompt) "Creates a workspace dedicated to a new project. If one already exists, switch -to it. Should be hooked to `projectile-after-switch-project-hook'." +to it. If in the main workspace and it's empty, recycle that workspace, without +renaming it. + +Should be hooked to `projectile-after-switch-project-hook'." (when (and persp-mode +workspaces--project-dir) (unwind-protect - (let (persp-p) - (let* ((persp - (let* ((default-directory +workspaces--project-dir) - projectile-project-name - projectile-require-project-root - projectile-cached-buffer-file-name - projectile-cached-project-root - (project-name (projectile-project-name))) - (or (setq persp-p (+workspace-get project-name t)) - (+workspace-new project-name)))) - (new-name (persp-name persp))) - (+workspace-switch new-name) - (unless persp-p - (switch-to-buffer (doom-fallback-buffer))) - (unless inhibit-prompt - (doom-project-find-file +workspaces--project-dir)) - (+workspace-message - (format "Switched to '%s' in new workspace" new-name) - 'success))) + (if (+workspace-buffer-list) + (let (persp-p) + (let* ((persp + (let* ((default-directory +workspaces--project-dir) + (project-name (doom-project-name 'nocache))) + (or (setq persp-p (+workspace-get project-name t)) + (+workspace-new project-name)))) + (new-name (persp-name persp))) + (+workspace-switch new-name) + (unless persp-p + (switch-to-buffer (doom-fallback-buffer))) + (unless inhibit-prompt + (doom-project-find-file +workspaces--project-dir)) + (+workspace-message + (format "Switched to '%s' in new workspace" new-name) + 'success))) + (with-current-buffer (switch-to-buffer (doom-fallback-buffer)) + (setq default-directory +workspaces--project-dir) + (message "Switched to '%s'" (doom-project-name 'nocache))) + (unless inhibit-prompt + (doom-project-find-file +workspaces--project-dir))) (setq +workspaces--project-dir nil)))) From 69dc25ae4cb4fbed612a62cb3d80787103663a47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 01:04:29 -0500 Subject: [PATCH 0388/4235] lang/org: fix external org-capture workflow + Fix frame-spawning when calling bin/org-capture + Integrate counsel-org-capture into bin/org-capture workflow + Ensure frame is closed if counsel-org-capture is cancelled + Ensure org-capture buffer closes the associated frame + Add transient frame property for org-capture frames If you are using a tiling window manager, you'll need to add a rule for a window named "org-capture" in order to make a floating window. --- bin/org-capture | 2 +- modules/lang/org/autoload/org-capture.el | 54 +++++++++++++++--------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/bin/org-capture b/bin/org-capture index 7f2998481..507b02faa 100755 --- a/bin/org-capture +++ b/bin/org-capture @@ -33,7 +33,7 @@ shift $((OPTIND-1)) if [[ $daemon ]]; then emacsclient -a "" \ - -c -F '((name . "org-capture") (width . 70) (height . 25))' \ + -c -F '((name . "org-capture") (width . 70) (height . 25) (transient . t))' \ -e "(+org-capture/open-frame \"$str\" ${key:-nil})" else # Non-daemon servers flicker a lot if frames are created from terminal, so diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index bd7dce4d4..6edabe44e 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -34,6 +34,7 @@ Uses the capture template specified by KEY. Otherwise, prompts you for one." `((name . "org-capture") (width . 70) (height . 25) + (transient . t) (window-system . ,(cond (IS-MAC 'ns) (IS-LINUX 'x) (t 'w32))) @@ -50,31 +51,46 @@ Uses the capture template specified by KEY. Otherwise, prompts you for one." (defun +org-capture-frame-p (&rest _) "Return t if the current frame is an org-capture frame opened by `+org-capture/open-frame'." - (equal "org-capture" (frame-parameter nil 'name))) + (and (equal "org-capture" (frame-parameter nil 'name)) + (frame-parameter nil 'transient))) ;;;###autoload (defun +org-capture/open-frame (&optional string key) "Opens the org-capture window in a floating frame that cleans itself up once you're done. This can be called from an external shell script." (interactive) - (require 'org) - (let (after-make-frame-functions before-make-frame-hook) - (let ((frame (if (+org-capture-frame-p) - (selected-frame) - (make-frame +org-capture-window-params)))) - (with-selected-frame frame - (condition-case ex - (cl-letf (((symbol-function #'pop-to-buffer) - (symbol-function #'switch-to-buffer))) - (if (and (stringp string) - (not (string-empty-p string))) - (org-capture-string string key) - (org-capture nil key)) - (when (featurep 'solaire-mode) - (solaire-mode +1))) - ('error - (message "org-capture: %s" (error-message-string ex)) - (delete-frame frame))))))) + (when (and string (string-empty-p string)) + (setq string nil)) + (when (and key (string-empty-p key)) + (setq key nil)) + (require 'org-capture) + (let ((frame (if (+org-capture-frame-p) + (selected-frame) + (make-frame +org-capture-window-params)))) + (with-selected-frame frame + (condition-case ex + (cl-letf (((symbol-function #'pop-to-buffer) + (symbol-function #'switch-to-buffer))) + (switch-to-buffer (doom-fallback-buffer)) + (let ((org-capture-initial string) + (org-capture-mode-hook org-capture-mode-hook) + org-capture-entry) + (when (and key (not (string-empty-p key))) + (setq org-capture-entry (org-capture-select-template key))) + (if (or org-capture-entry + (not (fboundp 'counsel-org-capture))) + (org-capture) + (unwind-protect + (counsel-org-capture) + (if-let* ((buf (cl-loop for buf in (buffer-list) + if (buffer-local-value 'org-capture-mode buf) + return buf))) + (with-current-buffer buf + (add-hook 'kill-buffer-hook #'+org-capture|cleanup-frame nil t)) + (delete-frame frame)))))) + ('error + (message "org-capture: %s" (error-message-string ex)) + (delete-frame frame)))))) ;;;###autoload (defun +org-capture-available-keys () From 4ca2d1ef27840d1cad8df1bf8e01334eb0e9b60b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 01:09:32 -0500 Subject: [PATCH 0389/4235] feature/popup: fix vslot reference typo --- modules/feature/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index e2d999a44..2f116c535 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -525,7 +525,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set ((not (numberp slot)) (error "Invalid slot %s specified" slot)) ((not (numberp vslot)) - (error "Invalid vslot %s specified" slot))) + (error "Invalid vslot %s specified" vslot))) (let* ((major (get-window-with-predicate (lambda (window) From bd6fb35007bb9424b24fab15b7bdd11ac5cba9d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 01:36:16 -0500 Subject: [PATCH 0390/4235] ui/doom: turn-on-solaire-mode on org-capture-mode-hook --- modules/ui/doom/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 139328fba..045edfdb8 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -27,7 +27,11 @@ :config (setq solaire-mode-real-buffer-fn #'doom-real-buffer-p) ;; Prevent color glitches when reloading either DOOM or the theme - (add-hook! '(doom-init-theme-hook doom-reload-hook) #'solaire-mode-reset)) + (add-hook! '(doom-init-theme-hook doom-reload-hook) + #'solaire-mode-reset) + ;; org-capture takes an org buffer and narrows it. The result is erroneously + ;; considered an unreal buffer, so solaire-mode must be restored. + (add-hook 'org-capture-mode-hook #'turn-on-solaire-mode)) (after! hideshow From 63924df63982935d62d4cb7a411c3b3c6c8532a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 01:36:40 -0500 Subject: [PATCH 0391/4235] private/default: bind M-q => evil-quit-all --- modules/private/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index cf4fd153c..d03f58a6b 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -55,7 +55,7 @@ :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-q" (if (daemonp) #'delete-frame #'evil-quit-all) :ne "M-f" #'swiper :n "M-s" #'save-buffer :m "A-j" #'+default:multi-next-line From 9b41423537203ca728af7b857dc49c473b9ba7a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 02:27:06 -0500 Subject: [PATCH 0392/4235] feature/version-control: fix git-timemachine headerline On first invokation of git-timemachine the headerline isn't visible until you jump to another revision. This fix ensures it's visible from the start. --- modules/feature/version-control/+git.el | 5 ++- modules/feature/version-control/autoload.el | 39 ++++++++------------- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 244047b10..d8e3b6504 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -69,9 +69,8 @@ ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of ;; showing revision details in the minibuffer, show them in ;; `header-line-format', which has better visibility. - (setq git-timemachine-show-minibuffer-details nil) - (add-hook 'git-timemachine-mode-hook #'+vcs|init-header-line) - (advice-add #'git-timemachine-show-revision :after #'+vcs*update-header-line) + (setq git-timemachine-show-minibuffer-details t) + (advice-add #'git-timemachine--show-minibuffer-details :override #'+vcs*update-header-line) ;; Force evil to rehash keybindings for the current state (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state)) diff --git a/modules/feature/version-control/autoload.el b/modules/feature/version-control/autoload.el index 6df86c3d0..e3f9a4cf4 100644 --- a/modules/feature/version-control/autoload.el +++ b/modules/feature/version-control/autoload.el @@ -32,12 +32,20 @@ repository root." (user-error "No git root found!"))) ;;;###autoload -(defun +vcs|init-header-line () - "Toggle the git-timemachine header-line on activate. Use this on -`git-timemachine-mode-hook'." - (if git-timemachine-mode - (+vcs*update-header-line) - (setq-local header-line-format nil))) +(defun +vcs*update-header-line (revision) + "Show revision details in the header-line, instead of the minibuffer. + +Sometimes I forget `git-timemachine' is enabled in a buffer. Putting revision +info in the `header-line-format' is a good indication." + (let* ((date-relative (nth 3 revision)) + (date-full (nth 4 revision)) + (author (if git-timemachine-show-author (concat (nth 6 revision) ": ") "")) + (sha-or-subject (if (eq git-timemachine-minibuffer-detail 'commit) (car revision) (nth 5 revision)))) + (setq header-line-format + (format "%s%s [%s (%s)]" + (propertize author 'face 'git-timemachine-minibuffer-author-face) + (propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) + date-full date-relative)))) ;;;###autoload (defun +vcs|enable-smerge-mode-maybe () @@ -49,22 +57,3 @@ repository root." (when (and (featurep 'hydra) +vcs-auto-hydra-smerge) (+hydra-smerge/body))))) - -;;;###autoload -(defun +vcs*update-header-line (&rest _) - "Show revision details in the header-line, instead of the minibuffer. - -Sometimes I forget `git-timemachine' is enabled in a buffer. Putting info into, -putting them in `header-line-format' has better visibility." - (when (and git-timemachine-mode git-timemachine-revision) - (let* ((revision git-timemachine-revision) - (date-relative (nth 3 revision)) - (date-full (nth 4 revision)) - (author (if git-timemachine-show-author (concat (nth 6 revision) ": ") "")) - (sha-or-subject (if (eq git-timemachine-minibuffer-detail 'commit) (car revision) (nth 5 revision)))) - (setq-local - header-line-format - (format "%s%s [%s (%s)]" - (propertize author 'face 'git-timemachine-minibuffer-author-face) - (propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) - date-full date-relative))))) From 210a80a74f8df59db19a4fa76d92f7115d0ea6cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 14:47:33 -0500 Subject: [PATCH 0393/4235] completion/ivy: add counsel-org-capture autoload #412 --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e592cb37a..2c439a53a 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -80,7 +80,7 @@ immediately runs it on the current candidate (ending the ivy session)." counsel-describe-face counsel-M-x counsel-file-jump counsel-find-file counsel-find-library counsel-info-lookup-symbol counsel-imenu counsel-recentf counsel-yank-pop - counsel-descbinds) + counsel-descbinds counsel-org-capture) :init (map! [remap apropos] #'counsel-apropos [remap bookmark-jump] #'counsel-bookmark From f35a49dc7eadcd262e3c2cee69dfbbe060047480 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Feb 2018 19:27:41 -0500 Subject: [PATCH 0394/4235] feature/workspaces: redefine +workspace/kill-session-and-quit --- modules/feature/workspaces/autoload/workspaces.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8d71d4f2f..228f0467d 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -289,6 +289,13 @@ workspace to delete." (switch-to-buffer (doom-fallback-buffer)) (doom/cleanup-session)) +;;;###autoload +(defun +workspace/kill-session-and-quit () + "Kill emacs without saving anything." + (interactive) + (let ((persp-auto-save-opt 0)) + (kill-emacs))) + ;;;###autoload (defun +workspace/new (&optional name clone-p) "Create a new workspace named NAME. If CLONE-P is non-nil, clone the current From 33553784805b0a543eb92ccaef68c560a229be4d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 8 Feb 2018 02:15:41 -0500 Subject: [PATCH 0395/4235] Fix doom//reload-load-path infinite recursion with daemon emacs --- core/core-packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 53e6354bf..be58198db 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -522,10 +522,10 @@ happen if you manually modify/update/install packages from outside Emacs, while an Emacs session is running. This isn't necessary if you use Doom's package management commands because they -call `doom/reload-load-path' remotely (through emacsclient)." +call `doom//reload-load-path' remotely (through emacsclient)." (interactive) (byte-recompile-file (expand-file-name "core.el" doom-core-dir) t) - (cond (noninteractive + (cond ((and noninteractive (not (daemonp))) (require 'server) (when (server-running-p) (message "Reloading active Emacs session...") From 741612a96521a45c1a18043bacba01f0fa0f6a31 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 8 Feb 2018 16:08:04 -0500 Subject: [PATCH 0396/4235] lang/web: fix wrong-number-of-args error in +css/toggle-inline-org-block --- modules/lang/web/autoload/css.el | 41 ++++++++++++++++---------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el index 608f6d2ec..0888b858d 100644 --- a/modules/lang/web/autoload/css.el +++ b/modules/lang/web/autoload/css.el @@ -11,23 +11,24 @@ "Toggles between a bracketed block and inline block." (interactive) ;; TODO Remove evil dependency - (save-excursion - (cl-destructuring-bind (beg end) - (or (ignore-errors (evil-a-curly)) - (user-error "No block found")) - (if (= (line-number-at-pos beg) (line-number-at-pos end)) - (save-excursion - (goto-char (1+ beg)) (insert "\n") - (unless (string-match ";[\s\t]*}$" (buffer-substring-no-properties beg (1+ end))) - (goto-char end) (insert "\n")) - (while (re-search-forward ";[\s\t]*" (1+ end) t) - (replace-match ";\n" t t)) - (setq end (cadr (evil-a-curly))) - (evil-indent beg end) - (delete-trailing-whitespace beg end)) - (goto-char beg) - (evil-join beg end) - (goto-char (1+ beg)) - (just-one-space) - (goto-char (cadr (evil-inner-curly))) - (just-one-space))))) + (let ((inhibit-modification-hooks t)) + (save-excursion + (cl-destructuring-bind (beg end &rest _) + (or (ignore-errors (evil-a-curly)) + (user-error "No block found")) + (if (= (line-number-at-pos beg) (line-number-at-pos end)) + (progn + (goto-char (1+ beg)) (insert "\n") + (unless (string-match ";[\s\t]*}$" (buffer-substring-no-properties beg (1+ end))) + (goto-char end) (insert "\n")) + (while (re-search-forward ";[\s\t]*" (1+ end) t) + (replace-match ";\n" t t)) + (setq end (cadr (evil-a-curly))) + (evil-indent beg end) + (delete-trailing-whitespace beg end)) + (goto-char beg) + (evil-join beg end) + (goto-char (1+ beg)) + (just-one-space) + (goto-char (cadr (evil-inner-curly))) + (just-one-space)))))) From 422c6d9c12e07114ad4406310c0fa9eaff6e7f26 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 8 Feb 2018 18:56:49 -0500 Subject: [PATCH 0397/4235] lang/javascript: js-chain-indent = t --- modules/lang/javascript/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index f3c70e186..923aa6704 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -6,7 +6,8 @@ :config (setq js2-skip-preprocessor-directives t js2-highlight-external-variables nil - js2-mode-show-parse-errors nil) + js2-mode-show-parse-errors nil + js-chain-indent t) (add-hook! 'js2-mode-hook #'(flycheck-mode highlight-indentation-mode rainbow-delimiters-mode)) From 0d04afa63a80c7d2b15bb2a09be5c524c740f7c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 9 Feb 2018 17:59:31 -0500 Subject: [PATCH 0398/4235] lang/org: don't complain about missing ob-X upon running src blocks --- modules/lang/org/+babel.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index d29c18a59..816f661ea 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -25,7 +25,8 @@ libraries (ob-*.el) that don't match the name of the language.") (require (intern (format "ob-%s" (or (cdr (assoc (downcase language) +org-babel-mode-alist)) - language))))) + language))) + nil t)) (add-to-list 'org-babel-load-languages (cons lang-sym t))) (apply orig-fn args))) (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) From 39f519cdb8bbad260942d73c09a377fab2fb31b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 9 Feb 2018 18:10:01 -0500 Subject: [PATCH 0399/4235] lang/org: use link abbrev for relative image attachment paths --- modules/lang/org/+attach.el | 5 ++-- modules/lang/org/autoload/org-attach.el | 33 +++++++++---------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 0d31e3b91..2a12ca509 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -42,9 +42,6 @@ (cond ((executable-find "maim") "maim -s %s") ((executable-find "scrot") "scrot -s %s"))))) - ;; Ensure that relative inline image paths are relative to the attachment folder. - (advice-add #'org-display-inline-images :around #'+org-attach*relative-to-attach-dir) - ;; Handle non-image files a little differently. Images should be inserted ;; as-is, as image previews. Other files, like pdfs or zips, should be linked ;; to, with an icon indicating the type of file. @@ -64,6 +61,8 @@ ;; (defun +org|init-attach () (setq org-attach-directory (expand-file-name +org-attach-dir +org-dir)) + ;; A shorter link to attachments + (push (cons "attach" (abbreviate-file-name org-attach-directory)) org-link-abbrev-alist) (push (car (last (split-string +org-attach-dir "/" t))) projectile-globally-ignored-directories) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index 2a493bcfe..f9a8e3426 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -93,22 +93,25 @@ the cursor." ;;;###autoload (defun +org-attach*insert-link (_link filename) - "TODO" + "Produces and inserts a link to FILENAME into the document. + +If FILENAME is an image, produce an attach:%s path, otherwise use file:%s (with +an file icon produced by `+org-attach--icon')." (if (looking-back "^[ \t]+" (line-beginning-position)) (delete-region (match-beginning 0) (match-end 0)) (newline)) (cond ((image-type-from-file-name filename) - (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) - "" + (concat (if (= org-download-image-html-width 0) "" (format "#+attr_html: :width %dpx\n" org-download-image-html-width)) - (if (= org-download-image-latex-width 0) - "" + (if (= org-download-image-latex-width 0) "" (format "#+attr_latex: :width %dcm\n" org-download-image-latex-width)) - (format org-download-link-format - (file-relative-name filename (file-name-directory buffer-file-name))))) + (cond ((file-in-directory-p filename org-attach-directory) + (format "[[attach:%s]]" (file-relative-name filename org-attach-directory))) + ((file-in-directory-p filename +org-dir) + (format org-download-link-format (file-relative-name filename +org-dir))) + (t + (format org-download-link-format filename))))) (org-display-inline-images)) (t (insert @@ -117,15 +120,3 @@ the cursor." (file-relative-name filename (file-name-directory buffer-file-name)) (file-name-nondirectory (directory-file-name filename))))))) -;;;###autoload -(defun +org-attach*relative-to-attach-dir (orig-fn &rest args) - "TODO" - (if (file-in-directory-p buffer-file-name +org-dir) - (let* ((context (save-match-data (org-element-context))) - (file (org-link-unescape (org-element-property :path context))) - (default-directory - (if (file-in-directory-p file org-attach-directory) - +org-dir - default-directory))) - (apply orig-fn args)) - (apply orig-fn args))) From 04a04b25354d3e6279b4bf5c30e43fa76e9a2135 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 9 Feb 2018 18:10:41 -0500 Subject: [PATCH 0400/4235] lang/org: remove vestigial +org-attach*link-format function --- modules/lang/org/autoload/org-attach.el | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index f9a8e3426..2d6e01490 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -84,13 +84,6 @@ the cursor." (copy-alist dnd-protocol-alist)))) (dnd-handle-one-url nil action uri)))) -;;;###autoload -(defun +org-attach*link-format (filename &optional ext) - (format "%s%s.%s" - (file-name-sans-extension filename) - (format-time-string org-download-timestamp) - (or ext (file-name-extension filename)))) - ;;;###autoload (defun +org-attach*insert-link (_link filename) "Produces and inserts a link to FILENAME into the document. From eb685d7cc49c07d6f9b9ad57218af77640998c54 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 00:32:00 -0500 Subject: [PATCH 0401/4235] tools/pdf: conform to code conventions; no-byte-compile packages.el --- modules/tools/pdf/config.el | 19 +++++++++---------- modules/tools/pdf/packages.el | 3 ++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 469600e27..4a2ea7f62 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -1,27 +1,26 @@ ;;; tools/pdf/config.el -*- lexical-binding: t; -*- (def-package! pdf-tools - :init - (load "pdf-tools-autoloads.el" nil t t) + :init (load "pdf-tools-autoloads.el" nil t t) :config (pdf-tools-install) (setq-default pdf-view-display-size 'fit-page) ;; turn off cua so copy works - (add-hook 'pdf-view-mode-hook (lambda () (cua-mode 0))) - ) + (add-hook! 'pdf-view-mode-hook (cua-mode 0))) -(after! latex - (when (featurep! :lang latex) + +(when (featurep! :lang latex) + (after! latex ;; add to the program list (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) (add-to-list 'TeX-view-program-list '("PDF Tools" ("TeX-pdf-tools-sync-view"))) + ;; enable document revert (add-hook 'TeX-after-compilation-finished-functions - 'TeX-revert-document-buffer) + #'TeX-revert-document-buffer) ;; correlated mode - (setq TeX-source-correlate-start-server t) - (setq TeX-source-correlate-mode t) - )) + (setq TeX-source-correlate-start-server t + TeX-source-correlate-mode t))) diff --git a/modules/tools/pdf/packages.el b/modules/tools/pdf/packages.el index 59861d19b..59dae0cdd 100644 --- a/modules/tools/pdf/packages.el +++ b/modules/tools/pdf/packages.el @@ -1,3 +1,4 @@ -;;; tools/pdf/packages.el -*- lexical-binding: t; -*- +;; -*- no-byte-compile: t; -*- +;;; tools/pdf/packages.el (package! pdf-tools) From 8796a7407ae2778744b4ef3805f059918aeacab8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 02:11:42 -0500 Subject: [PATCH 0402/4235] lang/ess: conform to code conventions; no-byte-compile packages.el --- modules/lang/ess/config.el | 86 +++++++++++++++++++----------------- modules/lang/ess/packages.el | 3 ++ 2 files changed, 48 insertions(+), 41 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 3ee10e398..47a612082 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -1,6 +1,7 @@ -;; ** ESS -(setq ess-path (car (file-expand-wildcards "~/.emacs.d/.local/packages/elpa/ess*/lisp"))) -(def-package! ess-site :load-path ess-path +;;; lang/ess/config.el -*- lexical-binding: t; -*- + +(def-package! ess-site + :init (load "ess-autoloads" nil t) :mode (("\\.sp\\'" . S-mode) ("/R/.*\\.q\\'" . R-mode) ("\\.[qsS]\\'" . S-mode) @@ -18,7 +19,6 @@ ("\\.do\\'" . STA-mode) ("\\.ado\\'" . STA-mode) ("\\.[Ss][Aa][Ss]\\'" . SAS-mode) - ("\\.jl\\'" . ess-julia-mode) ("\\.[Ss]t\\'" . S-transcript-mode) ("\\.Sout" . S-transcript-mode) ("\\.[Rr]out" . R-transcript-mode) @@ -30,6 +30,9 @@ ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) :commands (R stata julia SAS) + :init + (unless (featurep! :lang julia) + (push (cons "\\.jl\\'" 'ess-julia-mode) auto-mode-alist)) :config (setq ess-first-continued-statement-offset 2 ess-continued-statement-offset 0 @@ -38,43 +41,44 @@ ess-default-style 'DEFAULT) (ess-toggle-underscore t) (set! :repl 'ess-mode #'+r/repl) - (map! - (:map ess-doc-map - "h" #'ess-display-help-on-object - "p" #'ess-R-dv-pprint - "t" #'ess-R-dv-ctable) - (:map ess-mode-map - "" #'ess-eval-line - "" #'comint-next-input - "" #'comint-previous-input - (:localleader - :nv "," #'ess-eval-region-or-function-or-paragraph-and-step - :n "'" #'R - :n "" #'ess-switch-to-inferior-or-script-buffer - :n "" #'ess-switch-process - :n ;; REPL - :n "B" #'ess-eval-buffer-and-go - :n "b" #'ess-eval-buffer - :nv "d" #'ess-eval-region-or-line-and-step - :n "D" #'ess-eval-function-or-paragraph-and-step - :n "L" #'ess-eval-line-and-go - :n "l" #'ess-eval-line - :nv "R" #'ess-eval-region-and-go - :nv "r" #'ess-eval-region - :n "F" #'ess-eval-function-and-go - :n "f" #'ess-eval-function - ;; predefined keymaps - :n "h" #'ess-doc-map - :n "x" #'ess-extra-map - :n "p" #'ess-r-package-dev-map - :n "v" #'ess-dev-map - ;; noweb - :n "cC" #'ess-eval-chunk-and-go - :n "cc" #'ess-eval-chunk - :n "cd" #'ess-eval-chunk-and-step - :n "cm" #'ess-noweb-mark-chunk - :n "cp" #'ess-noweb-previous-chunk - :n "cn" #'ess-noweb-next-chunk)))) + (set! :lookup 'ess-mode :documentation #'ess-display-help-on-object) + (map! (:map ess-doc-map + "h" #'ess-display-help-on-object + "p" #'ess-R-dv-pprint + "t" #'ess-R-dv-ctable) + (:map ess-mode-map + "" #'ess-eval-line + "" #'comint-next-input + "" #'comint-previous-input + (:localleader + :nv "," #'ess-eval-region-or-function-or-paragraph-and-step + :n "'" #'R + :n "" #'ess-switch-to-inferior-or-script-buffer + :n "" #'ess-switch-process + :n ;; REPL + :n "B" #'ess-eval-buffer-and-go + :n "b" #'ess-eval-buffer + :nv "d" #'ess-eval-region-or-line-and-step + :n "D" #'ess-eval-function-or-paragraph-and-step + :n "L" #'ess-eval-line-and-go + :n "l" #'ess-eval-line + :nv "R" #'ess-eval-region-and-go + :nv "r" #'ess-eval-region + :n "F" #'ess-eval-function-and-go + :n "f" #'ess-eval-function + ;; predefined keymaps + :n "h" #'ess-doc-map + :n "x" #'ess-extra-map + :n "p" #'ess-r-package-dev-map + :n "v" #'ess-dev-map + ;; noweb + :n "cC" #'ess-eval-chunk-and-go + :n "cc" #'ess-eval-chunk + :n "cd" #'ess-eval-chunk-and-step + :n "cm" #'ess-noweb-mark-chunk + :n "cp" #'ess-noweb-previous-chunk + :n "cn" #'ess-noweb-next-chunk)))) + (def-package! ess-smart-equals :hook ((ess-mode . ess-smart-equals-mode) diff --git a/modules/lang/ess/packages.el b/modules/lang/ess/packages.el index 5b8a3f3b0..066bca909 100644 --- a/modules/lang/ess/packages.el +++ b/modules/lang/ess/packages.el @@ -1,3 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/ess/packages.el + (package! ess) (package! ess-smart-equals) (package! ess-R-data-view) From a43b88b18a44145d8eae61b6b37087630841b4ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 02:15:23 -0500 Subject: [PATCH 0403/4235] lang/org: refresh inline images when pressing RET on headlines --- modules/lang/org/autoload/org.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index e27e99585..10d1c55e1 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -62,6 +62,7 @@ If on a: ((string= "ARCHIVE" (car-safe (org-get-tags))) (org-force-cycle-archived)) (t + (+org/refresh-inline-images) (org-remove-latex-fragment-image-overlays) (org-toggle-latex-fragment '(4))))) From f2a4028f3060daf17efe2ed71632436180bdbbb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 02:16:50 -0500 Subject: [PATCH 0404/4235] feature/workspaces: refactor +workspace-buffer-list --- modules/feature/workspaces/autoload/workspaces.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 228f0467d..94022d99f 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -85,11 +85,13 @@ The buffer list is ordered by recency (same as `buffer-list'). PERSP can be a string (name of a workspace) or a workspace (satisfies `+workspace-p'). If nil or omitted, it defaults to the current workspace." - (let ((persp (or persp (+workspace-current)))) - (cl-assert (+workspace-p persp) t) - (cl-loop for buf in (buffer-list) - if (+workspace-contains-buffer-p buf persp) - collect buf))) + (unless persp + (setq persp (+workspace-current))) + (unless (+workspace-p persp) + (error "You're in the nil perspective")) + (cl-loop for buf in (buffer-list) + if (+workspace-contains-buffer-p buf persp) + collect buf)) ;;;###autoload (defun +workspace-orphaned-buffer-list () From 139a0c8045cf294f38418cab5d5899cefab4cb91 Mon Sep 17 00:00:00 2001 From: Sergey Trofimov Date: Sat, 10 Feb 2018 19:36:06 +0300 Subject: [PATCH 0405/4235] Fix kill-buffer arguments. --- core/autoload/buffers.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index c5e06c209..5e4da2e4f 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -170,7 +170,7 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." regex PATTERN. Returns the number of killed buffers." (let ((buffers (doom-matching-buffers pattern buffer-list))) (dolist (buf buffers (length buffers)) - (kill-buffer buf t)))) + (kill-buffer buf)))) ;; From efce68bc297465d591797309b920b99dcaf8e5ec Mon Sep 17 00:00:00 2001 From: Sergey Trofimov Date: Sat, 10 Feb 2018 19:52:00 +0300 Subject: [PATCH 0406/4235] Make elfeed-org ready at elfeed start. --- 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 11eb92618..6b12172f7 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -53,7 +53,7 @@ (def-package! elfeed-org - :after (:all org elfeed) + :after (elfeed) :config (setq rmh-elfeed-org-files (let ((default-directory +org-dir)) From fb893065a95484037fd136df3cf4f062d66932f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 15:11:36 -0500 Subject: [PATCH 0407/4235] :memo: lang/ess: conform README to conventions --- modules/lang/ess/README.org | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/lang/ess/README.org b/modules/lang/ess/README.org index 1ead01c4a..55330d7ab 100644 --- a/modules/lang/ess/README.org +++ b/modules/lang/ess/README.org @@ -1,29 +1,27 @@ -* map! -:PROPERTIES: -:ID: E27AED84-4D2D-4F67-B9D9-6A26026D4C65 -:END: -** :map ess-doc-map -:PROPERTIES: -:ID: 23857C0C-25BC-4DBA-8360-E2CAB2F98135 -:END: +#+TITLE: :lang ess + +This module adds support for various statistics languages, including R, S-Plus, +SAS, Julia and Stata. + +* Table of Contents :TOC: +- [[Appendix][Appendix]] + - [[Keybindings][Keybindings]] + +* Appendix +** Keybindings +*** :map ess-doc-map | key | command | |-----+----------------------------| | "h" | ess-display-help-on-object | | "p" | ess-R-dv-pprint | | "t" | ess-R-dv-ctable | -** :map ess-mode-map -:PROPERTIES: -:ID: A5EA8086-C7BF-41BB-BFC4-9D8CC9A79163 -:END: +*** :map ess-mode-map | key | command | |--------------+-----------------------| | "" | ess-eval-line | | "" | comint-next-input | | "" | comint-previous-input | -*** :localleader -:PROPERTIES: -:ID: 7F84D0BD-2F1B-4F1D-92F6-5559A2D0741D -:END: +**** :localleader | state | key | command | |-------+-------------+---------------------------------------------------| | :nv | "," | ess-eval-region-or-function-or-paragraph-and-step | From da84850ced1980b0b4dc4825c4bd2172feeeb5e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 15:13:08 -0500 Subject: [PATCH 0408/4235] lang/web: remove company-yasnippet from css modes --- modules/lang/web/+css.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 8f4d51e07..6366bef5e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -36,15 +36,15 @@ :mode "\\.css$" :mode ("\\.scss$" . scss-mode) :config - (set! :company-backend '(css-mode scss-mode) '(company-css company-yasnippet)) - (map! :map scss-mode-map :localleader "b" #'+css/scss-build)) + (set! :company-backend '(css-mode scss-mode) 'company-css) + (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) (def-package! sass-mode :mode "\\.sass$" :config - (set! :company-backend 'sass-mode '(company-css company-yasnippet)) - (map! :map scss-mode-map :localleader "b" #'+css/sass-build)) + (set! :company-backend 'sass-mode 'company-css) + (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) (def-package! less-css-mode From 0be42fe4739589eb10ef19e8011fce834afd3a29 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 15:17:10 -0500 Subject: [PATCH 0409/4235] ui/doom-modeline: fix error caused by nil buffer-file-truename --- modules/ui/doom-modeline/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 8738df1a4..38d23f9fe 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -245,13 +245,13 @@ If TRUNCATE-TAIL is t also truncate the parent directory of the file." (if (null root) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (relative-dirs (file-relative-name (file-name-directory buffer-file-truename) + (relative-dirs (file-relative-name (file-name-directory (file-truename buffer-file-name)) (if include-project (concat root "../") root))) (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) (if (equal "./" relative-dirs) (setq relative-dirs "")) (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory buffer-file-truename) + (propertize (file-name-nondirectory (file-truename buffer-file-name)) 'face (if file-faces `(:inherit ,file-faces)))))))) (defun +doom-modeline--buffer-file-name (truncate-project-root-parent) From 0019deb2760dd22b6160a8f1c120e0aad6092c7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 17:27:02 -0500 Subject: [PATCH 0410/4235] Rewrite doom/info --- core/autoload/debug.el | 133 ++++++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 63 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index c0720c740..9148a225b 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -89,75 +89,82 @@ the profiling report otherwise." (profiler-stop)) (setq doom--profiler (not doom--profiler))) +;;;###autoload +(defun doom-info () + "Returns diagnostic information about the current Emacs session in markdown, +ready to be pasted in a bug report on github." + (require 'vc-git) + (let ((default-directory doom-emacs-dir)) + (format + (concat "- OS: %s (%s)\n" + "- Emacs: %s (%s)\n" + "- Doom: %s (%s https://github.com/hlissner/doom-emacs/commit/%s)\n" + "- Graphic display: %s (daemon: %s)\n" + "- System features: %s\n" + "- Details:\n" + " ```elisp\n" + " modules: %s\n" + " packages: %s\n" + " elc dirs: %s\n" + " exec-path: %s\n" + " ```\n") + system-type system-configuration + emacs-version (format-time-string "%b %d, %Y" emacs-build-time) + doom-version + (vc-git--symbolic-ref "core/core.el") (vc-git-working-revision "core/core.el") + (display-graphic-p) (daemonp) + (bound-and-true-p system-configuration-features) + ;; details + (or (cl-loop with cat = nil + for key being the hash-keys of doom-modules + if (or (not cat) (not (eq cat (car key)))) + do (setq cat (car key)) and collect cat + else collect + (let ((flags (doom-module-flags cat (cdr key)))) + (if (equal flags '(t)) + (cdr key) + (list (cdr key) flags)))) + "n/a") + (or (let (packages) + (ignore-errors + (require 'async) + ;; collect these in another session to protect this + ;; session's state + (async-get + (async-start + `(lambda () + (setq load-path ',load-path) + (load ,(expand-file-name "core/core.el" doom-emacs-dir)) + (load ,(expand-file-name "init.el" doom-emacs-dir)) + (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) + (doom-get-packages)) + (lambda (p) (setq packages p)))) + (mapcar (lambda (x) + (if (cdr x) + (format "%s" x) + (symbol-name (car x)))) + (cl-sort packages #'string-lessp :key (lambda (x) (symbol-name (car x))))))) + "n/a") + (or (ignore-errors + (cl-delete-duplicates + (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) + (reverse (directory-files-recursively doom-modules-dir "\\.elc$"))) + collect (file-relative-name (file-name-directory file) doom-emacs-dir)) + :test #'equal)) + "n/a") + exec-path))) + ;;;###autoload (defun doom/info () "Collects some debug information about your Emacs session, formats it into markdown and copies it to your clipboard, ready to be pasted into bug reports!" (declare (interactive-only t)) (interactive) - (message "Generating Doom info...") - (let* ((default-directory doom-emacs-dir) - (str (format - (concat "### System Information\n" - "- OS: %s (%s)\n" - "- Emacs: %s (%s)\n" - "- Doom: %s (%s https://github.com/hlissner/doom-emacs/commit/%s)\n" - "- Graphic display: %s (daemon: %s)\n" - "- System features: %s\n" - "- Details:\n" - " ```elisp\n" - " modules: %s\n" - " packages: %s\n" - " elc dirs: %s\n" - " exec-path: %s\n" - " ```\n") - system-type system-configuration - emacs-version (format-time-string "%b %d, %Y" emacs-build-time) - doom-version - (vc-git--symbolic-ref "core/core.el") (vc-git-working-revision "core/core.el") - (display-graphic-p) (daemonp) - (bound-and-true-p system-configuration-features) - ;; details - (or (cl-loop with cat = nil - for key being the hash-keys of doom-modules - if (or (not cat) (not (eq cat (car key)))) - do (setq cat (car key)) and collect cat - else collect - (let ((flags (doom-module-flags cat (cdr key)))) - (if (equal flags '(t)) - (cdr key) - (list (cdr key) flags)))) - "n/a") - (or (let (packages) - (ignore-errors - (require 'async) - ;; collect these in another session to protect this - ;; session's state - (async-get - (async-start - `(lambda () - (setq load-path ',load-path) - (load ,(expand-file-name "core/core.el" doom-emacs-dir)) - (load ,(expand-file-name "init.el" doom-emacs-dir)) - (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) - (doom-get-packages)) - (lambda (p) (setq packages p)))) - (mapcar (lambda (x) - (if (cdr x) - (format "%s" x) - (symbol-name (car x)))) - (cl-sort packages #'string-lessp :key (lambda (x) (symbol-name (car x))))))) - "n/a") - (or (ignore-errors - (cl-delete-duplicates - (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) - (reverse (directory-files-recursively doom-modules-dir "\\.elc$"))) - collect (file-relative-name (file-name-directory file) doom-emacs-dir)) - :test #'equal)) - "n/a") - exec-path))) - (kill-new str) - (message "Done! Copied to your clipboard"))) + (if noninteractive + (message "%s" (doom-info)) + (message "Generating Doom info...") + (kill-new (doom-info)) + (message "Done! Copied to clipboard."))) ;;;###autoload (defun doom/toggle-debug-mode () From 2e5bfe623ac3ff3744d78e0116e4028fae6bb7ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 17:27:15 -0500 Subject: [PATCH 0411/4235] Add 'make info' task --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 092236014..42ab92fbb 100644 --- a/Makefile +++ b/Makefile @@ -79,6 +79,10 @@ run: doctor: @bin/doom-doctor +# Prints debug info about your current setup +info: + @$(EMACS) -l core/autoload/debug.el -f doom/info + ## Internal tasks init.el: @$(error No init.el file; create one or copy init.example.el) From f09e23982d214fee85d59a01ccb9b00069713cb1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 10 Feb 2018 17:32:39 -0500 Subject: [PATCH 0412/4235] Remove debug output from make doctor (replaced by make info) --- bin/doom-doctor | 52 ++----------------------------------------------- 1 file changed, 2 insertions(+), 50 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index eb8b55108..924d0b52b 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -8,7 +8,6 @@ ;; 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/")) @@ -234,8 +233,7 @@ (`timeout (error! "Timed out trying to contact %s" ex)) (_ (error! "Failed to validate %s" url) - (when doom-debug-mode - (explain! (pp-to-string it))))))) + (explain! (pp-to-string it)))))) (dolist (url '("https://self-signed.badssl.com" "https://wrong.host.badssl.com/")) (check! (condition-case-unless-debug e @@ -273,54 +271,8 @@ "This is required by package.el and QUELPA to build packages and will " "prevent you from installing & updating packages.")))) - -;; --- report! ------------------------------------------------ - -(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))))))) - - (when (and (bound-and-true-p doom-packages) - (require 'package nil t)) - (msg! " + enabled packages:\n%s" - (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")))))) - - (msg! " + exec-path:\n%s" - (indented 4 - (columns 1 79 exec-path))) - - (msg! " + PATH:\n%s" - (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 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"))) + (warn! "There were issues!")) From c3fb916435c0b1336b763130734cf9541aea2510 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 00:51:17 -0500 Subject: [PATCH 0413/4235] Use native wildcard+dir over shell find in makefile OS-agnostic. Only depends on GNU Make. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 42ab92fbb..fb0d81afa 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ EMACS_FLAGS=--eval '(setq user-emacs-directory default-directory)' -l core/core. EMACS=emacs --quick --batch $(EMACS_FLAGS) EMACSI=emacs -q $(EMACS_FLAGS) -MODULES=$(patsubst modules/%, %, $(shell find -L modules/ -maxdepth 2 -type d)) +MODULES=$(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) all: autoloads autoremove install From cf75e203b620f45bea991c2c9667454e7cf6032d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 02:57:46 -0500 Subject: [PATCH 0414/4235] lang/org: add ob-crystal --- modules/lang/org/packages.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index b7ac6d24b..2dc39c17d 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -16,6 +16,8 @@ (package! ob-sql-mode) (package! ob-translate) + (when (featurep! :lang crystal) + (package! ob-crystal)) (when (featurep! :lang go) (package! ob-go)) (when (featurep! :lang rust) From 24bf471f55f4ffd84297f7881130627773bc49a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 03:16:03 -0500 Subject: [PATCH 0415/4235] lang/crystal: add :lookup definitions/references support --- modules/lang/crystal/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index 6148d0685..738842bbe 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -4,6 +4,9 @@ :mode "\\.cr$" :interpreter "crystal" :config + (set! :lookup 'crystal-mode + :definition #'crystal-def-jump + :references #'crystal-tool-imp) (set! :eval 'crystal-mode '((:command . "crystal") (:exec . "%c %s") From 4566dea4b35d8005f7c4fa2f8c89f06fc8f17c8b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 03:58:57 -0500 Subject: [PATCH 0416/4235] Fix save-buffer prompt occurring after buffer is buried --- core/core-ui.el | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index b47891fe5..67d165933 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -554,15 +554,18 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ((eq buf (doom-fallback-buffer)) (message "Can't kill the fallback buffer.")) ((doom-real-buffer-p buf) - (when (or ;; if there aren't more real buffers than visible buffers, - ;; then there are no real, non-visible buffers left. - (not (cl-set-difference (doom-real-buffer-list) - (doom-visible-buffers))) - ;; if we end up back where we start (or previous-buffer - ;; returns nil), we have nowhere left to go - (memq (previous-buffer) (list buf 'nil))) - (switch-to-buffer (doom-fallback-buffer))) - (kill-buffer buf)) + (if (and (buffer-modified-p buf) + (not (y-or-n-p "Buffer %s is modified; kill anyway?"))) + (message "Aborted") + (when (or ;; if there aren't more real buffers than visible buffers, + ;; then there are no real, non-visible buffers left. + (not (cl-set-difference (doom-real-buffer-list) + (doom-visible-buffers))) + ;; if we end up back where we start (or previous-buffer + ;; returns nil), we have nowhere left to go + (memq (previous-buffer) (list buf 'nil))) + (switch-to-buffer (doom-fallback-buffer))) + (kill-buffer buf))) (t (funcall orig-fn))))) From 562b8ba4311d36597b982368544f346ae1633270 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Sun, 11 Feb 2018 17:04:30 +0800 Subject: [PATCH 0417/4235] Add: extend +write module --- init.example.el | 2 +- modules/app/write/README.org | 39 +++++++++++++++++++++++++++ modules/app/write/config.el | 51 +++++++++++++++++++++++++++++++++++ modules/app/write/packages.el | 11 ++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 modules/app/write/README.org create mode 100644 modules/app/write/config.el create mode 100644 modules/app/write/packages.el diff --git a/init.example.el b/init.example.el index 0bb4f79de..ca1bfaa4c 100644 --- a/init.example.el +++ b/init.example.el @@ -134,7 +134,7 @@ ;irc ; how neckbeards socialize ;rss ; emacs as an RSS reader ;twitter ; twitter client https://twitter.com/vnought - ;write ; emacs as a word processor (latex + org + markdown) + ;; (write +synosaurus +wordnut +langtool) ; emacs as a word processor (latex + org + markdown) ;; Private modules are where you place your personal configuration files. ;; By default, they are not tracked. There is one module included here, diff --git a/modules/app/write/README.org b/modules/app/write/README.org new file mode 100644 index 000000000..85288db98 --- /dev/null +++ b/modules/app/write/README.org @@ -0,0 +1,39 @@ +* +langtool +:PROPERTIES: +:ID: AE6DA5B3-6859-47D9-A483-972D42F0E11B +:END: +Support for languagetool + +For installation of languagetool, please checkout https://languagetool.org/. Noted that you need Java to run languagetool. + +MacOS users can install languagetool using ~brew~: +#+BEGIN_SRC bash +brew install languagetool +#+END_SRC + +After installation, you need to find out the path of the ~jar~ file and set it as ~+langtool-jar-path~. + +* +wordnut +:PROPERTIES: +:ID: 005E9DD8-DE23-4A69-B423-8950B5E23059 +:END: +This use ~wordnut~ package to provide a dictionary in Emacs. +Commands avaliable: +- ~wordnut-search~ +- ~wordnut-lookup-curent-word~ + +* +synosaurus +:PROPERTIES: +:ID: 005E9DD8-DE23-4A69-B423-8950B5E23059 +:END: +This use ~synosaurus~ package to provide a dictionary in Emacs. +Commands avaliable: +- ~synosaurus-mode~ +- ~synosaurus-lookup~ +- ~synosaurus-choose-and-replace~ + +* mixed-pitch +:PROPERTIES: +:ID: 417B004D-2E33-4071-894F-0792CB22B3D5 +:END: +This package enable fixed-width font and variable-pitch font coexist in the same buffer": you can use ~Fira code~ for code blocks in org mode file where use ~Ariel~ for main content (if you want...). diff --git a/modules/app/write/config.el b/modules/app/write/config.el new file mode 100644 index 000000000..9492cf5f5 --- /dev/null +++ b/modules/app/write/config.el @@ -0,0 +1,51 @@ +;;; app/write/config.el -*- lexical-binding: t; -*- + +(when (featurep! +langtool) + (defvar +langtool-default-lang "en-US" + "default language for langtool") + (defvar +langtool-mother-tongue nil + "mother tongue of user") + (defvar +langtool-jar-path "/usr/local/Cellar/languagetool/4.0/libexec/languagetool-commandline.jar" + "TODO") + (def-package! langtool + :commands (langtool-check + langtool-check-done + langtool-switch-default-language + langtool-show-message-at-point + langtool-correct-buffer) + :init + (setq langtool-default-language +langtool-default-lang + langtool-mother-tongue +langtool-mother-tongue + langtool-language-tool-jar +langtool-jar-path))) +(when (featurep! +wordnut) + (def-package! wordnut + :commands (wordnut-search + wordnut-lookup-current-word))) +(when (featurep! +synosaurus) + (def-package! synosaurus + :commands (synosaurus-mode + synosaurus-lookup + synosaurus-choose-and-replace) + :init + (require 'synosaurus-wordnet) + :config + (setq synosaurus-choose-method 'default))) + +(def-package! mixed-pitch + :config + (setq mixed-pitch-fixed-pitch-faces + (append mixed-pitch-fixed-pitch-faces + '(org-todo-keyword-todo + org-todo-keyword-habt + org-todo-keyword-done + org-todo-keyword-wait + org-todo-keyword-kill + org-todo-keyword-outd + org-special-keyword + org-date + org-property-value + org-special-keyword + org-property-value + org-ref-cite-face + org-tag + font-lock-comment-face)))) diff --git a/modules/app/write/packages.el b/modules/app/write/packages.el new file mode 100644 index 000000000..f94e24af7 --- /dev/null +++ b/modules/app/write/packages.el @@ -0,0 +1,11 @@ +;; -*- no-byte-compile: t; -*- +;;; app/write/packages.el + +(when (featurep! +langtool) + (package! langtool)) +(when (featurep! +wordnut) + (package! wordnut)) +(when (featurep! +synosaurus) + (package! synosaurus)) + +(package! mixed-pitch) From 13e2239fcd730b29061181dd9bd1932ffab79488 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Sun, 11 Feb 2018 17:05:16 +0800 Subject: [PATCH 0418/4235] Add: add mixed-pitch-mode to +write-mode --- modules/app/write/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/write/autoload.el b/modules/app/write/autoload.el index 6b370c667..e0d3fcfef 100644 --- a/modules/app/write/autoload.el +++ b/modules/app/write/autoload.el @@ -13,6 +13,7 @@ (visual-fill-column-mode arg) (visual-line-mode arg) (when (eq major-mode 'org-mode) + (mixed-pitch-mode arg) (+org-pretty-mode arg)) (setq line-spacing (if +write-mode 4)))) From a37449d4e4cada39deac961e4c8a9fe32c59e542 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 04:36:52 -0500 Subject: [PATCH 0419/4235] tools/neotree: +neotree/toggle => +neotree-open; add +neotree/find-this-file --- modules/private/default/+bindings.el | 3 ++- modules/tools/neotree/autoload.el | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index d03f58a6b..317453f44 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -233,7 +233,8 @@ :desc "Debugger" :n "d" #'+debug/open :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl - :desc "Neotree" :n "n" #'+neotree/toggle + :desc "Neotree" :n "n" #'+neotree/open + :desc "Neotree: on this file" :n "N" #'+neotree/find-this-file :desc "Imenu sidebar" :nv "i" #'imenu-list-minor-mode :desc "Terminal" :n "t" #'+term/open-popup :desc "Terminal in project" :n "T" #'+term/open-popup-in-project diff --git a/modules/tools/neotree/autoload.el b/modules/tools/neotree/autoload.el index 4495b0480..917e0ed8e 100644 --- a/modules/tools/neotree/autoload.el +++ b/modules/tools/neotree/autoload.el @@ -1,8 +1,23 @@ ;;; tools/neotree/autoload.el -*- lexical-binding: t; -*- +;; `neotree-show' and `neotree-find' don't respect the current project, and open +;; neotree in `default-directory'. `+neotree/open' and `neotree/find-this-file' +;; will ensure the neotree pane is always rooted in the project root. + ;;;###autoload -(defun +neotree/toggle () - "Toggle the neotree window." +(defun +neotree/open () + "Open the neotree window in the current project." + (interactive) + (let ((path buffer-file-name) + (project-root (doom-project-root 'nocache))) + (require 'neotree) + (if (neo-global--window-exists-p) + (neotree-hide) + (neotree-dir project-root)))) + +;;;###autoload +(defun +neotree/find-this-file () + "Open the neotree window in the current project, and find the current file." (interactive) (let ((path buffer-file-name) (project-root (doom-project-root 'nocache))) From 400c7cbfa425e5ef050c09c811c9f52f3f3def3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 04:43:33 -0500 Subject: [PATCH 0420/4235] feature/version-control: update magit popup rule (due to upstream changes) The leading asterix in magit buffers is sometimes omitted. This change is experimental. --- modules/feature/version-control/+git.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index d8e3b6504..5893c7871 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -79,7 +79,7 @@ (def-package! magit :commands (magit-status magit-blame) :config - (set! :popup "^\\*magit" :ignore) + (set! :popup "^\\*?magit" :ignore) (set! :evil-state 'magit-status-mode 'emacs) (after! evil ;; Switch to emacs state only while in `magit-blame-mode', then back when From 57b2b5c546bcc8e572cfe8083fe3652dba1bb439 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 11 Feb 2018 16:13:15 -0500 Subject: [PATCH 0421/4235] Fix doom//packages-update not updating dependencies --- core/autoload/packages.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index e1dad42ed..12de12395 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -140,16 +140,15 @@ Used by `doom//packages-update'." (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages - (dolist (pkg (doom-get-packages t)) - (let ((sym (car pkg))) - (when (and (or (not (doom-package-prop sym :freeze)) - include-frozen-p) - (not (doom-package-prop sym :ignore)) - (not (doom-package-different-backend-p sym))) - (push sym - (if (eq (doom-package-backend sym) 'quelpa) - quelpa-pkgs - elpa-pkgs))))) + (dolist (pkg (mapcar #'car package-alist)) + (when (and (or (not (doom-package-prop pkg :freeze)) + include-frozen-p) + (not (doom-package-prop pkg :ignore)) + (not (doom-package-different-backend-p pkg))) + (push pkg + (if (eq (doom-package-backend pkg) 'quelpa) + quelpa-pkgs + elpa-pkgs)))) ;; The bottleneck in this process is quelpa's version checks, so check them ;; asynchronously. (let (futures) From c6199800e415244e2b1a988b5fddc3b2db94f752 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Feb 2018 01:43:26 -0500 Subject: [PATCH 0422/4235] lang/javascript: fix localleader bindings breaking SPC in emacs mode --- modules/lang/javascript/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 923aa6704..2ee312cc7 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -40,8 +40,8 @@ (map! :map js2-mode-map :localleader - "r" #'+javascript/refactor-menu - "S" #'+javascript/skewer-this-buffer)) + :nr "r" #'+javascript/refactor-menu + :n "S" #'+javascript/skewer-this-buffer)) ;; A find-{definition,references} backend for js2-mode. NOTE The xref API is From ba19032d29058074f7be5e4ab87539b68fb718dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Feb 2018 01:44:02 -0500 Subject: [PATCH 0423/4235] Rename doom/narrow-buffer => doom/clone-and-narrow-buffer --- core/autoload/editor.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 5289c1216..f26a6d283 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -222,7 +222,7 @@ consistent throughout a selected region, depending on `indent-tab-mode'." (defvar-local doom--buffer-narrowed-origin nil) ;;;###autoload -(defun doom/narrow-buffer (beg end &optional clone-p) +(defun doom/clone-and-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). From 9b76627ee0aca12a45749bdf496d3bb09e1f8fcb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Feb 2018 23:18:38 -0500 Subject: [PATCH 0424/4235] lang/org: do org-try-structure-completion on TAB #417 --- modules/lang/org/autoload/org.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 10d1c55e1..c15c2558c 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -130,14 +130,15 @@ If on a: "Depending on the context either a) indent the current line, b) go the next table field or c) run `yas-expand'." (interactive) - (call-interactively - (cond ((and (bound-and-true-p yas-minor-mode) - (yas--templates-for-key-at-point)) - #'yas-expand) - ((org-at-table-p) - #'org-table-next-field) - (t - #'+org/indent)))) + (or (org-try-structure-completion) + (call-interactively + (cond ((and (bound-and-true-p yas-minor-mode) + (yas--templates-for-key-at-point)) + #'yas-expand) + ((org-at-table-p) + #'org-table-next-field) + (t + #'+org/indent))))) ;;;###autoload (defun +org/dedent () From cb3e780a96c089210214993bfc8ae6f3d56a5b1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 05:23:40 -0500 Subject: [PATCH 0425/4235] Fix package manager not detecting outdated quelpa packages --- core/autoload/packages.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 12de12395..1ffcd4d4c 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -137,6 +137,7 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom//packages-update'." + (doom-initialize-packages t) (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages @@ -159,6 +160,8 @@ Used by `doom//packages-update'." (setq user-emacs-directory ,user-emacs-directory) (let ((noninteractive t)) (load ,(expand-file-name "core.el" doom-core-dir))) + (setq doom-packages ',doom-packages + doom-modules ',doom-modules) (doom-package-outdated-p ',pkg))) futures)) (delq nil From 25977d662bd98d8448ea8fded410871bcc39b42a Mon Sep 17 00:00:00 2001 From: Ben Lambeth Date: Tue, 13 Feb 2018 09:29:48 -0600 Subject: [PATCH 0426/4235] Fix adding evil-set-jump to rtags-jump-hook when evil is not enabled --- 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 048800f6b..c47de2917 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -220,7 +220,7 @@ compilation database is present in the project.") ;; Use rtags-imenu instead of imenu/counsel-imenu (map! :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) - (add-hook 'rtags-jump-hook #'evil-set-jump) + (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) (add-hook 'rtags-after-find-file-hook #'recenter)) (def-package! ivy-rtags From d7846c38311d02948a266b7e7dc19a7cda8010a3 Mon Sep 17 00:00:00 2001 From: Sergey Trofimov Date: Tue, 13 Feb 2018 22:23:07 +0300 Subject: [PATCH 0427/4235] Fix +plantuml/install. --- modules/lang/plantuml/autoload.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/plantuml/autoload.el b/modules/lang/plantuml/autoload.el index 1fbd15a96..171febc8e 100644 --- a/modules/lang/plantuml/autoload.el +++ b/modules/lang/plantuml/autoload.el @@ -4,7 +4,7 @@ (defun +plantuml/install () "Install plantuml.jar." (interactive) - (unless (file-exists-p plantuml-jar-path) - (user-error "plantuml.jar already installed")) - (url-copy-file "https://kent.dl.sourceforge.net/project/plantuml/plantuml.jar" - plantuml-jar-path)) + (if (file-exists-p plantuml-jar-path) + (user-error "plantuml.jar already installed") + (url-copy-file "https://kent.dl.sourceforge.net/project/plantuml/plantuml.jar" + plantuml-jar-path))) From 3080b68c843f9b0d6b5d29b8b3fa7ab29c0f8b41 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 17:50:58 -0500 Subject: [PATCH 0428/4235] app/write: major refactor+rewrite + Make synosaurus unconditional + Move much of +write-mode into its hook + Conform README.org to template and expand it + Try to guess langtool-language-tool-jar + Update init.example.el entry + Remove redundant variables + Add +write-text-scale & +text-line-spacing variables --- init.example.el | 4 +- modules/app/write/README.org | 132 ++++++++++++++++++++++++++-------- modules/app/write/autoload.el | 25 +++---- modules/app/write/config.el | 87 ++++++++++++++-------- modules/app/write/packages.el | 6 +- 5 files changed, 178 insertions(+), 76 deletions(-) diff --git a/init.example.el b/init.example.el index ca1bfaa4c..f632e2b9d 100644 --- a/init.example.el +++ b/init.example.el @@ -134,7 +134,9 @@ ;irc ; how neckbeards socialize ;rss ; emacs as an RSS reader ;twitter ; twitter client https://twitter.com/vnought - ;; (write +synosaurus +wordnut +langtool) ; emacs as a word processor (latex + org + markdown) + ;(write ; emacs as a word processor (latex + org + markdown) + ; +wordnut ; wordnet (wn) search + ; +langtool) ; a proofreader (grammar/style check) for Emacs ;; Private modules are where you place your personal configuration files. ;; By default, they are not tracked. There is one module included here, diff --git a/modules/app/write/README.org b/modules/app/write/README.org index 85288db98..a61493ab6 100644 --- a/modules/app/write/README.org +++ b/modules/app/write/README.org @@ -1,39 +1,113 @@ -* +langtool -:PROPERTIES: -:ID: AE6DA5B3-6859-47D9-A483-972D42F0E11B -:END: -Support for languagetool +#+TITLE: :app write -For installation of languagetool, please checkout https://languagetool.org/. Noted that you need Java to run languagetool. +Adds word processing tools and the ~+write-mode~ minor mode, which converts +Emacs into a more comfortable writing environment. -MacOS users can install languagetool using ~brew~: -#+BEGIN_SRC bash -brew install languagetool -#+END_SRC +* Table of Contents :TOC: +- [[Features][Features]] + - [[~M-x +write-mode~][~M-x +write-mode~]] + - [[Language Tool ~+langtool~][Language Tool ~+langtool~]] + - [[Wordnut ~+wordnut~][Wordnut ~+wordnut~]] + - [[Synosaurus][Synosaurus]] +- [[Prerequisites][Prerequisites]] + - [[Language Tool][Language Tool]] + - [[Wordnut][Wordnut]] +- [[Configuration][Configuration]] + - [[mixed-pitch-mode][mixed-pitch-mode]] +- [[Appendix][Appendix]] + - [[Minor modes][Minor modes]] + - [[Commands][Commands]] -After installation, you need to find out the path of the ~jar~ file and set it as ~+langtool-jar-path~. +* Features +This module provides two module flags: -* +wordnut -:PROPERTIES: -:ID: 005E9DD8-DE23-4A69-B423-8950B5E23059 -:END: -This use ~wordnut~ package to provide a dictionary in Emacs. -Commands avaliable: +- ~+langtool~ Enables language tool integration. +- ~+wordnut~ Enables wordnet integration. + +** ~M-x +write-mode~ +Write mode makes Emacs a more comfortable writing environment by: + +- Centering the buffer (with ~visual-fill-column-mode~), ala distraction-free + mode from other text editors. +- Soft-wrapping long text lines with ~visual-line-mode~. +- Enabling ~mixed-pitch-mode~, allowing fixed-width and variable-pitch fonts to + co-exist in one buffer. For example, a monospace font for SRC blocks and Arial + for everything else. +- In org-mode: + - Turns on ~org-indent-mode~ + - Turns on ~+org-pretty-mode~ + +** Language Tool ~+langtool~ +[[https://www.languagetool.org/][Language Tool]] is a polyglot proofreader service that checks for grammar and +stylistic issues in your writing. This requires Java 1.8+. + +#+begin_quote +This requires Java 1.8+ +#+end_quote + +*** Commands +- ~langtool-check~ +- ~langtool-correct-buffer~ + +** Wordnut ~+wordnut~ +Wordnut provides a searchable dictionary frontend for Emacs. This requires +~wordnet~, which should be available in your OS's package manager. + +*** Commands - ~wordnut-search~ - ~wordnut-lookup-curent-word~ -* +synosaurus -:PROPERTIES: -:ID: 005E9DD8-DE23-4A69-B423-8950B5E23059 -:END: -This use ~synosaurus~ package to provide a dictionary in Emacs. -Commands avaliable: -- ~synosaurus-mode~ +** Synosaurus +Synosaurus provides a service for looking up synonyms. It requires an internet +connection. + +*** Commands - ~synosaurus-lookup~ - ~synosaurus-choose-and-replace~ -* mixed-pitch -:PROPERTIES: -:ID: 417B004D-2E33-4071-894F-0792CB22B3D5 -:END: -This package enable fixed-width font and variable-pitch font coexist in the same buffer": you can use ~Fira code~ for code blocks in org mode file where use ~Ariel~ for main content (if you want...). +* Prerequisites +** Language Tool +Either download and deploy it from https://languagetool.org/ or install it +through your OS package manager: + +#+BEGIN_SRC sh +# MacOS/Homebrew users: +brew install languagetool + +# Arch Linux users: +sudo pacman -S languagetool +#+END_SRC + +This module tries to guess the location of languagetool-commandline.jar. If you +get a warning that Doom =couldn't find languagetool-commandline.jar=, you will +need to find langaugetool-commandline.jar and set ~langtool-language-tool-jar~ +to its path. + +** Wordnut +This requires =wordnet= to be installed, which should be available through your +OS package manager: + +#+BEGIN_SRC sh +# MacOS/Homebrew users: +brew install wordnet + +# Arch Linux users: +sudo pacaur -S wordnet # on the AUR +#+END_SRC + +* Configuration +** mixed-pitch-mode +To configure which faces are displayed with fixed-pitch fonts in +~mixed-pitch-mode~, look into ~mixed-pitch-fixed-pitch-faces~. + +* Appendix +** Minor modes +- ~+write-mode~ +- ~mixed-pitch-mode~ +** Commands +- ~langtool-check~ +- ~langtool-correct-buffer~ +- ~synosaurus-choose-and-replace~ +- ~synosaurus-lookup~ +- ~wordnut-lookup-curent-word~ +- ~wordnut-search~ diff --git a/modules/app/write/autoload.el b/modules/app/write/autoload.el index e0d3fcfef..9a9bfd7b2 100644 --- a/modules/app/write/autoload.el +++ b/modules/app/write/autoload.el @@ -2,18 +2,19 @@ ;;;###autoload (define-minor-mode +write-mode - "TODO" + "Turns Emacs into a more comfortable writing environment and word processor." :init-value nil :keymap nil - (let ((arg (if +write-mode +1 -1)) - (iarg (if +write-mode -1 +1))) - (text-scale-set (if +write-mode 2 0)) - (doom/toggle-line-numbers iarg) - (setq-local visual-fill-column-center-text +write-mode) - (visual-fill-column-mode arg) - (visual-line-mode arg) - (when (eq major-mode 'org-mode) - (mixed-pitch-mode arg) - (+org-pretty-mode arg)) - (setq line-spacing (if +write-mode 4)))) + (setq-local visual-fill-column-center-text t) + (when +write-text-scale + (text-scale-set (if +write-mode 2 0))) + (when +write-line-spacing + (setq-local line-spacing +write-line-spacing))) +;;;###autoload +(defun +write|init-org-mode () + "Initializes `org-mode' specific settings for `+write-mode'." + (when (eq major-mode 'org-mode) + (let ((arg (if +write-mode +1 -1))) + (+org-pretty-mode arg) + (org-indent-mode (if +write-mode -1 +1))))) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 9492cf5f5..e19746c21 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -1,12 +1,25 @@ ;;; app/write/config.el -*- lexical-binding: t; -*- +(defvar +write-text-scale nil + "What to scale the text up to in `+write-mode'. Uses `text-scale-set'.") + +(defvar +write-line-spacing nil + "What to set `line-spacing' in `+write-mode'.") + +(add-hook! '+write-mode-hook + #'(flyspell-mode + visual-fill-column-mode + visual-line-mode + mixed-pitch-mode + doom|enable-line-numbers + +write|init-org-mode)) + + +;; +;; Plugins +;; + (when (featurep! +langtool) - (defvar +langtool-default-lang "en-US" - "default language for langtool") - (defvar +langtool-mother-tongue nil - "mother tongue of user") - (defvar +langtool-jar-path "/usr/local/Cellar/languagetool/4.0/libexec/languagetool-commandline.jar" - "TODO") (def-package! langtool :commands (langtool-check langtool-check-done @@ -14,38 +27,50 @@ langtool-show-message-at-point langtool-correct-buffer) :init - (setq langtool-default-language +langtool-default-lang - langtool-mother-tongue +langtool-mother-tongue - langtool-language-tool-jar +langtool-jar-path))) + (setq langtool-default-language "en-US") + :config + (unless langtool-language-tool-jar + (setq langtool-language-tool-jar + (cond (IS-MAC + "/usr/local/Cellar/languagetool/4.0/libexec/languagetool-commandline.jar") + (IS-LINUX + "/usr/share/java/languagetool/languagetool-commandline.jar"))) + (unless (file-exists-p langtool-language-tool-jar) + (warn "langtool: couldn't find languagetool-commandline.jar"))))) + + (when (featurep! +wordnut) (def-package! wordnut - :commands (wordnut-search - wordnut-lookup-current-word))) -(when (featurep! +synosaurus) - (def-package! synosaurus + :commands (wordnut-search + wordnut-lookup-current-word))) + + +(def-package! synosaurus :commands (synosaurus-mode synosaurus-lookup synosaurus-choose-and-replace) - :init - (require 'synosaurus-wordnet) :config - (setq synosaurus-choose-method 'default))) + (setq synosaurus-choose-method 'default)) + +(def-package! synosaurus-wordnet + :commands synosaurus-backend-wordnet) + (def-package! mixed-pitch :config (setq mixed-pitch-fixed-pitch-faces - (append mixed-pitch-fixed-pitch-faces - '(org-todo-keyword-todo - org-todo-keyword-habt - org-todo-keyword-done - org-todo-keyword-wait - org-todo-keyword-kill - org-todo-keyword-outd - org-special-keyword - org-date - org-property-value - org-special-keyword - org-property-value - org-ref-cite-face - org-tag - font-lock-comment-face)))) + (append mixed-pitch-fixed-pitch-faces + '(org-todo-keyword-todo + org-todo-keyword-habt + org-todo-keyword-done + org-todo-keyword-wait + org-todo-keyword-kill + org-todo-keyword-outd + org-special-keyword + org-date + org-property-value + org-special-keyword + org-property-value + org-ref-cite-face + org-tag + font-lock-comment-face)))) diff --git a/modules/app/write/packages.el b/modules/app/write/packages.el index f94e24af7..fa7c69667 100644 --- a/modules/app/write/packages.el +++ b/modules/app/write/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; app/write/packages.el +(package! synosaurus) +(package! mixed-pitch) + (when (featurep! +langtool) (package! langtool)) (when (featurep! +wordnut) (package! wordnut)) -(when (featurep! +synosaurus) - (package! synosaurus)) -(package! mixed-pitch) From a05c4cca6cdf659152ca249c1f2372a4a42ca800 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 17:53:11 -0500 Subject: [PATCH 0429/4235] Fix kill-this-buffer asking to save twice --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index 67d165933..3613e4aa4 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -557,6 +557,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (if (and (buffer-modified-p buf) (not (y-or-n-p "Buffer %s is modified; kill anyway?"))) (message "Aborted") + (set-buffer-modified-p nil) (when (or ;; if there aren't more real buffers than visible buffers, ;; then there are no real, non-visible buffers left. (not (cl-set-difference (doom-real-buffer-list) From d84af58f77c863612b719c1b5729980b7db9c125 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 18:12:35 -0500 Subject: [PATCH 0430/4235] lang/org: refactor tab/backtab/ret keybinds to be less intrusive Turns out the native TAB/Backtab/RET functionality in org already does what I've replaced them with (somewhat). Also, I discovered that the canonical way to modify TAB behavior was through org-tab-first-hook. So, instead of replacing native functionality, I've rewritten these keybinds to leverage them. --- modules/lang/org/autoload/org.el | 82 ++++++++++++++------------------ modules/lang/org/config.el | 17 +++---- 2 files changed, 46 insertions(+), 53 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index c15c2558c..c11736e95 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -112,60 +112,52 @@ If on a: (set-window-start nil scroll-pt))) ;;;###autoload -(defun +org/indent () - "Indent the current item (header or item). Otherwise, forward to -`self-insert-command'." +(defun +org|indent-maybe () + "Indent the current item (header or item), if possible. Made for +`org-tab-first-hook'." (interactive) (cond ((org-at-item-p) - (org-indent-item-tree)) + (org-indent-item-tree) + t) ((org-at-heading-p) - (ignore-errors (org-demote))) + (ignore-errors (org-demote)) + t) ((org-in-src-block-p t) - (doom/dumb-indent)) - (t - (call-interactively #'self-insert-command)))) + (doom/dumb-indent) + t))) ;;;###autoload -(defun +org/indent-or-next-field-or-yas-expand () - "Depending on the context either a) indent the current line, b) go the next -table field or c) run `yas-expand'." - (interactive) - (or (org-try-structure-completion) - (call-interactively - (cond ((and (bound-and-true-p yas-minor-mode) - (yas--templates-for-key-at-point)) - #'yas-expand) - ((org-at-table-p) - #'org-table-next-field) - (t - #'+org/indent))))) +(defun +org|yas-expand-maybe () + "Tries to expand a yasnippet snippet, if one is available. Made for +`org-tab-first-hook'." + (when (and (if (bound-and-true-p evil-mode) + (eq evil-state 'insert) + t) + (bound-and-true-p yas-minor-mode) + (yas--templates-for-key-at-point)) + (call-interactively #'yas-expand) + t)) ;;;###autoload -(defun +org/dedent () - "Dedent the current item (header or item). Otherwise, forward to -`self-insert-command'." +(defun +org/shifttab (&optional arg) + "An alternative to `org-shifttab' which performs smart indentation if in +insert mode (evil). Otherwise, forwards to the original `org-shifttab'." (interactive) - (cond ((org-at-item-p) - (org-list-indent-item-generic - -1 nil - (save-excursion - (when (org-region-active-p) - (goto-char (region-beginning))) - (org-list-struct)))) - ((org-at-heading-p) - (ignore-errors (org-promote))) - (t - (call-interactively #'self-insert-command)))) - -;;;###autoload -(defun +org/dedent-or-prev-field () - "Depending on the context either dedent the current item or go the previous -table field." - (interactive) - (call-interactively - (if (org-at-table-p) - #'org-table-previous-field - #'+org/dedent))) + (cond ((org-at-table-p) + (call-interactively #'org-table-previous-field)) + ((and (bound-and-true-p evil-mode) + (evil-insert-state-p)) + (cond ((org-at-item-p) + (org-list-indent-item-generic + -1 nil + (save-excursion + (when (org-region-active-p) + (goto-char (region-beginning))) + (org-list-struct)))) + ((org-at-heading-p) + (ignore-errors (org-promote))) + (t (call-interactively #'self-insert-command)))) + (t (org-shifttab arg)))) ;;;###autoload (defun +org/insert-item (direction) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index d71abb9bc..eb17a0b11 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -207,12 +207,15 @@ unfold to point on startup." (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies between the two." - (map! :map org-mode-map - "RET" #'org-return-indent - "C-c C-S-l" #'+org/remove-link - :n "C-c C-i" #'org-toggle-inline-images + (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) - :n "RET" #'+org/dwim-at-point + (map! :map org-mode-map + [remap org-shifttab] #'+org/shifttab + "C-c C-S-l" #'+org/remove-link + "C-c C-i" #'org-toggle-inline-images + + :i "RET" #'org-return-indent + :n "RET" #'+org/dwim-at-point ;; Navigate table cells (from insert-mode) :i "C-l" #'+org/table-next-field @@ -225,9 +228,7 @@ between the two." :ni "C-S-k" #'org-metaup :ni "C-S-j" #'org-metadown - :n [tab] #'+org/toggle-fold - :i [tab] #'+org/indent-or-next-field-or-yas-expand - :i [backtab] #'+org/dedent-or-prev-field + :n [tab] #'+org/toggle-fold :ni [M-return] (λ! (+org/insert-item 'below)) :ni [S-M-return] (λ! (+org/insert-item 'above)) From 7b70aa9b7d8f289af03c5203df209660e01e25a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 18:19:35 -0500 Subject: [PATCH 0431/4235] lang/org: reorganize autoload/org.el. Pedantry intensifies. Library is now separated into alphabetically sorted sections. So nice and neat! --- modules/lang/org/autoload/org.el | 170 +++++++++++++++++-------------- 1 file changed, 92 insertions(+), 78 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index c11736e95..143f13d1c 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -1,5 +1,18 @@ ;;; org/org/autoload/org.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +org-get-property (name &optional _file) ; TODO Add FILE + "Get a propery from an org file." + (save-excursion + (goto-char 1) + (re-search-forward (format "^#\\+%s:[ \t]*\\([^\n]+\\)" (upcase name)) nil t) + (buffer-substring-no-properties (match-beginning 1) (match-end 1)))) + + +;; +;; Modes +;; + ;;;###autoload (define-minor-mode +org-pretty-mode "TODO" @@ -12,18 +25,10 @@ ;; In case the above un-align tables (org-table-map-tables 'org-table-align t))) -;;;###autoload -(defun +org|realign-table-maybe () - "Auto-align table under cursor and re-calculate formulas." - (when (org-at-table-p) - (save-excursion - (quiet! (org-table-recalculate))))) -;;;###autoload -(defun +org|update-cookies () - "Update counts in headlines (aka \"cookies\")." - (when (and buffer-file-name (file-exists-p buffer-file-name)) - (org-update-statistics-cookies t))) +;; +;; Commands +;; ;;;###autoload (defun +org/dwim-at-point () @@ -111,54 +116,6 @@ If on a: (_ (+org/refresh-inline-images))) (set-window-start nil scroll-pt))) -;;;###autoload -(defun +org|indent-maybe () - "Indent the current item (header or item), if possible. Made for -`org-tab-first-hook'." - (interactive) - (cond ((org-at-item-p) - (org-indent-item-tree) - t) - ((org-at-heading-p) - (ignore-errors (org-demote)) - t) - ((org-in-src-block-p t) - (doom/dumb-indent) - t))) - -;;;###autoload -(defun +org|yas-expand-maybe () - "Tries to expand a yasnippet snippet, if one is available. Made for -`org-tab-first-hook'." - (when (and (if (bound-and-true-p evil-mode) - (eq evil-state 'insert) - t) - (bound-and-true-p yas-minor-mode) - (yas--templates-for-key-at-point)) - (call-interactively #'yas-expand) - t)) - -;;;###autoload -(defun +org/shifttab (&optional arg) - "An alternative to `org-shifttab' which performs smart indentation if in -insert mode (evil). Otherwise, forwards to the original `org-shifttab'." - (interactive) - (cond ((org-at-table-p) - (call-interactively #'org-table-previous-field)) - ((and (bound-and-true-p evil-mode) - (evil-insert-state-p)) - (cond ((org-at-item-p) - (org-list-indent-item-generic - -1 nil - (save-excursion - (when (org-region-active-p) - (goto-char (region-beginning))) - (org-list-struct)))) - ((org-at-heading-p) - (ignore-errors (org-promote))) - (t (call-interactively #'self-insert-command)))) - (t (org-shifttab arg)))) - ;;;###autoload (defun +org/insert-item (direction) "Inserts a new heading, table cell or item, depending on the context. @@ -245,12 +202,25 @@ wrong places)." (evil-insert 1)))) ;;;###autoload -(defun +org-get-property (name &optional _file) ; TODO Add FILE - "Get a propery from an org file." - (save-excursion - (goto-char 1) - (re-search-forward (format "^#\\+%s:[ \t]*\\([^\n]+\\)" (upcase name)) nil t) - (buffer-substring-no-properties (match-beginning 1) (match-end 1)))) +(defun +org/shifttab (&optional arg) + "An alternative to `org-shifttab' which performs smart indentation if in +insert mode (evil). Otherwise, forwards to the original `org-shifttab'." + (interactive) + (cond ((org-at-table-p) + (call-interactively #'org-table-previous-field)) + ((and (bound-and-true-p evil-mode) + (evil-insert-state-p)) + (cond ((org-at-item-p) + (org-list-indent-item-generic + -1 nil + (save-excursion + (when (org-region-active-p) + (goto-char (region-beginning))) + (org-list-struct)))) + ((org-at-heading-p) + (ignore-errors (org-promote))) + (t (call-interactively #'self-insert-command)))) + (t (org-shifttab arg)))) ;;;###autoload (defun +org/refresh-inline-images () @@ -267,6 +237,20 @@ wrong places)." (line-end-position) (save-excursion (org-end-of-subtree) (point)))))) +;;;###autoload +(defun +org/remove-link () + "Unlink the text at point." + (interactive) + (unless (org-in-regexp org-bracket-link-regexp 1) + (user-error "No link at point")) + (save-excursion + (let ((remove (list (match-beginning 0) (match-end 0))) + (description (if (match-end 3) + (match-string-no-properties 3) + (match-string-no-properties 1)))) + (apply #'delete-region remove) + (insert description)))) + ;;;###autoload (defun +org/toggle-checkbox () "Toggle the presence of a checkbox in the current item." @@ -294,17 +278,47 @@ with `org-cycle'). Also: (org-cycle) (set-window-start nil window-beg)))))) -;;;###autoload -(defun +org/remove-link () - "Unlink the text at point." - (interactive) - (unless (org-in-regexp org-bracket-link-regexp 1) - (user-error "No link at point")) - (save-excursion - (let ((remove (list (match-beginning 0) (match-end 0))) - (description (if (match-end 3) - (match-string-no-properties 3) - (match-string-no-properties 1)))) - (apply #'delete-region remove) - (insert description)))) +;; +;; Hooks +;; + +;;;###autoload +(defun +org|indent-maybe () + "Indent the current item (header or item), if possible. Made for +`org-tab-first-hook'." + (interactive) + (cond ((org-at-item-p) + (org-indent-item-tree) + t) + ((org-at-heading-p) + (ignore-errors (org-demote)) + t) + ((org-in-src-block-p t) + (doom/dumb-indent) + t))) + +;;;###autoload +(defun +org|realign-table-maybe () + "Auto-align table under cursor and re-calculate formulas." + (when (org-at-table-p) + (save-excursion + (quiet! (org-table-recalculate))))) + +;;;###autoload +(defun +org|update-cookies () + "Update counts in headlines (aka \"cookies\")." + (when (and buffer-file-name (file-exists-p buffer-file-name)) + (org-update-statistics-cookies t))) + +;;;###autoload +(defun +org|yas-expand-maybe () + "Tries to expand a yasnippet snippet, if one is available. Made for +`org-tab-first-hook'." + (when (and (if (bound-and-true-p evil-mode) + (eq evil-state 'insert) + t) + (bound-and-true-p yas-minor-mode) + (yas--templates-for-key-at-point)) + (call-interactively #'yas-expand) + t)) From 5b92c3d99f8438eadcfe31b42e06b468f11feb41 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 18:33:36 -0500 Subject: [PATCH 0432/4235] lang/org: add evil insert check to +org|indent-maybe --- modules/lang/org/autoload/org.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 143f13d1c..03bac69dd 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -288,7 +288,10 @@ with `org-cycle'). Also: "Indent the current item (header or item), if possible. Made for `org-tab-first-hook'." (interactive) - (cond ((org-at-item-p) + (cond ((and (bound-and-true-p evil-mode) + (not (eq evil-state 'insert))) + nil) + ((org-at-item-p) (org-indent-item-tree) t) ((org-at-heading-p) From e79942de2e45771107d036db35c20ec47689624d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 19:41:05 -0500 Subject: [PATCH 0433/4235] lang/org: improve tab indent in src blocks I realize org-src-tab-acts-natively exists, but it doesn't work for me. This little fix (plus the next commit's editorconfig fix) should make tab act much more reliably in src blocks. --- modules/lang/org/autoload/org.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 03bac69dd..1812ae0c2 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -298,7 +298,8 @@ with `org-cycle'). Also: (ignore-errors (org-demote)) t) ((org-in-src-block-p t) - (doom/dumb-indent) + (org-babel-do-in-edit-buffer + (call-interactively #'indent-for-tab-command)) t))) ;;;###autoload From 11e5140b98ceb69513903096dc9c8d9fab4a6dac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 19:42:31 -0500 Subject: [PATCH 0434/4235] Fix editorconfig file ext 'guesser' in org-edit-src buffers Fixes editorconfig not correctly guessing style settings in org-edit-src buffers. --- core/core-editor.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b70117ada..1e4d36367 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -136,12 +136,13 @@ fundamental-mode) for performance sake." "Retrieve the properties for the current file. If it doesn't have an extension, try to guess one." (let ((buffer-file-name - (if (file-name-extension buffer-file-name) + (if (and (not (bound-and-true-p org-src-mode)) + (file-name-extension buffer-file-name)) buffer-file-name (format "%s%s" buffer-file-name - (let ((ext (cdr (assq major-mode doom-editorconfig-mode-alist)))) - (or (and ext (concat "." ext)) - "")))))) + (if-let* ((ext (cdr (assq major-mode doom-editorconfig-mode-alist)))) + (concat "." ext) + ""))))) (apply orig-fn args))) (advice-add #'editorconfig-call-editorconfig-exec :around #'doom*editorconfig-smart-detection) From 0b9ac52d27b7da62a30779395242c1be4bc04618 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Feb 2018 19:46:23 -0500 Subject: [PATCH 0435/4235] ui/doom-modeline: remove eldoc-eval #420 eldoc has this functionality built-in. --- modules/ui/doom-modeline/config.el | 21 --------------------- modules/ui/doom-modeline/packages.el | 1 - 2 files changed, 22 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 38d23f9fe..35e1abc6d 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -1,26 +1,5 @@ ;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- -(def-package! eldoc-eval - :config - (defun +doom-modeline-eldoc (text) - (concat (when (display-graphic-p) - (+doom-modeline--make-xpm 'doom-modeline-eldoc-bar)) - text)) - - ;; Show eldoc in the mode-line with `eval-expression' - (defun +doom-modeline--show-eldoc (input) - "Display string STR in the mode-line next to minibuffer." - (with-current-buffer (eldoc-current-buffer) - (let* ((str (and (stringp input) input)) - (mode-line-format (or (and str (or (+doom-modeline-eldoc str) str)) - mode-line-format)) - mode-line-in-non-selected-windows) - (force-mode-line-update) - (sit-for eldoc-show-in-mode-line-delay)))) - (setq eldoc-in-minibuffer-show-fn #'+doom-modeline--show-eldoc) - - (eldoc-in-minibuffer-mode +1)) - ;; anzu and evil-anzu expose current/total state that can be displayed in the ;; mode-line. (def-package! evil-anzu diff --git a/modules/ui/doom-modeline/packages.el b/modules/ui/doom-modeline/packages.el index 38ee48bd5..b5f2ee002 100644 --- a/modules/ui/doom-modeline/packages.el +++ b/modules/ui/doom-modeline/packages.el @@ -13,7 +13,6 @@ ;;(require 'iedit) ;;(require 'evil-multiedit) -(package! eldoc-eval) (when (featurep! :feature evil) (package! evil-anzu)) From f6039eaee32b8ad2573b402809a6da79f09e1095 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 00:51:20 -0500 Subject: [PATCH 0436/4235] Use delay-warning instead of message in warn! macro --- core/autoload/message.el | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 0284d1f5f..0c79de542 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -82,14 +82,11 @@ interactive session." ;;;###autoload (defmacro warn! (message &rest args) "Output a colored warning for the current module in the *Messages* buffer." - (let ((msg (format "WARNING: %s" (format message args)))) - (if (file-in-directory-p load-file-name doom-modules-dir) - `(cl-destructuring-bind (cat . mod) (doom-module-from-path load-file-name) - (message - "%s" - (propertize (format "%s %s" (list cat mod) ,msg) - 'face 'warning))) - `(message "%s" (propertize ,msg 'face 'warning))))) + (if (file-in-directory-p load-file-name doom-modules-dir) + `(cl-destructuring-bind (cat . mod) (doom-module-from-path ,load-file-name) + (delay-warning (format "%s %s" cat mod) (format ,message ,@args) :warning)) + `(delay-warning (file-relative-name load-file-name doom-emacs-dir) + (format ,message ,@args) :warning))) ;;;###autoload (defmacro log! (message &rest args) From aae7ca258b3b113068d457460a3ceade69cf8436 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Wed, 14 Feb 2018 00:34:28 -0800 Subject: [PATCH 0437/4235] Fix keybinding Both flycheck-mode and toggle-frame-fullscreen seem to be bound to "SPC t f", which means that only the second binding gets applied and there's no binding to toggle flycheck. This PR simply changes the fullscreen binding to capital F. --- modules/private/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 317453f44..07437e334 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -286,7 +286,7 @@ :desc "Flyspell" :n "s" #'flyspell-mode :desc "Flycheck" :n "f" #'flycheck-mode :desc "Line numbers" :n "l" #'doom/toggle-line-numbers - :desc "Frame fullscreen" :n "f" #'toggle-frame-fullscreen + :desc "Frame fullscreen" :n "F" #'toggle-frame-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 From 5e5d07543198ccfb7aaf9bbc79470ff8d2097530 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 02:26:16 -0500 Subject: [PATCH 0438/4235] New doom/*-this-file commands; move doom/sudo* to new files library --- core/autoload/editor.el | 15 ---- core/autoload/files.el | 116 +++++++++++++++++++++++++ modules/feature/evil/autoload/files.el | 86 ++---------------- 3 files changed, 124 insertions(+), 93 deletions(-) create mode 100644 core/autoload/files.el diff --git a/core/autoload/editor.el b/core/autoload/editor.el index f26a6d283..5973198c2 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -1,20 +1,5 @@ ;;; core/autoload/editor.el -*- lexical-binding: t; -*- -;;;###autoload -(defun doom/sudo-find-file (file) - "Open FILE as root." - (interactive - (list (read-file-name "Open as root: "))) - (find-file (if (file-writable-p file) - file - (concat "/sudo:root@localhost:" file)))) - -;;;###autoload -(defun doom/sudo-this-file () - "Open the current file as root." - (interactive) - (doom/sudo-find-file (file-truename buffer-file-name))) - ;;;###autoload (defun doom/backward-to-bol-or-indent () "Jump between the indentation column (first non-whitespace character) and the diff --git a/core/autoload/files.el b/core/autoload/files.el new file mode 100644 index 000000000..b45c66df6 --- /dev/null +++ b/core/autoload/files.el @@ -0,0 +1,116 @@ +;;; core/autoload/files.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun doom/sudo-find-file (file) + "Open FILE as root." + (interactive + (list (read-file-name "Open as root: "))) + (find-file (if (file-writable-p file) + file + (concat "/sudo:root@localhost:" file)))) + +;;;###autoload +(defun doom/sudo-this-file () + "Open the current file as root." + (interactive) + (doom/sudo-find-file (file-truename buffer-file-name))) + + +;; +(defun doom--forget-file (old-path &optional new-path) + "Ensure `recentf', `projectile' and `save-place' forget OLD-PATH." + (when (bound-and-true-p recentf-mode) + (when new-path + (recentf-add-file new-path)) + (recentf-remove-if-non-kept old-path)) + (when (and projectile-mode + (projectile-project-p) + (projectile-file-cached-p old-path (projectile-project-root))) + (projectile-purge-file-from-cache old-path)) + (when (bound-and-true-p save-place-mode) + (save-place-forget-unreadable-files))) + +(defun doom--copy-file (old-path new-path &optional force-p) + (let* ((new-path (expand-file-name new-path)) + (old-path (file-truename old-path)) + (new-path (apply #'expand-file-name + (if (or (directory-name-p new-path) + (file-directory-p new-path)) + (list (file-name-nondirectory old-path) new-path) + (list new-path)))) + (new-path-dir (file-name-directory new-path)) + (project-root (doom-project-root)) + (short-new-name (if (file-in-directory-p new-path project-root) + (file-relative-name new-path project-root) + (abbreviate-file-name new-path)))) + (unless (file-directory-p new-path-dir) + (make-directory new-path-dir t)) + (when (buffer-modified-p) + (save-buffer)) + (cond ((equal (file-truename old-path) + (file-truename new-path)) + (throw 'status 'overwrite-self)) + ((and (file-exists-p new-path) + (not force-p) + (not (y-or-n-p (format "File already exists at %s, overwrite?" short-new-name)))) + (throw 'status 'aborted)) + (t + (copy-file old-path new-path t) + short-new-name)))) + +;;;###autoload +(defun doom/delete-this-file (&optional path force-p) + "Delete FILENAME (defaults to the file associated with current buffer) and +kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." + (interactive + (list (file-truename (buffer-file-name)) + current-prefix-arg)) + (let* ((fbase (file-name-sans-extension (file-name-nondirectory path))) + (buf (current-buffer))) + (cond ((not (file-exists-p path)) + (error "File doesn't exist: %s" path)) + ((not (or force-p (y-or-n-p (format "Really delete %s?" fbase)))) + (message "Aborted") + nil) + (t + (unwind-protect + (progn (delete-file path) t) + (let ((short-path (file-relative-name path (doom-project-root)))) + (if (file-exists-p path) + (error "Failed to delete %s" short-path) + ;; Ensures that windows displaying this buffer will be switched + ;; to real buffers (`doom-real-buffer-p') + (doom/kill-this-buffer-in-all-windows buf t) + (doom--forget-file path) + (message "Successfully deleted %s" short-path)))))))) + +;;;###autoload +(defun doom/copy-this-file (new-path &optional force-p) + "Copy current buffer's file to NEW-PATH. If FORCE-P, overwrite the destination +file if it exists, without confirmation." + (interactive "F") + (pcase (catch 'status + (when-let* ((dest (doom--copy-file (buffer-file-name) new-path force-p))) + (message "File successfully copied to %s" dest))) + (`overwrite-self (error "Cannot overwrite self")) + (`aborted (message "Aborted")) + (_ t))) + +;;;###autoload +(defun doom/move-this-file (new-path &optional force-p) + "Move current buffer's file to NEW-PATH. If FORCE-P, overwrite the destination +file if it exists, without confirmation." + (interactive "FP") + (pcase (catch 'status + (let ((old-path (buffer-file-name)) + (new-path (expand-file-name new-path))) + (when-let* ((dest (doom--copy-file old-path new-path force-p))) + (delete-file old-path) + (kill-this-buffer) + (find-file new-path) + (doom--forget-file old-path new-path) + (message "File successfully moved to %s" dest)))) + (`overwrite-self (error "Cannot overwrite self")) + (`aborted (message "Aborted")) + (_ t))) + diff --git a/modules/feature/evil/autoload/files.el b/modules/feature/evil/autoload/files.el index c7d293281..d94705021 100644 --- a/modules/feature/evil/autoload/files.el +++ b/modules/feature/evil/autoload/files.el @@ -1,71 +1,13 @@ ;;; feature/evil/autoload/files.el -*- lexical-binding: t; -*- -(defun +evil--forget-file (old-path &optional new-path) - "Ensure `recentf', `projectile' and `save-place' forget OLD-PATH." - (when (bound-and-true-p recentf-mode) - (when new-path - (recentf-add-file new-path)) - (recentf-remove-if-non-kept old-path)) - (when (and projectile-mode - (projectile-project-p) - (projectile-file-cached-p old-path (projectile-project-root))) - (projectile-purge-file-from-cache old-path)) - (when (bound-and-true-p save-place-mode) - (save-place-forget-unreadable-files))) - ;;;###autoload (autoload '+evil:delete-this-file "feature/evil/autoload/files" nil t) (evil-define-command +evil:delete-this-file (&optional filename force-p) "Delete FILENAME (defaults to the file associated with current buffer) and kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." :repeat nil (interactive "") - (let* ((fname (file-truename (or filename (buffer-file-name)))) - (fbase (file-name-sans-extension (file-name-nondirectory fname))) - (buf (current-buffer))) - (cond ((not (file-exists-p fname)) - (error "File doesn't exist: %s" fname)) - ((not (or force-p (y-or-n-p (format "Really delete %s?" fbase)))) - (message "Aborted") - nil) - (t - (unwind-protect - (progn (delete-file fname) t) - (let ((short-path (file-relative-name fname (doom-project-root)))) - (if (file-exists-p fname) - (error "Failed to delete %s" short-path) - ;; Ensures that windows displaying this buffer will be switched - ;; to real buffers (`doom-real-buffer-p') - (doom/kill-this-buffer-in-all-windows buf t) - (+evil--forget-file fname) - (message "Successfully deleted %s" short-path)))))))) - -(defun +evil--copy-file (old-path new-path &optional force-p) - (let* ((new-path (expand-file-name new-path)) - (old-path (file-truename old-path)) - (new-path (apply #'expand-file-name - (if (or (directory-name-p new-path) - (file-directory-p new-path)) - (list (file-name-nondirectory old-path) new-path) - (list new-path)))) - (new-path-dir (file-name-directory new-path)) - (project-root (doom-project-root)) - (short-new-name (if (file-in-directory-p new-path project-root) - (file-relative-name new-path project-root) - (abbreviate-file-name new-path)))) - (unless (file-directory-p new-path-dir) - (make-directory new-path-dir t)) - (when (buffer-modified-p) - (save-buffer)) - (cond ((equal (file-truename old-path) - (file-truename new-path)) - (throw 'status 'overwrite-self)) - ((and (file-exists-p new-path) - (not force-p) - (not (y-or-n-p (format "File already exists at %s, overwrite?" short-new-name)))) - (throw 'status 'aborted)) - (t - (copy-file old-path new-path t) - short-new-name)))) + (doom/delete-this-file (or filename (file-truename buffer-file-name)) + force-p)) ;;;###autoload (autoload '+evil:move-this-file "feature/evil/autoload/files" nil t) (evil-define-command +evil:move-this-file (new-path &optional force-p) @@ -74,18 +16,9 @@ filename modifiers (see `+evil*ex-replace-special-filenames'). If FORCE-P, overwrite the destination file if it exists, without confirmation." :repeat nil (interactive "") - (pcase (catch 'status - (let ((old-path (buffer-file-name)) - (new-path (expand-file-name new-path))) - (when-let* ((dest (+evil--copy-file old-path new-path force-p))) - (delete-file old-path) - (kill-this-buffer) - (find-file new-path) - (+evil--forget-file old-path new-path) - (message "File successfully moved to %s" dest)))) - ('overwrite-self (error "Cannot overwrite self")) - ('aborted (message "Aborted")) - (_ t))) + (when (or (not new-path) (string-empty-p new-path)) + (user-error "No new path was specified")) + (doom/move-this-file new-path force-p)) ;;;###autoload (autoload '+evil:copy-this-file "feature/evil/autoload/files" nil nil) (evil-define-command +evil:copy-this-file (new-path &optional force-p) @@ -94,10 +27,7 @@ filename modifiers (see `+evil*ex-replace-special-filenames'). If FORCE-P, overwrite the destination file if it exists, without confirmation." :repeat nil (interactive "") - (pcase (catch 'status - (when-let* ((dest (+evil--copy-file (buffer-file-name) new-path force-p))) - (message "File successfully copied to %s" dest))) - ('overwrite-self (error "Cannot overwrite self")) - ('aborted (message "Aborted")) - (_ t))) + (when (or (not new-path) (string-empty-p new-path)) + (user-error "No new path was specified")) + (doom/copy-this-file new-path force-p)) From 11373e0128d31dd9b47c7b02963d0d930c93b48a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 03:21:33 -0500 Subject: [PATCH 0439/4235] Move doom-ansi-apply away from macros + add docstring --- core/autoload/message.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 0c79de542..1f54dd245 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -35,6 +35,17 @@ (strike . 9)) "List of styles.") +;;;###autoload +(defun doom-ansi-apply (code message &rest args) + "Apply the ansi CODE to formatted MESSAGE with ARGS." + (let ((rule (or (assq code doom-message-fg) + (assq code doom-message-bg) + (assq code doom-message-fx)))) + (format "\e[%dm%s\e[%dm" + (cdr rule) + (apply #'format message args) + 0))) + ;;;###autoload (defmacro format! (message &rest args) "An alternative to `format' that strips out ANSI codes if used in an @@ -69,16 +80,6 @@ interactive session." (pop-to-buffer buf) (goto-char (point-max))))) -;;;###autoload -(defun doom-ansi-apply (code format &rest args) - (let ((rule (or (assq code doom-message-fg) - (assq code doom-message-bg) - (assq code doom-message-fx)))) - (format "\e[%dm%s\e[%dm" - (cdr rule) - (apply #'format format args) - 0))) - ;;;###autoload (defmacro warn! (message &rest args) "Output a colored warning for the current module in the *Messages* buffer." From b43743d565faefd8556ae2843b3eb016da720a3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 05:06:26 -0500 Subject: [PATCH 0440/4235] lang/cc: fix smartparens not autopairing/skipping <> Also removed +cc/autoclose->-maybe -- let smartparens handle this. --- modules/lang/cc/autoload.el | 15 ++++----------- modules/lang/cc/config.el | 14 ++++++++------ 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 896d61377..929d5af02 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -32,21 +32,14 @@ 0 ; no additional indent (apply orig-fun args))) -;;;###autoload -(defun +cc/autoclose->-maybe () - "For some reason smartparens won't autoskip >'s, this hack does." - (interactive) - (if (save-excursion - (backward-char) - (looking-at-p "[^ \t]>")) - (forward-char) - (call-interactively #'self-insert-command))) - ;;;###autoload (defun +cc-sp-point-is-template-p (id action context) "Return t if point is in the right place for C++ angle-brackets." (and (sp-in-code-p id action context) - (sp-point-after-word-p id action context))) + (cond ((eq action 'insert) + (sp-point-after-word-p id action context)) + ((eq action 'autoskip) + (/= (char-before) 32))))) ;;;###autoload (defun +cc-sp-point-after-include-p (id action context) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index c47de2917..0160b8794 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -47,7 +47,8 @@ compilation database is present in the project.") (push (cons #'+cc-objc-header-file-p 'objc-mode) magic-mode-alist) :init - (setq-default c-basic-offset tab-width) + (setq-default c-basic-offset tab-width + c-backspace-function #'delete-backward-char) :config (set! :electric '(c-mode c++-mode objc-mode java-mode) @@ -84,18 +85,19 @@ compilation database is present in the project.") ;; custom bindings. We'll do this ourselves. (setq c-tab-always-indent nil c-electric-flag nil) - (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")")) + (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) (define-key c-mode-base-map key nil)) ;; Smartparens and cc-mode both try to autoclose angle-brackets intelligently. ;; The result isn't very intelligent (causes redundant characters), so just do ;; it ourselves. - (map! :map c++-mode-map - "<" nil - :i ">" #'+cc/autoclose->-maybe) + (map! :map c++-mode-map "<" nil ">" nil) ;; ...and leave it to smartparens + (sp-with-modes '(c++-mode objc-mode) + (sp-local-pair "<" ">" + :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p) + :post-handlers '(("| " "SPC")))) (sp-with-modes '(c-mode c++-mode objc-mode java-mode) - (sp-local-pair "<" ">" :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p)) (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))) ;; Doxygen blocks (sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC"))) From 57adae5ec6caf1c3b76e0b9044e5e6470998519b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 05:10:48 -0500 Subject: [PATCH 0441/4235] Introduce more opinionated backspace/del/newline behavior + Instead of remapping delete-backward-char to doom/delete-backward-char (which was unreliable, depending on the mode), it is now overridden with it, without sacrificing its original functionality. The new behavior is as follows: + Fall back to sp-backward-delete-char when it makes sense to delete the adjacent pair: {|} => | + Collapse an indented pair block, if at bolp in between: { | } => {|} + Refresh a pair's :post-handlers when deleting into pair: { | } => {|} => { | } (can be repeated) + When cursor is preceded by whitespace, delete in increments of tab-width. + newline-and-indent has been advised to: + Only newline when in a string. + Continue comment lines consistently (needs more testing!) + Falls back to basic newline-and-indent, without affecting whitespace in the origin line (it would originally delete-horizontal-space before creating a new line). + Incorporates a set of reasonable defaults for brace expansion on RET or SPC, as mentioned in #343 and #413. Affects #343, #413 --- core/autoload/editor.el | 224 ++++++++++++++++----------- modules/private/default/+bindings.el | 25 +-- modules/private/default/config.el | 45 ++++++ 3 files changed, 181 insertions(+), 113 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 5973198c2..c4de816f9 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -1,5 +1,33 @@ ;;; core/autoload/editor.el -*- lexical-binding: t; -*- +;;;###autoload +(defun doom-surrounded-p (&optional pair inline balanced) + "Returns t if point is surrounded by a brace delimiter: {[( + +If INLINE is non-nil, only returns t if braces are on the same line, and +whitespace is balanced on either side of the cursor. + +If INLINE is nil, returns t if the opening and closing braces are on adjacent +lines, above and below, with only whitespace in between." + (when-let* ((pair (or pair (sp-get-thing)))) + (let ((op (plist-get pair :op)) + (cl (plist-get pair :cl))) + (and op cl + (not (string-empty-p op)) + (not (string-empty-p cl)) + (let ((beg (+ (length op) (plist-get pair :beg))) + (end (- (plist-get pair :end) (length cl))) + (pt (point))) + (let ((content (buffer-substring-no-properties beg end))) + (and (string-match-p (format "[ %s]*" (if inline "" "\n")) content) + (or (not balanced) + (= (- pt beg) (- end pt)))))))))) + + +;; +;; Commands +;; + ;;;###autoload (defun doom/backward-to-bol-or-indent () "Jump between the indentation column (first non-whitespace character) and the @@ -43,12 +71,6 @@ true end of the line. The opposite of `doom/backward-to-bol-or-indent'." ((/= bol boc) (goto-char boc))))))) -(defun doom--surrounded-p () - (and (looking-back "[[{(]\\(\s+\\|\n\\)?\\(\s\\|\t\\)*" (line-beginning-position)) - (let* ((whitespace (match-string 1)) - (match-str (concat whitespace (match-string 2) "[])}]"))) - (looking-at-p match-str)))) - ;;;###autoload (defun doom/dumb-indent () "Inserts a tab character (or spaces x tab-width)." @@ -78,7 +100,7 @@ true end of the line. The opposite of `doom/backward-to-bol-or-indent'." ;;;###autoload (defun doom/backward-kill-to-bol-and-indent () "Kill line to the first non-blank character. If invoked again -afterwards, kill line to column 1." +afterwards, kill line to beginning of line." (interactive) (let ((empty-line-p (save-excursion (beginning-of-line) (looking-at-p "[ \t]*$")))) @@ -94,109 +116,97 @@ afterwards, kill line to column 1." "Delete back to the previous column of whitespace, or as much whitespace as possible, or just one char if that's not possible." (interactive) - (let* ((delete-backward-char (if (derived-mode-p 'org-mode) - #'org-delete-backward-char - #'delete-backward-char)) - (context (sp--get-pair-list-context 'navigate)) - (open-pair-re (sp--get-opening-regexp context)) - (close-pair-re (sp--get-closing-regexp context)) + (let* ((context (sp-get-thing)) + (op (plist-get context :op)) + (cl (plist-get context :cl)) open-len close-len) (cond ;; When in strings (sp acts weird with quotes; this is the fix) ;; Also, skip closing delimiters - ((and (and (sp--looking-back open-pair-re) - (setq open-len (- (match-beginning 0) (match-end 0)))) - (and (looking-at close-pair-re) - (setq close-len (- (match-beginning 0) (match-end 0)))) - (string= (plist-get (sp-get-thing t) :op) - (plist-get (sp-get-thing) :cl))) - (delete-char (- 0 open-len)) + ((and (string= op cl) + (and (string= (char-to-string (char-before)) op) + (setq open-len (length op))) + (and (string= (char-to-string (char-after)) cl) + (setq close-len (length cl)))) + (delete-char (- open-len)) (delete-char close-len)) ;; Delete up to the nearest tab column IF only whitespace between ;; point and bol. - ((save-match-data (looking-back "^[\\t ]*" (line-beginning-position))) - (let ((movement (% (current-column) tab-width)) - (p (point))) + ((and (not indent-tabs-mode) + (not (bolp)) + (not (sp-point-in-string)) + (save-excursion (>= (- (skip-chars-backward " \t")) tab-width))) + (let ((movement (% (current-column) tab-width))) (when (= movement 0) (setq movement tab-width)) - (save-match-data - (if (string-match "\\w*\\(\\s-+\\)$" - (buffer-substring-no-properties (max (point-min) (- p movement)) p)) - (sp-delete-char - (- 0 (- (match-end 1) - (match-beginning 1)))) - (call-interactively delete-backward-char))))) + (delete-char (- movement))) + (unless (memq (char-before) (list ?\n ?\ )) + (insert " "))) ;; Otherwise do a regular delete - (t (call-interactively delete-backward-char))))) + (t (delete-char -1))))) ;;;###autoload -(defun doom/inflate-space-maybe () - "Checks if point is surrounded by {} [] () delimiters and adds a -space on either side of the point if so." - (interactive) - (let ((command (or (command-remapping #'self-insert-command) - #'self-insert-command))) - (cond ((doom--surrounded-p) - (call-interactively command) - (save-excursion (call-interactively command))) - (t - (call-interactively command))))) +(defun doom/delete-backward-char (n &optional killflag) + "Same as `delete-backward-char', but preforms these additional checks: -;;;###autoload -(defun doom/deflate-space-maybe () - "Checks if point is surrounded by {} [] () delimiters, and deletes -spaces on either side of the point if so. Resorts to -`doom/backward-delete-whitespace-to-column' otherwise." - (interactive) - (save-match-data - (if (doom--surrounded-p) - (let ((whitespace-match (match-string 1))) - (cond ((not whitespace-match) - (call-interactively #'delete-backward-char)) - ((string-match "\n" whitespace-match) - (funcall (if (featurep 'evil) - #'evil-delete - #'delete-region) - (point-at-bol) (point)) - (call-interactively #'delete-backward-char) - (save-excursion (call-interactively #'delete-char))) - (t (just-one-space 0)))) - (doom/backward-delete-whitespace-to-column)))) - -;;;###autoload -(defun doom/newline-and-indent () - "Inserts a newline and possibly indents it. Also continues comments if -executed from a commented line; handling special cases for certain languages -with weak native support." - (interactive) - (cond ((sp-point-in-string) - (newline)) - ((sp-point-in-comment) - (pcase major-mode - ((or 'js2-mode 'rjsx-mode) - (call-interactively #'js2-line-break)) - ((or 'java-mode 'php-mode) - (c-indent-new-comment-line)) - ((or 'c-mode 'c++-mode 'objc-mode 'css-mode 'scss-mode 'js2-mode) - (newline-and-indent) - (insert "* ") - (indent-according-to-mode)) - (_ - ;; Fix an off-by-one cursor-positioning issue - ;; with `indent-new-comment-line' - (let ((col (save-excursion (comment-beginning) (current-column)))) - (indent-new-comment-line) - (unless (= col (current-column)) - (insert " ")))))) - (t - (newline nil t) - (indent-according-to-mode)))) ++ If point is surrounded by (balanced) whitespace and a brace delimiter ({} [] + ()), delete a space on either side of the cursor. ++ If point is at BOL and surrounded by braces on adjacent lines, collapse + newlines: + { + | + } => {|} ++ Otherwise, resort to `doom/backward-delete-whitespace-to-column'. ++ Resorts to `delete-char' if n > 1" + (interactive "p\nP") + (unless (integerp n) + (signal 'wrong-type-argument (list 'integerp n))) + (cond ((and (use-region-p) + delete-active-region + (= n 1)) + ;; If a region is active, kill or delete it. + (if (eq delete-active-region 'kill) + (kill-region (region-beginning) (region-end) 'region) + (funcall region-extract-function 'delete-only))) + ;; In Overwrite mode, maybe untabify while deleting + ((null (or (null overwrite-mode) + (<= n 0) + (memq (char-before) '(?\t ?\n)) + (eobp) + (eq (char-after) ?\n))) + (let ((ocol (current-column))) + (delete-char (- n) killflag) + (save-excursion + (insert-char ?\s (- ocol (current-column)) nil)))) + ;; + ((and (= n 1) (not (minibufferp))) + (let* ((pair (sp-get-thing)) + (op (plist-get pair :op)) + (cl (plist-get pair :cl)) + (beg (plist-get pair :beg)) + (end (plist-get pair :end))) + (cond ((and end beg (= end (+ beg (length op) (length cl)))) + (sp-backward-delete-char 0)) + ((doom-surrounded-p pair :inline :balanced) + (delete-char -1 killflag) + (delete-char 1) + (when (= (point) (+ (length cl) beg)) + (sp-backward-delete-char 1) + (sp-insert-pair op))) + ((and (bolp) (doom-surrounded-p pair)) + (delete-region beg end) + (sp-insert-pair op)) + (t + (doom/backward-delete-whitespace-to-column))))) + ;; Otherwise, do simple deletion. + (t (delete-char (- n) killflag)))) ;;;###autoload (defun doom/retab (&optional beg end) - "Changes all tabs to spaces or spaces to tabs, so that indentation is -consistent throughout a selected region, depending on `indent-tab-mode'." + "Converts tabs-to-spaces or spaces-to-tabs within BEG and END (defaults to +buffer start and end, to make indentation consistent. Which it does depends on +the value of `indent-tab-mode'." (interactive "r") (unless (and beg end) (setq beg (point-min) @@ -228,7 +238,33 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" (t (widen)))) + +;; +;; Advice +;; + +;;;###autoload +(defun doom*newline-and-indent (orig-fn) + "Inserts a newline and possibly indents it. Also continues comments if +executed from a commented line; handling special cases for certain languages +with weak native support." + (interactive) + (cond ((sp-point-in-string) + (newline)) + ((and (sp-point-in-comment) + comment-line-break-function) + (funcall comment-line-break-function)) + (t + (newline nil t) + (indent-according-to-mode)))) + + +;; +;; Hooks +;; + ;;;###autoload (defun doom|enable-delete-trailing-whitespace () - "Attaches `delete-trailing-whitespace' to a buffer-local `before-save-hook'." + "Enables the automatic deletion of trailing whitespaces upon file save, by +attaching `delete-trailing-whitespace' to a buffer-local `before-save-hook'." (add-hook 'before-save-hook #'delete-trailing-whitespace nil t)) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index 317453f44..69e0b32fe 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -9,6 +9,7 @@ (map! [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag + [remap newline] #'newline-and-indent ;; Ensure there are no conflicts :nmvo doom-leader-key nil @@ -698,27 +699,13 @@ :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 + :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 + :ig [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-b" #'backward-word + :i "C-f" #'forward-word ;; Restore common editing keys (and ESC) in minibuffer (:map (minibuffer-local-map diff --git a/modules/private/default/config.el b/modules/private/default/config.el index b6d59293f..ce7b25609 100644 --- a/modules/private/default/config.el +++ b/modules/private/default/config.el @@ -23,6 +23,51 @@ epa-pinentry-mode 'loopback)) +;; disable :unless predicates with (sp-pair "'" nil :unless nil) +;; disable :post-handlers with (sp-pair "{" nil :post-handlers nil) +;; ...or specific :post-handlers with (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) +(after! smartparens + ;; Autopair quotes more conservatively; if I'm next to a word/before another + ;; quote, I likely don't want another pair. + (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)) + + ;; Expand {|} => { | } + ;; Expand {|} => { + ;; | + ;; } + (dolist (brace '("(" "{" "[")) + (sp-pair brace nil + :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) + ;; I likely don't want a new pair if adjacent to a word or opening brace + :unless '(sp-point-before-word-p sp-point-before-same-p))) + + ;; Don't do square-bracket space-expansion where it doesn't make sense to + (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) + "[" nil :post-handlers '(:rem ("| " "SPC"))) + + ;; Highjacks backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented `tab-width' steps at a time + ;; c) close empty multiline brace blocks in one step: + ;; { + ;; | + ;; } + ;; becomes {|} + ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work + ;; even after a backspace. + ;; e) properly delete smartparen pairs when they are encountered, without the + ;; need for strict mode. + ;; f) do none of this when inside a string + (advice-add #'delete-backward-char :override #'doom/delete-backward-char) + + ;; Makes `newline-and-indent' smarter when dealing with comments + (advice-add #'newline-and-indent :around #'doom*newline-and-indent)) + + (when (featurep 'evil) (when (featurep! +evil-commands) (load! +evil-commands)) From 38903d07e87ca2f1a3a1966c1c9abd2bfe50bcba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 05:52:07 -0500 Subject: [PATCH 0442/4235] lang/go: relax warnings + Don't default to goimports unless it's available. + No warning if goimports is missing. --- modules/lang/go/config.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index ec21d708f..b20c76afa 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -4,13 +4,8 @@ :mode "\\.go$" :interpreter "go" :config - (add-hook 'go-mode-hook #'flycheck-mode) - - (setq gofmt-command "goimports" - gofmt-show-errors nil) - (if (not (executable-find "goimports")) - (warn "go-mode: couldn't find goimports; no code formatting/fixed imports on save") - (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t))) + (when (executable-find "goimports") + (setq gofmt-command "goimports")) (set! :repl 'go-mode #'gorepl-run) (set! :lookup 'go-mode @@ -18,6 +13,11 @@ :references #'go-guru-referrers :documentation #'godoc-at-point) + (setq gofmt-show-errors nil) ; Leave it to flycheck + (add-hook 'go-mode-hook #'flycheck-mode) + (add-hook! go-mode + (add-hook 'before-save-hook #'gofmt-before-save nil t)) + (def-menu! +go/refactor-menu "Refactoring commands for `go-mode' buffers." '(("Add import" :exec go-import-add :region nil) From d634a7e69d1223e72062b8a0f18643c667ecd58f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 05:53:53 -0500 Subject: [PATCH 0443/4235] lang/go: put keybinds in evil maps to fix hijacked SPC in go-mode --- modules/lang/go/config.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index b20c76afa..694e685c7 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -57,12 +57,12 @@ (map! :map go-mode-map :localleader - "r" #'+go/refactor-menu - "b" #'+go/build-menu - "h" #'+go/help-menu - "t" #'+go/test-menu - :n "gr" #'go-play-buffer - :v "gr" #'go-play-region)) + :nr "r" #'+go/refactor-menu + :n "b" #'+go/build-menu + :n "h" #'+go/help-menu + :n "t" #'+go/test-menu + :n "r" #'go-play-buffer + :v "r" #'go-play-region)) (def-package! go-eldoc From 5ad4246cb9ffcff608d4dd2f6c40ba640d0382b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 06:08:25 -0500 Subject: [PATCH 0444/4235] lang/clojure: refactor; rainbow-delimiters-mode; :lookup Also add auto-mode-alist entry for clojurec-mode --- modules/lang/clojure/config.el | 35 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 4f72c68f8..5254ae0a2 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -3,19 +3,22 @@ (def-package! clojure-mode :mode "\\.clj$" :mode ("\\.cljs$" . clojurescript-mode) + :mode ("\\.cljc$" . clojurec-mode) :config + (add-hook 'clojure-mode #'rainbow-delimiters-mode) + (map! :map clojure-mode-map - (:localleader - :n "'" #'cider-jack-in - :n "\"" #'cider-jack-in-clojurescript - :n "B" #'cider-switch-to-repl-buffer - :n "b" #'cider-eval-buffer - :n "n" #'cider-repl-set-ns - :n "j" #'cider-find-var - :n "d" #'cider-doc - :n "c" #'cider-repl-clear-buffer - :n "p" #'cider-eval-sexp-at-point - :n "r" #'cider-eval-region))) + :localleader + :n "'" #'cider-jack-in + :n "\"" #'cider-jack-in-clojurescript + :n "B" #'cider-switch-to-repl-buffer + :n "b" #'cider-eval-buffer + :n "n" #'cider-repl-set-ns + :n "j" #'cider-find-var + :n "d" #'cider-doc + :n "c" #'cider-repl-clear-buffer + :n "p" #'cider-eval-sexp-at-point + :n "r" #'cider-eval-region)) (def-package! clj-refactor @@ -29,14 +32,20 @@ (def-package! cider - ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider jack in won't work. + ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider + ;; jack in won't work. :commands (cider-jack-in cider-mode cider-jack-in-clojurescript) :config (setq nrepl-hide-special-buffers t) - ;; settings for cider repl as a popup (prevent it from being closed on escape, especially.) + ;; settings for cider repl as a popup (prevent it from being closed on escape, + ;; especially.) (set! :popup "^\\*cider" nil '((quit) (select))) + (set! :lookup 'clojure-mode + :definition #'cider-browse-ns-find-at-point + :documentation #'cider-browse-ns-doc-at-point) + ;; Setup cider for clojurescript / figwheel dev. (setq cider-cljs-lein-repl "(do (require 'figwheel-sidecar.repl-api) From bac73ec938bb6710a9a14eb5790063f6c2a22b68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:40:05 -0500 Subject: [PATCH 0445/4235] Replace warn => warn! --- modules/app/write/config.el | 2 +- modules/lang/cc/config.el | 10 +++++----- modules/lang/crystal/config.el | 5 ++++- modules/lang/csharp/config.el | 6 +++--- modules/lang/go/config.el | 10 +++++----- modules/lang/haskell/+dante.el | 6 ++---- modules/lang/haskell/+intero.el | 3 +-- modules/lang/haskell/config.el | 9 ++++----- modules/lang/java/config.el | 2 +- modules/lang/plantuml/config.el | 7 ++++--- modules/lang/rust/config.el | 2 +- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index e19746c21..5db8ad4c6 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -36,7 +36,7 @@ (IS-LINUX "/usr/share/java/languagetool/languagetool-commandline.jar"))) (unless (file-exists-p langtool-language-tool-jar) - (warn "langtool: couldn't find languagetool-commandline.jar"))))) + (warn! "Couldn't find languagetool-commandline.jar"))))) (when (featurep! +wordnut) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 0160b8794..c89d83e72 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -119,7 +119,7 @@ compilation database is present in the project.") (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")) + (warn! "Irony server isn't installed. Run M-x irony-install-server")) ;; Initialize compilation database, if present. Otherwise, fall back on ;; `+cc-default-compiler-options'. (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options)) @@ -187,9 +187,9 @@ compilation database is present in the project.") :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)))) + (unless (executable-find "glslangValidator") + (warn! "Couldn't find glslangValidator. Code completion is disabled")) + (set! :company-backend 'glsl-mode '(company-glsl))) ;; @@ -210,7 +210,7 @@ compilation database is present in the project.") (let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) (if (/= (length bins) 0) - (warn "cc-mode: couldn't find the rtag client and/or server programs %s, disabling rtags support" bins) + (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins) (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) (set! :lookup '(c-mode c++-mode) :definition #'rtags-find-symbol-at-point diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index 738842bbe..a782a314b 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -19,4 +19,7 @@ (def-package! inf-crystal - :commands (inf-crystal crystal-switch-to-inf)) + :commands (inf-crystal crystal-switch-to-inf) + :config + (unless (executable-find "icr") + (warn! "Couldn't find icr. REPL will not work"))) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index e7907a32a..c994c4e07 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -9,10 +9,10 @@ (setq omnisharp-auto-complete-want-documentation nil omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (add-hook! csharp-mode #'(eldoc-mode flycheck-mode omnisharp-mode)) - (unless (file-exists-p (omnisharp--server-installation-path t)) - (warn "csharp-mode: omnisharp server isn't installed, completion won't work")) + (warn! "Omnisharp server isn't installed, completion won't work")) + + (add-hook! csharp-mode #'(eldoc-mode flycheck-mode omnisharp-mode)) (defun +csharp|cleanup-omnisharp-server () "Clean up the omnisharp server once you kill the last csharp-mode buffer." diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 694e685c7..cd655e9ef 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -76,14 +76,14 @@ go-guru-expand-region) :config (unless (executable-find "guru") - (warn "go-mode: couldn't find guru, refactoring commands won't work"))) + (warn! "Couldn't find guru. Refactoring commands (go-guru-*) won't work"))) (def-package! gorepl-mode :commands (gorepl-run gorepl-run-load-current-file) :config (unless (executable-find "gore") - (warn "go-mode: couldn't find gore, REPL support disabled"))) + (warn! "Couldn't find gore. REPL will not work"))) (def-package! company-go @@ -92,6 +92,6 @@ :after go-mode :config (setq company-go-show-annotation t) - (if (executable-find command-go-gocode-command) - (set! :company-backend 'go-mode '(company-go)) - (warn "go-mode: couldn't find gocode, code completion won't work"))) + (set! :company-backend 'go-mode '(company-go)) + (unless (executable-find command-go-gocode-command) + (warn! "Couldn't find gocode. Code completion won't work"))) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 9e580ae51..3064b5ff2 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -5,11 +5,9 @@ :after haskell-mode :hook (haskell-mode . dante-mode) :config - (add-hook 'haskell-mode-hook #'interactive-haskell-mode) - (unless (executable-find "cabal") - (warn "haskell-mode: couldn't find cabal") - (remove-hook 'haskell-mode-hook #'dante-mode)) + (warn! "Couldn't find cabal, haskell-mode may have issues")) + (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (add-hook 'dante-mode-hook #'flycheck-mode)) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index e3b3ab643..c423fd149 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -5,8 +5,7 @@ :hook (haskell-mode . intero-mode) :config (unless (executable-find "stack") - (warn "haskell-mode: couldn't find stack, disabling intero") - (remove-hook 'haskell-mode-hook #'intero-mode)) + (warn! "Couldn't find stack. Intero has been disabled.")) (add-hook! 'intero-mode-hook #'(flycheck-mode eldoc-mode)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index ed5c84b50..6d5987b1b 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -31,10 +31,9 @@ :init (add-hook 'haskell-mode-hook #'ghc-comp-init) :config - (if (executable-find "ghc-mod") - (set! :company-backend 'haskell-mode #'company-ghc) - (warn "haskell-mode: couldn't find ghc-mod on PATH") - (remove-hook 'haskell-mode-hook #'ghc-comp-init)) + (unless (executable-find "ghc-mod") + (warn! "Couldn't find ghc-mod on PATH. Code completion is disabled.")) - (setq company-ghc-show-info 'oneline)) + (setq company-ghc-show-info 'oneline) + (set! :company-backend 'haskell-mode #'company-ghc)) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 8194c7923..c565b493e 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -5,7 +5,7 @@ (cond ((featurep! +meghanada) (load! +meghanada)) ((featurep! +eclim) ; FIXME lang/java +eclim ;;(load! +eclim) - (warn "java-mode: eclim support isn't implemented yet"))) + (warn! "Eclim support isn't implemented yet"))) ;; diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index 457f2872d..d13baf316 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -2,14 +2,15 @@ (def-package! plantuml-mode :mode "\\.p\\(lant\\)?uml$" - :config + :init (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar")) + :config (set! :popup "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0))) (unless (executable-find "java") - (warn "plantuml-mode: can't find java, preview disabled.")) + (warn! "Couldn't find java. Disabling plantuml preview.")) (unless (file-exists-p plantuml-jar-path) - (warn "plantuml-mode: can't find plantuml.jar; run M-x +plantuml/install."))) + (warn! "Couldn't find plantuml.jar. Install it witInstall it with-x +plantuml/install."))) (def-package! flycheck-plantuml diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 4faadda6c..da7d3b064 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -30,7 +30,7 @@ (expand-file-name "rust/src/" +rust-src-dir))) (unless (file-exists-p racer-cmd) - (warn "rust-mode: racer binary can't be found; auto-completion is disabled")) + (warn! "Couldn't find racer binary. Code completion won't work")) (set! :lookup 'rust-mode :definition #'racer-find-definition)) From 6c4e048c237bc2a462b37066e5ef837c77c337ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:42:22 -0500 Subject: [PATCH 0446/4235] General refactor & cleanup --- modules/feature/evil/config.el | 5 ++--- modules/lang/csharp/config.el | 5 ++--- modules/lang/data/config.el | 3 +-- modules/lang/ess/autoloads.el | 1 + modules/lang/javascript/config.el | 2 +- modules/lang/latex/config.el | 25 +++++++++++++++---------- modules/lang/markdown/config.el | 2 +- modules/tools/password-store/config.el | 1 + modules/tools/rotate-text/config.el | 3 ++- 9 files changed, 26 insertions(+), 21 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bfa3f0c40..55e91c800 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -292,9 +292,8 @@ the new algorithm is confusing, like in python or ruby." (global-evil-mc-mode +1) ;; Add custom commands to whitelisted commands - (dolist (fn '(doom/deflate-space-maybe doom/inflate-space-maybe - doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol - doom/backward-kill-to-bol-and-indent doom/newline-and-indent)) + (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol + doom/backward-kill-to-bol-and-indent)) (push (cons fn '((:default . evil-mc-execute-default-call))) evil-mc-custom-known-commands)) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index c994c4e07..6b795a629 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -2,6 +2,8 @@ (def-package! csharp-mode :mode "\\.cs$") +(def-package! shader-mode :mode "\\.shader$") ; unity shaders + (def-package! omnisharp :after csharp-mode @@ -54,6 +56,3 @@ :n "s" (λ! (omnisharp-unit-test "single")) :n "a" (λ! (omnisharp-unit-test "all"))))) - -(def-package! shader-mode :mode "\\.shader$") ; unity shaders - diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index b01d00d6f..7071a7b88 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -34,8 +34,7 @@ :mode "/Dockerfile$") -;; For ROM hacking or debugging -(def-package! hexl +(def-package! hexl ; For ROM hacking or debugging :mode ("\\.hex$" . hexl-mode) :mode ("\\.nes$" . hexl-mode)) diff --git a/modules/lang/ess/autoloads.el b/modules/lang/ess/autoloads.el index 44bafc685..c7c4b0fb4 100644 --- a/modules/lang/ess/autoloads.el +++ b/modules/lang/ess/autoloads.el @@ -1,4 +1,5 @@ ;;; private/r/autoload.el -*- lexical-binding: t; -*- + ;;;###autoload (defun +r/repl () "Open the R REPL." diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 2ee312cc7..f8f6830c6 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -20,7 +20,7 @@ (defvaralias 'js-switch-indent-offset 'js2-basic-offset) (sp-with-modes '(js2-mode rjsx-mode) - (sp-local-pair "/* " " */" :post-handlers '(("| " "SPC")))) + (sp-local-pair "/*" "*/" :post-handlers '(("| " "SPC")))) ;; If it's available globally, use eslint_d (setq flycheck-javascript-eslint-executable (executable-find "eslint_d")) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 21f085df2..550750024 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -21,8 +21,8 @@ (def-package! tex-site :init - ;; Manually load the AUCTEX autoloads. This is normally done by package-initialize, - ;; ... which we do not use. + ;; Manually load the AUCTEX autoloads. This is normally done by + ;; package-initialize, ... which we do not use. (load "auctex.el" nil t t) (load "auctex-autoloads.el" nil t t) :config @@ -38,7 +38,8 @@ ;; Use hidden directories for AUCTeX files. TeX-auto-local ".auctex-auto" TeX-style-local ".auctex-style" - ;; When correlating sources to rendered PDFs, don't start the emacs server + ;; When correlating sources to rendered PDFs, don't start the emacs + ;; server TeX-source-correlate-start-server nil TeX-source-correlate-mode t TeX-source-correlate-method 'synctex @@ -74,7 +75,8 @@ LaTeX-item-indent 0) :config (map! :map LaTeX-mode-map "C-j" nil) - ;; Do not prompt for Master files, this allows auto-insert to add templates to .tex files + ;; Do not prompt for Master files, this allows auto-insert to add templates + ;; to .tex files (add-hook! '(LaTeX-mode TeX-mode) '(lambda () (remove-hook 'find-file-hooks (car find-file-hooks) 'local))) ;; Adding useful things for latex (add-hook! LaTeX-mode (LaTeX-math-mode) (TeX-source-correlate-mode)(TeX-global-PDF-mode t) @@ -95,7 +97,8 @@ (after! latex ;; Use Okular is the user says so. (when (featurep! +okular) - ;; Configure Okular as viewer. Including a bug fix (https://bugs.kde.org/show_bug.cgi?id=373855) + ;; Configure Okular as viewer. Including a bug fix + ;; (https://bugs.kde.org/show_bug.cgi?id=373855) (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) (add-to-list 'TeX-view-program-selection @@ -110,8 +113,9 @@ (def-package! preview - ;; The preview package is currently broken with the latest AUCTeX version ("11.90.2.2017-07-25) - ;; ... and Ghostscript 9.22. It's now fixed in AUCTeX master, so we just have to wait. + ;; The preview package is currently broken with the latest AUCTeX version + ;; ("11.90.2.2017-07-25) ... and Ghostscript 9.22. It's now fixed in AUCTeX + ;; master, so we just have to wait. :init (progn (setq-default preview-scale 1.4 @@ -175,7 +179,8 @@ "q" #'delete-window "k" (λ! (quit-window) (delete-window)))) -;; Enable latexmk only if the user explicitly says so with the module flag '+latexmk'. +;; Enable latexmk only if the user explicitly says so with the module flag +;; '+latexmk'. (def-package! auctex-latexmk :when (featurep! +latexmk) :init @@ -219,8 +224,8 @@ :commands (company-auctex-init) :init ;; We can't use the (set! :company-backend ...) because Auctex reports its - ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which - ;; is not anticipated by :company-backend (and shouldn't have to!) + ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is + ;; not anticipated by :company-backend (and shouldn't have to!) (add-hook! LaTeX-mode (make-variable-buffer-local 'company-backends) (company-auctex-init))) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 9c7293b0c..de879f12f 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -2,8 +2,8 @@ (def-package! markdown-mode :mode "/README$" - :mode "\\.m\\(d\\|arkdown\\)$" :mode ("/README\\.md$" . gfm-mode) + :mode "\\.m\\(d\\|arkdown\\)$" :init (setq markdown-enable-wiki-links t markdown-enable-math t diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 5463b4112..1609dab0b 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -36,6 +36,7 @@ ;; Is built into Emacs 26+ +;; TODO don't add password-store to auth-sources? (if (require 'auth-store-pass nil t) (auth-source-pass-enable) (def-package! auth-password-store diff --git a/modules/tools/rotate-text/config.el b/modules/tools/rotate-text/config.el index 488ce72a7..5fb81df5a 100644 --- a/modules/tools/rotate-text/config.el +++ b/modules/tools/rotate-text/config.el @@ -7,7 +7,8 @@ (def-setting! :rotate (modes &rest plist) - "Declare :symbols, :words or :patterns that `rotate-text' will cycle through." + "Declare :symbols, :words or :patterns (all lists of strings) that +`rotate-text' will cycle through." (declare (indent 1)) (let* ((modes (doom-enlist (doom-unquote modes))) (fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-"))))) From 0e1cf10c0f255c3f516f5c82daeea86c5c1ec071 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:42:37 -0500 Subject: [PATCH 0447/4235] Update doom module readme file template --- .../templates/org-mode/__doom-readme | 26 +++++-------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/modules/feature/file-templates/templates/org-mode/__doom-readme b/modules/feature/file-templates/templates/org-mode/__doom-readme index bd4c3fb91..c19f44400 100644 --- a/modules/feature/file-templates/templates/org-mode/__doom-readme +++ b/modules/feature/file-templates/templates/org-mode/__doom-readme @@ -17,31 +17,17 @@ ${3:If necessary, include a longer description below it that goes into more deta * Table of Contents :TOC: -* Install -** Main dependencies -*** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") -brew install x -#+END_SRC +* Module Flags +This module provides no flags. -*** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S X -#+END_SRC +* Prerequisites +This module has no prereqisites. -** Extra Dependencies -+ A -+ B -+ C - -#+BEGIN_SRC sh -Y install A B C -#+END_SRC +* Features +A list of features, how to use them, and their dependencies. * Configuration -* Usage - * Appendix ** Commands ** Hacks From c94893c6ba119829e61e59ecbb83f80e714af122 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:42:55 -0500 Subject: [PATCH 0448/4235] lang/lua: fix localleader key hijacking SPC --- modules/lang/lua/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index fdc6ad623..940871263 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -18,7 +18,7 @@ (map! :map lua-mode-map :localleader - "b" #'+lua/build-menu)) + :n "b" #'+lua/build-menu)) (def-package! company-lua From 373d4f25b53bab174619567104a9202938a231b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:43:28 -0500 Subject: [PATCH 0449/4235] lang/elm: set :repl & load autoloads --- modules/lang/elm/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index f205c9b45..fdc19600d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -3,8 +3,10 @@ (def-package! elm-mode :mode "\\.elm$" :config + (load "elm-mode-autolods" nil t) (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :company-backend 'elm-mode '(company-elm)) + (set! :repl 'elm-mode #'run-elm-interactive) (setq elm-format-on-save t)) From 871883cd891af6a85b6fd61ea69eea804c9fa941 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:44:23 -0500 Subject: [PATCH 0450/4235] lang/hy: set :repl, :company-backend & :interpreter --- modules/lang/hy/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/hy/config.el b/modules/lang/hy/config.el index a3a8007a2..bc106c784 100644 --- a/modules/lang/hy/config.el +++ b/modules/lang/hy/config.el @@ -1,4 +1,8 @@ ;;; lang/hy/config.el -*- lexical-binding: t; -*- (def-package! hy-mode - :mode "\\.hy$") + :mode "\\.hy$" + :interpreter "hy" + :config + (set! :repl 'hy-mode #'hy-shell-start-or-switch-to-shell) + (set! :company-backend 'hy-mode '(company-hy))) From 0ccdc065f9166314e24d818043af5b00c9aa37e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:44:49 -0500 Subject: [PATCH 0451/4235] lang/haskell: fail gracefully if stack isn't installed --- modules/lang/haskell/+intero.el | 4 +++- modules/lang/haskell/autoload.el | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 modules/lang/haskell/autoload.el diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index c423fd149..a51958ef6 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -2,8 +2,10 @@ ;;;###if (featurep! +intero) (def-package! intero - :hook (haskell-mode . intero-mode) + :after haskell-mode :config + (add-hook 'haskell-mode-hook #'+haskell|init-intero) + (unless (executable-find "stack") (warn! "Couldn't find stack. Intero has been disabled.")) diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el new file mode 100644 index 000000000..ba2d4fec6 --- /dev/null +++ b/modules/lang/haskell/autoload.el @@ -0,0 +1,10 @@ +;;; lang/haskell/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +haskell|init-intero () + "Initializes `intero-mode' in haskell-mode, unless stack isn't installed. +This is necessary because `intero-mode' doesn't do its own error checks." + (when (derived-mode-p 'haskell-mode) + (if (executable-find "stack") + (intero-mode +1) + (message "Couldn't find stack. Refusing to enable intero-mode.")))) From 6094d8407dc4c6f177a469839909c1b129be362b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 07:46:01 -0500 Subject: [PATCH 0452/4235] tools/pdf: defer pdf-tools --- modules/tools/pdf/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 4a2ea7f62..6e5c09ff3 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -1,6 +1,7 @@ ;;; tools/pdf/config.el -*- lexical-binding: t; -*- (def-package! pdf-tools + :defer t :init (load "pdf-tools-autoloads.el" nil t t) :config (pdf-tools-install) From fa19eaf8e03fd7c682f1a3295e7474b3358780d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 15:14:07 -0500 Subject: [PATCH 0453/4235] private/default: add tab yas-expand keybind for emacs states --- modules/private/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/private/default/+bindings.el b/modules/private/default/+bindings.el index aa6214285..4b6e8fcd4 100644 --- a/modules/private/default/+bindings.el +++ b/modules/private/default/+bindings.el @@ -634,8 +634,8 @@ [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)) + :ig "" yas-maybe-expand + :v "" #'+snippets/expand-on-region)) ;; --- Major mode bindings -------------------------- From 0f404a513ac1eebda0d5d3e05dc27e3dfdc6c4b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 16:18:55 -0500 Subject: [PATCH 0454/4235] Fix overaggressive backspace delete-backward-char would kill adjacent delimited regions: 1. | (...) 2. (|...) --- core/autoload/editor.el | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index c4de816f9..4c12234ba 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -10,18 +10,20 @@ whitespace is balanced on either side of the cursor. If INLINE is nil, returns t if the opening and closing braces are on adjacent lines, above and below, with only whitespace in between." (when-let* ((pair (or pair (sp-get-thing)))) - (let ((op (plist-get pair :op)) - (cl (plist-get pair :cl))) - (and op cl - (not (string-empty-p op)) - (not (string-empty-p cl)) - (let ((beg (+ (length op) (plist-get pair :beg))) - (end (- (plist-get pair :end) (length cl))) - (pt (point))) - (let ((content (buffer-substring-no-properties beg end))) - (and (string-match-p (format "[ %s]*" (if inline "" "\n")) content) - (or (not balanced) - (= (- pt beg) (- end pt)))))))))) + (let ((beg (plist-get pair :beg)) + (end (plist-get pair :end)) + (pt (point))) + (when (and (> pt beg) (< pt end)) + (when-let* ((cl (plist-get pair :cl)) + (op (plist-get pair :op))) + (and (not (string-empty-p op)) + (not (string-empty-p cl)) + (let ((nbeg (+ (length op) beg)) + (nend (- end (length cl)))) + (let ((content (buffer-substring-no-properties nbeg nend))) + (and (string-match-p (format "[ %s]*" (if inline "" "\n")) content) + (or (not balanced) + (= (- pt nbeg) (- nend pt)))))))))))) ;; @@ -181,13 +183,14 @@ possible, or just one char if that's not possible." (insert-char ?\s (- ocol (current-column)) nil)))) ;; ((and (= n 1) (not (minibufferp))) + ;; TODO Refactor; abstract with doom-surrounded-p more (let* ((pair (sp-get-thing)) (op (plist-get pair :op)) (cl (plist-get pair :cl)) (beg (plist-get pair :beg)) (end (plist-get pair :end))) (cond ((and end beg (= end (+ beg (length op) (length cl)))) - (sp-backward-delete-char 0)) + (sp-backward-delete-char 1)) ((doom-surrounded-p pair :inline :balanced) (delete-char -1 killflag) (delete-char 1) From ae52b2ff6083fa5b1dcb01386d432530a44d7de0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 20:52:25 -0500 Subject: [PATCH 0455/4235] Fix empty load-file-name in warn! macro during byte-compilation --- core/autoload/message.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 1f54dd245..39af8e7b1 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -83,11 +83,12 @@ interactive session." ;;;###autoload (defmacro warn! (message &rest args) "Output a colored warning for the current module in the *Messages* buffer." - (if (file-in-directory-p load-file-name doom-modules-dir) - `(cl-destructuring-bind (cat . mod) (doom-module-from-path ,load-file-name) - (delay-warning (format "%s %s" cat mod) (format ,message ,@args) :warning)) - `(delay-warning (file-relative-name load-file-name doom-emacs-dir) - (format ,message ,@args) :warning))) + (let ((load-file-name (or load-file-name byte-compile-current-file))) + (if (file-in-directory-p load-file-name doom-modules-dir) + `(cl-destructuring-bind (cat . mod) (doom-module-from-path ,load-file-name) + (delay-warning (format "%s %s" cat mod) (format ,message ,@args) :warning)) + `(delay-warning (file-relative-name load-file-name doom-emacs-dir) + (format ,message ,@args) :warning)))) ;;;###autoload (defmacro log! (message &rest args) From 4321f20b3e39b77aac255dce2d09fbb4d13f2d51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 20:54:53 -0500 Subject: [PATCH 0456/4235] Appease byte-compiler-sama --- core/autoload/editor.el | 2 +- modules/lang/org/autoload/org-capture.el | 3 +-- modules/lang/org/autoload/org.el | 3 +-- modules/tools/neotree/autoload.el | 3 +-- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 4c12234ba..2ee50dc16 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -247,7 +247,7 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" ;; ;;;###autoload -(defun doom*newline-and-indent (orig-fn) +(defun doom*newline-and-indent (_orig-fn) "Inserts a newline and possibly indents it. Also continues comments if executed from a commented line; handling special cases for certain languages with weak native support." diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 6edabe44e..518bc033e 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -63,17 +63,16 @@ you're done. This can be called from an external shell script." (setq string nil)) (when (and key (string-empty-p key)) (setq key nil)) - (require 'org-capture) (let ((frame (if (+org-capture-frame-p) (selected-frame) (make-frame +org-capture-window-params)))) (with-selected-frame frame + (require 'org-capture) (condition-case ex (cl-letf (((symbol-function #'pop-to-buffer) (symbol-function #'switch-to-buffer))) (switch-to-buffer (doom-fallback-buffer)) (let ((org-capture-initial string) - (org-capture-mode-hook org-capture-mode-hook) org-capture-entry) (when (and key (not (string-empty-p key))) (setq org-capture-entry (org-capture-select-template key))) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 1812ae0c2..390756ab5 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -139,8 +139,7 @@ wrong places)." (let ((marker (org-element-property :bullet context)) (pad (save-excursion (back-to-indentation) - (- (point) (line-beginning-position)))) - afterp) + (- (point) (line-beginning-position))))) (save-match-data (pcase direction ('below diff --git a/modules/tools/neotree/autoload.el b/modules/tools/neotree/autoload.el index 917e0ed8e..69720725f 100644 --- a/modules/tools/neotree/autoload.el +++ b/modules/tools/neotree/autoload.el @@ -8,8 +8,7 @@ (defun +neotree/open () "Open the neotree window in the current project." (interactive) - (let ((path buffer-file-name) - (project-root (doom-project-root 'nocache))) + (let ((project-root (doom-project-root 'nocache))) (require 'neotree) (if (neo-global--window-exists-p) (neotree-hide) From 5bee5c95ee10e6ecf77f43b94ed19e75e172b157 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 20:55:29 -0500 Subject: [PATCH 0457/4235] lang/web: refactor +css/toggle-inline-or-block Remove evil dependency + make more robust. --- modules/lang/web/autoload/css.el | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el index 0888b858d..d2032d261 100644 --- a/modules/lang/web/autoload/css.el +++ b/modules/lang/web/autoload/css.el @@ -10,25 +10,17 @@ (defun +css/toggle-inline-or-block () "Toggles between a bracketed block and inline block." (interactive) - ;; TODO Remove evil dependency (let ((inhibit-modification-hooks t)) - (save-excursion - (cl-destructuring-bind (beg end &rest _) - (or (ignore-errors (evil-a-curly)) - (user-error "No block found")) + (cl-destructuring-bind (&key beg end op cl &allow-other-keys) + (sp-get-thing) + (when (or (string-empty-p op) (string-empty-p cl)) + (user-error "No block found")) + (with-no-warnings (if (= (line-number-at-pos beg) (line-number-at-pos end)) (progn + (goto-char end) (insert "\n") (goto-char (1+ beg)) (insert "\n") - (unless (string-match ";[\s\t]*}$" (buffer-substring-no-properties beg (1+ end))) - (goto-char end) (insert "\n")) - (while (re-search-forward ";[\s\t]*" (1+ end) t) - (replace-match ";\n" t t)) - (setq end (cadr (evil-a-curly))) - (evil-indent beg end) - (delete-trailing-whitespace beg end)) - (goto-char beg) - (evil-join beg end) - (goto-char (1+ beg)) - (just-one-space) - (goto-char (cadr (evil-inner-curly))) - (just-one-space)))))) + (replace-regexp ";\\s-+" ";\n" nil beg end) + (indent-region beg end)) + (replace-regexp "\n" " " nil beg end) + (replace-regexp " +" " " nil beg end)))))) From 0fb72805abe55c1faa42bd4db2d8464ba71003b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 20:58:36 -0500 Subject: [PATCH 0458/4235] lang/web: new comment-indent-function for css/scss-mode Adds +css/comment-indent-new-line, since the built-in default performs poorly in CSS buffers. This is experimental. --- modules/lang/web/+css.el | 7 ++++-- modules/lang/web/autoload/css.el | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 6366bef5e..c23f566b0 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -5,14 +5,17 @@ (add-hook! (css-mode sass-mode) #'(yas-minor-mode-on flycheck-mode highlight-numbers-mode)) +;; An improved newline+continue comment function +(add-hook! css-mode (setq-local comment-indent-function #'+css/comment-indent-new-line)) + (after! smartparens (sp-with-modes '(css-mode scss-mode less-css-mode stylus-mode) - (sp-local-pair "/*" "*/" :post-handlers '(("[d-3]||\n[i]" "RET") ("| " "SPC"))))) + (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))))) (map! :map* (css-mode-map scss-mode-map less-css-mode-map) :n "M-R" #'+css/web-refresh-browser (:localleader - :n "rb" #'+css/toggle-inline-or-block)) + :n "rb" #'+css/toggle-inline-or-block)) ;; diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el index d2032d261..e5c66a395 100644 --- a/modules/lang/web/autoload/css.el +++ b/modules/lang/web/autoload/css.el @@ -24,3 +24,40 @@ (indent-region beg end)) (replace-regexp "\n" " " nil beg end) (replace-regexp " +" " " nil beg end)))))) + +;;;###autoload +(defun +css/comment-indent-new-line () + "Continues the comment in an indented new line in css-mode and scss-mode. +Meant for `comment-line-break-function'." + (interactive) + (when (sp-point-in-comment) + (let ((at-end (looking-at-p ".+\\*/")) + type pre-indent post-indent) + (save-excursion + (let ((bol (line-beginning-position)) + (eol (line-end-position))) + (if (not comment-use-syntax) + (progn + (goto-char bol) + (when (re-search-forward comment-start-skip eol t) + (goto-char (or (match-end 1) (match-beginning 0))))) + (goto-char (comment-beginning)))) + (save-match-data + (looking-at "\\(//\\|/?\\*\\)") + (setq type (match-string 0) + pre-indent (- (match-beginning 0) (line-beginning-position)) + post-indent + (progn + (goto-char (match-end 0)) + (max 1 (skip-chars-forward " " (line-end-position))))) + (if (eolp) (setq post-indent 1)))) + (insert "\n" + (make-string pre-indent 32) + (if (string= "/*" type) + " *" + type) + (make-string post-indent 32)) + (when at-end + (save-excursion + (insert "\n" (make-string pre-indent 32)) + (delete-char -1)))))) From dfefbd0176ac4e3749fbf41b38eb13cb2385e06f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 21:18:56 -0500 Subject: [PATCH 0459/4235] Fix make test not resetting doom-modules properly --- core/autoload/test.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 21a71279a..a3f20450e 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -37,7 +37,7 @@ If neither is available, run all tests in all enabled modules." (t (let (noninteractive) - (clrhash doom-modules) + (setq doom-modules (clrhash doom-modules)) (load (expand-file-name "init.test.el" user-emacs-directory) nil t) (setq modules (doom-module-pairs) targets (list (expand-file-name "test/" doom-core-dir)))))) @@ -55,7 +55,7 @@ If neither is available, run all tests in all enabled modules." collect (expand-file-name "test/" path)))) for dir in targets if (file-directory-p dir) - nconc (reverse (directory-files-recursively dir "\\.el$")) + nconc (reverse (doom-packages--files dir "\\.el$")) into items finally do (quiet! (mapc #'load-file items))) ;; run all loaded tests From 6d7db48dc13c56407544f58c0bc99f28354e871e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 23:16:38 -0500 Subject: [PATCH 0460/4235] :boom: Move :private modules to :config --- init.example.el | 11 ++-- .../{private => config}/default/+bindings.el | 16 +++-- .../default/+evil-commands.el | 2 +- modules/config/default/README.org | 60 +++++++++++++++++++ .../default/autoload/default.el | 18 +++--- .../default/autoload/evil.el | 12 ++-- modules/{private => config}/default/config.el | 2 +- modules/config/default/doom-emacs | 8 +++ .../{private => config}/default/packages.el | 2 +- modules/private/README.org | 8 --- 10 files changed, 101 insertions(+), 38 deletions(-) rename modules/{private => config}/default/+bindings.el (98%) rename modules/{private => config}/default/+evil-commands.el (98%) create mode 100644 modules/config/default/README.org rename modules/{private => config}/default/autoload/default.el (69%) rename modules/{private => config}/default/autoload/evil.el (68%) rename modules/{private => config}/default/config.el (98%) create mode 100644 modules/config/default/doom-emacs rename modules/{private => config}/default/packages.el (82%) delete mode 100644 modules/private/README.org diff --git a/init.example.el b/init.example.el index f632e2b9d..644880ff3 100644 --- a/init.example.el +++ b/init.example.el @@ -138,11 +138,10 @@ ; +wordnut ; wordnet (wn) search ; +langtool) ; a proofreader (grammar/style check) for Emacs - ;; 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 + :config + ;; The default module contains a set of reasonable defaults for Emacs, a + ;; Spacemacs-inspired keybinding scheme, a custom yasnippet library, and + ;; additional ex commands for evil-mode. Use it as a reference for your + ;; own modules. (default +bindings +snippets +evil-commands)) diff --git a/modules/private/default/+bindings.el b/modules/config/default/+bindings.el similarity index 98% rename from modules/private/default/+bindings.el rename to modules/config/default/+bindings.el index 4b6e8fcd4..674ca3585 100644 --- a/modules/private/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -1,12 +1,12 @@ -;;; private/default/+bindings.el -*- lexical-binding: t; -*- +;;; config/default/+bindings.el -*- lexical-binding: t; -*- + +;; This file defines a Spacemacs-esque keybinding scheme ;; expand-region's prompt can't tell what key contract-region is bound to, so we ;; tell it explicitly. (setq expand-region-contract-fast-key "V") - -;; This files defines a Spacemacs-esque keybinding scheme - +;; (map! [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag [remap newline] #'newline-and-indent @@ -181,7 +181,10 @@ :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 "Yank filename" :n "y" #'+default/yank-buffer-filename + (:when (featurep! :config private) + :desc "Find file in private config" :n "p" #'+private/find-in-config + :desc "Browse private config" :n "P" #'+private/browse-config)) (:desc "git" :prefix "g" :desc "Git status" :n "S" #'magit-status @@ -209,6 +212,7 @@ :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 "Open Doom manual" :n "D" #'doom/help :desc "Find definition" :n "." #'+lookup/definition :desc "Find references" :n "/" #'+lookup/references :desc "Find documentation" :n "h" #'+lookup/documentation @@ -266,7 +270,7 @@ :desc "Invalidate cache" :n "x" #'projectile-invalidate-cache) (:desc "quit" :prefix "q" - :desc "Quit" :n "q" #'evil-save-and-quit + :desc "Save and quit" :n "q" #'evil-save-and-quit :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) (:desc "remote" :prefix "r" diff --git a/modules/private/default/+evil-commands.el b/modules/config/default/+evil-commands.el similarity index 98% rename from modules/private/default/+evil-commands.el rename to modules/config/default/+evil-commands.el index f4143d803..79e3c0e9d 100644 --- a/modules/private/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -1,4 +1,4 @@ -;;; private/default/+evil-commands.el -*- lexical-binding: t; -*- +;;; config/default/+evil-commands.el -*- lexical-binding: t; -*- (defalias 'ex! 'evil-ex-define-cmd) diff --git a/modules/config/default/README.org b/modules/config/default/README.org new file mode 100644 index 000000000..aa282ffb0 --- /dev/null +++ b/modules/config/default/README.org @@ -0,0 +1,60 @@ +#+TITLE: :config default + +This module provides a set of reasonable defaults, including: + ++ A Spacemacs-esque keybinding scheme ++ Extra Ex commands for evil-mode users ++ A yasnippet snippets library tailored to Doom emacs ++ A configuration for (almost) universally repeating searches with =;= and =,= + +#+begin_quote +The defaults module is intended as a "reasonable-defaults" module, but also as a +reference for your own private modules. You'll find [[https://github.com/hlissner/doom-emacs-private][my private module in a +separate repo]]. + +Refer to the [[https://github.com/hlissner/doom-emacs/wiki/Customization][Customization page]] on the wiki for details on starting your own +private module. +#+end_quote + +* Table of Contents :TOC: +- [[#install][Install]] +- [[#configuration][Configuration]] + - [[#using-another-snippets-library][Using another snippets library]] + - [[#im-not-an-evil-user][I'm not an evil user...]] +- [[#appendix][Appendix]] + - [[#commands][Commands]] + - [[#hacks][Hacks]] + +* Install +This module has no external dependencies. + +* Configuration +** Using another snippets library +Don't want to use provided one? Then add this to your private module, + +#+BEGIN_SRC emacs-lisp +;; in config/$USER/packages.el +(package! emacs-snippets :ignore t) + +;; in config/$USER/config.el +(def-package-hook! emacs-snippets :disabled t) +(after! yasnippet + (push "~/path/to/my/private/snippets" yas-snippet-dirs)) +#+END_SRC + +** I'm not an evil user... +That's fine. All evil configuration is ignored if =:feature evil= is disabled. + +* Appendix +** Commands ++ ~+default/browse-project~ ++ ~+default/browse-templates~ ++ ~+default/find-in-templates~ ++ ~+default/browse-emacsd~ ++ ~+default/find-in-emacsd~ ++ ~+default/browse-notes~ ++ ~+default/find-in-notes~ ++ ~+default/find-in-snippets~ +** Hacks ++ ~epa-pinentry-mode~ is set to ~'loopback~, forcing gpg-agent to use the Emacs + minibuffer when prompting for your passphrase. *Only works with GPG 2.1+!* diff --git a/modules/private/default/autoload/default.el b/modules/config/default/autoload/default.el similarity index 69% rename from modules/private/default/autoload/default.el rename to modules/config/default/autoload/default.el index d1656dfec..0f73b74c3 100644 --- a/modules/private/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -1,4 +1,4 @@ -;; private/default/autoload/default.el -*- lexical-binding: t; -*- +;; config/default/autoload/default.el -*- lexical-binding: t; -*- ;;;###autoload (defun +default/yank-buffer-filename () @@ -23,26 +23,26 @@ (doom-project-find-file ,dir)))) -;;;###autoload (autoload '+default/browse-project "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/browse-project "config/default/autoload/default" nil t) (+default--def-browse-in! project (doom-project-root)) ;; NOTE No need for find-in-project, use `projectile-find-file' -;;;###autoload (autoload '+default/find-in-templates "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/find-in-templates "config/default/autoload/default" nil t) (+default--def-find-in! templates +file-templates-dir) -;;;###autoload (autoload '+default/browse-templates "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/browse-templates "config/default/autoload/default" nil t) (+default--def-browse-in! templates +file-templates-dir) -;;;###autoload (autoload '+default/find-in-emacsd "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/find-in-emacsd "config/default/autoload/default" nil t) (+default--def-find-in! emacsd doom-emacs-dir) -;;;###autoload (autoload '+default/browse-emacsd "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/browse-emacsd "config/default/autoload/default" nil t) (+default--def-browse-in! emacsd doom-emacs-dir) -;;;###autoload (autoload '+default/find-in-notes "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/find-in-notes "config/default/autoload/default" nil t) (+default--def-find-in! notes +org-dir) -;;;###autoload (autoload '+default/browse-notes "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/browse-notes "config/default/autoload/default" nil t) (+default--def-browse-in! notes +org-dir) -;;;###autoload (autoload '+default/find-in-snippets "private/default/autoload/default" nil t) +;;;###autoload (autoload '+default/find-in-snippets "config/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' diff --git a/modules/private/default/autoload/evil.el b/modules/config/default/autoload/evil.el similarity index 68% rename from modules/private/default/autoload/evil.el rename to modules/config/default/autoload/evil.el index 01a37f28c..d16d70480 100644 --- a/modules/private/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -1,27 +1,27 @@ -;; private/default/autoload/evil.el -*- lexical-binding: t; -*- +;; config/default/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) -;;;###autoload (autoload '+default:multi-next-line "private/default/autoload/evil" nil t) +;;;###autoload (autoload '+default:multi-next-line "config/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) +;;;###autoload (autoload '+default:multi-previous-line "config/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) +;;;###autoload (autoload '+default:cd "config/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) +;;;###autoload (autoload '+default:kill-all-buffers "config/default/autoload/evil" nil t) (evil-define-command +default:kill-all-buffers (&optional bang) "Kill all buffers. If BANG, kill current session too." (interactive "") @@ -29,7 +29,7 @@ (+workspace/kill-session) (doom/kill-all-buffers))) -;;;###autoload (autoload '+default:kill-matching-buffers "private/default/autoload/evil" nil t) +;;;###autoload (autoload '+default:kill-matching-buffers "config/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." diff --git a/modules/private/default/config.el b/modules/config/default/config.el similarity index 98% rename from modules/private/default/config.el rename to modules/config/default/config.el index ce7b25609..eed115c15 100644 --- a/modules/private/default/config.el +++ b/modules/config/default/config.el @@ -1,4 +1,4 @@ -;;; private/default/config.el -*- lexical-binding: t; -*- +;;; config/default/config.el -*- lexical-binding: t; -*- (if (featurep! +bindings) (load! +bindings)) diff --git a/modules/config/default/doom-emacs b/modules/config/default/doom-emacs new file mode 100644 index 000000000..409e73652 --- /dev/null +++ b/modules/config/default/doom-emacs @@ -0,0 +1,8 @@ +(defun projectile-find-tag () + "Find tag in project." + (interactive) + (projectile-visit-project-tags-table) + ;; Auto-discover the user's preference for tags + (let ((xref-backend-functions '(t))) ) + (let ((find-tag-fn (projectile-determine-find-tag-fn))) + (call-interactively find-tag-fn))) \ No newline at end of file diff --git a/modules/private/default/packages.el b/modules/config/default/packages.el similarity index 82% rename from modules/private/default/packages.el rename to modules/config/default/packages.el index 08571bf1e..9f7eb6793 100644 --- a/modules/private/default/packages.el +++ b/modules/config/default/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; private/default/packages.el +;;; config/default/packages.el (package! emacs-snippets :recipe (:fetcher github diff --git a/modules/private/README.org b/modules/private/README.org deleted file mode 100644 index b9723dbc7..000000000 --- a/modules/private/README.org +++ /dev/null @@ -1,8 +0,0 @@ -#+TITLE: :private modules - -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 [[https://github.com/hlissner/doom-emacs/wiki/Customization][more information about customizing Doom]] on the [[https://github.com/hlissner/doom-emacs/wiki][wiki]]. From b3dcba54ebb97adaae633d5a57a2073ab23e0a9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 23:18:10 -0500 Subject: [PATCH 0461/4235] Add config/private; for ~/.doom.d & ~/.config/doom support #406 A modules/ submodule will be symlinked to ~/.emacs.d/modules/private. --- core/core-packages.el | 89 ++++++++++++++++++------------ init.example.el | 7 ++- modules/config/private/README.org | 23 ++++++++ modules/config/private/autoload.el | 6 ++ modules/config/private/config.el | 4 ++ modules/config/private/init.el | 25 +++++++++ modules/config/private/packages.el | 15 +++++ 7 files changed, 133 insertions(+), 36 deletions(-) create mode 100644 modules/config/private/README.org create mode 100644 modules/config/private/autoload.el create mode 100644 modules/config/private/config.el create mode 100644 modules/config/private/init.el create mode 100644 modules/config/private/packages.el diff --git a/core/core-packages.el b/core/core-packages.el index be58198db..e911ff247 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -74,6 +74,11 @@ missing) and shouldn't be deleted.") (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload-load-path' is called.") +(defvar doom-extra-module-paths () + "Additional paths for modules that are outside of `doom-modules-dir'. +`doom//reload-autoloads', `doom//byte-compile' and `doom-initialize-packages' +will include the directories in this list.") + (defvar doom--site-load-path load-path "The load path of built in Emacs libraries.") @@ -213,9 +218,7 @@ This aggressively reloads core autoload files." (when (or force-p (not doom-packages)) (setq doom-packages nil) (_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 (_load path 'noerror)))))) + (mapc #'_load (doom-module-paths "packages.el")))))) (defun doom-module-path (module submodule &optional file) "Get the full path to a module: e.g. :lang emacs-lisp maps to @@ -237,10 +240,15 @@ This aggressively reloads core autoload files." (defun doom-module-paths (&optional append-file) "Returns a list of absolute file paths to activated modules, with APPEND-FILE added, if the file exists." - (cl-loop for (module . submodule) in (doom-module-pairs) - for path = (doom-module-path module submodule append-file) - if (file-exists-p path) - collect path)) + (let ((fn (if append-file #'file-exists-p #'file-directory-p))) + (append (cl-loop for (module . submodule) in (doom-module-pairs) + for path = (doom-module-path module submodule append-file) + if (funcall fn path) + collect path) + (cl-loop for dir in doom-extra-module-paths + for path = (if append-file (expand-file-name append-file dir) dir) + if (funcall fn path) + collect path)))) (defun doom-module-flags (module submodule) "Returns a list of flags provided for MODULE SUBMODULE." @@ -295,18 +303,17 @@ Used by `require!' and `depends-on!'." "Bootstraps DOOM Emacs and its modules. MODULES is an malformed plist of modules to load." - (let (init-forms config-forms mode) + (let (init-forms config-forms module) (dolist (m modules) - (cond ((keywordp m) (setq mode m)) - ((not mode) (error "No namespace specified in `doom!' for %s" m)) + (cond ((keywordp m) (setq module m)) + ((not module) (error "No namespace specified in `doom!' for %s" m)) (t - (let* ((module mode) - (submodule (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m))) - (path (doom-module-path module submodule))) + (let ((submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) (doom-module-enable module submodule flags) - (push `(load! init ,path t) init-forms) - (push `(load! config ,path t) config-forms))))) + (let ((path (doom-module-path module submodule))) + (push `(load! init ,path t) init-forms) + (push `(load! config ,path t) config-forms)))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) @@ -393,20 +400,22 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." The module is only loaded once. If RELOAD-P is non-nil, load it again." (when (or reload-p (not (doom-module-enabled-p module submodule))) (let ((module-path (doom-module-path module submodule))) - (if (not (file-directory-p module-path)) - (lwarn 'doom-modules :warning "Couldn't find module '%s %s'" - module submodule) - (when (hash-table-p doom-modules) - (doom-module-enable module submodule flags)) - `(condition-case-unless-debug ex - (progn - (load! init ,module-path t) - (load! config ,module-path t)) - ('error - (lwarn 'doom-modules :error - "%s in '%s %s' -> %s" - (car ex) ,module ',submodule - (error-message-string ex)))))))) + (when (hash-table-p doom-modules) + (doom-module-enable module submodule flags)) + (if (file-directory-p module-path) + `(condition-case-unless-debug ex + (progn + (load! init ,module-path t) + (if after-init-time + (load! config ,module-path t) + (add-hook! 'doom-init-hook (load! config ,module-path t)))) + ('error + (lwarn 'doom-modules :error + "%s in '%s %s' -> %s" + (car ex) ,module ',submodule + (error-message-string ex)))) + (warn 'doom-modules :warning "Couldn't find module '%s %s'" + module submodule))))) (defmacro featurep! (module &optional submodule flag) "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if @@ -562,10 +571,10 @@ This should be run whenever init.el or an autoload file is modified. Running (let ((auto-dir (expand-file-name "autoload" path)) (auto-file (expand-file-name "autoload.el" path))) (when (file-exists-p auto-file) - (push auto-file targets)) + (push (file-truename auto-file) targets)) (when (file-directory-p auto-dir) (dolist (file (doom-packages--files auto-dir "\\.el$")) - (push file targets))))) + (push (file-truename file) targets))))) (when (file-exists-p doom-autoload-file) (delete-file doom-autoload-file) (message "Deleted old autoloads.el")) @@ -577,7 +586,9 @@ This should be run whenever init.el or an autoload file is modified. Running "✕ Nothing in %s") (t "✓ Scanned %s")) - (file-relative-name file doom-emacs-dir))) + (if (file-in-directory-p file doom-emacs-dir) + (file-relative-name file doom-emacs-dir) + (abbreviate-file-name file)))) (make-directory (file-name-directory doom-autoload-file) t) (let ((buf (find-file-noselect doom-autoload-file t)) current-sexp) @@ -709,16 +720,24 @@ If RECOMPILE-P is non-nil, only recompile out-of-date core files." "Delete all the compiled elc files in your Emacs configuration. This excludes compiled packages.'" (interactive) + (ignore-errors (doom-initialize-packages)) (let ((targets (append (list (expand-file-name "init.elc" doom-emacs-dir)) (doom-packages--files doom-core-dir "\\.elc$") - (doom-packages--files doom-modules-dir "\\.elc$"))) + (doom-packages--files doom-modules-dir "\\.elc$") + (cl-loop for dir in doom-extra-module-paths + if (file-directory-p dir) + nconc (doom-packages--files dir "\\.elc$")))) (default-directory doom-emacs-dir)) (unless (cl-loop for path in targets 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" + (if (file-in-directory-p path doom-emacs-dir) + (file-relative-name path) + (abbreviate-file-name path)))) (message "Everything is clean")))) diff --git a/init.example.el b/init.example.el index 644880ff3..11e2efb86 100644 --- a/init.example.el +++ b/init.example.el @@ -143,5 +143,10 @@ ;; Spacemacs-inspired keybinding scheme, a custom yasnippet library, and ;; additional ex commands for evil-mode. Use it as a reference for your ;; own modules. - (default +bindings +snippets +evil-commands)) + (default +bindings +snippets +evil-commands) + + ;; This allows you to store your private module at $XDG_CONFIG_HOME/doom. + ;; Without +xdg it uses ~/.doom.d/. If your config directory doesn't + ;; exist, this module does nothing. + (private +xdg)) diff --git a/modules/config/private/README.org b/modules/config/private/README.org new file mode 100644 index 000000000..0a7684d02 --- /dev/null +++ b/modules/config/private/README.org @@ -0,0 +1,23 @@ +#+TITLE: :config private + +This module enables support for an external private module and nested +submodules, either at =~/.doom.d= (or =$XDG_CONFIG_HOME/doom= with the ~+xdg~ +flag). + +* Table of Contents :TOC: +- [[Module Flags][Module Flags]] +- [[Features][Features]] + - [[Private sub-modules][Private sub-modules]] + +* Module Flags ++ ~+xdg~ Tells this module to respect XDG conventions and look for your private + config in ~$XDG_CONFIG_HOME/doom~ (falls back to =~/.config/doom=). + +* Features +** Private sub-modules +Modules placed in the =modules/= subdirectory of your external config are +symlinked to =~/.emacs.d/modules/private=, and can be activated from ~doom!~: + +#+BEGIN_SRC emacs-lisp +(doom! :private private-module1 private-module2 ...) +#+END_SRC diff --git a/modules/config/private/autoload.el b/modules/config/private/autoload.el new file mode 100644 index 000000000..ce3f25e9e --- /dev/null +++ b/modules/config/private/autoload.el @@ -0,0 +1,6 @@ +;;; config/private/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload (autoload '+private/find-in-config "config/private/autoload" nil t) +(+default--def-find-in! config +private-config-path) +;;;###autoload (autoload '+private/browse-config "config/private/autoload" nil t) +(+default--def-browse-in! config +private-config-path) diff --git a/modules/config/private/config.el b/modules/config/private/config.el new file mode 100644 index 000000000..8e73ecbcf --- /dev/null +++ b/modules/config/private/config.el @@ -0,0 +1,4 @@ +;;; config/private/config.el -*- lexical-binding: t; -*- + +(load (expand-file-name "config.el" +private-config-path) + 'noerror 'nomessage) diff --git a/modules/config/private/init.el b/modules/config/private/init.el new file mode 100644 index 000000000..596eccca5 --- /dev/null +++ b/modules/config/private/init.el @@ -0,0 +1,25 @@ +;;; config/private/init.el -*- lexical-binding: t; -*- + +(defvar +private-config-path + (if (featurep! +xdg) + (expand-file-name "doom/" (or (getenv "XDG_CONFIG_HOME") "~/.config")) + "~/.doom.d") + "The directory that serves as the root of your external private config for +Doom Emacs.") + +(defvar +private-modules-path + (expand-file-name "modules/" +private-config-path) + "The path to your private, external modules. This will be symlinked to +external/ in `doom-modules-dir'.") + +(defvar +private-module-prefix "private" + "TODO") + +;; Ensure `doom//reload-autoloads', `doom//byte-compile' and +;; `doom-initialize-packages' all include this module in their operations. +(add-to-list 'doom-extra-module-paths +private-config-path) + +;; +(load (expand-file-name "init.el" +private-config-path) + 'noerror 'nomessage) + diff --git a/modules/config/private/packages.el b/modules/config/private/packages.el new file mode 100644 index 000000000..e586de54f --- /dev/null +++ b/modules/config/private/packages.el @@ -0,0 +1,15 @@ +;; -*- no-byte-compile: t; -*- +;;; config/private/packages.el + +(when (file-directory-p +private-modules-path) + ;; automatically symlinks your private modules to `doom-modules-dir'. + (let ((symlink (expand-file-name +private-module-prefix doom-modules-dir))) + (if (and (file-directory-p symlink) + (not (file-symlink-p symlink))) + (lwarn "config/private" :warning + "modules/%s already exists; can't create symlink" +private-module-prefix) + (make-symbolic-link +private-modules-path symlink t)))) + +;; +(load (expand-file-name "packages.el" +private-config-path) + 'noerror 'nomessage) From 43360b5f00426ef51865510e1c3b6b56bda24052 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 23:19:10 -0500 Subject: [PATCH 0462/4235] Add lang/ess to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 11e2efb86..36e768fb9 100644 --- a/init.example.el +++ b/init.example.el @@ -93,6 +93,7 @@ elixir ; erlang done right elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses + ess ; emacs speaks statistics go ; the hipster dialect (haskell +intero) ; a language that's lazier than I am hy ; readability of scheme w/ speed of python From a5a8ca617aecf8e14231f95ef2f1050ddee35b57 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Feb 2018 23:42:45 -0500 Subject: [PATCH 0463/4235] Revise config/default comment in init.example.el --- init.example.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/init.example.el b/init.example.el index 36e768fb9..ae322211b 100644 --- a/init.example.el +++ b/init.example.el @@ -140,10 +140,10 @@ ; +langtool) ; a proofreader (grammar/style check) for Emacs :config - ;; The default module contains a set of reasonable defaults for Emacs, a - ;; Spacemacs-inspired keybinding scheme, a custom yasnippet library, and - ;; additional ex commands for evil-mode. Use it as a reference for your - ;; own modules. + ;; The default module set reasonable defaults for Emacs. It also provides + ;; a Spacemacs-inspired keybinding scheme, a custom yasnippet library, + ;; and additional ex commands for evil-mode. Use it as a reference for + ;; your own modules. (default +bindings +snippets +evil-commands) ;; This allows you to store your private module at $XDG_CONFIG_HOME/doom. From 800f8c4739fe5054626b415751a3e2ac14973979 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Feb 2018 01:34:08 -0500 Subject: [PATCH 0464/4235] config/default: remove default yasnippet directory Otherwise, ~/.emacs.d/snippets is always created. --- init.example.el | 7 +++---- modules/config/default/config.el | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/init.example.el b/init.example.el index ae322211b..b1e335eec 100644 --- a/init.example.el +++ b/init.example.el @@ -109,12 +109,11 @@ +attach ; custom attachment system +babel ; running code in org +capture ; org-capture in and outside of Emacs - +export ; centralized export system + more backends + +export ; Exporting org to whatever you want +present ; Emacs for presentations - ;; TODO +publish - ) + +publish) ; Emacs+Org as a static site generator perl ; write code no one else can comprehend - php ; make php less awful to work with + php ; perl's insecure younger brother plantuml ; diagrams for confusing people more purescript ; javascript, but functional python ; beautiful is better than ugly diff --git a/modules/config/default/config.el b/modules/config/default/config.el index eed115c15..7c5d3ebc8 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -9,7 +9,8 @@ (def-package! emacs-snippets :if (featurep! +snippets) - :after yasnippet) + :after yasnippet + :config (delete yas--default-user-snippets-dir yas-snippet-dirs)) ;; From 0e6540fb8f9930fa1a452add326e00bcd056fe9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Feb 2018 03:36:28 -0500 Subject: [PATCH 0465/4235] Fix featurep! in private submodules You'll have to use the full form to use featurep! in the private module root, but now the short form will work in the nested submodules. --- core/core-packages.el | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e911ff247..55d665763 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -232,10 +232,13 @@ This aggressively reloads core autoload files." (defun doom-module-from-path (path) "Get module cons cell (MODULE . SUBMODULE) for PATH, if possible." - (when-let* ((path (file-relative-name (file-truename path) (file-truename doom-modules-dir)))) - (let ((segments (split-string path "/"))) - (cons (intern (concat ":" (car segments))) - (intern (cadr segments)))))) + (save-match-data + (setq path (file-truename path)) + (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) + (when-let* ((module (match-string 1 path)) + (submodule (match-string 2 path))) + (cons (intern (concat ":" module)) + (intern submodule)))))) (defun doom-module-paths (&optional append-file) "Returns a list of absolute file paths to activated modules, with APPEND-FILE From 8ca4fbd8febac1ab5cb771ce58611a16665e95f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Feb 2018 03:39:12 -0500 Subject: [PATCH 0466/4235] config/private: refactor symlink code --- modules/config/private/init.el | 10 +++------- modules/config/private/packages.el | 14 +++++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/modules/config/private/init.el b/modules/config/private/init.el index 596eccca5..e361955fe 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -7,13 +7,9 @@ "The directory that serves as the root of your external private config for Doom Emacs.") -(defvar +private-modules-path - (expand-file-name "modules/" +private-config-path) - "The path to your private, external modules. This will be symlinked to -external/ in `doom-modules-dir'.") - -(defvar +private-module-prefix "private" - "TODO") +(defvar +private-symlink-path + (expand-file-name "private" doom-modules-dir) + "Where the place the symbolic link to the private modules directory.") ;; Ensure `doom//reload-autoloads', `doom//byte-compile' and ;; `doom-initialize-packages' all include this module in their operations. diff --git a/modules/config/private/packages.el b/modules/config/private/packages.el index e586de54f..0544484ae 100644 --- a/modules/config/private/packages.el +++ b/modules/config/private/packages.el @@ -1,14 +1,14 @@ ;; -*- no-byte-compile: t; -*- ;;; config/private/packages.el -(when (file-directory-p +private-modules-path) - ;; automatically symlinks your private modules to `doom-modules-dir'. - (let ((symlink (expand-file-name +private-module-prefix doom-modules-dir))) - (if (and (file-directory-p symlink) - (not (file-symlink-p symlink))) +(let ((modules-path (expand-file-name "modules/" +private-config-path))) + (when (file-directory-p modules-path) + ;; automatically symlinks your private modules to `doom-modules-dir'. + (if (and (file-directory-p +private-symlink-path) + (not (file-symlink-p +private-symlink-path))) (lwarn "config/private" :warning - "modules/%s already exists; can't create symlink" +private-module-prefix) - (make-symbolic-link +private-modules-path symlink t)))) + "modules/%s already exists; can't create symlink" +private-symlink-path) + (make-symbolic-link modules-path +private-symlink-path t)))) ;; (load (expand-file-name "packages.el" +private-config-path) From 2b1c323dbf19ce11562193dc18e41e4d93642dba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 02:02:58 -0500 Subject: [PATCH 0467/4235] :boom: Redesign private sub-module system ~/.doom.d/modules is now a full module tree, like ~/.emacs.d/modules. Symlinks are no longer involved. Private modules can now shadow Doom modules. e.g. ~/.doom.d/modules/lang/org will take precendence over ~/.emacs.d/modules/lang/org. Also, made doom--*-load-path variables public (e.g. doom--site-load-path => doom-site-load-path), and rearranged the load-path for a 10-15% startup boost. --- core/autoload/debug.el | 3 +- core/autoload/help.el | 5 +- core/autoload/message.el | 10 ++- core/autoload/test.el | 83 +++++++----------- core/core-lib.el | 2 +- core/core-packages.el | 128 +++++++++++++++------------- core/core.el | 7 +- modules/config/private/init.el | 8 +- modules/config/private/packages.el | 15 ---- modules/lang/cc/config.el | 2 +- modules/lang/org/config.el | 2 +- modules/ui/doom-dashboard/config.el | 2 +- 12 files changed, 122 insertions(+), 145 deletions(-) delete mode 100644 modules/config/private/packages.el diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 9148a225b..b72777d2b 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -148,7 +148,8 @@ ready to be pasted in a bug report on github." (or (ignore-errors (cl-delete-duplicates (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) - (reverse (directory-files-recursively doom-modules-dir "\\.elc$"))) + (cl-loop for dir in doom-modules-dirs + nconc (directory-files-recursively dir "\\.elc$"))) collect (file-relative-name (file-name-directory file) doom-emacs-dir)) :test #'equal)) "n/a") diff --git a/core/autoload/help.el b/core/autoload/help.el index d7c50beb4..84b91819c 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -68,9 +68,8 @@ in." (let ((sexp (sexp-at-point))) (when (memq (car-safe sexp) '(featurep! require!)) (format "%s %s" (nth 1 sexp) (nth 2 sexp)))))) - ((and buffer-file-name - (file-in-directory-p buffer-file-name doom-modules-dir)) - (let ((module (doom-module-from-path buffer-file-name))) + (buffer-file-name + (when-let* ((module (doom-module-from-path buffer-file-name))) (format "%s %s" (car module) (cdr module))))))) (list (completing-read "Describe module: " (cl-loop for (module . sub) in (reverse (hash-table-keys doom-modules)) diff --git a/core/autoload/message.el b/core/autoload/message.el index 39af8e7b1..790981ffd 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -84,9 +84,13 @@ interactive session." (defmacro warn! (message &rest args) "Output a colored warning for the current module in the *Messages* buffer." (let ((load-file-name (or load-file-name byte-compile-current-file))) - (if (file-in-directory-p load-file-name doom-modules-dir) - `(cl-destructuring-bind (cat . mod) (doom-module-from-path ,load-file-name) - (delay-warning (format "%s %s" cat mod) (format ,message ,@args) :warning)) + (if (cl-loop for dir in doom-modules-dirs + if (file-in-directory-p load-file-name dir) + return t) + `(cl-destructuring-bind (cat . mod) + (doom-module-from-path ,load-file-name) + (delay-warning (format "%s %s" cat mod) (format ,message ,@args) + :warning)) `(delay-warning (file-relative-name load-file-name doom-emacs-dir) (format ,message ,@args) :warning)))) diff --git a/core/autoload/test.el b/core/autoload/test.el index a3f20450e..7852196e2 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -8,57 +8,33 @@ command line args following a double dash (each arg should be in the If neither is available, run all tests in all enabled modules." (interactive) + ;; ensure DOOM is initialized + (doom-initialize-packages t) (condition-case-unless-debug ex - (let (targets) - ;; ensure DOOM is initialized - (let (noninteractive) - (load (expand-file-name "core/core.el" user-emacs-directory) nil t)) - ;; collect targets - (cond ((and argv (equal (car argv) "--")) - (cl-loop for arg in (cdr argv) - if (equal arg "core") - do (push (expand-file-name "test/" doom-core-dir) targets) - else - collect - (cl-destructuring-bind (car &optional cdr) (split-string arg "/" t) - (cons (intern (concat ":" car)) - (and cdr (intern cdr)))) - into args - finally do - (setq modules args argv nil))) + (let ((target-paths + ;; Convert targets (either from MODULES or `argv') into a list of + ;; string paths, pointing to the root directory of modules + (cond ((string= (car argv) "--") ; command line + (cl-loop for arg in (cdr argv) + if (equal arg "core") collect doom-core-dir + else collect (expand-file-name arg) + finally do (setq argv nil))) - (modules - (unless (cl-loop for module in modules - unless (and (consp module) - (keywordp (car module)) - (symbolp (cdr module))) - return t) - (error "Expected a list of cons, got: %s" modules))) + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-path module submodule) + collect it)) - (t - (let (noninteractive) - (setq doom-modules (clrhash doom-modules)) - (load (expand-file-name "init.test.el" user-emacs-directory) nil t) - (setq modules (doom-module-pairs) - targets (list (expand-file-name "test/" doom-core-dir)))))) - ;; resolve targets to a list of test files and load them - (cl-loop with targets = - (append targets - (cl-loop for (module . submodule) in modules - if submodule - collect (doom-module-path module submodule "test/") - else - nconc - (cl-loop with module-name = (substring (symbol-name module) 1) - with module-path = (expand-file-name module-name doom-modules-dir) - for path in (directory-files module-path t "^\\w") - collect (expand-file-name "test/" path)))) - for dir in targets - if (file-directory-p dir) - nconc (reverse (doom-packages--files dir "\\.el$")) - into items - finally do (quiet! (mapc #'load-file items))) - ;; run all loaded tests + ((let (noninteractive) + (setq doom-modules (clrhash doom-modules)) + (load (expand-file-name "init.test.el" user-emacs-directory) nil t) + (append (list doom-core-dir) (doom-module-paths))))))) + ;; Load all the unit test files... + (dolist (path target-paths) + (when (file-directory-p (expand-file-name "test/" path)) + (dolist (test-file (reverse (doom-packages--files path "\\.el$"))) + (load test-file nil :nomessage)))) + ;; ... then run them (if noninteractive (ert-run-tests-batch-and-exit) (call-interactively #'ert-run-tests-interactively))) @@ -86,11 +62,12 @@ If neither is available, run all tests in all enabled modules." (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))) + ,(intern (format "%s::%s" + (if (file-in-directory-p load-file-name doom-core-dir) + (format "core/%s" (file-name-base load-file-name)) + (replace-regexp-in-string "^.*/modules/\\([^/]+\\)/\\([^/]+\\)/test/" "\\1/\\2:" + (file-name-sans-extension load-file-name))) + name)) () ,(if (plist-get plist :skip) `(ert-skip ,(plist-get plist :skip)) diff --git a/core/core-lib.el b/core/core-lib.el index dcf94ba33..37db56584 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,6 +1,6 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(let ((load-path doom--site-load-path)) +(let ((load-path doom-site-load-path)) (require 'subr-x) (require 'cl-lib) (require 'map)) diff --git a/core/core-packages.el b/core/core-packages.el index 55d665763..f8d327afe 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -58,6 +58,11 @@ this is nil after Emacs has started something is wrong.") (make-hash-table :test #'equal :size 90 :rehash-threshold 1.0) "A hash table of enabled modules. Set by `doom-initialize-modules'.") +(defvar doom-psuedo-module-dirs () + "Additional paths for modules that are outside of `doom-modules-dirs'. +`doom//reload-autoloads', `doom//byte-compile' and `doom-initialize-packages' +will include the directories in this list.") + (defvar doom-packages () "A list of enabled packages. Each element is a sublist, whose CAR is the package's name as a symbol, and whose CDR is the plist supplied to its @@ -74,24 +79,14 @@ missing) and shouldn't be deleted.") (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload-load-path' is called.") -(defvar doom-extra-module-paths () - "Additional paths for modules that are outside of `doom-modules-dir'. -`doom//reload-autoloads', `doom//byte-compile' and `doom-initialize-packages' -will include the directories in this list.") +(defvar doom-site-load-path load-path + "The starting load-path, before it is altered by `doom-initialize'.") -(defvar doom--site-load-path load-path - "The load path of built in Emacs libraries.") - -(defvar doom--package-load-path () +(defvar doom-package-load-path () "The load path of package libraries installed via ELPA and QUELPA.") -(defvar doom--base-load-path - (append (list doom-core-dir doom-modules-dir) - doom--site-load-path) - "A backup of `load-path' before it was altered by `doom-initialize'. Used as a -base by `doom!' and for calculating how many packages exist.") - (defvar doom--refreshed-p nil) +(defvar doom--current-module nil) (setq package--init-file-ensured t package-user-dir (expand-file-name "elpa" doom-packages-dir) @@ -140,7 +135,7 @@ startup." ;; Called early during initialization; only use native (and cl-lib) functions! (when (or force-p (not doom-init-p)) ;; Speed things up with a `load-path' for only the bare essentials - (let ((load-path doom--site-load-path)) + (let ((load-path doom-site-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) @@ -169,15 +164,18 @@ startup." (defun doom-initialize-load-path (&optional force-p) "Populates `load-path', if it hasn't already been. If FORCE-P is non-nil, do it anyway." - (when (or force-p (not doom--package-load-path)) + (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. ;; ;; 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 doom--package-load-path doom--base-load-path)))) + (setq doom-package-load-path (directory-files package-user-dir t "^[^.]" t) + load-path (append doom-package-load-path + doom-site-load-path + doom-core-dir + doom-modules-dirs)))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run @@ -218,7 +216,13 @@ This aggressively reloads core autoload files." (when (or force-p (not doom-packages)) (setq doom-packages nil) (_load (expand-file-name "packages.el" doom-core-dir)) - (mapc #'_load (doom-module-paths "packages.el")))))) + (cl-loop for key being the hash-keys of doom-modules + if (doom-module-path (car key) (cdr key) "packages.el") + do (doom-module-load-file (car key) (cdr key) it)) + (cl-loop for dir in doom-psuedo-module-dirs + for path = (expand-file-name "packages.el" dir) + if (file-exists-p path) + do (_load path)))))) (defun doom-module-path (module submodule &optional file) "Get the full path to a module: e.g. :lang emacs-lisp maps to @@ -227,31 +231,29 @@ This aggressively reloads core autoload files." (setq module (substring (symbol-name module) 1))) (when (symbolp submodule) (setq submodule (symbol-name submodule))) - (expand-file-name (concat module "/" submodule "/" file) - doom-modules-dir)) + (cl-loop for default-directory in doom-modules-dirs + for path = (concat module "/" submodule "/" file) + if (file-exists-p path) + return (expand-file-name path))) -(defun doom-module-from-path (path) +(defun doom-module-from-path (&optional path) "Get module cons cell (MODULE . SUBMODULE) for PATH, if possible." - (save-match-data - (setq path (file-truename path)) - (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) - (when-let* ((module (match-string 1 path)) - (submodule (match-string 2 path))) - (cons (intern (concat ":" module)) - (intern submodule)))))) + (or doom--current-module + (save-match-data + (setq path (file-truename path)) + (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) + (when-let* ((module (match-string 1 path)) + (submodule (match-string 2 path))) + (cons (intern (concat ":" module)) + (intern submodule))))))) (defun doom-module-paths (&optional append-file) "Returns a list of absolute file paths to activated modules, with APPEND-FILE added, if the file exists." - (let ((fn (if append-file #'file-exists-p #'file-directory-p))) - (append (cl-loop for (module . submodule) in (doom-module-pairs) - for path = (doom-module-path module submodule append-file) - if (funcall fn path) - collect path) - (cl-loop for dir in doom-extra-module-paths - for path = (if append-file (expand-file-name append-file dir) dir) - if (funcall fn path) - collect path)))) + (append (cl-loop for key being the hash-keys of doom-modules + if (doom-module-path (car key) (cdr key) append-file) + collect it) + (cl-remove-if-not #'file-directory-p doom-psuedo-module-dirs))) (defun doom-module-flags (module submodule) "Returns a list of flags provided for MODULE SUBMODULE." @@ -281,17 +283,22 @@ Used by `require!' and `depends-on!'." (defun doom-module-pairs () "Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells." - (unless (hash-table-p doom-modules) - (error "doom-modules is uninitialized")) (cl-loop for key being the hash-keys of doom-modules collect key)) +(defun doom-module-load-file (module submodule file &optional path) + "Load FILE in MODULE/SUBMODULE. If PATH is specified, look for FILE in PATH." + (unless (or path (file-name-absolute-p file)) + (setq path (doom-module-path module submodule file))) + (let ((doom--current-module (cons module submodule))) + (load (expand-file-name file path) :noerror (not doom-debug-mode)))) + (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 doom--package-load-path) + (length doom-package-load-path) (hash-table-size doom-modules) (setq doom-init-time (float-time (time-subtract (current-time) before-init-time))))) @@ -306,17 +313,16 @@ Used by `require!' and `depends-on!'." "Bootstraps DOOM Emacs and its modules. MODULES is an malformed plist of modules to load." - (let (init-forms config-forms module) + (let (init-forms config-forms module file-name-handler-alist) (dolist (m modules) (cond ((keywordp m) (setq module m)) ((not module) (error "No namespace specified in `doom!' for %s" m)) - (t - (let ((submodule (if (listp m) (car m) m)) + ((let ((submodule (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) (doom-module-enable module submodule flags) (let ((path (doom-module-path module submodule))) - (push `(load! init ,path t) init-forms) - (push `(load! config ,path t) config-forms)))))) + (push `(doom-module-load-file ,module ',submodule "init" ,path) init-forms) + (push `(doom-module-load-file ,module ',submodule "config" ,path) config-forms)))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) @@ -408,10 +414,8 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (if (file-directory-p module-path) `(condition-case-unless-debug ex (progn - (load! init ,module-path t) - (if after-init-time - (load! config ,module-path t) - (add-hook! 'doom-init-hook (load! config ,module-path t)))) + (doom-module-load-file ,module ',submodule "init" ,module-path) + (doom-module-load-file ,module ',submodule "config" ,module-path)) ('error (lwarn 'doom-modules :error "%s in '%s %s' -> %s" @@ -544,7 +548,7 @@ call `doom//reload-load-path' remotely (through emacsclient)." (server-eval-at server-name '(doom//reload-load-path)))) ((let ((noninteractive t)) (doom-initialize-load-path t) - (message "%d packages reloaded" (length doom--package-load-path)) + (message "%d packages reloaded" (length doom-package-load-path)) (run-hooks 'doom-reload-hook))))) (defun doom//reload-autoloads () @@ -570,7 +574,7 @@ This should be run whenever init.el or an autoload file is modified. Running (let ((targets (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir)))) - (dolist (path (doom-module-paths)) + (dolist (path (append doom-psuedo-module-dirs (doom-module-paths))) (let ((auto-dir (expand-file-name "autoload" path)) (auto-file (expand-file-name "autoload.el" path))) (when (file-exists-p auto-file) @@ -652,8 +656,15 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." nconc (nreverse (doom-packages--files doom-core-dir "\\.el$")) else if (file-directory-p target) nconc (nreverse (doom-packages--files target "\\.el$")) - else if (file-directory-p (expand-file-name target doom-modules-dir)) - nconc (nreverse (doom-packages--files (expand-file-name target doom-modules-dir) "\\.el$")) + else if (cl-loop for dir in doom-psuedo-module-dirs + if (file-in-directory-p target dir) + return dir) + nconc (nreverse (doom-packages--files it "\\.el$")) + else if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" target) + nconc (nreverse (doom-packages--files + (doom-module-path (intern (format ":%s" (match-string 1 target))) + (intern (match-string 2 target))) + "\\.el$")) else if (file-exists-p target) collect target finally do (setq argv nil))) @@ -663,7 +674,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) (condition-case ex (progn - (dolist (target compile-targets) + (dolist (target (cl-delete-duplicates compile-targets :test #'string= :key #'file-truename)) (when (or (not recompile-p) (let ((elc-file (byte-compile-dest-file target))) (and (file-exists-p elc-file) @@ -671,7 +682,9 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (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))) + (short-name (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) (cl-incf (cond ((eq result 'no-byte-compile) (message! (dark (white "⚠ Ignored %s" short-name))) @@ -727,8 +740,7 @@ compiled packages.'" (let ((targets (append (list (expand-file-name "init.elc" doom-emacs-dir)) (doom-packages--files doom-core-dir "\\.elc$") - (doom-packages--files doom-modules-dir "\\.elc$") - (cl-loop for dir in doom-extra-module-paths + (cl-loop for dir in (append doom-modules-dirs doom-psuedo-module-dirs) if (file-directory-p dir) nconc (doom-packages--files dir "\\.elc$")))) (default-directory doom-emacs-dir)) diff --git a/core/core.el b/core/core.el index e5b5ce7ad..610cb3336 100644 --- a/core/core.el +++ b/core/core.el @@ -32,7 +32,10 @@ line or use --debug-init to enable this.") "Where essential files are stored.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") - "Where configuration modules are stored.") + "The main directory where Doom modules are stored.") + +(defvar doom-modules-dirs (list doom-modules-dir) + "A list of module root directories. Order determines priority.") (defvar doom-local-dir (concat doom-emacs-dir ".local/") "Root directory for local Emacs files. Use this as permanent storage for files @@ -159,7 +162,7 @@ ability to invoke the debugger in debug mode." (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)) + doom-package-load-path (eval-when-compile doom-package-load-path)) (load! core-lib) (load! core-os) ; consistent behavior across OSes diff --git a/modules/config/private/init.el b/modules/config/private/init.el index e361955fe..762064d97 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -7,15 +7,11 @@ "The directory that serves as the root of your external private config for Doom Emacs.") -(defvar +private-symlink-path - (expand-file-name "private" doom-modules-dir) - "Where the place the symbolic link to the private modules directory.") - ;; Ensure `doom//reload-autoloads', `doom//byte-compile' and ;; `doom-initialize-packages' all include this module in their operations. -(add-to-list 'doom-extra-module-paths +private-config-path) +(add-to-list 'doom-psuedo-module-dirs +private-config-path) +(add-to-list 'doom-modules-dirs (expand-file-name "modules/" +private-config-path)) ;; (load (expand-file-name "init.el" +private-config-path) 'noerror 'nomessage) - diff --git a/modules/config/private/packages.el b/modules/config/private/packages.el deleted file mode 100644 index 0544484ae..000000000 --- a/modules/config/private/packages.el +++ /dev/null @@ -1,15 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; config/private/packages.el - -(let ((modules-path (expand-file-name "modules/" +private-config-path))) - (when (file-directory-p modules-path) - ;; automatically symlinks your private modules to `doom-modules-dir'. - (if (and (file-directory-p +private-symlink-path) - (not (file-symlink-p +private-symlink-path))) - (lwarn "config/private" :warning - "modules/%s already exists; can't create symlink" +private-symlink-path) - (make-symbolic-link modules-path +private-symlink-path t)))) - -;; -(load (expand-file-name "packages.el" +private-config-path) - 'noerror 'nomessage) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index c89d83e72..502bc82dc 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -233,7 +233,7 @@ compilation database is present in the project.") ;; 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))) + (when-let* ((elc-file (locate-library "rtags.elc" t doom-package-load-path))) (delete-file elc-file)))) :config (setq rtags-display-result-backend 'ivy)) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index eb17a0b11..c37f3c5e5 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -198,8 +198,8 @@ unfold to point on startup." (def-org-file-link! "org" +org-dir) (def-org-file-link! "doom" doom-emacs-dir) - (def-org-file-link! "doom-module" doom-modules-dir) (def-org-file-link! "doom-docs" doom-docs-dir) + (def-org-file-link! "doom-modules" doom-modules-dir) ;; Update UI when theme is changed (add-hook 'doom-init-theme-hook #'+org|setup-ui)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 190da6f5f..374a0c6f8 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -263,7 +263,7 @@ controlled by `+doom-dashboard-pwd-policy'." (+doom-dashboard--center +doom-dashboard--width (format "Loaded %d packages in %d modules in %.02fs" - (length doom--package-load-path) + (length doom-package-load-path) (hash-table-size doom-modules) doom-init-time)) 'face 'font-lock-comment-face) From d2436650a31585b94d0a651fccc86ba2c0ff8e12 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 02:11:00 -0500 Subject: [PATCH 0468/4235] Move server+benchmark code into doom|finalize --- core/core-packages.el | 7 +------ core/core.el | 7 ++++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index f8d327afe..66b6e88ac 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -327,12 +327,7 @@ MODULES is an malformed plist of modules to load." (setq doom-modules ',doom-modules) ,@(nreverse init-forms) (unless noninteractive - ,@(nreverse config-forms) - (when (display-graphic-p) - (require 'server) - (unless (server-running-p) - (server-start))) - (add-hook 'doom-post-init-hook #'doom-packages--display-benchmark))))) + ,@(nreverse config-forms))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." diff --git a/core/core.el b/core/core.el index 610cb3336..da0edcbeb 100644 --- a/core/core.el +++ b/core/core.el @@ -184,7 +184,12 @@ ability to invoke the debugger in debug mode." `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))) + (run-hook-wrapped hook #'doom-try-run-hook hook)) + (when (display-graphic-p) + (require 'server) + (unless (server-running-p) + (server-start))) + (doom-packages--display-benchmark)) ;; If you forget to reset this, you'll get stuttering and random freezes! (setq gc-cons-threshold 16777216 From 540e74a6aa7b17935981bf1af91c28cfcb078588 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 02:12:01 -0500 Subject: [PATCH 0469/4235] Remove accidental file --- modules/config/default/doom-emacs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 modules/config/default/doom-emacs diff --git a/modules/config/default/doom-emacs b/modules/config/default/doom-emacs deleted file mode 100644 index 409e73652..000000000 --- a/modules/config/default/doom-emacs +++ /dev/null @@ -1,8 +0,0 @@ -(defun projectile-find-tag () - "Find tag in project." - (interactive) - (projectile-visit-project-tags-table) - ;; Auto-discover the user's preference for tags - (let ((xref-backend-functions '(t))) ) - (let ((find-tag-fn (projectile-determine-find-tag-fn))) - (call-interactively find-tag-fn))) \ No newline at end of file From 78fe91ce10c87db6a793803f65154b531137c69a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 02:12:58 -0500 Subject: [PATCH 0470/4235] feature/file-templates: update header line in doom templates --- modules/feature/file-templates/autoload.el | 7 +++++++ .../file-templates/templates/emacs-lisp-mode/__doom-module | 2 +- .../templates/emacs-lisp-mode/__doom-packages | 2 +- .../file-templates/templates/emacs-lisp-mode/__doom-test | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 modules/feature/file-templates/autoload.el diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el new file mode 100644 index 000000000..47d93f324 --- /dev/null +++ b/modules/feature/file-templates/autoload.el @@ -0,0 +1,7 @@ +;;; feature/file-templates/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +file-templates-get-short-path () + "TODO" + (when (string-match "/modules/\\(.+\\)$" buffer-file-truename) + (match-string 1 buffer-file-truename))) 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 4f5468293..af30ef14b 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-truename doom-modules-dir)` -*- lexical-binding: t; -*- +;;; `(+file-templates-get-short-path)` -*- 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 a87f1eae8..bf02a0423 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-truename doom-modules-dir)` +;;; `(+file-templates-get-short-path)` $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 af428094a..054819720 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-truename doom-modules-dir)` +;;; `(+file-templates-get-short-path)` $0 \ No newline at end of file From f864931643e45346cfe5039aa5cf20a26e851d75 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 03:11:28 -0500 Subject: [PATCH 0471/4235] Fix gibberish (char codes) in load-path --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 66b6e88ac..21fc9c398 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -174,7 +174,7 @@ it anyway." (setq doom-package-load-path (directory-files package-user-dir t "^[^.]" t) load-path (append doom-package-load-path doom-site-load-path - doom-core-dir + (list doom-core-dir) doom-modules-dirs)))) (defun doom-initialize-autoloads () From d04a1fa9407b1720697f0ad8cb6debad18fd5cb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 04:47:02 -0500 Subject: [PATCH 0472/4235] Remove doom-module-pairs --- core/autoload/help.el | 2 +- core/core-packages.el | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 84b91819c..e43ed5e8d 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -77,7 +77,7 @@ in." nil t module)))) (cl-destructuring-bind (category submodule) (mapcar #'intern (split-string module " ")) - (unless (member (cons category submodule) (doom-module-pairs)) + (unless (doom-module-enabled-p category submodule) (error "'%s' isn't a valid module" module)) (let ((doc-path (expand-file-name "README.org" (doom-module-path category submodule)))) (unless (file-exists-p doc-path) diff --git a/core/core-packages.el b/core/core-packages.el index 21fc9c398..812910a9a 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -281,11 +281,6 @@ Used by `require!' and `depends-on!'." '(t)) doom-modules))) -(defun doom-module-pairs () - "Returns `doom-modules' as a list of (MODULE . SUBMODULE) cons cells." - (cl-loop for key being the hash-keys of doom-modules - collect key)) - (defun doom-module-load-file (module submodule file &optional path) "Load FILE in MODULE/SUBMODULE. If PATH is specified, look for FILE in PATH." (unless (or path (file-name-absolute-p file)) From bae226b94f58c6157eb992752adf9afe4744b52d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 04:59:48 -0500 Subject: [PATCH 0473/4235] Refactor to revolve module tree roots around doom! calls Any module can now use a doom! call to declare a module tree root. This means that if you have a doom! block in ~/.emacs.d/modules/lang/org/init.el, then you can have submodules in ~/.emacs.d/modules/lang/org/modules/MODULE/SUBMODULE if you wanted to for some reason. This is only really truly useful for private modules. A doom! block in ~/.doom.d/init.el will recognize and enable modules in ~/.doom.d/modules/. --- core/core-packages.el | 56 ++++++++++++++++++---------------- core/core.el | 2 +- modules/config/private/init.el | 4 +-- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 812910a9a..5d8eb8337 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -185,7 +185,8 @@ it anyway." (defun doom-initialize-packages (&optional force-p load-p) "Crawls across your emacs.d to fill `doom-modules' (from init.el) and -`doom-packages' (from packages.el files), if they aren't set already. +`doom-packages' (from packages.el files), if they aren't set already. Also runs +every enabled module's init.el. If FORCE-P is non-nil, do it even if they are. @@ -218,23 +219,25 @@ This aggressively reloads core autoload files." (_load (expand-file-name "packages.el" doom-core-dir)) (cl-loop for key being the hash-keys of doom-modules if (doom-module-path (car key) (cdr key) "packages.el") - do (doom-module-load-file (car key) (cdr key) it)) + do (let ((doom--current-module key)) (_load it))) (cl-loop for dir in doom-psuedo-module-dirs for path = (expand-file-name "packages.el" dir) if (file-exists-p path) do (_load path)))))) -(defun doom-module-path (module submodule &optional file) +(defun doom-module-path (module submodule &optional file root) "Get the full path to a module: e.g. :lang emacs-lisp maps to ~/.emacs.d/modules/lang/emacs-lisp/ and will append FILE if non-nil." (when (keywordp module) (setq module (substring (symbol-name module) 1))) (when (symbolp submodule) (setq submodule (symbol-name submodule))) - (cl-loop for default-directory in doom-modules-dirs - for path = (concat module "/" submodule "/" file) - if (file-exists-p path) - return (expand-file-name path))) + (if root + (expand-file-name (concat "modules/" module "/" submodule "/" file) root) + (cl-loop for default-directory in doom-modules-dirs + for path = (concat module "/" submodule "/" file) + if (file-exists-p path) + return (expand-file-name path)))) (defun doom-module-from-path (&optional path) "Get module cons cell (MODULE . SUBMODULE) for PATH, if possible." @@ -281,13 +284,6 @@ Used by `require!' and `depends-on!'." '(t)) doom-modules))) -(defun doom-module-load-file (module submodule file &optional path) - "Load FILE in MODULE/SUBMODULE. If PATH is specified, look for FILE in PATH." - (unless (or path (file-name-absolute-p file)) - (setq path (doom-module-path module submodule file))) - (let ((doom--current-module (cons module submodule))) - (load (expand-file-name file path) :noerror (not doom-debug-mode)))) - (defun doom-packages--display-benchmark () (message "Doom loaded %s packages across %d modules in %.03fs" ;; Certainly imprecise, especially where custom additions to @@ -309,17 +305,21 @@ Used by `require!' and `depends-on!'." MODULES is an malformed plist of modules to load." (let (init-forms config-forms module file-name-handler-alist) - (dolist (m modules) - (cond ((keywordp m) (setq module m)) - ((not module) (error "No namespace specified in `doom!' for %s" m)) - ((let ((submodule (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (doom-module-enable module submodule flags) - (let ((path (doom-module-path module submodule))) - (push `(doom-module-load-file ,module ',submodule "init" ,path) init-forms) - (push `(doom-module-load-file ,module ',submodule "config" ,path) config-forms)))))) + (let ((modules-dir (file-name-directory (or load-file-name byte-compile-current-file)))) + (add-to-list 'doom-modules-dirs (expand-file-name "modules/" modules-dir)) + (dolist (m modules) + (cond ((keywordp m) (setq module m)) + ((not module) (error "No namespace specified in `doom!' for %s" m)) + ((let ((submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) + (doom-module-enable module submodule flags) + (let ((path (doom-module-path module submodule nil modules-dir)) + (mod `(doom--current-module ',(cons module submodule)))) + (push `(let (,mod) (load! init ,path t)) init-forms) + (push `(let (,mod) (load! config ,path t)) config-forms))))))) `(let (file-name-handler-alist) - (setq doom-modules ',doom-modules) + (setq doom-modules ',doom-modules + doom-modules-dirs ',doom-modules-dirs) ,@(nreverse init-forms) (unless noninteractive ,@(nreverse config-forms))))) @@ -403,9 +403,11 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (doom-module-enable module submodule flags)) (if (file-directory-p module-path) `(condition-case-unless-debug ex - (progn - (doom-module-load-file ,module ',submodule "init" ,module-path) - (doom-module-load-file ,module ',submodule "config" ,module-path)) + (let ((doom--current-module (cons module submodule))) + (load ,(doom-module-path module submodule "init") + :noerror (not doom-debug-mode)) + (load ,(doom-module-path module submodule "config") + :noerror (not doom-debug-mode))) ('error (lwarn 'doom-modules :error "%s in '%s %s' -> %s" diff --git a/core/core.el b/core/core.el index da0edcbeb..9e8d3556c 100644 --- a/core/core.el +++ b/core/core.el @@ -34,7 +34,7 @@ line or use --debug-init to enable this.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") "The main directory where Doom modules are stored.") -(defvar doom-modules-dirs (list doom-modules-dir) +(defvar doom-modules-dirs nil "A list of module root directories. Order determines priority.") (defvar doom-local-dir (concat doom-emacs-dir ".local/") diff --git a/modules/config/private/init.el b/modules/config/private/init.el index 762064d97..b983f2df6 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -8,9 +8,9 @@ Doom Emacs.") ;; Ensure `doom//reload-autoloads', `doom//byte-compile' and -;; `doom-initialize-packages' all include this module in their operations. +;; `doom-initialize-packages' will treat `+private-config-path' as the root of +;; this module. (add-to-list 'doom-psuedo-module-dirs +private-config-path) -(add-to-list 'doom-modules-dirs (expand-file-name "modules/" +private-config-path)) ;; (load (expand-file-name "init.el" +private-config-path) From e7c9f5c08f86bca312e84c371034788b6058ecdb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 05:20:47 -0500 Subject: [PATCH 0474/4235] Fix over-zealous path resolution This issue made it impossible enable default modules from private doom! blocks. --- core/core-packages.el | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 5d8eb8337..15f1869f1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -305,24 +305,26 @@ Used by `require!' and `depends-on!'." MODULES is an malformed plist of modules to load." (let (init-forms config-forms module file-name-handler-alist) - (let ((modules-dir (file-name-directory (or load-file-name byte-compile-current-file)))) - (add-to-list 'doom-modules-dirs (expand-file-name "modules/" modules-dir)) + (let ((modules-dir + (expand-file-name "modules/" (file-name-directory (or load-file-name byte-compile-current-file))))) + (add-to-list 'doom-modules-dirs modules-dir) (dolist (m modules) (cond ((keywordp m) (setq module m)) ((not module) (error "No namespace specified in `doom!' for %s" m)) ((let ((submodule (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) (doom-module-enable module submodule flags) - (let ((path (doom-module-path module submodule nil modules-dir)) + (let ((path (doom-module-path module submodule)) (mod `(doom--current-module ',(cons module submodule)))) (push `(let (,mod) (load! init ,path t)) init-forms) - (push `(let (,mod) (load! config ,path t)) config-forms))))))) - `(let (file-name-handler-alist) - (setq doom-modules ',doom-modules - doom-modules-dirs ',doom-modules-dirs) - ,@(nreverse init-forms) - (unless noninteractive - ,@(nreverse config-forms))))) + (push `(let (,mod) (load! config ,path t)) config-forms)))))) + `(let (file-name-handler-alist) + (add-to-list 'load-path ,modules-dir) + (setq doom-modules ',doom-modules + doom-modules-dirs ',doom-modules-dirs) + ,@(nreverse init-forms) + (unless noninteractive + ,@(nreverse config-forms)))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." From 62dc472dfe0175a5d7e936f188f7b205b11b693b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 05:42:37 -0500 Subject: [PATCH 0475/4235] Remove vestigial :private hlissner from init.test.el --- init.test.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/init.test.el b/init.test.el index 8d529cd2f..16f3d5c10 100644 --- a/init.test.el +++ b/init.test.el @@ -17,7 +17,4 @@ :lang org - web - - :private - hlissner) + web) From 2b43dd42e2bb23075595ca700d366b291956abb7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 19:36:32 -0500 Subject: [PATCH 0476/4235] Refactor doom-hide-modeline-mode --- core/core-ui.el | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 3613e4aa4..9e703275c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -79,7 +79,7 @@ with `doom//reload-theme').") ;; A minor mode for hiding the mode-line ;; -(defvar-local doom--modeline-format nil +(defvar doom--modeline-format nil "The modeline format to use when `doom-hide-modeline-mode' is active. Don't set this directly. Let-bind it instead.") @@ -91,18 +91,16 @@ disabled.") "Minor mode to hide the mode-line in the current buffer." :init-value nil :global nil - (cond (doom-hide-modeline-mode - (add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset nil t) - (setq mode-line-format (or doom--old-modeline-format doom--modeline-format) - doom--old-modeline-format nil)) - (t - (remove-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset t) - (setq mode-line-format doom--old-modeline-format - doom--old-modeline-format nil))) + (if doom-hide-modeline-mode + (progn + (add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset nil t) + (setq doom--old-modeline-format mode-line-format + mode-line-format doom--modeline-format)) + (remove-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset t) + (setq mode-line-format doom--old-modeline-format)) (force-mode-line-update)) ;; Ensure major-mode or theme changes don't overwrite these variables -(put 'doom--modeline-format 'permanent-local t) (put 'doom--old-modeline-format 'permanent-local t) (put 'doom-hide-modeline-mode 'permanent-local t) (put 'doom-hide-modeline-mode 'permanent-local-hook t) From f8bf86e1a34fccbbee96b94a8f928222201ff06b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 21:02:24 -0500 Subject: [PATCH 0477/4235] ui/doom-dashboard: add button to open private module --- modules/ui/doom-dashboard/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 374a0c6f8..410d1c6bd 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -303,5 +303,8 @@ controlled by `+doom-dashboard-pwd-policy'." ("Jump to bookmark" "bookmark" (call-interactively (or (command-remapping #'bookmark-jump) #'bookmark-jump))) - ("Edit emacs.d" "tools" + ,(when (featurep! :config private) + '("Open custom init script" "settings" + (find-file (expand-file-name "init.el" +private-config-path)))) + ("Edit Doom Emacs" "tools" (doom-project-find-file doom-emacs-dir)))))) From d91481a9a0acc64efaabe34c5271766f33556f6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 23:26:40 -0500 Subject: [PATCH 0478/4235] Add private module to load-path This fixes autoload cookies in private autoload files (e.g. ~/.doom.d/autoload/file.el). --- core/core-packages.el | 3 ++- modules/config/private/init.el | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 15f1869f1..4eb0529fe 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -175,7 +175,8 @@ it anyway." load-path (append doom-package-load-path doom-site-load-path (list doom-core-dir) - doom-modules-dirs)))) + doom-modules-dirs + doom-psuedo-module-dirs)))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run diff --git a/modules/config/private/init.el b/modules/config/private/init.el index b983f2df6..91f87f0a1 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -11,6 +11,7 @@ Doom Emacs.") ;; `doom-initialize-packages' will treat `+private-config-path' as the root of ;; this module. (add-to-list 'doom-psuedo-module-dirs +private-config-path) +(add-to-list 'load-path +private-config-path) ;; (load (expand-file-name "init.el" +private-config-path) From 8efd5d1eae266cff62c1b83c4f97e7ab6968b9c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Feb 2018 23:28:18 -0500 Subject: [PATCH 0479/4235] Fix make clean not catching all *.elc files --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 4eb0529fe..0fb80e75f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -731,7 +731,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date core files." "Delete all the compiled elc files in your Emacs configuration. This excludes compiled packages.'" (interactive) - (ignore-errors (doom-initialize-packages)) + (ignore-errors (doom-initialize-packages t)) (let ((targets (append (list (expand-file-name "init.elc" doom-emacs-dir)) (doom-packages--files doom-core-dir "\\.elc$") From 0c459cfefd9cafd2a80e882477b208e5a695a62e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 03:40:37 -0500 Subject: [PATCH 0480/4235] lang/org: make backspace org-mode aware This ensures backspace respects tables and doesn't break whitespace in table cells. --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c37f3c5e5..b9d4c0ea2 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -211,6 +211,7 @@ between the two." (map! :map org-mode-map [remap org-shifttab] #'+org/shifttab + [backspace] #'org-delete-backward-char "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images From 824077184619b51ec7e6d52112bc47727f13ab6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 04:55:35 -0500 Subject: [PATCH 0481/4235] app/rss: fix +rss/quit & compact db --- modules/app/rss/autoload.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 38e79fc02..2be7a71af 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -8,10 +8,12 @@ ;;;###autoload (defun +rss/quit () + "TODO" (interactive) + (elfeed-db-compact) (doom-kill-matching-buffers "^\\*elfeed") (dolist (file +rss-elfeed-files) - (when-let* ((buf (get-file-buffer (expand-file-name file +rss-org-dir)))) + (when-let* ((buf (get-file-buffer (expand-file-name file +org-dir)))) (kill-buffer buf)))) ;;;###autoload From d8be0a5f4c5a7a960797a59d2e25101de7d82423 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 04:55:57 -0500 Subject: [PATCH 0482/4235] app/rss: move default elfeed file --- 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 6b12172f7..1bedf6769 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -4,7 +4,7 @@ ;; by apps Reeder and Readkit. It can be invoked via `=rss'. Otherwise, if you ;; don't care for the UI you can invoke elfeed directly with `elfeed'. -(defvar +rss-elfeed-files (list "rss/elfeed.org") +(defvar +rss-elfeed-files (list "elfeed.org") "The files that configure `elfeed's rss feeds.") (defvar +rss-split-direction 'below From 9f471806fe4e8337284df39a068562d119d98560 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 04:56:16 -0500 Subject: [PATCH 0483/4235] app/rss: add :popup rule for elfeed-entry windows --- modules/app/rss/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 1bedf6769..fcac7e46f 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -25,6 +25,10 @@ elfeed-show-entry-delete #'+rss/delete-pane shr-max-image-proportion 0.6) + (set! :popup "^\\*elfeed-entry" + '((size . 0.75) (side . bottom)) + '((select . t) (quit) (transient . t))) + (make-directory elfeed-db-directory t) ;; Ensure elfeed buffers are treated as real From 70c8e3cb528f0d3d0edc62e82dff1bd1e476b45b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 04:56:27 -0500 Subject: [PATCH 0484/4235] app/rss: bind M-RET = open entry in browser --- modules/app/rss/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index fcac7e46f..3d716d556 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -43,10 +43,11 @@ [remap kill-buffer] "q") (:map elfeed-search-mode-map - :n "q" #'+rss/quit - :n "r" #'elfeed-update - :n "s" #'elfeed-search-live-filter - :n "RET" #'elfeed-search-show-entry) + :n "q" #'+rss/quit + :n "r" #'elfeed-update + :n "s" #'elfeed-search-live-filter + :n "RET" #'elfeed-search-show-entry + :n "M-RET" #'elfeed-search-browse-url) (:map elfeed-show-mode-map :n "q" #'elfeed-kill-buffer From aa216af4d6e8d6bffc0917f98a9ff1ae1dda173d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 18:39:54 -0500 Subject: [PATCH 0485/4235] feature/file-templates: add+polish license file templates --- .../file-templates/templates/text-mode/__lic | 5 + .../templates/text-mode/__license | 6 + .../templates/text-mode/__license-apache | 5 +- .../templates/text-mode/__license-apache-bp | 19 + .../templates/text-mode/__license-bsd2 | 16 +- .../templates/text-mode/__license-bsd3 | 16 +- .../templates/text-mode/__license-gpl3 | 865 ++++++++++++------ .../templates/text-mode/__license-gpl3-bp | 21 + .../templates/text-mode/__license-lgpl3 | 171 ++++ .../templates/text-mode/__license-mit | 7 +- .../templates/text-mode/__license-mozilla | 380 ++++++++ .../templates/text-mode/__license-mozilla-bp | 9 + .../templates/text-mode/__license-unlicense | 30 + 13 files changed, 1249 insertions(+), 301 deletions(-) create mode 100644 modules/feature/file-templates/templates/text-mode/__lic create mode 100644 modules/feature/file-templates/templates/text-mode/__license create mode 100644 modules/feature/file-templates/templates/text-mode/__license-apache-bp create mode 100644 modules/feature/file-templates/templates/text-mode/__license-gpl3-bp create mode 100644 modules/feature/file-templates/templates/text-mode/__license-lgpl3 create mode 100644 modules/feature/file-templates/templates/text-mode/__license-mozilla create mode 100644 modules/feature/file-templates/templates/text-mode/__license-mozilla-bp create mode 100644 modules/feature/file-templates/templates/text-mode/__license-unlicense diff --git a/modules/feature/file-templates/templates/text-mode/__lic b/modules/feature/file-templates/templates/text-mode/__lic new file mode 100644 index 000000000..3185a92ac --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__lic @@ -0,0 +1,5 @@ +# -*- mode: snippet -*- +# name: Insert a license +# type: command +# -- +(%alias "__license") \ No newline at end of file diff --git a/modules/feature/file-templates/templates/text-mode/__license b/modules/feature/file-templates/templates/text-mode/__license new file mode 100644 index 000000000..3d0d8a0b8 --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: Insert a license +# uuid: __license +# type: command +# -- +(+file-templates/insert-license) \ No newline at end of file diff --git a/modules/feature/file-templates/templates/text-mode/__license-apache b/modules/feature/file-templates/templates/text-mode/__license-apache index 93184c002..a50a612a5 100644 --- a/modules/feature/file-templates/templates/text-mode/__license-apache +++ b/modules/feature/file-templates/templates/text-mode/__license-apache @@ -1,5 +1,8 @@ # -*- mode: snippet -*- -# name: Apache 2.0 License +# name: Apache License 2.0 +# uuid: __license-apache +# group: Licenses +# contributor: https://choosealicense.com/licenses/apache-2.0/ # -- Apache License Version 2.0, January 2004 diff --git a/modules/feature/file-templates/templates/text-mode/__license-apache-bp b/modules/feature/file-templates/templates/text-mode/__license-apache-bp new file mode 100644 index 000000000..95d9d8bc5 --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license-apache-bp @@ -0,0 +1,19 @@ +# -*- mode: snippet -*- +# name: Apache License 2.0 (boilerplate) +# uuid: __license-apache-bp +# group: Licenses +# contributor: https://choosealicense.com/licenses/apache-2.0/ +# -- +Copyright ${1:`(format-time-string "%Y")` `user-full-name`} + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/modules/feature/file-templates/templates/text-mode/__license-bsd2 b/modules/feature/file-templates/templates/text-mode/__license-bsd2 index a1a0d0094..bbff2e37d 100644 --- a/modules/feature/file-templates/templates/text-mode/__license-bsd2 +++ b/modules/feature/file-templates/templates/text-mode/__license-bsd2 @@ -1,17 +1,9 @@ # -*- mode: snippet -*- -# name: BSD 2-clause License +# name: 2-clause BSD License +# uuid: __license-bsd2 +# group: Licenses # -- -${1:} -${2:} - -In the original BSD license, the occurrence of "copyright holder" in the 3rd -clause read "ORGANIZATION", placeholder for "University of California". In the -original BSD license, both occurrences of the phrase "COPYRIGHT HOLDERS AND -CONTRIBUTORS" in the disclaimer read "REGENTS AND CONTRIBUTORS". - -Here is the license template: - -Copyright (c) $2, $1 +Copyright (c) ${1:`(format-time-string "%Y")`} ${2:`user-full-name`} All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/modules/feature/file-templates/templates/text-mode/__license-bsd3 b/modules/feature/file-templates/templates/text-mode/__license-bsd3 index 8cfd0b1ea..dc3d0e843 100644 --- a/modules/feature/file-templates/templates/text-mode/__license-bsd3 +++ b/modules/feature/file-templates/templates/text-mode/__license-bsd3 @@ -1,18 +1,8 @@ # -*- mode: snippet -*- -# name: BSD 3-clause License +# name: 3-clause BSD License +# uuid: __license-bsd3 # -- -${1:} -${2:} -${3:} - -In the original BSD license, the occurrence of "copyright holder" in the 3rd -clause read "ORGANIZATION", placeholder for "University of California". In the -original BSD license, both occurrences of the phrase "COPYRIGHT HOLDERS AND -CONTRIBUTORS" in the disclaimer read "REGENTS AND CONTRIBUTORS". - -Here is the license template: - -Copyright (c) $3, $1 +Copyright (c) ${1:`(format-time-string "%Y")`} ${2:`user-full-name`} All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/modules/feature/file-templates/templates/text-mode/__license-gpl3 b/modules/feature/file-templates/templates/text-mode/__license-gpl3 index 98a61181a..197d810c1 100644 --- a/modules/feature/file-templates/templates/text-mode/__license-gpl3 +++ b/modules/feature/file-templates/templates/text-mode/__license-gpl3 @@ -1,303 +1,628 @@ # -*- mode: snippet -*- -# name: GPL 3.0 License +# name: GNU GPL 3.0 License +# uuid: __license-gpl3 +# group: Licenses +# contributor: https://choosealicense.com/licenses/gpl-3.0/ # -- -${1:Software Headline} -Copyright (C) `(format-time-string "%Y")` `user-full-name` - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + Version 3, 29 June 2007 - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + TERMS AND CONDITIONS - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". + 0. Definitions. -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. + "This License" refers to version 3 of the GNU General Public License. - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. + A "covered work" means either the unmodified Program or a work based +on the Program. - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. + 1. Source Code. -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. + The Corresponding Source for a work in source code form is that +same work. -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. + 2. Basic Permissions. - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of this License. - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. + 13. Use with the GNU Affero General Public License. -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. + 14. Revised Versions of this License. - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. - NO WARRANTY + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. + 15. Disclaimer of Warranty. - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. END OF TERMS AND CONDITIONS @@ -309,15 +634,15 @@ free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least +state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - {description} - Copyright (C) {year} {fullname} + + Copyright (C) - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -325,37 +650,31 @@ the "copyright" line and a pointer to where the full notice is found. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + You should have received a copy of the GNU General Public License + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type \`show w'. + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it - under certain conditions; type \`show c' for details. + under certain conditions; type `show c' for details. -The hypothetical commands \`show w' and \`show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than \`show w' and \`show c'; they could even be -mouse-clicks or menu items--whatever suits your program. +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - \`Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/modules/feature/file-templates/templates/text-mode/__license-gpl3-bp b/modules/feature/file-templates/templates/text-mode/__license-gpl3-bp new file mode 100644 index 000000000..4e8ff3c21 --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license-gpl3-bp @@ -0,0 +1,21 @@ +# -*- mode: snippet -*- +# name: GNU GPL 3.0 License (boilerplate) +# uuid: __license-gpl3-bp +# group: Licenses +# contributor: https://choosealicense.com/licenses/lgpl-3.0 +# -- +${1:} +Copyright (C) ${2:`(format-time-string "%Y")`} ${3:`user-full-name`} + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . \ No newline at end of file diff --git a/modules/feature/file-templates/templates/text-mode/__license-lgpl3 b/modules/feature/file-templates/templates/text-mode/__license-lgpl3 new file mode 100644 index 000000000..8aefb505d --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license-lgpl3 @@ -0,0 +1,171 @@ +# -*- mode: snippet -*- +# name: GNU LGPL v3 License +# uuid: __license-lgpl3 +# group: Licenses +# contribuer: https://choosealicense.com/licenses/lgpl-3.0/ +# -- + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/modules/feature/file-templates/templates/text-mode/__license-mit b/modules/feature/file-templates/templates/text-mode/__license-mit index 3807c0730..1dc7a88a9 100644 --- a/modules/feature/file-templates/templates/text-mode/__license-mit +++ b/modules/feature/file-templates/templates/text-mode/__license-mit @@ -1,9 +1,12 @@ -# -*- mode: snippet -*- +# -*- mode: snippet-mode; -*- # name: MIT License +# uuid: __license-mit +# group: Licenses +# contributor: https://choosealicense.com/licenses/mit/ # -- The MIT License (MIT) -Copyright (c) `(format-time-string "%Y")` `user-full-name`. +Copyright (c) ${1:`(format-time-string "%Y")`} ${2:`user-full-name`} Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/modules/feature/file-templates/templates/text-mode/__license-mozilla b/modules/feature/file-templates/templates/text-mode/__license-mozilla new file mode 100644 index 000000000..bba13b752 --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license-mozilla @@ -0,0 +1,380 @@ +# -*- mode: snippet -*- +# name: Mozilla Public License 2.0 +# uuid: __license-mozilla +# group: Licenses +# contributor: https://choosealicense.com/licenses/mpl-2.0 +# -- +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. + diff --git a/modules/feature/file-templates/templates/text-mode/__license-mozilla-bp b/modules/feature/file-templates/templates/text-mode/__license-mozilla-bp new file mode 100644 index 000000000..7a7fc422f --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license-mozilla-bp @@ -0,0 +1,9 @@ +# -*- mode: snippet -*- +# name: Mozilla Public License 2.0 (boilerplate) +# uuid: __license-mozilla-bp +# group: Licenses +# contributor: https://choosealicense.com/licenses/mpl-2.0 +# -- +This Source Code Form is subject to the terms of the Mozilla Public +License, v. 2.0. If a copy of the MPL was not distributed with this +file, You can obtain one at http://mozilla.org/MPL/2.0/. \ No newline at end of file diff --git a/modules/feature/file-templates/templates/text-mode/__license-unlicense b/modules/feature/file-templates/templates/text-mode/__license-unlicense new file mode 100644 index 000000000..6eb992707 --- /dev/null +++ b/modules/feature/file-templates/templates/text-mode/__license-unlicense @@ -0,0 +1,30 @@ +# -*- mode: snippet -*- +# name: The Unlicense +# uuid: __license-unlicense +# group: Licenses +# contributor: https://choosealicense.com/licenses/unlicense +# -- +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to From ef4962c702c559de0512b0fe553d52329be83a6c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 18:41:21 -0500 Subject: [PATCH 0486/4235] feature/file-templates: new +file-templates/insert-license command --- modules/feature/file-templates/autoload.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 47d93f324..ce0d08930 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -5,3 +5,19 @@ "TODO" (when (string-match "/modules/\\(.+\\)$" buffer-file-truename) (match-string 1 buffer-file-truename))) + +;;;###autoload +(defun +file-templates/insert-license () + "Insert a license file template into the current file." + (interactive) + (require 'yasnippet) + (let* ((templates + (let ((yas-choose-tables-first nil) ; avoid prompts + (yas-choose-keys-first nil)) + (cl-loop for tpl in (yas--all-templates (yas--get-snippet-tables 'text-mode)) + for uuid = (yas--template-uuid tpl) + if (string-prefix-p "__license-" uuid) + collect (cons (string-remove-prefix "__license-" uuid) tpl)))) + (uuid (yas-choose-value (mapcar #'car templates)))) + (when uuid + (yas-expand-snippet (cdr (assoc uuid templates)))))) From a1580e59199b457c17b6b628a8a3f584af62b3d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 18:41:47 -0500 Subject: [PATCH 0487/4235] config/private: wrap init.el in file-directory-p check --- modules/config/private/init.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/config/private/init.el b/modules/config/private/init.el index 91f87f0a1..b1457a2b0 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -7,12 +7,13 @@ "The directory that serves as the root of your external private config for Doom Emacs.") -;; Ensure `doom//reload-autoloads', `doom//byte-compile' and -;; `doom-initialize-packages' will treat `+private-config-path' as the root of -;; this module. -(add-to-list 'doom-psuedo-module-dirs +private-config-path) -(add-to-list 'load-path +private-config-path) +(when (file-directory-p +private-config-path) + ;; Ensure `doom//reload-autoloads', `doom//byte-compile' and + ;; `doom-initialize-packages' will treat `+private-config-path' as the root of + ;; this module. + (add-to-list 'doom-psuedo-module-dirs +private-config-path) + (add-to-list 'load-path +private-config-path) -;; -(load (expand-file-name "init.el" +private-config-path) - 'noerror 'nomessage) + ;; + (load (expand-file-name "init.el" +private-config-path) + :noerror :nomessage)) From 2425893cc9e571d486f4bf7edb86ad0794933007 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 18:50:59 -0500 Subject: [PATCH 0488/4235] tools/neotree: use slightly wider window --- modules/tools/neotree/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/neotree/config.el b/modules/tools/neotree/config.el index 5d0a9fc45..c2560e4c8 100644 --- a/modules/tools/neotree/config.el +++ b/modules/tools/neotree/config.el @@ -13,7 +13,7 @@ neo-auto-indent-point nil neo-autorefresh nil neo-mode-line-type 'none - neo-window-width 25 + neo-window-width 28 neo-show-updir-line nil neo-theme 'nerd ; fallback neo-banner-message nil From 40e5357566b6d617eb356e501240b8b10f4b76fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 18:51:14 -0500 Subject: [PATCH 0489/4235] tools/neotree: keep cursor at beginning-of-text, not bol --- modules/tools/neotree/config.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/tools/neotree/config.el b/modules/tools/neotree/config.el index c2560e4c8..6d57badde 100644 --- a/modules/tools/neotree/config.el +++ b/modules/tools/neotree/config.el @@ -38,4 +38,18 @@ '((quit . current) (select . t))) (when (bound-and-true-p winner-mode) - (push neo-buffer-name winner-boring-buffers))) + (push neo-buffer-name winner-boring-buffers)) + + ;; The cursor always sits at bol. `+neotree*fix-cursor' and + ;; `+neotree*indent-cursor' change that behavior, so that the cursor is always + ;; on the first non-blank character on the line, in the neo buffer. + (defun +neotree*fix-cursor (&rest _) + (with-current-buffer neo-global--buffer + (+neotree*indent-cursor))) + (add-hook 'neo-enter-hook #'+neotree*fix-cursor) + + (defun +neotree*indent-cursor (&rest _) + (beginning-of-line) + (skip-chars-forward " \t\r")) + (advice-add #'neotree-next-line :after #'+neotree*indent-cursor) + (advice-add #'neotree-previous-line :after #'+neotree*indent-cursor)) From 7ac29bbd270b6cb35aad168d50088adc58f74f1d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 19:09:15 -0500 Subject: [PATCH 0490/4235] Refactor require! macro --- core/core-packages.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 0fb80e75f..36afc6fb7 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -407,10 +407,8 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (if (file-directory-p module-path) `(condition-case-unless-debug ex (let ((doom--current-module (cons module submodule))) - (load ,(doom-module-path module submodule "init") - :noerror (not doom-debug-mode)) - (load ,(doom-module-path module submodule "config") - :noerror (not doom-debug-mode))) + (load! init ,module-path :noerror) + (load! config ,module-path :noerror)) ('error (lwarn 'doom-modules :error "%s in '%s %s' -> %s" From a862d0eeb1b73402996eaec554334fe2ea1502a7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 19:15:13 -0500 Subject: [PATCH 0491/4235] feature/file-templates: fix doom file templates --- modules/feature/file-templates/config.el | 147 ++++++++++++----------- 1 file changed, 74 insertions(+), 73 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index db8feaafe..24c876ca9 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -48,76 +48,77 @@ `(lambda () (+file-templates--expand ,trigger ',mode ,project-only-p))) #'ignore)))) - (mapc #'+file-templates-add - ;; General - '(("/\\.gitignore$" "__" gitignore-mode) - ("/Dockerfile$" "__" dockerfile-mode) - ("/docker-compose.yml$" "__" yaml-mode) - ;; C/C++ - ("\\.h$" "__h" c-mode) - ("\\.c$" "__c" c-mode) - ("\\.h\\(h\\|pp|xx\\)$" "__hpp" c++-mode) - ("\\.\\(cc\\|cpp\\)$" "__cpp" c++-mode) - ("/main\\.\\(cc\\|cpp\\)$" "__main.cpp" c++-mode) - ("/win32_\\.\\(cc\\|cpp\\)$" "__winmain.cpp" c++-mode) - ("/Makefile$" "__" makefile-gmake-mode) - ;; Elisp - ("\\.el$" "__initfile" emacs-lisp-mode) - ("/.dir-locals.el$" nil) - ("-test\\.el$" "__" emacs-ert-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) - (snippet-mode "__" snippet-mode) - ;; Go - ("\\.go$" "__.go" go-mode) - ("/main\\.go$" "__main.go" go-mode t) - ;; HTML - ("\\.html$" "__.html" web-mode) - ;; java - ("/src/.+/.+\\.java$" "__" java-mode) - ("/main\\.java$" "__main" java-mode) - ("/build\\.gradle$" "__build.gradle" android-mode) - ;; Javascript - ("\\.\\(json\\|jshintrc\\)$" "__" json-mode) - ("/package\\.json$" "__package.json" json-mode) - ("/bower\\.json$" "__bower.json" json-mode) - ("/gulpfile\\.js$" "__gulpfile.js" js-mode) - ("/webpack\\.config\\.js$" "__webpack.config.js" js-mode) - ;; Lua - ("/main\\.lua$" "__main.lua" love-mode) - ("/conf\\.lua$" "__conf.lua" love-mode) - ;; Markdown - ("\\.md$" "__" markdown-mode) - ;; Org - ("\\.org$" "__" org-mode) - ("/\\(?:.emacs.d\\|doom-emacs\\)?/.+/README\\.org$" "__doom-readme" org-mode) - ;; PHP - ("\\.php$" "__" php-mode) - ("\\.class\\.php$" "__.class.php" php-mode) - ;; Python - ;;("tests?/test_.+\\.py$" "__" nose-mode) - ;;("/setup\\.py$" "__setup.py" python-mode) - ("\\.py$" "__" python-mode) - ;; Ruby - ("\\.rb$" "__" ruby-mode) - ("/Rakefile$" "__Rakefile" ruby-mode t) - ("/Gemfile$" "__Gemfile" ruby-mode t) - ("/\\.rspec$" "__.rspec" rspec-mode) - ("\\.gemspec$" "__.gemspec" ruby-mode t) - ("/spec_helper\\.rb$" "__helper" rspec-mode t) - ("/lib/.+\\.rb$" "__module" ruby-mode t) - ("_spec\\.rb$" "__" rspec-mode t) - ;; Rust - ("/main\\.rs$" "__main.rs" rust-mode) - ("/Cargo.toml$" "__Cargo.toml" rust-mode) - ;; SCSS - ("\\.scss$" "__" scss-mode) - ("/master\\.scss$" "__master.scss" scss-mode) - ("/normalize\\.scss$" "__normalize.scss" scss-mode) - ;; Slim - ("/\\(index\\|main\\)\\.slim$" "__" slim-mode) - ;; Shell scripts - ("\\.z?sh$" "__" sh-mode) - ("\\.fish$" "__" fish-mode) - ("\\.zunit$" "__zunit" sh-mode)))) + (let ((doom (concat "/" (regexp-opt '(".emacs.d" ".doom.d" "doom-emacs" "doom")) "/.*"))) + (mapc #'+file-templates-add + ;; General + `(("/\\.gitignore$" "__" gitignore-mode) + ("/Dockerfile$" "__" dockerfile-mode) + ("/docker-compose.yml$" "__" yaml-mode) + ;; C/C++ + ("\\.h$" "__h" c-mode) + ("\\.c$" "__c" c-mode) + ("\\.h\\(h\\|pp|xx\\)$" "__hpp" c++-mode) + ("\\.\\(cc\\|cpp\\)$" "__cpp" c++-mode) + ("/main\\.\\(cc\\|cpp\\)$" "__main.cpp" c++-mode) + ("/win32_\\.\\(cc\\|cpp\\)$" "__winmain.cpp" c++-mode) + ("/Makefile$" "__" makefile-gmake-mode) + ;; Elisp + ("\\.el$" "__initfile" emacs-lisp-mode) + ("/.dir-locals.el$" nil) + ("-test\\.el$" "__" emacs-ert-mode) + (,(concat doom "/.+\\.el$") "__doom-module" emacs-lisp-mode) + (,(concat doom "/packages\\.el$") "__doom-packages" emacs-lisp-mode) + (,(concat doom "/test/.+\\.el$") "__doom-test" emacs-lisp-mode) + (snippet-mode "__" snippet-mode) + ;; Go + ("\\.go$" "__.go" go-mode) + ("/main\\.go$" "__main.go" go-mode t) + ;; HTML + ("\\.html$" "__.html" web-mode) + ;; java + ("/src/.+/.+\\.java$" "__" java-mode) + ("/main\\.java$" "__main" java-mode) + ("/build\\.gradle$" "__build.gradle" android-mode) + ;; Javascript + ("\\.\\(json\\|jshintrc\\)$" "__" json-mode) + ("/package\\.json$" "__package.json" json-mode) + ("/bower\\.json$" "__bower.json" json-mode) + ("/gulpfile\\.js$" "__gulpfile.js" js-mode) + ("/webpack\\.config\\.js$" "__webpack.config.js" js-mode) + ;; Lua + ("/main\\.lua$" "__main.lua" love-mode) + ("/conf\\.lua$" "__conf.lua" love-mode) + ;; Markdown + ("\\.md$" "__" markdown-mode) + ;; Org + ("\\.org$" "__" org-mode) + (,(concat doom "/README\\.org$") "__doom-readme" org-mode) + ;; PHP + ("\\.php$" "__" php-mode) + ("\\.class\\.php$" "__.class.php" php-mode) + ;; Python + ;;("tests?/test_.+\\.py$" "__" nose-mode) + ;;("/setup\\.py$" "__setup.py" python-mode) + ("\\.py$" "__" python-mode) + ;; Ruby + ("\\.rb$" "__" ruby-mode) + ("/Rakefile$" "__Rakefile" ruby-mode t) + ("/Gemfile$" "__Gemfile" ruby-mode t) + ("/\\.rspec$" "__.rspec" rspec-mode) + ("\\.gemspec$" "__.gemspec" ruby-mode t) + ("/spec_helper\\.rb$" "__helper" rspec-mode t) + ("/lib/.+\\.rb$" "__module" ruby-mode t) + ("_spec\\.rb$" "__" rspec-mode t) + ;; Rust + ("/main\\.rs$" "__main.rs" rust-mode) + ("/Cargo.toml$" "__Cargo.toml" rust-mode) + ;; SCSS + ("\\.scss$" "__" scss-mode) + ("/master\\.scss$" "__master.scss" scss-mode) + ("/normalize\\.scss$" "__normalize.scss" scss-mode) + ;; Slim + ("/\\(index\\|main\\)\\.slim$" "__" slim-mode) + ;; Shell scripts + ("\\.z?sh$" "__" sh-mode) + ("\\.fish$" "__" fish-mode) + ("\\.zunit$" "__zunit" sh-mode))))) From 87f47e6d9a7fd281dcb55c81ae20dabda7f8e2c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 19:21:02 -0500 Subject: [PATCH 0492/4235] lang/emacs-lisp: disable flycheck in new private modules too #425 --- modules/lang/emacs-lisp/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index c84354f5f..b9e3a8bce 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -56,7 +56,11 @@ (defun +emacs-lisp|init-flycheck () "Initialize flycheck-mode if not in emacs.d." (when (and buffer-file-name - (not (file-in-directory-p buffer-file-name doom-emacs-dir))) + (not (cl-loop for dir in (append (list doom-emacs-dir) + doom-modules-dirs + doom-psuedo-module-dirs) + if (file-in-directory-p buffer-file-name dir) + return t))) (flycheck-mode +1)))) From e770d5ccf2ac9af0d826b412f06695b4facfd814 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 19:26:23 -0500 Subject: [PATCH 0493/4235] lang/org: remove ob-redis package #368 It has been merged into org's contrib/, and is no longer on MELPA. --- modules/lang/org/packages.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 2dc39c17d..e96f9b993 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -12,7 +12,6 @@ (when (featurep! +babel) (package! ob-mongo) - (package! ob-redis) (package! ob-sql-mode) (package! ob-translate) From cf4420e903043b59acd2ec39ee6b33022f7db1a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 22:17:50 -0500 Subject: [PATCH 0494/4235] Fix doom//run-tests --- core/autoload/test.el | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 7852196e2..7e3ef9f7a 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -15,10 +15,21 @@ If neither is available, run all tests in all enabled modules." ;; Convert targets (either from MODULES or `argv') into a list of ;; string paths, pointing to the root directory of modules (cond ((string= (car argv) "--") ; command line - (cl-loop for arg in (cdr argv) - if (equal arg "core") collect doom-core-dir - else collect (expand-file-name arg) - finally do (setq argv nil))) + (save-match-data + (cl-loop for arg in (cdr argv) + if (equal arg "core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (cl-loop for dir in doom-modules-dirs + collect (expand-file-name arg dir)) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc + (cl-remove-if-not + #'file-directory-p + (directory-files path t "^[^.]" t))) + finally do (setq argv nil)))) (modules ; cons-cells given to MODULES (cl-loop for (module . submodule) in modules @@ -31,9 +42,10 @@ If neither is available, run all tests in all enabled modules." (append (list doom-core-dir) (doom-module-paths))))))) ;; Load all the unit test files... (dolist (path target-paths) - (when (file-directory-p (expand-file-name "test/" path)) - (dolist (test-file (reverse (doom-packages--files path "\\.el$"))) - (load test-file nil :nomessage)))) + (let ((test-path (expand-file-name "test/" path))) + (when (file-directory-p test-path) + (dolist (test-file (reverse (doom-packages--files test-path "\\.el$"))) + (load test-file nil :noerror))))) ;; ... then run them (if noninteractive (ert-run-tests-batch-and-exit) From aafa45e271c7ea07492bc360b2d05d7d7d239c73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 22:41:58 -0500 Subject: [PATCH 0495/4235] lang/org: fix insert-item tests; refactor +org/insert-item --- modules/lang/org/autoload/org.el | 18 ++++++++++-------- modules/lang/org/test/autoload-org.el | 20 ++++++++++++++++++++ modules/lang/org/test/org.el | 5 ----- 3 files changed, 30 insertions(+), 13 deletions(-) delete mode 100644 modules/lang/org/test/org.el diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 390756ab5..6ca0017b3 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -142,7 +142,7 @@ wrong places)." (- (point) (line-beginning-position))))) (save-match-data (pcase direction - ('below + (`below (org-end-of-item) (backward-char) (end-of-line) @@ -153,7 +153,7 @@ wrong places)." (org-next-item) (org-end-of-line))) (insert "\n" (make-string pad 32) (or marker "")))) - ('above + (`above (goto-char (line-beginning-position)) (if (and marker (string-match-p "[0-9]+[).]" marker)) (org-insert-item) @@ -174,8 +174,9 @@ wrong places)." (org-element-property :level context) 1))) (pcase direction - ('below - (let ((at-eol (= (point) (1- (line-end-position))))) + (`below + (let ((at-eol (>= (point) (1- (line-end-position)))) + org-insert-heading-respect-content) (goto-char (line-end-position)) (org-end-of-subtree) (insert (concat "\n" @@ -185,11 +186,12 @@ wrong places)." "\n")) (make-string level ?*) " ")))) - ('above + (`above (org-back-to-heading) - (org-insert-heading) - (when (= level 1) - (save-excursion (insert "\n"))))) + (insert (make-string level ?*) " ") + (save-excursion + (insert "\n") + (if (= level 1) (insert "\n"))))) (when (org-element-property :todo-type context) (org-todo 'todo)))) diff --git a/modules/lang/org/test/autoload-org.el b/modules/lang/org/test/autoload-org.el index 567f1abcf..dad80d52a 100644 --- a/modules/lang/org/test/autoload-org.el +++ b/modules/lang/org/test/autoload-org.el @@ -1,6 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/org/test/autoload-org.el +(require! :lang org) + (defmacro should-org-buffer!! (source expected &rest body) `(should-buffer!! ,source ,expected (org-mode) @@ -40,3 +42,21 @@ newline." "+ {|}" "+ Next item") (+org/insert-item 'below))) + +(def-test! insert-item-numbered-list + "Should append/prepend new second-level (and higher) headers without an extra +newline." + (should-org-buffer!! ("1. {0}List item") ("1. List item\n2. {|}") + (+org/insert-item 'below)) + (should-org-buffer!! ("1. {0}List item" + "2. Sub item") + ("1. List item" + "2. {|}" + "3. Sub item") + (+org/insert-item 'below)) + (should-org-buffer!! ("1. {0}List item" + "2. Next item") + ("1. {|}" + "2. List item" + "3. Next item") + (+org/insert-item 'above))) diff --git a/modules/lang/org/test/org.el b/modules/lang/org/test/org.el deleted file mode 100644 index b74e7f16e..000000000 --- a/modules/lang/org/test/org.el +++ /dev/null @@ -1,5 +0,0 @@ -;;; lang/org/test/org.el -*- lexical-binding: t; -*- - -(require! :lang org) - -;; From 0b2a61593ea6500e5210467aa7375aeae5aa6f84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 17 Feb 2018 23:22:50 -0500 Subject: [PATCH 0496/4235] lang/org: reformat whitespace in test/autoload-org.el --- modules/lang/org/test/autoload-org.el | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/lang/org/test/autoload-org.el b/modules/lang/org/test/autoload-org.el index dad80d52a..4a7fdb48b 100644 --- a/modules/lang/org/test/autoload-org.el +++ b/modules/lang/org/test/autoload-org.el @@ -31,16 +31,16 @@ newline." (should-org-buffer!! ("+ {0}List item") ("+ List item\n+ {|}") (+org/insert-item 'below)) (should-org-buffer!! ("+ {0}List item" - " + Sub item") - ("+ List item" - " + Sub item" - "+ {|}") + " + Sub item") + ("+ List item" + " + Sub item" + "+ {|}") (+org/insert-item 'below)) (should-org-buffer!! ("+ {0}List item" - "+ Next item") - ("+ List item" - "+ {|}" - "+ Next item") + "+ Next item") + ("+ List item" + "+ {|}" + "+ Next item") (+org/insert-item 'below))) (def-test! insert-item-numbered-list @@ -49,14 +49,14 @@ newline." (should-org-buffer!! ("1. {0}List item") ("1. List item\n2. {|}") (+org/insert-item 'below)) (should-org-buffer!! ("1. {0}List item" - "2. Sub item") - ("1. List item" - "2. {|}" - "3. Sub item") + "2. Sub item") + ("1. List item" + "2. {|}" + "3. Sub item") (+org/insert-item 'below)) (should-org-buffer!! ("1. {0}List item" - "2. Next item") - ("1. {|}" - "2. List item" - "3. Next item") + "2. Next item") + ("1. {|}" + "2. List item" + "3. Next item") (+org/insert-item 'above))) From a01320deeb7bdffc4a0c906e8c1adda54d5c7c6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 00:26:27 -0500 Subject: [PATCH 0497/4235] lang/org: redo evil integration; add evil-org package lang/org has now adopted much of evil-org, which introduces better evil integration for org-mode. More testing is required. --- modules/lang/org/autoload/org.el | 30 ++++++------- modules/lang/org/config.el | 72 +++++++++++++++++--------------- modules/lang/org/packages.el | 3 ++ 3 files changed, 53 insertions(+), 52 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 6ca0017b3..7c223dc2f 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -203,25 +203,19 @@ wrong places)." (evil-insert 1)))) ;;;###autoload -(defun +org/shifttab (&optional arg) - "An alternative to `org-shifttab' which performs smart indentation if in -insert mode (evil). Otherwise, forwards to the original `org-shifttab'." +(defun +org/dedent () + "TODO" (interactive) - (cond ((org-at-table-p) - (call-interactively #'org-table-previous-field)) - ((and (bound-and-true-p evil-mode) - (evil-insert-state-p)) - (cond ((org-at-item-p) - (org-list-indent-item-generic - -1 nil - (save-excursion - (when (org-region-active-p) - (goto-char (region-beginning))) - (org-list-struct)))) - ((org-at-heading-p) - (ignore-errors (org-promote))) - (t (call-interactively #'self-insert-command)))) - (t (org-shifttab arg)))) + (cond ((org-at-item-p) + (org-list-indent-item-generic + -1 nil + (save-excursion + (when (org-region-active-p) + (goto-char (region-beginning))) + (org-list-struct)))) + ((org-at-heading-p) + (ignore-errors (org-promote))) + ((call-interactively #'self-insert-command)))) ;;;###autoload (defun +org/refresh-inline-images () diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b9d4c0ea2..ed49138c6 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -29,6 +29,15 @@ (def-package! org-bullets :commands org-bullets-mode) +(def-package! evil-org + :when (featurep! :feature evil) + :commands evil-org-mode + :config + (evil-org-set-key-theme '(navigation insert textobjects)) + (after! org-agenda + (require 'evil-org-agenda) + (evil-org-agenda-set-keys))) + ;; ;; Bootstrap @@ -47,6 +56,7 @@ org-indent-mode ; margin-based indentation toc-org-enable ; auto-table of contents visual-line-mode ; line wrapping + evil-org-mode ; evil-mode integration +org|enable-auto-reformat-tables +org|enable-auto-update-cookies @@ -207,46 +217,55 @@ unfold to point on startup." (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies between the two." + (defun +org|remove-occur-highlights () + "Remove org occur highlights on ESC in normal mode." + (when (and (derived-mode-p 'org-mode) + org-occur-highlights) + (org-remove-occur-highlights))) + (add-hook 'doom-escape-hook #'+org|remove-occur-highlights) + + ;; C-a & C-e act like `doom/backward-to-bol-or-indent' and + ;; `doom/forward-to-last-non-comment-or-eol', but with more org awareness. + (setq org-special-ctrl-a/e t) + (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) + (require 'evil-org) (map! :map org-mode-map - [remap org-shifttab] #'+org/shifttab - [backspace] #'org-delete-backward-char "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images - :i "RET" #'org-return-indent - :n "RET" #'+org/dwim-at-point - - ;; Navigate table cells (from insert-mode) + :map evil-org-mode-map + :i [backtab] #'+org/dedent + :i [backspace] #'evil-org-delete-backward-char + ;; navigate table cells (from insert-mode) :i "C-l" #'+org/table-next-field :i "C-h" #'+org/table-previous-field :i "C-k" #'+org/table-previous-row :i "C-j" #'+org/table-next-row - ;; Expand tables (or shiftmeta move) + ;; expand tables (or shiftmeta move) :ni "C-S-l" #'+org/table-append-field-or-shift-right :ni "C-S-h" #'+org/table-prepend-field-or-shift-left :ni "C-S-k" #'org-metaup :ni "C-S-j" #'org-metadown - + ;; toggle local fold, instead of all children :n [tab] #'+org/toggle-fold - + ;; more intuitive RET keybinds + :i "RET" #'org-return-indent + :n "RET" #'+org/dwim-at-point :ni [M-return] (λ! (+org/insert-item 'below)) :ni [S-M-return] (λ! (+org/insert-item 'above)) - - ;; Fix vim motion keys + ;; more org-ish vim motion keys :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) + :m "]h" #'org-next-visible-heading + :m "[h" #'org-previous-visible-heading :m "]l" #'org-next-link :m "[l" #'org-previous-link - :m "$" #'org-end-of-line - :m "^" #'org-beginning-of-line + :m "]s" #'org-babel-next-src-block + :m "[s" #'org-babel-previous-src-block :n "gQ" #'org-fill-paragraph - :n "<" #'org-metaleft - :n ">" #'org-metaright - :v "<" (λ! (org-metaleft) (evil-visual-restore)) - :v ">" (λ! (org-metaright) (evil-visual-restore)) - ;; Fix code-folding keybindings + ;; sensible code-folding vim keybinds :n "za" #'+org/toggle-fold :n "zA" #'org-shifttab :n "zc" #'outline-hide-subtree @@ -255,15 +274,7 @@ between the two." :n "zm" (λ! (outline-hide-sublevels 1)) :n "zo" #'outline-show-subtree :n "zO" #'outline-show-all - :n "zr" #'outline-show-all - - (:after org-agenda - (:map org-agenda-mode-map - :e "m" #'org-agenda-month-view - :e "C-j" #'org-agenda-next-item - :e "C-k" #'org-agenda-previous-item - :e "C-n" #'org-agenda-next-item - :e "C-p" #'org-agenda-previous-item)))) + :n "zr" #'outline-show-all)) (defun +org|setup-hacks () "Getting org to behave." @@ -287,13 +298,6 @@ between the two." (t . ,(cond (IS-MAC "open -R \"%s\"") (IS-LINUX "xdg-open \"%s\""))))) - (defun +org|remove-occur-highlights () - "Remove org occur highlights on ESC in normal mode." - (when (and (derived-mode-p 'org-mode) - org-occur-highlights) - (org-remove-occur-highlights))) - (add-hook 'doom-escape-hook #'+org|remove-occur-highlights) - (after! recentf ;; Don't clobber recentf with agenda files (defun +org-is-agenda-file (filename) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index e96f9b993..4f130e555 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -7,6 +7,9 @@ (package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets")) (package! toc-org) +(when (featurep! :feature evil) + (package! evil-org)) + (when (featurep! +attach) (package! org-download)) From a8b178f5471bbcb9eb75e66472f190a6281f1733 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 02:48:22 -0500 Subject: [PATCH 0498/4235] feature/file-templates: remove __lic alias There's no guarantee that %alias will be available from here anyway. --- modules/feature/file-templates/templates/text-mode/__lic | 5 ----- modules/feature/file-templates/templates/text-mode/__license | 1 - 2 files changed, 6 deletions(-) delete mode 100644 modules/feature/file-templates/templates/text-mode/__lic diff --git a/modules/feature/file-templates/templates/text-mode/__lic b/modules/feature/file-templates/templates/text-mode/__lic deleted file mode 100644 index 3185a92ac..000000000 --- a/modules/feature/file-templates/templates/text-mode/__lic +++ /dev/null @@ -1,5 +0,0 @@ -# -*- mode: snippet -*- -# name: Insert a license -# type: command -# -- -(%alias "__license") \ No newline at end of file diff --git a/modules/feature/file-templates/templates/text-mode/__license b/modules/feature/file-templates/templates/text-mode/__license index 3d0d8a0b8..b22a289bb 100644 --- a/modules/feature/file-templates/templates/text-mode/__license +++ b/modules/feature/file-templates/templates/text-mode/__license @@ -1,6 +1,5 @@ # -*- mode: snippet -*- # name: Insert a license -# uuid: __license # type: command # -- (+file-templates/insert-license) \ No newline at end of file From b05ccbb98e5a9f89ca346fe2ff9bf1e6110757b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 02:59:11 -0500 Subject: [PATCH 0499/4235] Move some UI vars from core.el to core-ui.el --- core/core-ui.el | 5 +++++ core/core.el | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9e703275c..900d29a70 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -39,8 +39,13 @@ with `doom//reload-theme').") (setq-default bidi-display-reordering nil ; disable bidirectional text for tiny performance boost blink-matching-paren nil ; don't blink--too distracting + compilation-always-kill t ; kill compilation process before starting another + compilation-ask-about-save nil ; save all buffers on `compile' + compilation-scroll-output 'first-error + confirm-nonexistent-file-or-buffer t cursor-in-non-selected-windows nil ; hide cursors in other windows display-line-numbers-width 3 + enable-recursive-minibuffers nil frame-inhibit-implied-resize t ;; remove continuation arrow on right fringe fringe-indicator-alist (delq (assq 'continuation fringe-indicator-alist) diff --git a/core/core.el b/core/core.el index 9e8d3556c..c800d94c3 100644 --- a/core/core.el +++ b/core/core.el @@ -79,12 +79,7 @@ melodramatic ex-vimmer disappointed with the text-editor status quo." (setq-default ad-redefinition-action 'accept ; silence advised function warnings apropos-do-all t ; make `apropos' more useful - compilation-always-kill t ; kill compilation process before starting another - compilation-ask-about-save nil ; save all buffers on `compile' - compilation-scroll-output 'first-error - confirm-nonexistent-file-or-buffer t debug-on-error (and (not noninteractive) doom-debug-mode) - enable-recursive-minibuffers nil ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often load-prefer-newer (or noninteractive doom-debug-mode) From 7707aec28a732e391b2f76268d7fb007b7b52d34 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:04:36 -0500 Subject: [PATCH 0500/4235] Remove doom group Not really useful, and Doom doesn't encourage using the Emacs Customize interface. --- core/core.el | 5 ----- modules/app/regex/autoload/regex.el | 6 +++--- modules/feature/workspaces/autoload/workspaces.el | 4 ++-- modules/ui/doom-modeline/config.el | 4 ++-- modules/ui/doom/config.el | 2 +- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/core/core.el b/core/core.el index c800d94c3..ee9e0b9a6 100644 --- a/core/core.el +++ b/core/core.el @@ -59,11 +59,6 @@ Use this for files that change often, like cache files.") (defvar doom-autoload-file (concat doom-local-dir "autoloads.el") "Where `doom//reload-autoloads' will generate its autoloads file.") -(defgroup doom nil - "DOOM Emacs, an Emacs configuration for a stubborn, shell-dwelling and -melodramatic ex-vimmer disappointed with the text-editor status quo." - :group 'emacs) - ;;; ;; UTF-8 as the default coding system diff --git a/modules/app/regex/autoload/regex.el b/modules/app/regex/autoload/regex.el index 87178f29a..881200fd6 100644 --- a/modules/app/regex/autoload/regex.el +++ b/modules/app/regex/autoload/regex.el @@ -11,17 +11,17 @@ (defface +regex-match-0-face `((t (:foreground "Black" :background ,(doom-color 'magenta) :bold t))) "TODO" - :group 'doom) + :group 'faces) (defface +regex-match-1-face `((t (:foreground "Black" :background ,(doom-color 'blue) :bold t))) "TODO" - :group 'doom) + :group 'faces) (defface +regex-match-2-face `((t (:foreground "Black" :background ,(doom-color 'green) :bold t))) "TODO" - :group 'doom) + :group 'faces) (defvar +regex-faces '(+regex-match-0-face +regex-match-1-face +regex-match-2-face) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 94022d99f..fda46bd91 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -6,11 +6,11 @@ ;; (defface +workspace-tab-selected-face '((t (:inherit 'highlight))) "The face for selected tabs displayed by `+workspace/display'" - :group 'doom) + :group 'persp-mode) (defface +workspace-tab-face '((t (:inherit 'default))) "The face for selected tabs displayed by `+workspace/display'" - :group 'doom) + :group 'persp-mode) ;; diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 35e1abc6d..1532b9197 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -80,8 +80,8 @@ file-name => comint.el") ;; (defgroup +doom-modeline nil - "" - :group 'doom) + "TODO" + :group 'faces) (defface doom-modeline-buffer-path '((t (:inherit (mode-line-emphasis bold)))) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 045edfdb8..a21e0d856 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -41,7 +41,7 @@ (((background light)) (:inherit font-lock-comment-face :background ,(doom-color 'base3)))) "Face to hightlight `hideshow' overlays." - :group 'doom) + :group 'doom-themes) ;; Nicer code-folding overlays (with fringe indicators) (defun +doom-set-up-overlay (ov) From be94fc4d910a2d19ea3bacdc081db9763c2543e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:07:45 -0500 Subject: [PATCH 0501/4235] lang/org: remove unused evil autoloads --- modules/lang/org/autoload/evil.el | 11 ----------- modules/lang/org/autoload/org-capture.el | 10 ---------- 2 files changed, 21 deletions(-) delete mode 100644 modules/lang/org/autoload/evil.el diff --git a/modules/lang/org/autoload/evil.el b/modules/lang/org/autoload/evil.el deleted file mode 100644 index 62bfca831..000000000 --- a/modules/lang/org/autoload/evil.el +++ /dev/null @@ -1,11 +0,0 @@ -;;; lang/org/autoload/evil.el -*- lexical-binding: t; -*- -;;;###if (featurep! :feature evil) - -;; TODO +org-attach:find - -;;;###autoload (autoload '+org-attach:uri "lang/org/autoload/evil" nil t) -(evil-define-command +org-attach:uri (uri) - "Downloads the file at URL and places an org link to it at the cursor." - (interactive "") - (+org-attach/uri uri)) - diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 518bc033e..3cec07ba5 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -1,16 +1,6 @@ ;;; lang/org/autoload/org-capture.el -*- lexical-binding: t; -*- ;;;###if (featurep! +capture) -(when (featurep! :feature evil) -;;;###autoload (autoload '+org-capture:open "lang/org/autoload/org-capture" nil t) - (evil-define-operator +org-capture:open (&optional beg end) - "Evil ex interface to `+org-capture/dwim'." - :move-point nil :type inclusive - (interactive "") - (+org-capture/open - (unless (or (evil-normal-state-p) (evil-insert-state-p)) - (buffer-substring beg end))))) - ;;;###autoload (defun +org-capture/open (&optional string key) "Sends STRING, the current selection or prompted input to `org-capture'. From 6291cb1979b49ede8c220885ffef567412e0f2fb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:09:39 -0500 Subject: [PATCH 0502/4235] app/email: improve mu4e lifetime management & fix =email --- modules/app/email/autoload/email.el | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index 284792762..49a51727a 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -1,10 +1,19 @@ ;;; app/email/autoload/email.el -*- lexical-binding: t; -*- +(defvar +email-workspace-name "*mu4e*" + "TODO") + +(add-hook 'mu4e-main-mode-hook #'+email|init) + ;;;###autoload (defun =email () "Start email client." (interactive) - (call-interactively #'mu4e)) + (+workspace-switch +email-workspace-name t) + (mu4e~start 'mu4e~main-view) + ;; (save-selected-window + ;; (prolusion-mail-show)) + ) ;;;###autoload (defun +email/compose () @@ -13,3 +22,16 @@ ;; TODO Interactively select email account (call-interactively #'mu4e-compose-new)) + +;; +;; Hooks +;; + +(defun +email|init () + (add-hook 'kill-buffer-hook #'+email|kill-mu4e nil t)) + +(defun +email|kill-mu4e () + ;; (prolusion-mail-hide) + (when (+workspace-exists-p +email-workspace-name) + (+workspace/delete +email-workspace-name))) + From c8c7bcabc01fdb97e2ba681b1c20b7d51d47dede Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:10:09 -0500 Subject: [PATCH 0503/4235] app/calendar: fix path in comment header --- modules/app/calendar/autoload.el | 2 +- modules/app/calendar/config.el | 2 +- modules/app/calendar/packages.el | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 76dbeeecb..0eca3dae3 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -1,4 +1,4 @@ -;;; private/calendar/autoload.el -*- lexical-binding: t; -*- +;;; app/calendar/autoload.el -*- lexical-binding: t; -*- ;;;###autoload (defun =calendar () diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index a7d5132e6..db945988b 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -1,4 +1,4 @@ -;;; private/calendar/config.el -*- lexical-binding: t; -*- +;;; app/calendar/config.el -*- lexical-binding: t; -*- (defvar +calendar-org-gcal-secret-file "~/.emacs.d/modules/private/org/secret.el") (defvar +calendar-open-calendar-function '+calendar/open-calendar) diff --git a/modules/app/calendar/packages.el b/modules/app/calendar/packages.el index 889ec263d..41bd347ec 100644 --- a/modules/app/calendar/packages.el +++ b/modules/app/calendar/packages.el @@ -1,6 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; private/calendar/packages.el - +;;; app/calendar/packages.el (package! calfw) (package! calfw-org) From 22e9452104d306d74d80da2eb0bb3b9094ff5a94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:12:32 -0500 Subject: [PATCH 0504/4235] config/default: +default/find-in-snippets => +default/browse-snippets --- modules/config/default/autoload/default.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 0f73b74c3..6ba5aabc4 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -42,7 +42,7 @@ ;;;###autoload (autoload '+default/browse-notes "config/default/autoload/default" nil t) (+default--def-browse-in! notes +org-dir) -;;;###autoload (autoload '+default/find-in-snippets "config/default/autoload/default" nil t) -(+default--def-find-in! snippets +default-snippets-dir) +;;;###autoload (autoload '+default/browse-snippets "config/default/autoload/default" nil t) +(+default--def-browse-in! snippets emacs-snippets-dir) ;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' From 0408464489f4650eb338702ca9003bfaa0c10e96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:13:11 -0500 Subject: [PATCH 0505/4235] feature/evil: evil-want-C-w-delete = t --- modules/feature/evil/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 55e91c800..e86547324 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -23,8 +23,9 @@ (def-package! evil :init (setq evil-want-C-u-scroll t - evil-want-visual-char-semi-exclusive t + evil-want-C-w-delete t evil-want-Y-yank-to-eol t + evil-want-visual-char-semi-exclusive t evil-magic t evil-echo-state t evil-indent-convert-tabs t From 02ad68989068b00270c7b1c47ca6d33a20107f18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:13:42 -0500 Subject: [PATCH 0506/4235] lang/rust: refactor racer config A lot of the previous logic is redundant and already done by the racer package. --- modules/lang/rust/config.el | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index da7d3b064..4a9d1a5e7 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -1,9 +1,5 @@ ;;; lang/rust/config.el -*- lexical-binding: t; -*- -(defvar +rust-src-dir (concat doom-etc-dir "rust/") - "The path to Rust source library. Required by racer.") - - ;; ;; Plugins ;; @@ -20,19 +16,16 @@ (def-package! racer :after rust-mode - :hook (rust-mode . racer-mode) :config - (add-hook 'rust-mode-hook #'eldoc-mode) - - (setq racer-cmd (or (executable-find "racer") - (expand-file-name "racer/target/release/racer" +rust-src-dir)) - racer-rust-src-path (or (getenv "RUST_SRC_PATH") - (expand-file-name "rust/src/" +rust-src-dir))) - (unless (file-exists-p racer-cmd) (warn! "Couldn't find racer binary. Code completion won't work")) + (unless (file-directory-p racer-rust-src-path) + (warn! "Couldn't find rust source. Code completion won't work")) - (set! :lookup 'rust-mode :definition #'racer-find-definition)) + (add-hook! 'rust-mode-hook #'(eldoc-mode racer-mode)) + (set! :lookup 'rust-mode + :definition #'racer-find-definition + :documentation #'racer-describe)) (def-package! company-racer From f4a0311834f535a7dd59ca32592b52738cf85a52 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 03:14:33 -0500 Subject: [PATCH 0507/4235] ui/doom: add solaire-mode-reset to focus-in-hook Addresses an edge case where the fringes would forget their color. --- modules/ui/doom/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index a21e0d856..11e19cf0c 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -26,6 +26,8 @@ :hook (after-change-major-mode . turn-on-solaire-mode) :config (setq solaire-mode-real-buffer-fn #'doom-real-buffer-p) + ;; fringe can become unstyled when deleting or focusing frames + (add-hook 'focus-in-hook #'solaire-mode-reset) ;; Prevent color glitches when reloading either DOOM or the theme (add-hook! '(doom-init-theme-hook doom-reload-hook) #'solaire-mode-reset) From e50d8b8733ef97996c8c50c399f9370f4662d6c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 04:30:49 -0500 Subject: [PATCH 0508/4235] lang/org: add +org-attach/sync (attachment management) lang/org now supports the attach:* link abbreviation. Running +org/attach-sync will index all such links across org files in +org-dir and delete any files in org-attach-directory that aren't referenced. TODO: have a separate directory for attach:* attachments and vanilla attachments? --- modules/lang/org/+attach.el | 20 ++++-- modules/lang/org/autoload/org-attach.el | 84 ++++++++++++++++--------- 2 files changed, 72 insertions(+), 32 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 2a12ca509..131e3fea0 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -5,22 +5,29 @@ ;; I believe Org's native attachment system is over-complicated and litters ;; files with metadata I don't want. So I wrote my own, which: ;; -;; + Causes attachments to be placed in a centralized location, +;; + Places attachments in a centralized location (`+org-attach-dir' in +;; `+org-dir'), using an attach:* link abbreviation. +;; + Use `+org-attach/sync' to index all attachments in `+org-dir' that use the +;; attach:* abbreviation and delete orphaned ones that are no longer +;; referenced. ;; + Adds drag-and-drop support for images (with inline image preview) ;; + Adds drag-and-drop support for media files (pdfs, zips, etc) with a ;; filetype icon and short link. -;; + TODO Offers an attachment management system. ;; Some commands of interest: ;; + `org-download-screenshot' ;; + `+org-attach/file' ;; + `+org-attach/url' -;; + :org [FILE/URL] +;; + `+org-attach/sync' (defvar +org-attach-dir ".attach/" - "Where to store attachments (relative to current org file).") + "Where to store attachments relative to `+org-dir'.") +;; +;; Plugins +;; + (def-package! org-download :commands (org-download-dnd org-download-dnd-base64) :init @@ -58,7 +65,11 @@ (advice-add #'org-download--fullname :filter-return #'+org-attach*download-fullname)) + ;; +;; Bootstrap +;; + (defun +org|init-attach () (setq org-attach-directory (expand-file-name +org-attach-dir +org-dir)) ;; A shorter link to attachments @@ -67,6 +78,7 @@ (push (car (last (split-string +org-attach-dir "/" t))) projectile-globally-ignored-directories) + ;; (after! recentf (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 2d6e01490..d27bfdad8 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -14,35 +14,58 @@ ((or "zip" "gz" "tar" "7z" "rar") ?) (_ ?)))) -;; (defun +org-attach-cleanup () -;; ;; "Deletes any attachments that are no longer present in the org-mode buffer." -;; (let* ((attachments-local (+org-attachments)) -;; (attachments (directory-files org-attach-directory t "^[^.]" t)) -;; (to-delete (cl-set-difference attachments-local attachments))) -;; ;; TODO -;; to-delete)) -;; (defun +org-attachments () -;; "List all attachments in the current buffer." -;; (unless (eq major-mode 'org-mode) -;; (user-error "Not an org buffer")) -;; (org-save-outline-visibility nil -;; (let ((attachments '()) -;; element) -;; (when (and (file-directory-p org-attach-directory) -;; (> (length (file-expand-wildcards (expand-file-name "*" org-attach-directory))) 0)) -;; (save-excursion -;; (goto-char (point-min)) -;; (while (progn (org-next-link) (not org-link-search-failed)) -;; (setq element (org-element-context)) -;; (when-let* (file (and (eq (org-element-type element) 'link) -;; (expand-file-name (org-element-property :path element)))) -;; (when (and (string= (org-element-property :type element) "file") -;; (string= (concat (file-name-base (directory-file-name (file-name-directory file))) "/") -;; org-attach-directory) -;; (file-exists-p file)) -;; (push file attachments)))))) -;; (cl-remove-duplicates attachments)))) +;; +(defvar +org-attachments nil + "A list of all indexed attachments in `+org-dir'.") + +(defvar +org-attachments-files value + "A list of all attachments in `org-attach-directory'.") + +(defun +org-attachments--list (&optional beg end) + "Return a list of all attachment file names in the current buffer between BEG +and END (defaults to `point-min' and `point-max')." + (let ((case-fold-search t) + attachments) + (or end (setq end (point-max))) + (org-save-outline-visibility nil + (org-with-wide-buffer + (goto-char (or beg (point-min))) + (while (search-forward "[[attach:" end t) + (let* ((context (save-match-data (org-element-context))) + (link (expand-file-name (org-link-unescape (org-element-property :path context)) + org-attach-directory))) + (when (and (equal "file" (org-element-property :type context)) + (file-in-directory-p link org-attach-directory)) + (push (file-name-nondirectory link) attachments)))))) + (cl-delete-duplicates attachments :test #'string=))) + +;;;###autoload +(defun +org-attach/sync (arg) + "Reindex all attachments in `+org-dir' and delete orphaned attachments in +`org-attach-directory'. If ARG (universal arg), conduct a dry run." + (declare (interactive-only t)) + (interactive "P") + (message "Reloading") + (setq +org-attachments-files (directory-files org-attach-directory nil "^[^.]" t)) + (with-temp-buffer + (delay-mode-hooks (org-mode)) + (dolist (org-file (directory-files-recursively +org-dir "\\.org$")) + (insert-file-contents-literally org-file)) + (setq +org-attachments (+org-attachments--list))) + ;; clean up + (dolist (file (cl-set-difference +org-attachments-files +org-attachments + :test #'string=)) + (message "Deleting orphaned attachment: %s" file) + (unless arg + (delete-file (expand-file-name file org-attach-directory)))) + (message "Buffer's attachments synced")) + +;;;###autoload +(defun +org-attach/find-file () + "Open a file from `org-attach-directory'." + (interactive) + (doom-project-browse org-attach-directory)) ;;;###autoload (defun +org-attach/file (path) @@ -84,6 +107,11 @@ the cursor." (copy-alist dnd-protocol-alist)))) (dnd-handle-one-url nil action uri)))) + +;; +;; Advice +;; + ;;;###autoload (defun +org-attach*insert-link (_link filename) "Produces and inserts a link to FILENAME into the document. From f6d572c9fe9770421e70e07fcdcb030e713b9981 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 14:08:19 -0500 Subject: [PATCH 0509/4235] lang/org: fix void-symbol value error --- modules/lang/org/autoload/org-attach.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index d27bfdad8..75d7ead82 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -19,7 +19,7 @@ (defvar +org-attachments nil "A list of all indexed attachments in `+org-dir'.") -(defvar +org-attachments-files value +(defvar +org-attachments-files nil "A list of all attachments in `org-attach-directory'.") (defun +org-attachments--list (&optional beg end) From 50452d92aea08609a6e5a0e4a877516c40603207 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 14:11:04 -0500 Subject: [PATCH 0510/4235] feature/file-templates: fix incorrect mode setting --- .../feature/file-templates/templates/text-mode/__license-mit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/file-templates/templates/text-mode/__license-mit b/modules/feature/file-templates/templates/text-mode/__license-mit index 1dc7a88a9..dd041f86d 100644 --- a/modules/feature/file-templates/templates/text-mode/__license-mit +++ b/modules/feature/file-templates/templates/text-mode/__license-mit @@ -1,4 +1,4 @@ -# -*- mode: snippet-mode; -*- +# -*- mode: snippet -*- # name: MIT License # uuid: __license-mit # group: Licenses From 634844e582acfedaa2c0f9036e937f84233435cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 20:10:41 -0500 Subject: [PATCH 0511/4235] tools/pdf: fix epdfinfo prompt at compile time; autoload pdf-tools --- modules/tools/pdf/config.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 6e5c09ff3..55eb60b70 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -1,10 +1,14 @@ ;;; tools/pdf/config.el -*- lexical-binding: t; -*- (def-package! pdf-tools - :defer t - :init (load "pdf-tools-autoloads.el" nil t t) + :mode ("\\.pdf$" . pdf-view-mode) + :init (load "pdf-tools-autoloads" nil t) :config - (pdf-tools-install) + (unless noninteractive + (pdf-tools-install)) + + (map! :map pdf-view-mode-map "q" #'kill-this-buffer) + (setq-default pdf-view-display-size 'fit-page) ;; turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0))) From 18d0b9425d2ec38faff75669bdae9fe960116c9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 20:50:30 -0500 Subject: [PATCH 0512/4235] ui/doom-dashboard: add sharp quote --- 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 410d1c6bd..e3ccde988 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -293,7 +293,7 @@ controlled by `+doom-dashboard-pwd-policy'." (+workspace/load-session))) ,(when (featurep! :org org) '("See agenda for this week" "calendar" - (call-interactively 'org-agenda-list))) + (call-interactively #'org-agenda-list))) ("Recently opened files" "file-text" (call-interactively (or (command-remapping #'recentf-open-files) #'recentf-open-files))) From 45c8ce9f62846199d67f64a6b527b29c60157814 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 21:25:05 -0500 Subject: [PATCH 0513/4235] lang/elm: fix elm-mode-autoloads typo --- modules/lang/elm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index fdc19600d..6157cf21d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -3,7 +3,7 @@ (def-package! elm-mode :mode "\\.elm$" :config - (load "elm-mode-autolods" nil t) + (load "elm-mode-autoloads" nil t) (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :company-backend 'elm-mode '(company-elm)) (set! :repl 'elm-mode #'run-elm-interactive) From 8af46aad5a3ad751fa9068989b2997296f83e5cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 21:31:16 -0500 Subject: [PATCH 0514/4235] lang/csharp: fix omnisharp detection when server is installed locally #422 --- modules/lang/csharp/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 6b795a629..41b2ded8b 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -11,8 +11,9 @@ (setq omnisharp-auto-complete-want-documentation nil omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (unless (file-exists-p (omnisharp--server-installation-path t)) - (warn! "Omnisharp server isn't installed, completion won't work")) + (let ((omnisharp-bin (or omnisharp-server-executable-path (omnisharp--server-installation-path t)))) + (unless (file-exists-p omnisharp-bin) + (warn! "Omnisharp server isn't installed, completion won't work"))) (add-hook! csharp-mode #'(eldoc-mode flycheck-mode omnisharp-mode)) From 02dd396a74b4338efdb3198fbbc70df681be747d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 22:37:34 -0500 Subject: [PATCH 0515/4235] lang/ess: enable line numbers in ESS modes --- modules/lang/ess/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 47a612082..71224b6ce 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -34,6 +34,7 @@ (unless (featurep! :lang julia) (push (cons "\\.jl\\'" 'ess-julia-mode) auto-mode-alist)) :config + (add-hook 'ess-mode-hook #'doom|enable-line-numbers) (setq ess-first-continued-statement-offset 2 ess-continued-statement-offset 0 ess-expression-offset 2 From e405b244955ffb1823cd90a5411a9ed6c5cdee4c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 22:44:57 -0500 Subject: [PATCH 0516/4235] lang/ess: replace obsolete vars with ess-offset-continued --- modules/lang/ess/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 71224b6ce..c2a544bbf 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -35,8 +35,7 @@ (push (cons "\\.jl\\'" 'ess-julia-mode) auto-mode-alist)) :config (add-hook 'ess-mode-hook #'doom|enable-line-numbers) - (setq ess-first-continued-statement-offset 2 - ess-continued-statement-offset 0 + (setq ess-offset-continued 'straight ess-expression-offset 2 ess-nuke-trailing-whitespace-p t ess-default-style 'DEFAULT) From e3d454d85509a0a321b3aea279b6ec3a6842affa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 22:45:22 -0500 Subject: [PATCH 0517/4235] lang/ess: fix 'cannot open load file' errors --- modules/lang/ess/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index c2a544bbf..36730fa37 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -1,7 +1,7 @@ ;;; lang/ess/config.el -*- lexical-binding: t; -*- (def-package! ess-site - :init (load "ess-autoloads" nil t) + :commands (R stata julia SAS) :mode (("\\.sp\\'" . S-mode) ("/R/.*\\.q\\'" . R-mode) ("\\.[qsS]\\'" . S-mode) @@ -29,8 +29,8 @@ ("\\.[Jj][Aa][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) - :commands (R stata julia SAS) :init + (load "ess-autoloads.el" nil t t) (unless (featurep! :lang julia) (push (cons "\\.jl\\'" 'ess-julia-mode) auto-mode-alist)) :config From 3d20763d58cf4d574baa8cd085938225c30fd451 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Feb 2018 22:59:38 -0500 Subject: [PATCH 0518/4235] feature/popup: refactor popup cleanup function --- modules/feature/popup/autoload.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 2f116c535..844d08fca 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -14,17 +14,17 @@ "Tries to kill BUFFER, as was requested by a transient timer. If it fails, eg. the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) - (let ((kill-buffer-hook (delq '+popup|kill-buffer-hook kill-buffer-hook))) + (let ((kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) (cond ((eq ttl 0) (kill-buffer buffer)) ((get-buffer-window buffer) (with-current-buffer buffer (setq +popup--timer (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) - (t - (with-demoted-errors "Error killing transient buffer: %s" - (when-let* ((process (get-buffer-process (current-buffer)))) - (kill-process process)) + ((with-demoted-errors "Error killing transient buffer: %s" + (let (confirm-kill-processes) + (when-let* ((process (get-buffer-process (current-buffer)))) + (kill-process process))) (kill-buffer buffer))))))) (defun +popup--init (window &optional alist) From 3c203b2cd489f9057aaa099f794b7266b63a6170 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 01:08:40 -0500 Subject: [PATCH 0519/4235] lang/ess: fix ess-site load error at compile time (take 2) --- modules/lang/ess/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 36730fa37..50d79744c 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -1,5 +1,8 @@ ;;; lang/ess/config.el -*- lexical-binding: t; -*- +(eval-and-compile + (load "ess-autoloads" nil t)) + (def-package! ess-site :commands (R stata julia SAS) :mode (("\\.sp\\'" . S-mode) @@ -30,7 +33,6 @@ ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) :init - (load "ess-autoloads.el" nil t t) (unless (featurep! :lang julia) (push (cons "\\.jl\\'" 'ess-julia-mode) auto-mode-alist)) :config From 1a20c49ef3f2ae58525ac4c36ce133cee3e6e6c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 01:20:53 -0500 Subject: [PATCH 0520/4235] Refactor cl-loop => cl-member in doom//byte-compile --- core/core-packages.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 36afc6fb7..1bb95d890 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -649,9 +649,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." nconc (nreverse (doom-packages--files doom-core-dir "\\.el$")) else if (file-directory-p target) nconc (nreverse (doom-packages--files target "\\.el$")) - else if (cl-loop for dir in doom-psuedo-module-dirs - if (file-in-directory-p target dir) - return dir) + else if (cl-member target doom-psuedo-module-dirs :test #'file-in-directory-p) nconc (nreverse (doom-packages--files it "\\.el$")) else if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" target) nconc (nreverse (doom-packages--files From a967aa051af585081a0500b6e7a8b904d57f709f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 01:21:47 -0500 Subject: [PATCH 0521/4235] Force autoloads to use absolute paths Autoload paths used to be relative to arbitrary roots (usually doom-modules-dir). This commit changes doom//reload-autoloads to iterate over autoloads in doom-autoloads-file and replace their file paths with an absolute one. Theoretically this should make Emacs feel marginally faster, but we *probably* get more of a benefit from a shorter load-path (because we no longer need doom-modules-dirs, doom-core-dir or doom-psuedo-module-paths in the load-path). This is highly experimental however! --- core/core-packages.el | 43 +++++++++++++++++++++++----------- modules/config/private/init.el | 1 - 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 1bb95d890..ddd914897 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -172,11 +172,7 @@ it anyway." ;; 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 doom-package-load-path - doom-site-load-path - (list doom-core-dir) - doom-modules-dirs - doom-psuedo-module-dirs)))) + load-path (append doom-package-load-path doom-site-load-path)))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run @@ -320,7 +316,6 @@ MODULES is an malformed plist of modules to load." (push `(let (,mod) (load! init ,path t)) init-forms) (push `(let (,mod) (load! config ,path t)) config-forms)))))) `(let (file-name-handler-alist) - (add-to-list 'load-path ,modules-dir) (setq doom-modules ',doom-modules doom-modules-dirs ',doom-modules-dirs) ,@(nreverse init-forms) @@ -562,7 +557,7 @@ This should be run whenever init.el or an autoload file is modified. Running ;; state. `doom-initialize-packages' will have side effects otherwise. (progn (doom-packages--async-run 'doom//reload-autoloads) - (load doom-autoload-file)) + (load doom-autoload-file t)) (doom-initialize-packages t) (let ((targets (file-expand-wildcards @@ -591,18 +586,38 @@ This should be run whenever init.el or an autoload file is modified. Running (abbreviate-file-name file)))) (make-directory (file-name-directory doom-autoload-file) t) (let ((buf (find-file-noselect doom-autoload-file t)) + (load-path (append (list doom-emacs-dir) + doom-psuedo-module-dirs + doom-modules-dirs)) current-sexp) (unwind-protect (condition-case-unless-debug ex (with-current-buffer buf - (save-buffer) (goto-char (point-min)) - (while (re-search-forward "^(" nil t) - (save-excursion - (backward-char) - (setq current-sexp (read (thing-at-point 'sexp t))) - (eval current-sexp t)) - (forward-char)) + (while (re-search-forward "^\\s-*(" nil t) + (unless (sp-point-in-string-or-comment) + ;; Replace autoload paths with absolute paths for fastest + ;; resolution during load + (when (eq (sexp-at-point) 'autoload) + (save-excursion + (forward-sexp 2) + (let ((pt (point))) + (forward-sexp 1) + (when-let* ((sexp (thing-at-point 'sexp t)) + (path (eval (read sexp) t))) + (delete-region pt (point)) + (if-let* ((lib (locate-library path))) + (insert " \"" (file-name-sans-extension lib) "\"") + (warn "Couldn't find absolute path for: %s" path)))))) + ;; Run each form in autoloads to see if there are any + ;; errors. We do it piecemeal because that will tell us + ;; more about where the issue originated. + (save-excursion + (backward-char) + (setq current-sexp (read (thing-at-point 'sexp t))) + (eval current-sexp t)) + (forward-char))) + (save-buffer) (message "Finished generating autoloads.el!")) ('error (delete-file doom-autoload-file) diff --git a/modules/config/private/init.el b/modules/config/private/init.el index b1457a2b0..3081e37a3 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -12,7 +12,6 @@ Doom Emacs.") ;; `doom-initialize-packages' will treat `+private-config-path' as the root of ;; this module. (add-to-list 'doom-psuedo-module-dirs +private-config-path) - (add-to-list 'load-path +private-config-path) ;; (load (expand-file-name "init.el" +private-config-path) From 6f1b96bc9a20080e2f1d77861c05f73b8bc4a53b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 01:31:13 -0500 Subject: [PATCH 0522/4235] Fix void-function error in doom//reload-autoloads Don't use a third party library in a function that could potentially run before packages are installed, ya big silly! --- 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 ddd914897..e2b3e57a3 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -595,7 +595,8 @@ This should be run whenever init.el or an autoload file is modified. Running (with-current-buffer buf (goto-char (point-min)) (while (re-search-forward "^\\s-*(" nil t) - (unless (sp-point-in-string-or-comment) + (unless (or (nth 4 (syntax-ppss)) + (nth 3 (syntax-ppss))) ;; Replace autoload paths with absolute paths for fastest ;; resolution during load (when (eq (sexp-at-point) 'autoload) From 20d97ffbaa2931d6d6ace835e12053df95f1dd84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 03:11:28 -0500 Subject: [PATCH 0523/4235] completion/ivy: add grep/git-grep integration to evil+ivy (:grep/:grepc[wd]) --- modules/completion/ivy/autoload/evil.el | 29 ++++++++++++++++++++++++ modules/config/default/+evil-commands.el | 2 ++ 2 files changed, 31 insertions(+) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 2f04b57c1..da25f046d 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -49,6 +49,16 @@ (setq +ivy--file-last-search query) (require 'counsel) (pcase engine + ('grep + (let ((args (if recursion-p " -r")) + (counsel-projectile-grep-initial-input query)) + (if all-files-p + (cl-letf (((symbol-function #'projectile-ignored-directories-rel) + (symbol-function #'ignore)) + ((symbol-function #'projectile-ignored-files-rel) + (symbol-function #'ignore))) + (counsel-projectile-grep args)) + (counsel-projectile-grep args)))) ('ag (let ((args (concat (if all-files-p " -a") @@ -65,6 +75,17 @@ ('pt) ;; TODO pt search engine (necessary?) (_ (error "No search engine specified"))))) +;;;###autoload (autoload '+ivy:grep "completion/ivy/autoload/evil" nil t) +(evil-define-operator +ivy:grep (beg end query &optional all-files-p directory) + "Perform a project file search using grep (or git-grep in git repos). QUERY is +a grep regexp. If omitted, the current selection is used. If no selection is +active, the last known search is used. + +If ALL-FILES-P, don't respect .gitignore files and search everything." + (interactive "") + (let ((+ivy--file-search-all-files-p all-files-p)) + (+ivy--file-search 'grep beg end query directory))) + ;;;###autoload (autoload '+ivy:ag "completion/ivy/autoload/evil" nil t) (evil-define-operator +ivy:ag (beg end query &optional all-files-p directory) "Perform a project file search using the silver search. QUERY is a pcre @@ -90,6 +111,14 @@ NOTE: ripgrep doesn't support multiline searches (yet)." (+ivy--file-search 'rg beg end query directory))) +;;;###autoload (autoload '+ivy:ag-cwd "completion/ivy/autoload/evil" nil t) +(evil-define-operator +ivy:grep-cwd (beg end query &optional bang) + "The same as :git, but searches the current directory. If BANG, don't recurse +into sub-directories." + (interactive "") + (let ((+ivy--file-search-recursion-p (not bang))) + (+ivy:grep beg end query t default-directory))) + ;;;###autoload (autoload '+ivy:ag-cwd "completion/ivy/autoload/evil" nil t) (evil-define-operator +ivy:ag-cwd (beg end query &optional bang) "The same as :ag, but searches the current directory. If BANG, don't recurse diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 79e3c0e9d..64a9a0636 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -78,6 +78,8 @@ (ex! "agc[wd]" #'+ivy:ag-cwd) (ex! "rg" #'+ivy:rg) (ex! "rgc[wd]" #'+ivy:rg-cwd) + (ex! "grep" #'+ivy:grep) + (ex! "grepc[wd]" #'+ivy:grep-cwd) (ex! "sw[iper]" #'+ivy:swiper) (ex! "todo" #'+ivy:todo)) ((featurep! :completion helm) From f31c758a567da69194054874ec9a44b851dd06f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 04:17:12 -0500 Subject: [PATCH 0524/4235] lang/elixir: use my alchemist.el fork; fix iex hanging #409 --- modules/lang/elixir/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index 8fc1db9dc..34f840d2a 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -3,5 +3,5 @@ ;; +elixir.el (package! elixir-mode) -(package! alchemist) +(package! alchemist :recipe (:fetcher github :repo "hlissner/alchemist.el")) (package! ac-alchemist) From 4cd79bd6cacbd6d25d84a01194603ef900bcb828 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 14:37:32 -0500 Subject: [PATCH 0525/4235] lang/emacs-lisp: fix flycheck-cask-setup hook --- modules/lang/emacs-lisp/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index b9e3a8bce..6704c7ff5 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -114,7 +114,7 @@ :when (featurep! :feature syntax-checker) :commands flycheck-cask-setup :init - (add-hook! 'emacs-lisp-hook + (add-hook! 'emacs-lisp-mode-hook (add-hook 'flycheck-mode-hook #'flycheck-cask-setup nil t))) From 04cb9a269171d0c381e87c364d59ca06a8f91d51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 15:18:36 -0500 Subject: [PATCH 0526/4235] app/calendar: general refactor --- modules/app/calendar/autoload.el | 16 ++++++++ modules/app/calendar/config.el | 64 +++++++++++++++----------------- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 0eca3dae3..fc99aea38 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -14,11 +14,13 @@ ;;;###autoload (defun +calendar/quit () + "TODO" (interactive) (+workspace/delete "Calendar")) ;;;###autoload (defun +calendar/open-calendar () + "TODO" (interactive) (cfw:open-calendar-buffer ;; :custom-map cfw:my-cal-map @@ -27,3 +29,17 @@ (cfw:org-create-source (doom-color 'fg)) ; orgmode source ))) +;;;###autoload +(defun +calendar*cfw:render-button (title command &optional state) + "render-button + TITLE + COMMAND + STATE" + (let ((text (concat " " title " ")) + (keymap (make-sparse-keymap))) + (cfw:rt text (if state 'cfw:face-toolbar-button-on + 'cfw:face-toolbar-button-off)) + (define-key keymap [mouse-1] command) + (cfw:tp text 'keymap keymap) + (cfw:tp text 'mouse-face 'highlight) + text)) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index db945988b..3870ca701 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -1,46 +1,40 @@ ;;; app/calendar/config.el -*- lexical-binding: t; -*- -(defvar +calendar-org-gcal-secret-file "~/.emacs.d/modules/private/org/secret.el") -(defvar +calendar-open-calendar-function '+calendar/open-calendar) +(defvar +calendar-org-gcal-secret-file + (expand-file-name "private/org/secret.el" doom-modules-dir) + "TODO") + +(defvar +calendar-open-calendar-function #'+calendar/open-calendar + "TODO") + + +;; +;; Plugins +;; + (def-package! calfw :commands (cfw:open-calendar-buffer) :config - ;; better frame for calendar - (setq - cfw:face-item-separator-color nil - cfw:render-line-breaker 'cfw:render-line-breaker-none - cfw:fchar-junction ?╋ - cfw:fchar-vertical-line ?┃ - cfw:fchar-horizontal-line ?━ - cfw:fchar-left-junction ?┣ - cfw:fchar-right-junction ?┫ - cfw:fchar-top-junction ?┯ - cfw:fchar-top-left-corner ?┏ - cfw:fchar-top-right-corner ?┓) + (setq cfw:face-item-separator-color nil + cfw:render-line-breaker 'cfw:render-line-breaker-none + cfw:fchar-junction ?╋ + cfw:fchar-vertical-line ?┃ + cfw:fchar-horizontal-line ?━ + cfw:fchar-left-junction ?┣ + cfw:fchar-right-junction ?┫ + cfw:fchar-top-junction ?┯ + cfw:fchar-top-left-corner ?┏ + cfw:fchar-top-right-corner ?┓) + (map! :map cfw:calendar-mode-map "q" #'+calendar/quit) - (defun cfw:render-button (title command &optional state) - "render-button - TITLE - COMMAND - STATE" - (let ((text (concat " " title " ")) - (keymap (make-sparse-keymap))) - (cfw:rt text (if state 'cfw:face-toolbar-button-on - 'cfw:face-toolbar-button-off)) - (define-key keymap [mouse-1] command) - (cfw:tp text 'keymap keymap) - (cfw:tp text 'mouse-face 'highlight) - text)) + (when (featurep 'solaire-mode) + (add-hook 'cfw:calendar-mode-hook #'solaire-mode)) + (add-hook 'cfw:calendar-mode-hook 'doom-hide-modeline-mode) + + (advice-add #'cfw:render-button :override #'+calendar*cfw:render-button)) - (map! :map cfw:calendar-mode-map - "q" #'+calendar/quit) - (add-hook! 'cfw:calendar-mode-hook (solaire-mode +1) - (doom-hide-modeline-mode)) - (map! - :map cfw:calendar-mode-map - "q" #'+calendar/quit)) (def-package! calfw-org :commands (cfw:open-org-calendar @@ -48,6 +42,7 @@ cfw:open-org-calendar-withkevin my-open-calendar)) + (def-package! org-gcal :commands (org-gcal-sync org-gcal-fetch @@ -59,4 +54,5 @@ (defun org-gcal--notify (title mes) (message "org-gcal::%s - %s" title mes))) + ;; (def-package! alert) From 3bc9f4b4fb5bb7daa1910ed808ffa8c9be1c5bc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:18:25 -0500 Subject: [PATCH 0527/4235] completion/ivy: refactor ag/rg file search backends + fix args --- modules/completion/ivy/autoload/evil.el | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index da25f046d..0fd467881 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -51,7 +51,8 @@ (pcase engine ('grep (let ((args (if recursion-p " -r")) - (counsel-projectile-grep-initial-input query)) + (counsel-projectile-grep-initial-input query) + (default-directory directory)) (if all-files-p (cl-letf (((symbol-function #'projectile-ignored-directories-rel) (symbol-function #'ignore)) @@ -60,17 +61,14 @@ (counsel-projectile-grep args)) (counsel-projectile-grep args)))) ('ag - (let ((args (concat - (if all-files-p " -a") - (unless recursion-p " -n")))) + (let ((args (concat " -S" ; smart-case + (if all-files-p " -a") + (unless recursion-p " --depth 1")))) (counsel-ag query directory args (format prompt args)))) ('rg - ;; smart-case instead of case-insensitive flag - (let ((counsel-rg-base-command - (replace-regexp-in-string " -i " " -S " counsel-rg-base-command)) - (args (concat - (if all-files-p " -uu") - (unless recursion-p " --maxdepth 1")))) + (let ((args (concat " -S" ; smart-case + (if all-files-p " -uu") + (unless recursion-p " --maxdepth 1")))) (counsel-rg query directory args (format prompt args)))) ('pt) ;; TODO pt search engine (necessary?) (_ (error "No search engine specified"))))) @@ -88,7 +86,7 @@ If ALL-FILES-P, don't respect .gitignore files and search everything." ;;;###autoload (autoload '+ivy:ag "completion/ivy/autoload/evil" nil t) (evil-define-operator +ivy:ag (beg end query &optional all-files-p directory) - "Perform a project file search using the silver search. QUERY is a pcre + "Perform a project file search using the silver searcher. QUERY is a pcre regexp. If omitted, the current selection is used. If no selection is active, the last known search is used. From 52c24197bac4afe53167eaaa703ce1941a5b2338 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:19:12 -0500 Subject: [PATCH 0528/4235] completion/ivy: add pt file search backend; fix +ivy:grep-cwd autoload --- modules/completion/ivy/autoload/evil.el | 32 ++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 0fd467881..75e4c7fcc 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -70,9 +70,27 @@ (if all-files-p " -uu") (unless recursion-p " --maxdepth 1")))) (counsel-rg query directory args (format prompt args)))) - ('pt) ;; TODO pt search engine (necessary?) + ('pt + (let ((counsel-pt-base-command + (concat counsel-pt-base-command + " -S" ; smart-case + (if all-files-p " -U") + (unless recursion-p " --depth=1"))) + (default-directory directory)) + (counsel-pt query))) (_ (error "No search engine specified"))))) +;;;###autoload (autoload '+ivy:pt "completion/ivy/autoload/evil" nil t) +(evil-define-operator +ivy:pt (beg end query &optional all-files-p directory) + "Perform a project file search using the platinum searcher. QUERY is a grep +regexp. If omitted, the current selection is used. If no selection is active, +the last known search is used. + +If ALL-FILES-P, don't respect .gitignore files and search everything." + (interactive "") + (let ((+ivy--file-search-all-files-p all-files-p)) + (+ivy--file-search 'pt beg end query directory))) + ;;;###autoload (autoload '+ivy:grep "completion/ivy/autoload/evil" nil t) (evil-define-operator +ivy:grep (beg end query &optional all-files-p directory) "Perform a project file search using grep (or git-grep in git repos). QUERY is @@ -109,9 +127,17 @@ NOTE: ripgrep doesn't support multiline searches (yet)." (+ivy--file-search 'rg beg end query directory))) -;;;###autoload (autoload '+ivy:ag-cwd "completion/ivy/autoload/evil" nil t) +;;;###autoload (autoload '+ivy:pt-cwd "completion/ivy/autoload/evil" nil t) +(evil-define-operator +ivy:pt-cwd (beg end query &optional bang) + "The same as :grep, but searches the current directory. If BANG, don't recurse +into sub-directories." + (interactive "") + (let ((+ivy--file-search-recursion-p (not bang))) + (+ivy:pt beg end query t default-directory))) + +;;;###autoload (autoload '+ivy:grep-cwd "completion/ivy/autoload/evil" nil t) (evil-define-operator +ivy:grep-cwd (beg end query &optional bang) - "The same as :git, but searches the current directory. If BANG, don't recurse + "The same as :grep, but searches the current directory. If BANG, don't recurse into sub-directories." (interactive "") (let ((+ivy--file-search-recursion-p (not bang))) From d6cba4253f37f9bd79ac2dedc77089cf6a8720df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:19:54 -0500 Subject: [PATCH 0529/4235] app/calendar: minor refactor; rename +calendar-open-calendar-function --- modules/app/calendar/autoload.el | 8 +++++--- modules/app/calendar/config.el | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index fc99aea38..7d906c4cb 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -7,9 +7,11 @@ (unless (featurep! :feature workspaces) (user-error ":feature workspaces is required, but disabled")) (+workspace-switch "Calendar" t) - (if-let* ((buf (cl-find-if (lambda (it) (string-match-p "^\\*cfw" (buffer-name (window-buffer it)))) - (doom-visible-windows)))) - (select-window (get-buffer-window buf)) (call-interactively +calendar-open-calendar-function)) + (if-let* ((win (cl-loop for win in (doom-visible-windows) + if (string-match-p "^\\*cfw" (buffer-name (window-buffer it))) + return win))) + (select-window win) + (call-interactively +calendar-open-function)) (+workspace/display)) ;;;###autoload diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index 3870ca701..7865412e2 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -4,7 +4,7 @@ (expand-file-name "private/org/secret.el" doom-modules-dir) "TODO") -(defvar +calendar-open-calendar-function #'+calendar/open-calendar +(defvar +calendar-open-function #'+calendar/open-calendar "TODO") From da416736efcbe919eac68a83ae6621cbe2cca14c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:20:25 -0500 Subject: [PATCH 0530/4235] app/rss: minor refactor; new flag (+org) --- modules/app/rss/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 3d716d556..e3908aa80 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -5,7 +5,8 @@ ;; don't care for the UI you can invoke elfeed directly with `elfeed'. (defvar +rss-elfeed-files (list "elfeed.org") - "The files that configure `elfeed's rss feeds.") + "Where to look for elfeed.org files, relative to `+org-dir'. Can be absolute +paths.") (defvar +rss-split-direction 'below "What direction to pop up the entry buffer in elfeed.") @@ -39,8 +40,8 @@ (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) (map! (:map (elfeed-search-mode-map elfeed-show-mode-map) - [remap kill-this-buffer] "q" - [remap kill-buffer] "q") + [remap kill-this-buffer] #'+rss/quit + [remap kill-buffer] #'+rss/quit) (:map elfeed-search-mode-map :n "q" #'+rss/quit @@ -53,12 +54,13 @@ :n "q" #'elfeed-kill-buffer :m "j" #'evil-next-visual-line :m "k" #'evil-previous-visual-line - [remap next-buffer] #'+rss/next - [remap previous-buffer] #'+rss/previous))) + [remap next-buffer] #'+rss/next + [remap previous-buffer] #'+rss/previous))) (def-package! elfeed-org - :after (elfeed) + :when (featurep! +org) + :after elfeed :config (setq rmh-elfeed-org-files (let ((default-directory +org-dir)) From b5e53b82b9ac449d5580a3175dadb2487616407a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:21:11 -0500 Subject: [PATCH 0531/4235] config/default: SPC f d = dired --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 674ca3585..93891956c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -177,6 +177,7 @@ :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 directory" :n "d" #'dired :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 From 79f60f7fcfa97920591bd17e3d756e80ed857780 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:23:41 -0500 Subject: [PATCH 0532/4235] config/default: SPC f c = compile project, SPC f o = find other file --- modules/config/default/+bindings.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 93891956c..8009ed97e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -264,10 +264,11 @@ :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 "Compile project" :n "c" #'projectile-compile-project + :desc "Find other file" :n "o" #'projectile-find-other-file :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" From 7db767957e87939c715bbc824b234e2d07a2e198 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:24:57 -0500 Subject: [PATCH 0533/4235] lang/org: fix C-a/C-e in org-mode --- modules/lang/org/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index ed49138c6..a9dc2b434 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -234,6 +234,8 @@ between the two." (map! :map org-mode-map "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images + [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line + [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line :map evil-org-mode-map :i [backtab] #'+org/dedent From 166ec9c28197eb984de7ca83451c10dad4f64b84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:25:54 -0500 Subject: [PATCH 0534/4235] feature/popup: +popup-ttl = 5 --- modules/feature/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a94792b59..92486bb16 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -81,7 +81,7 @@ a brief description of some native window parameters that Emacs uses: (select . ignore)) "The default window parameters.") -(defvar +popup-ttl 10 +(defvar +popup-ttl 5 "The default time-to-live for transient buffers whose popup buffers have been deleted.") From 6f4ca154450089cb8585b539caf0dccad06df38d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:26:29 -0500 Subject: [PATCH 0535/4235] ui/evil-goggles: evil-goggles-pulse = nil (slow) --- modules/ui/evil-goggles/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index 2a1b7a1eb..11444439c 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -4,5 +4,6 @@ :when (featurep! :feature evil) :hook (doom-post-init . evil-goggles-mode) :init - (setq evil-goggles-duration 0.1 + (setq evil-goggles-duration 0.05 + evil-goggles-pulse nil ; too slow evil-goggles-enable-delete nil)) From 95009c08f884f59e198b52c85f567fb7c4c62743 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:27:18 -0500 Subject: [PATCH 0536/4235] doom/describe-module: detect module associated with major-mode --- core/autoload/help.el | 110 ++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 46 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index e43ed5e8d..877ae0bf5 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -1,14 +1,5 @@ ;;; core/autoload/help.el -*- lexical-binding: t; -*- -(defun doom--find-next (pred forward-fn end-fn) - (save-excursion - (catch 'found - (ignore-errors - (while (not (funcall end-fn)) - (when-let* ((ret (funcall pred))) - (throw 'found ret)) - (funcall forward-fn)))))) - ;;;###autoload (defun doom/describe-setting (setting) "Open the documentation of SETTING (a keyword defined with `def-setting!'). @@ -24,53 +15,80 @@ Defaults to the " (error "'%s' is not a valid DOOM setting" setting)) (describe-function fn))) + +;; +(defvar doom--module-mode-alist + '((c-mode :lang cc) + (c++-mode :lang cc) + (objc++-mode :lang cc) + (java-mode :lang java) + (csharp-mode :lang csharp) + (clojure-mode :lang clojure) + (emacs-lisp-mode :lang emacs-lisp) + (go-mode :lang go) + (haskell-mode :lang haskell) + (js2-mode :lang javascript) + (julia-mode :lang julia) + (latex-mode :lang latex) + (LaTeX-mode :lang latex) + (ledger-mode :lang ledger) + (lua-mode :lang lua) + (markdown-mode :lang markdown) + (gfm-mode :lang markdown) + (ocaml-mode :lang ocaml) + (org-mode :lang org) + (perl-mode :lang perl) + (php-mode :lang php) + (hack-mode :lang php) + (plantuml-mode :lang plantuml) + (purescript-mode :lang purescript) + (python-mode :lang python) + (restclient-mode :lang rest) + (ruby-mode :lang ruby) + (rust-mode :lang rust) + (scala-mode :lang scala) + (sh-mode :lang sh) + (swift-mode :lang swift) + (typescript-mode :lang typescript) + (web-mode :lang web) + (css-mode :lang web) + (scss-mode :lang web) + (sass-mode :lang web) + (less-css-mode :lang web) + (stylus-mode :lang web)) + "TODO") + ;;;###autoload (defun doom/describe-module (module) "Open the documentation of MODULE (a string that represents the category and submodule in the format, e.g. ':feature evil'). Defaults to either a) the module at point (in init.el), b) the module derived -from a `featurep!' or `require!' call or c) the module that the current file is -in." +from a `featurep!' or `require!' call, c) the module that the current file is +in, or d) the module associated with the current major mode (see +`doom--module-mode-alist')." (interactive (let ((module (cond ((and buffer-file-name - (string= (file-truename user-init-file) - (file-truename buffer-file-name))) - (let* ((category - (save-excursion - (goto-char (line-end-position)) - (doom--find-next - (lambda () - (and (not (sp-point-in-comment)) - (keywordp (symbol-at-point)) - (symbol-at-point))) - (lambda () (forward-symbol -1)) - #'bobp))) - (module - (save-excursion - (goto-char (line-beginning-position)) - (save-restriction - (narrow-to-region (point) (line-end-position)) - (doom--find-next - (lambda () - (and (not (sp-point-in-comment)) - (not (keywordp (symbol-at-point))) - (sexp-at-point))) - #'forward-sexp - #'eobp))))) - (when (and category module) - (format "%s %s" category module)))) + (eq major-mode 'emacs-lisp-mode) + (string= (file-name-nondirectory buffer-file-name) + "init.el") + (thing-at-point 'sexp t))) ((save-excursion - (sp-beginning-of-sexp) - (unless (eq (char-after) ?\() - (backward-char)) - (let ((sexp (sexp-at-point))) - (when (memq (car-safe sexp) '(featurep! require!)) - (format "%s %s" (nth 1 sexp) (nth 2 sexp)))))) - (buffer-file-name - (when-let* ((module (doom-module-from-path buffer-file-name))) - (format "%s %s" (car module) (cdr module))))))) + (ignore-errors + (sp-beginning-of-sexp) + (unless (eq (char-after) ?\() + (backward-char)) + (let ((sexp (sexp-at-point))) + (when (memq (car-safe sexp) '(featurep! require!)) + (format "%s %s" (nth 1 sexp) (nth 2 sexp))))))) + ((and buffer-file-name + (when-let* ((mod (doom-module-from-path buffer-file-name))) + (format "%s %s" (car mod) (cdr mod))))) + ((when-let* ((mod (cdr (assq major-mode doom--module-mode-alist)))) + (format "%s %s" + (symbol-name (car mod)) + (symbol-name (cadr mod)))))))) (list (completing-read "Describe module: " (cl-loop for (module . sub) in (reverse (hash-table-keys doom-modules)) collect (format "%s %s" module sub)) From f113f994843cc25a1b63ccd7fadb01c96b3d679d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:27:47 -0500 Subject: [PATCH 0537/4235] projectile-indexing-method = native (on windows) --- core/core-projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 3f2bec85c..a293a8fc2 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -4,7 +4,7 @@ :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) - projectile-indexing-method 'alien + projectile-indexing-method (if IS-WINDOWS 'native 'alien) projectile-known-projects-file (concat doom-cache-dir "projectile.projects") projectile-require-project-root nil projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") From 51a9e670ada46a4e6202d0ca972325ab8f982faa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Feb 2018 20:28:02 -0500 Subject: [PATCH 0538/4235] Update init.example.el --- init.example.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/init.example.el b/init.example.el index b1e335eec..5b90d92be 100644 --- a/init.example.el +++ b/init.example.el @@ -1,7 +1,7 @@ ;;; init.el -*- lexical-binding: t; -*- ;; ;; Author: Henrik Lissner -;; URL: https://github.com/hlissner/.emacs.d +;; URL: https://github.com/hlissner/doom-emacs ;; ;; ================= =============== =============== ======== ======== ;; \\ . . . . . . .\\ //. . . . . . .\\ //. . . . . . .\\ \\. . .\\// . . // @@ -132,7 +132,7 @@ :app ;(email +gmail) ; emacs as an email client ;irc ; how neckbeards socialize - ;rss ; emacs as an RSS reader + ;(rss +org) ; emacs as an RSS reader ;twitter ; twitter client https://twitter.com/vnought ;(write ; emacs as a word processor (latex + org + markdown) ; +wordnut ; wordnet (wn) search @@ -145,8 +145,8 @@ ;; your own modules. (default +bindings +snippets +evil-commands) - ;; This allows you to store your private module at $XDG_CONFIG_HOME/doom. - ;; Without +xdg it uses ~/.doom.d/. If your config directory doesn't - ;; exist, this module does nothing. + ;; This allows you to store your private module at + ;; $XDG_CONFIG_HOME/doom/. Without +xdg it uses ~/.doom.d/. If your + ;; config directory doesn't exist, this module does nothing. (private +xdg)) From 2dd2ff7ff231e19c6acea1e521f2fb52f95dafe7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Feb 2018 02:16:07 -0500 Subject: [PATCH 0539/4235] feature/file-templates: refactor & lazy load --- modules/feature/file-templates/config.el | 64 +++++++++++++----------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 24c876ca9..095cc1aab 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -12,13 +12,22 @@ ;; (def-package! autoinsert ; built-in - :defer 1 + :commands (auto-insert-mode auto-insert) :init (setq auto-insert-query nil ; Don't prompt before insertion auto-insert-alist nil) ; Tabula rasa + (after! yasnippet (push '+file-templates-dir yas-snippet-dirs)) + ;; load autoinsert as late as possible + (defun +file-templates|init () + (and (not buffer-read-only) + (bobp) (eobp) + (remove-hook 'find-file-hook #'+file-templates|init) + (auto-insert))) + (add-hook 'find-file-hook #'+file-templates|init) + :config (auto-insert-mode 1) @@ -41,19 +50,24 @@ (defun +file-templates-add (args) (cl-destructuring-bind (regexp trigger &optional mode project-only-p) args - (define-auto-insert - regexp - (if trigger - (vector - `(lambda () (+file-templates--expand ,trigger ',mode ,project-only-p))) - #'ignore)))) + (push `(,regexp . (lambda () (+file-templates--expand ,trigger ',mode ,project-only-p))) + auto-insert-alist))) - (let ((doom (concat "/" (regexp-opt '(".emacs.d" ".doom.d" "doom-emacs" "doom")) "/.*"))) - (mapc #'+file-templates-add - ;; General - `(("/\\.gitignore$" "__" gitignore-mode) - ("/Dockerfile$" "__" dockerfile-mode) - ("/docker-compose.yml$" "__" yaml-mode) + (mapc #'+file-templates-add + (let ((doom (concat "/" (regexp-opt '(".emacs.d" ".doom.d" "doom-emacs" "doom")) "/.*"))) + `(;; General + ("/\\.gitignore$" "__" gitignore-mode) + ("/Dockerfile$" "__" dockerfile-mode) + ("/docker-compose.yml$" "__" yaml-mode) + ("/Makefile$" "__" makefile-gmake-mode) + ;; elisp + ("\\.el$" "__initfile" emacs-lisp-mode) + ("/.dir-locals.el$" nil) + ("-test\\.el$" "__" emacs-ert-mode) + (,(concat doom "/.+\\.el$") "__doom-module" emacs-lisp-mode) + (,(concat doom "/packages\\.el$") "__doom-packages" emacs-lisp-mode) + (,(concat doom "/test/.+\\.el$") "__doom-test" emacs-lisp-mode) + (snippet-mode "__" snippet-mode) ;; C/C++ ("\\.h$" "__h" c-mode) ("\\.c$" "__c" c-mode) @@ -61,25 +75,19 @@ ("\\.\\(cc\\|cpp\\)$" "__cpp" c++-mode) ("/main\\.\\(cc\\|cpp\\)$" "__main.cpp" c++-mode) ("/win32_\\.\\(cc\\|cpp\\)$" "__winmain.cpp" c++-mode) - ("/Makefile$" "__" makefile-gmake-mode) - ;; Elisp - ("\\.el$" "__initfile" emacs-lisp-mode) - ("/.dir-locals.el$" nil) - ("-test\\.el$" "__" emacs-ert-mode) - (,(concat doom "/.+\\.el$") "__doom-module" emacs-lisp-mode) - (,(concat doom "/packages\\.el$") "__doom-packages" emacs-lisp-mode) - (,(concat doom "/test/.+\\.el$") "__doom-test" emacs-lisp-mode) - (snippet-mode "__" snippet-mode) - ;; Go + ;; go ("\\.go$" "__.go" go-mode) ("/main\\.go$" "__main.go" go-mode t) - ;; HTML + ;; web-mode ("\\.html$" "__.html" web-mode) + ("\\.scss$" "__" scss-mode) + ("/master\\.scss$" "__master.scss" scss-mode) + ("/normalize\\.scss$" "__normalize.scss" scss-mode) ;; java - ("/src/.+/.+\\.java$" "__" java-mode) + ("/src/.+\\.java$" "__" java-mode) ("/main\\.java$" "__main" java-mode) ("/build\\.gradle$" "__build.gradle" android-mode) - ;; Javascript + ;; javascript ("\\.\\(json\\|jshintrc\\)$" "__" json-mode) ("/package\\.json$" "__package.json" json-mode) ("/bower\\.json$" "__bower.json" json-mode) @@ -112,10 +120,6 @@ ;; Rust ("/main\\.rs$" "__main.rs" rust-mode) ("/Cargo.toml$" "__Cargo.toml" rust-mode) - ;; SCSS - ("\\.scss$" "__" scss-mode) - ("/master\\.scss$" "__master.scss" scss-mode) - ("/normalize\\.scss$" "__normalize.scss" scss-mode) ;; Slim ("/\\(index\\|main\\)\\.slim$" "__" slim-mode) ;; Shell scripts From af5261cf6b83246d3c80886e8e19928dede9a4b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Feb 2018 02:45:57 -0500 Subject: [PATCH 0540/4235] feature/file-templates: fix doom readme template --- .../file-templates/templates/org-mode/__doom-readme | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/feature/file-templates/templates/org-mode/__doom-readme b/modules/feature/file-templates/templates/org-mode/__doom-readme index c19f44400..901c25faf 100644 --- a/modules/feature/file-templates/templates/org-mode/__doom-readme +++ b/modules/feature/file-templates/templates/org-mode/__doom-readme @@ -1,10 +1,11 @@ # -*- mode: snippet -*- # name: Doom module readme # -- -#+TITLE: ${1:`(progn (string-match "modules/\\([^/]+\\)/\\([^/]+\\)/.+" buffer-file-name) - (format ":%s %s" - (match-string 1 buffer-file-name) - (match-string 2 buffer-file-name)))`} +#+TITLE: ${1:`(if (string-match "modules/\\([^/]+\\)/\\([^/]+\\)/.+" buffer-file-name) + (format ":%s %s" + (match-string 1 buffer-file-name) + (match-string 2 buffer-file-name)) + "")`} ${2:A short summary about what this module does.} From 60e14d01ec4d564c474ed3242860a0b204e9277e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Feb 2018 04:49:17 -0500 Subject: [PATCH 0541/4235] lang/elixir: fix missing alchemist server (run.exs) #409 --- modules/lang/elixir/packages.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index 34f840d2a..8be3fee2c 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -3,5 +3,8 @@ ;; +elixir.el (package! elixir-mode) -(package! alchemist :recipe (:fetcher github :repo "hlissner/alchemist.el")) +(package! alchemist :recipe + (:fetcher github + :repo "hlissner/alchemist.el" + :files (:defaults "*.exs" "alchemist-server"))) (package! ac-alchemist) From b1bf67f63098ea16101c4febc941410588eb70ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Feb 2018 17:18:07 -0500 Subject: [PATCH 0542/4235] Refactor package init process quelpa is now initialized by doom-initialize-packages. --- core/autoload/packages.el | 19 ++++++------------- core/core-packages.el | 11 +++++++---- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 1ffcd4d4c..729e30ad3 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -5,6 +5,8 @@ (require 'quelpa) (require 'async) +(doom-initialize-packages) + ;;;###autoload (defun doom-refresh-packages (&optional force-p) "Refresh ELPA packages." @@ -33,9 +35,7 @@ "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) - (cond ((and (or (quelpa-setup-p) - (error "Could not initialize quelpa")) - (assq name quelpa-cache)) + (cond ((assq name quelpa-cache) 'quelpa) ((assq name package-alist) 'elpa) @@ -50,7 +50,6 @@ quelpa. Throws an error if NOERROR is nil and the package isn't installed." list, whose car is NAME, and cdr the current version list and latest version list of the package." (cl-assert (symbolp name) t) - (doom-initialize-packages) (when-let* ((desc (cadr (assq name package-alist)))) (let* ((old-version (package-desc-version desc)) (new-version @@ -76,15 +75,13 @@ list of the package." "Return PROPerty in NAME's plist." (cl-assert (symbolp name) t) (cl-assert (keywordp prop) t) - (doom-initialize-packages) (plist-get (cdr (assq name doom-packages)) prop)) ;;;###autoload (defun doom-package-different-backend-p (name) - "Return t if NAME (a package's symbol) has a new backend than what it was -installed with. Returns nil otherwise, or if package isn't installed." + "Return t if a package named NAME (a symbol) has a new backend than what it +was installed with. Returns nil otherwise, or if package isn't installed." (cl-assert (symbolp name) t) - (doom-initialize-packages) (and (package-installed-p name) (let* ((plist (cdr (assq name doom-packages))) (old-backend (doom-package-backend name 'noerror)) @@ -194,6 +191,7 @@ If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. Used by `doom//packages-install'." + (doom-initialize-packages t) (cl-loop for desc in (doom-get-packages) for (name . plist) = desc if (and (or include-ignored-p @@ -209,7 +207,6 @@ Used by `doom//packages-install'." "Update `quelpa-cache' upon a successful `package-delete'." (let ((name (package-desc-name desc))) (when (and (not (package-installed-p name)) - (quelpa-setup-p) (assq name quelpa-cache)) (map-delete quelpa-cache name) (quelpa-save-cache) @@ -284,8 +281,6 @@ package.el as appropriate." (desc (cadr (assq name package-alist)))) (pcase (doom-package-backend name) ('quelpa - (or (quelpa-setup-p) - (error "Failed to initialize quelpa")) (let ((quelpa-upgrade-p t)) (quelpa (assq name quelpa-cache)))) ('elpa @@ -307,8 +302,6 @@ package.el as appropriate." (user-error "%s isn't installed" name)) (let ((inhibit-message (not doom-debug-mode)) quelpa-p) - (unless (quelpa-setup-p) - (error "Could not initialize QUELPA")) (when (assq name quelpa-cache) (map-delete quelpa-cache name) (quelpa-save-cache) diff --git a/core/core-packages.el b/core/core-packages.el index e2b3e57a3..583ec6da1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -181,9 +181,9 @@ it anyway." (quiet! (doom//reload-autoloads)))) (defun doom-initialize-packages (&optional force-p load-p) - "Crawls across your emacs.d to fill `doom-modules' (from init.el) and -`doom-packages' (from packages.el files), if they aren't set already. Also runs -every enabled module's init.el. + "Crawls across your emacs.d to fill `doom-modules' (from init.el), +`doom-packages' (from packages.el files) and `quelpa-cache'. If they aren't set +already. Also runs every enabled module's init.el. If FORCE-P is non-nil, do it even if they are. @@ -212,7 +212,10 @@ This aggressively reloads core autoload files." (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) + (require 'quelpa) + (setq doom-packages nil + quelpa-initialized-p nil) + (quelpa-setup-p) (_load (expand-file-name "packages.el" doom-core-dir)) (cl-loop for key being the hash-keys of doom-modules if (doom-module-path (car key) (cdr key) "packages.el") From 7bfd0a3304a64e2d0e5dae8d7931ccda883ad047 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Feb 2018 17:55:53 -0500 Subject: [PATCH 0543/4235] And changed-quelpa-recipe detection These packages are now reinstalled on make install. --- core/autoload/packages.el | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 729e30ad3..95f978d54 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -88,6 +88,18 @@ was installed with. Returns nil otherwise, or if package isn't installed." (new-backend (if (plist-get plist :recipe) 'quelpa 'elpa))) (not (eq old-backend new-backend))))) +;;;###autoload +(defun doom-package-different-recipe-p (name) + "Return t if a package named NAME (a symbol) has a different recipe than it +was installed with." + (cl-assert (symbolp name) t) + (when (package-installed-p name) + (let ((quelpa-recipe (assq name quelpa-cache)) + (doom-recipe (assq name doom-packages))) + (and quelpa-recipe doom-recipe + (not (equal (cdr quelpa-recipe) + (cdr (plist-get (cdr doom-recipe) :recipe)))))))) + ;;;###autoload (defun doom-get-packages (&optional installed-only-p) "Retrieves a list of explicitly installed packages (i.e. non-dependencies). @@ -199,7 +211,8 @@ Used by `doom//packages-install'." (or (plist-get plist :pin) (not (assq name package--builtins))) (or (not (assq name package-alist)) - (doom-package-different-backend-p name))) + (doom-package-different-backend-p name) + (doom-package-different-recipe-p name))) collect desc)) ;;;###autoload @@ -255,7 +268,8 @@ example; the package name can be omitted)." (doom-initialize-packages) (when (and (package-installed-p name) (not (package-built-in-p name))) - (if (doom-package-different-backend-p name) + (if (or (doom-package-different-backend-p name) + (doom-package-different-recipe-p name)) (doom-delete-package name t) (user-error "%s is already installed" name))) (let* ((inhibit-message (not doom-debug-mode)) @@ -335,7 +349,9 @@ package.el as appropriate." (lambda (pkg) (format "+ %s (%s)" (car pkg) - (cond ((doom-package-different-backend-p (car pkg)) + (cond ((doom-package-different-recipe-p (car pkg)) + "new recipe") + ((doom-package-different-backend-p (car pkg)) (if (plist-get (cdr pkg) :recipe) "ELPA -> QUELPA" "QUELPA -> ELPA")) @@ -354,7 +370,8 @@ package.el as appropriate." (doom--condition-case! (message! "%s%s" (cond ((and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg)))) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg)))) (dark (white "⚠ ALREADY INSTALLED"))) ((doom-install-package (car pkg) (cdr pkg)) (green "✓ DONE")) From e659ab06096196989b196589d66249678124e5d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Feb 2018 17:56:38 -0500 Subject: [PATCH 0544/4235] feature/workspaces: refactor switch-project integration --- .../feature/workspaces/autoload/workspaces.el | 46 ++++++++----------- modules/feature/workspaces/config.el | 9 +++- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index fda46bd91..af7b990ed 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -497,35 +497,37 @@ created." (setq +workspaces--project-dir default-directory)) ;;;###autoload -(defun +workspaces|switch-to-project (&optional inhibit-prompt) +(defun +workspaces|switch-to-project (&optional dir) "Creates a workspace dedicated to a new project. If one already exists, switch to it. If in the main workspace and it's empty, recycle that workspace, without renaming it. Should be hooked to `projectile-after-switch-project-hook'." + (when dir + (setq +workspaces--project-dir dir)) (when (and persp-mode +workspaces--project-dir) (unwind-protect (if (+workspace-buffer-list) - (let (persp-p) - (let* ((persp - (let* ((default-directory +workspaces--project-dir) - (project-name (doom-project-name 'nocache))) - (or (setq persp-p (+workspace-get project-name t)) - (+workspace-new project-name)))) - (new-name (persp-name persp))) - (+workspace-switch new-name) - (unless persp-p - (switch-to-buffer (doom-fallback-buffer))) - (unless inhibit-prompt - (doom-project-find-file +workspaces--project-dir)) - (+workspace-message - (format "Switched to '%s' in new workspace" new-name) - 'success))) + (let* (persp-p + (persp + (let* ((default-directory +workspaces--project-dir) + (project-name (doom-project-name 'nocache))) + (or (setq persp-p (+workspace-get project-name t)) + (+workspace-new project-name)))) + (new-name (persp-name persp))) + (+workspace-switch new-name) + (unless persp-p + (switch-to-buffer (doom-fallback-buffer))) + (with-current-buffer (doom-fallback-buffer) + (setq default-directory +workspaces--project-dir)) + (funcall +workspaces-switch-project-function +workspaces--project-dir) + (+workspace-message + (format "Switched to '%s' in new workspace" new-name) + 'success)) (with-current-buffer (switch-to-buffer (doom-fallback-buffer)) (setq default-directory +workspaces--project-dir) (message "Switched to '%s'" (doom-project-name 'nocache))) - (unless inhibit-prompt - (doom-project-find-file +workspaces--project-dir))) + (funcall +workspaces-switch-project-function +workspaces--project-dir)) (setq +workspaces--project-dir nil)))) @@ -533,14 +535,6 @@ Should be hooked to `projectile-after-switch-project-hook'." ;; Advice ;; -;;;###autoload -(defun +workspaces*switch-counsel-project-action (project) - "A `counsel-projectile-switch-project-action' that creates a dedicated -workspace for a new project, before prompting to open a file." - (let ((+workspaces--project-dir project) - (inhibit-message t)) - (+workspaces|switch-to-project 'inhibit-prompt))) - ;;;###autoload (defun +workspaces*autosave-real-buffers (orig-fn &rest args) "Don't autosave if no real buffers are open." diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 330b9b2d6..947de9ed0 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -16,6 +16,11 @@ "The name of the primary and initial workspace, which cannot be deleted or renamed.") +(defvar +workspaces-switch-project-function #'doom-project-find-file + "The function to run after `projectile-switch-project' or +`counsel-projectile-switch-project'. This function must take one argument: the +new project directory.") + ;; FIXME actually use this for wconf bookmark system (defvar +workspaces-data-file "_workspaces" "The basename of the file to store single workspace perspectives. Will be @@ -98,8 +103,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) ;; per-project workspaces - (setq projectile-switch-project-action #'+workspaces|set-project-action) - (advice-add #'counsel-projectile-switch-project-by-name :before #'+workspaces*switch-counsel-project-action) + (setq projectile-switch-project-action #'+workspaces|set-project-action + counsel-projectile-switch-project-action #'+workspaces|switch-to-project) (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) ;; From e6f58d37142afbcec94b0f4b5e3589a718f17a84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Feb 2018 05:10:31 -0500 Subject: [PATCH 0545/4235] tools/upload: fix +upload/browse & add docstrings --- modules/tools/upload/autoload.el | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/tools/upload/autoload.el b/modules/tools/upload/autoload.el index fb18193ad..a129c5d4e 100644 --- a/modules/tools/upload/autoload.el +++ b/modules/tools/upload/autoload.el @@ -1,34 +1,33 @@ ;;; tools/upload/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +upload/local (&optional force-p) - "TODO" - (interactive) +(defun +upload/put-file (&optional force-p) + "Upload the current buffer's file to the configured remote." + (interactive "P") (if force-p (ssh-deploy-upload-handler-forced) (ssh-deploy-upload-handler))) ;;;###autoload -(defun +upload/remote-download () - "TODO" +(defun +upload/get-file () + "Download the current buffer's file from the configured remote." (interactive) (ssh-deploy-download-handler)) ;;;###autoload -(defun +upload/diff () - "TODO" +(defun +upload/diff-file () + "Open a diff of the local file against the remote." (interactive) (ssh-deploy-diff-handler)) ;;;###autoload (defun +upload/browse () - "TODO" + "Browse the remote directory mapped to this file's directory." (interactive) - (ssh-deploy-browse-remove-handler)) + (ssh-deploy-browse-remote-handler)) ;;;###autoload (defun +upload/check-remote () - "TODO" + "Check if local file exists or if the remote file has changed." (interactive) (ssh-deploy-remote-changes-handler)) - From fe81a501f30e2e7e5b58a3934c98a155edceb468 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Feb 2018 15:32:47 -0500 Subject: [PATCH 0546/4235] Fix void-function doom--menu-read error in byte-compiled Doom #427 The macro would be expanded, and then its helpers would never be loaded. --- core/autoload/menu.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/menu.el b/core/autoload/menu.el index f6f916f11..c9e86a0b5 100644 --- a/core/autoload/menu.el +++ b/core/autoload/menu.el @@ -11,11 +11,13 @@ PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") "Default method for displaying a completion-select prompt." (completing-read prompt (mapcar #'car commands))) +;;;###autoload (defun doom--menu-read (prompt commands) (if-let* ((choice (funcall doom-menu-display-fn prompt commands))) (cdr (assoc choice commands)) (user-error "Aborted"))) +;;;###autoload (defun doom--menu-exec (plist) (let ((command (plist-get plist :exec)) (cwd (plist-get plist :cwd))) From 12a938d8886e57b99945ca9c1439453752f6a473 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Feb 2018 16:46:15 -0500 Subject: [PATCH 0547/4235] tools/upload: fix ssh-deploy-browse-remote-handler autoload --- modules/tools/upload/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/upload/config.el b/modules/tools/upload/config.el index a82cdf325..19615aa4a 100644 --- a/modules/tools/upload/config.el +++ b/modules/tools/upload/config.el @@ -17,7 +17,7 @@ :commands (ssh-deploy-upload-handler ssh-deploy-upload-handler-forced ssh-deploy-diff-handler - ssh-deploy-browse-remove-handler + ssh-deploy-browse-remote-handler ssh-deploy-remote-changes-handler) :init ;; Maybe auto-upload on save From 3101d8a17f6430c392b3fadb5576d208529f5aaf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Feb 2018 17:09:45 -0500 Subject: [PATCH 0548/4235] tools/upload: remove autoload library (unnecessary) --- modules/tools/upload/autoload.el | 33 -------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 modules/tools/upload/autoload.el diff --git a/modules/tools/upload/autoload.el b/modules/tools/upload/autoload.el deleted file mode 100644 index a129c5d4e..000000000 --- a/modules/tools/upload/autoload.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; tools/upload/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +upload/put-file (&optional force-p) - "Upload the current buffer's file to the configured remote." - (interactive "P") - (if force-p - (ssh-deploy-upload-handler-forced) - (ssh-deploy-upload-handler))) - -;;;###autoload -(defun +upload/get-file () - "Download the current buffer's file from the configured remote." - (interactive) - (ssh-deploy-download-handler)) - -;;;###autoload -(defun +upload/diff-file () - "Open a diff of the local file against the remote." - (interactive) - (ssh-deploy-diff-handler)) - -;;;###autoload -(defun +upload/browse () - "Browse the remote directory mapped to this file's directory." - (interactive) - (ssh-deploy-browse-remote-handler)) - -;;;###autoload -(defun +upload/check-remote () - "Check if local file exists or if the remote file has changed." - (interactive) - (ssh-deploy-remote-changes-handler)) From cd0d44c463bae2a48d03307ccb5028b01dde4e34 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Feb 2018 17:10:21 -0500 Subject: [PATCH 0549/4235] config/default: redo tools/upload & ssh-deploy keybinds --- modules/config/default/+bindings.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 8009ed97e..050640c9b 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -275,13 +275,14 @@ :desc "Save and 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) + (:when (featurep! :tools upload) + (:desc "remote" :prefix "r" + :desc "Upload local" :n "u" #'ssh-deploy-upload-handler + :desc "Upload local (force)" :n "U" #'ssh-deploy-upload-handler-forced + :desc "Download remote" :n "d" #'ssh-deploy-download-handler + :desc "Diff local & remote" :n "D" #'ssh-deploy-diff-handler + :desc "Browse remote files" :n "." #'ssh-deploy-browse-remote-handler + :desc "Detect remote changes" :n ">" #'ssh-deploy-remote-changes-handler)) (:desc "snippets" :prefix "s" :desc "New snippet" :n "n" #'yas-new-snippet From 446a66603f1695f4702ecf85bb3baf8bf5c5b62a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Feb 2018 04:19:21 -0500 Subject: [PATCH 0550/4235] Fix quelpa packages looking up elpa version This is a regression introduced in b1bf67f6. Package management would incorrectly compare quelpa package versions with elpa package versions. This would cause "outdated" packages to get deleted. --- 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 95f978d54..2fc83e698 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -170,7 +170,8 @@ Used by `doom//packages-update'." (let ((noninteractive t)) (load ,(expand-file-name "core.el" doom-core-dir))) (setq doom-packages ',doom-packages - doom-modules ',doom-modules) + doom-modules ',doom-modules + quelpa-cache ',quelpa-cache) (doom-package-outdated-p ',pkg))) futures)) (delq nil From d9d4b6afd51439f5789b8af19b41b5fe5a45124d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Feb 2018 04:23:06 -0500 Subject: [PATCH 0551/4235] lang/org: hlissner/org-bullets => Kaligule/org-bullets --- 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 4f130e555..dc3c1cb20 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -4,7 +4,7 @@ ;; Installs a cutting-edge version of org-mode (package! org-plus-contrib) -(package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets")) +(package! org-bullets :recipe (:fetcher github :repo "Kaligule/org-bullets")) (package! toc-org) (when (featurep! :feature evil) From 55c6244e9f0262ce0d011984fe0dbaa2769d9d8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Feb 2018 04:48:36 -0500 Subject: [PATCH 0552/4235] doom-install-package: clean up after failed quelpa install --- core/autoload/packages.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 2fc83e698..6b5b04648 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -278,7 +278,12 @@ example; the package name can be omitted)." (recipe (plist-get plist :recipe)) quelpa-upgrade-p) (if recipe - (quelpa recipe) + (condition-case-unless-debug _ + (quelpa recipe) + ('error + (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) + (when (file-directory-p pkg-build-dir) + (delete-directory pkg-build-dir t))))) (package-install name)) (when (package-installed-p name) (cl-pushnew (cons name plist) doom-packages :test #'eq :key #'car) From 5fc4ed3f819a065a7d769ba8494daa876fc4fae8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Feb 2018 04:44:02 -0500 Subject: [PATCH 0553/4235] lang/cc: rewrite & polish style settings Doom used to have its own cc-mode style, which was difficult to customize without first undoing all its changes. A doom entry has been added to c-style-alist, which represents a marriage of various styles (mostly linux), plus some context-sensitive indentation functions which I think are reasonable. More importantly, it can be disabled by changing c-default-style. Also, removed a few hacks that have been merged into v5.33+ of cc-mode. 25.1 users beware! You may not have these changes. --- modules/lang/cc/autoload.el | 44 +++++++++++++++++-------------------- modules/lang/cc/config.el | 44 ++++++++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 37 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 929d5af02..2c58ff265 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -19,19 +19,6 @@ (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." - (if (and (eq major-mode 'c++-mode) - (ignore-errors - (save-excursion - (goto-char (c-langelem-pos langelem)) - ;; Detect "[...](" or "[...]{". preceded by "," or "(", - ;; and with unclosed brace. - (looking-at-p ".*[(,][ \t]*\\[[^]]*\\][ \t]*[({][^}]*$")))) - 0 ; no additional indent - (apply orig-fun args))) - ;;;###autoload (defun +cc-sp-point-is-template-p (id action context) "Return t if point is in the right place for C++ angle-brackets." @@ -50,17 +37,26 @@ (looking-at-p "[ ]*#include[^<]+")))) ;;;###autoload -(defun +cc-c-lineup-inclass (_langelem) - "Indent privacy keywords at same level as class properties." - (if (memq major-mode '(c-mode c++-mode)) - (let ((inclass (assq 'inclass c-syntactic-context))) - (save-excursion - (goto-char (c-langelem-pos inclass)) - (if (or (looking-at "struct") - (looking-at "typedef struct")) - '+ - '++))) - '+)) +(defun +cc-c++-lineup-inclass (langelem) + "Indent inclass lines one level further than access modifier keywords." + (when (and (eq major-mode 'c++-mode) + (or (assoc 'access-label c-syntactic-context) + (save-excursion + (save-match-data + (re-search-backward + "\\(?:p\\(?:ublic\\|r\\(?:otected\\|ivate\\)\\)\\)" + (c-langelem-pos langelem) t))))) + '++)) + +;;;###autoload +(defun +cc-lineup-arglist-close (langlem) + "Line up the closing brace in an arglist with the opening brace IF cursor is +preceded by the opening brace or a comma (disregarding whitespace in between)." + (when (save-excursion + (save-match-data + (skip-chars-backward " \t\n" (c-langelem-pos langelem)) + (memq (char-before) (list ?, ?\( ?\;)))) + (c-lineup-arglist langlem))) ;; diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 502bc82dc..94b3ab162 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -48,7 +48,8 @@ compilation database is present in the project.") :init (setq-default c-basic-offset tab-width - c-backspace-function #'delete-backward-char) + c-backspace-function #'delete-backward-char + c-default-style "doom") :config (set! :electric '(c-mode c++-mode objc-mode java-mode) @@ -61,24 +62,41 @@ compilation database is present in the project.") ;; C/C++ style settings (c-toggle-electric-state -1) (c-toggle-auto-newline -1) - (c-set-offset 'substatement-open '0) ; don't indent brackets - (c-set-offset 'inline-open '+) - (c-set-offset 'block-open '+) - (c-set-offset 'brace-list-open '+) - (c-set-offset 'case-label '+) - (c-set-offset 'access-label '-) - (c-set-offset 'arglist-intro '+) - (c-set-offset 'arglist-close '0) - ;; Indent privacy keywords at same level as class properties - ;; (c-set-offset 'inclass #'+cc-c-lineup-inclass) ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) (add-hook! (c-mode c++-mode) #'highlight-numbers-mode) (add-hook! (c-mode c++-mode) #'+cc|fontify-constants) - ;; Improve indentation of inline lambdas in C++11 - (advice-add #'c-lineup-arglist :around #'+cc*align-lambda-arglist) + ;; Custom style, based off of linux + (map-put c-style-alist "doom" + `((c-basic-offset . ,tab-width) + (c-comment-only-line-offset . 0) + (c-hanging-braces-alist (brace-list-open) + (brace-entry-open) + (substatement-open after) + (block-close . c-snug-do-while) + (arglist-cont-nonempty)) + (c-cleanup-list brace-else-brace) + (c-offsets-alist + (statement-block-intro . +) + (knr-argdecl-intro . 0) + (substatement-open . 0) + (substatement-label . 0) + (statement-cont . +) + (case-label . +) + ;; align args with open brace OR don't indent at all (if open brace + ;; is at eolp and close brace is after arg with no trailing comma) + (arglist-intro . +) + (arglist-close +cc-lineup-arglist-close 0) + ;; don't over-indent lambda blocks + (inline-open . 0) + (inlambda . 0) + ;; indent access keywords +1 level, and properties beneath them + ;; another level + (access-label . -) + (inclass +cc-c++-lineup-inclass +) + (label . 0)))) ;;; Keybindings ;; Completely disable electric keys because it interferes with smartparens and From 2f7c9254d6586eb44d6c18e157e087e9fba512ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Feb 2018 20:05:30 -0500 Subject: [PATCH 0554/4235] Fix over-zealous delete-backward-char #431 Would consume entire sexps. --- core/autoload/editor.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 2ee50dc16..57048a0db 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -197,7 +197,7 @@ possible, or just one char if that's not possible." (when (= (point) (+ (length cl) beg)) (sp-backward-delete-char 1) (sp-insert-pair op))) - ((and (bolp) (doom-surrounded-p pair)) + ((and (bolp) (doom-surrounded-p pair nil :balanced)) (delete-region beg end) (sp-insert-pair op)) (t From 068a9345e3163bd852d8e2332d6df8331464d8db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Feb 2018 20:26:35 -0500 Subject: [PATCH 0555/4235] app/email: load mu4e in =email --- modules/app/email/autoload/email.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index 49a51727a..d0767f41a 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -9,6 +9,7 @@ (defun =email () "Start email client." (interactive) + (require 'mu4e) (+workspace-switch +email-workspace-name t) (mu4e~start 'mu4e~main-view) ;; (save-selected-window From aa1fe6957e45d4463f4cee7883c89013cb90fe5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alois=20Jan=C3=AD=C4=8Dek?= Date: Mon, 26 Feb 2018 20:30:37 +0100 Subject: [PATCH 0556/4235] feature/evil: add org-agenda-mode to evil-snipe-disabled-modes --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e86547324..efeca9c58 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -319,7 +319,7 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-scope 'line evil-snipe-repeat-scope 'visible evil-snipe-char-fold t - evil-snipe-disabled-modes '(magit-mode elfeed-show-mode elfeed-search-mode) + evil-snipe-disabled-modes '(org-agenda-mode magit-mode elfeed-show-mode elfeed-search-mode) evil-snipe-aliases '((?\[ "[[{(]") (?\] "[]})]") (?\; "[;:]"))) From dd163dace058a16f9e81912af236f4160f53c043 Mon Sep 17 00:00:00 2001 From: Yu He Date: Wed, 28 Feb 2018 13:53:37 +0100 Subject: [PATCH 0557/4235] Fix org-agenda-list showing on dashboard --- 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 e3ccde988..fc72313b6 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -291,7 +291,7 @@ controlled by `+doom-dashboard-pwd-policy'." (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) '("Reload last session" "history" (+workspace/load-session))) - ,(when (featurep! :org org) + ,(when (featurep! :lang org) '("See agenda for this week" "calendar" (call-interactively #'org-agenda-list))) ("Recently opened files" "file-text" From 36f903d02902cf48ed6c33ae448aa10eed2e3a58 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Feb 2018 22:11:41 -0500 Subject: [PATCH 0558/4235] completion/ivy: update for upstream changes (fix ag/rg/pt commands) --- modules/completion/ivy/autoload/ivy.el | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 77b55093a..2648f9266 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -156,35 +156,22 @@ search current file. See `+ivy-task-tags' to customize what this searches for." :caller '+ivy/tasks)) ;;;###autoload -(defun +ivy*counsel-ag-function (string base-cmd extra-ag-args) +(defun +ivy*counsel-ag-function (string) "Advice to 1) get rid of the character limit from `counsel-ag-function' and 2) disable ivy's over-zealous parentheses quoting behavior (if i want literal parentheses, I'll escape them myself). NOTE This may need to be updated frequently, to meet changes upstream (in counsel-rg)." - (when (null extra-ag-args) - (setq extra-ag-args "")) (if (< (length string) 1) ; <-- modified the character limit (counsel-more-chars 1) ; <-- (let ((default-directory (ivy-state-directory ivy-last)) (regex (counsel-unquote-regex-parens (setq ivy--old-re (ivy--regex string))))) - (let* ((args-end (string-match " -- " extra-ag-args)) - (file (if args-end - (substring-no-properties extra-ag-args (+ args-end 3)) - "")) - (extra-ag-args (if args-end - (substring-no-properties extra-ag-args 0 args-end) - extra-ag-args)) - (ag-cmd (format base-cmd - (concat extra-ag-args - " -- " - (shell-quote-argument regex) - file)))) - (counsel--async-command ag-cmd) - nil)))) + (counsel--async-command (format counsel-ag-command + (shell-quote-argument regex))) + nil))) ;;;###autoload (defun +ivy/wgrep-occur () From 047ed6c9ea6622470ee2474f81d8f88d851df418 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Feb 2018 22:24:36 -0500 Subject: [PATCH 0559/4235] Rethink doom-initialize & use package-initalize Doom saves a lot of startup time by avoiding package-initialize, because it loads every packages' autoloads file, which is expensive. Unfortunately, these autoloads files are necessary for some plugins with abnormal file structures (such as ESS). Previously, I was content with loading them myself, but these occurrences have become more frequent, so it would be safest if I relied on package-initialize more. So doom-initialize will now do so. However, it will cache the load-path (and Info-directory-list, fixing the lost info buffers) on first run. This makes byte-compiling Doom almost useless, but it makes startup just as fast as Doom would be if you had. This needs more testing. --- core/core-packages.el | 60 +++++++++++++++++++++---------------------- core/core.el | 17 ++---------- 2 files changed, 32 insertions(+), 45 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 583ec6da1..e967baf22 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -82,8 +82,11 @@ missing) and shouldn't be deleted.") (defvar doom-site-load-path load-path "The starting load-path, before it is altered by `doom-initialize'.") -(defvar doom-package-load-path () - "The load path of package libraries installed via ELPA and QUELPA.") +(defvar doom-autoload-file (concat doom-local-dir "autoloads.el") + "Where `doom//reload-autoloads' will generate its autoloads file.") + +(defvar doom-packages-file (concat doom-local-dir "packages.el") + "Where to cache `load-path' and `Info-directory-list'.") (defvar doom--refreshed-p nil) (defvar doom--current-module nil) @@ -134,19 +137,23 @@ If you byte-compile core/core.el, this function will be avoided to speed up startup." ;; Called early during initialization; only use native (and cl-lib) functions! (when (or force-p (not doom-init-p)) - ;; Speed things up with a `load-path' for only the bare essentials - (let ((load-path doom-site-load-path)) + (unless (load doom-autoload-file t t t) + (unless noninteractive + (error "No autoloads file! Run make autoloads"))) + (when (or (not (load doom-packages-file t t t)) + force-p) ;; 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 + ;; Ensure packages have been initialized + (require 'package) (setq package-activated-list nil) - (condition-case _ (package-initialize t) + (condition-case _ (package-initialize) ('error (package-refresh-contents) (setq doom--refreshed-p t) - (package-initialize t))) - ;; Ensure core packages are installed + (package-initialize))) + ;; Ensure core packages are installed. (let ((core-packages (cl-remove-if #'package-installed-p doom-core-packages))) (when core-packages (message "Installing core packages") @@ -159,20 +166,13 @@ startup." (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) - "Populates `load-path', if it hasn't already been. If FORCE-P is non-nil, do -it anyway." - (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. - ;; - ;; 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 doom-package-load-path doom-site-load-path)))) + (with-temp-buffer + (cl-pushnew doom-core-dir load-path :test #'string=) + (prin1 `(setq load-path ',load-path + Info-directory-list ',Info-directory-list) + (current-buffer)) + (write-file doom-packages-file))) + (setq doom-init-p t))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run @@ -188,7 +188,7 @@ already. Also runs every enabled module's init.el. If FORCE-P is non-nil, do it even if they are. This aggressively reloads core autoload files." - (doom-initialize-load-path force-p) + (doom-initialize force-p) (with-temp-buffer ; prevent buffer-local settings from propagating (cl-flet ((_load @@ -378,7 +378,8 @@ 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." - (cl-assert (symbolp filesym) t) + (or (symbolp filesym) + (signal 'wrong-type-argument (list 'symbolp filesym))) (let ((path (or path (and load-file-name (file-name-directory load-file-name)) (and (bound-and-true-p byte-compile-current-file) @@ -531,15 +532,14 @@ an Emacs session is running. This isn't necessary if you use Doom's package management commands because they call `doom//reload-load-path' remotely (through emacsclient)." (interactive) - (byte-recompile-file (expand-file-name "core.el" doom-core-dir) t) (cond ((and noninteractive (not (daemonp))) (require 'server) (when (server-running-p) (message "Reloading active Emacs session...") (server-eval-at server-name '(doom//reload-load-path)))) ((let ((noninteractive t)) - (doom-initialize-load-path t) - (message "%d packages reloaded" (length doom-package-load-path)) + (doom-initialize t) + (message "%d packages reloaded" (length package-alist)) (run-hooks 'doom-reload-hook))))) (defun doom//reload-autoloads () @@ -560,7 +560,7 @@ This should be run whenever init.el or an autoload file is modified. Running ;; state. `doom-initialize-packages' will have side effects otherwise. (progn (doom-packages--async-run 'doom//reload-autoloads) - (load doom-autoload-file t)) + (load doom-autoload-file t nil t)) (doom-initialize-packages t) (let ((targets (file-expand-wildcards @@ -600,8 +600,8 @@ This should be run whenever init.el or an autoload file is modified. Running (while (re-search-forward "^\\s-*(" nil t) (unless (or (nth 4 (syntax-ppss)) (nth 3 (syntax-ppss))) - ;; Replace autoload paths with absolute paths for fastest - ;; resolution during load + ;; Replace autoload paths with absolute paths for faster + ;; resolution during load and simpler `load-path' (when (eq (sexp-at-point) 'autoload) (save-excursion (forward-sexp 2) diff --git a/core/core.el b/core/core.el index ee9e0b9a6..3b9e5398b 100644 --- a/core/core.el +++ b/core/core.el @@ -56,9 +56,6 @@ 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.") -(defvar doom-autoload-file (concat doom-local-dir "autoloads.el") - "Where `doom//reload-autoloads' will generate its autoloads file.") - ;;; ;; UTF-8 as the default coding system @@ -149,20 +146,10 @@ ability to invoke the debugger in debug mode." gc-cons-percentage 0.6 file-name-handler-alist nil)) - (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)) - + (require 'core-packages (concat doom-core-dir "core-packages")) + (doom-initialize noninteractive) (load! core-lib) (load! core-os) ; consistent behavior across OSes - (condition-case-unless-debug ex - (require 'autoloads doom-autoload-file t) - ('error - (delete-file doom-autoload-file) - (lwarn 'doom-autoloads :warning - "Error in autoloads.el -> %s" ex))) - (unless noninteractive (load! core-ui) ; draw me like one of your French editors (load! core-editor) ; baseline configuration for text editing From c2fd5382613421cde24aab6f728c440fb17f16a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Feb 2018 22:30:49 -0500 Subject: [PATCH 0560/4235] Refactor doom startup benchmark --- core/core-packages.el | 17 +++++++++-------- core/core.el | 3 +-- modules/ui/doom-dashboard/config.el | 5 +---- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e967baf22..0344337ff 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -284,14 +284,15 @@ Used by `require!' and `depends-on!'." '(t)) 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 doom-package-load-path) - (hash-table-size doom-modules) - (setq doom-init-time (float-time (time-subtract (current-time) before-init-time))))) +(defun doom-packages--benchmark () + (format "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-site-load-path)) + (hash-table-size doom-modules) + (or doom-init-time + (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) ;; diff --git a/core/core.el b/core/core.el index 3b9e5398b..67702a6ab 100644 --- a/core/core.el +++ b/core/core.el @@ -166,8 +166,7 @@ ability to invoke the debugger in debug mode." (require 'server) (unless (server-running-p) (server-start))) - (doom-packages--display-benchmark)) - + (message "%s" (doom-packages--benchmark))) ;; If you forget to reset this, you'll get stuttering and random freezes! (setq gc-cons-threshold 16777216 gc-cons-percentage 0.1 diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index fc72313b6..a4099afd4 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -262,10 +262,7 @@ controlled by `+doom-dashboard-pwd-policy'." (propertize (+doom-dashboard--center +doom-dashboard--width - (format "Loaded %d packages in %d modules in %.02fs" - (length doom-package-load-path) - (hash-table-size doom-modules) - doom-init-time)) + (doom-packages--benchmark)) 'face 'font-lock-comment-face) "\n\n")) From 56c7d7fdcfcd34aee59c5a514ad15f6523b19395 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Feb 2018 22:34:17 -0500 Subject: [PATCH 0561/4235] doom//byte-recompile-plugins: use non-interactive session May indirectly solve #428 --- 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 0344337ff..bfcbcaae8 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -741,7 +741,11 @@ If RECOMPILE-P is non-nil, only recompile out-of-date core files." "Recompile all installed plugins. If you're getting odd errors after upgrading (or downgrading) Emacs, this may fix it." (interactive) - (byte-recompile-directory package-user-dir 0 t)) + (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-recompile-plugins) + (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 From 606b4695cc94ac3ef436f449ebcb08fae7335d29 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Feb 2018 22:34:46 -0500 Subject: [PATCH 0562/4235] Add NOSUFFIX flag to (load custom-file) --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 67702a6ab..eab311343 100644 --- a/core/core.el +++ b/core/core.el @@ -98,7 +98,7 @@ Use this for files that change often, like cache files.") ;; move custom defs out of init.el (setq custom-file (concat doom-etc-dir "custom.el")) -(load custom-file t t) +(load custom-file t t t) ;; be quiet at startup; don't load or display anything unnecessary (unless noninteractive From cacf13f2265a386fdd6edfca6a1538f38561cd8a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Feb 2018 22:39:10 -0500 Subject: [PATCH 0563/4235] Don't byte-compile exec-path on MacOS --- core/core-os.el | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 28206edb7..426b1cf40 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -36,15 +36,11 @@ ;; environment, so envvars will be wrong. That includes the PATH ;; Emacs picks up. `exec-path-from-shell' fixes this. This is slow ;; and benefits greatly from compilation. - (setq exec-path - (or (eval-when-compile - (when (require 'exec-path-from-shell nil t) - (setq exec-path-from-shell-check-startup-files nil - exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) - (nconc exec-path-from-shell-variables '("GOPATH" "GOROOT" "PYTHONPATH")) - (exec-path-from-shell-initialize) - exec-path)) - exec-path))) + (when (require 'exec-path-from-shell nil t) + (setq exec-path-from-shell-check-startup-files nil + exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) + (nconc exec-path-from-shell-variables '("GOPATH" "GOROOT" "PYTHONPATH")) + (exec-path-from-shell-initialize))) (t (when (require 'osx-clipboard nil t) (osx-clipboard-mode +1))))) From 0d27eda45a32ef46117a575c2c29d46426cc35f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Feb 2018 23:16:12 -0500 Subject: [PATCH 0564/4235] feature/evil: make evil-vimish-fold less ubiquitous #439 --- modules/feature/evil/autoload/folds.el | 4 +++- modules/feature/evil/config.el | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index e913ca1b6..ac61e8e94 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -1,5 +1,8 @@ ;;; feature/evil/autoload/folds.el -*- lexical-binding: t; -*- +(require 'evil-vimish-fold) +(require 'hideshow) + ;; `hideshow' is a decent code folding implementation, but it won't let you ;; create custom folds. `evil-vimish-fold' offers custom folds, but essentially ;; ignores any other type of folding (indent or custom markers, which @@ -15,7 +18,6 @@ (unless (bound-and-true-p hs-minor-mode) (hs-minor-mode +1))) -(require 'hideshow) (advice-add #'hs-toggle-hiding :before #'+evil--ensure-modes) (advice-add #'hs-hide-block :before #'+evil--ensure-modes) (advice-add #'hs-hide-level :before #'+evil--ensure-modes) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index efeca9c58..c8f5ba68e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -336,11 +336,14 @@ the new algorithm is confusing, like in python or ruby." (def-package! evil-vimish-fold - :commands evil-vimish-fold-mode + :commands (evil-vimish-fold/next-fold evil-vimish-fold/previous-fold + evil-vimish-fold/delete evil-vimish-fold/delete-all + evil-vimish-fold/create evil-vimish-fold/create-line) :init (setq vimish-fold-dir (concat doom-cache-dir "vimish-fold/") vimish-fold-indication-mode 'right-fringe) - (add-hook 'doom-post-init-hook #'evil-vimish-fold-mode t)) + :config + (vimish-fold-global-mode +1)) ;; Without `evil-visualstar', * and # grab the word at point and search, no From 589108fdb270f24a98ba6209f6955fe41530b3ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:04:48 -0500 Subject: [PATCH 0565/4235] Extend after! macro to support :any, :all & feature lists #442 --- core/core-lib.el | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 37db56584..ac3cc00ec 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -59,17 +59,31 @@ (defalias 'lambda! 'λ!) -(defmacro after! (feature &rest forms) +(defmacro after! (features &rest body) "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation." (declare (indent defun) (debug t)) - `(,(if (or (not (bound-and-true-p byte-compile-current-file)) - (if (symbolp feature) - (require feature nil :no-error) - (load feature :no-message :no-error))) - #'progn - #'with-no-warnings) - (with-eval-after-load ',feature ,@forms))) + (list (if (or (not (bound-and-true-p byte-compile-current-file)) + (dolist (next (doom-enlist features)) + (if (symbolp next) + (require next nil :no-error) + (load next :no-message :no-error)))) + #'progn + #'with-no-warnings) + (cond ((symbolp features) + `(eval-after-load ',features '(progn ,@body))) + ((and (consp features) + (memq (car features) '(:or :any))) + `(progn + ,@(cl-loop for next in (cdr features) + collect `(after! ,next ,@body)))) + ((and (consp features) + (memq (car features) '(:and :all))) + (dolist (next (cdr features)) + (setq body `(after! ,next ,@body))) + body) + ((listp features) + `(after! (:all ,@features) ,@body))))) (defmacro quiet! (&rest forms) "Run FORMS without making any noise." From 0b2548f7b1b1b56a48f6a9a9038d8cc91c1840e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:11:23 -0500 Subject: [PATCH 0566/4235] Fix module load order (delay config.el load) #441 --- core/core-packages.el | 6 +++--- core/core.el | 31 ++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index bfcbcaae8..02389a85b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -308,7 +308,7 @@ MODULES is an malformed plist of modules to load." (let (init-forms config-forms module file-name-handler-alist) (let ((modules-dir (expand-file-name "modules/" (file-name-directory (or load-file-name byte-compile-current-file))))) - (add-to-list 'doom-modules-dirs modules-dir) + (cl-pushnew modules-dir doom-modules-dirs :test #'string=) (dolist (m modules) (cond ((keywordp m) (setq module m)) ((not module) (error "No namespace specified in `doom!' for %s" m)) @@ -323,8 +323,8 @@ MODULES is an malformed plist of modules to load." (setq doom-modules ',doom-modules doom-modules-dirs ',doom-modules-dirs) ,@(nreverse init-forms) - (unless noninteractive - ,@(nreverse config-forms)))))) + (push '(lambda () ,@(nreverse config-forms)) + doom--delayed-modules))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." diff --git a/core/core.el b/core/core.el index eab311343..bb56cddd9 100644 --- a/core/core.el +++ b/core/core.el @@ -119,6 +119,8 @@ Use this for essential functionality.") "A list of hooks run after DOOM initialization is complete, and after `doom-init-hook'. Use this for extra, non-essential functionality.") +(defvar doom--delayed-modules nil) + (defun doom-try-run-hook (fn hook) "Runs a hook wrapped in a `condition-case-unless-debug' block; its objective is to include more information in the error message, without sacrificing your @@ -139,8 +141,8 @@ ability to invoke the debugger in debug mode." (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 + ;; A big contributor to long startup times is the garbage collector, so we + ;; up its memory threshold, temporarily and reset it later in ;; `doom|finalize'. (setq gc-cons-threshold 402653184 gc-cons-percentage 0.6 @@ -156,9 +158,15 @@ 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'." + (defun doom|after-init () + "Load the config.el file of all pending modules that have been enabled by a +recent `doom!' call. This should be attached to `after-init-hook'." + (mapc #'funcall (reverse doom--delayed-modules)) + (setq doom--delayed-modules nil)) + + (defun doom|after-startup () + "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and +display the loading benchmark." (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)) @@ -166,15 +174,20 @@ ability to invoke the debugger in debug mode." (require 'server) (unless (server-running-p) (server-start))) - (message "%s" (doom-packages--benchmark))) - ;; If you forget to reset this, you'll get stuttering and random freezes! + (message "%s" (doom-packages--benchmark)))) + + (defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes), and resets +`file-name-handler-alist'." (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)) + (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize) + (add-hook 'after-init-hook #'doom|after-init) + (add-hook 'emacs-startup-hook #'doom|after-startup)) ;; From 138ec2bf07f9974fc417d7b37573f041fb88b4ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:13:40 -0500 Subject: [PATCH 0567/4235] Remove manual loading of pkg-autoloads files No longer necessary as of 0c80bb42 --- core/core-lib.el | 8 ++++---- modules/completion/helm/config.el | 1 - modules/lang/elm/config.el | 1 - modules/lang/ess/config.el | 3 --- modules/lang/haskell/config.el | 2 -- modules/lang/latex/config.el | 5 ----- modules/lang/purescript/config.el | 4 +--- modules/tools/pdf/config.el | 1 - 8 files changed, 5 insertions(+), 20 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index ac3cc00ec..71b7cc71d 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -86,7 +86,7 @@ compilation." `(after! (:all ,@features) ,@body))))) (defmacro quiet! (&rest forms) - "Run FORMS without making any noise." + "Run FORMS without making any output." `(if doom-debug-mode (progn ,@forms) (let ((old-fn (symbol-function 'write-region))) @@ -105,10 +105,10 @@ compilation." (defmacro add-transient-hook! (hook &rest forms) "Attaches transient forms to a HOOK. -HOOK can be a quoted hook or a sharp-quoted function (which will be advised). +This means FORMS will be evaluated once when that function/hook is first +invoked, then never again. -These forms will be evaluated once when that function/hook is first invoked, -then it detaches itself." +HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." (declare (indent 1)) (let ((append (eq (car forms) :after)) (fn (intern (format "doom-transient-hook-%s" (cl-incf doom--transient-counter))))) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 77f7a2855..e582d2b7d 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -31,7 +31,6 @@ helm-move-to-line-cycle-in-source t) :config - (load "helm-autoloads" nil t) (add-hook 'doom-init-hook #'helm-mode) (defvar helm-projectile-find-file-map (make-sparse-keymap)) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 6157cf21d..4fe8af11d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -3,7 +3,6 @@ (def-package! elm-mode :mode "\\.elm$" :config - (load "elm-mode-autoloads" nil t) (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :company-backend 'elm-mode '(company-elm)) (set! :repl 'elm-mode #'run-elm-interactive) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 50d79744c..7121383f5 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -1,8 +1,5 @@ ;;; lang/ess/config.el -*- lexical-binding: t; -*- -(eval-and-compile - (load "ess-autoloads" nil t)) - (def-package! ess-site :commands (R stata julia SAS) :mode (("\\.sp\\'" . S-mode) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 6d5987b1b..aa62ffaab 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -15,8 +15,6 @@ :interpreter (("runghc" . haskell-mode) ("runhaskell" . haskell-mode)) :config - (load "haskell-mode-autoloads" nil t) - (set! :repl 'haskell-mode #'switch-to-haskell) (push ".hi" completion-ignored-extensions) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 550750024..b9df559fb 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -20,11 +20,6 @@ (def-package! tex-site - :init - ;; Manually load the AUCTEX autoloads. This is normally done by - ;; package-initialize, ... which we do not use. - (load "auctex.el" nil t t) - (load "auctex-autoloads.el" nil t t) :config ;; Set some varibles to fontify common LaTeX commands. (load! +fontification) diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index e4cb6ea54..39eafd64c 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -4,9 +4,7 @@ :mode "\\.purs$" :config (add-hook! 'purescript-mode-hook - #'(flycheck-mode purescript-indentation-mode rainbow-delimiters-mode)) - - (load "purescript-mode-autoloads" nil t)) + #'(flycheck-mode purescript-indentation-mode rainbow-delimiters-mode))) ;; (def-package! flycheck-purescript ;; :after purescript-mode diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 55eb60b70..f7cb233ab 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -2,7 +2,6 @@ (def-package! pdf-tools :mode ("\\.pdf$" . pdf-view-mode) - :init (load "pdf-tools-autoloads" nil t) :config (unless noninteractive (pdf-tools-install)) From c5abcfa703877471d7edb3da6b278b7c8a349425 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:14:33 -0500 Subject: [PATCH 0568/4235] lang/rust: fix flycheck not activating in rust-mode --- modules/lang/rust/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 4a9d1a5e7..ba2039cd6 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -38,5 +38,5 @@ :when (featurep! :feature syntax-checker) :after rust-mode :hook (flycheck-mode . flycheck-rust-setup) - :config (add-hook 'rust-mode-hook #'flycheck-mode)) + :init (add-hook 'rust-mode-hook #'flycheck-mode)) From 963c809c706bdbc04c329516c4a7fc055bc664ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:15:04 -0500 Subject: [PATCH 0569/4235] feature/version-control: fix git-gutter-fringe not loading Due to the new policy on package-initialize, git-gutter-fringe wouldn't autoload properly (since we try to fool Emacs into loading it when git-gutter-mode is called). --- modules/feature/version-control/+git.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 5893c7871..aec8d2106 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -14,12 +14,13 @@ (def-package! git-gutter-fringe - :commands git-gutter-mode + :defer t :init (defun +version-control|git-gutter-maybe () "Enable `git-gutter-mode' in non-remote buffers." (when (and (buffer-file-name) (not (file-remote-p (buffer-file-name)))) + (require 'git-gutter-fringe) (git-gutter-mode +1))) (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) :config From c595fe2eb825e933b42500eac433816a492c459b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:18:14 -0500 Subject: [PATCH 0570/4235] lang/org: don't auto-kill agenda buffers #429 There is always doom/cleanup-session or :cleanup as an alternative. --- modules/lang/org/config.el | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a9dc2b434..6765d8a04 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -283,14 +283,6 @@ between the two." ;; Don't open separate windows (map-put org-link-frame-setup 'file 'find-file) - (defun +org|cleanup-agenda-files () - "Close leftover agenda buffers after they've been indexed by org-agenda." - (cl-loop for file in org-agenda-files - for buf = (get-file-buffer file) - if (and file (not (get-buffer-window buf))) - do (kill-buffer buf))) - (add-hook 'org-agenda-finalize-hook #'+org|cleanup-agenda-files) - ;; Let OS decide what to do with files when opened (setq org-file-apps `(("pdf" . default) From 1758008ca5009707bd723a854e9e20f37065b0f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Feb 2018 17:21:40 -0500 Subject: [PATCH 0571/4235] completion/ivy: remap swiper -> counsel-grep-or-swiper #432 --- modules/completion/ivy/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 2c439a53a..3861b192c 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -94,7 +94,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap info-lookup-symbol] #'counsel-info-lookup-symbol [remap imenu] #'counsel-imenu [remap recentf-open-files] #'counsel-recentf - [remap org-capture] #'counsel-org-capture) + [remap org-capture] #'counsel-org-capture + [remap swiper] #'counsel-grep-or-swiper) :config (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) From 061e5af12cbe467eb7fd5bcfd01e4ea301865095 Mon Sep 17 00:00:00 2001 From: driftcrow Date: Thu, 1 Mar 2018 11:16:00 +0800 Subject: [PATCH 0572/4235] plantuml path for org-bable --- modules/lang/plantuml/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index d13baf316..23db701ef 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -3,7 +3,8 @@ (def-package! plantuml-mode :mode "\\.p\\(lant\\)?uml$" :init - (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar")) + (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") + org-plantuml-jar-path plantuml-jar-path) :config (set! :popup "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0))) From 48e605a7ca8da8f129b9a69febc050084aec06e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 00:54:49 -0500 Subject: [PATCH 0573/4235] Delay exec-path-from-shell & don't omit it after byte-compile Gives users an opportunity to customize what environment variables exec-path-from-shell pulls in. May address #433 --- core/core-os.el | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 426b1cf40..8ced59f0d 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -34,16 +34,14 @@ (cond ((display-graphic-p) ;; A known problem with GUI Emacs on MacOS: it runs in an isolated ;; environment, so envvars will be wrong. That includes the PATH - ;; Emacs picks up. `exec-path-from-shell' fixes this. This is slow - ;; and benefits greatly from compilation. + ;; Emacs picks up. `exec-path-from-shell' fixes this. (when (require 'exec-path-from-shell nil t) (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) - (nconc exec-path-from-shell-variables '("GOPATH" "GOROOT" "PYTHONPATH")) - (exec-path-from-shell-initialize))) - (t - (when (require 'osx-clipboard nil t) - (osx-clipboard-mode +1))))) + (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) + (add-hook 'emacs-startup-hook #'exec-path-from-shell-initialize))) + ((require 'osx-clipboard nil t) + (osx-clipboard-mode +1)))) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! From a9cbfc7f4edf362a095b36f675964d226636982a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 00:55:58 -0500 Subject: [PATCH 0574/4235] New :env setting for pulling shell envvars into MacOS sessions :env lets you specify what environment variables exec-path-from-shell should pull in from your shell environment at startup. As such, these need to be defined at startup. :env is useless post-init. May address #433 --- core/core-os.el | 3 +++ modules/lang/go/config.el | 2 ++ modules/lang/python/config.el | 2 ++ 3 files changed, 7 insertions(+) diff --git a/core/core-os.el b/core/core-os.el index 8ced59f0d..d1f171604 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -36,6 +36,9 @@ ;; environment, so envvars will be wrong. That includes the PATH ;; Emacs picks up. `exec-path-from-shell' fixes this. (when (require 'exec-path-from-shell nil t) + (def-setting! :env (&rest vars) + "Ensure VARs are grabbed from your shell environment." + `(nconc exec-path-from-shell-variables (list ,@vars))) (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index cd655e9ef..d9a0d040f 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -1,5 +1,7 @@ ;;; lang/go/config.el -*- lexical-binding: t; -*- +(set! :env "GOPATH" "GOROOT") + (def-package! go-mode :mode "\\.go$" :interpreter "go" diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 334968423..600554ad2 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,5 +1,7 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- +(set! :env "PYTHONPATH" "PYENV_ROOT") + (defvar +python-pyenv-root nil "The path to pyenv's root directory. This is automatically set when `python' is loaded.") From 3e6d9cf03ae93c841bcc0581390fe8f96a84d939 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 01:12:23 -0500 Subject: [PATCH 0575/4235] lang/haskell: fix ESC ESC keybind in REPL; move company-ghc to +dante --- modules/lang/haskell/+dante.el | 12 ++++++++++++ modules/lang/haskell/config.el | 15 +-------------- modules/lang/haskell/packages.el | 6 +++--- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 3064b5ff2..151b8ba7e 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -11,3 +11,15 @@ (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (add-hook 'dante-mode-hook #'flycheck-mode)) + +(def-package! company-ghc + :when (featurep! :completion company) + :after haskell-mode + :init + (add-hook 'haskell-mode-hook #'ghc-comp-init) + :config + (unless (executable-find "ghc-mod") + (warn! "Couldn't find ghc-mod on PATH. Code completion is disabled.")) + + (setq company-ghc-show-info 'oneline) + (set! :company-backend 'haskell-mode #'company-ghc)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index aa62ffaab..2014dd2b9 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -20,18 +20,5 @@ (autoload 'switch-to-haskell "inf-haskell" nil t) (after! inf-haskell - (map! :map inferior-haskell-mode-map "ESC ESC" #'doom/popup-close))) - - -(def-package! company-ghc - :when (featurep! :completion company) - :after haskell-mode - :init - (add-hook 'haskell-mode-hook #'ghc-comp-init) - :config - (unless (executable-find "ghc-mod") - (warn! "Couldn't find ghc-mod on PATH. Code completion is disabled.")) - - (setq company-ghc-show-info 'oneline) - (set! :company-backend 'haskell-mode #'company-ghc)) + (map! :map inferior-haskell-mode-map "ESC ESC" #'+popup/close))) diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index 981d218f8..2b637c3f8 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -2,12 +2,12 @@ ;;; lang/haskell/packages.el (package! haskell-mode) -(when (featurep! :completion company) - (package! company-ghc)) ;; (cond ((featurep! +dante) - (package! dante)) + (package! dante) + (when (featurep! :completion company) + (package! company-ghc))) (t (package! intero) (package! hindent))) From 70159d829f41120742ed92eb4fa85b721ff87da3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 03:34:38 -0500 Subject: [PATCH 0576/4235] Fix doom! not loading modules properly --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 02389a85b..781a74ad8 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -406,7 +406,7 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (doom-module-enable module submodule flags)) (if (file-directory-p module-path) `(condition-case-unless-debug ex - (let ((doom--current-module (cons module submodule))) + (let ((doom--current-module ',(cons module submodule))) (load! init ,module-path :noerror) (load! config ,module-path :noerror)) ('error From da66bb6be6da1a2415487dce210e37d528f609d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 04:08:29 -0500 Subject: [PATCH 0577/4235] config/private: decouple from config/default --- modules/config/private/autoload.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/config/private/autoload.el b/modules/config/private/autoload.el index ce3f25e9e..f85c9d298 100644 --- a/modules/config/private/autoload.el +++ b/modules/config/private/autoload.el @@ -1,6 +1,13 @@ ;;; config/private/autoload.el -*- lexical-binding: t; -*- -;;;###autoload (autoload '+private/find-in-config "config/private/autoload" nil t) -(+default--def-find-in! config +private-config-path) -;;;###autoload (autoload '+private/browse-config "config/private/autoload" nil t) -(+default--def-browse-in! config +private-config-path) +;;;###autoload +(defun +private/find-in-config () + "Open a file somewhere in `+private-config-path' via a fuzzy filename search." + (interactive) + (doom-project-find-file +private-config-path)) + +;;;###autoload +(defun +private/browse-config () + "Browse the files in `+private-config-path'." + (interactive) + (doom-project-browse +private-config-path)) From 873ad22894f3450e49818aea007a9fe02e0482d9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 04:09:39 -0500 Subject: [PATCH 0578/4235] config/default: make private macros private again! --- modules/config/default/autoload/default.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 6ba5aabc4..003d30a16 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -8,14 +8,12 @@ (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 (or 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 &optional prefix) (let ((prefix (or prefix (cdr (doom-module-from-path (or load-file-name byte-compile-current-file)))))) `(defun ,(intern (format "+%s/find-in-%s" prefix name)) () From 9d55d1e1baac91860742e12a03b72ba351fa717a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 04:15:09 -0500 Subject: [PATCH 0579/4235] config/default: remove private macros (unnecessary complexity) --- modules/config/default/autoload/default.el | 54 ++++++++++------------ 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 003d30a16..1e7810e31 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -8,39 +8,33 @@ (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 (or 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)))) - -(defmacro +default--def-find-in! (name dir &optional prefix) - (let ((prefix (or 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)))) - - -;;;###autoload (autoload '+default/browse-project "config/default/autoload/default" nil t) -(+default--def-browse-in! project (doom-project-root)) +;;;###autoload +(defun +default/browse-project () + (interactive) (doom-project-browse (doom-project-root))) ;; NOTE No need for find-in-project, use `projectile-find-file' -;;;###autoload (autoload '+default/find-in-templates "config/default/autoload/default" nil t) -(+default--def-find-in! templates +file-templates-dir) -;;;###autoload (autoload '+default/browse-templates "config/default/autoload/default" nil t) -(+default--def-browse-in! templates +file-templates-dir) +;;;###autoload +(defun +default/browse-templates () + (interactive) (doom-project-browse +file-templates-dir)) +;;;###autoload +(defun +default/find-in-templates () + (interactive) (doom-project-find-file +file-templates-dir)) -;;;###autoload (autoload '+default/find-in-emacsd "config/default/autoload/default" nil t) -(+default--def-find-in! emacsd doom-emacs-dir) -;;;###autoload (autoload '+default/browse-emacsd "config/default/autoload/default" nil t) -(+default--def-browse-in! emacsd doom-emacs-dir) +;;;###autoload +(defun +default/browse-emacsd () + (interactive) (doom-project-browse doom-emacs-dir)) +;;;###autoload +(defun +default/find-in-emacsd () + (interactive) (doom-project-find-file doom-emacs-dir)) -;;;###autoload (autoload '+default/find-in-notes "config/default/autoload/default" nil t) -(+default--def-find-in! notes +org-dir) -;;;###autoload (autoload '+default/browse-notes "config/default/autoload/default" nil t) -(+default--def-browse-in! notes +org-dir) +;;;###autoload +(defun +default/browse-notes () + (interactive) (doom-project-browse +org-dir)) +;;;###autoload +(defun +default/find-in-notes () + (interactive) (doom-project-find-file +org-dir)) -;;;###autoload (autoload '+default/browse-snippets "config/default/autoload/default" nil t) -(+default--def-browse-in! snippets emacs-snippets-dir) +;;;###autoload +(defun +default/browse-snippets () + (interactive) (doom-project-browse emacs-snippets-dir)) ;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' - From dfb6bc162d14f16b9031458f58f695fb33f81ff1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 04:35:52 -0500 Subject: [PATCH 0580/4235] lang/cc: remove ivy+rtags hack (unnecessary?) --- modules/lang/cc/config.el | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 94b3ab162..aa2ade660 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -246,13 +246,6 @@ compilation database is present in the project.") (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 From cde3a3ee7853e9d4eadf7283ed9cdd4a76d7f488 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 04:47:09 -0500 Subject: [PATCH 0581/4235] Delete doom-packages-file on doom//reload-load-path Fixes potentially malformed load-path after package management operatins. --- core/core-packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-packages.el b/core/core-packages.el index 781a74ad8..62c0dd4b9 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -533,6 +533,7 @@ an Emacs session is running. This isn't necessary if you use Doom's package management commands because they call `doom//reload-load-path' remotely (through emacsclient)." (interactive) + (delete-file doom-packages-file) (cond ((and noninteractive (not (daemonp))) (require 'server) (when (server-running-p) From 28adf5825f867726dc1656ec7f3e626deb122aa7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 13:17:07 -0500 Subject: [PATCH 0582/4235] lang/cc: fix rtags in other c*-mode derived modes; fix cleanup hook Also fixed rtags cleanup in doom-cleanup-hook to only kill the server if there are no more C/C++ buffers open. --- modules/lang/cc/autoload.el | 11 +++++++++++ modules/lang/cc/config.el | 18 ++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 2c58ff265..7921866cd 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -88,3 +88,14 @@ compilation dbs." nconc (list "-I" path))) (doom-project-root))))) +;;;###autoload +(defun +cc|init-rtags () + "Start an rtags server in c-mode and c++-mode buffers." + (when (memq major-mode '(c-mode c++-mode)) + (rtags-start-process-unless-running))) + +;;;###autoload +(defun +cc|cleanup-rtags () + "Kill rtags server(s) if there are no C/C++ buffers open." + (unless (doom-buffers-in-mode '(c-mode c++-mode) (buffer-list)) + (rtags-cancel-process))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index aa2ade660..2698bb3e9 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -215,7 +215,9 @@ compilation database is present in the project.") ;; (def-package! rtags - :after cc-mode + :commands (rtags-restart-process rtags-start-process-unless-running) + :init + (add-hook! (c-mode c++-mode) #'+cc|init-rtags) :config (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil @@ -227,14 +229,14 @@ compilation database is present in the project.") rtags-jump-to-first-match nil) (let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) - (if (/= (length bins) 0) - (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins) - (add-hook! (c-mode c++-mode) #'rtags-start-process-unless-running) - (set! :lookup '(c-mode c++-mode) - :definition #'rtags-find-symbol-at-point - :references #'rtags-find-references-at-point))) + (when (/= (length bins) 0) + (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins))) - (add-hook 'doom-cleanup-hook #'rtags-cancel-process) + (set! :lookup '(c-mode c++-mode) + :definition #'rtags-find-symbol-at-point + :references #'rtags-find-references-at-point) + + (add-hook 'doom-cleanup-hook #'+cc|cleanup-rtags) (add-hook! kill-emacs (ignore-errors (rtags-cancel-process))) ;; Use rtags-imenu instead of imenu/counsel-imenu From 1aa07f4c091ec18752e9da000e58f32c61e2b0ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 22:02:37 -0500 Subject: [PATCH 0583/4235] config/default: fix meta keybinds in popup windows #447 --- modules/config/default/+bindings.el | 44 ++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 050640c9b..38e14b0ed 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -25,30 +25,30 @@ :gnvime "M-:" #'doom/open-scratch-buffer ;; Text-scaling - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease + :ne "M-+" (λ! (text-scale-set 0)) + :ne "M-=" #'text-scale-increase + :ne "M--" #'text-scale-decrease ;; Simple window/frame navigation/manipulation - "C-`" #'+popup/toggle - "C-~" #'+popup/raise - "M-t" #'+workspace/new - "M-T" #'+workspace/display - "M-w" #'delete-window - "M-W" #'delete-frame - "C-M-f" #'toggle-frame-fullscreen - "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 + :ne "C-`" #'+popup/toggle + :ne "C-~" #'+popup/raise + :ne "M-t" #'+workspace/new + :ne "M-T" #'+workspace/display + :ne "M-w" #'delete-window + :ne "M-W" #'delete-frame + :ne "C-M-f" #'toggle-frame-fullscreen + :ne "M-n" #'evil-buffer-new + :ne "M-N" #'make-frame + :ne "M-1" (λ! (+workspace/switch-to 0)) + :ne "M-2" (λ! (+workspace/switch-to 1)) + :ne "M-3" (λ! (+workspace/switch-to 2)) + :ne "M-4" (λ! (+workspace/switch-to 3)) + :ne "M-5" (λ! (+workspace/switch-to 4)) + :ne "M-6" (λ! (+workspace/switch-to 5)) + :ne "M-7" (λ! (+workspace/switch-to 6)) + :ne "M-8" (λ! (+workspace/switch-to 7)) + :ne "M-9" (λ! (+workspace/switch-to 8)) + :ne "M-0" #'+workspace/switch-to-last ;; Other sensible, textmate-esque global bindings :ne "M-r" #'+eval/buffer From 7542f4a660958599909c9d8807e0ade40556d3db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 22:07:14 -0500 Subject: [PATCH 0584/4235] Fix doom-visible-windows including popup windows --- core/autoload/buffers.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 5e4da2e4f..196481512 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -126,9 +126,9 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." ;;;###autoload (defun doom-visible-windows (&optional window-list) - "Return a list of the visible, non-popup windows." + "Return a list of the visible, non-popup (dedicated) windows." (cl-loop for window in (or window-list (window-list)) - unless (eq (window-dedicated-p window) 'side) + unless (window-dedicated-p window) collect window)) ;;;###autoload From 9a1bf420751f257c7716fa6e051e55930821a0af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Mar 2018 23:41:43 -0500 Subject: [PATCH 0585/4235] feature/popup: remove eval-when-compile This fixes void-variable errors when byte-compiling this module. --- modules/feature/popup/config.el | 40 +++++++++++++++------------------ 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 92486bb16..bbf578190 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -145,29 +145,25 @@ ALIST supports one custom parameter: `size', which will resolve to ;; Default popup rules & bootstrap ;; -(eval-when-compile - (when (featurep! +all) - (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) +(when (featurep! +all) + (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) - (when (featurep! +defaults) - (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) - (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" nil '((transient . 0) (quit . t))) - (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) - (set! :popup "^\\*[Hh]elp" - '((slot . 2) (vslot . 2) (size . 0.2)) - '((select . t))) - (set! :popup "^\\*doom \\(?:term\\|eshell\\)" - '((size . 0.25)) - '((quit) (transient . 0))) - (set! :popup "^\\*doom:" - '((size . 0.35) (side . bottom)) - '((select . t) (modeline . t) (quit) (transient . t))) - (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) - nil) - -(setq +popup--display-buffer-alist (eval-when-compile +popup--display-buffer-alist)) +(when (featurep! +defaults) + (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) + (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" nil '((transient . 0) (quit . t))) + (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) + (set! :popup "^\\*[Hh]elp" + '((slot . 2) (vslot . 2) (size . 0.2)) + '((select . t))) + (set! :popup "^\\*doom \\(?:term\\|eshell\\)" + '((size . 0.25)) + '((quit) (transient . 0))) + (set! :popup "^\\*doom:" + '((size . 0.35) (side . bottom)) + '((select . t) (modeline . t) (quit) (transient . t))) + (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) (add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes +popup|set-modeline)) From 5c9ef4ee381f23373ca6e5d8bc25cafdac9bf9ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 17:40:51 -0500 Subject: [PATCH 0586/4235] Replace doom-hide-modeline-mode w/ hide-mode-line-mode #423 --- core/core-ui.el | 48 ++---------------------- core/packages.el | 1 + modules/app/calendar/config.el | 2 +- modules/feature/popup/autoload.el | 10 ++--- modules/lang/org/autoload/org-present.el | 2 +- 5 files changed, 12 insertions(+), 51 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 900d29a70..7c3f35814 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -80,48 +80,6 @@ with `doom//reload-theme').") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no -;; -;; A minor mode for hiding the mode-line -;; - -(defvar doom--modeline-format nil - "The modeline format to use when `doom-hide-modeline-mode' is active. Don't -set this directly. Let-bind it instead.") - -(defvar-local doom--old-modeline-format nil - "The old modeline format, so `doom-hide-modeline-mode' can revert when it's -disabled.") - -(define-minor-mode doom-hide-modeline-mode - "Minor mode to hide the mode-line in the current buffer." - :init-value nil - :global nil - (if doom-hide-modeline-mode - (progn - (add-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset nil t) - (setq doom--old-modeline-format mode-line-format - mode-line-format doom--modeline-format)) - (remove-hook 'after-change-major-mode-hook #'doom|hide-modeline-mode-reset t) - (setq mode-line-format doom--old-modeline-format)) - (force-mode-line-update)) - -;; Ensure major-mode or theme changes don't overwrite these variables -(put 'doom--old-modeline-format 'permanent-local t) -(put 'doom-hide-modeline-mode 'permanent-local t) -(put 'doom-hide-modeline-mode 'permanent-local-hook t) -(put 'doom|hide-modeline-mode-reset 'permanent-local-hook t) - -(defun doom|hide-modeline-mode-reset () - "Sometimes, a major-mode is activated after `doom-hide-modeline-mode' is -activated, thus disabling it (because changing major modes invokes -`kill-all-local-variables' and specifically seems to kill `mode-line-format's -local value, whether or not it's permanent-local. Therefore, we cycle -`doom-hide-modeline-mode' to fix this." - (when doom-hide-modeline-mode - (doom-hide-modeline-mode -1) - (doom-hide-modeline-mode +1))) - - ;; ;; Modeline library ;; @@ -217,6 +175,10 @@ DEFAULT is non-nil, set the default mode-line for all buffers." :commands (hs-minor-mode hs-toggle-hiding hs-already-hidden-p) :config (setq hs-hide-comments-when-hiding-all nil)) +(def-package! hide-mode-line + :commands hide-mode-line-mode + :init (add-hook 'completion-list-mode-hook #'hide-mode-line-mode)) + (def-package! highlight-indentation :commands (highlight-indentation-mode highlight-indentation-current-column-mode)) @@ -507,8 +469,6 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) -;; no modeline in completion popups -(add-hook 'completion-list-mode-hook #'doom-hide-modeline-mode) ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) diff --git a/core/packages.el b/core/packages.el index a6b3292c4..8b66296d0 100644 --- a/core/packages.el +++ b/core/packages.el @@ -8,6 +8,7 @@ ;; core-ui.el (package! all-the-icons) (package! fringe-helper) +(package! hide-mode-line) (package! highlight-indentation) (package! highlight-numbers) (unless (boundp 'display-line-numbers) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index 7865412e2..c607b2898 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -31,7 +31,7 @@ (when (featurep 'solaire-mode) (add-hook 'cfw:calendar-mode-hook #'solaire-mode)) - (add-hook 'cfw:calendar-mode-hook 'doom-hide-modeline-mode) + (add-hook 'cfw:calendar-mode-hook 'hide-mode-line-mode) (advice-add #'cfw:render-button :override #'+calendar*cfw:render-button)) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 844d08fca..bbbd6e32c 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -235,12 +235,12 @@ disabled." (cond ((eq modeline 't)) ((or (eq modeline 'nil) (not modeline)) - (doom-hide-modeline-mode +1)) + (hide-mode-line-mode +1)) ((symbolp modeline) - (when-let* ((doom--modeline-format (doom-modeline modeline))) - (doom-hide-modeline-mode +1))))) - (when doom-hide-modeline-mode - (doom-hide-modeline-mode -1)))) + (when-let* ((hide-mode-line-format (doom-modeline modeline))) + (hide-mode-line-mode +1))))) + (when hide-mode-line-mode + (hide-mode-line-mode -1)))) ;;;###autoload (defun +popup|close-on-escape () diff --git a/modules/lang/org/autoload/org-present.el b/modules/lang/org/autoload/org-present.el index 61ca7216d..45b31011f 100644 --- a/modules/lang/org/autoload/org-present.el +++ b/modules/lang/org/autoload/org-present.el @@ -53,7 +53,7 @@ (when (fboundp 'centered-window-mode) (centered-window-mode arg)) (window-divider-mode (* arg -1)) - (doom-hide-modeline-mode arg) + (hide-mode-line-mode arg) (+org-pretty-mode arg) (cond (org-tree-slide-mode (org-indent-mode -1) From 01f9ca9e6709ecdff17d0c74a03525e2efbdb384 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 17:42:19 -0500 Subject: [PATCH 0587/4235] Ensure (if|when)-let* are available to the byte-compiler This fixes void function errors in earlier versions of Emacs while byte-compiling Doom. --- core/core-lib.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 71b7cc71d..b64c546a6 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -5,10 +5,11 @@ (require 'cl-lib) (require 'map)) -(when (version< emacs-version "26") - (with-no-warnings - (defalias 'if-let* #'if-let) - (defalias 'when-let* #'when-let))) +(eval-and-compile + (when (version< emacs-version "26") + (with-no-warnings + (defalias 'if-let* #'if-let) + (defalias 'when-let* #'when-let)))) ;; From 04257245711865fa872e4507746d07c1c8bf0bfe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 17:45:15 -0500 Subject: [PATCH 0588/4235] Major rewrite of doom module API + Fix #446, where the .local/packages.el cache was generated with a faulty load-path. + Entries in the doom-modules hash table are now plists, containing :flags and :path, at least. + Add doom-initialize-modules for loading module config.el files. + Add doom-module-get for accessing this plist, e.g. (doom-module-get :some module) ; returns plist (doom-module-get :some module :flags) ; return specific property + Replace doom-module-enable with doom-module-set, e.g. (doom-module-set :some module :flags '(+a +b +c)) + Remove doom-module-flags (use doom-module-get instead) + Rename doom-module-enabled-p with doom-module-p + Replace doom-module-path with doom-module-find-path and doom-module-expand-file. The former will search for an existing module or file in doom-modules-dirs. The latter will expand the path from whatever path is stored in doom-modules. + Replace doom-module-paths with doom-module-load-path + Changed doom! to allow for nested doom! calls by delaying the loading of module config.el files until as late as possible. + Refactor doom-initialize-packages to only ihitialize package state (i.e. doom-packages, package-alist, and quelpa-cache), rather than its previous behavior of loading all Doom files (and sometimes all module files). This is faster and more predictable. --- Makefile | 6 +- core/autoload/debug.el | 2 +- core/autoload/help.el | 4 +- core/autoload/packages.el | 11 +- core/autoload/test.el | 88 +++---- core/core-packages.el | 493 ++++++++++++++++++++++---------------- core/core.el | 29 +-- 7 files changed, 351 insertions(+), 282 deletions(-) diff --git a/Makefile b/Makefile index fb0d81afa..fcd980f87 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Ensure emacs always runs from this makefile's PWD -EMACS_FLAGS=--eval '(setq user-emacs-directory default-directory)' -l core/core.el +EMACS_FLAGS=--eval '(setq user-emacs-directory default-directory)' -l init.el EMACS=emacs --quick --batch $(EMACS_FLAGS) EMACSI=emacs -q $(EMACS_FLAGS) @@ -71,9 +71,9 @@ testi: init.el .local/autoloads.el ## Utility tasks -# Runs Emacs from a different folder than ~/.emacs.d +# Runs Emacs from a different folder than ~/.emacs.d; only use this for testing! run: - @$(EMACSI) -l init.el + @$(EMACSI) --eval "(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)" # Diagnoses potential OS/environment issues doctor: diff --git a/core/autoload/debug.el b/core/autoload/debug.el index b72777d2b..7937a1ede 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -120,7 +120,7 @@ ready to be pasted in a bug report on github." if (or (not cat) (not (eq cat (car key)))) do (setq cat (car key)) and collect cat else collect - (let ((flags (doom-module-flags cat (cdr key)))) + (let ((flags (doom-module-get cat (cdr key) :flags))) (if (equal flags '(t)) (cdr key) (list (cdr key) flags)))) diff --git a/core/autoload/help.el b/core/autoload/help.el index 877ae0bf5..aac15d8d0 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -95,9 +95,9 @@ in, or d) the module associated with the current major mode (see nil t module)))) (cl-destructuring-bind (category submodule) (mapcar #'intern (split-string module " ")) - (unless (doom-module-enabled-p category submodule) + (unless (doom-module-p category submodule) (error "'%s' isn't a valid module" module)) - (let ((doc-path (expand-file-name "README.org" (doom-module-path category submodule)))) + (let ((doc-path (doom-module-expand-file category submodule "README.org"))) (unless (file-exists-p doc-path) (error "There is no documentation for this module")) (find-file doc-path)))) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 6b5b04648..17a5b3241 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -3,10 +3,9 @@ (load! cache) (require 'use-package) (require 'quelpa) +(require 'package) (require 'async) -(doom-initialize-packages) - ;;;###autoload (defun doom-refresh-packages (&optional force-p) "Refresh ELPA packages." @@ -113,7 +112,7 @@ Warning: this function is expensive; it re-evaluates all of doom's config files. Be careful not to use it in a loop. If INSTALLED-ONLY-P, only return packages that are installed." - (doom-initialize-packages t) + (doom-initialize-packages 'internal) (cl-loop with packages = (append doom-core-packages (mapcar #'car doom-packages)) for sym in (cl-delete-duplicates packages) if (and (or (not installed-only-p) @@ -146,7 +145,7 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom//packages-update'." - (doom-initialize-packages t) + (doom-initialize-packages 'internal) (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages @@ -184,7 +183,7 @@ Used by `doom//packages-update'." depended on. Used by `doom//packages-autoremove'." - (doom-initialize-packages t) + (doom-initialize-packages 'internal) (let ((package-selected-packages (append (mapcar #'car doom-packages) doom-core-packages))) (append (package--removable-packages) @@ -204,7 +203,7 @@ If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. Used by `doom//packages-install'." - (doom-initialize-packages t) + (doom-initialize-packages 'internal) (cl-loop for desc in (doom-get-packages) for (name . plist) = desc if (and (or include-ignored-p diff --git a/core/autoload/test.el b/core/autoload/test.el index 7e3ef9f7a..3cdb91bea 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -8,52 +8,52 @@ command line args following a double dash (each arg should be in the If neither is available, run all tests in all enabled modules." (interactive) - ;; ensure DOOM is initialized - (doom-initialize-packages t) - (condition-case-unless-debug ex - (let ((target-paths - ;; Convert targets (either from MODULES or `argv') into a list of - ;; string paths, pointing to the root directory of modules - (cond ((string= (car argv) "--") ; command line - (save-match-data - (cl-loop for arg in (cdr argv) - if (equal arg "core") collect doom-core-dir - else if (string-match-p "/" arg) - nconc (cl-loop for dir in doom-modules-dirs - collect (expand-file-name arg dir)) - else - nconc (cl-loop for dir in doom-modules-dirs - for path = (expand-file-name arg dir) - if (file-directory-p path) - nconc - (cl-remove-if-not - #'file-directory-p - (directory-files path t "^[^.]" t))) - finally do (setq argv nil)))) + (let ((doom-modules (make-hash-table :test #'equal))) + ;; ensure DOOM is initialized + (doom-initialize-packages t) + (condition-case-unless-debug ex + (let ((target-paths + ;; Convert targets (either from MODULES or `argv') into a list of + ;; string paths, pointing to the root directory of modules + (cond ((string= (car argv) "--") ; command line + (save-match-data + (cl-loop for arg in (cdr argv) + if (equal arg "core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (cl-loop for dir in doom-modules-dirs + collect (expand-file-name arg dir)) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc + (cl-remove-if-not + #'file-directory-p + (directory-files path t "^[^.]" t))) + finally do (setq argv nil)))) - (modules ; cons-cells given to MODULES - (cl-loop for (module . submodule) in modules - if (doom-module-path module submodule) - collect it)) + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-find-path module submodule) + collect it)) - ((let (noninteractive) - (setq doom-modules (clrhash doom-modules)) - (load (expand-file-name "init.test.el" user-emacs-directory) nil t) - (append (list doom-core-dir) (doom-module-paths))))))) - ;; Load all the unit test files... - (dolist (path target-paths) - (let ((test-path (expand-file-name "test/" path))) - (when (file-directory-p test-path) - (dolist (test-file (reverse (doom-packages--files test-path "\\.el$"))) - (load test-file nil :noerror))))) - ;; ... then run them - (if noninteractive - (ert-run-tests-batch-and-exit) - (call-interactively #'ert-run-tests-interactively))) - ('error - (lwarn 'doom-test :error - "%s -> %s" - (car ex) (error-message-string ex))))) + ((let (noninteractive) + (load (expand-file-name "init.test.el" user-emacs-directory) nil t) + (append (list doom-core-dir) (doom-module-load-path))))))) + ;; Load all the unit test files... + (dolist (path target-paths) + (let ((test-path (expand-file-name "test/" path))) + (when (file-directory-p test-path) + (dolist (test-file (reverse (doom-packages--files test-path "\\.el$"))) + (load test-file nil :noerror))))) + ;; ... then run them + (if noninteractive + (ert-run-tests-batch-and-exit) + (call-interactively #'ert-run-tests-interactively))) + ('error + (lwarn 'doom-test :error + "%s -> %s" + (car ex) (error-message-string ex)))))) ;; --- Test helpers ----------------------- diff --git a/core/core-packages.el b/core/core-packages.el index 62c0dd4b9..94e5fe572 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -90,8 +90,11 @@ missing) and shouldn't be deleted.") (defvar doom--refreshed-p nil) (defvar doom--current-module nil) +(defvar doom--initializing nil) +(defvar generated-autoload-load-name) -(setq package--init-file-ensured t +(setq autoload-compute-prefixes nil + package--init-file-ensured t package-user-dir (expand-file-name "elpa" doom-packages-dir) package-enable-at-startup nil package-archives @@ -124,24 +127,36 @@ missing) and shouldn't be deleted.") byte-compile-verbose doom-debug-mode byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local)) +(defun doom-packages--benchmark () + (format "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-site-load-path)) + (hash-table-size doom-modules) + (or doom-init-time + (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) + ;; -;; Bootstrap function +;; Bootstrap API ;; (defun doom-initialize (&optional force-p) - "Initialize package.el, create all the essential directories, and ensure core -packages are installed. + "Bootstrap the bare essentials to get Doom running, if it hasn't already. If +FORCE-P is non-nil, do it anyway. -If you byte-compile core/core.el, this function will be avoided to speed up -startup." +1. Ensures all the essential directories exist, +2. Ensures core packages are installed, +3. Loads your autoloads file in `doom-autoload-file', +4. Builds and caches `load-path' and `Info-directory-list' in `doom-packages-file'" ;; Called early during initialization; only use native (and cl-lib) functions! (when (or force-p (not doom-init-p)) (unless (load doom-autoload-file t t t) (unless noninteractive (error "No autoloads file! Run make autoloads"))) - (when (or (not (load doom-packages-file t t t)) - force-p) + (when (or force-p (not (load doom-packages-file t t t))) + (setq load-path doom-site-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) @@ -166,12 +181,13 @@ startup." (message "✓ Installed %s" package) (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) - (with-temp-buffer - (cl-pushnew doom-core-dir load-path :test #'string=) - (prin1 `(setq load-path ',load-path - Info-directory-list ',Info-directory-list) - (current-buffer)) - (write-file doom-packages-file))) + (unless noninteractive + (with-temp-buffer + (cl-pushnew doom-core-dir load-path :test #'string=) + (prin1 `(setq load-path ',load-path + Info-directory-list ',Info-directory-list) + (current-buffer)) + (write-file doom-packages-file)))) (setq doom-init-p t))) (defun doom-initialize-autoloads () @@ -180,15 +196,25 @@ startup." (unless (file-exists-p doom-autoload-file) (quiet! (doom//reload-autoloads)))) -(defun doom-initialize-packages (&optional force-p load-p) - "Crawls across your emacs.d to fill `doom-modules' (from init.el), -`doom-packages' (from packages.el files) and `quelpa-cache'. If they aren't set -already. Also runs every enabled module's init.el. +(defun doom-initialize-modules () + "Bootstraps all enabled modules by loading their config.el files." + (maphash (lambda (key plist) + (let ((doom--current-module key)) + (load (expand-file-name "config" (plist-get plist :path)) + 'noerror (not doom-debug-mode)))) + doom-modules)) -If FORCE-P is non-nil, do it even if they are. +(defun doom-initialize-packages (&optional force-p) + "Ensures that `doom-packages', `packages-alist' and `quelpa-cache' are +populated. -This aggressively reloads core autoload files." - (doom-initialize force-p) +This reads modules' packages.el files, runs `package-initialize', and +initializes quelpa, if they haven't already. If FORCE-P is non-nil, do it +anyway. + +Use this before any of package.el, quelpa or Doom's package management's API to +ensure all the necessary package metadata is initialized and available for +them." (with-temp-buffer ; prevent buffer-local settings from propagating (cl-flet ((_load @@ -196,48 +222,109 @@ This aggressively reloads core autoload files." (condition-case-unless-debug ex (let ((load-prefer-newer t) (noninteractive (not interactive))) - (load file noerror :nomessage :nosuffix)) + (load file noerror 'nomessage 'nosuffix)) ('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 (clrhash doom-modules) - doom-packages nil) - (_load (concat doom-core-dir "core.el") nil 'interactive) - (_load (expand-file-name "init.el" doom-emacs-dir)) - (when load-p - (mapc #'_load (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))) - (_load (expand-file-name "init.el" doom-emacs-dir) nil 'interactive))) + ;; package.el and quelpa handle themselves if their state changes during + ;; the current session, but if you change an packages.el file in a module, + ;; there's no non-trivial way to detect that, so we give you a way to + ;; reload only doom-packages. + (when (eq force-p 'internal) + (setq force-p nil + doom-packages nil)) + + ;; `doom-packages' (when (or force-p (not doom-packages)) - (require 'quelpa) - (setq doom-packages nil - quelpa-initialized-p nil) - (quelpa-setup-p) + (setq doom-packages nil) (_load (expand-file-name "packages.el" doom-core-dir)) (cl-loop for key being the hash-keys of doom-modules - if (doom-module-path (car key) (cdr key) "packages.el") - do (let ((doom--current-module key)) (_load it))) + for path = (doom-module-expand-file (car key) (cdr key) "packages.el") + if (file-exists-p path) + do (let ((doom--current-module key)) (_load path))) (cl-loop for dir in doom-psuedo-module-dirs for path = (expand-file-name "packages.el" dir) if (file-exists-p path) - do (_load path)))))) + do (_load path))) -(defun doom-module-path (module submodule &optional file root) + ;; `package-alist' + (when (or force-p (not (bound-and-true-p package-alist))) + (setq load-path doom-site-load-path) + (require 'package) + (setq package-activated-list nil) + (package-initialize)) + + ;; `quelpa-cache' + (when (or force-p (not (bound-and-true-p quelpa-cache))) + (require 'quelpa) + (setq quelpa-initialized-p nil) + (or (quelpa-setup-p) + (error "Could not initialize quelpa")))))) + + +;; +;; Module API +;; + +(defun doom-module-p (module submodule) + "Returns t if MODULE SUBMODULE is enabled (ie. present in `doom-modules')." + (and (hash-table-p doom-modules) + (gethash (cons module submodule) doom-modules) + t)) + +(defun doom-module-get (module submodule &optional property) + "Returns the plist for MODULE/SUBMODULE. If PROPERTY is set, get its property." + (when-let* ((plist (gethash (cons module submodule) doom-modules))) + (if property + (plist-get plist property) + plist))) + +(defun doom-module-put (module submodule property value) + "TODO" + (when-let* ((plist (doom-module-get module submodule))) + (puthash (cons module submodule) + (plist-put plist property value) + doom-modules))) + +(defun doom-module-set (module submodule &rest plist) + "Adds MODULE and SUBMODULE to `doom-modules' and sets its plist to PLIST, +which should contain a minimum of :flags and :path. + +MODULE is a keyword, SUBMODULE is a symbol, PLIST is a plist that accepts the +following properties: + + :flags [SYMBOL LIST] list of enabled module flags + :path [STRING] path to module root directory + +Example: + + (doom-module-set :lang 'haskell :flags '(+intero)) + +Used by `require!'." + (when plist + (let ((old-plist (doom-module-get module submodule))) + (unless (plist-member plist :flags) + (plist-put plist :flags (plist-get old-plist :flags))) + (unless (plist-member plist :path) + (plist-put plist :path (or (plist-get old-plist :path) + (doom-module-find-path module submodule)))))) + (let ((key (cons module submodule))) + (puthash key plist doom-modules))) + +(defun doom-module-find-path (module submodule &optional file) "Get the full path to a module: e.g. :lang emacs-lisp maps to ~/.emacs.d/modules/lang/emacs-lisp/ and will append FILE if non-nil." (when (keywordp module) (setq module (substring (symbol-name module) 1))) (when (symbolp submodule) (setq submodule (symbol-name submodule))) - (if root - (expand-file-name (concat "modules/" module "/" submodule "/" file) root) - (cl-loop for default-directory in doom-modules-dirs - for path = (concat module "/" submodule "/" file) - if (file-exists-p path) - return (expand-file-name path)))) + (cl-loop for default-directory in doom-modules-dirs + for path = (concat module "/" submodule "/" file) + if (file-exists-p path) + return (expand-file-name path))) (defun doom-module-from-path (&optional path) "Get module cons cell (MODULE . SUBMODULE) for PATH, if possible." @@ -250,53 +337,24 @@ This aggressively reloads core autoload files." (cons (intern (concat ":" module)) (intern submodule))))))) -(defun doom-module-paths (&optional append-file) +(defun doom-module-expand-file (module submodule &optional file) + "Like `expand-file-name', but expands FILE relative to MODULE (keywordp) and +SUBMODULE (symbol)" + (let ((path (doom-module-get module submodule :path))) + (if file + (expand-file-name file path) + path))) + +(defun doom-module-load-path () "Returns a list of absolute file paths to activated modules, with APPEND-FILE added, if the file exists." - (append (cl-loop for key being the hash-keys of doom-modules - if (doom-module-path (car key) (cdr key) append-file) - collect it) + (append (cl-loop for plist being the hash-values of doom-modules + collect (plist-get plist :path)) (cl-remove-if-not #'file-directory-p doom-psuedo-module-dirs))) -(defun doom-module-flags (module submodule) - "Returns a list of flags provided for MODULE SUBMODULE." - (gethash (cons module submodule) doom-modules)) - -(defun doom-module-enabled-p (module submodule) - "Returns t if MODULE SUBMODULE is enabled (ie. present in `doom-modules')." - (and (hash-table-p doom-modules) - (doom-module-flags module submodule) - t)) - -(defun doom-module-enable (module submodule &optional flags) - "Adds MODULE and SUBMODULE to `doom-modules', overwriting it if it exists. - -MODULE is a keyword, SUBMODULE is a symbol, FLAGS is a list of arbitrary -symbols: - - (doom-module-enable :lang 'haskell '(+intero)) - -Used by `require!' and `depends-on!'." - (let ((key (cons module submodule))) - (puthash key - (or (doom-enlist flags) - (gethash key doom-modules) - '(t)) - doom-modules))) - -(defun doom-packages--benchmark () - (format "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-site-load-path)) - (hash-table-size doom-modules) - (or doom-init-time - (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) - ;; -;; Macros +;; Module config macros ;; (autoload 'use-package "use-package" nil nil 'macro) @@ -305,7 +363,7 @@ Used by `require!' and `depends-on!'." "Bootstraps DOOM Emacs and its modules. MODULES is an malformed plist of modules to load." - (let (init-forms config-forms module file-name-handler-alist) + (let (load-forms module file-name-handler-alist) (let ((modules-dir (expand-file-name "modules/" (file-name-directory (or load-file-name byte-compile-current-file))))) (cl-pushnew modules-dir doom-modules-dirs :test #'string=) @@ -314,17 +372,19 @@ MODULES is an malformed plist of modules to load." ((not module) (error "No namespace specified in `doom!' for %s" m)) ((let ((submodule (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) - (doom-module-enable module submodule flags) - (let ((path (doom-module-path module submodule)) - (mod `(doom--current-module ',(cons module submodule)))) - (push `(let (,mod) (load! init ,path t)) init-forms) - (push `(let (,mod) (load! config ,path t)) config-forms)))))) + (let ((path (doom-module-find-path module submodule))) + (doom-module-set module submodule :flags flags :path path) + (push `(let ((doom--current-module ',(cons module submodule))) + (load! init ,path t)) + load-forms)))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules doom-modules-dirs ',doom-modules-dirs) - ,@(nreverse init-forms) - (push '(lambda () ,@(nreverse config-forms)) - doom--delayed-modules))))) + (let ((doom--initializing t)) + ,@(nreverse load-forms)) + ,(unless doom--initializing + '(unless noninteractive + (doom-initialize-modules))))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." @@ -396,26 +456,29 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." (unless noerror (error "Could not load file '%s' from '%s'" file path)))))) -(defmacro require! (module submodule &optional flags reload-p) +(defmacro require! (module submodule &optional flags path reload-p) "Loads the module specified by MODULE (a property) and SUBMODULE (a symbol). The module is only loaded once. If RELOAD-P is non-nil, load it again." - (when (or reload-p (not (doom-module-enabled-p module submodule))) - (let ((module-path (doom-module-path module submodule))) - (when (hash-table-p doom-modules) - (doom-module-enable module submodule flags)) - (if (file-directory-p module-path) - `(condition-case-unless-debug ex - (let ((doom--current-module ',(cons module submodule))) - (load! init ,module-path :noerror) - (load! config ,module-path :noerror)) - ('error - (lwarn 'doom-modules :error - "%s in '%s %s' -> %s" - (car ex) ,module ',submodule - (error-message-string ex)))) - (warn 'doom-modules :warning "Couldn't find module '%s %s'" - module submodule))))) + (let ((enabled-p (doom-module-p module submodule))) + (when (or reload-p (not enabled-p)) + (if (not enabled-p) + (doom-module-set module submodule :flags flags :path path) + (if flags (doom-module-put module submodule :flags flags)) + (if path (doom-module-put module submodule :path path))) + (let ((module-path (doom-module-expand-file module submodule))) + (if (file-directory-p module-path) + `(condition-case-unless-debug ex + (let ((doom--current-module ',(cons module submodule))) + (load! init ,module-path :noerror) + (load! config ,module-path :noerror)) + ('error + (lwarn 'doom-modules :error + "%s in '%s %s' -> %s" + (car ex) ,module ',submodule + (error-message-string ex)))) + (warn 'doom-modules :warning "Couldn't find module '%s %s'" + module submodule)))))) (defmacro featurep! (module &optional submodule flag) "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if @@ -439,12 +502,12 @@ omitted. eg. (featurep! +flag1)" module (car module-pair) submodule (cdr module-pair)))) (if flag - (and (memq flag (doom-module-flags module submodule)) t) - (doom-module-enabled-p module submodule))) + (and (memq flag (doom-module-get module submodule :flags)) t) + (doom-module-p module submodule))) ;; -;; Declarative macros +;; Module package macros ;; (defmacro package! (name &rest plist) @@ -483,15 +546,18 @@ Accepts the following properties: ,(if (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) (map-put doom-packages ',name ',plist)))) -(defmacro depends-on! (module submodule) +(defmacro depends-on! (module submodule &optional flags) "Declares that this module depends on another. Only use this macro in a module's packages.el file. MODULE is a keyword, and SUBMODULE is a symbol. Under the hood, this simply loads MODULE SUBMODULE's packages.el file." - (doom-module-enable module submodule) - `(load! packages ,(doom-module-path module submodule) t)) + `(let ((doom-modules ,doom-modules) + (flags ,flags)) + (when flags + (doom-module-put ,module ',submodule :flags flags)) + (load! packages ,(doom-module-find-path module submodule) t))) ;; @@ -558,42 +624,44 @@ This should be run whenever init.el or an autoload file is modified. Running ;; This function must not use autoloaded functions or external dependencies. ;; It must assume nothing is set up! (if (not noninteractive) - ;; This is done in another instance to protect the current session's - ;; state. `doom-initialize-packages' will have side effects otherwise. + ;; This is done in another instance to protect the current session's state + ;; in case this function has side effects. (progn (doom-packages--async-run 'doom//reload-autoloads) (load doom-autoload-file t nil t)) - (doom-initialize-packages t) - (let ((targets + (let ((default-directory doom-emacs-dir) + (targets (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir)))) - (dolist (path (append doom-psuedo-module-dirs (doom-module-paths))) + (dolist (path (doom-module-load-path)) (let ((auto-dir (expand-file-name "autoload" path)) (auto-file (expand-file-name "autoload.el" path))) (when (file-exists-p auto-file) - (push (file-truename auto-file) targets)) + (push auto-file targets)) (when (file-directory-p auto-dir) (dolist (file (doom-packages--files auto-dir "\\.el$")) - (push (file-truename file) targets))))) + (push file targets))))) (when (file-exists-p doom-autoload-file) (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")) - (if (file-in-directory-p file doom-emacs-dir) - (file-relative-name file doom-emacs-dir) - (abbreviate-file-name file)))) + (message "Generating new autoloads.el") + (dolist (file (mapcar #'file-truename (reverse targets))) + (let ((generated-autoload-load-name file)) + (message + (cond ((not (doom-packages--read-if-cookies file)) + "⚠ Ignoring %s") + ((update-file-autoloads file nil doom-autoload-file) + "✕ Nothing in %s") + ("✓ Scanned %s")) + (if (file-in-directory-p file default-directory) + (file-relative-name file) + (abbreviate-file-name file))))) (make-directory (file-name-directory doom-autoload-file) t) (let ((buf (find-file-noselect doom-autoload-file t)) (load-path (append (list doom-emacs-dir) doom-psuedo-module-dirs - doom-modules-dirs)) + doom-modules-dirs + load-path)) current-sexp) (unwind-protect (condition-case-unless-debug ex @@ -604,17 +672,18 @@ This should be run whenever init.el or an autoload file is modified. Running (nth 3 (syntax-ppss))) ;; Replace autoload paths with absolute paths for faster ;; resolution during load and simpler `load-path' - (when (eq (sexp-at-point) 'autoload) + (when (memq (sexp-at-point) '(autoload custom-autoload)) (save-excursion (forward-sexp 2) (let ((pt (point))) (forward-sexp 1) (when-let* ((sexp (thing-at-point 'sexp t)) (path (eval (read sexp) t))) - (delete-region pt (point)) - (if-let* ((lib (locate-library path))) - (insert " \"" (file-name-sans-extension lib) "\"") - (warn "Couldn't find absolute path for: %s" path)))))) + (when (and (stringp path) (not (file-name-absolute-p path))) + (delete-region pt (point)) + (if-let* ((lib (locate-library path))) + (insert " \"" (file-name-sans-extension lib) "\"") + (warn "Couldn't find absolute path for: %s" path))))))) ;; Run each form in autoloads to see if there are any ;; errors. We do it piecemeal because that will tell us ;; more about where the issue originated. @@ -624,7 +693,7 @@ This should be run whenever init.el or an autoload file is modified. Running (eval current-sexp t)) (forward-char))) (save-buffer) - (message "Finished generating autoloads.el!")) + (message "Done!")) ('error (delete-file doom-autoload-file) (error "Error in autoloads.el: (%s %s ...) %s -- %s" @@ -651,21 +720,32 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (interactive (list nil current-prefix-arg)) (let ((default-directory doom-emacs-dir) - (recompile-p (or recompile-p - (and (member "-r" (cdr argv)) t)))) + (recompile-p (or recompile-p (and (member "-r" (cdr argv)) t)))) (if (not noninteractive) ;; This is done in another instance to protect the current session's - ;; state. `doom-initialize-packages' will have side effects otherwise. + ;; state, because this function has side effects. (doom-packages--async-run 'doom//byte-compile) (let ((total-ok 0) (total-fail 0) (total-noop 0) (modules (or modules (cdr argv))) compile-targets) - (doom-initialize-packages t t) + ;; Ensure that Doom has been fully loaded, some of its state may be + ;; pertinent to files compiled later. + (let (noninteractive) + ;; Core libraries aren't fully loaded in a noninteractive session, so + ;; we reload it with `noninteractive' set to nil to force them to. + (load (expand-file-name "core.el" doom-core-dir) nil t t) + ;; In case autoloads.el hasn't been properly generated at this point. + (dolist (file (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))) + (load file t t t))) + (doom-initialize-modules) + ;; Assemble el files we want to compile; taking into account that + ;; MODULES may be a list of MODULE/SUBMODULE strings from the command + ;; line. (setq compile-targets (cl-loop for target - in (or modules (append (list doom-core-dir) (doom-module-paths))) + in (or modules (append (list doom-core-dir) (doom-module-load-path))) if (equal target "core") nconc (nreverse (doom-packages--files doom-core-dir "\\.el$")) else if (file-directory-p target) @@ -674,54 +754,54 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." nconc (nreverse (doom-packages--files it "\\.el$")) else if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" target) nconc (nreverse (doom-packages--files - (doom-module-path (intern (format ":%s" (match-string 1 target))) - (intern (match-string 2 target))) + (doom-module-find-path + (intern (format ":%s" (match-string 1 target))) + (intern (match-string 2 target))) "\\.el$")) else if (file-exists-p target) collect target finally do (setq argv nil))) (unless compile-targets (error "No targets to compile")) - (let ((use-package-expand-minimally t)) - (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) - (condition-case ex - (progn - (dolist (target (cl-delete-duplicates compile-targets :test #'string= :key #'file-truename)) - (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 (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (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)"))))))))) + (condition-case ex + (let ((use-package-expand-minimally t)) + (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'string=)) + (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 (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (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. @@ -752,24 +832,23 @@ If RECOMPILE-P is non-nil, only recompile out-of-date core files." "Delete all the compiled elc files in your Emacs configuration. This excludes compiled packages.'" (interactive) - (ignore-errors (doom-initialize-packages t)) - (let ((targets - (append (list (expand-file-name "init.elc" doom-emacs-dir)) - (doom-packages--files doom-core-dir "\\.elc$") - (cl-loop for dir in (append doom-modules-dirs doom-psuedo-module-dirs) - if (file-directory-p dir) - nconc (doom-packages--files dir "\\.elc$")))) - (default-directory doom-emacs-dir)) - (unless (cl-loop for path in targets - if (file-exists-p path) - collect path - and do (delete-file path) - and do - (message "✓ Deleted %s" - (if (file-in-directory-p path doom-emacs-dir) - (file-relative-name path) - (abbreviate-file-name path)))) - (message "Everything is clean")))) + (unless + (cl-loop with default-directory = doom-emacs-dir + for path + in (append (file-expand-wildcards "*.elc" t) + (doom-packages--files doom-core-dir "\\.elc$") + (cl-loop for dir in (doom-module-load-path) + nconc (doom-packages--files dir "\\.elc$"))) + for truepath = (file-truename path) + if (file-exists-p truepath) + collect path + and do (delete-file truepath) + and do + (message "✓ Deleted %s" + (if (file-in-directory-p truepath default-directory) + (file-relative-name truepath) + (abbreviate-file-name path)))) + (message "Everything is clean"))) ;; diff --git a/core/core.el b/core/core.el index bb56cddd9..f4d7bcc9c 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 (file-truename user-emacs-directory) +(defvar doom-emacs-dir (eval-when-compile (file-truename user-emacs-directory)) "The path to this emacs.d directory.") (defvar doom-core-dir (concat doom-emacs-dir "core/") @@ -119,8 +119,6 @@ Use this for essential functionality.") "A list of hooks run after DOOM initialization is complete, and after `doom-init-hook'. Use this for extra, non-essential functionality.") -(defvar doom--delayed-modules nil) - (defun doom-try-run-hook (fn hook) "Runs a hook wrapped in a `condition-case-unless-debug' block; its objective is to include more information in the error message, without sacrificing your @@ -159,35 +157,28 @@ ability to invoke the debugger in debug mode." (load! core-keybinds)) ; centralized keybind system + which-key (defun doom|after-init () - "Load the config.el file of all pending modules that have been enabled by a -recent `doom!' call. This should be attached to `after-init-hook'." - (mapc #'funcall (reverse doom--delayed-modules)) - (setq doom--delayed-modules nil)) - - (defun doom|after-startup () "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and display the loading benchmark." - (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)) - (when (display-graphic-p) - (require 'server) - (unless (server-running-p) - (server-start))) - (message "%s" (doom-packages--benchmark)))) + (dolist (hook '(doom-init-hook doom-post-init-hook)) + (run-hook-wrapped hook #'doom-try-run-hook hook)) + (when (display-graphic-p) + (require 'server) + (unless (server-running-p) + (server-start)))) (defun doom|finalize () "Resets garbage collection settings to reasonable defaults (if you don't do this, you'll get stuttering and random freezes), and resets `file-name-handler-alist'." + (unless noninteractive + (message "%s" (doom-packages--benchmark))) (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) - (add-hook 'after-init-hook #'doom|after-init) - (add-hook 'emacs-startup-hook #'doom|after-startup)) + (add-hook 'emacs-startup-hook #'doom|after-init)) ;; From 45096c2ab64e104d8640aedbdd3f5e7f5b0652a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 18:47:04 -0500 Subject: [PATCH 0589/4235] lang/web: change counsel-css source (now on MELPA) --- modules/lang/web/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index b8e748133..226a2a2ec 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -6,7 +6,7 @@ (package! rainbow-mode) (package! web-beautify) (when (featurep! :completion ivy) - (package! counsel-css :recipe (:fetcher github :repo "hlissner/emacs-counsel-css"))) + (package! counsel-css)) ;; +html.el (package! emmet-mode) From 738f39d21a220e5498ef027c8b09a3b70b2569d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 19:55:03 -0500 Subject: [PATCH 0590/4235] Change how shell env is injected #449 Changes the behavior of the :env setting to fetch the shell variables immediately on call. --- core/core-os.el | 6 +++--- modules/lang/go/config.el | 11 +++++++---- modules/lang/python/config.el | 3 +-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index d1f171604..61af0b29d 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -37,12 +37,12 @@ ;; Emacs picks up. `exec-path-from-shell' fixes this. (when (require 'exec-path-from-shell nil t) (def-setting! :env (&rest vars) - "Ensure VARs are grabbed from your shell environment." - `(nconc exec-path-from-shell-variables (list ,@vars))) + "Inject VARS from your shell environment into Emacs." + `(exec-path-from-shell-copy-env (list ,@vars))) (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) - (add-hook 'emacs-startup-hook #'exec-path-from-shell-initialize))) + (exec-path-from-shell-initialize))) ((require 'osx-clipboard nil t) (osx-clipboard-mode +1)))) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index d9a0d040f..e88880569 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -1,20 +1,23 @@ ;;; lang/go/config.el -*- lexical-binding: t; -*- -(set! :env "GOPATH" "GOROOT") +;; +;; Plugins +;; (def-package! go-mode :mode "\\.go$" :interpreter "go" :config - (when (executable-find "goimports") - (setq gofmt-command "goimports")) - + (set! :env "GOPATH" "GOROOT") (set! :repl 'go-mode #'gorepl-run) (set! :lookup 'go-mode :definition #'go-guru-definition :references #'go-guru-referrers :documentation #'godoc-at-point) + (when (executable-find "goimports") + (setq gofmt-command "goimports")) + (setq gofmt-show-errors nil) ; Leave it to flycheck (add-hook 'go-mode-hook #'flycheck-mode) (add-hook! go-mode diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 600554ad2..9d23a45a5 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,7 +1,5 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- -(set! :env "PYTHONPATH" "PYENV_ROOT") - (defvar +python-pyenv-root nil "The path to pyenv's root directory. This is automatically set when `python' is loaded.") @@ -26,6 +24,7 @@ is loaded.") :config (add-hook! 'python-mode-hook #'(flycheck-mode highlight-numbers-mode)) + (set! :env "PYTHONPATH" "PYENV_ROOT") (set! :company-backend 'python-mode '(company-anaconda)) (set! :electric 'python-mode :chars '(?:)) (set! :repl 'python-mode #'+python/repl) From 99f11415d2e5ce5b5b9bc978b7c92e7587a67a41 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 20:21:16 -0500 Subject: [PATCH 0591/4235] feature/evil: fix wrong-type-argument error when buffer-file-name is blank --- modules/feature/evil/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index c8f5ba68e..3fc4f0550 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -95,7 +95,9 @@ (defun +evil|save-buffer () "Shorter, vim-esque save messages." (message "\"%s\" %dL, %dC written" - (file-relative-name buffer-file-truename (doom-project-root)) + (if buffer-file-name + (file-relative-name (file-truename buffer-file-name) (doom-project-root)) + (buffer-name)) (count-lines (point-min) (point-max)) (buffer-size))) (setq save-silently t) From d5c799a53672a37a83bc71b555b930ff4db12f84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 20:45:37 -0500 Subject: [PATCH 0592/4235] Rewrite require! macro --- core/core-packages.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 94e5fe572..77d135801 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -456,20 +456,20 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." (unless noerror (error "Could not load file '%s' from '%s'" file path)))))) -(defmacro require! (module submodule &optional flags path reload-p) +(defmacro require! (module submodule &optional reload-p &rest plist) "Loads the module specified by MODULE (a property) and SUBMODULE (a symbol). The module is only loaded once. If RELOAD-P is non-nil, load it again." (let ((enabled-p (doom-module-p module submodule))) + (when (or (not enabled-p) plist) + (apply #'doom-module-set module submodule + (mapcar #'eval plist))) (when (or reload-p (not enabled-p)) - (if (not enabled-p) - (doom-module-set module submodule :flags flags :path path) - (if flags (doom-module-put module submodule :flags flags)) - (if path (doom-module-put module submodule :path path))) - (let ((module-path (doom-module-expand-file module submodule))) + (let ((module-path (doom-module-find-path module submodule))) (if (file-directory-p module-path) `(condition-case-unless-debug ex (let ((doom--current-module ',(cons module submodule))) + ;; ,(if plist `(doom-module-set ,module ',submodule ,@plist)) (load! init ,module-path :noerror) (load! config ,module-path :noerror)) ('error From 57efa1b8643db4784ade687ce08b10bad80fd480 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 20:46:45 -0500 Subject: [PATCH 0593/4235] Update & fix unit tests --- core/autoload/test.el | 7 +++++-- modules/completion/company/test/company.el | 3 --- modules/feature/evil/test/evil.el | 2 -- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 3cdb91bea..34427ca1a 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -10,7 +10,10 @@ If neither is available, run all tests in all enabled modules." (interactive) (let ((doom-modules (make-hash-table :test #'equal))) ;; ensure DOOM is initialized - (doom-initialize-packages t) + (let (noninteractive) + ;; Core libraries aren't fully loaded in a noninteractive session, so + ;; we reload it with `noninteractive' set to nil to force them to. + (load (expand-file-name "core.el" doom-core-dir) nil t t)) (condition-case-unless-debug ex (let ((target-paths ;; Convert targets (either from MODULES or `argv') into a list of @@ -18,7 +21,7 @@ If neither is available, run all tests in all enabled modules." (cond ((string= (car argv) "--") ; command line (save-match-data (cl-loop for arg in (cdr argv) - if (equal arg "core") collect doom-core-dir + if (string= arg "core") collect doom-core-dir else if (string-match-p "/" arg) nconc (cl-loop for dir in doom-modules-dirs collect (expand-file-name arg dir)) diff --git a/modules/completion/company/test/company.el b/modules/completion/company/test/company.el index 4f7244c14..5e4eadf3d 100644 --- a/modules/completion/company/test/company.el +++ b/modules/completion/company/test/company.el @@ -1,9 +1,6 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; completion/company/test/company.el -(require! :completion company) -(require 'company) - ;; (def-test! set-company-backend :minor-mode company-mode diff --git a/modules/feature/evil/test/evil.el b/modules/feature/evil/test/evil.el index 9cad36c70..525f4f153 100644 --- a/modules/feature/evil/test/evil.el +++ b/modules/feature/evil/test/evil.el @@ -1,8 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/evil/test/evil.el -(require! :feature evil) - ;; ;; `evil-ex-replace-special-filenames' (def-test! resolve-vim-path From a22d5f0bb472605c1950888f7e6466cff19c6ef0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 20:52:30 -0500 Subject: [PATCH 0594/4235] Fix error when package cache doesn't exist on reload-load-path --- 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 77d135801..ea93e8819 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -599,7 +599,8 @@ an Emacs session is running. This isn't necessary if you use Doom's package management commands because they call `doom//reload-load-path' remotely (through emacsclient)." (interactive) - (delete-file doom-packages-file) + (when (file-exists-p doom-packages-file) + (delete-file doom-packages-file)) (cond ((and noninteractive (not (daemonp))) (require 'server) (when (server-running-p) From 4b82c7b7db21910612b56e74e59c8c9bf7805049 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 21:59:10 -0500 Subject: [PATCH 0595/4235] Ensure doom is reinitialized properly after package management --- 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 ea93e8819..ed7a1e418 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -606,10 +606,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)))) - ((let ((noninteractive t)) - (doom-initialize t) - (message "%d packages reloaded" (length package-alist)) - (run-hooks 'doom-reload-hook))))) + (t + (doom-initialize t) + (message "%d packages reloaded" (length package-alist)) + (run-hooks 'doom-reload-hook)))) (defun doom//reload-autoloads () "Refreshes the autoloads.el file, specified by `doom-autoload-file'. From 128b11a8bc0855b69eff8a0a481d5117773a8d46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 22:31:06 -0500 Subject: [PATCH 0596/4235] Minor style/comment edits --- modules/completion/ivy/config.el | 2 +- modules/config/private/init.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 3861b192c..1057f456d 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -112,7 +112,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Removes character limit from `counsel-ag-function' ;; - ;; This may need to be updated frequently, to meet changes upstream + ;; This may need to be updated frequently, to meet changes upstream. ;; counsel-ag, counsel-rg and counsel-pt all use this function (advice-add #'counsel-ag-function :override #'+ivy*counsel-ag-function)) diff --git a/modules/config/private/init.el b/modules/config/private/init.el index 3081e37a3..da10d7b75 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -15,4 +15,4 @@ Doom Emacs.") ;; (load (expand-file-name "init.el" +private-config-path) - :noerror :nomessage)) + 'noerror 'nomessage)) From 9b0a2d222e411c61e539e1d18f653a9da03c9378 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 22:31:23 -0500 Subject: [PATCH 0597/4235] feature/file-templates: new :file-template setting --- modules/feature/file-templates/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 095cc1aab..a92e3dfb3 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -6,6 +6,14 @@ (expand-file-name "templates/" (file-name-directory load-file-name)) "The path to a directory of yasnippet folders to use for file templates.") +(def-setting! :file-template (regexp trigger mode &optional project-only-p) + "Register a file template (associated with TRIGGER, the uuid of the target +snippet) for empty files that match REGEXP in MODE (a major mode symbol). + +If PROJECT-ONLY-P is non-nil, the template won't be expanded if the buffer isn't +in a project." + `(+file-templates-add (list ,regexp ,trigger ,mode ,project-only-p))) + ;; ;; Plugins From c421f3de64fd487f470408585bfb885fbc0b361c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 22:32:15 -0500 Subject: [PATCH 0598/4235] lang/emacs-lisp: delay mode hooks in eval output buffer --- 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 795165eb7..05e3b6e96 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -24,7 +24,7 @@ to a pop up buffer." (read-only-mode +1) (erase-buffer) (setq-local scroll-margin 0) - (emacs-lisp-mode) + (delay-mode-hooks (emacs-lisp-mode)) (prin1 result buf) (pp-buffer) (setq lines (count-lines (point-min) (point-max))) From c6352f055dd9166214252bfdcda555e03658051e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 22:34:43 -0500 Subject: [PATCH 0599/4235] ui/doom-modeline: resize mode-line for doom-big-font-mode --- modules/ui/doom-modeline/autoload.el | 17 +++++++++++++++++ modules/ui/doom-modeline/config.el | 14 +++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 modules/ui/doom-modeline/autoload.el diff --git a/modules/ui/doom-modeline/autoload.el b/modules/ui/doom-modeline/autoload.el new file mode 100644 index 000000000..ddebf6a9b --- /dev/null +++ b/modules/ui/doom-modeline/autoload.el @@ -0,0 +1,17 @@ +;;; ui/doom-modeline/autoload.el -*- lexical-binding: t; -*- + +(defvar +doom-modeline--old-height nil) + +;;;###autoload +(defun +doom-modeline|resize-for-big-font () + "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was +made to be added to `doom-big-font-mode-hook'." + (if doom-big-font-mode + (let* ((font-size (font-get doom-font :size)) + (big-size (font-get doom-big-font :size)) + (ratio (/ (float big-size) font-size))) + (setq +doom-modeline--old-height +doom-modeline-height + +doom-modeline-height (ceiling (* +doom-modeline--old-height ratio)))) + (setq +doom-modeline-height +doom-modeline--old-height)) + (+doom-modeline|init)) + diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 1532b9197..e5f352e26 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -619,11 +619,12 @@ Returns \"\" to not break --no-window-system." (setq +doom-modeline--bar-active (+doom-modeline--make-xpm 'doom-modeline-bar) +doom-modeline--bar-inactive (+doom-modeline--make-xpm 'doom-modeline-inactive-bar)) - ;; These buffers are already created and don't get modelines. For the love of - ;; Emacs, someone give the man a modeline! - (dolist (bname '("*scratch*" "*Messages*")) - (with-current-buffer bname - (doom-set-modeline 'main)))) + (unless after-init-time + ;; These buffers are already created and don't get modelines. For the love + ;; of Emacs, someone give the man a modeline! + (dolist (bname '("*scratch*" "*Messages*")) + (with-current-buffer bname + (doom-set-modeline 'main))))) (defun +doom-modeline|set-special-modeline () (doom-set-modeline 'special)) @@ -647,3 +648,6 @@ Returns \"\" to not break --no-window-system." (add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) (add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) + +;; +(add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font) From 55fd9e2b17243fabb8389560f0505e9f5b1dd5ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 23:11:49 -0500 Subject: [PATCH 0600/4235] completion/helm: fix and update --- modules/completion/helm/config.el | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index e582d2b7d..219bc1071 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -10,7 +10,15 @@ ;; Packages ;; +(def-package! helm-mode + :hook (doom-init . helm-mode) + :config + ;; helm is too heavy for find-file-at-point + (add-to-list 'helm-completing-read-handlers-alist '(find-file-at-point . nil))) + + (def-package! helm + :after helm-mode :init (setq helm-quick-update t ;; Speedier without fuzzy matching @@ -31,18 +39,12 @@ helm-move-to-line-cycle-in-source t) :config - (add-hook 'doom-init-hook #'helm-mode) + (setq projectile-completion-system 'helm) (defvar helm-projectile-find-file-map (make-sparse-keymap)) (require 'helm-projectile) (set-keymap-parent helm-projectile-find-file-map helm-map) - ;; helm is too heavy for find-file-at-point - (after! helm-mode - (add-to-list 'helm-completing-read-handlers-alist '(find-file-at-point . nil))) - - (setq projectile-completion-system 'helm) - ;;; Helm hacks (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." @@ -57,6 +59,17 @@ (setq mode-line-format nil)) (advice-add #'helm-display-mode-line :override #'+helm*hide-header) + (defun +helm*hide-minibuffer-maybe () + "Hide minibuffer in Helm session if we use the header line as input field." + (when (with-helm-buffer helm-echo-input-in-header-line) + (let ((ov (make-overlay (point-min) (point-max) nil nil t))) + (overlay-put ov 'window (selected-window)) + (overlay-put ov 'face + (let ((bg-color (face-background 'default nil))) + `(:background ,bg-color :foreground ,bg-color))) + (setq-local cursor-type nil)))) + (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe) + (map! :map global-map [remap apropos] #'helm-apropos [remap find-file] #'helm-find-files @@ -107,6 +120,10 @@ helm-css-scss-split-with-multiple-windows t)) +(def-package! helm-for-files + :commands (helm-for-files helm-recentf helm-multi-files)) + + (def-package! helm-swoop ; https://github.com/ShingoFukuyama/helm-swoop :commands (helm-swoop helm-multi-swoop helm-multi-swoop-all) :config From e6aad90db5f4b606fdc0a079fd00ada6c2bfca27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Mar 2018 23:48:35 -0500 Subject: [PATCH 0601/4235] Don't display benchmark on doom//reload-load-path --- core/core.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/core.el b/core/core.el index f4d7bcc9c..b60dd0a09 100644 --- a/core/core.el +++ b/core/core.el @@ -161,17 +161,17 @@ ability to invoke the debugger in debug mode." display the loading benchmark." (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook)) - (when (display-graphic-p) - (require 'server) - (unless (server-running-p) - (server-start)))) + (unless noninteractive + (when (display-graphic-p) + (require 'server) + (unless (server-running-p) + (server-start))) + (message "%s" (doom-packages--benchmark)))) (defun doom|finalize () "Resets garbage collection settings to reasonable defaults (if you don't do this, you'll get stuttering and random freezes), and resets `file-name-handler-alist'." - (unless noninteractive - (message "%s" (doom-packages--benchmark))) (setq gc-cons-threshold 16777216 gc-cons-percentage 0.1 file-name-handler-alist doom--file-name-handler-alist) From 55b2a6df6892f3b6080419ee0e3ea305eccc1dcc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 02:59:21 -0500 Subject: [PATCH 0602/4235] Fix doom/forward-to-last-non-comment-or-eol when visual-line-mode is off #450 --- core/autoload/editor.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 57048a0db..54c7e9fae 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -51,7 +51,10 @@ beginning of the line. The opposite of "Jumps between the last non-blank, non-comment character in the line and the true end of the line. The opposite of `doom/backward-to-bol-or-indent'." (interactive) - (let ((eol (save-excursion (end-of-visual-line) (point)))) + (let ((eol (save-excursion (if visual-line-mode + (end-of-visual-line) + (end-of-line)) + (point)))) (if (and (sp-point-in-comment) (not (= (point) eol))) (goto-char eol) (let* ((bol (save-excursion (beginning-of-visual-line) (point))) From 74d8ea2b0fde43e1e71a26afeb29441a22c5299a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 03:02:17 -0500 Subject: [PATCH 0603/4235] New doom-demote-warnings option for suppress dependency warnings --- core/autoload/message.el | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 790981ffd..cebd66296 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -35,6 +35,11 @@ (strike . 9)) "List of styles.") +(defvar doom-demote-warnings nil + "If non-nil, Doom module warnings (the ones that pop up when you're missing a +dependency) will only log a message in *Messages* instead of opening a +*Warnings* window.") + ;;;###autoload (defun doom-ansi-apply (code message &rest args) "Apply the ansi CODE to formatted MESSAGE with ARGS." @@ -89,10 +94,16 @@ interactive session." return t) `(cl-destructuring-bind (cat . mod) (doom-module-from-path ,load-file-name) - (delay-warning (format "%s %s" cat mod) (format ,message ,@args) - :warning)) - `(delay-warning (file-relative-name load-file-name doom-emacs-dir) - (format ,message ,@args) :warning)))) + (if doom-demote-warnings + (message "WARNING (%s %s) %s" cat mod (format ,message ,@args)) + (delay-warning (format "%s %s" cat mod) (format ,message ,@args) + :warning))) + `(if doom-demote-warnings + (message "WARNING (%s) %s" + (file-relative-name load-file-name doom-emacs-dir) + (format ,message ,@args)) + (delay-warning (file-relative-name load-file-name doom-emacs-dir) + (format ,message ,@args) :warning))))) ;;;###autoload (defmacro log! (message &rest args) From 75cb7a3f0b0649675e83bb2c2009416c408c59c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 13:42:40 -0500 Subject: [PATCH 0604/4235] feature/snippets: fix backspace in snippet fields not deleting pairs --- modules/feature/snippets/autoload/snippets.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index f7aa07288..dd36f8520 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -28,7 +28,7 @@ (overlay-buffer yas--active-field-overlay) (overlay-get yas--active-field-overlay 'yas--field))))) (cond ((eq (point) (marker-position (yas--field-start field))) nil) - (t (delete-char -1))))) + (t (call-interactively #'delete-backward-char))))) ;;;###autoload (defun +snippets/delete-forward-char-or-field (&optional field) From 4dd6bcdc5ffa7eadd15f47ac38c9f4c59a016ca5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 13:43:20 -0500 Subject: [PATCH 0605/4235] lang/rust: rust-indent-method-chain = t --- modules/lang/rust/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index ba2039cd6..d2facf795 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -7,6 +7,7 @@ (def-package! rust-mode :mode "\\.rs$" :config + (setq rust-indent-method-chain t) (def-menu! +rust/build-menu "TODO" '(("run" :exec "cargo run" :cwd t :when (+rust-cargo-project-p)) From 4086ffd8e2e4d019b73fc75477e07706d0f9b574 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 23:01:17 -0500 Subject: [PATCH 0606/4235] config/private: ensure config.el loads as late as possible #453 --- modules/config/private/config.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/config/private/config.el b/modules/config/private/config.el index 8e73ecbcf..d90410d87 100644 --- a/modules/config/private/config.el +++ b/modules/config/private/config.el @@ -1,4 +1,8 @@ ;;; config/private/config.el -*- lexical-binding: t; -*- -(load (expand-file-name "config.el" +private-config-path) - 'noerror 'nomessage) +(defun +private|load-config () + "Loads your private config.el in `+private-config-path'." + (load (expand-file-name "config.el" +private-config-path) + 'noerror 'nomessage)) + +(add-hook 'after-init-hook #'+private|load-config) From 88d339f65dbd62d0a2b379ad2bd95c0347945e64 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 23:01:33 -0500 Subject: [PATCH 0607/4235] config/private: remove unnecessary conditional --- modules/config/private/init.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/config/private/init.el b/modules/config/private/init.el index da10d7b75..b983f2df6 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -7,12 +7,11 @@ "The directory that serves as the root of your external private config for Doom Emacs.") -(when (file-directory-p +private-config-path) - ;; Ensure `doom//reload-autoloads', `doom//byte-compile' and - ;; `doom-initialize-packages' will treat `+private-config-path' as the root of - ;; this module. - (add-to-list 'doom-psuedo-module-dirs +private-config-path) +;; Ensure `doom//reload-autoloads', `doom//byte-compile' and +;; `doom-initialize-packages' will treat `+private-config-path' as the root of +;; this module. +(add-to-list 'doom-psuedo-module-dirs +private-config-path) - ;; - (load (expand-file-name "init.el" +private-config-path) - 'noerror 'nomessage)) +;; +(load (expand-file-name "init.el" +private-config-path) + 'noerror 'nomessage) From 4c535b264330ea64a491aff2671b3512ca9a1c82 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 5 Mar 2018 23:12:20 -0500 Subject: [PATCH 0608/4235] Refactor + slight optimization for backspace #452 --- core/autoload/editor.el | 52 ++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 54c7e9fae..48193518d 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -16,8 +16,8 @@ lines, above and below, with only whitespace in between." (when (and (> pt beg) (< pt end)) (when-let* ((cl (plist-get pair :cl)) (op (plist-get pair :op))) - (and (not (string-empty-p op)) - (not (string-empty-p cl)) + (and (not (string= op "")) + (not (string= cl "")) (let ((nbeg (+ (length op) beg)) (nend (- end (length cl)))) (let ((content (buffer-substring-no-properties nbeg nend))) @@ -165,8 +165,8 @@ possible, or just one char if that's not possible." + Otherwise, resort to `doom/backward-delete-whitespace-to-column'. + Resorts to `delete-char' if n > 1" (interactive "p\nP") - (unless (integerp n) - (signal 'wrong-type-argument (list 'integerp n))) + (or (integerp n) + (signal 'wrong-type-argument (list 'integerp n))) (cond ((and (use-region-p) delete-active-region (= n 1)) @@ -185,26 +185,30 @@ possible, or just one char if that's not possible." (save-excursion (insert-char ?\s (- ocol (current-column)) nil)))) ;; - ((and (= n 1) (not (minibufferp))) - ;; TODO Refactor; abstract with doom-surrounded-p more - (let* ((pair (sp-get-thing)) - (op (plist-get pair :op)) - (cl (plist-get pair :cl)) - (beg (plist-get pair :beg)) - (end (plist-get pair :end))) - (cond ((and end beg (= end (+ beg (length op) (length cl)))) - (sp-backward-delete-char 1)) - ((doom-surrounded-p pair :inline :balanced) - (delete-char -1 killflag) - (delete-char 1) - (when (= (point) (+ (length cl) beg)) - (sp-backward-delete-char 1) - (sp-insert-pair op))) - ((and (bolp) (doom-surrounded-p pair nil :balanced)) - (delete-region beg end) - (sp-insert-pair op)) - (t - (doom/backward-delete-whitespace-to-column))))) + ((and (= n 1) + (not (minibufferp))) + (cond ((and (memq (char-before) (list ?\ ?\t)) + (save-excursion + (and (> (- (skip-chars-backward " \t" (line-beginning-position))) 0) + (bolp)))) + (doom/backward-delete-whitespace-to-column)) + ((let* ((pair (sp-get-thing)) + (op (plist-get pair :op)) + (cl (plist-get pair :cl)) + (beg (plist-get pair :beg)) + (end (plist-get pair :end))) + (cond ((and end beg (= end (+ beg (length op) (length cl)))) + (sp-backward-delete-char 1)) + ((doom-surrounded-p pair 'inline 'balanced) + (delete-char -1 killflag) + (delete-char 1) + (when (= (point) (+ (length cl) beg)) + (sp-backward-delete-char 1) + (sp-insert-pair op))) + ((and (bolp) (doom-surrounded-p pair nil 'balanced)) + (delete-region beg end) + (sp-insert-pair op)) + ((doom/backward-delete-whitespace-to-column))))))) ;; Otherwise, do simple deletion. (t (delete-char (- n) killflag)))) From dc8fd124482ebbad3cb5ab934820ee0f6d758d48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Mar 2018 16:17:01 -0500 Subject: [PATCH 0609/4235] lang/javascript: remove highlight-indentation-mode This mode, paired with js2-mode's constant parsing, cause unacceptable slowdowns so I've disabled it by default. --- modules/lang/javascript/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index f8f6830c6..8298a82c9 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -9,8 +9,7 @@ js2-mode-show-parse-errors nil js-chain-indent t) - (add-hook! 'js2-mode-hook - #'(flycheck-mode highlight-indentation-mode rainbow-delimiters-mode)) + (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :repl 'js2-mode #'+javascript/repl) (set! :electric 'js2-mode :chars '(?\} ?\) ?.)) From 726dea9880357f59b35629910bd027f627d66766 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Mar 2018 18:38:35 -0500 Subject: [PATCH 0610/4235] lang/javascript: leave ecma strict warnings to flycheck --- modules/lang/javascript/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 8298a82c9..7a9dbe7f1 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -6,8 +6,10 @@ :config (setq js2-skip-preprocessor-directives t js2-highlight-external-variables nil + js-chain-indent t + ;; let flycheck handle this js2-mode-show-parse-errors nil - js-chain-indent t) + js2-mode-show-strict-warnings nil) (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) From fa6459bb00abdad8a8be43fcdf02cb1aaf5cd665 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Mar 2018 18:39:34 -0500 Subject: [PATCH 0611/4235] lang/org: improve footnote support for +org/dwim-at-point --- modules/lang/org/autoload/org.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 7c223dc2f..53f9afc37 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -38,7 +38,8 @@ If on a: - checkbox list item or todo heading: toggle it. - clock: update its time. - headline: toggle latex fragments and inline images underneath. -- footnote definition: jump to the footnote +- footnote reference: jump to the footnote's definition +- footnote definition: jump to the first reference of this footnote - table-row or a TBLFM: recalculate the table's formulas - table-cell: clear it and go into insert mode. If this is a formula cell, recaluclate it instead. @@ -73,9 +74,11 @@ If on a: (`clock (org-clock-update-time-maybe)) + (`footnote-reference + (org-footnote-goto-definition (org-element-property :label context))) + (`footnote-definition - (goto-char (org-element-property :post-affiliated context)) - (call-interactively #'org-footnote-action)) + (org-footnote-goto-previous-reference (org-element-property :label context))) ((or `planning `timestamp) (org-follow-timestamp-link)) From 839fc940f0d52e6bb00ee2422acd3aa4934dbe99 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 6 Mar 2018 18:39:53 -0500 Subject: [PATCH 0612/4235] lang/org: remove keybind for +org-present/start Moved it to SPC t p --- modules/config/default/+bindings.el | 3 ++- modules/lang/org/+present.el | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 38e14b0ed..1307060f3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -299,7 +299,8 @@ :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)) + :desc "Evil goggles" :n "g" #'+evil-goggles/toggle + :desc "org-tree-slide mode" :n "p" #'+org-present/start)) ;; --- Personal vim-esque bindings ------------------ diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index 44dfc2cfd..3a26c6f36 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -46,6 +46,5 @@ ;; (defun +org|init-present () - (require 'ox-reveal) - (map! :map org-mode-map "" #'+org-present/start)) + (require 'ox-reveal)) From 54393534ffa10c6ba4cb04db8a5e8ca4c820f562 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 01:57:16 -0500 Subject: [PATCH 0613/4235] Don't abort kbd macros on doom/escape #455 --- core/core-keybinds.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index b8c83e8c9..4c52213d1 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -36,6 +36,8 @@ If any hook returns non-nil, all hooks after it are ignored.") (abort-recursive-edit)) ;; Run all escape hooks. If any returns non-nil, then stop there. ((run-hook-with-args-until-success 'doom-escape-hook)) + ;; don't abort macros + (defining-kbd-macro nil) ;; Back to the default (t (keyboard-quit)))) From 0cfe8e305efa07adbe8cbc215f9a114d8552dfae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 03:01:15 -0500 Subject: [PATCH 0614/4235] Bring back aggressive loading of autoloads files #446 package-initialize, once again, isn't called on every startup, which means package autoloads won't be loaded in most interactive sessions, so must do it manually for certain packages. --- modules/completion/helm/config.el | 1 + modules/lang/elm/config.el | 1 + modules/lang/haskell/config.el | 1 + modules/lang/latex/config.el | 8 ++++++-- modules/tools/pdf/config.el | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 219bc1071..092932939 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -39,6 +39,7 @@ helm-move-to-line-cycle-in-source t) :config + (load "helm-autoloads" nil t) (setq projectile-completion-system 'helm) (defvar helm-projectile-find-file-map (make-sparse-keymap)) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 4fe8af11d..6157cf21d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -3,6 +3,7 @@ (def-package! elm-mode :mode "\\.elm$" :config + (load "elm-mode-autoloads" nil t) (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :company-backend 'elm-mode '(company-elm)) (set! :repl 'elm-mode #'run-elm-interactive) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 2014dd2b9..a97fa9bff 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -15,6 +15,7 @@ :interpreter (("runghc" . haskell-mode) ("runhaskell" . haskell-mode)) :config + (load "haskell-mode-autoloads" nil t) (set! :repl 'haskell-mode #'switch-to-haskell) (push ".hi" completion-ignored-extensions) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index b9df559fb..4943683da 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -20,11 +20,15 @@ (def-package! tex-site + :init + ;; Manually load the AUCTEX autoloads. This is normally done by + ;; package-initialize, ... which we do not use. + (load "auctex.el" nil t t) + (load "auctex-autoloads.el" nil t t) :config ;; Set some varibles to fontify common LaTeX commands. (load! +fontification) - (setq - ;; Enable parse on load. + (setq ;; Enable parse on load. TeX-parse-self t ;; When running TeX, just save, don't ask TeX-save-query nil diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index f7cb233ab..55eb60b70 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -2,6 +2,7 @@ (def-package! pdf-tools :mode ("\\.pdf$" . pdf-view-mode) + :init (load "pdf-tools-autoloads" nil t) :config (unless noninteractive (pdf-tools-install)) From 636c895f234d98f0e923333aaa05e79672bb0131 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 03:03:59 -0500 Subject: [PATCH 0615/4235] lang/latex: improve responsiveness by removing sp rules #452 --- modules/lang/latex/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 4943683da..2569c00e3 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -19,6 +19,13 @@ `(setq +latex-bibtex-dir ,dir)) +(after! smartparens-latex + (map-delete sp-pairs 'LaTeX-mode) + (map-delete sp-pairs 'latex-mode) + (map-delete sp-pairs 'tex-mode) + (map-delete sp-pairs 'plain-tex-mode)) + + (def-package! tex-site :init ;; Manually load the AUCTEX autoloads. This is normally done by From 1aa108ce0225a95993faf8b742b4f5d2f200f22c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 03:24:23 -0500 Subject: [PATCH 0616/4235] feature/version-control: load magit autoloads #446 This prevents void-function issues with magit. --- modules/feature/version-control/+git.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index aec8d2106..e00283683 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -78,7 +78,8 @@ (def-package! magit - :commands (magit-status magit-blame) + :defer t + :init (load "magit-autoloads" nil t) :config (set! :popup "^\\*?magit" :ignore) (set! :evil-state 'magit-status-mode 'emacs) From 7afc62fb1df471431351a1b66b51dfb1bc87c3c1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 21:07:38 -0500 Subject: [PATCH 0617/4235] Rewrite scratch buffer commands + No longer open persistent scratch buffers by default. Supply the universal argument to do that. SPC x = open throw-away scratch buffer SPC u SPC x = open persistent scratch buffer (prompted for file) + Added doom/delete-scratch-files --- core/autoload/scratch.el | 91 ++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 35 deletions(-) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index 3c8d0e3a9..9489cb177 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -4,53 +4,74 @@ "Where to store project scratch files, created by `doom/open-project-scratch-buffer'.") +(defvar doom-scratch-buffer-display-fn #'display-buffer + "TODO") + (defvar doom-scratch-buffer-hook () "The hooks to run after a scratch buffer is made.") -(defun doom--create-scratch-buffer () - (let* ((project-p (doom-project-p 'nocache)) - (text (and (region-active-p) - (buffer-substring-no-properties - (region-beginning) (region-end)))) - (mode major-mode) - (derived-p (derived-mode-p 'prog-mode 'text-mode)) - (project-root (if project-p (doom-project-root 'nocache))) - (id (projectile-project-name))) - (when (and id (string-empty-p id)) - (user-error "Invalid id for a scratch buffer (%s)" id)) - (unless (file-directory-p doom-scratch-files-dir) - (make-directory doom-scratch-files-dir t)) - (with-current-buffer - (if project-p - (find-file-noselect - (expand-file-name (replace-regexp-in-string - "\\." "_" id - t t) - doom-scratch-files-dir) - nil t) - (get-buffer-create "*doom:scratch*")) - (when project-p - (rename-buffer (format "*doom:scratch (%s)*" id)) - (setq default-directory project-root)) + +;; +;; Library +;; + +;;;###autoload +(defun doom-scratch-buffer (&optional file mode text) + "Return a scratchpad buffer in major MODE with TEXT in it. + +If FILE is a valid path, open it as if it were a persistent scratchpad." + (if file (setq file (file-truename file))) + (let ((buffer + (if file + (with-current-buffer (find-file-noselect file) + (rename-buffer (format "*doom:scratch (%s)*" (file-name-nondirectory file))) + (current-buffer)) + (get-buffer-create "*doom:scratch*")))) + (with-current-buffer buffer (when (and (not (eq major-mode mode)) - derived-p (functionp mode)) (funcall mode)) - (if text (insert text)) + (when text + (insert text)) (run-hooks 'doom-scratch-buffer-hook) (current-buffer)))) ;;;###autoload (defun doom/open-scratch-buffer (&optional arg) - "Opens a persistent scratch buffer in the same major-mode, at the current -project root. If no project is found, scratch buffer will not be persistent. If -a selection is active, copy it to the scratch buffer. + "Opens a scratch pad window in the same major-mode. -If ARG (universal argument) is non-nil, display the buffer in the current -window. Otherwise, display it in a pop up window. +If ARG (universal argument), then open a persistent scratch pad buffer. You'll +be prompted for its name, or to open a previously created. These are stored in +`doom-scratch-files-dir'. -Persistent scratch buffers are stored in `doom-scratch-files-dir'." +If a region is active, copy its contents to the scratch pad." (interactive "P") - (funcall (if arg #'switch-to-buffer #'display-buffer) - (doom--create-scratch-buffer))) + (let (projectile-enable-caching) + (funcall + doom-scratch-buffer-display-fn + (doom-scratch-buffer + (when arg + (if-let* ((file (read-file-name "Open scratch file > " doom-scratch-files-dir "scratch"))) + file + (user-error "Aborting"))) + major-mode + (and (region-active-p) + (buffer-substring-no-properties + (region-beginning) (region-end))))))) +;;;###autoload +(defun doom/switch-to-scratch-buffer (&optional arg) + "Switches to a scratch pad buffer in the current window. + +Otherwise, does exactly what `doom/open-scratch-buffer' does." + (interactive "P") + (let ((doom-scratch-buffer-display-fn #'switch-to-buffer)) + (doom/open-scratch-buffer arg))) + +;;;###autoload +(defun doom/delete-scratch-files () + "Deletes all scratch buffers in `doom-scratch-files-dir'." + (interactive) + (dolist (file (directory-files doom-scratch-files-dir t "^[^.]" t)) + (delete-file file) + (message "Deleted '%s'" (file-name-nondirectory file)))) From 4675ceff428e69eea178459fd4524edc12dd32bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 21:15:38 -0500 Subject: [PATCH 0618/4235] feature/popup: fix possible void-variable error w/ hide-mode-line-mode --- modules/feature/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index bbbd6e32c..50834725c 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -239,7 +239,7 @@ disabled." ((symbolp modeline) (when-let* ((hide-mode-line-format (doom-modeline modeline))) (hide-mode-line-mode +1))))) - (when hide-mode-line-mode + (when (bound-and-true-p hide-mode-line-mode) (hide-mode-line-mode -1)))) ;;;###autoload From d7672dad46ec7a9196ae7bad5a6fb519011f41a8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 21:21:17 -0500 Subject: [PATCH 0619/4235] lang/latex: minor refactor & conform to doom conventions --- modules/lang/latex/config.el | 64 +++++++++++++++++------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 2569c00e3..f0a85e9d0 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -26,6 +26,10 @@ (map-delete sp-pairs 'plain-tex-mode)) +;; +;; Plugins +;; + (def-package! tex-site :init ;; Manually load the AUCTEX autoloads. This is normally done by @@ -56,39 +60,37 @@ (set! :popup " output\\*$" '((size . 15))) ;; TeX Font Styling - (def-package! tex-style - :defer t) + ;; (def-package! tex-style :defer t) ;; TeX Folding - (def-package! tex-fold - :defer t - :init - (add-hook! 'TeX-mode-hook 'TeX-fold-mode)) + (add-hook 'TeX-mode-hook 'TeX-fold-mode) (def-package! latex :defer t :init - (setq - ;; Add the toc entry to the sectioning hooks. - LaTeX-section-hook - '(LaTeX-section-heading - LaTeX-section-title - LaTeX-section-toc - LaTeX-section-section - LaTeX-section-label) - LaTeX-fill-break-at-separators nil - ;; Item indentation. - LaTeX-item-indent 0) + (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. + '(LaTeX-section-heading + LaTeX-section-title + LaTeX-section-toc + LaTeX-section-section + LaTeX-section-label) + LaTeX-fill-break-at-separators nil + LaTeX-item-indent 0) ; item indentation. :config (map! :map LaTeX-mode-map "C-j" nil) ;; Do not prompt for Master files, this allows auto-insert to add templates ;; to .tex files - (add-hook! '(LaTeX-mode TeX-mode) '(lambda () (remove-hook 'find-file-hooks (car find-file-hooks) 'local))) + (add-hook! '(LaTeX-mode TeX-mode) + (remove-hook 'find-file-hook (car find-file-hook) 'local)) ;; Adding useful things for latex - (add-hook! LaTeX-mode (LaTeX-math-mode) (TeX-source-correlate-mode)(TeX-global-PDF-mode t) - (TeX-PDF-mode t) (visual-line-mode +1)) + (add-hook! LaTeX-mode + (LaTeX-math-mode) + (TeX-source-correlate-mode) + (TeX-global-PDF-mode t) + (TeX-PDF-mode t) + (visual-line-mode +1)) (when (featurep! :feature spellcheck) - (add-hook! LaTeX-mode (flyspell-mode t))) + (add-hook 'LaTeX-mode-hook #'flyspell-mode)) ;; Default language setting. (setq ispell-dictionary "english") ;; Use chktex to search for errors in a latex file. @@ -123,9 +125,8 @@ ;; ("11.90.2.2017-07-25) ... and Ghostscript 9.22. It's now fixed in AUCTeX ;; master, so we just have to wait. :init - (progn - (setq-default preview-scale 1.4 - preview-scale-function '(lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) + (setq-default preview-scale 1.4 + preview-scale-function '(lambda () (* (/ 10.0 (preview-document-pt)) preview-scale))) (add-hook! LaTeX-mode #'LaTeX-preview-setup)) (def-package! reftex @@ -135,8 +136,8 @@ reftex-toc-split-windows-fraction 0.3) (unless (string-empty-p +latex-bibtex-file) (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) - ; Get ReTeX working with biblatex - ; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 + ;; Get ReTeX working with biblatex + ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 (setq reftex-cite-format '((?t . "\\textcite[]{%l}") (?a . "\\autocite[]{%l}") @@ -174,11 +175,8 @@ :init (setq latex-preview-pane-multifile-mode 'auctex) (add-hook! (latex-mode LaTeX-mode) #'latex-preview-pane-enable) - (add-to-list 'TeX-view-program-list - '("preview-pane" - latex-preview-pane-mode)) - (add-to-list 'TeX-view-program-selection - '(output-pdf "preview-pane")) + (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) + (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane")) :config (map! :map doc-view-mode-map "ESC" #'delete-window @@ -193,7 +191,7 @@ ;; Pass the -pdf flag when TeX-PDF-mode is active (setq auctex-latexmk-inherit-TeX-PDF-mode t) ;; Set LatexMk as the default - (add-hook 'LaTeX-mode-hook '(lambda () (setq TeX-command-default "LatexMk"))) + (add-hook! LaTeX-mode (setq TeX-command-default "LatexMk")) :config ;; Add latexmk as a TeX target (auctex-latexmk-setup)) @@ -240,5 +238,5 @@ (def-package! adaptive-wrap :commands (adaptive-wrap-prefix-mode) :init - (add-hook! LaTeX-mode 'adaptive-wrap-prefix-mode) + (add-hook 'LaTeX-mode-hook #'adaptive-wrap-prefix-mode) (setq-default adaptive-wrap-extra-indent 0)) From 2edbf91a5e6ce9942f3cdb4db8de084c596e6d09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Mar 2018 21:21:39 -0500 Subject: [PATCH 0620/4235] lang/rust: read RUST_SRC_PATH envvar on MacOS --- modules/lang/rust/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index d2facf795..964c370db 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -7,6 +7,7 @@ (def-package! rust-mode :mode "\\.rs$" :config + (set! :env "RUST_SRC_PATH") (setq rust-indent-method-chain t) (def-menu! +rust/build-menu "TODO" From a94ddd4a58e262ac672ac1569174c5046d093221 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:40:51 -0400 Subject: [PATCH 0621/4235] core-os: correct typo in :env setting #449 --- core/core-os.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-os.el b/core/core-os.el index 61af0b29d..2b21248c9 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -38,7 +38,7 @@ (when (require 'exec-path-from-shell nil t) (def-setting! :env (&rest vars) "Inject VARS from your shell environment into Emacs." - `(exec-path-from-shell-copy-env (list ,@vars))) + `(exec-path-from-shell-copy-envs (list ,@vars))) (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) From 686ce7b26edc38ed1bb3262bfaa98cfcc343f27d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:42:26 -0400 Subject: [PATCH 0622/4235] New doom-delete-backward-functions hook as fallback in doom/delete-backward-char --- core/autoload/editor.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 48193518d..b3b4ce058 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -207,7 +207,9 @@ possible, or just one char if that's not possible." (sp-insert-pair op))) ((and (bolp) (doom-surrounded-p pair nil 'balanced)) (delete-region beg end) - (sp-insert-pair op)) + (sp-insert-pair op) + t) + ((run-hook-with-args-until-success 'doom-delete-backward-functions)) ((doom/backward-delete-whitespace-to-column))))))) ;; Otherwise, do simple deletion. (t (delete-char (- n) killflag)))) From d563d133ff978776eff3269cb4aaa3e08a74521f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:44:44 -0400 Subject: [PATCH 0623/4235] lang/org: fix evil coupling #457 And use fix backspace not keeping tables aligned. --- modules/lang/org/autoload/org.el | 22 ++++++++++++++++++++++ modules/lang/org/config.el | 15 +++++++++------ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 53f9afc37..23cfa73aa 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -281,6 +281,28 @@ with `org-cycle'). Also: ;; Hooks ;; +;;;###autoload +(defun +org|delete-backward-char () + (when (eq major-mode 'org-mode) + (org-check-before-invisible-edit 'delete-backward) + (save-match-data + (when (and (org-at-table-p) + (not (org-region-active-p)) + (string-match "|" (buffer-substring (point-at-bol) (point))) + (looking-at ".*?|")) + (let ((pos (point)) + (noalign (looking-at "[^|\n\r]* |")) + (c org-table-may-need-update)) + (delete-char n) + (unless overwrite-mode + (skip-chars-forward "^|") + (insert " ") + (goto-char (1- pos))) + ;; noalign: if there were two spaces at the end, this field + ;; does not determine the width of the column. + (when noalign (setq org-table-may-need-update c))) + t)))) + ;;;###autoload (defun +org|indent-maybe () "Indent the current item (header or item), if possible. Made for diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 6765d8a04..0e7c3adc7 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -32,6 +32,9 @@ (def-package! evil-org :when (featurep! :feature evil) :commands evil-org-mode + :init + (add-hook 'org-load-hook #'+org|setup-evil) + (add-hook 'org-mode-hook #'evil-org-mode) :config (evil-org-set-key-theme '(navigation insert textobjects)) (after! org-agenda @@ -56,7 +59,6 @@ org-indent-mode ; margin-based indentation toc-org-enable ; auto-table of contents visual-line-mode ; line wrapping - evil-org-mode ; evil-mode integration +org|enable-auto-reformat-tables +org|enable-auto-update-cookies @@ -230,16 +232,17 @@ between the two." (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) - (require 'evil-org) (map! :map org-mode-map "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line - [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line + [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) - :map evil-org-mode-map - :i [backtab] #'+org/dedent - :i [backspace] #'evil-org-delete-backward-char +(defun +org|setup-evil () + (require 'evil-org) + (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char) + (map! :map evil-org-mode-map + :i [backtab] #'+org/dedent ;; navigate table cells (from insert-mode) :i "C-l" #'+org/table-next-field :i "C-h" #'+org/table-previous-field From a90d17ae38e91748474f818ff15b92ae137f2222 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:47:26 -0400 Subject: [PATCH 0624/4235] Add ui/posframe module --- init.example.el | 1 + modules/ui/posframe/autoload.el | 13 ++++++++ modules/ui/posframe/config.el | 55 +++++++++++++++++++++++++++++++++ modules/ui/posframe/packages.el | 7 +++++ 4 files changed, 76 insertions(+) create mode 100644 modules/ui/posframe/autoload.el create mode 100644 modules/ui/posframe/config.el create mode 100644 modules/ui/posframe/packages.el diff --git a/init.example.el b/init.example.el index 5b90d92be..83871ee59 100644 --- a/init.example.el +++ b/init.example.el @@ -65,6 +65,7 @@ ;tabbar ; FIXME an (incomplete) tab bar for Emacs vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows + posframe ; use child frames where possible (Emacs 26+ only) :tools dired ; making dired pretty [functional] diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el new file mode 100644 index 000000000..45ecab756 --- /dev/null +++ b/modules/ui/posframe/autoload.el @@ -0,0 +1,13 @@ +;;; ui/posframe/autoloads.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +posframe-ivy-display-at-frame-center-near-bottom (str) + "TODO" + (ivy-posframe--display str #'+posframe-poshandler-frame-center-near-bottom)) + +;;;###autoload +(defun +posframe-poshandler-frame-center-near-bottom (info) + "TODO" + (let ((pos (posframe-poshandler-frame-center info))) + (cons (car pos) + (truncate (* (cdr pos) 1.60))))) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el new file mode 100644 index 000000000..a92eca480 --- /dev/null +++ b/modules/ui/posframe/config.el @@ -0,0 +1,55 @@ +;;; ui/posframe/config.el -*- lexical-binding: t; -*- + +(when (version< emacs-version "26") + (error "The :ui posframe module requires Emacs 26+")) + + +(def-package! posframe + :defer t + :config + (setq posframe-inhibit-double-buffering t)) + + +(def-package! company-childframe + :when (featurep! :completion company) + :after company + :config + (company-childframe-mode 1) + (after! desktop + (push '(company-childframe-mode . nil) desktop-minor-mode-table))) + + +(def-package! ivy-posframe + :when (featurep! :completion ivy) + :after ivy + :preface + ;; This function searches the entire `obarray' just to populate + ;; `ivy-display-functions-props'. There are 15k entries in mine! This is + ;; wasteful, so... + (advice-add #'ivy-posframe-setup :override #'ignore) + :config + ;; ... let's do it manually + (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left + 'ivy-posframe-display-at-frame-center + 'ivy-posframe-display-at-point + 'ivy-posframe-display-at-frame-bottom-window-center + 'ivy-posframe-display + 'ivy-posframe-display-at-window-bottom-left + 'ivy-posframe-display-at-window-center + '+posframe-ivy-display-at-frame-center-near-bottom)) + (push (list fn :cleanup 'ivy-posframe-cleanup) ivy-display-functions-props)) + + (push '(t . +posframe-ivy-display-at-frame-center-near-bottom) ivy-display-functions-alist) + (push '(swiper . nil) ivy-display-functions-alist) + (ivy-posframe-enable) + + (setq ivy-height 16 + ivy-fixed-height-minibuffer nil + ivy-posframe-parameters `((min-width . 90) + (min-height . ,ivy-height) + (internal-border-width . 10))) + (unless ivy-posframe-font + (setq ivy-posframe-font (font-spec :family (font-get doom-font :family) :size 18)))) + + +;; TODO helm-posframe? diff --git a/modules/ui/posframe/packages.el b/modules/ui/posframe/packages.el new file mode 100644 index 000000000..5cf3c37dc --- /dev/null +++ b/modules/ui/posframe/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/posframe/packages.el + +(when (featurep! :completion company) + (package! company-childframe)) +(when (featurep! :completion ivy) + (package! ivy-posframe)) From 5726da8be2a1ec8431a32d32ba380c4f0bd0c70a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:51:05 -0400 Subject: [PATCH 0625/4235] Fix unbalanced-parenthesis error in some helpful-variable buffers --- core/autoload/help.el | 12 ++++++++++++ core/core-editor.el | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index aac15d8d0..3dd025fb8 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -101,3 +101,15 @@ in, or d) the module associated with the current major mode (see (unless (file-exists-p doc-path) (error "There is no documentation for this module")) (find-file doc-path)))) + +;;;###autoload +(defun doom*fix-helpful-prettyprint (value) + "TODO" + (with-temp-buffer + (delay-mode-hooks (emacs-lisp-mode)) + (pp value (current-buffer)) + (unless (or (symbolp value) (booleanp value) (keymapp value)) + (unless (hash-table-p value) + (fill-region (point-min) (point-max))) + (quiet! (indent-region (point-min) (point-max)))) + (string-trim (buffer-string)))) diff --git a/core/core-editor.el b/core/core-editor.el index 1e4d36367..4d8798c9a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -231,7 +231,9 @@ extension, try to guess one." (global-set-key [remap describe-function] #'helpful-callable) (global-set-key [remap describe-command] #'helpful-command) (global-set-key [remap describe-variable] #'helpful-variable) - (global-set-key [remap describe-key] #'helpful-key)) + (global-set-key [remap describe-key] #'helpful-key) + + (advice-add #'helpful--pretty-print :override #'doom*fix-helpful-prettyprint)) (def-package! pcre2el :commands rxt-quote-pcre) From 724773cbe47dabbde45f47785aca89c4891ccb72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:53:51 -0400 Subject: [PATCH 0626/4235] Up the doom-modules :size to 100 --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index ed7a1e418..29791f365 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -55,7 +55,7 @@ this is nil after Emacs has started something is wrong.") "The time it took, in seconds, for DOOM Emacs to initialize.") (defvar doom-modules - (make-hash-table :test #'equal :size 90 :rehash-threshold 1.0) + (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0) "A hash table of enabled modules. Set by `doom-initialize-modules'.") (defvar doom-psuedo-module-dirs () From c6931db3f8cb99a4acb2be6b19c9a04208c997f2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 12:54:21 -0400 Subject: [PATCH 0627/4235] Fix module count in benchmark --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 29791f365..7670544ec 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -133,7 +133,7 @@ missing) and shouldn't be deleted.") ;; 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-site-load-path)) - (hash-table-size doom-modules) + (hash-table-count doom-modules) (or doom-init-time (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) From 23fda88b2fe1b3b181a1922ec208a8df5a43cc50 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:07:17 -0400 Subject: [PATCH 0628/4235] Detach doom-modules-dirs from doom! macro Formerly, you were required to have a doom! call (even a blank one) in ~/.doom.d/init.el if you wanted to have private sub-modules in ~/.doom.d/modules/. No more. It is no longer doom!'s responsibility to affect `doom-modules-dirs`. This is now done by :config private, while the Doom modules directory is now the initial entry in doom-modules-dirs. --- core/core-packages.el | 38 +++++++++++++++------------------- core/core.el | 2 +- modules/config/private/init.el | 4 +++- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 7670544ec..4a5b9f7a8 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -364,27 +364,23 @@ added, if the file exists." MODULES is an malformed plist of modules to load." (let (load-forms module file-name-handler-alist) - (let ((modules-dir - (expand-file-name "modules/" (file-name-directory (or load-file-name byte-compile-current-file))))) - (cl-pushnew modules-dir doom-modules-dirs :test #'string=) - (dolist (m modules) - (cond ((keywordp m) (setq module m)) - ((not module) (error "No namespace specified in `doom!' for %s" m)) - ((let ((submodule (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (let ((path (doom-module-find-path module submodule))) - (doom-module-set module submodule :flags flags :path path) - (push `(let ((doom--current-module ',(cons module submodule))) - (load! init ,path t)) - load-forms)))))) - `(let (file-name-handler-alist) - (setq doom-modules ',doom-modules - doom-modules-dirs ',doom-modules-dirs) - (let ((doom--initializing t)) - ,@(nreverse load-forms)) - ,(unless doom--initializing - '(unless noninteractive - (doom-initialize-modules))))))) + (dolist (m modules) + (cond ((keywordp m) (setq module m)) + ((not module) (error "No namespace specified in `doom!' for %s" m)) + ((let ((submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) + (let ((path (doom-module-find-path module submodule))) + (doom-module-set module submodule :flags flags :path path) + (push `(let ((doom--current-module ',(cons module submodule))) + (load! init ,path t)) + load-forms)))))) + `(let (file-name-handler-alist) + (setq doom-modules ',doom-modules) + (let ((doom--initializing t)) + ,@(nreverse load-forms)) + ,(unless doom--initializing + '(unless noninteractive + (doom-initialize-modules)))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." diff --git a/core/core.el b/core/core.el index b60dd0a09..7a6e0acb8 100644 --- a/core/core.el +++ b/core/core.el @@ -34,7 +34,7 @@ line or use --debug-init to enable this.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") "The main directory where Doom modules are stored.") -(defvar doom-modules-dirs nil +(defvar doom-modules-dirs (list doom-modules-dir) "A list of module root directories. Order determines priority.") (defvar doom-local-dir (concat doom-emacs-dir ".local/") diff --git a/modules/config/private/init.el b/modules/config/private/init.el index b983f2df6..d6f40753d 100644 --- a/modules/config/private/init.el +++ b/modules/config/private/init.el @@ -10,7 +10,9 @@ Doom Emacs.") ;; Ensure `doom//reload-autoloads', `doom//byte-compile' and ;; `doom-initialize-packages' will treat `+private-config-path' as the root of ;; this module. -(add-to-list 'doom-psuedo-module-dirs +private-config-path) +(cl-pushnew +private-config-path doom-psuedo-module-dirs) +(cl-pushnew (expand-file-name "modules/" +private-config-path) + doom-modules-dirs :test #'string=) ;; (load (expand-file-name "init.el" +private-config-path) From a8906cc077ad7eb66eb7680eb66d5cce1c2633c3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:12:31 -0400 Subject: [PATCH 0629/4235] Add note to def-package-hook! to use it only in init.el files --- core/core-packages.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-packages.el b/core/core-packages.el index 4a5b9f7a8..9634c422c 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -399,6 +399,8 @@ MODULES is an malformed plist of modules to load." (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. +Only use this macro in a module's init.el file. + Under the hood, this uses use-package's `use-package-inject-hooks'. PACKAGE is a symbol; the package's name. From 5c36519dab0e56101d809dde0a9ff77bf081a9da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:12:40 -0400 Subject: [PATCH 0630/4235] Ignore package! if package is disabled This allows you to disable packages with (def-package-hook! X :disable) without an accompanying (package! X :ignore t). This reduces redundancy. --- core/core-packages.el | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 9634c422c..806d28d46 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -527,22 +527,23 @@ Accepts the following properties: :ignore FORM Do not install this package if FORM is non-nil. :freeze FORM Do not update this package if FORM is non-nil." (declare (indent defun)) - (let* ((old-plist (assq name doom-packages)) - (pkg-recipe (or (plist-get plist :recipe) - (and old-plist (plist-get old-plist :recipe)))) - (pkg-pin (or (plist-get plist :pin) - (and old-plist (plist-get old-plist :pin))))) - (when pkg-recipe - (when (= 0 (% (length pkg-recipe) 2)) - (plist-put plist :recipe (cons name pkg-recipe))) - (when pkg-pin - (plist-put plist :pin nil))) - (dolist (prop '(:ignore :freeze)) - (when-let* ((val (plist-get plist prop))) - (plist-put plist prop (eval val)))) - `(progn - ,(if (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist)))) + (unless (memq name doom-disabled-packages) + (let* ((old-plist (assq name doom-packages)) + (pkg-recipe (or (plist-get plist :recipe) + (and old-plist (plist-get old-plist :recipe)))) + (pkg-pin (or (plist-get plist :pin) + (and old-plist (plist-get old-plist :pin))))) + (when pkg-recipe + (when (= 0 (% (length pkg-recipe) 2)) + (plist-put plist :recipe (cons name pkg-recipe))) + (when pkg-pin + (plist-put plist :pin nil))) + (dolist (prop '(:ignore :freeze)) + (when-let* ((val (plist-get plist prop))) + (plist-put plist prop (eval val)))) + `(progn + ,(if (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) + (map-put doom-packages ',name ',plist))))) (defmacro depends-on! (module submodule &optional flags) "Declares that this module depends on another. From 74c8b1d1138f19b11b082857aa29af201bd72c4e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:16:16 -0400 Subject: [PATCH 0631/4235] Rewrite doctor; move warn! blocks out in doctor.el files --- bin/doom-doctor | 196 +++++++++++++++++++------------- core/autoload/message.el | 25 ---- modules/lang/cc/config.el | 8 -- modules/lang/cc/doctor.el | 16 +++ modules/lang/crystal/config.el | 5 +- modules/lang/crystal/doctor.el | 4 + modules/lang/go/config.el | 16 +-- modules/lang/go/doctor.el | 12 ++ modules/lang/haskell/+dante.el | 6 - modules/lang/haskell/+intero.el | 5 - modules/lang/haskell/doctor.el | 13 +++ modules/lang/plantuml/config.el | 7 +- modules/lang/plantuml/doctor.el | 9 ++ modules/lang/rust/config.el | 5 - modules/lang/rust/doctor.el | 9 ++ modules/ui/posframe/doctor.el | 4 + 16 files changed, 193 insertions(+), 147 deletions(-) create mode 100644 modules/lang/cc/doctor.el create mode 100644 modules/lang/crystal/doctor.el create mode 100644 modules/lang/go/doctor.el create mode 100644 modules/lang/haskell/doctor.el create mode 100644 modules/lang/plantuml/doctor.el create mode 100644 modules/lang/rust/doctor.el create mode 100644 modules/ui/posframe/doctor.el diff --git a/bin/doom-doctor b/bin/doom-doctor index 924d0b52b..fd60847c6 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -7,14 +7,14 @@ ;; 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 user-emacs-directory (expand-file-name "../" (file-name-directory load-file-name))) -(unless (equal (expand-file-name user-emacs-directory) - (expand-file-name "~/.emacs.d/")) - (error "Couldn't find ~/.emacs.d")) +(unless (file-directory-p user-emacs-directory) + (error "Couldn't find a Doom config!")) (require 'pp) +;; subr-x may not exist in the current version of Emacs (defsubst string-trim-right (string &optional regexp) (if (string-match (concat "\\(?:" (or regexp "[ \t\n\r]+") "\\)\\'") string) (replace-match "" t t string) @@ -23,18 +23,23 @@ ;; (defvar doom-init-p nil) (defvar doom-errors 0) -(defmacro check! (cond &rest body) +(defmacro when! (cond &rest body) (declare (indent defun)) `(let ((it ,cond)) - (when it - ,@body - (setq doom-errors (1+ doom-errors))))) + (when it ,@body))) (defun indented (spc msg) (declare (indent defun)) (with-temp-buffer - (insert msg) - (indent-rigidly (point-min) (point-max) spc) + (insert msg) + (let ((fill-column 80)) + (fill-region (point-min) (point-max)) + (indent-rigidly (point-min) (point-max) spc)) + (when (> spc 2) + (goto-char (point-min)) + (beginning-of-line-text) + (delete-char -2) + (insert "> ")) (buffer-string))) (defun autofill (&rest msgs) @@ -69,12 +74,17 @@ (defun color (code msg &rest args) (format "\e[%dm%s\e[%dm" code (apply #'format msg args) 0)) -(defalias 'msg! #'message) -(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)))) +(defvar indent 0) +(defmacro msg! (msg &rest args) + `(message (indented indent (format ,msg ,@args)))) +(defmacro error! (&rest args) `(progn (msg! (color 31 ,@args)) (setq doom-errors (+ doom-errors 1)))) +(defmacro warn! (&rest args) `(progn (msg! (color 33 ,@args)) (setq doom-errors (+ doom-errors 1)))) +(defmacro success! (&rest args) `(msg! (color 32 ,@args))) +(defmacro section! (&rest args) + `(msg! (color 1 (color 34 ,@args)))) + +(defmacro explain! (&rest args) + `(message (indented (+ indent 2) (autofill ,@args)))) ;;; Polyfills ;; early versions of emacs won't have this @@ -86,10 +96,21 @@ ;; --- start a'doctorin' -------------------------------------- -(msg! "%s\nRunning Emacs v%s, commit %s\n" - (color 1 "DOOM Doctor") - (color 1 emacs-version) - (if (executable-find "git") +(msg! "%s" (color 1 "DOOM Doctor")) +(msg! "Emacs v%s" emacs-version) +(msg! "Doom v%s" + (or (and (file-exists-p (expand-file-name "core/core.el" user-emacs-directory)) + (with-temp-buffer + (insert-file-contents-literally + (expand-file-name "core/core.el" user-emacs-directory)) + (goto-char (point-min)) + (when (re-search-forward "doom-version") + (forward-char) + (sexp-at-point)))) + "???")) +(msg! "Commit %s" + (if (and (executable-find "git") + (file-directory-p (expand-file-name ".git" user-emacs-directory))) (sh "git rev-parse HEAD") "n/a")) @@ -102,29 +123,12 @@ (msg! "Compiled with:\n%s" (indented 2 (autofill system-configuration-features)))) (msg! "uname -a:\n%s\n" (indented 2 (autofill (sh "uname -a")))) -(let (doom-core-packages doom-debug-mode) - (condition-case ex - (progn - (let ((inhibit-message t) - noninteractive) - (load "~/.emacs.d/init.el" nil t)) - (doom-initialize-packages) - (doom|finalize) - (success! "Attempt to load DOOM: success! Loaded v%s" doom-version) - (when (executable-find "git") - (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)))))) - (msg! "----\n") ;; --- is emacs set up properly? ------------------------------ (section! "test-emacs") -(check! (version< emacs-version "25.1") +(when (version< emacs-version "25.1") (error! "Important: Emacs %s detected [%s]" emacs-version (executable-find "emacs")) (explain! "DOOM only supports >= 25.1. Perhaps your PATH wasn't set up properly." @@ -137,7 +141,7 @@ ;; windows? windows (section! "test-windows") -(check! (memq system-type '(windows-nt ms-dos cygwin)) +(when (memq system-type '(windows-nt ms-dos cygwin)) (warn! "Warning: Windows detected") (explain! "DOOM was designed for MacOS and Linux. Expect a bumpy ride!")) @@ -175,8 +179,8 @@ (add-to-list 'protos (cadr (split-string row " " t)))) (split-string (sh "openssl ciphers -v") "\n")) (delq nil protos)))) - (check! (not (or (member "TLSv1.1" protocols) - (member "TLSv1.2" protocols))) + (unless (or (member "TLSv1.1" protocols) + (member "TLSv1.2" protocols)) (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! @@ -186,20 +190,19 @@ "Please consider updating (or install gnutls-cli, which is preferred)."))))) (t - (check! t - (error! "Important: couldn't find either gnutls-cli nor openssl") - (explain! - "You won't be able to install/update packages because Emacs won't be able to " - "verify HTTPS ELPA sources. Install gnutls-cli or openssl v1.0.0+. If for some " - "reason you can't, you can bypass this verification with the INSECURE flag:\n\n" + (error! "Important: couldn't find either gnutls-cli nor openssl") + (explain! + "You won't be able to install/update packages because Emacs won't be able to " + "verify HTTPS ELPA sources. Install gnutls-cli or openssl v1.0.0+. If for some " + "reason you can't, you can bypass this verification with the INSECURE flag:\n\n" - " INSECURE=1 make install\n\n" + " INSECURE=1 make install\n\n" - "Or change `package-archives' to use non-https sources.\n\n" + "Or change `package-archives' to use non-https sources.\n\n" - "But remember that you're leaving your security in the hands of your " - "network, provider, government, neckbearded mother-in-laws, geeky roommates, " - "or just about anyone who knows more about computers than you do!")))) + "But remember that you're leaving your security in the hands of your " + "network, provider, government, neckbearded mother-in-laws, geeky roommates, " + "or just about anyone who knows more about computers than you do!"))) (section! "test-tls") (cond ((not (string-match-p "\\_" system-configuration-features)) @@ -222,12 +225,12 @@ (let ((tls-checktrust t) (gnutls-verify-error t)) (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)) + (when! (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)) @@ -236,27 +239,26 @@ (explain! (pp-to-string it)))))) (dolist (url '("https://self-signed.badssl.com" "https://wrong.host.badssl.com/")) - (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)))) + (when! (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!"))) + ((error! "Nope!"))) ;; bsd vs gnu tar (section! "test-tar") (let ((tar-bin (or (executable-find "gtar") (executable-find "tar")))) (if tar-bin - (check! (not (string-match-p "(GNU tar)" (sh (format "%s --version" tar-bin)))) + (unless (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 " @@ -265,14 +267,56 @@ (when (eq system-type 'darwin) (concat "\nMacOS users can install gnu-tar via homebrew:\n" " brew install gnu-tar")))) - (check! t ; very unlikely - (error! "Important: Couldn't find tar") - (explain! - "This is required by package.el and QUELPA to build packages and will " - "prevent you from installing & updating packages.")))) + (error! "Important: Couldn't find tar") + (explain! + "This is required by package.el and QUELPA to build packages and will " + "prevent you from installing & updating packages."))) + + +;; --- are your modules set up properly? ---------------------- + +(message "\n----") +(let (doom-core-packages doom-debug-mode) + (condition-case ex + (progn + (let ((inhibit-message t) + noninteractive) + (load "~/.emacs.d/init.el" nil t)) + (doom-initialize-packages) + (doom|finalize) + (success! "Attempt to load DOOM: success! Loaded v%s" doom-version) + (when (executable-find "git") + (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)))))) + +(when (bound-and-true-p doom-modules) + (section! "test-modules") + (let ((indent 4)) + (maphash + (lambda (key plist) + (condition-case ex + (let ((doctor-file (doom-module-expand-file (car key) (cdr key) "doctor.el")) + (packages-file (doom-module-expand-file (car key) (cdr key) "packages.el")) + doom-packages) + (when (or (file-exists-p doctor-file) + (file-exists-p packages-file)) + (let ((indent 2)) + (section! "test-module -> %s %s" (car key) (cdr key))) + (load packages-file t t) + (when (load packages-file t t) + (dolist (package (cl-remove-if #'package-installed-p doom-packages :key #'car)) + (error! "%s is not installed" (car package)))) + (load doctor-file t t))) + ('error + (error! "Syntax error: %s" ex)))) + doom-modules))) ;; -(if (= doom-errors 0) - (success! "Everything seems fine, happy Emacs'ing!") - (message "\n----") - (warn! "There were issues!")) +(message "\n----") +(if (> doom-errors 0) + (warn! "There were %s issues!" doom-errors) + (success! "Everything seems fine, happy Emacs'ing!")) diff --git a/core/autoload/message.el b/core/autoload/message.el index cebd66296..842e1a37e 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -35,11 +35,6 @@ (strike . 9)) "List of styles.") -(defvar doom-demote-warnings nil - "If non-nil, Doom module warnings (the ones that pop up when you're missing a -dependency) will only log a message in *Messages* instead of opening a -*Warnings* window.") - ;;;###autoload (defun doom-ansi-apply (code message &rest args) "Apply the ansi CODE to formatted MESSAGE with ARGS." @@ -85,26 +80,6 @@ interactive session." (pop-to-buffer buf) (goto-char (point-max))))) -;;;###autoload -(defmacro warn! (message &rest args) - "Output a colored warning for the current module in the *Messages* buffer." - (let ((load-file-name (or load-file-name byte-compile-current-file))) - (if (cl-loop for dir in doom-modules-dirs - if (file-in-directory-p load-file-name dir) - return t) - `(cl-destructuring-bind (cat . mod) - (doom-module-from-path ,load-file-name) - (if doom-demote-warnings - (message "WARNING (%s %s) %s" cat mod (format ,message ,@args)) - (delay-warning (format "%s %s" cat mod) (format ,message ,@args) - :warning))) - `(if doom-demote-warnings - (message "WARNING (%s) %s" - (file-relative-name load-file-name doom-emacs-dir) - (format ,message ,@args)) - (delay-warning (file-relative-name load-file-name doom-emacs-dir) - (format ,message ,@args) :warning))))) - ;;;###autoload (defmacro log! (message &rest args) "Output a debug message if `doom-debug-mode' is non-nil. Otherwise, ignore this." diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 2698bb3e9..c9a2e1b1f 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -136,8 +136,6 @@ compilation database is present in the project.") (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 server isn't installed. Run M-x irony-install-server")) ;; Initialize compilation database, if present. Otherwise, fall back on ;; `+cc-default-compiler-options'. (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options)) @@ -205,8 +203,6 @@ compilation database is present in the project.") :when (featurep! :completion company) :after glsl-mode :config - (unless (executable-find "glslangValidator") - (warn! "Couldn't find glslangValidator. Code completion is disabled")) (set! :company-backend 'glsl-mode '(company-glsl))) @@ -228,10 +224,6 @@ 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) - (let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) - (when (/= (length bins) 0) - (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins))) - (set! :lookup '(c-mode c++-mode) :definition #'rtags-find-symbol-at-point :references #'rtags-find-references-at-point) diff --git a/modules/lang/cc/doctor.el b/modules/lang/cc/doctor.el new file mode 100644 index 000000000..da32879f9 --- /dev/null +++ b/modules/lang/cc/doctor.el @@ -0,0 +1,16 @@ +;;; lang/cc/doctor.el -*- lexical-binding: t; -*- + +;; rtags +(let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) + (when (/= (length bins) 0) + (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins))) + +;; irony server +(require 'irony) +(unless (file-directory-p irony-server-install-prefix) + (warn! "Irony server isn't installed. Run M-x irony-install-server")) + +(when (featurep! :completion company) + ;; glslangValidator + (unless (executable-find "glslangValidator") + (warn! "Couldn't find glslangValidator. GLSL code completion is disabled"))) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index a782a314b..738842bbe 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -19,7 +19,4 @@ (def-package! inf-crystal - :commands (inf-crystal crystal-switch-to-inf) - :config - (unless (executable-find "icr") - (warn! "Couldn't find icr. REPL will not work"))) + :commands (inf-crystal crystal-switch-to-inf)) diff --git a/modules/lang/crystal/doctor.el b/modules/lang/crystal/doctor.el new file mode 100644 index 000000000..63752faef --- /dev/null +++ b/modules/lang/crystal/doctor.el @@ -0,0 +1,4 @@ +;;; lang/crystal/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "icr") + (warn! "Couldn't find icr. REPL will not work")) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index e88880569..34e4d57d5 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -78,25 +78,17 @@ :commands (go-guru-describe go-guru-freevars go-guru-implements go-guru-peers go-guru-referrers go-guru-definition go-guru-pointsto go-guru-callstack go-guru-whicherrs go-guru-callers go-guru-callees - go-guru-expand-region) - :config - (unless (executable-find "guru") - (warn! "Couldn't find guru. Refactoring commands (go-guru-*) won't work"))) + go-guru-expand-region)) (def-package! gorepl-mode - :commands (gorepl-run gorepl-run-load-current-file) - :config - (unless (executable-find "gore") - (warn! "Couldn't find gore. REPL will not work"))) + :commands (gorepl-run gorepl-run-load-current-file)) (def-package! company-go - :init (setq command-go-gocode-command "gocode") :when (featurep! :completion company) + :init (setq command-go-gocode-command "gocode") :after go-mode :config (setq company-go-show-annotation t) - (set! :company-backend 'go-mode '(company-go)) - (unless (executable-find command-go-gocode-command) - (warn! "Couldn't find gocode. Code completion won't work"))) + (set! :company-backend 'go-mode '(company-go))) diff --git a/modules/lang/go/doctor.el b/modules/lang/go/doctor.el new file mode 100644 index 000000000..827da36d9 --- /dev/null +++ b/modules/lang/go/doctor.el @@ -0,0 +1,12 @@ +;;; lang/go/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "guru") + (warn! "Couldn't find guru. Refactoring commands (go-guru-*) won't work")) + +(unless (executable-find "gore") + (warn! "Couldn't find gore. REPL will not work")) + +(when (and (featurep! :completion company) + (require 'company-go nil t)) + (unless (executable-find command-go-gocode-command) + (warn! "Couldn't find gocode. Code completion won't work"))) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 151b8ba7e..93ab83bbc 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -5,9 +5,6 @@ :after haskell-mode :hook (haskell-mode . dante-mode) :config - (unless (executable-find "cabal") - (warn! "Couldn't find cabal, haskell-mode may have issues")) - (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (add-hook 'dante-mode-hook #'flycheck-mode)) @@ -18,8 +15,5 @@ :init (add-hook 'haskell-mode-hook #'ghc-comp-init) :config - (unless (executable-find "ghc-mod") - (warn! "Couldn't find ghc-mod on PATH. Code completion is disabled.")) - (setq company-ghc-show-info 'oneline) (set! :company-backend 'haskell-mode #'company-ghc)) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index a51958ef6..8de53afd9 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -5,12 +5,7 @@ :after haskell-mode :config (add-hook 'haskell-mode-hook #'+haskell|init-intero) - - (unless (executable-find "stack") - (warn! "Couldn't find stack. Intero has been disabled.")) - (add-hook! 'intero-mode-hook #'(flycheck-mode eldoc-mode)) - (set! :lookup 'haskell-mode :definition #'intero-goto-definition)) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el new file mode 100644 index 000000000..e6a8b92d6 --- /dev/null +++ b/modules/lang/haskell/doctor.el @@ -0,0 +1,13 @@ +;;; lang/haskell/doctor.el -*- lexical-binding: t; -*- + +(when (featurep! +dante) + (unless (executable-find "cabal") + (warn! "Couldn't find cabal, haskell-mode may have issues")) + + (unless (executable-find "ghc-mod") + (warn! "Couldn't find ghc-mod on PATH. Code completion will not work"))) + +(when (featurep! +intero) + (unless (executable-find "stack") + (warn! "Couldn't find stack. Intero will not work"))) + diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index 23db701ef..8d7f7d259 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -6,12 +6,7 @@ (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") org-plantuml-jar-path plantuml-jar-path) :config - (set! :popup "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0))) - - (unless (executable-find "java") - (warn! "Couldn't find java. Disabling plantuml preview.")) - (unless (file-exists-p plantuml-jar-path) - (warn! "Couldn't find plantuml.jar. Install it witInstall it with-x +plantuml/install."))) + (set! :popup "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0)))) (def-package! flycheck-plantuml diff --git a/modules/lang/plantuml/doctor.el b/modules/lang/plantuml/doctor.el new file mode 100644 index 000000000..be8cffde6 --- /dev/null +++ b/modules/lang/plantuml/doctor.el @@ -0,0 +1,9 @@ +;;; lang/plantuml/doctor.el -*- lexical-binding: t; -*- + +(when (require 'plantuml-mode nil t) + ;; java + (unless (executable-find "java") + (warn! "Couldn't find java. PlantUML preview or syntax checking won't work")) + ;; plantuml.jar + (unless (file-exists-p plantuml-jar-path) + (warn! "Couldn't find plantuml.jar. Install it with-x +plantuml/install"))) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 964c370db..bea1bf719 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -19,11 +19,6 @@ (def-package! racer :after rust-mode :config - (unless (file-exists-p racer-cmd) - (warn! "Couldn't find racer binary. Code completion won't work")) - (unless (file-directory-p racer-rust-src-path) - (warn! "Couldn't find rust source. Code completion won't work")) - (add-hook! 'rust-mode-hook #'(eldoc-mode racer-mode)) (set! :lookup 'rust-mode :definition #'racer-find-definition diff --git a/modules/lang/rust/doctor.el b/modules/lang/rust/doctor.el new file mode 100644 index 000000000..db9d287d0 --- /dev/null +++ b/modules/lang/rust/doctor.el @@ -0,0 +1,9 @@ +;;; lang/rust/doctor.el -*- lexical-binding: t; -*- + +(when (require 'racer nil t) + ;; racer + (unless (file-exists-p racer-cmd) + (warn! "Couldn't find the racer binary at `racer-cmd'")) + ;; rust source code (rustup component add rust-src) + (unless (file-directory-p racer-rust-src-path) + (warn! "Couldn't find Rust's source code at RUST_SRC_PATH or `racer-rust-src-path'."))) diff --git a/modules/ui/posframe/doctor.el b/modules/ui/posframe/doctor.el new file mode 100644 index 000000000..0eb5dfb80 --- /dev/null +++ b/modules/ui/posframe/doctor.el @@ -0,0 +1,4 @@ +;;; ui/posframe/doctor.el -*- lexical-binding: t; -*- + +(when (version< emacs-version "26") + (error! "This module doesn't work in Emacs %s (minimum: Emacs 26)" emacs-version)) From 8976d1ad5a8def03a604922e1d893628e21701c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:17:00 -0400 Subject: [PATCH 0632/4235] lang/org: fix org/insert-item in continued indented lines --- modules/lang/org/autoload/org.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 23cfa73aa..52c6cab29 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -141,6 +141,7 @@ wrong places)." (cond ((memq type '(item plain-list)) (let ((marker (org-element-property :bullet context)) (pad (save-excursion + (org-beginning-of-item) (back-to-indentation) (- (point) (line-beginning-position))))) (save-match-data From 4f0dc72962117703e62cb4143d9d1ed3b2cd1dba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:19:31 -0400 Subject: [PATCH 0633/4235] lang/org: fix smartparens autopairing in org-mode --- modules/lang/org/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0e7c3adc7..d40e69cf6 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -100,11 +100,11 @@ unfold to point on startup." ;; make delimiter auto-closing a little more conservative (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))))) + (sp-local-pair "*" nil :unless '(:add sp-point-before-word-p sp-point-at-bol-p)) + (sp-local-pair "_" nil :unless '(:add sp-point-before-word-p)) + (sp-local-pair "/" nil :unless '(:add sp-point-before-word-p +org-sp-point-in-checkbox-p)) + (sp-local-pair "~" nil :unless '(:add sp-point-before-word-p)) + (sp-local-pair "=" nil :unless '(:add sp-point-before-word-p))))) (defun +org|enable-auto-reformat-tables () "Realign tables exiting insert mode (`evil-mode')." From 62025c81078178b18508259349ef3056d6fab569 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:20:09 -0400 Subject: [PATCH 0634/4235] lang/org: indent continued org-list lines more consistently Before: + abcdefghi :: User can set *any* parameters of ivy-posframe with the help of `ivy-posframe-parameters'. + xyz :: When non-nil, ivy-posframe will ignore prompt. This variable is useful for `ivy-posframe-read-action'. After + abcdefghi :: User can set *any* parameters of ivy-posframe with the help of `ivy-posframe-parameters'. + xyz :: When non-nil, ivy-posframe will ignore prompt. This variable is useful for `ivy-posframe-read-action'. --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index d40e69cf6..9b2e7e3ea 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -154,6 +154,7 @@ unfold to point on startup." org-image-actual-width nil org-indent-indentation-per-level 2 org-indent-mode-turns-on-hiding-stars t + org-list-description-max-indent 4 org-pretty-entities nil org-pretty-entities-include-sub-superscripts t org-priority-faces From 88d3e91ee428367c429a14002a4eb93b754e1ef5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:24:23 -0400 Subject: [PATCH 0635/4235] lang/org: highlight broken file: links with error face --- modules/lang/org/config.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 9b2e7e3ea..4863316fd 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -199,6 +199,13 @@ unfold to point on startup." (file-relative-name path) path)) + ;; highlight broken links + (org-link-set-parameters + "file" + :face (lambda (path) + (unless (file-remote-p path) + (if (file-exists-p path) 'org-link 'error)))) + (defmacro def-org-file-link! (key dir) `(org-link-set-parameters ,key @@ -207,7 +214,7 @@ unfold to point on startup." :face (lambda (link) (if (file-exists-p (expand-file-name link ,dir)) 'org-link - '(:inherit (error underline)))))) + 'error)))) (def-org-file-link! "org" +org-dir) (def-org-file-link! "doom" doom-emacs-dir) From 3e0e5bcad88c6ad53070f6204b4aff8c764e81d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:26:34 -0400 Subject: [PATCH 0636/4235] Refactor makefile For better cross platform compatibility (rely on Emacs; nofewer bash commands) and correctness (keep tasks synchronous, even when make is called with -j|--jobs) --- Makefile | 69 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index fcd980f87..1f0a347ca 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ # Ensure emacs always runs from this makefile's PWD -EMACS_FLAGS=--eval '(setq user-emacs-directory default-directory)' -l init.el -EMACS=emacs --quick --batch $(EMACS_FLAGS) -EMACSI=emacs -q $(EMACS_FLAGS) +EMACS = emacs -q --eval "(setq user-emacs-directory default-directory)" +DOOM = $(EMACS) --batch -l init.el +DOOMI = $(subst --batch,,$(DOOM)) -MODULES=$(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) +MODULES = $(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) -all: autoloads autoremove install +all: | autoloads autoremove install ## Shortcuts a: autoloads @@ -15,19 +15,20 @@ r: autoremove c: compile cc: compile-core ce: compile-elpa +d: doctor ## Package management -install: init.el .local/autoloads.el - @$(EMACS) -f doom//packages-install +install: | init.el .local/autoloads.el + @$(DOOM) -f doom//packages-install -update: init.el .local/autoloads.el - @$(EMACS) -f doom//packages-update +update: | init.el .local/autoloads.el + @$(DOOM) -f doom//packages-update -autoremove: init.el .local/autoloads.el - @$(EMACS) -f doom//packages-autoremove +autoremove: | init.el .local/autoloads.el + @$(DOOM) -f doom//packages-autoremove -autoloads: init.el - @$(EMACS) -f doom//reload-autoloads +autoloads: | init.el + @$(DOOM) -f doom//reload-autoloads ## Byte compilation @@ -35,23 +36,23 @@ autoloads: init.el # compile-core # compile-module # compile-module/submodule -compile: init.el clean - @$(EMACS) -f doom//byte-compile +compile: | init.el clean + @$(DOOM) -f doom//byte-compile -compile-core: init.el clean - @$(EMACS) -f doom//byte-compile-core +compile-core: | init.el clean + @$(DOOM) -f doom//byte-compile-core -compile-elpa: init.el - @$(EMACS) -f doom//byte-recompile-plugins +compile-elpa: | init.el + @$(DOOM) -f doom//byte-recompile-plugins -$(patsubst %, compile-%, $(MODULES)): init.el .local/autoloads.el - @$(EMACS) -f doom//byte-compile -- $(patsubst compile-%, %, $@) +$(patsubst %, compile-%, $(MODULES)): | init.el .local/autoloads.el + @$(DOOM) -f doom//byte-compile -- $(patsubst compile-%, %, $@) -recompile: init.el - @$(EMACS) -f doom//byte-compile -- -r +recompile: | init.el + @$(DOOM) -f doom//byte-compile -- -r clean: - @$(EMACS) -f doom//clean-byte-compiled-files + @$(DOOM) -f doom//clean-byte-compiled-files ## Unit tests @@ -59,35 +60,35 @@ clean: # test-core # test-module # test-module/submodule -test: init.el .local/autoloads.el - @$(EMACS) -f doom//run-tests +test: | init.el .local/autoloads.el + @$(DOOM) -f doom//run-tests -test-core $(patsubst %, test-%, $(MODULES)): init.el .local/autoloads.el - @$(EMACS) -f doom//run-tests -- $(subst test-, , $@) +test-core $(patsubst %, test-%, $(MODULES)): | init.el .local/autoloads.el + @$(DOOM) -f doom//run-tests -- $(subst test-, , $@) # run tests interactively -testi: init.el .local/autoloads.el - @$(EMACSI) -f doom//run-tests +testi: | init.el .local/autoloads.el + @$(DOOMI) -f doom//run-tests ## Utility tasks # Runs Emacs from a different folder than ~/.emacs.d; only use this for testing! run: - @$(EMACSI) --eval "(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)" + @$(DOOMI) --eval "(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)" # Diagnoses potential OS/environment issues doctor: - @bin/doom-doctor + @$(EMACS) --script bin/doom-doctor # Prints debug info about your current setup info: - @$(EMACS) -l core/autoload/debug.el -f doom/info + @$(EMACS) --batch -l core/autoload/debug.el -f doom/info ## Internal tasks init.el: @$(error No init.el file; create one or copy init.example.el) .local/autoloads.el: - @$(EMACS) -f doom-initialize-autoloads + @$(DOOM) -f doom-initialize-autoloads .PHONY: all compile test testi clean From 00a9a08afb217dc6a2da87f14324cde3d673be31 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:28:09 -0400 Subject: [PATCH 0637/4235] Automatically add execute permission to files with a shebang line --- core/core-editor.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index 4d8798c9a..5e3832bf8 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -76,6 +76,8 @@ fundamental-mode) for performance sake." ;; Built-in plugins ;; +(add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) + ;; revert buffers for changed files (global-auto-revert-mode 1) (setq auto-revert-verbose nil) From fbb9947c7e21d8d5ed3f77b082e15e31c1b01c7c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:28:56 -0400 Subject: [PATCH 0638/4235] Add doom-{after,before}-switch-window-hook hooks --- core/core-ui.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index 7c3f35814..1b94a01b0 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -280,6 +280,21 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (add-hook 'server-visit-hook 'server-remove-kill-buffer-hook) +;; +;; Custom hooks +;; + +(defun doom*after-switch-window-hooks (&rest _) + (run-hooks 'doom-after-switch-window-hook)) +(defun doom*before-switch-window-hooks (&rest _) + (run-hooks 'doom-before-switch-window-hook)) + +(advice-add #'select-frame :before #'doom*before-switch-window-hooks) +(advice-add #'select-frame :after #'doom*after-switch-window-hooks) +(advice-add #'select-window :before #'doom*before-switch-window-hooks) +(advice-add #'select-window :after #'doom*after-switch-window-hooks) + + ;; ;; Line numbers ;; From b082ba64600a4b64a0d948958fcd1281ca8eb18b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:31:55 -0400 Subject: [PATCH 0639/4235] ui/doom-modeline: deactivate mode-line when frame loses focus #458 --- modules/ui/doom-modeline/config.el | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index e5f352e26..01e244082 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -32,12 +32,17 @@ "Sets `+doom-modeline-current-window' appropriately" (when-let* ((win (frame-selected-window))) (unless (minibuffer-window-active-p win) - (setq +doom-modeline-current-window win)))) + (setq +doom-modeline-current-window win) + (force-mode-line-update)))) + +(defun +doom-modeline|unset-selected-window () + (setq +doom-modeline-current-window nil) + (force-mode-line-update)) (add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) -(advice-add #'handle-switch-frame :after #'+doom-modeline|set-selected-window) -(advice-add #'select-window :after #'+doom-modeline|set-selected-window) +(add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window) +(add-hook 'doom-after-switch-window-hook #'+doom-modeline|set-selected-window) ;; @@ -649,5 +654,19 @@ Returns \"\" to not break --no-window-system." (add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) (add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) +;; TODO Refactor me +(defvar +doom-modeline-remap-face-cookie nil) +(defun +doom-modeline|focus () + (require 'face-remap) + (when +doom-modeline-remap-face-cookie + (face-remap-remove-relative +doom-modeline-remap-face-cookie))) + +(defun +doom-modeline|unfocus () + (require 'face-remap) + (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) + +(add-hook 'focus-in-hook #'+doom-modeline|focus) +(add-hook 'focus-out-hook #'+doom-modeline|unfocus) + ;; -(add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font) +;; (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font) From a17fc867612429ba46541d6ce55bf67b466061c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 13:33:50 -0400 Subject: [PATCH 0640/4235] feature/workspaces: fix buffer getting killed across workspaces --- modules/feature/workspaces/autoload/workspaces.el | 6 ++++++ modules/feature/workspaces/config.el | 2 ++ 2 files changed, 8 insertions(+) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index af7b990ed..f0e0b610a 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -453,6 +453,12 @@ the next." ;; Hooks ;; +;;;###autoload +(defun +workspaces|protect-buffers-in-other-persps () + "Return nil if this buffer is present in other perspectives/workspaces (bury +it, don't kill it)." + (not (persp-other-persps-with-buffer-except-nil (current-buffer)))) + ;;;###autoload (defun +workspaces|delete-associated-workspace (&optional frame) "Delete workspace associated with current frame. diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 947de9ed0..3bd18da39 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -114,6 +114,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; 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) + (add-hook 'kill-buffer-query-functions #'+workspaces|protect-buffers-in-other-persps) ;; Remap `buffer-list' to current workspace's buffers in ;; `doom-buffer-list' @@ -121,6 +122,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) (t + (remove-hook 'kill-buffer-query-functions #'+workspaces|protect-buffers-in-other-persps) (advice-remove #'switch-to-buffer #'+workspaces*auto-add-buffer) (advice-remove #'display-buffer #'+workspaces*auto-add-buffer) (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) From 61ddd1fd2909c1eeae835325c82a4e1e98ba026e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 14:34:15 -0400 Subject: [PATCH 0641/4235] lang/elixir: use upstream source for alchemist #409 The hanging-iex fix was merged upstream. --- modules/lang/elixir/packages.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index 8be3fee2c..8fc1db9dc 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -3,8 +3,5 @@ ;; +elixir.el (package! elixir-mode) -(package! alchemist :recipe - (:fetcher github - :repo "hlissner/alchemist.el" - :files (:defaults "*.exs" "alchemist-server"))) +(package! alchemist) (package! ac-alchemist) From 8d11682e991b7a697294745a9771136e2dd6c326 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Mar 2018 17:09:00 -0400 Subject: [PATCH 0642/4235] lang/org: make doom/delete-backward-char respect tables #457 With or without evil. --- modules/lang/org/autoload/org.el | 1 + modules/lang/org/config.el | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 52c6cab29..762a94e19 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -284,6 +284,7 @@ with `org-cycle'). Also: ;;;###autoload (defun +org|delete-backward-char () + "TODO" (when (eq major-mode 'org-mode) (org-check-before-invisible-edit 'delete-backward) (save-match-data diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 4863316fd..35fb95b15 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -240,6 +240,9 @@ between the two." (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) + ;; Tell `doom/delete-backward-char' to respect org tables + (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char) + (map! :map org-mode-map "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images @@ -248,7 +251,6 @@ between the two." (defun +org|setup-evil () (require 'evil-org) - (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char) (map! :map evil-org-mode-map :i [backtab] #'+org/dedent ;; navigate table cells (from insert-mode) From b181799f93cb16095bc9dd1edf843cfdb1d58858 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:22:53 -0400 Subject: [PATCH 0643/4235] lang/ruby: fix rbenv version in mode-line --- modules/lang/ruby/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 38de8171e..0359c841c 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -31,7 +31,7 @@ (defun +ruby|add-version-to-modeline () "Add version string to the major mode in the modeline." (setq mode-name - (if +python-current-version + (if +ruby-current-version (format "Ruby %s" +ruby-current-version) "Ruby"))) (add-hook 'ruby-mode-hook #'+ruby|add-version-to-modeline) From 4fbda15494ffde9980fb12b0aa9d361a5219f3f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:21:13 -0400 Subject: [PATCH 0644/4235] ui/posframe: cleanup invisible posframes on ESC This is meant to resolve an issue where posframes go rogue (e.g. after an error), by deleting all (invisible) posframes when you press ESC or C-g (doom/escape). --- modules/ui/posframe/autoload.el | 11 ++++++++++- modules/ui/posframe/config.el | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el index 45ecab756..7ff93493b 100644 --- a/modules/ui/posframe/autoload.el +++ b/modules/ui/posframe/autoload.el @@ -10,4 +10,13 @@ "TODO" (let ((pos (posframe-poshandler-frame-center info))) (cons (car pos) - (truncate (* (cdr pos) 1.60))))) + (truncate (* (cdr pos) 1.4))))) + +;;;###autoload +(defun +posframe|delete-on-escape () + "TODO" + (when (cl-loop for frame in (frame-list) + if (and (frame-parameter frame 'posframe-buffer) + (not (frame-visible-p frame))) + return t) + (posframe-delete-all))) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index a92eca480..8fcb2d9fc 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -7,7 +7,7 @@ (def-package! posframe :defer t :config - (setq posframe-inhibit-double-buffering t)) + (add-hook 'doom-escape-hook #'+posframe|delete-on-escape)) (def-package! company-childframe From e4fe46adbdbb19d7e5965e7aa02f3316c9423efa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:23:09 -0400 Subject: [PATCH 0645/4235] ui/posframe: remove redundant frame property --- modules/ui/posframe/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 8fcb2d9fc..8b24c0a8f 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -46,7 +46,6 @@ (setq ivy-height 16 ivy-fixed-height-minibuffer nil ivy-posframe-parameters `((min-width . 90) - (min-height . ,ivy-height) (internal-border-width . 10))) (unless ivy-posframe-font (setq ivy-posframe-font (font-spec :family (font-get doom-font :family) :size 18)))) From 17d206a28f548c9ad6242a9fcd620029ecd8823e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:24:08 -0400 Subject: [PATCH 0646/4235] feature/snippets: remap yas-insert-snippet instead Rather than binding directly to +snippets/expand-on-region --- modules/config/default/+bindings.el | 2 +- modules/feature/snippets/config.el | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 1307060f3..9a99563a3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -643,7 +643,7 @@ [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map :ig "" yas-maybe-expand - :v "" #'+snippets/expand-on-region)) + :v "" #'yas-insert-snippet)) ;; --- Major mode bindings -------------------------- diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 5d4a23349..aea3fdf64 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -8,7 +8,11 @@ yas-lookup-snippet yas-insert-snippet yas-new-snippet yas-visit-snippet-file snippet-mode) :preface - (defvar yas-minor-mode-map (make-sparse-keymap)) + (defvar yas-minor-mode-map + (let ((map (make-sparse-keymap))) + (when (featurep! :feature evil) + (define-key map [remap yas-insert-snippet] #'+snippets/expand-on-region)) + map)) :init ;; Ensure `yas-reload-all' is called as late as possible. Other modules could From 683e98895239cc05683d75c8dac8380a1c6f7b7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:28:22 -0400 Subject: [PATCH 0647/4235] feature/snippets: refactor +snippets/expand-on-region --- modules/feature/snippets/autoload/evil.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/feature/snippets/autoload/evil.el b/modules/feature/snippets/autoload/evil.el index e0ef054b2..e56fffe85 100644 --- a/modules/feature/snippets/autoload/evil.el +++ b/modules/feature/snippets/autoload/evil.el @@ -11,8 +11,6 @@ and switches to insert mode if there are editable fields." (cl-letf (((symbol-function 'region-beginning) (lambda () evil-visual-beginning)) ((symbol-function 'region-end) (lambda () evil-visual-end))) (yas-insert-snippet)) - (when-let* ((snippet (car-safe (yas-active-snippets)))) - (let ((fields (yas--snippet-fields snippet))) - (evil-insert-state +1) - (unless fields (evil-change-state 'normal))))) + (when (yas-active-snippets) + (evil-insert-state +1))) From 6e8473e66a59a56c75dcbbb2e865567321e05a45 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:24:54 -0400 Subject: [PATCH 0648/4235] config/default: bind M-b => projectile-compile-project +eval/build was removed a long time ago. --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9a99563a3..3d6f6d955 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -53,7 +53,7 @@ ;; 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-b" #'projectile-compile-project :ne "M-a" #'mark-whole-buffer :ne "M-c" #'evil-yank :ne "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) From 8e9f9ec45b2e916ea49ce85485eebc211cd66bc3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:25:15 -0400 Subject: [PATCH 0649/4235] config/default: SPC i y = counsel-yank-pop --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 3d6f6d955..7e9743e1d 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -224,7 +224,7 @@ :desc "Toggle profiler" :n "p" #'doom/toggle-profiler) (:desc "insert" :prefix "i" - :desc "From kill-ring" :nv "y" #'yank-pop + :desc "From kill-ring" :nv "y" #'counsel-yank-pop :desc "From snippet" :nv "s" #'yas-insert-snippet) (:desc "notes" :prefix "n" From 4a1b60763877a6859790c1158d7a69caa21ff0f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:25:36 -0400 Subject: [PATCH 0650/4235] config/default: redesign ivy-minibuffer-map keybinds --- modules/config/default/+bindings.el | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 7e9743e1d..d14df16fb 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -563,17 +563,20 @@ (: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) + "C-SPC" #'ivy-call-and-recenter + "M-z" #'undo + "M-v" #'yank + "C-v" #'yank + "C-r" #'evil-paste-from-register + "C-k" #'ivy-previous-line + "C-j" #'ivy-next-line + "C-A-k" #'ivy-scroll-down-command + "C-A-j" #'ivy-scroll-up-command + "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 From fe2ffa525cfec930db5316ad940a69c737a3fa4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:25:48 -0400 Subject: [PATCH 0651/4235] config/default: fix C-b/C-f in evil ex command line --- modules/config/default/+bindings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index d14df16fb..2b64eb399 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -736,7 +736,9 @@ (:after evil (:map evil-ex-completion-map - "C-a" #'move-beginning-of-line)) + "C-a" #'move-beginning-of-line + "C-b" #'backward-word + "C-f" #'forward-word)) (:map messages-buffer-mode-map "M-;" #'eval-expression From 66b0e77969f0e11d5b04b4234da3780950d3cad0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:27:33 -0400 Subject: [PATCH 0652/4235] config/default: rebind evil-numbers/dec-at-pt to C-A #342 This keybind is simply too destructive. --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2b64eb399..a4cb7e2f9 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -330,7 +330,7 @@ :v "C-p" "\"0p" :nv "C-a" #'evil-numbers/inc-at-pt - :nv "C-x" #'evil-numbers/dec-at-pt + :nv "C-A" #'evil-numbers/dec-at-pt ;; --- Plugin bindings ------------------------------ From 24fddad66dde443809d1c9c81f70815e0cc5cd00 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:29:40 -0400 Subject: [PATCH 0653/4235] config/default: C-A => C-S-a #342 The former doesn't work. --- modules/config/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a4cb7e2f9..792e560ba 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -329,8 +329,8 @@ ;; paste from recent yank register (which isn't overwritten) :v "C-p" "\"0p" - :nv "C-a" #'evil-numbers/inc-at-pt - :nv "C-A" #'evil-numbers/dec-at-pt + :nv "C-a" #'evil-numbers/inc-at-pt + :nv "C-S-a" #'evil-numbers/dec-at-pt ;; --- Plugin bindings ------------------------------ From 3e9990ef0e46790cf9fb4dfb9d7ea5a7fa970d9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 01:34:41 -0400 Subject: [PATCH 0654/4235] config/default: remove defunct C-p yank keybind Other maps are overshadowing it. "0p is an excellent alternative anyway. --- modules/config/default/+bindings.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 792e560ba..e78b14188 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -326,8 +326,6 @@ ;; 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" :nv "C-a" #'evil-numbers/inc-at-pt :nv "C-S-a" #'evil-numbers/dec-at-pt From 1da1ca1496a9b500fea7f53bdec6d55577247d3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 02:00:02 -0400 Subject: [PATCH 0655/4235] ui/posframe: posframe-delete-all on doom-cleanup-hook --- modules/ui/posframe/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 8b24c0a8f..b70cb54d9 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -7,6 +7,7 @@ (def-package! posframe :defer t :config + (add-hook 'doom-cleanup-hook #'posframe-delete-all) (add-hook 'doom-escape-hook #'+posframe|delete-on-escape)) From fa22dcc7a46de75428d852ab7d5b54b71d6b89c1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 02:00:20 -0400 Subject: [PATCH 0656/4235] ui/posframe: refactor +posframe|delete-on-escape --- modules/ui/posframe/autoload.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el index 7ff93493b..dd16f0dad 100644 --- a/modules/ui/posframe/autoload.el +++ b/modules/ui/posframe/autoload.el @@ -15,8 +15,13 @@ ;;;###autoload (defun +posframe|delete-on-escape () "TODO" - (when (cl-loop for frame in (frame-list) - if (and (frame-parameter frame 'posframe-buffer) - (not (frame-visible-p frame))) - return t) - (posframe-delete-all))) + (unless (frame-parameter (selected-frame) 'posframe-buffer) + (cl-loop for frame in (frame-list) + if (and (frame-parameter frame 'posframe-buffer) + (not (frame-visible-p frame))) + do (delete-frame frame)) + (dolist (buffer (buffer-list)) + (let ((frame (buffer-local-value 'posframe--frame buffer))) + (when (and frame (or (not (frame-live-p frame)) + (not (frame-visible-p frame)))) + (posframe--kill-buffer buffer)))))) From 6a1b3473e82fc6276e09106fc11e4a5c026f391f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 02:02:33 -0400 Subject: [PATCH 0657/4235] ui/posframe: silence emacs version output in company-childframe-mode --- modules/ui/posframe/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index b70cb54d9..26c7e519b 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -15,6 +15,7 @@ :when (featurep! :completion company) :after company :config + (setq company-childframe-notification nil) (company-childframe-mode 1) (after! desktop (push '(company-childframe-mode . nil) desktop-minor-mode-table))) From 6a2d244b4cd97fcabe5b178bcdfb771365e61fd3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 02:53:47 -0400 Subject: [PATCH 0658/4235] ui/posframe: reduce ivy posframe's jumpiness --- modules/ui/posframe/autoload.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el index dd16f0dad..d163a3aea 100644 --- a/modules/ui/posframe/autoload.el +++ b/modules/ui/posframe/autoload.el @@ -8,9 +8,11 @@ ;;;###autoload (defun +posframe-poshandler-frame-center-near-bottom (info) "TODO" - (let ((pos (posframe-poshandler-frame-center info))) - (cons (car pos) - (truncate (* (cdr pos) 1.4))))) + (let* ((posframe (plist-get info :posframe)) + (parent-frame (plist-get info :parent-frame))) + (let ((pos (posframe-poshandler-frame-center info))) + (cons (car pos) + (truncate (/ (frame-pixel-height parent-frame) 1.6)))))) ;;;###autoload (defun +posframe|delete-on-escape () From 2a6029ddff876009a0b57079c1296ed280b26a7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 03:01:49 -0400 Subject: [PATCH 0659/4235] feature/syntax-checker: move popup-top/popup init into def-package! --- modules/feature/syntax-checker/config.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 109f82443..210ab7e6f 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -31,18 +31,18 @@ ;; + tty Emacs (anywhere): popup-tip (def-package! flycheck-pos-tip - :commands (flycheck-pos-tip-mode) + :unless IS-MAC + :after flycheck :config (setq flycheck-pos-tip-timeout 10 ;; fallback to flycheck-popup-tip in terminal Emacs flycheck-pos-tip-display-errors-tty-function #'flycheck-popup-tip-show-popup - flycheck-display-errors-delay 0.7)) + flycheck-display-errors-delay 0.7) + (flycheck-pos-tip-mode)) (def-package! flycheck-popup-tip - :commands (flycheck-popup-tip-mode flycheck-popup-tip-show-popup)) + :commands (flycheck-popup-tip-mode flycheck-popup-tip-show-popup) + :after flycheck + :config (if IS-MAC (flycheck-popup-tip-mode))) -(after! flycheck - (if IS-MAC - (flycheck-popup-tip-mode) - (flycheck-pos-tip-mode))) From 2b2aac4417b11359a540a26322a7e3bef5d14acf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 03:17:15 -0400 Subject: [PATCH 0660/4235] ui/posframe: don't auto-adjust ivy-posframe height --- modules/ui/posframe/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 26c7e519b..097249c6d 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -48,6 +48,7 @@ (setq ivy-height 16 ivy-fixed-height-minibuffer nil ivy-posframe-parameters `((min-width . 90) + (min-height . ,ivy-height) (internal-border-width . 10))) (unless ivy-posframe-font (setq ivy-posframe-font (font-spec :family (font-get doom-font :family) :size 18)))) From 03e6900d3c6b88fe8093d9f74c5cbc239141e58b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Mar 2018 03:17:53 -0400 Subject: [PATCH 0661/4235] doom//packages-update: output feedback earlier --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 17a5b3241..5add741da 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -393,8 +393,8 @@ package.el as appropriate." (defun doom//packages-update () "Interactive command for updating packages." (interactive) - (doom-refresh-packages doom-debug-mode) (message! "Looking for outdated packages...") + (doom-refresh-packages doom-debug-mode) (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) (cond ((not packages) (message! (green "Everything is up-to-date"))) From 44d30ca3ceb10e987fdaeacdc9acb5300238c484 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 04:49:14 -0400 Subject: [PATCH 0662/4235] Fix doom-active-minor-modes --- core/autoload/debug.el | 2 +- modules/ui/posframe/config.el | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 7937a1ede..bb886f902 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -37,7 +37,7 @@ whose car is the list of faces and cadr is the list of overlay faces." (defun doom-active-minor-modes () "Get a list of active minor-mode symbols." (cl-loop for mode in minor-mode-list - unless (and (boundp mode) (symbol-value mode)) + if (and (boundp mode) (symbol-value mode)) collect mode)) ;;;###autoload diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 097249c6d..4334e170c 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -42,7 +42,11 @@ (push (list fn :cleanup 'ivy-posframe-cleanup) ivy-display-functions-props)) (push '(t . +posframe-ivy-display-at-frame-center-near-bottom) ivy-display-functions-alist) - (push '(swiper . nil) ivy-display-functions-alist) + + ;; posframe doesn't work well with async sources + (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) + (push (cons fn nil) ivy-display-functions-alist)) + (ivy-posframe-enable) (setq ivy-height 16 From ccaf5eabbddc6367b3876f107ad8a94603034a74 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 04:52:09 -0400 Subject: [PATCH 0663/4235] Fix switch-window hooks; add switch-buffer hooks --- core/core-ui.el | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 1b94a01b0..1f3bbbe9b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -284,15 +284,19 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; Custom hooks ;; -(defun doom*after-switch-window-hooks (&rest _) - (run-hooks 'doom-after-switch-window-hook)) -(defun doom*before-switch-window-hooks (&rest _) - (run-hooks 'doom-before-switch-window-hook)) +(defun doom*switch-window-hooks (orig-fn &rest args) + (run-hook-with-args 'doom-before-switch-window-hook) + (prog1 (apply orig-fn args) + (run-hook-with-args 'doom-after-switch-window-hook))) +(defun doom*switch-buffer-hooks (orig-fn &rest args) + (run-hook-with-args 'doom-before-switch-buffer-hook) + (prog1 (apply orig-fn args) + (run-hook-with-args 'doom-after-switch-buffer-hook))) -(advice-add #'select-frame :before #'doom*before-switch-window-hooks) -(advice-add #'select-frame :after #'doom*after-switch-window-hooks) -(advice-add #'select-window :before #'doom*before-switch-window-hooks) -(advice-add #'select-window :after #'doom*after-switch-window-hooks) +(advice-add #'select-frame :around #'doom*switch-window-hooks) +(advice-add #'select-window :around #'doom*switch-window-hooks) +(advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) +(advice-add #'display-buffer :around #'doom*switch-buffer-hooks) ;; From c0e5152b8f54d2e493bd0ac98fca85c87b91b02e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 17:25:25 -0400 Subject: [PATCH 0664/4235] lang/org: replace +org-capture/open with org-capture --- modules/config/default/+bindings.el | 2 +- modules/lang/org/autoload/org-capture.el | 17 ----------------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e78b14188..e90426a7b 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -230,7 +230,7 @@ (: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 "Org capture" :n "x" #'org-capture :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 3cec07ba5..afcef7aa6 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -1,23 +1,6 @@ ;;; lang/org/autoload/org-capture.el -*- lexical-binding: t; -*- ;;;###if (featurep! +capture) -;;;###autoload -(defun +org-capture/open (&optional string key) - "Sends STRING, the current selection or prompted input to `org-capture'. - -Uses the capture template specified by KEY. Otherwise, prompts you for one." - (interactive) - (let ((key (or key "n"))) - (if-let* ((string (cond ((not (equal string "")) - string) - ((region-active-p) - (buffer-substring-no-properties - (region-beginning) - (region-end)))))) - (org-capture-string string key) - (org-capture nil key)))) - - ;; --- External frame --------------------- (defvar +org-capture-window-params From 10b7d2d17889507a00ac1fc35e6b7110e1ccfb28 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 17:26:55 -0400 Subject: [PATCH 0665/4235] config/default: SPC i r = counsel-evil-registers --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e90426a7b..8bce35fc4 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -225,6 +225,7 @@ (:desc "insert" :prefix "i" :desc "From kill-ring" :nv "y" #'counsel-yank-pop + :desc "From evil registers" :nv "r" #'counsel-evil-registers :desc "From snippet" :nv "s" #'yas-insert-snippet) (:desc "notes" :prefix "n" From cdbd67742392349c941d0093057abc2c94e52940 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:25:22 -0400 Subject: [PATCH 0666/4235] Allow use of package.el #444 This makes package.el commands safe to use in Doom, and prevents errors caused by unitialized state, by running package-initialize before you use a package.el command. --- core/autoload/packages.el | 160 ++++++++++++++++---------------------- core/core-packages.el | 20 +++-- 2 files changed, 77 insertions(+), 103 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 5add741da..577dee55c 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -6,11 +6,51 @@ (require 'package) (require 'async) +;;; Private functions +(defsubst doom--sort-alpha (it other) + (string-lessp (symbol-name (car it)) + (symbol-name (car other)))) + +(defun doom--packages-choose (prompt) + (let ((table (cl-loop for pkg in package-alist + unless (package-built-in-p (cdr pkg)) + collect (cons (package-desc-full-name (cdr pkg)) + (cdr pkg))))) + (cdr (assoc (completing-read prompt + (mapcar #'car table) + nil t) + table)))) + +(defmacro doom--condition-case! (&rest body) + `(condition-case-unless-debug ex + (condition-case ex2 + (progn ,@body) + ('file-error + (message! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) + (message! " Trying again...") + (quiet! (doom-refresh-packages-maybe t)) + ,@body)) + ('user-error + (message! (bold (red " ERROR: %s" ex)))) + ('error + (doom--refresh-pkg-cache) + (message! (bold (red " FATAL ERROR: %s" ex)))))) + +(defun doom--refresh-pkg-cache () + "Clear the cache for `doom-refresh-packages-maybe'." + (setq doom--refreshed-p nil) + (doom-cache-set 'last-pkg-refresh nil)) + + +;; +;; Library +;; + ;;;###autoload -(defun doom-refresh-packages (&optional force-p) - "Refresh ELPA packages." +(defun doom-refresh-packages-maybe (&optional force-p) + "Refresh ELPA packages, if it hasn't been refreshed recently." (when force-p - (doom-refresh-clear-cache)) + (doom--refresh-pkg-cache)) (unless (or (doom-cache-get 'last-pkg-refresh) doom--refreshed-p) (condition-case-unless-debug ex @@ -19,16 +59,10 @@ (package-refresh-contents) (doom-cache-set 'last-pkg-refresh t 900)) ('error - (doom-refresh-clear-cache) + (doom--refresh-pkg-cache) (message "Failed to refresh packages: (%s) %s" (car ex) (error-message-string ex)))))) -;;;###autoload -(defun doom-refresh-clear-cache () - "Clear the cache for `doom-refresh-packages'." - (setq doom--refreshed-p nil) - (doom-cache-set 'last-pkg-refresh nil)) - ;;;###autoload (defun doom-package-backend (name &optional noerror) "Get which backend the package NAME was installed with. Can either be elpa or @@ -215,48 +249,6 @@ Used by `doom//packages-install'." (doom-package-different-recipe-p name))) collect desc)) -;;;###autoload -(defun doom*package-delete (desc &rest _) - "Update `quelpa-cache' upon a successful `package-delete'." - (let ((name (package-desc-name desc))) - (when (and (not (package-installed-p name)) - (assq name quelpa-cache)) - (map-delete quelpa-cache name) - (quelpa-save-cache) - (let ((path (expand-file-name (symbol-name name) quelpa-build-dir))) - (when (file-exists-p path) - (delete-directory path t)))))) - -;;; Private functions -(defsubst doom--sort-alpha (it other) - (string-lessp (symbol-name (car it)) - (symbol-name (car other)))) - -(defun doom--packages-choose (prompt) - (let ((table (cl-loop for pkg in package-alist - unless (package-built-in-p (cdr pkg)) - collect (cons (package-desc-full-name (cdr pkg)) - (cdr pkg))))) - (cdr (assoc (completing-read prompt - (mapcar #'car table) - nil t) - table)))) - -(defmacro doom--condition-case! (&rest body) - `(condition-case-unless-debug ex - (condition-case ex2 - (progn ,@body) - ('file-error - (message! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) - (message! " Trying again...") - (quiet! (doom-refresh-packages t)) - ,@body)) - ('user-error - (message! (bold (red " ERROR: %s" ex)))) - ('error - (doom-refresh-clear-cache) - (message! (bold (red " FATAL ERROR: %s" ex)))))) - ;; ;; Main functions @@ -369,7 +361,7 @@ package.el as appropriate." (message! (yellow "Aborted!"))) (t - (doom-refresh-packages doom-debug-mode) + (doom-refresh-packages-maybe doom-debug-mode) (dolist (pkg packages) (message! "Installing %s" (car pkg)) (doom--condition-case! @@ -394,7 +386,7 @@ package.el as appropriate." "Interactive command for updating packages." (interactive) (message! "Looking for outdated packages...") - (doom-refresh-packages doom-debug-mode) + (doom-refresh-packages-maybe doom-debug-mode) (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) (cond ((not packages) (message! (green "Everything is up-to-date"))) @@ -475,38 +467,6 @@ package.el as appropriate." ;; Interactive commands ;; -;;;###autoload -(defalias 'doom/install-package #'package-install) - -;;;###autoload -(defun doom/reinstall-package (desc) - "Reinstalls package package with optional quelpa RECIPE (see `quelpa-recipe' for -an example; the package package can be omitted)." - (declare (interactive-only t)) - (interactive - (list (doom--packages-choose "Reinstall package: "))) - (let ((package (package-desc-name desc))) - (doom-delete-package package t) - (doom-install-package package (cdr (assq package doom-packages))))) - -;;;###autoload -(defun doom/delete-package (desc) - "Prompts the user with a list of packages and deletes the selected package. -Use this interactively. Use `doom-delete-package' for direct calls." - (declare (interactive-only t)) - (interactive - (list (doom--packages-choose "Delete package: "))) - (let ((package (package-desc-name desc))) - (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") - package) - (message "Aborted")) - (message "%s isn't installed" package)))) - ;;;###autoload (defun doom/update-package (pkg) "Prompts the user with a list of outdated packages and updates the selected @@ -521,6 +481,7 @@ calls." nil t) (user-error "All packages are up to date")))) (list (cdr (assq (car (assoc package package-alist)) packages))))) + (doom-initialize-packages) (cl-destructuring-bind (package old-version new-version) pkg (if-let* ((desc (doom-package-outdated-p package))) (let ((old-v-str (package-version-join old-version)) @@ -533,10 +494,25 @@ calls." (message "Aborted"))) (message "%s is up-to-date" package)))) + +;; +;; Advice +;; + ;;;###autoload -(defun doom/refresh-packages (&optional force-p) - "Synchronize package metadata with the sources in `package-archives'. If -FORCE-P (the universal argument) is set, ignore the cache." - (declare (interactive-only t)) - (interactive "P") - (doom-refresh-packages force-p)) +(defun doom*package-delete (desc &rest _) + "Update `quelpa-cache' upon a successful `package-delete'." + (let ((name (package-desc-name desc))) + (when (and (not (package-installed-p name)) + (assq name quelpa-cache)) + (map-delete quelpa-cache name) + (quelpa-save-cache) + (let ((path (expand-file-name (symbol-name name) quelpa-build-dir))) + (when (file-exists-p path) + (delete-directory path t)))))) + +;;;###autoload +(defun doom*initialize-packages (&rest _) + "TODO" + (unless doom-init-p + (doom-initialize-packages))) diff --git a/core/core-packages.el b/core/core-packages.el index 806d28d46..ae3e2192d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -35,15 +35,7 @@ ;; just Emacs. Arguably, my config is still over-complicated, but shhh, it's ;; fine. Everything is fine. ;; -;; You should be able to use package.el commands without any conflicts, but to -;; be absolutely certain use the doom alternatives: -;; -;; + `package-install': `doom/install-package' -;; + `package-reinstall': `doom/reinstall-package' -;; + `package-delete': `doom/delete-package' -;; + `package-update': `doom/update-package' -;; + `package-autoremove': `doom//packages-autoremove' -;; + `package-refresh-contents': `doom/refresh-packages' +;; You should be able to use package.el commands without any conflicts. ;; ;; See core/autoload/packages.el for more functions. @@ -852,14 +844,20 @@ compiled packages.'" ;; -;; Package.el modifications +;; Make package.el cooperate with Doom ;; +(advice-add #'package-install :before #'doom*initialize-packages) +(advice-add #'package-reinstall :before #'doom*initialize-packages) +(advice-add #'package-delete :before #'doom*initialize-packages) +(advice-add #'package-refresh-contents :before #'doom*initialize-packages) + ;; Updates QUELPA after deleting a package (advice-add #'package-delete :after #'doom*package-delete) -;; It isn't safe to use `package-autoremove', so get rid of it +;; Replace with Doom variants (advice-add #'package-autoremove :override #'doom//packages-autoremove) +(advice-add #'package-install-selected-packages :override #'doom//packages-install) (provide 'core-packages) ;;; core-packages.el ends here From cfe2fe87d9159e33c202420f23ec3e5fd6b81800 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:26:58 -0400 Subject: [PATCH 0667/4235] Reduce screen flicker when creating a new frame ...by only reloading the theme if the new frame is of a different type from the last (tty and GUI frames). --- core/core-ui.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 1f3bbbe9b..14dc67585 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -417,6 +417,8 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; +(defvar doom-last-frame-type window-system) + (defun doom|init-theme () "Set the theme and load the font, in that order." (when doom-theme @@ -459,7 +461,9 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; frames, however. There's always `doom//reload-theme' if you need it! (defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." - (when (or (daemonp) (not (display-graphic-p))) + (when (and (not (eq doom-last-frame-type window-system)) + (or (daemonp) (not (display-graphic-p)))) + (setq doom-last-frame-type window-system) (with-selected-frame frame (doom|init-theme)))) From aec4fbe590dc789e3cd029500781b27400c24176 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:28:25 -0400 Subject: [PATCH 0668/4235] Always apply ansi color codes to compilation buffers --- core/core-packages.el | 4 +--- core/core-ui.el | 6 ++++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index ae3e2192d..d207996e9 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -566,9 +566,7 @@ loads MODULE SUBMODULE's packages.el file." t))) (defun doom-packages--async-run (fn) - (let* ((default-directory doom-emacs-dir) - (compilation-filter-hook - (list (lambda () (ansi-color-apply-on-region compilation-filter-start (point)))))) + (let* ((default-directory doom-emacs-dir)) (compile (format "%s --quick --batch -l core/core.el -f %s" (executable-find "emacs") (symbol-name fn))) diff --git a/core/core-ui.el b/core/core-ui.el index 14dc67585..89b205404 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -506,6 +506,10 @@ confirmation." t)) (setq confirm-kill-emacs #'doom-quit-p) +(defun doom|ansi-color-apply () + "TODO" + (ansi-color-apply-on-region compilation-filter-start (point))) + (defun doom|no-fringes-in-minibuffer () "Disable fringes in the minibuffer window." (set-window-fringes (minibuffer-window) 0 0 nil)) @@ -567,6 +571,8 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) ;; Renames major-modes [pedantry intensifies] (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) + ;; Ensure ansi codes in compilation buffers are replaced + (add-hook 'compilation-filter-hook #'doom|ansi-color-apply) ;; (run-hooks 'doom-init-ui-hook)) From 1352ac4553d95641e4d946a3c4945d879fdb99db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:28:48 -0400 Subject: [PATCH 0669/4235] Exclude images and remote files from recentf --- core/core-editor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 5e3832bf8..eed0e4e30 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -106,7 +106,8 @@ fundamental-mode) for performance sake." recentf-max-saved-items 300 recentf-filename-handlers '(file-truename) recentf-exclude - (list "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" + (list #'file-remote-p "\\.\\(gz\\|gif\\|svg\\|png\\|jpe?g\\)$" + "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) (concat "^" (file-truename doom-local-dir))))) From ce091ddde6fbee61ffe5ca4c36170090c4323025 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:29:16 -0400 Subject: [PATCH 0670/4235] Improve reliability of 'nocache & without-project-cache! macro --- core/core-projects.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index a293a8fc2..e2f6322ef 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -53,7 +53,9 @@ (defmacro without-project-cache! (&rest body) "Run BODY with projectile's project-root cache disabled. This is necessary if you want to interactive with a project other than the one you're in." - `(let (projectile-project-name + `(let ((projectile-project-root-files-functions + (remq 'projectile-root-local projectile-project-root-files-functions)) + projectile-project-name projectile-require-project-root projectile-cached-buffer-file-name projectile-cached-project-root) From e59fd751074ac103888d61013f1f651e64ebf245 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:29:40 -0400 Subject: [PATCH 0671/4235] feature/popup: make compilation popups larger --- modules/feature/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index bbf578190..3151d9404 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -151,7 +151,7 @@ ALIST supports one custom parameter: `size', which will resolve to (when (featurep! +defaults) (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) - (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" nil '((transient . 0) (quit . t))) + (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" '((size . 0.3)) '((transient . 0) (quit . t))) (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) (set! :popup "^\\*[Hh]elp" '((slot . 2) (vslot . 2) (size . 0.2)) From 4edb7999e9880c8805919a30c957e7439218498e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:30:14 -0400 Subject: [PATCH 0672/4235] feature/popup: refactor how closing unsaved popups are handled --- modules/feature/popup/autoload.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 50834725c..a25587ddb 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -60,11 +60,10 @@ and enables `+popup-buffer-mode'." (let ((buffer (window-buffer window)) ttl) (when (and (buffer-file-name buffer) - (buffer-modified-p buffer)) - (with-current-buffer buffer - (if (y-or-n-p "Popup buffer is modified. Save it?") - (save-buffer) - (set-buffer-modified-p nil)))) + (buffer-modified-p buffer) + (y-or-n-p "Popup buffer is modified. Save it?")) + (with-current-buffer buffer (save-buffer))) + (set-buffer-modified-p nil) (let ((ignore-window-parameters t)) (delete-window window)) (unless (window-live-p window) From d84222b6d0594dd18782bd21b0f4101e5a568caa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:31:48 -0400 Subject: [PATCH 0673/4235] feature/workspaces: use new switch-buffer hooks --- .../feature/workspaces/autoload/workspaces.el | 11 ++++++++++ modules/feature/workspaces/config.el | 20 +++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index f0e0b610a..51d554431 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -453,6 +453,17 @@ the next." ;; Hooks ;; +;;;###autoload +(defun +workspaces|auto-add-buffer () + "Auto-associate buffers with perspectives upon opening them. + +Allows a perspective-specific buffer list via `+workspaces-buffer-list'." + (when (and persp-mode + (not persp-temporarily-display-buffer) + (doom-real-buffer-p)) + (persp-add-buffer (current-buffer) (get-current-persp) nil) + (force-mode-line-update t))) + ;;;###autoload (defun +workspaces|protect-buffers-in-other-persps () "Return nil if this buffer is present in other perspectives/workspaces (bury diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 3bd18da39..4518fe81f 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -114,26 +114,16 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; 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) + + ;; (add-hook 'kill-buffer-query-functions #'+workspaces|protect-buffers-in-other-persps) + (add-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) ;; Remap `buffer-list' to current workspace's buffers in ;; `doom-buffer-list' - (advice-add #'switch-to-buffer :after #'+workspaces*auto-add-buffer) - (advice-add #'display-buffer :after #'+workspaces*auto-add-buffer) (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) (t + (remove-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) (remove-hook 'kill-buffer-query-functions #'+workspaces|protect-buffers-in-other-persps) - (advice-remove #'switch-to-buffer #'+workspaces*auto-add-buffer) - (advice-remove #'display-buffer #'+workspaces*auto-add-buffer) - (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) - - (defun +workspaces*auto-add-buffer (buffer &rest _) - "Auto-associate buffers with perspectives upon opening them. - -Allows a perspective-specific buffer list via `+workspaces-buffer-list'." - (when (and persp-mode - (not persp-temporarily-display-buffer) - (doom-real-buffer-p buffer)) - (persp-add-buffer buffer (get-current-persp) nil) - (force-mode-line-update t)))) + (advice-remove #'doom-buffer-list #'+workspace-buffer-list))))) From f8fa07d66863dcf32dfc4d505d3d3ba8d7456456 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:33:26 -0400 Subject: [PATCH 0674/4235] Move magit from features/version-control to new tools/magit module --- init.example.el | 1 + modules/feature/version-control/+git.el | 15 ------- modules/feature/version-control/packages.el | 3 +- modules/tools/magit/config.el | 50 +++++++++++++++++++++ modules/tools/magit/packages.el | 7 +++ 5 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 modules/tools/magit/config.el create mode 100644 modules/tools/magit/packages.el diff --git a/init.example.el b/init.example.el index 83871ee59..11e33925e 100644 --- a/init.example.el +++ b/init.example.el @@ -76,6 +76,7 @@ impatient-mode ; show off code over HTTP ;macos ; MacOS-specific commands make ; run make tasks from Emacs + ;magit ; neotree ; a project drawer, like NERDTree for vim password-store ; password manager for nerds pdf ; pdf enhancements diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index e00283683..c042437d1 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -65,8 +65,6 @@ (def-package! git-timemachine :commands (git-timemachine git-timemachine-toggle) :config - (require 'magit-blame) - ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of ;; showing revision details in the minibuffer, show them in ;; `header-line-format', which has better visibility. @@ -77,19 +75,6 @@ (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state)) -(def-package! magit - :defer t - :init (load "magit-autoloads" nil t) - :config - (set! :popup "^\\*?magit" :ignore) - (set! :evil-state 'magit-status-mode 'emacs) - (after! evil - ;; Switch to emacs state only while in `magit-blame-mode', then back when - ;; its done (since it's a minor-mode). - (add-hook! 'magit-blame-mode-hook - (evil-local-mode (if magit-blame-mode -1 +1))))) - - (def-package! git-link :commands (git-link git-link-commit git-link-homepage)) diff --git a/modules/feature/version-control/packages.el b/modules/feature/version-control/packages.el index 05623f80b..088ec8cd9 100644 --- a/modules/feature/version-control/packages.el +++ b/modules/feature/version-control/packages.el @@ -10,7 +10,6 @@ (package! git-link) (package! git-timemachine) (package! gitconfig-mode) - (package! gitignore-mode) - (package! magit)) + (package! gitignore-mode)) ;;; TODO +hg diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el new file mode 100644 index 000000000..d626847ef --- /dev/null +++ b/modules/tools/magit/config.el @@ -0,0 +1,50 @@ +;;; tools/magit/config.el -*- lexical-binding: t; -*- + +(def-package! magit + :defer t + :init + (load "magit-autoloads" nil t) + :config + (set! :popup "^\\*?magit" :ignore) + (set! :evil-state 'magit-status-mode 'emacs) + + (push 'magit-repolist-mode evil-snipe-disabled-modes) + (map! :map magit-repolist-mode-map + :n "j" #'next-line + :n "k" #'previous-line + :n "s" #'magit-repolist-status) + + ;; (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) + ;; (set! :popup "^.*magit" '((slot . -1) (side . right) (size . 80)) '((modeline . nil) (select . t))) + ;; (set! :popup "^\\*magit.*popup\\*" '((slot . 0) (side . right)) '((modeline . nil) (select . t))) + ;; (set! :popup "^.*magit-revision:.*" '((slot . 2) (side . right) (window-height . 0.6)) '((modeline . nil) (select . t))) + ;; (set! :popup "^.*magit-diff:.*" '((slot . 2) (side . right) (window-height . 0.6)) '((modeline . nil) (select . nil))) + + (after! evil + ;; Switch to emacs state only while in `magit-blame-mode', then back when + ;; its done (since it's a minor-mode). + (add-hook! 'magit-blame-mode-hook + (evil-local-mode (if magit-blame-mode -1 +1))))) + + +(def-package! magit-blame + :commands magit-blame + :after git-timemachine) + + +(def-package! magithub + :commands (magithub-clone magithub-feature-autoinject) + :after magit + :config + (load "magithub-autoloads" nil t) + (magithub-feature-autoinject t) + (setq magithub-dir (concat doom-etc-dir "magithub/") + magithub-clone-default-directory "~/" + magithub-preferred-remote-method 'clone_url)) + + +(def-package! evil-magit + :when (featurep! :feature evil) + :after magit + :config + (setq evil-magit-state 'normal)) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el new file mode 100644 index 000000000..132e1fc30 --- /dev/null +++ b/modules/tools/magit/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/magit/packages.el + +(package! magit) +(package! magithub) +(when (featurep! :feature evil) + (package! evil-magit)) From b19d30b145784fc10f1194fc7f727c61876f819b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:34:09 -0400 Subject: [PATCH 0675/4235] config/default: replace :build cmd w/ :compile --- modules/config/default/+evil-commands.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 64a9a0636..979620c44 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -17,6 +17,11 @@ (kill-new default-directory) (message "Copied to clipboard"))) +(evil-define-command doom:compile (command &optional bang) + (interactive "") + (let ((default-directory (if bang (doom-project-root t) default-directory))) + (compile command))) + ;; ;; Commands @@ -90,7 +95,7 @@ (ex! "sw[oop]" #'+helm:swoop) (ex! "todo" #'+helm:todo))) ;; Project tools -(ex! "build" #'+eval/build) +(ex! "compile" #'doom:compile) (ex! "debug" #'+debug/run) (ex! "er[rors]" #'flycheck-list-errors) ;; File operations From de730535a45401a91e0294e403242d605e423679 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:44:55 -0400 Subject: [PATCH 0676/4235] lang/rust: fix +rust-cargo-project-p not detecting nearer Cargo.toml files --- modules/lang/rust/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/rust/autoload.el b/modules/lang/rust/autoload.el index 2b94b95de..71f98665e 100644 --- a/modules/lang/rust/autoload.el +++ b/modules/lang/rust/autoload.el @@ -5,4 +5,4 @@ ;;;###autoload (defun +rust-cargo-project-p () "Return t if this is a cargo project." - (doom-project-has! "Cargo.toml")) + (locate-dominating-file buffer-file-name "Cargo.toml")) From e728e8d04f926907cc2dd3a7d08581e9d9e8dd22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:47:28 -0400 Subject: [PATCH 0677/4235] feature/lookup: fix docset lookup & setting; add doom-etc-dir/docsets to default paths --- modules/feature/lookup/autoload/lookup.el | 8 ++-- modules/feature/lookup/config.el | 47 ++++++++++++----------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 26b8250fa..517625001 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -145,9 +145,11 @@ Goes down a list of possible backends: (+lookup--jump-to :documentation identifier))) ((and (featurep! :feature lookup +docsets) - (cl-find-if #'helm-dash-docset-installed-p - (or (bound-and-true-p counsel-dash-docsets) - (bound-and-true-p helm-dash-docsets)))) + (or (require 'counsel-dash nil t) + (require 'helm-dash nil t)) + (or (bound-and-true-p counsel-dash-docsets) + (bound-and-true-p helm-dash-docsets)) + (helm-dash-installed-docsets)) (+lookup/in-docsets identifier)) ((featurep! :feature lookup +devdocs) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 28cc3e650..bda652f67 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -138,34 +138,35 @@ DOCSETS, to instruct it to append (or remove) those from the docsets already set by a major-mode, if any. Used by `+lookup/in-docsets' and `+lookup/documentation'." - (cl-loop with ivy-p = (featurep! :completion ivy) - for mode in (doom-enlist (doom-unquote modes)) - for hook-sym = (intern (format "+docs|init-for-%s" mode)) - for var-sym = (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets) - collect hook-sym into hooks - collect - `(defun ,hook-sym () - (make-variable-buffer-local ',var-sym) - (cond ((eq ',(car docsets) :add) - `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) - ((eq ',(car docsets) :remove) - `(setq ,var-sym - (cl-loop with to-delete = (list ,@(cdr docsets)) - for docset in ,var-sym - unless (member docset to-delete) - collect docset))) - (`(setq ,var-sym (list ,@docsets))))) - into forms - finally return `(progn ,@forms (add-hook! ,modes ',hooks)))) + (let* ((modes (doom-unquote modes)) + (ivy-p (featurep! :completion ivy)) + (hook-sym (intern (format "+lookup|%s-docsets--%s" + (cond ((eq ',(car docsets) :add) 'add) + ((eq ',(car docsets) :remove) 'remove) + ('set)) + (string-join docsets "-")))) + (var-sym (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets))) + `(progn + (defun ,hook-sym () + (make-variable-buffer-local ',var-sym) + ,(cond ((eq ',(car docsets) :add) + `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) + ((eq ',(car docsets) :remove) + `(setq ,var-sym + (cl-loop with to-delete = (list ,@(cdr docsets)) + for docset in ,var-sym + unless (member docset to-delete) + collect docset))) + (`(setq ,var-sym (list ,@docsets))))) + (add-hook! ,modes #',hook-sym)))) ;; Both packages depend on helm-dash (def-package! helm-dash :commands (helm-dash helm-dash-install-docset helm-dash-at-point - helm-dash-docset-installed-p) + helm-dash-docset-installed-p helm-dash-installed-docsets) :config - ;; Obey XDG conventions - (when-let* ((xdg-data-home (getenv "XDG_DATA_HOME"))) - (setq helm-dash-docsets-path (expand-file-name "docsets" xdg-data-home))) + (unless (file-directory-p helm-dash-docsets-path) + (setq helm-dash-docsets-path (concat doom-etc-dir "docsets/"))) (unless (file-directory-p helm-dash-docsets-path) (make-directory helm-dash-docsets-path t)) (setq helm-dash-enable-debugging doom-debug-mode)) From 844e5191ad216b7cf33cbd86a4cb8b23e89f1859 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:48:10 -0400 Subject: [PATCH 0678/4235] feature/lookup: add rust, scs, gfm, nim & typescript defaults to devdocs --- modules/feature/lookup/config.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index bda652f67..301f7fcb0 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -191,5 +191,14 @@ See `devdocs-alist' for the defaults. " `(dolist (mode ',modes) (push (cons mode ,docset) devdocs-alist))) - (def-package! devdocs :defer t)) + (def-package! devdocs + :defer t + :config + (setq devdocs-alist + (append '((rust-mode . "rust") + (scss-mode . "scss") + (gfm-mode . "markdown") + (nim-mode . "nim") + (typescript-mode . "typescript")) + devdocs-alist)))) From d44182df96d48dc018e37db9ca743328ea93199a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:48:38 -0400 Subject: [PATCH 0679/4235] lang/emacs-lisp: prefer Emacs Lisp docset for doc lookup --- modules/lang/emacs-lisp/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 6704c7ff5..5963347d4 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -5,9 +5,7 @@ :config (set! :repl 'emacs-lisp-mode #'+emacs-lisp/repl) (set! :eval 'emacs-lisp-mode #'+emacs-lisp-eval) - - ;; An xref backend is set up automatically for emacs-lisp-mode - (set! :lookup 'emacs-lisp-mode :documentation #'describe-symbol) + (set! :docset '(lisp-mode emacs-lisp-mode) "Emacs Lisp") (set! :rotate 'emacs-lisp-mode :symbols '(("t" "nil") From efdcb01c19c68ca9a9ff99948ebe912e1d5f30dc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:49:26 -0400 Subject: [PATCH 0680/4235] lang/org: change default +org-dir to ~/org --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 35fb95b15..6056aced1 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -1,6 +1,6 @@ ;;; lang/org/config.el -*- lexical-binding: t; -*- -(defvar +org-dir (expand-file-name "~/work/org/") +(defvar +org-dir (expand-file-name "~/org/") "The directory where org files are kept.") ;; Sub-modules From 8bd68064ef4fc101c614054d3ee632b9464772bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:50:10 -0400 Subject: [PATCH 0681/4235] lang/web: register docsets for css, scss & sass --- modules/lang/web/+css.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index c23f566b0..577b22f05 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -39,6 +39,8 @@ :mode "\\.css$" :mode ("\\.scss$" . scss-mode) :config + (set! :docset 'css-mode "CSS") + (set! :docset 'scss-mode "Sass") (set! :company-backend '(css-mode scss-mode) 'company-css) (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) @@ -46,6 +48,7 @@ (def-package! sass-mode :mode "\\.sass$" :config + (set! :docset 'sass-mode "Sass") (set! :company-backend 'sass-mode 'company-css) (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) From dba1f20dd3920c03c6f6bc1a947e5c45ea3573d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 18:51:08 -0400 Subject: [PATCH 0682/4235] ui/doom-dashboard: refresh dashboard on buffer switch --- 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 a4099afd4..dbb820b98 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -91,6 +91,7 @@ Possible values: (add-hook 'focus-in-hook #'+doom-dashboard-reload) (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) + (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) (when (daemonp) (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) ;; `persp-mode' integration: update `default-directory' when switching From dac0307a8004d5ef5d9436ac2dec8f16771ce8b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:03:28 -0400 Subject: [PATCH 0683/4235] Rewrite menu system On consecutive runs, def-menu dispatchers now rerun the last command, unless the universal argument is passed. e.g. SPC u SPC m b The :cwd and :project properties now accept functions (take no arguments and return a directory or boolean). --- core/autoload/menu.el | 105 ++++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 45 deletions(-) diff --git a/core/autoload/menu.el b/core/autoload/menu.el index c9e86a0b5..722ebec53 100644 --- a/core/autoload/menu.el +++ b/core/autoload/menu.el @@ -7,6 +7,9 @@ "The method to use to prompt the user with the menu. This takes two arguments: PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") +(defvar-local doom-menu-last-command nil + "TODO") + (defun doom-menu-read-default (prompt commands) "Default method for displaying a completion-select prompt." (completing-read prompt (mapcar #'car commands))) @@ -19,27 +22,31 @@ PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") ;;;###autoload (defun doom--menu-exec (plist) - (let ((command (plist-get plist :exec)) - (cwd (plist-get plist :cwd))) - (let ((default-directory - (cond ((eq cwd t) (doom-project-root)) - ((stringp cwd) cwd) - (t default-directory)))) - (cond ((stringp command) - (with-current-buffer (get-buffer-create "*compilation*") - (save-window-excursion - (compile command)) - (setq header-line-format - (concat (propertize "$ " 'face 'font-lock-doc-face) - (propertize command 'face 'font-lock-preprocessor-face))) - (pop-to-buffer (current-buffer)))) - ((or (symbolp command) - (functionp command)) - (call-interactively command)) - ((and command (listp command)) - (eval command t)) - (t - (error "Not a valid command: %s" command)))))) + (save-selected-window + (let ((command (plist-get plist :exec)) + (cwd (plist-get plist :cwd))) + (let ((default-directory + (cond ((eq cwd t) (doom-project-root)) + ((stringp cwd) cwd) + ((functionp cwd) (funcall cwd)) + (t default-directory)))) + (cond ((stringp command) + (let (buf) + (compile command) + (setq buf next-error-last-buffer) + (unless buf + (error "Couldn't create compilation buffer")) + (with-current-buffer buf + (setq header-line-format + (concat (propertize "$ " 'face 'font-lock-doc-face) + (propertize command 'face 'font-lock-preprocessor-face)))))) + ((or (symbolp command) + (functionp command)) + (call-interactively command)) + ((and command (listp command)) + (eval command t)) + (t + (error "Not a valid command: %s" command))))))) ;;;###autoload (defmacro def-menu! (name desc commands &rest plist) @@ -56,8 +63,8 @@ PROPERTIES accepts the following properties: :when FORM :unless FORM :region BOOL - :cwd t|PATH - :project BOOL|DIRECTORY + :cwd BOOL|PATH|FUNCTION + :project BOOL|PATH|FUNCTION COMMAND can be a string (a shell command), a symbol (an elisp function) or a lisp form. @@ -70,34 +77,42 @@ lisp form. (prop-prompt (or (plist-get plist :prompt) "> ")) (prop-sort (plist-get plist :sort))) `(progn - (defvar ,commands-var + (defconst ,commands-var ,(if prop-sort `(cl-sort ,commands #'string-lessp :key #'car) commands) ,(format "Menu for %s" name)) - (defun ,name () - ,desc - (interactive) + (defun ,name (arg) + ,(concat + (if (stringp desc) (concat desc "\n\n")) + "This is a command dispatcher. It will rerun the last command on\n" + "consecutive executions. If ARG (universal argument) is non-nil\n" + "then it always prompt you.") + (interactive "P") (unless ,commands-var (user-error "The '%s' menu is empty" ',name)) (doom--menu-exec - (or (doom--menu-read - ,prop-prompt - (or (cl-remove-if-not - (let ((project-root (doom-project-root))) - (lambda (cmd) - (let ((plist (cdr cmd))) - (and (cond ((not (plist-member plist :region)) t) - ((plist-get plist :region) (use-region-p)) - (t (not (use-region-p)))) - (let ((when (plist-get plist :when)) - (unless (plist-get plist :unless)) - (project (plist-get plist :project))) - (or (or (not when) (eval when)) - (or (not unless) (not (eval unless))) - (and (stringp project) - (file-in-directory-p buffer-file-name project-root)))))))) - ,commands-var) - (user-error "No commands available here"))) + (or (unless arg doom-menu-last-command) + (setq doom-menu-last-command + (doom--menu-read + ,prop-prompt + (or (cl-remove-if-not + (let ((project-root (doom-project-root))) + (lambda (cmd) + (let ((plist (cdr cmd))) + (and (cond ((not (plist-member plist :region)) t) + ((plist-get plist :region) (use-region-p)) + (t (not (use-region-p)))) + (let ((when (plist-get plist :when)) + (unless (plist-get plist :unless)) + (project (plist-get plist :project))) + (when (functionp project) + (setq project (funcall project))) + (or (or (not when) (eval when)) + (or (not unless) (not (eval unless))) + (and (stringp project) + (file-in-directory-p buffer-file-name project-root)))))))) + ,commands-var) + (user-error "No commands available here")))) (user-error "No command selected"))))))) From 1765ca7282e3165483602306c771ea03dd0896f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:06:42 -0400 Subject: [PATCH 0684/4235] lang/rust: add :docset --- modules/lang/rust/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index bea1bf719..a638cb0b1 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -8,6 +8,7 @@ :mode "\\.rs$" :config (set! :env "RUST_SRC_PATH") + (set! :docset 'rust-mode "Rust") (setq rust-indent-method-chain t) (def-menu! +rust/build-menu "TODO" From 0d056149be19aac24cfa4a94e6b72c0e8796be27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:07:31 -0400 Subject: [PATCH 0685/4235] lang/rust: refactor & bind +rust/build-menu --- modules/lang/rust/config.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index a638cb0b1..01dbd9f29 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -10,10 +10,15 @@ (set! :env "RUST_SRC_PATH") (set! :docset 'rust-mode "Rust") (setq rust-indent-method-chain t) + + (map! :map rust-mode-map + :localleader + :n "b" #'+rust/build-menu) (def-menu! +rust/build-menu "TODO" - '(("run" :exec "cargo run" :cwd t :when (+rust-cargo-project-p)) - ("build" :exec "cargo build" :cwd t :when (+rust-cargo-project-p))) + '(("cargo run" :exec "cargo run --color always") + ("cargo build" :exec "cargo build --color always") + ("cargo test" :exec "cargo test --color always")) :prompt "Cargo: ")) From 692472b6bf5e2ff67acf5c10fa35ab0093093bc8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:08:39 -0400 Subject: [PATCH 0686/4235] config/default: M-b = compile --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 8bce35fc4..fceb63f71 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -53,7 +53,7 @@ ;; Other sensible, textmate-esque global bindings :ne "M-r" #'+eval/buffer :ne "M-R" #'+eval/region-and-replace - :ne "M-b" #'projectile-compile-project + :ne "M-b" #'compile :ne "M-a" #'mark-whole-buffer :ne "M-c" #'evil-yank :ne "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) From 9961df061e107ed8f2b3f244d97df745f16c2538 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:44:57 -0400 Subject: [PATCH 0687/4235] config/default: :compile => :make; improve :make doom:make now performs file modifier substitution, e.g. %:p:h. --- modules/config/default/+evil-commands.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 979620c44..9290fcbc2 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -17,9 +17,10 @@ (kill-new default-directory) (message "Copied to clipboard"))) -(evil-define-command doom:compile (command &optional bang) - (interactive "") - (let ((default-directory (if bang (doom-project-root t) default-directory))) +(evil-define-command doom:make (command &optional from-pwd) + (interactive "") + (let ((default-directory (if from-pwd default-directory (doom-project-root t))) + (command (and command (evil-ex-replace-special-filenames command)))) (compile command))) @@ -95,7 +96,7 @@ (ex! "sw[oop]" #'+helm:swoop) (ex! "todo" #'+helm:todo))) ;; Project tools -(ex! "compile" #'doom:compile) +(ex! "mak[e]" #'doom:make) (ex! "debug" #'+debug/run) (ex! "er[rors]" #'flycheck-list-errors) ;; File operations From aeb030e3911e82ae18c699d5273bd50d5d267cbc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:45:51 -0400 Subject: [PATCH 0688/4235] config/default: new +default/compile command (bound to M-b) --- modules/config/default/+bindings.el | 2 +- modules/config/default/autoload/default.el | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index fceb63f71..e87700c92 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -53,7 +53,7 @@ ;; Other sensible, textmate-esque global bindings :ne "M-r" #'+eval/buffer :ne "M-R" #'+eval/region-and-replace - :ne "M-b" #'compile + :ne "M-b" #'+default/compile :ne "M-a" #'mark-whole-buffer :ne "M-c" #'evil-yank :ne "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 1e7810e31..15ba85e03 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -38,3 +38,20 @@ (defun +default/browse-snippets () (interactive) (doom-project-browse emacs-snippets-dir)) ;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' + + +;;;###autoload +(defun +default/compile (arg) + "Runs `compile' from the root of the current project. + +If a compilation window is already open, recompile that instead. + +If ARG (universal argument), runs `compile' from the current directory." + (interactive "P") + (if (and (bound-and-true-p compilation-in-progress) + (buffer-live-p compilation-last-buffer)) + (recompile) + (call-interactively + (if arg + #'projectile-compile-project + #'compile)))) From 73f397560b07d9d3839118af5e5c4edf56116e32 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:50:03 -0400 Subject: [PATCH 0689/4235] completion/ivy: remove yank-pop remap (doesn't work) --- modules/completion/ivy/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 1057f456d..1963353d7 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -90,7 +90,6 @@ immediately runs it on the current candidate (ending the ivy session)." [remap execute-extended-command] #'counsel-M-x [remap find-file] #'counsel-find-file [remap find-library] #'counsel-find-library - [remap yank-pop] #'counsel-yank-pop [remap info-lookup-symbol] #'counsel-info-lookup-symbol [remap imenu] #'counsel-imenu [remap recentf-open-files] #'counsel-recentf From 8898c5cb9a102cd568d4a4472451259b01bd9540 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 19:52:23 -0400 Subject: [PATCH 0690/4235] Fix void-function doom*initialize-packages error Occurs before autoloads are generated. --- core/autoload/packages.el | 5 ----- core/core-packages.el | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 577dee55c..901a0bc8b 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -511,8 +511,3 @@ calls." (when (file-exists-p path) (delete-directory path t)))))) -;;;###autoload -(defun doom*initialize-packages (&rest _) - "TODO" - (unless doom-init-p - (doom-initialize-packages))) diff --git a/core/core-packages.el b/core/core-packages.el index d207996e9..765a461bc 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -845,6 +845,9 @@ compiled packages.'" ;; Make package.el cooperate with Doom ;; +(defun doom*initialize-packages (&rest _) + (unless doom-init-p (doom-initialize-packages))) + (advice-add #'package-install :before #'doom*initialize-packages) (advice-add #'package-reinstall :before #'doom*initialize-packages) (advice-add #'package-delete :before #'doom*initialize-packages) From c54fb7b8c0f5c6ac27ce203cc249b5493b7938ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 20:12:08 -0400 Subject: [PATCH 0691/4235] Fix package advice interfering with doom-initialize ...by aggressively reloading the config from within doom-initialize (too early, some state hasn't been initialized at this point). --- core/autoload/packages.el | 1 + core/core-packages.el | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 901a0bc8b..c9babd6f8 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -502,6 +502,7 @@ calls." ;;;###autoload (defun doom*package-delete (desc &rest _) "Update `quelpa-cache' upon a successful `package-delete'." + (doom-initialize-packages) (let ((name (package-desc-name desc))) (when (and (not (package-installed-p name)) (assq name quelpa-cache)) diff --git a/core/core-packages.el b/core/core-packages.el index 765a461bc..8151a85ce 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -845,13 +845,12 @@ compiled packages.'" ;; Make package.el cooperate with Doom ;; -(defun doom*initialize-packages (&rest _) - (unless doom-init-p (doom-initialize-packages))) +(defun doom*initialize-packages (&rest _) (package-initialize)) -(advice-add #'package-install :before #'doom*initialize-packages) -(advice-add #'package-reinstall :before #'doom*initialize-packages) (advice-add #'package-delete :before #'doom*initialize-packages) +(advice-add #'package-install :before #'doom*initialize-packages) (advice-add #'package-refresh-contents :before #'doom*initialize-packages) +(advice-add #'package-reinstall :before #'doom*initialize-packages) ;; Updates QUELPA after deleting a package (advice-add #'package-delete :after #'doom*package-delete) From c760b33212ed5ee531b45f90a386cde96fce7394 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 14 Mar 2018 21:21:58 -0400 Subject: [PATCH 0692/4235] Fix recursive load errors when an enabled module doesn't exist --- core/core-packages.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 8151a85ce..d6bfea435 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -362,10 +362,11 @@ MODULES is an malformed plist of modules to load." ((let ((submodule (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) (let ((path (doom-module-find-path module submodule))) - (doom-module-set module submodule :flags flags :path path) - (push `(let ((doom--current-module ',(cons module submodule))) - (load! init ,path t)) - load-forms)))))) + (when path + (doom-module-set module submodule :flags flags :path path) + (push `(let ((doom--current-module ',(cons module submodule))) + (load! init ,path t)) + load-forms))))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) (let ((doom--initializing t)) From 627280c5da83a3d7c1b2af90d0a34ca9b60731eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Mar 2018 00:20:40 -0400 Subject: [PATCH 0693/4235] make run now supports additional args via the ARGS envvar --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1f0a347ca..02dd5f9d7 100644 --- a/Makefile +++ b/Makefile @@ -74,7 +74,7 @@ testi: | init.el .local/autoloads.el ## Utility tasks # Runs Emacs from a different folder than ~/.emacs.d; only use this for testing! run: - @$(DOOMI) --eval "(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)" + @$(DOOMI) $(ARGS) --eval "(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)" # Diagnoses potential OS/environment issues doctor: From 2a45b80e2a77a1966c4df8669d88862a5f04d554 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Mar 2018 04:49:49 -0400 Subject: [PATCH 0694/4235] Revert cfe2fe87; needs better checks --- core/core-ui.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 89b205404..0aa56965c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -417,8 +417,6 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defvar doom-last-frame-type window-system) - (defun doom|init-theme () "Set the theme and load the font, in that order." (when doom-theme @@ -461,9 +459,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; frames, however. There's always `doom//reload-theme' if you need it! (defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." - (when (and (not (eq doom-last-frame-type window-system)) - (or (daemonp) (not (display-graphic-p)))) - (setq doom-last-frame-type window-system) + (when (or (daemonp) (not (display-graphic-p))) (with-selected-frame frame (doom|init-theme)))) From cc2e4e192bd9b9ff63cd5d2738c1d0dc202d8bf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Mar 2018 14:38:15 -0400 Subject: [PATCH 0695/4235] Disable ui/posframe by default --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 11e33925e..de99fd8cc 100644 --- a/init.example.el +++ b/init.example.el @@ -65,7 +65,7 @@ ;tabbar ; FIXME an (incomplete) tab bar for Emacs vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows - posframe ; use child frames where possible (Emacs 26+ only) + ;posframe ; use child frames where possible (Emacs 26+ only) :tools dired ; making dired pretty [functional] From 0260d60dd090d55e6e61967dda9644c8f59aa907 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Mar 2018 22:45:07 -0400 Subject: [PATCH 0696/4235] lang/org: fix kill-confirm prompt when refiling from org-capture #462 --- modules/lang/org/+capture.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index dd2039b98..2859b4875 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -36,6 +36,13 @@ (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) + ;; fix #462: when refiling from org-capture, Emacs prompts to kill the + ;; underlying, modified buffer. This fixes that. + (defun +org-capture*refile (orig-fn &rest args) + (when org-capture-is-refiling + (org-save-all-org-buffers))) + (advice-add 'org-refile :after #'+org-capture*refile) + (when (featurep! :feature evil) (add-hook 'org-capture-mode-hook #'evil-insert-state)) From 9168dfd7337c43b9b4511d90ed7a1d5c8313dc7b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Mar 2018 00:38:10 -0400 Subject: [PATCH 0697/4235] lang/cc: add build-conda to irony-cdb-search-directory-list --- 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 c9a2e1b1f..a6d503872 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -129,13 +129,15 @@ compilation database is present in the project.") (def-package! irony :after cc-mode :commands (irony-install-server irony-mode) - :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) + :preface + (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) :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 + (setq irony-cdb-search-directory-list '("." "build" "build-conda")) ;; Initialize compilation database, if present. Otherwise, fall back on ;; `+cc-default-compiler-options'. (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options)) From 9a247f4dc17b763c8e89680a26d23e417fa9b5d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 16 Mar 2018 02:31:05 -0400 Subject: [PATCH 0698/4235] ui/posframe: fix wrong-type-argument error when doom-font is unset --- modules/ui/posframe/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 4334e170c..8aa90e2ee 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -54,8 +54,10 @@ ivy-posframe-parameters `((min-width . 90) (min-height . ,ivy-height) (internal-border-width . 10))) - (unless ivy-posframe-font - (setq ivy-posframe-font (font-spec :family (font-get doom-font :family) :size 18)))) + (when (and (not ivy-posframe-font) doom-font) + (setq ivy-posframe-font + (font-spec :family (font-get doom-font :family) + :size 18)))) ;; TODO helm-posframe? From a9c8f8f41b41197e5fb8f0b80562b6627ddc5d67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 02:35:52 -0400 Subject: [PATCH 0699/4235] ui/doom-dashboard: lock point in buttons #465 --- modules/ui/doom-dashboard/config.el | 33 ++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index dbb820b98..80f354ced 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -63,29 +63,42 @@ Possible values: (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))) + finally do (setq fringe-indicator-alist alist)) + (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) (map! :map +doom-dashboard-mode-map "n" #'+doom-dashboard/next-button "p" #'+doom-dashboard/previous-button "N" #'+doom-dashboard/last-button "P" #'+doom-dashboard/first-button - [remap evil-insert] #'ignore - [remap evil-replace] #'ignore - [remap evil-change] #'ignore - [remap evil-visual-char] #'ignore - [remap evil-visual-line] #'ignore (:when (featurep! :feature evil) - :em "j" #'+doom-dashboard/next-button - :em "k" #'+doom-dashboard/previous-button - :em "gg" #'+doom-dashboard/first-button - :em "G" #'+doom-dashboard/last-button)) + :m "j" #'+doom-dashboard/next-button + :m "k" #'+doom-dashboard/previous-button + :m "gg" #'+doom-dashboard/first-button + :m "G" #'+doom-dashboard/last-button + + [remap evil-delete] #'ignore + [remap evil-delete-line] #'ignore + [remap evil-insert] #'ignore + [remap evil-append] #'ignore + [remap evil-replace] #'ignore + [remap evil-replace-state] #'ignore + [remap evil-change] #'ignore + [remap evil-change-line] #'ignore + [remap evil-visual-char] #'ignore + [remap evil-visual-line] #'ignore)) ;; ;; Hooks ;; +(defun +doom-dashboard|reposition-point () + "Trap the point in the buttons." + (unless (button-at (point)) + (or (+doom-dashboard/previous-button) + (+doom-dashboard/first-button)))) + (defun +doom-dashboard|init () "Initializes Doom's dashboard." (add-hook 'focus-in-hook #'+doom-dashboard-reload) From 01cb16cf42fb0da048fb7e4739ff1f1d3872ee2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 02:36:12 -0400 Subject: [PATCH 0700/4235] ui/doom-dashboard: minor refactor --- modules/ui/doom-dashboard/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 80f354ced..b6a240c8f 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -56,9 +56,11 @@ Possible values: (define-derived-mode +doom-dashboard-mode special-mode (format "DOOM v%s" doom-version) + :syntax-table nil + :abbrev-table nil "Major mode for the DOOM dashboard buffer." - (read-only-mode +1) - (setq truncate-lines t) + (setq truncate-lines t + buffer-read-only t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) (cl-loop for (car . _cdr) in fringe-indicator-alist @@ -101,7 +103,6 @@ Possible values: (defun +doom-dashboard|init () "Initializes Doom's dashboard." - (add-hook 'focus-in-hook #'+doom-dashboard-reload) (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) From 4a32213b3823996ab7beeaa46937056f2788224d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 02:37:10 -0400 Subject: [PATCH 0701/4235] feature/popup: make modeline-setting more reliable Some popups may retain their mode-line. Especially popups whose buffers are displayed before their mode or content is inserted (maybe asynchronously). This change tries to tackle that; ensuring that mode-line setting is more consistent. --- modules/feature/popup/autoload.el | 31 +++++++++++++++++++------------ modules/feature/popup/config.el | 5 ++++- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index a25587ddb..63aab8c6a 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -180,6 +180,7 @@ Uses `shrink-window-if-larger-than-buffer'." (add-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) (add-hook 'doom-escape-hook #'+popup|close-on-escape t) (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) + (add-hook 'after-change-major-mode-hook #'+popup|set-modeline-on-enable) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist window--sides-inhibit-check t) @@ -189,6 +190,7 @@ Uses `shrink-window-if-larger-than-buffer'." (remove-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) (remove-hook 'doom-escape-hook #'+popup|close-on-escape) (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) + (remove-hook 'after-change-major-mode-hook #'+popup|set-modeline-on-enable) (setq display-buffer-alist +popup--old-display-buffer-alist window--sides-inhibit-check nil) (+popup|cleanup-rules) @@ -221,7 +223,7 @@ disabled." (set-window-fringes nil f f fringes-outside-margins))) ;;;###autoload -(defun +popup|set-modeline () +(defun +popup|set-modeline-on-enable () "Don't show modeline in popup windows without a `modeline' window-parameter. + If one exists and it's a symbol, use `doom-modeline' to grab the format. @@ -229,17 +231,22 @@ disabled." + If nil (or omitted), then hide the modeline entirely (the default). + If a function, it takes the current buffer as its argument and must return one of the above values." - (if +popup-buffer-mode - (let ((modeline (+popup-parameter-fn 'modeline nil (current-buffer)))) - (cond ((eq modeline 't)) - ((or (eq modeline 'nil) - (not modeline)) - (hide-mode-line-mode +1)) - ((symbolp modeline) - (when-let* ((hide-mode-line-format (doom-modeline modeline))) - (hide-mode-line-mode +1))))) - (when (bound-and-true-p hide-mode-line-mode) - (hide-mode-line-mode -1)))) + (when +popup-buffer-mode + (let ((modeline (+popup-parameter-fn 'modeline nil (current-buffer)))) + (cond ((eq modeline 't)) + ((or (eq modeline 'nil) + (null modeline)) + (hide-mode-line-mode +1)) + ((symbolp modeline) + (when-let* ((hide-mode-line-format (doom-modeline modeline))) + (hide-mode-line-mode +1))))))) + +;;;###autoload +(defun +popup|unset-modeline-on-disable () + "Restore the modeline when `+popup-buffer-mode' is deactivated." + (when (and (not +popup-buffer-mode) + (bound-and-true-p hide-mode-line-mode)) + (hide-mode-line-mode -1))) ;;;###autoload (defun +popup|close-on-escape () diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 3151d9404..0dd831ea4 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -166,7 +166,10 @@ ALIST supports one custom parameter: `size', which will resolve to '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) (add-hook 'doom-init-ui-hook #'+popup-mode) -(add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes +popup|set-modeline)) +(add-hook! '+popup-buffer-mode-hook + #'(+popup|adjust-fringes + +popup|set-modeline-on-enable + +popup|unset-modeline-on-disable)) ;; From 85e443cca1d15a74fca7f6a7de4202ad94d58d39 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 02:38:35 -0400 Subject: [PATCH 0702/4235] lang/org: minor refactor of +org|remove-occur-highlights ESC hook --- modules/lang/org/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 6056aced1..c92f40887 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -229,9 +229,9 @@ unfold to point on startup." between the two." (defun +org|remove-occur-highlights () "Remove org occur highlights on ESC in normal mode." - (when (and (derived-mode-p 'org-mode) - org-occur-highlights) - (org-remove-occur-highlights))) + (when org-occur-highlights + (org-remove-occur-highlights) + t)) (add-hook 'doom-escape-hook #'+org|remove-occur-highlights) ;; C-a & C-e act like `doom/backward-to-bol-or-indent' and From 026ba51c42a71737722d9635e291928c9e886335 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 02:39:09 -0400 Subject: [PATCH 0703/4235] tools/term: ensure terms are opened in the correct directory --- modules/tools/term/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/term/autoload.el b/modules/tools/term/autoload.el index 25125e906..34ae5a5e1 100644 --- a/modules/tools/term/autoload.el +++ b/modules/tools/term/autoload.el @@ -5,7 +5,7 @@ "Open a terminal buffer in the current window. If PROJECT-ROOT (C-u) is non-nil, cd into the current project's root." (interactive "P") - (let ((default-directory (if project-root (doom-project-root) default-directory))) + (let ((default-directory (if project-root (doom-project-root 'nocache) default-directory))) (call-interactively #'multi-term))) ;;;###autoload @@ -14,7 +14,7 @@ non-nil, cd into the current project's root." current project's root." (interactive "P") (require 'multi-term) - (let ((default-directory (if project-root (doom-project-root) default-directory)) + (let ((default-directory (if project-root (doom-project-root 'nocache) default-directory)) (buffer (multi-term-get-buffer current-prefix-arg))) (pop-to-buffer buffer) (setq multi-term-buffer-list (nconc multi-term-buffer-list (list buffer))) From 5d69851f3943138e0a8e7344f422ce80f18ae3e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 02:39:32 -0400 Subject: [PATCH 0704/4235] feature/popup: possible fix for elusive 'at top level' bug Occasionally, a keyboard-quit bubbles up from popup's buffer cleanup process, causing all kinds of havoc; like killed term buffers (#436), abrupt interrupting of the minibuffer, and the point jumping around. This tries to fix this, but needs more testing! --- modules/feature/popup/autoload.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 63aab8c6a..e7958ae38 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -14,18 +14,19 @@ "Tries to kill BUFFER, as was requested by a transient timer. If it fails, eg. the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) - (let ((kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) - (cond ((eq ttl 0) - (kill-buffer buffer)) - ((get-buffer-window buffer) - (with-current-buffer buffer - (setq +popup--timer - (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) - ((with-demoted-errors "Error killing transient buffer: %s" - (let (confirm-kill-processes) - (when-let* ((process (get-buffer-process (current-buffer)))) - (kill-process process))) - (kill-buffer buffer))))))) + (with-temp-buffer + (let ((kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) + (cond ((eq ttl 0) + (kill-buffer buffer)) + ((get-buffer-window buffer) + (with-current-buffer buffer + (setq +popup--timer + (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) + ((with-demoted-errors "Error killing transient buffer: %s" + (let (confirm-kill-processes) + (when-let* ((process (get-buffer-process (current-buffer)))) + (kill-process process))) + (kill-buffer buffer)))))))) (defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the From 1b5758a6da4898cd2e405005e1cfa34447b1c394 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 03:36:05 -0400 Subject: [PATCH 0705/4235] Minor refactor --- core/core-keybinds.el | 2 +- modules/config/default/config.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 4c52213d1..ea76117e5 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -310,7 +310,7 @@ Example (dolist (keymap doom--keymaps) (push `(define-key ,keymap ,key ,def) forms))) (t - (push `(,(if doom--local 'local-set-key 'global-set-key) ,key ,def) + (push `(,(if doom--local #'local-set-key #'global-set-key) ,key ,def) forms)))) (setq states '() doom--local nil diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 7c5d3ebc8..98ab3476d 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -80,8 +80,8 @@ (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)) + (define-key evil-motion-state-map ";" ',next-func) + (define-key evil-motion-state-map "," ',prev-func)) (advice-add #',command :before #',fn-sym)))) ;; n/N From 3f85c76a2c07447f0017f50778beb98ddea258f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 03:36:36 -0400 Subject: [PATCH 0706/4235] ui/doom: use ':weight light' in +doom-folded-face --- modules/ui/doom/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 11e19cf0c..084b583e1 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -39,9 +39,9 @@ (after! hideshow (defface +doom-folded-face `((((background dark)) - (:inherit font-lock-comment-face :background ,(doom-color 'base0))) + (:inherit font-lock-comment-face :background ,(doom-color 'base0) :weight light)) (((background light)) - (:inherit font-lock-comment-face :background ,(doom-color 'base3)))) + (:inherit font-lock-comment-face :background ,(doom-color 'base3) :weight light))) "Face to hightlight `hideshow' overlays." :group 'doom-themes) From d75df875c9469cdfbfec5330bf01e6833f678e4c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 15:17:20 -0400 Subject: [PATCH 0707/4235] Trap cursor in buttons better in dashboard #465 --- modules/ui/doom-dashboard/config.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index b6a240c8f..11634f68d 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -97,9 +97,12 @@ Possible values: (defun +doom-dashboard|reposition-point () "Trap the point in the buttons." - (unless (button-at (point)) - (or (+doom-dashboard/previous-button) - (+doom-dashboard/first-button)))) + (or (ignore-errors + (if (button-at (point)) + (forward-button 0) + (backward-button 1))) + (progn (goto-char (point-min)) + (forward-button 1)))) (defun +doom-dashboard|init () "Initializes Doom's dashboard." From ff0b45299e63dcc24d51c201201faaa4821d3c8b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 15:17:40 -0400 Subject: [PATCH 0708/4235] Refactor dashboard autoload functions --- modules/ui/doom-dashboard/autoload.el | 27 --------------------------- modules/ui/doom-dashboard/config.el | 12 ++++-------- 2 files changed, 4 insertions(+), 35 deletions(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index f9c8d3b38..9663671fc 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -7,30 +7,3 @@ (with-selected-frame frame (switch-to-buffer (doom-fallback-buffer)) (+doom-dashboard-reload))) - -;;;###autoload -(defun +doom-dashboard/next-button () - "Jump to the next button after cursor." - (interactive) - (ignore-errors (goto-char (next-button (point))))) - -;;;###autoload -(defun +doom-dashboard/previous-button () - "Jump to the previous button after cursor." - (interactive) - (ignore-errors (goto-char (previous-button (point))))) - -;;;###autoload -(defun +doom-dashboard/first-button () - "Jump to the first button on the dashboard." - (interactive) - (goto-char (point-min)) - (+doom-dashboard/next-button)) - -;;;###autoload -(defun +doom-dashboard/last-button () - "Jump to the last button on the dashboard." - (interactive) - (goto-char (point-max)) - (+doom-dashboard/previous-button) - (beginning-of-line-text)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 11634f68d..f469ebc89 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -69,15 +69,11 @@ Possible values: (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) (map! :map +doom-dashboard-mode-map - "n" #'+doom-dashboard/next-button - "p" #'+doom-dashboard/previous-button - "N" #'+doom-dashboard/last-button - "P" #'+doom-dashboard/first-button + "n" #'forward-button + "p" #'backward-button (:when (featurep! :feature evil) - :m "j" #'+doom-dashboard/next-button - :m "k" #'+doom-dashboard/previous-button - :m "gg" #'+doom-dashboard/first-button - :m "G" #'+doom-dashboard/last-button + :m "j" #'forward-button + :m "k" #'backward-button [remap evil-delete] #'ignore [remap evil-delete-line] #'ignore From bf771dcbdbb21deee913bca3c7b568c13c7e61f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 15:18:19 -0400 Subject: [PATCH 0709/4235] Set evil jump point before counsel-ag (and variants) --- modules/completion/ivy/autoload/ivy.el | 7 ++++--- modules/completion/ivy/config.el | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 2648f9266..6bfa405f9 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -157,14 +157,15 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;;;###autoload (defun +ivy*counsel-ag-function (string) - "Advice to 1) get rid of the character limit from `counsel-ag-function' and 2) -disable ivy's over-zealous parentheses quoting behavior (if i want literal -parentheses, I'll escape them myself). + "Advice to get rid of the character limit from `counsel-ag-function' and use +`evil-set-jump' if evil is active. NOTE This may need to be updated frequently, to meet changes upstream (in counsel-rg)." (if (< (length string) 1) ; <-- modified the character limit (counsel-more-chars 1) ; <-- + (when (and (featurep 'evil) evil-mode) + (evil-set-jump)) (let ((default-directory (ivy-state-directory ivy-last)) (regex (counsel-unquote-regex-parens (setq ivy--old-re diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 1963353d7..0eb4b991e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -109,7 +109,8 @@ immediately runs it on the current candidate (ending the ivy session)." cmd '(("O" +ivy-git-grep-other-window-action "open in other window")))) - ;; Removes character limit from `counsel-ag-function' + ;; Removes character limit from `counsel-ag-function' and sets a jump point + ;; for `evil'. ;; ;; This may need to be updated frequently, to meet changes upstream. ;; counsel-ag, counsel-rg and counsel-pt all use this function From 4575cd9310dcff960f1b4243c7214e3fa93c1f77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 15:31:32 -0400 Subject: [PATCH 0710/4235] lang/lua: minor refactor --- modules/lang/lua/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 940871263..dd7d0568a 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,4 +1,4 @@ -;;; lang/lua/config.el --- lua + Love2D -*- lexical-binding: t; -*- +;;; lang/lua/config.el -*- lexical-binding: t; -*- (def-package! lua-mode :mode "\\.lua$" @@ -9,7 +9,7 @@ (set! :electric 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) ;; sp's lua-specific rules are obnoxious, so we disable them - (setq sp-pairs (delete (assq 'lua-mode sp-pairs) sp-pairs)) + (map-delete sp-pairs 'lua-mode) (def-menu! +lua/build-menu "Build/compilation commands for `lua-mode' buffers." From de40ccd361751fb57e83b8fe151a870303070813 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 15:33:08 -0400 Subject: [PATCH 0711/4235] tools/password-store: don't add to auth-sources by default #404 --- modules/tools/password-store/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 1609dab0b..52912280a 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -36,8 +36,8 @@ ;; Is built into Emacs 26+ -;; TODO don't add password-store to auth-sources? -(if (require 'auth-store-pass nil t) - (auth-source-pass-enable) - (def-package! auth-password-store - :config (auth-pass-enable))) +(when (featurep! +auth) + (if (require 'auth-store-pass nil t) + (auth-source-pass-enable) + (def-package! auth-password-store + :config (auth-pass-enable)))) From ff2f30f9b49c0266ae830a8f455fab47d2efc1c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 21:54:03 -0400 Subject: [PATCH 0712/4235] feature/evil: improve bf771dcb --- modules/completion/ivy/autoload/ivy.el | 2 -- modules/feature/evil/config.el | 7 ++++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 6bfa405f9..d7dd1ed1b 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -164,8 +164,6 @@ NOTE This may need to be updated frequently, to meet changes upstream (in counsel-rg)." (if (< (length string) 1) ; <-- modified the character limit (counsel-more-chars 1) ; <-- - (when (and (featurep 'evil) evil-mode) - (evil-set-jump)) (let ((default-directory (ivy-state-directory ivy-last)) (regex (counsel-unquote-regex-parens (setq ivy--old-re diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 3fc4f0550..bede221ff 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -152,7 +152,12 @@ (evil-set-command-properties '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t)) + '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t) + + ;; Ensure jump points are created + (defun +evil*set-jump (&rest _) + (evil-set-jump)) + (advice-add #'counsel-git-grep-action :before #'+evil*set-jump)) ;; From 8d72257aa6e966e4aebde0dafb0abd078a6f159b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 22:00:14 -0400 Subject: [PATCH 0713/4235] completion/ivy: refactor ag/rg/pt/git-grep advice functions They are no isolated to their evil use cases. --- modules/completion/ivy/autoload/evil.el | 104 +++++++++++++++++------- modules/completion/ivy/autoload/ivy.el | 17 ---- modules/completion/ivy/config.el | 9 +- 3 files changed, 74 insertions(+), 56 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 75e4c7fcc..790425520 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -48,37 +48,41 @@ (default-directory directory)) (setq +ivy--file-last-search query) (require 'counsel) - (pcase engine - ('grep - (let ((args (if recursion-p " -r")) - (counsel-projectile-grep-initial-input query) - (default-directory directory)) - (if all-files-p - (cl-letf (((symbol-function #'projectile-ignored-directories-rel) - (symbol-function #'ignore)) - ((symbol-function #'projectile-ignored-files-rel) - (symbol-function #'ignore))) - (counsel-projectile-grep args)) - (counsel-projectile-grep args)))) - ('ag - (let ((args (concat " -S" ; smart-case - (if all-files-p " -a") - (unless recursion-p " --depth 1")))) - (counsel-ag query directory args (format prompt args)))) - ('rg - (let ((args (concat " -S" ; smart-case - (if all-files-p " -uu") - (unless recursion-p " --maxdepth 1")))) - (counsel-rg query directory args (format prompt args)))) - ('pt - (let ((counsel-pt-base-command - (concat counsel-pt-base-command - " -S" ; smart-case - (if all-files-p " -U") - (unless recursion-p " --depth=1"))) - (default-directory directory)) - (counsel-pt query))) - (_ (error "No search engine specified"))))) + (cl-letf (((symbol-function 'counsel-ag-function) + (symbol-function '+ivy*counsel-ag-function)) + ((symbol-function 'counsel-git-grep-function) + (symbol-function '+ivy*counsel-git-grep-function))) + (pcase engine + ('grep + (let ((args (if recursion-p " -r")) + (counsel-projectile-grep-initial-input query) + (default-directory directory)) + (if all-files-p + (cl-letf (((symbol-function #'projectile-ignored-directories-rel) + (symbol-function #'ignore)) + ((symbol-function #'projectile-ignored-files-rel) + (symbol-function #'ignore))) + (counsel-projectile-grep args)) + (counsel-projectile-grep args)))) + ('ag + (let ((args (concat " -S" ; smart-case + (if all-files-p " -a") + (unless recursion-p " --depth 1")))) + (counsel-ag query directory args (format prompt args)))) + ('rg + (let ((args (concat " -S" ; smart-case + (if all-files-p " -uu") + (unless recursion-p " --maxdepth 1")))) + (counsel-rg query directory args (format prompt args)))) + ('pt + (let ((counsel-pt-base-command + (concat counsel-pt-base-command + " -S" ; smart-case + (if all-files-p " -U") + (unless recursion-p " --depth=1"))) + (default-directory directory)) + (counsel-pt query))) + (_ (error "No search engine specified")))))) ;;;###autoload (autoload '+ivy:pt "completion/ivy/autoload/evil" nil t) (evil-define-operator +ivy:pt (beg end query &optional all-files-p directory) @@ -160,3 +164,41 @@ NOTE: ripgrep doesn't support multiline searches (yet)." (interactive "") (let ((+ivy--file-search-recursion-p (not bang))) (+ivy:rg beg end query t default-directory))) + + +;; +;; Advice +;; + +;;;###autoload +(defun +ivy*counsel-ag-function (string) + "Advice to get rid of the character limit from `counsel-ag-function'. + +NOTE This may need to be updated frequently, to meet changes upstream (in +counsel-rg)." + (if (< (length string) 1) ; <-- modified the character limit + (counsel-more-chars 1) ; <-- + (let ((default-directory (ivy-state-directory ivy-last)) + (regex (counsel-unquote-regex-parens + (setq ivy--old-re + (ivy--regex string))))) + (counsel--async-command (format counsel-ag-command + (shell-quote-argument regex))) + nil))) + +;;;###autoload +(defun +ivy*counsel-git-grep-function (string) + "Advice to get rid of the character limit from `counsel-git-grep-function'. + +NOTE This may need to be updated frequently, to meet changes upstream (in +counsel-git-grep)." + (if (and (> counsel--git-grep-count counsel--git-grep-count-threshold) + (< (length string) 1)) ; <-- modified the character limit + (counsel-more-chars 1) ; <-- + (let* ((default-directory (ivy-state-directory ivy-last)) + (cmd (format counsel-git-grep-cmd + (setq ivy--old-re (ivy--regex string t))))) + (if (<= counsel--git-grep-count counsel--git-grep-count-threshold) + (split-string (shell-command-to-string cmd) "\n" t) + (counsel--gg-candidates (ivy--regex string)) + nil)))) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index d7dd1ed1b..1b3711a4b 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -155,23 +155,6 @@ search current file. See `+ivy-task-tags' to customize what this searches for." :action #'+ivy--tasks-open-action :caller '+ivy/tasks)) -;;;###autoload -(defun +ivy*counsel-ag-function (string) - "Advice to get rid of the character limit from `counsel-ag-function' and use -`evil-set-jump' if evil is active. - -NOTE This may need to be updated frequently, to meet changes upstream (in -counsel-rg)." - (if (< (length string) 1) ; <-- modified the character limit - (counsel-more-chars 1) ; <-- - (let ((default-directory (ivy-state-directory ivy-last)) - (regex (counsel-unquote-regex-parens - (setq ivy--old-re - (ivy--regex string))))) - (counsel--async-command (format counsel-ag-command - (shell-quote-argument regex))) - nil))) - ;;;###autoload (defun +ivy/wgrep-occur () "Invoke the search+replace wgrep buffer on the current ag/rg search results." diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 0eb4b991e..95c9798a9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -107,14 +107,7 @@ immediately runs it on the current candidate (ending the ivy session)." (dolist (cmd '(counsel-ag counsel-rg counsel-pt)) (ivy-add-actions cmd - '(("O" +ivy-git-grep-other-window-action "open in other window")))) - - ;; Removes character limit from `counsel-ag-function' and sets a jump point - ;; for `evil'. - ;; - ;; This may need to be updated frequently, to meet changes upstream. - ;; counsel-ag, counsel-rg and counsel-pt all use this function - (advice-add #'counsel-ag-function :override #'+ivy*counsel-ag-function)) + '(("O" +ivy-git-grep-other-window-action "open in other window"))))) (def-package! counsel-projectile From 46dbf8f490442173c1b10008977be07936a00094 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 18 Mar 2018 22:18:34 -0400 Subject: [PATCH 0714/4235] lang/lua: improve main.lua detection in +lua/run-love-game --- modules/lang/lua/autoload.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/lang/lua/autoload.el b/modules/lang/lua/autoload.el index 2fc165a41..d244c2000 100644 --- a/modules/lang/lua/autoload.el +++ b/modules/lang/lua/autoload.el @@ -11,9 +11,10 @@ (defun +lua/run-love-game () "Run the current project with Love2D." (interactive) - (async-shell-command - (format "%s %s" - (or (executable-find "love") - (if IS-MAC "open -a love.app")) - (shell-quote-argument (doom-project-root))))) + (when-let* ((root (locate-dominating-file buffer-file-name "main.lua"))) + (async-shell-command + (format "%s %s" + (or (executable-find "love") + (if IS-MAC "open -a love.app")) + (shell-quote-argument (file-name-directory root)))))) From ab180cd51e6ad73989ac34f2a1b69c4780bb4fcc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 02:02:11 -0400 Subject: [PATCH 0715/4235] Preselect last command in menus; reverse universal arg behavior + The universal argument tells a menu to use the last run command, if available. + If a last run command exists, preselect it in the menu. --- core/autoload/menu.el | 62 +++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/core/autoload/menu.el b/core/autoload/menu.el index 722ebec53..8afb19d85 100644 --- a/core/autoload/menu.el +++ b/core/autoload/menu.el @@ -12,12 +12,12 @@ PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") (defun doom-menu-read-default (prompt commands) "Default method for displaying a completion-select prompt." - (completing-read prompt (mapcar #'car commands))) + (completing-read prompt (mapcar #'car commands) nil nil nil nil (car doom-menu-last-command))) ;;;###autoload (defun doom--menu-read (prompt commands) (if-let* ((choice (funcall doom-menu-display-fn prompt commands))) - (cdr (assoc choice commands)) + (assoc choice commands) (user-error "Aborted"))) ;;;###autoload @@ -82,37 +82,41 @@ lisp form. `(cl-sort ,commands #'string-lessp :key #'car) commands) ,(format "Menu for %s" name)) - (defun ,name (arg) + (defun ,name (arg command) ,(concat (if (stringp desc) (concat desc "\n\n")) "This is a command dispatcher. It will rerun the last command on\n" "consecutive executions. If ARG (universal argument) is non-nil\n" "then it always prompt you.") - (interactive "P") - (unless ,commands-var - (user-error "The '%s' menu is empty" ',name)) + (declare (interactive-only t)) + (interactive + (list current-prefix-arg + (progn + (unless ,commands-var + (user-error "The '%s' menu is empty" ',name)) + (doom--menu-read + ,prop-prompt + (or (cl-remove-if-not + (let ((project-root (doom-project-root))) + (lambda (cmd) + (let ((plist (cdr cmd))) + (and (cond ((not (plist-member plist :region)) t) + ((plist-get plist :region) (use-region-p)) + (t (not (use-region-p)))) + (let ((when (plist-get plist :when)) + (unless (plist-get plist :unless)) + (project (plist-get plist :project))) + (when (functionp project) + (setq project (funcall project))) + (or (or (not when) (eval when)) + (or (not unless) (not (eval unless))) + (and (stringp project) + (file-in-directory-p (or buffer-file-name default-directory) + project-root)))))))) + ,commands-var) + (user-error "No commands available here")))))) (doom--menu-exec - (or (unless arg doom-menu-last-command) - (setq doom-menu-last-command - (doom--menu-read - ,prop-prompt - (or (cl-remove-if-not - (let ((project-root (doom-project-root))) - (lambda (cmd) - (let ((plist (cdr cmd))) - (and (cond ((not (plist-member plist :region)) t) - ((plist-get plist :region) (use-region-p)) - (t (not (use-region-p)))) - (let ((when (plist-get plist :when)) - (unless (plist-get plist :unless)) - (project (plist-get plist :project))) - (when (functionp project) - (setq project (funcall project))) - (or (or (not when) (eval when)) - (or (not unless) (not (eval unless))) - (and (stringp project) - (file-in-directory-p buffer-file-name project-root)))))))) - ,commands-var) - (user-error "No commands available here")))) - (user-error "No command selected"))))))) + (cdr (or (when arg doom-menu-last-command) + (setq doom-menu-last-command command) + (user-error "No command selected")))))))) From facd83a54b208e7a01b9cfbb91772bccb23a773e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 02:03:37 -0400 Subject: [PATCH 0716/4235] Remove redundant reload in +doom-dashboard/open --- modules/ui/doom-dashboard/autoload.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index 9663671fc..da9c96d5f 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -5,5 +5,4 @@ "Switch to the dashboard in the current window, of the current FRAME." (interactive (list (selected-frame))) (with-selected-frame frame - (switch-to-buffer (doom-fallback-buffer)) - (+doom-dashboard-reload))) + (switch-to-buffer (doom-fallback-buffer)))) From 31611f913a7e2f98dea6c6ee045a946b4b488a2b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 04:39:02 -0400 Subject: [PATCH 0717/4235] feature/evil: add evil-collection (with +everywhere flag) #459 --- init.example.el | 2 +- modules/feature/evil/config.el | 18 ++++++++++++------ modules/feature/evil/packages.el | 1 + 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/init.example.el b/init.example.el index de99fd8cc..f6c6e3473 100644 --- a/init.example.el +++ b/init.example.el @@ -35,7 +35,7 @@ +defaults) ; default popup rules ;debugger ; FIXME stepping through code, to help you add bugs eval ; run code, run (also, repls) - evil ; come to the dark side, we have cookies + (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files (lookup ; helps you navigate your code and documentation +devdocs ; ...on devdocs.io online diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bede221ff..f47562032 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -20,6 +20,18 @@ (autoload 'goto-last-change "goto-chg") (autoload 'goto-last-change-reverse "goto-chg") + +(def-package! evil-collection + :when (featurep! +everywhere) + :after evil + :preface + (setq evil-want-integration nil) ; must be set before evil is loaded + :config + (evil-collection-init) + ;; don't interfere with leader key + (map! :after compile :map compilation-mode-map doom-leader-key nil)) + + (def-package! evil :init (setq evil-want-C-u-scroll t @@ -62,12 +74,6 @@ (setq +evil--default-cursor-color (face-background 'cursor))) (add-hook 'doom-init-theme-hook #'+evil|update-cursor-color) - ;; default modes - (dolist (mode '(tabulated-list-mode view-mode comint-mode term-mode calendar-mode Man-mode)) - (evil-set-initial-state mode 'emacs)) - (dolist (mode '(help-mode debugger-mode grep-mode)) - (evil-set-initial-state mode 'normal)) - ;; --- keybind fixes ---------------------- (map! (:after wgrep diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index 4194b9bd1..9de021a53 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -4,6 +4,7 @@ (package! evil) (package! evil-args) (package! evil-commentary) +(package! evil-collection) (package! evil-easymotion) (package! evil-embrace) (package! evil-escape) From 4a29825e0de69f4d39136873c515935d0f6f7649 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 04:44:34 -0400 Subject: [PATCH 0718/4235] feature/evil: fix leader key in special-mode-map --- modules/feature/evil/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f47562032..42c08d824 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -29,7 +29,8 @@ :config (evil-collection-init) ;; don't interfere with leader key - (map! :after compile :map compilation-mode-map doom-leader-key nil)) + (map! :after compile :map compilation-mode-map doom-leader-key nil) + (evil-define-key '(normal visual) special-mode-map " " nil)) (def-package! evil From 221061b599f5dfb5c93d4b8788af0b06bda24425 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 04:45:04 -0400 Subject: [PATCH 0719/4235] feature/popup: (another) possible fix for elusive 'at top level' bug #436 --- modules/feature/popup/autoload.el | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index e7958ae38..342e4c75f 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -14,19 +14,19 @@ "Tries to kill BUFFER, as was requested by a transient timer. If it fails, eg. the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) - (with-temp-buffer - (let ((kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) - (cond ((eq ttl 0) - (kill-buffer buffer)) - ((get-buffer-window buffer) - (with-current-buffer buffer - (setq +popup--timer - (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) - ((with-demoted-errors "Error killing transient buffer: %s" - (let (confirm-kill-processes) - (when-let* ((process (get-buffer-process (current-buffer)))) - (kill-process process))) - (kill-buffer buffer)))))))) + (let ((inhibit-quit t) + (kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) + (cond ((eq ttl 0) + (kill-buffer buffer)) + ((get-buffer-window buffer) + (with-current-buffer buffer + (setq +popup--timer + (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) + ((with-demoted-errors "Error killing transient buffer: %s" + (let (confirm-kill-processes) + (when-let* ((process (get-buffer-process (current-buffer)))) + (kill-process process))) + (kill-buffer buffer))))))) (defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the From d07495e62690355702edf7bdf14a8866c95a0d5f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 04:52:52 -0400 Subject: [PATCH 0720/4235] feature/evil: add git-rebase-mode to evil-snipe-disabled-modes --- modules/feature/evil/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 42c08d824..032e5d4c2 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -333,7 +333,9 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-scope 'line evil-snipe-repeat-scope 'visible evil-snipe-char-fold t - evil-snipe-disabled-modes '(org-agenda-mode magit-mode elfeed-show-mode elfeed-search-mode) + evil-snipe-disabled-modes + '(org-agenda-mode magit-mode git-rebase-mode + elfeed-show-mode elfeed-search-mode) evil-snipe-aliases '((?\[ "[[{(]") (?\] "[]})]") (?\; "[;:]"))) From 20dd751792b1ef690a661ac333e8de217ebed28c Mon Sep 17 00:00:00 2001 From: Dragnucs Date: Mon, 19 Mar 2018 10:47:06 +0000 Subject: [PATCH 0721/4235] Add twig files Twig files already work nice with web-mode. So detecting them here. --- modules/lang/web/+html.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 49165d98f..9d9d92392 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -9,6 +9,7 @@ :mode "\\.mustache$" :mode "\\.tsx$" :mode "\\.vue$" + :mode "\\.twig$" :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config From 3e21187595e9bd4f0b7ea95a5989c573a20c32a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 14:11:42 -0400 Subject: [PATCH 0722/4235] feature/evil: evil-collection-company-use-tng = nil #459 #467 --- modules/feature/evil/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 032e5d4c2..c3c4c5d08 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -25,7 +25,9 @@ :when (featurep! +everywhere) :after evil :preface - (setq evil-want-integration nil) ; must be set before evil is loaded + ;; must be set before evil/evil-collcetion is loaded + (setq evil-want-integration nil + evil-collection-company-use-tng nil) :config (evil-collection-init) ;; don't interfere with leader key From 203f09e808a0c79b467b4a2dac2e0dd860658215 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 14:17:25 -0400 Subject: [PATCH 0723/4235] feature/evil: evil-define-key => evil-define-key* (don't defer) --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index c3c4c5d08..87ff12e16 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -32,7 +32,7 @@ (evil-collection-init) ;; don't interfere with leader key (map! :after compile :map compilation-mode-map doom-leader-key nil) - (evil-define-key '(normal visual) special-mode-map " " nil)) + (evil-define-key* '(normal visual) special-mode-map " " nil)) (def-package! evil From c5069099b9e1a6ddcdc6ccea76665dfa714801ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 14:43:45 -0400 Subject: [PATCH 0724/4235] config/default: rethink company keybinds --- modules/config/default/+bindings.el | 35 +++++++++++++++-------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e87700c92..4f6bc09f3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -353,25 +353,26 @@ (: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))) + "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 + [tab] #'company-complete-common-or-cycle + "S-TAB" #'company-select-previous + [backtab] #'company-select-previous) ;; 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)) + "C-n" #'company-select-next-or-abort + "C-p" #'company-select-previous-or-abort + "C-s" (λ! (company-search-abort) (company-filter-candidates)) + [escape] #'company-search-abort)) ;; counsel (:after counsel From 19e73bca1c463de90355bd49d0bc5306257a221d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 15:04:24 -0400 Subject: [PATCH 0725/4235] config/default: bind K to +lookup/documentation --- modules/config/default/+bindings.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4f6bc09f3..552a97514 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -315,7 +315,6 @@ :m "gT" #'+workspace/switch-left :m "gd" #'+lookup/definition :m "gD" #'+lookup/references - :m "gh" #'+lookup/documentation :n "gp" #'+evil/reselect-paste :n "gr" #'+eval:region :n "gR" #'+eval/buffer @@ -621,7 +620,7 @@ :n "!" #'rotate-text ;; smart-forward - :nv "K" #'smart-up + :nv "K" #'+lookup/documentation :m "g]" #'smart-forward :m "g[" #'smart-backward From 8798477de268c94c30cc9f034d4ba1c184c6efb5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 16:08:29 -0400 Subject: [PATCH 0726/4235] feature/evil: don't rebind gd/K/gz in major modes #459 --- modules/feature/evil/config.el | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 87ff12e16..68880294e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -29,10 +29,26 @@ (setq evil-want-integration nil evil-collection-company-use-tng nil) :config + (delq 'kotlin-mode evil-collection-mode-list) ; doesn't do anything useful (evil-collection-init) + ;; don't interfere with leader key - (map! :after compile :map compilation-mode-map doom-leader-key nil) - (evil-define-key* '(normal visual) special-mode-map " " nil)) + (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) + + ;; don't remap gd or K; Doom does this already + ;; TODO find a better way + (after! compile + (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) + (after! racer + (evil-define-key* 'normal racer-mode-map "gd" nil "K" nil)) + (after! anaconda-mode + (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) + (after! alchemist + (evil-define-key* 'normal alchemist-mode-map "gd" nil "K" nil "gz" nil)) + (after! go-mode + (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) + (after! lua-mode + (evil-define-key* 'normal lua-mode-map "K" nil))) (def-package! evil From 1c0509edbb3def8f8e6a7fe056cef2a770b939a1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 21:00:29 -0400 Subject: [PATCH 0727/4235] lang/lua: set :documentation lookup to lua-search-documentation --- modules/lang/lua/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index dd7d0568a..7d0d206c8 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -6,6 +6,7 @@ :config (add-hook 'lua-mode-hook #'flycheck-mode) + (set! :lookup 'lua-mode :documentation 'lua-search-documentation) (set! :electric 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) ;; sp's lua-specific rules are obnoxious, so we disable them From 328269168fd3803febfa7e929c64993be9ce2ea2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 23:55:45 -0400 Subject: [PATCH 0728/4235] tools/dired: fix redundancy in image-dired-db-file --- modules/tools/dired/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/dired/config.el b/modules/tools/dired/config.el index 4bccd2932..044da6208 100644 --- a/modules/tools/dired/config.el +++ b/modules/tools/dired/config.el @@ -11,7 +11,7 @@ auto-revert-verbose nil ;; files image-dired-dir (concat doom-cache-dir "image-dired/") - image-dired-db-file (concat image-dired-dir "image-dired/db.el") + image-dired-db-file (concat image-dired-dir "db.el") image-dired-gallery-dir (concat image-dired-dir "gallery/") image-dired-temp-image-file (concat image-dired-dir "temp-image") image-dired-temp-rotate-image-file (concat image-dired-dir "temp-rotate-image")) From 1031a9105f642c8400f32e5130a10f28e50de72e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 23:56:09 -0400 Subject: [PATCH 0729/4235] tools/dired: make 'q' keybind kill buffer after quitting --- modules/tools/dired/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/dired/config.el b/modules/tools/dired/config.el index 044da6208..5481a1c3c 100644 --- a/modules/tools/dired/config.el +++ b/modules/tools/dired/config.el @@ -36,8 +36,8 @@ (make-directory parent-directory t)))) (push #'+dired|create-non-existent-directory find-file-not-found-functions) - ;; Don't interfere with leader key - (define-key dired-mode-map (kbd doom-leader-key) nil)) + ;; Kill buffer when quitting dired buffers + (define-key dired-mode-map [remap quit-window] (λ! (quit-window t)))) (def-package! dired-k From a8b79187a4070b3e90db04b9e0adfea646b87f65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 23:56:22 -0400 Subject: [PATCH 0730/4235] tools/dired: dired-k-style = nil (default) --- modules/tools/dired/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/tools/dired/config.el b/modules/tools/dired/config.el index 5481a1c3c..0dd520ae0 100644 --- a/modules/tools/dired/config.el +++ b/modules/tools/dired/config.el @@ -43,7 +43,6 @@ (def-package! dired-k :after dired :config - (setq dired-k-style 'git) (add-hook 'dired-initial-position-hook #'dired-k) (add-hook 'dired-after-readin-hook #'dired-k-no-revert) From 57bdd92756e463fd9be90ebedb4557fc5302e64e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 23:56:58 -0400 Subject: [PATCH 0731/4235] feature/evil: fix leader key in dired buffers --- modules/feature/evil/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 68880294e..1b1535c05 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -34,6 +34,8 @@ ;; don't interfere with leader key (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) + (after! dired + (evil-define-key* 'normal dired-mode-map (kbd doom-leader-key) nil)) ;; don't remap gd or K; Doom does this already ;; TODO find a better way From 8f21154e50823952beaa84939d03fac66d298179 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 19 Mar 2018 23:57:17 -0400 Subject: [PATCH 0732/4235] feature/evil: disable evil-snipe in ranger-mode --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 1b1535c05..6796f5072 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -355,7 +355,7 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-char-fold t evil-snipe-disabled-modes '(org-agenda-mode magit-mode git-rebase-mode - elfeed-show-mode elfeed-search-mode) + elfeed-show-mode elfeed-search-mode ranger-mode) evil-snipe-aliases '((?\[ "[[{(]") (?\] "[]})]") (?\; "[;:]"))) From b68fa3b120b32eb68a73b0cc09b088104b6127b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 00:00:21 -0400 Subject: [PATCH 0733/4235] ui/doom-dashboard: disable visual mode in post-command-hook too --- modules/ui/doom-dashboard/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index f469ebc89..070737e97 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -93,6 +93,10 @@ Possible values: (defun +doom-dashboard|reposition-point () "Trap the point in the buttons." + (when (region-active-p) + (deactivate-mark t) + (when (bound-and-true-p evil-mode) + (evil-change-to-previous-state))) (or (ignore-errors (if (button-at (point)) (forward-button 0) From c95c4a3586eab71ed074e9dad8707f96560da1ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 01:38:47 -0400 Subject: [PATCH 0734/4235] Add < > support to evil-args text-objects --- modules/feature/evil/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 6796f5072..8d02aa0fd 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -404,7 +404,10 @@ the new algorithm is confusing, like in python or ruby." (def-package! evil-args :commands (evil-inner-arg evil-outer-arg evil-forward-arg evil-backward-arg - evil-jump-out-args)) + evil-jump-out-args) + :config + (push "<" evil-args-openers) + (push ">" evil-args-closers)) (def-package! evil-indent-plus From 377747447103b313ee69793fc55ef047cf5a9d27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 03:38:54 -0400 Subject: [PATCH 0735/4235] Don't remove projectile-root-local from root file functions Doesn't do anything for the cache. --- core/core-projects.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index e2f6322ef..a293a8fc2 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -53,9 +53,7 @@ (defmacro without-project-cache! (&rest body) "Run BODY with projectile's project-root cache disabled. This is necessary if you want to interactive with a project other than the one you're in." - `(let ((projectile-project-root-files-functions - (remq 'projectile-root-local projectile-project-root-files-functions)) - projectile-project-name + `(let (projectile-project-name projectile-require-project-root projectile-cached-buffer-file-name projectile-cached-project-root) From 940ba05e6ab3ad47c0b010c48d7d0da250da004b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 03:40:18 -0400 Subject: [PATCH 0736/4235] Fix miscounting in anzu (search) modeline segment --- modules/ui/doom-modeline/config.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 01e244082..ec029ad36 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -11,6 +11,15 @@ (setq anzu-cons-mode-line-p nil anzu-minimum-input-length 1 anzu-search-threshold 250) + + (defun +doom-modeline*fix-anzu-count (positions here) + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) + ;; Avoid anzu conflicts across buffers (mapc #'make-variable-buffer-local '(anzu--total-matched anzu--current-position anzu--state From 0156c67ad00510fc06bbc20c8ba097dff25b015d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 15:56:37 -0400 Subject: [PATCH 0737/4235] config/default: autoload +default/easymotion --- modules/config/default/+bindings.el | 1 + modules/config/default/autoload/evil.el | 21 +++++++++++++++++++++ modules/config/default/config.el | 24 +----------------------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 552a97514..2bf50f2cb 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -319,6 +319,7 @@ :n "gr" #'+eval:region :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region + :m "gs" #'+default/easymotion ; lazy-load `evil-easymotion' :v "@" #'+evil:macro-on-all-lines :n "g@" #'+evil:macro-on-all-lines ;; repeat in visual mode (FIXME buggy) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index d16d70480..33aecd814 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -36,3 +36,24 @@ buffers." (interactive "") (doom/kill-matching-buffers pattern bang)) +;;;###autoload +(defun +default/easymotion () + "TODO" + (interactive) + (let ((prefix (this-command-keys))) + (evilem-default-keybindings prefix) + (map! :map evilem-map + "n" (evilem-create #'evil-ex-search-next) + "N" (evilem-create #'evil-ex-search-previous) + "s" (evilem-create #'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))) + "S" (evilem-create #'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)))) + (set-transient-map evilem-map) + (which-key-reload-key-sequence prefix))) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 98ab3476d..29b88df37 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -109,26 +109,4 @@ (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)) - - ;; lazy-load `evil-easymotion' - (map! :m "gs" #'+default/easymotion) - (defun +default/easymotion () - (interactive) - (let ((prefix (this-command-keys))) - (evilem-default-keybindings prefix) - (map! :map evilem-map - "n" (evilem-create #'evil-ex-search-next) - "N" (evilem-create #'evil-ex-search-previous) - "s" (evilem-create #'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))) - "S" (evilem-create #'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)))) - (set-transient-map evilem-map) - (which-key-reload-key-sequence prefix))))) + evil-ex-search-previous evil-ex-search-next)))) From eacb720a8fa64f22313a8ebf2a7095c5398c1cd8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 15:56:52 -0400 Subject: [PATCH 0738/4235] config/default: fix native evil-snipe repeat keys not being disabled --- modules/config/default/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 29b88df37..d5c563849 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -91,10 +91,9 @@ (do-repeat! evil-ex-search-backward evil-ex-search-next evil-ex-search-previous) ;; f/F/t/T/s/S + (setq evil-snipe-repeat-keys nil + evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; (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) From 612efccd72dbef09e48efbbd8ecef256cd74025d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 16:01:33 -0400 Subject: [PATCH 0739/4235] tools/magit: fix reference to possibly undefined variable #469 --- modules/feature/evil/config.el | 3 ++- modules/tools/magit/config.el | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 8d02aa0fd..8cfea80ad 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -355,7 +355,8 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-char-fold t evil-snipe-disabled-modes '(org-agenda-mode magit-mode git-rebase-mode - elfeed-show-mode elfeed-search-mode ranger-mode) + elfeed-show-mode elfeed-search-mode ranger-mode + magit-repolist-mode) evil-snipe-aliases '((?\[ "[[{(]") (?\] "[]})]") (?\; "[;:]"))) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index d626847ef..6f530ee67 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -8,7 +8,6 @@ (set! :popup "^\\*?magit" :ignore) (set! :evil-state 'magit-status-mode 'emacs) - (push 'magit-repolist-mode evil-snipe-disabled-modes) (map! :map magit-repolist-mode-map :n "j" #'next-line :n "k" #'previous-line From e929f831f6d20c7cbb07c0cf7013bd0864515eac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 16:46:36 -0400 Subject: [PATCH 0740/4235] lang/org: fix default TAB behavior for non-evil org users --- modules/lang/org/autoload/org.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 762a94e19..eee0c3fbe 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -308,10 +308,10 @@ with `org-cycle'). Also: ;;;###autoload (defun +org|indent-maybe () "Indent the current item (header or item), if possible. Made for -`org-tab-first-hook'." +`org-tab-first-hook' in evil-mode." (interactive) - (cond ((and (bound-and-true-p evil-mode) - (not (eq evil-state 'insert))) + (cond ((or (not (bound-and-true-p evil-mode)) + (not (eq evil-state 'insert))) nil) ((org-at-item-p) (org-indent-item-tree) From 4d80c20251d9909dd7b4814db9a56555f82d20a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 17:36:16 -0400 Subject: [PATCH 0741/4235] Add arrow, tab/S-tab, & C-n/C-p keys for navigating dashboard --- modules/ui/doom-dashboard/config.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 070737e97..e963ac1a1 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -69,8 +69,16 @@ Possible values: (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) (map! :map +doom-dashboard-mode-map - "n" #'forward-button - "p" #'backward-button + "n" #'forward-button + :gn [down] #'forward-button + :gn "C-n" #'forward-button + :gn [tab] #'forward-button + :gn "TAB" #'forward-button + "p" #'backward-button + :gn [up] #'backward-button + :gn "C-p" #'backward-button + :gn [backtab] #'backward-button + :gn "S-TAB" #'backward-button (:when (featurep! :feature evil) :m "j" #'forward-button :m "k" #'backward-button From d8f2abbeab6e7047c6f4957944d69dada93d3fa8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 20:44:59 -0400 Subject: [PATCH 0742/4235] Fix make info --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 02dd5f9d7..95ad6de52 100644 --- a/Makefile +++ b/Makefile @@ -82,7 +82,7 @@ doctor: # Prints debug info about your current setup info: - @$(EMACS) --batch -l core/autoload/debug.el -f doom/info + @$(EMACS) --batch -l core/core.el -l core/autoload/debug.el -f doom/info ## Internal tasks init.el: From afdf2047a7303fe60e2108b2829216f7a4af1860 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 20:45:16 -0400 Subject: [PATCH 0743/4235] Improve error handling in doom/info --- core/autoload/debug.el | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index bb886f902..53a848c0b 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -98,11 +98,12 @@ ready to be pasted in a bug report on github." (format (concat "- OS: %s (%s)\n" "- Emacs: %s (%s)\n" - "- Doom: %s (%s https://github.com/hlissner/doom-emacs/commit/%s)\n" + "- Doom: %s (%s %s)\n" "- Graphic display: %s (daemon: %s)\n" "- System features: %s\n" "- Details:\n" " ```elisp\n" + " uname -a: %s\n" " modules: %s\n" " packages: %s\n" " elc dirs: %s\n" @@ -111,10 +112,19 @@ ready to be pasted in a bug report on github." system-type system-configuration emacs-version (format-time-string "%b %d, %Y" emacs-build-time) doom-version - (vc-git--symbolic-ref "core/core.el") (vc-git-working-revision "core/core.el") + (if-let* ((branch (vc-git--symbolic-ref "core/core.el"))) + branch + "n/a") + (if-let* ((rev (vc-git-working-revision "core/core.el"))) + (format "https://github.com/hlissner/doom-emacs/commit/%s" rev) + "n/a") (display-graphic-p) (daemonp) (bound-and-true-p system-configuration-features) ;; details + (with-temp-buffer + (unless (zerop (call-process "uname" nil t nil "-a")) + (insert (format "%s" system-type))) + (string-trim (buffer-string))) (or (cl-loop with cat = nil for key being the hash-keys of doom-modules if (or (not cat) (not (eq cat (car key)))) From 82bead5ae488f75499141538d9c705d944e64576 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 21:12:35 -0400 Subject: [PATCH 0744/4235] Refactor & fix doom-doctor module checkups --- bin/doom-doctor | 88 +++++++++++++++++---------------------- modules/lang/go/doctor.el | 4 +- 2 files changed, 41 insertions(+), 51 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index fd60847c6..4c9c84b60 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -11,15 +11,11 @@ (unless (file-directory-p user-emacs-directory) (error "Couldn't find a Doom config!")) +(unless noninteractive + (error "This script must not be run from an interactive session.")) (require 'pp) -;; subr-x may not exist in the current version of Emacs -(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) @@ -31,7 +27,7 @@ (defun indented (spc msg) (declare (indent defun)) (with-temp-buffer - (insert msg) + (insert msg) (let ((fill-column 80)) (fill-region (point-min) (point-max)) (indent-rigidly (point-min) (point-max) spc)) @@ -52,22 +48,6 @@ (fill-region (point-min) (point-max)) (buffer-string)))) -(defun columns (cols length strings) - (declare (indent defun)) - (with-temp-buffer - (let ((sub-format (format "%%-%ds " (1- length))) - col-format) - (dotimes (i (1- cols)) - (setq col-format (concat col-format sub-format))) - (setq col-format (concat col-format "%s")) - (while strings - (insert (apply #'format col-format - (let (args) - (dotimes (i cols (nreverse args)) - (push (if strings (pop strings) "") args)))) - "\n"))) - (buffer-string))) - (defun sh (cmd) (string-trim-right (shell-command-to-string cmd))) @@ -75,8 +55,12 @@ (format "\e[%dm%s\e[%dm" code (apply #'format msg args) 0)) (defvar indent 0) +(defvar prefix "") (defmacro msg! (msg &rest args) - `(message (indented indent (format ,msg ,@args)))) + `(message + (indented indent + (format (concat prefix ,msg) + ,@args)))) (defmacro error! (&rest args) `(progn (msg! (color 31 ,@args)) (setq doom-errors (+ doom-errors 1)))) (defmacro warn! (&rest args) `(progn (msg! (color 33 ,@args)) (setq doom-errors (+ doom-errors 1)))) (defmacro success! (&rest args) `(msg! (color 32 ,@args))) @@ -93,12 +77,19 @@ (save-match-data (string-match regexp string &optional start)))) +;; subr-x may not exist in the current version of Emacs +(unless (fboundp 'string-trim-right) + (defsubst string-trim-right (string &optional regexp) + (if (string-match (concat "\\(?:" (or regexp "[ \t\n\r]+") "\\)\\'") string) + (replace-match "" t t string) + string))) + ;; --- start a'doctorin' -------------------------------------- -(msg! "%s" (color 1 "DOOM Doctor")) +(msg! (color 1 "Doom Doctor")) (msg! "Emacs v%s" emacs-version) -(msg! "Doom v%s" +(msg! "Doom v%s (%s)" (or (and (file-exists-p (expand-file-name "core/core.el" user-emacs-directory)) (with-temp-buffer (insert-file-contents-literally @@ -107,21 +98,19 @@ (when (re-search-forward "doom-version") (forward-char) (sexp-at-point)))) - "???")) -(msg! "Commit %s" + "???") (if (and (executable-find "git") (file-directory-p (expand-file-name ".git" user-emacs-directory))) - (sh "git rev-parse HEAD") + (substring (sh "git rev-parse HEAD") 0 8) "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\n" (indented 2 (autofill (sh "uname -a")))) + (message "Compiled with:\n%s" (indented 2 system-configuration-features))) +(message "uname -a:\n%s\n" (indented 2 (sh "uname -a"))) (msg! "----\n") @@ -279,23 +268,26 @@ (let (doom-core-packages doom-debug-mode) (condition-case ex (progn + (let (noninteractive) + (load "~/.emacs.d/core/core.el" nil t)) (let ((inhibit-message t) - noninteractive) + (noninteractive t)) (load "~/.emacs.d/init.el" nil t)) - (doom-initialize-packages) + (doom-initialize-packages t) + (quiet! (doom-initialize-modules)) (doom|finalize) - (success! "Attempt to load DOOM: success! Loaded v%s" doom-version) - (when (executable-find "git") - (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)))))) + (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) + ('error + (warn! "Attempt to load DOOM: failed\n %s\n" + (or (cdr-safe ex) (car ex))) + (setq doom-modules nil)))) (when (bound-and-true-p doom-modules) (section! "test-modules") (let ((indent 4)) + (defun --quiet-require (orig-fn &rest args) + (quiet! (apply orig-fn args))) + (advice-add #'require :around #'--quiet-require) (maphash (lambda (key plist) (condition-case ex @@ -304,13 +296,11 @@ doom-packages) (when (or (file-exists-p doctor-file) (file-exists-p packages-file)) - (let ((indent 2)) - (section! "test-module -> %s %s" (car key) (cdr key))) - (load packages-file t t) - (when (load packages-file t t) - (dolist (package (cl-remove-if #'package-installed-p doom-packages :key #'car)) - (error! "%s is not installed" (car package)))) - (load doctor-file t t))) + (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) + (when (load packages-file t t) + (dolist (package (cl-remove-if #'package-installed-p doom-packages :key #'car)) + (error! "%s is not installed" (car package)))) + (load doctor-file t t)))) ('error (error! "Syntax error: %s" ex)))) doom-modules))) diff --git a/modules/lang/go/doctor.el b/modules/lang/go/doctor.el index 827da36d9..fe059a4ae 100644 --- a/modules/lang/go/doctor.el +++ b/modules/lang/go/doctor.el @@ -6,7 +6,7 @@ (unless (executable-find "gore") (warn! "Couldn't find gore. REPL will not work")) -(when (and (featurep! :completion company) - (require 'company-go nil t)) +(when (featurep! :completion company) + (require 'company-go) (unless (executable-find command-go-gocode-command) (warn! "Couldn't find gocode. Code completion won't work"))) From dec3ecba6e98a7fa67ede59d9852984e7aa3e5df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 21:12:49 -0400 Subject: [PATCH 0745/4235] package--initialized = nil in doom-initialize; in case of reloads --- 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 d6bfea435..d4434ead7 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -155,7 +155,8 @@ FORCE-P is non-nil, do it anyway. (make-directory dir t))) ;; Ensure packages have been initialized (require 'package) - (setq package-activated-list nil) + (setq package-activated-list nil + package--initialized nil) (condition-case _ (package-initialize) ('error (package-refresh-contents) (setq doom--refreshed-p t) From 4da4cbaa582182181422e83a1037568ad73cdc15 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 21:13:14 -0400 Subject: [PATCH 0746/4235] config/default: remove obsolete keybinds (b/c of evil-collection) --- modules/config/default/+bindings.el | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2bf50f2cb..cdb423c50 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -663,31 +663,13 @@ ;; 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-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)) + [remap quit-window] #'kill-this-buffer)) ;; From adef00aa7c113293616a4045655c1683c1caefbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 21:19:37 -0400 Subject: [PATCH 0747/4235] Don't byte-compile doctor.el files --- modules/lang/cc/doctor.el | 3 ++- modules/lang/crystal/doctor.el | 3 ++- modules/lang/go/doctor.el | 3 ++- modules/lang/haskell/doctor.el | 3 ++- modules/lang/plantuml/doctor.el | 3 ++- modules/lang/rust/doctor.el | 3 ++- modules/ui/posframe/doctor.el | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/lang/cc/doctor.el b/modules/lang/cc/doctor.el index da32879f9..442798ce4 100644 --- a/modules/lang/cc/doctor.el +++ b/modules/lang/cc/doctor.el @@ -1,4 +1,5 @@ -;;; lang/cc/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/cc/doctor.el ;; rtags (let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) diff --git a/modules/lang/crystal/doctor.el b/modules/lang/crystal/doctor.el index 63752faef..b2f68f86e 100644 --- a/modules/lang/crystal/doctor.el +++ b/modules/lang/crystal/doctor.el @@ -1,4 +1,5 @@ -;;; lang/crystal/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/crystal/doctor.el (unless (executable-find "icr") (warn! "Couldn't find icr. REPL will not work")) diff --git a/modules/lang/go/doctor.el b/modules/lang/go/doctor.el index fe059a4ae..cf47a544d 100644 --- a/modules/lang/go/doctor.el +++ b/modules/lang/go/doctor.el @@ -1,4 +1,5 @@ -;;; lang/go/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/go/doctor.el (unless (executable-find "guru") (warn! "Couldn't find guru. Refactoring commands (go-guru-*) won't work")) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index e6a8b92d6..f803ea3d2 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -1,4 +1,5 @@ -;;; lang/haskell/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/haskell/doctor.el (when (featurep! +dante) (unless (executable-find "cabal") diff --git a/modules/lang/plantuml/doctor.el b/modules/lang/plantuml/doctor.el index be8cffde6..3d3174e25 100644 --- a/modules/lang/plantuml/doctor.el +++ b/modules/lang/plantuml/doctor.el @@ -1,4 +1,5 @@ -;;; lang/plantuml/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/plantuml/doctor.el (when (require 'plantuml-mode nil t) ;; java diff --git a/modules/lang/rust/doctor.el b/modules/lang/rust/doctor.el index db9d287d0..79ef3dadb 100644 --- a/modules/lang/rust/doctor.el +++ b/modules/lang/rust/doctor.el @@ -1,4 +1,5 @@ -;;; lang/rust/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/rust/doctor.el (when (require 'racer nil t) ;; racer diff --git a/modules/ui/posframe/doctor.el b/modules/ui/posframe/doctor.el index 0eb5dfb80..76c09d484 100644 --- a/modules/ui/posframe/doctor.el +++ b/modules/ui/posframe/doctor.el @@ -1,4 +1,5 @@ -;;; ui/posframe/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; ui/posframe/doctor.el (when (version< emacs-version "26") (error! "This module doesn't work in Emacs %s (minimum: Emacs 26)" emacs-version)) From 80aa0866807a46696426bc6485a041f46d8b3701 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 21:20:45 -0400 Subject: [PATCH 0748/4235] APPEASE THE GREAT BYTE-COMPILER-SAMA --- modules/lang/org/+capture.el | 2 +- modules/lang/org/autoload/org-capture.el | 2 ++ modules/ui/posframe/autoload.el | 9 ++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 2859b4875..b8fe048b1 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -38,7 +38,7 @@ ;; fix #462: when refiling from org-capture, Emacs prompts to kill the ;; underlying, modified buffer. This fixes that. - (defun +org-capture*refile (orig-fn &rest args) + (defun +org-capture*refile (&rest _) (when org-capture-is-refiling (org-save-all-org-buffers))) (advice-add 'org-refile :after #'+org-capture*refile) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index afcef7aa6..d3ec2e86a 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -1,6 +1,8 @@ ;;; lang/org/autoload/org-capture.el -*- lexical-binding: t; -*- ;;;###if (featurep! +capture) +(defvar org-capture-initial) + ;; --- External frame --------------------- (defvar +org-capture-window-params diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el index d163a3aea..74e8625c0 100644 --- a/modules/ui/posframe/autoload.el +++ b/modules/ui/posframe/autoload.el @@ -8,11 +8,10 @@ ;;;###autoload (defun +posframe-poshandler-frame-center-near-bottom (info) "TODO" - (let* ((posframe (plist-get info :posframe)) - (parent-frame (plist-get info :parent-frame))) - (let ((pos (posframe-poshandler-frame-center info))) - (cons (car pos) - (truncate (/ (frame-pixel-height parent-frame) 1.6)))))) + (let ((parent-frame (plist-get info :parent-frame)) + (pos (posframe-poshandler-frame-center info))) + (cons (car pos) + (truncate (/ (frame-pixel-height parent-frame) 1.6))))) ;;;###autoload (defun +posframe|delete-on-escape () From 5711bfc9034e2b2d9ee9b5f729c4b03735e85d48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 23:50:03 -0400 Subject: [PATCH 0749/4235] feature/evil: don't quote ex-buffer-match regex on evil-ex-bang --- modules/feature/evil/autoload/evil.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 5d6caa281..b1f6d1b5b 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -123,7 +123,7 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" (not (zerop (length arg)))) (condition-case lossage (let ((pattern (evil-ex-make-substitute-pattern - (if evil-ex-bang (regexp-quote arg) arg) + arg (or flags (list)))) (range (or (evil-copy-range evil-ex-range) (evil-range (or beg (line-beginning-position)) From a26755a0894c0958f9cb18343dee59c7186c3f86 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 23:55:24 -0400 Subject: [PATCH 0750/4235] feature/evil: redesign +evil:align; bang = repeat align --- modules/feature/evil/autoload/evil.el | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index b1f6d1b5b..1458997ec 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -167,15 +167,14 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" ;;;###autoload (autoload '+evil:align "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:align (beg end pattern &optional bang) - "Ex interface to `align-regexp'. Accepts vim-style regexps." - (interactive "") + "Ex interface to `align-regexp'. PATTERN is a vim-style regexp. If BANG, +repeat the alignment for all matches (otherwise just the first match on each +line)." + (interactive "") (align-regexp beg end - (concat "\\(\\s-*\\)" - (if bang - (regexp-quote pattern) - (evil-transform-vim-style-regexp pattern))) - 1 1)) + (concat "\\(\\s-*\\)" (evil-transform-vim-style-regexp pattern)) + 1 1 bang)) ;; --- wgrep ------------------------------ From 7574e13677e5a4301ce006b4a11e7c6a5fa2bb42 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 23:55:33 -0400 Subject: [PATCH 0751/4235] feature/evil: new +evil:align-right command Bound to :ral[ign] --- modules/config/default/+evil-commands.el | 1 + modules/feature/evil/autoload/evil.el | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 9290fcbc2..6105989a8 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -36,6 +36,7 @@ ;; Editing (ex! "@" #'+evil:macro-on-all-lines) ; TODO Test me (ex! "al[ign]" #'+evil:align) +(ex! "ral[ign]" #'+evil:align-right) (ex! "enhtml" #'+web:encode-html-entities) (ex! "dehtml" #'+web:decode-html-entities) (ex! "mc" #'+evil:mc) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 1458997ec..ae08a0091 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -176,6 +176,17 @@ line)." (concat "\\(\\s-*\\)" (evil-transform-vim-style-regexp pattern)) 1 1 bang)) +;;;###autoload (autoload '+evil:align-right "feature/evil/autoload/evil" nil t) +(evil-define-operator +evil:align-right (beg end pattern &optional bang) + "Like `+evil:align', except alignments are right-justified. PATTERN is a +vim-style regexp. If BANG, repeat the alignment for all matches (otherwise just +the first match on each line)." + (interactive "") + (align-regexp + beg end + (concat "\\(" (evil-transform-vim-style-regexp pattern) "\\)") + -1 1 bang)) + ;; --- wgrep ------------------------------ From 850acebad1d1784e52c5ade3a2426ca0874e82cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Mar 2018 23:56:54 -0400 Subject: [PATCH 0752/4235] feature/evil: minor refactor (when => if) --- modules/feature/evil/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 8cfea80ad..f39089349 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -170,9 +170,9 @@ ;; Other commands can make use of this (evil-define-interactive-code "" - :ex-arg buffer-match (list (when (evil-ex-p) evil-ex-argument))) + :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) (evil-define-interactive-code "" - :ex-arg global-match (list (when (evil-ex-p) evil-ex-argument))) + :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument))) ;; Forward declare these so that ex completion works, even if the autoloaded ;; functions aren't loaded yet. From 51b5fb0f4471af1b078b2a2c28b0f63e62119a33 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 05:19:01 -0400 Subject: [PATCH 0753/4235] Add missing modes to editorconfig-indentation-alist --- core/core-editor.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index eed0e4e30..f5f3defe5 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -122,6 +122,13 @@ fundamental-mode) for performance sake." (def-package! editorconfig :hook (doom-init . editorconfig-mode) :config + ;; Register missing indent variables + (setq editorconfig-indentation-alist + (append '((mips-mode mips-tab-width) + (haxor-mode haxor-tab-width) + (nasm-mode nasm-basic-offset)) + editorconfig-indentation-alist)) + ;; editorconfig cannot procure the correct settings for extension-less files. ;; Executable scripts with a shebang line, for example. So why not use Emacs' ;; major mode to drop editorconfig a hint? This is accomplished by temporarily From da92423e400b3f6e3b1373e76d3d902189ef221d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 15:11:52 -0400 Subject: [PATCH 0754/4235] Inhibit doom/escape on ESC while executing macros #471 --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index ea76117e5..39307e518 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -37,7 +37,7 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; Run all escape hooks. If any returns non-nil, then stop there. ((run-hook-with-args-until-success 'doom-escape-hook)) ;; don't abort macros - (defining-kbd-macro nil) + ((or defining-kbd-macro executing-kbd-macro) nil) ;; Back to the default (t (keyboard-quit)))) From f2641dbc110c0316d7154ae8e1797522936ade16 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 15:21:18 -0400 Subject: [PATCH 0755/4235] Add early-init.el for Emacs HEAD --- early-init.el | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 early-init.el diff --git a/early-init.el b/early-init.el new file mode 100644 index 000000000..d82a19c70 --- /dev/null +++ b/early-init.el @@ -0,0 +1,9 @@ +;;; early-init.el -*- lexical-binding: t; -*- + +;; Later versions of Emacs 27 (on master) introduce a new behavior: +;; +;; Package initialize occurs automatically, before `user-init-file' is loaded, +;; but after `early-init-file'. Doom handles package initialization, so we must +;; prevent Emacs from doing it early! +(setq package-enable-at-startup nil) + From 462b1f7853c5667c4a7d8a502a338957b59d4a4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 16:37:08 -0400 Subject: [PATCH 0756/4235] feature/popup: always pop up which-key at bottom of frame --- modules/feature/popup/+hacks.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 6c0e92095..b77abbd19 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -231,6 +231,19 @@ instead of switch-to-buffer-*." (advice-add #'wgrep-finish-edit :after #'+popup*close)) +;; `which-key' +(setq which-key-popup-type 'custom + which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) + which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window + which-key-custom-show-popup-function + (lambda (act-popup-dim) + (cl-letf (((symbol-function 'display-buffer-in-side-window) + (lambda (buffer alist) + (+popup-display-buffer + buffer (append '((vslot . -9999)) alist))))) + (which-key--show-buffer-side-window act-popup-dim)))) + + ;; `windmove' (progn ;; Users should be about to hop into popups easily, but Elisp shouldn't. From d5683ba681d07bcb41fd32dcab8011e05e3c8c8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:26:36 -0400 Subject: [PATCH 0757/4235] feature/workspaces: fix recursive load errors on 25.x #470 +workspaces|protect-buffers-in-other-persps was unnecessary, in any case. --- modules/feature/workspaces/autoload/workspaces.el | 6 ------ modules/feature/workspaces/config.el | 6 ++---- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 51d554431..e8b39c8e3 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -464,12 +464,6 @@ Allows a perspective-specific buffer list via `+workspaces-buffer-list'." (persp-add-buffer (current-buffer) (get-current-persp) nil) (force-mode-line-update t))) -;;;###autoload -(defun +workspaces|protect-buffers-in-other-persps () - "Return nil if this buffer is present in other perspectives/workspaces (bury -it, don't kill it)." - (not (persp-other-persps-with-buffer-except-nil (current-buffer)))) - ;;;###autoload (defun +workspaces|delete-associated-workspace (&optional frame) "Delete workspace associated with current frame. diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 4518fe81f..16611dd59 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -114,9 +114,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; 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) - - ;; - (add-hook 'kill-buffer-query-functions #'+workspaces|protect-buffers-in-other-persps) + ;; Ensure buffers we've opened/switched to are auto-added to the + ;; current perspective (add-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) ;; Remap `buffer-list' to current workspace's buffers in @@ -124,6 +123,5 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) (t (remove-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) - (remove-hook 'kill-buffer-query-functions #'+workspaces|protect-buffers-in-other-persps) (advice-remove #'doom-buffer-list #'+workspace-buffer-list))))) From 61206a553d626f2e8b420cf47dbe944193c497a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:28:00 -0400 Subject: [PATCH 0758/4235] feature/workspaces: add sharp-quote --- modules/feature/workspaces/autoload/workspaces.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index e8b39c8e3..8d94fda00 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -49,7 +49,7 @@ ;; --- Getters ---------------------------- ;;;###autoload -(defalias '+workspace-current #'get-current-persp +(defalias #'+workspace-current #'get-current-persp "Return the currently active workspace.") ;;;###autoload From 744e7d6dfd7ddfde3145b7af9845902d6df0051d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 19:39:47 -0400 Subject: [PATCH 0759/4235] feature/evil: move evil-collection fixes to config/default --- modules/config/default/+bindings.el | 28 ++++++++++++++++++++++++++++ modules/feature/evil/config.el | 22 +--------------------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index cdb423c50..366b36d1e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -732,3 +732,31 @@ (:after view (:map view-mode-map "" #'View-quit-all))) + + +;; +;; Evil-collection mods +;; + +;; TODO find a better way +(when (featurep 'evil-collection) + ;; don't interfere with leader key + (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) + (after! dired + (evil-define-key* 'normal dired-mode-map (kbd doom-leader-key) nil)) + + ;; Don't rebind Doom's keybinds + (after! alchemist + (evil-define-key* 'normal alchemist-mode-map "gd" nil "K" nil "gz" nil)) + (after! anaconda-mode + (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) + (after! compile + (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) + (after! go-mode + (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) + (after! lua-mode + (evil-define-key* 'normal lua-mode-map "K" nil)) + (after! outline + (evil-define-key* 'normal outline-mode-map "\C-j" nil "\C-k" nil)) + (after! racer + (evil-define-key* 'normal racer-mode-map "gd" nil "K" nil))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f39089349..bdde64a5e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -30,27 +30,7 @@ evil-collection-company-use-tng nil) :config (delq 'kotlin-mode evil-collection-mode-list) ; doesn't do anything useful - (evil-collection-init) - - ;; don't interfere with leader key - (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) - (after! dired - (evil-define-key* 'normal dired-mode-map (kbd doom-leader-key) nil)) - - ;; don't remap gd or K; Doom does this already - ;; TODO find a better way - (after! compile - (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) - (after! racer - (evil-define-key* 'normal racer-mode-map "gd" nil "K" nil)) - (after! anaconda-mode - (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) - (after! alchemist - (evil-define-key* 'normal alchemist-mode-map "gd" nil "K" nil "gz" nil)) - (after! go-mode - (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) - (after! lua-mode - (evil-define-key* 'normal lua-mode-map "K" nil))) + (evil-collection-init)) (def-package! evil From 3001e59ecc122435b7d03f4a8fe0dfc2baa43f36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 21:54:44 -0400 Subject: [PATCH 0760/4235] Don't destroy load-path on reload --- core/core-packages.el | 1 - 1 file changed, 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index d4434ead7..6197a0832 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -148,7 +148,6 @@ FORCE-P is non-nil, do it anyway. (unless noninteractive (error "No autoloads file! Run make autoloads"))) (when (or force-p (not (load doom-packages-file t t t))) - (setq load-path doom-site-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) From 69da6da541ed8abbd04219a23401b98bbe9ba314 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 21:55:35 -0400 Subject: [PATCH 0761/4235] config/default: fix gd/K keybinds in cider-mode --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 366b36d1e..d4d966854 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -752,6 +752,8 @@ (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) (after! compile (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) + (after! cider + (evil-define-key* '(normal visual) cider-mode-map "gd" nil "K" nil)) (after! go-mode (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) (after! lua-mode From abe42fcb9a18e81cf7b0be58526af253d305329a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 21 Mar 2018 22:26:56 -0400 Subject: [PATCH 0762/4235] Give config/default keybinds higher precedence This is highly experimental! It gives keybinds bound with `map!` much higher precedence, allowing it to override the defaults imposed by major modes and plugins (like evil-collection). --- core/core-keybinds.el | 22 ++++++++++++++++------ modules/config/default/+bindings.el | 29 ----------------------------- modules/feature/evil/config.el | 3 +++ 3 files changed, 19 insertions(+), 35 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 39307e518..8b3634990 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -10,6 +10,14 @@ (defvar doom-localleader-key "SPC m" "The localleader prefix key, for major-mode specific commands.") +(defvar doom-mode-map (make-sparse-keymap) + "TODO") + +(define-minor-mode doom-mode + "TODO" + :global t + :init-value t) + (defvar doom-evil-state-alist '((?n . normal) (?v . visual) @@ -300,17 +308,19 @@ Example (unless (featurep 'evil) (throw 'skip 'evil)) (dolist (state states) - (push `(define-key - ,(if (eq state 'global) - '(current-global-map) - (intern (format "evil-%s-state-%smap" state (if doom--local "local-" "")))) - ,key ,def) + (push (if (eq state 'global) + `(define-key doom-mode-map ,key ,def) + (if doom--local + `(evil-local-set-key ',state ,key ,def) + `(evil-define-key* ',state doom-mode-map ,key ,def))) forms))) (doom--keymaps (dolist (keymap doom--keymaps) (push `(define-key ,keymap ,key ,def) forms))) (t - (push `(,(if doom--local #'local-set-key #'global-set-key) ,key ,def) + (push (if doom--local + `(local-set-key ,key ,def) + `(define-key doom-mode-map ,key ,def)) forms)))) (setq states '() doom--local nil diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index d4d966854..ad1fa3a10 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -733,32 +733,3 @@ (:after view (:map view-mode-map "" #'View-quit-all))) - -;; -;; Evil-collection mods -;; - -;; TODO find a better way -(when (featurep 'evil-collection) - ;; don't interfere with leader key - (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) - (after! dired - (evil-define-key* 'normal dired-mode-map (kbd doom-leader-key) nil)) - - ;; Don't rebind Doom's keybinds - (after! alchemist - (evil-define-key* 'normal alchemist-mode-map "gd" nil "K" nil "gz" nil)) - (after! anaconda-mode - (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) - (after! compile - (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) - (after! cider - (evil-define-key* '(normal visual) cider-mode-map "gd" nil "K" nil)) - (after! go-mode - (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) - (after! lua-mode - (evil-define-key* 'normal lua-mode-map "K" nil)) - (after! outline - (evil-define-key* 'normal outline-mode-map "\C-j" nil "\C-k" nil)) - (after! racer - (evil-define-key* 'normal racer-mode-map "gd" nil "K" nil))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bdde64a5e..45f473ed5 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -63,6 +63,9 @@ (add-hook 'doom-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) + ;; ensure `doom-mode-map' has high precedence + (evil-make-overriding-map doom-mode-map) + (set! :popup "^\\*evil-registers" '((size . 0.3))) (set! :popup "^\\*Command Line" '((size . 8))) From a2ab9e739ccf9eb1cbfbc7c6662cd3659e192e47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:30:49 -0400 Subject: [PATCH 0763/4235] feature/workspaces: minor refactor --- modules/feature/workspaces/config.el | 45 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 16611dd59..8a886d133 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -73,7 +73,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (display-buffer-in-side-window warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))) - (add-hook 'doom-init-hook #'+workspaces|init) + (add-hook 'doom-init-hook #'+workspaces|init t) :config (setq persp-autokill-buffer-on-remove 'kill-weak persp-nil-hidden t @@ -85,13 +85,32 @@ Uses `+workspaces-main' to determine the name of the main workspace." persp-auto-resume-time -1 ; Don't auto-load on startup persp-auto-save-opt (if noninteractive 0 1)) ; auto-save on kill + ;; bootstrap + (defun +workspaces|init-persp-mode () + (cond (persp-mode + ;; 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) + + ;; Ensure buffers we've opened/switched to are auto-added to the + ;; current perspective + (add-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) + + ;; Remap `buffer-list' to current workspace's buffers in + ;; `doom-buffer-list' + (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) + (t + (remove-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) + (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) + ;; Modify `delete-window' to close the workspace if used on the last window (define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace) (define-key persp-mode-map [remap evil-delete-window] #'+workspace/close-window-or-workspace) ;; only auto-save when real buffers are present (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) - ;; For `doom/cleanup-session' + ;; On `doom/cleanup-session', delete buffers associated with no perspectives (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) ;; per-frame workspaces @@ -102,26 +121,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; delete frame associated with workspace, if it exists (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) - ;; per-project workspaces + ;; per-project workspaces, but reuse current workspace if empty (setq projectile-switch-project-action #'+workspaces|set-project-action counsel-projectile-switch-project-action #'+workspaces|switch-to-project) - (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) - - ;; - (defun +workspaces|init-persp-mode () - (cond (persp-mode - ;; 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) - ;; Ensure buffers we've opened/switched to are auto-added to the - ;; current perspective - (add-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) - - ;; Remap `buffer-list' to current workspace's buffers in - ;; `doom-buffer-list' - (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) - (t - (remove-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) - (advice-remove #'doom-buffer-list #'+workspace-buffer-list))))) + (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project)) From 358d7af9acc13dc475a7afc3c8b16bec1759c9c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:31:09 -0400 Subject: [PATCH 0764/4235] doom/kill-all-buffers: reduce redundancy --- core/autoload/buffers.el | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 196481512..d4d31e3f8 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -202,13 +202,9 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." If PROJECT-P (universal argument), kill only buffers that belong to the current project." (interactive "P") - (let ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list))) - (ignore-window-parameters t)) - (delete-other-windows) - (switch-to-buffer (doom-fallback-buffer)) - (let (kill-buffer-query-functions) - (message "Killed %s buffers" - (length (delq nil (mapcar #'kill-buffer buffers))))))) + (delete-other-windows) + (switch-to-buffer (doom-fallback-buffer)) + (doom/cleanup-session)) ;;;###autoload (defun doom/kill-other-buffers (&optional project-p) From 457674117866da391cd578dc1335322870888d47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:33:35 -0400 Subject: [PATCH 0765/4235] tools/magit: start magit-status-mode in normal mode Now that evil-collection offers evilified keybinds for magit, this should be the default. --- modules/tools/magit/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 6f530ee67..cb5d45f05 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -6,7 +6,6 @@ (load "magit-autoloads" nil t) :config (set! :popup "^\\*?magit" :ignore) - (set! :evil-state 'magit-status-mode 'emacs) (map! :map magit-repolist-mode-map :n "j" #'next-line From 92b1d1d7d03a1fb9194314c9997e21f996c7dce8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:34:19 -0400 Subject: [PATCH 0766/4235] tools/magit: initialize magithub variables sooner --- modules/tools/magit/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index cb5d45f05..153921f49 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -33,12 +33,13 @@ (def-package! magithub :commands (magithub-clone magithub-feature-autoinject) :after magit - :config - (load "magithub-autoloads" nil t) - (magithub-feature-autoinject t) + :init (setq magithub-dir (concat doom-etc-dir "magithub/") magithub-clone-default-directory "~/" - magithub-preferred-remote-method 'clone_url)) + magithub-preferred-remote-method 'clone_url) + :config + (load "magithub-autoloads" nil t) + (magithub-feature-autoinject t)) (def-package! evil-magit From 25d8637263a42699bb72c397be732bb75040caae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:40:27 -0400 Subject: [PATCH 0767/4235] lang/ess: autoloads.el (incorrect) => autoload.el --- modules/lang/ess/{autoloads.el => autoload.el} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename modules/lang/ess/{autoloads.el => autoload.el} (64%) diff --git a/modules/lang/ess/autoloads.el b/modules/lang/ess/autoload.el similarity index 64% rename from modules/lang/ess/autoloads.el rename to modules/lang/ess/autoload.el index c7c4b0fb4..4b92cae5b 100644 --- a/modules/lang/ess/autoloads.el +++ b/modules/lang/ess/autoload.el @@ -1,4 +1,4 @@ -;;; private/r/autoload.el -*- lexical-binding: t; -*- +;;; lang/ess/autoload.el -*- lexical-binding: t; -*- ;;;###autoload (defun +r/repl () From b7cde2e01b110c93d4664cc1b9ec342a427d63a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:41:13 -0400 Subject: [PATCH 0768/4235] lang/ess: +r/repl => +ess/r-repl --- modules/lang/ess/autoload.el | 2 +- modules/lang/ess/config.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/ess/autoload.el b/modules/lang/ess/autoload.el index 4b92cae5b..22452a13c 100644 --- a/modules/lang/ess/autoload.el +++ b/modules/lang/ess/autoload.el @@ -1,7 +1,7 @@ ;;; lang/ess/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +r/repl () +(defun +ess/r-repl () "Open the R REPL." (interactive) (inferior-ess nil nil t)) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 7121383f5..c84e04ddc 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -39,7 +39,7 @@ ess-nuke-trailing-whitespace-p t ess-default-style 'DEFAULT) (ess-toggle-underscore t) - (set! :repl 'ess-mode #'+r/repl) + (set! :repl 'ess-mode #'+ess/r-repl) (set! :lookup 'ess-mode :documentation #'ess-display-help-on-object) (map! (:map ess-doc-map "h" #'ess-display-help-on-object From 5570fbb35305e802d84d31fcafd2375669490afe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 06:54:18 -0400 Subject: [PATCH 0769/4235] lang/clojure: refactor & add :eval/:repl support --- modules/lang/clojure/autoload.el | 8 ++++ modules/lang/clojure/config.el | 70 ++++++++++++++++---------------- 2 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 modules/lang/clojure/autoload.el diff --git a/modules/lang/clojure/autoload.el b/modules/lang/clojure/autoload.el new file mode 100644 index 000000000..2b2ad3ec1 --- /dev/null +++ b/modules/lang/clojure/autoload.el @@ -0,0 +1,8 @@ +;;; lang/clojure/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +clojure/repl () + "Open a Cider REPL and return the buffer." + (interactive) + (cider-jack-in) + (current-buffer)) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 5254ae0a2..8cc08d1df 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -5,9 +5,43 @@ :mode ("\\.cljs$" . clojurescript-mode) :mode ("\\.cljc$" . clojurec-mode) :config - (add-hook 'clojure-mode #'rainbow-delimiters-mode) + (add-hook 'clojure-mode #'rainbow-delimiters-mode)) - (map! :map clojure-mode-map + +(def-package! clj-refactor + :after clojure-mode + :config + ;; setup some extra namespace auto completion for great awesome + (nconc cljr-magic-require-namespaces + '(("re-frame" . "re-frame.core") + ("reagent" . "reagent.core") + ("str" . "clojure.str")))) + + +(def-package! cider + ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider + ;; jack in won't work. + :commands (cider-jack-in cider-jack-in-clojurescript) + :hook (clojure-mode . cider-mode) + :config + (setq nrepl-hide-special-buffers t + cider-stacktrace-default-filters '(tooling dup) + cider-prompt-save-file-on-load nil + cider-repl-use-clojure-font-lock t + ;; Setup cider for clojurescript / figwheel dev. + cider-cljs-lein-repl + "(do (require 'figwheel-sidecar.repl-api) + (figwheel-sidecar.repl-api/start-figwheel!) + (figwheel-sidecar.repl-api/cljs-repl))") + + (set! :popup "^\\*cider-repl" nil '((quit) (select))) + (set! :repl 'clojure-mode #'+clojure/repl) + (set! :eval 'clojure-mode #'cider-eval-region) + (set! :lookup 'clojure-mode + :definition #'cider-browse-ns-find-at-point + :documentation #'cider-browse-ns-doc-at-point) + + (map! :map cider-mode-map :localleader :n "'" #'cider-jack-in :n "\"" #'cider-jack-in-clojurescript @@ -19,35 +53,3 @@ :n "c" #'cider-repl-clear-buffer :n "p" #'cider-eval-sexp-at-point :n "r" #'cider-eval-region)) - - -(def-package! clj-refactor - :after clojure-mode - :config - ;; setup some extra namespace auto completion for great awesome - (dolist (mapping '(("re-frame" . "re-frame.core") - ("reagent" . "reagent.core") - ("str" . "clojure.str"))) - (add-to-list 'cljr-magic-require-namespaces mapping t))) - - -(def-package! cider - ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider - ;; jack in won't work. - :commands (cider-jack-in cider-mode cider-jack-in-clojurescript) - :config - (setq nrepl-hide-special-buffers t) - - ;; settings for cider repl as a popup (prevent it from being closed on escape, - ;; especially.) - (set! :popup "^\\*cider" nil '((quit) (select))) - - (set! :lookup 'clojure-mode - :definition #'cider-browse-ns-find-at-point - :documentation #'cider-browse-ns-doc-at-point) - - ;; Setup cider for clojurescript / figwheel dev. - (setq cider-cljs-lein-repl - "(do (require 'figwheel-sidecar.repl-api) - (figwheel-sidecar.repl-api/start-figwheel!) - (figwheel-sidecar.repl-api/cljs-repl))")) From 747a334d54eb627d5248262b7c9caf156c86a728 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 07:31:36 -0400 Subject: [PATCH 0770/4235] lang/org: add completion + highlighting for attach:%s links --- modules/lang/org/+attach.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 131e3fea0..34bc985a2 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -75,6 +75,18 @@ ;; A shorter link to attachments (push (cons "attach" (abbreviate-file-name org-attach-directory)) org-link-abbrev-alist) + ;; Enhance attach links + (org-link-set-parameters + "attach" + :follow (lambda (link) (find-file (expand-file-name link org-attach-directory))) + :complete (lambda (&optional _arg) + (+org--relpath (+org-link-read-file "attach" org-attach-directory) + org-attach-directory)) + :face (lambda (link) + (if (file-exists-p (expand-file-name link org-attach-directory)) + 'org-link + 'error))) + (push (car (last (split-string +org-attach-dir "/" t))) projectile-globally-ignored-directories) From 68fed155adc3e13da47e418c07170cbd408030b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 08:13:23 -0400 Subject: [PATCH 0771/4235] lang/org: minor refactor --- modules/lang/org/+attach.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 34bc985a2..008114620 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -58,8 +58,8 @@ (when (file-in-directory-p buffer-file-name +org-dir) (file-relative-name buffer-file-name +org-dir))) - ;; Write download paths relative to current file (defun +org-attach*download-fullname (path) + "Write PATH relative to current file." (file-relative-name path (file-name-directory buffer-file-name))) (advice-add #'org-download--dir-2 :override #'ignore) (advice-add #'org-download--fullname @@ -72,10 +72,9 @@ (defun +org|init-attach () (setq org-attach-directory (expand-file-name +org-attach-dir +org-dir)) + ;; A shorter link to attachments (push (cons "attach" (abbreviate-file-name org-attach-directory)) org-link-abbrev-alist) - - ;; Enhance attach links (org-link-set-parameters "attach" :follow (lambda (link) (find-file (expand-file-name link org-attach-directory))) From 318f51cfff57d22edfe81bcd8a9fa3247007ef34 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 08:13:46 -0400 Subject: [PATCH 0772/4235] lang/org: report deleted files after +org-attach/sync --- modules/lang/org/autoload/org-attach.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index 75d7ead82..149204975 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -54,12 +54,14 @@ and END (defaults to `point-min' and `point-max')." (insert-file-contents-literally org-file)) (setq +org-attachments (+org-attachments--list))) ;; clean up - (dolist (file (cl-set-difference +org-attachments-files +org-attachments - :test #'string=)) - (message "Deleting orphaned attachment: %s" file) - (unless arg - (delete-file (expand-file-name file org-attach-directory)))) - (message "Buffer's attachments synced")) + (let ((deleted 0)) + (dolist (file (cl-set-difference +org-attachments-files +org-attachments + :test #'string=)) + (message "Deleting orphaned attachment: %s" file) + (cl-incf deleted) + (unless arg + (delete-file (expand-file-name file org-attach-directory)))) + (message "Buffer's attachments synced (%d deleted)" deleted))) ;;;###autoload (defun +org-attach/find-file () From ae031928af3988367b9524ee979a80154fc0f632 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 08:14:03 -0400 Subject: [PATCH 0773/4235] lang/org: fix attachments getting double-url-encoded when exported --- modules/lang/org/autoload/org-attach.el | 31 +++++++++++++------------ 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index 149204975..ad74b56b9 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -83,21 +83,22 @@ the cursor." (unless (eq major-mode 'org-mode) (user-error "Not in an org buffer")) (require 'org-download) - (condition-case ex - (cond ((string-match-p "^data:image/png;base64," uri) - (org-download-dnd-base64 uri nil)) - ((image-type-from-file-name uri) - (org-download-image uri)) - (t - (let ((new-path (expand-file-name (org-download--fullname uri)))) - ;; Download the file - (if (string-match-p (concat "^" (regexp-opt '("http" "https" "nfs" "ftp" "file")) ":/") uri) - (url-copy-file uri new-path) - (copy-file uri new-path)) - ;; insert the link - (org-download-insert-link uri new-path)))) - (error - (user-error "Failed to attach file: %s" (error-message-string ex))))) + (let ((raw-uri (url-unhex-string uri))) + (condition-case ex + (cond ((string-match-p "^data:image/png;base64," uri) + (org-download-dnd-base64 uri nil)) + ((image-type-from-file-name raw-uri) + (org-download-image raw-uri)) + (t + (let ((new-path (expand-file-name (org-download--fullname raw-uri)))) + ;; Download the file + (if (string-match-p (concat "^" (regexp-opt '("http" "https" "nfs" "ftp" "file")) ":/") uri) + (url-copy-file raw-uri new-path) + (copy-file uri new-path)) + ;; insert the link + (org-download-insert-link raw-uri new-path)))) + (error + (user-error "Failed to attach file: %s" (error-message-string ex)))))) ;;;###autoload (defun +org-attach-download-dnd (uri action) From e89ed0e9aed443ca8cc16e3c4a6166b734240137 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 08:26:09 -0400 Subject: [PATCH 0774/4235] lang/org: handle edge cases case for attachments + If org file isn't in +org-dir, use an absolute path to attachment + If org file doesn't eixst/hasn't been saved, use default-directory --- modules/lang/org/+attach.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 008114620..8c366b6d3 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -60,7 +60,11 @@ (defun +org-attach*download-fullname (path) "Write PATH relative to current file." - (file-relative-name path (file-name-directory buffer-file-name))) + (let ((dir (or (if buffer-file-name (file-name-directory buffer-file-name)) + default-directory))) + (if (file-in-directory-p dir +org-dir) + (file-relative-name path dir) + path))) (advice-add #'org-download--dir-2 :override #'ignore) (advice-add #'org-download--fullname :filter-return #'+org-attach*download-fullname)) From 48f5811e0ddbab996a1bb1040884ca66f5cf44e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 14:41:07 -0400 Subject: [PATCH 0775/4235] lang/org: fix void-variable error upon backspace in tables #472 --- modules/lang/org/autoload/org.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index eee0c3fbe..8bf43b901 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -290,12 +290,12 @@ with `org-cycle'). Also: (save-match-data (when (and (org-at-table-p) (not (org-region-active-p)) - (string-match "|" (buffer-substring (point-at-bol) (point))) - (looking-at ".*?|")) + (string-match-p "|" (buffer-substring (point-at-bol) (point))) + (looking-at-p ".*?|")) (let ((pos (point)) - (noalign (looking-at "[^|\n\r]* |")) + (noalign (looking-at-p "[^|\n\r]* |")) (c org-table-may-need-update)) - (delete-char n) + (delete-char 1) (unless overwrite-mode (skip-chars-forward "^|") (insert " ") From 1b9c5befb4f7a5fdcdf95ec0ef60b50854f6b208 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 14:41:46 -0400 Subject: [PATCH 0776/4235] lang/org: refactor +org|realign-table-maybe --- modules/lang/org/autoload/org.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 8bf43b901..177288c1d 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -327,9 +327,10 @@ with `org-cycle'). Also: ;;;###autoload (defun +org|realign-table-maybe () "Auto-align table under cursor and re-calculate formulas." - (when (org-at-table-p) - (save-excursion - (quiet! (org-table-recalculate))))) + (when (and (org-at-table-p) org-table-may-need-update) + (quiet! + (org-table-recalculate) + (if org-table-may-need-update (org-table-align))))) ;;;###autoload (defun +org|update-cookies () From fbb16b4c5e3df6c6374a5df377a19e62eaeca990 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 14:54:56 -0400 Subject: [PATCH 0777/4235] lang/org: fix ^/0 motion keys ^ = now goes to the beginning of current visual line 0 = goes to the true beginning of the line --- modules/lang/org/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c92f40887..1c4af815c 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -251,7 +251,10 @@ between the two." (defun +org|setup-evil () (require 'evil-org) - (map! :map evil-org-mode-map + (map! :map outline-mode-map + :n "^" nil + + :map evil-org-mode-map :i [backtab] #'+org/dedent ;; navigate table cells (from insert-mode) :i "C-l" #'+org/table-next-field @@ -279,6 +282,8 @@ between the two." :m "[l" #'org-previous-link :m "]s" #'org-babel-next-src-block :m "[s" #'org-babel-previous-src-block + :m "^" #'evil-org-beginning-of-line + :m "0" (λ! (let ((visual-line-mode)) (org-beginning-of-line))) :n "gQ" #'org-fill-paragraph ;; sensible code-folding vim keybinds :n "za" #'+org/toggle-fold From 4fc28973721575abd4ab8aaac0cdb8eb5fd42888 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:26:07 -0400 Subject: [PATCH 0778/4235] core-ui: define doom-*-switch-*-hooks & minor refactor doom-init-theme-hook is now obsolete; to be replaced with doom-load-theme-hook. --- core/core-ui.el | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 0aa56965c..7a0da5fef 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -32,10 +32,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (defvar doom-init-ui-hook nil "List of hooks to run when core-ui is initialized.") -(defvar doom-init-theme-hook nil - "List of hooks to run when the theme (and font) is initialized (or reloaded -with `doom//reload-theme').") - (setq-default bidi-display-reordering nil ; disable bidirectional text for tiny performance boost blink-matching-paren nil ; don't blink--too distracting @@ -284,6 +280,27 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; Custom hooks ;; +(defvar doom-load-theme-hook nil + "Hook run when the theme (and font) is initialized (or reloaded +with `doom//reload-theme').") +(define-obsolete-variable-alias 'doom-init-theme-hook 'doom-load-theme-hook "2.1.0") + +(defvar doom-before-switch-window-hook nil + "Hook run before `switch-window' or `switch-frame' are called. See +`doom-after-switch-window-hook'.") + +(defvar doom-after-switch-window-hook nil + "Hook run after `switch-window' or `switch-frame' are called. See +`doom-before-switch-window-hook'.") + +(defvar doom-before-switch-buffer-hook nil + "Hook run before `switch-to-buffer' and `display-buffer' are called. See +`doom-after-switch-buffer-hook'.") + +(defvar doom-after-switch-buffer-hook nil + "Hook run before `switch-to-buffer' and `display-buffer' are called. See +`doom-before-switch-buffer-hook'.") + (defun doom*switch-window-hooks (orig-fn &rest args) (run-hook-with-args 'doom-before-switch-window-hook) (prog1 (apply orig-fn args) @@ -298,6 +315,10 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) (advice-add #'display-buffer :around #'doom*switch-buffer-hooks) +(defun doom*load-theme-hooks (&rest _) + (run-hook-with-args 'doom-load-theme-hook)) +(advice-add #'load-theme :after #'doom*load-theme-hooks) + ;; ;; Line numbers @@ -417,13 +438,6 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defun doom|init-theme () - "Set the theme and load the font, in that order." - (when doom-theme - (load-theme doom-theme t)) - (add-hook 'after-make-frame-functions #'doom|init-theme-in-frame) - (run-hooks 'doom-init-theme-hook)) - (defun doom|init-fonts (&optional frame) "Initialize fonts." (add-hook 'after-make-frame-functions #'doom|init-fonts) @@ -450,6 +464,12 @@ character that looks like a space that `whitespace-mode' won't affect.") "Unexpected error while initializing fonts: %s" (error-message-string ex))))))) +(defun doom|init-theme () + "Set the theme and load the font, in that order." + (when doom-theme + (load-theme doom-theme t)) + (add-hook 'after-make-frame-functions #'doom|init-theme-in-frame)) + ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and ;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. ;; Attaching `doom|init-theme-in-frame' to `after-make-frame-functions' sorts From b9da309d6bbcee2d5712a6bcddfac0047bf77205 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:27:17 -0400 Subject: [PATCH 0779/4235] ui/doom: fix solaire not resetting post-load-theme --- modules/ui/doom/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 084b583e1..fb14dd0b8 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -28,8 +28,8 @@ (setq solaire-mode-real-buffer-fn #'doom-real-buffer-p) ;; fringe can become unstyled when deleting or focusing frames (add-hook 'focus-in-hook #'solaire-mode-reset) - ;; Prevent color glitches when reloading either DOOM or the theme - (add-hook! '(doom-init-theme-hook doom-reload-hook) + ;; Prevent color glitches when reloading either DOOM or loading a new theme + (add-hook! :append '(doom-load-theme-hook doom-reload-hook) #'solaire-mode-reset) ;; org-capture takes an org buffer and narrows it. The result is erroneously ;; considered an unreal buffer, so solaire-mode must be restored. From 0e5e586826f5af4d9264dd1d2367864f76f75f7f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:28:03 -0400 Subject: [PATCH 0780/4235] ui/doom: improve theme+solaire-mode init process Solaire-mode will now auto-enable itself and swap the bg for themes defined in `+doom-solaire-themes`. Also, use doom-load-theme-hook now. --- modules/ui/doom/config.el | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index fb14dd0b8..0a25d9fe4 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -1,30 +1,54 @@ ;;; ui/doom/config.el -*- lexical-binding: t; -*- +(defvar +doom-solaire-themes + '(doom-city-lights + doom-dracula + doom-molokai + doom-nord + doom-nova + doom-one + doom-one-light + doom-solarized-light + doom-spacegrey + doom-vibrant) + "A list of themes that supports `solaire-mode'; if these themes are detected, +`solaire-mode' will be enabled.") + + +;; +;; Plugins +;; + ;; (def-package! doom-themes :config (unless doom-theme - (setq doom-theme 'doom-one) - (after! solaire-mode - (add-hook 'doom-init-theme-hook #'solaire-mode-swap-bg t))) + (setq doom-theme 'doom-one)) ;; Ensure `doom/reload-load-path' reloads common faces (defun +doom|reload-theme () (load "doom-themes-common.el" nil t)) (add-hook 'doom-pre-reload-theme-hook #'+doom|reload-theme) ;; improve integration w/ org-mode - (add-hook 'doom-init-theme-hook #'doom-themes-org-config) + (add-hook 'doom-load-theme-hook #'doom-themes-org-config) ;; more Atom-esque file icons for neotree - (add-hook 'doom-init-theme-hook #'doom-themes-neotree-config) + (add-hook 'doom-load-theme-hook #'doom-themes-neotree-config) (setq doom-neotree-enable-variable-pitch t doom-neotree-file-icons 'simple doom-neotree-line-spacing 2)) (def-package! solaire-mode - :hook (after-change-major-mode . turn-on-solaire-mode) + :commands (solaire-mode turn-on-solaire-mode solaire-mode-swap-bg) + :init + (defun +doom|solaire-mode-swap-bg-maybe () + (when (memq doom-theme +doom-solaire-themes) + (require 'solaire-mode) + (solaire-mode-swap-bg))) + (add-hook 'doom-load-theme-hook #'+doom|solaire-mode-swap-bg-maybe t) :config + (add-hook 'after-change-major-mode-hook #'turn-on-solaire-mode) (setq solaire-mode-real-buffer-fn #'doom-real-buffer-p) ;; fringe can become unstyled when deleting or focusing frames (add-hook 'focus-in-hook #'solaire-mode-reset) From 87f18bb906ee83b1d1e6d146666388d960e07ec1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:28:42 -0400 Subject: [PATCH 0781/4235] feature/evil: doom-init-theme-hook => doom-load-theme-hook --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 45f473ed5..71cb5076e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -76,7 +76,7 @@ (defun +evil|update-cursor-color () (setq +evil--default-cursor-color (face-background 'cursor))) - (add-hook 'doom-init-theme-hook #'+evil|update-cursor-color) + (add-hook 'doom-load-theme-hook #'+evil|update-cursor-color) ;; --- keybind fixes ---------------------- From 9f2a94c25a42dc91faaac998107d67d835addc6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:32:00 -0400 Subject: [PATCH 0782/4235] Only init fonts once, and for any (tty/gui) session --- core/core-ui.el | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 7a0da5fef..7bbf53f4e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -440,29 +440,27 @@ character that looks like a space that `whitespace-mode' won't affect.") (defun doom|init-fonts (&optional frame) "Initialize fonts." - (add-hook 'after-make-frame-functions #'doom|init-fonts) (when (fontp doom-font) (map-put default-frame-alist 'font (font-xlfd-name doom-font))) - (when (display-graphic-p) - (or frame (setq frame (selected-frame))) - (condition-case-unless-debug ex - (progn - (when (fontp doom-font) - (set-face-attribute 'fixed-pitch frame :font doom-font)) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) - ('error - (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))))))) + (or frame (setq frame (selected-frame))) + (condition-case-unless-debug ex + (progn + (when (fontp doom-font) + (set-face-attribute 'fixed-pitch frame :font doom-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t 'unicode doom-unicode-font frame)) + ;; ...and for variable-pitch-mode: + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + ('error + (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)))))) (defun doom|init-theme () "Set the theme and load the font, in that order." From 28303e24a2d3d0151020090a692c7aa32c49c2a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:53:28 -0400 Subject: [PATCH 0783/4235] config/default: fix easymotion keybind This fixes a regression caused by the recent precedence update (abe42fcb) for `map!`, which broke `+default/easymotion`. --- modules/config/default/autoload/evil.el | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index 33aecd814..ae0fdbffa 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -41,19 +41,22 @@ buffers." "TODO" (interactive) (let ((prefix (this-command-keys))) + (map! :m prefix nil) (evilem-default-keybindings prefix) - (map! :map evilem-map - "n" (evilem-create #'evil-ex-search-next) - "N" (evilem-create #'evil-ex-search-previous) - "s" (evilem-create #'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))) - "S" (evilem-create #'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)))) - (set-transient-map evilem-map) - (which-key-reload-key-sequence prefix))) + (let ((map evilem-map)) + (define-key map "n" (evilem-create #'evil-ex-search-next)) + (define-key map "N" (evilem-create #'evil-ex-search-previous)) + (define-key map "s" + (evilem-create #'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)))) + (define-key map "S" + (evilem-create #'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)))) + (set-transient-map map) + (which-key-reload-key-sequence prefix)))) From 0dd2df5a86ed5c05dfe81d73ecffeee92be46ff8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 19:56:53 -0400 Subject: [PATCH 0784/4235] lang/org: doom-init-theme-hook => doom-load-theme-hook --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 1c4af815c..ffccd2bd9 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -222,7 +222,7 @@ unfold to point on startup." (def-org-file-link! "doom-modules" doom-modules-dir) ;; Update UI when theme is changed - (add-hook 'doom-init-theme-hook #'+org|setup-ui)) + (add-hook 'doom-load-theme-hook #'+org|setup-ui)) (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies From f8801640bae2e667f3d6b9eca67f4ba62615503d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 21:15:07 -0400 Subject: [PATCH 0785/4235] Mention :leader/:localleader in map! docstring --- core/core-keybinds.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 8b3634990..bfbb135a0 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -192,6 +192,8 @@ States inner binding, another for the outer. Flags + (:leader [...]) an alias for (:prefix doom-leader-key ...) + (:localleader [...]) an alias for (:prefix doom-localleader-key ...) (:mode [MODE(s)] [...]) inner keybinds are applied to major MODE(s) (:map [KEYMAP(s)] [...]) inner keybinds are applied to KEYMAP(S) (:map* [KEYMAP(s)] [...]) same as :map, but deferred From bc6000a7311c0c6fad050ae93832440d518ba554 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 23:26:58 -0400 Subject: [PATCH 0786/4235] Refactor doom//reload-theme; remove obsolete hooks --- core/autoload/ui.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 984ade45c..eecbde67e 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -96,11 +96,10 @@ presentations." ;;;###autoload (defun doom//reload-theme () - "Reset the color theme currently in use." + "Reset the current color theme and fonts." (interactive) (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) (when theme (mapc #'disable-theme custom-enabled-themes)) - (run-hooks 'doom-pre-reload-theme-hook) - (doom|init-ui) - (run-hooks 'doom-post-reload-theme-hook))) + (doom|init-theme) + (doom|init-fonts))) From 895b9d5484d4d83229592368a409229815f6ea03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 23:27:31 -0400 Subject: [PATCH 0787/4235] ui/doom: +doom|reload-theme => +doom*reload --- modules/ui/doom/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 0a25d9fe4..643cfcf3b 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -25,9 +25,9 @@ (unless doom-theme (setq doom-theme 'doom-one)) - ;; Ensure `doom/reload-load-path' reloads common faces - (defun +doom|reload-theme () (load "doom-themes-common.el" nil t)) - (add-hook 'doom-pre-reload-theme-hook #'+doom|reload-theme) + ;; Reload common faces when reloading doom-themes live + (defun +doom*reload (&rest _) (load "doom-themes-common.el" nil t)) + (advice-add #'doom//reload-theme :before #'+doom*reload-common) ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) From b21e4c8bbad877dcceee85ff2dce539bd25c5b30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 22 Mar 2018 23:27:48 -0400 Subject: [PATCH 0788/4235] lang/cc: minor refactor --- modules/lang/cc/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index a6d503872..aa929e1d4 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -43,8 +43,8 @@ compilation database is present in the project.") (equal (file-name-extension buffer-file-name) "h") (re-search-forward "@\\" magic-mode-regexp-match-limit t))) - (push (cons #'+cc-c++-header-file-p 'c++-mode) magic-mode-alist) - (push (cons #'+cc-objc-header-file-p 'objc-mode) magic-mode-alist) + (push '(+cc-c++-header-file-p . c++-mode) magic-mode-alist) + (push '(+cc-objc-header-file-p . objc-mode) magic-mode-alist) :init (setq-default c-basic-offset tab-width From dacf50627c60229080a6fcab31b6f6ecd8691ea3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 02:23:57 -0400 Subject: [PATCH 0789/4235] completion/ivy: don't kill ivy on DEL in empty minibuffer --- modules/completion/ivy/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 95c9798a9..d68518ca3 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -42,7 +42,9 @@ immediately runs it on the current candidate (ending the ivy session)." ;; don't show recent files in switch-buffer ivy-use-virtual-buffers nil ;; ...but if that ever changes, show their full path - ivy-virtual-abbreviate 'full) + ivy-virtual-abbreviate 'full + ;; don't quit minibuffer on delete-error + ivy-on-del-error-function nil) (after! magit (setq magit-completing-read-function #'ivy-completing-read)) (after! yasnippet (push #'+ivy-yas-prompt yas-prompt-functions)) From 24043d9bfd707ab94d6b28e0a519e6a77f4f638b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 02:29:17 -0400 Subject: [PATCH 0790/4235] Silence beginning/end-of-line/read-only errors on motions in minibuffer --- core/core-ui.el | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index 7bbf53f4e..a9451482c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -320,6 +320,24 @@ with `doom//reload-theme').") (advice-add #'load-theme :after #'doom*load-theme-hooks) +;; +;; Silence motion errors in minibuffer +;; + +(defun doom*silence-motion-errors (orig-fn &rest args) + (if (and (minibufferp) + (<= (point) (minibuffer-prompt-end))) + (progn + (ignore-errors (apply orig-fn args)) + (goto-char (minibuffer-prompt-end))) + (apply orig-fn args))) + +(advice-add #'left-char :around #'doom*silence-motion-errors) +(advice-add #'right-char :around #'doom*silence-motion-errors) +(advice-add #'delete-backward-char :around #'doom*silence-motion-errors) +(advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) + + ;; ;; Line numbers ;; From 21f8b6933b8c79f17eca0db22f1962db60c89253 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 02:36:56 -0400 Subject: [PATCH 0791/4235] Remove unused minibuffer/system libraries They aren't necessary anymore --- core/autoload/minibuffer.el | 25 ----------- core/autoload/system.el | 68 ----------------------------- modules/config/default/+bindings.el | 9 ++-- 3 files changed, 5 insertions(+), 97 deletions(-) delete mode 100644 core/autoload/minibuffer.el delete mode 100644 core/autoload/system.el diff --git a/core/autoload/minibuffer.el b/core/autoload/minibuffer.el deleted file mode 100644 index 0eaba15c3..000000000 --- a/core/autoload/minibuffer.el +++ /dev/null @@ -1,25 +0,0 @@ -;;; core/autoload/minibuffer.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun doom/minibuffer-kill-word () - "Kill a word, backwards, but only if the cursor is after -`minibuffer-prompt-end', to prevent the 'Text is read-only' warning from -monopolizing the minibuffer." - (interactive) - (when (> (point) (minibuffer-prompt-end)) - (call-interactively #'backward-kill-word))) - -;;;###autoload -(defun doom/minibuffer-kill-line () - "Kill the entire line, but only if the cursor is after -`minibuffer-prompt-end', to prevent the 'Text is read-only' warning from -monopolizing the minibuffer." - (interactive) - (when (> (point) (minibuffer-prompt-end)) - (call-interactively #'backward-kill-sentence))) - -;;;###autoload -(defun doom/minibuffer-undo () - "Undo an edit in the minibuffer without throwing errors." - (interactive) - (ignore-errors (call-interactively #'undo))) diff --git a/core/autoload/system.el b/core/autoload/system.el deleted file mode 100644 index 97b44e2da..000000000 --- a/core/autoload/system.el +++ /dev/null @@ -1,68 +0,0 @@ -;;; core/autoload/system.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun doom-system-os (&optional os) - "Returns the OS: arch, debian, macos, general linux, cygwin or windows. If OS -is given, returns t if it matches the current system, and nil otherwise." - (let* ((gnu-linux-p (eq system-type 'gnu/linux)) - (type (cond ((and gnu-linux-p (file-exists-p "/etc/arch-release")) - 'arch) - ((and gnu-linux-p (file-exists-p "/etc/debian_version")) - 'debian) - (gnu-linux-p - 'linux) - ((eq system-type 'darwin) - 'macos) - ((memq system-type '(windows-nt cygwin)) - 'windows) - (t (error "Unknown OS: %s" system-type))))) - (or (and os (eq os type)) - type))) - -;;;###autoload -(defun doom-sh (command &rest args) - "Runs a shell command and prints any output to the DOOM buffer." - (let ((cmd-list (split-string command " "))) - (cond ((equal (car cmd-list) "sudo") - (apply #'doom-sudo (string-join (cdr cmd-list) " ") args)) - ((let ((bin (executable-find "npm"))) - (and (file-exists-p bin) - (not (file-writable-p bin)))) - (apply #'doom-sudo (string-join cmd-list " ") args)) - (t - (princ (shell-command-to-string (apply #'format command args))))))) - -(defvar tramp-verbose) -;;;###autoload -(defun doom-sudo (command &rest args) - "Like `doom-sh', but runs as root (prompts for password)." - (let ((tramp-verbose 2)) - (with-current-buffer (get-buffer-create "*doom-sudo*") - (unless (string-prefix-p "/sudo::/" default-directory) - (cd "/sudo::/")) - (princ (shell-command-to-string (apply #'format command args)))))) - -;;;###autoload -(defun doom-fetch (fetcher location dest) - "Clone a remote version-controlled repo at REPO-URL to PATH, if it exists. -Requires the corresponding client, e.g. git for git repos, hg for mercurial, -etc." - (let* ((command (pcase fetcher - (: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)))) - (argv (split-string command " " t)) - (args (format (string-join (cdr argv) " ") location)) - (bin (executable-find (car argv))) - (dest (expand-file-name dest))) - (unless bin - (error "%s couldn't be found" command)) - (unless (file-directory-p dest) - (funcall (if noninteractive - (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 (file-relative-name dest))))) - diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ad1fa3a10..0b46a9561 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -708,13 +708,14 @@ minibuffer-local-isearch-map read-expression-map) [escape] #'abort-recursive-edit - "C-r" #'evil-paste-from-register + (:when (featurep 'evil) + "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-w" #'backward-kill-word + "C-u" #'backward-kill-sentence "C-b" #'backward-word "C-f" #'forward-word - "M-z" #'doom/minibuffer-undo) + "C-z" (λ! (ignore-errors (call-interactively #'undo)))) (:after evil (:map evil-ex-completion-map From 883faba8ff1dc68fafe6dfa7a68a1d4d2ca9d5ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 03:42:39 -0400 Subject: [PATCH 0792/4235] config/default: minor refactor; remove message-buffer-mode-map binds --- modules/config/default/+bindings.el | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 0b46a9561..cfd7b9f36 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -305,6 +305,7 @@ ;; --- Personal vim-esque bindings ------------------ + :nv "K" #'+lookup/documentation :n "zx" #'kill-this-buffer :n "ZX" #'bury-buffer :n "]b" #'next-buffer @@ -621,7 +622,6 @@ :n "!" #'rotate-text ;; smart-forward - :nv "K" #'+lookup/documentation :m "g]" #'smart-forward :m "g[" #'smart-backward @@ -723,13 +723,9 @@ "C-b" #'backward-word "C-f" #'forward-word)) - (:map messages-buffer-mode-map - "M-;" #'eval-expression - "A-;" #'eval-expression) - (:after tabulated-list (:map tabulated-list-mode-map - [remap evil-record-macro] #'quit-window)) + "q" #'quit-window)) (:after view (:map view-mode-map "" #'View-quit-all))) From a14b54455973913c61af01484bb482c2bad4fefc Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Fri, 23 Mar 2018 19:03:01 +0000 Subject: [PATCH 0793/4235] Fix magic require of clojure.string --- modules/lang/clojure/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 8cc08d1df..2bccfbab7 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -15,7 +15,7 @@ (nconc cljr-magic-require-namespaces '(("re-frame" . "re-frame.core") ("reagent" . "reagent.core") - ("str" . "clojure.str")))) + ("str" . "clojure.string")))) (def-package! cider From e421720996021e186c23b26e593e980af9b566cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 15:18:52 -0400 Subject: [PATCH 0794/4235] lang/python: fix non-interactive command on gf --- modules/lang/python/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 9d23a45a5..dde74c473 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -101,7 +101,8 @@ environment variables." :when (featurep! :completion company) :after anaconda-mode :config - (map! :map python-mode-map + (map! :map anaconda-mode-map + :n "gf" nil :localleader :prefix "f" :nv "d" #'anaconda-mode-find-definitions From 2d0d41fc1e7c9ee8c85cb6c16751e7d802f31149 Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Fri, 23 Mar 2018 19:19:06 +0000 Subject: [PATCH 0795/4235] Add edn to Clojure mode extensions --- modules/lang/clojure/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 8cc08d1df..3ceb09381 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -2,6 +2,7 @@ (def-package! clojure-mode :mode "\\.clj$" + :mode "\\.edn$" :mode ("\\.cljs$" . clojurescript-mode) :mode ("\\.cljc$" . clojurec-mode) :config From 5eba949550d632ecf85611144c0dd9d52e564f6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 15:19:44 -0400 Subject: [PATCH 0796/4235] lang/org: delete-char backward in org|delete-backward-char #472 --- modules/lang/org/autoload/org.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 177288c1d..6d29877ba 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -295,7 +295,7 @@ with `org-cycle'). Also: (let ((pos (point)) (noalign (looking-at-p "[^|\n\r]* |")) (c org-table-may-need-update)) - (delete-char 1) + (delete-char -1) (unless overwrite-mode (skip-chars-forward "^|") (insert " ") From f064c5d1aed04f4834a9b7ede25dd4c3b5d8bf5d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 16:01:35 -0400 Subject: [PATCH 0797/4235] Change doom/kill-all-buffers behavior (C-u = only kill project buffers) --- core/autoload/buffers.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index d4d31e3f8..97caa27f9 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -199,12 +199,13 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." (defun doom/kill-all-buffers (&optional project-p) "Kill all buffers and closes their windows. -If PROJECT-P (universal argument), kill only buffers that belong to the current -project." +If PROJECT-P (universal argument), don't close windows and only kill buffers +that belong to the current project." (interactive "P") - (delete-other-windows) + (unless project-p + (delete-other-windows)) (switch-to-buffer (doom-fallback-buffer)) - (doom/cleanup-session)) + (doom/cleanup-session (if project-p (doom-project-buffer-list)))) ;;;###autoload (defun doom/kill-other-buffers (&optional project-p) @@ -236,11 +237,11 @@ project." (message "Killed %s buffers" n)))) ;;;###autoload -(defun doom/cleanup-session (&optional all-p) +(defun doom/cleanup-session (&optional buffer-list) "Clean up buried buries and orphaned processes in the current workspace. If ALL-P (universal argument), clean them up globally." - (interactive (list current-prefix-arg)) - (let ((buffers (doom-buried-buffers (if all-p (buffer-list)))) + (interactive) + (let ((buffers (doom-buried-buffers buffer-list)) (n 0)) (mapc #'kill-buffer buffers) (setq n (+ n (length buffers) (doom/cleanup-processes))) From 326763ab3d217c55f28eac091bb1f26570c89dab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 16:01:46 -0400 Subject: [PATCH 0798/4235] doom/cleanup-processes => doom/cleanup-buffer-processes --- core/autoload/buffers.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 97caa27f9..84a143081 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -244,7 +244,7 @@ ALL-P (universal argument), clean them up globally." (let ((buffers (doom-buried-buffers buffer-list)) (n 0)) (mapc #'kill-buffer buffers) - (setq n (+ n (length buffers) (doom/cleanup-processes))) + (setq n (+ n (length buffers) (doom/cleanup-buffer-processes))) (dolist (hook doom-cleanup-hook) (let ((m (funcall hook))) (when (integerp m) @@ -253,7 +253,7 @@ ALL-P (universal argument), clean them up globally." n)) ;;;###autoload -(defun doom/cleanup-processes () +(defun doom/cleanup-buffer-processes () "Kill all processes that have no visible associated buffers. Return number of processes killed." (interactive) From 3f4c2c81d97552e74e4fa310e79ba2e37d1a6e06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 16:03:29 -0400 Subject: [PATCH 0799/4235] feature/workspaces: if universal arg, don't prompt for file on project switch --- modules/feature/workspaces/autoload/workspaces.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8d94fda00..1500ea9de 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -531,14 +531,16 @@ Should be hooked to `projectile-after-switch-project-hook'." (switch-to-buffer (doom-fallback-buffer))) (with-current-buffer (doom-fallback-buffer) (setq default-directory +workspaces--project-dir)) - (funcall +workspaces-switch-project-function +workspaces--project-dir) + (unless current-prefix-arg + (funcall +workspaces-switch-project-function +workspaces--project-dir)) (+workspace-message (format "Switched to '%s' in new workspace" new-name) 'success)) (with-current-buffer (switch-to-buffer (doom-fallback-buffer)) (setq default-directory +workspaces--project-dir) (message "Switched to '%s'" (doom-project-name 'nocache))) - (funcall +workspaces-switch-project-function +workspaces--project-dir)) + (unless current-prefix-arg + (funcall +workspaces-switch-project-function +workspaces--project-dir))) (setq +workspaces--project-dir nil)))) From 12f2b8cfb46173b424a926a78a8d4feedaf2851d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 17:15:01 -0400 Subject: [PATCH 0800/4235] lang/elixir: remove ac-alchemist (unused) --- modules/lang/elixir/packages.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index 8fc1db9dc..3c5e308b9 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -4,4 +4,3 @@ ;; +elixir.el (package! elixir-mode) (package! alchemist) -(package! ac-alchemist) From 691c914a151bc63b99de1ddea30d27e7446a643d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 17:15:31 -0400 Subject: [PATCH 0801/4235] feature/file-templates: improve regexp for doom templates --- 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 a92e3dfb3..438ad4751 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -62,7 +62,7 @@ in a project." auto-insert-alist))) (mapc #'+file-templates-add - (let ((doom (concat "/" (regexp-opt '(".emacs.d" ".doom.d" "doom-emacs" "doom")) "/.*"))) + (let ((doom (concat "/" (regexp-opt '(".emacs.d" ".doom.d" "doom-emacs" ".config/doom")) "/"))) `(;; General ("/\\.gitignore$" "__" gitignore-mode) ("/Dockerfile$" "__" dockerfile-mode) @@ -72,9 +72,9 @@ in a project." ("\\.el$" "__initfile" emacs-lisp-mode) ("/.dir-locals.el$" nil) ("-test\\.el$" "__" emacs-ert-mode) - (,(concat doom "/.+\\.el$") "__doom-module" emacs-lisp-mode) - (,(concat doom "/packages\\.el$") "__doom-packages" emacs-lisp-mode) - (,(concat doom "/test/.+\\.el$") "__doom-test" emacs-lisp-mode) + (,(concat doom ".+\\.el$") "__doom-module" emacs-lisp-mode) + (,(concat doom ".*/packages\\.el$") "__doom-packages" emacs-lisp-mode) + (,(concat doom ".*/test/.+\\.el$") "__doom-test" emacs-lisp-mode) (snippet-mode "__" snippet-mode) ;; C/C++ ("\\.h$" "__h" c-mode) From 38a5e73e2ef384b9febd3ad923450ab6dcd094cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 23 Mar 2018 18:17:59 -0400 Subject: [PATCH 0802/4235] tools/eshell: major refactor & update --- modules/tools/eshell/autoload/eshell.el | 68 +++---------------------- modules/tools/eshell/autoload/evil.el | 39 ++++++++++++++ modules/tools/eshell/config.el | 57 +++++++++------------ 3 files changed, 69 insertions(+), 95 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 2b2fa81df..2cfe67e5a 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -85,16 +85,13 @@ module to be loaded." (eshell-life-is-too-much) (delete-char arg))) -(defun +eshell--outside-prompt-p () - (< (point) eshell-last-output-end)) - (defun +eshell--current-git-branch () - (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n") - when (string-match "^\*" match) - collect match)))) - (if (not (eq branch nil)) - (concat " [" (substring branch 2) "]") - ""))) + (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") + if (string-match-p "^\*" match) + collect match)))) + (if (not (eq branch nil)) + (concat " [" (substring branch 2) "]") + ""))) ;;;###autoload (defun +eshell/split () @@ -114,56 +111,3 @@ module to be loaded." (propertize (+eshell--current-git-branch) 'face 'font-lock-function-name-face) (propertize " λ " 'face 'font-lock-constant-face))) -;;;###autoload -(defun +eshell/evil-append () - (interactive) - (goto-char eshell-last-output-end) - (call-interactively #'evil-append-line)) - -;;;###autoload -(defun +eshell/evil-append-maybe () - (interactive) - (if (+eshell--outside-prompt-p) - (+eshell/evil-append) - (call-interactively #'evil-append))) - -;;;###autoload -(defun +eshell/evil-prepend () - (interactive) - (goto-char eshell-last-output-end) - (call-interactively #'evil-insert)) - -;;;###autoload -(defun +eshell/evil-prepend-maybe () - (interactive) - (if (+eshell--outside-prompt-p) - (+eshell/evil-prepend) - (call-interactively #'evil-insert))) - -;;;###autoload -(defun +eshell/evil-replace-maybe () - (interactive) - (if (+eshell--outside-prompt-p) - (user-error "Cannot edit read-only region") - (call-interactively #'evil-replace))) - -;;;###autoload -(defun +eshell/evil-replace-state-maybe () - (interactive) - (if (+eshell--outside-prompt-p) - (user-error "Cannot edit read-only region") - (call-interactively #'evil-replace-state))) - -;;;###autoload -(defun +eshell/evil-change () - (interactive) - (when (+eshell--outside-prompt-p) - (goto-char eshell-last-output-end)) - (call-interactively #'evil-change)) - -;;;###autoload -(defun +eshell/evil-change-line () - (interactive) - (when (+eshell--outside-prompt-p) - (goto-char eshell-last-output-end)) - (call-interactively #'evil-change-line)) diff --git a/modules/tools/eshell/autoload/evil.el b/modules/tools/eshell/autoload/evil.el index 0f8d18316..7a0070264 100644 --- a/modules/tools/eshell/autoload/evil.el +++ b/modules/tools/eshell/autoload/evil.el @@ -9,3 +9,42 @@ (+eshell/open command) (+eshell/open-popup command))) +;;;###autoload (autoload '+eshell/evil-change "tools/eshell/autoload/evil" nil t) +(evil-define-operator +eshell/evil-change (beg end type register yank-handler delete-func) + "Like `evil-change' but will not delete/copy the prompt." + (interactive "") + (let ((delete-func (or delete-func #'evil-delete)) + (nlines (1+ (evil-count-lines beg end))) + (opoint (save-excursion + (goto-char beg) + (evil-collection-eshell-next-prompt) + (point)))) + (unless (eq evil-want-fine-undo t) + (evil-start-undo-step)) + (when (get-text-property beg 'read-only) + (save-excursion + (goto-char beg) + (evil-collection-eshell-next-prompt) + (setq beg (point)))) + (funcall delete-func beg end type register yank-handler) + (cond + ((eq type 'line) + (goto-char eshell-last-output-end) + (when (get-text-property (point) 'read-only) + (evil-collection-eshell-next-prompt)) + (evil-append 1)) + ((eq type 'block) (evil-insert 1 nlines)) + (t + (evil-insert 1))))) + +;;;###autoload (autoload '+eshell/evil-change-line "tools/eshell/autoload/evil" nil t) +(evil-define-operator +eshell/evil-change-line (beg end type register yank-handler) + "Change to end of line." + :motion evil-end-of-line + (interactive "") + (when (get-text-property beg 'read-only) + (save-excursion + (goto-char beg) + (evil-collection-eshell-next-prompt) + (setq beg (point)))) + (evil-change beg end type register yank-handler #'evil-delete-line)) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 8e34c8a50..529e29317 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -12,65 +12,56 @@ :commands eshell-mode :init (setq eshell-directory-name (concat doom-etc-dir "/eshell") + eshell-rc-script "~/.eshellrc" + eshell-aliases-file "~/.eshell_aliases" + ;; eshell-scroll-to-bottom-on-input 'all eshell-scroll-to-bottom-on-output 'all eshell-buffer-shorthand t eshell-kill-processes-on-exit t + eshell-error-if-no-glob t + eshell-hist-ignoredups t ;; em-prompt eshell-prompt-regexp "^.* λ " eshell-prompt-function #'+eshell-prompt ;; em-glob eshell-glob-case-insensitive t - eshell-error-if-no-glob t - ;; em-alias - eshell-aliases-file (concat doom-local-dir ".eshell-aliases")) + eshell-error-if-no-glob t) :config - (set! :evil-state 'eshell-mode 'insert) - ;; Keep track of open eshell buffers (add-hook 'eshell-mode-hook #'+eshell|init) (add-hook 'eshell-exit-hook #'+eshell|cleanup) + (after! em-alias + (setq eshell-command-aliases-list + (append eshell-command-aliases-list + '(("q" "exit") + ("l" "ls -1") + ("ll" "ls -l") + ("la" "ls -la") + ("g" "hub") + ("gs" "hub status --short ."))))) + (after! em-term ;; Visual commands require a proper terminal. Eshell can't handle that, so it ;; delegates these commands to a term buffer. - (nconc eshell-visual-commands '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim")) - (setq eshell-visual-subcommands '(("git" "log" "l" "diff" "show")))) + (setq eshell-visual-commands + (append eshell-visual-commands '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim")) + eshell-visual-subcommands '(("git" "log" "l" "diff" "show")))) (defun +eshell|init-keymap () "Setup eshell keybindings. This must be done in a hook because eshell-mode redefines its keys every time `eshell-mode' is enabled." (map! :map eshell-mode-map - :n "i" #'+eshell/evil-prepend-maybe - :n "I" #'+eshell/evil-prepend - :n "a" #'+eshell/evil-append-maybe - :n "A" #'+eshell/evil-append - :n "r" #'+eshell/evil-replace-maybe - :n "R" #'+eshell/evil-replace-state-maybe :n "c" #'+eshell/evil-change :n "C" #'+eshell/evil-change-line - :i [tab] #'eshell-pcomplete - :i "SPC" #'self-insert-command - :i "C-u" #'eshell-kill-input - :i "C-a" #'eshell-bol :i "C-d" #'+eshell/quit-or-delete-char - :i "C-k" #'kill-line :i "C-p" #'eshell-previous-input - :i "" #'eshell-previous-input :i "C-n" #'eshell-next-input - :i "" #'eshell-next-input - :m "" #'+eshell/evil-append - :n [remap evil-record-macro] #'eshell-life-is-too-much - [remap kill-this-buffer] #'eshell-life-is-too-much)) - (add-hook 'eshell-mode-hook #'+eshell|init-keymap) - - ;; Aliases - (setq eshell-command-aliases-list - '(("q" "exit") - ("l" "ls -1") - ("ll" "ls -l") - ("la" "ls -la") - ("g" "hub") - ("gs" "hub status --short .")))) + [remap doom/backward-to-bol-or-indent] #'eshell-bol + [remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input + [remap evil-window-split] #'+eshell/split + [remap evil-window-vsplit] #'+eshell/vsplit)) + (add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap)) From 025ef9a7f8f95ad77529cc09c59628cf3f6e72a5 Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Sat, 24 Mar 2018 09:20:22 +0000 Subject: [PATCH 0803/4235] Add Boot patterns to Clojure's modes --- modules/lang/clojure/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 3ceb09381..f1567d112 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -3,6 +3,7 @@ (def-package! clojure-mode :mode "\\.clj$" :mode "\\.edn$" + :mode "\\(?:build\\|profile\\)\\.boot$" :mode ("\\.cljs$" . clojurescript-mode) :mode ("\\.cljc$" . clojurec-mode) :config From b5db4f1fb6d40b0cef0ddb90a360be6504d8aa69 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:38:05 -0400 Subject: [PATCH 0804/4235] Debug log missing modules; remove log! macro --- core/autoload/message.el | 9 --------- core/autoload/packages.el | 3 ++- core/core-packages.el | 4 +++- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 842e1a37e..33197690a 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -79,12 +79,3 @@ interactive session." (ansi-color-apply-on-region beg end))) (pop-to-buffer buf) (goto-char (point-max))))) - -;;;###autoload -(defmacro log! (message &rest args) - "Output a debug message if `doom-debug-mode' is non-nil. Otherwise, ignore this." - (when doom-debug-mode - `(message - "LOG: %s" - (propertize (format ,message ,@args) - 'face 'font-lock-comment-face)))) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c9babd6f8..8095c01ff 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -196,7 +196,8 @@ Used by `doom//packages-update'." ;; asynchronously. (let (futures) (dolist (pkg quelpa-pkgs) - (log! "New thread for: %s" pkg) + (when doom-debug-mode + (message "New thread for: %s" pkg)) (push (async-start `(lambda () (setq user-emacs-directory ,user-emacs-directory) diff --git a/core/core-packages.el b/core/core-packages.el index 6197a0832..72da9319a 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -362,7 +362,9 @@ MODULES is an malformed plist of modules to load." ((let ((submodule (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) (let ((path (doom-module-find-path module submodule))) - (when path + (if (not path) + (when doom-debug-mode + (message "Couldn't find the %s %s module" module submodule)) (doom-module-set module submodule :flags flags :path path) (push `(let ((doom--current-module ',(cons module submodule))) (load! init ,path t)) From 5eadfdc880bf2e98f8574871c4bdae2da6d65352 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:40:24 -0400 Subject: [PATCH 0805/4235] Add EMACS26+ & EMACS27+ constants --- core/core-lib.el | 2 +- core/core.el | 3 +++ modules/feature/popup/autoload.el | 4 ++-- modules/feature/version-control/config.el | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index b64c546a6..2ebccd5d4 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -6,7 +6,7 @@ (require 'map)) (eval-and-compile - (when (version< emacs-version "26") + (unless EMACS26+ (with-no-warnings (defalias 'if-let* #'if-let) (defalias 'when-let* #'when-let)))) diff --git a/core/core.el b/core/core.el index 7a6e0acb8..858fd78e5 100644 --- a/core/core.el +++ b/core/core.el @@ -56,6 +56,9 @@ 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.") +(defconst EMACS26+ (not (version< emacs-version "26"))) +(defconst EMACS27+ (not (version< emacs-version "27"))) + ;;; ;; UTF-8 as the default coding system diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 342e4c75f..e1bfa7500 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -1,6 +1,6 @@ ;;; feature/popup/autoload.el -*- lexical-binding: t; -*- -(defvar +popup--populate-wparams (version< emacs-version "26.1")) +(defvar +popup--populate-wparams (not EMACS26+)) (defun +popup--remember (windows) "Remember WINDOWS (a list of windows) for later restoration." @@ -423,7 +423,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; Popup actions ;; -(when (version< emacs-version "26") +(unless EMACS26+ (defvar window-sides-reversed nil) (defun window--sides-reverse-on-frame-p (frame) diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index 7970ebba1..4a2a9791d 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -20,7 +20,7 @@ (def-package! smerge-mode :hook (find-file . +vcs|enable-smerge-mode-maybe) :config - (when (version< emacs-version "26") + (unless EMACS26+ (with-no-warnings (defalias #'smerge-keep-upper #'smerge-keep-mine) (defalias #'smerge-keep-lower #'smerge-keep-other) From 988e70683e89f8b4080f6091a6e889cf3ce91bee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:41:10 -0400 Subject: [PATCH 0806/4235] ui/posframe: less disruptive emacs version warnings; use constants --- modules/ui/posframe/config.el | 6 ++---- modules/ui/posframe/doctor.el | 2 +- modules/ui/posframe/packages.el | 9 +++++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 8aa90e2ee..03ed446e7 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -1,9 +1,5 @@ ;;; ui/posframe/config.el -*- lexical-binding: t; -*- -(when (version< emacs-version "26") - (error "The :ui posframe module requires Emacs 26+")) - - (def-package! posframe :defer t :config @@ -13,6 +9,7 @@ (def-package! company-childframe :when (featurep! :completion company) + :when EMACS26+ :after company :config (setq company-childframe-notification nil) @@ -23,6 +20,7 @@ (def-package! ivy-posframe :when (featurep! :completion ivy) + :when EMACS26+ :after ivy :preface ;; This function searches the entire `obarray' just to populate diff --git a/modules/ui/posframe/doctor.el b/modules/ui/posframe/doctor.el index 76c09d484..e43fa4e9f 100644 --- a/modules/ui/posframe/doctor.el +++ b/modules/ui/posframe/doctor.el @@ -1,5 +1,5 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; ui/posframe/doctor.el -(when (version< emacs-version "26") +(unless EMACS26+ (error! "This module doesn't work in Emacs %s (minimum: Emacs 26)" emacs-version)) diff --git a/modules/ui/posframe/packages.el b/modules/ui/posframe/packages.el index 5cf3c37dc..b6045ed33 100644 --- a/modules/ui/posframe/packages.el +++ b/modules/ui/posframe/packages.el @@ -1,7 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/posframe/packages.el -(when (featurep! :completion company) - (package! company-childframe)) -(when (featurep! :completion ivy) - (package! ivy-posframe)) +(when EMACS26+ + (when (featurep! :completion company) + (package! company-childframe)) + (when (featurep! :completion ivy) + (package! ivy-posframe))) From 6e51dd249ab78bccb566013767037dcabc54af9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:47:52 -0400 Subject: [PATCH 0807/4235] feature/popup: fix wrong-num-of-args error following helpful links --- modules/feature/popup/+hacks.el | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index b77abbd19..47ded5e64 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -142,14 +142,20 @@ the command buffer." ;; `helpful' (after! helpful - (defun +popup*helpful--navigate (orig-fn &rest args) - (let (origin) + (defun +popup*helpful--navigate (button) + (let ((path (substring-no-properties (button-get button 'path))) + origin) (save-popups! - (apply orig-fn args) + (find-file path) + ;; We use `get-text-property' to work around an Emacs 25 bug: + ;; http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=f7c4bad17d83297ee9a1b57552b1944020f23aea + (-when-let (pos (get-text-property button 'position + (marker-buffer button))) + (goto-char pos)) (setq origin (selected-window)) (recenter)) (select-window origin))) - (advice-add #'helpful--navigate :around #'+popup*helpful--navigate)) + (advice-add #'helpful--navigate :override #'+popup*helpful--navigate)) ;; `neotree' From db2e2b0642ff625eccfcf6278ed10c668d70fc27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:48:44 -0400 Subject: [PATCH 0808/4235] feature/popup: major refactor + Defer replacement of 'size attribute in ALIST until popup opening (makes :popup definitions a little faster). + Define/use +popup-define helper function (for internal use only!) --- modules/feature/popup/autoload.el | 9 +++++ modules/feature/popup/config.el | 67 +++++++++++++++++-------------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index e1bfa7500..7dabc64b8 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -94,6 +94,15 @@ and enables `+popup-buffer-mode'." (params (map-merge 'list +popup-default-parameters (cdr (assq 'window-parameters alist))))) + ;; translate side => window-(width|height) + (when-let* ((size (cdr (assq 'size alist))) + (side (or (cdr (assq 'side alist)) 'bottom))) + (map-delete alist 'size) + (map-put alist (if (memq side '(left right)) + 'window-width + 'window-height) + size)) + ;; (map-put alist 'window-parameters params) (nreverse alist)))) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 0dd831ea4..35c3c44ba 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -108,6 +108,17 @@ deleted.") ;; +(defun +popup-define (condition &optional alist parameters) + "TODO" + (declare (indent 1)) + (push (if (eq alist :ignore) + (list condition nil) + `(,condition + (+popup-buffer) + ,@alist + (window-parameters ,@parameters))) + +popup--display-buffer-alist)) + (def-setting! :popup (condition &optional alist parameters) "Register a popup rule. @@ -119,26 +130,14 @@ module. ALIST supports one custom parameter: `size', which will resolve to `window-height' or `window-width' depending on `side'." - `(let ((alist ,alist) - (parameters ,parameters)) - (if (eq alist :ignore) - (push (list ,condition nil) +popup--display-buffer-alist) - ,(when alist - `(when-let* ((size (cdr (assq 'size alist))) - (side (or (cdr (assq 'side (append alist +popup-default-alist))) - 'bottom))) - (map-delete alist 'size) - (map-put alist (if (memq side '(left right)) - 'window-width - 'window-height) - size))) - (prog1 (push (append (list ,condition '(+popup-buffer)) - alist - (list (cons 'window-parameters parameters))) - +popup--display-buffer-alist))) + `(progn + (+popup-define ,condition ,alist ,parameters) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) - nil)) + +popup--display-buffer-alist)) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) ;; @@ -146,24 +145,32 @@ ALIST supports one custom parameter: `size', which will resolve to ;; (when (featurep! +all) - (set! :popup "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (set! :popup "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) + (+popup-define "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (+popup-define "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) (when (featurep! +defaults) - (set! :popup "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) - (set! :popup "^\\*Compil\\(ation\\|e-Log\\)" '((size . 0.3)) '((transient . 0) (quit . t))) - (set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) - (set! :popup "^\\*[Hh]elp" - '((slot . 2) (vslot . 2) (size . 0.2)) - '((select . t))) - (set! :popup "^\\*doom \\(?:term\\|eshell\\)" + (+popup-define "^\\*Completions" + '((slot . -1) (vslot . -2)) + '((transient . 0))) + (+popup-define "^\\*Compil\\(ation\\|e-Log\\)" + '((size . 0.3)) + '((transient . 0) (quit . t))) + (+popup-define "^\\*\\(?:scratch\\|Messages\\)" + nil + '((transient))) + (+popup-define "^\\*doom \\(?:term\\|eshell\\)" '((size . 0.25)) '((quit) (transient . 0))) - (set! :popup "^\\*doom:" + (+popup-define "^\\*doom:" '((size . 0.35) (side . bottom)) '((select . t) (modeline . t) (quit) (transient . t))) - (set! :popup "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore)))) + (+popup-define "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore))) + + ;; `help-mode', `helpful-mode' + (+popup-define "^\\*[Hh]elp" + '((slot . 2) (vslot . 2) (size . 0.2)) + '((select . t)))) (add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook From efbd3d69ccd1ba6e995b9ad9fc4d50438e8bd0e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:50:12 -0400 Subject: [PATCH 0809/4235] feature/popup: add :popups setting --- modules/feature/popup/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 35c3c44ba..25257ebe1 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -135,6 +135,11 @@ ALIST supports one custom parameter: `size', which will resolve to (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist)) + +(def-setting! :popups (&rest rules) + "Register multiple popup rules with :popup setting (`doom--set:popup')." + `(progn + ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist)) From 15032aaf60b6416f6e6a83718bde5a5e1b741711 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:50:28 -0400 Subject: [PATCH 0810/4235] feature/popup: move default org popup rules to config.el --- modules/feature/popup/+hacks.el | 7 ------- modules/feature/popup/config.el | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 47ded5e64..e2929635f 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -166,13 +166,6 @@ the command buffer." ;; `org' (after! org - (set! :popup "^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" - '((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) - '((transient . 0))) - (set! :popup "^\\*Org Agenda" '((size . 20)) '((select . t) (transient))) - (set! :popup "^\\*Org Src" '((size . 0.3)) '((quit) (select . t))) - (set! :popup "^CAPTURE.*\\.org$" '((size . 0.2)) '((quit) (select . t))) - ;; Org has a scorched-earth window management system I'm not fond of. i.e. it ;; kills all windows and monopolizes the frame. No thanks. We can do better ;; ourselves. diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 25257ebe1..af36af79c 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -175,7 +175,24 @@ ALIST supports one custom parameter: `size', which will resolve to ;; `help-mode', `helpful-mode' (+popup-define "^\\*[Hh]elp" '((slot . 2) (vslot . 2) (size . 0.2)) - '((select . t)))) + '((select . t))) + + ;; `org-mode' + ;; Use org-load-hook instead of `after!' because the hook runs sooner, + ;; allowing users to override these later. + (add-hook! 'org-load-hook + (+popup-define "^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" + '((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) + '((transient . 0))) + (+popup-define "^\\*Org Agenda" + '((size . 20)) + '((select . t) (transient))) + (+popup-define "^\\*Org Src" + '((size . 0.3)) + '((quit) (select . t))) + (+popup-define "^CAPTURE.*\\.org$" + '((size . 0.2)) + '((quit) (select . t))))) (add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook From de7306cb6174a6ee0d840cc064299abfb118f0f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:52:50 -0400 Subject: [PATCH 0811/4235] feature/popup: comment corrections --- modules/feature/popup/+hacks.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index e2929635f..42b162b09 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -5,14 +5,14 @@ ;; down to: ;; ;; 1. Making plugins that control their own window environment less greedy (e.g. -;; org agenda, trying to reconfigure the entire frame to pop up one tiny -;; window). +;; org agenda, which tries to reconfigure the entire frame (by deleting all +;; other windows) just to pop up one tiny window). ;; 2. Forcing plugins to use `display-buffer' and `pop-to-buffer' instead of ;; `switch-to-buffer' (which is unaffected by `display-buffer-alist', which ;; this module heavily relies on). ;; 3. Closing popups (temporarily) before functions that are highly destructive ;; to the illusion of popup control get run (with the use of the -;; `save-popups!' macro). +;; `save-popups!' macro). ;; ;; Keep in mind, all this black magic may break in future updates, and will need ;; to be watched carefully for corner cases. Also, once this file is loaded, its From 322295b5d8f90acf8d2b0c6067bec5f0c183ce27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 04:59:22 -0400 Subject: [PATCH 0812/4235] feature/popup: add docstring to +popup-define --- modules/feature/popup/config.el | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index af36af79c..d995487ce 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -109,7 +109,20 @@ deleted.") ;; (defun +popup-define (condition &optional alist parameters) - "TODO" + "Define a popup rule. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +If CONDITION is met, the buffer will be displayed in a popup window with ALIST +and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may +contain and `+popup-window-parameters' for what window parameters that the popup +module supports. + +If certain attributes/parameters are omitted, the ones from +`+popup-default-alist' and `+popup-default-parameters' will be used." (declare (indent 1)) (push (if (eq alist :ignore) (list condition nil) From abce3298fbe830c6325f136af969d4621f05fd77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 05:02:28 -0400 Subject: [PATCH 0813/4235] feature/popup: add example to :popups docstring --- modules/feature/popup/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index d995487ce..41b08418a 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -150,7 +150,12 @@ ALIST supports one custom parameter: `size', which will resolve to +popup--display-buffer-alist)) (def-setting! :popups (&rest rules) - "Register multiple popup rules with :popup setting (`doom--set:popup')." + "Register multiple popup rules with :popup setting (`doom--set:popup'). For +example: + + (set! :popups + (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" `(progn ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) (when (bound-and-true-p +popup-mode) From 70b49282a31ec55c92bc7f9f39e87462991572dc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 05:03:56 -0400 Subject: [PATCH 0814/4235] completion/ivy: add counsel-grep-or-swiper to autoloads --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index d68518ca3..e6b2fa3cf 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -82,7 +82,7 @@ immediately runs it on the current candidate (ending the ivy session)." counsel-describe-face counsel-M-x counsel-file-jump counsel-find-file counsel-find-library counsel-info-lookup-symbol counsel-imenu counsel-recentf counsel-yank-pop - counsel-descbinds counsel-org-capture) + counsel-descbinds counsel-org-capture counsel-grep-or-swiper) :init (map! [remap apropos] #'counsel-apropos [remap bookmark-jump] #'counsel-bookmark From f822fffdd2cd44d2948914bbf25038e47d724f2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 07:11:15 -0400 Subject: [PATCH 0815/4235] feature/evil: fix +evil:macro-on-all-lines --- modules/feature/evil/autoload/evil.el | 33 ++++++++++++++++++--------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index ae08a0091..ad1d046d8 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -73,18 +73,29 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" (defun +evil/window-move-down () "See `+evil--window-swap'" (interactive) (+evil--window-swap 'down)) ;;;###autoload (autoload '+evil:macro-on-all-lines "feature/evil/autoload/evil" nil t) -(evil-define-operator +evil:macro-on-all-lines (beg end &optional macro) +(evil-define-command +evil:macro-on-all-lines (beg end macro) "Apply macro to each line." - :motion nil - :move-point nil - (interactive "") - (unless (and beg end) - (setq beg (region-beginning) - end (region-end))) - (evil-ex-normal beg end - (concat "@" - (single-key-description - (or macro (read-char "@-")))))) + :move-point t + :keep-visual t + (interactive + (let (macro register) + (setq register (or evil-this-register (read-char))) + (cond + ((or (and (eq register ?@) (eq evil-last-register ?:)) + (eq register ?:)) + (setq macro (lambda () (evil-ex-repeat nil)) + evil-last-register ?:)) + ((eq register ?@) + (unless evil-last-register + (user-error "No previously executed keyboard macro.")) + (setq macro (evil-get-register evil-last-register t))) + (t + (setq macro (evil-get-register register t) + evil-last-register register))) + (list evil-visual-beginning evil-visual-end macro))) + (evil-change-state 'normal) + (evil-with-single-undo + (apply-macro-to-region-lines beg end macro))) ;;;###autoload (autoload '+evil:retab "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:retab (&optional beg end) From bb8304c15d696d67bff8cc2be30bf940b72fc289 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 07:24:22 -0400 Subject: [PATCH 0816/4235] feature/evil: rename +evil:macro-on-all-lines => +evil:apply-macro --- modules/config/default/+bindings.el | 4 +-- modules/feature/evil/autoload/evil.el | 43 +++++++++++++-------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index cfd7b9f36..9b470cf54 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -321,8 +321,8 @@ :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region :m "gs" #'+default/easymotion ; lazy-load `evil-easymotion' - :v "@" #'+evil:macro-on-all-lines - :n "g@" #'+evil:macro-on-all-lines + :v "@" #'+evil:apply-macro + :n "g@" #'+evil:apply-macro ;; repeat in visual mode (FIXME buggy) :v "." #'evil-repeat ;; don't leave visual mode after shifting diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index ad1d046d8..abad747f4 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -72,30 +72,27 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" ;;;###autoload (defun +evil/window-move-down () "See `+evil--window-swap'" (interactive) (+evil--window-swap 'down)) -;;;###autoload (autoload '+evil:macro-on-all-lines "feature/evil/autoload/evil" nil t) -(evil-define-command +evil:macro-on-all-lines (beg end macro) +;;;###autoload (autoload '+evil:apply-macro "feature/evil/autoload/evil" nil t) +(evil-define-operator +evil:apply-macro (beg end) "Apply macro to each line." - :move-point t - :keep-visual t - (interactive - (let (macro register) - (setq register (or evil-this-register (read-char))) - (cond - ((or (and (eq register ?@) (eq evil-last-register ?:)) - (eq register ?:)) - (setq macro (lambda () (evil-ex-repeat nil)) - evil-last-register ?:)) - ((eq register ?@) - (unless evil-last-register - (user-error "No previously executed keyboard macro.")) - (setq macro (evil-get-register evil-last-register t))) - (t - (setq macro (evil-get-register register t) - evil-last-register register))) - (list evil-visual-beginning evil-visual-end macro))) - (evil-change-state 'normal) - (evil-with-single-undo - (apply-macro-to-region-lines beg end macro))) + :motion nil + :move-point nil + (interactive "") + (let ((register (or evil-this-register (read-char))) + macro) + (cond ((or (and (eq register ?@) (eq evil-last-register ?:)) + (eq register ?:)) + (setq macro (lambda () (evil-ex-repeat nil)) + evil-last-register ?:)) + ((eq register ?@) + (unless evil-last-register + (user-error "No previously executed keyboard macro.")) + (setq macro (evil-get-register evil-last-register t))) + ((setq macro (evil-get-register register t) + evil-last-register register))) + (evil-change-state 'normal) + (evil-with-single-undo + (apply-macro-to-region-lines beg end macro)))) ;;;###autoload (autoload '+evil:retab "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:retab (&optional beg end) From a6cc5a219b8888a90143ea76fdd1ed153d04e655 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 07:36:59 -0400 Subject: [PATCH 0817/4235] tools/eshell: major refactor; add eshell management commands --- modules/tools/eshell/autoload/eshell.el | 154 +++++++++++++++++++----- modules/tools/eshell/config.el | 6 +- 2 files changed, 131 insertions(+), 29 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 2cfe67e5a..c37316df7 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -1,20 +1,75 @@ ;;; tools/eshell/autoload/eshell.el -*- lexical-binding: t; -*- -(defvar +eshell-buffers () +(defface +eshell-prompt-pwd '((t :inherit eshell-prompt)) + "TODO") + +(defface +eshell-prompt-git-branch '((t :inherit font-lock-function-name-face)) + "TODO") + +(defface +eshell-prompt-char '((t :inherit font-lock-constant-face)) + "TODO") + + +(defvar +eshell-buffers (make-ring 25) "List of open eshell buffers.") (defvar +eshell-buffer-name "*doom eshell*" "The name to use for custom eshell buffers. This only affects `+eshell/open', `+eshell/open-popup' and `+eshell/open-workspace'.") +(defvar +eshell-last-buffer nil + "TODO") -;; --- Commands --------------------------- + +;; +;; Library +;; + +(defun +eshell--add-buffer (buf) + (ring-remove+insert+extend +eshell-buffers buf)) + +(defun +eshell--remove-buffer (buf) + (when-let* ((idx (ring-member +eshell-buffers buf))) + (ring-remove +eshell-buffers idx))) + +(defun +eshell--current-git-branch () + (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") + if (string-match-p "^\*" match) + collect match)))) + (if (not (eq branch nil)) + (format " [%s]" (substring branch 2)) + ""))) + +(defun +eshell-delete-window () + (if (one-window-p) + (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) + (switch-to-buffer (doom-fallback-buffer))) + (delete-window))) + +(defun +eshell-get-or-create-buffer () + (or (cl-loop for buf in (ring-elements +eshell-buffers) + if (and (buffer-live-p buf) + (not (get-buffer-window buf))) + return buf) + (generate-new-buffer +eshell-buffer-name))) + +;;;###autoload +(defun +eshell-prompt () + "Generate the prompt string for eshell. Use for `eshell-prompt-function'." + (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face '+eshell-prompt-pwd) + (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) + (propertize " λ " 'face '+eshell-prompt-char))) + + +;; +;; Commands +;; ;;;###autoload (defun +eshell/open (&optional command) "Open eshell in the current buffer." (interactive) - (let ((buf (generate-new-buffer +eshell-buffer-name))) + (let ((buf (+eshell-get-or-create-buffer))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (switch-to-buffer buf) @@ -25,7 +80,7 @@ (defun +eshell/open-popup (&optional command) "Open eshell in a popup window." (interactive) - (let ((buf (get-buffer-create +eshell-buffer-name))) + (let ((buf (+eshell-get-or-create-buffer))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (pop-to-buffer buf) @@ -41,13 +96,14 @@ module to be loaded." (user-error ":feature workspaces is required, but disabled")) (unless (+workspace-get "eshell" t) (+workspace/new "eshell")) - (if-let* ((buf (cl-find-if (lambda (it) (string-match-p "^\\*doom:eshell" (buffer-name (window-buffer it)))) - (doom-visible-windows)))) + (if-let* ((buf (cl-find-if (lambda (buf) (eq 'eshell-mode (buffer-local-value 'major-mode buf))) + (doom-visible-windows) + :key #'window-buffer))) (select-window (get-buffer-window buf)) (+eshell/open)) - (doom/workspace-display) (when command - (+eshell-run-command command))) + (+eshell-run-command command)) + (doom/workspace-display)) (defun +eshell-run-command (command) (unless (cl-remove-if-not #'buffer-live-p +eshell-buffers) @@ -60,54 +116,98 @@ module to be loaded." (eshell-send-input nil t))) -;; --- Hooks ------------------------------ +;; +;; Hooks +;; ;;;###autoload (defun +eshell|init () "Keep track of eshell buffers." - (cl-pushnew (current-buffer) +eshell-buffers :test #'eq)) + (let ((buf (current-buffer))) + (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) + (add-hook 'kill-buffer-hook #'+eshell-delete-window nil t) + (dolist (buf (ring-elements +eshell-buffers)) + (unless (buffer-live-p buf) + (+eshell--remove-buffer buf))) + (+eshell--add-buffer buf) + (setq +eshell-last-buffer buf))) ;;;###autoload (defun +eshell|cleanup () "Close window (or workspace) on quit." - (setq +eshell-buffers (delete (current-buffer) +eshell-buffers)) + (+eshell--remove-buffer (current-buffer)) (when (and (featurep! :feature workspaces) (string= "eshell" (+workspace-current-name))) (+workspace/delete "eshell"))) -;; --- Keybindings ------------------------ +;; +;; Keybinds +;; ;;;###autoload (defun +eshell/quit-or-delete-char (arg) + "Delete a character (ahead of the cursor) or quit eshell if there's nothing to +delete." (interactive "p") (if (and (eolp) (looking-back eshell-prompt-regexp nil)) (eshell-life-is-too-much) (delete-char arg))) -(defun +eshell--current-git-branch () - (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") - if (string-match-p "^\*" match) - collect match)))) - (if (not (eq branch nil)) - (concat " [" (substring branch 2) "]") - ""))) - ;;;###autoload -(defun +eshell/split () +(defun +eshell/split-below () + "Create a new eshell window below the current one." (interactive) (select-window (split-window-vertically)) (+eshell/open)) ;;;###autoload -(defun +eshell/vsplit () +(defun +eshell/split-right () + "Create a new eshell window to the right of the current one." (interactive) (select-window (split-window-horizontally)) (+eshell/open)) -;;;###autoload -(defun +eshell-prompt () - (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face 'eshell-prompt) - (propertize (+eshell--current-git-branch) 'face 'font-lock-function-name-face) - (propertize " λ " 'face 'font-lock-constant-face))) +;; `make-ring' +;; `ring-ref' +;; `ring-empty-p' +;; `ring-remove' +;;;###autoload +(defun +eshell/next () + "Switch to the next eshell buffer." + (interactive) + (when (ring-empty-p +eshell-buffers) + (user-error "No eshell buffers are available")) + (switch-to-buffer (ring-next +eshell-buffers (current-buffer)))) + +;;;###autoload +(defun +eshell/previous () + "Switch to the previous eshell buffer." + (interactive) + (when (ring-empty-p +eshell-buffers) + (user-error "No eshell buffers are available")) + (switch-to-buffer (ring-previous +eshell-buffers (current-buffer)))) + +;;;###autoload +(defun +eshell/open-last () + "Switch to the last eshell buffer that was open (and is still alive)." + (interactive) + (unless (buffer-live-p +eshell-last-buffer) + (setq +eshell-last-buffer nil) + (user-error "No last eshell buffer to jump to")) + (switch-to-buffer +eshell-last-buffer)) + +;;;###autoload +(defun +eshell/switch (buffer) + "Interactively switch to another eshell buffer." + (interactive + (if (ring-empty-p +eshell-buffers) + (user-error "No eshell buffers are available") + (list (completing-read + "Eshell buffers" + (mapc #'buffer-name (delete (current-buffer) (ring-elements +eshell-buffers))) + #'get-buffer + 'require-match + nil nil (buffer-name (current-buffer)))))) + (switch-to-buffer buffer)) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 529e29317..cf2e5e729 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -61,7 +61,9 @@ redefines its keys every time `eshell-mode' is enabled." :i "C-n" #'eshell-next-input [remap doom/backward-to-bol-or-indent] #'eshell-bol [remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input - [remap evil-window-split] #'+eshell/split - [remap evil-window-vsplit] #'+eshell/vsplit)) + [remap split-window-below] #'+eshell/split-below + [remap split-window-right] #'+eshell/split-right + [remap evil-window-split] #'+eshell/split-below + [remap evil-window-vsplit] #'+eshell/split-right)) (add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap)) From 2925f5657b239b4bd4df690c2a77cb76c5f920ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 15:26:26 -0400 Subject: [PATCH 0818/4235] completion/ivy: decouple ivy-rich advice from nullable doom--project-root --- modules/completion/ivy/autoload/ivy.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 1b3711a4b..b5caaeb36 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -1,7 +1,5 @@ ;;; completion/ivy/autoload/ivy.el -*- lexical-binding: t; -*- -(defvar doom--project-root nil) - (defun +ivy--is-workspace-or-other-buffer-p (buffer) (let ((buffer (car buffer))) (when (stringp buffer) @@ -15,7 +13,7 @@ 'face (cond ((string-match-p "^ *\\*" str) 'font-lock-comment-face) ((and buffer-file-truename - (not (file-in-directory-p buffer-file-truename doom--project-root))) + (not (file-in-directory-p buffer-file-truename (doom-project-root)))) 'font-lock-doc-face) (t nil)))) (advice-add 'ivy-rich-switch-buffer-buffer-name :override #'+ivy*rich-switch-buffer-buffer-name) @@ -46,8 +44,7 @@ started `counsel-recentf' from. Also uses `abbreviate-file-name'." (defun +ivy-buffer-transformer (str) "Dim special buffers, buffers whose file aren't in the current buffer, and virtual buffers. Uses `ivy-rich' under the hood." - (let ((buf (get-buffer str)) - (doom--project-root (doom-project-root))) + (let ((buf (get-buffer str))) (require 'ivy-rich) (cond (buf (ivy-rich-switch-buffer-transformer str)) ((and (eq ivy-virtual-abbreviate 'full) From e7331e90264782e280ece878bd7c04c8427f2083 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 15:53:56 -0400 Subject: [PATCH 0819/4235] Ensure load-prefer-newer = t in non-interactive Emacs #479 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 95ad6de52..f3b31e0d8 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Ensure emacs always runs from this makefile's PWD -EMACS = emacs -q --eval "(setq user-emacs-directory default-directory)" +EMACS = emacs -q --eval "(setq user-emacs-directory default-directory load-prefer-newer t)" DOOM = $(EMACS) --batch -l init.el DOOMI = $(subst --batch,,$(DOOM)) From 57065c4a714a2f9c972317be391b8f11123a533a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 17:04:22 -0400 Subject: [PATCH 0820/4235] Don't prompt to save for non-file-visiting buffers on kill-this-buffer --- 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 a9451482c..087789710 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -576,7 +576,8 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ((eq buf (doom-fallback-buffer)) (message "Can't kill the fallback buffer.")) ((doom-real-buffer-p buf) - (if (and (buffer-modified-p buf) + (if (and buffer-file-name + (buffer-modified-p buf) (not (y-or-n-p "Buffer %s is modified; kill anyway?"))) (message "Aborted") (set-buffer-modified-p nil) From a067500ef2a839c152d14f2b8f40994747f20461 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 17:07:38 -0400 Subject: [PATCH 0821/4235] tools/eshell: spawn new eshell on split window --- modules/tools/eshell/autoload/eshell.el | 44 ++++++++++--------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index c37316df7..15b5b4494 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -25,13 +25,6 @@ ;; Library ;; -(defun +eshell--add-buffer (buf) - (ring-remove+insert+extend +eshell-buffers buf)) - -(defun +eshell--remove-buffer (buf) - (when-let* ((idx (ring-member +eshell-buffers buf))) - (ring-remove +eshell-buffers idx))) - (defun +eshell--current-git-branch () (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") if (string-match-p "^\*" match) @@ -40,11 +33,12 @@ (format " [%s]" (substring branch 2)) ""))) -(defun +eshell-delete-window () - (if (one-window-p) - (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) - (switch-to-buffer (doom-fallback-buffer))) - (delete-window))) +;;;###autoload +(defun +eshell-prompt () + "Generate the prompt string for eshell. Use for `eshell-prompt-function'." + (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face '+eshell-prompt-pwd) + (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) + (propertize " λ " 'face '+eshell-prompt-char))) (defun +eshell-get-or-create-buffer () (or (cl-loop for buf in (ring-elements +eshell-buffers) @@ -53,13 +47,6 @@ return buf) (generate-new-buffer +eshell-buffer-name))) -;;;###autoload -(defun +eshell-prompt () - "Generate the prompt string for eshell. Use for `eshell-prompt-function'." - (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face '+eshell-prompt-pwd) - (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) - (propertize " λ " 'face '+eshell-prompt-char))) - ;; ;; Commands @@ -72,7 +59,9 @@ (let ((buf (+eshell-get-or-create-buffer))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) - (switch-to-buffer buf) + (if (eq major-mode 'eshell-mode) + (pop-to-buffer buf) + (switch-to-buffer buf)) (when command (+eshell-run-command command)))) @@ -120,12 +109,17 @@ module to be loaded." ;; Hooks ;; +(defun +eshell--add-buffer (buf) + (ring-remove+insert+extend +eshell-buffers buf)) + +(defun +eshell--remove-buffer (buf) + (when-let* ((idx (ring-member +eshell-buffers buf))) + (ring-remove +eshell-buffers idx))) + ;;;###autoload (defun +eshell|init () "Keep track of eshell buffers." (let ((buf (current-buffer))) - (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) - (add-hook 'kill-buffer-hook #'+eshell-delete-window nil t) (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) @@ -155,15 +149,13 @@ delete." (delete-char arg))) ;;;###autoload -(defun +eshell/split-below () - "Create a new eshell window below the current one." +(defun +eshell/split () (interactive) (select-window (split-window-vertically)) (+eshell/open)) ;;;###autoload -(defun +eshell/split-right () - "Create a new eshell window to the right of the current one." +(defun +eshell/vsplit () (interactive) (select-window (split-window-horizontally)) (+eshell/open)) From 3f88909d52afd694eda5407b62320ca01f5bbb6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 17:51:55 -0400 Subject: [PATCH 0822/4235] tools/eshell: refactor; rename split commands; switch to new buffers properly --- modules/tools/eshell/autoload/eshell.el | 44 +++++++++++++++---------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 15b5b4494..c37316df7 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -25,6 +25,13 @@ ;; Library ;; +(defun +eshell--add-buffer (buf) + (ring-remove+insert+extend +eshell-buffers buf)) + +(defun +eshell--remove-buffer (buf) + (when-let* ((idx (ring-member +eshell-buffers buf))) + (ring-remove +eshell-buffers idx))) + (defun +eshell--current-git-branch () (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") if (string-match-p "^\*" match) @@ -33,12 +40,11 @@ (format " [%s]" (substring branch 2)) ""))) -;;;###autoload -(defun +eshell-prompt () - "Generate the prompt string for eshell. Use for `eshell-prompt-function'." - (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face '+eshell-prompt-pwd) - (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) - (propertize " λ " 'face '+eshell-prompt-char))) +(defun +eshell-delete-window () + (if (one-window-p) + (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) + (switch-to-buffer (doom-fallback-buffer))) + (delete-window))) (defun +eshell-get-or-create-buffer () (or (cl-loop for buf in (ring-elements +eshell-buffers) @@ -47,6 +53,13 @@ return buf) (generate-new-buffer +eshell-buffer-name))) +;;;###autoload +(defun +eshell-prompt () + "Generate the prompt string for eshell. Use for `eshell-prompt-function'." + (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face '+eshell-prompt-pwd) + (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) + (propertize " λ " 'face '+eshell-prompt-char))) + ;; ;; Commands @@ -59,9 +72,7 @@ (let ((buf (+eshell-get-or-create-buffer))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) - (if (eq major-mode 'eshell-mode) - (pop-to-buffer buf) - (switch-to-buffer buf)) + (switch-to-buffer buf) (when command (+eshell-run-command command)))) @@ -109,17 +120,12 @@ module to be loaded." ;; Hooks ;; -(defun +eshell--add-buffer (buf) - (ring-remove+insert+extend +eshell-buffers buf)) - -(defun +eshell--remove-buffer (buf) - (when-let* ((idx (ring-member +eshell-buffers buf))) - (ring-remove +eshell-buffers idx))) - ;;;###autoload (defun +eshell|init () "Keep track of eshell buffers." (let ((buf (current-buffer))) + (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) + (add-hook 'kill-buffer-hook #'+eshell-delete-window nil t) (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) @@ -149,13 +155,15 @@ delete." (delete-char arg))) ;;;###autoload -(defun +eshell/split () +(defun +eshell/split-below () + "Create a new eshell window below the current one." (interactive) (select-window (split-window-vertically)) (+eshell/open)) ;;;###autoload -(defun +eshell/vsplit () +(defun +eshell/split-right () + "Create a new eshell window to the right of the current one." (interactive) (select-window (split-window-horizontally)) (+eshell/open)) From 653caf4e736abfa67a80fe3d8b8b426864308e9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 17:52:41 -0400 Subject: [PATCH 0823/4235] feature/evil: remove ] and [ evil-snipe aliases #478 --- modules/feature/evil/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 71cb5076e..362ef23f7 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -340,9 +340,7 @@ the new algorithm is confusing, like in python or ruby." '(org-agenda-mode magit-mode git-rebase-mode elfeed-show-mode elfeed-search-mode ranger-mode magit-repolist-mode) - evil-snipe-aliases '((?\[ "[[{(]") - (?\] "[]})]") - (?\; "[;:]"))) + evil-snipe-aliases '((?\; "[;:]"))) :config (evil-snipe-override-mode +1)) From 8604966e210c6afcd4298218600842034b3cbe3a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 17:53:13 -0400 Subject: [PATCH 0824/4235] ui/doom-dashboard: add 'edit modules list' button --- modules/ui/doom-dashboard/config.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index e963ac1a1..ddb68a072 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -327,7 +327,15 @@ controlled by `+doom-dashboard-pwd-policy'." (call-interactively (or (command-remapping #'bookmark-jump) #'bookmark-jump))) ,(when (featurep! :config private) - '("Open custom init script" "settings" - (find-file (expand-file-name "init.el" +private-config-path)))) + '("Open private configuration" "settings" + (find-file (expand-file-name "config.el" +private-config-path)))) + ("Edit my modules list" "pencil" + (if (featurep! :config private) + (let ((init-file (expand-file-name "init.el" +private-config-path))) + (unless (file-exists-p init-file) + (make-directory (file-name-directory init-file) t) + (copy-file (expand-file-name "init.example.el" doom-emacs-dir) init-file t)) + (find-file init-file)) + (find-file user-init-file))) ("Edit Doom Emacs" "tools" (doom-project-find-file doom-emacs-dir)))))) From c87122e6b4c935572a3c99bcc47be8775bde92ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 24 Mar 2018 23:19:14 -0400 Subject: [PATCH 0825/4235] tools/eshell: refactor; don't open another eshell from eshell --- modules/tools/eshell/autoload/eshell.el | 30 +++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index c37316df7..17b79f7ae 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -40,17 +40,12 @@ (format " [%s]" (substring branch 2)) ""))) -(defun +eshell-delete-window () - (if (one-window-p) - (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) - (switch-to-buffer (doom-fallback-buffer))) - (delete-window))) - -(defun +eshell-get-or-create-buffer () - (or (cl-loop for buf in (ring-elements +eshell-buffers) - if (and (buffer-live-p buf) - (not (get-buffer-window buf))) - return buf) +(defun +eshell--buffer (&optional new-p) + (or (unless new-p + (cl-loop for buf in (ring-elements +eshell-buffers) + if (and (buffer-live-p buf) + (not (get-buffer-window buf))) + return buf)) (generate-new-buffer +eshell-buffer-name))) ;;;###autoload @@ -69,7 +64,7 @@ (defun +eshell/open (&optional command) "Open eshell in the current buffer." (interactive) - (let ((buf (+eshell-get-or-create-buffer))) + (let ((buf (+eshell--buffer (eq major-mode 'eshell-mode)))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (switch-to-buffer buf) @@ -80,7 +75,7 @@ (defun +eshell/open-popup (&optional command) "Open eshell in a popup window." (interactive) - (let ((buf (+eshell-get-or-create-buffer))) + (let ((buf (+eshell--buffer))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (pop-to-buffer buf) @@ -120,12 +115,19 @@ module to be loaded." ;; Hooks ;; +;;;###autoload +(defun +eshell|delete-window () + (if (one-window-p) + (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) + (switch-to-buffer (doom-fallback-buffer))) + (delete-window))) + ;;;###autoload (defun +eshell|init () "Keep track of eshell buffers." (let ((buf (current-buffer))) (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) - (add-hook 'kill-buffer-hook #'+eshell-delete-window nil t) + (add-hook 'kill-buffer-hook #'+eshell|delete-window nil t) (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) From 22e18ad0a683802e253f7e7b1db760ed9464d944 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 03:07:08 -0400 Subject: [PATCH 0826/4235] core-os: remove unnecessary after! wrapping --- core/core-os.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 2b21248c9..6e2d9002d 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -10,12 +10,11 @@ select-enable-clipboard t select-enable-primary t) -(after! evil - ;; stop copying each visual state move to the clipboard: - ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on - ;; Most of this code grokked from: - ;; http://stackoverflow.com/questions/15873346/elisp-rename-macro - (advice-add #'evil-visual-update-x-selection :override #'ignore)) +;; stop copying each visual state move to the clipboard: +;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on +;; Most of this code grokked from: +;; http://stackoverflow.com/questions/15873346/elisp-rename-macro +(advice-add #'evil-visual-update-x-selection :override #'ignore) (cond (IS-MAC (setq mac-command-modifier 'meta From 28f221ed9c51425096800ea40ee34363dd3f0582 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 17:19:22 -0400 Subject: [PATCH 0827/4235] lang/org: fix backtab (rebound by evil-collection-org) --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index ffccd2bd9..9ad61c0de 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -253,6 +253,7 @@ between the two." (require 'evil-org) (map! :map outline-mode-map :n "^" nil + :n [backtab] nil :map evil-org-mode-map :i [backtab] #'+org/dedent From 74bbefc5fd67d20446b1c01c02a5a2211aea40f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 20:26:01 -0400 Subject: [PATCH 0828/4235] tools/password: auto-password-store => auth-source-store #480 The package was renamed upstream. --- modules/tools/password-store/config.el | 4 ++-- modules/tools/password-store/packages.el | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 52912280a..63c6eafdd 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -39,5 +39,5 @@ (when (featurep! +auth) (if (require 'auth-store-pass nil t) (auth-source-pass-enable) - (def-package! auth-password-store - :config (auth-pass-enable)))) + (def-package! auth-source-store + :config (auth-source-pass-enable)))) diff --git a/modules/tools/password-store/packages.el b/modules/tools/password-store/packages.el index fe97395c3..dd57994a1 100644 --- a/modules/tools/password-store/packages.el +++ b/modules/tools/password-store/packages.el @@ -3,7 +3,7 @@ (package! pass) (package! password-store) -(package! auth-password-store) +(package! auth-source-store) (when (featurep! :completion helm) (package! helm-pass)) From e41212bb7bf951ec66e6fe1c975402f51fa4a6d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 22:36:00 -0400 Subject: [PATCH 0829/4235] feature/lookup: fix +lookup/definition not fetching the correct identifier Some xref backends have specialized thing-at-point implementations (such as haskell's dante's xref backend), this fix uses them to fetch the identifier at point. --- modules/feature/lookup/autoload/lookup.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 517625001..2b22ac53b 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -59,7 +59,7 @@ to find it: Failing all that, it will give up with an error." (interactive - (list (thing-at-point 'symbol t) + (list (xref-backend-identifier-at-point (xref-find-backend)) current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) From 1983363f9c815622c69f75696e3f195810d0a331 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 22:39:03 -0400 Subject: [PATCH 0830/4235] config/default: add +default-repeat-{forward,backward}-key options --- modules/config/default/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index d5c563849..102c3f367 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -74,14 +74,17 @@ (load! +evil-commands)) (when (featurep! +bindings) + (defvar +default-repeat-forward-key ";") + (defvar +default-repeat-backward-key ",") + ;; 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 ";" ',next-func) - (define-key evil-motion-state-map "," ',prev-func)) + (define-key evil-motion-state-map +default-repeat-forward-key ',next-func) + (define-key evil-motion-state-map +default-repeat-backward-key ',prev-func)) (advice-add #',command :before #',fn-sym)))) ;; n/N From 855bc5bc203ef55a6524d1362bdb03bc3b9f7d90 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 22:45:02 -0400 Subject: [PATCH 0831/4235] tools/password-store: auth-source-store => auth-source-pass #480 --- modules/tools/password-store/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/password-store/packages.el b/modules/tools/password-store/packages.el index dd57994a1..2a047fdd0 100644 --- a/modules/tools/password-store/packages.el +++ b/modules/tools/password-store/packages.el @@ -3,7 +3,7 @@ (package! pass) (package! password-store) -(package! auth-source-store) +(package! auth-source-pass) (when (featurep! :completion helm) (package! helm-pass)) From 83211cd74c2fc25a491b8cbc3ed2a731cb239f56 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 25 Mar 2018 22:59:49 -0400 Subject: [PATCH 0832/4235] completion/ivy: fix redundant smart-case flag in ripgrep args --- modules/completion/ivy/autoload/evil.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 790425520..a44cb24d1 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -70,8 +70,7 @@ (unless recursion-p " --depth 1")))) (counsel-ag query directory args (format prompt args)))) ('rg - (let ((args (concat " -S" ; smart-case - (if all-files-p " -uu") + (let ((args (concat (if all-files-p " -uu") (unless recursion-p " --maxdepth 1")))) (counsel-rg query directory args (format prompt args)))) ('pt From 9e62898d92f3e504cc3f0501d9d69eb809bbdc0a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 00:02:22 -0400 Subject: [PATCH 0833/4235] completion/ivy: major refactor of file-search commands --- modules/completion/ivy/autoload/evil.el | 200 ++++------------------ modules/completion/ivy/autoload/ivy.el | 202 +++++++++++++++++++++++ modules/config/default/+bindings.el | 10 +- modules/config/default/+evil-commands.el | 8 +- 4 files changed, 245 insertions(+), 175 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index a44cb24d1..f9c00262e 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -16,188 +16,52 @@ ;; --- file searching --------------------- -(defvar +ivy--file-last-search nil) -(defvar +ivy--file-search-recursion-p t) -(defvar +ivy--file-search-all-files-p nil) - -(defun +ivy--file-search (engine beg end query &optional directory) - (let* ((project-root (doom-project-root)) - (directory (or directory project-root)) - (recursion-p +ivy--file-search-recursion-p) - (all-files-p +ivy--file-search-all-files-p) - (engine (or engine - (and (executable-find "rg") 'rg) - (and (executable-find "ag") 'ag))) - (query - (or query - (if (evil-visual-state-p) - (and beg end - (> (abs (- end beg)) 1) - (rxt-quote-pcre (buffer-substring-no-properties beg end))) - +ivy--file-last-search) - +ivy--file-last-search)) - (prompt - (format "%s%%s %s" - (symbol-name engine) - (cond ((equal directory default-directory) - "./") - ((equal directory project-root) - (projectile-project-name)) - (t - (file-relative-name directory project-root))))) - (default-directory directory)) - (setq +ivy--file-last-search query) - (require 'counsel) - (cl-letf (((symbol-function 'counsel-ag-function) - (symbol-function '+ivy*counsel-ag-function)) - ((symbol-function 'counsel-git-grep-function) - (symbol-function '+ivy*counsel-git-grep-function))) - (pcase engine - ('grep - (let ((args (if recursion-p " -r")) - (counsel-projectile-grep-initial-input query) - (default-directory directory)) - (if all-files-p - (cl-letf (((symbol-function #'projectile-ignored-directories-rel) - (symbol-function #'ignore)) - ((symbol-function #'projectile-ignored-files-rel) - (symbol-function #'ignore))) - (counsel-projectile-grep args)) - (counsel-projectile-grep args)))) - ('ag - (let ((args (concat " -S" ; smart-case - (if all-files-p " -a") - (unless recursion-p " --depth 1")))) - (counsel-ag query directory args (format prompt args)))) - ('rg - (let ((args (concat (if all-files-p " -uu") - (unless recursion-p " --maxdepth 1")))) - (counsel-rg query directory args (format prompt args)))) - ('pt - (let ((counsel-pt-base-command - (concat counsel-pt-base-command - " -S" ; smart-case - (if all-files-p " -U") - (unless recursion-p " --depth=1"))) - (default-directory directory)) - (counsel-pt query))) - (_ (error "No search engine specified")))))) - ;;;###autoload (autoload '+ivy:pt "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:pt (beg end query &optional all-files-p directory) - "Perform a project file search using the platinum searcher. QUERY is a grep -regexp. If omitted, the current selection is used. If no selection is active, -the last known search is used. - -If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive "") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'pt beg end query directory))) +(evil-define-command +ivy:pt (all-files-p query &optional directory) + "Ex interface for `+ivy/pt'" + (interactive "") + (+ivy/pt all-files-p query directory)) ;;;###autoload (autoload '+ivy:grep "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:grep (beg end query &optional all-files-p directory) - "Perform a project file search using grep (or git-grep in git repos). QUERY is -a grep regexp. If omitted, the current selection is used. If no selection is -active, the last known search is used. - -If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive "") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'grep beg end query directory))) +(evil-define-command +ivy:grep (all-files-p query &optional directory) + "Ex interface for `+ivy/grep'" + (interactive "") + (+ivy/grep all-files-p query directory)) ;;;###autoload (autoload '+ivy:ag "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:ag (beg end query &optional all-files-p directory) - "Perform a project file search using the silver searcher. QUERY is a pcre -regexp. If omitted, the current selection is used. If no selection is active, -the last known search is used. - -If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive "") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'ag beg end query directory))) +(evil-define-command +ivy:ag (all-files-p query &optional directory) + "Ex interface for `+ivy/ag'" + (interactive "") + (+ivy/ag all-files-p query directory)) ;;;###autoload (autoload '+ivy:rg "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:rg (beg end query &optional all-files-p directory) - "Perform a project file search using ripgrep. QUERY is a regexp. If omitted, -the current selection is used. If no selection is active, the last known search -is used. +(evil-define-command +ivy:rg (all-files-p query &optional directory) + "Ex interface for `+ivy/rg'" + (interactive "") + (+ivy/rg all-files-p query directory)) -If ALL-FILES-P, don't respect .gitignore files and search everything. -NOTE: ripgrep doesn't support multiline searches (yet)." +;;;###autoload (autoload '+ivy:pt-from-cwd "completion/ivy/autoload/evil" nil t) +(evil-define-command +ivy:pt-from-cwd (query &optional bang) + "Ex interface for `+ivy/pt-from-cwd'." (interactive "") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'rg beg end query directory))) + (+ivy/pt-from-cwd (not bang) query)) - -;;;###autoload (autoload '+ivy:pt-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:pt-cwd (beg end query &optional bang) - "The same as :grep, but searches the current directory. If BANG, don't recurse -into sub-directories." +;;;###autoload (autoload '+ivy:grep-from-cwd "completion/ivy/autoload/evil" nil t) +(evil-define-command +ivy:grep-from-cwd (query &optional bang) + "Ex interface for `+ivy/grep-from-cwd'." (interactive "") - (let ((+ivy--file-search-recursion-p (not bang))) - (+ivy:pt beg end query t default-directory))) + (+ivy/grep-from-cwd (not bang) query)) -;;;###autoload (autoload '+ivy:grep-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:grep-cwd (beg end query &optional bang) - "The same as :grep, but searches the current directory. If BANG, don't recurse -into sub-directories." +;;;###autoload (autoload '+ivy:ag-from-cwd "completion/ivy/autoload/evil" nil t) +(evil-define-command +ivy:ag-from-cwd (query &optional bang) + "Ex interface for `+ivy/ag-from-cwd'." (interactive "") - (let ((+ivy--file-search-recursion-p (not bang))) - (+ivy:grep beg end query t default-directory))) + (+ivy/ag-from-cwd (not bang) query)) -;;;###autoload (autoload '+ivy:ag-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:ag-cwd (beg end query &optional bang) - "The same as :ag, but searches the current directory. If BANG, don't recurse -into sub-directories." +;;;###autoload (autoload '+ivy:rg-from-cwd "completion/ivy/autoload/evil" nil t) +(evil-define-command +ivy:rg-from-cwd (query &optional bang) + "Ex interface for `+ivy/rg-from-cwd'." (interactive "") - (let ((+ivy--file-search-recursion-p (not bang))) - (+ivy:ag beg end query t default-directory))) + (+ivy/rg-from-cwd (not bang) query)) -;;;###autoload (autoload '+ivy:rg-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-operator +ivy:rg-cwd (beg end query &optional bang) - "The same as :rg, but only searches the current directory. If BANG, don't -recurse into sub-directories. - -NOTE: ripgrep doesn't support multiline searches (yet)." - (interactive "") - (let ((+ivy--file-search-recursion-p (not bang))) - (+ivy:rg beg end query t default-directory))) - - -;; -;; Advice -;; - -;;;###autoload -(defun +ivy*counsel-ag-function (string) - "Advice to get rid of the character limit from `counsel-ag-function'. - -NOTE This may need to be updated frequently, to meet changes upstream (in -counsel-rg)." - (if (< (length string) 1) ; <-- modified the character limit - (counsel-more-chars 1) ; <-- - (let ((default-directory (ivy-state-directory ivy-last)) - (regex (counsel-unquote-regex-parens - (setq ivy--old-re - (ivy--regex string))))) - (counsel--async-command (format counsel-ag-command - (shell-quote-argument regex))) - nil))) - -;;;###autoload -(defun +ivy*counsel-git-grep-function (string) - "Advice to get rid of the character limit from `counsel-git-grep-function'. - -NOTE This may need to be updated frequently, to meet changes upstream (in -counsel-git-grep)." - (if (and (> counsel--git-grep-count counsel--git-grep-count-threshold) - (< (length string) 1)) ; <-- modified the character limit - (counsel-more-chars 1) ; <-- - (let* ((default-directory (ivy-state-directory ivy-last)) - (cmd (format counsel-git-grep-cmd - (setq ivy--old-re (ivy--regex string t))))) - (if (<= counsel--git-grep-count counsel--git-grep-count-threshold) - (split-string (shell-command-to-string cmd) "\n" t) - (counsel--gg-candidates (ivy--regex string)) - nil)))) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index b5caaeb36..251b5b65e 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -196,3 +196,205 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (re-search-forward (ivy--regex ivy-text t) (line-end-position) t) (run-hooks 'counsel-grep-post-action-hook) (selected-window)))))) + + +;; +;; File searching +;; + +(defvar +ivy--file-last-search nil) +(defvar +ivy--file-search-recursion-p t) +(defvar +ivy--file-search-all-files-p nil) + +(defun +ivy--file-search (engine &optional query directory) + (let* ((project-root (doom-project-root)) + (directory (or directory project-root)) + (recursion-p +ivy--file-search-recursion-p) + (all-files-p +ivy--file-search-all-files-p) + (engine (or engine + (and (executable-find "rg") 'rg) + (and (executable-find "ag") 'ag))) + (query + (or query + (when (use-region-p) + (let ((beg (or (bound-and-true-p evil-visual-beginning) (region-beginning))) + (end (or (bound-and-true-p evil-visual-end) (region-end)))) + (when (> (abs (- end beg)) 1) + (rxt-quote-pcre (buffer-substring-no-properties beg end))))) + +ivy--file-last-search)) + (prompt + (format "%s%%s %s" + (symbol-name engine) + (cond ((equal directory default-directory) + "./") + ((equal directory project-root) + (projectile-project-name)) + (t + (file-relative-name directory project-root))))) + (default-directory directory)) + (setq +ivy--file-last-search query) + (require 'counsel) + (cl-letf (((symbol-function 'counsel-ag-function) + (symbol-function '+ivy*counsel-ag-function)) + ((symbol-function 'counsel-git-grep-function) + (symbol-function '+ivy*counsel-git-grep-function))) + (pcase engine + ('grep + (let ((args (if recursion-p " -r")) + (counsel-projectile-grep-initial-input query) + (default-directory directory)) + (if all-files-p + (cl-letf (((symbol-function #'projectile-ignored-directories-rel) + (symbol-function #'ignore)) + ((symbol-function #'projectile-ignored-files-rel) + (symbol-function #'ignore))) + (counsel-projectile-grep args)) + (counsel-projectile-grep args)))) + ('ag + (let ((args (concat " -S" ; smart-case + (if all-files-p " -a") + (unless recursion-p " --depth 1")))) + (counsel-ag query directory args (format prompt args)))) + ('rg + (let ((args (concat (if all-files-p " -uu") + (unless recursion-p " --maxdepth 1")))) + (counsel-rg query directory args (format prompt args)))) + ('pt + (let ((counsel-pt-base-command + (concat counsel-pt-base-command + " -S" ; smart-case + (if all-files-p " -U") + (unless recursion-p " --depth=1"))) + (default-directory directory)) + (counsel-pt query))) + (_ (error "No search engine specified")))))) + +;;;###autoload +(defun +ivy/project-search (arg) + "Performs a project search using the first available search backend from a +list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), +preform search from current directory." + (interactive "P") + (call-interactively + (cond ((executable-find "rg") (if arg #'+ivy/rg-from-cwd #'+ivy/rg)) + ((executable-find "ag") (if arg #'+ivy/ag-from-cwd #'+ivy/ag)) + ((executable-find "pt") (if arg #'+ivy/pt-from-cwd #'+ivy/pt)) + (arg #'+ivy/grep-from-cwd) + (#'+ivy/grep)))) + +;;;###autoload +(defun +ivy/rg (all-files-p &optional query directory) + "Perform a project file search using ripgrep. QUERY is a regexp. If omitted, +the current selection is used. If no selection is active, the last known search +is used. + +If ALL-FILES-P, don't respect .gitignore files and search everything. + +NOTE: ripgrep doesn't support multiline searches (yet)." + (interactive "P") + (let ((+ivy--file-search-all-files-p all-files-p)) + (+ivy--file-search 'rg (or query "") directory))) + +;;;###autoload +(defun +ivy/ag (all-files-p &optional query directory) + "Perform a project file search using the silver searcher. QUERY is a pcre +regexp. If omitted, the current selection is used. If no selection is active, +the last known search is used. + +If ALL-FILES-P, don't respect .gitignore files and search everything." + (interactive) + (let ((+ivy--file-search-all-files-p all-files-p)) + (+ivy--file-search 'ag (or query "") directory))) + +;;;###autoload +(defun +ivy/pt (all-files-p &optional query directory) + "Perform a project file search using the platinum searcher. QUERY is a grep +regexp. If omitted, the current selection is used. If no selection is active, +the last known search is used. + +If ALL-FILES-P, don't respect .gitignore files and search everything." + (interactive) + (let ((+ivy--file-search-all-files-p all-files-p)) + (+ivy--file-search 'pt (or query "") directory))) + +;;;###autoload +(defun +ivy/grep (all-files-p &optional query directory) + "Perform a project file search using grep (or git-grep in git repos). QUERY is +a grep regexp. If omitted, the current selection is used. If no selection is +active, the last known search is used. + +If ALL-FILES-P, don't respect .gitignore files and search everything." + (interactive) + (let ((+ivy--file-search-all-files-p all-files-p)) + (+ivy--file-search 'grep (or query "") directory))) + + +;;;###autoload +(defun +ivy/rg-from-cwd (recursive-p &optional query) + "Like `+ivy/rg', but from the current directory (recursively if RECURSIVE-P is +non-nil)." + (interactive "P") + (let ((+ivy--file-search-recursion-p recursive-p)) + (+ivy/rg t query default-directory))) + +;;;###autoload +(defun +ivy/ag-from-cwd (recursive-p &optional query) + "Like `+ivy/ag', but from the current directory (recursively if RECURSIVE-P is +non-nil)." + (interactive "P") + (let ((+ivy--file-search-recursion-p recursive-p)) + (+ivy/ag t query default-directory))) + +;;;###autoload +(defun +ivy/pt-from-cwd (recursive-p &optional query) + "Like `+ivy/pt', but from the current directory (recursively if RECURSIVE-P is +non-nil)." + (interactive "P") + (let ((+ivy--file-search-recursion-p recursive-p)) + (+ivy/pt t query default-directory))) + +;;;###autoload +(defun +ivy/grep-from-cwd (recursive-p &optional query) + "Like `+ivy/grep', but from the current directory (recursively if RECURSIVE-P is +non-nil)." + (interactive "P") + (let ((+ivy--file-search-recursion-p recursive-p)) + (+ivy/grep t query default-directory))) + + +;; +;; Advice +;; + +;;;###autoload +(defun +ivy*counsel-ag-function (string) + "Advice to get rid of the character limit from `counsel-ag-function'. + +NOTE This may need to be updated frequently, to meet changes upstream (in +counsel-rg)." + (if (< (length string) 1) ; <-- modified the character limit + (counsel-more-chars 1) ; <-- + (let ((default-directory (ivy-state-directory ivy-last)) + (regex (counsel-unquote-regex-parens + (setq ivy--old-re + (ivy--regex string))))) + (counsel--async-command (format counsel-ag-command + (shell-quote-argument regex))) + nil))) + +;;;###autoload +(defun +ivy*counsel-git-grep-function (string) + "Advice to get rid of the character limit from `counsel-git-grep-function'. + +NOTE This may need to be updated frequently, to meet changes upstream (in +counsel-git-grep)." + (if (and (> counsel--git-grep-count counsel--git-grep-count-threshold) + (< (length string) 1)) ; <-- modified the character limit + (counsel-more-chars 1) ; <-- + (let* ((default-directory (ivy-state-directory ivy-last)) + (cmd (format counsel-git-grep-cmd + (setq ivy--old-re (ivy--regex string t))))) + (if (<= counsel--git-grep-count counsel--git-grep-count-threshold) + (split-string (shell-command-to-string cmd) "\n" t) + (counsel--gg-candidates (ivy--regex string)) + nil)))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9b470cf54..31eb4c0e0 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -116,10 +116,12 @@ :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" #'+lookup/online-select) + :desc "Project" :nv "p" #'+ivy/project-search + :desc "Directory" :nv "d" (λ! (+ivy/project-search t)) + :desc "Buffer" :nv "b" #'swiper + :desc "Symbols" :nv "i" #'imenu + :desc "Symbols across buffers" :nv "I" #'imenu-anywhere + :desc "Online providers" :nv "o" #'+lookup/online-select) (:desc "workspace" :prefix "TAB" :desc "Display tab bar" :n "TAB" #'+workspace/display diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 6105989a8..619246aba 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -82,11 +82,13 @@ (ex! "pwd" #'doom:pwd) (cond ((featurep! :completion ivy) (ex! "ag" #'+ivy:ag) - (ex! "agc[wd]" #'+ivy:ag-cwd) + (ex! "agc[wd]" #'+ivy:ag-from-cwd) (ex! "rg" #'+ivy:rg) - (ex! "rgc[wd]" #'+ivy:rg-cwd) + (ex! "rgc[wd]" #'+ivy:rg-from-cwd) + (ex! "pt" #'+ivy:pt) + (ex! "ptc[wd]" #'+ivy:pt-from-cwd) (ex! "grep" #'+ivy:grep) - (ex! "grepc[wd]" #'+ivy:grep-cwd) + (ex! "grepc[wd]" #'+ivy:grep-from-cwd) (ex! "sw[iper]" #'+ivy:swiper) (ex! "todo" #'+ivy:todo)) ((featurep! :completion helm) From 641e26431d969e2304177f727495d50c4970bc60 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 00:21:54 -0400 Subject: [PATCH 0834/4235] feature/lookup: use xref's symbol-at-point function in other lookups --- modules/feature/lookup/autoload/lookup.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 2b22ac53b..cd4fce531 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -22,7 +22,7 @@ ((use-region-p) (buffer-substring-no-properties (region-beginning) (region-end))) - ((thing-at-point 'symbol t)))) + ((xref-backend-identifier-at-point (xref-find-backend))))) (defun +lookup--jump-to (prop identifier &optional other-window) (with-selected-window @@ -59,8 +59,7 @@ to find it: Failing all that, it will give up with an error." (interactive - (list (xref-backend-identifier-at-point (xref-find-backend)) - current-prefix-arg)) + (list (+lookup--symbol-or-region) current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) @@ -112,7 +111,8 @@ Failing all that, it will give up with an error." "Show a list of references to the symbol at point. Tries `xref-find-references' and falls back to rg/ag." - (interactive (list (thing-at-point 'symbol t))) + (interactive + (list (+lookup--symbol-or-region))) (cond ((and (plist-member +lookup-current-functions :references) (+lookup--jump-to :references identifier))) From 5a746f3da867901922b2bc3e23759786aaab39bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 00:29:55 -0400 Subject: [PATCH 0835/4235] completion/ivy: fix wrong number of args error in rg/ag/pt/grep ex commands --- modules/completion/ivy/autoload/evil.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index f9c00262e..1135d3ec0 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -17,51 +17,51 @@ ;; --- file searching --------------------- ;;;###autoload (autoload '+ivy:pt "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:pt (all-files-p query &optional directory) +(evil-define-command +ivy:pt (all-files-p query) "Ex interface for `+ivy/pt'" (interactive "") (+ivy/pt all-files-p query directory)) ;;;###autoload (autoload '+ivy:grep "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:grep (all-files-p query &optional directory) +(evil-define-command +ivy:grep (all-files-p query) "Ex interface for `+ivy/grep'" (interactive "") (+ivy/grep all-files-p query directory)) ;;;###autoload (autoload '+ivy:ag "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:ag (all-files-p query &optional directory) +(evil-define-command +ivy:ag (all-files-p query) "Ex interface for `+ivy/ag'" (interactive "") - (+ivy/ag all-files-p query directory)) + (+ivy/ag all-files-p query)) ;;;###autoload (autoload '+ivy:rg "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:rg (all-files-p query &optional directory) +(evil-define-command +ivy:rg (all-files-p query) "Ex interface for `+ivy/rg'" (interactive "") - (+ivy/rg all-files-p query directory)) + (+ivy/rg all-files-p query)) ;;;###autoload (autoload '+ivy:pt-from-cwd "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:pt-from-cwd (query &optional bang) "Ex interface for `+ivy/pt-from-cwd'." - (interactive "") + (interactive "") (+ivy/pt-from-cwd (not bang) query)) ;;;###autoload (autoload '+ivy:grep-from-cwd "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:grep-from-cwd (query &optional bang) "Ex interface for `+ivy/grep-from-cwd'." - (interactive "") + (interactive "") (+ivy/grep-from-cwd (not bang) query)) ;;;###autoload (autoload '+ivy:ag-from-cwd "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:ag-from-cwd (query &optional bang) "Ex interface for `+ivy/ag-from-cwd'." - (interactive "") + (interactive "") (+ivy/ag-from-cwd (not bang) query)) ;;;###autoload (autoload '+ivy:rg-from-cwd "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:rg-from-cwd (query &optional bang) "Ex interface for `+ivy/rg-from-cwd'." - (interactive "") + (interactive "") (+ivy/rg-from-cwd (not bang) query)) From 7f6fb69a3dd129e476f7279b388f1fba511dc3b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 00:30:10 -0400 Subject: [PATCH 0836/4235] completion/ivy: reuse last query if none supplied --- modules/completion/ivy/autoload/ivy.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 251b5b65e..1c130f1d2 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -293,7 +293,7 @@ If ALL-FILES-P, don't respect .gitignore files and search everything. NOTE: ripgrep doesn't support multiline searches (yet)." (interactive "P") (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'rg (or query "") directory))) + (+ivy--file-search 'rg query directory))) ;;;###autoload (defun +ivy/ag (all-files-p &optional query directory) @@ -304,7 +304,7 @@ the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive) (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'ag (or query "") directory))) + (+ivy--file-search 'ag query directory))) ;;;###autoload (defun +ivy/pt (all-files-p &optional query directory) @@ -315,7 +315,7 @@ the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive) (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'pt (or query "") directory))) + (+ivy--file-search 'pt query directory))) ;;;###autoload (defun +ivy/grep (all-files-p &optional query directory) @@ -326,7 +326,7 @@ active, the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive) (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'grep (or query "") directory))) + (+ivy--file-search 'grep query directory))) ;;;###autoload From b848527f0c4415c2ab079d6367ab04707228b3c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:11:08 -0400 Subject: [PATCH 0837/4235] ui/nav-flash: fix wrong-type-argument error on recenter --- modules/ui/nav-flash/autoload.el | 20 ++++++++++---------- modules/ui/nav-flash/config.el | 14 +++++++------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/modules/ui/nav-flash/autoload.el b/modules/ui/nav-flash/autoload.el index 53d7bfb60..980e129c7 100644 --- a/modules/ui/nav-flash/autoload.el +++ b/modules/ui/nav-flash/autoload.el @@ -1,19 +1,19 @@ ;;; ui/nav-flash/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +doom*blink-cursor-maybe (orig-fn &rest args) +(defun +nav-flash*blink-cursor-maybe (orig-fn &rest args) "Blink current line if the window has moved." - (let ((point (save-excursion (goto-char (window-start)) - (point-marker)))) - (apply orig-fn args) - (unless (or (derived-mode-p 'term-mode) - (equal point - (save-excursion (goto-char (window-start)) - (point-marker)))) - (+doom/blink-cursor)))) + (if (or (not (window-start)) + (derived-mode-p 'term-mode)) + (apply orig-fn args) + (let* ((win-beg (window-start)) + (point (save-excursion (goto-char win-beg) (point-marker)))) + (apply orig-fn args) + (unless (equal point (save-excursion (goto-char win-beg) (point-marker))) + (+nav-flash/blink-cursor))))) ;;;###autoload -(defun +doom/blink-cursor (&rest _) +(defun +nav-flash/blink-cursor (&rest _) "Blink current line using `nav-flash'." (interactive) (unless (minibufferp) diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index 16617b423..bfc7743d9 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -5,16 +5,16 @@ :init ;; NOTE In :feature jump `recenter' is hooked to a bunch of jumping commands, ;; which will trigger nav-flash. - (advice-add #'windmove-do-window-select :around #'+doom*blink-cursor-maybe) - (advice-add #'recenter :around #'+doom*blink-cursor-maybe) + (add-hook 'doom-after-switch-window-hook #'+nav-flash/blink-cursor) + (advice-add #'recenter :around #'+nav-flash*blink-cursor-maybe) - (advice-add #'save-place-find-file-hook :after #'+doom/blink-cursor) + (advice-add #'save-place-find-file-hook :after #'+nav-flash/blink-cursor) (after! evil - (advice-add #'evil--jumps-jump :after #'+doom/blink-cursor) + (advice-add #'evil--jumps-jump :after #'+nav-flash/blink-cursor) - (advice-add #'evil-window-top :after #'+doom/blink-cursor) - (advice-add #'evil-window-middle :after #'+doom/blink-cursor) - (advice-add #'evil-window-bottom :after #'+doom/blink-cursor))) + (advice-add #'evil-window-top :after #'+nav-flash/blink-cursor) + (advice-add #'evil-window-middle :after #'+nav-flash/blink-cursor) + (advice-add #'evil-window-bottom :after #'+nav-flash/blink-cursor))) From d06d4c4dde23ada4fb12555f845f7ada346f127d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:52:50 -0400 Subject: [PATCH 0838/4235] feature/lookup: fix some windows not grabbing focus after lookups --- modules/feature/lookup/autoload/lookup.el | 27 ++++++++++------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index cd4fce531..7e22eeab4 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -24,21 +24,18 @@ (region-end))) ((xref-backend-identifier-at-point (xref-find-backend))))) -(defun +lookup--jump-to (prop identifier &optional other-window) - (with-selected-window - (if other-window - (save-excursion (other-window 1) (selected-window)) - (selected-window)) - (let ((fn (plist-get +lookup-current-functions prop)) - (origin (point-marker))) - (condition-case e - (or (if (commandp fn) - (call-interactively fn) - (funcall fn identifier)) - (/= (point-marker) origin)) - ('error - (message "%s" e) - nil))))) +(defun +lookup--jump-to (prop identifier) + (let ((fn (plist-get +lookup-current-functions prop)) + (origin (point-marker))) + (setq fn (or (command-remapping fn) fn)) + (condition-case e + (or (if (commandp fn) + (call-interactively fn) + (funcall fn identifier)) + (/= (point-marker) origin)) + ('error + (message "%s" e) + nil)))) ;; From 9351633d6587929ab9cbfa0c2e87eefb73e2eda0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:53:31 -0400 Subject: [PATCH 0839/4235] lang/emacs-lisp: make info-lookup-symbol the default doc lookup handler --- modules/lang/emacs-lisp/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 5963347d4..b5ef8c51c 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -5,6 +5,7 @@ :config (set! :repl 'emacs-lisp-mode #'+emacs-lisp/repl) (set! :eval 'emacs-lisp-mode #'+emacs-lisp-eval) + (set! :lookup 'emacs-lisp-mode :documentation 'info-lookup-symbol) (set! :docset '(lisp-mode emacs-lisp-mode) "Emacs Lisp") (set! :rotate 'emacs-lisp-mode From ebf276c6e732dd837e3658b71ce3a929cc524e19 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:55:11 -0400 Subject: [PATCH 0840/4235] config/default: redo help leader keybinds --- modules/config/default/+bindings.el | 30 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 31eb4c0e0..7ec127c8c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -203,27 +203,25 @@ (: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" #'view-echo-area-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 "Open Doom manual" :n "D" #'doom/help - :desc "Find definition" :n "." #'+lookup/definition - :desc "Find references" :n "/" #'+lookup/references - :desc "Find documentation" :n "h" #'+lookup/documentation + :desc "Describe function" :n "f" #'describe-function + :desc "Describe face" :n "F" #'describe-face + :desc "Info" :n "i" #'info-lookup-symbol + :desc "Describe key" :n "k" #'describe-key + :desc "Find documentation" :n "K" #'+lookup/documentation + :desc "Find library" :n "l" #'find-library + :desc "Command log" :n "L" #'global-command-log-mode + :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages + :desc "Describe mode" :n "M" #'describe-mode + :desc "Toggle profiler" :n "p" #'doom/toggle-profiler + :desc "Reload theme" :n "R" #'doom//reload-theme + :desc "Describe DOOM setting" :n "s" #'doom/describe-setting + :desc "Describe variable" :n "v" #'describe-variable :desc "Describe at point" :n "." #'helpful-at-point :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 "What minor modes" :n ";" #'doom/what-minor-mode) (:desc "insert" :prefix "i" :desc "From kill-ring" :nv "y" #'counsel-yank-pop From 21a23228f2a60433c59418490f109ff2bcbc4f54 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:57:34 -0400 Subject: [PATCH 0841/4235] Refactor initialization; allow package! to universally disable packages No need for def-package-hook! for disable packages anymore, you can do it from package! in packages.el files. --- core/core-lib.el | 5 --- core/core-packages.el | 80 ++++++++++++++++++++++++------------------- core/core.el | 5 +-- 3 files changed, 47 insertions(+), 43 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 2ebccd5d4..131bd1569 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,10 +1,5 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(let ((load-path doom-site-load-path)) - (require 'subr-x) - (require 'cl-lib) - (require 'map)) - (eval-and-compile (unless EMACS26+ (with-no-warnings diff --git a/core/core-packages.el b/core/core-packages.el index 72da9319a..9aeb0a706 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -143,6 +143,10 @@ FORCE-P is non-nil, do it anyway. 3. Loads your autoloads file in `doom-autoload-file', 4. Builds and caches `load-path' and `Info-directory-list' in `doom-packages-file'" ;; Called early during initialization; only use native (and cl-lib) functions! + (let ((load-path doom-site-load-path)) + (require 'subr-x) + (require 'cl-lib) + (require 'map)) (when (or force-p (not doom-init-p)) (unless (load doom-autoload-file t t t) (unless noninteractive @@ -173,11 +177,13 @@ FORCE-P is non-nil, do it anyway. (message "✓ Installed %s" package) (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) + (cl-pushnew doom-core-dir load-path :test #'string=) (unless noninteractive (with-temp-buffer - (cl-pushnew doom-core-dir load-path :test #'string=) + (doom-initialize-packages 'internal) (prin1 `(setq load-path ',load-path - Info-directory-list ',Info-directory-list) + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages) (current-buffer)) (write-file doom-packages-file)))) (setq doom-init-p t))) @@ -202,7 +208,7 @@ populated. This reads modules' packages.el files, runs `package-initialize', and initializes quelpa, if they haven't already. If FORCE-P is non-nil, do it -anyway. +anyway. If FORCE-P is 'internal, only (re)populate `doom-packages'. Use this before any of package.el, quelpa or Doom's package management's API to ensure all the necessary package metadata is initialized and available for @@ -225,10 +231,6 @@ them." ;; the current session, but if you change an packages.el file in a module, ;; there's no non-trivial way to detect that, so we give you a way to ;; reload only doom-packages. - (when (eq force-p 'internal) - (setq force-p nil - doom-packages nil)) - ;; `doom-packages' (when (or force-p (not doom-packages)) (setq doom-packages nil) @@ -243,14 +245,14 @@ them." do (_load path))) ;; `package-alist' - (when (or force-p (not (bound-and-true-p package-alist))) + (when (or (eq force-p t) (not (bound-and-true-p package-alist))) (setq load-path doom-site-load-path) (require 'package) (setq package-activated-list nil) (package-initialize)) ;; `quelpa-cache' - (when (or force-p (not (bound-and-true-p quelpa-cache))) + (when (or (eq force-p t) (not (bound-and-true-p quelpa-cache))) (require 'quelpa) (setq quelpa-initialized-p nil) (or (quelpa-setup-p) @@ -410,8 +412,8 @@ WARNING: If :pre-init or :pre-config hooks return nil, the original to have them return non-nil (or exploit that to overwrite Doom's config)." (declare (indent defun)) (cond ((eq when :disable) - (push package doom-disabled-packages) - nil) + (message "Using :disable with `def-package-hook!' is deprecated. Use :disable in `package!' instead.") + (ignore (push package doom-disabled-packages))) ((memq when '(:pre-init :post-init :pre-config :post-config)) `(progn (setq use-package-inject-hooks t) @@ -510,35 +512,41 @@ This macro is declarative and does not load nor install packages. It is used to populate `doom-packages' with metadata about the packages Doom needs to keep track of. -Only use this macro in a module's packages.el file. +Only use this macro in a module's init.el or packages.el file. Accepts the following properties: - :recipe RECIPE Takes a MELPA-style recipe (see `quelpa-recipe' in - `quelpa' for an example); for packages to be installed - from external sources. - :pin ARCHIVE-NAME Instructs ELPA to only look for this package in - ARCHIVE-NAME. e.g. \"org\". Ignored if RECIPE is present. - :ignore FORM Do not install this package if FORM is non-nil. - :freeze FORM Do not update this package if FORM is non-nil." + :recipe RECIPE Takes a MELPA-style recipe (see `quelpa-recipe' in + `quelpa' for an example); for packages to be installed + from external sources. + :pin ARCHIVE-NAME Instructs ELPA to only look for this package in + ARCHIVE-NAME. e.g. \"org\". Ignored if RECIPE is present. + :disable BOOL Do not install this package AND disable its `def-package!' blocks. + :freeze FORM Do not update this package if FORM is non-nil." (declare (indent defun)) - (unless (memq name doom-disabled-packages) - (let* ((old-plist (assq name doom-packages)) - (pkg-recipe (or (plist-get plist :recipe) - (and old-plist (plist-get old-plist :recipe)))) - (pkg-pin (or (plist-get plist :pin) - (and old-plist (plist-get old-plist :pin))))) - (when pkg-recipe - (when (= 0 (% (length pkg-recipe) 2)) - (plist-put plist :recipe (cons name pkg-recipe))) - (when pkg-pin - (plist-put plist :pin nil))) - (dolist (prop '(:ignore :freeze)) - (when-let* ((val (plist-get plist prop))) - (plist-put plist prop (eval val)))) - `(progn - ,(if (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist))))) + (cond ((memq name doom-disabled-packages) nil) + ((let ((disable (plist-get plist :disable))) + (and disable (eval disable))) + (push name doom-disabled-packages) + (setq doom-packages (map-delete doom-packages name)) + nil) + ((let* ((old-plist (assq name doom-packages)) + (pkg-recipe (or (plist-get plist :recipe) + (and old-plist (plist-get old-plist :recipe)))) + (pkg-pin (or (plist-get plist :pin) + (and old-plist (plist-get old-plist :pin))))) + (when pkg-recipe + (when (= 0 (% (length pkg-recipe) 2)) + (plist-put plist :recipe (cons name pkg-recipe))) + (when pkg-pin + (plist-put plist :pin nil))) + (let ((val (plist-get plist :freeze))) + (when val + (plist-put plist :freeze (eval val)))) + `(progn + ,(when (and pkg-pin t) + `(map-put package-pinned-packages ',name ,pkg-pin)) + (map-put doom-packages ',name ',plist)))))) (defmacro depends-on! (module submodule &optional flags) "Declares that this module depends on another. diff --git a/core/core.el b/core/core.el index 858fd78e5..03a98053c 100644 --- a/core/core.el +++ b/core/core.el @@ -164,6 +164,7 @@ ability to invoke the debugger in debug mode." display the loading benchmark." (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook)) + (run-hooks 'doom-finalize-hook) (unless noninteractive (when (display-graphic-p) (require 'server) @@ -180,8 +181,8 @@ this, you'll get stuttering and random freezes), and resets file-name-handler-alist doom--file-name-handler-alist) t) - (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize) - (add-hook 'emacs-startup-hook #'doom|after-init)) + (add-hook 'emacs-startup-hook #'doom|after-init) + (add-hook! '(doom-finalize-hook doom-reload-hook) #'doom|finalize)) ;; From f67b4ec7436db77521a8d5668e451570cd97dc7a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:58:11 -0400 Subject: [PATCH 0842/4235] Add docstring for doom-module-put --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 9aeb0a706..a9823bcb0 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -277,7 +277,7 @@ them." plist))) (defun doom-module-put (module submodule property value) - "TODO" + "Set a PROPERTY for MODULE SUBMODULE to VALUE." (when-let* ((plist (doom-module-get module submodule))) (puthash (cons module submodule) (plist-put plist property value) From 03ed4c39e8ae14cbd32c7312bf958d6e749030af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 02:58:22 -0400 Subject: [PATCH 0843/4235] Add package! & disable-packages! convenience macros --- core/core-packages.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/core-packages.el b/core/core-packages.el index a9823bcb0..69c761554 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -548,6 +548,16 @@ Accepts the following properties: `(map-put package-pinned-packages ',name ,pkg-pin)) (map-put doom-packages ',name ',plist)))))) +(defmacro packages! (&rest packages) + "A convenience macro like `package!', but allows you to declare multiple +packages at once." + `(progn ,@(cl-loop for desc in packages collect `(package! ,@desc)))) + +(defmacro disable-packages! (&rest packages) + "A convenience macro like `package!', but allows you to disable multiple +packages at once." + `(setq doom-disabled-packages (append ',packages doom-disabled-packages))) + (defmacro depends-on! (module submodule &optional flags) "Declares that this module depends on another. From 1af246daeb739e20d42e53257f901613655c0556 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 03:04:13 -0400 Subject: [PATCH 0844/4235] feature/popup: add rule for *info* buffers --- modules/feature/popup/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 41b08418a..c1a6830ed 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -194,6 +194,10 @@ example: (+popup-define "^\\*[Hh]elp" '((slot . 2) (vslot . 2) (size . 0.2)) '((select . t))) + ;; `Info-mode' + (+popup-define "^\\*info\\*$" + '((slot . 2) (vslot . 2) (size . 0.35)) + '((select . t))) ;; `org-mode' ;; Use org-load-hook instead of `after!' because the hook runs sooner, From f1c0d70e3479f6c48a24c3c364740c7081e1d315 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 03:07:01 -0400 Subject: [PATCH 0845/4235] feature/popup: switch to *info* popups --- modules/feature/popup/+hacks.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index 42b162b09..f5697c00a 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -158,6 +158,14 @@ the command buffer." (advice-add #'helpful--navigate :override #'+popup*helpful--navigate)) +;; `Info' +(defun +popup*switch-to-info-window (&rest _) + (when-let* ((win (get-buffer-window "*info*"))) + (when (+popup-window-p win) + (select-window win)))) +(advice-add #'info-lookup-symbol :after #'+popup*switch-to-info-window) + + ;; `neotree' (after! neotree (advice-add #'neo-util--set-window-width :override #'ignore) From 72eb1422c50a4a09e05d9e7c50cbc2d39ec69eff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 03:06:06 -0400 Subject: [PATCH 0846/4235] Ensure doom-packages is initialized in doom-initialize --- core/core-packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 69c761554..2ada88297 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -151,6 +151,8 @@ FORCE-P is non-nil, do it anyway. (unless (load doom-autoload-file t t t) (unless noninteractive (error "No autoloads file! Run make autoloads"))) + (when noninteractive + (delete-file doom-packages-file)) (when (or force-p (not (load doom-packages-file t t t))) ;; Ensure core folders exist, otherwise we get errors (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir)) @@ -178,9 +180,9 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) (cl-pushnew doom-core-dir load-path :test #'string=) + (doom-initialize-packages 'internal) (unless noninteractive (with-temp-buffer - (doom-initialize-packages 'internal) (prin1 `(setq load-path ',load-path Info-directory-list ',Info-directory-list doom-disabled-packages ',doom-disabled-packages) From adfd26bbf46b2bf16512cd0b51e93b48d4f47d8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 03:11:29 -0400 Subject: [PATCH 0847/4235] Fix error when doom-packages-file doesn't exist --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 2ada88297..f8b17cb6f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -151,7 +151,7 @@ FORCE-P is non-nil, do it anyway. (unless (load doom-autoload-file t t t) (unless noninteractive (error "No autoloads file! Run make autoloads"))) - (when noninteractive + (when (and noninteractive (file-exists-p doom-packages-file)) (delete-file doom-packages-file)) (when (or force-p (not (load doom-packages-file t t t))) ;; Ensure core folders exist, otherwise we get errors From 1282072db36c837af06ef773206706e28a034b51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 03:18:28 -0400 Subject: [PATCH 0848/4235] Correct doom-initialize's docstring --- 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 f8b17cb6f..b3cf633fd 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -141,7 +141,8 @@ FORCE-P is non-nil, do it anyway. 1. Ensures all the essential directories exist, 2. Ensures core packages are installed, 3. Loads your autoloads file in `doom-autoload-file', -4. Builds and caches `load-path' and `Info-directory-list' in `doom-packages-file'" +4. Builds and caches `load-path', `Info-directory-list' and + `doom-disabled-packages' in `doom-packages-file'" ;; Called early during initialization; only use native (and cl-lib) functions! (let ((load-path doom-site-load-path)) (require 'subr-x) From f3b99779c9ab84dc1c89ce8bd24983ba366cc25a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 06:40:02 -0400 Subject: [PATCH 0849/4235] Add doom-after-switch-frame-hook; fix over-eager switch-window hooks Switch-window hooks would fire too frequently; like when switching to the same window, clicking in windows, or from the minibuffer (e.g. during ivy sessions). --- core/core-ui.el | 21 ++++++++++++++++----- modules/ui/doom-modeline/config.el | 3 ++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 087789710..b66736b1a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -301,16 +301,27 @@ with `doom//reload-theme').") "Hook run before `switch-to-buffer' and `display-buffer' are called. See `doom-before-switch-buffer-hook'.") -(defun doom*switch-window-hooks (orig-fn &rest args) - (run-hook-with-args 'doom-before-switch-window-hook) - (prog1 (apply orig-fn args) - (run-hook-with-args 'doom-after-switch-window-hook))) +(defun doom*switch-frame-hooks (orig-fn frame &optional norecord) + (if (eq frame (selected-frame)) + (funcall orig-fn frame norecord) + (run-hook-with-args 'doom-before-switch-frame-hook) + (prog1 (funcall orig-fn frame norecord) + (run-hook-with-args 'doom-after-switch-frame-hook)))) +(defun doom*switch-window-hooks (orig-fn window &optional norecord) + (if (or (eq window (selected-window)) + (memq this-command '(mouse-set-point evil-mouse-drag-region)) + (window-minibuffer-p) + (window-minibuffer-p window)) + (funcall orig-fn window norecord) + (run-hook-with-args 'doom-before-switch-window-hook) + (prog1 (funcall orig-fn window norecord) + (run-hook-with-args 'doom-after-switch-window-hook)))) (defun doom*switch-buffer-hooks (orig-fn &rest args) (run-hook-with-args 'doom-before-switch-buffer-hook) (prog1 (apply orig-fn args) (run-hook-with-args 'doom-after-switch-buffer-hook))) -(advice-add #'select-frame :around #'doom*switch-window-hooks) +(advice-add #'select-frame :around #'doom*switch-frame-hooks) (advice-add #'select-window :around #'doom*switch-window-hooks) (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) (advice-add #'display-buffer :around #'doom*switch-buffer-hooks) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index ec029ad36..d1c23c98b 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -49,9 +49,10 @@ (force-mode-line-update)) (add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) -(add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) +(add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window) (add-hook 'doom-after-switch-window-hook #'+doom-modeline|set-selected-window) +(add-hook 'doom-after-switch-frame-hook #'+doom-modeline|set-selected-window) ;; From b47ccab4a591dc8d684ff11223b17d3e8f6d5abe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 06:41:10 -0400 Subject: [PATCH 0850/4235] lang/org: fix TAB not toggle folds on some headlines --- modules/lang/org/autoload/org.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 6d29877ba..29529b762 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -268,10 +268,10 @@ with `org-cycle'). Also: (org-beginning-of-line) (cond ((org-at-table-p) (org-table-align)) - ((org-in-src-block-p) - (org-babel-remove-result)) ((org-at-heading-p) (outline-toggle-children)) + ((org-in-src-block-p) + (org-babel-remove-result)) ((org-at-item-p) (let ((window-beg (window-start))) (org-cycle) From 3b94bafb3ad6f9c0e91a67e99f07bd97951954a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 06:41:33 -0400 Subject: [PATCH 0851/4235] tools/nav-flash: refactor & reduce false positive jumps --- modules/ui/nav-flash/config.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index bfc7743d9..1fe7f2d31 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -3,18 +3,18 @@ (def-package! nav-flash :commands nav-flash-show :init - ;; NOTE In :feature jump `recenter' is hooked to a bunch of jumping commands, - ;; which will trigger nav-flash. - (add-hook 'doom-after-switch-window-hook #'+nav-flash/blink-cursor) - (advice-add #'recenter :around #'+nav-flash*blink-cursor-maybe) + ;; NOTE In :feature lookup `recenter' is hooked to a bunch of jumping + ;; commands, which will trigger nav-flash. + (add-hook! + '(doom-after-switch-window-hook + imenu-after-jump-hook evil-jumps-post-jump-hook + counsel-grep-post-action-hook dumb-jump-after-jump-hook) + #'+nav-flash/blink-cursor) (advice-add #'save-place-find-file-hook :after #'+nav-flash/blink-cursor) (after! evil - (advice-add #'evil--jumps-jump :after #'+nav-flash/blink-cursor) - (advice-add #'evil-window-top :after #'+nav-flash/blink-cursor) (advice-add #'evil-window-middle :after #'+nav-flash/blink-cursor) (advice-add #'evil-window-bottom :after #'+nav-flash/blink-cursor))) - From 9dc4e59a2c23c3c3ab2de316f937d3ba1e6a079d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 06:43:29 -0400 Subject: [PATCH 0852/4235] config/private: add doctor.el --- modules/config/private/doctor.el | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 modules/config/private/doctor.el diff --git a/modules/config/private/doctor.el b/modules/config/private/doctor.el new file mode 100644 index 000000000..094b94132 --- /dev/null +++ b/modules/config/private/doctor.el @@ -0,0 +1,5 @@ +;;; config/private/doctor.el -*- lexical-binding: t; -*- + +(unless (file-directory-p +private-config-path) + (warn! "Couldn't find '%s'" (file-relative-name +private-config-path "~"))) + From 856dd9663678e90f46c5279872e2a6e6e947efbf Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Mon, 26 Mar 2018 18:17:59 +0200 Subject: [PATCH 0853/4235] Whitespace should preferably respect the fill-column variable Let whitespace dynamically set `whitespace-line-column` depending on the current state of the variable `fill-column`. Changing the value to `nil` does exactly that. --- 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 f5f3defe5..2f805f22c 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -38,7 +38,7 @@ modes are active and the buffer is read-only.") truncate-lines t truncate-partial-width-windows 50 ;; whitespace-mode - whitespace-line-column fill-column + whitespace-line-column nil whitespace-style '(face indentation tabs tab-mark spaces space-mark newline newline-mark trailing lines-tail) From 84e98f1beef7aab9dc923d21b765f5c818e0e6c6 Mon Sep 17 00:00:00 2001 From: Adam Kruszewski Date: Mon, 26 Mar 2018 19:46:47 +0200 Subject: [PATCH 0854/4235] Add REPL definition for elixir-mode. --- modules/lang/elixir/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index bfcc5818e..d07bfd3a5 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -21,7 +21,8 @@ (set! :lookup 'elixir-mode :definition #'alchemist-goto-definition-at-point :documentation #'alchemist-help-search-at-point) - (set! :eval 'elixir-mode #'alchemist-eval-region)) + (set! :eval 'elixir-mode #'alchemist-eval-region) + (set! :repl 'elixir-mode #'alchemist-iex-project-run)) (def-package! alchemist-company From dd24578657bc541e72dd2c5755e2d30805f0b48a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 16:32:05 -0400 Subject: [PATCH 0855/4235] Restore :ignore property in package! macro --- core/core-packages.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index b3cf633fd..efa06cd8a 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -543,9 +543,10 @@ Accepts the following properties: (plist-put plist :recipe (cons name pkg-recipe))) (when pkg-pin (plist-put plist :pin nil))) - (let ((val (plist-get plist :freeze))) - (when val - (plist-put plist :freeze (eval val)))) + (dolist (prop '(:ignore :freeze)) + (let ((val (plist-get plist prop))) + (when val + (plist-put plist prop (eval val))))) `(progn ,(when (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) From 46c31e7f0a5dc818fc04dd434cce07bca98eaf42 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 16:39:18 -0400 Subject: [PATCH 0856/4235] lang/typescript: refactor + fix project root resolution --- modules/lang/typescript/config.el | 41 +++++++++++++------------------ 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/modules/lang/typescript/config.el b/modules/lang/typescript/config.el index 526ff0612..566a2d925 100644 --- a/modules/lang/typescript/config.el +++ b/modules/lang/typescript/config.el @@ -4,23 +4,16 @@ :mode "\\.ts$" :config (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) - - (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&")) - - ;; TODO tide-jump-back - ;; TODO (tide-jump-to-definition t) - ;; TODO convert into keybinds - ;; (set! :emr 'typescript-mode - ;; '(tide-find-references "find usages") - ;; '(tide-rename-symbol "rename symbol") - ;; '(tide-jump-to-definition "jump to definition") - ;; '(tide-documentation-at-point "current type documentation") - ;; '(tide-restart-server "restart tide server")) - ) + (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) (def-package! tide - :after typescript-mode + :hook (typescript-mode . tide-setup) + :init + (defun +typescript|init-tide-in-web-mode () + (when (string= (file-name-extension (or buffer-file-name "")) "tsx") + (tide-setup))) + (add-hook 'web-mode-hook #'+typescript|init-tide-in-web-mode) :config (set! :company-backend 'typescript-mode '(company-tide)) (set! :lookup 'typescript-mode @@ -32,14 +25,14 @@ '(:insertSpaceAfterFunctionKeywordForAnonymousFunctions t :placeOpenBraceOnNewLineForFunctions nil)) - (defun +typescript|init-tide () - (when (or (eq major-mode 'typescript-mode) - (and (eq major-mode 'web-mode) - buffer-file-name - (equal (file-name-extension buffer-file-name) "tsx"))) - (tide-setup) - (flycheck-mode +1) - (eldoc-mode +1) - (setq tide-project-root (doom-project-root)))) - (add-hook! (typescript-mode web-mode) #'+typescript|init-tide)) + (def-menu! +typescript/refactor-menu + "TODO" + '(("rename symbol" :exec tide-rename-symbol) + ("restart tide server" :exec tide-restart-server))) + + (map! :map tide-mode-map + :localleader + :n "r" #'+typescript/refactor-menu) + + (add-hook! 'tide-mode-hook #'(flycheck-mode eldoc-mode))) From adf724a6e41ec741b8a24b6c67d20380e2937a8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 16:44:24 -0400 Subject: [PATCH 0857/4235] Refactor package!'s docstring & add :ignore to it --- core/core-packages.el | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index efa06cd8a..c4e7af1bc 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -519,13 +519,19 @@ Only use this macro in a module's init.el or packages.el file. Accepts the following properties: - :recipe RECIPE Takes a MELPA-style recipe (see `quelpa-recipe' in - `quelpa' for an example); for packages to be installed - from external sources. - :pin ARCHIVE-NAME Instructs ELPA to only look for this package in - ARCHIVE-NAME. e.g. \"org\". Ignored if RECIPE is present. - :disable BOOL Do not install this package AND disable its `def-package!' blocks. - :freeze FORM Do not update this package if FORM is non-nil." + :recipe RECIPE + Takes a MELPA-style recipe (see `quelpa-recipe' in `quelpa' for an example); + for packages to be installed from external sources. + :pin ARCHIVE-NAME + Instructs ELPA to only look for this package in ARCHIVE-NAME. e.g. \"org\". + Ignored if RECIPE is present. + :disable BOOL + Do not install or update this package AND disable all of its `def-package!' + blocks. + :ignore FORM + Do not install or update this package. + :freeze FORM + Do not update this package if FORM is non-nil." (declare (indent defun)) (cond ((memq name doom-disabled-packages) nil) ((let ((disable (plist-get plist :disable))) From fa69e25f87a0be2b0ea095a26929a46862725f99 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 16:52:23 -0400 Subject: [PATCH 0858/4235] Fix a pre-init race condition caused by doom-initialize-packages --- core/core-packages.el | 20 ++++++++++++-------- core/core.el | 3 ++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index c4e7af1bc..9cb40403a 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -134,6 +134,17 @@ missing) and shouldn't be deleted.") ;; Bootstrap API ;; +(defun doom--refresh-cache () + "TODO" + (doom-initialize-packages 'internal) + (unless noninteractive + (with-temp-buffer + (prin1 `(setq load-path ',load-path + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages) + (current-buffer)) + (write-file doom-packages-file)))) + (defun doom-initialize (&optional force-p) "Bootstrap the bare essentials to get Doom running, if it hasn't already. If FORCE-P is non-nil, do it anyway. @@ -181,14 +192,7 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) (cl-pushnew doom-core-dir load-path :test #'string=) - (doom-initialize-packages 'internal) - (unless noninteractive - (with-temp-buffer - (prin1 `(setq load-path ',load-path - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages) - (current-buffer)) - (write-file doom-packages-file)))) + (add-hook 'doom-init-core-hook #'doom--refresh-cache)) (setq doom-init-p t))) (defun doom-initialize-autoloads () diff --git a/core/core.el b/core/core.el index 03a98053c..4b24e4de8 100644 --- a/core/core.el +++ b/core/core.el @@ -159,12 +159,13 @@ ability to invoke the debugger in debug mode." (load! core-projects) ; making Emacs project-aware (load! core-keybinds)) ; centralized keybind system + which-key + (run-hooks 'doom-init-core-hook) + (defun doom|after-init () "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and display the loading benchmark." (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook)) - (run-hooks 'doom-finalize-hook) (unless noninteractive (when (display-graphic-p) (require 'server) From 98a4a94867843fd8c94eedc46f544fcaf27b6cfb Mon Sep 17 00:00:00 2001 From: allforabit Date: Mon, 26 Mar 2018 22:27:09 +0100 Subject: [PATCH 0859/4235] Update webpack file template for latest version Webpack 4 has some syntax changes, mainly using rules key instead of plugin. --- .../templates/js-mode/__webpack.config.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/feature/file-templates/templates/js-mode/__webpack.config.js b/modules/feature/file-templates/templates/js-mode/__webpack.config.js index 267eae732..d7998e157 100644 --- a/modules/feature/file-templates/templates/js-mode/__webpack.config.js +++ b/modules/feature/file-templates/templates/js-mode/__webpack.config.js @@ -7,9 +7,15 @@ module.exports = { filename: "app.bundle.js" }, module: { - loaders: [ - { test: /\.js$/, include: __dirname + '/app', loader: 'babel-loader' }$0 + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: { + loader: "babel-loader" + } + } ] - } + }, // plugins: [] -}; \ No newline at end of file +}; From 040fedfeafe249e66ef626fc7b18b7ef7f4b90e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 18:14:00 -0400 Subject: [PATCH 0860/4235] Remove defunct tramp advise --- core/core.el | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core/core.el b/core/core.el index 4b24e4de8..05322509c 100644 --- a/core/core.el +++ b/core/core.el @@ -227,11 +227,5 @@ with functions that require it (like modeline segments)." 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 From fea7c0a66161a83fefae7bd214d883b5fb7cf3a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 26 Mar 2018 18:15:03 -0400 Subject: [PATCH 0861/4235] Minor revision of package!'s docstring --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 9cb40403a..81c503c83 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -533,7 +533,7 @@ Accepts the following properties: Do not install or update this package AND disable all of its `def-package!' blocks. :ignore FORM - Do not install or update this package. + Do not install this package. :freeze FORM Do not update this package if FORM is non-nil." (declare (indent defun)) From b685baeb647117b5866ebde531a9310b429a753b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 02:49:19 -0400 Subject: [PATCH 0862/4235] Fix the package! macro's :disable property --- core/core-packages.el | 2 +- core/core.el | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 81c503c83..7d1b25ea0 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -192,7 +192,7 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) (cl-pushnew doom-core-dir load-path :test #'string=) - (add-hook 'doom-init-core-hook #'doom--refresh-cache)) + (add-hook 'after-init-hook #'doom--refresh-cache)) (setq doom-init-p t))) (defun doom-initialize-autoloads () diff --git a/core/core.el b/core/core.el index 05322509c..431909d2d 100644 --- a/core/core.el +++ b/core/core.el @@ -159,8 +159,6 @@ ability to invoke the debugger in debug mode." (load! core-projects) ; making Emacs project-aware (load! core-keybinds)) ; centralized keybind system + which-key - (run-hooks 'doom-init-core-hook) - (defun doom|after-init () "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and display the loading benchmark." From 2364e97285049651acaa3cbe5fb8cb55baf35abb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 02:50:38 -0400 Subject: [PATCH 0863/4235] Fix switch-window hooks when switching with the mouse And moved it to ui/nav-flash, which is what this code was introduced to fix in the first place! --- core/core-ui.el | 1 - modules/ui/nav-flash/autoload.el | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index b66736b1a..a2b8c1590 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -309,7 +309,6 @@ with `doom//reload-theme').") (run-hook-with-args 'doom-after-switch-frame-hook)))) (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or (eq window (selected-window)) - (memq this-command '(mouse-set-point evil-mouse-drag-region)) (window-minibuffer-p) (window-minibuffer-p window)) (funcall orig-fn window norecord) diff --git a/modules/ui/nav-flash/autoload.el b/modules/ui/nav-flash/autoload.el index 980e129c7..97d42091b 100644 --- a/modules/ui/nav-flash/autoload.el +++ b/modules/ui/nav-flash/autoload.el @@ -16,7 +16,8 @@ (defun +nav-flash/blink-cursor (&rest _) "Blink current line using `nav-flash'." (interactive) - (unless (minibufferp) + (unless (or (minibufferp) + (memq this-command '(mouse-set-point evil-mouse-drag-region))) (nav-flash-show) ;; only show in the current window (overlay-put compilation-highlight-overlay 'window (selected-window)))) From 1f9576a59a570b63c7407a8230735839347bcde4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 02:52:30 -0400 Subject: [PATCH 0864/4235] Conform unit test macros to naming convention --- core/autoload/test.el | 24 ++++++++++----------- modules/feature/evil/test/autoload-files.el | 2 +- modules/lang/org/test/autoload-org.el | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 34427ca1a..0559d40d9 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -71,7 +71,7 @@ If neither is available, run all tests in all enabled modules." (setq plist (reverse plist)) (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))) @@ -91,7 +91,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 @@ -119,7 +119,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)) @@ -137,27 +137,27 @@ 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) "Activate a minor mode while in BODY, deactivating it after." (declare (indent defun)) `(progn (,mode +1) ,@body (,mode -1))) -(defmacro let-advice!! (binds &rest body) +(defmacro let-advice! (binds &rest body) "Temporarily bind advice in BINDS while in BODY. e.g. (old-fn :before advice-fn) diff --git a/modules/feature/evil/test/autoload-files.el b/modules/feature/evil/test/autoload-files.el index 48fd0905a..1dd09486c 100644 --- a/modules/feature/evil/test/autoload-files.el +++ b/modules/feature/evil/test/autoload-files.el @@ -9,7 +9,7 @@ affects your Emacs packages)." (other ,dest)) (with-temp-file it (insert "Hello world")) - (with-minor-mode!! projectile-mode + (with-minor-mode! projectile-mode (unwind-protect (progn (should (file-exists-p it)) diff --git a/modules/lang/org/test/autoload-org.el b/modules/lang/org/test/autoload-org.el index 4a7fdb48b..3c7b9a6bc 100644 --- a/modules/lang/org/test/autoload-org.el +++ b/modules/lang/org/test/autoload-org.el @@ -4,7 +4,7 @@ (require! :lang org) (defmacro should-org-buffer!! (source expected &rest body) - `(should-buffer!! ,source ,expected + `(should-buffer! ,source ,expected (org-mode) ,@body)) From 91c974033dc30e82e3852c0ffa97a1c758646134 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 03:12:23 -0400 Subject: [PATCH 0865/4235] config/default: add help bindings to helpful too --- modules/config/default/+bindings.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 7ec127c8c..9128235b9 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -663,9 +663,11 @@ ;; TAB auto-completion in term buffers :map comint-mode-map [tab] #'company-complete) - (:map help-mode-map - :n "o" #'ace-link-help - :n "Q" #'ivy-resume) + (:map* (help-mode-map helpful-mode-map) + :n "o" #'ace-link-help + :n "Q" #'ivy-resume + :n "]l" #'forward-button + :n "[l" #'backward-button) (:after vc-annotate :map vc-annotate-mode-map From 8a74a081c460c3dff48a500a6267bdbf9becb1fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 03:49:45 -0400 Subject: [PATCH 0866/4235] Remove doom-mode-map; semi-revert abe42fcb --- core/core-keybinds.el | 19 +++++-------------- modules/config/default/+bindings.el | 25 +++++++++++++++++++++++++ modules/feature/evil/config.el | 3 --- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index bfbb135a0..d39210169 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -10,14 +10,6 @@ (defvar doom-localleader-key "SPC m" "The localleader prefix key, for major-mode specific commands.") -(defvar doom-mode-map (make-sparse-keymap) - "TODO") - -(define-minor-mode doom-mode - "TODO" - :global t - :init-value t) - (defvar doom-evil-state-alist '((?n . normal) (?v . visual) @@ -303,7 +295,7 @@ Example (when (memq 'global states) (push `(define-key ,keymap ,key ,def) forms)) (when-let* ((states (delq 'global states))) - (push `(,(if doom--defer 'evil-define-key 'evil-define-key*) + (push `(,(if doom--defer #'evil-define-key #'evil-define-key*) ',states ,keymap ,key ,def) forms)))) (states @@ -311,18 +303,17 @@ Example (throw 'skip 'evil)) (dolist (state states) (push (if (eq state 'global) - `(define-key doom-mode-map ,key ,def) + `(global-set-key ,key ,def) (if doom--local `(evil-local-set-key ',state ,key ,def) - `(evil-define-key* ',state doom-mode-map ,key ,def))) + `(evil-define-key* ',state 'global ,key ,def))) forms))) (doom--keymaps (dolist (keymap doom--keymaps) (push `(define-key ,keymap ,key ,def) forms))) (t - (push (if doom--local - `(local-set-key ,key ,def) - `(define-key doom-mode-map ,key ,def)) + (push `(,(if doom--local #'local-set-key #'global-set-key) + ,key ,def) forms)))) (setq states '() doom--local nil diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9128235b9..68fc7dd50 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -732,3 +732,28 @@ (:after view (:map view-mode-map "" #'View-quit-all))) + +;; +;; Evil-collection fixes +;; + +(when (featurep 'evil-collection) + ;; don't interfere with leader key + (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) + (after! dired + (evil-define-key* 'normal dired-mode-map (kbd doom-leader-key) nil)) + + ;; don't remap gd or K; Doom does this already + ;; TODO find a better way + (after! compile + (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) + (after! racer + (evil-define-key* 'normal racer-mode-map "gd" nil "K" nil)) + (after! anaconda-mode + (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) + (after! alchemist + (evil-define-key* 'normal alchemist-mode-map "gd" nil "K" nil "gz" nil)) + (after! go-mode + (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) + (after! lua-mode + (evil-define-key* 'normal lua-mode-map "K" nil))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 362ef23f7..fc32f7dcf 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -63,9 +63,6 @@ (add-hook 'doom-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) - ;; ensure `doom-mode-map' has high precedence - (evil-make-overriding-map doom-mode-map) - (set! :popup "^\\*evil-registers" '((size . 0.3))) (set! :popup "^\\*Command Line" '((size . 8))) From cec72fa95970e572f565fe3bb2f5f77fa39f6564 Mon Sep 17 00:00:00 2001 From: Carter Charbonneau Date: Sun, 25 Mar 2018 15:25:39 -0600 Subject: [PATCH 0867/4235] completion/ido: update to use ido-completing-read+ (renamed from ido-ubiquitous) --- modules/completion/ido/config.el | 2 +- modules/completion/ido/packages.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ido/config.el b/modules/completion/ido/config.el index 5327920d3..4ca406efc 100644 --- a/modules/completion/ido/config.el +++ b/modules/completion/ido/config.el @@ -21,7 +21,7 @@ (ido-mode 1) (ido-everywhere 1) - (require 'ido-ubiquitous) + (require 'ido-completing-read+) (ido-ubiquitous-mode 1) (defun +ido|init () diff --git a/modules/completion/ido/packages.el b/modules/completion/ido/packages.el index 7d211f7d9..368665425 100644 --- a/modules/completion/ido/packages.el +++ b/modules/completion/ido/packages.el @@ -2,6 +2,6 @@ ;;; completion/ido/packages.el (package! flx-ido) -(package! ido-ubiquitous) +(package! ido-completing-read+) (package! ido-vertical-mode) (package! crm-custom) From 2ac08a13e0193cd60c19de8a3cc43cd44b9fd841 Mon Sep 17 00:00:00 2001 From: Carter Charbonneau Date: Sun, 25 Mar 2018 20:39:59 -0600 Subject: [PATCH 0868/4235] lang/nix: install nix-mode package --- modules/lang/nix/packages.el | 1 + 1 file changed, 1 insertion(+) create mode 100644 modules/lang/nix/packages.el diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el new file mode 100644 index 000000000..b100d83a6 --- /dev/null +++ b/modules/lang/nix/packages.el @@ -0,0 +1 @@ +(package! nix-mode) From 93678494cb3bf536cc166d22737e5ca3590b7d5d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 19:06:22 -0400 Subject: [PATCH 0869/4235] ui/doom-dashboard: fix wrong-type-arg error on reload --- modules/ui/doom-dashboard/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index ddb68a072..9b6b03bab 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -216,9 +216,7 @@ controlled by `+doom-dashboard-pwd-policy'." (insert (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) (/ (count-lines (point-min) (point-max)) 2))) - ?\n))) - (unless (button-at (point)) - (goto-char (next-button (point-min))))) + ?\n)))) (+doom-dashboard|detect-project) (+doom-dashboard|resize) (+doom-dashboard-update-pwd) From 4afcd7eadfbd648a053e59982d06ec03461f79c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 19:09:18 -0400 Subject: [PATCH 0870/4235] lang/nix: no-byte-compile; add file header --- modules/lang/nix/packages.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index b100d83a6..7cbed49e6 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -1 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/nix/packages.el + (package! nix-mode) From 67e0575d3dd403fcafbbd471ff9cac9ed697b2d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 19:11:11 -0400 Subject: [PATCH 0871/4235] Move doom-modules-dirs to core-packages.el --- core/core-packages.el | 3 +++ core/core.el | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 7d1b25ea0..365be67d2 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -50,6 +50,9 @@ this is nil after Emacs has started something is wrong.") (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0) "A hash table of enabled modules. Set by `doom-initialize-modules'.") +(defvar doom-modules-dirs (list doom-modules-dir) + "A list of module root directories. Order determines priority.") + (defvar doom-psuedo-module-dirs () "Additional paths for modules that are outside of `doom-modules-dirs'. `doom//reload-autoloads', `doom//byte-compile' and `doom-initialize-packages' diff --git a/core/core.el b/core/core.el index 431909d2d..57b6fd296 100644 --- a/core/core.el +++ b/core/core.el @@ -34,9 +34,6 @@ line or use --debug-init to enable this.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") "The main directory where Doom modules are stored.") -(defvar doom-modules-dirs (list doom-modules-dir) - "A list of module root directories. Order determines priority.") - (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 From 6a968dc0d7ae80e6a2acdaa81a331854ad80cf11 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 19:11:39 -0400 Subject: [PATCH 0872/4235] Sort init.example.el; add missing tools/rgb --- init.example.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/init.example.el b/init.example.el index f6c6e3473..94d4a8f23 100644 --- a/init.example.el +++ b/init.example.el @@ -49,23 +49,23 @@ :completion company ; the ultimate code completion backend - ivy ; a search engine for love and life ;helm ; the *other* search engine for love and life ;ido ; the other *other* search engine... + ivy ; a search engine for love and life :ui doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs doom-modeline ; a snazzy Atom-inspired mode-line doom-quit ; DOOM quit-message prompts when you quit Emacs + evil-goggles ; display visual hints when editing in evil hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping - evil-goggles ; display visual hints when editing in evil - ;unicode ; extended unicode support for various languages + ;posframe ; use child frames where possible (Emacs 26+ only) ;tabbar ; FIXME an (incomplete) tab bar for Emacs + ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows - ;posframe ; use child frames where possible (Emacs 26+ only) :tools dired ; making dired pretty [functional] @@ -80,6 +80,7 @@ neotree ; a project drawer, like NERDTree for vim password-store ; password manager for nerds pdf ; pdf enhancements + ;rgb ; creating color strings rotate-text ; cycle region at point between text candidates term ; terminals in Emacs tmux ; an API for interacting with tmux From c998cebd31df69184b540fdb969193a87fabbd22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 19:18:26 -0400 Subject: [PATCH 0873/4235] ansi-color-for-comint-mode = t --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index a2b8c1590..e442a00df 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -33,6 +33,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") "List of hooks to run when core-ui is initialized.") (setq-default + ansi-color-for-comint-mode t bidi-display-reordering nil ; disable bidirectional text for tiny performance boost blink-matching-paren nil ; don't blink--too distracting compilation-always-kill t ; kill compilation process before starting another From 8c0a4cfbeffc8037ed72c70b7cb91f1d591719fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 19:42:56 -0400 Subject: [PATCH 0874/4235] lang/elixir: refactor smartparens+use-package config --- modules/lang/elixir/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index d07bfd3a5..5ce920e70 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -5,17 +5,19 @@ :mode "\\.elixir2$" :config ;; disable standard config; more disruptive than it needs to be - (dolist (beg '("fn" "do" "def" "defp" "defmodule" "if" "unless" "case" "receive")) - (sp-local-pair 'elixir-mode beg nil :actions :rem)) + (map-delete sp-pairs 'elixir-mode) ;; only complete the basics (sp-with-modes 'elixir-mode - (sp-local-pair "do" "end" :when '(("RET" "")) :post-handlers '("||\n[i]")) - (sp-local-pair "do " " end") - (sp-local-pair "fn " " end"))) + (sp-local-pair "do" "end" + :when '(("RET" "")) + :unless '(sp-in-comment-p sp-in-string-p) + :skip-match 'sp-elixir-skip-def-p + :post-handlers '("||\n[i]")) + (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) + (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) (def-package! alchemist - :after elixir-mode :hook (elixir-mode . alchemist-mode) :config (set! :lookup 'elixir-mode From e5b50e4f4353fc8390a1321e5ddebeb11a247f94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 20:10:46 -0400 Subject: [PATCH 0875/4235] feature/popup: mention size parameter in +popup-define docstring --- modules/feature/popup/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index c1a6830ed..68d3dc07a 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -121,6 +121,9 @@ and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may contain and `+popup-window-parameters' for what window parameters that the popup module supports. +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + If certain attributes/parameters are omitted, the ones from `+popup-default-alist' and `+popup-default-parameters' will be used." (declare (indent 1)) From 412bf56f45b4fe02f5c366d29f090539e75b2aa5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 27 Mar 2018 20:11:23 -0400 Subject: [PATCH 0876/4235] feature/lookup: make lookup commands add to jump list --- modules/feature/lookup/autoload/lookup.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 7e22eeab4..ddf4857d7 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -236,3 +236,9 @@ for the provider." (let ((current-prefix-arg t)) (call-interactively #'+lookup/online))) + +;; +(after! evil + (evil-set-command-property '+lookup/definition :jump t) + (evil-set-command-property '+lookup/references :jump t) + (evil-set-command-property '+lookup/documentation :jump t)) From f24725382f46496e21d8d86f738a3e33afc78b45 Mon Sep 17 00:00:00 2001 From: Brandon Orther Date: Tue, 27 Mar 2018 19:37:43 -0700 Subject: [PATCH 0877/4235] Update password-store +auth to only use auth-source-pass Now that auth-password-store has been renamed to auth-source-pass and it matches the same feature included in emacs 26 under the same name we don't need custom checks and package loading. --- modules/tools/password-store/autoload.el | 4 +--- modules/tools/password-store/config.el | 8 +++----- modules/tools/password-store/packages.el | 4 +++- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index f22d18393..cbed035e8 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -12,9 +12,7 @@ ;;;###autoload (defalias '+pass--get-entry - (if (featurep 'auth-store-pass) - #'auth-source-pass-parse-entry - #'auth-pass-parse-entry)) + #'auth-source-pass-parse-entry) ;;;###autoload (defun +pass-get-field (entry fields) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 63c6eafdd..f57b69c8d 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -36,8 +36,6 @@ ;; Is built into Emacs 26+ -(when (featurep! +auth) - (if (require 'auth-store-pass nil t) - (auth-source-pass-enable) - (def-package! auth-source-store - :config (auth-source-pass-enable)))) +(def-package! auth-source-pass + :when (featurep! +auth) + :config (auth-source-pass-enable)) diff --git a/modules/tools/password-store/packages.el b/modules/tools/password-store/packages.el index 2a047fdd0..6827fc23e 100644 --- a/modules/tools/password-store/packages.el +++ b/modules/tools/password-store/packages.el @@ -3,7 +3,9 @@ (package! pass) (package! password-store) -(package! auth-source-pass) + +(when (featurep! +auth) + (package! auth-source-pass)) (when (featurep! :completion helm) (package! helm-pass)) From 2da03a67ba22275755ad01d7db77d194260eacdc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 00:34:05 -0400 Subject: [PATCH 0878/4235] Add .yas-compiled-snippets.el to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 47cf11c70..696cf9e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ var/ /init.el modules/private/ +.yas-compiled-snippets.el # emacs tempfiles that shouldn't be there .mc-lists.el From a6216b152f0bea410d7e42cc86cc2b65f1cb4270 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 00:41:46 -0400 Subject: [PATCH 0879/4235] Disable {tool,menu,scroll}-bar-mode in early-init.el --- early-init.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/early-init.el b/early-init.el index d82a19c70..e2b961ee6 100644 --- a/early-init.el +++ b/early-init.el @@ -7,3 +7,7 @@ ;; prevent Emacs from doing it early! (setq package-enable-at-startup nil) +;; Faster to disable these here (before they've been initialized) +(setq tool-bar-mode nil + menu-bar-mode nil) +(set-scroll-bar-mode nil) From 0e1b2453aa506682db3ddf49472bb5e1d9a946e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 00:41:57 -0400 Subject: [PATCH 0880/4235] Revise comments in early-init.el --- early-init.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/early-init.el b/early-init.el index e2b961ee6..e86bca68b 100644 --- a/early-init.el +++ b/early-init.el @@ -1,7 +1,9 @@ ;;; early-init.el -*- lexical-binding: t; -*- -;; Later versions of Emacs 27 (on master) introduce a new behavior: -;; +;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el, +;; before most of its package and UI initialization happens. We can use this +;; opportunity to cull parts of the startup process early. + ;; Package initialize occurs automatically, before `user-init-file' is loaded, ;; but after `early-init-file'. Doom handles package initialization, so we must ;; prevent Emacs from doing it early! @@ -11,3 +13,5 @@ (setq tool-bar-mode nil menu-bar-mode nil) (set-scroll-bar-mode nil) + +;; TODO Once Emacs 27 hits stable, perhaps replace init.el with early-init.el From 26514e2834603ff59181d79ffc197ed69eaa187c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 00:52:45 -0400 Subject: [PATCH 0881/4235] Optimize doom-initialize-packages for cold startup --- core/core-packages.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 365be67d2..5605407ac 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -254,19 +254,20 @@ them." if (file-exists-p path) do (_load path))) - ;; `package-alist' - (when (or (eq force-p t) (not (bound-and-true-p package-alist))) - (setq load-path doom-site-load-path) - (require 'package) - (setq package-activated-list nil) - (package-initialize)) + (unless (eq force-p 'internal) + ;; `package-alist' + (when (or force-p (not (bound-and-true-p package-alist))) + (setq load-path doom-site-load-path) + (require 'package) + (setq package-activated-list nil) + (package-initialize)) - ;; `quelpa-cache' - (when (or (eq force-p t) (not (bound-and-true-p quelpa-cache))) - (require 'quelpa) - (setq quelpa-initialized-p nil) - (or (quelpa-setup-p) - (error "Could not initialize quelpa")))))) + ;; `quelpa-cache' + (when (or force-p (not (bound-and-true-p quelpa-cache))) + (require 'quelpa) + (setq quelpa-initialized-p nil) + (or (quelpa-setup-p) + (error "Could not initialize quelpa"))))))) ;; From d39f3841982ec62b2cb6bd5249931dc8837ac04a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 00:53:50 -0400 Subject: [PATCH 0882/4235] Fix gc-cons-* & file-name-handler-alist not being reset --- core/core.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 57b6fd296..eee2fb1be 100644 --- a/core/core.el +++ b/core/core.el @@ -177,8 +177,8 @@ this, you'll get stuttering and random freezes), and resets file-name-handler-alist doom--file-name-handler-alist) t) - (add-hook 'emacs-startup-hook #'doom|after-init) - (add-hook! '(doom-finalize-hook doom-reload-hook) #'doom|finalize)) + (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize) + (add-hook 'emacs-startup-hook #'doom|after-init)) ;; From f334a92fdcac8e84a14e68340e1d380b71c7397f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 01:04:34 -0400 Subject: [PATCH 0883/4235] Fix package management delete-reinstall loop with quelpa packages --- 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 8095c01ff..469c71185 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -146,7 +146,7 @@ Warning: this function is expensive; it re-evaluates all of doom's config files. Be careful not to use it in a loop. If INSTALLED-ONLY-P, only return packages that are installed." - (doom-initialize-packages 'internal) + (doom-initialize-packages t) (cl-loop with packages = (append doom-core-packages (mapcar #'car doom-packages)) for sym in (cl-delete-duplicates packages) if (and (or (not installed-only-p) @@ -179,7 +179,7 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom//packages-update'." - (doom-initialize-packages 'internal) + (doom-initialize-packages t) (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages @@ -218,7 +218,7 @@ Used by `doom//packages-update'." depended on. Used by `doom//packages-autoremove'." - (doom-initialize-packages 'internal) + (doom-initialize-packages t) (let ((package-selected-packages (append (mapcar #'car doom-packages) doom-core-packages))) (append (package--removable-packages) From 4bafe2972245821c3de5fc73afed3fd75e65c2bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 02:56:21 -0400 Subject: [PATCH 0884/4235] Fix package! :disable not disabling packages doom-disabled-packages we built either too early or too late, causing disabled packages to be loaded anyway. --- core/core-packages.el | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 5605407ac..2750d40a5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -83,9 +83,10 @@ missing) and shouldn't be deleted.") (defvar doom-packages-file (concat doom-local-dir "packages.el") "Where to cache `load-path' and `Info-directory-list'.") -(defvar doom--refreshed-p nil) (defvar doom--current-module nil) +(defvar doom--init-cache-p nil) (defvar doom--initializing nil) +(defvar doom--refreshed-p nil) (defvar generated-autoload-load-name) (setq autoload-compute-prefixes nil @@ -139,14 +140,16 @@ missing) and shouldn't be deleted.") (defun doom--refresh-cache () "TODO" - (doom-initialize-packages 'internal) - (unless noninteractive - (with-temp-buffer - (prin1 `(setq load-path ',load-path - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages) - (current-buffer)) - (write-file doom-packages-file)))) + (when doom--init-cache-p + (doom-initialize-packages 'internal) + (unless noninteractive + (with-temp-buffer + (prin1 `(setq load-path ',load-path + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages) + (current-buffer)) + (write-file doom-packages-file)) + (setq doom--init-cache-p nil)))) (defun doom-initialize (&optional force-p) "Bootstrap the bare essentials to get Doom running, if it hasn't already. If @@ -195,7 +198,7 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) (cl-pushnew doom-core-dir load-path :test #'string=) - (add-hook 'after-init-hook #'doom--refresh-cache)) + (setq doom--init-cache-p t)) (setq doom-init-p t))) (defun doom-initialize-autoloads () @@ -388,6 +391,7 @@ MODULES is an malformed plist of modules to load." ,@(nreverse load-forms)) ,(unless doom--initializing '(unless noninteractive + (doom--refresh-cache) (doom-initialize-modules)))))) (defmacro def-package! (name &rest plist) From 375547d1b320cbbf5f957ed3fa73b9fca2dca111 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 03:06:51 -0400 Subject: [PATCH 0885/4235] tools/magit: set magithub-dir sooner (prevent .emacs.d/magithub) --- modules/tools/magit/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 153921f49..f2c490df7 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -33,9 +33,10 @@ (def-package! magithub :commands (magithub-clone magithub-feature-autoinject) :after magit + :preface + (setq magithub-dir (concat doom-etc-dir "magithub/")) :init - (setq magithub-dir (concat doom-etc-dir "magithub/") - magithub-clone-default-directory "~/" + (setq magithub-clone-default-directory "~/" magithub-preferred-remote-method 'clone_url) :config (load "magithub-autoloads" nil t) From 174e0518a19dc1e2b8505515264c315b28f3bc61 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 03:32:52 -0400 Subject: [PATCH 0886/4235] ui/doom: fix void-symbol error caused by misnamed advice function --- modules/ui/doom/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 643cfcf3b..248fd478d 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -26,7 +26,7 @@ (setq doom-theme 'doom-one)) ;; Reload common faces when reloading doom-themes live - (defun +doom*reload (&rest _) (load "doom-themes-common.el" nil t)) + (defun +doom*reload-common (&rest _) (load "doom-themes-common.el" nil t)) (advice-add #'doom//reload-theme :before #'+doom*reload-common) ;; improve integration w/ org-mode From 56dcc42440f54bf94ccb1bed9f620115ec1c5f96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 04:14:00 -0400 Subject: [PATCH 0887/4235] feature/evil: fix nil evil-want-integration when +everywhere isn't used --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index fc32f7dcf..bebd10ad5 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -26,7 +26,7 @@ :after evil :preface ;; must be set before evil/evil-collcetion is loaded - (setq evil-want-integration nil + (setq evil-want-integration (not (featurep! +everywhere)) evil-collection-company-use-tng nil) :config (delq 'kotlin-mode evil-collection-mode-list) ; doesn't do anything useful From f38cd94f33cf55f3498dab1783af28e3126cd3ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 06:49:49 -0400 Subject: [PATCH 0888/4235] ui/doom: improve solaire-mode theme integration Now +doom-solaire-themes is an alist that informs Doom if the current theme should be loaded with solaire-mode, and whether solaire-mode-swap-bg should be used. --- modules/ui/doom/config.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 248fd478d..f6cc4dab5 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -1,18 +1,18 @@ ;;; ui/doom/config.el -*- lexical-binding: t; -*- (defvar +doom-solaire-themes - '(doom-city-lights - doom-dracula - doom-molokai - doom-nord - doom-nova - doom-one - doom-one-light - doom-solarized-light - doom-spacegrey - doom-vibrant) - "A list of themes that supports `solaire-mode'; if these themes are detected, -`solaire-mode' will be enabled.") + '((doom-city-lights . t) + (doom-dracula . t) + (doom-molokai . t) + (doom-nord . t) + (doom-nova . nil) + (doom-one . t) + (doom-one-light . t) + (doom-solarized-light . nil) + (doom-spacegrey . nil) + (doom-vibrant . nil)) + "An alist of themes that support `solaire-mode'. If CDR is t, then use +`solaire-mode-swap-bg'.") ;; @@ -43,9 +43,9 @@ :commands (solaire-mode turn-on-solaire-mode solaire-mode-swap-bg) :init (defun +doom|solaire-mode-swap-bg-maybe () - (when (memq doom-theme +doom-solaire-themes) + (when-let* ((rule (assq doom-theme +doom-solaire-themes))) (require 'solaire-mode) - (solaire-mode-swap-bg))) + (if (cdr rule) (solaire-mode-swap-bg)))) (add-hook 'doom-load-theme-hook #'+doom|solaire-mode-swap-bg-maybe t) :config (add-hook 'after-change-major-mode-hook #'turn-on-solaire-mode) From f1cf88eeb6cb0f4267149e72db0875e245256a1a Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Wed, 28 Mar 2018 12:34:04 -0700 Subject: [PATCH 0889/4235] completion/ivy: fix ag/pt/grep file search args --- modules/completion/ivy/autoload/ivy.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 1c130f1d2..c33c1ec54 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -302,7 +302,7 @@ regexp. If omitted, the current selection is used. If no selection is active, the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive) + (interactive "P") (let ((+ivy--file-search-all-files-p all-files-p)) (+ivy--file-search 'ag query directory))) @@ -313,7 +313,7 @@ regexp. If omitted, the current selection is used. If no selection is active, the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive) + (interactive "P") (let ((+ivy--file-search-all-files-p all-files-p)) (+ivy--file-search 'pt query directory))) @@ -324,7 +324,7 @@ a grep regexp. If omitted, the current selection is used. If no selection is active, the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive) + (interactive "P") (let ((+ivy--file-search-all-files-p all-files-p)) (+ivy--file-search 'grep query directory))) From 5ca78c398445b7dfe6fe2e4029ab96816576433f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 17:31:23 -0400 Subject: [PATCH 0890/4235] feature/popup: always open term/eshell popups at bottom of frame --- modules/feature/popup/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 68d3dc07a..701f3404d 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -185,8 +185,8 @@ example: nil '((transient))) (+popup-define "^\\*doom \\(?:term\\|eshell\\)" - '((size . 0.25)) - '((quit) (transient . 0))) + '((size . 0.25) (vslot . -10)) + '((select . t) (quit) (transient . 0))) (+popup-define "^\\*doom:" '((size . 0.35) (side . bottom)) '((select . t) (modeline . t) (quit) (transient . t))) From 3fb7b2454438b777a010ceae32eac0b34eb50b27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 17:32:26 -0400 Subject: [PATCH 0891/4235] tools/eshell: fix overeager cleanup deleting other windows along with eshell --- modules/tools/eshell/autoload/eshell.el | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 17b79f7ae..9e12ca993 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -115,19 +115,11 @@ module to be loaded." ;; Hooks ;; -;;;###autoload -(defun +eshell|delete-window () - (if (one-window-p) - (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) - (switch-to-buffer (doom-fallback-buffer))) - (delete-window))) - ;;;###autoload (defun +eshell|init () "Keep track of eshell buffers." (let ((buf (current-buffer))) (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) - (add-hook 'kill-buffer-hook #'+eshell|delete-window nil t) (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) @@ -138,9 +130,14 @@ module to be loaded." (defun +eshell|cleanup () "Close window (or workspace) on quit." (+eshell--remove-buffer (current-buffer)) - (when (and (featurep! :feature workspaces) - (string= "eshell" (+workspace-current-name))) - (+workspace/delete "eshell"))) + (cond ((and (featurep! :feature workspaces) + (string= "eshell" (+workspace-current-name))) + (+workspace/delete "eshell")) + ((one-window-p) + (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) + (switch-to-buffer (doom-fallback-buffer)))) + ((delete (current-buffer) (get-buffer-window-list)) + (delete-window)))) ;; From 08976dafdd1599441fb180164a606baeda374c65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 17:32:35 -0400 Subject: [PATCH 0892/4235] tools/eshell: fix +eshell/switch --- modules/tools/eshell/autoload/eshell.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 9e12ca993..71e40319b 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -201,12 +201,13 @@ delete." (defun +eshell/switch (buffer) "Interactively switch to another eshell buffer." (interactive - (if (ring-empty-p +eshell-buffers) - (user-error "No eshell buffers are available") - (list (completing-read - "Eshell buffers" - (mapc #'buffer-name (delete (current-buffer) (ring-elements +eshell-buffers))) - #'get-buffer - 'require-match - nil nil (buffer-name (current-buffer)))))) + (let ((buffers (delete (current-buffer) (ring-elements +eshell-buffers)))) + (if buffers + (user-error "No eshell buffers are available") + (list (completing-read + "Eshell buffers" + (mapcar #'buffer-name buffers) + #'get-buffer + 'require-match + nil nil (buffer-name (current-buffer))))))) (switch-to-buffer buffer)) From 229d4de3904f5ab8e1515c792e57df6a5da44bbc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 17:33:17 -0400 Subject: [PATCH 0893/4235] feature/popup: minor rule refactor --- modules/feature/popup/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 701f3404d..fcf0d28fe 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -178,7 +178,7 @@ example: (+popup-define "^\\*Completions" '((slot . -1) (vslot . -2)) '((transient . 0))) - (+popup-define "^\\*Compil\\(ation\\|e-Log\\)" + (+popup-define "^\\*Compil\\(?:ation\\|e-Log\\)" '((size . 0.3)) '((transient . 0) (quit . t))) (+popup-define "^\\*\\(?:scratch\\|Messages\\)" @@ -191,7 +191,8 @@ example: '((size . 0.35) (side . bottom)) '((select . t) (modeline . t) (quit) (transient . t))) (+popup-define "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore))) + '((size . +popup-shrink-to-fit)) + '((transient . 0) (select . ignore))) ;; `help-mode', `helpful-mode' (+popup-define "^\\*[Hh]elp" From f44a227e74b914cee90f51de1fe066e0309917a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 18:38:55 -0400 Subject: [PATCH 0894/4235] Refactor scratch buffer; add doom-scratch-buffer-major-mode option #490 Also set the default scratch buffer major mode to fundamental-mode --- core/autoload/scratch.el | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index 9489cb177..7d3d06536 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -5,7 +5,16 @@ `doom/open-project-scratch-buffer'.") (defvar doom-scratch-buffer-display-fn #'display-buffer - "TODO") + "The function to use to display the scratch buffer. Must accept one argument: +the buffer to display.") + +(defvar doom-scratch-buffer-major-mode nil + "What major mode to use in scratch buffers. This can be one of the +following: + + t Inherits the major mode of the last buffer you had selected. + nil Uses `fundamental-mode' + MAJOR-MODE Any major mode symbol") (defvar doom-scratch-buffer-hook () "The hooks to run after a scratch buffer is made.") @@ -28,8 +37,8 @@ If FILE is a valid path, open it as if it were a persistent scratchpad." (current-buffer)) (get-buffer-create "*doom:scratch*")))) (with-current-buffer buffer - (when (and (not (eq major-mode mode)) - (functionp mode)) + (when (and (functionp mode) + (not (eq major-mode mode))) (funcall mode)) (when text (insert text)) @@ -54,7 +63,14 @@ If a region is active, copy its contents to the scratch pad." (if-let* ((file (read-file-name "Open scratch file > " doom-scratch-files-dir "scratch"))) file (user-error "Aborting"))) - major-mode + (cond ((eq doom-scratch-buffer-major-mode t) + (unless (or buffer-read-only + (derived-mode-p 'special-mode) + (string-match-p "^ ?\\*" (buffer-name))) + major-mode)) + ((null doom-scratch-buffer-major-mode) nil) + ((symbolp doom-scratch-buffer-major-mode) + doom-scratch-buffer-major-mode)) (and (region-active-p) (buffer-substring-no-properties (region-beginning) (region-end))))))) From 43830a84988c9fece5f27de00f6bce403d91f7a1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 19:07:48 -0400 Subject: [PATCH 0895/4235] tools/eshell: fix typo in condition in +eshell/switch Also changes behavior to select the selected eshell window if it's already open. --- modules/tools/eshell/autoload/eshell.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 71e40319b..e3bb5e35b 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -201,13 +201,18 @@ delete." (defun +eshell/switch (buffer) "Interactively switch to another eshell buffer." (interactive - (let ((buffers (delete (current-buffer) (ring-elements +eshell-buffers)))) - (if buffers + (let ((buffers (cl-remove-if-not (lambda (buf) (eq (buffer-local-value 'major-mode buf) 'eshell-mode)) + (delete (current-buffer) (ring-elements +eshell-buffers))))) + (if (not buffers) (user-error "No eshell buffers are available") (list (completing-read "Eshell buffers" (mapcar #'buffer-name buffers) #'get-buffer 'require-match - nil nil (buffer-name (current-buffer))))))) - (switch-to-buffer buffer)) + nil nil + (when (eq major-mode 'eshell-mode) + (buffer-name (current-buffer)))))))) + (if-let* ((window (get-buffer-window buffer))) + (select-window window) + (switch-to-buffer buffer))) From e17271a772b0c8e02c61afe6e6318b339d67c3a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 28 Mar 2018 19:08:20 -0400 Subject: [PATCH 0896/4235] tools/imenu: make imenu-list update sooner --- modules/tools/imenu/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/tools/imenu/config.el b/modules/tools/imenu/config.el index c761d1a44..07d11ae70 100644 --- a/modules/tools/imenu/config.el +++ b/modules/tools/imenu/config.el @@ -8,6 +8,8 @@ (def-package! imenu-list :commands imenu-list-minor-mode :config + (setq imenu-list-idle-update-delay 0.5) + (set! :popup "^\\*Ilist" '((side . right) (size . 35)) '((quit . current) (select) (transient . 0))) From 9ebab55a3fde163f9b18a6e4e169bf509da49973 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Thu, 29 Mar 2018 04:45:28 -0700 Subject: [PATCH 0897/4235] lang/web: add local leader bindings for web-mode Web mode has a bunch of helpful commands under `C-c`, this replicates the same bindings, but in leader-key style. E.g.: `C-c C-a k` becomes `SPC m a k` --- modules/lang/web/+html.el | 64 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 9d9d92392..c86efb69e 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -17,8 +17,70 @@ (set! :company-backend 'web-mode '(company-web-html company-yasnippet)) (setq web-mode-enable-html-entities-fontification t) + (map! :map web-mode-map - (:localleader :n "rt" #'web-mode-element-rename) + (:localleader + :desc "Rehighlight buffer" :n "h" #'web-mode-buffer-highlight + :desc "Indent buffer" :n "i" #'web-mode-buffer-indent + + (:desc "attribute" :prefix "a" + :desc "Beginning" :n "b" #'web-mode-attribute-beginning + :desc "End" :n "e" #'web-mode-attribute-end + :desc "Insert" :n "i" #'web-mode-attribute-insert + :desc "Next" :n "n" #'web-mode-attribute-next + :desc "Select" :n "s" #'web-mode-attribute-select + :desc "Kill" :n "k" #'web-mode-attribute-kill + :desc "Previous" :n "p" #'web-mode-attribute-previous + :desc "Transpose" :n "p" #'web-mode-attribute-transpose) + + (:desc "block" :prefix "b" + :desc "Beginning" :n "b" #'web-mode-block-beginning + :desc "Close" :n "c" #'web-mode-block-close + :desc "End" :n "e" #'web-mode-block-end + :desc "Kill" :n "k" #'web-mode-block-kill + :desc "Next" :n "n" #'web-mode-block-next + :desc "Previous" :n "p" #'web-mode-block-previous + :desc "Select" :n "s" #'web-mode-block-select) + + + (:desc "dom" :prefix "d" + :desc "Replace apostrophes" :n "a" #'web-mode-dom-apostrophes-replace + :desc "Show errors" :n "d" #'web-mode-dom-errors-show + :desc "Replace entities" :n "e" #'web-mode-dom-entities-encode + :desc "Normalize" :n "n" #'web-mode-dom-normalize + :desc "Replace quotes" :n "q" #'web-mode-dom-quotes-replace + :desc "Traverse" :n "t" #'web-mode-dom-traverse + :desc "XPath" :n "x" #'web-mode-dom-xpath) + + (:desc "element" :prefix "e" + :desc "Close" :n "/" #'web-mode-element-close + :desc "Select content" :n "a" #'web-mode-element-content-select + :desc "Beginning" :n "b" #'web-mode-element-beginning + :desc "Close" :n "c" #'web-mode-element-clone + :desc "Child" :n "d" #'web-mode-element-child + :desc "End" :n "e" #'web-mode-element-end + :desc "Toggle fold" :n "f" #'web-mode-element-children-fold-or-unfold + :desc "Insert" :n "i" #'web-mode-element-insert + :desc "Kill" :n "k" #'web-mode-element-kill + :desc "Mute blanks" :n "m" #'web-mode-element-mute-blanks + :desc "Next" :n "n" #'web-mode-element-next + :desc "Previous" :n "p" #'web-mode-element-previous + :desc "Rename" :n "r" #'web-mode-element-rename + :desc "Select" :n "s" #'web-mode-element-select + :desc "Transpose" :n "t" #'web-mode-element-transpose + :desc "Parent" :n "u" #'web-mode-element-parent + :desc "Vanish" :n "v" #'web-mode-element-vanish + :desc "Wrap" :n "w" #'web-mode-element-wrap) + + (:desc "tag" :prefix "t" + :desc "Sort attributes" :n "a" #'web-mode-tag-attributes-sort + :desc "Beginning" :n "b" #'web-mode-tag-beginning + :desc "End" :n "e" #'web-mode-tag-end + :desc "Match" :n "m" #'web-mode-tag-match + :desc "Next" :n "n" #'web-mode-tag-next + :desc "Previous" :n "p" #'web-mode-tag-previous + :desc "Select" :n "s" #'web-mode-tag-select)) + "M-/" #'web-mode-comment-or-uncomment :i "SPC" #'self-insert-command :n "M-r" #'doom/web-refresh-browser From 96e8e3cc19c33b63bd9569131c765f18df82af66 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 29 Mar 2018 00:25:42 -0400 Subject: [PATCH 0898/4235] feature/popup: add with-popup-rules! macro --- modules/feature/popup/autoload.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 7dabc64b8..7f8541924 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -386,6 +386,18 @@ the message buffer in a popup window." ;; Macros ;; +;;;###autoload +(defmacro with-popup-rules! (rules &rest body) + "Evaluate BODY with popup RULES. RULES is a list of popup rules. Each rule +should match the arguments of `+popup-define' or the :popup setting." + (declare (indent defun)) + `(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist) + display-buffer-alist) + ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + ,@body)) + ;;;###autoload (defmacro without-popups! (&rest body) "Run BODY with a default `display-buffer-alist', ignoring the popup rules set From 673b72397716b5e8eefa1bbee342047b41e95a0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 29 Mar 2018 21:25:20 -0400 Subject: [PATCH 0899/4235] config/default: revise SPC g ... keys (magit focus) --- modules/config/default/+bindings.el | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 68fc7dd50..47f72fb67 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -190,13 +190,24 @@ :desc "Browse private config" :n "P" #'+private/browse-config)) (: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 "Magit blame" :n "b" #'magit-blame + :desc "Magit commit" :n "c" #'magit-commit + :desc "Magit clone" :n "C" #'magit-clone + :desc "Magit dispatch" :n "d" #'magit-dispatch-popup + :desc "Magit find-file" :n "f" #'magit-find-file + :desc "Magit status" :n "g" #'magit-status + :desc "List gists" :n "G" #'+gist:list + :desc "Initialize repo" :n "i" #'magit-init + :desc "Magit buffer log" :n "l" #'magit-log-buffer-file + :desc "List repositories" :n "L" #'magit-list-repositories + :desc "Magit push popup" :n "p" #'magit-push-popup + :desc "Magit pull popup" :n "P" #'magit-pull-popup :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 "Git revert file" :n "R" #'vc-revert + :desc "Git status" :n "s" #'git-gutter:stage-hunk + :desc "Git stage hunk" :n "S" #'magit-stage-file + :desc "Git time machine" :n "t" #'git-timemachine-toggle + :desc "Git stage hunk" :n "U" #'magit-unstage-file :desc "Next hunk" :nv "]" #'git-gutter:next-hunk :desc "Previous hunk" :nv "[" #'git-gutter:previous-hunk) From 13bffc54bd2b5aa4258fbb8e7317bc33488c19b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 30 Mar 2018 00:08:25 -0400 Subject: [PATCH 0900/4235] Refactor theme/font initialization Addressed #489 --- core/core-ui.el | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index e442a00df..418458264 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -467,21 +467,23 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defun doom|init-fonts (&optional frame) +(defvar doom-last-window-system window-system + "The `window-system' of the last frame. If this doesn't match the current +frame's window-system, the theme will be reloaded.") + +(defun doom|init-fonts () "Initialize fonts." - (when (fontp doom-font) - (map-put default-frame-alist 'font (font-xlfd-name doom-font))) - (or frame (setq frame (selected-frame))) (condition-case-unless-debug ex (progn (when (fontp doom-font) - (set-face-attribute 'fixed-pitch frame :font doom-font)) + (map-put default-frame-alist 'font (font-xlfd-name doom-font)) + (set-face-attribute 'fixed-pitch nil :font doom-font)) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) + (set-fontset-font t 'unicode doom-unicode-font nil)) ;; ...and for variable-pitch-mode: (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font))) ('error (if (string-prefix-p "Font not available: " (error-message-string ex)) (lwarn 'doom-ui :warning @@ -494,8 +496,7 @@ character that looks like a space that `whitespace-mode' won't affect.") (defun doom|init-theme () "Set the theme and load the font, in that order." (when doom-theme - (load-theme doom-theme t)) - (add-hook 'after-make-frame-functions #'doom|init-theme-in-frame)) + (load-theme doom-theme t))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and ;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. @@ -506,11 +507,18 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; frames, however. There's always `doom//reload-theme' if you need it! (defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." - (when (or (daemonp) (not (display-graphic-p))) + (when (and (framep frame) + (not (eq doom-last-window-system (display-graphic-p frame)))) (with-selected-frame frame - (doom|init-theme)))) + (doom|init-theme)) + (setq doom-last-window-system (display-graphic-p frame)))) -(add-hook! 'doom-init-ui-hook #'(doom|init-theme doom|init-fonts)) +;; fonts +(add-hook 'doom-init-ui-hook #'doom|init-fonts) +;; themes +(add-hook 'after-make-frame-functions #'doom|init-theme-in-frame) +(unless (daemonp) + (add-hook 'doom-init-ui-hook #'doom|init-theme)) ;; From a546c8c92bef7563f950fa877cc4a7e31fc0ecf0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 30 Mar 2018 03:09:52 -0400 Subject: [PATCH 0901/4235] tools/magit: remove unnecessary keybinds; integrate ivy; show gravatars --- modules/tools/magit/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index f2c490df7..bf6bbd9ba 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -5,12 +5,13 @@ :init (load "magit-autoloads" nil t) :config - (set! :popup "^\\*?magit" :ignore) + (setq magit-completing-read-function + (if (featurep! :completion ivy) + #'ivy-completing-read + #'magit-builtin-completing-read) + magit-revision-show-gravatars '("^Author: " . "^Commit: ")) - (map! :map magit-repolist-mode-map - :n "j" #'next-line - :n "k" #'previous-line - :n "s" #'magit-repolist-status) + (set! :popup "^\\*?magit" :ignore) ;; (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) ;; (set! :popup "^.*magit" '((slot . -1) (side . right) (size . 80)) '((modeline . nil) (select . t))) From 21da187361f37b47430c970b89590e8bb80bc7da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 31 Mar 2018 18:06:38 -0400 Subject: [PATCH 0902/4235] lang/org: fix forward/backward motion keys --- modules/lang/org/config.el | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 9ad61c0de..a74d3f362 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -275,14 +275,12 @@ between the two." :ni [M-return] (λ! (+org/insert-item 'below)) :ni [S-M-return] (λ! (+org/insert-item 'above)) ;; more org-ish vim motion keys - :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) - :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) - :m "]h" #'org-next-visible-heading - :m "[h" #'org-previous-visible-heading - :m "]l" #'org-next-link - :m "[l" #'org-previous-link - :m "]s" #'org-babel-next-src-block - :m "[s" #'org-babel-previous-src-block + :n "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) + :n "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) + :n "]l" #'org-next-link + :n "[l" #'org-previous-link + :n "]s" #'org-babel-next-src-block + :n "[s" #'org-babel-previous-src-block :m "^" #'evil-org-beginning-of-line :m "0" (λ! (let ((visual-line-mode)) (org-beginning-of-line))) :n "gQ" #'org-fill-paragraph From 082b63610c9890b8e97297567dd4f941e09a3f19 Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Mon, 2 Apr 2018 07:53:51 +0200 Subject: [PATCH 0903/4235] Add: app/irc: pretty up a few more kinds of messages --- modules/app/irc/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 0b98053cc..e1da7c1ab 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -56,6 +56,10 @@ playback.") circe-format-self-say circe-format-say circe-format-action (format "{nick:+%ss} * {body}" +irc-left-padding) circe-format-self-action circe-format-action + circe-format-server-notice + (let ((left "-Server-")) (concat (make-string (- +irc-left-padding (length left)) ? ) + (concat left " _ {body}"))) + circe-format-notice (format "{nick:%ss} _ {body}" +irc-left-padding) circe-format-server-topic (+irc--pad "Topic" "{userhost}: {topic-diff}") circe-format-server-join-in-channel @@ -70,6 +74,8 @@ playback.") (+irc--pad "Quit" "{nick} ({userhost}) left {channel}: {reason}]") circe-format-server-rejoin (+irc--pad "Re-join" "{nick} ({userhost}), left {departuredelta} ago") + circe-format-server-netmerge + (+irc--pad "Netmerge" "{split}, split {ago} ago (Use /WL to see who's still missing)") circe-format-server-nick-change (+irc--pad "Nick" "{old-nick} ({userhost}) is now known as {new-nick}") circe-format-server-nick-change-self From fbf80489da7500bb5ab744f4a303738bd5b12b4f Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Mon, 2 Apr 2018 08:07:44 +0200 Subject: [PATCH 0904/4235] Document: app/irc: add docstrings for all variables --- modules/app/irc/config.el | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index e1da7c1ab..97ce99658 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -1,7 +1,9 @@ ;;; app/irc/config.el -*- lexical-binding: t; -*- (defvar +irc-left-padding 13 - "TODO") + "By how much spaces the left hand side of the line should be padded. +Below a value of 12 this may result in uneven alignment between the various +types of messages.") (defvar +irc-truncate-nick-char ?… "Character to displayed when nick > `+irc-left-padding' in length.") @@ -11,16 +13,23 @@ "If these commands are called pre prompt the buffer will scroll to `point-max'.") (defvar +irc-disconnect-hook nil - "TODO") + "Runs each hook when circe noticies the connection has been disconnected. +Useful for scenarios where an instant reconnect will not be successful.") (defvar +irc-bot-list '("fsbot" "rudybot") - "TODO") + "Nicks listed have `circe-fool-face' applied and will not be tracked.") (defvar +irc-time-stamp-format "%H:%M" - "TODO") + "The format of time stamps. + +See `format-time-string' for a full description of available +formatting directives. ") (defvar +irc-notifications-watch-strings nil - "TODO") + "A list of strings which can trigger a notification. You don't need to put +your nick here. + +See `circe-notifications-watch-strings'.") (defvar +irc-defer-notifications nil "How long to defer enabling notifications, in seconds (e.g. 5min = 300). From 4f4176c6463a67c7046cb524e5999f8b8040fe2b Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Mon, 2 Apr 2018 08:08:13 +0200 Subject: [PATCH 0905/4235] Add: app/irc: include disconnect hook code --- modules/app/irc/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 97ce99658..7d7c6df11 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -98,6 +98,10 @@ playback.") (add-hook 'circe-channel-mode-hook #'turn-on-visual-line-mode) + (defun +irc*circe-disconnect-hook (&rest _) + (run-hooks '+irc-disconnect-hook)) + (advice-add 'circe--irc-conn-disconnected :after #'+irc*circe-disconnect-hook) + ;; Let `+irc/quit' and `circe' handle buffer cleanup (map! :map circe-mode-map [remap kill-buffer] #'bury-buffer) From 180483ea72b0aacd06f2f217311ba7fe505baad5 Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Mon, 2 Apr 2018 08:44:49 +0200 Subject: [PATCH 0906/4235] Add: lang/nix: add to init.example.el nix is a functional declarative package manager --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 94d4a8f23..68c5ddc15 100644 --- a/init.example.el +++ b/init.example.el @@ -107,6 +107,7 @@ ledger ; an accounting system in Emacs lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore + nix ; I hereby declare "nix geht mehr!" ocaml ; an objective camel (org ; organize your plain life in plain text +attach ; custom attachment system From f6f2c9237320a4f1e8e9966bd1ccc4119fd3dd0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 05:49:55 -0400 Subject: [PATCH 0907/4235] app/calendar: don't require :feature workspaces --- modules/app/calendar/autoload.el | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 7d906c4cb..1f0348809 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -1,24 +1,36 @@ ;;; app/calendar/autoload.el -*- lexical-binding: t; -*- +(defvar +calendar--wconf nil) + +(defun +calendar--init () + (if-let* ((win (cl-loop for win in (doom-visible-windows) + if (string-match-p "^\\*cfw:" (buffer-name (window-buffer it))) + return win))) + (select-window win) + (call-interactively +calendar-open-function))) + ;;;###autoload (defun =calendar () "Activate (or switch to) `calendar' in its workspace." (interactive) - (unless (featurep! :feature workspaces) - (user-error ":feature workspaces is required, but disabled")) - (+workspace-switch "Calendar" t) - (if-let* ((win (cl-loop for win in (doom-visible-windows) - if (string-match-p "^\\*cfw" (buffer-name (window-buffer it))) - return win))) - (select-window win) - (call-interactively +calendar-open-function)) - (+workspace/display)) + (if (featurep! :feature workspaces) + (progn + (+workspace-switch "Calendar" t) + (+calendar--init) + (+workspace/display)) + (setq +calendar--wconf (current-window-configuration)) + (delete-other-windows) + (+calendar--init))) ;;;###autoload (defun +calendar/quit () "TODO" (interactive) - (+workspace/delete "Calendar")) + (if (featurep! :feature workspaces) + (+workspace/delete "Calendar") + (doom-kill-matching-buffers "^\\*cfw:") + (set-window-configuration +calendar--wconf) + (setq +calendar--wconf nil))) ;;;###autoload (defun +calendar/open-calendar () From 7282553d2d405f443911a7b026e7eeb64b0eaad2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 05:50:07 -0400 Subject: [PATCH 0908/4235] app/calendar: minor indentation refactor --- modules/app/calendar/autoload.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 1f0348809..509cb237b 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -45,15 +45,15 @@ ;;;###autoload (defun +calendar*cfw:render-button (title command &optional state) - "render-button + "render-button TITLE COMMAND STATE" - (let ((text (concat " " title " ")) - (keymap (make-sparse-keymap))) - (cfw:rt text (if state 'cfw:face-toolbar-button-on - 'cfw:face-toolbar-button-off)) - (define-key keymap [mouse-1] command) - (cfw:tp text 'keymap keymap) - (cfw:tp text 'mouse-face 'highlight) - text)) + (let ((text (concat " " title " ")) + (keymap (make-sparse-keymap))) + (cfw:rt text (if state 'cfw:face-toolbar-button-on + 'cfw:face-toolbar-button-off)) + (define-key keymap [mouse-1] command) + (cfw:tp text 'keymap keymap) + (cfw:tp text 'mouse-face 'highlight) + text)) From aad653d9132846c845897612c01f2d0b10c87d0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 05:50:39 -0400 Subject: [PATCH 0909/4235] feature/workspaces: clear last workspace instead of erroring out --- .../feature/workspaces/autoload/workspaces.el | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 1500ea9de..1407c6802 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -259,25 +259,21 @@ workspace to delete." nil nil current-name) current-name)))) (condition-case-unless-debug ex - (+workspace-message - (let ((workspaces (length (+workspace-list-names)))) - (cond ((> workspaces 1) - (+workspace-delete name) - (+workspace-switch - (if (+workspace-exists-p +workspace--last) - +workspace--last - (car (+workspace-list-names)))) - (unless (doom-buffer-frame-predicate (current-buffer)) - (switch-to-buffer (doom-fallback-buffer))) - (format "Deleted '%s' workspace" name)) - ((= workspaces 1) - (format "Can't delete the last workspace!")) - (t - (+workspace-delete name) - (+workspace-switch +workspaces-main t) - (switch-to-buffer (doom-fallback-buffer)) - (format "No workspaces detected! Auto-creating '%s' workspace" +workspaces-main)))) - 'success) + (let ((workspaces (length (+workspace-list-names)))) + (cond ((> workspaces 1) + (+workspace-delete name) + (+workspace-switch + (if (+workspace-exists-p +workspace--last) + +workspace--last + (car (+workspace-list-names)))) + (unless (doom-buffer-frame-predicate (current-buffer)) + (switch-to-buffer (doom-fallback-buffer)))) + (t + (+workspace-switch +workspaces-main t) + (unless (string= (car workspaces) +workspaces-main) + (+workspace-delete name)) + (doom/kill-all-buffers))) + (+workspace-message (format "Deleted '%s' workspace" name) 'success)) ('error (+workspace-error ex t)))) ;;;###autoload From 54c6301f4538789b51bcb08a00829f8bd864796c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 05:51:01 -0400 Subject: [PATCH 0910/4235] feature/workspaces: reduce redundancy in +workspace/kill-session --- modules/feature/workspaces/autoload/workspaces.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 1407c6802..8550ad07e 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -283,9 +283,7 @@ workspace to delete." (unless (cl-every #'+workspace-delete (+workspace-list-names)) (+workspace-error "Could not clear session")) (+workspace-switch +workspaces-main t) - (doom/kill-all-buffers) - (switch-to-buffer (doom-fallback-buffer)) - (doom/cleanup-session)) + (doom/kill-all-buffers)) ;;;###autoload (defun +workspace/kill-session-and-quit () From 8e7f97167a842a87c61e7165a699808c939a78de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 06:17:13 -0400 Subject: [PATCH 0911/4235] Minor whitespace/docstring refactor --- core/core.el | 4 ++-- modules/lang/cc/config.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index eee2fb1be..205980913 100644 --- a/core/core.el +++ b/core/core.el @@ -129,8 +129,8 @@ ability to invoke the debugger in debug mode." (funcall fn)) ('error (lwarn hook :error - "%s in '%s' -> %s" - (car ex) fn (error-message-string ex)))) + "%s in '%s' -> %s" + (car ex) fn (error-message-string ex)))) nil) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index aa929e1d4..173941c99 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -2,8 +2,8 @@ (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.") +C/C++. Paths can be absolute. This is ignored if your project has a compilation +database.") (defvar +cc-default-compiler-options `((c-mode . nil) From cc658beb9eafbba555fb5fca112c03bd24dc2950 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 06:17:49 -0400 Subject: [PATCH 0912/4235] tools/eshell: remove unused lexical var --- modules/tools/eshell/autoload/evil.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/tools/eshell/autoload/evil.el b/modules/tools/eshell/autoload/evil.el index 7a0070264..79a2df1bd 100644 --- a/modules/tools/eshell/autoload/evil.el +++ b/modules/tools/eshell/autoload/evil.el @@ -14,11 +14,7 @@ "Like `evil-change' but will not delete/copy the prompt." (interactive "") (let ((delete-func (or delete-func #'evil-delete)) - (nlines (1+ (evil-count-lines beg end))) - (opoint (save-excursion - (goto-char beg) - (evil-collection-eshell-next-prompt) - (point)))) + (nlines (1+ (evil-count-lines beg end)))) (unless (eq evil-want-fine-undo t) (evil-start-undo-step)) (when (get-text-property beg 'read-only) From 06acb2f3cff92be7b1a88f0a671c0835059193a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 06:25:30 -0400 Subject: [PATCH 0913/4235] feature/popup: general refactor --- modules/feature/popup/autoload.el | 43 ++++++++++++++++++++++++ modules/feature/popup/config.el | 56 ++++--------------------------- 2 files changed, 50 insertions(+), 49 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 7f8541924..743a0d680 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -1,6 +1,12 @@ ;;; feature/popup/autoload.el -*- lexical-binding: t; -*- (defvar +popup--populate-wparams (not EMACS26+)) +(defvar +popup--inhibit-transient nil) +(defvar +popup--display-buffer-alist nil) +(defvar +popup--old-display-buffer-alist nil) +(defvar +popup--remember-last t) +(defvar +popup--last nil) +(defvar-local +popup--timer nil) (defun +popup--remember (windows) "Remember WINDOWS (a list of windows) for later restoration." @@ -175,11 +181,48 @@ Uses `shrink-window-if-larger-than-buffer'." (unless (= (- (point-max) (point-min)) 0) (shrink-window-if-larger-than-buffer window))) +;;;###autoload +(defun +popup-define (condition &optional alist parameters) + "Define a popup rule. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +If CONDITION is met, the buffer will be displayed in a popup window with ALIST +and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may +contain and `+popup-window-parameters' for what window parameters that the popup +module supports. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +If certain attributes/parameters are omitted, the ones from +`+popup-default-alist' and `+popup-default-parameters' will be used." + (declare (indent 1)) + (push (if (eq alist :ignore) + (list condition nil) + `(,condition + (+popup-buffer) + ,@alist + (window-parameters ,@parameters))) + +popup--display-buffer-alist)) + ;; ;; Minor mode ;; +;;;###autoload +(defvar +popup-mode-map (make-sparse-keymap) + "Active keymap in a session with the popup system enabled. See +`+popup-mode'.") + +;;;###autoload +(defvar +popup-buffer-mode-map (make-sparse-keymap) + "Active keymap in popup windows. See `+popup-buffer-mode'.") + ;;;###autoload (define-minor-mode +popup-mode "Global minor mode for popups." diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index fcf0d28fe..10e1027be 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -85,56 +85,7 @@ a brief description of some native window parameters that Emacs uses: "The default time-to-live for transient buffers whose popup buffers have been deleted.") -(defvar +popup-mode-map (make-sparse-keymap) - "Active keymap in a session with the popup system enabled. See -`+popup-mode'.") - -(defvar +popup-buffer-mode-map - (let ((map (make-sparse-keymap))) - (when (featurep! :feature evil) - ;; for maximum escape coverage in emacs state buffers - (define-key map [escape] #'doom/escape) - (define-key map (kbd "ESC") #'doom/escape)) - map) - "Active keymap in popup windows. See `+popup-buffer-mode'.") - - -(defvar +popup--inhibit-transient nil) -(defvar +popup--display-buffer-alist nil) -(defvar +popup--old-display-buffer-alist nil) -(defvar +popup--remember-last t) -(defvar +popup--last nil) -(defvar-local +popup--timer nil) - - ;; -(defun +popup-define (condition &optional alist parameters) - "Define a popup rule. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. - -If CONDITION is met, the buffer will be displayed in a popup window with ALIST -and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may -contain and `+popup-window-parameters' for what window parameters that the popup -module supports. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -If certain attributes/parameters are omitted, the ones from -`+popup-default-alist' and `+popup-default-parameters' will be used." - (declare (indent 1)) - (push (if (eq alist :ignore) - (list condition nil) - `(,condition - (+popup-buffer) - ,@alist - (window-parameters ,@parameters))) - +popup--display-buffer-alist)) - (def-setting! :popup (condition &optional alist parameters) "Register a popup rule. @@ -226,6 +177,13 @@ example: +popup|set-modeline-on-enable +popup|unset-modeline-on-disable)) +(let ((map +popup-buffer-mode-map)) + (when (featurep! :feature evil) + ;; for maximum escape coverage in emacs state buffers + (define-key map [escape] #'doom/escape) + (define-key map (kbd "ESC") #'doom/escape)) + map) + ;; ;; Hacks From 6fa8edcb225722d47cc8fbd438bc71596ee4704c Mon Sep 17 00:00:00 2001 From: ar1a <8436007+ar1a@users.noreply.github.com> Date: Tue, 3 Apr 2018 01:13:06 +0800 Subject: [PATCH 0914/4235] update documentation for +lookup/documentation gh is now K in normal mode --- modules/feature/lookup/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/README.org b/modules/feature/lookup/README.org index 8ca362370..9f7eebd78 100644 --- a/modules/feature/lookup/README.org +++ b/modules/feature/lookup/README.org @@ -90,7 +90,7 @@ will try: If there are multiple results, you will be prompted to select one. ** Look up documentation -~+lookup/documentation~ (bound to =gh= in normal mode) will open documentation +~+lookup/documentation~ (bound to =K= in normal mode) will open documentation for the symbol at point. Depending on your configuration, this will try a list of sources: From 26d31d3b8b435499a2f8a3931235c6cdc33dcb1d Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Mon, 2 Apr 2018 21:03:48 +0200 Subject: [PATCH 0915/4235] Cut: ui/posframe: don't set `ivy-posframe-font' Previous value of current font + :size 18 is unexpected. --- modules/ui/posframe/config.el | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 03ed446e7..de4a49895 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -51,11 +51,6 @@ ivy-fixed-height-minibuffer nil ivy-posframe-parameters `((min-width . 90) (min-height . ,ivy-height) - (internal-border-width . 10))) - (when (and (not ivy-posframe-font) doom-font) - (setq ivy-posframe-font - (font-spec :family (font-get doom-font :family) - :size 18)))) - + (internal-border-width . 10)))) ;; TODO helm-posframe? From b701303909b63373423c4fd6200b1798fd9dcd28 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Apr 2018 22:02:32 -0400 Subject: [PATCH 0916/4235] lang/web: emmet-expand-jsx-className = t in rjsx-mode --- modules/lang/web/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index 5fa06ba01..3ea95eb9a 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -19,6 +19,8 @@ :hook (css-mode web-mode html-mode haml-mode nxml-mode rjsx-mode) :config (setq emmet-move-cursor-between-quotes t) + (add-hook! 'rjsx-mode-hook + (setq-local emmet-expand-jsx-className? t)) (map! :map emmet-mode-keymap :v "M-e" #'emmet-wrap-with-markup :i "M-e" #'emmet-expand-yas From 355b4b13642f662864e4ec91ac670b872596efc1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 03:07:26 -0400 Subject: [PATCH 0917/4235] :boom: Replace config/private w/ first-class support The config/private module has been removed. ~/.doom.d (or ~/.config/doom; whichever is detected first) is now a first class citizen of Doom and should just work(tm). Your init.el only needs to contain: (require 'core (concat user-emacs-directory "core/core")) And you may place your doom! block in ~/.doom.d/init.el (or ~/.config/doom/init.el). --- core/core-packages.el | 6 ++++-- core/core.el | 13 ++++++++++++ init.example.el | 7 +------ modules/config/default/+bindings.el | 5 ++--- modules/config/default/autoload/default.el | 11 +++++++++++ modules/config/private/README.org | 23 ---------------------- modules/config/private/autoload.el | 13 ------------ modules/config/private/config.el | 8 -------- modules/config/private/doctor.el | 5 ----- modules/config/private/init.el | 19 ------------------ 10 files changed, 31 insertions(+), 79 deletions(-) delete mode 100644 modules/config/private/README.org delete mode 100644 modules/config/private/autoload.el delete mode 100644 modules/config/private/config.el delete mode 100644 modules/config/private/doctor.el delete mode 100644 modules/config/private/init.el diff --git a/core/core-packages.el b/core/core-packages.el index 2750d40a5..ec8ae5a11 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -50,10 +50,12 @@ this is nil after Emacs has started something is wrong.") (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0) "A hash table of enabled modules. Set by `doom-initialize-modules'.") -(defvar doom-modules-dirs (list doom-modules-dir) +(defvar doom-modules-dirs + (list doom-modules-dir (expand-file-name "modules/" doom-private-dir)) "A list of module root directories. Order determines priority.") -(defvar doom-psuedo-module-dirs () +(defvar doom-psuedo-module-dirs + (list doom-private-dir) "Additional paths for modules that are outside of `doom-modules-dirs'. `doom//reload-autoloads', `doom//byte-compile' and `doom-initialize-packages' will include the directories in this list.") diff --git a/core/core.el b/core/core.el index 205980913..35a9346ef 100644 --- a/core/core.el +++ b/core/core.el @@ -53,6 +53,14 @@ 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.") +(defvar doom-private-dir + (if (file-directory-p "~/.doom.d") + "~/.doom.d/" + (concat (or (getenv "XDG_CONFIG_HOME") + "~/.config") + "/doom/")) + "TODO") + (defconst EMACS26+ (not (version< emacs-version "26"))) (defconst EMACS27+ (not (version< emacs-version "27"))) @@ -146,6 +154,8 @@ ability to invoke the debugger in debug mode." gc-cons-percentage 0.6 file-name-handler-alist nil)) + (load (expand-file-name "early-init.el" doom-private-dir) t t) + (require 'core-packages (concat doom-core-dir "core-packages")) (doom-initialize noninteractive) (load! core-lib) @@ -156,12 +166,15 @@ ability to invoke the debugger in debug mode." (load! core-projects) ; making Emacs project-aware (load! core-keybinds)) ; centralized keybind system + which-key + (load (expand-file-name "init.el" doom-private-dir) t t) + (defun doom|after-init () "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and display the loading benchmark." (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook)) (unless noninteractive + (load (expand-file-name "config.el" doom-private-dir) t t) (when (display-graphic-p) (require 'server) (unless (server-running-p) diff --git a/init.example.el b/init.example.el index 68c5ddc15..200b8211a 100644 --- a/init.example.el +++ b/init.example.el @@ -147,10 +147,5 @@ ;; a Spacemacs-inspired keybinding scheme, a custom yasnippet library, ;; and additional ex commands for evil-mode. Use it as a reference for ;; your own modules. - (default +bindings +snippets +evil-commands) - - ;; This allows you to store your private module at - ;; $XDG_CONFIG_HOME/doom/. Without +xdg it uses ~/.doom.d/. If your - ;; config directory doesn't exist, this module does nothing. - (private +xdg)) + (default +bindings +snippets +evil-commands)) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 47f72fb67..ebd85a5e5 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -185,9 +185,8 @@ :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 - (:when (featurep! :config private) - :desc "Find file in private config" :n "p" #'+private/find-in-config - :desc "Browse private config" :n "P" #'+private/browse-config)) + :desc "Find file in private config" :n "p" #'+default/find-in-config + :desc "Browse private config" :n "P" #'+default/browse-config) (:desc "git" :prefix "g" :desc "Magit blame" :n "b" #'magit-blame diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 15ba85e03..6526c029e 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -39,6 +39,17 @@ (interactive) (doom-project-browse emacs-snippets-dir)) ;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' +;;;###autoload +(defun +default/find-in-config () + "Open a file somewhere in `doom-private-dir' via a fuzzy filename search." + (interactive) + (doom-project-find-file doom-private-dir)) + +;;;###autoload +(defun +default/browse-config () + "Browse the files in `doom-private-dir'." + (interactive) + (doom-project-browse doom-private-dir)) ;;;###autoload (defun +default/compile (arg) diff --git a/modules/config/private/README.org b/modules/config/private/README.org deleted file mode 100644 index 0a7684d02..000000000 --- a/modules/config/private/README.org +++ /dev/null @@ -1,23 +0,0 @@ -#+TITLE: :config private - -This module enables support for an external private module and nested -submodules, either at =~/.doom.d= (or =$XDG_CONFIG_HOME/doom= with the ~+xdg~ -flag). - -* Table of Contents :TOC: -- [[Module Flags][Module Flags]] -- [[Features][Features]] - - [[Private sub-modules][Private sub-modules]] - -* Module Flags -+ ~+xdg~ Tells this module to respect XDG conventions and look for your private - config in ~$XDG_CONFIG_HOME/doom~ (falls back to =~/.config/doom=). - -* Features -** Private sub-modules -Modules placed in the =modules/= subdirectory of your external config are -symlinked to =~/.emacs.d/modules/private=, and can be activated from ~doom!~: - -#+BEGIN_SRC emacs-lisp -(doom! :private private-module1 private-module2 ...) -#+END_SRC diff --git a/modules/config/private/autoload.el b/modules/config/private/autoload.el deleted file mode 100644 index f85c9d298..000000000 --- a/modules/config/private/autoload.el +++ /dev/null @@ -1,13 +0,0 @@ -;;; config/private/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +private/find-in-config () - "Open a file somewhere in `+private-config-path' via a fuzzy filename search." - (interactive) - (doom-project-find-file +private-config-path)) - -;;;###autoload -(defun +private/browse-config () - "Browse the files in `+private-config-path'." - (interactive) - (doom-project-browse +private-config-path)) diff --git a/modules/config/private/config.el b/modules/config/private/config.el deleted file mode 100644 index d90410d87..000000000 --- a/modules/config/private/config.el +++ /dev/null @@ -1,8 +0,0 @@ -;;; config/private/config.el -*- lexical-binding: t; -*- - -(defun +private|load-config () - "Loads your private config.el in `+private-config-path'." - (load (expand-file-name "config.el" +private-config-path) - 'noerror 'nomessage)) - -(add-hook 'after-init-hook #'+private|load-config) diff --git a/modules/config/private/doctor.el b/modules/config/private/doctor.el deleted file mode 100644 index 094b94132..000000000 --- a/modules/config/private/doctor.el +++ /dev/null @@ -1,5 +0,0 @@ -;;; config/private/doctor.el -*- lexical-binding: t; -*- - -(unless (file-directory-p +private-config-path) - (warn! "Couldn't find '%s'" (file-relative-name +private-config-path "~"))) - diff --git a/modules/config/private/init.el b/modules/config/private/init.el deleted file mode 100644 index d6f40753d..000000000 --- a/modules/config/private/init.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; config/private/init.el -*- lexical-binding: t; -*- - -(defvar +private-config-path - (if (featurep! +xdg) - (expand-file-name "doom/" (or (getenv "XDG_CONFIG_HOME") "~/.config")) - "~/.doom.d") - "The directory that serves as the root of your external private config for -Doom Emacs.") - -;; Ensure `doom//reload-autoloads', `doom//byte-compile' and -;; `doom-initialize-packages' will treat `+private-config-path' as the root of -;; this module. -(cl-pushnew +private-config-path doom-psuedo-module-dirs) -(cl-pushnew (expand-file-name "modules/" +private-config-path) - doom-modules-dirs :test #'string=) - -;; -(load (expand-file-name "init.el" +private-config-path) - 'noerror 'nomessage) From 4d5965c71b03e899907adf4c37034e8f4658eced Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 03:50:20 -0400 Subject: [PATCH 0918/4235] feature/popup: slightly larger org-agenda popups --- modules/feature/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index 10e1027be..a5c1bb517 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -162,7 +162,7 @@ example: '((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) '((transient . 0))) (+popup-define "^\\*Org Agenda" - '((size . 20)) + '((size . 0.35)) '((select . t) (transient))) (+popup-define "^\\*Org Src" '((size . 0.3)) From 7c5832c28596d2a5ead4b79e2d18d34286863d06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 04:16:40 -0400 Subject: [PATCH 0919/4235] lang/data: add graphql-mode --- modules/lang/data/config.el | 4 ++++ modules/lang/data/packages.el | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 7071a7b88..530142317 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -39,6 +39,10 @@ :mode ("\\.nes$" . hexl-mode)) +(def-package! graphql-mode + :mode "\\.graphql$") + + ;; ;; Frameworks ;; diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el index 6de75af15..fb60ce156 100644 --- a/modules/lang/data/packages.el +++ b/modules/lang/data/packages.el @@ -2,6 +2,7 @@ ;;; lang/data/packages.el (package! dockerfile-mode) +(package! graphql-mode) (package! json-mode) (package! toml-mode) (package! vimrc-mode) From fd3d2ebf0df4ea2aa3bc199a468f9cf2aed45d68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 04:18:11 -0400 Subject: [PATCH 0920/4235] lang/data: alphabetize package configs --- modules/lang/data/config.el | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 530142317..ce86f15f7 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -3,6 +3,27 @@ (push '("/sxhkdrc" . conf-mode) auto-mode-alist) +(def-package! dockerfile-mode + :mode "/Dockerfile$") + + +(def-package! graphql-mode + :mode "\\.graphql$") + + +(def-package! hexl ; For ROM hacking or debugging + :mode ("\\.hex$" . hexl-mode) + :mode ("\\.nes$" . hexl-mode)) + + +(def-package! json-mode + :mode "\\.js\\(on\\|[hl]int\\(rc\\)?\\)$" + :config + (when (featurep! :feature syntax-checker) + (add-hook 'json-mode-hook #'flycheck-mode)) + (set! :electric 'json-mode :chars '(?\n ?: ?{ ?}))) + + (def-package! nxml-mode :mode "\\.plist$" :config @@ -12,17 +33,6 @@ (def-package! toml-mode :mode "\\.toml$") -(def-package! yaml-mode :mode "\\.ya?ml$") - - -(def-package! json-mode - :mode "\\.js\\(on\\|[hl]int\\(rc\\)?\\)$" - :config - (when (featurep! :feature syntax-checker) - (add-hook 'json-mode-hook #'flycheck-mode)) - (set! :electric 'json-mode :chars '(?\n ?: ?{ ?}))) - - (def-package! vimrc-mode :mode "/\\.?g?vimrc$" :mode "\\.vim$" @@ -30,17 +40,7 @@ :mode "\\.vimp$") -(def-package! dockerfile-mode - :mode "/Dockerfile$") - - -(def-package! hexl ; For ROM hacking or debugging - :mode ("\\.hex$" . hexl-mode) - :mode ("\\.nes$" . hexl-mode)) - - -(def-package! graphql-mode - :mode "\\.graphql$") +(def-package! yaml-mode :mode "\\.ya?ml$") ;; From 0739e8cd0a84ddaaf13ab4e74c0f42001219c233 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 04:20:08 -0400 Subject: [PATCH 0921/4235] completion/helm: fix void-function with-helm-buffer error Presumably caused by eager expansion trying to expand the macro before helm is loaded. --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 092932939..6725c05e1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -62,7 +62,7 @@ (defun +helm*hide-minibuffer-maybe () "Hide minibuffer in Helm session if we use the header line as input field." - (when (with-helm-buffer helm-echo-input-in-header-line) + (when (buffer-local-value 'helm-echo-input-in-header-line (helm-buffer-get)) (let ((ov (make-overlay (point-min) (point-max) nil nil t))) (overlay-put ov 'window (selected-window)) (overlay-put ov 'face From 183b0613510ab92591ce3039333d6b986e723bb6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 05:45:45 -0400 Subject: [PATCH 0922/4235] feature/snippets: add doom-private-dir/snippets to yas-snippet-dirs --- modules/feature/snippets/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index aea3fdf64..ca2802ff0 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -29,6 +29,8 @@ ;; Allow nested snippets yas-triggers-in-field t) + (push (expand-file-name "snippets/" doom-private-dir) yas-snippet-dirs) + ;; Allows project-specific snippets (defun +snippets|enable-project-modes (mode &rest _) "Enable snippets for project modes." From b12d7bde05116f8c1789650a2dfb80c274598c48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 15:00:52 -0400 Subject: [PATCH 0923/4235] Update docstring for package management macros --- core/core-packages.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index ec8ae5a11..91a7bab11 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -419,10 +419,7 @@ Under the hood, this uses use-package's `use-package-inject-hooks'. PACKAGE is a symbol; the package's name. WHEN should be one of the following: - :pre-init :post-init :pre-config :post-config :disable - -If WHEN is :disable then BODY is ignored, and DOOM will be instructed to ignore -all `def-package!' blocks for PACKAGE. + :pre-init :post-init :pre-config :post-config WARNING: If :pre-init or :pre-config hooks return nil, the original `def-package!''s :init/:config block (respectively) is overwritten, so remember @@ -529,7 +526,7 @@ This macro is declarative and does not load nor install packages. It is used to populate `doom-packages' with metadata about the packages Doom needs to keep track of. -Only use this macro in a module's init.el or packages.el file. +Only use this macro in a module's packages.el file. Accepts the following properties: @@ -574,12 +571,16 @@ Accepts the following properties: (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple -packages at once." +packages at once. + +Only use this macro in a module's packages.el file." `(progn ,@(cl-loop for desc in packages collect `(package! ,@desc)))) (defmacro disable-packages! (&rest packages) "A convenience macro like `package!', but allows you to disable multiple -packages at once." +packages at once. + +Only use this macro in a module's packages.el file." `(setq doom-disabled-packages (append ',packages doom-disabled-packages))) (defmacro depends-on! (module submodule &optional flags) From 68e0694e29a19e4a1fccf4001269af7d40b26b73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 15:08:29 -0400 Subject: [PATCH 0924/4235] Load private config.el before doom init hooks Used to load it too late, after customizations were initialized by doom-init-hook and doom-post-init-hook hooks. --- core/core.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 35a9346ef..b08b3b8f0 100644 --- a/core/core.el +++ b/core/core.el @@ -171,10 +171,11 @@ ability to invoke the debugger in debug mode." (defun doom|after-init () "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and display the loading benchmark." + (unless noninteractive + (load (expand-file-name "config.el" doom-private-dir) t t)) (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook)) (unless noninteractive - (load (expand-file-name "config.el" doom-private-dir) t t) (when (display-graphic-p) (require 'server) (unless (server-running-p) From 5282c6c716d5ec8fb5018d41148d8c40de81b407 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 15:57:51 -0400 Subject: [PATCH 0925/4235] Fix default modules being prioritized over private ones --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 91a7bab11..1c8999f3b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -51,7 +51,7 @@ this is nil after Emacs has started something is wrong.") "A hash table of enabled modules. Set by `doom-initialize-modules'.") (defvar doom-modules-dirs - (list doom-modules-dir (expand-file-name "modules/" doom-private-dir)) + (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) "A list of module root directories. Order determines priority.") (defvar doom-psuedo-module-dirs From 197631f6a4a8fc10f0e37ef9be2a36581360afcc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 16:24:15 -0400 Subject: [PATCH 0926/4235] Apply doom fixes/hacks before loading private init.el Fixes void-variable: doom-auto-minor-mode-alist errors --- core/core.el | 84 ++++++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/core/core.el b/core/core.el index b08b3b8f0..7e3c9407c 100644 --- a/core/core.el +++ b/core/core.el @@ -142,6 +142,48 @@ ability to invoke the debugger in debug mode." nil) +;; +;; 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) + + ;;; ;; Initialize (eval-and-compile @@ -194,47 +236,5 @@ this, you'll get stuttering and random freezes), and resets (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize) (add-hook 'emacs-startup-hook #'doom|after-init)) - -;; -;; 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) - (provide 'core) ;;; core.el ends here From cc13f51b7f152ef88480cb9e6f5ebdfaa3ea42cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 16:29:14 -0400 Subject: [PATCH 0927/4235] ui/doom-dashboard: update for new doom-private-dir --- modules/ui/doom-dashboard/config.el | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 9b6b03bab..1d7e9200e 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -324,16 +324,11 @@ controlled by `+doom-dashboard-pwd-policy'." ("Jump to bookmark" "bookmark" (call-interactively (or (command-remapping #'bookmark-jump) #'bookmark-jump))) - ,(when (featurep! :config private) + ,(when (file-directory-p doom-private-dir) '("Open private configuration" "settings" - (find-file (expand-file-name "config.el" +private-config-path)))) + (doom-project-find-file doom-private-dir))) ("Edit my modules list" "pencil" - (if (featurep! :config private) - (let ((init-file (expand-file-name "init.el" +private-config-path))) - (unless (file-exists-p init-file) - (make-directory (file-name-directory init-file) t) - (copy-file (expand-file-name "init.example.el" doom-emacs-dir) init-file t)) - (find-file init-file)) - (find-file user-init-file))) + (progn (make-directory doom-private-dir t) + (find-file (expand-file-name "init.el" doom-private-dir)))) ("Edit Doom Emacs" "tools" (doom-project-find-file doom-emacs-dir)))))) From c24c86894554d077bd5e855fb383961a1a1a68f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 16:58:41 -0400 Subject: [PATCH 0928/4235] ui/doom-dashboard: remove 'Edit Doom Emacs' button --- modules/ui/doom-dashboard/config.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 1d7e9200e..b1a47daf4 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -325,10 +325,8 @@ controlled by `+doom-dashboard-pwd-policy'." (call-interactively (or (command-remapping #'bookmark-jump) #'bookmark-jump))) ,(when (file-directory-p doom-private-dir) - '("Open private configuration" "settings" + '("Open private configuration" "tools" (doom-project-find-file doom-private-dir))) - ("Edit my modules list" "pencil" + ("Edit my modules list" "settings" (progn (make-directory doom-private-dir t) - (find-file (expand-file-name "init.el" doom-private-dir)))) - ("Edit Doom Emacs" "tools" - (doom-project-find-file doom-emacs-dir)))))) + (find-file (expand-file-name "init.el" doom-private-dir)))))))) From d85a2a6af06e741b3092ba96292d6db91d41aa59 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 19:46:22 -0400 Subject: [PATCH 0929/4235] Refactor noninteractive init; set doom-emacs-dir internally --- Makefile | 2 +- core/core.el | 41 +++++++++++++++-------------------------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index f3b31e0d8..f2d1d1c93 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Ensure emacs always runs from this makefile's PWD -EMACS = emacs -q --eval "(setq user-emacs-directory default-directory load-prefer-newer t)" +EMACS = emacs -q --eval "(setq noninteractive 'doom)" DOOM = $(EMACS) --batch -l init.el DOOMI = $(subst --batch,,$(DOOM)) diff --git a/core/core.el b/core/core.el index 7e3c9407c..46730a616 100644 --- a/core/core.el +++ b/core/core.el @@ -1,23 +1,5 @@ ;;; core.el --- the heart of the beast -*- lexical-binding: t; -*- -;;; Naming conventions: -;; -;; doom-... public variables or non-interactive functions -;; doom--... private anything (non-interactive), not safe for direct use -;; doom/... an interactive function; safe for M-x or keybinding -;; doom//... an interactive function for managing/maintaining Doom itself -;; doom:... an evil operator, motion or command -;; doom|... hook function -;; doom*... advising functions -;; doom@... a hydra command -;; ...! a macro or function that configures DOOM -;; =... an interactive command that starts an app module -;; %... functions used for in-snippet logic -;; +... Any of the above but part of a module, e.g. `+emacs-lisp|init-hook' -;; -;; Autoloaded functions are in core/autoload/*.el and modules/*/*/autoload.el or -;; modules/*/*/autoload/*.el. - (defvar doom-version "2.0.9" "Current version of DOOM emacs.") @@ -25,7 +7,11 @@ "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 (eval-when-compile (file-truename user-emacs-directory)) +;; +(defvar doom-emacs-dir + (if (eq noninteractive 'doom) + default-directory + (eval-when-compile (file-truename user-emacs-directory))) "The path to this emacs.d directory.") (defvar doom-core-dir (concat doom-emacs-dir "core/") @@ -54,16 +40,19 @@ Use this for files that change often, like cache files.") "Where package.el and quelpa plugins (and their caches) are stored.") (defvar doom-private-dir - (if (file-directory-p "~/.doom.d") - "~/.doom.d/" - (concat (or (getenv "XDG_CONFIG_HOME") - "~/.config") - "/doom/")) - "TODO") + (eval-when-compile + (or (let ((xdg-path (concat (or (getenv "XDG_CONFIG_HOME") + "~/.config") + "/doom/"))) + (if (file-directory-p xdg-path) xdg-path)) + "~/.doom.d/")) + "Where your private customizations are placed. Must end in a slash. Respects +XDG directory conventions if ~/.config/doom exists.") (defconst EMACS26+ (not (version< emacs-version "26"))) (defconst EMACS27+ (not (version< emacs-version "27"))) +(setq user-emacs-directory doom-emacs-dir) ;;; ;; UTF-8 as the default coding system @@ -82,7 +71,7 @@ Use this for files that change often, like cache files.") debug-on-error (and (not noninteractive) doom-debug-mode) ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often - load-prefer-newer (or noninteractive doom-debug-mode) + load-prefer-newer (or (eq noninteractive 'doom) doom-debug-mode) ;; keep the point out of the minibuffer minibuffer-prompt-properties '(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt) ;; History & backup settings (save nothing, that's what git is for) From b6fab5da8dfb1746b87735aa2bc2cb2def3037b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 19:46:47 -0400 Subject: [PATCH 0930/4235] Fix core not loading byte-compiled private config files --- core/core.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 46730a616..b536c2ad1 100644 --- a/core/core.el +++ b/core/core.el @@ -185,7 +185,7 @@ with functions that require it (like modeline segments)." gc-cons-percentage 0.6 file-name-handler-alist nil)) - (load (expand-file-name "early-init.el" doom-private-dir) t t) + (load (concat doom-private-dir "early-init") t t) (require 'core-packages (concat doom-core-dir "core-packages")) (doom-initialize noninteractive) @@ -197,13 +197,13 @@ with functions that require it (like modeline segments)." (load! core-projects) ; making Emacs project-aware (load! core-keybinds)) ; centralized keybind system + which-key - (load (expand-file-name "init.el" doom-private-dir) t t) + (load (concat doom-private-dir "init") t t) (defun doom|after-init () "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and display the loading benchmark." (unless noninteractive - (load (expand-file-name "config.el" doom-private-dir) t t)) + (load (concat doom-private-dir "config") t t)) (dolist (hook '(doom-init-hook doom-post-init-hook)) (run-hook-wrapped hook #'doom-try-run-hook hook)) (unless noninteractive From 2c0675a8dd3d0e8b4641aeb9ea25f1a0cfea7ac8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 19:48:11 -0400 Subject: [PATCH 0931/4235] Remove main init.el from gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 696cf9e4a..9e9f3ed2c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .local/ .cask/ var/ -/init.el modules/private/ .yas-compiled-snippets.el From 2933142d4080bd33c57c494068afb2ec608cf29a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 19:48:20 -0400 Subject: [PATCH 0932/4235] :boom: add default init.el Doom is moving away from supporting direct modification of its source files, or private modules within Doom's source tree. Instead, customizations should be relegated to ~/.doom.d/ (or ~/.config/doom/, doom will respect XDG conventions if it sees this directory). As suchm a default init.el is now supplied, which will break your custom ~/.emacs.d/init.el! The quick fix: mkdir ~/.doom.d mv ~/.emacs.d/init.el ~/.doom.d/init.el ~/.doom.d/early-init.el is also available if you need to change crucial settings before Doom loads anything. init.el will still be loaded before any other module is. --- Makefile | 27 ++++++++++++--------------- init.el | 30 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 init.el diff --git a/Makefile b/Makefile index f2d1d1c93..3c0228ccb 100644 --- a/Makefile +++ b/Makefile @@ -18,16 +18,16 @@ ce: compile-elpa d: doctor ## Package management -install: | init.el .local/autoloads.el +install: | .local/autoloads.el @$(DOOM) -f doom//packages-install -update: | init.el .local/autoloads.el +update: | .local/autoloads.el @$(DOOM) -f doom//packages-update -autoremove: | init.el .local/autoloads.el +autoremove: | .local/autoloads.el @$(DOOM) -f doom//packages-autoremove -autoloads: | init.el +autoloads: @$(DOOM) -f doom//reload-autoloads @@ -36,19 +36,19 @@ autoloads: | init.el # compile-core # compile-module # compile-module/submodule -compile: | init.el clean +compile: | clean @$(DOOM) -f doom//byte-compile -compile-core: | init.el clean +compile-core: | clean @$(DOOM) -f doom//byte-compile-core -compile-elpa: | init.el +compile-elpa: @$(DOOM) -f doom//byte-recompile-plugins -$(patsubst %, compile-%, $(MODULES)): | init.el .local/autoloads.el +$(patsubst %, compile-%, $(MODULES)): | .local/autoloads.el @$(DOOM) -f doom//byte-compile -- $(patsubst compile-%, %, $@) -recompile: | init.el +recompile: @$(DOOM) -f doom//byte-compile -- -r clean: @@ -60,14 +60,14 @@ clean: # test-core # test-module # test-module/submodule -test: | init.el .local/autoloads.el +test: | .local/autoloads.el @$(DOOM) -f doom//run-tests -test-core $(patsubst %, test-%, $(MODULES)): | init.el .local/autoloads.el +test-core $(patsubst %, test-%, $(MODULES)): | .local/autoloads.el @$(DOOM) -f doom//run-tests -- $(subst test-, , $@) # run tests interactively -testi: | init.el .local/autoloads.el +testi: | .local/autoloads.el @$(DOOMI) -f doom//run-tests @@ -85,9 +85,6 @@ info: @$(EMACS) --batch -l core/core.el -l core/autoload/debug.el -f doom/info ## Internal tasks -init.el: - @$(error No init.el file; create one or copy init.example.el) - .local/autoloads.el: @$(DOOM) -f doom-initialize-autoloads diff --git a/init.el b/init.el new file mode 100644 index 000000000..50621daa5 --- /dev/null +++ b/init.el @@ -0,0 +1,30 @@ +;;; init.el -*- lexical-binding: t; -*- +;; +;; Author: Henrik Lissner +;; URL: https://github.com/hlissner/doom-emacs +;; +;; ================= =============== =============== ======== ======== +;; \\ . . . . . . .\\ //. . . . . . .\\ //. . . . . . .\\ \\. . .\\// . . // +;; ||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\/ . . .|| +;; || . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . || +;; ||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .|| +;; || . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\ . . . . || +;; ||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\_ . .|. .|| +;; || . _|| || || || || ||_ . || || . _|| || || || |\ `-_/| . || +;; ||_-' || .|/ || || \|. || `-_|| ||_-' || .|/ || || | \ / |-_.|| +;; || ||_-' || || `-_|| || || ||_-' || || | \ / | `|| +;; || `' || || `' || || `' || || | \ / | || +;; || .===' `===. .==='.`===. .===' /==. | \/ | || +;; || .==' \_|-_ `===. .===' _|_ `===. .===' _-|/ `== \/ | || +;; || .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \/ | || +;; || .==' _-' '-__\._-' '-_./__-' `' |. /| | || +;; ||.==' _-' `' | /==.|| +;; ==' _-' \/ `== +;; \ _-' `-_ / +;; `'' ``' +;; +;; These demons are not part of GNU Emacs. +;; +;;; License: MIT + +(require 'core (concat user-emacs-directory "core/core")) From 9017879ff4fbdee44ef22f06fd7833f7fca50f09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 19:53:22 -0400 Subject: [PATCH 0933/4235] Add make upgrade A convenience command for upgrading to the latest version of Doom. --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 3c0228ccb..4b8fbce30 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,9 @@ autoremove: | .local/autoloads.el autoloads: @$(DOOM) -f doom//reload-autoloads +upgrade: | _upgrade all +_upgrade: + @git pull origin $(shell git rev-parse --abbrev-ref HEAD) ## Byte compilation # compile From a4eaf7c8651db8fb987ea0bd4092da611cd3bc04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 22:35:46 -0400 Subject: [PATCH 0934/4235] Add make U alias for make upgrade --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 4b8fbce30..432ebb5c0 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ all: | autoloads autoremove install a: autoloads i: install u: update +U: upgrade r: autoremove c: compile cc: compile-core From 6aac8666f376cae5c25462f8583ac7caaefbcdc3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 22:36:23 -0400 Subject: [PATCH 0935/4235] Ensure after-init hooks are available from private init.el --- core/core.el | 56 +++++++++++++++++++++++++++------------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/core/core.el b/core/core.el index b536c2ad1..c51e730f7 100644 --- a/core/core.el +++ b/core/core.el @@ -130,6 +130,29 @@ ability to invoke the debugger in debug mode." (car ex) fn (error-message-string ex)))) nil) +(defun doom|after-init () + "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and +display the loading benchmark." + (unless noninteractive + (load (concat doom-private-dir "config") t t)) + (dolist (hook '(doom-init-hook doom-post-init-hook)) + (run-hook-wrapped hook #'doom-try-run-hook hook)) + (unless noninteractive + (when (display-graphic-p) + (require 'server) + (unless (server-running-p) + (server-start))) + (message "%s" (doom-packages--benchmark)))) + +(defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes), and resets +`file-name-handler-alist'." + (setq gc-cons-threshold 16777216 + gc-cons-percentage 0.1 + file-name-handler-alist doom--file-name-handler-alist) + t) + ;; ;; Emacs fixes/hacks @@ -185,7 +208,8 @@ with functions that require it (like modeline segments)." gc-cons-percentage 0.6 file-name-handler-alist nil)) - (load (concat doom-private-dir "early-init") t t) + (when doom-private-dir + (load (concat doom-private-dir "early-init") t t)) (require 'core-packages (concat doom-core-dir "core-packages")) (doom-initialize noninteractive) @@ -197,33 +221,11 @@ with functions that require it (like modeline segments)." (load! core-projects) ; making Emacs project-aware (load! core-keybinds)) ; centralized keybind system + which-key - (load (concat doom-private-dir "init") t t) - - (defun doom|after-init () - "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and -display the loading benchmark." - (unless noninteractive - (load (concat doom-private-dir "config") t t)) - (dolist (hook '(doom-init-hook doom-post-init-hook)) - (run-hook-wrapped hook #'doom-try-run-hook hook)) - (unless noninteractive - (when (display-graphic-p) - (require 'server) - (unless (server-running-p) - (server-start))) - (message "%s" (doom-packages--benchmark)))) - - (defun doom|finalize () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes), and resets -`file-name-handler-alist'." - (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) - (add-hook 'emacs-startup-hook #'doom|after-init)) + (add-hook 'emacs-startup-hook #'doom|after-init) + + (when doom-private-dir + (load (concat doom-private-dir "init") t t))) (provide 'core) ;;; core.el ends here From 815f5c134dc1f7cbdccbfeddf7ed9727d830cda1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 22:36:44 -0400 Subject: [PATCH 0936/4235] Don't eval private files when unit testing --- init.test.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.test.el b/init.test.el index 16f3d5c10..6c125db70 100644 --- a/init.test.el +++ b/init.test.el @@ -1,5 +1,6 @@ ;;; init.test.el -- for automated unit tests -*- lexical-binding: t; -*- +(setq doom-private-dir nil) (require 'core (concat user-emacs-directory "core/core")) (doom! :feature From 48ae8e2affea69f64f74afeebca2092e73a63d09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 22:37:12 -0400 Subject: [PATCH 0937/4235] feature/evil: add mu4e modes to evil-snipe-disabled-modes --- modules/feature/evil/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bebd10ad5..ae25b3dc5 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -334,9 +334,9 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-repeat-scope 'visible evil-snipe-char-fold t evil-snipe-disabled-modes - '(org-agenda-mode magit-mode git-rebase-mode - elfeed-show-mode elfeed-search-mode ranger-mode - magit-repolist-mode) + '(org-agenda-mode magit-mode git-rebase-mode elfeed-show-mode + elfeed-search-mode ranger-mode magit-repolist-mode mu4e-main-mode + mu4e-view-mode mu4e-headers-mode mu4e~update-mail-mode) evil-snipe-aliases '((?\; "[;:]"))) :config (evil-snipe-override-mode +1)) From 0026f08e27c9aa5f2000088777388650a2c6f7ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Apr 2018 23:31:04 -0400 Subject: [PATCH 0938/4235] Update init.{example,test}.el & travis for new config policy --- .travis.yml | 3 ++- init.example.el | 31 +------------------------------ init.test.el | 7 ------- 3 files changed, 3 insertions(+), 38 deletions(-) diff --git a/.travis.yml b/.travis.yml index 106b671b5..624245807 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,8 @@ before_install: - export PATH="/home/travis/.evm/bin:$PATH" - evm config path /tmp - evm install $EVM_EMACS --use --skip - - cp init.test.el init.el + - mkdir -p ~/.doom.d + - cp init.test.el ~/.doom.d/init.el - INSECURE=1 YES=1 make install env: - EVM_EMACS=emacs-25.1-travis diff --git a/init.example.el b/init.example.el index 200b8211a..7ebd2be18 100644 --- a/init.example.el +++ b/init.example.el @@ -1,33 +1,4 @@ -;;; init.el -*- lexical-binding: t; -*- -;; -;; Author: Henrik Lissner -;; URL: https://github.com/hlissner/doom-emacs -;; -;; ================= =============== =============== ======== ======== -;; \\ . . . . . . .\\ //. . . . . . .\\ //. . . . . . .\\ \\. . .\\// . . // -;; ||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\/ . . .|| -;; || . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . || -;; ||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .|| -;; || . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\ . . . . || -;; ||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\_ . .|. .|| -;; || . _|| || || || || ||_ . || || . _|| || || || |\ `-_/| . || -;; ||_-' || .|/ || || \|. || `-_|| ||_-' || .|/ || || | \ / |-_.|| -;; || ||_-' || || `-_|| || || ||_-' || || | \ / | `|| -;; || `' || || `' || || `' || || | \ / | || -;; || .===' `===. .==='.`===. .===' /==. | \/ | || -;; || .==' \_|-_ `===. .===' _|_ `===. .===' _-|/ `== \/ | || -;; || .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \/ | || -;; || .==' _-' '-__\._-' '-_./__-' `' |. /| | || -;; ||.==' _-' `' | /==.|| -;; ==' _-' \/ `== -;; \ _-' `-_ / -;; `'' ``' -;; -;; These demons are not part of GNU Emacs. -;; -;;; License: MIT - -(require 'core (concat user-emacs-directory "core/core")) +;;; init.example.el -*- lexical-binding: t; -*- (doom! :feature (popup ; tame sudden yet inevitable temporary windows diff --git a/init.test.el b/init.test.el index 6c125db70..83dfa6ac2 100644 --- a/init.test.el +++ b/init.test.el @@ -1,21 +1,14 @@ ;;; init.test.el -- for automated unit tests -*- lexical-binding: t; -*- -(setq doom-private-dir nil) -(require 'core (concat user-emacs-directory "core/core")) - (doom! :feature evil workspaces - :completion company - :ui doom-dashboard - :tools password-store - :lang org web) From b1ddcf178751b2204557f60f240ae09db3cbb127 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 00:01:11 -0400 Subject: [PATCH 0939/4235] Fix locality of makefile commands --- Makefile | 2 +- core/core.el | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 432ebb5c0..219a15e48 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # Ensure emacs always runs from this makefile's PWD -EMACS = emacs -q --eval "(setq noninteractive 'doom)" +EMACS = emacs -q --eval "(setq user-emacs-directory default-directory load-prefer-newer t)" DOOM = $(EMACS) --batch -l init.el DOOMI = $(subst --batch,,$(DOOM)) diff --git a/core/core.el b/core/core.el index c51e730f7..279391fa2 100644 --- a/core/core.el +++ b/core/core.el @@ -9,9 +9,7 @@ line or use --debug-init to enable this.") ;; (defvar doom-emacs-dir - (if (eq noninteractive 'doom) - default-directory - (eval-when-compile (file-truename user-emacs-directory))) + (eval-when-compile (file-truename user-emacs-directory)) "The path to this emacs.d directory.") (defvar doom-core-dir (concat doom-emacs-dir "core/") @@ -52,7 +50,6 @@ XDG directory conventions if ~/.config/doom exists.") (defconst EMACS26+ (not (version< emacs-version "26"))) (defconst EMACS27+ (not (version< emacs-version "27"))) -(setq user-emacs-directory doom-emacs-dir) ;;; ;; UTF-8 as the default coding system @@ -71,7 +68,6 @@ XDG directory conventions if ~/.config/doom exists.") debug-on-error (and (not noninteractive) doom-debug-mode) ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often - load-prefer-newer (or (eq noninteractive 'doom) doom-debug-mode) ;; keep the point out of the minibuffer minibuffer-prompt-properties '(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt) ;; History & backup settings (save nothing, that's what git is for) From 9b6eea64b7199128fd714412aad415d5de0b8aa0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 00:01:20 -0400 Subject: [PATCH 0940/4235] travis: use XDG_CONFIG_HOME --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 624245807..8f30119d5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,8 +9,8 @@ before_install: - export PATH="/home/travis/.evm/bin:$PATH" - evm config path /tmp - evm install $EVM_EMACS --use --skip - - mkdir -p ~/.doom.d - - cp init.test.el ~/.doom.d/init.el + - mkdir -p ~/.config/doom + - cp init.test.el ~/.config/doom/init.el - INSECURE=1 YES=1 make install env: - EVM_EMACS=emacs-25.1-travis From a582bdf2087660264e7543413312672d8b35ebb1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 01:05:20 -0400 Subject: [PATCH 0941/4235] app/calendar: fix typo causing void-variable error --- modules/app/calendar/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 509cb237b..7a4af2477 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -4,7 +4,7 @@ (defun +calendar--init () (if-let* ((win (cl-loop for win in (doom-visible-windows) - if (string-match-p "^\\*cfw:" (buffer-name (window-buffer it))) + if (string-match-p "^\\*cfw:" (buffer-name (window-buffer win))) return win))) (select-window win) (call-interactively +calendar-open-function))) From 01bd58ff3efc0a9200ef35a4da85e0d70c5edc5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 04:13:25 -0400 Subject: [PATCH 0942/4235] Recompile on make upgrade --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 219a15e48..56843fa02 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,7 @@ autoremove: | .local/autoloads.el autoloads: @$(DOOM) -f doom//reload-autoloads -upgrade: | _upgrade all +upgrade: | _upgrade recompile all _upgrade: @git pull origin $(shell git rev-parse --abbrev-ref HEAD) From df5121e4c6e3ad85aa303574beef4b2e9ac9e6db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 05:27:33 -0400 Subject: [PATCH 0943/4235] feature/popup: fix docstrings for +popup-*-p functions --- modules/feature/popup/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 743a0d680..58d37c67b 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -119,7 +119,7 @@ and enables `+popup-buffer-mode'." ;;;###autoload (defun +popup-buffer-p (&optional buffer) - "Return t if BUFFER is a popup buffer. Defaults to the current buffer." + "Return non-nil if BUFFER is a popup buffer. Defaults to the current buffer." (unless buffer (setq buffer (current-buffer))) (cl-assert (bufferp buffer) t) @@ -129,7 +129,7 @@ and enables `+popup-buffer-mode'." ;;;###autoload (defun +popup-window-p (&optional window) - "Return t if WINDOW is a popup window. Defaults to the current window." + "Return non-nil if WINDOW is a popup window. Defaults to the current window." (unless window (setq window (selected-window))) (cl-assert (windowp window) t) From 36e626f7a3886acbc93ff80b81d1958540bf82e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 06:12:18 -0400 Subject: [PATCH 0944/4235] Add make quickstart --- Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Makefile b/Makefile index 56843fa02..44db82a96 100644 --- a/Makefile +++ b/Makefile @@ -18,6 +18,10 @@ cc: compile-core ce: compile-elpa d: doctor +quickstart: | ~/.doom.d/init.el install +~/.doom.d/init.el: + mkdir ~/.doom.d && cp init.example.el ~/.doom.d/init.el + ## Package management install: | .local/autoloads.el @$(DOOM) -f doom//packages-install From 0e127615ff4f4ee44a850bb5de48e2edb9ec3b31 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 06:13:09 -0400 Subject: [PATCH 0945/4235] Update README with new make quickstart workflow --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 32b8f7d58..60cb904a9 100644 --- a/README.md +++ b/README.md @@ -39,11 +39,10 @@ neckbeards with blue belts or better in command-line-fu, Elisp and git. ```bash git clone https://github.com/hlissner/doom-emacs ~/.emacs.d cd ~/.emacs.d -cp init.example.el init.el # maybe edit init.el -make install +make quickstart ``` -Don't forget to run `make` every time you modify init.el! +Don't forget to run `make` each time you modify init.el or update Doom! Visit the wiki for [a more detailed guide on installing, customizing and grokking Doom][wiki]. From 5d3f247a7f49592353d25919faded442a912c15d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 06:47:42 -0400 Subject: [PATCH 0946/4235] doctor: add warning for dual private configs --- bin/doom-doctor | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/bin/doom-doctor b/bin/doom-doctor index 4c9c84b60..0124afc5c 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -125,6 +125,16 @@ (concat "\nMacOS users should use homebrew (https://brew.sh) to install Emacs\n" " brew install emacs --with-modules --with-imagemagick --with-cocoa")))) +(section! "test-private-config") +(let ((xdg-dir (concat (or (abbreviate-file-name (getenv "XDG_CONFIG_HOME")) + "~/.config") + "/doom/")) + (doom-dir "~/.doom.d/")) + (when (and (file-directory-p xdg-dir) + (file-directory-p doom-dir)) + (warn! "Detected two private configs, in %s and %s" xdg-dir doom-dir) + (explain! "The second directory will be ignored, as it has lower precedence."))) + ;; --- is the environment set up properly? -------------------- From bc91c55accab563dfbc4a98502878e1d520c3223 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 06:56:56 -0400 Subject: [PATCH 0947/4235] lang/org: augment org-cycle, rather than replace it This removes +org/toggle-fold in favor of a more compatible alternative: a org-tab-first-hook function that forces org-cycle only to toggle the current subtree, and not cycle through all visibility states. --- modules/lang/org/autoload/org.el | 37 ++++++++++++++------------------ modules/lang/org/config.el | 5 +++-- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 29529b762..4b3f60909 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -256,27 +256,6 @@ wrong places)." (interactive) (org-toggle-checkbox '(4))) -;;;###autoload -(defun +org/toggle-fold () - "Toggle the local fold at the point (as opposed to cycling through all levels -with `org-cycle'). Also: - - + If in a babel block, removes result blocks. - + If in a table, realign it, if necessary." - (interactive) - (save-excursion - (org-beginning-of-line) - (cond ((org-at-table-p) - (org-table-align)) - ((org-at-heading-p) - (outline-toggle-children)) - ((org-in-src-block-p) - (org-babel-remove-result)) - ((org-at-item-p) - (let ((window-beg (window-start))) - (org-cycle) - (set-window-start nil window-beg)))))) - ;; ;; Hooks @@ -349,3 +328,19 @@ with `org-cycle'). Also: (yas--templates-for-key-at-point)) (call-interactively #'yas-expand) t)) + +;;;###autoload +(defun +org|toggle-only-current-fold () + "Toggle the local fold at the point (as opposed to cycling through all levels +with `org-cycle')." + (interactive) + (save-excursion + (org-beginning-of-line) + (cond ((org-at-heading-p) + (outline-toggle-children) + (unless (outline-invisible-p (line-end-position)) + (org-cycle-hide-drawers 'subtree)) + t) + ((org-in-src-block-p) + (org-babel-remove-result) + t)))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a74d3f362..8de5312da 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -251,6 +251,9 @@ between the two." (defun +org|setup-evil () (require 'evil-org) + + (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold) + (map! :map outline-mode-map :n "^" nil :n [backtab] nil @@ -267,8 +270,6 @@ between the two." :ni "C-S-h" #'+org/table-prepend-field-or-shift-left :ni "C-S-k" #'org-metaup :ni "C-S-j" #'org-metadown - ;; toggle local fold, instead of all children - :n [tab] #'+org/toggle-fold ;; more intuitive RET keybinds :i "RET" #'org-return-indent :n "RET" #'+org/dwim-at-point From 7699c3d2ceafaef737802210b3465d819c8c9b5d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 06:58:18 -0400 Subject: [PATCH 0948/4235] lang/web: restore smartparens-mode in web-mode --- modules/lang/web/+html.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index c86efb69e..8920a94b5 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -13,11 +13,9 @@ :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config - (add-hook 'web-mode-hook #'turn-off-smartparens-mode) (set! :company-backend 'web-mode '(company-web-html company-yasnippet)) (setq web-mode-enable-html-entities-fontification t) - (map! :map web-mode-map (:localleader :desc "Rehighlight buffer" :n "h" #'web-mode-buffer-highlight From 2ce6549e98fb1fe89192d3722a67599808886df8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 07:00:36 -0400 Subject: [PATCH 0949/4235] feature/evil: disable evil-collection-simple keybinds #506 --- modules/feature/evil/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index ae25b3dc5..7d0a0523d 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -30,6 +30,7 @@ evil-collection-company-use-tng nil) :config (delq 'kotlin-mode evil-collection-mode-list) ; doesn't do anything useful + (delq 'simple evil-collection-mode-list) ; breaks too much (evil-collection-init)) From 17a3008493d786e1fc8973cdc2d3fae7c9e1f2b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 07:18:37 -0400 Subject: [PATCH 0950/4235] tools/magit: minor refactor; clean up buffers after quitting magit #506 --- modules/tools/magit/config.el | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index bf6bbd9ba..f020ee602 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -11,19 +11,11 @@ #'magit-builtin-completing-read) magit-revision-show-gravatars '("^Author: " . "^Commit: ")) - (set! :popup "^\\*?magit" :ignore) - - ;; (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) - ;; (set! :popup "^.*magit" '((slot . -1) (side . right) (size . 80)) '((modeline . nil) (select . t))) - ;; (set! :popup "^\\*magit.*popup\\*" '((slot . 0) (side . right)) '((modeline . nil) (select . t))) - ;; (set! :popup "^.*magit-revision:.*" '((slot . 2) (side . right) (window-height . 0.6)) '((modeline . nil) (select . t))) - ;; (set! :popup "^.*magit-diff:.*" '((slot . 2) (side . right) (window-height . 0.6)) '((modeline . nil) (select . nil))) - - (after! evil - ;; Switch to emacs state only while in `magit-blame-mode', then back when - ;; its done (since it's a minor-mode). - (add-hook! 'magit-blame-mode-hook - (evil-local-mode (if magit-blame-mode -1 +1))))) + (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) + (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) + ;; Clean up after magit by properly killing buffers + (setq magit-bury-buffer-function #'+magit/quit) + (map! :map magit-mode-map [remap quit-window] #'+magit/quit)) (def-package! magit-blame @@ -48,4 +40,9 @@ :when (featurep! :feature evil) :after magit :config - (setq evil-magit-state 'normal)) + (setq evil-magit-state 'normal) + + ;; Switch to emacs state only while in `magit-blame-mode', then back when + ;; its done (since it's a minor-mode). + (add-hook! 'magit-blame-mode-hook + (evil-local-mode (if magit-blame-mode -1 +1)))) From c1d175349000ad17e0ee0f7696efef892c948ad1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 07:40:39 -0400 Subject: [PATCH 0951/4235] Provoke doom to init theme in daemon session --- core/core-ui.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 418458264..91fa82ffa 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -467,7 +467,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defvar doom-last-window-system window-system +(defvar doom-last-window-system (if (daemonp) 'daemon window-system) "The `window-system' of the last frame. If this doesn't match the current frame's window-system, the theme will be reloaded.") @@ -517,8 +517,7 @@ frame's window-system, the theme will be reloaded.") (add-hook 'doom-init-ui-hook #'doom|init-fonts) ;; themes (add-hook 'after-make-frame-functions #'doom|init-theme-in-frame) -(unless (daemonp) - (add-hook 'doom-init-ui-hook #'doom|init-theme)) +(add-hook 'doom-init-ui-hook #'doom|init-theme) ;; From 2ff7f4899414cc5608dc429c65a37c46f7892704 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 07:41:10 -0400 Subject: [PATCH 0952/4235] config/default: fix yasnippet TAB keybinds in tty emacs --- modules/config/default/+bindings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ebd85a5e5..1b772e441 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -656,7 +656,9 @@ [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map :ig "" yas-maybe-expand - :v "" #'yas-insert-snippet)) + :v "" #'yas-insert-snippet + :ig "TAB" yas-maybe-expand + :v "TAB" #'yas-insert-snippet)) ;; --- Major mode bindings -------------------------- From b98e26856d699c9d6a09cfe134754b2fc8cabd4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 08:04:54 -0400 Subject: [PATCH 0953/4235] Add tools/magit/autoload.el --- modules/tools/magit/autoload.el | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 modules/tools/magit/autoload.el diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el new file mode 100644 index 000000000..306ed61ee --- /dev/null +++ b/modules/tools/magit/autoload.el @@ -0,0 +1,8 @@ +;;; tools/magit/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +magit/quit (&optional _kill-buffer) + "TODO" + (interactive) + (magit-restore-window-configuration) + (mapc #'kill-buffer (doom-buffers-in-mode 'magit-mode (buffer-list) t))) From a47d76f5f190d77fa7bef51ca7173a26f746ab7f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 08:14:06 -0400 Subject: [PATCH 0954/4235] Don't error out if no targets for byte-compilation could be found --- core/core-packages.el | 82 +++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 1c8999f3b..f08790f65 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -797,47 +797,47 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." else if (file-exists-p target) collect target finally do (setq argv nil))) - (unless compile-targets - (error "No targets to compile")) - (condition-case ex - (let ((use-package-expand-minimally t)) - (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'string=)) - (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 (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (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)")))))))) + (if (not compile-targets) + (message "No targets to compile") + (condition-case ex + (let ((use-package-expand-minimally t)) + (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'string=)) + (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 (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (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 163d0ce70e9b8ba5c64c61cb3c033b503bfa0c4d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 09:35:39 -0400 Subject: [PATCH 0955/4235] tools/magit: don't kill processes --- modules/tools/magit/autoload.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 306ed61ee..8a9ea405f 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -5,4 +5,6 @@ "TODO" (interactive) (magit-restore-window-configuration) - (mapc #'kill-buffer (doom-buffers-in-mode 'magit-mode (buffer-list) t))) + (cl-loop for buf in (doom-buffers-in-mode 'magit-mode (buffer-list) t) + unless (eq (buffer-local-value 'major-mode buf) 'magit-process-mode) + do (kill-buffer buf))) From 8c486d741e19b833fcd6d021109b3d22c5fa1d50 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 18:01:34 -0400 Subject: [PATCH 0956/4235] app/email: fix mu4e-maildirs-extension --- modules/app/email/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index ee404bb1c..5c91850d9 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -146,11 +146,9 @@ default/fallback account." (def-package! mu4e-maildirs-extension :after mu4e :config - (mu4e-maildirs-extension-load) + (mu4e-maildirs-extension) (setq mu4e-maildirs-extension-title nil ;; mu4e-maildirs-extension-ignored-regex "^*~*" - mu4e-maildirs-extension-buffer-name "*Mail*" - mu4e-maildirs-extension-insert-before-str "\n\t[c] Compose a message" mu4e-maildirs-extension-action-text "\t[g] Update mail and index\n" mu4e-maildirs-extension-maildir-expanded-prefix "-" mu4e-maildirs-extension-maildir-default-prefix "|")) From f0c46e593053932fc6be3bff2500807f44707883 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Apr 2018 18:22:13 -0400 Subject: [PATCH 0957/4235] app/email: disable obsolete html2text package --- modules/app/email/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 5c91850d9..e690f7a78 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -50,6 +50,7 @@ default/fallback account." (def-package! mu4e :commands (mu4e mu4e-compose-new) :init + (provide 'html2text) ; disable obsolete package (setq mu4e-maildir "~/.mail" mu4e-attachment-dir "~/.mail/.attachments" mu4e-user-mail-address-list nil) From 33ad8ba4a4b697f4e45c632bbd01062d7702a6e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Apr 2018 02:26:19 -0400 Subject: [PATCH 0958/4235] lang/web: reformat whitespace in keybinds --- modules/lang/web/+html.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 8920a94b5..7e3b07cf9 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -40,7 +40,6 @@ :desc "Previous" :n "p" #'web-mode-block-previous :desc "Select" :n "s" #'web-mode-block-select) - (:desc "dom" :prefix "d" :desc "Replace apostrophes" :n "a" #'web-mode-dom-apostrophes-replace :desc "Show errors" :n "d" #'web-mode-dom-errors-show @@ -78,7 +77,7 @@ :desc "Next" :n "n" #'web-mode-tag-next :desc "Previous" :n "p" #'web-mode-tag-previous :desc "Select" :n "s" #'web-mode-tag-select)) - + "M-/" #'web-mode-comment-or-uncomment :i "SPC" #'self-insert-command :n "M-r" #'doom/web-refresh-browser From 904c997e9f143abff014dda0f314e4306b2bc679 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Apr 2018 02:27:31 -0400 Subject: [PATCH 0959/4235] Add modeline layout to format function docstring --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index 91fa82ffa..3e278d926 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -113,6 +113,7 @@ Example: (rhs-forms (doom--prepare-modeline-segments rhs))) `(progn (defun ,sym () + ,(concat "Modeline:\n" (format " %s\n %s" lhs rhs)) (let ((lhs (list ,@lhs-forms)) (rhs (list ,@rhs-forms))) (let ((rhs-str (format-mode-line rhs))) From 1aa50b8364e5f5ecef6673bfd3224c7c7c14a9ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Apr 2018 02:28:42 -0400 Subject: [PATCH 0960/4235] Error if doom-package-outdated-p cannot discern package's version --- core/autoload/packages.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 469c71185..b434e44c5 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -99,8 +99,9 @@ list of the package." (let ((desc (cadr (assq name package-archive-contents)))) (when (package-desc-p desc) (package-desc-version desc))))))) - (when (and (listp old-version) (listp new-version) - (version-list-< old-version new-version)) + (unless (and (listp old-version) (listp new-version)) + (error "Couldn't get version for %s" name)) + (when (version-list-< old-version new-version) (list name old-version new-version))))) ;;;###autoload From 225dfde40f113da0505466f848ace1910a40cafd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Apr 2018 02:29:14 -0400 Subject: [PATCH 0961/4235] Initialize all package metadata on doom-get-missing-packages --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index b434e44c5..9d567b26a 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -239,7 +239,7 @@ If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. Used by `doom//packages-install'." - (doom-initialize-packages 'internal) + (doom-initialize-packages t) (cl-loop for desc in (doom-get-packages) for (name . plist) = desc if (and (or include-ignored-p From ca9957b6d814c2eeabd33a715667da5d955612d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Apr 2018 02:34:48 -0400 Subject: [PATCH 0962/4235] Write short instructional comment in init.example.el --- init.example.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 7ebd2be18..1120cd66f 100644 --- a/init.example.el +++ b/init.example.el @@ -1,4 +1,5 @@ -;;; init.example.el -*- lexical-binding: t; -*- +;;; init.el -*- lexical-binding: t; -*- +;; Copy me to ~/.doom.d/init.el or ~/.config/doom/init.el, then edit me! (doom! :feature (popup ; tame sudden yet inevitable temporary windows From b2b603240f645d93f3f58008f0613e128621c506 Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Thu, 5 Apr 2018 17:05:11 +0800 Subject: [PATCH 0963/4235] fix workspace switch-left cycle. --- modules/feature/workspaces/autoload/workspaces.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8550ad07e..35d615ccb 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -361,7 +361,7 @@ end of the workspace list." (index (cl-position current-name persps))) (when (= perspc 1) (user-error "No other workspaces")) - (+workspace/switch-to (% (+ index n) perspc)) + (+workspace/switch-to (% (+ index n perspc) perspc)) (unless (called-interactively-p 'interactive) (+workspace/display))) ('user-error (+workspace-error (cadr ex) t)) From b7577f1e26492fd00464ff98204e6094b6bcb5af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Apr 2018 17:28:30 -0400 Subject: [PATCH 0964/4235] lang/org: fix org-shifttab only toggling current fold --- modules/lang/org/autoload/org.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 4b3f60909..423c3f404 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -334,13 +334,14 @@ wrong places)." "Toggle the local fold at the point (as opposed to cycling through all levels with `org-cycle')." (interactive) - (save-excursion - (org-beginning-of-line) - (cond ((org-at-heading-p) - (outline-toggle-children) - (unless (outline-invisible-p (line-end-position)) - (org-cycle-hide-drawers 'subtree)) - t) - ((org-in-src-block-p) - (org-babel-remove-result) - t)))) + (unless (eq this-command 'org-shifttab) + (save-excursion + (org-beginning-of-line) + (cond ((org-at-heading-p) + (outline-toggle-children) + (unless (outline-invisible-p (line-end-position)) + (org-cycle-hide-drawers 'subtree)) + t) + ((org-in-src-block-p) + (org-babel-remove-result) + t))))) From b476cda182b29f7c8915f7bb7971b249d52926a7 Mon Sep 17 00:00:00 2001 From: Paul Schoenfelder Date: Thu, 29 Mar 2018 16:18:57 -0500 Subject: [PATCH 0965/4235] Provide erlang language support --- init.example.el | 1 + modules/lang/erlang/config.el | 29 +++++++++++++++++++++++++++++ modules/lang/erlang/packages.el | 13 +++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 modules/lang/erlang/config.el create mode 100644 modules/lang/erlang/packages.el diff --git a/init.example.el b/init.example.el index 200b8211a..7140bfab0 100644 --- a/init.example.el +++ b/init.example.el @@ -93,6 +93,7 @@ clojure ; java with a lisp csharp ; unity, .NET, and mono shenanigans data ; config/data formats + ;erlang ; an elegant language for a more civilized age elixir ; erlang done right elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses diff --git a/modules/lang/erlang/config.el b/modules/lang/erlang/config.el new file mode 100644 index 000000000..8a180d37a --- /dev/null +++ b/modules/lang/erlang/config.el @@ -0,0 +1,29 @@ +;;; private/erlang/config.el -*- lexical-binding: t; -*- + +(def-package! erlang + ;; customizations + :mode "\\.erlang$" + ;; rebar files + :mode "/rebar\\.config\\(?:\\.script\\)?$" + ;; erlang configs + :mode "/\\(?:app\\|sys\\)\\.config$") + +(def-package! flycheck-rebar3 + :when (featurep! :feature syntax-checker) + :after erlang + :config + (flycheck-rebar3-setup)) + +;; Completion via Ivy +(def-package! ivy-erlang-complete + :when (featurep! :completion ivy) + :hook (erlang-mode . ivy-erlang-complete-init) + :config + (add-hook! 'erlang-mode-hook + (add-hook 'after-save-hook #'ivy-erlang-complete-reparse nil t))) + + +;; Completion via Company +(def-package! company-erlang + :when (featurep! :completion company) + :hook (erlang-mode . company-erlang-init)) diff --git a/modules/lang/erlang/packages.el b/modules/lang/erlang/packages.el new file mode 100644 index 000000000..79e5b8f65 --- /dev/null +++ b/modules/lang/erlang/packages.el @@ -0,0 +1,13 @@ +;; -*- no-byte-compile: t; -*- +;;; private/erlang/packages.el + +(package! erlang) + +(when (featurep! :feature syntax-checker) + (package! flycheck-rebar3)) + +(when (featurep! :completion ivy) + (package! ivy-erlang-complete)) + +(when (featurep! :completion company) + (package! company-erlang)) From 80e94ac91f1f9f851497b8756b738035e6e50af1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Apr 2018 19:35:20 -0400 Subject: [PATCH 0966/4235] lang/cc: reindent line on { #510 --- 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 173941c99..99cde4032 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -103,7 +103,7 @@ compilation database is present in the project.") ;; custom bindings. We'll do this ourselves. (setq c-tab-always-indent nil c-electric-flag nil) - (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) + (dolist (key '("#" "}" "/" "*" ";" "," ":" "(" ")" "\177")) (define-key c-mode-base-map key nil)) ;; Smartparens and cc-mode both try to autoclose angle-brackets intelligently. ;; The result isn't very intelligent (causes redundant characters), so just do From 9e89c06cf48b6efab2030df286990683abbeeddc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Apr 2018 19:46:26 -0400 Subject: [PATCH 0967/4235] Revert "completion/helm: fix void-function with-helm-buffer error" This reverts commit 0739e8cd0a84ddaaf13ab4e74c0f42001219c233. Fixes #512 --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 6725c05e1..092932939 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -62,7 +62,7 @@ (defun +helm*hide-minibuffer-maybe () "Hide minibuffer in Helm session if we use the header line as input field." - (when (buffer-local-value 'helm-echo-input-in-header-line (helm-buffer-get)) + (when (with-helm-buffer helm-echo-input-in-header-line) (let ((ov (make-overlay (point-min) (point-max) nil nil t))) (overlay-put ov 'window (selected-window)) (overlay-put ov 'face From b050c141292aaa7e0d9d5f3349051ea9a4010154 Mon Sep 17 00:00:00 2001 From: scturtle Date: Sun, 8 Apr 2018 15:28:56 +0800 Subject: [PATCH 0968/4235] Fix "z o". --- modules/feature/evil/autoload/folds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index ac61e8e94..99daa6466 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -52,7 +52,7 @@ (interactive) (if (+evil--vimish-fold-p) (vimish-fold-unfold) - (+evil-from-eol (hs-hide-block)))) + (+evil-from-eol (hs-show-block)))) ;;;###autoload (autoload '+evil:fold-close "feature/evil/autoload/folds" nil t) (evil-define-command +evil:fold-close () From 484cba1b1b5098b8e7df836527a6a6f57e8b1a7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 7 Apr 2018 23:03:18 -0400 Subject: [PATCH 0969/4235] feature/workspaces: unselect side-windows when switching workspaces #499 --- modules/feature/workspaces/config.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 8a886d133..72731e51a 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -113,6 +113,15 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; On `doom/cleanup-session', delete buffers associated with no perspectives (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) + (defun +workspaces|select-non-side-window (&rest _) + "Ensure a side window isn't current when switching workspaces." + (when (window-parameter nil 'window-side) + (select-window + (cl-loop for win in (window-list) + unless (window-parameter win 'window-side) + return win)))) + (add-hook 'persp-before-deactivate-functions #'+workspaces|select-non-side-window) + ;; per-frame workspaces (setq persp-init-frame-behaviour t persp-init-new-frame-behaviour-override nil From ee921f581dc21c1e24dbe18500616da542ae891a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 8 Apr 2018 17:49:32 -0400 Subject: [PATCH 0970/4235] config/default: bind q = quit-window in helpful-mode-map --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 1b772e441..acbb4f060 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -677,6 +677,7 @@ (:map* (help-mode-map helpful-mode-map) :n "o" #'ace-link-help + :n "q" #'quit-window :n "Q" #'ivy-resume :n "]l" #'forward-button :n "[l" #'backward-button) From 460461ef543f4169478aa12f20a31f5a3b53aeff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 8 Apr 2018 20:44:35 -0400 Subject: [PATCH 0971/4235] tools/magit: clean up after magit more intelligently #506 Ensures magit buffers are cleaned up after magit-status is closed. Will defer cleanup on process buffers, until the processes have finished. Also fixes issue where quitting magit will leave leftover windows. --- modules/lang/org/autoload/org.el | 3 +++ modules/tools/magit/autoload.el | 22 +++++++++++++++++----- modules/tools/magit/config.el | 6 +++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 423c3f404..d5676668b 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -345,3 +345,6 @@ with `org-cycle')." ((org-in-src-block-p) (org-babel-remove-result) t))))) + +;;;###autoload +(defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 8a9ea405f..a3fc5edf7 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -2,9 +2,21 @@ ;;;###autoload (defun +magit/quit (&optional _kill-buffer) - "TODO" + "Clean up magit buffers after quitting `magit-status'." (interactive) - (magit-restore-window-configuration) - (cl-loop for buf in (doom-buffers-in-mode 'magit-mode (buffer-list) t) - unless (eq (buffer-local-value 'major-mode buf) 'magit-process-mode) - do (kill-buffer buf))) + (let ((buffers (magit-mode-get-buffers))) + (magit-restore-window-configuration) + (mapc #'+magit--kill-buffer buffers))) + +(defun +magit--kill-buffer (buf) + "TODO" + (when (and (bufferp buf) (buffer-live-p buf)) + (let ((process (get-buffer-process buf))) + (if (not (processp process)) + (kill-buffer buf) + (with-current-buffer buf + (if (process-live-p process) + (run-with-timer 5 nil #'+magit--kill buf) + (kill-process process) + (kill-buffer buf))))))) + diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index f020ee602..99b2c5025 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -11,11 +11,11 @@ #'magit-builtin-completing-read) magit-revision-show-gravatars '("^Author: " . "^Commit: ")) - (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) + ;; no mode-line in magit popups + (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) ;; Clean up after magit by properly killing buffers - (setq magit-bury-buffer-function #'+magit/quit) - (map! :map magit-mode-map [remap quit-window] #'+magit/quit)) + (map! :map magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) (def-package! magit-blame From fc0cfa0c53db34c2b4990b23b4c5d4287d4a2687 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sun, 8 Apr 2018 18:00:41 -0700 Subject: [PATCH 0972/4235] Fix :leader DEL binding for +nav-flash/blink-cursor --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index acbb4f060..e221aa286 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -86,7 +86,7 @@ :desc "Browse files" :n "." #'find-file :desc "Toggle last popup" :n "~" #'+popup/toggle :desc "Eval expression" :n "`" #'eval-expression - :desc "Blink cursor line" :n "DEL" #'+doom/blink-cursor + :desc "Blink cursor line" :n "DEL" #'+nav-flash/blink-cursor :desc "Jump to bookmark" :n "RET" #'bookmark-jump ;; C-u is used by evil From d7e054a8cc60897b6a145bd1af5457961ee10a1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 8 Apr 2018 22:21:20 -0400 Subject: [PATCH 0973/4235] lang/org: alias sh => ob-shell --- modules/lang/org/+babel.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 816f661ea..4a140b3a4 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -6,6 +6,7 @@ '(("cpp" . C) ("C++" . C) ("D" . C) + ("sh" . shell) ("matlab" . octave)) "An alist that maps languages to babel libraries. This is necessary for babel libraries (ob-*.el) that don't match the name of the language.") From a961d58746e1645e0d7d75280119c2468cf2f79c Mon Sep 17 00:00:00 2001 From: Ryan Phillips Date: Mon, 9 Apr 2018 11:42:01 -0500 Subject: [PATCH 0974/4235] add workspace rename binding --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e221aa286..bedfab59d 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -135,6 +135,7 @@ :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 "Rename workspace" :n "r" #'+workspace/rename :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)) From ea7663d4ea26c296a36ca56db35e709773dcd2b2 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 11 Apr 2018 12:31:33 +0200 Subject: [PATCH 0975/4235] EIN module to work with Jupyter notebooks --- init.example.el | 1 + modules/tools/ein/README.org | 39 +++++++++++++++++++++++++++++++++++ modules/tools/ein/autoload.el | 26 +++++++++++++++++++++++ modules/tools/ein/config.el | 38 ++++++++++++++++++++++++++++++++++ modules/tools/ein/packages.el | 4 ++++ 5 files changed, 108 insertions(+) create mode 100644 modules/tools/ein/README.org create mode 100644 modules/tools/ein/autoload.el create mode 100644 modules/tools/ein/config.el create mode 100644 modules/tools/ein/packages.el diff --git a/init.example.el b/init.example.el index ad85c66ce..e6a24f692 100644 --- a/init.example.el +++ b/init.example.el @@ -41,6 +41,7 @@ :tools dired ; making dired pretty [functional] + ein ; tame Jupyter notebooks with emacs electric-indent ; smarter, keyword-based electric-indent eshell ; a consistent, cross-platform shell (WIP) gist ; interacting with github gists diff --git a/modules/tools/ein/README.org b/modules/tools/ein/README.org new file mode 100644 index 000000000..bd54c8474 --- /dev/null +++ b/modules/tools/ein/README.org @@ -0,0 +1,39 @@ +#+TITLE: :tools ein + +* EIN -- Emacs IPython Notebook + +Tool to work with Jupyter notebooks within emacs. + +* Table of Contents :TOC: +- [[EIN -- Emacs IPython Notebook][EIN -- Emacs IPython Notebook]] +- [[Install][Install]] +- [[Usage][Usage]] +- [[Configuration][Configuration]] + +* Install +Add =:tool ein= to your ~doom!~ call in your private ~init.el~. + +* Usage +Three functions are available to start EIN: + 1. ~ein:jupyter-server-start~ --- Start a jupyter server within emacs + 2. ~ein:notebooklist-login~ --- Login to an existing jupyter server + 3. ~ein:notebooklist-open~ --- Open the list of jupyter notebooks + +These functions do not have default key bindings. + +When ~ein:jupyter-server-start~ is called, after successfully finishing, +~ein:notebooklist-login~ and ~ein:notebooklist-open~ will be automatically +called. + +When in the ~Notebook List~ buffer, the key ~o~ calls ~ace-link~ to speed up the +process of selecting links in the buffer. + +If ~company-mode~ is enabled as a module, ~company-ein~ will be used for +completion purposes. + +* Configuration +Specify the default directory where EIN searches for notebooks using: + +~(set! :ein-notebook-dir "~/my-notebooks")~ + + diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el new file mode 100644 index 000000000..d30f5119e --- /dev/null +++ b/modules/tools/ein/autoload.el @@ -0,0 +1,26 @@ +;;; tools/ein/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +ein/ace-link-ein () + "Ace jump to links in ein notebooklist." + (interactive) + (let ((res (avy-with +ein/ace-link-ein + (avy--process + (+ein--collect-ein-buffer-links) + #'avy--overlay-pre)))) + ;(avy--style-fn avy-style))))) + (when (numberp res) + (goto-char (1+ res)) + (widget-button-press (point))))) + +;;;###autoload +(defun +ein--collect-ein-buffer-links () + (interactive) + (let ((end (window-end)) + points) + (save-excursion + (goto-char (window-start)) + (while (re-search-forward "~?/.+\\|\s\\[" end t) + (push (+ (match-beginning 0) 1) points)) + (nreverse points)))) + diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el new file mode 100644 index 000000000..273358a29 --- /dev/null +++ b/modules/tools/ein/config.el @@ -0,0 +1,38 @@ +;;; tools/ein/config.el -*- lexical-binding: t; -*- + +(defvar +ein-notebook-dir "~/" + "Default directory from where Jupyter notebooks are to be opened.") + +(def-setting! :ein-notebook-dir (dir) + "Set the default directory from where to open Jupyter notebooks." + `(setq +ein-notebook-dir ,dir)) + + +(def-package! ein + :commands (ein:notebooklist-open ein:notebooklist-login ein:jupyter-server-start) + :init + (set! :popup "\\*ein:*" :ignore) + (set! :popup "\\*ein:notebooklist *" '((side . left)) '((size . 40) (select))) + ;; Ace-link on notebook list buffers + (add-hook! 'ein:notebooklist-mode-hook + (map! :map ein:notebooklist-mode-map + "o" #'+ein/ace-link-ein)) + ;; Ein uses request to store http cookies. Store them in the cache dir. + (setq request-storage-directory (concat doom-cache-dir "/request")) + ;; Auto complete with company + (set! :company-backend '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) + 'ein:company-backend) + :config + ;; Manually load the autoloads of EIN. This takes time... + (load "ein-loaddefs.el" nil t t) + (setq + ;; Slide images into rows so that we can navigate buffers with images more easily + ein:slice-image t + ein:jupyter-default-notebook-directory +ein-notebook-dir + ein:jupyter-default-server-command "/usr/bin/jupyter" + ein:jupyter-server-args '("--no-browser") + ein:notebook-modes + '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode)) + ;; Avy is required for showing links in the notebook list with ace-link. + (require 'avy)) + diff --git a/modules/tools/ein/packages.el b/modules/tools/ein/packages.el new file mode 100644 index 000000000..19ab85d38 --- /dev/null +++ b/modules/tools/ein/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/ein/packages.el + +(package! ein) From 0a23c30e061c395db3c1314c9382f463d7c9e0db Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 11 Apr 2018 13:02:58 +0200 Subject: [PATCH 0976/4235] Make PDF tools and LaTeX work better together. Update the README file to reflect the available flags. --- modules/lang/latex/README.org | 58 +++++++++++++++++++++++++---------- modules/lang/latex/config.el | 22 +++++++++---- modules/tools/pdf/config.el | 17 ---------- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/modules/lang/latex/README.org b/modules/lang/latex/README.org index 620669f40..7bdc815e7 100644 --- a/modules/lang/latex/README.org +++ b/modules/lang/latex/README.org @@ -26,28 +26,54 @@ Set these variables in your private configuration with: #+END_SRC If the variables are not set, they are ignored. +** Choose View Program +You have four options to choose from for the viewer of your PDF rendered files. +*** Okular +Use Okular as default PDF viewer. + +Activate with the flag '+okular' of the latex module in your private init.el. +#+BEGIN_SRC emacs_lisp +(latex +okular) +#+END_SRC + +*** Skim +For Mac users. Use Skim to preview your PDFs. + +Activate with the flag '+skim' of the latex module in your private init.el. +#+BEGIN_SRC emacs_lisp +(latex +skim) +#+END_SRC + +*** PDF Tools +Use the PDF Tools package to preview your PDFs. Requires the tools module ~pdf~ enabled in your configuration. +#+BEGIN_SRC emacs_lisp +(:tools pdf) +#+END_SRC + +Activate with the flag '+pdf-tools' of the latex module in your private init.el. +#+BEGIN_SRC emacs_lisp +(latex +pdf-tools=) +#+END_SRC + +*** Preview Pane +You may wish to use the old school package ~latex-preview-pane~ instead of the +other alternatives. ~latex-preview-pane~ uses a ~DocView~ instead. + +Activate with the flag '+preview-pane' of the latex module in your private init.el. +#+BEGIN_SRC emacs_lisp +(latex +preview-pane) +#+END_SRC + ** LatexMk -Use LatexMk instead of normal LaTeX to compile documents. LatexMk only needs to run once to get all references, bibliography and other things right. +Use LatexMk instead of normal LaTeX to compile documents. LatexMk only needs to +run once to get all references, bibliography and other things right. Activate with the flag '+latexmk' of the latex module in init.el. #+BEGIN_SRC emacs_lisp (latex +latexmk) #+END_SRC -** Okular -Use Okular as default PDF viewer. - -Activate with the flag '+okular' of the latex module in init.el. +You can enable both a custom view program and LatexMk with a call such as: #+BEGIN_SRC emacs_lisp -(latex +okular) -#+END_SRC - -** Preivew-Pane -Instead of using an external program to display rendered .tex files, use an emacs window to display the rendered file. - -This flag is incompatible with the ~+okular~ flag. - -Activate with the flag '+preview-pane' of the latex module in init.el. -#+BEGIN_SRC emacs_lisp -(latex +preview-pane) +(latex +latexmk +okular) #+END_SRC diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index f0a85e9d0..61b877c43 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -103,21 +103,31 @@ LaTeX-indent-environment-list)))) (after! latex - ;; Use Okular is the user says so. + ;; Use Okular if the user says so. (when (featurep! +okular) ;; Configure Okular as viewer. Including a bug fix ;; (https://bugs.kde.org/show_bug.cgi?id=373855) (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) (add-to-list 'TeX-view-program-selection - '(output-pdf "Okular")))) + '(output-pdf "Okular"))) -(after! latex + ;; Or Skim (when (featurep! +skim) (add-to-list 'TeX-view-program-list '("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) (add-to-list 'TeX-view-program-selection - '(output-pdf "Skim")))) + '(output-pdf "Skim"))) + + ;; Or PDF-tools, but only if the module is also loaded + (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) + (add-to-list 'TeX-view-program-list + '("PDF Tools" ("TeX-pdf-tools-sync-view"))) + (add-to-list 'TeX-view-program-selection + '(output-pdf "PDF Tools")) + ;; Enable auto reverting the PDF document with PDF Tools + (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) + (def-package! preview @@ -136,6 +146,8 @@ reftex-toc-split-windows-fraction 0.3) (unless (string-empty-p +latex-bibtex-file) (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) + (add-hook! (latex-mode LaTeX-mode) #'turn-on-reftex) + :config ;; Get ReTeX working with biblatex ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 (setq reftex-cite-format @@ -146,8 +158,6 @@ (?f . "\\footcite[]{%l}") (?n . "\\nocite{%l}") (?b . "\\blockcquote[]{%l}{}"))) - (add-hook! (latex-mode LaTeX-mode) #'turn-on-reftex) - :config (map! :map reftex-mode-map :localleader :n ";" 'reftex-toc) (add-hook! 'reftex-toc-mode-hook diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 55eb60b70..ee11260f1 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -12,20 +12,3 @@ (setq-default pdf-view-display-size 'fit-page) ;; turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0))) - - -(when (featurep! :lang latex) - (after! latex - ;; add to the program list - (add-to-list 'TeX-view-program-selection - '(output-pdf "PDF Tools")) - (add-to-list 'TeX-view-program-list - '("PDF Tools" ("TeX-pdf-tools-sync-view"))) - - ;; enable document revert - (add-hook 'TeX-after-compilation-finished-functions - #'TeX-revert-document-buffer) - - ;; correlated mode - (setq TeX-source-correlate-start-server t - TeX-source-correlate-mode t))) From 717f6e3cfe40472d5a818eff9b9c7542386d5dbb Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 11 Apr 2018 13:03:59 +0200 Subject: [PATCH 0977/4235] Sneak in some more nice-to-have LaTeX fontifications. --- modules/lang/latex/+fontification.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/latex/+fontification.el b/modules/lang/latex/+fontification.el index fa853e726..627931543 100644 --- a/modules/lang/latex/+fontification.el +++ b/modules/lang/latex/+fontification.el @@ -8,6 +8,8 @@ ("addbibresource" "[{") ;; Standard commands ("cite" "[{") + ("citep" "[{") + ("citet" "[{") ("Cite" "[{") ("parencite" "[{") ("Parencite" "[{") From 8917bc9194481b6d25011715c92fba1b568d243b Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Thu, 12 Apr 2018 00:41:38 +0200 Subject: [PATCH 0978/4235] Fix: tools/magit: +magit--kill-buffer function call corrected --- modules/tools/magit/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index a3fc5edf7..c99088050 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -16,7 +16,7 @@ (kill-buffer buf) (with-current-buffer buf (if (process-live-p process) - (run-with-timer 5 nil #'+magit--kill buf) + (run-with-timer 5 nil #'+magit--kill-buffer buf) (kill-process process) (kill-buffer buf))))))) From 22d99c9321776f606dcfd33a51773a271756ebc9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Apr 2018 06:11:40 -0400 Subject: [PATCH 0979/4235] config/default: remove conflicting term keybind --- modules/config/default/+bindings.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index bedfab59d..a41f654d9 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -254,8 +254,7 @@ :desc "Neotree" :n "n" #'+neotree/open :desc "Neotree: on this file" :n "N" #'+neotree/find-this-file :desc "Imenu sidebar" :nv "i" #'imenu-list-minor-mode - :desc "Terminal" :n "t" #'+term/open-popup - :desc "Terminal in project" :n "T" #'+term/open-popup-in-project + :desc "Terminal" :n "t" #'+term/open-popup-in-project ;; applications :desc "APP: elfeed" :n "E" #'=rss From 94138a686b0e7acd7b80ef562dc5e0c2d14c4b41 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Apr 2018 06:12:03 -0400 Subject: [PATCH 0980/4235] tools/term: change +term/open-popup* universal-arg behavior + +term/open-popup: opens a term in default-directory. If ARG, opens term in project root. + +term/open-popup-in-project: opens term in project root. If ARG, opens term in default-directory. --- modules/tools/term/autoload.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/tools/term/autoload.el b/modules/tools/term/autoload.el index 34ae5a5e1..bb4391650 100644 --- a/modules/tools/term/autoload.el +++ b/modules/tools/term/autoload.el @@ -9,19 +9,21 @@ non-nil, cd into the current project's root." (call-interactively #'multi-term))) ;;;###autoload -(defun +term/open-popup (&optional project-root) - "Open a terminal popup window. If PROJECT-ROOT (C-u) is non-nil, cd into the -current project's root." +(defun +term/open-popup (arg) + "Open a terminal popup window. If ARG (universal argument) is +non-nil, cd into the current project's root." (interactive "P") (require 'multi-term) - (let ((default-directory (if project-root (doom-project-root 'nocache) default-directory)) + (let ((default-directory (if arg (doom-project-root 'nocache) default-directory)) (buffer (multi-term-get-buffer current-prefix-arg))) (pop-to-buffer buffer) (setq multi-term-buffer-list (nconc multi-term-buffer-list (list buffer))) (multi-term-internal))) ;;;###autoload -(defun +term/open-popup-in-project () - "Open a terminal popup window in the root of the current project." - (interactive) - (+term/open-popup t)) +(defun +term/open-popup-in-project (arg) + "Open a terminal popup window in the root of the current project. + +If ARG (universal argument) is non-nil, open it in `default-directory' instead." + (interactive "P") + (+term/open-popup (not arg))) From 18f576dd6654a17a9484d15eb40877d9f8d40e77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Apr 2018 16:39:25 -0400 Subject: [PATCH 0981/4235] config/default: imenu-list-minor-mode => imenu-list-smart-toggle --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a41f654d9..590f12776 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -253,7 +253,7 @@ :v "r" #'+eval:repl :desc "Neotree" :n "n" #'+neotree/open :desc "Neotree: on this file" :n "N" #'+neotree/find-this-file - :desc "Imenu sidebar" :nv "i" #'imenu-list-minor-mode + :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle :desc "Terminal" :n "t" #'+term/open-popup-in-project ;; applications From 12fd06d4e6f679237e4c61b13fedfdfbe3fc6e8a Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 12 Apr 2018 16:03:48 +0200 Subject: [PATCH 0982/4235] Uncluttered custom modeline to show page numbers Add rules to handle windows that should not be considered as popups. --- modules/tools/pdf/+modeline.el | 10 ++++++++++ modules/tools/pdf/config.el | 16 ++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 modules/tools/pdf/+modeline.el diff --git a/modules/tools/pdf/+modeline.el b/modules/tools/pdf/+modeline.el new file mode 100644 index 000000000..eb0acb7bd --- /dev/null +++ b/modules/tools/pdf/+modeline.el @@ -0,0 +1,10 @@ +;;; tools/pdf/+modeline.el -*- lexical-binding: t; -*- + + +(def-modeline-segment! +pdf-tools-pages + "Current and total page indicator for PDF documents." + (format " P %d/%d" (pdf-view-current-page) (pdf-cache-number-of-pages))) + +(def-modeline! pdf-tools-modeline + (bar matches " " buffer-info +pdf-tools-pages) + (major-mode vcs)) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index ee11260f1..c0fcabf3d 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -9,6 +9,18 @@ (map! :map pdf-view-mode-map "q" #'kill-this-buffer) + ;; Fit pages to screen by default (setq-default pdf-view-display-size 'fit-page) - ;; turn off cua so copy works - (add-hook! 'pdf-view-mode-hook (cua-mode 0))) + ;; Turn off cua so copy works + (add-hook! 'pdf-view-mode-hook (cua-mode 0)) + ;; Custom modeline that removes useless info and adds page numbers + (when (featurep! :ui doom-modeline) + (load! +modeline) + (add-hook! pdf-tools-enabled (doom-set-modeline 'pdf-tools-modeline))) + ;; Handle PDF-tools related popups better + (set! :popup "^\\*Outline*" '((side . right) (size . 40)) '((select))) + ;; TODO: Add additional important windows that should be handled differently + ;; TODO: These two next rules don't work (they should), investigate + ;; (set! :popup "\\*Contents\\*" '((side . right) (size . 40)) nil) + ;; (set! :popup "* annots\\*$" '((side . left) (size . 40)) '((select))) + ) From a616f00670598770d10a9dd5180b3fb926d591de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Apr 2018 16:34:51 -0400 Subject: [PATCH 0983/4235] Fix wrong-type-argument stringp error from doom doctor --- bin/doom-doctor | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 0124afc5c..9788f29e9 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -126,13 +126,15 @@ " brew install emacs --with-modules --with-imagemagick --with-cocoa")))) (section! "test-private-config") -(let ((xdg-dir (concat (or (abbreviate-file-name (getenv "XDG_CONFIG_HOME")) +(let ((xdg-dir (concat (or (getenv "XDG_CONFIG_HOME") "~/.config") "/doom/")) (doom-dir "~/.doom.d/")) (when (and (file-directory-p xdg-dir) (file-directory-p doom-dir)) - (warn! "Detected two private configs, in %s and %s" xdg-dir doom-dir) + (warn! "Detected two private configs, in %s and %s" + (abbreviate-file-name xdg-dir) + doom-dir) (explain! "The second directory will be ignored, as it has lower precedence."))) From ccc0f9b7f39710e784f32f0a011ec58ef552dc8a Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Fri, 13 Apr 2018 10:10:14 +0100 Subject: [PATCH 0984/4235] Henrik doesn't maintain my Docker images --- modules/feature/file-templates/templates/dockerfile-mode/__ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/file-templates/templates/dockerfile-mode/__ b/modules/feature/file-templates/templates/dockerfile-mode/__ index 0bd4b7a1a..9d1f81ed9 100644 --- a/modules/feature/file-templates/templates/dockerfile-mode/__ +++ b/modules/feature/file-templates/templates/dockerfile-mode/__ @@ -1,4 +1,4 @@ FROM ${1:phusion/baseimage:latest} -MAINTAINER ${2:Henrik Lissner } +MAINTAINER ${2:`user-full-name` <`user-mail-address`>} $0 \ No newline at end of file From daa798acfd10b6213fe60fee9d2a05cf84b79698 Mon Sep 17 00:00:00 2001 From: "Hinckley, Troy J" Date: Sat, 14 Apr 2018 17:46:51 -0700 Subject: [PATCH 0985/4235] don't use HTTPS when INSECURE variable is set --- core/core-packages.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index f08790f65..e03eaba50 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -96,9 +96,13 @@ missing) and shouldn't be deleted.") package-user-dir (expand-file-name "elpa" doom-packages-dir) package-enable-at-startup nil package-archives - '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "https://orgmode.org/elpa/")) + (if (getenv "INSECURE") + '(("gnu" . "http://elpa.gnu.org/packages/") + ("melpa" . "http://melpa.org/packages/") + ("org" . "http://orgmode.org/elpa/")) + '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("org" . "https://orgmode.org/elpa/"))) ;; I omit Marmalade because its packages are manually submitted rather ;; than pulled, so packages are often out of date with upstream. From 793b94a937660579b6954ebf45ab829af3743524 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Sun, 15 Apr 2018 22:18:34 -0500 Subject: [PATCH 0986/4235] Update config.el Fix doom leader not working in pdf mode. Replaces SPC default that moves the document down a page. --- modules/tools/pdf/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 55eb60b70..d60c64ae4 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -6,8 +6,9 @@ :config (unless noninteractive (pdf-tools-install)) - - (map! :map pdf-view-mode-map "q" #'kill-this-buffer) + + (map! (:map (pdf-view-mode-map) + :n doom-leader-key nil)) (setq-default pdf-view-display-size 'fit-page) ;; turn off cua so copy works From b8c0491245891c2bfe15821288f4323556ebe1c6 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Mon, 16 Apr 2018 09:56:32 -0500 Subject: [PATCH 0987/4235] Update config.el Fixed the error of removing the `q` keybinding. --- modules/tools/pdf/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index d60c64ae4..5904d395b 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -8,6 +8,7 @@ (pdf-tools-install)) (map! (:map (pdf-view-mode-map) + :n "q" #'kill-this-buffer :n doom-leader-key nil)) (setq-default pdf-view-display-size 'fit-page) From 21909a83e116bfb5db27797d660cbeed0f54997c Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Tue, 17 Apr 2018 12:22:47 +0100 Subject: [PATCH 0988/4235] Add missing buffer name to kill confirmation --- 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 3e278d926..89568bd20 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -597,7 +597,8 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ((doom-real-buffer-p buf) (if (and buffer-file-name (buffer-modified-p buf) - (not (y-or-n-p "Buffer %s is modified; kill anyway?"))) + (not (y-or-n-p + (format "Buffer %s is modified; kill anyway?" buf)))) (message "Aborted") (set-buffer-modified-p nil) (when (or ;; if there aren't more real buffers than visible buffers, From 5025c40eaee26bf57f221d3bf8d83fadcc13cd0b Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Tue, 17 Apr 2018 22:26:20 -0500 Subject: [PATCH 0989/4235] Update config.el Final version --- modules/tools/pdf/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 5904d395b..3e7115f39 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -7,10 +7,10 @@ (unless noninteractive (pdf-tools-install)) - (map! (:map (pdf-view-mode-map) - :n "q" #'kill-this-buffer - :n doom-leader-key nil)) - +(map! :map pdf-view-mode-map + "q" #'kill-this-buffer + doom-leader-key nil) + (setq-default pdf-view-display-size 'fit-page) ;; turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0))) From c4e176092e29c23750ec04a6d489ab90b7e11367 Mon Sep 17 00:00:00 2001 From: Yutian Li Date: Tue, 17 Apr 2018 20:58:28 -0700 Subject: [PATCH 0990/4235] [develop] Fix links. --- modules/ui/doom-modeline/README.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-modeline/README.org b/modules/ui/doom-modeline/README.org index fcb8f4685..28590ef8f 100644 --- a/modules/ui/doom-modeline/README.org +++ b/modules/ui/doom-modeline/README.org @@ -37,8 +37,8 @@ Some might want my modeline without the DOOM config altogether. I've tried to ma + Replace ~def-package!~ calls with ~use-package~. + Replace ~doom-project-root~ calls with ~projectile-project-root~. + The ~+doom-modeline--make-xpm~ function is memoized with the ~def-memoized!~ macro. Change ~def-memoized!~ to ~defun~. -+ Copy the ~add-hook!~ macro definition from [[/master/core/core-lib.el][core/core-lib.el]]. -+ Copy the following macros and functions from [[/master/core/core-ui.el][core/core-ui.el]]: ++ Copy the ~add-hook!~ macro definition from [[/core/core-lib.el][core/core-lib.el]]. ++ Copy the following macros and functions from [[/core/core-ui.el][core/core-ui.el]]: + ~def-modeline-segment!~ + ~def-modeline!~ + ~doom--prepare-modeline-segments~ From 5dea4a858e1ccf5145a68982fb2a311aee7f52ea Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Wed, 18 Apr 2018 12:05:02 +0800 Subject: [PATCH 0991/4235] Fix: ein popup rules --- modules/tools/ein/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 273358a29..2a80e2e26 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -11,8 +11,11 @@ (def-package! ein :commands (ein:notebooklist-open ein:notebooklist-login ein:jupyter-server-start) :init - (set! :popup "\\*ein:*" :ignore) - (set! :popup "\\*ein:notebooklist *" '((side . left)) '((size . 40) (select))) + (push (lambda (buf) (string-match-p "^\\*ein: .*" (buffer-name buf))) + doom-real-buffer-functions) + (set! :popup "\\*ein: .*" :ignore) + (set! :popup "\\*ein:tb .*" '((side . bottom) (size . 0.3)) '((quit . t) (transient) (select))) + (set! :popup "\\*ein:notebooklist *" '((side . left) (size . 50)) '((select))) ;; Ace-link on notebook list buffers (add-hook! 'ein:notebooklist-mode-hook (map! :map ein:notebooklist-mode-map From 1a329abc26dc0836401967a071d047962ab25ff5 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Wed, 18 Apr 2018 12:05:31 +0800 Subject: [PATCH 0992/4235] Add: +ein/hydra --- modules/tools/ein/config.el | 47 +++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 2a80e2e26..418fcb189 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -37,5 +37,48 @@ ein:notebook-modes '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode)) ;; Avy is required for showing links in the notebook list with ace-link. - (require 'avy)) - + (require 'avy) + ;; add hydra + (def-hydra! +ein/hydra (:hint t :color red) + " + Operations on Cells^^^^^^ Other + ----------------------------^^^^^^ ----------------------------------^^^^ + [_k_/_j_]^^ select prev/next [_t_]^^ toggle output + [_K_/_J_]^^ move up/down [_C-l_/_C-S-l_] clear/clear all output + [_C-k_/_C-j_]^^ merge above/below [_C-o_]^^ open console + [_O_/_o_]^^ insert above/below [_C-s_/_C-r_] save/rename notebook + [_y_/_p_/_d_] copy/paste [_x_]^^ close notebook + [_u_]^^^^ change type [_q_]^^ quit + [_RET_]^^^^ execute +" + ("q" nil :exit t) + ("h" ein:notebook-worksheet-open-prev-or-last) + ("j" ein:worksheet-goto-next-input) + ("k" ein:worksheet-goto-prev-input) + ("l" ein:notebook-worksheet-open-next-or-first) + ("H" ein:notebook-worksheet-move-prev) + ("J" ein:worksheet-move-cell-down) + ("K" ein:worksheet-move-cell-up) + ("L" ein:notebook-worksheet-move-next) + ("t" ein:worksheet-toggle-output) + ("d" ein:worksheet-kill-cell) + ("R" ein:worksheet-rename-sheet) + ("y" ein:worksheet-copy-cell) + ("p" ein:worksheet-yank-cell) + ("o" ein:worksheet-insert-cell-below) + ("O" ein:worksheet-insert-cell-above) + ("u" ein:worksheet-change-cell-type) + ("RET" ein:worksheet-execute-cell-and-goto-next) + ;; Output + ("C-l" ein:worksheet-clear-output) + ("C-S-l" ein:worksheet-clear-all-output) + ;;Console + ("C-o" ein:console-open :exit t) + ;; Merge and split cells + ("C-k" ein:worksheet-merge-cell) + ("C-j" spacemacs/ein:worksheet-merge-cell-next) + ("s" ein:worksheet-split-cell-at-point) + ;; Notebook + ("C-s" ein:notebook-save-notebook-command) + ("C-r" ein:notebook-rename-command) + ("x" ein:notebook-close :exit t))) From ae80c06067b86047133bec1a71ba53769182fd7d Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Wed, 18 Apr 2018 12:06:02 +0800 Subject: [PATCH 0993/4235] Fix: company config and default setting of ein:jupyter-default-server-command --- modules/tools/ein/config.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 418fcb189..d7a15057f 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -23,16 +23,21 @@ ;; Ein uses request to store http cookies. Store them in the cache dir. (setq request-storage-directory (concat doom-cache-dir "/request")) ;; Auto complete with company - (set! :company-backend '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) + (if (featurep 'company) + (setq ein:completion-backend 'ein:use-company-backend)) + (set! :company-backend + '(ein:notebook-multilang-mode + ein:notebook-python-mode + ein:notebook-plain-mode) 'ein:company-backend) :config ;; Manually load the autoloads of EIN. This takes time... (load "ein-loaddefs.el" nil t t) (setq - ;; Slide images into rows so that we can navigate buffers with images more easily + ;; Slice images into rows so that we can navigate buffers with images more easily ein:slice-image t ein:jupyter-default-notebook-directory +ein-notebook-dir - ein:jupyter-default-server-command "/usr/bin/jupyter" + ein:jupyter-default-server-command "jupyter" ein:jupyter-server-args '("--no-browser") ein:notebook-modes '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode)) From 04d80fba9d9972155e84784d7e998767a6e0f7ca Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Wed, 18 Apr 2018 12:11:52 +0800 Subject: [PATCH 0994/4235] Fix: make company config more doom-ish --- modules/tools/ein/config.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index d7a15057f..5633bf690 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -23,13 +23,14 @@ ;; Ein uses request to store http cookies. Store them in the cache dir. (setq request-storage-directory (concat doom-cache-dir "/request")) ;; Auto complete with company - (if (featurep 'company) - (setq ein:completion-backend 'ein:use-company-backend)) - (set! :company-backend - '(ein:notebook-multilang-mode - ein:notebook-python-mode - ein:notebook-plain-mode) - 'ein:company-backend) + (when (featurep! :completion company) + (setq ein:completion-backend 'ein:use-company-backend) + (set! :company-backend + '(ein:notebook-multilang-mode + ein:notebook-python-mode + ein:notebook-plain-mode) + 'ein:company-backend)) + :config ;; Manually load the autoloads of EIN. This takes time... (load "ein-loaddefs.el" nil t t) From b8fd35a85589cec9ad1c6aea81bc6c539c7ea44f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Apr 2018 19:39:56 -0400 Subject: [PATCH 0995/4235] feature/evil: fix inclusivity of evil-matchit #519 --- modules/feature/evil/autoload/evil.el | 1 + modules/feature/evil/config.el | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index abad747f4..f2be7d76f 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -307,3 +307,4 @@ more information on modifiers." (regexp-quote (string-trim-left (car match)))) path file-name t t 1)))) (replace-regexp-in-string regexp "\\1" file-name t))) + diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7d0a0523d..456e67243 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -264,12 +264,14 @@ (def-package! evil-matchit - :commands (evilmi-jump-items evilmi-text-object global-evil-matchit-mode) + :commands (evilmi-jump-items global-evil-matchit-mode + evilmi-outer-text-object evilmi-inner-text-object) :config (global-evil-matchit-mode 1) :init (map! [remap evil-jump-item] #'evilmi-jump-items - :textobj "%" #'evilmi-text-object #'evilmi-text-object) + :textobj "%" #'evilmi-inner-text-object #'evilmi-outer-text-object) :config + (evil-set-command-properties 'evilmi-jump-items :type 'inclusive :jump t) (defun +evil|simple-matchit () "A hook to force evil-matchit to favor simple bracket jumping. Helpful when the new algorithm is confusing, like in python or ruby." From 4fc990127c5c4230829c4dd647954ac78ef49db9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Apr 2018 19:55:30 -0400 Subject: [PATCH 0996/4235] Silence byte-compiler warnings from plugins --- core/core-packages.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e03eaba50..9c7d926d4 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -186,10 +186,11 @@ FORCE-P is non-nil, do it anyway. (require 'package) (setq package-activated-list nil package--initialized nil) - (condition-case _ (package-initialize) - ('error (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize))) + (let (byte-compile-warnings) + (condition-case _ (package-initialize) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize)))) ;; Ensure core packages are installed. (let ((core-packages (cl-remove-if #'package-installed-p doom-core-packages))) (when core-packages @@ -269,7 +270,8 @@ them." (setq load-path doom-site-load-path) (require 'package) (setq package-activated-list nil) - (package-initialize)) + (let (byte-compile-warnings) + (package-initialize))) ;; `quelpa-cache' (when (or force-p (not (bound-and-true-p quelpa-cache))) From dbd6982e0652ac22be763352ccacd12d9acf4633 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Apr 2018 21:27:11 -0400 Subject: [PATCH 0997/4235] ui/doom-dashboard: don't open dashboard over files via emacsclient #523 --- modules/ui/doom-dashboard/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index da9c96d5f..26c0e4a0d 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -5,4 +5,4 @@ "Switch to the dashboard in the current window, of the current FRAME." (interactive (list (selected-frame))) (with-selected-frame frame - (switch-to-buffer (doom-fallback-buffer)))) + (switch-to-buffer (+doom-dashboard-initial-buffer)))) From ba24073a075a7ce4f153c1dc7d33582ac04b7b56 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 01:07:11 -0400 Subject: [PATCH 0998/4235] app/email: replace existing contexts instead of shadowing them #528 --- modules/app/email/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index e690f7a78..8814d6752 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -28,6 +28,9 @@ default/fallback account." (let ((account-vars ,letvars)) (when-let* ((address (cdr (assq 'user-mail-address account-vars)))) (cl-pushnew address mu4e-user-mail-address-list :test #'equal)) + (setq mu4e-contexts + (cl-delete-if (lambda (c) (string= (mu4e-context-name c) ,label)) + mu4e-contexts)) (let ((context (make-mu4e-context :name ,label :enter-func (lambda () (mu4e-message "Switched to %s" ,label)) @@ -39,8 +42,8 @@ default/fallback account." (mu4e-message-field msg :maildir)))) :vars ,letvars))) (push context mu4e-contexts) - ,(when default-p - `(setq-default mu4e-context-current context)))))) + ,(if default-p `(setq-default mu4e-context-current context)) + context)))) ;; From b3260f6a9ecb134da4ff5409a40e7de5e52fad7a Mon Sep 17 00:00:00 2001 From: Carter Charbonneau Date: Mon, 16 Apr 2018 07:16:44 -0600 Subject: [PATCH 0999/4235] enable which-key's evil support --- core/core-keybinds.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index d39210169..ac3ed5ba7 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -52,7 +52,9 @@ If any hook returns non-nil, all hooks after it are ignored.") which-key-add-column-padding 1 which-key-max-display-columns nil which-key-min-display-lines 5 - which-key-side-window-slot -10) + which-key-side-window-slot -10 + which-key-allow-evil-operators t + which-key-show-operator-state-maps t) ;; embolden local bindings (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) From 8af94e873103089a409565501a8606e203af499d Mon Sep 17 00:00:00 2001 From: taylor Date: Wed, 18 Apr 2018 17:26:50 +0000 Subject: [PATCH 1000/4235] [*] Removes tern in favor of tide, adds node modules to path to execute things like flow, prettier, etc --- modules/lang/javascript/autoload.el | 28 ++++++++++++++++++++++++++++ modules/lang/javascript/config.el | 18 +++--------------- modules/lang/javascript/packages.el | 4 ++-- 3 files changed, 33 insertions(+), 17 deletions(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index cfc42d65c..25cce6614 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -74,3 +74,31 @@ Run this for any buffer you want to skewer." (if skewer-css-mode (skewer-css-mode -1)) (if skewer-html-mode (skewer-html-mode -1))))) +;;;###autoload +(defun add-node-modules-path () + "Search the current buffer's parent directories for `node_modules/.bin`. +If it's found, then add it to the `exec-path'." +(defvar add-node-modules-path-debug nil) + (interactive) + (let* ((root (locate-dominating-file + (or (buffer-file-name) default-directory) + "node_modules")) + (path (and root + (expand-file-name "node_modules/.bin/" root)))) + (if root + (progn + (make-local-variable 'exec-path) + (add-to-list 'exec-path path) + (when add-node-modules-path-debug + (message (concat "added " path " to exec-path")))) + (when add-node-modules-path-debug + (message (concat "node_modules not found in " root)))))) + +;;;###autoload +(defun set-up-tide-mode () + (interactive) + (tide-setup) + (if company-mode (push 'company-tide company-backends)) + (eldoc-mode +1) + (tide-hl-identifier-mode +1) + ) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 7a9dbe7f1..a72d8cd7d 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -11,7 +11,7 @@ js2-mode-show-parse-errors nil js2-mode-show-strict-warnings nil) - (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (add-hook! 'js2-mode-hook #'(flycheck-mode set-up-tide-mode add-node-modules-path rainbow-delimiters-mode)) (set! :repl 'js2-mode #'+javascript/repl) (set! :electric 'js2-mode :chars '(?\} ?\) ?.)) @@ -95,20 +95,6 @@ ("Reformat buffer (eslint_d)" :exec eslintd-fix :region nil :when (fboundp 'eslintd-fix))) :prompt "Refactor: ")) - -(def-package! tern - :hook (js2-mode . tern-mode) - :config - (advice-add #'tern-project-dir :override #'doom-project-root)) - - -(def-package! company-tern - :when (featurep! :completion company) - :after tern - :config - (set! :company-backend 'js2-mode '(company-tern))) - - (def-package! rjsx-mode :commands rjsx-mode :mode "\\.jsx$" @@ -132,6 +118,8 @@ "<" nil "C-d" nil) (add-hook! rjsx-mode + + #'(flycheck-mode set-up-tide-mode add-node-modules-path rainbow-delimiters-mode) ;; jshint doesn't really know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers))) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 22358eb9a..646f897b3 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -8,13 +8,13 @@ (package! js2-refactor) (package! rjsx-mode) (package! nodejs-repl) -(package! tern) (package! web-beautify) +(package! tide) (package! skewer-mode) (package! eslintd-fix) (when (featurep! :completion company) - (package! company-tern)) + (package! company-tide)) (when (featurep! :feature lookup) (package! xref-js2)) From cc5bfc6dc09eb43eeeb3ce06b0839bc7c28da1f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:04:49 -0400 Subject: [PATCH 1001/4235] lang/javascript: conform to naming conventions; refactor tide config --- modules/lang/javascript/autoload.el | 36 ++++++++++------------------- modules/lang/javascript/config.el | 14 ++++++++++- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 25cce6614..25dbc801d 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -75,30 +75,18 @@ Run this for any buffer you want to skewer." (if skewer-html-mode (skewer-html-mode -1))))) ;;;###autoload -(defun add-node-modules-path () +(defun +javascript|add-node-modules-path () "Search the current buffer's parent directories for `node_modules/.bin`. If it's found, then add it to the `exec-path'." -(defvar add-node-modules-path-debug nil) (interactive) - (let* ((root (locate-dominating-file - (or (buffer-file-name) default-directory) - "node_modules")) - (path (and root - (expand-file-name "node_modules/.bin/" root)))) - (if root - (progn - (make-local-variable 'exec-path) - (add-to-list 'exec-path path) - (when add-node-modules-path-debug - (message (concat "added " path " to exec-path")))) - (when add-node-modules-path-debug - (message (concat "node_modules not found in " root)))))) - -;;;###autoload -(defun set-up-tide-mode () - (interactive) - (tide-setup) - (if company-mode (push 'company-tide company-backends)) - (eldoc-mode +1) - (tide-hl-identifier-mode +1) - ) + (if-let* ((root (locate-dominating-file + (or (buffer-file-name) default-directory) + "node_modules")) + (path (expand-file-name "node_modules/.bin/" root))) + (progn + (make-local-variable 'exec-path) + (cl-pushnew path exec-path :test #'string=) + (when doom-debug-mode + (message "Added %s to exec-path" path))) + (when doom-debug-mode + (message "node_modules not found in %s" root)))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index a72d8cd7d..69a261bce 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -11,7 +11,8 @@ js2-mode-show-parse-errors nil js2-mode-show-strict-warnings nil) - (add-hook! 'js2-mode-hook #'(flycheck-mode set-up-tide-mode add-node-modules-path rainbow-delimiters-mode)) + (add-hook! 'js2-mode-hook + #'(flycheck-mode rainbow-delimiters-mode +javascript|add-node-modules-path)) (set! :repl 'js2-mode #'+javascript/repl) (set! :electric 'js2-mode :chars '(?\} ?\) ?.)) @@ -45,6 +46,17 @@ :n "S" #'+javascript/skewer-this-buffer)) +(def-package! tide + :hook (js2-mode . tide-setup) + :config + (set! :company 'js2-mode 'company-tide) + (set! :lookup 'js2-mode + :definition #'tide-jump-to-definition + :references #'tide-references + :documentation #'tide-documentation-at-point) + (add-hook! 'tide-mode-hook #'(eldoc-mode tide-hl-identifier-mode))) + + ;; A find-{definition,references} backend for js2-mode. NOTE The xref API is ;; unstable and may break with an Emacs update. (def-package! xref-js2 From a1402ff68a86d96aa6718421ca0c56649253d5d9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:05:01 -0400 Subject: [PATCH 1002/4235] lang/javascript: remove company-tide package (doesn't exist) --- modules/lang/javascript/packages.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 646f897b3..5571459e6 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -13,9 +13,6 @@ (package! skewer-mode) (package! eslintd-fix) -(when (featurep! :completion company) - (package! company-tide)) - (when (featurep! :feature lookup) (package! xref-js2)) From 07bd70ff7f8d1c98080abea027ede3629dec768a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:05:44 -0400 Subject: [PATCH 1003/4235] lang/javascript: remove mention of tern in README --- modules/lang/javascript/README.org | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/modules/lang/javascript/README.org b/modules/lang/javascript/README.org index dfc55ebbe..e184bbb0e 100644 --- a/modules/lang/javascript/README.org +++ b/modules/lang/javascript/README.org @@ -2,7 +2,7 @@ This module adds Javascript support. -+ Code completion (tern) ++ Code completion (tide) + REPL support (nodejs-repl) + Refactoring commands (js2-refactor) + Syntax checking (flycheck) @@ -11,11 +11,10 @@ This module adds Javascript support. + Jump-to-definitions and references support (xref) * Table of Contents :TOC: -- [[#install][Install]] - - [[#node--npm][Node & NPM]] - - [[#dependencies][Dependencies]] -- [[#appendix][Appendix]] - - [[#commands][Commands]] +- [[Install][Install]] + - [[Node & NPM][Node & NPM]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] * Install ** Node & NPM @@ -31,13 +30,6 @@ brew install node sudo pacman --needed --noconfirm -S nodejs npm #+END_SRC -** Dependencies -This module optionally requires ~tern~ for code completion. - -#+BEGIN_SRC sh -npm -g install tern -#+END_SRC - * Appendix ** Commands | command | key / ex command | description | From c4396226dd5f6d9b4750a6faf5d275a775bcbc52 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:08:50 -0400 Subject: [PATCH 1004/4235] lang/javascript: remove eslint_d detection This is now left to the user's private config. --- modules/lang/javascript/config.el | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 69a261bce..d5204cc8c 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -9,7 +9,11 @@ js-chain-indent t ;; let flycheck handle this js2-mode-show-parse-errors nil - js2-mode-show-strict-warnings nil) + js2-mode-show-strict-warnings nil + ;; Flycheck provides these features, so disable them: + ;; conflicting with the eslint settings. + js2-strict-trailing-comma-warning nil + js2-strict-missing-semi-warning nil) (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode +javascript|add-node-modules-path)) @@ -27,19 +31,6 @@ ;; If it's available globally, use eslint_d (setq flycheck-javascript-eslint-executable (executable-find "eslint_d")) - (defun +javascript|init-flycheck-eslint () - "Favor local eslint over global installs and configure flycheck for eslint." - (when (derived-mode-p 'js-mode) - (when-let* ((exec-path (list (doom-project-expand "node_modules/.bin"))) - (eslint (executable-find "eslint"))) - (setq-local flycheck-javascript-eslint-executable eslint)) - (when (flycheck-find-checker-executable 'javascript-eslint) - ;; Flycheck has it's own trailing command and semicolon warning that was - ;; conflicting with the eslint settings. - (setq-local js2-strict-trailing-comma-warning nil) - (setq-local js2-strict-missing-semi-warning nil)))) - (add-hook 'flycheck-mode-hook #'+javascript|init-flycheck-eslint) - (map! :map js2-mode-map :localleader :nr "r" #'+javascript/refactor-menu From e54c9380234bc0de50ddcac3e281f5e2aef775bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:17:17 -0400 Subject: [PATCH 1005/4235] Merge lang/typescript into lang/javascript --- modules/lang/javascript/config.el | 28 ++++++++++++++++++--- modules/lang/typescript/config.el | 38 ----------------------------- modules/lang/typescript/packages.el | 6 ----- 3 files changed, 25 insertions(+), 47 deletions(-) delete mode 100644 modules/lang/typescript/config.el delete mode 100644 modules/lang/typescript/packages.el diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d5204cc8c..8c4c0898f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -37,15 +37,37 @@ :n "S" #'+javascript/skewer-this-buffer)) +(def-package! typescript-mode + :mode "\\.ts$" + :config + (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) + (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) + + (def-package! tide :hook (js2-mode . tide-setup) + :hook (typescript-mode . tide-setup) + :init + (defun +javascript|init-tide-in-web-mode () + (when (string= (file-name-extension (or buffer-file-name "")) "tsx") + (tide-setup))) + (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config - (set! :company 'js2-mode 'company-tide) - (set! :lookup 'js2-mode + (set! :company '(js2-mode typescript-mode) 'company-tide) + (set! :lookup '(js2-mode typescript-mode) :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) - (add-hook! 'tide-mode-hook #'(eldoc-mode tide-hl-identifier-mode))) + (add-hook! 'tide-mode-hook #'(eldoc-mode tide-hl-identifier-mode)) + + (def-menu! +javascript/refactor-menu + "TODO" + '(("rename symbol" :exec tide-rename-symbol) + ("restart tide server" :exec tide-restart-server))) + + (map! :map tide-mode-map + :localleader + :n "r" #'+javascript/refactor-menu)) ;; A find-{definition,references} backend for js2-mode. NOTE The xref API is diff --git a/modules/lang/typescript/config.el b/modules/lang/typescript/config.el deleted file mode 100644 index 566a2d925..000000000 --- a/modules/lang/typescript/config.el +++ /dev/null @@ -1,38 +0,0 @@ -;;; lang/typescript/config.el -*- lexical-binding: t; -*- - -(def-package! typescript-mode - :mode "\\.ts$" - :config - (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) - (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) - - -(def-package! tide - :hook (typescript-mode . tide-setup) - :init - (defun +typescript|init-tide-in-web-mode () - (when (string= (file-name-extension (or buffer-file-name "")) "tsx") - (tide-setup))) - (add-hook 'web-mode-hook #'+typescript|init-tide-in-web-mode) - :config - (set! :company-backend 'typescript-mode '(company-tide)) - (set! :lookup 'typescript-mode - :definition #'tide-jump-to-definition - :references #'tide-references - :documentation #'tide-documentation-at-point) - - (setq tide-format-options - '(:insertSpaceAfterFunctionKeywordForAnonymousFunctions t - :placeOpenBraceOnNewLineForFunctions nil)) - - (def-menu! +typescript/refactor-menu - "TODO" - '(("rename symbol" :exec tide-rename-symbol) - ("restart tide server" :exec tide-restart-server))) - - (map! :map tide-mode-map - :localleader - :n "r" #'+typescript/refactor-menu) - - (add-hook! 'tide-mode-hook #'(flycheck-mode eldoc-mode))) - diff --git a/modules/lang/typescript/packages.el b/modules/lang/typescript/packages.el deleted file mode 100644 index 41af79318..000000000 --- a/modules/lang/typescript/packages.el +++ /dev/null @@ -1,6 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; lang/typescript/packages.el - -(package! tide) -(package! typescript-mode) - From 604bbcd1d5cc9d623a6afa59fd7090b5b653fb2d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:21:43 -0400 Subject: [PATCH 1006/4235] ui/posframe: replace company-childframe with company-box --- modules/ui/posframe/config.el | 18 +++++++++++------- modules/ui/posframe/packages.el | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index de4a49895..2c42d5e65 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -7,15 +7,19 @@ (add-hook 'doom-escape-hook #'+posframe|delete-on-escape)) -(def-package! company-childframe - :when (featurep! :completion company) +(def-package! company-box :when EMACS26+ - :after company + :hook (company-mode . company-box-mode) :config - (setq company-childframe-notification nil) - (company-childframe-mode 1) - (after! desktop - (push '(company-childframe-mode . nil) desktop-minor-mode-table))) + (setq company-frontends (delq 'company-pseudo-tooltip-frontend company-frontends) + company-box-icons-elisp + (list (concat (all-the-icons-material "functions") " ") + (concat (all-the-icons-material "check_circle") " ") + (concat (all-the-icons-material "stars") " ") + (concat (all-the-icons-material "format_paint") " ")) + company-box-icons-unknown (concat (all-the-icons-material "find_in_page") " ") + company-box-backends-colors nil + company-box-icons-yasnippet (concat (all-the-icons-material "short_text") " "))) (def-package! ivy-posframe diff --git a/modules/ui/posframe/packages.el b/modules/ui/posframe/packages.el index b6045ed33..7d57cf40e 100644 --- a/modules/ui/posframe/packages.el +++ b/modules/ui/posframe/packages.el @@ -3,6 +3,6 @@ (when EMACS26+ (when (featurep! :completion company) - (package! company-childframe)) + (package! company-box)) (when (featurep! :completion ivy) (package! ivy-posframe))) From 148f0a6e34a984406ace72757705e0be9d287f89 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:22:23 -0400 Subject: [PATCH 1007/4235] completion/company: set variables sooner (easier to override) --- modules/completion/company/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 292570975..6ee5f2f67 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -25,7 +25,7 @@ MODES should be one major-mode symbol or a list of them." (def-package! company :commands (company-mode global-company-mode company-complete company-complete-common company-manual-begin company-grab-line) - :config + :init (setq company-idle-delay nil company-tooltip-limit 14 company-dabbrev-downcase nil @@ -37,6 +37,7 @@ MODES should be one major-mode symbol or a list of them." company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) company-backends '(company-capf company-dabbrev company-ispell company-yasnippet) company-transformers '(company-sort-by-occurrence)) + :config (global-company-mode +1)) (when (featurep! +auto) From dc33c72d19f284c28d007500c537895d6142a9ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:29:48 -0400 Subject: [PATCH 1008/4235] Refactor removal of default smartparens rules for certain modes --- modules/lang/elixir/config.el | 7 ++++--- modules/lang/latex/config.el | 8 ++------ modules/lang/lua/config.el | 6 ++++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 5ce920e70..b12b3426c 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -3,10 +3,11 @@ (def-package! elixir-mode :mode "\\.exs?$" :mode "\\.elixir2$" + :init + ;; sp's default elixir rules are obnoxious, so disable them + (provide 'smartparens-elixir) :config - ;; disable standard config; more disruptive than it needs to be - (map-delete sp-pairs 'elixir-mode) - ;; only complete the basics + ;; ...and only complete the basics (sp-with-modes 'elixir-mode (sp-local-pair "do" "end" :when '(("RET" "")) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 61b877c43..256723085 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -18,12 +18,8 @@ "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." `(setq +latex-bibtex-dir ,dir)) - -(after! smartparens-latex - (map-delete sp-pairs 'LaTeX-mode) - (map-delete sp-pairs 'latex-mode) - (map-delete sp-pairs 'tex-mode) - (map-delete sp-pairs 'plain-tex-mode)) +;; sp's default latex rules are obnoxious, so disable them +(provide 'smartparens-latex) ;; diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 7d0d206c8..9a2dece5a 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -3,14 +3,16 @@ (def-package! lua-mode :mode "\\.lua$" :interpreter "lua" + :init + ;; sp's default lua rules are obnoxious, so disable them. Use snippets + ;; instead! + (provide 'smartparens-lua) :config (add-hook 'lua-mode-hook #'flycheck-mode) (set! :lookup 'lua-mode :documentation 'lua-search-documentation) (set! :electric 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) - ;; sp's lua-specific rules are obnoxious, so we disable them - (map-delete sp-pairs 'lua-mode) (def-menu! +lua/build-menu "Build/compilation commands for `lua-mode' buffers." From d0ecf979562eee5deee6cd75152e8c2ab1182581 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:30:17 -0400 Subject: [PATCH 1009/4235] ui/posframe: use hook instead of :after --- modules/ui/posframe/config.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 2c42d5e65..92ef72d3b 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -23,9 +23,8 @@ (def-package! ivy-posframe - :when (featurep! :completion ivy) :when EMACS26+ - :after ivy + :hook (ivy-mode . ivy-posframe-enable) :preface ;; This function searches the entire `obarray' just to populate ;; `ivy-display-functions-props'. There are 15k entries in mine! This is @@ -49,8 +48,6 @@ (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) (push (cons fn nil) ivy-display-functions-alist)) - (ivy-posframe-enable) - (setq ivy-height 16 ivy-fixed-height-minibuffer nil ivy-posframe-parameters `((min-width . 90) From 279e523d6f0cbe0e1400e9146d98fe7b280e1b1c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:44:24 -0400 Subject: [PATCH 1010/4235] lang/javascript: add typescript-mode package --- modules/lang/javascript/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 5571459e6..b1292934d 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -10,6 +10,7 @@ (package! nodejs-repl) (package! web-beautify) (package! tide) +(package! typescript-mode) (package! skewer-mode) (package! eslintd-fix) From 2f43fc743ef6d27f2a0760b0e41adab52f4d9e94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 18:45:00 -0400 Subject: [PATCH 1011/4235] lang/javascript: alphabetize packages.el --- modules/lang/javascript/packages.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index b1292934d..36b72a23e 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -4,15 +4,15 @@ ;; requires node npm tern js-beautify eslint eslint-plugin-react (package! coffee-mode) +(package! eslintd-fix) (package! js2-mode) (package! js2-refactor) -(package! rjsx-mode) (package! nodejs-repl) -(package! web-beautify) +(package! rjsx-mode) +(package! skewer-mode) (package! tide) (package! typescript-mode) -(package! skewer-mode) -(package! eslintd-fix) +(package! web-beautify) (when (featurep! :feature lookup) (package! xref-js2)) From 61865d0646ba35dc47bee64538fd345aa9c1e42a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 19:41:50 -0400 Subject: [PATCH 1012/4235] ui/doom-dashboard: don't open dashboard over files (part 2) #523 --- 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 b1a47daf4..1f6c87934 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -117,7 +117,7 @@ Possible values: (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) - (when (daemonp) + (unless (daemonp) (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) ;; `persp-mode' integration: update `default-directory' when switching (add-hook 'persp-created-functions #'+doom-dashboard|record-project) From 1751c845594fe033f4b830f2a122b295a9cc6455 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Apr 2018 19:51:37 -0400 Subject: [PATCH 1013/4235] ui/doom-modeline: fix word count in evil line-wise selection #364 --- modules/ui/doom-modeline/config.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index d1c23c98b..3c78ddf5d 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -464,24 +464,26 @@ segment.") (def-modeline-segment! selection-info "Information about the current selection, such as how many characters and lines are selected, or the NxM dimensions of a block selection." - (when (and (active) (or mark-active (eq evil-state 'visual))) - (let ((reg-beg (region-beginning)) - (reg-end (region-end))) + (when (and mark-active (active)) + (cl-destructuring-bind (beg . end) + (if (eq evil-state 'visual) + (cons evil-visual-beginning evil-visual-end) + (cons (region-beginning) (region-end))) (propertize - (let ((lines (count-lines reg-beg (min (1+ reg-end) (point-max))))) + (let ((lines (count-lines beg (min (1+ end) (point-max))))) (concat (cond ((or (bound-and-true-p rectangle-mark-mode) (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column reg-end) - (doom-column reg-beg))))) + (let ((cols (abs (- (doom-column end) + (doom-column beg))))) (format "%dx%dB" lines cols))) ((eq 'line evil-visual-selection) (format "%dL" lines)) ((> lines 1) - (format "%dC %dL" (- (1+ reg-end) reg-beg) lines)) + (format "%dC %dL" (- (1+ end) beg) lines)) (t - (format "%dC" (- (1+ reg-end) reg-beg)))) + (format "%dC" (- (1+ end) beg)))) (when +doom-modeline-enable-word-count - (format " %dW" (count-words reg-beg reg-end))))) + (format " %dW" (count-words beg end))))) 'face 'doom-modeline-highlight)))) From 8625cb03b0bab055d4022cfde7e10651699c2405 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 00:50:35 -0400 Subject: [PATCH 1014/4235] lang/javascript: remove vestigial eslint_d support --- modules/lang/javascript/config.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 8c4c0898f..d78121ec7 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -28,9 +28,6 @@ (sp-with-modes '(js2-mode rjsx-mode) (sp-local-pair "/*" "*/" :post-handlers '(("| " "SPC")))) - ;; If it's available globally, use eslint_d - (setq flycheck-javascript-eslint-executable (executable-find "eslint_d")) - (map! :map js2-mode-map :localleader :nr "r" #'+javascript/refactor-menu From c156551dd148f5e366a4f714a6e08acd3582e841 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 00:50:47 -0400 Subject: [PATCH 1015/4235] lang/javascript: minor reformatting/comment revision --- modules/lang/javascript/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d78121ec7..dfd76e3ed 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -10,8 +10,8 @@ ;; let flycheck handle this js2-mode-show-parse-errors nil js2-mode-show-strict-warnings nil - ;; Flycheck provides these features, so disable them: - ;; conflicting with the eslint settings. + ;; Flycheck provides these features, so disable them: conflicting with + ;; the eslint settings. js2-strict-trailing-comma-warning nil js2-strict-missing-semi-warning nil) @@ -140,7 +140,6 @@ "<" nil "C-d" nil) (add-hook! rjsx-mode - #'(flycheck-mode set-up-tide-mode add-node-modules-path rainbow-delimiters-mode) ;; jshint doesn't really know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers))) From 185f47d2aad63a1b64a23e664f80ef54a8bb61a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 00:51:12 -0400 Subject: [PATCH 1016/4235] lang/javascript: disable tide-hl-identifier-mode by default --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index dfd76e3ed..440ca59c1 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -55,7 +55,7 @@ :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) - (add-hook! 'tide-mode-hook #'(eldoc-mode tide-hl-identifier-mode)) + (add-hook 'tide-mode-hook #'eldoc-mode) (def-menu! +javascript/refactor-menu "TODO" From 605c897d96f637eab9d0462fa7a7300f17c61df0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 00:51:51 -0400 Subject: [PATCH 1017/4235] lang/javascript: doom-project-root support & clean up processes for tide --- modules/lang/javascript/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 440ca59c1..2cc09073b 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -57,6 +57,13 @@ :documentation #'tide-documentation-at-point) (add-hook 'tide-mode-hook #'eldoc-mode) + ;; resolve to `doom-project-root' if `tide-project-root' fails + (advice-add #'tide-project-root :override #'+javascript*tide-project-root) + + ;; cleanup tsserver when no tide buffers are left + (add-hook! 'tide-mode-hook + (add-hook 'kill-buffer-hook #'+javascript|cleanup-tide-processes nil t)) + (def-menu! +javascript/refactor-menu "TODO" '(("rename symbol" :exec tide-rename-symbol) From 9e45ad670c507a8746f98456602f1ac09605f0d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 01:13:57 -0400 Subject: [PATCH 1018/4235] lang/javascript: add autoloaded cleanup & project-root functions Forgot to add this to 605c897d --- modules/lang/javascript/autoload.el | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 25dbc801d..ea6757c2a 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -78,7 +78,6 @@ Run this for any buffer you want to skewer." (defun +javascript|add-node-modules-path () "Search the current buffer's parent directories for `node_modules/.bin`. If it's found, then add it to the `exec-path'." - (interactive) (if-let* ((root (locate-dominating-file (or (buffer-file-name) default-directory) "node_modules")) @@ -90,3 +89,21 @@ If it's found, then add it to the `exec-path'." (message "Added %s to exec-path" path))) (when doom-debug-mode (message "node_modules not found in %s" root)))) + +;;;###autoload +(defun +javascript|cleanup-tide-processes () + "TODO" + (when tide-mode + (unless (cl-loop with root = (tide-project-root) + for buf in (delq (current-buffer) (buffer-list)) + if (buffer-local-value 'tide-mode buf) + collect buf) + (kill-process (tide-current-server))))) + +;;;###autoload +(defun +javascript*tide-project-root () + "Resolve to `doom-project-root' if `tide-project-root' fails." + (or tide-project-root + (or (locate-dominating-file default-directory "tsconfig.json") + (locate-dominating-file default-directory "jsconfig.json")) + (doom-project-root 'nocache))) From 718511b5e60ebd030b2a0c2f84438b29cac2ad62 Mon Sep 17 00:00:00 2001 From: Vladyslav M Date: Thu, 19 Apr 2018 09:33:47 +0300 Subject: [PATCH 1019/4235] remove mention of tern in comment --- modules/lang/javascript/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 36b72a23e..65e1ba8a0 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/javascript/packages.el -;; requires node npm tern js-beautify eslint eslint-plugin-react +;; requires node npm js-beautify eslint eslint-plugin-react (package! coffee-mode) (package! eslintd-fix) From 71192bf09aad3180a77e1079ccb5cc4d3e0685bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 03:45:08 -0400 Subject: [PATCH 1020/4235] lang/javascript: start tide in rjsx-mode buffers #540 --- modules/lang/javascript/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 2cc09073b..204a43989 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -43,6 +43,7 @@ (def-package! tide :hook (js2-mode . tide-setup) + :hook (rjsx-mode . tide-setup) :hook (typescript-mode . tide-setup) :init (defun +javascript|init-tide-in-web-mode () @@ -50,8 +51,8 @@ (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config - (set! :company '(js2-mode typescript-mode) 'company-tide) - (set! :lookup '(js2-mode typescript-mode) + (set! :company '(js2-mode rjsx-mode typescript-mode) 'company-tide) + (set! :lookup '(js2-mode rjsx-mode typescript-mode) :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) From eef89da87233d141cd114310c9298b9b81c89b64 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 03:57:11 -0400 Subject: [PATCH 1021/4235] lang/javascript: remove xref-js2 (superceded by tide) --- modules/lang/javascript/config.el | 7 ------- modules/lang/javascript/packages.el | 3 --- 2 files changed, 10 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 204a43989..b0f637883 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -75,13 +75,6 @@ :n "r" #'+javascript/refactor-menu)) -;; A find-{definition,references} backend for js2-mode. NOTE The xref API is -;; unstable and may break with an Emacs update. -(def-package! xref-js2 - :when (featurep! :feature lookup) - :commands xref-js2-xref-backend) - - (def-package! nodejs-repl :commands nodejs-repl) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 65e1ba8a0..befb573b0 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -14,6 +14,3 @@ (package! typescript-mode) (package! web-beautify) -(when (featurep! :feature lookup) - (package! xref-js2)) - From da7975feff1b2da54855f1e326e62d7db191d777 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 03:59:58 -0400 Subject: [PATCH 1022/4235] lang/javascript: fix +javascript/refactor-menu --- modules/lang/javascript/config.el | 55 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index b0f637883..3d980bf1d 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -65,33 +65,13 @@ (add-hook! 'tide-mode-hook (add-hook 'kill-buffer-hook #'+javascript|cleanup-tide-processes nil t)) - (def-menu! +javascript/refactor-menu - "TODO" - '(("rename symbol" :exec tide-rename-symbol) - ("restart tide server" :exec tide-restart-server))) - - (map! :map tide-mode-map - :localleader - :n "r" #'+javascript/refactor-menu)) - - -(def-package! nodejs-repl :commands nodejs-repl) - - -(def-package! js2-refactor - :commands - (js2r-extract-function js2r-extract-method js2r-introduce-parameter - js2r-localize-parameter js2r-expand-object js2r-contract-object - js2r-expand-function js2r-contract-function js2r-expand-array - js2r-contract-array js2r-wrap-buffer-in-iife js2r-inject-global-in-iife - js2r-add-to-globals-annotation js2r-extract-var js2r-inline-var - js2r-rename-var js2r-var-to-this js2r-arguments-to-object js2r-ternary-to-if - js2r-split-var-declaration js2r-split-string js2r-unwrap js2r-log-this - js2r-debug-this js2r-forward-slurp js2r-forward-barf) - :init (def-menu! +javascript/refactor-menu "Refactoring commands for `js2-mode' buffers." - '(("Extract into function" :exec js2r-extract-function :region t) + '(("Tide: restart server" :exec tide-restart-server :when (bound-and-true-p tide-mode)) + ("Tide: reformat buffer/region" :exec tide-reformat :when (bound-and-true-p tide-mode)) + ("Rename symbol" :exec tide-rename-symbol :when (bound-and-true-p tide-mode) :region nil) + ("Reformat buffer (eslint_d)" :exec eslintd-fix :when (bound-and-true-p eslintd-fix-mode) :region nil) + ("Extract into function" :exec js2r-extract-function :region t) ("Extract into method" :exec js2r-extract-method :region t) ("Introduce parameter to function" :exec js2r-introduce-parameter :region t) ("Localize parameter" :exec js2r-localize-parameter :region nil) @@ -114,9 +94,28 @@ ("Split string" :exec js2r-split-string :region nil) ("Unwrap" :exec js2r-unwrap :region t) ("Log this" :exec js2r-log-this) - ("Debug this" :exec js2r-debug-this) - ("Reformat buffer (eslint_d)" :exec eslintd-fix :region nil :when (fboundp 'eslintd-fix))) - :prompt "Refactor: ")) + ("Debug this" :exec js2r-debug-this)) + :prompt "Refactor: ") + + (map! :map tide-mode-map + :localleader + :n "r" #'+javascript/refactor-menu)) + + +(def-package! nodejs-repl :commands nodejs-repl) + + +(def-package! js2-refactor + :commands + (js2r-extract-function js2r-extract-method js2r-introduce-parameter + js2r-localize-parameter js2r-expand-object js2r-contract-object + js2r-expand-function js2r-contract-function js2r-expand-array + js2r-contract-array js2r-wrap-buffer-in-iife js2r-inject-global-in-iife + js2r-add-to-globals-annotation js2r-extract-var js2r-inline-var + js2r-rename-var js2r-var-to-this js2r-arguments-to-object js2r-ternary-to-if + js2r-split-var-declaration js2r-split-string js2r-unwrap js2r-log-this + js2r-debug-this js2r-forward-slurp js2r-forward-barf)) + (def-package! rjsx-mode :commands rjsx-mode From c08f6b25d97f1674f1d9eb18d822c206e2c0b98b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Apr 2018 04:01:50 -0400 Subject: [PATCH 1023/4235] lang/javascript: use correct hooks for jsx-mode #540 --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 3d980bf1d..7a5226f61 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -140,7 +140,7 @@ "<" nil "C-d" nil) (add-hook! rjsx-mode - #'(flycheck-mode set-up-tide-mode add-node-modules-path rainbow-delimiters-mode) + #'(flycheck-mode rainbow-delimiters-mode +javascript|add-node-modules-path) ;; jshint doesn't really know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers))) From 595d6215d2bbc9cbf60937ef08ecd62e7bb1cbd1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 20 Apr 2018 02:44:04 -0400 Subject: [PATCH 1024/4235] lang/javascript: general refactor + No need for some rjsx-mode hooks, when it is derived from js2-mode (thus, js2-mode hooks will run in rjsx-mode). + Reorganized package configs with major modes at the top. + Fix incorrect usage of add-hook! with three arguments for rjsx-mode. --- modules/lang/javascript/autoload.el | 19 +++++- modules/lang/javascript/config.el | 100 ++++++++++++---------------- 2 files changed, 60 insertions(+), 59 deletions(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index ea6757c2a..7e03d5749 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -31,6 +31,11 @@ ignore the cache." (assq packages deps)) (t (error "Expected a package symbol or list, got %s" packages)))))) + +;; +;; Commands +;; + ;;;###autoload (defun +javascript/repl () "Open a Javascript REPL. Meaning either `skewer-repl', if any of the @@ -39,8 +44,8 @@ skewer-*-mode's are enabled, or `nodejs-repl' otherwise." (call-interactively (if (and (featurep 'skewer-mode) (or skewer-mode skewer-css-mode skewer-html-mode)) - 'skewer-repl - 'nodejs-repl))) + #'skewer-repl + #'nodejs-repl))) ;;;###autoload (defun +javascript/skewer-this-buffer () @@ -74,6 +79,11 @@ Run this for any buffer you want to skewer." (if skewer-css-mode (skewer-css-mode -1)) (if skewer-html-mode (skewer-html-mode -1))))) + +;; +;; Hooks +;; + ;;;###autoload (defun +javascript|add-node-modules-path () "Search the current buffer's parent directories for `node_modules/.bin`. @@ -100,6 +110,11 @@ If it's found, then add it to the `exec-path'." collect buf) (kill-process (tide-current-server))))) + +;; +;; Advice +;; + ;;;###autoload (defun +javascript*tide-project-root () "Resolve to `doom-project-root' if `tide-project-root' fails." diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 7a5226f61..9793cb1b1 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -1,5 +1,9 @@ ;;; lang/javascript/config.el -*- lexical-binding: t; -*- +;; +;; Major modes +;; + (def-package! js2-mode :mode "\\.js$" :interpreter "node" @@ -15,12 +19,9 @@ js2-strict-trailing-comma-warning nil js2-strict-missing-semi-warning nil) - (add-hook! 'js2-mode-hook - #'(flycheck-mode rainbow-delimiters-mode +javascript|add-node-modules-path)) + (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :repl 'js2-mode #'+javascript/repl) (set! :electric 'js2-mode :chars '(?\} ?\) ?.)) - (set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend) ;; Conform switch-case indentation to js2 normal indent (defvaralias 'js-switch-indent-offset 'js2-basic-offset) @@ -30,7 +31,6 @@ (map! :map js2-mode-map :localleader - :nr "r" #'+javascript/refactor-menu :n "S" #'+javascript/skewer-this-buffer)) @@ -41,9 +41,38 @@ (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) +(def-package! rjsx-mode + :commands rjsx-mode + :mode "\\.jsx$" + :mode "components/.+\\.js$" + :init + (defun +javascript-jsx-file-p () + (and buffer-file-name + (string= (file-name-extension buffer-file-name) "js") + (re-search-forward "\\(^\\s-*import React\\|\\( from \\|require(\\)[\"']react\\)" + magic-mode-regexp-match-limit t) + (progn (goto-char (match-beginning 1)) + (not (sp-point-in-string-or-comment))))) + + (push (cons #'+javascript-jsx-file-p 'rjsx-mode) magic-mode-alist) + :config + (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) + (add-hook! 'rjsx-mode-hook + ;; jshint doesn't know how to deal with jsx + (push 'javascript-jshint flycheck-disabled-checkers))) + + +(def-package! coffee-mode + :mode "\\.coffee$" + :init (setq coffee-indent-like-python-mode t)) + + +;; +;; Tools +;; + (def-package! tide :hook (js2-mode . tide-setup) - :hook (rjsx-mode . tide-setup) :hook (typescript-mode . tide-setup) :init (defun +javascript|init-tide-in-web-mode () @@ -51,7 +80,7 @@ (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config - (set! :company '(js2-mode rjsx-mode typescript-mode) 'company-tide) + (set! :company '(js2-mode typescript-mode) 'company-tide) (set! :lookup '(js2-mode rjsx-mode typescript-mode) :definition #'tide-jump-to-definition :references #'tide-references @@ -102,7 +131,10 @@ :n "r" #'+javascript/refactor-menu)) -(def-package! nodejs-repl :commands nodejs-repl) +(def-package! nodejs-repl + :commands nodejs-repl + :init + (set! :repl 'js2-mode #'+javascript/repl)) (def-package! js2-refactor @@ -117,39 +149,6 @@ js2r-debug-this js2r-forward-slurp js2r-forward-barf)) -(def-package! rjsx-mode - :commands rjsx-mode - :mode "\\.jsx$" - :mode "components/.+\\.js$" - :init - (defun +javascript-jsx-file-p () - (and buffer-file-name - (equal (file-name-extension buffer-file-name) "js") - (re-search-forward "\\(^\\s-*import React\\|\\( from \\|require(\\)[\"']react\\)" - magic-mode-regexp-match-limit t) - (progn (goto-char (match-beginning 1)) - (not (sp-point-in-string-or-comment))))) - - (push (cons #'+javascript-jsx-file-p 'rjsx-mode) magic-mode-alist) - - :config - (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) - - ;; disable electric keys (I use snippets and `emmet-mode' instead) - (map! :map rjsx-mode-map - "<" nil - "C-d" nil) - (add-hook! rjsx-mode - #'(flycheck-mode rainbow-delimiters-mode +javascript|add-node-modules-path) - ;; jshint doesn't really know how to deal with jsx - (push 'javascript-jshint flycheck-disabled-checkers))) - - -(def-package! coffee-mode - :mode "\\.coffee$" - :init (setq coffee-indent-like-python-mode t)) - - (def-package! web-beautify :commands web-beautify-js :init @@ -160,10 +159,6 @@ :commands (eslintd-fix-mode eslintd-fix)) -;; -;; Skewer-mode -;; - (def-package! skewer-mode :commands (skewer-mode run-skewer) :config @@ -173,6 +168,7 @@ :n "se" #'skewer-eval-defun :n "sf" #'skewer-load-buffer)) + (def-package! skewer-css ; in skewer-mode :commands skewer-css-mode :config @@ -183,6 +179,7 @@ :n "sb" #'skewer-css-eval-buffer :n "sc" #'skewer-css-clear-all)) + (def-package! skewer-html ; in skewer-mode :commands skewer-html-mode :config @@ -207,16 +204,5 @@ (def-project-mode! +javascript-npm-mode :modes (html-mode css-mode web-mode js2-mode markdown-mode) :files "package.json" - :on-enter - (when (make-local-variable 'exec-path) - (push (doom-project-expand "node_modules/.bin") - exec-path))) - - -;; -;; Tools -;; - -(def-project-mode! +javascript-eslintd-fix-mode - :add-hooks (eslintd-fix-mode)) + :add-hooks (+javascript|add-node-modules-path)) From a9d70f808c8f8e79b9dfcb1b498e3ececed0a588 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 20 Apr 2018 02:46:33 -0400 Subject: [PATCH 1025/4235] lang/javascript: use eslint_d for syntax checking in eslintd-fix-mode --- modules/lang/javascript/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 9793cb1b1..750beaf79 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -156,7 +156,10 @@ (def-package! eslintd-fix - :commands (eslintd-fix-mode eslintd-fix)) + :commands (eslintd-fix-mode eslintd-fix) + :config + (add-hook! 'eslintd-fix-mode-hook + (setq flycheck-javascript-eslint-executable eslintd-fix-executable))) (def-package! skewer-mode From 581e1fc56c70808fe15c94fce8ad6044ea62d118 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 20 Apr 2018 02:46:45 -0400 Subject: [PATCH 1026/4235] lang/javascript: add autoload for skewer-repl --- modules/lang/javascript/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 750beaf79..61e095051 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -191,6 +191,10 @@ :n "se" #'skewer-html-eval-tag)) +(def-package! skewer-repl + :commands skewer-repl) + + ;; ;; Projects ;; From fb95ef62555fed3aaac1ce484c19da63aed62377 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 20 Apr 2018 02:47:31 -0400 Subject: [PATCH 1027/4235] config/default: remove nonexistent org keybinds #541 --- modules/config/default/+bindings.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 590f12776..273274a43 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -242,9 +242,7 @@ (: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 - :desc "Browse mode notes" :n "m" #'+org/browse-notes-for-major-mode - :desc "Browse project notes" :n "p" #'+org/browse-notes-for-project) + :desc "Org capture" :n "x" #'org-capture) (:desc "open" :prefix "o" :desc "Default browser" :n "b" #'browse-url-of-file From adb3fdbdce332c96e855ced95d8d1e4296fadd0d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 20 Apr 2018 04:14:30 -0400 Subject: [PATCH 1028/4235] tools/make: make +make/run more robust; add +make/run-last #543 --- modules/tools/make/autoload.el | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/modules/tools/make/autoload.el b/modules/tools/make/autoload.el index ce8de9d3a..b921ed3aa 100644 --- a/modules/tools/make/autoload.el +++ b/modules/tools/make/autoload.el @@ -1,14 +1,25 @@ ;;; tools/make/autoload.el -*- lexical-binding: t; -*- +(require 'makefile-executor) + ;;;###autoload (defun +make/run () - "Run a make task in the current project." + "Run a make task in the current project. If multiple makefiles are available, +you'll be prompted to select one." (interactive) - (require 'makefile-executor) - (let* ((buffer-file (or buffer-file-name default-directory)) - (makefile-dir (locate-dominating-file buffer-file "Makefile"))) - (unless makefile-dir - (user-error "No makefile found in this project.")) - (let ((default-directory makefile-dir)) - (makefile-executor-execute-target - (expand-file-name "Makefile"))))) + (if (doom-project-p 'nocache) + (makefile-executor-execute-project-target) + (let ((makefile (cl-loop with buffer-file = (or buffer-file-name default-directory) + for file in (list "Makefile" "makefile") + if (locate-dominating-file buffer-file file) + return file))) + (unless makefile + (user-error "Cannot find a makefile in the current project")) + (let ((default-directory (file-name-directory makefile))) + (makefile-executor-execute-target makefile))))) + +;;;###autoload +(defun +make/run-last () + "TODO" + (interactive) + (makefile-executor-execute-last nil)) From 8c4176cf8b80d6a9cafcf5b565e8c361e8e50313 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Apr 2018 02:02:20 -0400 Subject: [PATCH 1029/4235] lang/org: remove parse-raw from org-pandoc-options #544 --- modules/lang/org/+export.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index 5b3b1637c..8097283e4 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -13,8 +13,7 @@ (push 'pandoc org-export-backends) (setq org-pandoc-options '((standalone . t) - (mathjax . t) - (parse-raw . t)))) + (mathjax . t)))) ;; (defun +org|init-export () From cb8f12c7da1c32569a85822130ad7964ce4e3db6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Apr 2018 06:17:55 -0400 Subject: [PATCH 1030/4235] feature/syntax-checker: flycheck buffer upon leaving insert mode --- modules/feature/syntax-checker/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 210ab7e6f..2bb95189b 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -17,9 +17,11 @@ (ignore-errors (flycheck-buffer)) nil)) (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) + (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer) - ;; With the option of flychecking the buffer on escape, so we don't need - ;; auto-flychecking on idle-change: + ;; With the option of flychecking the buffer on escape or leaving insert + ;; mode, we don't need auto-flychecking on idle-change (which can feel slow, + ;; esp on computers without SSDs). (delq 'idle-change flycheck-check-syntax-automatically))) From 39836fc15da51e9bdb5c426f1a0ce6dfb8d93106 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Apr 2018 21:03:20 -0400 Subject: [PATCH 1031/4235] feature/workspace: disable autosave on manual autosave +workspace/save-session without a name = autosaves the current session. Doing so now disables autosaving on kill-emacs, otherwise your autosave would be overwritten when closing Emacs. --- modules/feature/workspaces/autoload/workspaces.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 35d615ccb..8e97cd836 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -140,12 +140,11 @@ Returns t on success, nil otherwise." "Save a whole session as NAME. If NAME is nil, use `persp-auto-save-fname'. Return t on success, nil otherwise." (let ((fname (expand-file-name (or name persp-auto-save-fname) - persp-save-dir)) - (persp-auto-save-opt - (if (or (not name) - (equal name persp-auto-save-fname)) - 0 - persp-auto-save-opt))) + persp-save-dir))) + ;; disable auto-saving on kill-emacs if autosaving (i.e. name is nil) + (when (or (not name) + (string= name persp-auto-save-fname)) + (setq persp-auto-save-opt 0)) (and (persp-save-state-to-file fname) t))) ;;;###autoload From a5877139cde23fa928402e4173f31797bf9c53b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Apr 2018 21:04:34 -0400 Subject: [PATCH 1032/4235] feature/workspaces: persp-mode integration for eshell, compile & magit-status --- modules/feature/workspaces/config.el | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 72731e51a..3feb9c6d5 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -133,5 +133,21 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; per-project workspaces, but reuse current workspace if empty (setq projectile-switch-project-action #'+workspaces|set-project-action counsel-projectile-switch-project-action #'+workspaces|switch-to-project) - (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project)) + (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) + + ;; + ;; eshell + (persp-def-buffer-save/load + :mode 'eshell-mode :tag-symbol 'def-eshell-buffer + :save-vars '(major-mode default-directory)) + ;; compile + (persp-def-buffer-save/load + :mode 'compilation-mode :tag-symbol 'def-compilation-buffer + :save-vars + '(major-mode default-directory compilation-directory compilation-environment compilation-arguments)) + ;; magit-status + (persp-def-buffer-save/load + :mode 'magit-status-mode :tag-symbol 'def-magit-status-buffer + :save-vars '(major-mode default-directory) + :after-load-function #'(lambda (b &rest _) (with-current-buffer b (magit-refresh))))) From fa3f627f44bfa84bf8c9a0cadc6619c0204f99b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Apr 2018 21:04:55 -0400 Subject: [PATCH 1033/4235] lang/cc: fontify constants only in c/c++ buffers --- modules/lang/cc/autoload.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 7921866cd..35fc4b736 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -66,10 +66,11 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." ;;;###autoload (defun +cc|fontify-constants () "Better fontification for preprocessor constants" - (font-lock-add-keywords - nil '(("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face) - ("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)) - t)) + (when (memq major-mode '(c-mode c++-mode)) + (font-lock-add-keywords + nil '(("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face) + ("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)) + t))) ;;;###autoload (defun +cc|irony-init-compile-options () From f3facdf6429fd0f15324930387268d0429e5688d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Apr 2018 21:05:31 -0400 Subject: [PATCH 1034/4235] Add simple vanilla-emacs test ground --- core/debug.el | 17 +++++++++++++++++ init.el | 7 +++++++ 2 files changed, 24 insertions(+) create mode 100644 core/debug.el diff --git a/core/debug.el b/core/debug.el new file mode 100644 index 000000000..e627304f9 --- /dev/null +++ b/core/debug.el @@ -0,0 +1,17 @@ +;;; debug.el -*- lexical-binding: t; no-byte-compile: t; -*- + +;; load me after running Emacs -Q: +;; +;; (load-file (concat user-emacs-directory "core/debug.el")) +;; +;; then you can test packages in isolation. + +(setq user-emacs-directory (expand-file-name "../" (file-name-directory load-file-name)) + package--init-file-ensured t + package-user-dir (expand-file-name ".local/packages/elpa" user-emacs-directory) + package-archives + '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("org" . "https://orgmode.org/elpa/"))) + +(package-initialize) diff --git a/init.el b/init.el index 50621daa5..d779d3db8 100644 --- a/init.el +++ b/init.el @@ -28,3 +28,10 @@ ;;; License: MIT (require 'core (concat user-emacs-directory "core/core")) + +;; To test something in a blank, vanilla Emacs session (Emacs -Q) comment the +;; require above and load core/debug.el instead: +;; +;; (load (concat user-emacs-directory "core/debug.el")) +;; +;; <-- place debug code here --> From 3dfffe455e21662286ab9a37952fd821866d93b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 17:21:30 -0400 Subject: [PATCH 1035/4235] Rename core/autoload/debug.el => util.el "debug.el" conflicted with the built-in debug package --- core/autoload/{debug.el => util.el} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core/autoload/{debug.el => util.el} (99%) diff --git a/core/autoload/debug.el b/core/autoload/util.el similarity index 99% rename from core/autoload/debug.el rename to core/autoload/util.el index 53a848c0b..88d03330f 100644 --- a/core/autoload/debug.el +++ b/core/autoload/util.el @@ -1,4 +1,4 @@ -;;; core/autoload/debug.el -*- lexical-binding: t; -*- +;;; core/autoload/util.el -*- lexical-binding: t; -*- ;;;###autoload (defun doom/what-face (&optional pos) From c7e2b3836840bf6f3d13cc5b52b050c5353f35a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 17:22:07 -0400 Subject: [PATCH 1036/4235] Move core/debug.el => ./debug.el "debug.el" conflicts with built-in debug package --- core/debug.el => debug.el | 13 ++++++------- init.el | 7 ------- 2 files changed, 6 insertions(+), 14 deletions(-) rename core/debug.el => debug.el (52%) diff --git a/core/debug.el b/debug.el similarity index 52% rename from core/debug.el rename to debug.el index e627304f9..0aa3970a3 100644 --- a/core/debug.el +++ b/debug.el @@ -1,17 +1,16 @@ -;;; debug.el -*- lexical-binding: t; no-byte-compile: t; -*- +;;; debug.el -*- lexical-binding: t; -*- -;; load me after running Emacs -Q: +;; To test something in a blank, vanilla Emacs session (Emacs -Q) load me: ;; -;; (load-file (concat user-emacs-directory "core/debug.el")) -;; -;; then you can test packages in isolation. +;; emacs -Q -l debug.el -(setq user-emacs-directory (expand-file-name "../" (file-name-directory load-file-name)) +(setq user-emacs-directory (file-name-directory load-file-name) package--init-file-ensured t package-user-dir (expand-file-name ".local/packages/elpa" user-emacs-directory) package-archives '(("gnu" . "https://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/"))) - (package-initialize) + +;; Then you can test packages in isolation here... diff --git a/init.el b/init.el index d779d3db8..50621daa5 100644 --- a/init.el +++ b/init.el @@ -28,10 +28,3 @@ ;;; License: MIT (require 'core (concat user-emacs-directory "core/core")) - -;; To test something in a blank, vanilla Emacs session (Emacs -Q) comment the -;; require above and load core/debug.el instead: -;; -;; (load (concat user-emacs-directory "core/debug.el")) -;; -;; <-- place debug code here --> From 5743e7da7a0a146d2f33d5728303091c588b8a55 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 18:36:36 -0400 Subject: [PATCH 1037/4235] Revert "enable which-key's evil support" #536 This reverts commit b3260f6a9ecb134da4ff5409a40e7de5e52fad7a. Fixes #542 --- core/core-keybinds.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index ac3ed5ba7..d39210169 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -52,9 +52,7 @@ If any hook returns non-nil, all hooks after it are ignored.") which-key-add-column-padding 1 which-key-max-display-columns nil which-key-min-display-lines 5 - which-key-side-window-slot -10 - which-key-allow-evil-operators t - which-key-show-operator-state-maps t) + which-key-side-window-slot -10) ;; embolden local bindings (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) From c583a89a15c581661b92cf1881ddef96db3a6b6f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 23:40:09 -0400 Subject: [PATCH 1038/4235] completion/company: allow minor modes in :company-backend --- modules/completion/company/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 6ee5f2f67..f983ddb0e 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -9,7 +9,8 @@ MODES should be one major-mode symbol or a list of them." for def-name = (intern (format "doom--init-company-%s" mode)) collect `(defun ,def-name () - (when (and (eq major-mode ',mode) + (when (and (or (eq major-mode ',mode) + (bound-and-true-p ,mode)) ,(not (eq backends '(nil)))) (require 'company) (make-variable-buffer-local 'company-backends) From 6bdaf2afbb36cd69bcffe2a050849200d2e76668 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 23:41:20 -0400 Subject: [PATCH 1039/4235] completion/company: refactor +auto implementation --- modules/completion/company/config.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index f983ddb0e..c74963b4b 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -34,17 +34,20 @@ MODES should be one major-mode symbol or a list of them." company-dabbrev-code-other-buffers t company-tooltip-align-annotations t company-require-match 'never - company-global-modes '(not eshell-mode comint-mode erc-mode message-mode help-mode gud-mode) - company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) - company-backends '(company-capf company-dabbrev company-ispell company-yasnippet) + company-global-modes + '(not eshell-mode comint-mode erc-mode message-mode help-mode gud-mode) + company-frontends + '(company-pseudo-tooltip-unless-just-one-frontend + company-echo-metadata-frontend) + company-backends + '(company-capf company-dabbrev company-ispell company-yasnippet) company-transformers '(company-sort-by-occurrence)) + (when (featurep! +auto) + (require 'company) + (setq company-idle-delay 0.2)) :config (global-company-mode +1)) -(when (featurep! +auto) - (require 'company) - (setq company-idle-delay 0.2)) - (def-package! company-statistics :after company From 97812583f075a159e251f040cac0c1c5ceb86f1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 23:41:53 -0400 Subject: [PATCH 1040/4235] completion/company: add company-box config & +childframe flag --- modules/completion/company/config.el | 26 ++++++++++++++++++-------- modules/ui/posframe/config.el | 15 --------------- modules/ui/posframe/packages.el | 2 -- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c74963b4b..842e42e97 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -50,18 +50,28 @@ MODES should be one major-mode symbol or a list of them." (def-package! company-statistics - :after company - :config - (setq company-statistics-file (concat doom-cache-dir "company-stats-cache.el")) - (quiet! (company-statistics-mode +1))) + :hook (company-mode . company-statistics-mode) + :config (setq company-statistics-file (concat doom-cache-dir "company-stats-cache.el"))) -;; Looks ugly on OSX without emacs-mac build (def-package! company-quickhelp - :after company + :unless (and EMACS26+ (featurep! +childframe)) + :hook (company-mode . company-quickhelp-mode) + :config (setq company-quickhelp-delay nil)) + + +(def-package! company-box + :when (and EMACS26+ (featurep! +childframe)) + :hook (company-mode . company-box-mode) :config - (setq company-quickhelp-delay nil) - (company-quickhelp-mode +1)) + (setq company-box-backends-colors nil + company-box-icons-elisp + (list (concat (all-the-icons-material "functions") " ") + (concat (all-the-icons-material "check_circle") " ") + (concat (all-the-icons-material "stars") " ") + (concat (all-the-icons-material "format_paint") " ")) + company-box-icons-unknown (concat (all-the-icons-material "find_in_page") " ") + company-box-icons-yasnippet (concat (all-the-icons-material "short_text") " "))) (def-package! company-dict diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el index 92ef72d3b..5dd7af23d 100644 --- a/modules/ui/posframe/config.el +++ b/modules/ui/posframe/config.el @@ -7,21 +7,6 @@ (add-hook 'doom-escape-hook #'+posframe|delete-on-escape)) -(def-package! company-box - :when EMACS26+ - :hook (company-mode . company-box-mode) - :config - (setq company-frontends (delq 'company-pseudo-tooltip-frontend company-frontends) - company-box-icons-elisp - (list (concat (all-the-icons-material "functions") " ") - (concat (all-the-icons-material "check_circle") " ") - (concat (all-the-icons-material "stars") " ") - (concat (all-the-icons-material "format_paint") " ")) - company-box-icons-unknown (concat (all-the-icons-material "find_in_page") " ") - company-box-backends-colors nil - company-box-icons-yasnippet (concat (all-the-icons-material "short_text") " "))) - - (def-package! ivy-posframe :when EMACS26+ :hook (ivy-mode . ivy-posframe-enable) diff --git a/modules/ui/posframe/packages.el b/modules/ui/posframe/packages.el index 7d57cf40e..b5013939f 100644 --- a/modules/ui/posframe/packages.el +++ b/modules/ui/posframe/packages.el @@ -2,7 +2,5 @@ ;;; ui/posframe/packages.el (when EMACS26+ - (when (featurep! :completion company) - (package! company-box)) (when (featurep! :completion ivy) (package! ivy-posframe))) From 6ba9259735d8b4cda991ec5b5da5ca671c95d46e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 23:55:49 -0400 Subject: [PATCH 1041/4235] feature/lookup: support multiple lookup functions & minor modes in :lookup --- modules/feature/lookup/autoload/lookup.el | 37 +++++++---------- modules/feature/lookup/config.el | 50 +++++++++++++---------- 2 files changed, 44 insertions(+), 43 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index ddf4857d7..b3ae873ac 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -25,17 +25,18 @@ ((xref-backend-identifier-at-point (xref-find-backend))))) (defun +lookup--jump-to (prop identifier) - (let ((fn (plist-get +lookup-current-functions prop)) - (origin (point-marker))) - (setq fn (or (command-remapping fn) fn)) - (condition-case e - (or (if (commandp fn) - (call-interactively fn) - (funcall fn identifier)) - (/= (point-marker) origin)) - ('error - (message "%s" e) - nil)))) + (cl-loop for fn in (plist-get '(:definition +lookup-definition-functions + :references +lookup-references-functions + :documentation +lookup-documentation-functions) + prop) + for fn = (or (command-remapping fn) fn) + if (condition-case e + (or (if (commandp fn) + (call-interactively fn) + (funcall fn identifier)) + (/= (point-marker) origin)) + ('error (ignore (message "%s" e)))) + return it)) ;; @@ -60,14 +61,9 @@ Failing all that, it will give up with an error." (cond ((null identifier) (user-error "Nothing under point")) - ((and (plist-member +lookup-current-functions :definition) + ((and +lookup-definition-functions (+lookup--jump-to :definition identifier))) - ((ignore-errors (if other-window - (xref-find-definitions-other-window identifier) - (xref-find-definitions identifier)) - t)) - ((and (require 'dumb-jump nil t) ;; dumb-jump doesn't tell us if it succeeded or not (let ((old-fn (symbol-function 'dumb-jump-get-results)) @@ -110,12 +106,9 @@ Failing all that, it will give up with an error." Tries `xref-find-references' and falls back to rg/ag." (interactive (list (+lookup--symbol-or-region))) - (cond ((and (plist-member +lookup-current-functions :references) + (cond ((and +lookup-references-functions (+lookup--jump-to :references identifier))) - ((ignore-errors (xref-find-references identifier) - t)) - ((and identifier (featurep 'counsel) (let ((regex (rxt-quote-pcre identifier))) @@ -138,7 +131,7 @@ Goes down a list of possible backends: 4. Fall back to an online search, with `+lookup/online'" (interactive (list (+lookup--symbol-or-region))) - (cond ((and (plist-member +lookup-current-functions :documentation) + (cond ((and +lookup-documentation-functions (+lookup--jump-to :documentation identifier))) ((and (featurep! :feature lookup +docsets) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 301f7fcb0..78564bf48 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -33,13 +33,20 @@ produces an url. Used by `+lookup/online'.") (defvar +lookup-open-url-fn #'browse-url "Function to use to open search urls.") -(defvar +lookup-function-alist nil - "An alist mapping major modes to jump function plists, describing what to do -with `+lookup/definition', `+lookup/references' and `+lookup/documentation' are -called.") +(defvar +lookup-definition-functions '(xref-find-definitions) + "Functions for `+lookup/definition' to try, before resorting to `dumb-jump'. +Stops at the first function to return non-nil or change the current +window/point.") -(defvar-local +lookup-current-functions nil - "The enabled jump functions for the current buffer.") +(defvar +lookup-references-functions '(xref-find-references) + "Functions for `+lookup/references' to try, before resorting to `dumb-jump'. +Stops at the first function to return non-nil or change the current +window/point.") + +(defvar +lookup-documentation-functions () + "Functions for `+lookup/documentation' to try, before resorting to +`dumb-jump'. Stops at the first function to return non-nil or change the current +window/point.") (def-setting! :lookup (modes &rest plist) "Defines a jump target for major MODES. PLIST accepts the following @@ -57,9 +64,22 @@ properties: :xref-backend FN Defines an xref backend for a major-mode. With this, :definition and :references are unnecessary." - `(dolist (mode (doom-enlist ,modes)) - (push (cons mode (list ,@plist)) - +lookup-function-alist))) + `(progn + ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) + for def-name = (intern (format "doom--init-lookup-%s" mode)) + collect + `(defun ,def-name () + (when (or (eq major-mode ',mode) + (bound-and-true-p ,mode)) + (let ((xref ,(plist-get plist :xref-backend)) + (def ,(plist-get plist :definition)) + (ref ,(plist-get plist :references)) + (doc ,(plist-get plist :docuemntation))) + (if xref (add-hook 'xref-backend-functions xref nil t)) + (if def (add-hook '+lookup-definition-functions def nil t)) + (if ref (add-hook '+lookup-references-functions ref nil t)) + (if doc (add-hook '+lookup-documentation-functions doc nil t))))) + collect `(add-hook! ,mode #',def-name)))) ;; Recenter buffer after certain jumps (add-hook! @@ -99,18 +119,6 @@ properties: (funcall orig-fn))) (advice-add #'projectile-find-tag :around #'+lookup*projectile-find-tag)) -(defun +lookup|init-xref-backends () - "Set `+lookup-current-functions' for the current buffer. - -This variable is used by `+lookup/definition',`+lookup/references' and -`+lookup/documentation'." - (when-let* ((plist (cdr (assq major-mode +lookup-function-alist)))) - (when-let* ((backend (plist-get plist :xref-backend))) - (make-variable-buffer-local 'xref-backend-functions) - (cl-pushnew backend xref-backend-functions :test #'eq)) - (setq-local +lookup-current-functions plist))) -(add-hook 'after-change-major-mode-hook #'+lookup|init-xref-backends) - (def-package! ivy-xref :when (featurep! :completion ivy) From 855ad2c0f1dd60e246d823f9ee589685e032ae4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 23:56:29 -0400 Subject: [PATCH 1042/4235] lang/javascript: refactor company/lookup config; bring back xref-js2 --- modules/lang/javascript/config.el | 20 +++++++++++++++++--- modules/lang/javascript/packages.el | 3 +++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 61e095051..3f9265be4 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -80,12 +80,20 @@ (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config - (set! :company '(js2-mode typescript-mode) 'company-tide) - (set! :lookup '(js2-mode rjsx-mode typescript-mode) + (add-hook 'tide-mode-hook #'eldoc-mode) + + ;; code completion + (after! company + ;; tide affects the global `company-backends', undo this so doom can handle + ;; it buffer-locally + (setq-default company-backends (delq 'company-tide (default-value 'company-backends)))) + (set! :company-backends 'tide-mode 'company-tide) + + ;; navigation + (set! :lookup 'tide-mode :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) - (add-hook 'tide-mode-hook #'eldoc-mode) ;; resolve to `doom-project-root' if `tide-project-root' fails (advice-add #'tide-project-root :override #'+javascript*tide-project-root) @@ -131,6 +139,12 @@ :n "r" #'+javascript/refactor-menu)) +(def-package! xref-js2 + :when (featurep! :feature lookup) + :commands xref-js2-xref-backend + :init (set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend)) + + (def-package! nodejs-repl :commands nodejs-repl :init diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index befb573b0..65e1ba8a0 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -14,3 +14,6 @@ (package! typescript-mode) (package! web-beautify) +(when (featurep! :feature lookup) + (package! xref-js2)) + From 35e5dbcb11af7a803b6b8a03cb31dd379ce78303 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Apr 2018 23:59:33 -0400 Subject: [PATCH 1043/4235] config/default: reformat & refactor company keybinds --- modules/config/default/+bindings.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 273274a43..2e1ae5c8f 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -367,11 +367,10 @@ "C-n" #'company-select-next "C-p" #'company-select-previous "C-h" #'company-quickhelp-manual-begin + "C-s" #'company-filter-candidates "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 [tab] #'company-complete-common-or-cycle "S-TAB" #'company-select-previous From aef97243247491ad9b248ded0380d6b3b572cde8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 00:03:28 -0400 Subject: [PATCH 1044/4235] Add doom*shut-up advisor to core-lib --- bin/doom-doctor | 4 +--- core/core-lib.el | 4 ++++ modules/completion/company/config.el | 1 + modules/lang/sh/config.el | 6 ++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 9788f29e9..0d957f590 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -297,9 +297,7 @@ (when (bound-and-true-p doom-modules) (section! "test-modules") (let ((indent 4)) - (defun --quiet-require (orig-fn &rest args) - (quiet! (apply orig-fn args))) - (advice-add #'require :around #'--quiet-require) + (advice-add #'require :around #'doom*shut-up) (maphash (lambda (key plist) (condition-case ex diff --git a/core/core-lib.el b/core/core-lib.el index 131bd1569..22e0d79f5 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -97,6 +97,10 @@ compilation." (save-silently t)) ,@forms)))) +(defun doom*shut-up (orig-fn &rest args) + "Generic advisor for silencing noisy functions." + (quiet! (apply orig-fn args))) + (defvar doom--transient-counter 0) (defmacro add-transient-hook! (hook &rest forms) "Attaches transient forms to a HOOK. diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 842e42e97..a0bf468c1 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -51,6 +51,7 @@ MODES should be one major-mode symbol or a list of them." (def-package! company-statistics :hook (company-mode . company-statistics-mode) + :init (advice-add #'company-statistics-mode :around #'doom*shut-up) :config (setq company-statistics-file (concat doom-cache-dir "company-stats-cache.el"))) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 79ed15e44..d100a8c86 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -28,10 +28,8 @@ (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1)))) sh-imenu-generic-expression) - (defun +sh*silence-messages (orig-fn &rest args) - "`sh-set-shell' is chatty about it setting up indentation rules. Shut up." - (quiet! (apply orig-fn args))) - (advice-add #'sh-set-shell :around #'+sh*silence-messages) + ;; `sh-set-shell' is chatty about setting up indentation rules + (advice-add #'sh-set-shell :around #'doom*shut-up) ;; 1. Fontifies variables in double quotes ;; 2. Fontify command substitution in double quotes From 15c735a053c77c5872926acf1f04e463c5411738 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 00:28:32 -0400 Subject: [PATCH 1045/4235] lang/javascript: fix :company-backend typo --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 3f9265be4..931038138 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -87,7 +87,7 @@ ;; tide affects the global `company-backends', undo this so doom can handle ;; it buffer-locally (setq-default company-backends (delq 'company-tide (default-value 'company-backends)))) - (set! :company-backends 'tide-mode 'company-tide) + (set! :company-backend 'tide-mode 'company-tide) ;; navigation (set! :lookup 'tide-mode From 135ebd925f52c27fa15ae4eceac3dc7562cb558c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 00:34:03 -0400 Subject: [PATCH 1046/4235] Enable global-eldoc-mode; less work for me! --- core/core-ui.el | 2 -- modules/lang/csharp/config.el | 2 +- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/haskell/+intero.el | 2 +- modules/lang/java/+meghanada.el | 2 +- modules/lang/javascript/config.el | 2 -- modules/lang/rust/config.el | 2 +- modules/lang/scala/config.el | 2 -- 8 files changed, 5 insertions(+), 11 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 89568bd20..09946bb0c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -525,8 +525,6 @@ frame's window-system, the theme will be reloaded.") ;; Bootstrap ;; -;; auto-enabled in Emacs 25+; I'll do it myself -(global-eldoc-mode -1) ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) ;; make `next-buffer', `other-buffer', etc. ignore unreal buffers diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 41b2ded8b..fc8debc9e 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -15,7 +15,7 @@ (unless (file-exists-p omnisharp-bin) (warn! "Omnisharp server isn't installed, completion won't work"))) - (add-hook! csharp-mode #'(eldoc-mode flycheck-mode omnisharp-mode)) + (add-hook! csharp-mode #'(flycheck-mode omnisharp-mode)) (defun +csharp|cleanup-omnisharp-server () "Clean up the omnisharp server once you kill the last csharp-mode buffer." diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index b5ef8c51c..ee61d1eb9 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -19,7 +19,7 @@ (add-hook! 'emacs-lisp-mode-hook #'(;; 3rd-party functionality - eldoc-mode auto-compile-on-save-mode doom|enable-delete-trailing-whitespace + auto-compile-on-save-mode doom|enable-delete-trailing-whitespace ;; fontification rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification ;; initialization diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 8de53afd9..372e3e51b 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -5,7 +5,7 @@ :after haskell-mode :config (add-hook 'haskell-mode-hook #'+haskell|init-intero) - (add-hook! 'intero-mode-hook #'(flycheck-mode eldoc-mode)) + (add-hook 'intero-mode-hook #'flycheck-mode) (set! :lookup 'haskell-mode :definition #'intero-goto-definition)) diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 8ef176d51..4a0ee7767 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -14,7 +14,7 @@ :definition #'meghanada-jump-declaration :references #'meghanada-reference) - (add-hook! 'meghanada-mode-hook #'(flycheck-mode eldoc-mode)) + (add-hook 'meghanada-mode-hook #'flycheck-mode) ;; (def-menu! +java/refactor-menu diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 931038138..50b515437 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -80,8 +80,6 @@ (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config - (add-hook 'tide-mode-hook #'eldoc-mode) - ;; code completion (after! company ;; tide affects the global `company-backends', undo this so doom can handle diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 01dbd9f29..9a45ae71e 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -25,7 +25,7 @@ (def-package! racer :after rust-mode :config - (add-hook! 'rust-mode-hook #'(eldoc-mode racer-mode)) + (add-hook 'rust-mode-hook #'racer-mode) (set! :lookup 'rust-mode :definition #'racer-find-definition :documentation #'racer-describe)) diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index b656ebbf6..510f903e0 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -12,8 +12,6 @@ :commands (ensime ensime-scala-mode-hook) :hook (scala-mode . ensime-mode) :config - (add-hook 'ensime-mode-hook #'eldoc-mode) - (set! :company-backend 'scala-mode '(ensime-company company-yasnippet)) (setq ensime-startup-snapshot-notification nil From cf99f29ee03a72d97135f2d315d76e6243709985 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 00:53:18 -0400 Subject: [PATCH 1047/4235] completion/company: add company-box package --- modules/completion/company/packages.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index 8afbdd127..bcdce832d 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -5,3 +5,5 @@ (package! company-dict) (package! company-quickhelp) (package! company-statistics) +(when (featurep! +childframe) + (package! company-box)) From 7579110534c39563ecda80a684b87523efb9bffd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 01:19:26 -0400 Subject: [PATCH 1048/4235] feature/lookup: fix lookup commands skipping to project text search --- modules/feature/lookup/autoload/lookup.el | 17 ++++++++++++++--- modules/feature/lookup/config.el | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index b3ae873ac..cd9390121 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -25,9 +25,10 @@ ((xref-backend-identifier-at-point (xref-find-backend))))) (defun +lookup--jump-to (prop identifier) - (cl-loop for fn in (plist-get '(:definition +lookup-definition-functions - :references +lookup-references-functions - :documentation +lookup-documentation-functions) + (cl-loop with origin = (point-marker) + for fn in (plist-get (list :definition +lookup-definition-functions + :references +lookup-references-functions + :documentation +lookup-documentation-functions) prop) for fn = (or (command-remapping fn) fn) if (condition-case e @@ -38,6 +39,16 @@ ('error (ignore (message "%s" e)))) return it)) +;;;###autoload +(defun +lookup-xref-definitions (identifier) + "Non-interactive wrapper for `xref-find-definitions'" + (xref-find-definitions identifier)) + +;;;###autoload +(defun +lookup-xref-references (identifier) + "Non-interactive wrapper for `xref-find-references'" + (xref-find-references identifier)) + ;; ;; Main commands diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 78564bf48..9af34c628 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -33,12 +33,12 @@ produces an url. Used by `+lookup/online'.") (defvar +lookup-open-url-fn #'browse-url "Function to use to open search urls.") -(defvar +lookup-definition-functions '(xref-find-definitions) +(defvar +lookup-definition-functions '(+lookup-xref-definitions) "Functions for `+lookup/definition' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current window/point.") -(defvar +lookup-references-functions '(xref-find-references) +(defvar +lookup-references-functions '(+lookup-xref-references) "Functions for `+lookup/references' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current window/point.") From fbfba9377594b4ae42d985b03da037cf054ba374 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 01:21:07 -0400 Subject: [PATCH 1049/4235] feature/popup: add company hack; don't select doc buffer popup --- modules/feature/popup/+hacks.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/feature/popup/+hacks.el b/modules/feature/popup/+hacks.el index f5697c00a..9132fbc44 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/feature/popup/+hacks.el @@ -34,6 +34,15 @@ ;; External functions ;; +;; `company' +(after! company + (defun +popup*dont-select-me (orig-fn &rest args) + (let ((+popup--inhibit-select t)) + (apply orig-fn args))) + (advice-add #'company-show-doc-buffer :around #'+popup*dont-select-me)) + + +;; `eshell' (after! eshell (setq eshell-destroy-buffer-when-process-dies t) From 4b5e7c11285bc0759f2767f4005c47c952e68ec9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 01:21:29 -0400 Subject: [PATCH 1050/4235] feature/popup: add +popup--inhibit-select letvar --- modules/feature/popup/autoload.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 58d37c67b..9c72ff2f0 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -2,6 +2,7 @@ (defvar +popup--populate-wparams (not EMACS26+)) (defvar +popup--inhibit-transient nil) +(defvar +popup--inhibit-select nil) (defvar +popup--display-buffer-alist nil) (defvar +popup--old-display-buffer-alist nil) (defvar +popup--remember-last t) @@ -146,10 +147,11 @@ and enables `+popup-buffer-mode'." (when-let* ((new-window (run-hook-with-args-until-success '+popup-display-buffer-actions buffer alist))) (+popup--init new-window alist) - (let ((select (+popup-parameter 'select new-window))) - (if (functionp select) - (funcall select new-window old-window) - (select-window (if select new-window old-window)))) + (unless +popup--inhibit-select + (let ((select (+popup-parameter 'select new-window))) + (if (functionp select) + (funcall select new-window old-window) + (select-window (if select new-window old-window))))) new-window))) ;;;###autoload From 5e007ada08268c4ddaedef916ea952d88ab58764 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 02:37:58 -0400 Subject: [PATCH 1051/4235] completion/company: use company-pseudo-tooltip-frontend instead --- modules/completion/company/config.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index a0bf468c1..add3d8ed0 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -37,7 +37,7 @@ MODES should be one major-mode symbol or a list of them." company-global-modes '(not eshell-mode comint-mode erc-mode message-mode help-mode gud-mode) company-frontends - '(company-pseudo-tooltip-unless-just-one-frontend + '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) company-backends '(company-capf company-dabbrev company-ispell company-yasnippet) @@ -64,6 +64,15 @@ MODES should be one major-mode symbol or a list of them." (def-package! company-box :when (and EMACS26+ (featurep! +childframe)) :hook (company-mode . company-box-mode) + :init + (defun +company|fix-frontends () + "Ensure `company-pseudo-tooltip-frontend' is *not* in `company-frontends' +when company-box is active, which are incompatible and cause duplicate popups." + (make-variable-buffer-local 'company-frontends) + (if company-box-mode + (setq company-frontends (delq 'company-pseudo-tooltip-frontend company-frontends)) + (cl-pushnew 'company-pseudo-tooltip-frontend company-frontends :test #'eq))) + (add-hook 'company-box-mode-hook #'+company|fix-frontends) :config (setq company-box-backends-colors nil company-box-icons-elisp From 779184a9ee97f816cd58eb0c6e3bcb3ec008074f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 03:42:15 -0400 Subject: [PATCH 1052/4235] completion/company: remove company-quickhelp Quickhelp is unreliable and doesn't look very good. I'm searching for an alternative. --- modules/completion/company/config.el | 6 ------ modules/completion/company/packages.el | 1 - modules/config/default/+bindings.el | 3 +-- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index add3d8ed0..c14c7abda 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -55,12 +55,6 @@ MODES should be one major-mode symbol or a list of them." :config (setq company-statistics-file (concat doom-cache-dir "company-stats-cache.el"))) -(def-package! company-quickhelp - :unless (and EMACS26+ (featurep! +childframe)) - :hook (company-mode . company-quickhelp-mode) - :config (setq company-quickhelp-delay nil)) - - (def-package! company-box :when (and EMACS26+ (featurep! +childframe)) :hook (company-mode . company-box-mode) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index bcdce832d..7503370e1 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -3,7 +3,6 @@ (package! company) (package! company-dict) -(package! company-quickhelp) (package! company-statistics) (when (featurep! +childframe) (package! company-box)) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2e1ae5c8f..7f03cda27 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -366,9 +366,8 @@ "C-o" #'company-search-kill-others "C-n" #'company-select-next "C-p" #'company-select-previous - "C-h" #'company-quickhelp-manual-begin + "C-h" #'company-show-doc-buffer "C-s" #'company-filter-candidates - "C-S-h" #'company-show-doc-buffer "C-S-s" #'company-search-candidates "C-SPC" #'company-complete-common "TAB" #'company-complete-common-or-cycle From 2b0c681d7a8b89b5b37151ee172d8487f5a6f42e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 04:24:42 -0400 Subject: [PATCH 1053/4235] completion/company: refactor icons & add colors --- modules/completion/company/config.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c14c7abda..4cdda0626 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -70,12 +70,12 @@ when company-box is active, which are incompatible and cause duplicate popups." :config (setq company-box-backends-colors nil company-box-icons-elisp - (list (concat (all-the-icons-material "functions") " ") - (concat (all-the-icons-material "check_circle") " ") - (concat (all-the-icons-material "stars") " ") - (concat (all-the-icons-material "format_paint") " ")) - company-box-icons-unknown (concat (all-the-icons-material "find_in_page") " ") - company-box-icons-yasnippet (concat (all-the-icons-material "short_text") " "))) + (list (all-the-icons-material "functions" :face 'all-the-icons-red) + (all-the-icons-material "check_circle" :face 'all-the-icons-blue) + (all-the-icons-material "stars" :face 'all-the-icons-orange) + (all-the-icons-material "format_paint" :face 'all-the-icons-pink)) + company-box-icons-unknown (all-the-icons-material "find_in_page" :face 'all-the-icons-purple) + company-box-icons-yasnippet (all-the-icons-material "short_text" :face 'all-the-icons-green))) (def-package! company-dict From 7ee689c57c75dc9e8c854e80007026fa6ac72bde Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 04:30:44 -0400 Subject: [PATCH 1054/4235] completion/company: reduce contrast of company-box icon colors --- modules/completion/company/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 4cdda0626..7bc2154cb 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -70,11 +70,11 @@ when company-box is active, which are incompatible and cause duplicate popups." :config (setq company-box-backends-colors nil company-box-icons-elisp - (list (all-the-icons-material "functions" :face 'all-the-icons-red) + (list (all-the-icons-material "functions" :face 'all-the-icons-purple) (all-the-icons-material "check_circle" :face 'all-the-icons-blue) - (all-the-icons-material "stars" :face 'all-the-icons-orange) + (all-the-icons-material "stars" :face 'all-the-icons-yellow) (all-the-icons-material "format_paint" :face 'all-the-icons-pink)) - company-box-icons-unknown (all-the-icons-material "find_in_page" :face 'all-the-icons-purple) + company-box-icons-unknown (all-the-icons-material "find_in_page" :face 'all-the-icons-silver) company-box-icons-yasnippet (all-the-icons-material "short_text" :face 'all-the-icons-green))) From b92a83752a4e0370e35c1a992ec323a256ca052f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 06:06:04 -0400 Subject: [PATCH 1055/4235] feature/lookup: fix :lookup => :documentation setting --- modules/feature/lookup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 9af34c628..c22e34d40 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -74,7 +74,7 @@ properties: (let ((xref ,(plist-get plist :xref-backend)) (def ,(plist-get plist :definition)) (ref ,(plist-get plist :references)) - (doc ,(plist-get plist :docuemntation))) + (doc ,(plist-get plist :documentation))) (if xref (add-hook 'xref-backend-functions xref nil t)) (if def (add-hook '+lookup-definition-functions def nil t)) (if ref (add-hook '+lookup-references-functions ref nil t)) From 5acd952c47227fc549b5b90f32efd81bbee4067e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 06:06:51 -0400 Subject: [PATCH 1056/4235] ui/doom-modeline: fix (some) void-variable errors w/ blank buffer-file-truename --- modules/ui/doom-modeline/config.el | 41 ++++++++++++++++-------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 3c78ddf5d..53659afe6 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -197,21 +197,23 @@ active." (defun +doom-modeline-buffer-file-name () "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." - (propertize - (pcase +doom-modeline-buffer-file-name-style - ('truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) - ('truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) - ('truncate-all (+doom-modeline--buffer-file-name-truncate t)) - ('relative-to-project (+doom-modeline--buffer-file-name-relative)) - ('relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) - ('file-name (propertize (file-name-nondirectory buffer-file-name) - 'face - (let ((face (or (and (buffer-modified-p) - 'doom-modeline-buffer-modified) - (and (active) - 'doom-modeline-buffer-file)))) - (when face `(:inherit ,face)))))) - 'help-echo buffer-file-truename)) + (let ((buffer-file-name (or buffer-file-name "")) + (buffer-file-truename (or buffer-file-truename ""))) + (propertize + (pcase +doom-modeline-buffer-file-name-style + ('truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) + ('truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) + ('truncate-all (+doom-modeline--buffer-file-name-truncate t)) + ('relative-to-project (+doom-modeline--buffer-file-name-relative)) + ('relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) + ('file-name (propertize (file-name-nondirectory buffer-file-name) + 'face + (let ((face (or (and (buffer-modified-p) + 'doom-modeline-buffer-modified) + (and (active) + 'doom-modeline-buffer-file)))) + (when face `(:inherit ,face)))))) + 'help-echo buffer-file-truename))) (defun +doom-modeline--buffer-file-name-truncate (&optional truncate-tail) "Propertized `buffer-file-name' that truncates every dir along path. @@ -239,13 +241,14 @@ If TRUNCATE-TAIL is t also truncate the parent directory of the file." (if (null root) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (relative-dirs (file-relative-name (file-name-directory (file-truename buffer-file-name)) + (true-filename (file-truename buffer-file-name)) + (relative-dirs (file-relative-name (file-name-directory true-filename) (if include-project (concat root "../") root))) (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) (if (equal "./" relative-dirs) (setq relative-dirs "")) (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory (file-truename buffer-file-name)) + (propertize (file-name-nondirectory true-filename) 'face (if file-faces `(:inherit ,file-faces)))))))) (defun +doom-modeline--buffer-file-name (truncate-project-root-parent) @@ -257,8 +260,8 @@ Example: ~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" (let* ((project-root (doom-project-root)) (file-name-split (shrink-path-file-mixed project-root - (file-name-directory buffer-file-truename) - buffer-file-truename)) + (file-name-directory buffer-file-name) + buffer-file-name)) (active (active))) (if (null file-name-split) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) From 7dd5c12b4460b9ca6b348060707c72e69dcce01d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 17:50:24 -0400 Subject: [PATCH 1057/4235] lang/org: disable make-frame hooks in +org-capture/open-frame --- modules/lang/org/autoload/org-capture.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index d3ec2e86a..01552b3e0 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -38,9 +38,11 @@ you're done. This can be called from an external shell script." (setq string nil)) (when (and key (string-empty-p key)) (setq key nil)) - (let ((frame (if (+org-capture-frame-p) - (selected-frame) - (make-frame +org-capture-window-params)))) + (let* ((frame-title-format "") + (frame (if (+org-capture-frame-p) + (selected-frame) + (let (before-make-frame-hook after-make-frame-functions) + (make-frame +org-capture-window-params))))) (with-selected-frame frame (require 'org-capture) (condition-case ex From 39b08b4d05fb754080f54011c8ee770a1d645a84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 17:50:51 -0400 Subject: [PATCH 1058/4235] tools/magit: fix leader key in magit-blame --- modules/tools/magit/config.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 99b2c5025..db32ca8d1 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -41,8 +41,5 @@ :after magit :config (setq evil-magit-state 'normal) - - ;; Switch to emacs state only while in `magit-blame-mode', then back when - ;; its done (since it's a minor-mode). - (add-hook! 'magit-blame-mode-hook - (evil-local-mode (if magit-blame-mode -1 +1)))) + (map! :map (magit-mode-map magit-blame-read-only-mode-map) + doom-leader-key nil)) From ac570f3f1855e2b20f4c989f9f4e5b473a6c3e5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Apr 2018 20:49:21 -0400 Subject: [PATCH 1059/4235] lang/javascript: revise refactor menu; add tide-organize-imports --- modules/lang/javascript/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 50b515437..4c303d848 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -102,8 +102,9 @@ (def-menu! +javascript/refactor-menu "Refactoring commands for `js2-mode' buffers." - '(("Tide: restart server" :exec tide-restart-server :when (bound-and-true-p tide-mode)) - ("Tide: reformat buffer/region" :exec tide-reformat :when (bound-and-true-p tide-mode)) + '(("Restart tsserver" :exec tide-restart-server :when (bound-and-true-p tide-mode)) + ("Reformat buffer/region (tide)" :exec tide-reformat :when (bound-and-true-p tide-mode)) + ("Organize imports" :exec tide-organize-imports :when (bound-and-true-p tide-mode)) ("Rename symbol" :exec tide-rename-symbol :when (bound-and-true-p tide-mode) :region nil) ("Reformat buffer (eslint_d)" :exec eslintd-fix :when (bound-and-true-p eslintd-fix-mode) :region nil) ("Extract into function" :exec js2r-extract-function :region t) From f8613645f9b43fc3292b48c46680351da81772ab Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Wed, 25 Apr 2018 00:28:31 +0200 Subject: [PATCH 1060/4235] Add missing completion flags. --- init.example.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index e6a24f692..76f23c7b3 100644 --- a/init.example.el +++ b/init.example.el @@ -20,7 +20,9 @@ workspaces ; tab emulation, persistence & separate workspaces :completion - company ; the ultimate code completion backend + (company ; the ultimate code completion backend + +auto ; enabble completion by default + +childframe) ; use childframes whenever possible ;helm ; the *other* search engine for love and life ;ido ; the other *other* search engine... ivy ; a search engine for love and life From 7dde5b1be7fe401b14e68eb4263218f70a738fd4 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Wed, 25 Apr 2018 01:54:40 +0200 Subject: [PATCH 1061/4235] Fixed typo. --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 76f23c7b3..c92e52777 100644 --- a/init.example.el +++ b/init.example.el @@ -21,7 +21,7 @@ :completion (company ; the ultimate code completion backend - +auto ; enabble completion by default + +auto ; enable completion by default +childframe) ; use childframes whenever possible ;helm ; the *other* search engine for love and life ;ido ; the other *other* search engine... From 00a429d65fa56a097b4a535580c49c1c3d0ce6a1 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Wed, 25 Apr 2018 02:10:03 +0200 Subject: [PATCH 1062/4235] Add comment for company childframes being only available on Emacs +26. --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index c92e52777..d9dd40a12 100644 --- a/init.example.el +++ b/init.example.el @@ -22,7 +22,7 @@ :completion (company ; the ultimate code completion backend +auto ; enable completion by default - +childframe) ; use childframes whenever possible + +childframe) ; use childframes whenever possible. Only available on Emacs +26 ;helm ; the *other* search engine for love and life ;ido ; the other *other* search engine... ivy ; a search engine for love and life From aec77d5f1e984ed60cdcda6b8d10ebee4675cb0a Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Tue, 24 Apr 2018 11:49:40 +0200 Subject: [PATCH 1063/4235] Enable rainbow mode in LaTeX buffers. --- modules/lang/latex/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 256723085..9070404df 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -85,6 +85,8 @@ (TeX-global-PDF-mode t) (TeX-PDF-mode t) (visual-line-mode +1)) + ;; Enable rainbow mode after applying styles to the buffer + (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) (add-hook 'LaTeX-mode-hook #'flyspell-mode)) ;; Default language setting. From 4d2d3953b806388c4a916803e56165d4dfc24ecd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Apr 2018 05:17:56 -0400 Subject: [PATCH 1064/4235] ui/doom-modeline: fix off-by-one in selection-info segment --- modules/ui/doom-modeline/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 53659afe6..bc22266f0 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -473,7 +473,7 @@ lines are selected, or the NxM dimensions of a block selection." (cons evil-visual-beginning evil-visual-end) (cons (region-beginning) (region-end))) (propertize - (let ((lines (count-lines beg (min (1+ end) (point-max))))) + (let ((lines (count-lines beg (min end (point-max))))) (concat (cond ((or (bound-and-true-p rectangle-mark-mode) (eq 'block evil-visual-selection)) (let ((cols (abs (- (doom-column end) @@ -482,9 +482,9 @@ lines are selected, or the NxM dimensions of a block selection." ((eq 'line evil-visual-selection) (format "%dL" lines)) ((> lines 1) - (format "%dC %dL" (- (1+ end) beg) lines)) + (format "%dC %dL" (- end beg) lines)) (t - (format "%dC" (- (1+ end) beg)))) + (format "%dC" (- end beg)))) (when +doom-modeline-enable-word-count (format " %dW" (count-words beg end))))) 'face 'doom-modeline-highlight)))) From 776886a0a449dbb19fa0ee76cef89c4386d6bdb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Apr 2018 16:56:49 -0400 Subject: [PATCH 1065/4235] feature/workspaces: restore missing +workspace/{save,load} commands --- .../feature/workspaces/autoload/workspaces.el | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8e97cd836..54d81e33e 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -199,6 +199,36 @@ throws an error." ;; Interactive commands ;; +;;;###autoload +(defun +workspace/load (name) + "Load a workspace and switch to it. If called with C-u, try to reload the +current workspace (by name) from session files." + (interactive + (list + (if current-prefix-arg + (+workspace-current-name) + (completing-read + "Workspace to load: " + (persp-list-persp-names-in-file + (expand-file-name +workspace-data-file persp-save-dir)))))) + (if (not (+workspace-load name)) + (+workspace-error (format "Couldn't load workspace %s" name)) + (+workspace/switch-to name) + (+workspace/display))) + +;;;###autoload +(defun +workspace/save (name) + "Save the current workspace. If called with C-u, autosave the current +workspace." + (interactive + (list + (if current-prefix-arg + (+workspace-current-name) + (completing-read "Workspace to save: " (+workspace-list-names))))) + (if (+workspace-save name) + (+workspace-message (format "'%s' workspace saved" name) 'success) + (+workspace-error (format "Couldn't save workspace %s" name)))) + ;;;###autoload (defun +workspace/load-session (&optional name) "Load a session and switch to it. If called with C-u, try to load the last From a6d8a0b4ec328251c31cb96bf90d0e93c9def102 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 26 Apr 2018 02:00:21 -0400 Subject: [PATCH 1066/4235] ui/doom-modeline: update flycheck on status-changed #549 --- modules/ui/doom-modeline/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index bc22266f0..a26f72136 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -426,10 +426,10 @@ directory, the file name, and its state (modified, read-only or non-existent)." (if vc-mode " " " "))) (defvar-local +doom-modeline--flycheck nil) -(add-hook 'flycheck-after-syntax-check-hook #'+doom-modeline|update-flycheck-segment) -(defun +doom-modeline|update-flycheck-segment () +(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) +(defun +doom-modeline|update-flycheck-segment (status) (setq +doom-modeline--flycheck - (pcase flycheck-last-status-change + (pcase status ('finished (if flycheck-current-errors (let-alist (flycheck-count-errors flycheck-current-errors) (let ((sum (+ (or .error 0) (or .warning 0)))) @@ -446,7 +446,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." (def-modeline-segment! flycheck "Displays color-coded flycheck error status in the current buffer with pretty icons." - +doom-modeline--flycheck) + (if (bound-and-true-p flycheck-mode) +doom-modeline--flycheck)) ;; From 630188e27e04449eb27bd9dec27630b26a5f0d13 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 26 Apr 2018 04:56:30 -0400 Subject: [PATCH 1067/4235] ui/doom-modeline: optimize flycheck segment --- modules/ui/doom-modeline/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index a26f72136..42e5758ae 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -427,7 +427,8 @@ directory, the file name, and its state (modified, read-only or non-existent)." (defvar-local +doom-modeline--flycheck nil) (add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) -(defun +doom-modeline|update-flycheck-segment (status) +(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) +(defun +doom-modeline|update-flycheck-segment (&optional status) (setq +doom-modeline--flycheck (pcase status ('finished (if flycheck-current-errors @@ -446,7 +447,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." (def-modeline-segment! flycheck "Displays color-coded flycheck error status in the current buffer with pretty icons." - (if (bound-and-true-p flycheck-mode) +doom-modeline--flycheck)) + +doom-modeline--flycheck) ;; From 306c41e7b877aa13d0a4b3d175fbfa86429a1238 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 26 Apr 2018 17:12:17 -0400 Subject: [PATCH 1068/4235] Revise company module flag comment descriptions --- init.example.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.example.el b/init.example.el index d9dd40a12..3c759cee0 100644 --- a/init.example.el +++ b/init.example.el @@ -21,8 +21,8 @@ :completion (company ; the ultimate code completion backend - +auto ; enable completion by default - +childframe) ; use childframes whenever possible. Only available on Emacs +26 + +auto ; as-you-type code completion + +childframe) ; a nicer company UI. Emacs +26 only! ;helm ; the *other* search engine for love and life ;ido ; the other *other* search engine... ivy ; a search engine for love and life From 37b2563dd1385ec1e80d86a72d0cd6763411da71 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 26 Apr 2018 17:56:58 -0400 Subject: [PATCH 1069/4235] lang/javascript: detect preact import (for rjsx-mode) --- modules/lang/javascript/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 4c303d848..1dfaa4215 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -47,14 +47,15 @@ :mode "components/.+\\.js$" :init (defun +javascript-jsx-file-p () + "Detect React or preact imports early in the file." (and buffer-file-name (string= (file-name-extension buffer-file-name) "js") - (re-search-forward "\\(^\\s-*import React\\|\\( from \\|require(\\)[\"']react\\)" + (re-search-forward "\\(^\\s-*import +\\(?:pr\\|R\\)eact\\|\\( from \\|require(\\)[\"']p?react\\)" magic-mode-regexp-match-limit t) (progn (goto-char (match-beginning 1)) (not (sp-point-in-string-or-comment))))) - (push (cons #'+javascript-jsx-file-p 'rjsx-mode) magic-mode-alist) + (push '(+javascript-jsx-file-p . rjsx-mode) magic-mode-alist) :config (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (add-hook! 'rjsx-mode-hook From 26eb33e36e2e1225a193f58ea0be195e4ad323c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 26 Apr 2018 22:27:08 -0400 Subject: [PATCH 1070/4235] feature/evil: fix :vs/:sp not focusing split w/ a file argument #552 --- modules/feature/evil/autoload/evil.el | 31 +++++++++++++++++++++++++++ modules/feature/evil/config.el | 13 +++-------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index f2be7d76f..a92bf127d 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -308,3 +308,34 @@ more information on modifiers." path file-name t t 1)))) (replace-regexp-in-string regexp "\\1" file-name t))) +;;;###autoload (autoload '+evil*window-split "feature/evil/autoload/evil" nil t) +(evil-define-command +evil*window-split (&optional count file) + "Same as `evil-window-split', but focuses (and recenters) the new split." + :repeat nil + (interactive "P") + (split-window (selected-window) count + (if evil-split-window-below 'above 'below)) + (call-interactively + (if evil-split-window-below + #'evil-window-up + #'evil-window-down)) + (recenter) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (if file (evil-edit file))) + +;;;###autoload (autoload '+evil*window-vsplit "feature/evil/autoload/evil" nil t) +(evil-define-command +evil*window-vsplit (&optional count file) + "Same as `evil-window-vsplit', but focuses (and recenters) the new split." + :repeat nil + (interactive "P") + (split-window (selected-window) count + (if evil-vsplit-window-right 'left 'right)) + (call-interactively + (if evil-vsplit-window-right + #'evil-window-left + #'evil-window-right)) + (recenter) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (if file (evil-edit file))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 456e67243..a4da7d186 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -128,16 +128,9 @@ table))) (add-hook 'minibuffer-inactive-mode-hook #'+evil*fix-dabbrev-in-minibuffer) - ;; Move to new split -- setting `evil-split-window-below' & - ;; `evil-vsplit-window-right' to non-nil mimics this, but that doesn't update - ;; window history. That means when you delete a new split, Emacs leaves you on - ;; the 2nd to last window on the history stack, which is jarring. - ;; - ;; Also recenters window on cursor in new split - (defun +evil*window-follow (&rest _) (evil-window-down 1) (recenter)) - (advice-add #'evil-window-split :after #'+evil*window-follow) - (defun +evil*window-vfollow (&rest _) (evil-window-right 1) (recenter)) - (advice-add #'evil-window-vsplit :after #'+evil*window-vfollow) + ;; Focus and recenter new splits + (advice-add #'evil-window-split :override #'+evil*window-split) + (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) ;; These arg types will highlight matches in the current buffer (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) From 5c49d9c7c07adc9ab024912f221353f5eacd153a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 27 Apr 2018 03:28:48 -0400 Subject: [PATCH 1071/4235] lang/javascript: don't look for import preact Incorrect way to import preact. --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 1dfaa4215..9d52b951f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -50,7 +50,7 @@ "Detect React or preact imports early in the file." (and buffer-file-name (string= (file-name-extension buffer-file-name) "js") - (re-search-forward "\\(^\\s-*import +\\(?:pr\\|R\\)eact\\|\\( from \\|require(\\)[\"']p?react\\)" + (re-search-forward "\\(^\\s-*import +React\\|\\( from \\|require(\\)[\"']p?react\\)" magic-mode-regexp-match-limit t) (progn (goto-char (match-beginning 1)) (not (sp-point-in-string-or-comment))))) From c23974e1d5c2af6c0f47dc0ba13dffbb1acea964 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Apr 2018 03:28:59 -0400 Subject: [PATCH 1072/4235] app/write: new +write-mode-map keymap --- modules/app/write/autoload.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/app/write/autoload.el b/modules/app/write/autoload.el index 9a9bfd7b2..bda944dda 100644 --- a/modules/app/write/autoload.el +++ b/modules/app/write/autoload.el @@ -1,10 +1,14 @@ ;;; app/write/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defvar +write-mode-map (make-sparse-keymap) + "TODO") + ;;;###autoload (define-minor-mode +write-mode "Turns Emacs into a more comfortable writing environment and word processor." :init-value nil - :keymap nil + :keymap +write-mode-map (setq-local visual-fill-column-center-text t) (when +write-text-scale (text-scale-set (if +write-mode 2 0))) From d67496e00710eb008004f32e22c9acfcb2382b6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Apr 2018 03:49:42 -0400 Subject: [PATCH 1073/4235] Fix vestigial references to warn! macro This macro was removed some time ago (and moved to doom-doctor). Where necessary, these warnings have been moved to that module's doctor.el file. --- modules/app/write/doctor.el | 6 ++++++ modules/lang/csharp/config.el | 4 ---- modules/lang/csharp/doctor.el | 6 ++++++ modules/lang/java/config.el | 6 +++--- 4 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 modules/app/write/doctor.el create mode 100644 modules/lang/csharp/doctor.el diff --git a/modules/app/write/doctor.el b/modules/app/write/doctor.el new file mode 100644 index 000000000..609c5574a --- /dev/null +++ b/modules/app/write/doctor.el @@ -0,0 +1,6 @@ +;;; app/write/doctor.el -*- lexical-binding: t; -*- + +(when (featurep! +langtool) + (require 'langtool) + (unless (file-exists-p langtool-language-tool-jar) + (warn! "Couldn't find languagetool-commandline.jar"))) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index fc8debc9e..306f93b12 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -11,10 +11,6 @@ (setq omnisharp-auto-complete-want-documentation nil omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (let ((omnisharp-bin (or omnisharp-server-executable-path (omnisharp--server-installation-path t)))) - (unless (file-exists-p omnisharp-bin) - (warn! "Omnisharp server isn't installed, completion won't work"))) - (add-hook! csharp-mode #'(flycheck-mode omnisharp-mode)) (defun +csharp|cleanup-omnisharp-server () diff --git a/modules/lang/csharp/doctor.el b/modules/lang/csharp/doctor.el new file mode 100644 index 000000000..b546f97be --- /dev/null +++ b/modules/lang/csharp/doctor.el @@ -0,0 +1,6 @@ +;;; lang/csharp/doctor.el -*- lexical-binding: t; -*- + +(require 'omnisharp) +(let ((omnisharp-bin (or omnisharp-server-executable-path (omnisharp--server-installation-path t)))) + (unless (file-exists-p omnisharp-bin) + (warn! "Omnisharp server isn't installed, completion won't work"))) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index c565b493e..fd6619ea9 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -3,9 +3,9 @@ (add-hook 'java-mode-hook #'rainbow-delimiters-mode) (cond ((featurep! +meghanada) (load! +meghanada)) - ((featurep! +eclim) ; FIXME lang/java +eclim - ;;(load! +eclim) - (warn! "Eclim support isn't implemented yet"))) + ;; TODO lang/java +eclim + ;; ((featurep! +eclim) (load! +eclim)) + ) ;; From 45bc6e49d35f34859954b5372f00a2a26c7d5a9b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Apr 2018 15:54:39 -0400 Subject: [PATCH 1074/4235] lang/web: web-mode-enable-auto-quoting = nil --- modules/lang/web/+html.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 7e3b07cf9..6e93acb6f 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -14,7 +14,8 @@ :mode "templates/.+\\.php$" :config (set! :company-backend 'web-mode '(company-web-html company-yasnippet)) - (setq web-mode-enable-html-entities-fontification t) + (setq web-mode-enable-html-entities-fontification t + web-mode-enable-auto-quoting nil) (map! :map web-mode-map (:localleader From ed1ede43858fc865098724764f74be370b0eeeab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Apr 2018 16:04:11 -0400 Subject: [PATCH 1075/4235] lang/javascript: fix electric > not closing tags in rjsx-mode --- modules/lang/javascript/config.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 9d52b951f..8efb27009 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -60,7 +60,16 @@ (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (add-hook! 'rjsx-mode-hook ;; jshint doesn't know how to deal with jsx - (push 'javascript-jshint flycheck-disabled-checkers))) + (push 'javascript-jshint flycheck-disabled-checkers)) + + ;; `rjsx-electric-gt' relies on js2's parser to tell it when the cursor is in + ;; a self-closing tag, so that it can insert a matching ending tag at point. + ;; However, the parser doesn't run immediately, so a fast typist can outrun + ;; it, causing issues, so force it to parse. + (defun +javascript|reparse (n) + ;; if n != 0, then rjsx-maybe-reparse will be run elsewhere + (if (= n 0) (rjsx-maybe-reparse))) + (advice-add #'rjsx-electric-gt :before #'+javascript|reparse)) (def-package! coffee-mode From 2d9fb67903fa43a94fb2d4d2386276dfa667111f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Apr 2018 16:12:22 -0400 Subject: [PATCH 1076/4235] app/write: minor refactor (use :when instead of when) --- modules/app/write/config.el | 42 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 5db8ad4c6..dc7206216 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -19,30 +19,28 @@ ;; Plugins ;; -(when (featurep! +langtool) - (def-package! langtool - :commands (langtool-check - langtool-check-done - langtool-switch-default-language - langtool-show-message-at-point - langtool-correct-buffer) - :init - (setq langtool-default-language "en-US") - :config - (unless langtool-language-tool-jar - (setq langtool-language-tool-jar - (cond (IS-MAC - "/usr/local/Cellar/languagetool/4.0/libexec/languagetool-commandline.jar") - (IS-LINUX - "/usr/share/java/languagetool/languagetool-commandline.jar"))) - (unless (file-exists-p langtool-language-tool-jar) - (warn! "Couldn't find languagetool-commandline.jar"))))) +(def-package! langtool + :when (featurep! +langtool) + :commands (langtool-check + langtool-check-done + langtool-switch-default-language + langtool-show-message-at-point + langtool-correct-buffer) + :init + (setq langtool-default-language "en-US") + :config + (unless langtool-language-tool-jar + (setq langtool-language-tool-jar + (cond (IS-MAC + "/usr/local/Cellar/languagetool/4.0/libexec/languagetool-commandline.jar") + (IS-LINUX + "/usr/share/java/languagetool/languagetool-commandline.jar"))))) -(when (featurep! +wordnut) - (def-package! wordnut - :commands (wordnut-search - wordnut-lookup-current-word))) +(def-package! wordnut + :when (featurep! +wordnut) + :commands (wordnut-search + wordnut-lookup-current-word)) (def-package! synosaurus From 7173e6abcde973f57cc815dde8b1e2365a457314 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Apr 2018 00:46:45 -0400 Subject: [PATCH 1077/4235] lang/org: fix TAB in insert mode not indenting --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 8de5312da..fc3dac9ed 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -252,7 +252,7 @@ between the two." (defun +org|setup-evil () (require 'evil-org) - (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold) + (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold t) (map! :map outline-mode-map :n "^" nil From 8d81975fa75c6e54f10ec1fe2ed1354afd277d80 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Apr 2018 22:52:32 -0400 Subject: [PATCH 1078/4235] lang/javascript: enable tide-completion-detailed & tide-always-show-documentation --- modules/lang/javascript/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 8efb27009..4ff75e68f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -90,6 +90,8 @@ (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config + (setq tide-completion-detailed t + tide-always-show-documentation t) ;; code completion (after! company ;; tide affects the global `company-backends', undo this so doom can handle From 0b33e729e037d8b1a357c2d55cc206a55a620328 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Apr 2018 22:52:49 -0400 Subject: [PATCH 1079/4235] Projectile: ignore ./node_modules & ./flow-typed --- core/core-projects.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index a293a8fc2..0e0087063 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -20,7 +20,8 @@ (setq projectile-globally-ignored-directories (append projectile-globally-ignored-directories - (list (abbreviate-file-name doom-local-dir) ".sync")) + (list (abbreviate-file-name doom-local-dir) ".sync" + "node_modules" "flow-typed")) projectile-other-file-alist (append projectile-other-file-alist '(("css" . ("scss" "sass" "less" "styl")) From a6c0be09cee6cb20f6ee7e7555bf1b8b2198fa5d Mon Sep 17 00:00:00 2001 From: Javier Peralta Date: Tue, 1 May 2018 11:11:28 -0600 Subject: [PATCH 1080/4235] doom/sudo-find-file work on remote files --- core/autoload/files.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index b45c66df6..c2bf906b3 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -7,7 +7,9 @@ (list (read-file-name "Open as root: "))) (find-file (if (file-writable-p file) file - (concat "/sudo:root@localhost:" file)))) + (if (file-remote-p file) + (concat "/" (file-remote-p file 'method) ":" (file-remote-p file 'user) "@" (file-remote-p file 'host) "|sudo:root@" (file-remote-p file 'host) ":" (file-remote-p file 'localname)) + (concat "/sudo:root@localhost:" file))))) ;;;###autoload (defun doom/sudo-this-file () From 9e315c93da031205f45d9bb41438694395d894fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 May 2018 15:53:51 +0200 Subject: [PATCH 1081/4235] Revert sp-autowrap-region to default Fixes wrapping regions for non-evil users --- core/core-editor.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 2f805f22c..9029ab4e9 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -179,8 +179,7 @@ extension, try to guess one." (smartparens-global-mode +1) (require 'smartparens-config) - (setq sp-autowrap-region nil ; let evil-surround handle this - sp-highlight-pair-overlay nil + (setq sp-highlight-pair-overlay nil sp-cancel-autoskip-on-backward-movement nil sp-show-pair-delay 0 sp-max-pair-length 3) From 87aa05ffee1e96d0af5ef8fd319f34bbd6a6a358 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 May 2018 23:41:17 +0200 Subject: [PATCH 1082/4235] ui/doom: solaire-mode support for doom-nord-light --- modules/ui/doom/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index f6cc4dab5..015219684 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -5,6 +5,7 @@ (doom-dracula . t) (doom-molokai . t) (doom-nord . t) + (doom-nord-light . t) (doom-nova . nil) (doom-one . t) (doom-one-light . t) From c05b16ee6f5ae33d3773463a2907ba3aefe75b26 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 May 2018 15:59:54 +0200 Subject: [PATCH 1083/4235] Minor refactor/reformatting --- modules/feature/evil/config.el | 2 +- modules/feature/lookup/config.el | 4 +++- modules/ui/doom-modeline/config.el | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index a4da7d186..ce6a9a437 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -121,7 +121,7 @@ (advice-add #'evil-ex-replace-special-filenames :override #'+evil*resolve-vim-path) ;; make `try-expand-dabbrev' from `hippie-expand' work in minibuffer - ;; @see `he-dabbrev-beg', so we need re-define syntax for '/' + ;; @see `he-dabbrev-beg', so we need to redefine syntax for '/' (defun +evil*fix-dabbrev-in-minibuffer () (set-syntax-table (let* ((table (make-syntax-table))) (modify-syntax-entry ?/ "." table) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index c22e34d40..7e4a8fa46 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -108,7 +108,9 @@ properties: ;; xref ;; -(after! xref +(def-package! xref + :commands (xref-backend-identifier-at-point xref-find-definitions xref-find-references) + :config ;; By default, `etags--xref-backend' is the default xref backend. No need. ;; We'll set these up ourselves in other modules. (setq-default xref-backend-functions '(t)) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 42e5758ae..f4557afc3 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -428,6 +428,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." (defvar-local +doom-modeline--flycheck nil) (add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) (add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) + (defun +doom-modeline|update-flycheck-segment (&optional status) (setq +doom-modeline--flycheck (pcase status @@ -480,7 +481,7 @@ lines are selected, or the NxM dimensions of a block selection." (let ((cols (abs (- (doom-column end) (doom-column beg))))) (format "%dx%dB" lines cols))) - ((eq 'line evil-visual-selection) + ((eq evil-visual-selection 'line) (format "%dL" lines)) ((> lines 1) (format "%dC %dL" (- end beg) lines)) From 5c5cbe23dbf5cd9302034b774f3cd844c57a33f6 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Thu, 3 May 2018 20:12:21 +0200 Subject: [PATCH 1084/4235] Enabled vanilla anzu. --- modules/ui/doom-modeline/config.el | 28 ++++++++++++++++++++++++++++ modules/ui/doom-modeline/packages.el | 3 ++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index f4557afc3..ca91d34d3 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -2,6 +2,34 @@ ;; anzu and evil-anzu expose current/total state that can be displayed in the ;; mode-line. + +(def-package! anzu + :defer t + :commands 'isearch + :config + (setq anzu-cons-mode-line-p nil + anzu-minimum-input-length 1 + anzu-search-threshold 250) + (global-anzu-mode +1) + + (defun +doom-modeline*fix-anzu-count (positions here) + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) + + ;; Avoid anzu conflicts across buffers + (mapc #'make-variable-buffer-local + '(anzu--total-matched anzu--current-position anzu--state + anzu--cached-count anzu--cached-positions anzu--last-command + anzu--last-isearch-string anzu--overflow-p)) + ;; Ensure anzu state is cleared when searches & iedit are done + (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) + (add-hook 'doom-escape-hook #'anzu--reset-status t) + (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) + (def-package! evil-anzu :requires evil :init diff --git a/modules/ui/doom-modeline/packages.el b/modules/ui/doom-modeline/packages.el index b5f2ee002..ae47c9eef 100644 --- a/modules/ui/doom-modeline/packages.el +++ b/modules/ui/doom-modeline/packages.el @@ -9,10 +9,11 @@ ;; Optional ;;(require 'flycheck) -;;(require 'anzu) ;;(require 'iedit) ;;(require 'evil-multiedit) +(require 'anzu) + (when (featurep! :feature evil) (package! evil-anzu)) From d0b183b770fcaa9d2df9b27b9a57f23396a7afc2 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Thu, 3 May 2018 21:23:35 +0200 Subject: [PATCH 1085/4235] Anzu mode made right. --- modules/ui/doom-modeline/config.el | 7 +++++-- modules/ui/doom-modeline/packages.el | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index ca91d34d3..086800c3d 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -4,8 +4,11 @@ ;; mode-line. (def-package! anzu - :defer t - :commands 'isearch + :commands (anzu-mode global-anzu-mode + anzu-query-replace anzu-query-replace-regexp + anzu-query-replace-at-cursor anzu-replace-at-cursor-thing) + :init + (add-transient-hook! #'isearch-mode (require 'anzu)) :config (setq anzu-cons-mode-line-p nil anzu-minimum-input-length 1 diff --git a/modules/ui/doom-modeline/packages.el b/modules/ui/doom-modeline/packages.el index ae47c9eef..72f5044df 100644 --- a/modules/ui/doom-modeline/packages.el +++ b/modules/ui/doom-modeline/packages.el @@ -12,7 +12,7 @@ ;;(require 'iedit) ;;(require 'evil-multiedit) -(require 'anzu) +(package! anzu) (when (featurep! :feature evil) (package! evil-anzu)) From 437d4c8ddaf07c42f7f0ef79162087450efc57fc Mon Sep 17 00:00:00 2001 From: Lorenzo Giuliani Date: Fri, 4 May 2018 10:10:08 +0200 Subject: [PATCH 1086/4235] fix(lang/javascript): add flycheck-mode to typescript-mode hooks --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 4ff75e68f..7fcb72803 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -37,7 +37,7 @@ (def-package! typescript-mode :mode "\\.ts$" :config - (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) + (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) From 9de95ae8095d5c22fafc0345b590d0316806be23 Mon Sep 17 00:00:00 2001 From: "Liu, Joey" Date: Thu, 3 May 2018 21:35:48 -0400 Subject: [PATCH 1087/4235] Fix: desc of keymap git staging --- modules/config/default/+bindings.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 7f03cda27..4236d3f88 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -204,10 +204,10 @@ :desc "Magit pull popup" :n "P" #'magit-pull-popup :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk :desc "Git revert file" :n "R" #'vc-revert - :desc "Git status" :n "s" #'git-gutter:stage-hunk - :desc "Git stage hunk" :n "S" #'magit-stage-file + :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk + :desc "Git stage file" :n "S" #'magit-stage-file :desc "Git time machine" :n "t" #'git-timemachine-toggle - :desc "Git stage hunk" :n "U" #'magit-unstage-file + :desc "Git unstage file" :n "U" #'magit-unstage-file :desc "Next hunk" :nv "]" #'git-gutter:next-hunk :desc "Previous hunk" :nv "[" #'git-gutter:previous-hunk) From e6c7c8a8cd3728161a7e3539620b20b5267290ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 4 May 2018 10:02:32 +0200 Subject: [PATCH 1088/4235] ui/doom-modeline: reduce redundant anzu config --- modules/ui/doom-modeline/config.el | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 086800c3d..b8fe7a2c4 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -33,33 +33,13 @@ (add-hook 'doom-escape-hook #'anzu--reset-status t) (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) + (def-package! evil-anzu - :requires evil + :defer t :init (add-transient-hook! #'evil-ex-start-search (require 'evil-anzu)) - (add-transient-hook! #'evil-ex-start-word-search (require 'evil-anzu)) - :config - (setq anzu-cons-mode-line-p nil - anzu-minimum-input-length 1 - anzu-search-threshold 250) + (add-transient-hook! #'evil-ex-start-word-search (require 'evil-anzu))) - (defun +doom-modeline*fix-anzu-count (positions here) - (cl-loop for (start . end) in positions - collect t into before - when (and (>= here start) (<= here end)) - return (length before) - finally return 0)) - (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) - - ;; Avoid anzu conflicts across buffers - (mapc #'make-variable-buffer-local - '(anzu--total-matched anzu--current-position anzu--state - anzu--cached-count anzu--cached-positions anzu--last-command - anzu--last-isearch-string anzu--overflow-p)) - ;; Ensure anzu state is cleared when searches & iedit are done - (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook 'doom-escape-hook #'anzu--reset-status t) - (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) ;; fish-style modeline (def-package! shrink-path From 85e5ac45146824947b7f888ba9aaf6e8a491bce3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 4 May 2018 10:32:46 +0200 Subject: [PATCH 1089/4235] ui/doom-modeline: adjust bars when height/width is changed Also when doom-big-font-mode is toggled. --- modules/ui/doom-modeline/autoload.el | 19 +++++++------- modules/ui/doom-modeline/config.el | 37 +++++++++++++++++++++------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/modules/ui/doom-modeline/autoload.el b/modules/ui/doom-modeline/autoload.el index ddebf6a9b..7af38a44e 100644 --- a/modules/ui/doom-modeline/autoload.el +++ b/modules/ui/doom-modeline/autoload.el @@ -1,17 +1,16 @@ ;;; ui/doom-modeline/autoload.el -*- lexical-binding: t; -*- -(defvar +doom-modeline--old-height nil) - ;;;###autoload (defun +doom-modeline|resize-for-big-font () "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was made to be added to `doom-big-font-mode-hook'." - (if doom-big-font-mode - (let* ((font-size (font-get doom-font :size)) - (big-size (font-get doom-big-font :size)) - (ratio (/ (float big-size) font-size))) - (setq +doom-modeline--old-height +doom-modeline-height - +doom-modeline-height (ceiling (* +doom-modeline--old-height ratio)))) - (setq +doom-modeline-height +doom-modeline--old-height)) - (+doom-modeline|init)) + (let ((default-height (default-value '+doom-modeline-height))) + (if doom-big-font-mode + (let* ((font-size (font-get doom-font :size)) + (big-size (font-get doom-big-font :size)) + (ratio (/ (float big-size) font-size))) + (setq +doom-modeline-height (ceiling (* default-height ratio)))) + (setq +doom-modeline-height default-height)) + ;; already has a variable watcher in Emacs 26+ + (unless EMACS26+ (+doom-modeline|refresh-bars)))) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index b8fe7a2c4..321aed44c 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -178,12 +178,11 @@ active." (eq (selected-window) +doom-modeline-current-window)) ;; Inspired from `powerline's `pl/make-xpm'. -(defun +doom-modeline--make-xpm (face &optional height width) +(defun +doom-modeline--make-xpm (face width height) "Create an XPM bitmap." (propertize " " 'display - (let ((data (make-list (or height +doom-modeline-height) - (make-list (or width +doom-modeline-bar-width) 1))) + (let ((data (make-list height (make-list width 1))) (color (or (face-background face nil t) "None"))) (ignore-errors (create-image @@ -617,6 +616,21 @@ Returns \"\" to not break --no-window-system." +doom-modeline--bar-inactive) "")) +(when EMACS26+ + (add-variable-watcher + '+doom-modeline-height + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (+doom-modeline|refresh-bars +doom-modeline-bar-width val)))) + + (add-variable-watcher + '+doom-modeline-bar-width + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (+doom-modeline|refresh-bars val +doom-modeline-height)))) + + (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font)) + ;; ;; Mode lines @@ -647,11 +661,19 @@ Returns \"\" to not break --no-window-system." ;; Hooks ;; +(defun +doom-modeline|refresh-bars (&optional width height) + (setq +doom-modeline--bar-active + (+doom-modeline--make-xpm 'doom-modeline-bar + (or width +doom-modeline-bar-width) + (or height +doom-modeline-height)) + +doom-modeline--bar-inactive + (+doom-modeline--make-xpm 'doom-modeline-inactive-bar + (or width +doom-modeline-bar-width) + (or height +doom-modeline-height)))) + (defun +doom-modeline|init () ;; Create bars - (setq +doom-modeline--bar-active (+doom-modeline--make-xpm 'doom-modeline-bar) - +doom-modeline--bar-inactive (+doom-modeline--make-xpm 'doom-modeline-inactive-bar)) - + (+doom-modeline|refresh-bars) (unless after-init-time ;; These buffers are already created and don't get modelines. For the love ;; of Emacs, someone give the man a modeline! @@ -695,6 +717,3 @@ Returns \"\" to not break --no-window-system." (add-hook 'focus-in-hook #'+doom-modeline|focus) (add-hook 'focus-out-hook #'+doom-modeline|unfocus) - -;; -;; (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font) From 7553f83b04ae6f29a3139f71dbe8269bb80c9c67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 4 May 2018 10:37:29 +0200 Subject: [PATCH 1090/4235] ui/doom-modeline: minor refactoring --- modules/ui/doom-modeline/config.el | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 321aed44c..a89fedc59 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -177,9 +177,8 @@ active." (defsubst active () (eq (selected-window) +doom-modeline-current-window)) -;; Inspired from `powerline's `pl/make-xpm'. (defun +doom-modeline--make-xpm (face width height) - "Create an XPM bitmap." + "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." (propertize " " 'display (let ((data (make-list height (make-list width 1))) @@ -211,12 +210,12 @@ active." (buffer-file-truename (or buffer-file-truename ""))) (propertize (pcase +doom-modeline-buffer-file-name-style - ('truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) - ('truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) - ('truncate-all (+doom-modeline--buffer-file-name-truncate t)) - ('relative-to-project (+doom-modeline--buffer-file-name-relative)) - ('relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) - ('file-name (propertize (file-name-nondirectory buffer-file-name) + (`truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) + (`truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) + (`truncate-all (+doom-modeline--buffer-file-name-truncate t)) + (`relative-to-project (+doom-modeline--buffer-file-name-relative)) + (`relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) + (`file-name (propertize (file-name-nondirectory buffer-file-name) 'face (let ((face (or (and (buffer-modified-p) 'doom-modeline-buffer-modified) @@ -695,7 +694,7 @@ Returns \"\" to not break --no-window-system." ;; Bootstrap ;; -(doom-set-modeline 'main t) +(doom-set-modeline 'main t) ; set default modeline (add-hook 'doom-init-theme-hook #'+doom-modeline|init) (add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) @@ -704,15 +703,13 @@ Returns \"\" to not break --no-window-system." (add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) (add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) -;; TODO Refactor me +;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) (defvar +doom-modeline-remap-face-cookie nil) (defun +doom-modeline|focus () - (require 'face-remap) (when +doom-modeline-remap-face-cookie + (require 'face-remap) (face-remap-remove-relative +doom-modeline-remap-face-cookie))) - (defun +doom-modeline|unfocus () - (require 'face-remap) (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) (add-hook 'focus-in-hook #'+doom-modeline|focus) From 27153d128ce59ac2850a5eb5c5536f28cd0c3f84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 4 May 2018 14:57:27 +0200 Subject: [PATCH 1091/4235] feature/evil: remove evil-snipe-disabled-modes These have been set upstream. --- modules/feature/evil/config.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index ce6a9a437..a2a3f77db 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -329,10 +329,6 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-scope 'line evil-snipe-repeat-scope 'visible evil-snipe-char-fold t - evil-snipe-disabled-modes - '(org-agenda-mode magit-mode git-rebase-mode elfeed-show-mode - elfeed-search-mode ranger-mode magit-repolist-mode mu4e-main-mode - mu4e-view-mode mu4e-headers-mode mu4e~update-mail-mode) evil-snipe-aliases '((?\; "[;:]"))) :config (evil-snipe-override-mode +1)) From f319034c5afa9421e11578fc738258627de67f43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 4 May 2018 15:06:05 +0200 Subject: [PATCH 1092/4235] feature/evil: refactor multiple-cursors compat config --- modules/feature/evil/config.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index a2a3f77db..ec5c19b37 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -434,22 +434,22 @@ the new algorithm is confusing, like in python or ruby." (setq +evil--mc-compat-evil-prev-state nil) (setq +evil--mc-compat-mark-was-active nil)))) - (add-hook 'multiple-cursors-mode-enabled-hook '+evil|mc-compat-switch-to-emacs-state) - (add-hook 'multiple-cursors-mode-disabled-hook '+evil|mc-compat-back-to-previous-state) + (add-hook 'multiple-cursors-mode-enabled-hook #'+evil|mc-compat-switch-to-emacs-state) + (add-hook 'multiple-cursors-mode-disabled-hook #'+evil|mc-compat-back-to-previous-state) + + ;; When running edit-lines, point will return (position + 1) as a + ;; result of how evil deals with regions + (defun +evil*mc/edit-lines (&rest _) + (when (+evil--visual-or-normal-p) + (if (> (point) (mark)) + (goto-char (1- (point))) + (push-mark (1- (mark)))))) + (advice-add #'mc/edit-lines :before #'+evil*mc/edit-lines) (defun +evil|mc-evil-compat-rect-switch-state () (if rectangular-region-mode (+evil|mc-compat-switch-to-emacs-state) (setq +evil--mc-compat-evil-prev-state nil))) - - ;; When running edit-lines, point will return (position + 1) as a - ;; result of how evil deals with regions - (defadvice mc/edit-lines (before change-point-by-1 activate) - (when (+evil--visual-or-normal-p) - (if (> (point) (mark)) - (goto-char (1- (point))) - (push-mark (1- (mark)))))) - (add-hook 'rectangular-region-mode-hook '+evil|mc-evil-compat-rect-switch-state) (defvar mc--default-cmds-to-run-once nil)) From 1fc15e41c5cd1551a4fb98a5ffc556acff77ef36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 May 2018 07:49:20 +0200 Subject: [PATCH 1093/4235] feature/evil: minor reformatting --- modules/feature/evil/config.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index ec5c19b37..b7a27fae3 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -116,12 +116,13 @@ (advice-add #'windmove-do-window-select :around #'+evil*restore-initial-state-on-windmove) ;; Don't move cursor when indenting (advice-add #'evil-indent :around #'+evil*static-reindent) - ;; monkey patch `evil-ex-replace-special-filenames' to add more ex - ;; substitution flags to evil-mode + ;; monkey patch `evil-ex-replace-special-filenames' to improve support for + ;; file modifiers like %:p:h. This adds support for most of vim's modifiers, + ;; and one custom one: %:P (expand to the project root). (advice-add #'evil-ex-replace-special-filenames :override #'+evil*resolve-vim-path) - ;; make `try-expand-dabbrev' from `hippie-expand' work in minibuffer - ;; @see `he-dabbrev-beg', so we need to redefine syntax for '/' + ;; make `try-expand-dabbrev' from `hippie-expand' work in minibuffer. See + ;; `he-dabbrev-beg', so we need to redefine syntax for '/' (defun +evil*fix-dabbrev-in-minibuffer () (set-syntax-table (let* ((table (make-syntax-table))) (modify-syntax-entry ?/ "." table) @@ -132,16 +133,15 @@ (advice-add #'evil-window-split :override #'+evil*window-split) (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) - ;; These arg types will highlight matches in the current buffer - (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) - (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've ;; got to write my own argument type and interactive code to get it to do so. (evil-ex-define-argument-type global-delim-match :runner +evil-ex-global-delim-match) - (dolist (sym '(evil-ex-global evil-ex-global-inverted)) (evil-set-command-property sym :ex-arg 'global-delim-match)) + ;; These arg types will highlight matches in the current buffer + (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) + (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) ;; Other commands can make use of this (evil-define-interactive-code "" :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) From 4ef70174b0c898649c4cccb956cdc1ac73bc7b80 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 May 2018 07:50:04 +0200 Subject: [PATCH 1094/4235] config/default: minor reformatting --- modules/config/default/+bindings.el | 44 ++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4236d3f88..4c282bd8c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -25,30 +25,30 @@ :gnvime "M-:" #'doom/open-scratch-buffer ;; Text-scaling - :ne "M-+" (λ! (text-scale-set 0)) - :ne "M-=" #'text-scale-increase - :ne "M--" #'text-scale-decrease + :ne "M-+" (λ! (text-scale-set 0)) + :ne "M-=" #'text-scale-increase + :ne "M--" #'text-scale-decrease ;; Simple window/frame navigation/manipulation - :ne "C-`" #'+popup/toggle - :ne "C-~" #'+popup/raise - :ne "M-t" #'+workspace/new - :ne "M-T" #'+workspace/display - :ne "M-w" #'delete-window - :ne "M-W" #'delete-frame - :ne "C-M-f" #'toggle-frame-fullscreen - :ne "M-n" #'evil-buffer-new - :ne "M-N" #'make-frame - :ne "M-1" (λ! (+workspace/switch-to 0)) - :ne "M-2" (λ! (+workspace/switch-to 1)) - :ne "M-3" (λ! (+workspace/switch-to 2)) - :ne "M-4" (λ! (+workspace/switch-to 3)) - :ne "M-5" (λ! (+workspace/switch-to 4)) - :ne "M-6" (λ! (+workspace/switch-to 5)) - :ne "M-7" (λ! (+workspace/switch-to 6)) - :ne "M-8" (λ! (+workspace/switch-to 7)) - :ne "M-9" (λ! (+workspace/switch-to 8)) - :ne "M-0" #'+workspace/switch-to-last + :ne "C-`" #'+popup/toggle + :ne "C-~" #'+popup/raise + :ne "M-t" #'+workspace/new + :ne "M-T" #'+workspace/display + :ne "M-w" #'delete-window + :ne "M-W" #'delete-frame + :ne "C-M-f" #'toggle-frame-fullscreen + :ne "M-n" #'evil-buffer-new + :ne "M-N" #'make-frame + :ne "M-1" (λ! (+workspace/switch-to 0)) + :ne "M-2" (λ! (+workspace/switch-to 1)) + :ne "M-3" (λ! (+workspace/switch-to 2)) + :ne "M-4" (λ! (+workspace/switch-to 3)) + :ne "M-5" (λ! (+workspace/switch-to 4)) + :ne "M-6" (λ! (+workspace/switch-to 5)) + :ne "M-7" (λ! (+workspace/switch-to 6)) + :ne "M-8" (λ! (+workspace/switch-to 7)) + :ne "M-9" (λ! (+workspace/switch-to 8)) + :ne "M-0" #'+workspace/switch-to-last ;; Other sensible, textmate-esque global bindings :ne "M-r" #'+eval/buffer From 7269abbe2f56978ad75f8c6f1466cd2b627e8871 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:10:58 +0200 Subject: [PATCH 1095/4235] Add doom/version command --- core/autoload/help.el | 15 +++++++++++++++ modules/config/default/+bindings.el | 1 + 2 files changed, 16 insertions(+) diff --git a/core/autoload/help.el b/core/autoload/help.el index 3dd025fb8..4e61a056b 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -113,3 +113,18 @@ in, or d) the module associated with the current major mode (see (fill-region (point-min) (point-max))) (quiet! (indent-region (point-min) (point-max)))) (string-trim (buffer-string)))) + +;;;###autoload +(defun doom/version () + "Display the current version of Doom & Emacs, including the current Doom +branch and commit." + (interactive) + (message "Doom v%s (Emacs v%s). Branch: %s. Commit: %s." + doom-version + emacs-version + (if-let* ((branch (vc-git--symbolic-ref "core/core.el"))) + branch + "n/a") + (if-let* ((rev (vc-git-working-revision "core/core.el"))) + rev + "n/a"))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4c282bd8c..c8ab4f626 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -230,6 +230,7 @@ :desc "Reload theme" :n "R" #'doom//reload-theme :desc "Describe DOOM setting" :n "s" #'doom/describe-setting :desc "Describe variable" :n "v" #'describe-variable + :desc "Print Doom version" :n "V" #'doom/version :desc "Describe at point" :n "." #'helpful-at-point :desc "What face" :n "'" #'doom/what-face :desc "What minor modes" :n ";" #'doom/what-minor-mode) From 65245bfc21380f28c54c95c4f4c6860c9decaa61 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:11:13 +0200 Subject: [PATCH 1096/4235] recentf-auto-cleanup = 60 Cleanup would cause tremendous slowdowns on startup if files in its list didn't exist. --- core/core-editor.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-editor.el b/core/core-editor.el index 9029ab4e9..ed13be421 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -102,6 +102,7 @@ fundamental-mode) for performance sake." :hook (doom-init . recentf-mode) :config (setq recentf-save-file (concat doom-cache-dir "recentf") + recentf-auto-cleanup 60 recentf-max-menu-items 0 recentf-max-saved-items 300 recentf-filename-handlers '(file-truename) From 035353d295087c4aab7bff3ee3e5664a48a1f412 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:12:16 +0200 Subject: [PATCH 1097/4235] after!: don't shadow features var --- core/core-lib.el | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 22e0d79f5..da22306fd 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -55,31 +55,31 @@ (defalias 'lambda! 'λ!) -(defmacro after! (features &rest body) +(defmacro after! (targets &rest body) "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation." (declare (indent defun) (debug t)) (list (if (or (not (bound-and-true-p byte-compile-current-file)) - (dolist (next (doom-enlist features)) + (dolist (next (doom-enlist targets)) (if (symbolp next) (require next nil :no-error) (load next :no-message :no-error)))) #'progn #'with-no-warnings) - (cond ((symbolp features) - `(eval-after-load ',features '(progn ,@body))) - ((and (consp features) - (memq (car features) '(:or :any))) + (cond ((symbolp targets) + `(eval-after-load ',targets '(progn ,@body))) + ((and (consp targets) + (memq (car targets) '(:or :any))) `(progn - ,@(cl-loop for next in (cdr features) + ,@(cl-loop for next in (cdr targets) collect `(after! ,next ,@body)))) - ((and (consp features) - (memq (car features) '(:and :all))) - (dolist (next (cdr features)) + ((and (consp targets) + (memq (car targets) '(:and :all))) + (dolist (next (cdr targets)) (setq body `(after! ,next ,@body))) body) - ((listp features) - `(after! (:all ,@features) ,@body))))) + ((listp targets) + `(after! (:all ,@targets) ,@body))))) (defmacro quiet! (&rest forms) "Run FORMS without making any output." From b76addda39822eaead159e6aabfcfbf45ab33544 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:13:48 +0200 Subject: [PATCH 1098/4235] Delay setting frame buffer-predicate until doom-init --- core/core-ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 09946bb0c..52daba041 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -527,8 +527,6 @@ frame's window-system, the theme will be reloaded.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) -;; make `next-buffer', `other-buffer', etc. ignore unreal buffers -(map-put default-frame-alist 'buffer-predicate #'doom-buffer-frame-predicate) ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only (menu-bar-mode -1) @@ -614,6 +612,8 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." + ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. + (map-put default-frame-alist 'buffer-predicate #'doom-buffer-frame-predicate) ;; Switch to `doom-fallback-buffer' if on last real buffer (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) ;; Don't kill the fallback buffer From 3ad39af712c8109026e3f7aa7d9cc033cd8c8d9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:14:04 +0200 Subject: [PATCH 1099/4235] Add HOME & /tmp to projectile-ignored-projects --- core/core-projects.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 0e0087063..f81118fc6 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -8,7 +8,8 @@ projectile-known-projects-file (concat doom-cache-dir "projectile.projects") projectile-require-project-root nil projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") - projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o")) + projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o") + projectile-ignored-projects '("~/" "/tmp")) :config (projectile-mode +1) From cecff39a7e574b04306042ea16ccd20e9fb4bfde Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:14:45 +0200 Subject: [PATCH 1100/4235] Refactor doom|check-large-file --- 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 ed13be421..35d51aec4 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -56,14 +56,13 @@ modes are active and the buffer is read-only.") "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 fundamental-mode) for performance sake." - (let* ((filename (buffer-file-name)) - (size (nth 7 (file-attributes filename)))) + (let ((size (nth 7 (file-attributes buffer-file-name)))) (when (and (not (memq major-mode doom-large-file-modes-list)) size (> size (* 1024 1024 doom-large-file-size)) (y-or-n-p (format (concat "%s is a large file, open literally to " "avoid performance issues?") - (file-relative-name filename)))) + (file-relative-name buffer-file-name)))) (setq buffer-read-only t) (buffer-disable-undo) (fundamental-mode)))) From e22c1761952232b0fe42b37f44d69a642e5686fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:16:07 +0200 Subject: [PATCH 1101/4235] make quickstart: run `make` afterwards --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 44db82a96..0dcb75917 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ cc: compile-core ce: compile-elpa d: doctor -quickstart: | ~/.doom.d/init.el install +quickstart: | ~/.doom.d/init.el all ~/.doom.d/init.el: mkdir ~/.doom.d && cp init.example.el ~/.doom.d/init.el From 7c1bb8f6581390c0165027f33fe78b4d5454a460 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:16:46 +0200 Subject: [PATCH 1102/4235] config/default: add & bind +evil/paste-preserve-register (gp) --- modules/config/default/+bindings.el | 1 + modules/feature/evil/autoload/evil.el | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index c8ab4f626..1ae89296e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -326,6 +326,7 @@ :m "gd" #'+lookup/definition :m "gD" #'+lookup/references :n "gp" #'+evil/reselect-paste + :v "gp" #'+evil/paste-preserve-register :n "gr" #'+eval:region :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index a92bf127d..ea3421293 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -27,6 +27,14 @@ (save-excursion (goto-char beg) (point-marker)) end))) +;;;###autoload +(defun +evil/paste-preserve-register () + "Call `evil-paste-after' without overwriting the clipboard (by writing to the +0 register instead). This allows you to paste the same text again afterwards." + (interactive) + (let ((evil-this-register ?0)) + (call-interactively #'evil-paste-after))) + (defun +evil--window-swap (direction) "Move current window to the next window in DIRECTION. If there are no windows there and there is only one window, split in that direction and place this From 23d887303d4e07c695a17739287991ddaa1dc3ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:17:29 +0200 Subject: [PATCH 1103/4235] lang/data: .gql => graphql-mode --- modules/lang/data/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index ce86f15f7..df3ab6012 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -8,7 +8,7 @@ (def-package! graphql-mode - :mode "\\.graphql$") + :mode "\\.g\\(?:raph\\)?ql$") (def-package! hexl ; For ROM hacking or debugging From 6b573bc66bf76f236fa79b1fed5f3eda53b43cc4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:18:07 +0200 Subject: [PATCH 1104/4235] Refactor :lang auto-mode-alist entries --- modules/lang/data/config.el | 13 +++++++------ modules/lang/java/config.el | 2 +- modules/lang/markdown/config.el | 2 +- modules/lang/plantuml/config.el | 2 +- modules/lang/ruby/config.el | 4 ++-- modules/lang/scala/config.el | 2 +- modules/lang/web/+html.el | 2 +- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index df3ab6012..60b1af9b2 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -17,7 +17,7 @@ (def-package! json-mode - :mode "\\.js\\(on\\|[hl]int\\(rc\\)?\\)$" + :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)$" :config (when (featurep! :feature syntax-checker) (add-hook 'json-mode-hook #'flycheck-mode)) @@ -30,17 +30,18 @@ (set! :company-backend 'nxml-mode '(company-nxml company-yasnippet))) -(def-package! toml-mode :mode "\\.toml$") +(def-package! toml-mode + :mode "\\.toml$") (def-package! vimrc-mode :mode "/\\.?g?vimrc$" - :mode "\\.vim$" - :mode "\\.?vimperatorrc$" - :mode "\\.vimp$") + :mode "\\.vimp?$" + :mode "\\.?vimperatorrc$") -(def-package! yaml-mode :mode "\\.ya?ml$") +(def-package! yaml-mode + :mode "\\.ya?ml$") ;; diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index fd6619ea9..8be32f44c 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -22,7 +22,7 @@ (def-package! groovy-mode - :mode "\\.g\\(radle\\|roovy\\)$" + :mode "\\.g\\(?:radle\\|roovy\\)$" :config (set! :eval 'groovy-mode "groovy")) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index de879f12f..276518abd 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -3,7 +3,7 @@ (def-package! markdown-mode :mode "/README$" :mode ("/README\\.md$" . gfm-mode) - :mode "\\.m\\(d\\|arkdown\\)$" + :mode "\\.m\\(?:d\\|arkdown\\)$" :init (setq markdown-enable-wiki-links t markdown-enable-math t diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index 8d7f7d259..cb66d1495 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -1,7 +1,7 @@ ;;; lang/plantuml/config.el -*- lexical-binding: t; -*- (def-package! plantuml-mode - :mode "\\.p\\(lant\\)?uml$" + :mode "\\.p\\(?:lant\\)?uml$" :init (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") org-plantuml-jar-path plantuml-jar-path) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0359c841c..3d4fd3ae3 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -15,8 +15,8 @@ :mode "\\.rb$" :mode "\\.rake$" :mode "\\.gemspec$" - :mode "\\.\\(pry\\|irb\\)rc$" - :mode "/\\(Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file$" + :mode "\\.\\(?:pry\\|irb\\)rc$" + :mode "/\\(?:Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file$" :interpreter "ruby" :config (set! :company-backend 'ruby-mode '(company-dabbrev-code)) diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index 510f903e0..b5a2a1bf0 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -1,7 +1,7 @@ ;;; lang/scala/config.el -*- lexical-binding: t; -*- (def-package! scala-mode - :mode "\\.s\\(cala\\|bt\\)$" + :mode "\\.s\\(?:cala\\|bt\\)$" :config (setq scala-indent:align-parameters t)) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 6e93acb6f..9cf432438 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -2,7 +2,7 @@ (def-package! web-mode :mode "\\.p?html?$" - :mode "\\.\\(tpl\\|blade\\)\\(\\.php\\)?$" + :mode "\\.\\(?:tpl\\|blade\\)\\(\\.php\\)?$" :mode "\\.erb$" :mode "\\.jsp$" :mode "\\.as[cp]x$" From 6c8a8a723afc94c27165005f021ff0e9c59d3ea3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:19:36 +0200 Subject: [PATCH 1105/4235] ui/evil-goggles: evil-goggles-enable-change = nil Until edkolev/evil-goggles#19 is fixed --- modules/ui/evil-goggles/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index 11444439c..67a5c9524 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -6,4 +6,5 @@ :init (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow - evil-goggles-enable-delete nil)) + evil-goggles-enable-delete t + evil-goggles-enable-change nil)) From da598551a399e7b72c46c924719061b7d7d4cbea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:26:30 +0200 Subject: [PATCH 1106/4235] lang/elm: gate flycheck-elm behind featurep! check --- modules/lang/elm/config.el | 3 ++- modules/lang/elm/packages.el | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 6157cf21d..6bc5f9c00 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -11,6 +11,7 @@ (def-package! flycheck-elm - :after (:all flycheck elm-mode) + :when (featurep! :feature syntax-checker) + :after elm-mode :hook (flycheck-mode . flycheck-elm-setup)) diff --git a/modules/lang/elm/packages.el b/modules/lang/elm/packages.el index ec64c5c0e..78ee898fd 100644 --- a/modules/lang/elm/packages.el +++ b/modules/lang/elm/packages.el @@ -1,6 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/elm/packages.el -(package! flycheck-elm) (package! elm-mode) +(when (featurep! :feature syntax-checker) + (package! flycheck-elm)) From afb92a8c7f464a954ad01428e668854474ef80f2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 18:50:44 +0200 Subject: [PATCH 1107/4235] feature/syntax-checker: redesign tooltip support Use flycheck-posframe in GUI Emacs (26+) and flycheck-popup-tip everywhere else. --- modules/feature/syntax-checker/autoload.el | 41 ++++++++++++++++++++++ modules/feature/syntax-checker/config.el | 29 +++++---------- modules/feature/syntax-checker/packages.el | 3 +- 3 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 modules/feature/syntax-checker/autoload.el diff --git a/modules/feature/syntax-checker/autoload.el b/modules/feature/syntax-checker/autoload.el new file mode 100644 index 000000000..6a2d310ae --- /dev/null +++ b/modules/feature/syntax-checker/autoload.el @@ -0,0 +1,41 @@ +;;; feature/syntax-checker/autoload.el -*- lexical-binding: t; -*- + +(defun +syntax-checker-show-popup (errors) + "TODO" + (if (and EMACS26+ (display-graphic-p)) + (flycheck-posframe-show-posframe errors) + (flycheck-popup-tip-show-popup errors))) + +(defun +syntax-checker-cleanup-popup () + "TODO" + (when (display-graphic-p) + (flycheck-popup-tip-delete-popup))) + +;;;###autoload +(define-minor-mode +syntax-checker-popup-mode + "TODO" + :lighter nil + :group 'doom + (let ((hooks '(post-command-hook focus-out-hook))) + (cond + ;; Use our display function and remember the old one but only if we haven't + ;; yet configured it, to avoid activating twice. + ((and +syntax-checker-popup-mode + (not (eq flycheck-display-errors-function + #'+syntax-checker-show-popup))) + (setq flycheck-popup-tip-old-display-function + flycheck-display-errors-function + flycheck-display-errors-function + #'+syntax-checker-show-popup) + (dolist (hook hooks) + (add-hook hook #'+syntax-checker-cleanup-popup nil t))) + ;; Reset the display function and remove ourselves from all hooks but only + ;; if the mode is still active. + ((and (not +syntax-checker-popup-mode) + (eq flycheck-display-errors-function + #'+syntax-checker-show-popup)) + (setq flycheck-display-errors-function + flycheck-popup-tip-old-display-function + flycheck-popup-tip-old-display-function nil) + (dolist (hook hooks) + (remove-hook hook '+syntax-checker-cleanup-popup t)))))) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 2bb95189b..a0e14074e 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -10,6 +10,9 @@ ;; Emacs feels snappier without checks on newline (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) + ;; Popup + (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode) + (after! evil (defun +syntax-checkers|flycheck-buffer () "Flycheck buffer on ESC in normal mode." @@ -25,26 +28,10 @@ (delq 'idle-change flycheck-check-syntax-automatically))) -;; Long story short, `flycheck-popup-tip' works everywhere but only looks *ok*. -;; `flycheck-pos-tip' looks great, but only in GUI Emacs on Linux. So we want: -;; -;; + GUI Emacs (Linux): pos-tip -;; + GUI Emacs (MacOS): popup-tip -;; + tty Emacs (anywhere): popup-tip - -(def-package! flycheck-pos-tip - :unless IS-MAC - :after flycheck - :config - (setq flycheck-pos-tip-timeout 10 - ;; fallback to flycheck-popup-tip in terminal Emacs - flycheck-pos-tip-display-errors-tty-function - #'flycheck-popup-tip-show-popup - flycheck-display-errors-delay 0.7) - (flycheck-pos-tip-mode)) - (def-package! flycheck-popup-tip - :commands (flycheck-popup-tip-mode flycheck-popup-tip-show-popup) - :after flycheck - :config (if IS-MAC (flycheck-popup-tip-mode))) + :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup)) + +(def-package! flycheck-posframe + :when EMACS26+ + :commands flycheck-posframe-show-posframe) diff --git a/modules/feature/syntax-checker/packages.el b/modules/feature/syntax-checker/packages.el index 46532dabd..d80746c82 100644 --- a/modules/feature/syntax-checker/packages.el +++ b/modules/feature/syntax-checker/packages.el @@ -2,5 +2,6 @@ ;;; feature/syntax-checker/packages.el (package! flycheck) -(package! flycheck-pos-tip) (package! flycheck-popup-tip) +(when EMACS26+ + (package! flycheck-posframe)) From e9a325039d9e34c5d3e6da82c8b36f2f53f675a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 19:26:26 +0200 Subject: [PATCH 1108/4235] doctor: doom-initialize before loading Doom --- bin/doom-doctor | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/doom-doctor b/bin/doom-doctor index 0d957f590..2758e3b2e 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -285,6 +285,7 @@ (let ((inhibit-message t) (noninteractive t)) (load "~/.emacs.d/init.el" nil t)) + (doom-initialize t) (doom-initialize-packages t) (quiet! (doom-initialize-modules)) (doom|finalize) From c8b3c5c493e9aa3aa7ddd8ea360508d028c9f2b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 19:30:09 +0200 Subject: [PATCH 1109/4235] lang/org: don't insert a second * at BOL --- modules/lang/org/config.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index fc3dac9ed..632c1c23e 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -94,13 +94,17 @@ unfold to point on startup." (defun +org|smartparens-compatibility-config () "Instruct `smartparens' not to impose itself in org-mode." (defun +org-sp-point-in-checkbox-p (_id action _context) - (when (eq action 'insert) - (sp--looking-at-p "\\s-*]"))) + (and (eq action 'insert) + (sp--looking-at-p "\\s-*]"))) + (defun +org-sp-point-at-bol-p (_id action _context) + (and (eq action 'insert) + (eq (char-before) ?*) + (sp--looking-back-p "^\\**" (line-beginning-position)))) ;; make delimiter auto-closing a little more conservative (after! smartparens (sp-with-modes 'org-mode - (sp-local-pair "*" nil :unless '(:add sp-point-before-word-p sp-point-at-bol-p)) + (sp-local-pair "*" nil :unless '(:add sp-point-before-word-p +org-sp-point-at-bol-p)) (sp-local-pair "_" nil :unless '(:add sp-point-before-word-p)) (sp-local-pair "/" nil :unless '(:add sp-point-before-word-p +org-sp-point-in-checkbox-p)) (sp-local-pair "~" nil :unless '(:add sp-point-before-word-p)) From d7889e69b3b5c081865d29df1f17c74334f636ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 19:30:24 +0200 Subject: [PATCH 1110/4235] lang/org: unbind C-j/C-k (restoring window movement keys) --- modules/lang/org/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 632c1c23e..8ad0a5cea 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -261,6 +261,8 @@ between the two." (map! :map outline-mode-map :n "^" nil :n [backtab] nil + :n "C-j" nil + :n "C-k" nil :map evil-org-mode-map :i [backtab] #'+org/dedent From 8451c4519ca3fd4f97ed91553126dd3d3a044e1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 19:31:13 +0200 Subject: [PATCH 1111/4235] feature/evil: update docstring of +evil/reselect-paste --- modules/feature/evil/autoload/evil.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index ea3421293..f1c41106d 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -19,7 +19,7 @@ ;;;###autoload (defun +evil/reselect-paste () - "Go back into visual mode and reselect the last pasted region." + "Return to visual mode and reselect the last pasted region." (interactive) (cl-destructuring-bind (_ _ _ beg end &optional _) evil-last-paste From f943e3442c239707a3e26f39fe3c73cecadb9413 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 21:57:00 +0200 Subject: [PATCH 1112/4235] feature/evil: comment fix #519 --- modules/feature/evil/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index b7a27fae3..03306e72c 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -264,7 +264,9 @@ (map! [remap evil-jump-item] #'evilmi-jump-items :textobj "%" #'evilmi-inner-text-object #'evilmi-outer-text-object) :config + ;; Fixes #519 where d% wouldn't leave a dangling end-parenthesis (evil-set-command-properties 'evilmi-jump-items :type 'inclusive :jump t) + (defun +evil|simple-matchit () "A hook to force evil-matchit to favor simple bracket jumping. Helpful when the new algorithm is confusing, like in python or ruby." From abd141aed9c3c8a1918dc7b30d555a71a3049ac5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 21:57:18 +0200 Subject: [PATCH 1113/4235] lang/cc: alias cpp-mode to c++-mode Offers an alternative for invoking c++-mode via M-x. The default M-x interfaces for helm and ivy treat input as regexp, thus not reading +'s literally, which can be annoying. --- modules/lang/cc/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 99cde4032..4b5b04bcd 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -27,6 +27,8 @@ compilation database is present in the project.") :commands (c-mode c++-mode objc-mode java-mode) :mode ("\\.mm" . objc-mode) :preface + (defalias 'cpp-mode 'c++-mode) + (defun +cc-c++-header-file-p () (and buffer-file-name (equal (file-name-extension buffer-file-name) "h") From 54bb452a12e7715a841e64cc0267562a2810bb2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:01:43 +0200 Subject: [PATCH 1114/4235] Fix map! ignoring global keybinds when evil wasn't loaded --- core/core-keybinds.el | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index d39210169..b13063b76 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -289,25 +289,24 @@ Example forms) (throw 'skip 'local)) ((and doom--keymaps states) - (unless (featurep 'evil) - (throw 'skip 'evil)) + (dolist (keymap doom--keymaps) (when (memq 'global states) (push `(define-key ,keymap ,key ,def) forms)) - (when-let* ((states (delq 'global states))) - (push `(,(if doom--defer #'evil-define-key #'evil-define-key*) - ',states ,keymap ,key ,def) - forms)))) + (when (featurep 'evil) + (when-let* ((states (delq 'global states))) + (push `(,(if doom--defer #'evil-define-key #'evil-define-key*) + ',states ,keymap ,key ,def) + forms))))) (states - (unless (featurep 'evil) - (throw 'skip 'evil)) (dolist (state states) - (push (if (eq state 'global) - `(global-set-key ,key ,def) - (if doom--local - `(evil-local-set-key ',state ,key ,def) - `(evil-define-key* ',state 'global ,key ,def))) - forms))) + (if (eq state 'global) + (push `(global-set-key ,key ,def) forms) + (when (featurep 'evil) + (push (if doom--local + `(evil-local-set-key ',state ,key ,def) + `(evil-define-key* ',state 'global ,key ,def)) + forms))))) (doom--keymaps (dolist (keymap doom--keymaps) (push `(define-key ,keymap ,key ,def) forms))) From 78dde79622949c41ac27bbea6e94ee4a9e563aad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:02:00 +0200 Subject: [PATCH 1115/4235] Make doom|ansi-color-apply more robust --- 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 52daba041..2ec0907da 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -555,7 +555,8 @@ confirmation." (defun doom|ansi-color-apply () "TODO" - (ansi-color-apply-on-region compilation-filter-start (point))) + (let ((inhibit-read-only t)) + (ansi-color-apply-on-region compilation-filter-start (point)))) (defun doom|no-fringes-in-minibuffer () "Disable fringes in the minibuffer window." From 878b41388534e4ac557884cb950a8d4639c7cdf5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:35:14 +0200 Subject: [PATCH 1116/4235] New library macro: setq-hook! --- core/core-lib.el | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/core-lib.el b/core/core-lib.el index da22306fd..54920f0d4 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -177,8 +177,26 @@ Body forms can access the hook's arguments through the let-bound variable (defmacro remove-hook! (&rest args) "Convenience macro for `remove-hook'. Takes the same arguments as `add-hook!'." + (declare (indent defun) (debug t)) `(add-hook! :remove ,@args)) +(defmacro setq-hook! (hooks &rest rest) + "Convenience macro for setting buffer-local variables in a hook. + + (setq-hook! 'markdown-mode-hook + line-spacing 2 + fill-column 80)" + (declare (indent 1)) + (unless (= 0 (% (length rest) 2)) + (signal 'wrong-number-of-arguments (length rest))) + `(add-hook! ,hooks + ,@(let (forms) + (while rest + (let ((var (pop rest)) + (val (pop rest))) + (push `(setq-local ,var ,val) forms))) + (nreverse forms)))) + (defmacro associate! (mode &rest plist) "Associate a minor mode to certain patterns and project files." (declare (indent 1)) From fe2ed9b6f75c96371de4e9e589d001281802473a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:36:28 +0200 Subject: [PATCH 1117/4235] feature/spellcheck: conditionally spellcheck on load --- modules/feature/spellcheck/config.el | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 9f2158a32..c1f8b3bb6 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -1,17 +1,25 @@ ;;; feature/spellcheck/config.el -*- lexical-binding: t; -*- +(defvar-local +spellcheck-immediately t + "If non-nil, spellcheck the current buffer upon starting `flyspell-mode'. + +Since spellchecking can be slow in some buffers, this can be disabled with: + + (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") + (def-package! flyspell ; built-in :commands flyspell-mode + :init + (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) :config (setq ispell-program-name (executable-find "aspell") ispell-list-command "--list" ispell-extr-args '("--dont-tex-check-comments")) - (defun +spellcheck|automatically () + (defun +spellcheck|immediately () "Spellcheck the buffer when `flyspell-mode' is enabled." - (when flyspell-mode - (flyspell-buffer))) - (add-hook 'flyspell-mode-hook #'+spellcheck|automatically)) + (when (and flyspell-mode +spellcheck-immediately) + (flyspell-buffer)))) (def-package! flyspell-correct From 168cb74794be80320e8d3c7b0412ba3c06bc42de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:37:19 +0200 Subject: [PATCH 1118/4235] Replace add-hook! with setq-hook! where possible --- modules/lang/markdown/config.el | 8 ++++---- modules/lang/php/config.el | 2 +- modules/lang/web/+css.el | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 276518abd..921bd4768 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -15,10 +15,10 @@ markdown-hide-urls nil) ; trigger with `markdown-toggle-url-hiding' :config - (add-hook! markdown-mode - (auto-fill-mode +1) - (setq line-spacing 2 - fill-column 80)) + (add-hook 'markdown-mode-hook #'auto-fill-mode) + (setq-hook! 'markdown-mode-hook + line-spacing 2 + fill-column 80) (map! (:map markdown-mode-map [remap find-file-at-point] #'markdown-follow-thing-at-point diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index fd036bdc8..bcbf730f4 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -26,7 +26,7 @@ ;; default is 10; this optimizes `smartparens' performance, but limits sp ;; pairs to 6 characters. - (add-hook! php-mode (setq-local sp-max-pair-length 6)) + (setq-hook! 'php-mode-hook sp-max-pair-length 6) (sp-with-modes '(php-mode) (sp-local-pair "/* " "*/" :post-handlers '(("||\n[i] " "RET") ("| " "SPC"))) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 577b22f05..dbad9c360 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -6,7 +6,7 @@ #'(yas-minor-mode-on flycheck-mode highlight-numbers-mode)) ;; An improved newline+continue comment function -(add-hook! css-mode (setq-local comment-indent-function #'+css/comment-indent-new-line)) +(setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) (after! smartparens (sp-with-modes '(css-mode scss-mode less-css-mode stylus-mode) From bfc684c024db7d78b280c0b3c36406f51b96e028 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:37:57 +0200 Subject: [PATCH 1119/4235] completion/company: Emacs version check for company-box #566 --- modules/completion/company/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index 7503370e1..ee90c7e62 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -4,5 +4,5 @@ (package! company) (package! company-dict) (package! company-statistics) -(when (featurep! +childframe) +(when (and EMACS26+ (featurep! +childframe)) (package! company-box)) From c94b7a343a4f5127d644d02ae78aca418a14bf06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:39:09 +0200 Subject: [PATCH 1120/4235] feature/popup: default rules for Customize & undo-tree --- modules/feature/popup/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a5c1bb517..a6c5fc196 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -144,6 +144,12 @@ example: (+popup-define "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore))) + (+popup-define "^\\*Customize" + '((slot . 2) (side . right)) + '((modeline . nil) (select . t) (quit . t))) + (+popup-define "^ \\*undo-tree\\*" + '((slot . 2) (side . left) (size . 20)) + '((modeline . nil) (select . t) (quit . t))) ;; `help-mode', `helpful-mode' (+popup-define "^\\*[Hh]elp" From 59486a365229910894efab46c7d4ff1ba762f850 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 May 2018 22:39:16 +0200 Subject: [PATCH 1121/4235] feature/popup: slightly larger help popups --- modules/feature/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/popup/config.el b/modules/feature/popup/config.el index a6c5fc196..2c2940563 100644 --- a/modules/feature/popup/config.el +++ b/modules/feature/popup/config.el @@ -153,7 +153,7 @@ example: ;; `help-mode', `helpful-mode' (+popup-define "^\\*[Hh]elp" - '((slot . 2) (vslot . 2) (size . 0.2)) + '((slot . 2) (vslot . 2) (size . 0.25)) '((select . t))) ;; `Info-mode' (+popup-define "^\\*info\\*$" From 2b9ade9cc7e24972c387b37acc3b7490dcb0b7d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 01:00:49 +0200 Subject: [PATCH 1122/4235] config/default: update emacs-snippets config Package now removes default snippets by itself, no need for us to do it too. --- modules/config/default/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 102c3f367..aed29b011 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -9,8 +9,7 @@ (def-package! emacs-snippets :if (featurep! +snippets) - :after yasnippet - :config (delete yas--default-user-snippets-dir yas-snippet-dirs)) + :after yasnippet) ;; From 18b48cc8419bf5570bdac7535f4f687b57dbfe68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 01:01:21 +0200 Subject: [PATCH 1123/4235] feature/snippets: minor refactor --- modules/feature/snippets/config.el | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index ca2802ff0..a9acfadd6 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -1,8 +1,5 @@ ;;; feature/snippets/config.el -*- lexical-binding: t; -*- -;; Snippets! I've thrown together a few hacks to make `yasnippet' and `evil' -;; behave together. - (def-package! yasnippet :commands (yas-minor-mode yas-minor-mode-on yas-expand yas-expand-snippet yas-lookup-snippet yas-insert-snippet yas-new-snippet @@ -25,13 +22,13 @@ :config (setq yas-verbosity (if doom-debug-mode 3 0) yas-also-auto-indent-first-line t - yas-prompt-functions (delq 'yas-dropdown-prompt yas-prompt-functions) + yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) ;; Allow nested snippets yas-triggers-in-field t) - (push (expand-file-name "snippets/" doom-private-dir) yas-snippet-dirs) + (cl-pushnew (expand-file-name "snippets/" doom-private-dir) yas-snippet-dirs + :test #'string=) - ;; Allows project-specific snippets (defun +snippets|enable-project-modes (mode &rest _) "Enable snippets for project modes." (if (symbol-value mode) From 399f3538cef10892a77303ed0ea7d7e0e97057c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 15:19:09 +0200 Subject: [PATCH 1124/4235] lang/web: fix +css/toggle-inline-or-block --- modules/lang/web/autoload/css.el | 39 ++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el index e5c66a395..a857155bd 100644 --- a/modules/lang/web/autoload/css.el +++ b/modules/lang/web/autoload/css.el @@ -6,24 +6,39 @@ ;;;###autoload ;; TODO (defun +css/sass-build ()) +(defun +css--toggle-inline-or-block (beg end) + (skip-chars-forward " \t") + (let ((orig (point-marker))) + (with-no-warnings + (quiet! + (if (= (line-number-at-pos beg) (line-number-at-pos end)) + (progn + (goto-char (1+ beg)) (insert "\n") + (replace-regexp ";\\s-+" ";\n" nil beg end) + (indent-region beg end)) + (replace-regexp "\n" " " nil beg end) + (replace-regexp " +" " " nil beg end)))) + (if orig (goto-char orig)))) + ;;;###autoload (defun +css/toggle-inline-or-block () "Toggles between a bracketed block and inline block." (interactive) (let ((inhibit-modification-hooks t)) (cl-destructuring-bind (&key beg end op cl &allow-other-keys) - (sp-get-thing) - (when (or (string-empty-p op) (string-empty-p cl)) - (user-error "No block found")) - (with-no-warnings - (if (= (line-number-at-pos beg) (line-number-at-pos end)) - (progn - (goto-char end) (insert "\n") - (goto-char (1+ beg)) (insert "\n") - (replace-regexp ";\\s-+" ";\n" nil beg end) - (indent-region beg end)) - (replace-regexp "\n" " " nil beg end) - (replace-regexp " +" " " nil beg end)))))) + (save-excursion + (when (and (eq (char-after) ?{) + (not (eq (char-before) ?{))) + (forward-char)) + (sp-get-sexp)) + (when (or (not (and beg end op cl)) + (string-empty-p op) (string-empty-p cl)) + (user-error "No block found %s" (list beg end op cl))) + (unless (string= op "{") + (user-error "Incorrect block found")) + (if (featurep 'evil) + (evil-with-single-undo (+css--toggle-inline-or-block beg end)) + (+css--toggle-inline-or-block beg end))))) ;;;###autoload (defun +css/comment-indent-new-line () From fbb2a710b58afd55abef64723403af203c69618d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 15:19:21 +0200 Subject: [PATCH 1125/4235] lang/web: add css library tests --- modules/lang/web/test/autoload-css.el | 32 +++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 modules/lang/web/test/autoload-css.el diff --git a/modules/lang/web/test/autoload-css.el b/modules/lang/web/test/autoload-css.el new file mode 100644 index 000000000..5dc3104a6 --- /dev/null +++ b/modules/lang/web/test/autoload-css.el @@ -0,0 +1,32 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/web/test/autoload-css.el + +(def-test! toggle-inline-or-block + (let ((css-indent-offset 2)) + (should-buffer! + ("body { color: red{0}; font-size: 2em; }") + ("body {" + " color: red{|};" + " font-size: 2em;" + "}") + (delay-mode-hooks (css-mode)) + (+css/toggle-inline-or-block)))) + +(def-test! comment-indent-new-line + (should-buffer! + ("// test{0}" + "body { color: red; font-size: 2em; }") + ("// test" + "// {|}" + "body { color: red; font-size: 2em; }") + (delay-mode-hooks (scss-mode)) + (+css/comment-indent-new-line)) + (should-buffer! + ("// test{0}" + "body { color: red; font-size: 2em; }") + ("// test" + "// {|}" + "body { color: red; font-size: 2em; }") + (delay-mode-hooks (scss-mode)) + (+css/comment-indent-new-line))) + From 8be3d95f337967788d74c49772428bec3fc43b6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 15:19:54 +0200 Subject: [PATCH 1126/4235] Add emacs-26 to travis-ci; remove 25.2 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8f30119d5..19e39d973 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,8 @@ before_install: - INSECURE=1 YES=1 make install env: - EVM_EMACS=emacs-25.1-travis - - EVM_EMACS=emacs-25.2-travis - EVM_EMACS=emacs-25.3-travis + - EVM_EMACS=emacs-26-pretest-travis script: - emacs --version - DEBUG=1 make test From e6dd7fa86706b0e2c8beb461b3fb057c3e6e27f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 15:20:06 +0200 Subject: [PATCH 1127/4235] Fix should-buffer! macro for tests --- core/autoload/test.el | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 0559d40d9..9d04cb4df 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -121,21 +121,19 @@ against." (when (equal (caar marker-list) "0") (goto-char! 0))) ,@body - (let ((result-text (buffer-substring-no-properties (point-min) (point-max))) + (let ((result-text (buffer-string)) (point (point)) - same-point expected-text) (with-temp-buffer (cl-loop for line in ',expected do (insert line "\n")) (save-excursion - (goto-char 1) + (goto-char (point-min)) (when (re-search-forward "{|}" nil t) - (setq same-point (= point (match-beginning 0))) - (replace-match "" t t))) - (setq expected-text (buffer-substring-no-properties (point-min) (point-max))) - (should (equal expected-text result-text)) - (should same-point))))))) + (replace-match "" t t) + (should (equal (point) point)))) + (setq expected-text (buffer-string)) + (should (equal expected-text result-text)))))))) (defmacro goto-char! (index) "Meant to be used with `should-buffer!'. Will move the cursor to one of the From f3d54af5dc4007cc5d28f80ebbf6a62dd8a61119 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 15:24:43 +0200 Subject: [PATCH 1128/4235] lang/org: fix +org/insert-item moving cursor into invisible region --- modules/lang/org/autoload/org.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index d5676668b..df0bd69cc 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -202,7 +202,7 @@ wrong places)." (t (user-error "Not a valid list, heading or table"))) (when (org-invisible-p) - (org-show-subtree)) + (org-show-hidden-entry)) (when (bound-and-true-p evil-mode) (evil-insert 1)))) From 9e141cd01b89192c3c5a26bf2ba6bee3be021c14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 15:36:42 +0200 Subject: [PATCH 1129/4235] lang/org: fix newline-and-indent behavior in src blocks --- modules/lang/org/autoload/org.el | 12 ++++++++++++ modules/lang/org/config.el | 3 +++ 2 files changed, 15 insertions(+) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index df0bd69cc..3906c1521 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -348,3 +348,15 @@ with `org-cycle')." ;;;###autoload (defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) + + +;; +;; Advice +;; + +;;;###autoload +(defun +org*return-indent-in-src-blocks () + "Try to mimic `newline-and-indent' with correct indentation in src blocks." + (when (org-in-src-block-p t) + (org-babel-do-in-edit-buffer + (call-interactively #'indent-for-tab-command)))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 8ad0a5cea..709fc382a 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -258,6 +258,9 @@ between the two." (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold t) + ;; Fix newline-and-indent behavior in src blocks + (advice-add #'org-return-indent :after #'+org*return-indent-in-src-blocks) + (map! :map outline-mode-map :n "^" nil :n [backtab] nil From 7d7c978877cb06d873cf5219ad1fec261834e4da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 16:18:30 +0200 Subject: [PATCH 1130/4235] completion/company: enable company-mode in eshell-mode --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 7bc2154cb..4fd2f7635 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -35,7 +35,7 @@ MODES should be one major-mode symbol or a list of them." company-tooltip-align-annotations t company-require-match 'never company-global-modes - '(not eshell-mode comint-mode erc-mode message-mode help-mode gud-mode) + '(not comint-mode erc-mode message-mode help-mode gud-mode) company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) From 12e26761e223c894f6784cdc29e38ba7314cc678 Mon Sep 17 00:00:00 2001 From: Miguel Santos Date: Tue, 8 May 2018 11:50:12 -0300 Subject: [PATCH 1131/4235] add basic support for the nim language --- init.example.el | 1 + modules/lang/nim/README.org | 42 ++++++++++++++++++++++++++++++++++++ modules/lang/nim/config.el | 23 ++++++++++++++++++++ modules/lang/nim/packages.el | 9 ++++++++ modules/lang/org/packages.el | 2 ++ 5 files changed, 77 insertions(+) create mode 100644 modules/lang/nim/README.org create mode 100644 modules/lang/nim/config.el create mode 100644 modules/lang/nim/packages.el diff --git a/init.example.el b/init.example.el index 3c759cee0..beba3df2e 100644 --- a/init.example.el +++ b/init.example.el @@ -83,6 +83,7 @@ ledger ; an accounting system in Emacs lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore + nim ; python+list at the speed of c nix ; I hereby declare "nix geht mehr!" ocaml ; an objective camel (org ; organize your plain life in plain text diff --git a/modules/lang/nim/README.org b/modules/lang/nim/README.org new file mode 100644 index 000000000..fcdc3d9af --- /dev/null +++ b/modules/lang/nim/README.org @@ -0,0 +1,42 @@ +#+TITLE: :lang Nim + +#+begin_quote +This module is a work in progress. +#+end_quote + +This module adds [[https://nim-lang.org][Nim]] support to Emacs. + ++ Code completion (~nimsuggest+company~) ++ Syntax checking (~nimsugges+flycheck~) ++ Babel support (~ob-nim~) +#+begin_quote +... +#+end_quote + +* Table of Contents :TOC: +- [[Install][Install]] + - [[Nim][Nim]] + +* Install +** Nim +To get started with Nim, you can either use =choosenim= and install nim with: + +~curl https://nim-lang.org/choosenim/init.sh -sSf | sh~ + +Or through your package manager: + +*** MacOS +#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +brew install nim +#+END_SRC + +*** +*** Arch Linux +#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") +sudo pacman --needed --noconfirm -S nim +#+END_SRC + +*** Arch Linux +#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") +sudo pacman --needed --noconfirm -S nim +#+END_SRC diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el new file mode 100644 index 000000000..7527168ff --- /dev/null +++ b/modules/lang/nim/config.el @@ -0,0 +1,23 @@ +;;; lang/nim/config.el -*- lexical-binding: t; -*- + +(def-package! nim-mode + :init + (add-hook 'nim-mode-hook #'nimsuggest-mode)) + +(def-package! flycheck-nim + :when (featurep! :feature syntax-checker) + :after nim-mode + :config + (add-hook 'nimsuggest-mode-hook #'flycheck-mode) + + (map! :map nim-mode-map + :localleader + :n "b" #'+nim/build-menu) + + (def-menu! +nim/build-menu + "Building commands for `nim-mode' buffers." + '(("Build & run" :exec nim-compile)) + :prompt "Build")) + +(when (featurep! :completion company) + (add-hook 'nimsuggest-mode-hook #'company-mode)) diff --git a/modules/lang/nim/packages.el b/modules/lang/nim/packages.el new file mode 100644 index 000000000..f8453e807 --- /dev/null +++ b/modules/lang/nim/packages.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/nim/packages.el + +;;; requires nim nimsuggest nimble + +(package! nim-mode) + +(when (featurep! :feature syntax-checker) + (package! flycheck-nim)) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index dc3c1cb20..91c73748e 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -18,6 +18,8 @@ (package! ob-sql-mode) (package! ob-translate) + (when (featurep! :lang nim) + (package! ob-nim)) (when (featurep! :lang crystal) (package! ob-crystal)) (when (featurep! :lang go) From 1451b952b9c7b70306aa58baf274574b435beb5f Mon Sep 17 00:00:00 2001 From: Miguel Santos Date: Tue, 8 May 2018 11:58:59 -0300 Subject: [PATCH 1132/4235] small typos --- init.example.el | 2 +- modules/lang/nim/README.org | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/init.example.el b/init.example.el index beba3df2e..4bace1b9d 100644 --- a/init.example.el +++ b/init.example.el @@ -83,7 +83,7 @@ ledger ; an accounting system in Emacs lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore - nim ; python+list at the speed of c + nim ; python + lisp at the speed of c nix ; I hereby declare "nix geht mehr!" ocaml ; an objective camel (org ; organize your plain life in plain text diff --git a/modules/lang/nim/README.org b/modules/lang/nim/README.org index fcdc3d9af..1640f780f 100644 --- a/modules/lang/nim/README.org +++ b/modules/lang/nim/README.org @@ -30,13 +30,8 @@ Or through your package manager: brew install nim #+END_SRC -*** *** Arch Linux #+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") sudo pacman --needed --noconfirm -S nim #+END_SRC -*** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S nim -#+END_SRC From 1be5df7e6392c965260446085cbf7ecd2a54751a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 17:36:10 +0200 Subject: [PATCH 1133/4235] feature/popup: revise docstring for minor modes --- modules/feature/popup/autoload.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 9c72ff2f0..045b8affb 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -227,7 +227,7 @@ If certain attributes/parameters are omitted, the ones from ;;;###autoload (define-minor-mode +popup-mode - "Global minor mode for popups." + "Global minor mode representing Doom's popup management system." :init-value nil :global t :keymap +popup-mode-map @@ -254,7 +254,10 @@ If certain attributes/parameters are omitted, the ones from ;;;###autoload (define-minor-mode +popup-buffer-mode - "Minor mode for popup windows." + "Minor mode for individual popup windows. + +It is enabled when a buffer is displayed in a popup window and disabled when +that window has been changed or closed." :init-value nil :keymap +popup-buffer-mode-map (when (and +popup-buffer-mode (timerp +popup--timer)) From b64b2764fa92f04840bba44c31ac96c065605fff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 17:56:21 +0200 Subject: [PATCH 1134/4235] Fix header vars in doctor/packages.el files --- modules/app/write/doctor.el | 3 ++- modules/lang/csharp/doctor.el | 3 ++- modules/lang/hy/packages.el | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/app/write/doctor.el b/modules/app/write/doctor.el index 609c5574a..655adea7d 100644 --- a/modules/app/write/doctor.el +++ b/modules/app/write/doctor.el @@ -1,4 +1,5 @@ -;;; app/write/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; app/write/doctor.el (when (featurep! +langtool) (require 'langtool) diff --git a/modules/lang/csharp/doctor.el b/modules/lang/csharp/doctor.el index b546f97be..82c1c191d 100644 --- a/modules/lang/csharp/doctor.el +++ b/modules/lang/csharp/doctor.el @@ -1,4 +1,5 @@ -;;; lang/csharp/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/csharp/doctor.el (require 'omnisharp) (let ((omnisharp-bin (or omnisharp-server-executable-path (omnisharp--server-installation-path t)))) diff --git a/modules/lang/hy/packages.el b/modules/lang/hy/packages.el index f3ccf2ce3..0b232824d 100644 --- a/modules/lang/hy/packages.el +++ b/modules/lang/hy/packages.el @@ -1,3 +1,4 @@ -;;; lang/hy/packages.el -*- no-byte-compile: t; -*- +;; -*- no-byte-compile: t; -*- +;;; lang/hy/packages.el (package! hy-mode) From 3488821b2e332ab8aa7100eb7a09db22f46f3057 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 17:57:26 +0200 Subject: [PATCH 1135/4235] completion/company: minor quoting refactor Sharp-quote function and use backquotes in pcase (better Emacs <25 compatibility). --- modules/completion/company/autoload.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 406b04333..b6c444382 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -23,9 +23,9 @@ C-x C-l." (interactive (list 'interactive)) (require 'company) (pcase command - ('interactive (company-begin-backend '+company/whole-lines)) - ('prefix (company-grab-line "^[\t\s]*\\(.+\\)" 1)) - ('candidates + (`interactive (company-begin-backend '+company/whole-lines)) + (`prefix (company-grab-line "^[\t\s]*\\(.+\\)" 1)) + (`candidates (all-completions arg (split-string @@ -42,7 +42,7 @@ C-x C-l." (require 'company-dict) (require 'company-keywords) (let ((company-backends '((company-keywords company-dict)))) - (call-interactively 'company-complete))) + (call-interactively #'company-complete))) ;;;###autoload (defun +company/dabbrev-code-previous () From 0afae2eacf791917b5f4f525bee31b066cbc58f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 19:42:19 +0200 Subject: [PATCH 1136/4235] Remove fringe-helper package --- core/core-ui.el | 16 +++++++++------- core/packages.el | 1 - modules/ui/doom/config.el | 25 ++++++++----------------- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 2ec0907da..d55f455c6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -77,6 +77,15 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no +;; +;; Shims +;; + +(unless (fboundp 'define-fringe-bitmap) + ;; doesn't exist in terminal Emacs; define it to prevent errors + (defun define-fringe-bitmap (&rest _))) + + ;; ;; Modeline library ;; @@ -162,13 +171,6 @@ DEFAULT is non-nil, set the default mode-line for all buffers." 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) - :init - (unless (fboundp 'define-fringe-bitmap) - ;; doesn't exist in terminal Emacs; define it to prevent errors - (defun define-fringe-bitmap (&rest _)))) - (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)) diff --git a/core/packages.el b/core/packages.el index 8b66296d0..2d563103f 100644 --- a/core/packages.el +++ b/core/packages.el @@ -7,7 +7,6 @@ ;; core-ui.el (package! all-the-icons) -(package! fringe-helper) (package! hide-mode-line) (package! highlight-indentation) (package! highlight-numbers) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 015219684..98f47b203 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -90,26 +90,17 @@ ;; because git-gutter is in the left fringe (setq flycheck-indication-mode 'right-fringe) ;; A non-descript, left-pointing arrow - (fringe-helper-define 'flycheck-fringe-bitmap-double-arrow 'center - "...X...." - "..XX...." - ".XXX...." - "XXXX...." - ".XXX...." - "..XX...." - "...X....")) + (define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow + [16 48 112 240 112 48 16] nil nil 'center)) ;; subtle diff indicators in the fringe (after! git-gutter-fringe ;; places the git gutter outside the margins. (setq-default fringes-outside-margins t) ;; thin fringe bitmaps - (fringe-helper-define 'git-gutter-fr:added '(center repeated) - "XXX.....") - (fringe-helper-define 'git-gutter-fr:modified '(center repeated) - "XXX.....") - (fringe-helper-define 'git-gutter-fr:deleted 'bottom - "X......." - "XX......" - "XXX....." - "XXXX....")) + (define-fringe-bitmap 'git-gutter-fr:added [224] + nil nil '(center repeated)) + (define-fringe-bitmap 'git-gutter-fr:modified [224] + nil nil '(center repeated)) + (define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240] + nil nil 'bottom)) From 99ca62c10694e8a06aa944948ec9e258c38f0e2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 19:56:31 +0200 Subject: [PATCH 1137/4235] Remove smart-forward package --- core/core-editor.el | 3 --- core/packages.el | 1 - modules/config/default/+bindings.el | 5 ----- 3 files changed, 9 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 35d51aec4..957ae51f8 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -247,8 +247,5 @@ extension, try to guess one." (def-package! pcre2el :commands rxt-quote-pcre) -(def-package! smart-forward - :commands (smart-up smart-down smart-backward smart-forward)) - (provide 'core-editor) ;;; core-editor.el ends here diff --git a/core/packages.el b/core/packages.el index 2d563103f..fec04dde7 100644 --- a/core/packages.el +++ b/core/packages.el @@ -29,7 +29,6 @@ (package! expand-region) (package! helpful) (package! pcre2el) -(package! smart-forward) (package! smartparens) (package! undo-tree) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 1ae89296e..b7251d7af 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -111,7 +111,6 @@ :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) @@ -629,10 +628,6 @@ ;; rotate-text :n "!" #'rotate-text - ;; smart-forward - :m "g]" #'smart-forward - :m "g[" #'smart-backward - ;; swiper (:after swiper (:map swiper-map From 8d936f2d0bc8934acc1fb3263012939274b02e48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 19:59:08 +0200 Subject: [PATCH 1138/4235] Move editorconfig out of core into tools/editorconfig --- core/core-editor.el | 56 -------------------------- core/packages.el | 1 - init.example.el | 1 + modules/tools/editorconfig/README.org | 18 +++++++++ modules/tools/editorconfig/config.el | 51 +++++++++++++++++++++++ modules/tools/editorconfig/packages.el | 4 ++ 6 files changed, 74 insertions(+), 57 deletions(-) create mode 100644 modules/tools/editorconfig/README.org create mode 100644 modules/tools/editorconfig/config.el create mode 100644 modules/tools/editorconfig/packages.el diff --git a/core/core-editor.el b/core/core-editor.el index 957ae51f8..fcd88a23e 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -117,62 +117,6 @@ fundamental-mode) for performance sake." ;; Core Plugins ;; -;; Handles whitespace (tabs/spaces) settings externally. This way projects can -;; specify their own formatting rules. -(def-package! editorconfig - :hook (doom-init . editorconfig-mode) - :config - ;; Register missing indent variables - (setq editorconfig-indentation-alist - (append '((mips-mode mips-tab-width) - (haxor-mode haxor-tab-width) - (nasm-mode nasm-basic-offset)) - editorconfig-indentation-alist)) - - ;; editorconfig cannot procure the correct settings for extension-less files. - ;; Executable scripts with a shebang line, for example. So why not use Emacs' - ;; major mode to drop editorconfig a hint? This is accomplished by temporarily - ;; appending an extension to `buffer-file-name' when we talk to editorconfig. - (defvar doom-editorconfig-mode-alist - '((sh-mode . "sh") - (python-mode . "py") - (ruby-mode . "rb") - (perl-mode . "pl") - (php-mode . "php")) - "An alist mapping major modes to extensions. Used by -`doom*editorconfig-smart-detection' to give editorconfig filetype hints.") - - (defun doom*editorconfig-smart-detection (orig-fn &rest args) - "Retrieve the properties for the current file. If it doesn't have an -extension, try to guess one." - (let ((buffer-file-name - (if (and (not (bound-and-true-p org-src-mode)) - (file-name-extension buffer-file-name)) - buffer-file-name - (format "%s%s" buffer-file-name - (if-let* ((ext (cdr (assq major-mode doom-editorconfig-mode-alist)))) - (concat "." ext) - ""))))) - (apply orig-fn args))) - (advice-add #'editorconfig-call-editorconfig-exec :around #'doom*editorconfig-smart-detection) - - ;; Editorconfig makes indentation too rigid in Lisp modes, so tell - ;; editorconfig to ignore indentation. I prefer dynamic indentation support - ;; built into Emacs. - (dolist (mode '(emacs-lisp-mode lisp-mode)) - (map-delete editorconfig-indentation-alist mode)) - - (defvar whitespace-style) - (defun doom|editorconfig-whitespace-mode-maybe (&rest _) - "Show whitespace-mode when file uses TABS (ew)." - (when indent-tabs-mode - (let ((whitespace-style '(face tabs tab-mark trailing-lines tail))) - (whitespace-mode +1)))) - (add-hook 'editorconfig-custom-hooks #'doom|editorconfig-whitespace-mode-maybe)) - -(def-package! editorconfig-conf-mode - :mode "\\.?editorconfig$") - ;; Auto-close delimiters and blocks as you type (def-package! smartparens :config diff --git a/core/packages.el b/core/packages.el index fec04dde7..d40910824 100644 --- a/core/packages.el +++ b/core/packages.el @@ -25,7 +25,6 @@ (package! ace-window) (package! avy) (package! command-log-mode) -(package! editorconfig) (package! expand-region) (package! helpful) (package! pcre2el) diff --git a/init.example.el b/init.example.el index 3c759cee0..e57336bc1 100644 --- a/init.example.el +++ b/init.example.el @@ -43,6 +43,7 @@ :tools dired ; making dired pretty [functional] + editorconfig ; let someone else argue about tabs vs spaces ein ; tame Jupyter notebooks with emacs electric-indent ; smarter, keyword-based electric-indent eshell ; a consistent, cross-platform shell (WIP) diff --git a/modules/tools/editorconfig/README.org b/modules/tools/editorconfig/README.org new file mode 100644 index 000000000..f7a7d37a5 --- /dev/null +++ b/modules/tools/editorconfig/README.org @@ -0,0 +1,18 @@ +#+TITLE: :tools editorconfig + +Editorconfig integration for Doom. + +* Table of Contents :TOC: +- [[Module Flags][Module Flags]] +- [[Prerequisites][Prerequisites]] +- [[Configuration][Configuration]] + +* Module Flags +This module provides no flags. + +* Prerequisites +~editorconfig~ is an optional requirement of this package. The elisp-only +implementation may be sufficient, but has fewer features. + +* Configuration + diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el new file mode 100644 index 000000000..bbe4cbaf6 --- /dev/null +++ b/modules/tools/editorconfig/config.el @@ -0,0 +1,51 @@ +;;; tools/editorconfig/config.el -*- lexical-binding: t; -*- + +;; Handles whitespace (tabs/spaces) settings externally. This way projects can +;; specify their own formatting rules. +(def-package! editorconfig + :hook (doom-init . editorconfig-mode) + :config + ;; Register missing indent variables + (setq editorconfig-indentation-alist + (append '((mips-mode mips-tab-width) + (haxor-mode haxor-tab-width) + (nasm-mode nasm-basic-offset)) + editorconfig-indentation-alist)) + + ;; editorconfig cannot procure the correct settings for extension-less files. + ;; Executable scripts with a shebang line, for example. So why not use Emacs' + ;; major mode to drop editorconfig a hint? This is accomplished by temporarily + ;; appending an extension to `buffer-file-name' when we talk to editorconfig. + (defvar doom-editorconfig-mode-alist + '((sh-mode . "sh") + (python-mode . "py") + (ruby-mode . "rb") + (perl-mode . "pl") + (php-mode . "php")) + "An alist mapping major modes to extensions. Used by +`doom*editorconfig-smart-detection' to give editorconfig filetype hints.") + + (defun doom*editorconfig-smart-detection (orig-fn &rest args) + "Retrieve the properties for the current file. If it doesn't have an +extension, try to guess one." + (let ((buffer-file-name + (if (and (not (bound-and-true-p org-src-mode)) + (file-name-extension buffer-file-name)) + buffer-file-name + (format "%s%s" buffer-file-name + (if-let* ((ext (cdr (assq major-mode doom-editorconfig-mode-alist)))) + (concat "." ext) + ""))))) + (apply orig-fn args))) + (advice-add #'editorconfig-call-editorconfig-exec :around #'doom*editorconfig-smart-detection) + + ;; Editorconfig makes indentation too rigid in Lisp modes, so tell + ;; editorconfig to ignore indentation there. I prefer dynamic indentation + ;; support built into Emacs. + (dolist (mode '(emacs-lisp-mode lisp-mode)) + (map-delete editorconfig-indentation-alist mode))) + + +(def-package! editorconfig-conf-mode + :mode "\\.?editorconfig$") + diff --git a/modules/tools/editorconfig/packages.el b/modules/tools/editorconfig/packages.el new file mode 100644 index 000000000..716c3b55e --- /dev/null +++ b/modules/tools/editorconfig/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/editorconfig/packages.el + +(package! editorconfig) From 317b556bde6b0374ff3642ebafac6cae2f581481 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 21:47:40 +0200 Subject: [PATCH 1139/4235] Extract :ui posframe packages into other modules --- core/core-ui.el | 17 +++++++++ init.example.el | 6 +-- modules/completion/ivy/autoload/posframe.el | 16 ++++++++ modules/completion/ivy/config.el | 34 +++++++++++++++++ modules/completion/ivy/doctor.el | 4 ++ modules/completion/ivy/packages.el | 3 ++ modules/ui/posframe/autoload.el | 28 -------------- modules/ui/posframe/config.el | 42 --------------------- modules/ui/posframe/doctor.el | 5 --- modules/ui/posframe/packages.el | 6 --- 10 files changed, 77 insertions(+), 84 deletions(-) create mode 100644 modules/completion/ivy/autoload/posframe.el create mode 100644 modules/completion/ivy/doctor.el delete mode 100644 modules/ui/posframe/autoload.el delete mode 100644 modules/ui/posframe/config.el delete mode 100644 modules/ui/posframe/doctor.el delete mode 100644 modules/ui/posframe/packages.el diff --git a/core/core-ui.el b/core/core-ui.el index d55f455c6..a6292cd8a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -544,6 +544,23 @@ frame's window-system, the theme will be reloaded.") ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) +;; ensure posframe cleans up after itself +(after! posframe + ;; TODO Find a better place for this + (defun doom|delete-posframe-on-escape () + "TODO" + (unless (frame-parameter (selected-frame) 'posframe-buffer) + (cl-loop for frame in (frame-list) + if (and (frame-parameter frame 'posframe-buffer) + (not (frame-visible-p frame))) + do (delete-frame frame)) + (dolist (buffer (buffer-list)) + (let ((frame (buffer-local-value 'posframe--frame buffer))) + (when (and frame (or (not (frame-live-p frame)) + (not (frame-visible-p frame)))) + (posframe--kill-buffer buffer)))))) + (add-hook 'doom-escape-hook #'doom|delete-posframe-on-escape) + (add-hook 'doom-cleanup-hook #'posframe-delete-all)) ;; Customized confirmation prompt for quitting Emacs (defun doom-quit-p (&optional prompt) diff --git a/init.example.el b/init.example.el index e57336bc1..dd96126fd 100644 --- a/init.example.el +++ b/init.example.el @@ -22,10 +22,11 @@ :completion (company ; the ultimate code completion backend +auto ; as-you-type code completion - +childframe) ; a nicer company UI. Emacs +26 only! + +childframe) ; a nicer company UI (Emacs 26+ only) ;helm ; the *other* search engine for love and life ;ido ; the other *other* search engine... - ivy ; a search engine for love and life + (ivy ; a search engine for love and life + +childframe) ; uses childframes for popups (Emacs 26+ only) :ui doom ; what makes DOOM look the way it does @@ -35,7 +36,6 @@ evil-goggles ; display visual hints when editing in evil hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping - ;posframe ; use child frames where possible (Emacs 26+ only) ;tabbar ; FIXME an (incomplete) tab bar for Emacs ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB diff --git a/modules/completion/ivy/autoload/posframe.el b/modules/completion/ivy/autoload/posframe.el new file mode 100644 index 000000000..43f034abc --- /dev/null +++ b/modules/completion/ivy/autoload/posframe.el @@ -0,0 +1,16 @@ +;;; completion/ivy/autoload/posframe.el -*- lexical-binding: t; -*- +;;;###if (featurep! +childframe) + +;;;###autoload +(defun +ivy-display-at-frame-center-near-bottom (str) + "TODO" + (ivy-posframe--display str #'+ivy-poshandler-frame-center-near-bottom)) + +;;;###autoload +(defun +ivy-poshandler-frame-center-near-bottom (info) + "TODO" + (let ((parent-frame (plist-get info :parent-frame)) + (pos (posframe-poshandler-frame-center info))) + (cons (car pos) + (truncate (/ (frame-pixel-height parent-frame) 1.6))))) + diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e6b2fa3cf..9259fdb85 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -187,3 +187,37 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! wgrep :commands (wgrep-setup wgrep-change-to-wgrep-mode) :config (setq wgrep-auto-save-buffer t)) + + +(def-package! ivy-posframe + :when EMACS26+ + :when (featurep! +childframe) + :hook (ivy-mode . ivy-posframe-enable) + :preface + ;; This function searches the entire `obarray' just to populate + ;; `ivy-display-functions-props'. There are 15k entries in mine! This is + ;; wasteful, so... + (advice-add #'ivy-posframe-setup :override #'ignore) + :config + ;; ... let's do it manually + (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left + 'ivy-posframe-display-at-frame-center + 'ivy-posframe-display-at-point + 'ivy-posframe-display-at-frame-bottom-window-center + 'ivy-posframe-display + 'ivy-posframe-display-at-window-bottom-left + 'ivy-posframe-display-at-window-center + '+ivy-display-at-frame-center-near-bottom)) + (push (list fn :cleanup 'ivy-posframe-cleanup) ivy-display-functions-props)) + + (push '(t . +ivy-display-at-frame-center-near-bottom) ivy-display-functions-alist) + + ;; posframe doesn't work well with async sources + (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) + (push (cons fn nil) ivy-display-functions-alist)) + + (setq ivy-height 16 + ivy-fixed-height-minibuffer nil + ivy-posframe-parameters `((min-width . 90) + (min-height . ,ivy-height) + (internal-border-width . 10)))) diff --git a/modules/completion/ivy/doctor.el b/modules/completion/ivy/doctor.el new file mode 100644 index 000000000..21300e86d --- /dev/null +++ b/modules/completion/ivy/doctor.el @@ -0,0 +1,4 @@ +;;; completion/ivy/doctor.el -*- lexical-binding: t; -*- + +(when (and (not EMACS26+) (featurep! +childframe)) + (error! "The +childframe feature requires Emacs 26+")) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index fab27d27e..0d764a54d 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -9,3 +9,6 @@ (package! ivy-hydra) (package! ivy-rich) (package! wgrep) + +(when (and EMACS26+ (featurep! +childframe)) + (package! ivy-posframe)) diff --git a/modules/ui/posframe/autoload.el b/modules/ui/posframe/autoload.el deleted file mode 100644 index 74e8625c0..000000000 --- a/modules/ui/posframe/autoload.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; ui/posframe/autoloads.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +posframe-ivy-display-at-frame-center-near-bottom (str) - "TODO" - (ivy-posframe--display str #'+posframe-poshandler-frame-center-near-bottom)) - -;;;###autoload -(defun +posframe-poshandler-frame-center-near-bottom (info) - "TODO" - (let ((parent-frame (plist-get info :parent-frame)) - (pos (posframe-poshandler-frame-center info))) - (cons (car pos) - (truncate (/ (frame-pixel-height parent-frame) 1.6))))) - -;;;###autoload -(defun +posframe|delete-on-escape () - "TODO" - (unless (frame-parameter (selected-frame) 'posframe-buffer) - (cl-loop for frame in (frame-list) - if (and (frame-parameter frame 'posframe-buffer) - (not (frame-visible-p frame))) - do (delete-frame frame)) - (dolist (buffer (buffer-list)) - (let ((frame (buffer-local-value 'posframe--frame buffer))) - (when (and frame (or (not (frame-live-p frame)) - (not (frame-visible-p frame)))) - (posframe--kill-buffer buffer)))))) diff --git a/modules/ui/posframe/config.el b/modules/ui/posframe/config.el deleted file mode 100644 index 5dd7af23d..000000000 --- a/modules/ui/posframe/config.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; ui/posframe/config.el -*- lexical-binding: t; -*- - -(def-package! posframe - :defer t - :config - (add-hook 'doom-cleanup-hook #'posframe-delete-all) - (add-hook 'doom-escape-hook #'+posframe|delete-on-escape)) - - -(def-package! ivy-posframe - :when EMACS26+ - :hook (ivy-mode . ivy-posframe-enable) - :preface - ;; This function searches the entire `obarray' just to populate - ;; `ivy-display-functions-props'. There are 15k entries in mine! This is - ;; wasteful, so... - (advice-add #'ivy-posframe-setup :override #'ignore) - :config - ;; ... let's do it manually - (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left - 'ivy-posframe-display-at-frame-center - 'ivy-posframe-display-at-point - 'ivy-posframe-display-at-frame-bottom-window-center - 'ivy-posframe-display - 'ivy-posframe-display-at-window-bottom-left - 'ivy-posframe-display-at-window-center - '+posframe-ivy-display-at-frame-center-near-bottom)) - (push (list fn :cleanup 'ivy-posframe-cleanup) ivy-display-functions-props)) - - (push '(t . +posframe-ivy-display-at-frame-center-near-bottom) ivy-display-functions-alist) - - ;; posframe doesn't work well with async sources - (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) - (push (cons fn nil) ivy-display-functions-alist)) - - (setq ivy-height 16 - ivy-fixed-height-minibuffer nil - ivy-posframe-parameters `((min-width . 90) - (min-height . ,ivy-height) - (internal-border-width . 10)))) - -;; TODO helm-posframe? diff --git a/modules/ui/posframe/doctor.el b/modules/ui/posframe/doctor.el deleted file mode 100644 index e43fa4e9f..000000000 --- a/modules/ui/posframe/doctor.el +++ /dev/null @@ -1,5 +0,0 @@ -;; -*- lexical-binding: t; no-byte-compile: t; -*- -;;; ui/posframe/doctor.el - -(unless EMACS26+ - (error! "This module doesn't work in Emacs %s (minimum: Emacs 26)" emacs-version)) diff --git a/modules/ui/posframe/packages.el b/modules/ui/posframe/packages.el deleted file mode 100644 index b5013939f..000000000 --- a/modules/ui/posframe/packages.el +++ /dev/null @@ -1,6 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ui/posframe/packages.el - -(when EMACS26+ - (when (featurep! :completion ivy) - (package! ivy-posframe))) From 67f9aa1ffe6d680234b26d4392016a3360db2c3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 23:21:17 +0200 Subject: [PATCH 1140/4235] Move whitespace config to core-ui Introduces new doom|show-whitespace-maybe hook to replace doom|editorconfig-whitespace-mode-maybe --- core/core-editor.el | 11 +---------- core/core-ui.el | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index fcd88a23e..0382d924e 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -36,16 +36,7 @@ modes are active and the buffer is read-only.") tabify-regexp "^\t* [ \t]+" ; for :retab ;; Wrapping truncate-lines t - truncate-partial-width-windows 50 - ;; whitespace-mode - whitespace-line-column nil - whitespace-style - '(face indentation tabs tab-mark spaces space-mark newline newline-mark - trailing lines-tail) - whitespace-display-mappings - '((tab-mark ?\t [?› ?\t]) - (newline-mark ?\n [?¬ ?\n]) - (space-mark ?\ [?·] [?.]))) + truncate-partial-width-windows 50) ;; ediff (setq ediff-diff-options "-w" diff --git a/core/core-ui.el b/core/core-ui.el index a6292cd8a..cfe5b95c6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -279,6 +279,31 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)) (add-hook 'server-visit-hook 'server-remove-kill-buffer-hook) +;; whitespace-mode settings +(setq whitespace-line-column nil + whitespace-style + '(face indentation tabs tab-mark spaces space-mark newline newline-mark + trailing lines-tail) + whitespace-display-mappings + '((tab-mark ?\t [?› ?\t]) + (newline-mark ?\n [?¬ ?\n]) + (space-mark ?\ [?·] [?.]))) + +(defun doom|show-whitespace-maybe () + "Show whitespace-mode when file has an `indent-tabs-mode' that is different +from the default." + (unless (eq indent-tabs-mode (default-value 'indent-tabs-mode)) + (require 'whitespace) + (set (make-local-variable 'whitespace-style) + (if (or (bound-and-true-p whitespace-mode) + (bound-and-true-p whitespace-newline-mode)) + (cl-union (if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) + whitespace-style) + `(face ,@(if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) + trailing-lines tail))) + (whitespace-mode +1))) +(add-hook 'after-change-major-mode-hook #'doom|show-whitespace-maybe) + ;; ;; Custom hooks From 4705153873d0a207cb9485fb5600b7bb2e95f9e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 May 2018 23:24:31 +0200 Subject: [PATCH 1141/4235] Minor refactor + comment revision + delq->map-delete + remove obsolete variable --- core/core-ui.el | 6 ++---- modules/ui/doom-modeline/config.el | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index cfe5b95c6..323dfefeb 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -45,8 +45,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") enable-recursive-minibuffers nil frame-inhibit-implied-resize t ;; remove continuation arrow on right fringe - fringe-indicator-alist (delq (assq 'continuation fringe-indicator-alist) - fringe-indicator-alist) + fringe-indicator-alist (map-delete fringe-indicator-alist 'continuation) highlight-nonselected-windows nil image-animate-loop t indicate-buffer-boundaries nil @@ -230,7 +229,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." :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 +;; For a distractions-free-like UI, that dynamically resizes margins and can ;; center a buffer. (def-package! visual-fill-column :commands visual-fill-column-mode @@ -312,7 +311,6 @@ from the default." (defvar doom-load-theme-hook nil "Hook run when the theme (and font) is initialized (or reloaded with `doom//reload-theme').") -(define-obsolete-variable-alias 'doom-init-theme-hook 'doom-load-theme-hook "2.1.0") (defvar doom-before-switch-window-hook nil "Hook run before `switch-window' or `switch-frame' are called. See diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index a89fedc59..f35a3a478 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -696,7 +696,7 @@ Returns \"\" to not break --no-window-system." (doom-set-modeline 'main t) ; set default modeline -(add-hook 'doom-init-theme-hook #'+doom-modeline|init) +(add-hook 'doom-load-theme-hook #'+doom-modeline|init) (add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) (add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) From 6359fec9858f50b050c84367a4a241faf3d6202a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 00:17:57 +0200 Subject: [PATCH 1142/4235] Fix doom-unicode-font --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index 323dfefeb..4f0b4fb53 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -506,6 +506,7 @@ frame's window-system, the theme will be reloaded.") (set-face-attribute 'fixed-pitch nil :font doom-font)) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) + (setq use-default-font-for-symbols nil) (set-fontset-font t 'unicode doom-unicode-font nil)) ;; ...and for variable-pitch-mode: (when (fontp doom-variable-pitch-font) From d9b06962bee55bcee0fd56e0e25123f0918b33f8 Mon Sep 17 00:00:00 2001 From: ar1a <8436007+ar1a@users.noreply.github.com> Date: Wed, 9 May 2018 08:38:57 +1000 Subject: [PATCH 1143/4235] Add recompile (re) alias to Makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 0dcb75917..9f186cd41 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ r: autoremove c: compile cc: compile-core ce: compile-elpa +re: recompile d: doctor quickstart: | ~/.doom.d/init.el all From c8f29b0220851a66172dd5a127a1951b5ec4b80d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 10:20:09 +0200 Subject: [PATCH 1144/4235] lang/nim: refactor config.el #568 --- modules/lang/nim/config.el | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 7527168ff..4beffb199 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -1,14 +1,18 @@ ;;; lang/nim/config.el -*- lexical-binding: t; -*- (def-package! nim-mode - :init - (add-hook 'nim-mode-hook #'nimsuggest-mode)) - -(def-package! flycheck-nim - :when (featurep! :feature syntax-checker) - :after nim-mode + :mode "\\.nim\\'" + :mode ("\\.nim\\(ble\\|s\\)\\'" . nimscript-mode) :config - (add-hook 'nimsuggest-mode-hook #'flycheck-mode) + (load "nim-mode-autoloads" nil t) + ;; NOTE nim-mode autoloads sets up xref + + (defun +nim|init-nimsuggest-mode () + "Conditionally load `nimsuggest-mode', instead of clumsily erroring out if +nimsuggest isn't installed." + (when (executable-find "nimsuggest") + (nimsuggest-mode))) + (add-hook 'nim-mode-hook #'+nim|init-nimsuggest-mode) (map! :map nim-mode-map :localleader @@ -19,5 +23,10 @@ '(("Build & run" :exec nim-compile)) :prompt "Build")) -(when (featurep! :completion company) - (add-hook 'nimsuggest-mode-hook #'company-mode)) + +(def-package! flycheck-nim + :when (featurep! :feature syntax-checker) + :after nim-mode + :config + (add-hook 'nimsuggest-mode-hook #'flycheck-mode)) + From 7f8db56178c19f7071e5d5971e116b9d5c15dbc3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 10:20:29 +0200 Subject: [PATCH 1145/4235] lang/nim: revise & conform readme to conventions #568 --- modules/lang/nim/README.org | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/modules/lang/nim/README.org b/modules/lang/nim/README.org index 1640f780f..bd12a1fc3 100644 --- a/modules/lang/nim/README.org +++ b/modules/lang/nim/README.org @@ -6,24 +6,33 @@ This module is a work in progress. This module adds [[https://nim-lang.org][Nim]] support to Emacs. -+ Code completion (~nimsuggest+company~) -+ Syntax checking (~nimsugges+flycheck~) ++ Code completion (nimsuggest + company) ++ Syntax checking (nimsuggest + flycheck) + Babel support (~ob-nim~) -#+begin_quote -... -#+end_quote * Table of Contents :TOC: -- [[Install][Install]] +- [[Module Flags][Module Flags]] +- [[Prerequisites][Prerequisites]] - [[Nim][Nim]] +- [[Configuration][Configuration]] + +* Module Flags +This module provides no flags. + +* Prerequisites ++ ~nim~ (for building & evaluation) ++ ~nimsuggest~ (for code completion, syntax checking & jump-to-definition functionality) -* Install ** Nim -To get started with Nim, you can either use =choosenim= and install nim with: +=choosenim= is an installer and version manager for the Nim programming +language. You can install the latest stable release of Nim by running the +following in your terminal and following the onscreen instructions: -~curl https://nim-lang.org/choosenim/init.sh -sSf | sh~ +#+BEGIN_SRC bash +curl https://nim-lang.org/choosenim/init.sh -sSf | sh +#+END_SRC -Or through your package manager: +Alternatively, nim is usually available through your OS's package manager: *** MacOS #+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") @@ -32,6 +41,7 @@ brew install nim *** Arch Linux #+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S nim +sudo pacman --needed --noconfirm -S nim nimble #+END_SRC +* Configuration From d9874da38ae2705db560974a3c1192e73061d329 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 10:20:39 +0200 Subject: [PATCH 1146/4235] lang/nim: add doctor.el #568 --- modules/lang/nim/doctor.el | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 modules/lang/nim/doctor.el diff --git a/modules/lang/nim/doctor.el b/modules/lang/nim/doctor.el new file mode 100644 index 000000000..788238c98 --- /dev/null +++ b/modules/lang/nim/doctor.el @@ -0,0 +1,9 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/nim/doctor.el + +(unless (executable-find "nimsuggest") + (warn! "Could not find nimsuggest executable; code-completion, syntax checking and jump-to-definition functionality will be disabled.")) + +(unless (executable-find "nim") + (warn! "Could not find nim executable; build commands will be disabled.")) + From 93e552fcaf1c64e4279d6d5e0d346d8fe7e9399e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 10:21:00 +0200 Subject: [PATCH 1147/4235] lang/cc: remove unnecessary :after irony properties These two packages will be autoloaded by other means. --- modules/lang/cc/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 4b5b04bcd..fd25c0a7b 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -129,7 +129,6 @@ compilation database is present in the project.") (def-package! irony - :after cc-mode :commands (irony-install-server irony-mode) :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) @@ -145,7 +144,6 @@ compilation database is present in the project.") (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options)) (def-package! irony-eldoc - :after irony :hook (irony-mode . irony-eldoc)) (def-package! flycheck-irony From b3f38a8bed6e3529a31fb738abffd47f5152e95d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 10:21:42 +0200 Subject: [PATCH 1148/4235] completion/ivy: fix header vars in doctor.el --- modules/completion/ivy/doctor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/doctor.el b/modules/completion/ivy/doctor.el index 21300e86d..d730f1552 100644 --- a/modules/completion/ivy/doctor.el +++ b/modules/completion/ivy/doctor.el @@ -1,4 +1,5 @@ -;;; completion/ivy/doctor.el -*- lexical-binding: t; -*- +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; completion/ivy/doctor.el (when (and (not EMACS26+) (featurep! +childframe)) (error! "The +childframe feature requires Emacs 26+")) From b89431eef89e6660ba5a2e43e5359ae03af8df44 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Wed, 9 May 2018 12:11:41 +0200 Subject: [PATCH 1149/4235] Towards fixing byte compilation. --- modules/config/default/+evil-commands.el | 2 ++ modules/lang/latex/config.el | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 619246aba..0f332e7eb 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -1,5 +1,7 @@ ;;; config/default/+evil-commands.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) + (defalias 'ex! 'evil-ex-define-cmd) (evil-define-command doom:cleanup-session (bang) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 9070404df..18da4edf3 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -95,10 +95,10 @@ (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") ;; Set a custom item indentation (setq LaTeX-indent-environment-list - (nconc '(("itemize" +latex/LaTeX-indent-item) - ("enumerate" +latex/LaTeX-indent-item) - ("description" +latex/LaTeX-indent-item)) - LaTeX-indent-environment-list)))) + (append '(("itemize" +latex/LaTeX-indent-item) + ("enumerate" +latex/LaTeX-indent-item) + ("description" +latex/LaTeX-indent-item)) + LaTeX-indent-environment-list)))) (after! latex ;; Use Okular if the user says so. From 30e0ab6aef76e1921e1c92529bb1efb26fdf84c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 11:26:06 +0200 Subject: [PATCH 1150/4235] feature/syntax-checker: new +childframe flag for popups --- init.example.el | 3 ++- modules/feature/syntax-checker/autoload.el | 7 ++++++- modules/feature/syntax-checker/config.el | 7 ++++++- modules/feature/syntax-checker/packages.el | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/init.example.el b/init.example.el index b0887dcb5..52f037831 100644 --- a/init.example.el +++ b/init.example.el @@ -15,7 +15,8 @@ services ; TODO managing external services & code builders snippets ; my elves. They type so I don't have to spellcheck ; tasing you for misspelling mispelling - syntax-checker ; tasing you for every semicolon you forget + (syntax-checker ; tasing you for every semicolon you forget + +childframe) ; use childframes for error popups (Emacs 26+ only) version-control ; remember, remember that commit in November workspaces ; tab emulation, persistence & separate workspaces diff --git a/modules/feature/syntax-checker/autoload.el b/modules/feature/syntax-checker/autoload.el index 6a2d310ae..2265061f9 100644 --- a/modules/feature/syntax-checker/autoload.el +++ b/modules/feature/syntax-checker/autoload.el @@ -2,7 +2,9 @@ (defun +syntax-checker-show-popup (errors) "TODO" - (if (and EMACS26+ (display-graphic-p)) + (if (and EMACS26+ + (featurep! +childframe) + (display-graphic-p)) (flycheck-posframe-show-posframe errors) (flycheck-popup-tip-show-popup errors))) @@ -16,6 +18,9 @@ "TODO" :lighter nil :group 'doom + (if (featurep! +childframe) + (require 'flycheck-posframe) + (require 'flycheck-popup-tip)) (let ((hooks '(post-command-hook focus-out-hook))) (cond ;; Use our display function and remember the old one but only if we haven't diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index a0e14074e..29048618e 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -34,4 +34,9 @@ (def-package! flycheck-posframe :when EMACS26+ - :commands flycheck-posframe-show-posframe) + :when (featurep! +childframe) + :commands flycheck-posframe-show-posframe + :config + (setq flycheck-posframe-warning-prefix "⚠ " + flycheck-posframe-info-prefix "··· " + flycheck-posframe-error-prefix "✕ ")) diff --git a/modules/feature/syntax-checker/packages.el b/modules/feature/syntax-checker/packages.el index d80746c82..f7144267c 100644 --- a/modules/feature/syntax-checker/packages.el +++ b/modules/feature/syntax-checker/packages.el @@ -3,5 +3,5 @@ (package! flycheck) (package! flycheck-popup-tip) -(when EMACS26+ +(when (and EMACS26+ (featurep! +childframe)) (package! flycheck-posframe)) From 158c853e635d982ba8bf74c9a27a5e429eb56a19 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 11:26:48 +0200 Subject: [PATCH 1151/4235] lang/cc: don't complain about missing rtags executable --- modules/lang/cc/autoload.el | 3 ++- modules/lang/cc/config.el | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 35fc4b736..d14f7c28e 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -92,7 +92,8 @@ compilation dbs." ;;;###autoload (defun +cc|init-rtags () "Start an rtags server in c-mode and c++-mode buffers." - (when (memq major-mode '(c-mode c++-mode)) + (when (and (memq major-mode '(c-mode c++-mode)) + (rtags-executable-find "rtags")) (rtags-start-process-unless-running))) ;;;###autoload diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index fd25c0a7b..565dc5f49 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -213,7 +213,7 @@ compilation database is present in the project.") ;; (def-package! rtags - :commands (rtags-restart-process rtags-start-process-unless-running) + :commands (rtags-restart-process rtags-start-process-unless-running rtags-executable-find) :init (add-hook! (c-mode c++-mode) #'+cc|init-rtags) :config From a107dcd7a9d40fa76f6b1f3bde621ec3956fd782 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 12:26:14 +0200 Subject: [PATCH 1152/4235] config/default: minor reformat (remove whitespace above compiler cookie) --- modules/config/default/+evil-commands.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 0f332e7eb..d9d2766f9 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -1,5 +1,4 @@ ;;; config/default/+evil-commands.el -*- lexical-binding: t; -*- - ;;;###if (featurep! :feature evil) (defalias 'ex! 'evil-ex-define-cmd) From aa9ee682483333c2d56c7078e31c9f7575dcdbcf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 12:31:02 +0200 Subject: [PATCH 1153/4235] tools/tmux: fix +tmux/cd --- modules/tools/tmux/autoload/tmux.el | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/modules/tools/tmux/autoload/tmux.el b/modules/tools/tmux/autoload/tmux.el index 2cab93d2e..fdfaa6c5e 100644 --- a/modules/tools/tmux/autoload/tmux.el +++ b/modules/tools/tmux/autoload/tmux.el @@ -66,16 +66,11 @@ but do not execute them." (apply #'+tmux (car +tmux-last-command) (cdr +tmux-last-command))) ;;;###autoload -(defun +tmux/cd (&optional directory) +(defun +tmux/cd (&optional arg directory) "Change the pwd of the currently active tmux pane to DIRECTORY (defaults to `default-directory', or to `doom-project-root' with the universal argument)." - (interactive - (list - (when current-prefix-arg - (read-directory-name - "cd: " nil - (if current-prefix-arg (doom-project-root) default-directory) t)))) - (+tmux "cd %s" (or directory default-directory))) + (interactive "PD") + (+tmux/run (format "cd %s" (or directory default-directory)) arg)) ;;;###autoload (defun +tmux/cd-to-here () From 505ceb35302d999d653f1879c17d578a300bdb4e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 12:31:24 +0200 Subject: [PATCH 1154/4235] lang/latex: major refactor & reformatting --- modules/lang/latex/config.el | 149 ++++++++++++++++------------------- 1 file changed, 70 insertions(+), 79 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 18da4edf3..29ecefa08 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -59,11 +59,9 @@ ;; (def-package! tex-style :defer t) ;; TeX Folding - (add-hook 'TeX-mode-hook 'TeX-fold-mode) + (add-hook 'TeX-mode-hook #'TeX-fold-mode) - (def-package! latex - :defer t - :init + (after! latex (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. '(LaTeX-section-heading LaTeX-section-title @@ -72,19 +70,20 @@ LaTeX-section-label) LaTeX-fill-break-at-separators nil LaTeX-item-indent 0) ; item indentation. - :config + (map! :map LaTeX-mode-map "C-j" nil) + ;; Do not prompt for Master files, this allows auto-insert to add templates ;; to .tex files (add-hook! '(LaTeX-mode TeX-mode) (remove-hook 'find-file-hook (car find-file-hook) 'local)) ;; Adding useful things for latex - (add-hook! LaTeX-mode - (LaTeX-math-mode) - (TeX-source-correlate-mode) - (TeX-global-PDF-mode t) - (TeX-PDF-mode t) - (visual-line-mode +1)) + (add-hook! 'LaTeX-mode-hook + #'(LaTeX-math-mode + TeX-source-correlate-mode + TeX-global-PDF-mode + TeX-PDF-mode + visual-line-mode)) ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) @@ -98,34 +97,30 @@ (append '(("itemize" +latex/LaTeX-indent-item) ("enumerate" +latex/LaTeX-indent-item) ("description" +latex/LaTeX-indent-item)) - LaTeX-indent-environment-list)))) + LaTeX-indent-environment-list)) -(after! latex - ;; Use Okular if the user says so. - (when (featurep! +okular) - ;; Configure Okular as viewer. Including a bug fix - ;; (https://bugs.kde.org/show_bug.cgi?id=373855) - (add-to-list 'TeX-view-program-list - '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) - (add-to-list 'TeX-view-program-selection - '(output-pdf "Okular"))) + ;; + ;; Use Okular if the user says so. + (when (featurep! +okular) + ;; Configure Okular as viewer. Including a bug fix + ;; (https://bugs.kde.org/show_bug.cgi?id=373855) + (map-put TeX-view-program-list + "Okular" '(("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) + (map-put TeX-view-program-list 'output-pdf '("Okular"))) - ;; Or Skim - (when (featurep! +skim) - (add-to-list 'TeX-view-program-list - '("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) - (add-to-list 'TeX-view-program-selection - '(output-pdf "Skim"))) - - ;; Or PDF-tools, but only if the module is also loaded - (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-list - '("PDF Tools" ("TeX-pdf-tools-sync-view"))) - (add-to-list 'TeX-view-program-selection - '(output-pdf "PDF Tools")) - ;; Enable auto reverting the PDF document with PDF Tools - (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) + ;; Or Skim + (when (featurep! +skim) + (map-put TeX-view-program-list + "Skim" '("/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) + (map-put TeX-view-program-selection 'output-pdf '("Skim"))) + ;; Or PDF-tools, but only if the module is also loaded + (when (and (featurep! :tools pdf) + (featurep! +pdf-tools)) + (map-put TeX-view-program-list "PDF Tools" '("TeX-pdf-tools-sync-view")) + (map-put TeX-view-program-selection 'output-pdf '("PDF Tools")) + ;; Enable auto reverting the PDF document with PDF Tools + (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)))) (def-package! preview @@ -134,16 +129,31 @@ ;; master, so we just have to wait. :init (setq-default preview-scale 1.4 - preview-scale-function '(lambda () (* (/ 10.0 (preview-document-pt)) preview-scale))) - (add-hook! LaTeX-mode #'LaTeX-preview-setup)) + preview-scale-function + (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale))) + (add-hook 'LaTeX-mode-hook #'LaTeX-preview-setup)) + + +(def-package! latex-preview-pane + :when (featurep! +preview-pane) + :commands latex-preview-pane-enable + :init + (setq latex-preview-pane-multifile-mode 'auctex) + (add-hook! (latex-mode LaTeX-mode) #'latex-preview-pane-enable) + (map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode)) + (map-put TeX-view-program-selection 'output-pdf '("preview-pane")) + :config + (map! :map doc-view-mode-map + "ESC" #'delete-window + "q" #'delete-window + "k" (λ! (quit-window) (delete-window)))) + (def-package! reftex :commands turn-on-reftex :init (setq reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) - (unless (string-empty-p +latex-bibtex-file) - (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (add-hook! (latex-mode LaTeX-mode) #'turn-on-reftex) :config ;; Get ReTeX working with biblatex @@ -156,6 +166,8 @@ (?f . "\\footcite[]{%l}") (?n . "\\nocite{%l}") (?b . "\\blockcquote[]{%l}{}"))) + (unless (string-empty-p +latex-bibtex-file) + (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (map! :map reftex-mode-map :localleader :n ";" 'reftex-toc) (add-hook! 'reftex-toc-mode-hook @@ -167,69 +179,47 @@ :e "ESC" #'kill-buffer-and-window "C-g" #'reftex-toc-quit))) + (def-package! bibtex :defer t - :mode ("\\.bib" . bibtex-mode) + :mode ("\\.bib\\'" . bibtex-mode) :config (setq bibtex-dialect 'biblatex bibtex-align-at-equal-sign t - bibtex-text-indentation 20 - bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))) + bibtex-text-indentation 20) + (unless (string-empty-p +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) + (unless (string-empty-p +latex-bibtex-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-dir) + bibtex-completion-pdf-field "file" + bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir) + bibtex-completion-pdf-open-function + (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath)))) (map! :map bibtex-mode-map "C-c \\" #'bibtex-fill-entry)) -(def-package! latex-preview-pane - :when (featurep! +preview-pane) - :commands latex-preview-pane-enable - :init - (setq latex-preview-pane-multifile-mode 'auctex) - (add-hook! (latex-mode LaTeX-mode) #'latex-preview-pane-enable) - (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) - (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane")) - :config - (map! :map doc-view-mode-map - "ESC" #'delete-window - "q" #'delete-window - "k" (λ! (quit-window) (delete-window)))) -;; Enable latexmk only if the user explicitly says so with the module flag -;; '+latexmk'. (def-package! auctex-latexmk :when (featurep! +latexmk) :init ;; Pass the -pdf flag when TeX-PDF-mode is active (setq auctex-latexmk-inherit-TeX-PDF-mode t) ;; Set LatexMk as the default - (add-hook! LaTeX-mode (setq TeX-command-default "LatexMk")) + (setq-hook! LaTeX-mode TeX-command-default "LatexMk") :config ;; Add latexmk as a TeX target (auctex-latexmk-setup)) + (def-package! ivy-bibtex :when (featurep! :completion ivy) :commands ivy-bibtex - :config - (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key) - (unless (string-empty-p +latex-bibtex-file) - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (string-empty-p +latex-bibtex-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-dir) - bibtex-completion-pdf-field "file" - bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-dir) - bibtex-completion-pdf-open-function - (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))) + :config (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key)) + (def-package! helm-bibtex :when (featurep! :completion helm) - :commands helm-bibtex - :config - (unless (string-empty-p +latex-bibtex-file) - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (string-empty-p +latex-bibtex-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-dir) - bibtex-completion-pdf-field "file" - bibtex-completion-notes-path (f-expand "notes.org" +latex-bibtex-dir) - bibtex-completion-pdf-open-function - (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath))))) + :commands helm-bibtex) + (def-package! company-auctex :when (featurep! :completion company) @@ -242,6 +232,7 @@ (make-variable-buffer-local 'company-backends) (company-auctex-init))) + ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap :commands (adaptive-wrap-prefix-mode) From e33a3b2c6353ac3300359e10b4dba68b86c237fb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 12:34:50 +0200 Subject: [PATCH 1155/4235] feature/snippets: add doctor.el --- modules/feature/snippets/doctor.el | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 modules/feature/snippets/doctor.el diff --git a/modules/feature/snippets/doctor.el b/modules/feature/snippets/doctor.el new file mode 100644 index 000000000..8ba004a36 --- /dev/null +++ b/modules/feature/snippets/doctor.el @@ -0,0 +1,7 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; feature/snippets/doctor.el + +(require 'yasnippet) +(unless (ignore-errors (yas-reload-all) + (yas--get-snippet-tables)) + (warn! "Couldn't find any snippets in any of these directories: %s" yas-snippet-dirs)) From ffabd2687bf3f04a5122314bfba98e8719ffd8ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 9 May 2018 12:49:09 +0200 Subject: [PATCH 1156/4235] lang/javascript: refactor & document +javascript/cleanup-tide-processes --- modules/lang/javascript/autoload.el | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 7e03d5749..2cf22ab83 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -102,12 +102,15 @@ If it's found, then add it to the `exec-path'." ;;;###autoload (defun +javascript|cleanup-tide-processes () - "TODO" + "Clean up dangling tsserver processes if there are no more buffers with +`tide-mode' active that belong to that server's project." (when tide-mode - (unless (cl-loop with root = (tide-project-root) + (unless (cl-loop with project-name = (tide-project-name) for buf in (delq (current-buffer) (buffer-list)) - if (buffer-local-value 'tide-mode buf) - collect buf) + if (and (buffer-local-value 'tide-mode buf) + (with-current-buffer buf + (string= (tide-project-name) project-name))) + return buf) (kill-process (tide-current-server))))) From 1ee9a1893fb61088fb53988bd6b4f2766f466b4c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 19:27:14 +0200 Subject: [PATCH 1157/4235] completion/company: company-frontends bug fixed upstream --- modules/completion/company/config.el | 9 --------- 1 file changed, 9 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 4fd2f7635..c16ca0d91 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -58,15 +58,6 @@ MODES should be one major-mode symbol or a list of them." (def-package! company-box :when (and EMACS26+ (featurep! +childframe)) :hook (company-mode . company-box-mode) - :init - (defun +company|fix-frontends () - "Ensure `company-pseudo-tooltip-frontend' is *not* in `company-frontends' -when company-box is active, which are incompatible and cause duplicate popups." - (make-variable-buffer-local 'company-frontends) - (if company-box-mode - (setq company-frontends (delq 'company-pseudo-tooltip-frontend company-frontends)) - (cl-pushnew 'company-pseudo-tooltip-frontend company-frontends :test #'eq))) - (add-hook 'company-box-mode-hook #'+company|fix-frontends) :config (setq company-box-backends-colors nil company-box-icons-elisp From 5426fe072c6001b4c74f43ebb9686db102e1b4e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 21:09:54 +0200 Subject: [PATCH 1158/4235] feature/workspaces: autoload faces --- modules/feature/workspaces/autoload/workspaces.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 54d81e33e..31fe8f3b0 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -3,11 +3,12 @@ (defvar +workspace--last nil) (defvar +workspace--index 0) -;; +;;;###autoload (defface +workspace-tab-selected-face '((t (:inherit 'highlight))) "The face for selected tabs displayed by `+workspace/display'" :group 'persp-mode) +;;;###autoload (defface +workspace-tab-face '((t (:inherit 'default))) "The face for selected tabs displayed by `+workspace/display'" :group 'persp-mode) From a449519325771d64a60d3d5a621df085a6d98824 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 22:15:49 +0200 Subject: [PATCH 1159/4235] config/default: rename :x => :pad As not to shadow the default :x[it] --- modules/config/default/+evil-commands.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index d9d2766f9..976fc1b81 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -57,7 +57,7 @@ (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-scratch-buffer) +(ex! "pad" #'doom:open-scratch-buffer) ;; GIT (ex! "gist" #'+gist:send) ; send current buffer/region to gist (ex! "gistl" #'+gist:list) ; list gists by user From 9cd2de0ce906440c0e3dcbb09720519b6eae3df7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 22:39:09 +0200 Subject: [PATCH 1160/4235] Fix make recompile --- 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 9c7d926d4..6f1ec4f51 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -762,7 +762,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (interactive (list nil current-prefix-arg)) (let ((default-directory doom-emacs-dir) - (recompile-p (or recompile-p (and (member "-r" (cdr argv)) t)))) + (recompile-p (or recompile-p (and (member "-r" (cdr argv)) t))) + (argv (delete "-r" argv))) (if (not noninteractive) ;; This is done in another instance to protect the current session's ;; state, because this function has side effects. @@ -812,7 +813,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (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)))) + (file-newer-than-file-p target elc-file)))) (let ((result (if (doom-packages--read-if-cookies target) (byte-compile-file target) 'no-byte-compile)) From cea270d95029b3652594fe5f801d5e8c05a67b09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 22:39:35 +0200 Subject: [PATCH 1161/4235] Add recompile step to make quickstart --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 9f186cd41..cc4702754 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ ce: compile-elpa re: recompile d: doctor -quickstart: | ~/.doom.d/init.el all +quickstart: | ~/.doom.d/init.el all recompile ~/.doom.d/init.el: mkdir ~/.doom.d && cp init.example.el ~/.doom.d/init.el From c74dbfd1e693bd17c188bf68bff69be2f7b5483c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 22:39:49 +0200 Subject: [PATCH 1162/4235] make quickrun: improve feedback --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index cc4702754..7df064626 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,9 @@ d: doctor quickstart: | ~/.doom.d/init.el all recompile ~/.doom.d/init.el: - mkdir ~/.doom.d && cp init.example.el ~/.doom.d/init.el + @echo "Creating ~/.doom.d directory" + @mkdir ~/.doom.d && cp init.example.el ~/.doom.d/init.el + @touch ~/.doom.d/config.el ## Package management install: | .local/autoloads.el From f4222cf6f1f613960a6a1c01e6f0ab82ff47cba6 Mon Sep 17 00:00:00 2001 From: Yuxin Wu Date: Thu, 10 May 2018 20:35:09 -0700 Subject: [PATCH 1163/4235] Update packages.el --- modules/config/default/packages.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/config/default/packages.el b/modules/config/default/packages.el index 9f7eb6793..87f8e83b6 100644 --- a/modules/config/default/packages.el +++ b/modules/config/default/packages.el @@ -1,7 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; config/default/packages.el -(package! emacs-snippets - :recipe (:fetcher github - :repo "hlissner/emacs-snippets" - :files ("*"))) +(when (featurep! +snippets) + (package! emacs-snippets + :recipe (:fetcher github + :repo "hlissner/emacs-snippets" + :files ("*")))) From 92d5f4266c54166b395d20f6aa0b125cf0b56e08 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 23:18:46 +0200 Subject: [PATCH 1164/4235] custom-theme-directory = ~/.doom.d/themes/ --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index 4f0b4fb53..23c7137c8 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -41,6 +41,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") compilation-scroll-output 'first-error confirm-nonexistent-file-or-buffer t cursor-in-non-selected-windows nil ; hide cursors in other windows + custom-theme-directory (concat doom-private-dir "themes/") display-line-numbers-width 3 enable-recursive-minibuffers nil frame-inhibit-implied-resize t From 0ffc1fa3dfe6459941fddb0f8bf1ad9f53a32b50 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 23:19:03 +0200 Subject: [PATCH 1165/4235] {window,frame}-resize-pixelwise = t --- core/core-ui.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 23c7137c8..e7c04812f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -72,7 +72,10 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") pos-tip-border-width 1 ;; no beeping or blinking please ring-bell-function #'ignore - visible-bell nil) + visible-bell nil + ;; don't resize emacs in steps, it looks weird + window-resize-pixelwise t + frame-resize-pixelwise t) (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no From 27f99f040cad25b8eb56ca8f4b48488c8fa3ed22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 May 2018 23:47:29 +0200 Subject: [PATCH 1166/4235] Remove shackle (why is this still here?!) --- core/packages.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/packages.el b/core/packages.el index d40910824..6c72a1259 100644 --- a/core/packages.el +++ b/core/packages.el @@ -17,9 +17,6 @@ (package! rainbow-delimiters) (package! visual-fill-column) -;; core-popups.el -(package! shackle) - ;; core-editor.el (package! ace-link) (package! ace-window) From 2b2f6bcf32da64605ed0d49506740ae71afb83e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 00:00:02 +0200 Subject: [PATCH 1167/4235] New command: doom/profile-emacs (powered by esup) --- core/autoload/util.el | 28 ++++++++++++++++++++++++++++ core/packages.el | 3 +++ 2 files changed, 31 insertions(+) diff --git a/core/autoload/util.el b/core/autoload/util.el index 88d03330f..03b21b71a 100644 --- a/core/autoload/util.el +++ b/core/autoload/util.el @@ -89,6 +89,34 @@ the profiling report otherwise." (profiler-stop)) (setq doom--profiler (not doom--profiler))) +;;;###autoload +(defun doom/profile-emacs () + "Profile the startup time of Emacs in the background. +If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." + (interactive) + (require 'esup) + (let ((init-file esup-user-init-file)) + (message "Starting esup...") + (esup-reset) + (setq esup-server-process (esup-server-create (esup-select-port))) + (setq esup-server-port (process-contact esup-server-process :service)) + (message "esup process started on port %s" esup-server-port) + (let ((process-args `("*esup-child*" + "*esup-child*" + ,esup-emacs-path + "-q" + "-L" ,esup-load-path + "-l" "esup-child" + ,(format "--eval=(esup-child-run \"%s\" \"%s\" %d)" + init-file + esup-server-port + esup-depth) + "--eval=(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)"))) + (when esup-run-as-batch-p + (setq process-args (append process-args '("--batch")))) + (setq esup-child-process (apply #'start-process process-args))) + (set-process-sentinel esup-child-process 'esup-child-process-sentinel))) + ;;;###autoload (defun doom-info () "Returns diagnostic information about the current Emacs session in markdown, diff --git a/core/packages.el b/core/packages.el index 6c72a1259..21a696855 100644 --- a/core/packages.el +++ b/core/packages.el @@ -34,3 +34,6 @@ ;; core-keybinds.el (package! which-key) (package! hydra) + +;; other +(package! esup) From 52cdb0bd837561a6de2ebba0d3394b44a709214e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 00:01:05 +0200 Subject: [PATCH 1168/4235] Remove doom-fringe-size; set default fringe in :ui doom There was no way to customize doom-fringe-size. Better to customize fringes by using fringe-mode, {left,right}-fringe-width or set-window-fringes directly. --- core/core-ui.el | 5 ----- modules/feature/popup/autoload.el | 2 +- modules/ui/doom/config.el | 3 +++ 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index e7c04812f..029b0e77b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -1,8 +1,5 @@ ;;; core-ui.el -*- lexical-binding: t; -*- -(defvar doom-fringe-size '4 - "Default fringe width.") - (defvar doom-theme nil "A symbol representing the color theme to load.") @@ -562,8 +559,6 @@ frame's window-system, the theme will be reloaded.") (menu-bar-mode -1) (if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) (if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) -;; standardize default fringe width -(if (fboundp 'fringe-mode) (fringe-mode doom-fringe-size)) ;; prompts the user for confirmation when deleting a non-empty frame (define-key global-map [remap delete-frame] #'doom/delete-frame) diff --git a/modules/feature/popup/autoload.el b/modules/feature/popup/autoload.el index 045b8affb..7ad2d2177 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/feature/popup/autoload.el @@ -277,7 +277,7 @@ that window has been changed or closed." (defun +popup|adjust-fringes () "Hides the fringe in popup windows, restoring them if `+popup-buffer-mode' is disabled." - (let ((f (if +popup-buffer-mode 0 doom-fringe-size))) + (let ((f (if +popup-buffer-mode 0))) (set-window-fringes nil f f fringes-outside-margins))) ;;;###autoload diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 98f47b203..053ed049f 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -104,3 +104,6 @@ nil nil '(center repeated)) (define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240] nil nil 'bottom)) + +;; standardize default fringe width +(if (fboundp 'fringe-mode) (fringe-mode '4)) From 9b1385b725f67f080fa2442040e17ae6af1c3818 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 00:08:50 +0200 Subject: [PATCH 1169/4235] core-ui: general refactor/reformatting --- core/core-ui.el | 50 ++++++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 029b0e77b..026e80689 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -24,10 +24,29 @@ Expects a `font-spec'.") return a string). This changes the 'long' name of a major-mode, allowing for shorter major mode name in the mode-line. See `doom|set-mode-name'.") - -;; Hook(s) (defvar doom-init-ui-hook nil - "List of hooks to run when core-ui is initialized.") + "List of hooks to run when the UI has been initialized.") + +(defvar doom-load-theme-hook nil + "Hook run when the theme (and font) is initialized (or reloaded +with `doom//reload-theme').") + +(defvar doom-before-switch-window-hook nil + "Hook run before `switch-window' or `switch-frame' are called. See +`doom-after-switch-window-hook'.") + +(defvar doom-after-switch-window-hook nil + "Hook run after `switch-window' or `switch-frame' are called. See +`doom-before-switch-window-hook'.") + +(defvar doom-before-switch-buffer-hook nil + "Hook run before `switch-to-buffer' and `display-buffer' are called. See +`doom-after-switch-buffer-hook'.") + +(defvar doom-after-switch-buffer-hook nil + "Hook run before `switch-to-buffer' and `display-buffer' are called. See +`doom-before-switch-buffer-hook'.") + (setq-default ansi-color-for-comint-mode t @@ -309,26 +328,6 @@ from the default." ;; Custom hooks ;; -(defvar doom-load-theme-hook nil - "Hook run when the theme (and font) is initialized (or reloaded -with `doom//reload-theme').") - -(defvar doom-before-switch-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. See -`doom-after-switch-window-hook'.") - -(defvar doom-after-switch-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. See -`doom-before-switch-window-hook'.") - -(defvar doom-before-switch-buffer-hook nil - "Hook run before `switch-to-buffer' and `display-buffer' are called. See -`doom-after-switch-buffer-hook'.") - -(defvar doom-after-switch-buffer-hook nil - "Hook run before `switch-to-buffer' and `display-buffer' are called. See -`doom-before-switch-buffer-hook'.") - (defun doom*switch-frame-hooks (orig-fn frame &optional norecord) (if (eq frame (selected-frame)) (funcall orig-fn frame norecord) @@ -355,7 +354,7 @@ with `doom//reload-theme').") (defun doom*load-theme-hooks (&rest _) (run-hook-with-args 'doom-load-theme-hook)) -(advice-add #'load-theme :after #'doom*load-theme-hooks) +(advice-add #'load-theme :after #'doom*load-theme-hooks) ;; @@ -487,7 +486,7 @@ character that looks like a space that `whitespace-mode' won't affect.") :commands (nlinum-relative-mode nlinum-relative-on nlinum-relative-off) :config (setq nlinum-format " %d ") - (after! evil (nlinum-relative-setup-evil))) + (add-hook 'evil-mode #'nlinum-relative-setup-evil)) ;; @@ -571,7 +570,6 @@ frame's window-system, the theme will be reloaded.") (after! posframe ;; TODO Find a better place for this (defun doom|delete-posframe-on-escape () - "TODO" (unless (frame-parameter (selected-frame) 'posframe-buffer) (cl-loop for frame in (frame-list) if (and (frame-parameter frame 'posframe-buffer) From d31fcb21316e0a11854d34e606eff485278a31d7 Mon Sep 17 00:00:00 2001 From: Yuxin Wu Date: Sun, 13 May 2018 23:03:17 -0700 Subject: [PATCH 1170/4235] Update config.el --- modules/tools/imenu/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/imenu/config.el b/modules/tools/imenu/config.el index 07d11ae70..58628197d 100644 --- a/modules/tools/imenu/config.el +++ b/modules/tools/imenu/config.el @@ -6,7 +6,7 @@ (def-package! imenu-list - :commands imenu-list-minor-mode + :commands (imenu-list-minor-mode imenu-list-smart-toggle) :config (setq imenu-list-idle-update-delay 0.5) From b6e25993582bfb11798c690eeeffe4de37dcafc7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:16:19 +0200 Subject: [PATCH 1171/4235] lang/org: change recentf/persp clobbering fix --- modules/lang/org/config.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 709fc382a..ad59e30df 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -319,10 +319,14 @@ between the two." (t . ,(cond (IS-MAC "open -R \"%s\"") (IS-LINUX "xdg-open \"%s\""))))) - (after! recentf - ;; Don't clobber recentf with agenda files - (defun +org-is-agenda-file (filename) - (cl-find (file-truename filename) org-agenda-files - :key #'file-truename - :test #'equal)) - (push #'+org-is-agenda-file recentf-exclude))) + ;; Don't clobber recentf or current workspace with agenda files + (defun +org|exclude-agenda-buffers-from-workspace () + (let (persp-autokill-buffer-on-remove) + (persp-remove-buffer org-agenda-new-buffers (get-current-persp) nil))) + (add-hook 'org-agenda-finalize-hook #'+org|exclude-agenda-buffers-from-workspace) + + (defun +org*exclude-agenda-buffers-from-recentf (orig-fn &rest args) + (let ((recentf-exclude (list (lambda (_file) t)))) + (apply orig-fn args))) + (advice-add #'org-get-agenda-file-buffer + :around #'+org*exclude-agenda-buffers-from-recentf)) From 99eef125b050abd5ed1cfba1cbcdab63ef5d587a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:16:36 +0200 Subject: [PATCH 1172/4235] Move :tools neotree => :ui neotree --- modules/{tools => ui}/neotree/README.org | 0 modules/{tools => ui}/neotree/autoload.el | 2 +- modules/{tools => ui}/neotree/config.el | 3 ++- modules/{tools => ui}/neotree/packages.el | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) rename modules/{tools => ui}/neotree/README.org (100%) rename modules/{tools => ui}/neotree/autoload.el (97%) rename modules/{tools => ui}/neotree/config.el (95%) rename modules/{tools => ui}/neotree/packages.el (62%) diff --git a/modules/tools/neotree/README.org b/modules/ui/neotree/README.org similarity index 100% rename from modules/tools/neotree/README.org rename to modules/ui/neotree/README.org diff --git a/modules/tools/neotree/autoload.el b/modules/ui/neotree/autoload.el similarity index 97% rename from modules/tools/neotree/autoload.el rename to modules/ui/neotree/autoload.el index 69720725f..a9426f399 100644 --- a/modules/tools/neotree/autoload.el +++ b/modules/ui/neotree/autoload.el @@ -1,4 +1,4 @@ -;;; tools/neotree/autoload.el -*- lexical-binding: t; -*- +;;; ui/neotree/autoload.el -*- lexical-binding: t; -*- ;; `neotree-show' and `neotree-find' don't respect the current project, and open ;; neotree in `default-directory'. `+neotree/open' and `neotree/find-this-file' diff --git a/modules/tools/neotree/config.el b/modules/ui/neotree/config.el similarity index 95% rename from modules/tools/neotree/config.el rename to modules/ui/neotree/config.el index 6d57badde..999a8ea35 100644 --- a/modules/tools/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -1,4 +1,4 @@ -;;; tools/neotree/config.el -*- lexical-binding: t; -*- +;;; ui/neotree/config.el -*- lexical-binding: t; -*- (def-package! neotree :commands (neotree-show @@ -21,6 +21,7 @@ neo-confirm-create-directory #'off-p neo-show-hidden-files nil neo-keymap-style 'concise + neo-show-hidden-files t neo-hidden-regexp-list '(;; vcs folders "^\\.\\(git\\|hg\\|svn\\)$" diff --git a/modules/tools/neotree/packages.el b/modules/ui/neotree/packages.el similarity index 62% rename from modules/tools/neotree/packages.el rename to modules/ui/neotree/packages.el index 86ec08eaf..47aae4652 100644 --- a/modules/tools/neotree/packages.el +++ b/modules/ui/neotree/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/neotree/packages.el +;;; ui/neotree/packages.el (package! neotree) From 42e44a6cc97be1d29f39c371dcf5ec77c351c292 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:17:00 +0200 Subject: [PATCH 1173/4235] tools/eshell: autoload custom faces & add :group --- modules/tools/eshell/autoload/eshell.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index e3bb5e35b..d720240b3 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -1,13 +1,19 @@ ;;; tools/eshell/autoload/eshell.el -*- lexical-binding: t; -*- +;;;###autoload (defface +eshell-prompt-pwd '((t :inherit eshell-prompt)) - "TODO") + "TODO" + :group 'eshell) +;;;###autoload (defface +eshell-prompt-git-branch '((t :inherit font-lock-function-name-face)) - "TODO") + "TODO" + :group 'eshell) +;;;###autoload (defface +eshell-prompt-char '((t :inherit font-lock-constant-face)) - "TODO") + "TODO" + :group 'eshell) (defvar +eshell-buffers (make-ring 25) From 2373429e76ea3dabe97c84671655b281a93556cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:17:21 +0200 Subject: [PATCH 1174/4235] inhibit-compacting-font-caches = t Performance at the cost of some space efficiency --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index 026e80689..779a5c674 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -67,6 +67,7 @@ with `doom//reload-theme').") image-animate-loop t indicate-buffer-boundaries nil indicate-empty-lines nil + inhibit-compacting-font-caches t 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 From 7630394210c6cde6916b4edb0afb339a04fb0855 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:19:26 +0200 Subject: [PATCH 1175/4235] feature/lookup: replace devdocs packages with devdocs-lookup Improved search; now downloads index from devdocs.io and lets you fuzzy-search its listing with ivy/helm. --- modules/feature/lookup/autoload/lookup.el | 21 +++------------------ modules/feature/lookup/config.el | 16 +++++++--------- modules/feature/lookup/packages.el | 2 +- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index cd9390121..7e2cb7044 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -153,8 +153,8 @@ Goes down a list of possible backends: (helm-dash-installed-docsets)) (+lookup/in-docsets identifier)) - ((featurep! :feature lookup +devdocs) - (+lookup/in-devdocs identifier)) + ((featurep! +devdocs) + (call-interactively #'+lookup/in-devdocs)) ((+lookup/online identifier @@ -166,22 +166,7 @@ Goes down a list of possible backends: ;; ;;;###autoload -(defun +lookup/in-devdocs (&optional query docs) - "TODO" - (interactive) - (require 'devdocs) - (let* ((docs - (unless (eq docs 'blank) - (or docs (cdr (assq major-mode devdocs-alist)) ""))) - (query (or query (+lookup--symbol-or-region) "")) - (pattern (string-trim-left (format "%s %s" docs query)))) - (unless (and current-prefix-arg docs) - (setq pattern (read-string "Lookup on devdocs.io: " pattern))) - (funcall +lookup-open-url-fn - (format "%s/#q=%s" devdocs-url - (url-hexify-string pattern))) - (unless (string-empty-p pattern) - (cl-pushnew pattern devdocs-search-history)))) +(defalias #'+lookup/in-devdocs #'devdocs-lookup) (defvar counsel-dash-docsets) (defvar helm-dash-docsets) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 7e4a8fa46..fff54e5a1 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -201,14 +201,12 @@ See `devdocs-alist' for the defaults. " `(dolist (mode ',modes) (push (cons mode ,docset) devdocs-alist))) - (def-package! devdocs - :defer t + (def-package! devdocs-lookup + :commands (devdocs-setup devdocs-lookup) :config - (setq devdocs-alist - (append '((rust-mode . "rust") - (scss-mode . "scss") - (gfm-mode . "markdown") - (nim-mode . "nim") - (typescript-mode . "typescript")) - devdocs-alist)))) + (setq devdocs-subjects + (append '(("SCSS" "scss") + ("GFM" "markdown") + ("Typescript" "typescript")) + devdocs-subjects)))) diff --git a/modules/feature/lookup/packages.el b/modules/feature/lookup/packages.el index 3d54bd1a4..cf09f591b 100644 --- a/modules/feature/lookup/packages.el +++ b/modules/feature/lookup/packages.el @@ -14,4 +14,4 @@ (package! counsel-dash))) (when (featurep! +devdocs) - (package! devdocs)) + (package! devdocs-lookup :recipe (:fetcher github :repo "skeeto/devdocs-lookup"))) From 57f383ef763cc2a3a1f18f977bfa776e5cdda000 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:22:05 +0200 Subject: [PATCH 1176/4235] General revision of docstrings --- core/core-editor.el | 2 +- core/core-lib.el | 8 +++++--- modules/config/default/+evil-commands.el | 3 +++ modules/feature/lookup/autoload/lookup.el | 21 ++++++++++----------- modules/feature/lookup/config.el | 5 ++++- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 0382d924e..05db0f105 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -119,7 +119,7 @@ fundamental-mode) for performance sake." sp-show-pair-delay 0 sp-max-pair-length 3) - ;; disable smartparens in evil-mode's replace state (they conflict) + ;; smartparens conflicts with evil-mode's replace state (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) diff --git a/core/core-lib.el b/core/core-lib.el index 54920f0d4..37b6e6c6b 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -232,8 +232,8 @@ Body forms can access the hook's arguments through the let-bound variable ;; I needed a way to reliably cross-configure modules without worrying about ;; whether they were enabled or not, so I wrote `set!'. If a setting doesn't -;; exist at runtime, the `set!' call is ignored (and omitted when -;; byte-compiled). +;; exist at runtime, the `set!' call is ignored and its arguments are left +;; unevaluated (and entirely omitted when byte-compiled). (defvar doom-settings nil) (defmacro def-setting! (keyword arglist &optional docstring &rest forms) @@ -255,7 +255,9 @@ Do not use this for configuring Doom core." (defmacro set! (keyword &rest values) "Set an option defined by `def-setting!'. Skip if doesn't exist. See -`doom/describe-setting' for a list of available settings." +`doom/describe-setting' for a list of available settings. + +VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." (declare (indent defun)) (unless values (error "Empty set! for %s" keyword)) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 976fc1b81..b64a10242 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -12,6 +12,7 @@ (doom/open-scratch-buffer bang)) (evil-define-command doom:pwd (bang) + "Display the current working directory. If BANG, copy it to your clipboard." (interactive "") (if (not bang) (pwd) @@ -19,6 +20,8 @@ (message "Copied to clipboard"))) (evil-define-command doom:make (command &optional from-pwd) + "Run the current project Makefile's COMMAND. If FROM-PWD (bang), run the make +command from the current directory instead of the project root." (interactive "") (let ((default-directory (if from-pwd default-directory (doom-project-root t))) (command (and command (evil-ex-replace-special-filenames command)))) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 7e2cb7044..9aace7db3 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -56,17 +56,13 @@ ;;;###autoload (defun +lookup/definition (identifier &optional other-window) - "Jump to the definition of the symbol at point. It will try several things -to find it: + "Jump to the definition of the symbol at point. -1. It will try whatever function that has been set for the current buffer, in - `+lookup-current-functions'. -2. Then try any available xref backends, -3. Then `dumb-jump', -4. Then a plain project-wide text search, using ripgrep or the_silver_searcher. -5. Then, if `evil-mode' is active, use `evil-goto-definition', +Each function in `+lookup-definition-functions' is tried until one changes the +point or current buffer. -Failing all that, it will give up with an error." +Falls back to dumb-jump, naive ripgrep/the_silver_searcher text search, then +`evil-goto-definition' if evil-mode is active." (interactive (list (+lookup--symbol-or-region) current-prefix-arg)) (cond ((null identifier) @@ -114,7 +110,10 @@ Failing all that, it will give up with an error." (defun +lookup/references (identifier) "Show a list of references to the symbol at point. -Tries `xref-find-references' and falls back to rg/ag." +Tries each function in `+lookup-references-functions' until one changes the +point and/or current buffer. + +Falls back to a naive ripgrep/the_silver_searcher search otherwise." (interactive (list (+lookup--symbol-or-region))) (cond ((and +lookup-references-functions @@ -145,7 +144,7 @@ Goes down a list of possible backends: (cond ((and +lookup-documentation-functions (+lookup--jump-to :documentation identifier))) - ((and (featurep! :feature lookup +docsets) + ((and (featurep! +docsets) (or (require 'counsel-dash nil t) (require 'helm-dash nil t)) (or (bound-and-true-p counsel-dash-docsets) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index fff54e5a1..37f4df9f3 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -63,7 +63,10 @@ properties: Used by `+lookup/documentation'. :xref-backend FN Defines an xref backend for a major-mode. With this, :definition and - :references are unnecessary." + :references are unnecessary. + +Using this multiple times overwrites previous properties and unsets omitted +ones." `(progn ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) for def-name = (intern (format "doom--init-lookup-%s" mode)) From 2bbee08105b8130b2b4f1652da1d9cd290e6c5f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:22:37 +0200 Subject: [PATCH 1177/4235] feature/lookup: new command +lookup/file to replace gf --- modules/config/default/+bindings.el | 1 + modules/feature/lookup/autoload/lookup.el | 51 ++++++++++++++++++++++- modules/feature/lookup/config.el | 32 ++++++++++++-- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index b7251d7af..b88300234 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -324,6 +324,7 @@ :m "gT" #'+workspace/switch-left :m "gd" #'+lookup/definition :m "gD" #'+lookup/references + :n "gf" #'+lookup/file :n "gp" #'+evil/reselect-paste :v "gp" #'+evil/paste-preserve-register :n "gr" #'+eval:region diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 9aace7db3..b248c18d3 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -28,7 +28,8 @@ (cl-loop with origin = (point-marker) for fn in (plist-get (list :definition +lookup-definition-functions :references +lookup-references-functions - :documentation +lookup-documentation-functions) + :documentation +lookup-documentation-functions + :file +lookup-file-functions) prop) for fn = (or (command-remapping fn) fn) if (condition-case e @@ -159,6 +160,51 @@ Goes down a list of possible backends: identifier (+lookup--online-provider (not current-prefix-arg)))))) +;;;###autoload +(defun +lookup/file (path) + "Figure out PATH from whatever is at point and open it. + +Each function in `+lookup-file-functions' is tried until one changes the point +or the current buffer. + +Otherwise, falls back on `find-file-at-point'." + (interactive + (progn + (require 'ffap) + (list + (or (ffap-guesser) + (ffap-read-file-or-url + (if ffap-url-regexp "Find file or URL: " "Find file: ") + (+lookup--symbol-or-region)))))) + (require 'ffap) + (cond ((not path) + (call-interactively #'find-file-at-point)) + + ((ffap-url-p path) + (find-file-at-point path)) + + ((not (and +lookup-file-functions + (+lookup--jump-to :file path))) + (let ((fullpath (expand-file-name path))) + (when (file-equal-p fullpath buffer-file-name) + (user-error "Already here")) + (let* ((insert-default-directory t) + (project-root (doom-project-root 'nocache)) + (ffap-file-finder + (cond ((not (file-directory-p fullpath)) + #'find-file) + ((file-in-directory-p fullpath project-root) + (lambda (dir) + (let ((default-directory dir)) + (without-project-cache! + (let ((file (projectile-completing-read "Find file: " + (projectile-current-project-files) + :initial-input path))) + (find-file (expand-file-name file (projectile-project-root))) + (run-hooks 'projectile-find-file-hook)))))) + (#'doom-project-browse)))) + (find-file-at-point path)))))) + ;; ;; Source-specific commands @@ -229,4 +275,5 @@ for the provider." (after! evil (evil-set-command-property '+lookup/definition :jump t) (evil-set-command-property '+lookup/references :jump t) - (evil-set-command-property '+lookup/documentation :jump t)) + (evil-set-command-property '+lookup/documentation :jump t) + (evil-set-command-property '+lookup/file :jump t)) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 37f4df9f3..8b5b1d611 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -36,17 +36,38 @@ produces an url. Used by `+lookup/online'.") (defvar +lookup-definition-functions '(+lookup-xref-definitions) "Functions for `+lookup/definition' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current -window/point.") +window/point. + +If the argument is interactive (satisfies `commandp'), it is called with +`call-interactively' (with no arguments). Otherwise, it is called with one +argument: the identifier at point.") (defvar +lookup-references-functions '(+lookup-xref-references) "Functions for `+lookup/references' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current -window/point.") +window/point. + +If the argument is interactive (satisfies `commandp'), it is called with +`call-interactively' (with no arguments). Otherwise, it is called with one +argument: the identifier at point.") (defvar +lookup-documentation-functions () "Functions for `+lookup/documentation' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current -window/point.") +window/point. + +If the argument is interactive (satisfies `commandp'), it is called with +`call-interactively' (with no arguments). Otherwise, it is called with one +argument: the identifier at point.") + +(defvar +lookup-file-functions () + "Function for `+lookup/file' to try, before restoring to `find-file-at-point'. +Stops at the first function to return non-nil or change the current +window/point. + +If the argument is interactive (satisfies `commandp'), it is called with +`call-interactively' (with no arguments). Otherwise, it is called with one +argument: the identifier at point.") (def-setting! :lookup (modes &rest plist) "Defines a jump target for major MODES. PLIST accepts the following @@ -61,6 +82,9 @@ properties: :documentation FN Run when looking up documentation for a symbol. Used by `+lookup/documentation'. + :file FN + Run when looking up the file for a symbol/string. Typically a file path. + Used by `+lookup/file'. :xref-backend FN Defines an xref backend for a major-mode. With this, :definition and :references are unnecessary. @@ -77,10 +101,12 @@ ones." (let ((xref ,(plist-get plist :xref-backend)) (def ,(plist-get plist :definition)) (ref ,(plist-get plist :references)) + (fil ,(plist-get plist :file)) (doc ,(plist-get plist :documentation))) (if xref (add-hook 'xref-backend-functions xref nil t)) (if def (add-hook '+lookup-definition-functions def nil t)) (if ref (add-hook '+lookup-references-functions ref nil t)) + (if fil (add-hook '+lookup-file-functions fil nil t)) (if doc (add-hook '+lookup-documentation-functions doc nil t))))) collect `(add-hook! ,mode #',def-name)))) From 587d69dda00302f0991b0ff88610f166617e1ce0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:22:58 +0200 Subject: [PATCH 1178/4235] feature/evil: inline inlined function --- modules/feature/evil/config.el | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 03306e72c..b64f675a7 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -409,13 +409,9 @@ the new algorithm is confusing, like in python or ruby." (defvar +evil--mc-compat-evil-prev-state nil) (defvar +evil--mc-compat-mark-was-active nil) - (defsubst +evil--visual-or-normal-p () - "True if evil mode is enabled, and we are in normal or visual mode." - (and (bound-and-true-p evil-mode) - (not (memq evil-state '(insert emacs))))) - (defun +evil|mc-compat-switch-to-emacs-state () - (when (+evil--visual-or-normal-p) + (when (and (bound-and-true-p evil-mode) + (not (memq evil-state '(insert emacs)))) (setq +evil--mc-compat-evil-prev-state evil-state) (when (region-active-p) (setq +evil--mc-compat-mark-was-active t)) @@ -442,7 +438,8 @@ the new algorithm is confusing, like in python or ruby." ;; When running edit-lines, point will return (position + 1) as a ;; result of how evil deals with regions (defun +evil*mc/edit-lines (&rest _) - (when (+evil--visual-or-normal-p) + (when (and (bound-and-true-p evil-mode) + (not (memq evil-state '(insert emacs)))) (if (> (point) (mark)) (goto-char (1- (point))) (push-mark (1- (mark)))))) From 1b6abf47ef4669784886d1f3e9402bcbc9a3f871 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:23:25 +0200 Subject: [PATCH 1179/4235] feature/lookup: fix counsel-dash not loading; use eww for docsets --- modules/feature/lookup/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 8b5b1d611..b693f44bc 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -203,17 +203,18 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (def-package! helm-dash :commands (helm-dash helm-dash-install-docset helm-dash-at-point helm-dash-docset-installed-p helm-dash-installed-docsets) + :init + (setq helm-dash-enable-debugging doom-debug-mode + helm-dash-browser-func #'eww) :config (unless (file-directory-p helm-dash-docsets-path) (setq helm-dash-docsets-path (concat doom-etc-dir "docsets/"))) (unless (file-directory-p helm-dash-docsets-path) - (make-directory helm-dash-docsets-path t)) - (setq helm-dash-enable-debugging doom-debug-mode)) + (make-directory helm-dash-docsets-path t))) (def-package! counsel-dash :when (featurep! :completion ivy) :commands (counsel-dash counsel-dash-install-docset) - :after helm-dash :config (setq counsel-dash-min-length 2))) From cef82fe0b00bd4382708f3d2bb2e228ea93aa9cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 11 May 2018 20:23:49 +0200 Subject: [PATCH 1180/4235] Minor reorganization of core-lib --- core/core-lib.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 37b6e6c6b..9d68fa636 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -43,9 +43,13 @@ "Return EXP wrapped in a list, or as-is if already a list." (if (listp exp) exp (list exp))) +(defun doom*shut-up (orig-fn &rest args) + "Generic advisor for silencing noisy functions." + (quiet! (apply orig-fn args))) + ;; -;; Library +;; Macros ;; (defmacro λ! (&rest body) @@ -97,10 +101,6 @@ compilation." (save-silently t)) ,@forms)))) -(defun doom*shut-up (orig-fn &rest args) - "Generic advisor for silencing noisy functions." - (quiet! (apply orig-fn args))) - (defvar doom--transient-counter 0) (defmacro add-transient-hook! (hook &rest forms) "Attaches transient forms to a HOOK. From ff5d63b5a669475ca66a839338872a11dc97923f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 15:39:51 +0200 Subject: [PATCH 1181/4235] lang/javascript: add colon to electric chars --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 7fcb72803..137ed706b 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -21,7 +21,7 @@ (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :electric 'js2-mode :chars '(?\} ?\) ?.)) + (set! :electric 'js2-mode :chars '(?\} ?\) ?. ?:)) ;; Conform switch-case indentation to js2 normal indent (defvaralias 'js-switch-indent-offset 'js2-basic-offset) From 99bd3beec2ddb7635380203b41509aefdcb56819 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 20:05:16 +0200 Subject: [PATCH 1182/4235] Autoload ace-link-addr --- 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 05db0f105..e7c04bd1c 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -142,7 +142,7 @@ fundamental-mode) for performance sake." ;; (def-package! ace-link - :commands (ace-link-help ace-link-org)) + :commands (ace-link-help ace-link-org ace-link-addr)) (def-package! avy :commands (avy-goto-char-2 avy-goto-line) From a0fa6e5b9715d2c339eb6bed9d77f6d438e0feca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 22:44:41 +0200 Subject: [PATCH 1183/4235] ui/neotree: add *.class to hidden files regexp --- modules/ui/neotree/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index 999a8ea35..ea3e752dd 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -26,7 +26,7 @@ '(;; vcs folders "^\\.\\(git\\|hg\\|svn\\)$" ;; compiled files - "\\.\\(pyc\\|o\\|elc\\|lock\\|css.map\\)$" + "\\.\\(pyc\\|o\\|elc\\|lock\\|css.map\\|class\\)$" ;; generated files, caches or local pkgs "^\\(node_modules\\|vendor\\|.\\(project\\|cask\\|yardoc\\|sass-cache\\)\\)$" ;; org-mode folders From c01a1597cf17a54a76733c2fe7dcce5c62ea09cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 23:15:28 +0200 Subject: [PATCH 1184/4235] app/twitter: larger compose-tweet popup window --- modules/app/twitter/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index fab0d7ecb..8e5700dcb 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -25,7 +25,9 @@ twittering-initial-timeline-spec-string '(":home" ":mentions" ":direct_messages")) - (set! :popup "^\\*twittering-edit" nil '((transient) (quit) (select . t) (modeline . minimal))) + (set! :popup "^\\*twittering-edit" + '((size . 15)) + '((transient) (quit) (select . t))) (defface twitter-divider `((t (:underline (:color ,(doom-darken 'vertical-bar 0.2))))) From bc98f80fed9f9c61229e27d11d47f1c30ded0d6f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 23:16:06 +0200 Subject: [PATCH 1185/4235] app/twitter: redesign app keybind scheme (first draft) Thanks to @ar1a for help --- modules/app/twitter/config.el | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index 8e5700dcb..7f8dfcbbd 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -51,13 +51,27 @@ mode-line-format nil)) (map! :map twittering-mode-map + "q" #'+twitter/quit + "Q" #'+twitter/quit-all [remap twittering-kill-buffer] #'+twitter/quit - "Q" #'+twitter/quit-all - "o" #'ace-link-addr - "J" #'twittering-goto-next-status - "K" #'twittering-goto-previous-status + [remap delete-window] #'+twitter/quit + [remap +workspace/close-window-or-workspace] #'+twitter/quit (:when (featurep! :feature evil) - "j" #'evil-next-visual-line - "k" #'evil-previous-visual-line - "h" #'evil-window-left - "l" #'evil-window-right))) + [remap evil-window-delete] #'+twitter/quit + "f" #'twittering-favorite + "F" #'twittering-unfavorite + "C-f" #'twittering-follow + "C-F" #'twittering-unfollow + "d" #'twittering-delete-status + "r" #'twittering-retweet + "R" #'twittering-toggle-or-retrieve-replied-statuses + "o" #'twittering-update-status-interactive + "O" #'+twitter/ace-link + "/" #'twittering-search + "J" #'twittering-goto-next-status + "K" #'twittering-goto-previous-status + "g" nil + "gg" #'twittering-goto-first-status + "G" #'twittering-goto-last-status + "gj" #'twittering-goto-next-status-of-user + "gk" #'twittering-goto-previous-status-of-user))) From daf4c93e36337928dc270d5e50a2b64556ac0f85 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 23:17:26 +0200 Subject: [PATCH 1186/4235] lang/org: unbind [/] (interfering w/ default binds) --- modules/lang/org/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index ad59e30df..e6627b8d8 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -266,6 +266,8 @@ between the two." :n [backtab] nil :n "C-j" nil :n "C-k" nil + :n "]" nil + :n "[" nil :map evil-org-mode-map :i [backtab] #'+org/dedent From 5a13c436ff2e73a37e235f22a3ded2c55e57f112 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 23:17:48 +0200 Subject: [PATCH 1187/4235] app/twitter: add +twitter/ace-link command --- modules/app/twitter/autoload.el | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/app/twitter/autoload.el b/modules/app/twitter/autoload.el index 54267d3d9..883390363 100644 --- a/modules/app/twitter/autoload.el +++ b/modules/app/twitter/autoload.el @@ -63,3 +63,26 @@ that works with the feature/popup module." (twittering-rerender-timeline-all buf) (setq-local line-spacing 0.2) (goto-line 0 buf)))) + +;;;###autoload +(defun +twitter/ace-link () + "Open a visible link, username or hashtag in a `twittering-mode' buffer." + (interactive) + (let ((pt (avy-with +twitter/ace-link + (avy--process + (+twitter--collect-links) + (avy--style-fn avy-style))))) + (when (number-or-marker-p pt) + (goto-char pt) + (let ((uri (get-text-property (point) 'uri))) + (if uri (browse-url uri)))))) + +(defun +twitter--collect-links () + (let ((end (window-end)) + points) + (save-excursion + (goto-char (window-start)) + (while (and (< (point) end) + (ignore-errors (twittering-goto-next-thing) t)) + (push (point) points)) + (nreverse points)))) From 370dacf2a2440c86ba8e75b1ad50e20ef2f5085a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 12 May 2018 23:19:20 +0200 Subject: [PATCH 1188/4235] config/default: refactor evil-collection fixes --- modules/config/default/+bindings.el | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index b88300234..a7a309852 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -745,22 +745,13 @@ ;; (when (featurep 'evil-collection) - ;; don't interfere with leader key - (evil-define-key* '(normal visual) special-mode-map (kbd doom-leader-key) nil) - (after! dired - (evil-define-key* 'normal dired-mode-map (kbd doom-leader-key) nil)) - - ;; don't remap gd or K; Doom does this already - ;; TODO find a better way - (after! compile - (evil-define-key* '(normal visual) compilation-mode-map "gd" nil "K" nil)) - (after! racer - (evil-define-key* 'normal racer-mode-map "gd" nil "K" nil)) - (after! anaconda-mode - (evil-define-key* 'normal anaconda-mode-map "gd" nil "K" nil)) - (after! alchemist - (evil-define-key* 'normal alchemist-mode-map "gd" nil "K" nil "gz" nil)) - (after! go-mode - (evil-define-key* 'normal go-mode-map "gd" nil "K" nil)) - (after! lua-mode - (evil-define-key* 'normal lua-mode-map "K" nil))) + (defun +config|deal-with-evil-collections-bs (feature keymaps) + "Unmap keys that conflict with Doom's defaults." + (dolist (map keymaps) + (evil-define-key '(normal visual motion) map + doom-leader-key nil + "C-j" nil "C-k" nil + "gd" nil "gf" nil + "K" nil + "]" nil "[" nil))) + (add-hook 'evil-collection-setup-hook #'+config|deal-with-evil-collections-bs)) From 88082c0dc913ff9e2d185e6a39eff92ff4c3658f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 13 May 2018 17:04:15 +0200 Subject: [PATCH 1189/4235] Add doom//reload command (experimental) --- core/core-packages.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/core-packages.el b/core/core-packages.el index 6f1ec4f51..d2fe533f1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -607,6 +607,12 @@ loads MODULE SUBMODULE's packages.el file." ;; Commands ;; +(defun doom//reload () + "Reload your Doom config." + (interactive) + (load (concat doom-emacs-dir "init.el") nil nil 'nosuffix) + (doom//reload-load-path)) + (defun doom-packages--read-if-cookies (file) "Returns the value of the ;;;###if predicate form in FILE." (with-temp-buffer From e3841c446058bee59f3638f2a8d3f1e9ef3c3439 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 13 May 2018 17:11:20 +0200 Subject: [PATCH 1190/4235] Add placement checks for package macros Doom should complain if these macros are found anywhere they're not supposed to be. --- core/core-packages.el | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/core-packages.el b/core/core-packages.el index d2fe533f1..214e68a49 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -525,6 +525,16 @@ omitted. eg. (featurep! +flag1)" ;; Module package macros ;; +(defun doom--assert-file-p (file-name macro) + (cl-assert (string= (file-name-nondirectory load-file-name) file-name) + nil + "Found %s call in non-%s file (%s)" + macro + file-name + (if (file-in-directory-p load-file-name doom-emacs-dir) + (file-relative-name load-file-name doom-emacs-dir) + (abbreviate-file-name load-file-name)))) + (defmacro package! (name &rest plist) "Declares a package and how to install it (if applicable). @@ -550,6 +560,7 @@ Accepts the following properties: :freeze FORM Do not update this package if FORM is non-nil." (declare (indent defun)) + (doom--assert-file-p "packages.el" #'package!) (cond ((memq name doom-disabled-packages) nil) ((let ((disable (plist-get plist :disable))) (and disable (eval disable))) @@ -580,6 +591,7 @@ Accepts the following properties: packages at once. Only use this macro in a module's packages.el file." + (doom--assert-file-p "packages.el" #'packages!) `(progn ,@(cl-loop for desc in packages collect `(package! ,@desc)))) (defmacro disable-packages! (&rest packages) @@ -587,6 +599,7 @@ Only use this macro in a module's packages.el file." packages at once. Only use this macro in a module's packages.el file." + (doom--assert-file-p "packages.el" #'disable-packages!) `(setq doom-disabled-packages (append ',packages doom-disabled-packages))) (defmacro depends-on! (module submodule &optional flags) @@ -596,6 +609,7 @@ Only use this macro in a module's packages.el file. MODULE is a keyword, and SUBMODULE is a symbol. Under the hood, this simply loads MODULE SUBMODULE's packages.el file." + (doom--assert-file-p "packages.el" #'depends-on!) `(let ((doom-modules ,doom-modules) (flags ,flags)) (when flags From afdc6a31b52e6ead448c796e37fc63870b9ca7b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 13 May 2018 17:27:38 +0200 Subject: [PATCH 1191/4235] Move def-setting! macros to core-packages --- core/core-lib.el | 38 -------------------------------------- core/core-packages.el | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 38 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 9d68fa636..305aeeb13 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -229,43 +229,5 @@ Body forms can access the hook's arguments through the let-bound variable (t (user-error "associate! invalid rules for mode [%s] (modes %s) (match %s) (files %s)" mode modes match files)))))) - -;; I needed a way to reliably cross-configure modules without worrying about -;; whether they were enabled or not, so I wrote `set!'. If a setting doesn't -;; exist at runtime, the `set!' call is ignored and its arguments are left -;; unevaluated (and entirely omitted when byte-compiled). -(defvar doom-settings nil) - -(defmacro def-setting! (keyword arglist &optional docstring &rest forms) - "Define a setting. Like `defmacro', this should return a form to be executed -when called with `set!'. FORMS are not evaluated until `set!' calls it. - -See `doom/describe-setting' for a list of available settings. - -Do not use this for configuring Doom core." - (declare (indent defun) (doc-string 3)) - (unless (keywordp keyword) - (error "Not a valid property name: %s" keyword)) - (let ((fn (intern (format "doom--set%s" keyword)))) - `(progn - (defun ,fn ,arglist - ,docstring - ,@forms) - (cl-pushnew ',(cons keyword fn) doom-settings :test #'eq :key #'car)))) - -(defmacro set! (keyword &rest values) - "Set an option defined by `def-setting!'. Skip if doesn't exist. See -`doom/describe-setting' for a list of available settings. - -VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." - (declare (indent defun)) - (unless values - (error "Empty set! for %s" keyword)) - (if-let* ((fn (cdr (assq keyword doom-settings)))) - (apply fn values) - (when doom-debug-mode - (message "No setting found for %s" keyword) - nil))) - (provide 'core-lib) ;;; core-lib.el ends here diff --git a/core/core-packages.el b/core/core-packages.el index 214e68a49..c675c18b3 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -932,5 +932,47 @@ compiled packages.'" (advice-add #'package-autoremove :override #'doom//packages-autoremove) (advice-add #'package-install-selected-packages :override #'doom//packages-install) + +;; +;; Cross-module configuration +;; + +;; I needed a way to reliably cross-configure modules without worrying about +;; whether they were enabled or not, so I wrote `set!'. If a setting doesn't +;; exist at runtime, the `set!' call is ignored and its arguments are left +;; unevaluated (and entirely omitted when byte-compiled). +(defvar doom-settings nil) + +(defmacro def-setting! (keyword arglist &optional docstring &rest forms) + "Define a setting. Like `defmacro', this should return a form to be executed +when called with `set!'. FORMS are not evaluated until `set!' calls it. + +See `doom/describe-setting' for a list of available settings. + +Do not use this for configuring Doom core." + (declare (indent defun) (doc-string 3)) + (unless (keywordp keyword) + (error "Not a valid property name: %s" keyword)) + (let ((fn (intern (format "doom--set%s" keyword)))) + `(progn + (defun ,fn ,arglist + ,docstring + ,@forms) + (cl-pushnew ',(cons keyword fn) doom-settings :test #'eq :key #'car)))) + +(defmacro set! (keyword &rest values) + "Set an option defined by `def-setting!'. Skip if doesn't exist. See +`doom/describe-setting' for a list of available settings. + +VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." + (declare (indent defun)) + (unless values + (error "Empty set! for %s" keyword)) + (if-let* ((fn (cdr (assq keyword doom-settings)))) + (apply fn values) + (when doom-debug-mode + (message "No setting found for %s" keyword) + nil))) + (provide 'core-packages) ;;; core-packages.el ends here From d1068723e40d47887f03c2cee5f438e4569968bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 13 May 2018 17:27:59 +0200 Subject: [PATCH 1192/4235] Move doom-packages-file to doom-cache-dir --- 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 c675c18b3..8f4df74c7 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -82,8 +82,9 @@ missing) and shouldn't be deleted.") (defvar doom-autoload-file (concat doom-local-dir "autoloads.el") "Where `doom//reload-autoloads' will generate its autoloads file.") -(defvar doom-packages-file (concat doom-local-dir "packages.el") - "Where to cache `load-path' and `Info-directory-list'.") +(defvar doom-packages-file (concat doom-cache-dir "packages.el") + "Where to cache `load-path', `Info-directory-list', `doom-disabled-packages' +and `auto-mode-alist'.") (defvar doom--current-module nil) (defvar doom--init-cache-p nil) From 0bd88b8414156809ce43c819bbaaa085f8de95fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 13 May 2018 23:16:06 +0200 Subject: [PATCH 1193/4235] Add restart-emacs package & commands --- core/core-packages.el | 2 +- core/core-ui.el | 4 ++++ core/packages.el | 1 + modules/feature/workspaces/autoload/workspaces.el | 6 ++++++ modules/feature/workspaces/config.el | 10 ++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 8f4df74c7..95ad87a96 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -623,7 +623,7 @@ loads MODULE SUBMODULE's packages.el file." ;; (defun doom//reload () - "Reload your Doom config." + "Reload your Doom config. Experimental!" (interactive) (load (concat doom-emacs-dir "init.el") nil nil 'nosuffix) (doom//reload-load-path)) diff --git a/core/core-ui.el b/core/core-ui.el index 779a5c674..c6703e885 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -250,6 +250,10 @@ DEFAULT is non-nil, set the default mode-line for all buffers." :hook (lisp-mode . rainbow-delimiters-mode) :config (setq rainbow-delimiters-max-face-count 3)) +(def-package! restart-emacs + :commands restart-emacs + :config (setq restart-emacs--args (list "--restore"))) + ;; For a distractions-free-like UI, that dynamically resizes margins and can ;; center a buffer. (def-package! visual-fill-column diff --git a/core/packages.el b/core/packages.el index 21a696855..904616767 100644 --- a/core/packages.el +++ b/core/packages.el @@ -16,6 +16,7 @@ (package! nlinum-relative)) (package! rainbow-delimiters) (package! visual-fill-column) +(package! restart-emacs) ;; core-editor.el (package! ace-link) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 31fe8f3b0..b014d5588 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -425,6 +425,12 @@ the next." (t (+workspace-error "Can't delete last workspace" t))))))) +;;;###autoload +(defun +workspace/restart-emacs-then-restore () + "Restarts Emacs, then restores the session." + (interactive) + (restart-emacs (list "--restore"))) + ;; ;; Tabs display in minibuffer diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 3feb9c6d5..fd8df7a29 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -26,6 +26,10 @@ new project directory.") "The basename of the file to store single workspace perspectives. Will be stored in `persp-save-dir'.") +(defun +workspaces-restore-last-session (&rest _) + (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) +(map-put command-switch-alist '"--restore" #'+workspaces-restore-last-session) + ;; ;; Plugins @@ -105,7 +109,13 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) + (defun +workspaces|leave-nil-perspective (&rest _) + (when (string= (+workspace-current-name) persp-nil-name) + (persp-frame-switch +workspaces-main))) + (add-hook 'persp-after-load-state-functions #'+workspaces|leave-nil-perspective) + ;; Modify `delete-window' to close the workspace if used on the last window + (define-key persp-mode-map [remap restart-emacs] #'+workspace/restart-emacs-then-restore) (define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace) (define-key persp-mode-map [remap evil-delete-window] #'+workspace/close-window-or-workspace) ;; only auto-save when real buffers are present From 72465fd5a0c6526a90e74755d5df9df60375d0af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 13 May 2018 23:17:19 +0200 Subject: [PATCH 1194/4235] config/default: bind SPC q r/R to reload/restart Doom --- modules/config/default/+bindings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a7a309852..4d0e3a9d4 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -282,7 +282,9 @@ (:desc "quit" :prefix "q" :desc "Save and quit" :n "q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit) + :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit + :desc "Reload Doom Emacs" :n "r" #'doom//reload + :desc "Restart Doom Emacs" :n "R" #'restart-emacs) (:when (featurep! :tools upload) (:desc "remote" :prefix "r" From 0b8f884d1841b318c6d1af5e67ed6ecee301497d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 00:17:49 +0200 Subject: [PATCH 1195/4235] ui/doom: simplify +doom-folded-face (now set in doom-themes) --- modules/ui/doom/config.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 053ed049f..3f8561302 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -62,11 +62,7 @@ (after! hideshow - (defface +doom-folded-face - `((((background dark)) - (:inherit font-lock-comment-face :background ,(doom-color 'base0) :weight light)) - (((background light)) - (:inherit font-lock-comment-face :background ,(doom-color 'base3) :weight light))) + (defface +doom-folded-face `((t (:inherit font-lock-comment-face :weight light))) "Face to hightlight `hideshow' overlays." :group 'doom-themes) From 4603a4e113bfb8480b9d1a904989cb563fc96803 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 00:30:00 +0200 Subject: [PATCH 1196/4235] Change doom-theme on load-theme --- 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 c6703e885..d205c92cc 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -357,7 +357,8 @@ from the default." (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) (advice-add #'display-buffer :around #'doom*switch-buffer-hooks) -(defun doom*load-theme-hooks (&rest _) +(defun doom*load-theme-hooks (theme &rest _) + (setq doom-theme theme) (run-hook-with-args 'doom-load-theme-hook)) (advice-add #'load-theme :after #'doom*load-theme-hooks) From eb5fd0aa53ad125d5e813545b6a8c65fe34f569b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 00:30:30 +0200 Subject: [PATCH 1197/4235] run-hook-with-args => run-hooks, in custom hooks --- core/core-ui.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index d205c92cc..9b267e203 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -336,21 +336,21 @@ from the default." (defun doom*switch-frame-hooks (orig-fn frame &optional norecord) (if (eq frame (selected-frame)) (funcall orig-fn frame norecord) - (run-hook-with-args 'doom-before-switch-frame-hook) + (run-hooks 'doom-before-switch-frame-hook) (prog1 (funcall orig-fn frame norecord) - (run-hook-with-args 'doom-after-switch-frame-hook)))) + (run-hooks 'doom-after-switch-frame-hook)))) (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or (eq window (selected-window)) (window-minibuffer-p) (window-minibuffer-p window)) (funcall orig-fn window norecord) - (run-hook-with-args 'doom-before-switch-window-hook) + (run-hooks 'doom-before-switch-window-hook) (prog1 (funcall orig-fn window norecord) - (run-hook-with-args 'doom-after-switch-window-hook)))) + (run-hooks 'doom-after-switch-window-hook)))) (defun doom*switch-buffer-hooks (orig-fn &rest args) - (run-hook-with-args 'doom-before-switch-buffer-hook) + (run-hooks 'doom-before-switch-buffer-hook) (prog1 (apply orig-fn args) - (run-hook-with-args 'doom-after-switch-buffer-hook))) + (run-hooks 'doom-after-switch-buffer-hook))) (advice-add #'select-frame :around #'doom*switch-frame-hooks) (advice-add #'select-window :around #'doom*switch-window-hooks) @@ -359,7 +359,7 @@ from the default." (defun doom*load-theme-hooks (theme &rest _) (setq doom-theme theme) - (run-hook-with-args 'doom-load-theme-hook)) + (run-hooks 'doom-load-theme-hook)) (advice-add #'load-theme :after #'doom*load-theme-hooks) From 40bd1da5a5615d366c42e6561a77f039af43591a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 01:19:54 +0200 Subject: [PATCH 1198/4235] completion/helm: avoid with-helm-buffer macro #503 #507 --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 092932939..44823b3f6 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -62,7 +62,7 @@ (defun +helm*hide-minibuffer-maybe () "Hide minibuffer in Helm session if we use the header line as input field." - (when (with-helm-buffer helm-echo-input-in-header-line) + (when (with-current-buffer (helm-buffer-get) helm-echo-input-in-header-line) (let ((ov (make-overlay (point-min) (point-max) nil nil t))) (overlay-put ov 'window (selected-window)) (overlay-put ov 'face From 83118dc65c45f54cadeabc7be54be83da832952e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 01:20:53 +0200 Subject: [PATCH 1199/4235] Move feature/popup => ui/popup And move settings to ui/popup/init.el --- init.example.el | 6 +-- modules/{feature => ui}/popup/+hacks.el | 2 +- modules/{feature => ui}/popup/README.org | 0 modules/{feature => ui}/popup/autoload.el | 31 +----------- modules/{feature => ui}/popup/config.el | 35 +------------ modules/ui/popup/init.el | 61 +++++++++++++++++++++++ 6 files changed, 68 insertions(+), 67 deletions(-) rename modules/{feature => ui}/popup/+hacks.el (99%) rename modules/{feature => ui}/popup/README.org (100%) rename modules/{feature => ui}/popup/autoload.el (95%) rename modules/{feature => ui}/popup/config.el (81%) create mode 100644 modules/ui/popup/init.el diff --git a/init.example.el b/init.example.el index 52f037831..1de3bf544 100644 --- a/init.example.el +++ b/init.example.el @@ -2,9 +2,6 @@ ;; Copy me to ~/.doom.d/init.el or ~/.config/doom/init.el, then edit me! (doom! :feature - (popup ; tame sudden yet inevitable temporary windows - +all ; catch all popups that start with an asterix - +defaults) ; default popup rules ;debugger ; FIXME stepping through code, to help you add bugs eval ; run code, run (also, repls) (evil +everywhere); come to the dark side, we have cookies @@ -30,6 +27,9 @@ +childframe) ; uses childframes for popups (Emacs 26+ only) :ui + (popup ; tame sudden yet inevitable temporary windows + +all ; catch all popups that start with an asterix + +defaults) ; default popup rules doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs doom-modeline ; a snazzy Atom-inspired mode-line diff --git a/modules/feature/popup/+hacks.el b/modules/ui/popup/+hacks.el similarity index 99% rename from modules/feature/popup/+hacks.el rename to modules/ui/popup/+hacks.el index 9132fbc44..34ff826be 100644 --- a/modules/feature/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -1,4 +1,4 @@ -;;; feature/popup/+hacks.el -*- lexical-binding: t; -*- +;;; ui/popup/+hacks.el -*- lexical-binding: t; -*- ;; What follows are all the hacks needed to get various parts of Emacs and other ;; plugins to cooperate with the popup management system. Essentially, it comes diff --git a/modules/feature/popup/README.org b/modules/ui/popup/README.org similarity index 100% rename from modules/feature/popup/README.org rename to modules/ui/popup/README.org diff --git a/modules/feature/popup/autoload.el b/modules/ui/popup/autoload.el similarity index 95% rename from modules/feature/popup/autoload.el rename to modules/ui/popup/autoload.el index 7ad2d2177..8b33d7d91 100644 --- a/modules/feature/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -1,9 +1,8 @@ -;;; feature/popup/autoload.el -*- lexical-binding: t; -*- +;;; ui/popup/autoload.el -*- lexical-binding: t; -*- (defvar +popup--populate-wparams (not EMACS26+)) (defvar +popup--inhibit-transient nil) (defvar +popup--inhibit-select nil) -(defvar +popup--display-buffer-alist nil) (defvar +popup--old-display-buffer-alist nil) (defvar +popup--remember-last t) (defvar +popup--last nil) @@ -183,34 +182,6 @@ Uses `shrink-window-if-larger-than-buffer'." (unless (= (- (point-max) (point-min)) 0) (shrink-window-if-larger-than-buffer window))) -;;;###autoload -(defun +popup-define (condition &optional alist parameters) - "Define a popup rule. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. - -If CONDITION is met, the buffer will be displayed in a popup window with ALIST -and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may -contain and `+popup-window-parameters' for what window parameters that the popup -module supports. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -If certain attributes/parameters are omitted, the ones from -`+popup-default-alist' and `+popup-default-parameters' will be used." - (declare (indent 1)) - (push (if (eq alist :ignore) - (list condition nil) - `(,condition - (+popup-buffer) - ,@alist - (window-parameters ,@parameters))) - +popup--display-buffer-alist)) - ;; ;; Minor mode diff --git a/modules/feature/popup/config.el b/modules/ui/popup/config.el similarity index 81% rename from modules/feature/popup/config.el rename to modules/ui/popup/config.el index 2c2940563..62c201748 100644 --- a/modules/feature/popup/config.el +++ b/modules/ui/popup/config.el @@ -1,9 +1,9 @@ -;;; feature/popup/config.el -*- lexical-binding: t; -*- +;;; ui/popup/config.el -*- lexical-binding: t; -*- (defconst +popup-window-parameters '(transient quit select modeline popup) "A list of custom parameters to be added to `window-persistent-parameters'. -Modifying this has no effect, unless done before feature/popup loads. +Modifying this has no effect, unless done before ui/popup loads. (transient . CDR) CDR can be t, an integer, nil or a function that returns one of these. It @@ -85,37 +85,6 @@ a brief description of some native window parameters that Emacs uses: "The default time-to-live for transient buffers whose popup buffers have been deleted.") -;; -(def-setting! :popup (condition &optional alist parameters) - "Register a popup rule. - -CONDITION can be a regexp string or a function. See `display-buffer' for a list -of possible entries for ALIST, which tells the display system how to initialize -the popup window. PARAMETERS is an alist of window parameters. See -`+popup-window-parameters' for a list of custom parameters provided by the popup -module. - -ALIST supports one custom parameter: `size', which will resolve to -`window-height' or `window-width' depending on `side'." - `(progn - (+popup-define ,condition ,alist ,parameters) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) - -(def-setting! :popups (&rest rules) - "Register multiple popup rules with :popup setting (`doom--set:popup'). For -example: - - (set! :popups - (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" - `(progn - ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) - ;; ;; Default popup rules & bootstrap diff --git a/modules/ui/popup/init.el b/modules/ui/popup/init.el new file mode 100644 index 000000000..8b6b99f16 --- /dev/null +++ b/modules/ui/popup/init.el @@ -0,0 +1,61 @@ +;;; ui/popup/init.el -*- lexical-binding: t; -*- + +(defvar +popup--display-buffer-alist nil) + +(defun +popup-define (condition &optional alist parameters) + "Define a popup rule. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +If CONDITION is met, the buffer will be displayed in a popup window with ALIST +and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may +contain and `+popup-window-parameters' for what window parameters that the popup +module supports. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +If certain attributes/parameters are omitted, the ones from +`+popup-default-alist' and `+popup-default-parameters' will be used." + (declare (indent 1)) + (push (if (eq alist :ignore) + (list condition nil) + `(,condition + (+popup-buffer) + ,@alist + (window-parameters ,@parameters))) + +popup--display-buffer-alist)) + +;; +(def-setting! :popup (condition &optional alist parameters) + "Register a popup rule. + +CONDITION can be a regexp string or a function. See `display-buffer' for a list +of possible entries for ALIST, which tells the display system how to initialize +the popup window. PARAMETERS is an alist of window parameters. See +`+popup-window-parameters' for a list of custom parameters provided by the popup +module. + +ALIST supports one custom parameter: `size', which will resolve to +`window-height' or `window-width' depending on `side'." + `(progn + (+popup-define ,condition ,alist ,parameters) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) + +(def-setting! :popups (&rest rules) + "Register multiple popup rules with :popup setting (`doom--set:popup'). For +example: + + (set! :popups + (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" + `(progn + ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) From 866030bdc6664fcd39fb50bbe5e9c8839c113f73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 01:22:33 +0200 Subject: [PATCH 1200/4235] feature/eval: reorganize; move settings into init.el --- modules/feature/eval/autoload/repl.el | 3 ++ modules/feature/eval/config.el | 52 ++------------------------- modules/feature/eval/init.el | 50 ++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 49 deletions(-) create mode 100644 modules/feature/eval/init.el diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 687af1503..65cb3a63d 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -3,6 +3,9 @@ (defvar +eval-repl-buffer nil "The buffer of the last open repl.") +(define-minor-mode +eval-repl-mode + "A minor mode for REPL buffers.") + (defun +eval--ensure-in-repl-buffer (&optional command same-window-p) (cond ((eq (current-buffer) +eval-repl-buffer)) ((and +eval-repl-buffer diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 3bf95ebf3..72b086d15 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -1,59 +1,13 @@ ;;; feature/eval/config.el -*- lexical-binding: t; -*- -;; -;; REPLs -;; - -(defvar +eval-repls nil - "An alist mapping major modes to plists that describe REPLs. Used by -`+eval/open-repl' and filled with the `:repl' setting.") - -(define-minor-mode +eval-repl-mode - "A minor mode for REPL buffers.") - -(def-setting! :repl (mode command) - "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a -function that creates and returns the REPL buffer." - `(push (cons ,mode ,command) +eval-repls)) - - -;; -;; Evaluation -;; - ;; remove ellipsis when printing sexps in message buffer (setq eval-expression-print-length nil eval-expression-print-level nil) -(defvar +eval-runners nil - "Alist mapping major modes to interactive runner functions.") -(def-setting! :eval (mode command) - "Define a code evaluator for major mode MODE with `quickrun'. - -1. If MODE is a string and COMMAND is the string, MODE is a file regexp and - COMMAND is a string key for an entry in `quickrun-file-alist'. -2. If MODE is not a string and COMMAND is a string, MODE is a major-mode symbol - and COMMAND is a key (for `quickrun--language-alist'), and will be registered - in `quickrun--major-mode-alist'. -3. If MODE is not a string and COMMAND is an alist, see `quickrun-add-command': - (quickrun-add-command MODE COMMAND :mode MODE). -4. If MODE is not a string and COMMANd is a symbol, add it to - `+eval-runners', which is used by `+eval/region'." - (let ((command (doom-unquote command))) - (cond ((symbolp command) - `(push (cons ,mode ',command) +eval-runners)) - ((stringp command) - `(after! quickrun - (push (cons ,mode ',command) - ,(if (stringp mode) - 'quickrun-file-alist - 'quickrun--major-mode-alist)))) - ((listp command) - `(after! quickrun - (quickrun-add-command - ,(symbol-name (doom-unquote mode)) - ',command :mode ,mode)))))) +;; +;; Plugin(s) +;; (def-package! quickrun :commands (quickrun diff --git a/modules/feature/eval/init.el b/modules/feature/eval/init.el new file mode 100644 index 000000000..291df33d4 --- /dev/null +++ b/modules/feature/eval/init.el @@ -0,0 +1,50 @@ +;;; feature/eval/init.el -*- lexical-binding: t; -*- + +;; +;; REPLs +;; + +(defvar +eval-repls nil + "An alist mapping major modes to plists that describe REPLs. Used by +`+eval/open-repl' and filled with the `:repl' setting.") + +(def-setting! :repl (mode command) + "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a +function that creates and returns the REPL buffer." + `(push (cons ,mode ,command) +eval-repls)) + + +;; +;; Evaluation +;; + + +(defvar +eval-runners nil + "Alist mapping major modes to interactive runner functions.") + +(def-setting! :eval (mode command) + "Define a code evaluator for major mode MODE with `quickrun'. + +1. If MODE is a string and COMMAND is the string, MODE is a file regexp and + COMMAND is a string key for an entry in `quickrun-file-alist'. +2. If MODE is not a string and COMMAND is a string, MODE is a major-mode symbol + and COMMAND is a key (for `quickrun--language-alist'), and will be registered + in `quickrun--major-mode-alist'. +3. If MODE is not a string and COMMAND is an alist, see `quickrun-add-command': + (quickrun-add-command MODE COMMAND :mode MODE). +4. If MODE is not a string and COMMANd is a symbol, add it to + `+eval-runners', which is used by `+eval/region'." + (let ((command (doom-unquote command))) + (cond ((symbolp command) + `(push (cons ,mode ',command) +eval-runners)) + ((stringp command) + `(after! quickrun + (push (cons ,mode ',command) + ,(if (stringp mode) + 'quickrun-file-alist + 'quickrun--major-mode-alist)))) + ((listp command) + `(after! quickrun + (quickrun-add-command + ,(symbol-name (doom-unquote mode)) + ',command :mode ,mode)))))) From a1b385a23d1f7faedbedde7b6aa582f2462dcbfc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 13:05:33 +0200 Subject: [PATCH 1201/4235] eval-when-compile EMACS2*+ consts --- core/core.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 279391fa2..c581e23b6 100644 --- a/core/core.el +++ b/core/core.el @@ -7,6 +7,11 @@ "If non-nil, all doom functions will be verbose. Set DEBUG=1 in the command line or use --debug-init to enable this.") +(defconst EMACS26+ + (eval-when-compile (not (version< emacs-version "26")))) +(defconst EMACS27+ + (eval-when-compile (not (version< emacs-version "27")))) + ;; (defvar doom-emacs-dir (eval-when-compile (file-truename user-emacs-directory)) @@ -47,9 +52,6 @@ Use this for files that change often, like cache files.") "Where your private customizations are placed. Must end in a slash. Respects XDG directory conventions if ~/.config/doom exists.") -(defconst EMACS26+ (not (version< emacs-version "26"))) -(defconst EMACS27+ (not (version< emacs-version "27"))) - ;;; ;; UTF-8 as the default coding system From 310d81ab4a5943c084b3a4c6b128ad1f819a88aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 14:57:24 +0200 Subject: [PATCH 1202/4235] config/default: in ivy, bind C-RET = ivy-immediate-done --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4d0e3a9d4..3359cd7eb 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -574,6 +574,7 @@ (:after ivy :map ivy-minibuffer-map [escape] #'keyboard-escape-quit + [C-return] #'ivy-immediate-done "C-SPC" #'ivy-call-and-recenter "M-z" #'undo "M-v" #'yank From f2eedb44dcb018f774231a4758533cc37bc699c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 15:57:54 +0200 Subject: [PATCH 1203/4235] Remove https from package-archives dynamically --- core/core-packages.el | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 95ad87a96..54a8f8547 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -92,18 +92,15 @@ and `auto-mode-alist'.") (defvar doom--refreshed-p nil) (defvar generated-autoload-load-name) +;; (setq autoload-compute-prefixes nil package--init-file-ensured t package-user-dir (expand-file-name "elpa" doom-packages-dir) package-enable-at-startup nil package-archives - (if (getenv "INSECURE") - '(("gnu" . "http://elpa.gnu.org/packages/") - ("melpa" . "http://melpa.org/packages/") - ("org" . "http://orgmode.org/elpa/")) - '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "https://orgmode.org/elpa/"))) + '(("gnu" . "https://elpa.gnu.org/packages/") + ("melpa" . "https://melpa.org/packages/") + ("org" . "https://orgmode.org/elpa/")) ;; I omit Marmalade because its packages are manually submitted rather ;; than pulled, so packages are often out of date with upstream. @@ -130,6 +127,16 @@ and `auto-mode-alist'.") byte-compile-verbose doom-debug-mode byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local)) +;; accommodate INSECURE setting +(unless gnutls-verify-error + (dolist (archive package-archives) + (setcdr archive (replace-regexp-in-string "^https://" "http://" (cdr archive) t nil)))) + + +;; +;; Startup benchmark +;; + (defun doom-packages--benchmark () (format "Doom loaded %s packages across %d modules in %.03fs" ;; Certainly imprecise, especially where custom additions to From e3e0cb7e681ef12b536f6fb28f662f9e02033de2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 18:32:26 +0200 Subject: [PATCH 1204/4235] doom/describe-modules: no initial input, instead set default --- core/autoload/help.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 4e61a056b..d5e690a26 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -92,7 +92,7 @@ in, or d) the module associated with the current major mode (see (list (completing-read "Describe module: " (cl-loop for (module . sub) in (reverse (hash-table-keys doom-modules)) collect (format "%s %s" module sub)) - nil t module)))) + nil t nil nil module)))) (cl-destructuring-bind (category submodule) (mapcar #'intern (split-string module " ")) (unless (doom-module-p category submodule) From 966f7c77f9880bad9f3bfa78f2db6a667f6664ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 18:34:18 +0200 Subject: [PATCH 1205/4235] app/twitter: :feature popup => :ui popup --- modules/app/twitter/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index 7f8dfcbbd..f5bd6854f 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -35,7 +35,7 @@ :group 'twittering-mode) (add-hook 'doom-real-buffer-functions #'+twitter-buffer-p) - (when (featurep! :feature popup) + (when (featurep! :ui popup) (setq twittering-pop-to-buffer-function #'+twitter-display-buffer)) (after! solaire-mode From bb4a8e98e68e5e3832a8b797a31c25f98e96208f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 18:34:34 +0200 Subject: [PATCH 1206/4235] load-prefer-newer = noninteractive --- core/core.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core.el b/core/core.el index c581e23b6..0b7dc3c40 100644 --- a/core/core.el +++ b/core/core.el @@ -68,6 +68,7 @@ XDG directory conventions if ~/.config/doom exists.") ad-redefinition-action 'accept ; silence advised function warnings apropos-do-all t ; make `apropos' more useful debug-on-error (and (not noninteractive) doom-debug-mode) + load-prefer-newer noninteractive ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often ;; keep the point out of the minibuffer From bec79a3d4cb47335dd5dcb768951fd60d840b30d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 18:40:35 +0200 Subject: [PATCH 1207/4235] Major refactor of Doom bootstrap process + New `input` and `buffer` support for :defer in def-package! can now defer packages until the first command invoked after startup or first interactive buffer switch, respectively + Exploit these new :defer techniques to lazy-load many core packages, netting Doom a 20-30% decrease in startup time + Various userland macros (like package!, def-package-hook!, packages!, and disable-packages!) will now throw an error if used incorrectly (i.e. outside of their intended files; e.g. package! should be used in packages.el files) + Removed support for multiple/nested doom! calls. There should only be THE ONE in ~/.doom.d/init.el (or ~/.config/doom/init.el) + Fix an issue where load-path and auto-mode-list modifications would not persist because doom-packages-file was cached too late. + Added package-activated-list to cached variables in doom-packages-file, thus we no longer need custom-file. + Load Doom core files from doom-initialize. Now doom-initialize can be called from state-dependent non-interactive functions, instead of reloading core/core.el, which was clumsy + Removed the doom-post-init-hook hook. There was no reason for it to exist when doom-init-hook can simply be appended to --- core/core-editor.el | 67 ++++++---- core/core-keybinds.el | 1 + core/core-packages.el | 294 ++++++++++++++++++++++++------------------ core/core-projects.el | 2 +- core/core-ui.el | 28 ++-- core/core.el | 105 +++++---------- 6 files changed, 268 insertions(+), 229 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index e7c04bd1c..cb12e8514 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -59,37 +59,48 @@ fundamental-mode) for performance sake." (fundamental-mode)))) (add-hook 'find-file-hook #'doom|check-large-file) -(push '("/LICENSE$" . text-mode) auto-mode-alist) - ;; ;; Built-in plugins ;; +(electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. + (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) ;; revert buffers for changed files -(global-auto-revert-mode 1) -(setq auto-revert-verbose nil) +(def-package! autorevert + :defer buffer + :config + (setq auto-revert-verbose nil) + (global-auto-revert-mode +1)) -;; enabled by default in Emacs 25+. No thanks. -(electric-indent-mode -1) +;; persist variables across sessions +(def-package! savehist + :defer (input . 1) + :config + (setq savehist-file (concat doom-cache-dir "savehist") + savehist-save-minibuffer-history t + savehist-autosave-interval nil ; save on kill only + savehist-additional-variables '(kill-ring search-ring regexp-search-ring)) + (savehist-mode +1)) -;; savehist / saveplace -(setq savehist-file (concat doom-cache-dir "savehist") - savehist-save-minibuffer-history t - savehist-autosave-interval nil ; save on kill only - savehist-additional-variables '(kill-ring search-ring regexp-search-ring) - save-place-file (concat doom-cache-dir "saveplace")) -(add-hook! 'doom-init-hook #'(savehist-mode save-place-mode)) -(defun doom*recenter-on-load-saveplace (&rest _) - "Recenter on cursor when loading a saved place." - (if buffer-file-name (ignore-errors (recenter)))) -(advice-add #'save-place-find-file-hook :after-while #'doom*recenter-on-load-saveplace) +;; persistent point location in buffers +(def-package! saveplace + :defer buffer + :config + (setq save-place-file (concat doom-cache-dir "saveplace")) + (defun doom*recenter-on-load-saveplace (&rest _) + "Recenter on cursor when loading a saved place." + (if buffer-file-name (ignore-errors (recenter)))) + (advice-add #'save-place-find-file-hook + :after-while #'doom*recenter-on-load-saveplace) + (save-place-mode +1)) ;; Keep track of recently opened files (def-package! recentf - :hook (doom-init . recentf-mode) + :defer (input . 1) + :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") recentf-auto-cleanup 60 @@ -101,7 +112,15 @@ fundamental-mode) for performance sake." "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) - (concat "^" (file-truename doom-local-dir))))) + (concat "^" (file-truename doom-local-dir)))) + (recentf-mode +1)) + +(def-package! server + :when (display-graphic-p) + :defer 2 + :config + (unless (server-running-p) + (server-start))) ;; @@ -110,10 +129,9 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens + :defer (buffer . 2) :config - (smartparens-global-mode +1) (require 'smartparens-config) - (setq sp-highlight-pair-overlay nil sp-cancel-autoskip-on-backward-movement nil sp-show-pair-delay 0 @@ -124,12 +142,15 @@ fundamental-mode) for performance sake." (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) (sp-local-pair '(xml-mode nxml-mode php-mode) "" - :post-handlers '(("| " "SPC")))) + :post-handlers '(("| " "SPC"))) + + (smartparens-global-mode +1)) ;; Branching undo (def-package! undo-tree - :hook (doom-init . global-undo-tree-mode) + :defer input :config + (global-undo-tree-mode +1) ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! (setq undo-tree-auto-save-history nil diff --git a/core/core-keybinds.el b/core/core-keybinds.el index b13063b76..0fca8ca65 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -60,6 +60,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (def-package! hydra + :commands (defhydra defhydradio) :init ;; In case I later need to wrap defhydra in any special functionality. (defalias 'def-hydra! 'defhydra) diff --git a/core/core-packages.el b/core/core-packages.el index 54a8f8547..562d6d25d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -73,6 +73,17 @@ missing) and shouldn't be deleted.") (defvar doom-disabled-packages () "A list of packages that should be ignored by `def-package!'.") +(defvar doom-deferred-packages + '((input) + (buffer)) + "A alist of packages that have been deferred. The CAR is the type of deferral +for the package, the CDR is the list of packages. + + input will be loaded on the first action the user invokes + after startup. + buffer will be loaded on the first new buffer to be opened + interactively.") + (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload-load-path' is called.") @@ -87,10 +98,8 @@ missing) and shouldn't be deleted.") and `auto-mode-alist'.") (defvar doom--current-module nil) -(defvar doom--init-cache-p nil) -(defvar doom--initializing nil) (defvar doom--refreshed-p nil) -(defvar generated-autoload-load-name) +(defvar doom--stage nil) ;; (setq autoload-compute-prefixes nil @@ -134,37 +143,57 @@ and `auto-mode-alist'.") ;; -;; Startup benchmark +;; Helpers 'n hooks ;; -(defun doom-packages--benchmark () - (format "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-site-load-path)) - (hash-table-count doom-modules) - (or doom-init-time - (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) +(defun doom--assert-stage-p (stage macro) + (cl-assert (eq stage doom--stage) + nil + "Found %s call in non-%s.el file (%s)" + macro (symbol-name stage) + (if (file-in-directory-p load-file-name doom-emacs-dir) + (file-relative-name load-file-name doom-emacs-dir) + (abbreviate-file-name load-file-name)))) + +(defun doom|refresh-cache () + "Refresh `doom-packages-file', which caches `load-path', +`Info-directory-list', `doom-disabled-packages', `auto-mode-alist' and +`package-activated-list'." + (doom-initialize-packages 'internal) + (let ((coding-system-for-write 'emacs-internal)) + (with-temp-file doom-packages-file + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file was autogenerated by `doom|refresh-cache', DO NOT EDIT!\n") + (prin1 `(setq load-path ',load-path + Info-directory-list ',Info-directory-list + auto-mode-alist ',auto-mode-alist + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer))))) + +(defun doom|display-benchmark (&optional return-p) + "Display a benchmark, showing number of packages and modules, and how quickly +they were loaded at startup. + +If RETURN-P, return the message as a string instead of displaying it." + (funcall (if return-p #'format #'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-site-load-path)) + (hash-table-count doom-modules) + (or doom-init-time + (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) + +(add-hook 'emacs-startup-hook #'doom|display-benchmark) +(add-hook 'doom-reload-hook #'doom|display-benchmark) ;; ;; Bootstrap API ;; -(defun doom--refresh-cache () - "TODO" - (when doom--init-cache-p - (doom-initialize-packages 'internal) - (unless noninteractive - (with-temp-buffer - (prin1 `(setq load-path ',load-path - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages) - (current-buffer)) - (write-file doom-packages-file)) - (setq doom--init-cache-p nil)))) - (defun doom-initialize (&optional force-p) "Bootstrap the bare essentials to get Doom running, if it hasn't already. If FORCE-P is non-nil, do it anyway. @@ -180,12 +209,14 @@ FORCE-P is non-nil, do it anyway. (require 'cl-lib) (require 'map)) (when (or force-p (not doom-init-p)) - (unless (load doom-autoload-file t t t) + ;; autoloads file + (unless (load doom-autoload-file 'noerror 'nomessage 'nosuffix) (unless noninteractive (error "No autoloads file! Run make autoloads"))) - (when (and noninteractive (file-exists-p doom-packages-file)) + ;; packages.el cache + (when (and force-p (file-exists-p doom-packages-file)) (delete-file doom-packages-file)) - (when (or force-p (not (load doom-packages-file t t t))) + (unless (load doom-packages-file 'noerror 'nomessage 'nosuffix) ;; 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) @@ -195,7 +226,8 @@ FORCE-P is non-nil, do it anyway. (setq package-activated-list nil package--initialized nil) (let (byte-compile-warnings) - (condition-case _ (package-initialize) + (condition-case _ + (package-initialize) ('error (package-refresh-contents) (setq doom--refreshed-p t) (package-initialize)))) @@ -213,8 +245,23 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) (cl-pushnew doom-core-dir load-path :test #'string=) - (setq doom--init-cache-p t)) - (setq doom-init-p t))) + (add-hook 'doom-internal-init-hook #'doom|refresh-cache)) + (when doom-debug-mode + (message "Doom initialized"))) + ;; initialize Doom core + (require 'core-lib) + (require 'core-os) + (unless noninteractive + (require 'core-ui) + (require 'core-editor) + (require 'core-projects) + (require 'core-keybinds)) + ;; load input-deferred packages on first `pre-command-hook' + (add-transient-hook! 'pre-command-hook + (mapc #'require (cdr (assq 'input doom-deferred-packages)))) + (add-transient-hook! 'doom-after-switch-buffer-hook + (when (get-buffer-window) + (mapc #'require (cdr (assq 'buffer doom-deferred-packages)))))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run @@ -222,14 +269,6 @@ FORCE-P is non-nil, do it anyway. (unless (file-exists-p doom-autoload-file) (quiet! (doom//reload-autoloads)))) -(defun doom-initialize-modules () - "Bootstraps all enabled modules by loading their config.el files." - (maphash (lambda (key plist) - (let ((doom--current-module key)) - (load (expand-file-name "config" (plist-get plist :path)) - 'noerror (not doom-debug-mode)))) - doom-modules)) - (defun doom-initialize-packages (&optional force-p) "Ensures that `doom-packages', `packages-alist' and `quelpa-cache' are populated. @@ -242,51 +281,57 @@ Use this before any of package.el, quelpa or Doom's package management's API to ensure all the necessary package metadata is initialized and available for them." (with-temp-buffer ; prevent buffer-local settings from propagating - (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 - (lwarn 'doom-initialize-packages :warning - "%s in %s: %s" - (car ex) - (file-relative-name file doom-emacs-dir) - (error-message-string ex)))))) + (let ((load-prefer-newer t)) ;; package.el and quelpa handle themselves if their state changes during ;; the current session, but if you change an packages.el file in a module, ;; there's no non-trivial way to detect that, so we give you a way to - ;; reload only doom-packages. + ;; reload only doom-packages (by passing 'internal as FORCE-P). ;; `doom-packages' (when (or force-p (not doom-packages)) + (unless (eq force-p 'internal) + ;; `package-alist' + (when (or force-p (not (bound-and-true-p package-alist))) + (setq load-path doom-site-load-path) + (require 'package) + (setq package-activated-list nil + package--initialized nil) + (let (byte-compile-warnings) + (condition-case _ + (package-initialize) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize))))) + + ;; `quelpa-cache' + (when (or force-p (not (bound-and-true-p quelpa-cache))) + (require 'quelpa) + (setq quelpa-initialized-p nil) + (or (quelpa-setup-p) + (error "Could not initialize quelpa")))) + (setq doom-packages nil) - (_load (expand-file-name "packages.el" doom-core-dir)) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-expand-file (car key) (cdr key) "packages.el") - if (file-exists-p path) - do (let ((doom--current-module key)) (_load path))) - (cl-loop for dir in doom-psuedo-module-dirs - for path = (expand-file-name "packages.el" dir) - if (file-exists-p path) - do (_load path))) - - (unless (eq force-p 'internal) - ;; `package-alist' - (when (or force-p (not (bound-and-true-p package-alist))) - (setq load-path doom-site-load-path) - (require 'package) - (setq package-activated-list nil) - (let (byte-compile-warnings) - (package-initialize))) - - ;; `quelpa-cache' - (when (or force-p (not (bound-and-true-p quelpa-cache))) - (require 'quelpa) - (setq quelpa-initialized-p nil) - (or (quelpa-setup-p) - (error "Could not initialize quelpa"))))))) + (cl-flet + ((_load + (file &optional noerror interactive) + (condition-case-unless-debug ex + (let ((noninteractive (not interactive))) + (load file noerror 'nomessage 'nosuffix)) + ('error + (lwarn 'doom-initialize-packages :warning + "%s in %s: %s" + (car ex) + (file-relative-name file doom-emacs-dir) + (error-message-string ex)))))) + (let ((doom--stage 'packages)) + (_load (expand-file-name "packages.el" doom-core-dir)) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-expand-file (car key) (cdr key) "packages.el") + if (file-exists-p path) + do (let ((doom--current-module key)) (_load path))) + (cl-loop for dir in doom-psuedo-module-dirs + for path = (expand-file-name "packages.el" dir) + if (file-exists-p path) + do (_load path)))))))) ;; @@ -387,28 +432,34 @@ added, if the file exists." "Bootstraps DOOM Emacs and its modules. MODULES is an malformed plist of modules to load." - (let (load-forms module file-name-handler-alist) - (dolist (m modules) - (cond ((keywordp m) (setq module m)) - ((not module) (error "No namespace specified in `doom!' for %s" m)) - ((let ((submodule (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (let ((path (doom-module-find-path module submodule))) - (if (not path) - (when doom-debug-mode - (message "Couldn't find the %s %s module" module submodule)) - (doom-module-set module submodule :flags flags :path path) - (push `(let ((doom--current-module ',(cons module submodule))) - (load! init ,path t)) - load-forms))))))) + (let (init-forms config-forms file-name-handler-alist) + (let (module) + (dolist (m modules) + (cond ((keywordp m) (setq module m)) + ((not module) (error "No namespace specified in `doom!' for %s" m)) + ((let ((submodule (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) + (let ((path (doom-module-find-path module submodule))) + (if (not path) + (when doom-debug-mode + (message "Couldn't find the %s %s module" module submodule)) + (doom-module-set module submodule :flags flags :path path) + (push `(let ((doom--current-module ',(cons module submodule))) + (load! init ,path t)) + init-forms) + (push `(let ((doom--current-module ',(cons module submodule))) + (load! config ,path t)) + config-forms)))))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) - (let ((doom--initializing t)) - ,@(nreverse load-forms)) - ,(unless doom--initializing - '(unless noninteractive - (doom--refresh-cache) - (doom-initialize-modules)))))) + (let ((doom--stage 'init)) + ,@(nreverse init-forms)) + (unless noninteractive + (run-hooks 'doom-internal-init-hook) + (let ((doom--stage 'config)) + ,@(nreverse config-forms) + (when doom-private-dir + (load ,(concat doom-private-dir "config") t t))))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." @@ -419,10 +470,17 @@ MODULES is an malformed plist of modules to load." ;; 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) - (or (and (plist-member plist :if) (not (eval (plist-get plist :if)))) - (and (plist-member plist :when) (not (eval (plist-get plist :when)))) - (and (plist-member plist :unless) (eval (plist-get plist :unless))))) - `(use-package ,name ,@plist))) + (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) + (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) + (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) + `(progn + ,(when-let* ((defer (plist-get plist :defer)) + (type (or (car-safe defer) defer))) + (setq plist (plist-put plist :defer (or (cdr-safe defer) t))) + (when (and (not doom-init-p) + (assq type doom-deferred-packages)) + `(push ',name (cdr (assq ',type doom-deferred-packages))))) + (use-package ,name ,@plist)))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. @@ -439,6 +497,7 @@ WARNING: If :pre-init or :pre-config hooks return nil, the original `def-package!''s :init/:config block (respectively) is overwritten, so remember to have them return non-nil (or exploit that to overwrite Doom's config)." (declare (indent defun)) + (doom--assert-stage-p 'init #'package!) (cond ((eq when :disable) (message "Using :disable with `def-package-hook!' is deprecated. Use :disable in `package!' instead.") (ignore (push package doom-disabled-packages))) @@ -533,16 +592,6 @@ omitted. eg. (featurep! +flag1)" ;; Module package macros ;; -(defun doom--assert-file-p (file-name macro) - (cl-assert (string= (file-name-nondirectory load-file-name) file-name) - nil - "Found %s call in non-%s file (%s)" - macro - file-name - (if (file-in-directory-p load-file-name doom-emacs-dir) - (file-relative-name load-file-name doom-emacs-dir) - (abbreviate-file-name load-file-name)))) - (defmacro package! (name &rest plist) "Declares a package and how to install it (if applicable). @@ -568,7 +617,7 @@ Accepts the following properties: :freeze FORM Do not update this package if FORM is non-nil." (declare (indent defun)) - (doom--assert-file-p "packages.el" #'package!) + (doom--assert-stage-p 'packages #'package!) (cond ((memq name doom-disabled-packages) nil) ((let ((disable (plist-get plist :disable))) (and disable (eval disable))) @@ -599,7 +648,7 @@ Accepts the following properties: packages at once. Only use this macro in a module's packages.el file." - (doom--assert-file-p "packages.el" #'packages!) + (doom--assert-stage-p 'packages #'packages!) `(progn ,@(cl-loop for desc in packages collect `(package! ,@desc)))) (defmacro disable-packages! (&rest packages) @@ -607,7 +656,7 @@ Only use this macro in a module's packages.el file." packages at once. Only use this macro in a module's packages.el file." - (doom--assert-file-p "packages.el" #'disable-packages!) + (doom--assert-stage-p 'packages #'disable-packages!) `(setq doom-disabled-packages (append ',packages doom-disabled-packages))) (defmacro depends-on! (module submodule &optional flags) @@ -617,7 +666,7 @@ Only use this macro in a module's packages.el file. MODULE is a keyword, and SUBMODULE is a symbol. Under the hood, this simply loads MODULE SUBMODULE's packages.el file." - (doom--assert-file-p "packages.el" #'depends-on!) + (doom--assert-stage-p 'packages #'depends-on!) `(let ((doom-modules ,doom-modules) (flags ,flags)) (when flags @@ -680,6 +729,7 @@ call `doom//reload-load-path' remotely (through emacsclient)." (message "%d packages reloaded" (length package-alist)) (run-hooks 'doom-reload-hook)))) +(defvar generated-autoload-load-name) (defun doom//reload-autoloads () "Refreshes the autoloads.el file, specified by `doom-autoload-file'. @@ -805,12 +855,11 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;; pertinent to files compiled later. (let (noninteractive) ;; Core libraries aren't fully loaded in a noninteractive session, so - ;; we reload it with `noninteractive' set to nil to force them to. - (load (expand-file-name "core.el" doom-core-dir) nil t t) + ;; we pretend to be interactive and reinitialize + (doom-initialize) ;; In case autoloads.el hasn't been properly generated at this point. - (dolist (file (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))) - (load file t t t))) - (doom-initialize-modules) + (unless (file-exists-p doom-autoload-file) + (mapc #'load (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))))) ;; Assemble el files we want to compile; taking into account that ;; MODULES may be a list of MODULE/SUBMODULE strings from the command ;; line. @@ -819,6 +868,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." in (or modules (append (list doom-core-dir) (doom-module-load-path))) if (equal target "core") nconc (nreverse (doom-packages--files doom-core-dir "\\.el$")) + and collect (expand-file-name "init.el" doom-private-dir) else if (file-directory-p target) nconc (nreverse (doom-packages--files target "\\.el$")) else if (cl-member target doom-psuedo-module-dirs :test #'file-in-directory-p) diff --git a/core/core-projects.el b/core/core-projects.el index f81118fc6..497b6c5b6 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -12,9 +12,9 @@ projectile-ignored-projects '("~/" "/tmp")) :config - (projectile-mode +1) (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) (add-hook 'find-file-hook #'doom|autoload-project-mode) + (projectile-mode +1) ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) diff --git a/core/core-ui.el b/core/core-ui.el index 9b267e203..118a50a23 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -280,15 +280,19 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) ;; undo/redo changes to Emacs' window layout -(defvar winner-dont-bind-my-keys t) ; I'll bind keys myself -(autoload 'winner-mode "winner" nil t) -(add-hook 'doom-init-ui-hook #'winner-mode) +(def-package! winner + :defer buffer + :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself + :config (winner-mode +1)) ;; highlight matching delimiters -(setq show-paren-delay 0.1 - show-paren-highlight-openparen t - show-paren-when-point-inside-paren t) -(add-hook 'doom-init-ui-hook #'show-paren-mode) +(def-package! paren + :defer input + :config + (setq show-paren-delay 0.1 + show-paren-highlight-openparen t + show-paren-when-point-inside-paren t) + (show-paren-mode +1)) ;;; More reliable inter-window border ;; The native border "consumes" a pixel of the fringe on righter-most splits, @@ -352,10 +356,12 @@ from the default." (prog1 (apply orig-fn args) (run-hooks 'doom-after-switch-buffer-hook))) -(advice-add #'select-frame :around #'doom*switch-frame-hooks) -(advice-add #'select-window :around #'doom*switch-window-hooks) -(advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) -(advice-add #'display-buffer :around #'doom*switch-buffer-hooks) +(defun doom|init-custom-hooks () + (advice-add #'select-frame :around #'doom*switch-frame-hooks) + (advice-add #'select-window :around #'doom*switch-window-hooks) + (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) + (advice-add #'display-buffer :around #'doom*switch-buffer-hooks)) +(add-hook 'doom-init-hook #'doom|init-custom-hooks) (defun doom*load-theme-hooks (theme &rest _) (setq doom-theme theme) diff --git a/core/core.el b/core/core.el index 0b7dc3c40..afd720562 100644 --- a/core/core.el +++ b/core/core.el @@ -82,6 +82,7 @@ XDG directory conventions if ~/.config/doom exists.") abbrev-file-name (concat doom-local-dir "abbrev.el") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) + custom-file (concat doom-etc-dir "custom.el") pcache-directory (concat doom-cache-dir "pcache/") mc/list-file (concat doom-etc-dir "mc-lists.el") server-auth-dir (concat doom-cache-dir "server/") @@ -92,10 +93,6 @@ XDG directory conventions if ~/.config/doom exists.") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) -;; move custom defs out of init.el -(setq custom-file (concat doom-etc-dir "custom.el")) -(load custom-file t t t) - ;; be quiet at startup; don't load or display anything unnecessary (unless noninteractive (advice-add #'display-startup-echo-area-message :override #'ignore) @@ -108,56 +105,17 @@ XDG directory conventions if ~/.config/doom exists.") ;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and ;; `window-setup-hook'. (defvar doom-init-hook nil - "A list of hooks run when DOOM is initialized, before `doom-post-init-hook'. -Use this for essential functionality.") + "A list of hooks run when DOOM is initialized.") -(defvar doom-post-init-hook nil - "A list of hooks run after DOOM initialization is complete, and after -`doom-init-hook'. Use this for extra, non-essential functionality.") - -(defun doom-try-run-hook (fn hook) - "Runs a hook wrapped in a `condition-case-unless-debug' block; its objective -is to include more information in the error message, without sacrificing your -ability to invoke the debugger in debug mode." - (condition-case-unless-debug ex - (if noninteractive - (quiet! (funcall fn)) - (funcall fn)) - ('error - (lwarn hook :error - "%s in '%s' -> %s" - (car ex) fn (error-message-string ex)))) - nil) - -(defun doom|after-init () - "Run `doom-init-hook' and `doom-post-init-hook', start the Emacs server, and -display the loading benchmark." - (unless noninteractive - (load (concat doom-private-dir "config") t t)) - (dolist (hook '(doom-init-hook doom-post-init-hook)) - (run-hook-wrapped hook #'doom-try-run-hook hook)) - (unless noninteractive - (when (display-graphic-p) - (require 'server) - (unless (server-running-p) - (server-start))) - (message "%s" (doom-packages--benchmark)))) - -(defun doom|finalize () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes), and resets -`file-name-handler-alist'." - (setq gc-cons-threshold 16777216 - gc-cons-percentage 0.1 - file-name-handler-alist doom--file-name-handler-alist) - t) +(defvar doom-internal-init-hook nil + "Hooks run after Doom has loaded all init.el files, and is ready to load +modules.") ;; ;; 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 @@ -195,36 +153,39 @@ with functions that require it (like modeline segments)." (advice-add #'make-indirect-buffer :around #'doom*set-indirect-buffer-filename) -;;; -;; Initialize -(eval-and-compile - (defvar doom--file-name-handler-alist file-name-handler-alist) - (unless (or after-init-time noninteractive) - ;; A big contributor to long startup times is the garbage collector, so we - ;; up its memory threshold, temporarily and reset it later in - ;; `doom|finalize'. - (setq gc-cons-threshold 402653184 - gc-cons-percentage 0.6 - file-name-handler-alist nil)) +;; +;; Bootstrap +;; - (when doom-private-dir - (load (concat doom-private-dir "early-init") t t)) +(defvar doom--file-name-handler-alist file-name-handler-alist) +(unless (or after-init-time noninteractive) + ;; A big contributor to long startup times is the garbage collector, so we up + ;; its memory threshold, temporarily and reset it later in `doom|finalize'. + (setq gc-cons-threshold 402653184 + gc-cons-percentage 1.0 + ;; consulted on every `require', `load' and various file reading + ;; functions. You get a minor speed up by nooping this. + file-name-handler-alist nil)) - (require 'core-packages (concat doom-core-dir "core-packages")) - (doom-initialize noninteractive) - (load! core-lib) - (load! core-os) ; consistent behavior across OSes +(defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes) and resets +`file-name-handler-alist'." (unless noninteractive - (load! core-ui) ; draw me like one of your French editors - (load! core-editor) ; baseline configuration for text editing - (load! core-projects) ; making Emacs project-aware - (load! core-keybinds)) ; centralized keybind system + which-key + (run-hooks 'doom-init-hook)) + (setq doom-init-p t + file-name-handler-alist doom--file-name-handler-alist + gc-cons-threshold 16777216 + gc-cons-percentage 0.15)) - (add-hook! '(emacs-startup-hook doom-reload-hook) #'doom|finalize) - (add-hook 'emacs-startup-hook #'doom|after-init) +;; +(require 'core-packages (concat doom-core-dir "core-packages")) +(doom-initialize noninteractive) - (when doom-private-dir - (load (concat doom-private-dir "init") t t))) +(add-hook! '(emacs-startup-hook doom-reload-hook) + #'doom|finalize) +(when doom-private-dir + (load (concat doom-private-dir "init") t t)) (provide 'core) ;;; core.el ends here From 87699f3973a738130977bffff0c46c11e5993a84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 18:59:49 +0200 Subject: [PATCH 1208/4235] Change doom//reload to only reload private config --- core/core-packages.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 562d6d25d..0f9bf507f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -679,10 +679,14 @@ loads MODULE SUBMODULE's packages.el file." ;; (defun doom//reload () - "Reload your Doom config. Experimental!" + "Reload your private Doom config. Experimental!" (interactive) - (load (concat doom-emacs-dir "init.el") nil nil 'nosuffix) - (doom//reload-load-path)) + (doom//reload-load-path) + (let ((doom--stage 'init)) + (load (concat doom-private-dir "init.el") nil nil 'nosuffix)) + (let ((doom--stage 'config)) + (load (concat doom-private-dir "config.el") nil nil 'nosuffix)) + (message "Private config reloaded")) (defun doom-packages--read-if-cookies (file) "Returns the value of the ;;;###if predicate form in FILE." From 6e3f500a3998114dd2037795a62f13baec79c4fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:03:36 +0200 Subject: [PATCH 1209/4235] completion/ivy: ivy-use-selectable-prompt = t Solves the "I want to enter something new, but it also is a part of a match" issue. Thanks to @gilbertw1 for letting me know about this. As such, the C-RET keybind from 310d81ab is no longer necessary --- modules/completion/ivy/config.el | 4 +++- modules/config/default/+bindings.el | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 9259fdb85..148138262 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -44,7 +44,9 @@ immediately runs it on the current candidate (ending the ivy session)." ;; ...but if that ever changes, show their full path ivy-virtual-abbreviate 'full ;; don't quit minibuffer on delete-error - ivy-on-del-error-function nil) + ivy-on-del-error-function nil + ;; enable ability to select prompt (alternative to `ivy-immediate-done') + ivy-use-selectable-prompt t) (after! magit (setq magit-completing-read-function #'ivy-completing-read)) (after! yasnippet (push #'+ivy-yas-prompt yas-prompt-functions)) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 3359cd7eb..4d0e3a9d4 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -574,7 +574,6 @@ (:after ivy :map ivy-minibuffer-map [escape] #'keyboard-escape-quit - [C-return] #'ivy-immediate-done "C-SPC" #'ivy-call-and-recenter "M-z" #'undo "M-v" #'yank From e44fd886f216a352a47882dc4cf3f401dd2fe802 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:35:26 +0200 Subject: [PATCH 1210/4235] Appease byte-compiler-sama --- modules/app/email/+gmail.el | 13 +++++++------ modules/app/twitter/autoload.el | 2 +- modules/app/twitter/config.el | 3 ++- modules/config/default/+bindings.el | 2 +- modules/config/default/config.el | 19 ++++++++++--------- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/modules/app/email/+gmail.el b/modules/app/email/+gmail.el index 7b001223b..9d647b206 100644 --- a/modules/app/email/+gmail.el +++ b/modules/app/email/+gmail.el @@ -16,12 +16,12 @@ (map-put mu4e-marks 'trash (list :char '("d" . "▼") :prompt "dtrash" - :dyn-target (lambda (target msg) (mu4e-get-trash-folder msg)) + :dyn-target (lambda (_target msg) (mu4e-get-trash-folder msg)) :action #'+email--mark-seen)) ;; Refile will be my "archive" function. (map-put mu4e-marks 'refile (list :char '("r" . "▶") :prompt "refile" - :show-target (lambda (target) "archive") + :show-target (lambda (_target) "archive") :action #'+email--mark-seen)) ;; This hook correctly modifies gmail flags on emails when they are marked. @@ -29,8 +29,9 @@ ;; won't properly result in the corresponding gmail action, since the marks ;; are ineffectual otherwise. (defun +email|gmail-fix-flags (mark msg) - (cond ((eq mark 'trash) (mu4e-action-retag-message msg "-\\Inbox,+\\Trash,-\\Draft")) - ((eq mark 'refile) (mu4e-action-retag-message msg "-\\Inbox")) - ((eq mark 'flag) (mu4e-action-retag-message msg "+\\Starred")) - ((eq mark 'unflag) (mu4e-action-retag-message msg "-\\Starred")))) + (pcase mark + (`trash (mu4e-action-retag-message msg "-\\Inbox,+\\Trash,-\\Draft")) + (`refile (mu4e-action-retag-message msg "-\\Inbox")) + (`flag (mu4e-action-retag-message msg "+\\Starred")) + (`unflag (mu4e-action-retag-message msg "-\\Starred")))) (add-hook 'mu4e-mark-execute-pre-hook #'+email|gmail-fix-flags)) diff --git a/modules/app/twitter/autoload.el b/modules/app/twitter/autoload.el index 883390363..97e23eb02 100644 --- a/modules/app/twitter/autoload.el +++ b/modules/app/twitter/autoload.el @@ -62,7 +62,7 @@ that works with the feature/popup module." (with-current-buffer buf (twittering-rerender-timeline-all buf) (setq-local line-spacing 0.2) - (goto-line 0 buf)))) + (goto-char (point-min))))) ;;;###autoload (defun +twitter/ace-link () diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index f5bd6854f..ae40a8e4c 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -30,7 +30,8 @@ '((transient) (quit) (select . t))) (defface twitter-divider - `((t (:underline (:color ,(doom-darken 'vertical-bar 0.2))))) + '((((background dark)) (:underline (:color "#141519"))) + (((background light)) (:underline (:color "#d3d3d3")))) "The vertical divider between tweets." :group 'twittering-mode) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4d0e3a9d4..6a5fb7b62 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -747,7 +747,7 @@ ;; (when (featurep 'evil-collection) - (defun +config|deal-with-evil-collections-bs (feature keymaps) + (defun +config|deal-with-evil-collections-bs (_feature keymaps) "Unmap keys that conflict with Doom's defaults." (dolist (map keymaps) (evil-define-key '(normal visual motion) map diff --git a/modules/config/default/config.el b/modules/config/default/config.el index aed29b011..f3325d2a4 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -76,15 +76,16 @@ (defvar +default-repeat-forward-key ";") (defvar +default-repeat-backward-key ",") - ;; 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 +default-repeat-forward-key ',next-func) - (define-key evil-motion-state-map +default-repeat-backward-key ',prev-func)) - (advice-add #',command :before #',fn-sym)))) + (eval-and-compile + ;; 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" (doom-unquote command))))) + `(progn + (defun ,fn-sym (&rest _) + (define-key evil-motion-state-map +default-repeat-forward-key #',next-func) + (define-key evil-motion-state-map +default-repeat-backward-key #',prev-func)) + (advice-add #',command :before #',fn-sym))))) ;; n/N (do-repeat! evil-ex-search-next evil-ex-search-next evil-ex-search-previous) From 2712d606c26e2b2086963fcb2d59dc89de554330 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:42:48 +0200 Subject: [PATCH 1211/4235] config/default: remove unnecessary after! blocks --- modules/config/default/config.el | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index f3325d2a4..0937f87fc 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -96,19 +96,17 @@ ;; f/F/t/T/s/S (setq evil-snipe-repeat-keys nil evil-snipe-override-evil-repeat-keys nil) ; causes problems with remapped ; - (after! evil-snipe - (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)) + (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)))) + (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))) From a631c10d0574f4803c6f9b0fae77dee5363af4b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:45:47 +0200 Subject: [PATCH 1212/4235] Exploit new :defer input|buffer across various modules --- modules/completion/company/config.el | 9 ++++++--- modules/completion/helm/config.el | 3 ++- modules/completion/ivy/config.el | 16 ++++------------ modules/feature/evil/config.el | 15 ++++++++------- modules/ui/evil-goggles/config.el | 2 +- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c16ca0d91..efc730586 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -42,13 +42,16 @@ MODES should be one major-mode symbol or a list of them." company-backends '(company-capf company-dabbrev company-ispell company-yasnippet) company-transformers '(company-sort-by-occurrence)) - (when (featurep! +auto) - (require 'company) - (setq company-idle-delay 0.2)) :config (global-company-mode +1)) +(def-package! company + :when (featurep! +auto) + :defer input + :config (setq company-idle-delay 0.2)) + + (def-package! company-statistics :hook (company-mode . company-statistics-mode) :init (advice-add #'company-statistics-mode :around #'doom*shut-up) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 44823b3f6..0c7d32611 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -11,8 +11,9 @@ ;; (def-package! helm-mode - :hook (doom-init . helm-mode) + :defer (input . 1) :config + (helm-mode +1) ;; helm is too heavy for find-file-at-point (add-to-list 'helm-completing-read-handlers-alist '(find-file-at-point . nil))) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 148138262..222982a2a 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -24,8 +24,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; (def-package! ivy - :init - (add-hook 'doom-init-hook #'ivy-mode) + :defer input :config (setq ivy-height 12 ivy-do-completion-in-region nil @@ -55,15 +54,7 @@ immediately runs it on the current candidate (ending the ivy session)." [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer [remap imenu-anywhere] #'ivy-imenu-anywhere) - (nconc ivy-sort-functions-alist - '((persp-kill-buffer . nil) - (persp-remove-buffer . nil) - (persp-add-buffer . nil) - (persp-switch . nil) - (persp-window-switch . nil) - (persp-frame-switch . nil) - (+workspace/switch-to . nil) - (+workspace/delete . nil)))) + (ivy-mode +1)) ;; Show more buffer information in switch-buffer commands @@ -140,7 +131,8 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-hydra :commands (+ivy@coo/body ivy-dispatching-done-hydra) :init - (map! :map ivy-minibuffer-map + (map! :after ivy + :map ivy-minibuffer-map "C-o" #'+ivy@coo/body "M-o" #'ivy-dispatching-done-hydra) :config diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index b64f675a7..280c1563a 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -23,10 +23,10 @@ (def-package! evil-collection :when (featurep! +everywhere) - :after evil + :defer input :preface ;; must be set before evil/evil-collcetion is loaded - (setq evil-want-integration (not (featurep! +everywhere)) + (setq evil-want-integration nil evil-collection-company-use-tng nil) :config (delq 'kotlin-mode evil-collection-mode-list) ; doesn't do anything useful @@ -229,17 +229,17 @@ (def-package! evil-escape - :commands evil-escape-mode + :commands (evil-escape evil-escape-mode evil-escape-pre-command-hook) :init (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) evil-escape-excluded-major-modes '(neotree-mode) evil-escape-key-sequence "jk" evil-escape-delay 0.25) - (add-hook 'doom-post-init-hook #'evil-escape-mode) + (add-hook 'pre-command-hook 'evil-escape-pre-command-hook) + (map! :irvo "C-g" #'evil-escape) :config ;; no `evil-escape' in minibuffer - (push #'minibufferp evil-escape-inhibit-functions) - (map! :irvo "C-g" #'evil-escape)) + (add-hook 'evil-escape-inhibit-functions #'minibufferp)) (def-package! evil-exchange @@ -325,7 +325,7 @@ the new algorithm is confusing, like in python or ruby." (def-package! evil-snipe :commands (evil-snipe-mode evil-snipe-override-mode evil-snipe-local-mode evil-snipe-override-local-mode) - :hook (doom-post-init . evil-snipe-mode) + :defer input :init (setq evil-snipe-smart-case t evil-snipe-scope 'line @@ -333,6 +333,7 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-char-fold t evil-snipe-aliases '((?\; "[;:]"))) :config + (evil-snipe-mode +1) (evil-snipe-override-mode +1)) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index 67a5c9524..dec761c00 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -2,7 +2,7 @@ (def-package! evil-goggles :when (featurep! :feature evil) - :hook (doom-post-init . evil-goggles-mode) + :defer input :init (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow From 8cab2f19fd272c79328ff2e2357af33cbfb3e1f9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:47:53 +0200 Subject: [PATCH 1213/4235] Remove redundant config & auto-mode-alist entries Much of this config is done in package autoloads, and now that auto-mode-alist is cached in doom-package-alist (after reading autoload files), we can save some space by removing redundant config. --- modules/feature/version-control/+git.el | 14 +++++--------- modules/lang/elixir/config.el | 4 ++-- modules/lang/javascript/config.el | 10 +++++----- modules/lang/web/+css.el | 18 +++--------------- modules/lang/web/+html.el | 10 ++-------- 5 files changed, 17 insertions(+), 39 deletions(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index c042437d1..cbb110f5f 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,18 +1,14 @@ ;;; feature/version-control/+git.el -*- lexical-binding: t; -*- +;; These don't need `def-package!' blocks because they've already been set up by +;; `doom-initialize'. +(autoload 'gitconfig-mode "gitconfig-mode" nil t) +(autoload 'gitignore-mode "gitignore-mode" nil t) + (when (featurep! :feature evil) (add-hook 'git-commit-mode-hook #'evil-insert-state)) -(def-package! gitconfig-mode - :mode "/\\.?git/?config$" - :mode "/\\.gitmodules$") - - -(def-package! gitignore-mode - :mode "/\\.gitignore$") - - (def-package! git-gutter-fringe :defer t :init diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index b12b3426c..a7f8044dc 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -1,8 +1,8 @@ ;;; lang/elixir/config.el -*- lexical-binding: t; -*- (def-package! elixir-mode - :mode "\\.exs?$" - :mode "\\.elixir2$" + :mode "\\.exs?\\'" + :mode "\\.elixir2\\'" :init ;; sp's default elixir rules are obnoxious, so disable them (provide 'smartparens-elixir) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 137ed706b..b84c011da 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -5,7 +5,7 @@ ;; (def-package! js2-mode - :mode "\\.js$" + :mode "\\.js\\'" :interpreter "node" :config (setq js2-skip-preprocessor-directives t @@ -35,15 +35,15 @@ (def-package! typescript-mode - :mode "\\.ts$" + :commands typescript-mode :config (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :electric 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) + (set! :electric 'typescript-mode + :chars '(?\} ?\)) :words '("||" "&&"))) (def-package! rjsx-mode :commands rjsx-mode - :mode "\\.jsx$" :mode "components/.+\\.js$" :init (defun +javascript-jsx-file-p () @@ -73,7 +73,7 @@ (def-package! coffee-mode - :mode "\\.coffee$" + :defer t ; file extensions registered by autoloads file :init (setq coffee-indent-like-python-mode t)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index dbad9c360..cadfd2a40 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -2,7 +2,7 @@ ;; css-mode hooks apply to scss and less-css modes (add-hook 'css-mode-hook #'rainbow-delimiters-mode) -(add-hook! (css-mode sass-mode) +(add-hook! (css-mode sass-mode stylus-mode) #'(yas-minor-mode-on flycheck-mode highlight-numbers-mode)) ;; An improved newline+continue comment function @@ -35,10 +35,7 @@ :hook (css-mode sass-mode)) -(def-package! css-mode - :mode "\\.css$" - :mode ("\\.scss$" . scss-mode) - :config +(after! css-mode ; contains both css-mode & scss-mode (set! :docset 'css-mode "CSS") (set! :docset 'scss-mode "Sass") (set! :company-backend '(css-mode scss-mode) 'company-css) @@ -46,18 +43,9 @@ (def-package! sass-mode - :mode "\\.sass$" + :commands sass-mode :config (set! :docset 'sass-mode "Sass") (set! :company-backend 'sass-mode 'company-css) (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) - -(def-package! less-css-mode - :mode "\\.less$") - - -(def-package! stylus-mode - :mode "\\.styl$" - :init (add-hook! stylus-mode #'(yas-minor-mode-on flycheck-mode))) - diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 9cf432438..8a724fd0e 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -96,11 +96,5 @@ :after web-mode) -(def-package! haml-mode :mode "\\.haml$") - - -(def-package! pug-mode - :mode "\\.jade$" - :mode "\\.pug$" - :config - (set! :company-backend 'pug-mode '(company-yasnippet))) +;; `pug-mode' +(set! :company-backend 'pug-mode '(company-yasnippet)) From 48cb10a9cc8a52b050a2548d7be0eaef4d5a4f98 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:49:43 +0200 Subject: [PATCH 1214/4235] lang/org: fix void-function +org|setup-ui error Caused if org is loaded early in your config, before :lang org is loaded. Or when byte-compiling. --- modules/lang/org/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index e6627b8d8..b4d29c5cd 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -64,15 +64,11 @@ +org|enable-auto-update-cookies +org|smartparens-compatibility-config +org|unfold-to-2nd-level-or-point - +org|show-paren-mode-compatibility - )) + +org|show-paren-mode-compatibility)) (after! org (defvaralias 'org-directory '+org-dir)) -(when (featurep 'org) - (run-hooks 'org-load-hook)) - ;; ;; `org-mode' hooks @@ -332,3 +328,7 @@ between the two." (apply orig-fn args))) (advice-add #'org-get-agenda-file-buffer :around #'+org*exclude-agenda-buffers-from-recentf)) + +;; +(when (featurep 'org) + (run-hooks 'org-load-hook)) From 67dab988596ef9a3eec47753625b77756fde887b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:54:57 +0200 Subject: [PATCH 1215/4235] Improve idempotency of Doom config (in case of reloading) --- core/core-packages.el | 2 +- modules/completion/helm/config.el | 2 +- modules/completion/ivy/config.el | 8 ++++---- modules/feature/evil/config.el | 23 ++++++++++++----------- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 0f9bf507f..6f2234f42 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -1020,7 +1020,7 @@ Do not use this for configuring Doom core." (defun ,fn ,arglist ,docstring ,@forms) - (cl-pushnew ',(cons keyword fn) doom-settings :test #'eq :key #'car)))) + (map-put doom-settings ,keyword #',fn)))) (defmacro set! (keyword &rest values) "Set an option defined by `def-setting!'. Skip if doesn't exist. See diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 0c7d32611..d407459f2 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -15,7 +15,7 @@ :config (helm-mode +1) ;; helm is too heavy for find-file-at-point - (add-to-list 'helm-completing-read-handlers-alist '(find-file-at-point . nil))) + (map-put helm-completing-read-handlers-alist 'find-file-at-point nilk)) (def-package! helm diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 222982a2a..eb60b5789 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -48,7 +48,7 @@ immediately runs it on the current candidate (ending the ivy session)." ivy-use-selectable-prompt t) (after! magit (setq magit-completing-read-function #'ivy-completing-read)) - (after! yasnippet (push #'+ivy-yas-prompt yas-prompt-functions)) + (after! yasnippet (cl-pushnew #'+ivy-yas-prompt yas-prompt-functions :test #'eq)) (map! [remap switch-to-buffer] #'ivy-switch-buffer [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer @@ -202,13 +202,13 @@ immediately runs it on the current candidate (ending the ivy session)." 'ivy-posframe-display-at-window-bottom-left 'ivy-posframe-display-at-window-center '+ivy-display-at-frame-center-near-bottom)) - (push (list fn :cleanup 'ivy-posframe-cleanup) ivy-display-functions-props)) + (map-put ivy-display-functions-props fn '(:cleanup ivy-posframe-cleanup))) - (push '(t . +ivy-display-at-frame-center-near-bottom) ivy-display-functions-alist) + (map-put ivy-display-functions-alist 't '+ivy-display-at-frame-center-near-bottom) ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) - (push (cons fn nil) ivy-display-functions-alist)) + (map-put ivy-display-functions-alist fn nil)) (setq ivy-height 16 ivy-fixed-height-minibuffer nil diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 280c1563a..bf107e1cc 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -220,12 +220,12 @@ (cons (format "(%s " (or (read-string "(") "")) ")")) ;; Add escaped-sequence support to embrace - (push (cons ?\\ (make-embrace-pair-struct - :key ?\\ - :read-function #'+evil--embrace-escaped - :left-regexp "\\[[{(]" - :right-regexp "\\[]})]")) - (default-value 'embrace--pairs-list))) + (map-put (default-value 'embrace--pairs-list) + ?\\ (make-embrace-pair-struct + :key ?\\ + :read-function #'+evil--embrace-escaped + :left-regexp "\\[[{(]" + :right-regexp "\\[]})]"))) (def-package! evil-escape @@ -307,11 +307,11 @@ the new algorithm is confusing, like in python or ruby." ;; Add custom commands to whitelisted commands (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol doom/backward-kill-to-bol-and-indent)) - (push (cons fn '((:default . evil-mc-execute-default-call))) - evil-mc-custom-known-commands)) + (map-put evil-mc-custom-known-commands + fn '((:default . evil-mc-execute-default-call)))) ;; disable evil-escape in evil-mc; causes unwanted text on invocation - (push 'evil-escape-mode evil-mc-incompatible-minor-modes) + (cl-pushnew 'evil-escape-mode evil-mc-incompatible-minor-modes :test #'eq) (defun +evil|escape-multiple-cursors () "Clear evil-mc cursors and restore state." @@ -380,8 +380,9 @@ the new algorithm is confusing, like in python or ruby." evil-forward-arg evil-backward-arg evil-jump-out-args) :config - (push "<" evil-args-openers) - (push ">" evil-args-closers)) + (unless (member "<" evil-args-openers) + (push "<" evil-args-openers) + (push ">" evil-args-closers))) (def-package! evil-indent-plus From bb88411cc98fa08d2e88700e0456bacf90ea39bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:55:55 +0200 Subject: [PATCH 1216/4235] General minor refactor & docstring fixes --- core/core-packages.el | 7 +++---- core/core-ui.el | 4 ++-- modules/app/twitter/config.el | 3 ++- modules/feature/evil/config.el | 4 ++-- modules/feature/lookup/autoload/lookup.el | 8 ++++---- modules/lang/haskell/+intero.el | 12 ++++++++++-- modules/lang/haskell/autoload.el | 10 ---------- modules/lang/javascript/config.el | 5 +++-- modules/lang/org/config.el | 2 +- 9 files changed, 27 insertions(+), 28 deletions(-) delete mode 100644 modules/lang/haskell/autoload.el diff --git a/core/core-packages.el b/core/core-packages.el index 6f2234f42..3bd3f84cc 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -551,7 +551,6 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (if (file-directory-p module-path) `(condition-case-unless-debug ex (let ((doom--current-module ',(cons module submodule))) - ;; ,(if plist `(doom-module-set ,module ',submodule ,@plist)) (load! init ,module-path :noerror) (load! config ,module-path :noerror)) ('error @@ -566,12 +565,12 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if MODULE SUBMODULE has FLAG enabled. - (featurep! :private default) + (featurep! :config default) Module FLAGs are set in your config's `doom!' block, typically in ~/.emacs.d/init.el. Like so: - :private (default +flag1 -flag2) + :config (default +flag1 -flag2) When this macro is used from inside a module, MODULE and SUBMODULE can be omitted. eg. (featurep! +flag1)" @@ -579,7 +578,7 @@ omitted. eg. (featurep! +flag1)" (let* ((path (or load-file-name byte-compile-current-file)) (module-pair (doom-module-from-path path))) (unless module-pair - (error "featurep! couldn't detect what module I'm in! (in %s)" path)) + (error "featurep! couldn't detect what module its in! (in %s)" path)) (setq flag module module (car module-pair) submodule (cdr module-pair)))) diff --git a/core/core-ui.el b/core/core-ui.el index 118a50a23..758d98827 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -304,8 +304,8 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; remove prompt if the file is opened in other clients (defun server-remove-kill-buffer-hook () - (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)) -(add-hook 'server-visit-hook 'server-remove-kill-buffer-hook) + (remove-hook 'kill-buffer-query-functions #'server-kill-buffer-query-function)) +(add-hook 'server-visit-hook #'server-remove-kill-buffer-hook) ;; whitespace-mode settings (setq whitespace-line-column nil diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index ae40a8e4c..acc592b40 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -47,9 +47,10 @@ (bar matches " %b " selection-info) ()) - (add-hook! twittering-mode + (defun +twitter|switch-mode-and-header-line () (setq header-line-format (or (doom-modeline 'twitter) mode-line-format) mode-line-format nil)) + (add-hook 'twittering-mode-hook #'+twitter|switch-mode-and-header-line) (map! :map twittering-mode-map "q" #'+twitter/quit diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bf107e1cc..c2ca114cc 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -365,8 +365,8 @@ the new algorithm is confusing, like in python or ruby." evil-visualstar/begin-search-forward evil-visualstar/begin-search-backward) :init - (map! :v "*" #'evil-visualstar/begin-search-forward - :v "#" #'evil-visualstar/begin-search-backward) + (map! :m [remap evil-ex-search-word-forward] #'evil-visualstar/begin-search-forward + :m [remap evil-ex-search-word-backward] #'evil-visualstar/begin-search-backward) :config (global-evil-visualstar-mode 1)) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index b248c18d3..56203adf5 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -31,11 +31,11 @@ :documentation +lookup-documentation-functions :file +lookup-file-functions) prop) - for fn = (or (command-remapping fn) fn) + for cmd = (or (command-remapping fn) fn) if (condition-case e - (or (if (commandp fn) - (call-interactively fn) - (funcall fn identifier)) + (or (if (commandp cmd) + (call-interactively cmd) + (funcall cmd identifier)) (/= (point-marker) origin)) ('error (ignore (message "%s" e)))) return it)) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 372e3e51b..7463cfa8a 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -2,9 +2,17 @@ ;;;###if (featurep! +intero) (def-package! intero - :after haskell-mode - :config + :commands intero-mode + :init + (defun +haskell|init-intero () + "Initializes `intero-mode' in haskell-mode, unless stack isn't installed. +This is necessary because `intero-mode' doesn't do its own error checks." + (when (derived-mode-p 'haskell-mode) + (if (executable-find "stack") + (intero-mode +1) + (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) + :config (add-hook 'intero-mode-hook #'flycheck-mode) (set! :lookup 'haskell-mode :definition #'intero-goto-definition)) diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el deleted file mode 100644 index ba2d4fec6..000000000 --- a/modules/lang/haskell/autoload.el +++ /dev/null @@ -1,10 +0,0 @@ -;;; lang/haskell/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +haskell|init-intero () - "Initializes `intero-mode' in haskell-mode, unless stack isn't installed. -This is necessary because `intero-mode' doesn't do its own error checks." - (when (derived-mode-p 'haskell-mode) - (if (executable-find "stack") - (intero-mode +1) - (message "Couldn't find stack. Refusing to enable intero-mode.")))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index b84c011da..8d7c4d202 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -183,8 +183,9 @@ (def-package! eslintd-fix :commands (eslintd-fix-mode eslintd-fix) :config - (add-hook! 'eslintd-fix-mode-hook - (setq flycheck-javascript-eslint-executable eslintd-fix-executable))) + (defun +javascript|set-flycheck-executable-to-eslint () + (setq flycheck-javascript-eslint-executable eslintd-fix-executable)) + (add-hook 'eslintd-fix-mode-hook #'+javascript|set-flycheck-executable-to-eslint)) (def-package! skewer-mode diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b4d29c5cd..70e1f2c05 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -306,7 +306,7 @@ between the two." (defun +org|setup-hacks () "Getting org to behave." ;; Don't open separate windows - (map-put org-link-frame-setup 'file 'find-file) + (map-put org-link-frame-setup 'file #'find-file) ;; Let OS decide what to do with files when opened (setq org-file-apps From 5537f81e02c448aa0a8858fd08b3a03e061a684f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 20:56:17 +0200 Subject: [PATCH 1217/4235] ui/doom-dashboard: doom-packages--benchmark => doom|display-benchmark --- 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 1f6c87934..220f9747f 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -286,7 +286,7 @@ controlled by `+doom-dashboard-pwd-policy'." (propertize (+doom-dashboard--center +doom-dashboard--width - (doom-packages--benchmark)) + (doom|display-benchmark 'return)) 'face 'font-lock-comment-face) "\n\n")) From dbeb7c639a71d4c7c45e8474becc204f39025064 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 21:00:20 +0200 Subject: [PATCH 1218/4235] Update doom doctor --- bin/doom-doctor | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 2758e3b2e..30d67989e 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -279,16 +279,11 @@ (message "\n----") (let (doom-core-packages doom-debug-mode) (condition-case ex - (progn + (let ((inhibit-message t)) + (load "~/.emacs.d/core/core.el" nil t) (let (noninteractive) - (load "~/.emacs.d/core/core.el" nil t)) - (let ((inhibit-message t) - (noninteractive t)) - (load "~/.emacs.d/init.el" nil t)) - (doom-initialize t) - (doom-initialize-packages t) - (quiet! (doom-initialize-modules)) - (doom|finalize) + (doom-initialize t) + (doom|finalize)) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) ('error (warn! "Attempt to load DOOM: failed\n %s\n" @@ -307,11 +302,13 @@ doom-packages) (when (or (file-exists-p doctor-file) (file-exists-p packages-file)) - (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) + (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key)))) + (doom--stage 'packages)) (when (load packages-file t t) (dolist (package (cl-remove-if #'package-installed-p doom-packages :key #'car)) (error! "%s is not installed" (car package)))) - (load doctor-file t t)))) + (let ((doom--stage 'doctor)) + (load doctor-file t t))))) ('error (error! "Syntax error: %s" ex)))) doom-modules))) From bdf6fceb52b5bf11355debe7888cdd87d1390bd6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 21:09:09 +0200 Subject: [PATCH 1219/4235] Silence deleted *.elc messages if byte-compile fails --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 3bd3f84cc..e3234a278 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -924,7 +924,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "There were breaking errors." (error-message-string ex) "Reverting changes...") - (doom//clean-byte-compiled-files) + (quiet! (doom//clean-byte-compiled-files)) (message! (green "Finished (nothing was byte-compiled)"))))))))) (defun doom//byte-compile-core (&optional recompile-p) From abb4d5a00921a6c59a736015950bc19b9a4e3e60 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 May 2018 21:23:48 +0200 Subject: [PATCH 1220/4235] Move :tools impatient-mode to new :collab category --- init.example.el | 6 ++++-- modules/{tools => collab}/impatient-mode/autoload.el | 2 +- modules/{tools => collab}/impatient-mode/config.el | 2 +- modules/{tools => collab}/impatient-mode/packages.el | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) rename modules/{tools => collab}/impatient-mode/autoload.el (92%) rename modules/{tools => collab}/impatient-mode/config.el (58%) rename modules/{tools => collab}/impatient-mode/packages.el (66%) diff --git a/init.example.el b/init.example.el index 1de3bf544..f57571a87 100644 --- a/init.example.el +++ b/init.example.el @@ -37,6 +37,7 @@ evil-goggles ; display visual hints when editing in evil hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping + neotree ; a project drawer, like NERDTree for vim ;tabbar ; FIXME an (incomplete) tab bar for Emacs ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB @@ -50,11 +51,9 @@ eshell ; a consistent, cross-platform shell (WIP) gist ; interacting with github gists imenu ; an imenu sidebar and searchable code index - impatient-mode ; show off code over HTTP ;macos ; MacOS-specific commands make ; run make tasks from Emacs ;magit ; - neotree ; a project drawer, like NERDTree for vim password-store ; password manager for nerds pdf ; pdf enhancements ;rgb ; creating color strings @@ -121,6 +120,9 @@ ; +wordnut ; wordnet (wn) search ; +langtool) ; a proofreader (grammar/style check) for Emacs + :collab + ;impatient-mode ; show off code over HTTP + :config ;; The default module set reasonable defaults for Emacs. It also provides ;; a Spacemacs-inspired keybinding scheme, a custom yasnippet library, diff --git a/modules/tools/impatient-mode/autoload.el b/modules/collab/impatient-mode/autoload.el similarity index 92% rename from modules/tools/impatient-mode/autoload.el rename to modules/collab/impatient-mode/autoload.el index 7973e0178..3222b5477 100644 --- a/modules/tools/impatient-mode/autoload.el +++ b/modules/collab/impatient-mode/autoload.el @@ -1,4 +1,4 @@ -;;; tools/impatient-mode/autoload.el -*- lexical-binding: t; -*- +;;; collab/impatient-mode/autoload.el -*- lexical-binding: t; -*- ;;;###autoload (defun +impatient-mode/toggle () diff --git a/modules/tools/impatient-mode/config.el b/modules/collab/impatient-mode/config.el similarity index 58% rename from modules/tools/impatient-mode/config.el rename to modules/collab/impatient-mode/config.el index da036ac8a..0087bee52 100644 --- a/modules/tools/impatient-mode/config.el +++ b/modules/collab/impatient-mode/config.el @@ -1,4 +1,4 @@ -;;; tools/impatient-mode/config.el -*- lexical-binding: t; -*- +;;; collab/impatient-mode/config.el -*- lexical-binding: t; -*- ;; Show off code as you write it diff --git a/modules/tools/impatient-mode/packages.el b/modules/collab/impatient-mode/packages.el similarity index 66% rename from modules/tools/impatient-mode/packages.el rename to modules/collab/impatient-mode/packages.el index 002eb1734..2469c675e 100644 --- a/modules/tools/impatient-mode/packages.el +++ b/modules/collab/impatient-mode/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/impatient-mode/packages.el +;;; collab/impatient-mode/packages.el (package! htmlize) (package! impatient-mode) From d0f8bf402a490a969e7d30911256bc54ea0ae36d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:31:40 +0200 Subject: [PATCH 1221/4235] doom-visible-windows: support visible window-parameter --- core/autoload/buffers.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 84a143081..ed44c5da9 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -128,7 +128,8 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." (defun doom-visible-windows (&optional window-list) "Return a list of the visible, non-popup (dedicated) windows." (cl-loop for window in (or window-list (window-list)) - unless (window-dedicated-p window) + when (or (window-parameter window 'visible) + (not (window-dedicated-p window))) collect window)) ;;;###autoload From 84fc356e40dc6ebea09fc6b5dc6f00ee07a9e568 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:32:05 +0200 Subject: [PATCH 1222/4235] tools/eshell: dedicate eshell windows Disallow commands to change their buffer non-interactively. --- modules/tools/eshell/autoload/eshell.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index d720240b3..d9ceb085a 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -71,9 +71,9 @@ "Open eshell in the current buffer." (interactive) (let ((buf (+eshell--buffer (eq major-mode 'eshell-mode)))) + (switch-to-buffer buf) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) - (switch-to-buffer buf) (when command (+eshell-run-command command)))) @@ -129,12 +129,20 @@ module to be loaded." (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) + (let ((window (selected-window))) + (set-window-parameter window 'no-other-window t) + (set-window-parameter window 'visible t) + (set-window-dedicated-p window t)) (+eshell--add-buffer buf) (setq +eshell-last-buffer buf))) ;;;###autoload (defun +eshell|cleanup () "Close window (or workspace) on quit." + (let ((window (selected-window))) + (set-window-parameter window 'no-other-window nil) + (set-window-parameter window 'visible t) + (set-window-dedicated-p window nil)) (+eshell--remove-buffer (current-buffer)) (cond ((and (featurep! :feature workspaces) (string= "eshell" (+workspace-current-name))) From a3800f39490cad665452c888e4cbc862edeaaeda Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:32:55 +0200 Subject: [PATCH 1223/4235] tools/eshell: set eshell-directory-name if ~/.doom.d/eshell exists --- modules/tools/eshell/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index cf2e5e729..e21fb562c 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -11,11 +11,11 @@ (def-package! eshell ; built-in :commands eshell-mode :init - (setq eshell-directory-name (concat doom-etc-dir "/eshell") - eshell-rc-script "~/.eshellrc" - eshell-aliases-file "~/.eshell_aliases" - ;; - eshell-scroll-to-bottom-on-input 'all + (let ((dir (concat doom-private-dir "eshell"))) + (when (file-directory-p dir) + (setq eshell-directory-name dir))) + + (setq eshell-scroll-to-bottom-on-input 'all eshell-scroll-to-bottom-on-output 'all eshell-buffer-shorthand t eshell-kill-processes-on-exit t From ba2fb4a82dd6fea5f5190f65dd2984aab9e04f11 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:33:21 +0200 Subject: [PATCH 1224/4235] tools/eshell: remove custom aliases That belongs in my private module --- modules/tools/eshell/config.el | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index e21fb562c..112af74bc 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -33,19 +33,9 @@ (add-hook 'eshell-mode-hook #'+eshell|init) (add-hook 'eshell-exit-hook #'+eshell|cleanup) - (after! em-alias - (setq eshell-command-aliases-list - (append eshell-command-aliases-list - '(("q" "exit") - ("l" "ls -1") - ("ll" "ls -l") - ("la" "ls -la") - ("g" "hub") - ("gs" "hub status --short ."))))) - (after! em-term - ;; Visual commands require a proper terminal. Eshell can't handle that, so it - ;; delegates these commands to a term buffer. + ;; Visual commands require a proper terminal. Eshell can't handle that, so + ;; it delegates these commands to a term buffer. (setq eshell-visual-commands (append eshell-visual-commands '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim")) eshell-visual-subcommands '(("git" "log" "l" "diff" "show")))) From d51f3b1f387f71f486310004a086dc74d040e079 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:40:42 +0200 Subject: [PATCH 1225/4235] Map /[A-Z]+$ files to text-mode --- core/core-editor.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index cb12e8514..891a70ff0 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -122,6 +122,8 @@ fundamental-mode) for performance sake." (unless (server-running-p) (server-start))) +(push '("/[A-Z]+$" . text-mode) auto-mode-alist) + ;; ;; Core Plugins From 682587ac260946a4ee8e46703f6ba1fc24136b0a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:46:08 +0200 Subject: [PATCH 1226/4235] Remove esup --- core/packages.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/packages.el b/core/packages.el index 904616767..1483cfd3e 100644 --- a/core/packages.el +++ b/core/packages.el @@ -35,6 +35,3 @@ ;; core-keybinds.el (package! which-key) (package! hydra) - -;; other -(package! esup) From 7bf133e991e1e09249976fce6cc5912fd5ce630c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:46:18 +0200 Subject: [PATCH 1227/4235] Update unit test bootstrap --- core/autoload/test.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 9d04cb4df..9017e9288 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -11,9 +11,10 @@ If neither is available, run all tests in all enabled modules." (let ((doom-modules (make-hash-table :test #'equal))) ;; ensure DOOM is initialized (let (noninteractive) - ;; Core libraries aren't fully loaded in a noninteractive session, so - ;; we reload it with `noninteractive' set to nil to force them to. - (load (expand-file-name "core.el" doom-core-dir) nil t t)) + ;; Core libraries aren't fully loaded in a noninteractive session, so we + ;; reload it with `noninteractive' set to nil to force them to. + (doom-initialize t) + (run-hooks 'doom-init-hook 'pre-command-hook 'doom-after-switch-buffer-hook)) (condition-case-unless-debug ex (let ((target-paths ;; Convert targets (either from MODULES or `argv') into a list of From 5ab790c07de7a6d209e0f66560edc96caf3c35ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 01:57:40 +0200 Subject: [PATCH 1228/4235] tools/eshell: default to ~/.doom.d/eshell or ~/.eshell --- modules/tools/eshell/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 112af74bc..4a5ec3cb0 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -11,11 +11,12 @@ (def-package! eshell ; built-in :commands eshell-mode :init - (let ((dir (concat doom-private-dir "eshell"))) - (when (file-directory-p dir) - (setq eshell-directory-name dir))) - - (setq eshell-scroll-to-bottom-on-input 'all + (setq eshell-directory-name + (let ((dir (concat doom-private-dir "eshell"))) + (if (file-directory-p dir) + dir + "~/.eshell")) + eshell-scroll-to-bottom-on-input 'all eshell-scroll-to-bottom-on-output 'all eshell-buffer-shorthand t eshell-kill-processes-on-exit t From 7122a3e01b8985620d4d06f6ee215b7df87fa578 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 02:29:04 +0200 Subject: [PATCH 1229/4235] ui/evil-goggles: enable evil-goggles-mode on load --- modules/ui/evil-goggles/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index dec761c00..ad71a0ebd 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -7,4 +7,6 @@ (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow evil-goggles-enable-delete t - evil-goggles-enable-change nil)) + evil-goggles-enable-change nil) + :config + (evil-goggles-mode +1)) From 1320d838341eee8bc2e33fe04387a35fc57e4de1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 02:33:19 +0200 Subject: [PATCH 1230/4235] Fix doom/info displaying nil module flags --- core/autoload/util.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/util.el b/core/autoload/util.el index 03b21b71a..2500df78b 100644 --- a/core/autoload/util.el +++ b/core/autoload/util.el @@ -159,9 +159,9 @@ ready to be pasted in a bug report on github." do (setq cat (car key)) and collect cat else collect (let ((flags (doom-module-get cat (cdr key) :flags))) - (if (equal flags '(t)) - (cdr key) - (list (cdr key) flags)))) + (if flags + `(,(cdr key) ,@flags) + (cdr key)))) "n/a") (or (let (packages) (ignore-errors From 9a2c4f297c2178d85cddd1389b4645ff6e6eb2c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 03:24:30 +0200 Subject: [PATCH 1231/4235] Fix void macro errors after byte-compiling --- modules/config/default/config.el | 7 ++++--- modules/lang/org/config.el | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 0937f87fc..6d5ba386b 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -76,10 +76,11 @@ (defvar +default-repeat-forward-key ";") (defvar +default-repeat-backward-key ",") - (eval-and-compile - ;; Makes ; and , the universal repeat-keys in evil-mode + (eval-when-compile (defmacro do-repeat! (command next-func prev-func) - "Repeat motions with ;/," + "Makes ; and , the universal repeat-keys in evil-mode. These keys can be +customized by changing `+default-repeat-forward-key' and +`+default-repeat-backward-key'." (let ((fn-sym (intern (format "+evil*repeat-%s" (doom-unquote command))))) `(progn (defun ,fn-sym (&rest _) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 70e1f2c05..5dffd23fd 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -206,15 +206,16 @@ unfold to point on startup." (unless (file-remote-p path) (if (file-exists-p path) 'org-link 'error)))) - (defmacro def-org-file-link! (key dir) - `(org-link-set-parameters - ,key - :complete (lambda () (+org--relpath (+org-link-read-file ,key ,dir) ,dir)) - :follow (lambda (link) (find-file (expand-file-name link ,dir))) - :face (lambda (link) - (if (file-exists-p (expand-file-name link ,dir)) - 'org-link - 'error)))) + (eval-when-compile + (defmacro def-org-file-link! (key dir) + `(org-link-set-parameters + ,key + :complete (lambda () (+org--relpath (+org-link-read-file ,key ,dir) ,dir)) + :follow (lambda (link) (find-file (expand-file-name link ,dir))) + :face (lambda (link) + (if (file-exists-p (expand-file-name link ,dir)) + 'org-link + 'error))))) (def-org-file-link! "org" +org-dir) (def-org-file-link! "doom" doom-emacs-dir) From 9ac15aa0c15867283ec05e3008bbf95f7b288ee6 Mon Sep 17 00:00:00 2001 From: Benjamin Reynolds Date: Mon, 14 May 2018 20:19:22 -0500 Subject: [PATCH 1232/4235] Add [slim-mode] to :lang web +html [slim-mode]: https://github.com/slim-template/emacs-slim --- modules/lang/web/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index 226a2a2ec..f89e975d7 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -12,6 +12,7 @@ (package! emmet-mode) (package! haml-mode) (package! pug-mode) +(package! slim-mode) (package! web-mode) (when (featurep! :completion company) (package! company-web)) From 94f9e43f2574d4addb6106ea88622ed49ed21696 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 10:46:41 +0200 Subject: [PATCH 1233/4235] Rewrite :defer semantics :defer now supports a hook, a cons cell with (SYMBOL . INTEGER) where SYMBOL is a hook and INTEGER is a number of idle seconds before the package is autoloaded, or just the integer (as per the default behavior of :defer). Also fixes an issue where switch-buffer-deffered packages (like smartparens) wouldn't load. --- core/core-editor.el | 12 ++++++------ core/core-packages.el | 19 +++++++------------ core/core-ui.el | 4 ++-- core/core.el | 3 +-- modules/completion/company/config.el | 2 +- modules/completion/helm/config.el | 2 +- modules/completion/ivy/config.el | 2 +- modules/feature/evil/config.el | 4 ++-- modules/ui/evil-goggles/config.el | 2 +- 9 files changed, 22 insertions(+), 28 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 891a70ff0..ec4252391 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -70,14 +70,14 @@ fundamental-mode) for performance sake." ;; revert buffers for changed files (def-package! autorevert - :defer buffer + :defer doom-after-switch-buffer-hook :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) ;; persist variables across sessions (def-package! savehist - :defer (input . 1) + :defer (pre-command-hook . 1) :config (setq savehist-file (concat doom-cache-dir "savehist") savehist-save-minibuffer-history t @@ -87,7 +87,7 @@ fundamental-mode) for performance sake." ;; persistent point location in buffers (def-package! saveplace - :defer buffer + :defer doom-after-switch-buffer-hook :config (setq save-place-file (concat doom-cache-dir "saveplace")) (defun doom*recenter-on-load-saveplace (&rest _) @@ -99,7 +99,7 @@ fundamental-mode) for performance sake." ;; Keep track of recently opened files (def-package! recentf - :defer (input . 1) + :defer (pre-command-hook . 1) :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") @@ -131,7 +131,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :defer (buffer . 2) + :defer doom-after-switch-buffer-hook :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil @@ -150,7 +150,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :defer input + :defer pre-command-hook :config (global-undo-tree-mode +1) ;; persistent undo history is known to cause undo history corruption, which diff --git a/core/core-packages.el b/core/core-packages.el index e3234a278..42b962710 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -247,7 +247,8 @@ FORCE-P is non-nil, do it anyway. (cl-pushnew doom-core-dir load-path :test #'string=) (add-hook 'doom-internal-init-hook #'doom|refresh-cache)) (when doom-debug-mode - (message "Doom initialized"))) + (message "Doom initialized")) + (setq doom-init-p t)) ;; initialize Doom core (require 'core-lib) (require 'core-os) @@ -255,13 +256,7 @@ FORCE-P is non-nil, do it anyway. (require 'core-ui) (require 'core-editor) (require 'core-projects) - (require 'core-keybinds)) - ;; load input-deferred packages on first `pre-command-hook' - (add-transient-hook! 'pre-command-hook - (mapc #'require (cdr (assq 'input doom-deferred-packages)))) - (add-transient-hook! 'doom-after-switch-buffer-hook - (when (get-buffer-window) - (mapc #'require (cdr (assq 'buffer doom-deferred-packages)))))) + (require 'core-keybinds))) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run @@ -475,11 +470,11 @@ MODULES is an malformed plist of modules to load." (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) `(progn ,(when-let* ((defer (plist-get plist :defer)) - (type (or (car-safe defer) defer))) + (value (or (car-safe defer) defer))) (setq plist (plist-put plist :defer (or (cdr-safe defer) t))) - (when (and (not doom-init-p) - (assq type doom-deferred-packages)) - `(push ',name (cdr (assq ',type doom-deferred-packages))))) + (unless (or (memq value '(t nil)) + (number-or-marker-p value)) + `(add-transient-hook! ',value (require ',name)))) (use-package ,name ,@plist)))) (defmacro def-package-hook! (package when &rest body) diff --git a/core/core-ui.el b/core/core-ui.el index 758d98827..a7e61093c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -281,13 +281,13 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; undo/redo changes to Emacs' window layout (def-package! winner - :defer buffer + :defer doom-after-switch-buffer-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) ;; highlight matching delimiters (def-package! paren - :defer input + :defer pre-command-hook :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t diff --git a/core/core.el b/core/core.el index afd720562..3037bf2c7 100644 --- a/core/core.el +++ b/core/core.el @@ -173,8 +173,7 @@ this, you'll get stuttering and random freezes) and resets `file-name-handler-alist'." (unless noninteractive (run-hooks 'doom-init-hook)) - (setq doom-init-p t - file-name-handler-alist doom--file-name-handler-alist + (setq file-name-handler-alist doom--file-name-handler-alist gc-cons-threshold 16777216 gc-cons-percentage 0.15)) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index efc730586..12a1f352b 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -48,7 +48,7 @@ MODES should be one major-mode symbol or a list of them." (def-package! company :when (featurep! +auto) - :defer input + :defer pre-command-hook :config (setq company-idle-delay 0.2)) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index d407459f2..b515bb28e 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -11,7 +11,7 @@ ;; (def-package! helm-mode - :defer (input . 1) + :defer (pre-command-hook . 1) :config (helm-mode +1) ;; helm is too heavy for find-file-at-point diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index eb60b5789..e0f123bbc 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -24,7 +24,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; (def-package! ivy - :defer input + :defer (pre-command-hook . 1) :config (setq ivy-height 12 ivy-do-completion-in-region nil diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index c2ca114cc..b778d5961 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -23,7 +23,7 @@ (def-package! evil-collection :when (featurep! +everywhere) - :defer input + :defer pre-command-hook :preface ;; must be set before evil/evil-collcetion is loaded (setq evil-want-integration nil @@ -325,7 +325,7 @@ the new algorithm is confusing, like in python or ruby." (def-package! evil-snipe :commands (evil-snipe-mode evil-snipe-override-mode evil-snipe-local-mode evil-snipe-override-local-mode) - :defer input + :defer pre-command-hook :init (setq evil-snipe-smart-case t evil-snipe-scope 'line diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index ad71a0ebd..1a17d0ebe 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -2,7 +2,7 @@ (def-package! evil-goggles :when (featurep! :feature evil) - :defer input + :defer pre-command-hook :init (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow From a6c6686628c6e5696768d5876202bb36af408dd5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 10:48:42 +0200 Subject: [PATCH 1234/4235] Enable global-undo-tree-mode after setting variables --- core/core-editor.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index ec4252391..e4d9b72e4 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -152,12 +152,12 @@ fundamental-mode) for performance sake." (def-package! undo-tree :defer pre-command-hook :config - (global-undo-tree-mode +1) ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! (setq undo-tree-auto-save-history nil undo-tree-history-directory-alist - (list (cons "." (concat doom-cache-dir "undo-tree-hist/"))))) + (list (cons "." (concat doom-cache-dir "undo-tree-hist/")))) + (global-undo-tree-mode +1)) ;; From 032203ef99d05e1a1f1de113a5bed8c7f1755928 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 10:48:50 +0200 Subject: [PATCH 1235/4235] hscroll-margin = 2 So that moving to the ends of a sentence don't sometimes leave the cursor beyond the edge of the screen in GUI Emacs. --- core/core-editor.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-editor.el b/core/core-editor.el index e4d9b72e4..9aa4aae96 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -27,6 +27,7 @@ modes are active and the buffer is read-only.") hscroll-step 1 scroll-conservatively 1001 scroll-margin 0 + hscroll-margin 2 scroll-preserve-screen-position t ;; Whitespace (see `editorconfig') indent-tabs-mode nil From 984a0c8b6c562240d2e19e8b7f89ea9f84f04904 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 10:53:52 +0200 Subject: [PATCH 1236/4235] config/default: SPC h R = doom//reload --- modules/config/default/+bindings.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 6a5fb7b62..1dcf5aa5a 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -226,7 +226,8 @@ :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode :desc "Toggle profiler" :n "p" #'doom/toggle-profiler - :desc "Reload theme" :n "R" #'doom//reload-theme + :desc "Reload theme" :n "r" #'doom//reload-theme + :desc "Reload private config" :n "R" #'doom//reload :desc "Describe DOOM setting" :n "s" #'doom/describe-setting :desc "Describe variable" :n "v" #'describe-variable :desc "Print Doom version" :n "V" #'doom/version @@ -283,8 +284,7 @@ (:desc "quit" :prefix "q" :desc "Save and quit" :n "q" #'evil-save-and-quit :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit - :desc "Reload Doom Emacs" :n "r" #'doom//reload - :desc "Restart Doom Emacs" :n "R" #'restart-emacs) + :desc "Restart Doom Emacs" :n "r" #'restart-emacs) (:when (featurep! :tools upload) (:desc "remote" :prefix "r" From 70d0ce4528f7b24be0052528ce91332eecffedff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 11:23:44 +0200 Subject: [PATCH 1237/4235] Fix error when def-package-hook! was used anywhere --- core/core-packages.el | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 42b962710..9f596d614 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -99,7 +99,7 @@ and `auto-mode-alist'.") (defvar doom--current-module nil) (defvar doom--refreshed-p nil) -(defvar doom--stage nil) +(defvar doom--stage 'init) ;; (setq autoload-compute-prefixes nil @@ -447,8 +447,7 @@ MODULES is an malformed plist of modules to load." config-forms)))))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) - (let ((doom--stage 'init)) - ,@(nreverse init-forms)) + ,@(nreverse init-forms) (unless noninteractive (run-hooks 'doom-internal-init-hook) (let ((doom--stage 'config)) @@ -546,8 +545,9 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (if (file-directory-p module-path) `(condition-case-unless-debug ex (let ((doom--current-module ',(cons module submodule))) - (load! init ,module-path :noerror) - (load! config ,module-path :noerror)) + (load! init ,module-path :noerror) + (let ((doom--stage 'config)) + (load! config ,module-path :noerror))) ('error (lwarn 'doom-modules :error "%s in '%s %s' -> %s" @@ -676,8 +676,7 @@ loads MODULE SUBMODULE's packages.el file." "Reload your private Doom config. Experimental!" (interactive) (doom//reload-load-path) - (let ((doom--stage 'init)) - (load (concat doom-private-dir "init.el") nil nil 'nosuffix)) + (load (concat doom-private-dir "init.el") nil nil 'nosuffix) (let ((doom--stage 'config)) (load (concat doom-private-dir "config.el") nil nil 'nosuffix)) (message "Private config reloaded")) From 86b6fab18ea56122cbbd3b77fd98b91977ca30ed Mon Sep 17 00:00:00 2001 From: "Liu, Joey" Date: Tue, 15 May 2018 09:06:25 -0400 Subject: [PATCH 1238/4235] Add: ace-link-mu4e autoload --- 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 9aa4aae96..24c782b2c 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -166,7 +166,7 @@ fundamental-mode) for performance sake." ;; (def-package! ace-link - :commands (ace-link-help ace-link-org ace-link-addr)) + :commands (ace-link-help ace-link-org ace-link-addr ace-link-mu4e)) (def-package! avy :commands (avy-goto-char-2 avy-goto-line) From e38560252bfe6be228bbac1bfb05dafc94896071 Mon Sep 17 00:00:00 2001 From: Benjamin Reynolds Date: Tue, 15 May 2018 09:40:44 -0500 Subject: [PATCH 1239/4235] Fix typo causing startup error in helm modules It looks like an extra letter snuck into a `nil` in 67dab98. This is causing a startup error on develop. --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index b515bb28e..b4e6c5282 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -15,7 +15,7 @@ :config (helm-mode +1) ;; helm is too heavy for find-file-at-point - (map-put helm-completing-read-handlers-alist 'find-file-at-point nilk)) + (map-put helm-completing-read-handlers-alist 'find-file-at-point nil)) (def-package! helm From 7eb0dd634083caefb0d1bd62cdd0c5967b817e9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 11:43:01 +0200 Subject: [PATCH 1240/4235] lang/python: remove redundant pip-requirements config The auto-mode-alist entry is already set up by pip-requirements-autoloads. --- modules/lang/python/config.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index dde74c473..4c7d62bd8 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -112,10 +112,6 @@ environment variables." :nv "u" #'anaconda-mode-find-references)) -(def-package! pip-requirements - :mode ("/requirements.txt$" . pip-requirements-mode)) - - (def-package! nose :commands nose-mode :preface From 06c22a5af271ca977bb4096913fcfe74c56126b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:28:39 +0200 Subject: [PATCH 1241/4235] ui/doom-dashboard: add vertical centering (experimental) --- modules/ui/doom-dashboard/config.el | 45 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 220f9747f..841235faf 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -115,6 +115,7 @@ Possible values: (defun +doom-dashboard|init () "Initializes Doom's dashboard." (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) + (add-hook 'window-size-change-functions #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) (unless (daemonp) @@ -146,12 +147,35 @@ If this is the dashboard buffer, reload the dashboard." whose dimensions may not be fully initialized by the time this is run." (run-with-timer 0.1 nil #'+doom-dashboard/open frame)) -(defun +doom-dashboard|resize () - "Resize the margins and fringes on 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))))) +(defun +doom-dashboard|resize (&rest _) + "Recenter the dashboard, and reset its margins and fringes." + (let ((windows (get-buffer-window-list (doom-fallback-buffer) nil t))) + (dolist (win windows) + (set-window-start win 0) + (set-window-fringes win 0 0) + (set-window-margins + win (max 0 (/ (- (window-total-width win) +doom-dashboard--width) 2)))) + (when windows + (with-current-buffer (doom-fallback-buffer) + (save-excursion + (with-silent-modifications + (goto-char (point-min)) + (cond ((display-graphic-p) + (delete-region (line-beginning-position) (1+ (line-end-position))) + (insert (propertize + (char-to-string ?\uE001) + 'display `((space :align-to 0 + :height ,(max 0 (- (/ (window-height (get-buffer-window)) 2) + (/ (count-lines (point-min) (point-max)) 2.5)))))) + "\n")) + (t + (while (string-empty-p (buffer-substring-no-properties (line-beginning-position) (line-end-position))) + (delete-region (line-beginning-position) (1+ (line-end-position)))) + (insert + "\n" + (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) + (/ (count-lines (point-min) (point-max)) 2))) + ?\n)))))))))) (defun +doom-dashboard|detect-project (&rest _) "Check for a `last-project-root' parameter in the perspective, and set the @@ -212,13 +236,10 @@ controlled by `+doom-dashboard-pwd-policy'." (unless (eq major-mode '+doom-dashboard-mode) (+doom-dashboard-mode)) (erase-buffer) - (save-excursion (mapc #'funcall +doom-dashboard-functions)) - (insert - (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) - (/ (count-lines (point-min) (point-max)) 2))) - ?\n)))) - (+doom-dashboard|detect-project) + (insert "\n") + (run-hooks '+doom-dashboard-functions))) (+doom-dashboard|resize) + (+doom-dashboard|detect-project) (+doom-dashboard-update-pwd) (current-buffer)))) From af079e5f6f31448faacb29ee733e4ca6854c2c9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:32:09 +0200 Subject: [PATCH 1242/4235] Remove unused doom-deferred-packages variable --- core/core-packages.el | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 9f596d614..07fa244d1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -73,17 +73,6 @@ missing) and shouldn't be deleted.") (defvar doom-disabled-packages () "A list of packages that should be ignored by `def-package!'.") -(defvar doom-deferred-packages - '((input) - (buffer)) - "A alist of packages that have been deferred. The CAR is the type of deferral -for the package, the CDR is the list of packages. - - input will be loaded on the first action the user invokes - after startup. - buffer will be loaded on the first new buffer to be opened - interactively.") - (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload-load-path' is called.") From 6b8520d18981fe1d372351a11982125c0338877a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:40:18 +0200 Subject: [PATCH 1243/4235] Change add-transient-hook! to take hook suffix as 2nd arg By default, transient hooks are defined as doom-transient-hook-N, where N is a counter. This makes debugging them difficult. Now, you may specify an id for the second argument. e.g. (add-transient-hook! 'find-file-hook load-evil (require 'evil)) Will define doom|transient-hook-load-evil, which is easier to debug and remove, if necessary. --- core/core-lib.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 305aeeb13..e5b953295 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -110,9 +110,12 @@ invoked, then never again. HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." (declare (indent 1)) - (let ((append (eq (car forms) :after)) - (fn (intern (format "doom-transient-hook-%s" (cl-incf doom--transient-counter))))) - `(when ,hook + (let ((append (if (eq (car forms) :after) (pop forms))) + (fn (intern (format "doom|transient-hook-%s" + (if (not (symbolp (car forms))) + (cl-incf doom--transient-counter) + (pop forms)))))) + `(progn (fset ',fn (lambda (&rest _) ,@forms From 97b8c04dbbcb893eb0df0c869762e1dea3d3702b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:42:17 +0200 Subject: [PATCH 1244/4235] def-package!: specify id for deferred-load transient hooks Makes them easier to identify in hook lists. --- core/core-packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 07fa244d1..d43c186e5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -462,7 +462,9 @@ MODULES is an malformed plist of modules to load." (setq plist (plist-put plist :defer (or (cdr-safe defer) t))) (unless (or (memq value '(t nil)) (number-or-marker-p value)) - `(add-transient-hook! ',value (require ',name)))) + `(add-transient-hook! ',value + ,(intern (format "load-%s" name)) + (require ',name)))) (use-package ,name ,@plist)))) (defmacro def-package-hook! (package when &rest body) From c36e127ec56e521c1be7b739e991a9e09ed259f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:42:52 +0200 Subject: [PATCH 1245/4235] Rethink core package deferral hooks Ensure they are available exactly when they can be useful, but no sooner. --- core/core-editor.el | 8 ++++---- core/core-ui.el | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 24c782b2c..844863ba2 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -71,7 +71,7 @@ fundamental-mode) for performance sake." ;; revert buffers for changed files (def-package! autorevert - :defer doom-after-switch-buffer-hook + :defer doom-before-switch-buffer-hook :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) @@ -88,7 +88,7 @@ fundamental-mode) for performance sake." ;; persistent point location in buffers (def-package! saveplace - :defer doom-after-switch-buffer-hook + :defer doom-before-switch-buffer-hook :config (setq save-place-file (concat doom-cache-dir "saveplace")) (defun doom*recenter-on-load-saveplace (&rest _) @@ -132,7 +132,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :defer doom-after-switch-buffer-hook + :defer doom-before-switch-buffer-hook :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil @@ -151,7 +151,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :defer pre-command-hook + :defer doom-after-switch-buffer-hook :config ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! diff --git a/core/core-ui.el b/core/core-ui.el index a7e61093c..9ab5ad7c8 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -281,13 +281,13 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; undo/redo changes to Emacs' window layout (def-package! winner - :defer doom-after-switch-buffer-hook + :defer doom-before-switch-window-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) ;; highlight matching delimiters (def-package! paren - :defer pre-command-hook + :defer doom-before-switch-buffer-hook :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t From fd16719324429be0bb64f858db0886afc730e9a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:50:58 +0200 Subject: [PATCH 1246/4235] lang/{python,ruby}: add doctor.el --- modules/lang/python/doctor.el | 8 ++++++++ modules/lang/ruby/doctor.el | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 modules/lang/python/doctor.el create mode 100644 modules/lang/ruby/doctor.el diff --git a/modules/lang/python/doctor.el b/modules/lang/python/doctor.el new file mode 100644 index 000000000..89aeb9e68 --- /dev/null +++ b/modules/lang/python/doctor.el @@ -0,0 +1,8 @@ +;;; lang/python/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "python") + (warn! "Python isn't installed.")) + +(when (executable-find "pyenv") + (unless (split-string (shell-command-to-string "pyenv versions --bare") "\n" t) + (warn! "No versions of python are available via pyenv, did you forget to install one?"))) diff --git a/modules/lang/ruby/doctor.el b/modules/lang/ruby/doctor.el new file mode 100644 index 000000000..7050b4f28 --- /dev/null +++ b/modules/lang/ruby/doctor.el @@ -0,0 +1,8 @@ +;;; lang/ruby/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "ruby") + (warn! "Ruby isn't installed.")) + +(when (executable-find "rbenv") + (unless (split-string (shell-command-to-string "rbenv versions --bare") "\n" t) + (warn! "No versions of ruby are available via rbenv, did you forget to install one?"))) From 12013b4ad4168d8d4251648a6e8e445c759397e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 13:53:46 +0200 Subject: [PATCH 1247/4235] Cache interpreter-mode-alist in doom-packages-file too --- core/core-packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-packages.el b/core/core-packages.el index d43c186e5..61c796575 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -156,6 +156,7 @@ and `auto-mode-alist'.") (prin1 `(setq load-path ',load-path Info-directory-list ',Info-directory-list auto-mode-alist ',auto-mode-alist + interpreter-mode-alist ',interpreter-mode-alist doom-disabled-packages ',doom-disabled-packages package-activated-list ',package-activated-list) (current-buffer))))) From 7c97fd3c73598d527b0484ef06a01f69822d1e51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 21:52:09 +0200 Subject: [PATCH 1248/4235] Load smartparens a little sooner (fix sp-with-modes error) --- 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 844863ba2..96527c073 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -132,7 +132,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :defer doom-before-switch-buffer-hook + :defer pre-command-hook :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil From 8428a7a4efaac62e7f0fac3083c2b37a8d3f9d1e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 22:07:44 +0200 Subject: [PATCH 1249/4235] Autoload smartparens library --- core/core-editor.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-editor.el b/core/core-editor.el index 96527c073..c2baf18c4 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -133,6 +133,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens :defer pre-command-hook + :commands (sp-pair sp-local-pair sp-with-modes) :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil From 18e6a6b1dbd25775270bd26c93811d25e3eafc25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 22:17:41 +0200 Subject: [PATCH 1250/4235] Include package autoloads in doom-autoloads-file This offloads some of the work Doom has to do creating `doom-packages-file` onto `make autoloads`. This closely mimics the package-quickstart-refresh functionality in Emacs 27+, but is more specialized. This means package autoloads are now loaded on every startup. Many :mode, :interpreter, and :commands declarations in def-package! blocks are made redundant by this and will be cleaned up soon. --- core/core-packages.el | 70 +++++++++++++++++++------------------------ core/core.el | 4 --- 2 files changed, 31 insertions(+), 43 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 61c796575..78c050d0b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -148,15 +148,11 @@ and `auto-mode-alist'.") "Refresh `doom-packages-file', which caches `load-path', `Info-directory-list', `doom-disabled-packages', `auto-mode-alist' and `package-activated-list'." - (doom-initialize-packages 'internal) (let ((coding-system-for-write 'emacs-internal)) (with-temp-file doom-packages-file (insert ";;; -*- lexical-binding:t -*-\n" ";; This file was autogenerated by `doom|refresh-cache', DO NOT EDIT!\n") - (prin1 `(setq load-path ',load-path - Info-directory-list ',Info-directory-list - auto-mode-alist ',auto-mode-alist - interpreter-mode-alist ',interpreter-mode-alist + (prin1 `(setq Info-directory-list ',Info-directory-list doom-disabled-packages ',doom-disabled-packages package-activated-list ',package-activated-list) (current-buffer))))) @@ -198,6 +194,7 @@ FORCE-P is non-nil, do it anyway. (require 'subr-x) (require 'cl-lib) (require 'map)) + (cl-pushnew doom-core-dir load-path :test #'string=) (when (or force-p (not doom-init-p)) ;; autoloads file (unless (load doom-autoload-file 'noerror 'nomessage 'nosuffix) @@ -234,9 +231,8 @@ FORCE-P is non-nil, do it anyway. (message "✓ Installed %s" package) (error "✕ Couldn't install %s" package))) (message "Installing core packages...done"))) - (cl-pushnew doom-core-dir load-path :test #'string=) - (add-hook 'doom-internal-init-hook #'doom|refresh-cache)) - (when doom-debug-mode + ;; Cache important packages.el state + (doom|refresh-cache) (message "Doom initialized")) (setq doom-init-p t)) ;; initialize Doom core @@ -439,7 +435,6 @@ MODULES is an malformed plist of modules to load." (setq doom-modules ',doom-modules) ,@(nreverse init-forms) (unless noninteractive - (run-hooks 'doom-internal-init-hook) (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir @@ -770,44 +765,41 @@ This should be run whenever init.el or an autoload file is modified. Running (load-path (append (list doom-emacs-dir) doom-psuedo-module-dirs doom-modules-dirs - load-path)) - current-sexp) + load-path))) (unwind-protect (condition-case-unless-debug ex (with-current-buffer buf + (delay-mode-hooks (emacs-lisp-mode)) (goto-char (point-min)) - (while (re-search-forward "^\\s-*(" nil t) - (unless (or (nth 4 (syntax-ppss)) - (nth 3 (syntax-ppss))) - ;; Replace autoload paths with absolute paths for faster - ;; resolution during load and simpler `load-path' - (when (memq (sexp-at-point) '(autoload custom-autoload)) - (save-excursion - (forward-sexp 2) - (let ((pt (point))) - (forward-sexp 1) - (when-let* ((sexp (thing-at-point 'sexp t)) - (path (eval (read sexp) t))) - (when (and (stringp path) (not (file-name-absolute-p path))) - (delete-region pt (point)) - (if-let* ((lib (locate-library path))) - (insert " \"" (file-name-sans-extension lib) "\"") - (warn "Couldn't find absolute path for: %s" path))))))) - ;; Run each form in autoloads to see if there are any - ;; errors. We do it piecemeal because that will tell us - ;; more about where the issue originated. - (save-excursion - (backward-char) - (setq current-sexp (read (thing-at-point 'sexp t))) - (eval current-sexp t)) - (forward-char))) + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") + ;; insert package autoloads + (dolist (file (doom-packages--files doom-packages-dir "-autoloads\\.el$")) + (when doom-debug-mode + (message "⚠ Including %s" (file-relative-name file package-user-dir))) + (let ((pfile (prin1-to-string file))) + (insert "\n(let ((load-file-name " pfile "))") + (insert-file-contents file) + (while (re-search-forward "#\\$\\|^;\\(.*\n\\)" nil 'move) + (unless (nth 8 (syntax-ppss)) + (replace-match (if (match-end 1) "" pfile) t t))) + (unless (bolp) (insert "\n")) + (insert ")\n"))) + (message "✓ Package autoloads included") + + (goto-char (point-max)) + (insert " +;; Local\sVariables: +;; version-control: never +;; no-byte-compile: t +;; no-update-autoloads: t +;; End:\n") + (eval-buffer buf) (save-buffer) (message "Done!")) ('error (delete-file doom-autoload-file) - (error "Error in autoloads.el: (%s %s ...) %s -- %s" - (nth 0 current-sexp) - (nth 1 current-sexp) + (error "Error in autoloads.el: %s -- %s" (car ex) (error-message-string ex)))) (kill-buffer buf)))))) diff --git a/core/core.el b/core/core.el index 3037bf2c7..1c80302ca 100644 --- a/core/core.el +++ b/core/core.el @@ -107,10 +107,6 @@ XDG directory conventions if ~/.config/doom exists.") (defvar doom-init-hook nil "A list of hooks run when DOOM is initialized.") -(defvar doom-internal-init-hook nil - "Hooks run after Doom has loaded all init.el files, and is ready to load -modules.") - ;; ;; Emacs fixes/hacks From 4734d55edc9c759b69bb7cee5a2cbfaab2886331 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 22:19:25 +0200 Subject: [PATCH 1251/4235] Revert smartparens deferral until first before-switch-buffer --- core/core-editor.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index c2baf18c4..844863ba2 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -132,8 +132,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :defer pre-command-hook - :commands (sp-pair sp-local-pair sp-with-modes) + :defer doom-before-switch-buffer-hook :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil From b6813393d840e9e246888deecf5f0e279e68ec64 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 22:24:27 +0200 Subject: [PATCH 1252/4235] Remove custom helpful pretty-printer; default is superior --- core/autoload/help.el | 12 ------------ core/core-editor.el | 4 +--- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index d5e690a26..202b49980 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -102,18 +102,6 @@ in, or d) the module associated with the current major mode (see (error "There is no documentation for this module")) (find-file doc-path)))) -;;;###autoload -(defun doom*fix-helpful-prettyprint (value) - "TODO" - (with-temp-buffer - (delay-mode-hooks (emacs-lisp-mode)) - (pp value (current-buffer)) - (unless (or (symbolp value) (booleanp value) (keymapp value)) - (unless (hash-table-p value) - (fill-region (point-min) (point-max))) - (quiet! (indent-region (point-min) (point-max)))) - (string-trim (buffer-string)))) - ;;;###autoload (defun doom/version () "Display the current version of Doom & Emacs, including the current Doom diff --git a/core/core-editor.el b/core/core-editor.el index 844863ba2..0a7b1ec3d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -199,9 +199,7 @@ fundamental-mode) for performance sake." (global-set-key [remap describe-function] #'helpful-callable) (global-set-key [remap describe-command] #'helpful-command) (global-set-key [remap describe-variable] #'helpful-variable) - (global-set-key [remap describe-key] #'helpful-key) - - (advice-add #'helpful--pretty-print :override #'doom*fix-helpful-prettyprint)) + (global-set-key [remap describe-key] #'helpful-key)) (def-package! pcre2el :commands rxt-quote-pcre) From 09ecce00736da52a32df9baf1fce690be8d6e324 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 23:10:48 +0200 Subject: [PATCH 1253/4235] Fix package! :disable not disabling packages --- 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 78c050d0b..8330863f0 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -148,6 +148,7 @@ and `auto-mode-alist'.") "Refresh `doom-packages-file', which caches `load-path', `Info-directory-list', `doom-disabled-packages', `auto-mode-alist' and `package-activated-list'." + (doom-initialize-packages 'internal) (let ((coding-system-for-write 'emacs-internal)) (with-temp-file doom-packages-file (insert ";;; -*- lexical-binding:t -*-\n" @@ -230,19 +231,19 @@ FORCE-P is non-nil, do it anyway. (if (package-installed-p package) (message "✓ Installed %s" package) (error "✕ Couldn't install %s" package))) - (message "Installing core packages...done"))) - ;; Cache important packages.el state - (doom|refresh-cache) - (message "Doom initialized")) - (setq doom-init-p t)) + (message "Installing core packages...done"))))) ;; initialize Doom core (require 'core-lib) (require 'core-os) + (unless doom-init-p + ;; Cache important packages.el state + (doom|refresh-cache)) (unless noninteractive (require 'core-ui) (require 'core-editor) (require 'core-projects) - (require 'core-keybinds))) + (require 'core-keybinds)) + (setq doom-init-p t)) (defun doom-initialize-autoloads () "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run From 0dfe1bc3d5a34ce517c1fe2d7c19d697f00a699b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 23:11:48 +0200 Subject: [PATCH 1254/4235] Allow chained package!'s This allows users to disable one master package, thus disabling all its children. e.g. Disable irony, then irony-eldoc, flycheck-irony, company-irony and company-irony-c-headers will be disabled too. --- core/core-packages.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 8330863f0..b053356cc 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -597,7 +597,10 @@ Accepts the following properties: :ignore FORM Do not install this package. :freeze FORM - Do not update this package if FORM is non-nil." + Do not update this package if FORM is non-nil. + +Returns t if package is successfully registered, and nil if it was disabled +elsewhere." (declare (indent defun)) (doom--assert-stage-p 'packages #'package!) (cond ((memq name doom-disabled-packages) nil) @@ -623,7 +626,8 @@ Accepts the following properties: `(progn ,(when (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist)))))) + (map-put doom-packages ',name ',plist) + t))))) (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple From 9aa346f185c59feabc25013dfac6de39e3e3c233 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 23:13:06 +0200 Subject: [PATCH 1255/4235] Make packages! accept list of package names (non lists) This convenience macro lets you specify multiple packages with one block, e.g. (packages! rtags ivy-rtags glsl-mode) Each entry can be a full recipe. (packages! (rtags :disable t) (glsl-mode :recipe (...))) --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index b053356cc..c2175b9a5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -635,7 +635,7 @@ packages at once. Only use this macro in a module's packages.el file." (doom--assert-stage-p 'packages #'packages!) - `(progn ,@(cl-loop for desc in packages collect `(package! ,@desc)))) + `(progn ,@(cl-loop for desc in packages collect `(package! ,@(doom-enlist desc))))) (defmacro disable-packages! (&rest packages) "A convenience macro like `package!', but allows you to disable multiple From 1e004a56382a53fe4b67367a66c26993791a8090 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 23:14:54 +0200 Subject: [PATCH 1256/4235] Change undo-tree deferral to before switch buffer --- 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 0a7b1ec3d..35dea9fba 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -151,7 +151,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :defer doom-after-switch-buffer-hook + :defer doom-before-switch-buffer-hook :config ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! From 56a6d1faa369b2d26cc8337af0ec72d3f921f86b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 15 May 2018 23:15:57 +0200 Subject: [PATCH 1257/4235] Doctor: include origin in syntax error message --- bin/doom-doctor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 30d67989e..08899c919 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -310,7 +310,7 @@ (let ((doom--stage 'doctor)) (load doctor-file t t))))) ('error - (error! "Syntax error: %s" ex)))) + (error! "(%s %s) Syntax error: %s" (car key) (cdr key) ex)))) doom-modules))) ;; From 595109209ae2759ffef80f1055ca1d7d2d81ecd6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 00:09:44 +0200 Subject: [PATCH 1258/4235] Fix doom//reload & optimize make all task --- Makefile | 3 ++- core/core-packages.el | 39 ++++++++++++++++++++++++++------------- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 7df064626..f10eb7b5a 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,8 @@ DOOMI = $(subst --batch,,$(DOOM)) MODULES = $(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) -all: | autoloads autoremove install +all: + @$(DOOM) -f doom//refresh-packages ## Shortcuts a: autoloads diff --git a/core/core-packages.el b/core/core-packages.el index c2175b9a5..5cd77a920 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -89,6 +89,7 @@ and `auto-mode-alist'.") (defvar doom--current-module nil) (defvar doom--refreshed-p nil) (defvar doom--stage 'init) +(defvar doom--inhibit-reload nil) ;; (setq autoload-compute-prefixes nil @@ -667,11 +668,12 @@ loads MODULE SUBMODULE's packages.el file." (defun doom//reload () "Reload your private Doom config. Experimental!" (interactive) - (doom//reload-load-path) + (message "Reloading your private config...") (load (concat doom-private-dir "init.el") nil nil 'nosuffix) + (doom-packages--async-run #'doom//refresh-packages) (let ((doom--stage 'config)) (load (concat doom-private-dir "config.el") nil nil 'nosuffix)) - (message "Private config reloaded")) + (message "✓ Done!")) (defun doom-packages--read-if-cookies (file) "Returns the value of the ;;;###if predicate form in FILE." @@ -706,17 +708,18 @@ an Emacs session is running. This isn't necessary if you use Doom's package management commands because they call `doom//reload-load-path' remotely (through emacsclient)." (interactive) - (when (file-exists-p doom-packages-file) - (delete-file doom-packages-file)) - (cond ((and noninteractive (not (daemonp))) - (require 'server) - (when (server-running-p) - (message "Reloading active Emacs session...") - (server-eval-at server-name '(doom//reload-load-path)))) - (t - (doom-initialize t) - (message "%d packages reloaded" (length package-alist)) - (run-hooks 'doom-reload-hook)))) + (unless doom--inhibit-reload + (when (file-exists-p doom-packages-file) + (delete-file doom-packages-file)) + (cond ((and noninteractive (not (daemonp))) + (require 'server) + (when (server-running-p) + (message "Reloading active Emacs session...") + (server-eval-at server-name '(doom//reload-load-path)))) + (t + (doom-initialize t) + (message "%d packages reloaded" (length package-alist)) + (run-hooks 'doom-reload-hook))))) (defvar generated-autoload-load-name) (defun doom//reload-autoloads () @@ -957,6 +960,16 @@ compiled packages.'" (abbreviate-file-name path)))) (message "Everything is clean"))) +(defun doom//refresh-packages () + "Runs `doom//reload-autoloads', `doom//packages-autoremove' and +`doom//packages-install' before reloading your Emacs session." + (interactive) + (let ((doom--inhibit-reload t)) + (doom//reload-autoloads) + (doom//packages-autoremove) + (doom//packages-install)) + (doom//reload-load-path)) + ;; ;; Make package.el cooperate with Doom From e7a1e0b4a2f05cf95c5ab2af84b9eb2f08ee8149 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 00:10:04 +0200 Subject: [PATCH 1259/4235] Improve interactive package management support --- core/autoload/packages.el | 224 +++++++++++++++++++------------------- 1 file changed, 115 insertions(+), 109 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 9d567b26a..4b2cd8b44 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -335,134 +335,140 @@ package.el as appropriate." (defun doom//packages-install () "Interactive command for installing missing packages." (interactive) - (message! "Looking for packages to install...") - (let ((packages (reverse (doom-get-missing-packages)))) - (cond ((not packages) - (message! (green "No packages to install!"))) + (if (not noninteractive) + (doom-packages--async-run 'doom//packages-install) + (message! "Looking for packages to install...") + (let ((packages (reverse (doom-get-missing-packages)))) + (cond ((not packages) + (message! (green "No packages to install!"))) - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be installed:\n\n%s\n\nProceed?" - (length packages) - (mapconcat - (lambda (pkg) - (format "+ %s (%s)" - (car pkg) - (cond ((doom-package-different-recipe-p (car pkg)) - "new recipe") - ((doom-package-different-backend-p (car pkg)) - (if (plist-get (cdr pkg) :recipe) - "ELPA -> QUELPA" - "QUELPA -> ELPA")) - ((plist-get (cdr pkg) :recipe) - "QUELPA") - (t - "ELPA")))) - (sort (cl-copy-list packages) #'doom--sort-alpha) - "\n"))))) - (message! (yellow "Aborted!"))) + ((not (or (getenv "YES") + (y-or-n-p + (format "%s packages will be installed:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (pkg) + (format "+ %s (%s)" + (car pkg) + (cond ((doom-package-different-recipe-p (car pkg)) + "new recipe") + ((doom-package-different-backend-p (car pkg)) + (if (plist-get (cdr pkg) :recipe) + "ELPA -> QUELPA" + "QUELPA -> ELPA")) + ((plist-get (cdr pkg) :recipe) + "QUELPA") + (t + "ELPA")))) + (sort (cl-copy-list packages) #'doom--sort-alpha) + "\n"))))) + (message! (yellow "Aborted!"))) - (t - (doom-refresh-packages-maybe doom-debug-mode) - (dolist (pkg packages) - (message! "Installing %s" (car pkg)) - (doom--condition-case! - (message! "%s%s" - (cond ((and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg))) - (not (doom-package-different-recipe-p (car pkg)))) - (dark (white "⚠ ALREADY INSTALLED"))) - ((doom-install-package (car pkg) (cdr pkg)) - (green "✓ DONE")) - (t - (red "✕ FAILED"))) - (if (plist-member (cdr pkg) :pin) - (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) - "")))) + (t + (doom-refresh-packages-maybe doom-debug-mode) + (dolist (pkg packages) + (message! "Installing %s" (car pkg)) + (doom--condition-case! + (message! "%s%s" + (cond ((and (package-installed-p (car pkg)) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg)))) + (dark (white "⚠ ALREADY INSTALLED"))) + ((doom-install-package (car pkg) (cdr pkg)) + (green "✓ DONE")) + (t + (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 () "Interactive command for updating packages." (interactive) - (message! "Looking for outdated packages...") - (doom-refresh-packages-maybe doom-debug-mode) - (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) - (cond ((not packages) - (message! (green "Everything is up-to-date"))) + (if (not noninteractive) + (doom-packages--async-run 'doom//packages-update) + (message! "Looking for outdated packages...") + (doom-refresh-packages-maybe doom-debug-mode) + (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) + (cond ((not packages) + (message! (green "Everything is up-to-date"))) - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be updated:\n\n%s\n\nProceed?" - (length packages) - (let ((max-len - (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) - (lambda (it other) (> it other)))) - 10))) - (mapconcat - (lambda (pkg) - (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) - (symbol-name (car pkg)) - (package-version-join (cadr pkg)) - (package-version-join (cl-caddr pkg)))) - packages - "\n")))))) - (message! (yellow "Aborted!"))) + ((not (or (getenv "YES") + (y-or-n-p + (format "%s packages will be updated:\n\n%s\n\nProceed?" + (length packages) + (let ((max-len + (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) + (lambda (it other) (> it other)))) + 10))) + (mapconcat + (lambda (pkg) + (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) + (symbol-name (car pkg)) + (package-version-join (cadr pkg)) + (package-version-join (cl-caddr pkg)))) + packages + "\n")))))) + (message! (yellow "Aborted!"))) - (t - (dolist (pkg packages) - (message! "Updating %s" (car pkg)) - (doom--condition-case! - (message! - (let ((result (doom-update-package (car pkg) t))) - (color (if result 'green 'red) - (if result "✓ DONE" "✕ FAILED")))))) + (t + (dolist (pkg packages) + (message! "Updating %s" (car pkg)) + (doom--condition-case! + (message! + (let ((result (doom-update-package (car pkg) t))) + (color (if result 'green 'red) + (if result "✓ DONE" "✕ FAILED")))))) - (message! (bold (green "Finished!"))) - (doom//reload-load-path))))) + (message! (bold (green "Finished!"))) + (doom//reload-load-path)))))) ;;;###autoload (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"))) + (if (not noninteractive) + (doom-packages--async-run 'doom//packages-autoremove) + (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") - (upcase (symbol-name backend)))))) - (sort (cl-copy-list packages) #'string-lessp) - "\n"))))) - (message! (yellow "Aborted!"))) + ((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 - (dolist (pkg packages) - (doom--condition-case! - (message! - (let ((result (doom-delete-package pkg t))) - (color (if result 'green 'red) - "%s %s" - (if result "✓ Removed" "✕ Failed to remove") - pkg))))) + (t + (dolist (pkg packages) + (doom--condition-case! + (message! + (let ((result (doom-delete-package pkg t))) + (color (if result 'green 'red) + "%s %s" + (if result "✓ Removed" "✕ Failed to remove") + pkg))))) - (message! (bold (green "Finished!"))) - (doom//reload-load-path))))) + (message! (bold (green "Finished!"))) + (doom//reload-load-path)))))) ;; From 63fdc3530c6d2175e5b23ce6cc73741dd45336a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 00:16:05 +0200 Subject: [PATCH 1260/4235] lang/cc: refactor (nest configs and chain packages) Allows users to disable irony and/or rtags only, then their dependent packages won't be loaded. --- modules/lang/cc/config.el | 54 ++++++++++++++++++------------------- modules/lang/cc/packages.el | 29 ++++++++++---------- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 565dc5f49..0077083c1 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -136,22 +136,28 @@ compilation database is present in the project.") (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) + (add-hook 'c-mode-common-hook #'+cc|init-irony-mode) :config (setq irony-cdb-search-directory-list '("." "build" "build-conda")) ;; Initialize compilation database, if present. Otherwise, fall back on ;; `+cc-default-compiler-options'. - (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options)) + (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options) -(def-package! irony-eldoc - :hook (irony-mode . irony-eldoc)) + (def-package! irony-eldoc :hook (irony-mode . irony-eldoc)) -(def-package! flycheck-irony - :when (featurep! :feature syntax-checker) - :after irony - :config - (add-hook 'irony-mode-hook #'flycheck-mode) - (flycheck-irony-setup)) + (def-package! flycheck-irony + :when (featurep! :feature syntax-checker) + :config + (add-hook 'irony-mode-hook #'flycheck-mode) + (flycheck-irony-setup)) + + (def-package! company-irony + :when (featurep! :completion company) + :after irony) + + (def-package! company-irony-c-headers + :when (featurep! :completion company) + :after company-irony)) ;; @@ -193,14 +199,6 @@ compilation database is present in the project.") :when (featurep! :completion company) :after cmake-mode) -(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 @@ -213,7 +211,7 @@ compilation database is present in the project.") ;; (def-package! rtags - :commands (rtags-restart-process rtags-start-process-unless-running rtags-executable-find) + :commands rtags-executable-find :init (add-hook! (c-mode c++-mode) #'+cc|init-rtags) :config @@ -237,14 +235,14 @@ compilation database is present in the project.") (map! :map (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) - (add-hook 'rtags-after-find-file-hook #'recenter)) + (add-hook 'rtags-after-find-file-hook #'recenter) -(def-package! ivy-rtags - :when (featurep! :completion ivy) - :after rtags - :config (setq rtags-display-result-backend 'ivy)) + (def-package! ivy-rtags + :when (featurep! :completion ivy) + :after rtags + :config (setq rtags-display-result-backend 'ivy)) -(def-package! helm-rtags - :when (featurep! :completion helm) - :after rtags - :config (setq rtags-display-result-backend 'helm)) + (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 8151bc4fd..661fda6b3 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -5,22 +5,23 @@ (package! cuda-mode) (package! demangle-mode) (package! disaster) -(package! glsl-mode) -(package! irony) -(package! irony-eldoc) (package! modern-cpp-font-lock) (package! opencl-mode) -(when (featurep! :feature syntax-checker) - (package! flycheck-irony)) +(when (package! glsl-mode) + (when (featurep! :completion company) + (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")))) -(when (featurep! :completion company) - (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")) - (package! company-irony) - (package! company-irony-c-headers)) +(when (package! irony) + (package! irony-eldoc) + (when (featurep! :feature syntax-checker) + (package! flycheck-irony)) + (when (featurep! :completion company) + (package! company-irony) + (package! company-irony-c-headers))) -(package! rtags) -(when (featurep! :completion ivy) - (package! ivy-rtags)) -(when (featurep! :completion helm) - (package! helm-rtags)) +(when (package! rtags) + (when (featurep! :completion ivy) + (package! ivy-rtags)) + (when (featurep! :completion helm) + (package! helm-rtags))) From 980f5e470b7e2b82544696155313c9f652804236 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 00:57:28 +0200 Subject: [PATCH 1261/4235] Fix edge case where package autoloads would break startup Particularly in the case of gh loading eieio and marshal. --- core/core-packages.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 5cd77a920..564f89cd5 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -154,7 +154,8 @@ and `auto-mode-alist'.") (with-temp-file doom-packages-file (insert ";;; -*- lexical-binding:t -*-\n" ";; This file was autogenerated by `doom|refresh-cache', DO NOT EDIT!\n") - (prin1 `(setq Info-directory-list ',Info-directory-list + (prin1 `(setq load-path ',load-path + Info-directory-list ',Info-directory-list doom-disabled-packages ',doom-disabled-packages package-activated-list ',package-activated-list) (current-buffer))))) @@ -197,13 +198,11 @@ FORCE-P is non-nil, do it anyway. (require 'cl-lib) (require 'map)) (cl-pushnew doom-core-dir load-path :test #'string=) + (require 'core-lib) (when (or force-p (not doom-init-p)) - ;; autoloads file - (unless (load doom-autoload-file 'noerror 'nomessage 'nosuffix) - (unless noninteractive - (error "No autoloads file! Run make autoloads"))) ;; packages.el cache (when (and force-p (file-exists-p doom-packages-file)) + (message "Deleting packages.el cache") (delete-file doom-packages-file)) (unless (load doom-packages-file 'noerror 'nomessage 'nosuffix) ;; Ensure core folders exist, otherwise we get errors @@ -232,11 +231,14 @@ FORCE-P is non-nil, do it anyway. (if (package-installed-p package) (message "✓ Installed %s" package) (error "✕ Couldn't install %s" package))) - (message "Installing core packages...done"))))) + (message "Installing core packages...done")))) + ;; autoloads file + (unless (quiet! (load doom-autoload-file 'noerror 'nomessage 'nosuffix)) + (unless noninteractive + (error "No autoloads file! Run make autoloads")))) ;; initialize Doom core - (require 'core-lib) (require 'core-os) - (unless doom-init-p + (unless (or doom-init-p noninteractive) ;; Cache important packages.el state (doom|refresh-cache)) (unless noninteractive @@ -802,7 +804,7 @@ This should be run whenever init.el or an autoload file is modified. Running ;; no-byte-compile: t ;; no-update-autoloads: t ;; End:\n") - (eval-buffer buf) + (quiet! (eval-buffer buf)) (save-buffer) (message "Done!")) ('error From b4a7e5348a6ff2bffacd1e2a9677532a1c515b5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 00:58:03 +0200 Subject: [PATCH 1262/4235] Autoload smartparens commands Turns out I *do* need these! --- core/core-editor.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-editor.el b/core/core-editor.el index 35dea9fba..79b4d622f 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -133,6 +133,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens :defer doom-before-switch-buffer-hook + :commands (sp-pair sp-local-pair sp-with-modes) :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil From 3e6d7f174ab001d7bbf9565dc5b1ab5b9bd177b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 10:29:57 +0200 Subject: [PATCH 1263/4235] Optimize make autoloads & improve path expansion Make autoloads will expand the include paths of Doom autoload cookies. This fixes an issue where paths were expanded to include a file extension, bypassing the benefits of byte-compilation. --- core/core-packages.el | 72 ++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 564f89cd5..62d4e8519 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -155,6 +155,7 @@ and `auto-mode-alist'.") (insert ";;; -*- lexical-binding:t -*-\n" ";; This file was autogenerated by `doom|refresh-cache', DO NOT EDIT!\n") (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist Info-directory-list ',Info-directory-list doom-disabled-packages ',doom-disabled-packages package-activated-list ',package-activated-list) @@ -742,7 +743,7 @@ This should be run whenever init.el or an autoload file is modified. Running ;; in case this function has side effects. (progn (doom-packages--async-run 'doom//reload-autoloads) - (load doom-autoload-file t nil t)) + (load doom-autoload-file 'noerror nil 'nosuffix)) (let ((default-directory doom-emacs-dir) (targets (file-expand-wildcards @@ -760,7 +761,7 @@ This should be run whenever init.el or an autoload file is modified. Running (message "Deleted old autoloads.el")) (message "Generating new autoloads.el") (dolist (file (mapcar #'file-truename (reverse targets))) - (let ((generated-autoload-load-name file)) + (let ((generated-autoload-load-name (file-name-sans-extension file))) (message (cond ((not (doom-packages--read-if-cookies file)) "⚠ Ignoring %s") @@ -775,37 +776,58 @@ This should be run whenever init.el or an autoload file is modified. Running (load-path (append (list doom-emacs-dir) doom-psuedo-module-dirs doom-modules-dirs - load-path))) + load-path)) + library-cache) (unwind-protect (condition-case-unless-debug ex (with-current-buffer buf - (delay-mode-hooks (emacs-lisp-mode)) (goto-char (point-min)) (insert ";;; -*- lexical-binding:t -*-\n" ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") - ;; insert package autoloads - (dolist (file (doom-packages--files doom-packages-dir "-autoloads\\.el$")) - (when doom-debug-mode - (message "⚠ Including %s" (file-relative-name file package-user-dir))) - (let ((pfile (prin1-to-string file))) - (insert "\n(let ((load-file-name " pfile "))") - (insert-file-contents file) - (while (re-search-forward "#\\$\\|^;\\(.*\n\\)" nil 'move) - (unless (nth 8 (syntax-ppss)) - (replace-match (if (match-end 1) "" pfile) t t))) - (unless (bolp) (insert "\n")) - (insert ")\n"))) - (message "✓ Package autoloads included") - (goto-char (point-max)) - (insert " -;; Local\sVariables: -;; version-control: never -;; no-byte-compile: t -;; no-update-autoloads: t -;; End:\n") - (quiet! (eval-buffer buf)) + (save-excursion + ;; Replace autoload paths with absolute paths for faster + ;; resolution during load and simpler `load-path' + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^/][^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + ;; (delete-region (match-beginning 1) (match-end 1)) + (replace-match + (or (cdr (assoc path library-cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path libpath) library-cache) + libpath) + (progn + (warn "Couldn't find absolute path for: %s" path) + path)) + t t nil 1))) + (message "✓ Autoload paths expanded")) + + (save-excursion + ;; insert package autoloads + (dolist (file (doom-packages--files doom-packages-dir "-autoloads\\.el$")) + (insert + (with-temp-buffer + (insert "\n(let ((load-file-name " (prin1-to-string file) "))") + (insert-file-contents file) + (while (re-search-forward "^;;\\(.*\n\\)" nil 'move) + (replace-match "" t t)) + (unless (bolp) (insert "\n")) + (insert ")\n") + (buffer-string)))) + (message "✓ Package autoloads included")) + + ;; Replace autoload paths with absolute paths for faster + ;; resolution during load and simpler `load-path' + (while (re-search-forward "^\\s-*(add-to-list\\s-+'\\(?:load-path\\|auto-mode-alist\\)" nil t) + (beginning-of-line-text) + (kill-sexp)) + (message "✓ Autoload load-path entries removed") + (save-buffer) + (let (byte-compile-warnings) + ;; give the file a chance to reveal errors + (load doom-autoload-file nil 'nomessage 'nosuffix)) (message "Done!")) ('error (delete-file doom-autoload-file) From 377e8a7b3c5f47b8ade4c047aa9080758dc3a46e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 10:38:45 +0200 Subject: [PATCH 1264/4235] Refactor doom-initialize; error handling for faulty autoloads --- core/core-packages.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 62d4e8519..035625d60 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -198,8 +198,6 @@ FORCE-P is non-nil, do it anyway. (require 'subr-x) (require 'cl-lib) (require 'map)) - (cl-pushnew doom-core-dir load-path :test #'string=) - (require 'core-lib) (when (or force-p (not doom-init-p)) ;; packages.el cache (when (and force-p (file-exists-p doom-packages-file)) @@ -234,15 +232,20 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done")))) ;; autoloads file - (unless (quiet! (load doom-autoload-file 'noerror 'nomessage 'nosuffix)) + (unless + (with-demoted-errors "Autoload error: %s" + (let (byte-compile-warnings) + (load doom-autoload-file 'noerror 'nomessage 'nosuffix))) (unless noninteractive - (error "No autoloads file! Run make autoloads")))) + (error "No autoloads file! Run make autoloads"))) + (cl-pushnew doom-core-dir load-path :test #'string=)) ;; initialize Doom core (require 'core-os) - (unless (or doom-init-p noninteractive) - ;; Cache important packages.el state - (doom|refresh-cache)) + (require 'core-lib) (unless noninteractive + (unless doom-init-p + ;; Cache important packages.el state + (doom|refresh-cache)) (require 'core-ui) (require 'core-editor) (require 'core-projects) From 622b53479a7321eadd3782541baebf5a52bddb23 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 12:14:47 +0200 Subject: [PATCH 1265/4235] lang/emacs-lisp: display major/minor modes in imenu --- modules/lang/emacs-lisp/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index ee61d1eb9..ef1dac765 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -41,6 +41,8 @@ ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|def-test!\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) + ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) + ("Minor modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-\\)?minor-mode +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") From 3e6d6279a692b1a2a173cda32a4d0b5dde1e9d30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 13:06:07 +0200 Subject: [PATCH 1266/4235] ui/evil-goggles: remove unnecessary toggle wrapper command --- modules/config/default/+bindings.el | 2 +- modules/ui/evil-goggles/autoload.el | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 modules/ui/evil-goggles/autoload.el diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 1dcf5aa5a..e2c183bc7 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -310,7 +310,7 @@ :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 + :desc "Evil goggles" :n "g" #'evil-goggles-mode :desc "org-tree-slide mode" :n "p" #'+org-present/start)) diff --git a/modules/ui/evil-goggles/autoload.el b/modules/ui/evil-goggles/autoload.el deleted file mode 100644 index 544419859..000000000 --- a/modules/ui/evil-goggles/autoload.el +++ /dev/null @@ -1,9 +0,0 @@ -;;; feature/ui/evil-goggles/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +evil-goggles/toggle () - "Toggle evil goggles mode." - (interactive) - (if evil-goggles-mode - (evil-goggles-mode -1) - (evil-goggles-mode +1))) From 262b2f957b8cbe01fdd5a79d2eb0a3d385e4068a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 13:14:03 +0200 Subject: [PATCH 1267/4235] Fix associate! not enabling minor modes for :files/:modes/:when Fixes #585 --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index e5b953295..22f272579 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -216,7 +216,7 @@ Body forms can access the hook's arguments through the let-bound variable (let ((hook-name (intern (format "doom--init-mode-%s" mode)))) `(progn (defun ,hook-name () - (when (and (boundp ',mode) + (when (and (fboundp ',mode) (not ,mode) (and buffer-file-name (not (file-remote-p buffer-file-name))) ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) From 673d3ed147ce447d72196c2672e2a133c7f220e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 13:14:23 +0200 Subject: [PATCH 1268/4235] Prevent duplicate entries in doom-auto-minor-mode-alist --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 22f272579..460c828f5 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -228,7 +228,7 @@ Body forms can access the hook's arguments through the let-bound variable collect `(add-hook ',hook ',hook-name)) `((add-hook 'after-change-major-mode-hook ',hook-name)))))) (match - `(push (cons ,match ',mode) doom-auto-minor-mode-alist)) + `(map-put doom-auto-minor-mode-alist ,match ',mode)) (t (user-error "associate! invalid rules for mode [%s] (modes %s) (match %s) (files %s)" mode modes match files)))))) From a1e49d174a87cadfa158d68b38c1ca5b28832e5c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 18:13:04 +0200 Subject: [PATCH 1269/4235] Exclude {packages,doctor}.el from make compile These two files shouldn't be byte-compiled. Until now it was expected that you'd include a no-byte-compile: t header in these files. This is more convenient. --- core/core-packages.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 035625d60..c8069d0aa 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -903,11 +903,12 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (condition-case ex (let ((use-package-expand-minimally t)) (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'string=)) - (when (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p target elc-file)))) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'equal)) + (when (and (not (string-match-p "/\\(packages\\|doctor\\)\\.el$" target)) + (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p target elc-file))))) (let ((result (if (doom-packages--read-if-cookies target) (byte-compile-file target) 'no-byte-compile)) From 06f7aa28819f92a37ee041dc256f31a5a7881297 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 18:24:47 +0200 Subject: [PATCH 1270/4235] feature/file-templates: fix doom module templates There were cases where certain Doom module templates weren't correctly expanded (when your private directory is symlinked). --- modules/feature/file-templates/config.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 438ad4751..80c08429d 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -62,7 +62,12 @@ in a project." auto-insert-alist))) (mapc #'+file-templates-add - (let ((doom (concat "/" (regexp-opt '(".emacs.d" ".doom.d" "doom-emacs" ".config/doom")) "/"))) + (let* ((dirs (mapcar (lambda (path) (string-remove-prefix (expand-file-name "~") path)) + (cl-remove-duplicates + (append (list doom-emacs-dir doom-private-dir) + (mapcar #'file-truename (list doom-emacs-dir doom-private-dir))) + :test 'string=))) + (doom (regexp-opt dirs))) `(;; General ("/\\.gitignore$" "__" gitignore-mode) ("/Dockerfile$" "__" dockerfile-mode) @@ -73,8 +78,8 @@ in a project." ("/.dir-locals.el$" nil) ("-test\\.el$" "__" emacs-ert-mode) (,(concat doom ".+\\.el$") "__doom-module" emacs-lisp-mode) - (,(concat doom ".*/packages\\.el$") "__doom-packages" emacs-lisp-mode) - (,(concat doom ".*/test/.+\\.el$") "__doom-test" emacs-lisp-mode) + (,(concat doom "\\(?:.+/\\)?packages\\.el$") "__doom-packages" emacs-lisp-mode) + (,(concat doom "\\(?:.+/\\)?test/.+\\.el$") "__doom-test" emacs-lisp-mode) (snippet-mode "__" snippet-mode) ;; C/C++ ("\\.h$" "__h" c-mode) From d32e500f9781052a3689a8b2957ea1012ac94046 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 18:26:08 +0200 Subject: [PATCH 1271/4235] feature/file-template: refactor for idempotency --- modules/feature/file-templates/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 80c08429d..38a47dd49 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -26,7 +26,7 @@ in a project." auto-insert-alist nil) ; Tabula rasa (after! yasnippet - (push '+file-templates-dir yas-snippet-dirs)) + (cl-pushnew '+file-templates-dir yas-snippet-dirs :test #'eq)) ;; load autoinsert as late as possible (defun +file-templates|init () From a126450280878586317c69849c83b9790ee43506 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 18:26:31 +0200 Subject: [PATCH 1272/4235] Fix make info --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f10eb7b5a..ccd13e898 100644 --- a/Makefile +++ b/Makefile @@ -94,7 +94,7 @@ doctor: # Prints debug info about your current setup info: - @$(EMACS) --batch -l core/core.el -l core/autoload/debug.el -f doom/info + @$(EMACS) --batch -l core/core.el -l core/autoload/util.el -f doom/info ## Internal tasks .local/autoloads.el: From 9b0dbe20b003509bb6ecf92d4521ce350c0ea3f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 18:26:56 +0200 Subject: [PATCH 1273/4235] doom//refresh-packages -> doom//reload-packages (consistency) --- Makefile | 2 +- core/core-packages.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ccd13e898..47758ab40 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ DOOMI = $(subst --batch,,$(DOOM)) MODULES = $(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) all: - @$(DOOM) -f doom//refresh-packages + @$(DOOM) -f doom//reload-packages ## Shortcuts a: autoloads diff --git a/core/core-packages.el b/core/core-packages.el index c8069d0aa..4a08d9b98 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -676,7 +676,7 @@ loads MODULE SUBMODULE's packages.el file." (interactive) (message "Reloading your private config...") (load (concat doom-private-dir "init.el") nil nil 'nosuffix) - (doom-packages--async-run #'doom//refresh-packages) + (doom-packages--async-run #'doom//reload-packages) (let ((doom--stage 'config)) (load (concat doom-private-dir "config.el") nil nil 'nosuffix)) (message "✓ Done!")) @@ -988,7 +988,7 @@ compiled packages.'" (abbreviate-file-name path)))) (message "Everything is clean"))) -(defun doom//refresh-packages () +(defun doom//reload-packages () "Runs `doom//reload-autoloads', `doom//packages-autoremove' and `doom//packages-install' before reloading your Emacs session." (interactive) From 45c21a5a83fa215e920f2db9b99160972aac88ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 22:40:33 +0200 Subject: [PATCH 1274/4235] Move :feature services => :tools prodigy --- init.example.el | 2 +- .../{feature/services => tools/prodigy}/autoload.el | 8 ++++---- .../{feature/services => tools/prodigy}/config.el | 12 ++++-------- .../{feature/services => tools/prodigy}/packages.el | 2 +- 4 files changed, 10 insertions(+), 14 deletions(-) rename modules/{feature/services => tools/prodigy}/autoload.el (86%) rename modules/{feature/services => tools/prodigy}/config.el (72%) rename modules/{feature/services => tools/prodigy}/packages.el (60%) diff --git a/init.example.el b/init.example.el index f57571a87..92a2163f1 100644 --- a/init.example.el +++ b/init.example.el @@ -9,7 +9,6 @@ (lookup ; helps you navigate your code and documentation +devdocs ; ...on devdocs.io online +docsets) ; ...or in Dash docsets locally - services ; TODO managing external services & code builders snippets ; my elves. They type so I don't have to spellcheck ; tasing you for misspelling mispelling (syntax-checker ; tasing you for every semicolon you forget @@ -56,6 +55,7 @@ ;magit ; password-store ; password manager for nerds pdf ; pdf enhancements + prodigy ; Managing external services ;rgb ; creating color strings rotate-text ; cycle region at point between text candidates term ; terminals in Emacs diff --git a/modules/feature/services/autoload.el b/modules/tools/prodigy/autoload.el similarity index 86% rename from modules/feature/services/autoload.el rename to modules/tools/prodigy/autoload.el index 23f357ab3..88781dd3d 100644 --- a/modules/feature/services/autoload.el +++ b/modules/tools/prodigy/autoload.el @@ -1,14 +1,14 @@ -;;; feature/services/autoload.el -*- lexical-binding: t; -*- +;;; tools/prodigy/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +services/create () +(defun +prodigy/create () "Interactively create a new prodigy service." (interactive) ;; TODO ) ;;;###autoload -(defun +services/prodigy-delete (arg) +(defun +prodigy/delete (arg) "Delete service at point. Asks for confirmation." (interactive "P") (prodigy-with-refresh @@ -24,7 +24,7 @@ (message "Aborted"))))))) ;;;###autoload -(defun +services/cleanup () +(defun +prodigy/cleanup () "Delete all services associated with projects that don't exist." (interactive) (cl-loop for service in prodigy-services diff --git a/modules/feature/services/config.el b/modules/tools/prodigy/config.el similarity index 72% rename from modules/feature/services/config.el rename to modules/tools/prodigy/config.el index 8d8dcacfd..8763db6a3 100644 --- a/modules/feature/services/config.el +++ b/modules/tools/prodigy/config.el @@ -1,4 +1,4 @@ -;;; feature/services/config.el -*- lexical-binding: t; -*- +;;; tools/prodigy/config.el -*- lexical-binding: t; -*- (def-setting! :service (&rest plist) "TODO" @@ -19,7 +19,7 @@ (doom-cache-persist :prodigy '(prodigy-services prodigy-tags prodigy-filters)) - (defun +services*prodigy-services (orig-fn &rest args) + (defun +prodigy*services (orig-fn &rest args) "Adds a new :project property to prodigy services, which hides the service unless invoked from the relevant project." (let ((project-root (downcase (doom-project-root))) @@ -31,12 +31,8 @@ unless invoked from the relevant project." (or (not project) (file-in-directory-p project-root project)))) services)))) - (advice-add #'prodigy-services :around #'+services*prodigy-services) + (advice-add #'prodigy-services :around #'+prodigy*services) ;; Keybindings - (map! :map prodigy-mode-map "d" #'+services/prodigy-delete) - (when (featurep! :feature evil) - (map! :map prodigy-mode-map - "j" #'prodigy-next - "k" #'prodigy-prev))) + (map! :map prodigy-mode-map "d" #'+prodigy/delete)) diff --git a/modules/feature/services/packages.el b/modules/tools/prodigy/packages.el similarity index 60% rename from modules/feature/services/packages.el rename to modules/tools/prodigy/packages.el index dcca97f5d..bf9396134 100644 --- a/modules/feature/services/packages.el +++ b/modules/tools/prodigy/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; feature/services/packages.el +;;; tools/prodigy/packages.el (package! prodigy) From 42bdb848b52f485aa68d6f4db1c936527e3d978f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 23:42:25 +0200 Subject: [PATCH 1275/4235] config/default: add ]a/[a motions for arguments --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e2c183bc7..d8d259df2 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -318,6 +318,8 @@ :nv "K" #'+lookup/documentation :n "zx" #'kill-this-buffer :n "ZX" #'bury-buffer + :m "]a" #'evil-forward-arg + :m "[a" #'evil-backward-arg :n "]b" #'next-buffer :n "[b" #'previous-buffer :n "]w" #'+workspace/switch-right From 34b6d4d0cf963716372d4c2dc6515772e48dfb43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 16 May 2018 23:50:48 +0200 Subject: [PATCH 1276/4235] config/default: move evil-easymotion keybinds into +bindings.el It's easier to see and discover this way. --- modules/config/default/+bindings.el | 20 +++++++++++++++++++- modules/config/default/autoload/evil.el | 22 ++++------------------ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index d8d259df2..4a0d994fd 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -334,7 +334,6 @@ :n "gr" #'+eval:region :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region - :m "gs" #'+default/easymotion ; lazy-load `evil-easymotion' :v "@" #'+evil:apply-macro :n "g@" #'+evil:apply-macro ;; repeat in visual mode (FIXME buggy) @@ -394,6 +393,25 @@ "C-SPC" #'ivy-call-and-recenter ; preview "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action))) + ;; easymotion + :m "gs" #'+default/easymotion ; lazy-load `evil-easymotion' + (:after evil-easymotion + :map evilem-map + "a" (evilem-create #'evil-forward-arg) + "A" (evilem-create #'evil-backward-arg) + "n" (evilem-create #'evil-ex-search-next) + "N" (evilem-create #'evil-ex-search-previous) + "s" (evilem-create #'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))) + "S" (evilem-create #'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)))) + ;; evil (:after evil :textobj "a" #'evil-inner-arg #'evil-outer-arg diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index ae0fdbffa..521bc72f2 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -38,25 +38,11 @@ buffers." ;;;###autoload (defun +default/easymotion () - "TODO" + "Invoke and lazy-load `evil-easymotion' without compromising which-key +integration." (interactive) (let ((prefix (this-command-keys))) (map! :m prefix nil) (evilem-default-keybindings prefix) - (let ((map evilem-map)) - (define-key map "n" (evilem-create #'evil-ex-search-next)) - (define-key map "N" (evilem-create #'evil-ex-search-previous)) - (define-key map "s" - (evilem-create #'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)))) - (define-key map "S" - (evilem-create #'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)))) - (set-transient-map map) - (which-key-reload-key-sequence prefix)))) + (set-transient-map evilem-map) + (which-key-reload-key-sequence prefix))) From 48c65c2a2ddeeb83cad270bf5601313d347cc256 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 17 May 2018 08:47:38 +1000 Subject: [PATCH 1277/4235] Add csv mode to data --- modules/lang/data/config.el | 13 +++++++++++++ modules/lang/data/packages.el | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 60b1af9b2..359c360ea 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -10,6 +10,19 @@ (def-package! graphql-mode :mode "\\.g\\(?:raph\\)?ql$") +(def-package! csv-mode + :mode "\\.csv$" + :config + (map! :map csv-mode-map + (:localleader + :desc "Align fields" :nvm "a" #'csv-align-fields + :desc "Unalign fields" :nvm "u" #'csv-unalign-fields + :desc "Sort fields" :nvm "s" #'csv-sort-fields + :desc "Sort fields (n)" :nvm "S" #'csv-sort-numeric-fields + :desc "Kill fields" :nvm "k" #'csv-kill-fields + :desc "Transpose fields" :nvm "t" #'csv-transpose))) + + (def-package! hexl ; For ROM hacking or debugging :mode ("\\.hex$" . hexl-mode) diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el index fb60ce156..a34a56266 100644 --- a/modules/lang/data/packages.el +++ b/modules/lang/data/packages.el @@ -7,4 +7,4 @@ (package! toml-mode) (package! vimrc-mode) (package! yaml-mode) - +(package! csv-mode) From fa6a99f9639618bd9c549e95fe0257ca5a6ded36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 00:54:29 +0200 Subject: [PATCH 1278/4235] feature/evil: fix */# keybinds entering operator mode --- modules/feature/evil/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index b778d5961..199c4d590 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -365,8 +365,8 @@ the new algorithm is confusing, like in python or ruby." evil-visualstar/begin-search-forward evil-visualstar/begin-search-backward) :init - (map! :m [remap evil-ex-search-word-forward] #'evil-visualstar/begin-search-forward - :m [remap evil-ex-search-word-backward] #'evil-visualstar/begin-search-backward) + (map! :v "*" #'evil-visualstar/begin-search-forward + :v "#" #'evil-visualstar/begin-search-backward) :config (global-evil-visualstar-mode 1)) From 022baf808cc958ec70eec65865d804f9d3b9ab1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 11:06:18 +0200 Subject: [PATCH 1279/4235] lang/org: use evil-org-key-theme variable to initialize evil-org Gives people a chance to customize which evil-org key themes are available to them. Addresses #591 --- modules/lang/org/config.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 5dffd23fd..48ab7a213 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -31,15 +31,15 @@ (def-package! evil-org :when (featurep! :feature evil) - :commands evil-org-mode + :hook (org-mode . evil-org-mode) + :hook (org-load . evil-org-set-key-theme) :init - (add-hook 'org-load-hook #'+org|setup-evil) - (add-hook 'org-mode-hook #'evil-org-mode) - :config - (evil-org-set-key-theme '(navigation insert textobjects)) - (after! org-agenda - (require 'evil-org-agenda) - (evil-org-agenda-set-keys))) + (setq evil-org-key-theme '(navigation insert textobjects)) + (add-hook 'org-load-hook #'+org|setup-evil)) + +(def-package! evil-org-agenda + :after org-agenda + :config (evil-org-agenda-set-keys)) ;; From 4fba57e954f7d863e530553d3195298439309eab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 12:11:19 +0200 Subject: [PATCH 1280/4235] Fix trapped-in-prompt cursor issue in minibuffer --- core/core-ui.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9ab5ad7c8..604916c45 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -374,12 +374,11 @@ from the default." ;; (defun doom*silence-motion-errors (orig-fn &rest args) - (if (and (minibufferp) - (<= (point) (minibuffer-prompt-end))) - (progn - (ignore-errors (apply orig-fn args)) - (goto-char (minibuffer-prompt-end))) - (apply orig-fn args))) + (if (not (minibufferp)) + (apply orig-fn args) + (ignore-errors (apply orig-fn args)) + (when (<= (point) (minibuffer-prompt-end)) + (goto-char (minibuffer-prompt-end))))) (advice-add #'left-char :around #'doom*silence-motion-errors) (advice-add #'right-char :around #'doom*silence-motion-errors) From 49d431ee4ed0b14a64eab0743e7488cb87593ccc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 12:11:34 +0200 Subject: [PATCH 1281/4235] Trigger switch-buffer hooks on pop-to-buffer --- 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 604916c45..044e24d60 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -360,7 +360,8 @@ from the default." (advice-add #'select-frame :around #'doom*switch-frame-hooks) (advice-add #'select-window :around #'doom*switch-window-hooks) (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) - (advice-add #'display-buffer :around #'doom*switch-buffer-hooks)) + (advice-add #'display-buffer :around #'doom*switch-buffer-hooks) + (advice-add #'pop-to-buffer :around #'doom*switch-buffer-hooks)) (add-hook 'doom-init-hook #'doom|init-custom-hooks) (defun doom*load-theme-hooks (theme &rest _) From 803511c7710ff790427fa1e002cfd90a8ea121ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 12:22:21 +0200 Subject: [PATCH 1282/4235] lang/web: disable company-css in Emacs 26+ css-mode's built-in completion is superior in Emacs 26+. The company-capf backend will take advantage of it. --- modules/lang/web/+css.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index cadfd2a40..d49d19292 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -38,7 +38,9 @@ (after! css-mode ; contains both css-mode & scss-mode (set! :docset 'css-mode "CSS") (set! :docset 'scss-mode "Sass") - (set! :company-backend '(css-mode scss-mode) 'company-css) + (unless EMACS26+ + ;; css-mode's built in completion is superior + (set! :company-backend '(css-mode scss-mode) 'company-css)) (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) From bed5a2f305a3f4b43671e896d612475cb67c8f15 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 12:26:42 +0200 Subject: [PATCH 1283/4235] lang/web: add *.jinja to web-mode --- modules/lang/web/+html.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 8a724fd0e..4e90eda69 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -10,6 +10,7 @@ :mode "\\.tsx$" :mode "\\.vue$" :mode "\\.twig$" + :mode "\\.jinja$" :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config From 3853fdbf8d2c3644e781e7fd0919a734a58e5577 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 15:14:56 +0200 Subject: [PATCH 1284/4235] Fix doom|protect-visible-buffers protecting temporary 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 044e24d60..c78811ea6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -627,7 +627,8 @@ confirmation." (defun doom|protect-visible-buffers () "Don't kill the current buffer if it is visible in another window (bury it instead)." - (not (delq (selected-window) (get-buffer-window-list nil nil t)))) + (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) + (not (equal (substring (buffer-name) 0 1) " "))))) (defun doom|protect-fallback-buffer () "Don't kill the scratch buffer." From 02e4c15b8efa017ce298a7b703983130b067dd6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 15:29:29 +0200 Subject: [PATCH 1285/4235] Move avy/ace-link from core-editor to core-ui --- core/core-editor.el | 9 --------- core/core-ui.el | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 79b4d622f..06fd853a1 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -166,15 +166,6 @@ fundamental-mode) for performance sake." ;; Autoloaded Plugins ;; -(def-package! ace-link - :commands (ace-link-help ace-link-org ace-link-addr ace-link-mu4e)) - -(def-package! avy - :commands (avy-goto-char-2 avy-goto-line) - :config - (setq avy-all-windows nil - avy-background t)) - (def-package! command-log-mode :commands (command-log-mode global-command-log-mode) :config diff --git a/core/core-ui.el b/core/core-ui.el index c78811ea6..a36c4df5b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -177,6 +177,15 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; Plugins ;; +(def-package! ace-link + :commands (ace-link-help ace-link-org ace-link-addr ace-link-mu4e)) + +(def-package! avy + :commands (avy-goto-char-2 avy-goto-line) + :config + (setq avy-all-windows nil + avy-background t)) + (def-package! all-the-icons :commands (all-the-icons-octicon all-the-icons-faicon all-the-icons-fileicon all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon From 4f9cb60e0788b8dcee3dd3d6ca98e8ff1a8868e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 15:29:54 +0200 Subject: [PATCH 1286/4235] Start server sooner --- core/core-editor.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 06fd853a1..03fa0cae3 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -65,8 +65,15 @@ fundamental-mode) for performance sake." ;; Built-in plugins ;; +(push '("/[A-Z]+$" . text-mode) auto-mode-alist) + (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. +(when (and (display-graphic-p) + (require 'server nil t) + (not (server-running-p))) + (server-start)) + (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) ;; revert buffers for changed files @@ -116,15 +123,6 @@ fundamental-mode) for performance sake." (concat "^" (file-truename doom-local-dir)))) (recentf-mode +1)) -(def-package! server - :when (display-graphic-p) - :defer 2 - :config - (unless (server-running-p) - (server-start))) - -(push '("/[A-Z]+$" . text-mode) auto-mode-alist) - ;; ;; Core Plugins From dbdce2a8b235e63eb741e348a3200a3ea75a0ff8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 16:59:55 +0200 Subject: [PATCH 1287/4235] completion/ivy: fix file search not searching compressed archives --- modules/completion/ivy/autoload/ivy.el | 4 +--- modules/completion/ivy/config.el | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index c33c1ec54..eef638f21 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -251,8 +251,7 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (counsel-projectile-grep args)) (counsel-projectile-grep args)))) ('ag - (let ((args (concat " -S" ; smart-case - (if all-files-p " -a") + (let ((args (concat (if all-files-p " -a") (unless recursion-p " --depth 1")))) (counsel-ag query directory args (format prompt args)))) ('rg @@ -262,7 +261,6 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ('pt (let ((counsel-pt-base-command (concat counsel-pt-base-command - " -S" ; smart-case (if all-files-p " -U") (unless recursion-p " --depth=1"))) (default-directory directory)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e0f123bbc..cf79298da 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -93,7 +93,10 @@ immediately runs it on the current candidate (ending the ivy session)." :config (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) - (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)") + (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)" + counsel-rg-base-command "rg -zS --no-heading --line-number --color never %s ." + counsel-ag-base-command "ag -zS --nocolor --nogroup %s" + counsel-pt-base-command "pt -zS --nocolor --nogroup -e %s") ;; Dim recentf entries that are not in the current project. (ivy-set-display-transformer #'counsel-recentf #'+ivy-recentf-transformer) From ded6526eeecc57bcf8199884e3a0eafd85ca7785 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 17:00:20 +0200 Subject: [PATCH 1288/4235] completion/ivy: fix void-variable error in +ivy:{pt,grep} --- modules/completion/ivy/autoload/evil.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 1135d3ec0..b60b28d31 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -20,13 +20,13 @@ (evil-define-command +ivy:pt (all-files-p query) "Ex interface for `+ivy/pt'" (interactive "") - (+ivy/pt all-files-p query directory)) + (+ivy/pt all-files-p query)) ;;;###autoload (autoload '+ivy:grep "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:grep (all-files-p query) "Ex interface for `+ivy/grep'" (interactive "") - (+ivy/grep all-files-p query directory)) + (+ivy/grep all-files-p query)) ;;;###autoload (autoload '+ivy:ag "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:ag (all-files-p query) From 51cc1e89080982c1c2394e7167b72e7370385ad7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 17:28:44 +0200 Subject: [PATCH 1289/4235] No fringes in minibuffer or which-key buffers --- core/core-ui.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index a36c4df5b..f8fc6a357 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -619,12 +619,17 @@ confirmation." (let ((inhibit-read-only t)) (ansi-color-apply-on-region compilation-filter-start (point)))) -(defun doom|no-fringes-in-minibuffer () +(defun doom|no-fringes-in-minibuffer (&rest _) "Disable fringes in the minibuffer window." (set-window-fringes (minibuffer-window) 0 0 nil)) -(add-hook! '(doom-init-ui-hook minibuffer-setup-hook) +(add-hook! '(doom-init-ui-hook minibuffer-setup-hook window-configuration-change-hook) #'doom|no-fringes-in-minibuffer) +(defun doom|no-fringes-in-which-key-buffer (&rest _) + (doom|no-fringes-in-minibuffer) + (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) +(advice-add 'which-key--show-buffer-side-window :after #'doom|no-fringes-in-which-key-buffer) + (defun doom|set-mode-name () "Set the major mode's `mode-name', as dictated by `doom-major-mode-names'." (when-let* ((name (cdr (assq major-mode doom-major-mode-names)))) From b01893bef2e48a6952d682e020ac4b1ecbc5e59c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 17:29:07 +0200 Subject: [PATCH 1290/4235] Disable whitespace-mode in childframes --- core/core-ui.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index f8fc6a357..cb03af232 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -587,6 +587,14 @@ frame's window-system, the theme will be reloaded.") ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) +(after! whitespace + (defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) + (with-selected-frame (apply orig-fn args) + (setq-local whitespace-style nil) + (selected-window))) + (advice-add #'company-box--make-frame :around #'doom*fix-whitespace-mode-in-childframes) + (advice-add #'posframe--create-posframe :around #'doom*fix-whitespace-mode-in-childframes)) + ;; ensure posframe cleans up after itself (after! posframe ;; TODO Find a better place for this From cea750fc55e68c1a8648a157637587a912c4d5b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 17:29:23 +0200 Subject: [PATCH 1291/4235] Rename doom|ansi-color-apply => doom|compilation-ansi-color-apply --- core/core-ui.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index cb03af232..055d42966 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -622,9 +622,10 @@ confirmation." t)) (setq confirm-kill-emacs #'doom-quit-p) -(defun doom|ansi-color-apply () - "TODO" - (let ((inhibit-read-only t)) +(defun doom|compilation-ansi-color-apply () + "Applies ansi codes to the compilation buffers. Meant for +`compilation-filter-hook'." + (with-silent-modifications (ansi-color-apply-on-region compilation-filter-start (point)))) (defun doom|no-fringes-in-minibuffer (&rest _) @@ -699,7 +700,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; Renames major-modes [pedantry intensifies] (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) ;; Ensure ansi codes in compilation buffers are replaced - (add-hook 'compilation-filter-hook #'doom|ansi-color-apply) + (add-hook 'compilation-filter-hook #'doom|compilation-ansi-color-apply) ;; (run-hooks 'doom-init-ui-hook)) From e2f99a8c242807fb6607a8b239d3ea8b487ca26f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 22:44:20 +0200 Subject: [PATCH 1292/4235] Load core-lib sooner --- 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 4a08d9b98..9bb5f7d46 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -1,5 +1,7 @@ ;;; core-packages.el --- package management system -*- lexical-binding: t; -*- +(require 'core-lib (concat doom-core-dir "core-lib")) + ;; Emacs package management is opinionated. Unfortunately, so am I. I've bound ;; together `use-package', `quelpa' and package.el to create my own, ;; rolling-release, lazily-loaded package management system for Emacs. @@ -241,7 +243,6 @@ FORCE-P is non-nil, do it anyway. (cl-pushnew doom-core-dir load-path :test #'string=)) ;; initialize Doom core (require 'core-os) - (require 'core-lib) (unless noninteractive (unless doom-init-p ;; Cache important packages.el state From c46bd978fc22cae4958149f55dffbc4af3d99bc8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 17 May 2018 23:05:35 +0200 Subject: [PATCH 1293/4235] lang/org: fix tab not folding src blocks --- modules/lang/org/autoload/org.el | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 3906c1521..1a945fcd3 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -337,14 +337,11 @@ with `org-cycle')." (unless (eq this-command 'org-shifttab) (save-excursion (org-beginning-of-line) - (cond ((org-at-heading-p) - (outline-toggle-children) - (unless (outline-invisible-p (line-end-position)) - (org-cycle-hide-drawers 'subtree)) - t) - ((org-in-src-block-p) - (org-babel-remove-result) - t))))) + (when (org-at-heading-p) + (outline-toggle-children) + (unless (outline-invisible-p (line-end-position)) + (org-cycle-hide-drawers 'subtree)) + t)))) ;;;###autoload (defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) From 82f9fb7027337f18c582ba37ead5583c6222c34b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:08:25 +0200 Subject: [PATCH 1294/4235] Optimize package management commands Effectively halving run time on package install, update and autoremove commands. --- core/autoload/packages.el | 26 +++++++++++++++----------- core/core-packages.el | 9 ++++----- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 4b2cd8b44..c67c8f73c 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -147,7 +147,7 @@ Warning: this function is expensive; it re-evaluates all of doom's config files. Be careful not to use it in a loop. If INSTALLED-ONLY-P, only return packages that are installed." - (doom-initialize-packages t) + (doom-initialize-packages (not noninteractive)) (cl-loop with packages = (append doom-core-packages (mapcar #'car doom-packages)) for sym in (cl-delete-duplicates packages) if (and (or (not installed-only-p) @@ -180,7 +180,7 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom//packages-update'." - (doom-initialize-packages t) + (doom-initialize-packages (not noninteractive)) (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages @@ -201,13 +201,17 @@ Used by `doom//packages-update'." (message "New thread for: %s" pkg)) (push (async-start `(lambda () - (setq user-emacs-directory ,user-emacs-directory) - (let ((noninteractive t)) - (load ,(expand-file-name "core.el" doom-core-dir))) - (setq doom-packages ',doom-packages - doom-modules ',doom-modules - quelpa-cache ',quelpa-cache) - (doom-package-outdated-p ',pkg))) + (let ((doom-init-p 'internal) + (noninteractive t) + (load-path ',load-path) + (doom-packages ',doom-packages) + (doom-modules ',doom-modules) + (quelpa-cache ',quelpa-cache) + (user-emacs-directory ,user-emacs-directory) + doom-private-dir) + (load ,(expand-file-name "core.el" doom-core-dir)) + (load ,(expand-file-name "autoload/packages.el" doom-core-dir)) + (doom-package-outdated-p ',pkg)))) futures)) (delq nil (append (mapcar #'doom-package-outdated-p elpa-pkgs) @@ -219,7 +223,7 @@ Used by `doom//packages-update'." depended on. Used by `doom//packages-autoremove'." - (doom-initialize-packages t) + (doom-initialize-packages (not noninteractive)) (let ((package-selected-packages (append (mapcar #'car doom-packages) doom-core-packages))) (append (package--removable-packages) @@ -239,7 +243,7 @@ If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. Used by `doom//packages-install'." - (doom-initialize-packages t) + (doom-initialize-packages (not noninteractive)) (cl-loop for desc in (doom-get-packages) for (name . plist) = desc if (and (or include-ignored-p diff --git a/core/core-packages.el b/core/core-packages.el index 9bb5f7d46..c6b04062e 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -200,6 +200,8 @@ FORCE-P is non-nil, do it anyway. (require 'subr-x) (require 'cl-lib) (require 'map)) + (when (eq doom-init-p 'internal) + (setq force-p nil)) (when (or force-p (not doom-init-p)) ;; packages.el cache (when (and force-p (file-exists-p doom-packages-file)) @@ -316,12 +318,9 @@ them." (_load (expand-file-name "packages.el" doom-core-dir)) (cl-loop for key being the hash-keys of doom-modules for path = (doom-module-expand-file (car key) (cdr key) "packages.el") - if (file-exists-p path) - do (let ((doom--current-module key)) (_load path))) + do (let ((doom--current-module key)) (_load path t))) (cl-loop for dir in doom-psuedo-module-dirs - for path = (expand-file-name "packages.el" dir) - if (file-exists-p path) - do (_load path)))))))) + do (_load (expand-file-name "packages.el" dir) t)))))))) ;; From 340aa0449c789a6bba305b1711c40b5bea5a212b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:09:13 +0200 Subject: [PATCH 1295/4235] Rewrite & optimize autoload generation logic Now includes package autoloads (which allows us to shed some fat from various module configs, but that'll come later). --- core/core-packages.el | 140 ++++++++++++++++++++++++------------------ 1 file changed, 80 insertions(+), 60 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index c6b04062e..475a7714f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -75,6 +75,11 @@ missing) and shouldn't be deleted.") (defvar doom-disabled-packages () "A list of packages that should be ignored by `def-package!'.") +(defvar doom-autoload-excluded-packages '(marshal gh) + "Packages that have silly or destructive autoload files that try to load +everyone in the universe and their dog, causing errors that make babies cry. No +one wants that.") + (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload-load-path' is called.") @@ -236,13 +241,15 @@ FORCE-P is non-nil, do it anyway. (error "✕ Couldn't install %s" package))) (message "Installing core packages...done")))) ;; autoloads file - (unless - (with-demoted-errors "Autoload error: %s" - (let (byte-compile-warnings) - (load doom-autoload-file 'noerror 'nomessage 'nosuffix))) - (unless noninteractive - (error "No autoloads file! Run make autoloads"))) - (cl-pushnew doom-core-dir load-path :test #'string=)) + (condition-case-unless-debug e + (unless + (let (byte-compile-warnings) + (load (substring doom-autoload-file 0 -3) 'noerror 'nomessage)) + (error "No autoloads file! Run make autoloads")) + (error + (funcall (if noninteractive #'warn #'error) + "Autoload file error: %s -> %s" (car e) (error-message-string e)))) + (add-to-list 'load-path doom-core-dir)) ;; initialize Doom core (require 'core-os) (unless noninteractive @@ -761,6 +768,7 @@ This should be run whenever init.el or an autoload file is modified. Running (push file targets))))) (when (file-exists-p doom-autoload-file) (delete-file doom-autoload-file) + (ignore-errors (delete-file (byte-compile-dest-file doom-autoload-file))) (message "Deleted old autoloads.el")) (message "Generating new autoloads.el") (dolist (file (mapcar #'file-truename (reverse targets))) @@ -776,66 +784,78 @@ This should be run whenever init.el or an autoload file is modified. Running (abbreviate-file-name file))))) (make-directory (file-name-directory doom-autoload-file) t) (let ((buf (find-file-noselect doom-autoload-file t)) - (load-path (append (list doom-emacs-dir) - doom-psuedo-module-dirs + (load-path (append doom-psuedo-module-dirs doom-modules-dirs load-path)) - library-cache) + case-fold-search) + ;; FIXME Make me faster (unwind-protect - (condition-case-unless-debug ex - (with-current-buffer buf - (goto-char (point-min)) - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") + (with-current-buffer buf + (goto-char (point-min)) + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") - (save-excursion - ;; Replace autoload paths with absolute paths for faster - ;; resolution during load and simpler `load-path' - (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^/][^\"]*\\)\"" nil t) - (let ((path (match-string 1))) - ;; (delete-region (match-beginning 1) (match-end 1)) - (replace-match - (or (cdr (assoc path library-cache)) - (when-let* ((libpath (locate-library path)) - (libpath (file-name-sans-extension libpath))) - (push (cons path libpath) library-cache) - libpath) - (progn - (warn "Couldn't find absolute path for: %s" path) - path)) - t t nil 1))) - (message "✓ Autoload paths expanded")) + ;; Replace autoload paths (only for module autoloads) with + ;; absolute paths for faster resolution during load and simpler + ;; `load-path' + (save-excursion + (let (cache) + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^/][^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + (replace-match + (or (cdr (assoc path cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path libpath) cache) + libpath) + (progn + (warn "Couldn't find absolute path for: %s" path) + path)) + t t nil 1)))) + (message "✓ Autoload paths expanded")) - (save-excursion - ;; insert package autoloads - (dolist (file (doom-packages--files doom-packages-dir "-autoloads\\.el$")) - (insert - (with-temp-buffer - (insert "\n(let ((load-file-name " (prin1-to-string file) "))") - (insert-file-contents file) - (while (re-search-forward "^;;\\(.*\n\\)" nil 'move) - (replace-match "" t t)) - (unless (bolp) (insert "\n")) - (insert ")\n") - (buffer-string)))) - (message "✓ Package autoloads included")) + ;; insert package autoloads + (save-excursion + (dolist (spec package-alist) + (let ((pkg (car spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file (concat (package--autoloads-file-name (cadr spec)) ".el"))) + (insert "(let ((load-file-name " (prin1-to-string file) "))") + (insert-file-contents file) + (while (re-search-forward "^;;\\(.*\n\\)" nil t) + (replace-match "" t t)) + (unless (bolp) (insert "\n")) + (insert ")\n"))))) + (message "✓ Package autoloads included")) - ;; Replace autoload paths with absolute paths for faster - ;; resolution during load and simpler `load-path' - (while (re-search-forward "^\\s-*(add-to-list\\s-+'\\(?:load-path\\|auto-mode-alist\\)" nil t) - (beginning-of-line-text) - (kill-sexp)) - (message "✓ Autoload load-path entries removed") + ;; Remove `load-path' and `auto-mode-alist' modifications (most + ;; of them, at least); they are cached elsewhere, so these are + ;; unnecessary overhead. + (while (re-search-forward (concat "^\\s-*(\\(" + "add-to-list\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\|" + "if (fboundp 'register-definition-prefixes)" + "\\)") + nil t) + (beginning-of-line) + (skip-chars-forward " \t") + (kill-sexp)) + (message "✓ load-path/auto-mode-alist entries removed") - (save-buffer) - (let (byte-compile-warnings) - ;; give the file a chance to reveal errors - (load doom-autoload-file nil 'nomessage 'nosuffix)) - (message "Done!")) - ('error - (delete-file doom-autoload-file) - (error "Error in autoloads.el: %s -- %s" - (car ex) (error-message-string ex)))) + ;; Remove byte-compile inhibiting file variables so we can + ;; byte-compile the file. + (when (re-search-forward "^;; no-byte-compile: t\n$" nil t) + (replace-match "" t t)) + (save-buffer) + + ;; Byte compile it to give the file a chance to reveal errors. + (condition-case-unless-debug ex + (quiet! (byte-compile-file doom-autoload-file 'load)) + ('error + (delete-file doom-autoload-file) + (message "Deleting autoloads file!") + (error "Error in autoloads.el: %s -- %s" + (car ex) (error-message-string ex)))) + (message "Done!")) (kill-buffer buf)))))) (defun doom//byte-compile (&optional modules recompile-p) From 7aecb85c34572fb3f9f66512dec436848081cae2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:10:05 +0200 Subject: [PATCH 1296/4235] Reverse order of operations for doom//reload-packages --- core/core-packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 475a7714f..b05c2376e 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -1013,9 +1013,9 @@ compiled packages.'" `doom//packages-install' before reloading your Emacs session." (interactive) (let ((doom--inhibit-reload t)) - (doom//reload-autoloads) (doom//packages-autoremove) - (doom//packages-install)) + (doom//packages-install) + (doom//reload-autoloads)) (doom//reload-load-path)) From 50401f6c09b521bbd6dcd109b0113c0a9382cdc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:11:20 +0200 Subject: [PATCH 1297/4235] Minor refactor of package management api --- core/autoload/packages.el | 75 ++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c67c8f73c..c27fb82e1 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -271,20 +271,17 @@ example; the package name can be omitted)." (doom-delete-package name t) (user-error "%s is already installed" name))) (let* ((inhibit-message (not doom-debug-mode)) - (plist (or plist (cdr (assq name doom-packages)))) - (recipe (plist-get plist :recipe)) - quelpa-upgrade-p) - (if recipe - (condition-case-unless-debug _ - (quelpa recipe) - ('error - (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) - (when (file-directory-p pkg-build-dir) - (delete-directory pkg-build-dir t))))) + (plist (or plist (cdr (assq name doom-packages))))) + (if-let* ((recipe (plist-get plist :recipe))) + (let (quelpa-upgrade-p) + (quelpa recipe)) (package-install name)) - (when (package-installed-p name) - (cl-pushnew (cons name plist) doom-packages :test #'eq :key #'car) - t))) + (if (not (package-installed-p name)) + (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) + (when (file-directory-p pkg-build-dir) + (delete-directory pkg-build-dir t))) + (map-put doom-packages name plist #'eq) + name))) (defun doom-update-package (name &optional force-p) "Updates package NAME (a symbol) if it is out of date, using quelpa or @@ -344,7 +341,8 @@ package.el as appropriate." (message! "Looking for packages to install...") (let ((packages (reverse (doom-get-missing-packages)))) (cond ((not packages) - (message! (green "No packages to install!"))) + (message! (green "No packages to install!")) + nil) ((not (or (getenv "YES") (y-or-n-p @@ -366,7 +364,8 @@ package.el as appropriate." "ELPA")))) (sort (cl-copy-list packages) #'doom--sort-alpha) "\n"))))) - (message! (yellow "Aborted!"))) + (message! (yellow "Aborted!")) + nil) (t (doom-refresh-packages-maybe doom-debug-mode) @@ -374,20 +373,23 @@ package.el as appropriate." (message! "Installing %s" (car pkg)) (doom--condition-case! (message! "%s%s" - (cond ((and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg))) - (not (doom-package-different-recipe-p (car pkg)))) - (dark (white "⚠ ALREADY INSTALLED"))) - ((doom-install-package (car pkg) (cdr pkg)) - (green "✓ DONE")) - (t - (red "✕ FAILED"))) + (if (and (package-installed-p (car pkg)) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg)))) + (dark (white "⚠ ALREADY INSTALLED")) + (condition-case e + (if (doom-install-package (car pkg) (cdr pkg)) + (green "✓ DONE") + (red "✕ FAILED")) + (error + (red "✕ ERROR (%s)" e)))) (if (plist-member (cdr pkg) :pin) (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) "")))) (message! (bold (green "Finished!"))) - (doom//reload-load-path)))))) + (doom//reload-load-path) + t))))) ;;;###autoload (defun doom//packages-update () @@ -399,7 +401,8 @@ package.el as appropriate." (doom-refresh-packages-maybe doom-debug-mode) (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) (cond ((not packages) - (message! (green "Everything is up-to-date"))) + (message! (green "Everything is up-to-date")) + nil) ((not (or (getenv "YES") (y-or-n-p @@ -417,7 +420,8 @@ package.el as appropriate." (package-version-join (cl-caddr pkg)))) packages "\n")))))) - (message! (yellow "Aborted!"))) + (message! (yellow "Aborted!")) + nil) (t (dolist (pkg packages) @@ -429,7 +433,8 @@ package.el as appropriate." (if result "✓ DONE" "✕ FAILED")))))) (message! (bold (green "Finished!"))) - (doom//reload-load-path)))))) + (doom//reload-load-path) + t))))) ;;;###autoload (defun doom//packages-autoremove () @@ -440,7 +445,8 @@ package.el as appropriate." (message! "Looking for orphaned packages...") (let ((packages (doom-get-orphaned-packages))) (cond ((not packages) - (message! (green "No unused packages to remove"))) + (message! (green "No unused packages to remove")) + nil) ((not (or (getenv "YES") @@ -453,13 +459,15 @@ package.el as appropriate." (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") + (pcase backend + (`quelpa "QUELPA->ELPA") + (`elpa "ELPA->QUELPA") + (_ "removed")) (upcase (symbol-name backend)))))) (sort (cl-copy-list packages) #'string-lessp) "\n"))))) - (message! (yellow "Aborted!"))) + (message! (yellow "Aborted!")) + nil) (t (dolist (pkg packages) @@ -472,7 +480,8 @@ package.el as appropriate." pkg))))) (message! (bold (green "Finished!"))) - (doom//reload-load-path)))))) + (doom//reload-load-path) + t))))) ;; From 80adb9c1f6b31394319e938441f029521c150c37 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:21:09 +0200 Subject: [PATCH 1298/4235] General refactor for consistency & idempotency Also updated comments --- core/autoload/ui.el | 2 +- core/core-lib.el | 2 +- core/core-packages.el | 8 +++++++- core/core.el | 6 +++--- modules/completion/ivy/config.el | 21 +++++++++++---------- modules/feature/evil/config.el | 2 +- modules/lang/clojure/config.el | 8 ++++---- modules/lang/crystal/config.el | 1 + modules/lang/elixir/config.el | 3 ++- modules/lang/emacs-lisp/config.el | 4 +--- modules/lang/ess/config.el | 2 +- modules/lang/markdown/config.el | 7 ++++--- modules/lang/python/config.el | 1 - modules/lang/web/+html.el | 1 - modules/ui/nav-flash/config.el | 9 +++++---- modules/ui/neotree/config.el | 4 ++-- modules/ui/window-select/packages.el | 7 ++++--- 17 files changed, 48 insertions(+), 40 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index eecbde67e..a3056e886 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -1,6 +1,5 @@ ;;; core/autoload/ui.el -*- lexical-binding: t; -*- -(defvar doom--line-number-style doom-line-numbers-style) ;;;###autoload (defun doom/toggle-line-numbers () "Toggle line numbers. @@ -10,6 +9,7 @@ Cycles through regular, relative and no line numbers. The order depends on what Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." (interactive) + (defvar doom--line-number-style doom-line-numbers-style) (let* ((styles '(t relative nil)) (order (cons doom-line-numbers-style (delq doom-line-numbers-style styles))) (queue (memq doom--line-number-style order)) diff --git a/core/core-lib.el b/core/core-lib.el index 460c828f5..89008a283 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -225,7 +225,7 @@ Body forms can access the hook's arguments through the let-bound variable (,mode 1))) ,@(if (and modes (listp modes)) (cl-loop for hook in (doom--resolve-hook-forms modes) - collect `(add-hook ',hook ',hook-name)) + collect `(add-hook ',hook #',hook-name)) `((add-hook 'after-change-major-mode-hook ',hook-name)))))) (match `(map-put doom-auto-minor-mode-alist ,match ',mode)) diff --git a/core/core-packages.el b/core/core-packages.el index b05c2376e..f06e50e2b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -419,11 +419,17 @@ added, if the file exists." ;; -;; Module config macros +;; Use-package modifications ;; (autoload 'use-package "use-package" nil nil 'macro) + + +;; +;; Module config macros +;; + (defmacro doom! (&rest modules) "Bootstraps DOOM Emacs and its modules. diff --git a/core/core.el b/core/core.el index 1c80302ca..20cb1c018 100644 --- a/core/core.el +++ b/core/core.el @@ -67,8 +67,7 @@ XDG directory conventions if ~/.config/doom exists.") (setq-default ad-redefinition-action 'accept ; silence advised function warnings apropos-do-all t ; make `apropos' more useful - debug-on-error (and (not noninteractive) doom-debug-mode) - load-prefer-newer noninteractive + debug-on-error doom-debug-mode ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often ;; keep the point out of the minibuffer @@ -83,8 +82,9 @@ XDG directory conventions if ~/.config/doom exists.") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) custom-file (concat doom-etc-dir "custom.el") - pcache-directory (concat doom-cache-dir "pcache/") mc/list-file (concat doom-etc-dir "mc-lists.el") + pcache-directory (concat doom-cache-dir "pcache/") + request-storage-directory (concat doom-cache-dir "request") server-auth-dir (concat doom-cache-dir "server/") shared-game-score-directory (concat doom-etc-dir "shared-game-score/") tramp-auto-save-directory (concat doom-cache-dir "tramp-auto-save/") diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index cf79298da..60a201d32 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -48,7 +48,7 @@ immediately runs it on the current candidate (ending the ivy session)." ivy-use-selectable-prompt t) (after! magit (setq magit-completing-read-function #'ivy-completing-read)) - (after! yasnippet (cl-pushnew #'+ivy-yas-prompt yas-prompt-functions :test #'eq)) + (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt #'eq)) (map! [remap switch-to-buffer] #'ivy-switch-buffer [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer @@ -94,6 +94,8 @@ immediately runs it on the current candidate (ending the ivy session)." (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)" + ;; Add smart-casing and compressed archive searching (-zS) to default + ;; command arguments: counsel-rg-base-command "rg -zS --no-heading --line-number --color never %s ." counsel-ag-base-command "ag -zS --nocolor --nogroup %s" counsel-pt-base-command "pt -zS --nocolor --nogroup -e %s") @@ -187,8 +189,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-posframe - :when EMACS26+ - :when (featurep! +childframe) + :when (and EMACS26+ (featurep! +childframe)) :hook (ivy-mode . ivy-posframe-enable) :preface ;; This function searches the entire `obarray' just to populate @@ -196,6 +197,12 @@ immediately runs it on the current candidate (ending the ivy session)." ;; wasteful, so... (advice-add #'ivy-posframe-setup :override #'ignore) :config + (setq ivy-height 16 + ivy-fixed-height-minibuffer nil + ivy-posframe-parameters `((min-width . 90) + (min-height . ,ivy-height) + (internal-border-width . 10))) + ;; ... let's do it manually (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left 'ivy-posframe-display-at-frame-center @@ -211,10 +218,4 @@ immediately runs it on the current candidate (ending the ivy session)." ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) - (map-put ivy-display-functions-alist fn nil)) - - (setq ivy-height 16 - ivy-fixed-height-minibuffer nil - ivy-posframe-parameters `((min-width . 90) - (min-height . ,ivy-height) - (internal-border-width . 10)))) + (map-put ivy-display-functions-alist fn nil))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 199c4d590..39c3830a7 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -311,7 +311,7 @@ the new algorithm is confusing, like in python or ruby." fn '((:default . evil-mc-execute-default-call)))) ;; disable evil-escape in evil-mc; causes unwanted text on invocation - (cl-pushnew 'evil-escape-mode evil-mc-incompatible-minor-modes :test #'eq) + (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode #'eq) (defun +evil|escape-multiple-cursors () "Clear evil-mc cursors and restore state." diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 7fdec8af1..53a18eded 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -14,10 +14,10 @@ :after clojure-mode :config ;; setup some extra namespace auto completion for great awesome - (nconc cljr-magic-require-namespaces - '(("re-frame" . "re-frame.core") - ("reagent" . "reagent.core") - ("str" . "clojure.string")))) + (dolist (ns '(("re-frame" . "re-frame.core") + ("reagent" . "reagent.core") + ("str" . "clojure.string"))) + (map-put cljr-magic-require-namespaces (car ns) (cdr ns)))) (def-package! cider diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index 738842bbe..f1b765e72 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -14,6 +14,7 @@ (def-package! flycheck-crystal + :when (featurep! :feature syntax-checker) :after crystal-mode :config (add-hook 'crystal-mode-hook #'flycheck-mode)) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index a7f8044dc..590bb545a 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -32,7 +32,8 @@ :when (featurep! :completion company) :after elixir-mode :config - ;; Let Doom handle this + ;; Alchemist doesn't use hook symbols to add these backends, so we have to use + ;; the entire closure to get rid of it. (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) (remove-hook 'alchemist-mode-hook fn) (remove-hook 'alchemist-iex-mode-hook fn)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index ef1dac765..20033e171 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -57,9 +57,7 @@ (defun +emacs-lisp|init-flycheck () "Initialize flycheck-mode if not in emacs.d." (when (and buffer-file-name - (not (cl-loop for dir in (append (list doom-emacs-dir) - doom-modules-dirs - doom-psuedo-module-dirs) + (not (cl-loop for dir in (list doom-emacs-dir doom-private-dir) if (file-in-directory-p buffer-file-name dir) return t))) (flycheck-mode +1)))) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index c84e04ddc..e08657a08 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -31,7 +31,7 @@ ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) :init (unless (featurep! :lang julia) - (push (cons "\\.jl\\'" 'ess-julia-mode) auto-mode-alist)) + (map-put auto-mode-alist "\\.jl\'" 'ess-julia-mode)) :config (add-hook 'ess-mode-hook #'doom|enable-line-numbers) (setq ess-offset-continued 'straight diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 921bd4768..b45cbe084 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -15,10 +15,11 @@ markdown-hide-urls nil) ; trigger with `markdown-toggle-url-hiding' :config + (defun +markdown|set-fill-column-and-line-spacing () + (setq-local line-spacing 2) + (setq-local fill-column 80)) + (add-hook 'markdown-mode-hook #'+markdown|set-fill-column-and-line-spacing) (add-hook 'markdown-mode-hook #'auto-fill-mode) - (setq-hook! 'markdown-mode-hook - line-spacing 2 - fill-column 80) (map! (:map markdown-mode-map [remap find-file-at-point] #'markdown-follow-thing-at-point diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 4c7d62bd8..4c6fe44f1 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -102,7 +102,6 @@ environment variables." :after anaconda-mode :config (map! :map anaconda-mode-map - :n "gf" nil :localleader :prefix "f" :nv "d" #'anaconda-mode-find-definitions diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 4e90eda69..a01979605 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -82,7 +82,6 @@ "M-/" #'web-mode-comment-or-uncomment :i "SPC" #'self-insert-command - :n "M-r" #'doom/web-refresh-browser :n "za" #'web-mode-fold-or-unfold :nv "]a" #'web-mode-attribute-next :nv "[a" #'web-mode-attribute-previous diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index 1fe7f2d31..a1519f993 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -11,10 +11,11 @@ counsel-grep-post-action-hook dumb-jump-after-jump-hook) #'+nav-flash/blink-cursor) + ;; `saveplace' (advice-add #'save-place-find-file-hook :after #'+nav-flash/blink-cursor) - (after! evil - (advice-add #'evil-window-top :after #'+nav-flash/blink-cursor) - (advice-add #'evil-window-middle :after #'+nav-flash/blink-cursor) - (advice-add #'evil-window-bottom :after #'+nav-flash/blink-cursor))) + ;; `evil' + (advice-add #'evil-window-top :after #'+nav-flash/blink-cursor) + (advice-add #'evil-window-middle :after #'+nav-flash/blink-cursor) + (advice-add #'evil-window-bottom :after #'+nav-flash/blink-cursor)) diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index ea3e752dd..2723ab273 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -38,8 +38,8 @@ `((side . ,neo-window-position) (size . ,neo-window-width)) '((quit . current) (select . t))) - (when (bound-and-true-p winner-mode) - (push neo-buffer-name winner-boring-buffers)) + (after! winner + (cl-pushnew neo-buffer-name winner-boring-buffers)) ;; The cursor always sits at bol. `+neotree*fix-cursor' and ;; `+neotree*indent-cursor' change that behavior, so that the cursor is always diff --git a/modules/ui/window-select/packages.el b/modules/ui/window-select/packages.el index fc1c5fd9f..30a4d7a92 100644 --- a/modules/ui/window-select/packages.el +++ b/modules/ui/window-select/packages.el @@ -2,10 +2,11 @@ ;;; ui/window-select/packages.el (cond ((featurep! +switch-window) - ;; Install switch-window if the user indicated the '+switch-window' module flag + ;; Install switch-window if the user indicated the '+switch-window' + ;; module flag (package! switch-window)) ((or (featurep! +ace-window) t) - ;; Install ace-window if the user selects the flag '+ace-window' or by default - ;; ... if the user did not specify a module flag + ;; Install ace-window if the user selects the flag '+ace-window' or by + ;; default ... if the user did not specify a module flag (package! ace-window))) From 88074718464a6bd48eaa2bcc326ad776c357cab6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:22:49 +0200 Subject: [PATCH 1299/4235] tools/eshell: fix parameters being set on the wrong window This would cause find-file commands to ignore certain windows, as well as eshell buffers closing the incorrect window when they are quit. Addresses #593 --- modules/tools/eshell/autoload/eshell.el | 39 +++++++++++++------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index d9ceb085a..57da503c8 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -36,7 +36,8 @@ (defun +eshell--remove-buffer (buf) (when-let* ((idx (ring-member +eshell-buffers buf))) - (ring-remove +eshell-buffers idx))) + (ring-remove +eshell-buffers idx) + t)) (defun +eshell--current-git-branch () (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") @@ -54,6 +55,11 @@ return buf)) (generate-new-buffer +eshell-buffer-name))) +(defun +eshell--set-window (window &optional flag) + (when window + (set-window-parameter window 'no-other-window flag) + (set-window-parameter window 'visible flag))) + ;;;###autoload (defun +eshell-prompt () "Generate the prompt string for eshell. Use for `eshell-prompt-function'." @@ -72,6 +78,7 @@ (interactive) (let ((buf (+eshell--buffer (eq major-mode 'eshell-mode)))) (switch-to-buffer buf) + (+eshell--set-window (get-buffer-window buf) t) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (when command @@ -85,6 +92,7 @@ (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (pop-to-buffer buf) + (+eshell--set-window (get-buffer-window buf) t) (when command (+eshell-run-command command)))) @@ -104,6 +112,7 @@ module to be loaded." (+eshell/open)) (when command (+eshell-run-command command)) + (+eshell--set-window (selected-window) t) (doom/workspace-display)) (defun +eshell-run-command (command) @@ -129,29 +138,23 @@ module to be loaded." (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) - (let ((window (selected-window))) - (set-window-parameter window 'no-other-window t) - (set-window-parameter window 'visible t) - (set-window-dedicated-p window t)) (+eshell--add-buffer buf) (setq +eshell-last-buffer buf))) ;;;###autoload (defun +eshell|cleanup () "Close window (or workspace) on quit." - (let ((window (selected-window))) - (set-window-parameter window 'no-other-window nil) - (set-window-parameter window 'visible t) - (set-window-dedicated-p window nil)) - (+eshell--remove-buffer (current-buffer)) - (cond ((and (featurep! :feature workspaces) - (string= "eshell" (+workspace-current-name))) - (+workspace/delete "eshell")) - ((one-window-p) - (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) - (switch-to-buffer (doom-fallback-buffer)))) - ((delete (current-buffer) (get-buffer-window-list)) - (delete-window)))) + (let ((buf (current-buffer))) + (when (+eshell--remove-buffer buf) + (+eshell--set-window (get-buffer-window buf) nil) + (cond ((and (featurep! :feature workspaces) + (string= "eshell" (+workspace-current-name))) + (+workspace/delete "eshell")) + ((one-window-p) + (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) + (switch-to-buffer (doom-fallback-buffer)))) + ((and (fboundp '+popup-window-p) (+popup-window-p)) + (delete-window)))))) ;; From b1dce548ade40c18dafad54b044e9df1842290ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:26:00 +0200 Subject: [PATCH 1300/4235] tools/eshell: consider eshell buffers real --- modules/tools/eshell/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 4a5ec3cb0..26f919bd9 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -30,6 +30,11 @@ eshell-error-if-no-glob t) :config + ;; Consider eshell buffers real + (defun +eshell-p (buf) + (eq (buffer-local-value 'major-mode buf) 'eshell-mode)) + (add-to-list 'doom-real-buffer-functions #'+eshell-p #'eq) + ;; Keep track of open eshell buffers (add-hook 'eshell-mode-hook #'+eshell|init) (add-hook 'eshell-exit-hook #'+eshell|cleanup) From 3d0745c3ecaacddad62dbd7eac8e23290acd850d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:28:40 +0200 Subject: [PATCH 1301/4235] Add automatic indentation-detection (experimental) Editorconfig is given precedence. If it successfully sets an indent_style or indent_size for the current buffer, automatic indentation detection will be disabled. --- core/core-editor.el | 14 ++++++++++++++ core/packages.el | 1 + modules/tools/editorconfig/config.el | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index 03fa0cae3..da456d948 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -10,6 +10,11 @@ modes are active and the buffer is read-only.") doc-view-mode doc-view-mode-maybe ebrowse-tree-mode pdf-view-mode) "Major modes that `doom|check-large-file' will ignore.") +(defvar-local doom-inhibit-indent-detection nil + "A buffer-local flag that indicates whether `dtrt-indent' should try to detect +indentation settings or not. This should be set by editorconfig if it +successfully sets indent_style/indent_size.") + (setq-default vc-follow-symlinks t ;; Save clipboard contents into kill-ring before replacing them @@ -170,6 +175,15 @@ fundamental-mode) for performance sake." (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode t)) +(def-package! dtrt-indent + :config + (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) + + (defun doom|detect-indentation () + (unless (or doom-inhibit-indent-detection (eq major-mode 'fundamental-mode)) + (dtrt-indent-mode +1))) + (add-hook 'after-change-major-mode-hook #'doom|detect-indentation)) + (def-package! expand-region :commands (er/expand-region er/contract-region er/mark-symbol er/mark-word) :config diff --git a/core/packages.el b/core/packages.el index 1483cfd3e..7edaaa5ba 100644 --- a/core/packages.el +++ b/core/packages.el @@ -23,6 +23,7 @@ (package! ace-window) (package! avy) (package! command-log-mode) +(package! dtrt-indent) (package! expand-region) (package! helpful) (package! pcre2el) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index bbe4cbaf6..2e5d98795 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -39,6 +39,12 @@ extension, try to guess one." (apply orig-fn args))) (advice-add #'editorconfig-call-editorconfig-exec :around #'doom*editorconfig-smart-detection) + (defun +editorconfig|disable-indent-detection (props) + (when (or (gethash 'indent_style props) + (gethash 'indent_size props)) + (setq doom-inhibit-indent-detection t))) + (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-indent-detection) + ;; Editorconfig makes indentation too rigid in Lisp modes, so tell ;; editorconfig to ignore indentation there. I prefer dynamic indentation ;; support built into Emacs. From 84befc03036ce2fe626f5462d5501ba53823c0de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:43:16 +0200 Subject: [PATCH 1302/4235] lang/org: map bash src blocks to ob-shell --- modules/lang/org/+babel.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 4a140b3a4..5511bebf0 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -7,6 +7,7 @@ ("C++" . C) ("D" . C) ("sh" . shell) + ("bash" . shell) ("matlab" . octave)) "An alist that maps languages to babel libraries. This is necessary for babel libraries (ob-*.el) that don't match the name of the language.") From 7db7aed52d48173555882ae873d0a76619418657 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:43:37 +0200 Subject: [PATCH 1303/4235] lang/org: refactor & add org-clock config/keybinds --- modules/lang/org/config.el | 55 +++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 48ab7a213..a2c17bb28 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -20,12 +20,6 @@ :commands toc-org-enable :config (setq toc-org-hrefify-default "org")) -(def-package! org-crypt ; built-in - :commands org-crypt-use-before-save-magic - :config - (setq org-tags-exclude-from-inheritance '("crypt") - org-crypt-key user-mail-address)) - (def-package! org-bullets :commands org-bullets-mode) @@ -89,16 +83,16 @@ unfold to point on startup." (defun +org|smartparens-compatibility-config () "Instruct `smartparens' not to impose itself in org-mode." - (defun +org-sp-point-in-checkbox-p (_id action _context) - (and (eq action 'insert) - (sp--looking-at-p "\\s-*]"))) - (defun +org-sp-point-at-bol-p (_id action _context) - (and (eq action 'insert) - (eq (char-before) ?*) - (sp--looking-back-p "^\\**" (line-beginning-position)))) - - ;; make delimiter auto-closing a little more conservative (after! smartparens + (defun +org-sp-point-in-checkbox-p (_id action _context) + (and (eq action 'insert) + (sp--looking-at-p "\\s-*]"))) + (defun +org-sp-point-at-bol-p (_id action _context) + (and (eq action 'insert) + (eq (char-before) ?*) + (sp--looking-back-p "^\\**" (line-beginning-position)))) + + ;; make delimiter auto-closing a little more conservative (sp-with-modes 'org-mode (sp-local-pair "*" nil :unless '(:add sp-point-before-word-p +org-sp-point-at-bol-p)) (sp-local-pair "_" nil :unless '(:add sp-point-before-word-p)) @@ -302,7 +296,17 @@ between the two." :n "zm" (λ! (outline-hide-sublevels 1)) :n "zo" #'outline-show-subtree :n "zO" #'outline-show-all - :n "zr" #'outline-show-all)) + :n "zr" #'outline-show-all + + :localleader + :n "d" #'org-deadline + :n "t" #'org-todo + (:desc "clock" :prefix "c" + :n "c" #'org-clock-in + :n "C" #'org-clock-out + :n "g" #'org-clock-goto + :n "G" (λ! (org-clock-goto 'select)) + :n "x" #'org-clock-cancel))) (defun +org|setup-hacks () "Getting org to behave." @@ -330,6 +334,25 @@ between the two." (advice-add #'org-get-agenda-file-buffer :around #'+org*exclude-agenda-buffers-from-recentf)) + +;; +;; Built-in libraries +;; + +(def-package! org-crypt ; built-in + :commands org-crypt-use-before-save-magic + :config + (setq org-tags-exclude-from-inheritance '("crypt") + org-crypt-key user-mail-address)) + +(def-package! org-clock + :commands org-clock-save + :hook (org-mode . org-clock-load) + :config + (setq org-clock-persist 'history + org-clock-persist-file (concat doom-etc-dir "org-clock-save.el")) + (add-hook 'kill-emacs-hook 'org-clock-save)) + ;; (when (featurep 'org) (run-hooks 'org-load-hook)) From 170b7f97e7b04bb34362d18c03a017d38a15acd7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:44:17 +0200 Subject: [PATCH 1304/4235] config/default: rebind I/J indent textobjects to k/j --- modules/config/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4a0d994fd..a72aa6e2c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -417,8 +417,8 @@ :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 + :textobj "k" #'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 (:map evil-window-map ; prefix "C-w" ;; Navigation From 72b9e80cde033171cb343ba22ea1778c72a8ee25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:46:04 +0200 Subject: [PATCH 1305/4235] config/default: add :rev[erse] command (reverse lines) --- modules/config/default/+evil-commands.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index b64a10242..f520be83d 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -27,6 +27,11 @@ command from the current directory instead of the project root." (command (and command (evil-ex-replace-special-filenames command)))) (compile command))) +(evil-define-command doom:reverse-lines (beg end) + "Reverse lines between BEG and END." + (interactive "") + (reverse-region beg end)) + ;; ;; Commands @@ -47,6 +52,7 @@ command from the current directory instead of the project root." (ex! "iedit" #'evil-multiedit-ex-match) (ex! "na[rrow]" #'+evil:narrow-buffer) (ex! "retab" #'+evil:retab) +(ex! "rev[erse]" #'doom:reverse-lines) ;; External resources ;; TODO (ex! "db" #'doom:db) ;; TODO (ex! "dbu[se]" #'doom:db-select) From 5abdeed8fd0511bceb0f765d33ac65129b140623 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 01:47:00 +0200 Subject: [PATCH 1306/4235] feature/file-templates: rewrite without autoinsert autoinsert was more trouble than it was worth, so I reinvented a better wheel. --- modules/feature/file-templates/autoload.el | 77 +++++- modules/feature/file-templates/config.el | 258 +++++++++--------- .../templates/emacs-lisp-mode/__doom-doctor | 3 + 3 files changed, 211 insertions(+), 127 deletions(-) create mode 100644 modules/feature/file-templates/templates/emacs-lisp-mode/__doom-doctor diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index ce0d08930..2566434c0 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -1,11 +1,79 @@ ;;; feature/file-templates/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :file-template (pred &rest plist) + "Register a file template. + +PRED can either be a regexp string or a major mode symbol. PLIST may contain +these properties: + + :when FUNCTION + Provides a secondary predicate. This function takes no arguments and is + executed from within the target buffer. If it returns nil, this rule will be + skipped over. + :trigger + The yasnippet trigger keyword used to trigger the target snippet. If + omitted, `+file-templates-default-trigger' is used. + :mode SYMBOL + What mode to get the yasnippet snippet from. If omitted, either PRED (if + it's a major-mode symbol) or the mode of the buffer is used. + :project BOOL + If non-nil, ignore this template if this buffer isn't in a project. + :ignore BOOL + If non-nil, don't expand any template for this file and don't test any other + file template rule against this buffer." + `(push (list ,pred ,@plist) +file-templates-alist)) + +;;;###autoload +(def-setting! :file-templates (&rest templates) + "Like `doom--set:file-template', but register many file templates at once." + `(setq +file-templates-alist (append (list ,@templates) +file-templates-alist))) + + +;; +;; Library +;; + +;;;###autoload +(defun +file-templates--expand (pred &rest plist) + "Auto insert a yasnippet snippet into current file and enter insert mode (if +evil is loaded and enabled)." + (when (and pred (not (plist-get plist :ignore))) + (let ((project (plist-get plist :project)) + (mode (plist-get plist :mode)) + (trigger (plist-get plist :trigger))) + (when (if project (doom-project-p) t) + (unless mode + (setq mode (if (symbolp pred) pred major-mode))) + (unless mode + (user-error "Couldn't determine mode for %s file template" pred)) + (unless trigger + (setq trigger +file-templates-default-trigger)) + (require 'yasnippet) + (unless yas-minor-mode + (yas-minor-mode-on)) + (when (and yas-minor-mode + (yas-expand-snippet + (yas--template-content + (cl-find trigger (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) + (overlay-get yas--active-field-overlay 'yas--field))) + (evil-initialize-state 'insert)))))) + ;;;###autoload (defun +file-templates-get-short-path () - "TODO" + "Fetches a short file path for the header in Doom module templates." (when (string-match "/modules/\\(.+\\)$" buffer-file-truename) (match-string 1 buffer-file-truename))) + +;; +;; Commands +;; + ;;;###autoload (defun +file-templates/insert-license () "Insert a license file template into the current file." @@ -21,3 +89,10 @@ (uuid (yas-choose-value (mapcar #'car templates)))) (when uuid (yas-expand-snippet (cdr (assoc uuid templates)))))) + +;;;###autoload +(defun +file-templates/debug () + "Tests the current buffer and outputs the file template rule most appropriate +for it. This is used for testing." + (interactive) + (message "Found %s" (cl-find-if #'+file-template-p +file-templates-alist))) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 38a47dd49..511bca956 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -6,136 +6,142 @@ (expand-file-name "templates/" (file-name-directory load-file-name)) "The path to a directory of yasnippet folders to use for file templates.") -(def-setting! :file-template (regexp trigger mode &optional project-only-p) - "Register a file template (associated with TRIGGER, the uuid of the target -snippet) for empty files that match REGEXP in MODE (a major mode symbol). +(defvar +file-templates-alist () + "An alist of file template rules. The CAR of each rule is either a major mode +symbol or regexp string. The CDR is a plist. See `doom--set:file-template' for +more information.") -If PROJECT-ONLY-P is non-nil, the template won't be expanded if the buffer isn't -in a project." - `(+file-templates-add (list ,regexp ,trigger ,mode ,project-only-p))) +(defvar +file-templates-default-trigger "__" + "The default yasnippet trigger key (a string) for file template rules that +don't have a :trigger property in `+file-templates-alist'.") + + +;; +;; Bootstrap +;; + +(after! yasnippet + (add-to-list 'yas-snippet-dirs '+file-templates-dir 'append #'eq)) + +(defun +file-template-p (rule) + "Return t if RULE applies to the current buffer." + (let ((pred (car rule)) + (plist (cdr rule))) + (and (cond ((stringp pred) (string-match-p pred)) + ((symbolp pred) (eq major-mode pred))) + (or (not (plist-member plist :when)) + (funcall (plist-get plist :when) buffer-file-name)) + rule))) + +(defun +file-templates|init () + "Check if the current buffer is a candidate for file template expansion. It +must be non-read-only, empty, and there must be a rule in +`+file-templates-alist' that applies to it." + (when (and (not buffer-read-only) + (bobp) (eobp)) + (when-let* ((rule (cl-find-if #'+file-template-p +file-templates-alist))) + (apply #'+file-templates--expand rule)))) + +(add-hook 'find-file-hook #'+file-templates|init) + + +;; +;; File templates +;; + +(defun +file-templates-in-emacs-dirs-p (file) + "Returns t if FILE is in Doom or your private directory." + (or (file-in-directory-p file doom-private-dir) + (file-in-directory-p file doom-emacs-dir))) + +(setq +file-templates-alist + `(;; General + (gitignore-mode) + (dockerfile-mode) + ("/docker-compose\\.yml$" :mode yaml-mode) + ("/Makefile$" :mode makefile-gmake-mode) + ;; elisp + ("/.dir-locals.el$") + ("/packages\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-packages" + :mode emacs-lisp-mode) + ("/doctor\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-doctor" + :mode emacs-lisp-mode) + ("/test/.+\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-test" + :mode emacs-lisp-mode) + ("\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-module" + :mode emacs-lisp-mode) + ("-test\\.el$" :mode emacs-ert-mode) + (emacs-lisp-mode :trigger "__initfile") + (snippet-mode) + ;; C/C++ + ("/main\\.c\\(?:c\\|pp\\)$" :trigger "__main.cpp" :mode c++-mode) + ("/win32_\\.c\\(?:c\\|pp\\)$" :trigger "__winmain.cpp" :mode c++-mode) + ("\\.c\\(?:c\\|pp\\)$" :trigger "__cpp" :mode c++-mode) + ("\\.h\\(?:h\\|pp\\|xx\\)$" :trigger "__hpp" :mode c++-mode) + ("\\.h$" :trigger "__h" :mode c-mode) + (c-mode :trigger "__c" :mode c-mode) + ;; go + ("/main\\.go$" :trigger "__main.go" :mode go-mode :project t) + (go-mode :trigger "__.go") + ;; web-mode + ("/normalize\\.scss$" :trigger "__normalize.scss" :mode scss-mode) + ("/master\\.scss$" :trigger "__master.scss" :mode scss-mode) + ("\\.html$" :trigger "__.html" :mode web-mode) + (scss-mode) + ;; java + ("/main\\.java$" :trigger "__main" :mode java-mode) + ("/build\\.gradle$" :trigger "__build.gradle" :mode android-mode) + ("/src/.+\\.java$" :mode java-mode) + ;; javascript + ("/package\\.json$" :trigger "__package.json" :mode json-mode) + ("/bower\\.json$" :trigger "__bower.json" :mode json-mode) + ("/gulpfile\\.js$" :trigger "__gulpfile.js" :mode js-mode) + ("/webpack\\.config\\.js$" :trigger "__webpack.config.js" :mode js-mode) + ("\\.js\\(?:on\\|hintrc\\)$" :mode json-mode) + ;; Lua + ("/main\\.lua$" :trigger "__main.lua" :mode love-mode) + ("/conf\\.lua$" :trigger "__conf.lua" :mode love-mode) + ;; Markdown + (markdown-mode) + ;; Org + ("\\.org$" :trigger "__" :mode org-mode) + ("/README\\.org$" + :when +file-templates-in-emacs-dirs-p + :trigger "__doom-readme" + :mode org-mode) + ;; PHP + ("\\.class\\.php$" :trigger "__.class.php" :mode php-mode) + (php-mode) + ;; Python + ;; TODO ("tests?/test_.+\\.py$" :trigger "__" :mode nose-mode) + ;; TODO ("/setup\\.py$" :trigger "__setup.py" :mode python-mode) + (python-mode) + ;; Ruby + ("/lib/.+\\.rb$" :trigger "__module" :mode ruby-mode :project t) + ("/spec_helper\\.rb$" :trigger "__helper" :mode rspec-mode :project t) + ("_spec\\.rb$" :mode rspec-mode :project t) + ("/\\.rspec$" :trigger "__.rspec" :mode rspec-mode :project t) + ("\\.gemspec$" :trigger "__.gemspec" :mode ruby-mode :project t) + ("/Gemfile$" :trigger "__Gemfile" :mode ruby-mode :project t) + ("/Rakefile$" :trigger "__Rakefile" :mode ruby-mode :project t) + (ruby-mode) + ;; Rust + ("/Cargo.toml$" :trigger "__Cargo.toml" :mode rust-mode) + ("/main\\.rs$" :trigger "__main.rs" :mode rust-mode) + ;; Slim + ("/\\(?:index\\|main\\)\\.slim$" :mode slim-mode) + ;; Shell scripts + ("\\.zunit$" :trigger "__zunit" :mode sh-mode) + (fish-mode) + (sh-mode) + )) ;; ;; Plugins ;; -(def-package! autoinsert ; built-in - :commands (auto-insert-mode auto-insert) - :init - (setq auto-insert-query nil ; Don't prompt before insertion - auto-insert-alist nil) ; Tabula rasa - - (after! yasnippet - (cl-pushnew '+file-templates-dir yas-snippet-dirs :test #'eq)) - - ;; load autoinsert as late as possible - (defun +file-templates|init () - (and (not buffer-read-only) - (bobp) (eobp) - (remove-hook 'find-file-hook #'+file-templates|init) - (auto-insert))) - (add-hook 'find-file-hook #'+file-templates|init) - - :config - (auto-insert-mode 1) - - (defun +file-templates--expand (key &optional mode project-only) - "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)) - (when (and yas-minor-mode - (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) - (overlay-get yas--active-field-overlay 'yas--field))) - (evil-initialize-state 'insert)))) - - (defun +file-templates-add (args) - (cl-destructuring-bind (regexp trigger &optional mode project-only-p) args - (push `(,regexp . (lambda () (+file-templates--expand ,trigger ',mode ,project-only-p))) - auto-insert-alist))) - - (mapc #'+file-templates-add - (let* ((dirs (mapcar (lambda (path) (string-remove-prefix (expand-file-name "~") path)) - (cl-remove-duplicates - (append (list doom-emacs-dir doom-private-dir) - (mapcar #'file-truename (list doom-emacs-dir doom-private-dir))) - :test 'string=))) - (doom (regexp-opt dirs))) - `(;; General - ("/\\.gitignore$" "__" gitignore-mode) - ("/Dockerfile$" "__" dockerfile-mode) - ("/docker-compose.yml$" "__" yaml-mode) - ("/Makefile$" "__" makefile-gmake-mode) - ;; elisp - ("\\.el$" "__initfile" emacs-lisp-mode) - ("/.dir-locals.el$" nil) - ("-test\\.el$" "__" emacs-ert-mode) - (,(concat doom ".+\\.el$") "__doom-module" emacs-lisp-mode) - (,(concat doom "\\(?:.+/\\)?packages\\.el$") "__doom-packages" emacs-lisp-mode) - (,(concat doom "\\(?:.+/\\)?test/.+\\.el$") "__doom-test" emacs-lisp-mode) - (snippet-mode "__" snippet-mode) - ;; C/C++ - ("\\.h$" "__h" c-mode) - ("\\.c$" "__c" c-mode) - ("\\.h\\(h\\|pp|xx\\)$" "__hpp" c++-mode) - ("\\.\\(cc\\|cpp\\)$" "__cpp" c++-mode) - ("/main\\.\\(cc\\|cpp\\)$" "__main.cpp" c++-mode) - ("/win32_\\.\\(cc\\|cpp\\)$" "__winmain.cpp" c++-mode) - ;; go - ("\\.go$" "__.go" go-mode) - ("/main\\.go$" "__main.go" go-mode t) - ;; web-mode - ("\\.html$" "__.html" web-mode) - ("\\.scss$" "__" scss-mode) - ("/master\\.scss$" "__master.scss" scss-mode) - ("/normalize\\.scss$" "__normalize.scss" scss-mode) - ;; java - ("/src/.+\\.java$" "__" java-mode) - ("/main\\.java$" "__main" java-mode) - ("/build\\.gradle$" "__build.gradle" android-mode) - ;; javascript - ("\\.\\(json\\|jshintrc\\)$" "__" json-mode) - ("/package\\.json$" "__package.json" json-mode) - ("/bower\\.json$" "__bower.json" json-mode) - ("/gulpfile\\.js$" "__gulpfile.js" js-mode) - ("/webpack\\.config\\.js$" "__webpack.config.js" js-mode) - ;; Lua - ("/main\\.lua$" "__main.lua" love-mode) - ("/conf\\.lua$" "__conf.lua" love-mode) - ;; Markdown - ("\\.md$" "__" markdown-mode) - ;; Org - ("\\.org$" "__" org-mode) - (,(concat doom "/README\\.org$") "__doom-readme" org-mode) - ;; PHP - ("\\.php$" "__" php-mode) - ("\\.class\\.php$" "__.class.php" php-mode) - ;; Python - ;;("tests?/test_.+\\.py$" "__" nose-mode) - ;;("/setup\\.py$" "__setup.py" python-mode) - ("\\.py$" "__" python-mode) - ;; Ruby - ("\\.rb$" "__" ruby-mode) - ("/Rakefile$" "__Rakefile" ruby-mode t) - ("/Gemfile$" "__Gemfile" ruby-mode t) - ("/\\.rspec$" "__.rspec" rspec-mode) - ("\\.gemspec$" "__.gemspec" ruby-mode t) - ("/spec_helper\\.rb$" "__helper" rspec-mode t) - ("/lib/.+\\.rb$" "__module" ruby-mode t) - ("_spec\\.rb$" "__" rspec-mode t) - ;; Rust - ("/main\\.rs$" "__main.rs" rust-mode) - ("/Cargo.toml$" "__Cargo.toml" rust-mode) - ;; Slim - ("/\\(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/emacs-lisp-mode/__doom-doctor b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-doctor new file mode 100644 index 000000000..af30ef14b --- /dev/null +++ b/modules/feature/file-templates/templates/emacs-lisp-mode/__doom-doctor @@ -0,0 +1,3 @@ +;;; `(+file-templates-get-short-path)` -*- lexical-binding: t; -*- + +$0 From 1bbf5b7d190f1989d0f6f912c3c8e02ae7ee8ee0 Mon Sep 17 00:00:00 2001 From: Aria Date: Fri, 18 May 2018 13:45:06 +1000 Subject: [PATCH 1307/4235] lang/org Make agenda view span 10 days --- modules/lang/org/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a2c17bb28..a6d69b199 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -126,7 +126,13 @@ unfold to point on startup." org-agenda-dim-blocked-tasks nil org-agenda-files (ignore-errors (directory-files +org-dir t "\\.org$" t)) org-agenda-inhibit-startup t - org-agenda-skip-unavailable-files t)) + org-agenda-skip-unavailable-files t) + ;; Move the agenda to show the previous 3 days and the next 7 days for a bit + ;; better context instead of just the current week which is a bit confusing + ;; on, for example, a sunday + (setq org-agenda-span 10 + org-agenda-start-on-weekday nil + org-agenda-start-day "-3d")) (defun +org|setup-ui () "Configures the UI for `org-mode'." From ee386f84619b5565e11fd1a1964ff8ba3f7629fb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 18:47:15 +0200 Subject: [PATCH 1308/4235] Fix wrong-number-of-args error when installing packages The fourth argument of map-put is an Emacs 26+ only feature. --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c27fb82e1..f5f6f7efa 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -280,7 +280,7 @@ example; the package name can be omitted)." (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) (when (file-directory-p pkg-build-dir) (delete-directory pkg-build-dir t))) - (map-put doom-packages name plist #'eq) + (map-put doom-packages name plist) name))) (defun doom-update-package (name &optional force-p) From f16aa539c79ba79360c0fb3ba658ecddb038cd83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 18 May 2018 22:04:59 +0200 Subject: [PATCH 1309/4235] Fix window is not a live frame error #596 --- core/core-ui.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 055d42966..bf0bb9439 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -587,13 +587,13 @@ frame's window-system, the theme will be reloaded.") ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) -(after! whitespace - (defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) - (with-selected-frame (apply orig-fn args) +(defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) + (let ((frame (apply orig-fn args))) + (with-selected-frame frame (setq-local whitespace-style nil) - (selected-window))) - (advice-add #'company-box--make-frame :around #'doom*fix-whitespace-mode-in-childframes) - (advice-add #'posframe--create-posframe :around #'doom*fix-whitespace-mode-in-childframes)) + frame))) +(advice-add #'company-box--make-frame :around #'doom*fix-whitespace-mode-in-childframes) +(advice-add #'posframe--create-posframe :around #'doom*fix-whitespace-mode-in-childframes) ;; ensure posframe cleans up after itself (after! posframe From 3193e7a8a76f8c07efda4f44f500f434bbb1a1cd Mon Sep 17 00:00:00 2001 From: Edmund Milller Date: Thu, 17 May 2018 21:00:30 -0500 Subject: [PATCH 1310/4235] Add Solidity Add basic Solidity module --- init.example.el | 1 + modules/lang/solidity/README.org | 31 +++++++++++++++++++++++++++++++ modules/lang/solidity/config.el | 28 ++++++++++++++++++++++++++++ modules/lang/solidity/doctor.el | 8 ++++++++ modules/lang/solidity/packages.el | 6 ++++++ 5 files changed, 74 insertions(+) create mode 100644 modules/lang/solidity/README.org create mode 100644 modules/lang/solidity/config.el create mode 100644 modules/lang/solidity/doctor.el create mode 100644 modules/lang/solidity/packages.el diff --git a/init.example.el b/init.example.el index 92a2163f1..64b6d2b27 100644 --- a/init.example.el +++ b/init.example.el @@ -104,6 +104,7 @@ rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() scala ; java, but good sh ; she sells (ba|z)sh shells on the C xor + solidity ; do you need a blockchain? No. swift ; who asked for emoji variables? typescript ; javascript, but better web ; the tubes diff --git a/modules/lang/solidity/README.org b/modules/lang/solidity/README.org new file mode 100644 index 000000000..b407c498f --- /dev/null +++ b/modules/lang/solidity/README.org @@ -0,0 +1,31 @@ +#+TITLE: :lang solidity + +This module adds [[https://github.com/ethereum/solidity][Solidity]] support through [[https://github.com/ethereum/emacs-solidity][solidity-mode]] + ++ Syntax-checking (~flycheck~) ++ Code completion (~[[https://github.com/ssmolkin1/company-solidity][company-solidity]]~) ++ Gas estimation(~C-c C-g~) + +* Install +There are two options for linters. + +** [[https://github.com/ethereum/solc-js][Solc]] +#+BEGIN_SRC sh +npm install -g solc +#+END_SRC + +** [[http://solium.readthedocs.io/en/latest/user-guide.html#installation][Solium]] +#+BEGIN_SRC sh +npm install -g solium +#+END_SRC + +By default *solium* looks for ~.soliumrc.json~ in the project directory, but you can set it to your own ~.soliumrc.json~ with this in your private doom ~config.el~ + +#+BEGIN_SRC emacs-lisp +(setq flycheck-solidity-solium-soliumrcfile "/$HOME/.soliumrc.json") +#+END_SRC + +They can be chained together so it's recommended you use both. *Solc* is ran first, and then *Solium* if *Solc* doesn't catch any errors. + +* TODO ++ Snippets diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el new file mode 100644 index 000000000..ef09f7bef --- /dev/null +++ b/modules/lang/solidity/config.el @@ -0,0 +1,28 @@ +;;; lang/solidity/config.el -*- lexical-binding: t; -*- + +;; +;; Plugins +;; + +(def-package! solidity-mode + :mode "\\.sol$" + :init + (setq solidity-solc-path "$HOME/.node_modules/bin/solcjs") + (setq solidity-solium-path "$HOME/.node_modules/bin/solium") + + (setq solidity-flycheck-solc-checker-active t) + (setq solidity-flycheck-solium-checker-active t) + + (setq flycheck-solidity-solc-addstd-contracts t) + :config + (setq solidity-comment-style 'slash)) + +(def-package! company-solidity + :when (featurep! :completion company) + :after solidity-mode + :config + (add-hook 'solidity-mode-hook + (lambda () + (set (make-local-variable 'company-backends) + (append '((company-solidity company-capf company-dabbrev-code)) + company-backends))))) diff --git a/modules/lang/solidity/doctor.el b/modules/lang/solidity/doctor.el new file mode 100644 index 000000000..851008c5d --- /dev/null +++ b/modules/lang/solidity/doctor.el @@ -0,0 +1,8 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/solidity/doctor.el + +(unless (executable-find "solc") + (warn! "Solc isn't installed.")) + +(unless (executable-find "solium -V") + (warn! "Solium isn't installed.")) diff --git a/modules/lang/solidity/packages.el b/modules/lang/solidity/packages.el new file mode 100644 index 000000000..e778adbdf --- /dev/null +++ b/modules/lang/solidity/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/solidity/packages.el + +(package! solidity-mode) +(when (featurep! :completion company) + (package! company-solidity)) From f4234779ce42a478a2f875839c4aa24f7529e90e Mon Sep 17 00:00:00 2001 From: Edmund Milller Date: Thu, 17 May 2018 21:51:42 -0500 Subject: [PATCH 1311/4235] Remove Company package It's been moved into solidity-mode already. --- modules/lang/solidity/packages.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/solidity/packages.el b/modules/lang/solidity/packages.el index e778adbdf..fa8c36556 100644 --- a/modules/lang/solidity/packages.el +++ b/modules/lang/solidity/packages.el @@ -2,5 +2,3 @@ ;;; lang/solidity/packages.el (package! solidity-mode) -(when (featurep! :completion company) - (package! company-solidity)) From 01993aa69875e2770e9fc38fee8a993a4e19c6b8 Mon Sep 17 00:00:00 2001 From: Edmund Milller Date: Thu, 17 May 2018 21:52:34 -0500 Subject: [PATCH 1312/4235] Fix solc and solium pathes The bin files were links to the real thing. --- modules/lang/solidity/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index ef09f7bef..c8678ae10 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -7,8 +7,8 @@ (def-package! solidity-mode :mode "\\.sol$" :init - (setq solidity-solc-path "$HOME/.node_modules/bin/solcjs") - (setq solidity-solium-path "$HOME/.node_modules/bin/solium") + (setq solidity-solc-path "~/.node_modules/lib/node_modules/solc/solcjs") + (setq solidity-solium-path "~/.node_modules/lib/node_modules/solium/bin/solium.js") (setq solidity-flycheck-solc-checker-active t) (setq solidity-flycheck-solium-checker-active t) From dcec3b9b25043152beb9c1972195d612e264bc94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 19 May 2018 12:07:11 +0200 Subject: [PATCH 1313/4235] feature/popup: add new autosave window parameter (autosave . CDR) This parameter determines what to do with modified buffers in closing popup windows. CDR can be a t, 'ignore, a function or nil. + If t, no prompts. Just save them automatically (if they're file-visiting buffers). + If 'ignore, no prompts, no saving. Just silently kill it. + If nil (the default), prompt the user what to do if the buffer is file-visiting and modified. + If a function, the return value must return one of the other values. It takes two arguments: the popup window and buffer. --- modules/ui/popup/autoload.el | 3 ++- modules/ui/popup/config.el | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 8b33d7d91..844e3d1ef 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -68,7 +68,8 @@ and enables `+popup-buffer-mode'." ttl) (when (and (buffer-file-name buffer) (buffer-modified-p buffer) - (y-or-n-p "Popup buffer is modified. Save it?")) + (or (+popup-parameter-fn 'autosave window buffer) + (y-or-n-p "Popup buffer is modified. Save it?"))) (with-current-buffer buffer (save-buffer))) (set-buffer-modified-p nil) (let ((ignore-window-parameters t)) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 62c201748..d83c8d708 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -45,6 +45,18 @@ Modifying this has no effect, unless done before ui/popup loads. modeline defined with `def-modeline!', nil (show no modeline) or a function that returns one of these. The function takes one argument: the popup buffer. +(autosave . CDR) + This parameter determines what to do with modified buffers in closing popup + windows. CDR can be a t, 'ignore, a function or nil. + + If t, no prompts. Just save them automatically (if they're file-visiting + buffers). + If 'ignore, no prompts, no saving. Just silently kill it. + If nil (the default), prompt the user what to do if the buffer is + file-visiting and modified. + If a function, the return value must return one of the other values. It takes + two arguments: the popup window and buffer. + (popup . t) This is for internal use, do not change this. It simply marks a window as a popup window. @@ -103,13 +115,13 @@ deleted.") '((transient . 0) (quit . t))) (+popup-define "^\\*\\(?:scratch\\|Messages\\)" nil - '((transient))) + '((autosave . t) (transient))) (+popup-define "^\\*doom \\(?:term\\|eshell\\)" '((size . 0.25) (vslot . -10)) '((select . t) (quit) (transient . 0))) (+popup-define "^\\*doom:" '((size . 0.35) (side . bottom)) - '((select . t) (modeline . t) (quit) (transient . t))) + '((autosave . t) (select . t) (modeline . t) (quit) (transient . t))) (+popup-define "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" '((size . +popup-shrink-to-fit)) '((transient . 0) (select . ignore))) From 217ff2cd54fa25de90de7f0f1d3cdd9d58a0eefa Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Sat, 19 May 2018 15:02:54 +0100 Subject: [PATCH 1314/4235] Fix use of +workspaces-data-file in +workspace/load --- modules/feature/workspaces/autoload/workspaces.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index b014d5588..90b2d5b3c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -211,7 +211,7 @@ current workspace (by name) from session files." (completing-read "Workspace to load: " (persp-list-persp-names-in-file - (expand-file-name +workspace-data-file persp-save-dir)))))) + (expand-file-name +workspaces-data-file persp-save-dir)))))) (if (not (+workspace-load name)) (+workspace-error (format "Couldn't load workspace %s" name)) (+workspace/switch-to name) From 59f510e85fb59b7c70da49b31d5fd3a740ac8368 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 19 May 2018 16:32:12 +0200 Subject: [PATCH 1315/4235] Add four new functions for keywords & file collection --- core/core-lib.el | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/core/core-lib.el b/core/core-lib.el index 89008a283..8d430b617 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -43,6 +43,36 @@ "Return EXP wrapped in a list, or as-is if already a list." (if (listp exp) exp (list exp))) +(defun doom-keyword-intern (str) + "TODO" + (intern (concat ":" str))) + +(defun doom-keyword-name (keyword) + "TODO" + (or (keywordp keyword) + (signal 'wrong-type-argument (list 'keyword keyword))) + (substring (symbol-name keyword) 1)) + +(cl-defun doom-files-in (dirs &key when unless full map (nosort t) (match "^[^.]")) + "TODO" + (let ((results (cl-loop for dir in (doom-enlist dirs) + if (file-directory-p dir) + nconc (directory-files dir full match nosort)))) + (when when + (cl-delete-if-not when results)) + (when unless + (cl-delete-if unless results)) + (when map + (setq results (mapcar map results))) + results)) + +(cl-defun doom-files-under (dirs &key include-dirs (match "^[^.]")) + "Like `directory-files-recursively', but traverses symlinks." + (cl-letf (((symbol-function #'file-symlink-p) #'ignore)) + (cl-loop for dir in (doom-enlist dirs) + if (file-directory-p dir) + nconc (directory-files-recursively dir match include-dirs)))) + (defun doom*shut-up (orig-fn &rest args) "Generic advisor for silencing noisy functions." (quiet! (apply orig-fn args))) From fa37d7b05e2399f3506ae46de7aa0f77f2aa1ac2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 19 May 2018 16:42:31 +0200 Subject: [PATCH 1316/4235] Refactor core initialization process A vastly simpler bootstrap process. Also load core libs in core-lib (duh) --- core/core-lib.el | 5 +++++ core/core-packages.el | 11 ++--------- core/core.el | 19 ++++++++++++------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 8d430b617..08977c353 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,5 +1,10 @@ ;;; core-lib.el -*- lexical-binding: t; -*- +(let ((load-path doom-site-load-path)) + (require 'subr-x) + (require 'cl-lib) + (require 'map)) + (eval-and-compile (unless EMACS26+ (with-no-warnings diff --git a/core/core-packages.el b/core/core-packages.el index f06e50e2b..4508747f9 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -1,7 +1,5 @@ ;;; core-packages.el --- package management system -*- lexical-binding: t; -*- -(require 'core-lib (concat doom-core-dir "core-lib")) - ;; Emacs package management is opinionated. Unfortunately, so am I. I've bound ;; together `use-package', `quelpa' and package.el to create my own, ;; rolling-release, lazily-loaded package management system for Emacs. @@ -201,15 +199,10 @@ FORCE-P is non-nil, do it anyway. 4. Builds and caches `load-path', `Info-directory-list' and `doom-disabled-packages' in `doom-packages-file'" ;; Called early during initialization; only use native (and cl-lib) functions! - (let ((load-path doom-site-load-path)) - (require 'subr-x) - (require 'cl-lib) - (require 'map)) - (when (eq doom-init-p 'internal) - (setq force-p nil)) (when (or force-p (not doom-init-p)) ;; packages.el cache - (when (and force-p (file-exists-p doom-packages-file)) + (when (and (or force-p noninteractive) + (file-exists-p doom-packages-file)) (message "Deleting packages.el cache") (delete-file doom-packages-file)) (unless (load doom-packages-file 'noerror 'nomessage 'nosuffix) diff --git a/core/core.el b/core/core.el index 20cb1c018..4e304ff3c 100644 --- a/core/core.el +++ b/core/core.el @@ -173,14 +173,19 @@ this, you'll get stuttering and random freezes) and resets gc-cons-threshold 16777216 gc-cons-percentage 0.15)) -;; -(require 'core-packages (concat doom-core-dir "core-packages")) -(doom-initialize noninteractive) -(add-hook! '(emacs-startup-hook doom-reload-hook) - #'doom|finalize) -(when doom-private-dir - (load (concat doom-private-dir "init") t t)) +;; +;; Bootstrap Doom +;; + +(add-to-list 'load-path doom-core-dir) + +(require 'core-packages) +(require 'core-lib) +(require 'core-os) + +(unless noninteractive + (doom-initialize)) (provide 'core) ;;; core.el ends here From a19a64b16b29ced9610ffc10c5fc03e9ade20cb5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 19 May 2018 18:01:49 +0200 Subject: [PATCH 1317/4235] Complain if using Emacs <25 More helpful than advice-add errors. --- core/core.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/core.el b/core/core.el index 4e304ff3c..a681f59b5 100644 --- a/core/core.el +++ b/core/core.el @@ -1,5 +1,10 @@ ;;; core.el --- the heart of the beast -*- lexical-binding: t; -*- +(eval-when-compile + (when (version< emacs-version "25") + (error "Doom only supports Emacs 25.1 and higher!"))) + +;; (defvar doom-version "2.0.9" "Current version of DOOM emacs.") From 17d5721102db9c546b51bfac0cde6d13eaf1f83e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 19 May 2018 23:49:25 +0200 Subject: [PATCH 1318/4235] Minor reformatting of core startup config --- core/core.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/core.el b/core/core.el index a681f59b5..2cea52f61 100644 --- a/core/core.el +++ b/core/core.el @@ -75,6 +75,12 @@ XDG directory conventions if ~/.config/doom exists.") debug-on-error doom-debug-mode ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often +;; be quiet at startup; don't load or display anything unnecessary + 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 ;; keep the point out of the minibuffer minibuffer-prompt-properties '(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt) ;; History & backup settings (save nothing, that's what git is for) @@ -98,14 +104,6 @@ XDG directory conventions if ~/.config/doom exists.") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) -;; be quiet at startup; don't load or display anything unnecessary -(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)) ;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and ;; `window-setup-hook'. @@ -153,6 +151,9 @@ with functions that require it (like modeline segments)." buffer)) (advice-add #'make-indirect-buffer :around #'doom*set-indirect-buffer-filename) +;; Truly silence startup message +(advice-add #'display-startup-echo-area-message :override #'ignore) + ;; ;; Bootstrap From 6f5e710d981248d9ef85c91deafd1e745592dba6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 19 May 2018 23:58:14 +0200 Subject: [PATCH 1319/4235] Refactor startup process, hooks, doom-initialize & doom! + Brings back doom-pre-init-hook and doom-post-init-hook hooks. + Extracts autoload file loading logic into doom-initialize-autoloads function. --- core/core-packages.el | 67 +++++++++++++++++++++++++++---------------- core/core.el | 23 +++++++++++---- 2 files changed, 60 insertions(+), 30 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 4508747f9..a06569712 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -78,9 +78,6 @@ missing) and shouldn't be deleted.") everyone in the universe and their dog, causing errors that make babies cry. No one wants that.") -(defvar doom-reload-hook nil - "A list of hooks to run when `doom/reload-load-path' is called.") - (defvar doom-site-load-path load-path "The starting load-path, before it is altered by `doom-initialize'.") @@ -91,6 +88,9 @@ one wants that.") "Where to cache `load-path', `Info-directory-list', `doom-disabled-packages' and `auto-mode-alist'.") +(defvar doom-reload-hook nil + "A list of hooks to run when `doom//reload-load-path' is called.") + (defvar doom--current-module nil) (defvar doom--refreshed-p nil) (defvar doom--stage 'init) @@ -181,8 +181,18 @@ If RETURN-P, return the message as a string instead of displaying it." (or doom-init-time (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) -(add-hook 'emacs-startup-hook #'doom|display-benchmark) -(add-hook 'doom-reload-hook #'doom|display-benchmark) +(defun doom|post-init () + "Run `doom-post-init-hook'. That's all." + (run-hooks 'doom-post-init-hook)) + +(defun doom|run-all-startup-hooks () + "Run all startup Emacs hooks. Meant to follow running Emacs in a vanilla +session, with a different init.el, like so: + + emacs -Q -l init.el -f doom|run-all-startup-hooks" + (run-hooks 'after-init-hook 'delayed-warnings-hook + 'emacs-startup-hook 'term-setup-hook + 'window-setup-hook)) ;; @@ -232,34 +242,41 @@ FORCE-P is non-nil, do it anyway. (if (package-installed-p package) (message "✓ Installed %s" package) (error "✕ Couldn't install %s" package))) - (message "Installing core packages...done")))) + (message "Installing core packages...done"))) + (unless noninteractive + (add-hook 'doom-pre-init-hook #'doom|refresh-cache))) ;; autoloads file - (condition-case-unless-debug e - (unless - (let (byte-compile-warnings) - (load (substring doom-autoload-file 0 -3) 'noerror 'nomessage)) - (error "No autoloads file! Run make autoloads")) - (error - (funcall (if noninteractive #'warn #'error) - "Autoload file error: %s -> %s" (car e) (error-message-string e)))) - (add-to-list 'load-path doom-core-dir)) + (doom-initialize-autoloads)) ;; initialize Doom core - (require 'core-os) (unless noninteractive - (unless doom-init-p - ;; Cache important packages.el state - (doom|refresh-cache)) (require 'core-ui) (require 'core-editor) (require 'core-projects) (require 'core-keybinds)) + ;; bootstrap Doom + (unless doom-init-p + (unless noninteractive + (add-hook! 'doom-reload-hook + #'(doom|refresh-cache doom|display-benchmark)) + (add-hook! 'emacs-startup-hook + #'(doom|post-init doom|display-benchmark))) + (run-hooks 'doom-pre-init-hook) + (when doom-private-dir + (load (concat doom-private-dir "init") t t))) (setq doom-init-p t)) (defun doom-initialize-autoloads () - "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run -`doom//reload-autoloads' to generate it. Used from Doom's Makefile." - (unless (file-exists-p doom-autoload-file) - (quiet! (doom//reload-autoloads)))) + "Tries to load `doom-autoload-file', otherwise throws an error (unless in a +noninteractive session)." + (unless + (condition-case-unless-debug e + (load (substring doom-autoload-file 0 -3) 'noerror 'nomessage) + (error + (funcall (if noninteractive #'warn #'error) + "Autoload error: %s -> %s" + (car e) (error-message-string e)))) + (unless noninteractive + (error "No autoloads file! Run make autoloads")))) (defun doom-initialize-packages (&optional force-p) "Ensures that `doom-packages', `packages-alist' and `quelpa-cache' are @@ -448,11 +465,13 @@ MODULES is an malformed plist of modules to load." `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) + (run-hooks 'doom-init-hook) (unless noninteractive (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir - (load ,(concat doom-private-dir "config") t t))))))) + (load ,(concat doom-private-dir "config") + t (not doom-debug-mode)))))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." diff --git a/core/core.el b/core/core.el index 2cea52f61..e9f68279f 100644 --- a/core/core.el +++ b/core/core.el @@ -107,8 +107,18 @@ XDG directory conventions if ~/.config/doom exists.") ;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and ;; `window-setup-hook'. +(defvar doom-pre-init-hook nil + "Hooks run after Doom is first initialized; after Doom's core files are +loaded, but before your private init.el file or anything else is loaded.") + (defvar doom-init-hook nil - "A list of hooks run when DOOM is initialized.") + "Hooks run after all init.el files are loaded, including your private and all +module init.el files, but before their config.el files are loaded.") + +(defvar doom-post-init-hook nil + "A list of hooks run when Doom is fully initialized. Fires at the end of +`emacs-startup-hook', as late as possible. Guaranteed to run after everything +else (except for `window-setup-hook').") ;; @@ -156,7 +166,7 @@ with functions that require it (like modeline segments)." ;; -;; Bootstrap +;; Optimize startup ;; (defvar doom--file-name-handler-alist file-name-handler-alist) @@ -173,11 +183,12 @@ with functions that require it (like modeline segments)." "Resets garbage collection settings to reasonable defaults (if you don't do this, you'll get stuttering and random freezes) and resets `file-name-handler-alist'." - (unless noninteractive - (run-hooks 'doom-init-hook)) (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 16777216 - gc-cons-percentage 0.15)) + gc-cons-threshold 8388608 + gc-cons-percentage 0.1)) + +(add-hook 'emacs-startup-hook #'doom|finalize) +(add-hook 'doom-reload-hook #'doom|finalize) ;; From 5abdbaee38911e4d6fc48dfab01354474cacf442 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:01:07 +0200 Subject: [PATCH 1320/4235] Rewrite docstrings for doom-initialize{,-packages} --- core/core-packages.el | 50 +++++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index a06569712..a0dcfdc9a 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -200,17 +200,34 @@ session, with a different init.el, like so: ;; (defun doom-initialize (&optional force-p) - "Bootstrap the bare essentials to get Doom running, if it hasn't already. If -FORCE-P is non-nil, do it anyway. + "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). -1. Ensures all the essential directories exist, -2. Ensures core packages are installed, -3. Loads your autoloads file in `doom-autoload-file', -4. Builds and caches `load-path', `Info-directory-list' and - `doom-disabled-packages' in `doom-packages-file'" - ;; Called early during initialization; only use native (and cl-lib) functions! +The bootstrap process involves making sure the essential directories exist, core +packages are installed, `doom-autoload-file' is loaded, `doom-packages-file' +cache exists (and is loaded) and, finally, loads your private init.el (which +should contain your `doom!' block). + +If the cache exists, much of this function isn't run, which substantially +reduces startup time. + +The overall load order of Doom is as follows: + + ~/.emacs.d/init.el + ~/.emacs.d/core/core.el + `doom-pre-init-hook' + ~/.doom.d/init.el + Module init.el files + `doom-init-hook' + Module config.el files + ~/.doom.d/config.el + `after-init-hook' + `emacs-startup-hook' + `doom-post-init-hook' (at end of `emacs-startup-hook') + +Module load order is determined by your `doom!' block. See `doom-modules-dirs' +for a list of all recognized module trees. Order defines precedence (from most +to least)." (when (or force-p (not doom-init-p)) - ;; packages.el cache (when (and (or force-p noninteractive) (file-exists-p doom-packages-file)) (message "Deleting packages.el cache") @@ -220,7 +237,7 @@ FORCE-P is non-nil, do it anyway. (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 packages have been initialized + ;; Ensure plugins have been initialized (require 'package) (setq package-activated-list nil package--initialized nil) @@ -230,7 +247,7 @@ FORCE-P is non-nil, do it anyway. ('error (package-refresh-contents) (setq doom--refreshed-p t) (package-initialize)))) - ;; Ensure core packages are installed. + ;; Ensure core packages are installed (let ((core-packages (cl-remove-if #'package-installed-p doom-core-packages))) (when core-packages (message "Installing core packages") @@ -279,17 +296,18 @@ noninteractive session)." (error "No autoloads file! Run make autoloads")))) (defun doom-initialize-packages (&optional force-p) - "Ensures that `doom-packages', `packages-alist' and `quelpa-cache' are -populated. + "Ensures that Doom's package management system, package.el and quelpa are +initialized, and `doom-packages', `packages-alist' and `quelpa-cache' are +populated, if they aren't already. -This reads modules' packages.el files, runs `package-initialize', and -initializes quelpa, if they haven't already. If FORCE-P is non-nil, do it -anyway. If FORCE-P is 'internal, only (re)populate `doom-packages'. +If FORCE-P is non-nil, do it anyway. +If FORCE-P is 'internal, only (re)populate `doom-packages'. Use this before any of package.el, quelpa or Doom's package management's API to ensure all the necessary package metadata is initialized and available for them." (with-temp-buffer ; prevent buffer-local settings from propagating + ;; Prefer uncompiled files to reduce stale code issues (let ((load-prefer-newer t)) ;; package.el and quelpa handle themselves if their state changes during ;; the current session, but if you change an packages.el file in a module, From 85ee9ce459885b6618885418647b0fe3ee359c9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:03:53 +0200 Subject: [PATCH 1321/4235] Refactor doom module API + Consolidate the CATEGORY -> MODULE terminology + Rename functions to make their function easier to understand + Rename doom-module-expand-file => doom-module-path + Rename doom-module-find-path => doom-module-locate-path --- bin/doom-doctor | 4 +- core/core-packages.el | 104 +++++++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 49 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 08899c919..39d3c8fd4 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -297,8 +297,8 @@ (maphash (lambda (key plist) (condition-case ex - (let ((doctor-file (doom-module-expand-file (car key) (cdr key) "doctor.el")) - (packages-file (doom-module-expand-file (car key) (cdr key) "packages.el")) + (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) + (packages-file (doom-module-path (car key) (cdr key) "packages.el")) doom-packages) (when (or (file-exists-p doctor-file) (file-exists-p packages-file)) diff --git a/core/core-packages.el b/core/core-packages.el index a0dcfdc9a..aa753e844 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -352,7 +352,7 @@ them." (let ((doom--stage 'packages)) (_load (expand-file-name "packages.el" doom-core-dir)) (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-expand-file (car key) (cdr key) "packages.el") + for path = (doom-module-path (car key) (cdr key) "packages.el") do (let ((doom--current-module key)) (_load path t))) (cl-loop for dir in doom-psuedo-module-dirs do (_load (expand-file-name "packages.el" dir) t)))))))) @@ -362,81 +362,91 @@ them." ;; Module API ;; -(defun doom-module-p (module submodule) - "Returns t if MODULE SUBMODULE is enabled (ie. present in `doom-modules')." +(defun doom-module-p (category module) + "Returns t if CATEGORY MODULE is enabled (ie. present in `doom-modules')." (and (hash-table-p doom-modules) - (gethash (cons module submodule) doom-modules) + (gethash (cons category module) doom-modules) t)) -(defun doom-module-get (module submodule &optional property) - "Returns the plist for MODULE/SUBMODULE. If PROPERTY is set, get its property." - (when-let* ((plist (gethash (cons module submodule) doom-modules))) +(defun doom-module-get (category module &optional property) + "Returns the plist for CATEGORY MODULE. Gets PROPERTY, specifically, if set." + (when-let* ((plist (gethash (cons category module) doom-modules))) (if property (plist-get plist property) plist))) -(defun doom-module-put (module submodule property value) - "Set a PROPERTY for MODULE SUBMODULE to VALUE." - (when-let* ((plist (doom-module-get module submodule))) - (puthash (cons module submodule) - (plist-put plist property value) - doom-modules))) +(defun doom-module-put (category module property value &rest rest) + "Set a PROPERTY for CATEGORY MODULE to VALUE. PLIST should be additional pairs +of PROPERTY and VALUEs." + (when-let* ((plist (doom-module-get category module))) + (plist-put plist property value) + (when rest + (when (cl-oddp (length rest)) + (signal 'wrong-number-of-arguments (length (length rest)))) + (while rest + (plist-put rest (pop rest) (pop rest)))) + (puthash (cons category module) plist doom-modules))) -(defun doom-module-set (module submodule &rest plist) - "Adds MODULE and SUBMODULE to `doom-modules' and sets its plist to PLIST, -which should contain a minimum of :flags and :path. +(defun doom-module-set (category module &rest plist) + "Enables a module by adding it to `doom-modules'. -MODULE is a keyword, SUBMODULE is a symbol, PLIST is a plist that accepts the +CATEGORY is a keyword, module is a symbol, PLIST is a plist that accepts the following properties: - :flags [SYMBOL LIST] list of enabled module flags - :path [STRING] path to module root directory + :flags [SYMBOL LIST] list of enabled category flags + :path [STRING] path to category root directory Example: - - (doom-module-set :lang 'haskell :flags '(+intero)) - -Used by `require!'." + (doom-module-set :lang 'haskell :flags '(+intero))" (when plist - (let ((old-plist (doom-module-get module submodule))) + (let ((old-plist (doom-module-get category module))) (unless (plist-member plist :flags) (plist-put plist :flags (plist-get old-plist :flags))) (unless (plist-member plist :path) (plist-put plist :path (or (plist-get old-plist :path) - (doom-module-find-path module submodule)))))) - (let ((key (cons module submodule))) + (doom-module-locate-path category module)))))) + (let ((key (cons category module))) (puthash key plist doom-modules))) -(defun doom-module-find-path (module submodule &optional file) - "Get the full path to a module: e.g. :lang emacs-lisp maps to -~/.emacs.d/modules/lang/emacs-lisp/ and will append FILE if non-nil." - (when (keywordp module) - (setq module (substring (symbol-name module) 1))) - (when (symbolp submodule) - (setq submodule (symbol-name submodule))) +(defun doom-module-path (category module &optional file) + "Like `expand-file-name', but expands FILE relative to CATEGORY (keywordp) and +MODULE (symbol). + +If the category isn't enabled this will always return nil. For finding disabled +modules use `doom-module-locate-path'." + (let ((path (doom-module-get category module :path))) + (if file (expand-file-name file path) + path))) + +(defun doom-module-locate-path (category &optional module file) + "Searches `doom-modules-dirs' to find the path to a module. + +CATEGORY is a keyword (e.g. :lang) and MODULE is a symbol (e.g. 'python). FILE +is a string that will be appended to the resulting path. If no path exists, this +returns nil, otherwise an absolute path. + +This doesn't require modules to be enabled. For enabled modules us +`doom-module-path'." + (when (keywordp category) + (setq category (substring (symbol-name category) 1))) + (when (and module (symbolp module)) + (setq module (symbol-name module))) (cl-loop for default-directory in doom-modules-dirs - for path = (concat module "/" submodule "/" file) + for path = (concat category "/" module "/" file) if (file-exists-p path) return (expand-file-name path))) (defun doom-module-from-path (&optional path) - "Get module cons cell (MODULE . SUBMODULE) for PATH, if possible." - (or doom--current-module + "Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path)." + (or doom--current-module + (when path (save-match-data (setq path (file-truename path)) (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) (when-let* ((module (match-string 1 path)) (submodule (match-string 2 path))) (cons (intern (concat ":" module)) - (intern submodule))))))) - -(defun doom-module-expand-file (module submodule &optional file) - "Like `expand-file-name', but expands FILE relative to MODULE (keywordp) and -SUBMODULE (symbol)" - (let ((path (doom-module-get module submodule :path))) - (if file - (expand-file-name file path) - path))) + (intern submodule)))))))) (defun doom-module-load-path () "Returns a list of absolute file paths to activated modules, with APPEND-FILE @@ -469,7 +479,7 @@ MODULES is an malformed plist of modules to load." ((not module) (error "No namespace specified in `doom!' for %s" m)) ((let ((submodule (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) - (let ((path (doom-module-find-path module submodule))) + (let ((path (doom-module-locate-path module submodule))) (if (not path) (when doom-debug-mode (message "Couldn't find the %s %s module" module submodule)) @@ -579,7 +589,7 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (apply #'doom-module-set module submodule (mapcar #'eval plist))) (when (or reload-p (not enabled-p)) - (let ((module-path (doom-module-find-path module submodule))) + (let ((module-path (doom-module-locate-path module submodule))) (if (file-directory-p module-path) `(condition-case-unless-debug ex (let ((doom--current-module ',(cons module submodule))) From dc4e0f155654b07124ead42d962edc21b5bfee1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:07:06 +0200 Subject: [PATCH 1322/4235] Add doom-file-cookie-p to core-lib --- core/core-lib.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/core-lib.el b/core/core-lib.el index 08977c353..527188cdf 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -48,6 +48,16 @@ "Return EXP wrapped in a list, or as-is if already a list." (if (listp exp) exp (list exp))) +(defun doom-file-cookie-p (file) + "Returns the value of the ;;;###if predicate form in FILE." + (with-temp-buffer + (insert-file-contents-literally file nil 0 256) + (if (and (re-search-forward "^;;;###if " nil t) + (<= (line-number-at-pos) 3)) + (let ((load-file-name file)) + (eval (sexp-at-point))) + t))) + (defun doom-keyword-intern (str) "TODO" (intern (concat ":" str))) From 2d2ce3cff914d38e1ab519005306e045cacf5a0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:08:19 +0200 Subject: [PATCH 1323/4235] Fix exec-path/osx-clipboard initializing too early --- core/core-os.el | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 6e2d9002d..b270aa375 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -30,20 +30,21 @@ ;; Don't open files from the workspace in a new frame ns-pop-up-frames nil) - (cond ((display-graphic-p) - ;; A known problem with GUI Emacs on MacOS: it runs in an isolated - ;; environment, so envvars will be wrong. That includes the PATH - ;; Emacs picks up. `exec-path-from-shell' fixes this. - (when (require 'exec-path-from-shell nil t) - (def-setting! :env (&rest vars) - "Inject VARS from your shell environment into Emacs." - `(exec-path-from-shell-copy-envs (list ,@vars))) - (setq exec-path-from-shell-check-startup-files nil - exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) - (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) - (exec-path-from-shell-initialize))) - ((require 'osx-clipboard nil t) - (osx-clipboard-mode +1)))) + (if (not (display-graphic-p)) + (add-hook 'doom-post-init-hook #'osx-clipboard-mode) + ;; A known problem with GUI Emacs on MacOS: it runs in an isolated + ;; environment, so envvars will be wrong. That includes the PATH Emacs + ;; picks up. `exec-path-from-shell' fixes this. + (defun doom|init-exec-path () + (when (require 'exec-path-from-shell nil t) + (def-setting! :env (&rest vars) + "Inject VARS from your shell environment into Emacs." + `(exec-path-from-shell-copy-envs (list ,@vars))) + (setq exec-path-from-shell-check-startup-files nil + exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) + (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) + (exec-path-from-shell-initialize))) + (add-hook 'doom-pre-init-hook #'doom|init-exec-path))) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! From 1d99ee5017d325fd1e665ae5e1dd260984cfb9fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:37:48 +0200 Subject: [PATCH 1324/4235] Add esup back to core package list --- core/packages.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/packages.el b/core/packages.el index 7edaaa5ba..a6f962fde 100644 --- a/core/packages.el +++ b/core/packages.el @@ -36,3 +36,6 @@ ;; core-keybinds.el (package! which-key) (package! hydra) + +;; autoload/debug.el +(package! esup) From a46e7655dcfe8f8c1d8d932eabfd0f01ffd087d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:57:18 +0200 Subject: [PATCH 1325/4235] Move batch commands from core-packages to autoload/modules --- core/autoload/modules.el | 288 ++++++++++++++++++++++++++++++++ core/core-packages.el | 347 +-------------------------------------- 2 files changed, 289 insertions(+), 346 deletions(-) create mode 100644 core/autoload/modules.el diff --git a/core/autoload/modules.el b/core/autoload/modules.el new file mode 100644 index 000000000..ffc6089ba --- /dev/null +++ b/core/autoload/modules.el @@ -0,0 +1,288 @@ +;;; core/autoload/modules.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun doom//reload () + "Reload your private Doom config. Experimental!" + (interactive) + (let ((load-prefer-newer t)) + (message "Reloading your private config...") + (setq doom-modules (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0)) + (doom-initialize t) + (doom//reload-autoloads)) + (message "✓ Done!")) + +;;;###autoload +(defun doom//reload-load-path () + "Reload `load-path' and recompile files (if necessary). + +Use this when `load-path' is out of sync with your plugins. This should only +happen if you manually modify/update/install packages from outside Emacs, while +an Emacs session is running. + +This isn't necessary if you use Doom's package management commands because they +call `doom//reload-load-path' remotely (through emacsclient)." + (interactive) + (unless doom--inhibit-reload + (when (file-exists-p doom-packages-file) + (delete-file doom-packages-file)) + (cond ((and noninteractive (not (daemonp))) + (require 'server) + (when (server-running-p) + (message "Reloading active Emacs session...") + (server-eval-at server-name '(doom//reload-load-path)))) + (t + (doom-initialize t) + (message "%d packages reloaded" (length package-alist)) + (run-hooks 'doom-reload-hook))))) + +(defvar generated-autoload-load-name) +;;;###autoload +(defun doom//reload-autoloads (&optional force) + "Refreshes the autoloads.el file, specified by `doom-autoload-file'. + +It scans and reads core/autoload/*.el, modules/*/*/autoload.el and +modules/*/*/autoload/*.el, and generates an autoloads file at the path specified +by `doom-autoload-file'. This file tells Emacs where to find lazy-loaded +functions. + +This should be run whenever init.el or an autoload file is modified. Running +'make autoloads' from the commandline executes this command." + (interactive) + ;; This function must not use autoloaded functions or external dependencies. + ;; It must assume nothing is set up! + (let ((default-directory doom-emacs-dir) + (targets + (file-expand-wildcards + (expand-file-name "autoload/*.el" doom-core-dir))) + (generate-autoload-section-continuation "") + (generate-autoload-section-header "") + (generate-autoload-section-trailer "") + (doom--stage 'autoloads) + outdated) + (doom-initialize) + (dolist (path (doom-module-load-path)) + (let ((auto-dir (expand-file-name "autoload" path)) + (auto-file (expand-file-name "autoload.el" path))) + (when (file-exists-p auto-file) + (push auto-file targets)) + (when (file-directory-p auto-dir) + (dolist (file (doom-files-under auto-dir :match "\\.el$")) + (push file targets))))) + (when (file-exists-p doom-autoload-file) + (delete-file doom-autoload-file) + (ignore-errors (delete-file (byte-compile-dest-file doom-autoload-file))) + (message "Deleted old autoloads.el")) + (message "Generating new autoloads.el") + (dolist (file (mapcar #'file-truename (reverse targets))) + (let ((generated-autoload-load-name (file-name-sans-extension file))) + (message + (cond ((not (doom-file-cookie-p file)) + "⚠ Ignoring %s") + ((update-file-autoloads file nil doom-autoload-file) + "✕ Nothing in %s") + ("✓ Scanned %s")) + (if (file-in-directory-p file default-directory) + (file-relative-name file) + (abbreviate-file-name file))))) + (make-directory (file-name-directory doom-autoload-file) t) + (let ((buf (find-file-noselect doom-autoload-file t)) + (load-path (append doom-psuedo-module-dirs + doom-modules-dirs + load-path)) + case-fold-search) + ;; FIXME Make me faster + (unwind-protect + (with-current-buffer buf + (goto-char (point-min)) + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") + + ;; Replace autoload paths (only for module autoloads) with + ;; absolute paths for faster resolution during load and simpler + ;; `load-path' + (save-excursion + (let (cache) + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + (replace-match + (or (cdr (assoc path cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path (abbreviate-file-name libpath)) cache) + libpath) + (progn + (warn "Couldn't find absolute path for: %s" path) + path)) + t t nil 1)))) + (message "✓ Autoload paths expanded")) + + ;; insert package autoloads + (save-excursion + (dolist (spec package-alist) + (let ((pkg (car spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file + (abbreviate-file-name + (concat (package--autoloads-file-name (cadr spec)) ".el")))) + (insert "(let ((load-file-name " (prin1-to-string file) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n"))))) + (message "✓ Package autoloads included")) + + ;; Remove `load-path' and `auto-mode-alist' modifications (most + ;; of them, at least); they are cached elsewhere, so these are + ;; unnecessary overhead. + (while (re-search-forward (concat "^\\s-*(\\(add-to-list\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)") + nil t) + (beginning-of-line) + (skip-chars-forward " \t") + (kill-sexp)) + (message "✓ load-path/auto-mode-alist entries removed") + + ;; Remove byte-compile inhibiting file variables so we can + ;; byte-compile the file. + (when (re-search-forward "^;; no-byte-compile: t\n$" nil t) + (replace-match "" t t)) + (save-buffer) + + ;; Byte compile it to give the file a chance to reveal errors. + (condition-case-unless-debug ex + (quiet! (byte-compile-file doom-autoload-file 'load)) + ('error + (delete-file doom-autoload-file) + (message "Deleting autoloads file!") + (error "Error in autoloads.el: %s -- %s" + (car ex) (error-message-string ex)))) + (message "Done!")) + (kill-buffer buf))))) + +;;;###autoload +(defun doom//byte-compile (&optional modules recompile-p) + "Byte compiles your emacs configuration. + +init.el is always byte-compiled by this. + +If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are +byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom +core. It always ignores unit tests and files with `no-byte-compile' enabled. + +Doom was designed to benefit from byte-compilation, but the process may take a +while. Also, while your config files are byte-compiled, changes to them will not +take effect! Use `doom//clean-byte-compiled-files' or `make clean' to remove +these files. + +If RECOMPILE-P is non-nil, only recompile out-of-date files." + (interactive + (list nil current-prefix-arg)) + (let ((default-directory doom-emacs-dir) + (recompile-p (or recompile-p (and (member "-r" (cdr argv)) t))) + (argv (delete "-r" argv))) + (unless recompile-p + (doom//clean-byte-compiled-files)) + (let ((total-ok 0) + (total-fail 0) + (total-noop 0) + (modules (or modules (cdr argv))) + compile-plugins + compile-targets) + ;; Ensure that Doom has been fully loaded, some of its state may be + ;; pertinent to files compiled later. + (let ((doom--stage 'compile) + noninteractive) + ;; Core libraries aren't fully loaded in a noninteractive session, so we + ;; pretend to be interactive and reinitialize + (doom-initialize)) + ;; Assemble el files we want to compile; taking into account that MODULES + ;; may be a list of MODULE/SUBMODULE strings from the command line. + (setq + modules (or modules (append (list doom-core-dir) (doom-module-load-path))) + compile-targets + (cl-loop for target in modules + if (equal target ":core") + nconc (nreverse (doom-files-under doom-core-dir :match "\\.el$")) + and collect (expand-file-name "init.el" doom-private-dir) + if (equal target ":private") + nconc (nreverse (doom-files-under doom-private-dir :match "\\.el$")) + if (equal target ":plugins") + do (setq compile-plugins t) + else if (file-directory-p target) + nconc (nreverse (doom-files-under target :match "\\.el$")) + else if (cl-member target doom-psuedo-module-dirs :test #'file-in-directory-p) + nconc (nreverse (doom-files-under it :match "\\.el$")) + else if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" target) + nconc (nreverse (doom-files-under + (doom-module-locate-path + (intern (format ":%s" (match-string 1 target))) + (intern (match-string 2 target))) + :match "\\.el$")) + else if (file-exists-p target) + collect target + finally do (setq argv nil))) + (if compile-plugins + (byte-recompile-directory package-user-dir 0 t) + (if (not compile-targets) + (message "No targets to compile") + (condition-case ex + (let ((use-package-expand-minimally t)) + (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'equal)) + (when (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p target elc-file)))) + (let ((result (cond ((string-match-p "/\\(packages\\|doctor\\)\\.el$" target) + 'no-byte-compile) + ((doom-file-cookie-p target) + (byte-compile-file target)) + ('no-byte-compile))) + (short-name (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (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 %d/%d file(s) (%d ignored)" + (if recompile-p "Recompiled" "Compiled") + total-ok (- (length compile-targets) total-noop) + total-noop)))) + (error + (message! (red "\n%%s\n\n%%s\n\n%%s") + "There were breaking errors." + (error-message-string ex) + "Reverting changes...") + (quiet! (doom//clean-byte-compiled-files)) + (message! (green "Finished (nothing was byte-compiled)"))))))))) + +;;;###autoload +(defun doom//clean-byte-compiled-files () + "Delete all the compiled elc files in your Emacs configuration. This excludes +compiled packages.'" + (interactive) + (cl-loop with default-directory = doom-emacs-dir + for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$") + (doom-files-in doom-psuedo-module-dirs :match "\\.elc$" :full t) + (doom-files-under doom-core-dir :match "\\.elc$") + (doom-files-under doom-modules-dirs :match "\\.elc$")) + for truepath = (file-truename path) + do (delete-file path) + and do + (message "✓ Deleted %s" + (if (file-in-directory-p truepath default-directory) + (file-relative-name truepath) + (abbreviate-file-name path))) + finally do (message "Everything is clean"))) diff --git a/core/core-packages.el b/core/core-packages.el index aa753e844..9e630ceef 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -717,352 +717,7 @@ loads MODULE SUBMODULE's packages.el file." (flags ,flags)) (when flags (doom-module-put ,module ',submodule :flags flags)) - (load! packages ,(doom-module-find-path module submodule) t))) - - -;; -;; Commands -;; - -(defun doom//reload () - "Reload your private Doom config. Experimental!" - (interactive) - (message "Reloading your private config...") - (load (concat doom-private-dir "init.el") nil nil 'nosuffix) - (doom-packages--async-run #'doom//reload-packages) - (let ((doom--stage 'config)) - (load (concat doom-private-dir "config.el") nil nil 'nosuffix)) - (message "✓ Done!")) - -(defun doom-packages--read-if-cookies (file) - "Returns the value of the ;;;###if predicate form in FILE." - (with-temp-buffer - (insert-file-contents-literally file nil 0 256) - (if (and (re-search-forward "^;;;###if " nil t) - (<= (line-number-at-pos) 3)) - (let ((load-file-name file)) - (eval (sexp-at-point))) - t))) - -(defun doom-packages--async-run (fn) - (let* ((default-directory doom-emacs-dir)) - (compile (format "%s --quick --batch -l core/core.el -f %s" - (executable-find "emacs") - (symbol-name fn))) - (while compilation-in-progress - (sit-for 1)))) - -(defun doom-packages--files (dir pattern) - "Like `directory-files-recursively', but traverses symlinks." - (cl-letf (((symbol-function #'file-symlink-p) #'ignore)) - (directory-files-recursively dir pattern))) - -(defun doom//reload-load-path () - "Reload `load-path' and recompile files (if necessary). - -Use this when `load-path' is out of sync with your plugins. This should only -happen if you manually modify/update/install packages from outside Emacs, while -an Emacs session is running. - -This isn't necessary if you use Doom's package management commands because they -call `doom//reload-load-path' remotely (through emacsclient)." - (interactive) - (unless doom--inhibit-reload - (when (file-exists-p doom-packages-file) - (delete-file doom-packages-file)) - (cond ((and noninteractive (not (daemonp))) - (require 'server) - (when (server-running-p) - (message "Reloading active Emacs session...") - (server-eval-at server-name '(doom//reload-load-path)))) - (t - (doom-initialize t) - (message "%d packages reloaded" (length package-alist)) - (run-hooks 'doom-reload-hook))))) - -(defvar generated-autoload-load-name) -(defun doom//reload-autoloads () - "Refreshes the autoloads.el file, specified by `doom-autoload-file'. - -It scans and reads core/autoload/*.el, modules/*/*/autoload.el and -modules/*/*/autoload/*.el, and generates an autoloads file at the path specified -by `doom-autoload-file'. This file tells Emacs where to find lazy-loaded -functions. - -This should be run whenever init.el or an autoload file is modified. Running -'make autoloads' from the commandline executes this command." - (interactive) - ;; This function must not use autoloaded functions or external dependencies. - ;; It must assume nothing is set up! - (if (not noninteractive) - ;; This is done in another instance to protect the current session's state - ;; in case this function has side effects. - (progn - (doom-packages--async-run 'doom//reload-autoloads) - (load doom-autoload-file 'noerror nil 'nosuffix)) - (let ((default-directory doom-emacs-dir) - (targets - (file-expand-wildcards - (expand-file-name "autoload/*.el" doom-core-dir)))) - (dolist (path (doom-module-load-path)) - (let ((auto-dir (expand-file-name "autoload" path)) - (auto-file (expand-file-name "autoload.el" path))) - (when (file-exists-p auto-file) - (push auto-file targets)) - (when (file-directory-p auto-dir) - (dolist (file (doom-packages--files auto-dir "\\.el$")) - (push file targets))))) - (when (file-exists-p doom-autoload-file) - (delete-file doom-autoload-file) - (ignore-errors (delete-file (byte-compile-dest-file doom-autoload-file))) - (message "Deleted old autoloads.el")) - (message "Generating new autoloads.el") - (dolist (file (mapcar #'file-truename (reverse targets))) - (let ((generated-autoload-load-name (file-name-sans-extension file))) - (message - (cond ((not (doom-packages--read-if-cookies file)) - "⚠ Ignoring %s") - ((update-file-autoloads file nil doom-autoload-file) - "✕ Nothing in %s") - ("✓ Scanned %s")) - (if (file-in-directory-p file default-directory) - (file-relative-name file) - (abbreviate-file-name file))))) - (make-directory (file-name-directory doom-autoload-file) t) - (let ((buf (find-file-noselect doom-autoload-file t)) - (load-path (append doom-psuedo-module-dirs - doom-modules-dirs - load-path)) - case-fold-search) - ;; FIXME Make me faster - (unwind-protect - (with-current-buffer buf - (goto-char (point-min)) - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") - - ;; Replace autoload paths (only for module autoloads) with - ;; absolute paths for faster resolution during load and simpler - ;; `load-path' - (save-excursion - (let (cache) - (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^/][^\"]*\\)\"" nil t) - (let ((path (match-string 1))) - (replace-match - (or (cdr (assoc path cache)) - (when-let* ((libpath (locate-library path)) - (libpath (file-name-sans-extension libpath))) - (push (cons path libpath) cache) - libpath) - (progn - (warn "Couldn't find absolute path for: %s" path) - path)) - t t nil 1)))) - (message "✓ Autoload paths expanded")) - - ;; insert package autoloads - (save-excursion - (dolist (spec package-alist) - (let ((pkg (car spec))) - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file (concat (package--autoloads-file-name (cadr spec)) ".el"))) - (insert "(let ((load-file-name " (prin1-to-string file) "))") - (insert-file-contents file) - (while (re-search-forward "^;;\\(.*\n\\)" nil t) - (replace-match "" t t)) - (unless (bolp) (insert "\n")) - (insert ")\n"))))) - (message "✓ Package autoloads included")) - - ;; Remove `load-path' and `auto-mode-alist' modifications (most - ;; of them, at least); they are cached elsewhere, so these are - ;; unnecessary overhead. - (while (re-search-forward (concat "^\\s-*(\\(" - "add-to-list\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\|" - "if (fboundp 'register-definition-prefixes)" - "\\)") - nil t) - (beginning-of-line) - (skip-chars-forward " \t") - (kill-sexp)) - (message "✓ load-path/auto-mode-alist entries removed") - - ;; Remove byte-compile inhibiting file variables so we can - ;; byte-compile the file. - (when (re-search-forward "^;; no-byte-compile: t\n$" nil t) - (replace-match "" t t)) - (save-buffer) - - ;; Byte compile it to give the file a chance to reveal errors. - (condition-case-unless-debug ex - (quiet! (byte-compile-file doom-autoload-file 'load)) - ('error - (delete-file doom-autoload-file) - (message "Deleting autoloads file!") - (error "Error in autoloads.el: %s -- %s" - (car ex) (error-message-string ex)))) - (message "Done!")) - (kill-buffer buf)))))) - -(defun doom//byte-compile (&optional modules recompile-p) - "Byte compiles your emacs configuration. - -init.el is always byte-compiled by this. - -If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are -byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom -core. It always ignores unit tests and files with `no-byte-compile' enabled. - -Doom was designed to benefit from byte-compilation, but the process may take a -while. Also, while your config files are byte-compiled, changes to them will not -take effect! Use `doom//clean-byte-compiled-files' or `make clean' to remove -these files. - -If RECOMPILE-P is non-nil, only recompile out-of-date files." - (interactive - (list nil current-prefix-arg)) - (let ((default-directory doom-emacs-dir) - (recompile-p (or recompile-p (and (member "-r" (cdr argv)) t))) - (argv (delete "-r" argv))) - (if (not noninteractive) - ;; This is done in another instance to protect the current session's - ;; state, because this function has side effects. - (doom-packages--async-run 'doom//byte-compile) - (let ((total-ok 0) - (total-fail 0) - (total-noop 0) - (modules (or modules (cdr argv))) - compile-targets) - ;; Ensure that Doom has been fully loaded, some of its state may be - ;; pertinent to files compiled later. - (let (noninteractive) - ;; Core libraries aren't fully loaded in a noninteractive session, so - ;; we pretend to be interactive and reinitialize - (doom-initialize) - ;; In case autoloads.el hasn't been properly generated at this point. - (unless (file-exists-p doom-autoload-file) - (mapc #'load (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir))))) - ;; Assemble el files we want to compile; taking into account that - ;; MODULES may be a list of MODULE/SUBMODULE strings from the command - ;; line. - (setq compile-targets - (cl-loop for target - in (or modules (append (list doom-core-dir) (doom-module-load-path))) - if (equal target "core") - nconc (nreverse (doom-packages--files doom-core-dir "\\.el$")) - and collect (expand-file-name "init.el" doom-private-dir) - else if (file-directory-p target) - nconc (nreverse (doom-packages--files target "\\.el$")) - else if (cl-member target doom-psuedo-module-dirs :test #'file-in-directory-p) - nconc (nreverse (doom-packages--files it "\\.el$")) - else if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" target) - nconc (nreverse (doom-packages--files - (doom-module-find-path - (intern (format ":%s" (match-string 1 target))) - (intern (match-string 2 target))) - "\\.el$")) - else if (file-exists-p target) - collect target - finally do (setq argv nil))) - (if (not compile-targets) - (message "No targets to compile") - (condition-case ex - (let ((use-package-expand-minimally t)) - (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'equal)) - (when (and (not (string-match-p "/\\(packages\\|doctor\\)\\.el$" target)) - (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p target elc-file))))) - (let ((result (if (doom-packages--read-if-cookies target) - (byte-compile-file target) - 'no-byte-compile)) - (short-name (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (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...") - (quiet! (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. - -This is faster than `doom//byte-compile', still yields considerable performance -benefits, and is more reliable in an ever-changing Emacs config (since you won't -likely change core files directly). - -If RECOMPILE-P is non-nil, only recompile out-of-date core files." - (interactive "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 -(or downgrading) Emacs, this may fix it." - (interactive) - (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-recompile-plugins) - (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.'" - (interactive) - (unless - (cl-loop with default-directory = doom-emacs-dir - for path - in (append (file-expand-wildcards "*.elc" t) - (doom-packages--files doom-core-dir "\\.elc$") - (cl-loop for dir in (doom-module-load-path) - nconc (doom-packages--files dir "\\.elc$"))) - for truepath = (file-truename path) - if (file-exists-p truepath) - collect path - and do (delete-file truepath) - and do - (message "✓ Deleted %s" - (if (file-in-directory-p truepath default-directory) - (file-relative-name truepath) - (abbreviate-file-name path)))) - (message "Everything is clean"))) - -(defun doom//reload-packages () - "Runs `doom//reload-autoloads', `doom//packages-autoremove' and -`doom//packages-install' before reloading your Emacs session." - (interactive) - (let ((doom--inhibit-reload t)) - (doom//packages-autoremove) - (doom//packages-install) - (doom//reload-autoloads)) - (doom//reload-load-path)) + (load! packages ,(doom-module-locate-path module submodule) t))) ;; From f984d46a9bef69a9ef4d307b7893e9248ea1b547 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 00:57:57 +0200 Subject: [PATCH 1326/4235] Fix featurep! & load! calls while byte-compiling The would prioritize load-file-name over byte-compile-current-file during byte-compiling, which would result featurep! being unable to resolve the current module and load! from figuring out where "here" was to build its relative paths from. --- core/core-packages.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 9e630ceef..e1d16bfc3 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -565,10 +565,13 @@ the lookup is relative to `load-file-name', `byte-compile-current-file' or If NOERROR is non-nil, don't throw an error if the file doesn't exist." (or (symbolp filesym) (signal 'wrong-type-argument (list 'symbolp filesym))) - (let ((path (or path - (and load-file-name (file-name-directory load-file-name)) + (let ((path (or (when path + (cond ((stringp path) path) + ((symbolp path) (symbol-value path)) + ((listp path) (eval path t)))) (and (bound-and-true-p byte-compile-current-file) (file-name-directory byte-compile-current-file)) + (and load-file-name (file-name-directory load-file-name)) (and buffer-file-name (file-name-directory buffer-file-name)) (error "Could not detect path to look for '%s' in" filesym))) @@ -618,7 +621,8 @@ Module FLAGs are set in your config's `doom!' block, typically in When this macro is used from inside a module, MODULE and SUBMODULE can be omitted. eg. (featurep! +flag1)" (unless submodule - (let* ((path (or load-file-name byte-compile-current-file)) + (let* ((path (or (bound-and-true-p byte-compile-current-file) + load-file-name)) (module-pair (doom-module-from-path path))) (unless module-pair (error "featurep! couldn't detect what module its in! (in %s)" path)) From 0d9db6f14990206997059ff7e40a65b1ba43a77a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 11:44:06 +0200 Subject: [PATCH 1327/4235] Rewrite autoload/message library + Rename message! => print! + New printerr! macro + Extended color support to interactive sessions (now propertized using term faces, so we don't have to rely on a popup window to display it). --- core/autoload/message.el | 123 +++++++++++++++++++++++---------------- 1 file changed, 73 insertions(+), 50 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 33197690a..f1b84a1b9 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -1,55 +1,68 @@ ;;; core/autoload/message.el -*- lexical-binding: t; -*- (defconst doom-message-fg - '((reset . 0) - (black . 30) - (red . 31) - (green . 32) - (yellow . 33) - (blue . 34) - (magenta . 35) - (cyan . 36) - (white . 37)) + '((black 30 term-color-black) + (red 31 term-color-red) + (green 32 term-color-green) + (yellow 33 term-color-yellow) + (blue 34 term-color-blue) + (magenta 35 term-color-magenta) + (cyan 36 term-color-cyan) + (white 37 term-color-white)) "List of text colors.") (defconst doom-message-bg - '((on-black . 40) - (on-red . 41) - (on-green . 42) - (on-yellow . 43) - (on-blue . 44) - (on-magenta . 45) - (on-cyan . 46) - (on-white . 47)) + '((on-black 40 term-color-black) + (on-red 41 term-color-red) + (on-green 42 term-color-green) + (on-yellow 43 term-color-yellow) + (on-blue 44 term-color-blue) + (on-magenta 45 term-color-magenta) + (on-cyan 46 term-color-cyan) + (on-white 47 term-color-white)) "List of colors to draw text on.") (defconst doom-message-fx - '((bold . 1) - (dark . 2) - (italic . 3) - (underscore . 4) - (blink . 5) - (rapid . 6) - (contrary . 7) - (concealed . 8) - (strike . 9)) + '((bold 1 :weight bold) + (dark 2) + (italic 3 :slant italic) + (underscore 4 :underline t) + (blink 5) + (rapid 6) + (contrary 7) + (concealed 8) + (strike 9 :strike-through t)) "List of styles.") ;;;###autoload (defun doom-ansi-apply (code message &rest args) - "Apply the ansi CODE to formatted MESSAGE with ARGS." - (let ((rule (or (assq code doom-message-fg) - (assq code doom-message-bg) - (assq code doom-message-fx)))) - (format "\e[%dm%s\e[%dm" - (cdr rule) - (apply #'format message args) - 0))) + "Apply CODE to formatted MESSAGE with ARGS. CODE is derived from any of +`doom-message-fg', `doom-message-bg' or `doom-message-fx'. + +In a noninteractive session, this wraps the result in ansi color codes. +Otherwise, it maps colors to a term-color-* face." + (let ((text (apply #'format message args))) + (if noninteractive + (format "\e[%dm%s\e[%dm" + (cadr + (or (assq code doom-message-fg) + (assq code doom-message-bg) + (assq code doom-message-fx))) + text 0) + (require 'term) ; piggyback on term's color faces + (propertize + text 'face + (let (spec) + (cond ((setq spec (caddr (assq code doom-message-fg))) + `(:foreground ,(face-foreground spec))) + ((setq spec (caddr (assq code doom-message-bg))) + `(:background ,(face-background spec))) + ((cddr (assq code doom-message-fx))))))))) ;;;###autoload (defmacro format! (message &rest args) - "An alternative to `format' that strips out ANSI codes if used in an -interactive session." + "An alternative to `format' that understands (color ...) and converts them +into faces or ANSI codes depending on the type of sesssion we're in." `(cl-flet* (,@(cl-loop for rule in (append doom-message-fg doom-message-bg doom-message-fx) @@ -63,19 +76,29 @@ interactive session." (format ,message ,@args))) ;;;###autoload -(defmacro message! (message &rest args) - "An alternative to `message' that strips out ANSI codes if used in an -interactive session." +(defmacro printerr! (message &rest args) + "Uses `warn' in interative sessions and `message' otherwise (prints to +standard error). + +Can be colored using (color ...) blocks. See `print!' for details." `(if noninteractive (message (format! ,message ,@args)) - (let ((buf (get-buffer-create " *doom messages*"))) - (with-current-buffer buf - (goto-char (point-max)) - (let ((beg (point)) - end) - (insert (format! ,message ,@args)) - (insert "\n") - (setq end (point)) - (ansi-color-apply-on-region beg end))) - (pop-to-buffer buf) - (goto-char (point-max))))) + (warn ,message ,@args))) + +;;;###autoload +(defmacro print! (message &rest args) + "Uses `message' in interactive sessions and `princ' otherwise (prints to +standard out). + +Can be colored using (color ...) blocks: + + (print! \"Hello %s %s\" (bold (blue \"How are you?\"))) + (print! \"Hello %s %s\" (red \"World\")) + (print! (green \"Great %s!\" \"success\")) + +Uses faces in interactive sessions and ANSI codes otherwise." + `(if (not noninteractive) + (message (format! ,message ,@args)) + ;; princ prints to stdout, message to stderr + (princ (format! ,message ,@args)) + (princ "\n"))) From 61ca98fd3f1a623a717340fa073f4ca90da536a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:03:46 +0200 Subject: [PATCH 1328/4235] Refactor package managent batch commands + Replace message! with print! + doom//packages-* commands now only return t if package list changed --- core/autoload/packages.el | 201 +++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 103 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index f5f6f7efa..09f55b420 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -26,15 +26,15 @@ (condition-case ex2 (progn ,@body) ('file-error - (message! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) - (message! " Trying again...") + (print! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) + (print! " Trying again...") (quiet! (doom-refresh-packages-maybe t)) ,@body)) ('user-error - (message! (bold (red " ERROR: %s" ex)))) + (print! (bold (red " ERROR: %s" ex)))) ('error (doom--refresh-pkg-cache) - (message! (bold (red " FATAL ERROR: %s" ex)))))) + (print! (bold (red " FATAL ERROR: %s" ex)))))) (defun doom--refresh-pkg-cache () "Clear the cache for `doom-refresh-packages-maybe'." @@ -336,152 +336,147 @@ package.el as appropriate." (defun doom//packages-install () "Interactive command for installing missing packages." (interactive) - (if (not noninteractive) - (doom-packages--async-run 'doom//packages-install) - (message! "Looking for packages to install...") - (let ((packages (reverse (doom-get-missing-packages)))) - (cond ((not packages) - (message! (green "No packages to install!")) - nil) + (doom-initialize-packages) + (print! "Looking for packages to install...") + (let ((packages (reverse (doom-get-missing-packages)))) + (cond ((not packages) + (print! (green "No packages to install!")) + nil) - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be installed:\n\n%s\n\nProceed?" - (length packages) - (mapconcat - (lambda (pkg) - (format "+ %s (%s)" - (car pkg) - (cond ((doom-package-different-recipe-p (car pkg)) - "new recipe") - ((doom-package-different-backend-p (car pkg)) - (if (plist-get (cdr pkg) :recipe) - "ELPA -> QUELPA" - "QUELPA -> ELPA")) - ((plist-get (cdr pkg) :recipe) - "QUELPA") - (t - "ELPA")))) - (sort (cl-copy-list packages) #'doom--sort-alpha) - "\n"))))) - (message! (yellow "Aborted!")) - nil) + ((not (or (getenv "YES") + (y-or-n-p + (format "%s packages will be installed:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (pkg) + (format "+ %s (%s)" + (car pkg) + (cond ((doom-package-different-recipe-p (car pkg)) + "new recipe") + ((doom-package-different-backend-p (car pkg)) + (if (plist-get (cdr pkg) :recipe) + "ELPA -> QUELPA" + "QUELPA -> ELPA")) + ((plist-get (cdr pkg) :recipe) + "QUELPA") + (t + "ELPA")))) + (sort (cl-copy-list packages) #'doom--sort-alpha) + "\n"))))) + (error "Aborted!")) - (t + ((let (success) (doom-refresh-packages-maybe doom-debug-mode) (dolist (pkg packages) - (message! "Installing %s" (car pkg)) + (print! "Installing %s" (car pkg)) (doom--condition-case! - (message! "%s%s" + (print! "%s%s" (if (and (package-installed-p (car pkg)) (not (doom-package-different-backend-p (car pkg))) (not (doom-package-different-recipe-p (car pkg)))) (dark (white "⚠ ALREADY INSTALLED")) (condition-case e (if (doom-install-package (car pkg) (cdr pkg)) - (green "✓ DONE") + (prog1 (green "✓ DONE") + (setq success t)) (red "✕ FAILED")) (error (red "✕ ERROR (%s)" e)))) (if (plist-member (cdr pkg) :pin) (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) "")))) - - (message! (bold (green "Finished!"))) + (print! (bold (green "Finished!"))) (doom//reload-load-path) - t))))) + success))))) ;;;###autoload (defun doom//packages-update () "Interactive command for updating packages." (interactive) - (if (not noninteractive) - (doom-packages--async-run 'doom//packages-update) - (message! "Looking for outdated packages...") - (doom-refresh-packages-maybe doom-debug-mode) - (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) - (cond ((not packages) - (message! (green "Everything is up-to-date")) - nil) + (doom-initialize-packages) + (print! "Looking for outdated packages...") + (doom-refresh-packages-maybe doom-debug-mode) + (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) + (cond ((not packages) + (print! (green "Everything is up-to-date")) + nil) - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be updated:\n\n%s\n\nProceed?" - (length packages) - (let ((max-len - (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) - (lambda (it other) (> it other)))) - 10))) - (mapconcat - (lambda (pkg) - (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) - (symbol-name (car pkg)) - (package-version-join (cadr pkg)) - (package-version-join (cl-caddr pkg)))) - packages - "\n")))))) - (message! (yellow "Aborted!")) - nil) + ((not (or (getenv "YES") + (y-or-n-p + (format "%s packages will be updated:\n\n%s\n\nProceed?" + (length packages) + (let ((max-len + (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) + (lambda (it other) (> it other)))) + 10))) + (mapconcat + (lambda (pkg) + (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) + (symbol-name (car pkg)) + (package-version-join (cadr pkg)) + (package-version-join (cl-caddr pkg)))) + packages + "\n")))))) + (error "Aborted!")) - (t + ((let (success) (dolist (pkg packages) - (message! "Updating %s" (car pkg)) + (print! "Updating %s" (car pkg)) (doom--condition-case! - (message! + (print! (let ((result (doom-update-package (car pkg) t))) + (when result (setq success t)) (color (if result 'green 'red) (if result "✓ DONE" "✕ FAILED")))))) - - (message! (bold (green "Finished!"))) + (print! (bold (green "Finished!"))) (doom//reload-load-path) - t))))) + success))))) ;;;###autoload (defun doom//packages-autoremove () "Interactive command for auto-removing orphaned packages." (interactive) - (if (not noninteractive) - (doom-packages--async-run 'doom//packages-autoremove) - (message! "Looking for orphaned packages...") - (let ((packages (doom-get-orphaned-packages))) - (cond ((not packages) - (message! (green "No unused packages to remove")) - nil) + (doom-initialize-packages) + (print! "Looking for orphaned packages...") + (let ((packages (doom-get-orphaned-packages))) + (cond ((not packages) + (print! (green "No unused packages to remove")) + nil) - ((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) - (pcase backend - (`quelpa "QUELPA->ELPA") - (`elpa "ELPA->QUELPA") - (_ "removed")) - (upcase (symbol-name backend)))))) - (sort (cl-copy-list packages) #'string-lessp) - "\n"))))) - (message! (yellow "Aborted!")) - nil) + ((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) + (pcase backend + (`quelpa "QUELPA->ELPA") + (`elpa "ELPA->QUELPA") + (_ "removed")) + (upcase (symbol-name backend)))))) + (sort (cl-copy-list packages) #'string-lessp) + "\n"))))) + (error "Aborted!")) - (t + ((let (success) (dolist (pkg packages) (doom--condition-case! - (message! + (print! (let ((result (doom-delete-package pkg t))) + (when result (setq success t)) (color (if result 'green 'red) "%s %s" (if result "✓ Removed" "✕ Failed to remove") pkg))))) - (message! (bold (green "Finished!"))) + (print! (bold (green "Finished!"))) (doom//reload-load-path) - t))))) + success))))) ;; From 0634289a01ead0c4b73fade0e760177554164dd3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:05:17 +0200 Subject: [PATCH 1329/4235] Autoload doom-*-package functions --- core/autoload/packages.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 09f55b420..49eb5e5d5 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -260,6 +260,7 @@ Used by `doom//packages-install'." ;; Main functions ;; +;;;###autoload (defun doom-install-package (name &optional plist) "Installs package NAME with optional quelpa RECIPE (see `quelpa-recipe' for an example; the package name can be omitted)." @@ -283,6 +284,7 @@ example; the package name can be omitted)." (map-put doom-packages name plist) name))) +;;;###autoload (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." @@ -310,6 +312,7 @@ package.el as appropriate." (delete-directory old-dir t))) t)))) +;;;###autoload (defun doom-delete-package (name &optional force-p) "Uninstalls package NAME if it exists, and clears it from `quelpa-cache'." (unless (package-installed-p name) From c826f0f6a8d694c01cb8672fb237fdad4cc5136d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:06:50 +0200 Subject: [PATCH 1330/4235] Shrink dependency chains in core libraries --- core/autoload/cache.el | 2 -- core/autoload/help.el | 1 + core/autoload/packages.el | 4 ---- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/core/autoload/cache.el b/core/autoload/cache.el index c4392be0a..1093bf9ce 100644 --- a/core/autoload/cache.el +++ b/core/autoload/cache.el @@ -12,8 +12,6 @@ ;; Like persistent-soft, caches assume a 2-tier structure, where all caches are ;; namespaced by location. -(require 'persistent-soft) - (defvar doom-cache-alists () "An alist of alists, containing lists of variables for the doom cache library to persist across Emacs sessions.") diff --git a/core/autoload/help.el b/core/autoload/help.el index 202b49980..969081464 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -75,6 +75,7 @@ in, or d) the module associated with the current major mode (see "init.el") (thing-at-point 'sexp t))) ((save-excursion + (require 'smartparens) (ignore-errors (sp-beginning-of-sexp) (unless (eq (char-after) ?\() diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 49eb5e5d5..3938c5c68 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -1,10 +1,6 @@ ;;; core/autoload/packages.el -*- lexical-binding: t; -*- (load! cache) -(require 'use-package) -(require 'quelpa) -(require 'package) -(require 'async) ;;; Private functions (defsubst doom--sort-alpha (it other) From b7b1445712f631f8349fcf2256879f9108ad05f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:07:20 +0200 Subject: [PATCH 1331/4235] Update doom-get-outdated-packages to match new init process --- core/autoload/packages.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 3938c5c68..58a1a008b 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -197,9 +197,12 @@ Used by `doom//packages-update'." (message "New thread for: %s" pkg)) (push (async-start `(lambda () - (let ((doom-init-p 'internal) + (let ((doom-init-p t) (noninteractive t) (load-path ',load-path) + (package-alist ',package-alist) + (package-archive-contents ',package-archive-contents) + (package-selected-packages ',package-selected-packages) (doom-packages ',doom-packages) (doom-modules ',doom-modules) (quelpa-cache ',quelpa-cache) @@ -207,6 +210,8 @@ Used by `doom//packages-update'." doom-private-dir) (load ,(expand-file-name "core.el" doom-core-dir)) (load ,(expand-file-name "autoload/packages.el" doom-core-dir)) + (require 'package) + (require 'quelpa) (doom-package-outdated-p ',pkg)))) futures)) (delq nil From af7fb1c628f0290a5d65b9fdb0ab737e2cada815 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:10:03 +0200 Subject: [PATCH 1332/4235] Change doom/retab to reformat w/ opposite style if ARG --- core/autoload/editor.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index b3b4ce058..4baa3fc93 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -215,17 +215,21 @@ possible, or just one char if that's not possible." (t (delete-char (- n) killflag)))) ;;;###autoload -(defun doom/retab (&optional beg end) +(defun doom/retab (arg &optional beg end) "Converts tabs-to-spaces or spaces-to-tabs within BEG and END (defaults to buffer start and end, to make indentation consistent. Which it does depends on -the value of `indent-tab-mode'." - (interactive "r") +the value of `indent-tab-mode'. + +If ARG (universal argument) is non-nil, retab the current buffer using the +opposite indentation style." + (interactive "Pr") (unless (and beg end) (setq beg (point-min) end (point-max))) - (if indent-tabs-mode - (tabify beg end) - (untabify beg end))) + (let ((indent-tabs-mode (if arg (not indent-tabs-mode) indent-tabs-mode))) + (if indent-tabs-mode + (tabify beg end) + (untabify beg end)))) (defvar-local doom--buffer-narrowed-origin nil) ;;;###autoload From 7b8917ed421fb0d89bf6b77837a7e4b9de8ec6e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:13:05 +0200 Subject: [PATCH 1333/4235] Split core/autoload/util.el into {help,debug}.el --- core/autoload/{util.el => debug.el} | 231 ++++++++++++---------------- core/autoload/help.el | 107 +++++++++---- 2 files changed, 176 insertions(+), 162 deletions(-) rename core/autoload/{util.el => debug.el} (63%) diff --git a/core/autoload/util.el b/core/autoload/debug.el similarity index 63% rename from core/autoload/util.el rename to core/autoload/debug.el index 2500df78b..db5764ee4 100644 --- a/core/autoload/util.el +++ b/core/autoload/debug.el @@ -1,126 +1,10 @@ -;;; core/autoload/util.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun doom/what-face (&optional pos) - "Shows all faces and overlay faces at point. - -Interactively prints the list to the echo area. Noninteractively, returns a list -whose car is the list of faces and cadr is the list of overlay faces." - (interactive) - (let* ((pos (or pos (point))) - (faces (let ((face (get-text-property pos 'face))) - (if (keywordp (car-safe face)) - (list face) - (cl-loop for f in (doom-enlist face) collect f)))) - (overlays (cl-loop for ov in (overlays-at pos (1+ pos)) - nconc (doom-enlist (overlay-get ov 'face))))) - (cond ((called-interactively-p 'any) - (message "%s %s\n%s %s" - (propertize "Faces:" 'face 'font-lock-comment-face) - (if faces - (cl-loop for face in faces - if (listp face) - concat (format "'%s " face) - else - concat (concat (propertize (symbol-name face) 'face face) " ")) - "n/a ") - (propertize "Overlays:" 'face 'font-lock-comment-face) - (if overlays - (cl-loop for ov in overlays - concat (concat (propertize (symbol-name ov) 'face ov) " ")) - "n/a"))) - (t - (and (or faces overlays) - (list faces overlays)))))) - -;;;###autoload -(defun doom-active-minor-modes () - "Get a list of active minor-mode symbols." - (cl-loop for mode in minor-mode-list - if (and (boundp mode) (symbol-value mode)) - collect mode)) - -;;;###autoload -(defun doom/what-minor-mode (mode) - "Get information on an active minor mode. Use `describe-minor-mode' for a -selection of all minor-modes, active or not." - (interactive - (list (completing-read "Minor mode: " - (doom-active-minor-modes)))) - (describe-minor-mode-from-symbol - (cl-typecase mode - (string (intern mode)) - (symbol mode) - (t (error "Expected a symbol/string, got a %s" (type-of mode)))))) - -;;;###autoload -(defun doom/am-i-secure () - "Test to see if your root certificates are securely configured in emacs." - (declare (interactive-only t)) - (interactive) - (unless (string-match-p "\\_" system-configuration-features) - (warn "gnutls support isn't built into Emacs, there may be problems")) - (if-let* ((bad-hosts - (cl-loop for bad - in '("https://wrong.host.badssl.com/" - "https://self-signed.badssl.com/") - if (condition-case _e - (url-retrieve-synchronously bad) - (error nil)) - collect bad))) - (error (format "tls seems to be misconfigured (it got %s)." - bad-hosts)) - (url-retrieve "https://badssl.com" - (lambda (status) - (if (or (not status) (plist-member status :error)) - (warn "Something went wrong.\n\n%s" (pp-to-string status)) - (message "Your trust roots are set up properly.\n\n%s" (pp-to-string status)) - t))))) - -(defvar doom--profiler nil) -;;;###autoload -(defun doom/toggle-profiler () - "Toggle the Emacs profiler. Starts it if isn't running. Stops it and pops up -the profiling report otherwise." - (interactive) - (if (not doom--profiler) - (profiler-start 'cpu+mem) - (profiler-report) - (profiler-stop)) - (setq doom--profiler (not doom--profiler))) - -;;;###autoload -(defun doom/profile-emacs () - "Profile the startup time of Emacs in the background. -If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." - (interactive) - (require 'esup) - (let ((init-file esup-user-init-file)) - (message "Starting esup...") - (esup-reset) - (setq esup-server-process (esup-server-create (esup-select-port))) - (setq esup-server-port (process-contact esup-server-process :service)) - (message "esup process started on port %s" esup-server-port) - (let ((process-args `("*esup-child*" - "*esup-child*" - ,esup-emacs-path - "-q" - "-L" ,esup-load-path - "-l" "esup-child" - ,(format "--eval=(esup-child-run \"%s\" \"%s\" %d)" - init-file - esup-server-port - esup-depth) - "--eval=(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)"))) - (when esup-run-as-batch-p - (setq process-args (append process-args '("--batch")))) - (setq esup-child-process (apply #'start-process process-args))) - (set-process-sentinel esup-child-process 'esup-child-process-sentinel))) +;;; core/autoload/debug.el -*- lexical-binding: t; -*- ;;;###autoload (defun doom-info () "Returns diagnostic information about the current Emacs session in markdown, ready to be pasted in a bug report on github." + (doom-initialize) (require 'vc-git) (let ((default-directory doom-emacs-dir)) (format @@ -136,7 +20,7 @@ ready to be pasted in a bug report on github." " packages: %s\n" " elc dirs: %s\n" " exec-path: %s\n" - " ```\n") + " ```") system-type system-configuration emacs-version (format-time-string "%b %d, %Y" emacs-build-time) doom-version @@ -144,7 +28,7 @@ ready to be pasted in a bug report on github." branch "n/a") (if-let* ((rev (vc-git-working-revision "core/core.el"))) - (format "https://github.com/hlissner/doom-emacs/commit/%s" rev) + rev "n/a") (display-graphic-p) (daemonp) (bound-and-true-p system-configuration-features) @@ -177,11 +61,11 @@ ready to be pasted in a bug report on github." (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) (doom-get-packages)) (lambda (p) (setq packages p)))) - (mapcar (lambda (x) - (if (cdr x) - (format "%s" x) - (symbol-name (car x)))) - (cl-sort packages #'string-lessp :key (lambda (x) (symbol-name (car x))))))) + (cl-loop for pkg in (cl-sort packages #'string-lessp + :key (lambda (x) (symbol-name (car x)))) + collect (if (cdr pkg) + (format "%s" pkg) + (symbol-name (car pkg)))))) "n/a") (or (ignore-errors (cl-delete-duplicates @@ -191,22 +75,105 @@ ready to be pasted in a bug report on github." collect (file-relative-name (file-name-directory file) doom-emacs-dir)) :test #'equal)) "n/a") - exec-path))) + ;; abbreviate $HOME to hide username + (mapcar #'abbreviate-file-name exec-path)))) + + +;; +;; Commands +;; ;;;###autoload -(defun doom/info () +(defun doom//info () "Collects some debug information about your Emacs session, formats it into markdown and copies it to your clipboard, ready to be pasted into bug reports!" (declare (interactive-only t)) (interactive) + (message "Generating Doom info...") (if noninteractive - (message "%s" (doom-info)) - (message "Generating Doom info...") + (print! (doom-info)) (kill-new (doom-info)) (message "Done! Copied to clipboard."))) ;;;###autoload -(defun doom/toggle-debug-mode () +(defun doom//am-i-secure () + "Test to see if your root certificates are securely configured in emacs." + (declare (interactive-only t)) (interactive) - (setq doom-debug-mode (not doom-debug-mode)) - (toggle-debug-on-error)) + (unless (string-match-p "\\_" system-configuration-features) + (warn "gnutls support isn't built into Emacs, there may be problems")) + (if-let* ((bad-hosts + (cl-loop for bad + in '("https://wrong.host.badssl.com/" + "https://self-signed.badssl.com/") + if (condition-case _e + (url-retrieve-synchronously bad) + (error nil)) + collect bad))) + (error "tls seems to be misconfigured (it got %s)." + bad-hosts) + (url-retrieve "https://badssl.com" + (lambda (status) + (if (or (not status) (plist-member status :error)) + (warn "Something went wrong.\n\n%s" (pp-to-string status)) + (message "Your trust roots are set up properly.\n\n%s" (pp-to-string status)) + t))))) + +;;;###autoload +(defun doom//version () + "Display the current version of Doom & Emacs, including the current Doom +branch and commit." + (interactive) + (require 'vc-git) + (print! "Doom v%s (Emacs v%s)\nBranch: %s\nCommit: %s." + doom-version + emacs-version + (or (vc-git--symbolic-ref doom-core-dir) + "n/a") + (or (vc-git-working-revision doom-core-dir) + "n/a"))) + + +;; +;; Profiling +;; + +(defvar doom--profiler nil) +;;;###autoload +(defun doom//toggle-profiler () + "Toggle the Emacs profiler. Run it again to see the profiling report." + (interactive) + (if (not doom--profiler) + (profiler-start 'cpu+mem) + (profiler-report) + (profiler-stop)) + (setq doom--profiler (not doom--profiler))) + +;;;###autoload +(defun doom//profile-emacs () + "Profile the startup time of Emacs in the background with ESUP. +If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." + (interactive) + (require 'esup) + (let ((init-file esup-user-init-file)) + (message "Starting esup...") + (esup-reset) + (setq esup-server-process (esup-server-create (esup-select-port))) + (setq esup-server-port (process-contact esup-server-process :service)) + (message "esup process started on port %s" esup-server-port) + (let ((process-args `("*esup-child*" + "*esup-child*" + ,esup-emacs-path + "-q" + "-L" ,esup-load-path + "-l" "esup-child" + ,(format "--eval=(esup-child-run \"%s\" \"%s\" %d)" + init-file + esup-server-port + esup-depth) + "--eval=(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)"))) + (when esup-run-as-batch-p + (setq process-args (append process-args '("--batch")))) + (setq esup-child-process (apply #'start-process process-args))) + (set-process-sentinel esup-child-process 'esup-child-process-sentinel))) + diff --git a/core/autoload/help.el b/core/autoload/help.el index 969081464..e4c311b96 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -1,22 +1,5 @@ ;;; core/autoload/help.el -*- lexical-binding: t; -*- -;;;###autoload -(defun doom/describe-setting (setting) - "Open the documentation of SETTING (a keyword defined with `def-setting!'). - -Defaults to the " - (interactive - (let ((sym (symbol-at-point))) - (list (completing-read "Describe setting: " - (sort (mapcar #'car doom-settings) #'string-lessp) - nil t (if (keywordp sym) (symbol-name sym)))))) - (let ((fn (cdr (assq (intern setting) doom-settings)))) - (unless fn - (error "'%s' is not a valid DOOM setting" setting)) - (describe-function fn))) - - -;; (defvar doom--module-mode-alist '((c-mode :lang cc) (c++-mode :lang cc) @@ -58,6 +41,39 @@ Defaults to the " (stylus-mode :lang web)) "TODO") + +;; +;; Helpers +;; + +;;;###autoload +(defun doom-active-minor-modes () + "Return a list of active minor-mode symbols." + (cl-loop for mode in minor-mode-list + if (and (boundp mode) (symbol-value mode)) + collect mode)) + + + +;; +;; Commands +;; + +;;;###autoload +(defun doom/describe-setting (setting) + "Open the documentation of SETTING (a keyword defined with `def-setting!'). + +Defaults to the " + (interactive + (let ((sym (symbol-at-point))) + (list (completing-read "Describe setting: " + (sort (mapcar #'car doom-settings) #'string-lessp) + nil t (if (keywordp sym) (symbol-name sym)))))) + (let ((fn (cdr (assq (intern setting) doom-settings)))) + (unless fn + (error "'%s' is not a valid DOOM setting" setting)) + (describe-function fn))) + ;;;###autoload (defun doom/describe-module (module) "Open the documentation of MODULE (a string that represents the category and @@ -98,22 +114,53 @@ in, or d) the module associated with the current major mode (see (mapcar #'intern (split-string module " ")) (unless (doom-module-p category submodule) (error "'%s' isn't a valid module" module)) - (let ((doc-path (doom-module-expand-file category submodule "README.org"))) + (let ((doc-path (doom-module-path category submodule "README.org"))) (unless (file-exists-p doc-path) (error "There is no documentation for this module")) (find-file doc-path)))) ;;;###autoload -(defun doom/version () - "Display the current version of Doom & Emacs, including the current Doom -branch and commit." +(defun doom/describe-active-minor-mode (mode) + "Get information on an active minor mode. Use `describe-minor-mode' for a +selection of all minor-modes, active or not." + (interactive + (list (completing-read "Minor mode: " + (doom-active-minor-modes)))) + (describe-minor-mode-from-symbol + (cl-typecase mode + (string (intern mode)) + (symbol mode) + (t (error "Expected a symbol/string, got a %s" (type-of mode)))))) + +;;;###autoload +(defun doom/what-face (&optional pos) + "Shows all faces and overlay faces at point. + +Interactively prints the list to the echo area. Noninteractively, returns a list +whose car is the list of faces and cadr is the list of overlay faces." (interactive) - (message "Doom v%s (Emacs v%s). Branch: %s. Commit: %s." - doom-version - emacs-version - (if-let* ((branch (vc-git--symbolic-ref "core/core.el"))) - branch - "n/a") - (if-let* ((rev (vc-git-working-revision "core/core.el"))) - rev - "n/a"))) + (let* ((pos (or pos (point))) + (faces (let ((face (get-text-property pos 'face))) + (if (keywordp (car-safe face)) + (list face) + (cl-loop for f in (doom-enlist face) collect f)))) + (overlays (cl-loop for ov in (overlays-at pos (1+ pos)) + nconc (doom-enlist (overlay-get ov 'face))))) + (cond ((called-interactively-p 'any) + (message "%s %s\n%s %s" + (propertize "Faces:" 'face 'font-lock-comment-face) + (if faces + (cl-loop for face in faces + if (listp face) + concat (format "'%s " face) + else + concat (concat (propertize (symbol-name face) 'face face) " ")) + "n/a ") + (propertize "Overlays:" 'face 'font-lock-comment-face) + (if overlays + (cl-loop for ov in overlays + concat (concat (propertize (symbol-name ov) 'face ov) " ")) + "n/a"))) + (t + (and (or faces overlays) + (list faces overlays)))))) From f80be3682b31270b1bad858292f6af2f1d693fbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:13:59 +0200 Subject: [PATCH 1334/4235] New open-bug-report & open-vanilla-sandbox commands --- core/autoload/debug.el | 126 +++++++++++++++++++++++++++++++++ core/templates/BUG_REPORT | 29 ++++++++ core/templates/VANILLA_SANDBOX | 7 ++ debug.el | 16 ----- 4 files changed, 162 insertions(+), 16 deletions(-) create mode 100644 core/templates/BUG_REPORT create mode 100644 core/templates/VANILLA_SANDBOX delete mode 100644 debug.el diff --git a/core/autoload/debug.el b/core/autoload/debug.el index db5764ee4..03c944765 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -1,5 +1,14 @@ ;;; core/autoload/debug.el -*- lexical-binding: t; -*- +(defun doom-template-exists-p (template) + "TODO" + (file-exists-p (expand-file-name "templates/" doom-core-dir))) + +(defun doom-template-insert (template) + "TODO" + (let ((dir (expand-file-name "templates/" doom-core-dir))) + (insert-file-contents (expand-file-name template dir)))) + ;;;###autoload (defun doom-info () "Returns diagnostic information about the current Emacs session in markdown, @@ -134,6 +143,123 @@ branch and commit." "n/a"))) +;; +;; Vanilla sandbox +;; + +(defun doom--run-vanilla-sandbox () + "TODO" + (interactive) + (when (equal (buffer-name) "*doom:vanilla-sandbox*") + (let ((file (make-temp-file "doom-eval-"))) + (write-file file) + (require 'pp) + (require 'restart-emacs) + (restart-emacs--launch-other-emacs + (list "-Q" + "--eval" + (prin1-to-string + `(setq user-emacs-directory ,doom-emacs-dir + package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives + debug-on-error t)) + "-f" "package-initialize" + "-l" file + "--eval" (prin1-to-string `(delete-file ,file))))))) + +;;;###autoload +(defun doom//open-vanilla-sandbox () + "Open an Emacs Lisp buffer destinated to run in a blank Emacs session. + +This vanilla sandbox is started with emacs -Q, and provides a testbed for +debugging code without Doom standing in the way, and without sacrificing +access to the installed packages." + (interactive) + (let ((buf (get-buffer-create "*doom:vanilla-sandbox*"))) + (with-current-buffer buf + (emacs-lisp-mode) + (local-set-key (kbd "C-c C-c") #'doom--run-vanilla-sandbox) + (local-set-key (kbd "C-c C-k") #'kill-this-buffer) + (setq header-line-format "C-c C-c to run the session / C-c C-k to abort it") + (setq-local default-directory doom-emacs-dir) + (doom-template-insert "VANILLA_SANDBOX") + (goto-char (point-max))) + (pop-to-buffer buf))) + + +;; +;; Reporting bugs +;; + +(defun doom--open-bug-report () + "TODO" + (interactive) + (let ((url "https://github.com/hlissner/doom-emacs/issues/new?body=")) + ;; TODO Refactor me + (save-restriction + (widen) + (goto-char (point-min)) + (re-search-forward "^-------------------------------------------------------------------\n" nil t) + (skip-chars-forward " \n\t") + (condition-case e + (progn + (save-excursion + (when (and (re-search-backward "\\+ [ ] " nil t) + (not (y-or-n-p "You haven't checked all the boxes. Continue anyway?"))) + (error "Aborted submit"))) + (narrow-to-region (point) (point-max)) + (let ((text (buffer-string))) + ;; `url-encode-url' doesn't encode ampersands + (setq text (replace-regexp-in-string "&" "%26" text)) + (setq url (url-encode-url (concat url text))) + ;; HACK: encode some characters according to HTML URL Encoding Reference + ;; http://www.w3schools.com/tags/ref_urlencode.asp + (setq url (replace-regexp-in-string "#" "%23" url)) + (setq url (replace-regexp-in-string ";" "%3B" url)) + (browse-url url))) + (error (signal (car e) (car e))))))) + +;;;###autoload +(defun doom//open-bug-report () + "Open a markdown buffer destinated to populate the New Issue page on Doom +Emacs' issue tracker. + +If called when a backtrace buffer is present, it and the output of `doom-info' +will be automatically appended to the result." + (interactive) + ;; TODO Refactor me + (let ((backtrace + (when (get-buffer "*Backtrace*") + (with-current-buffer "*Backtrace*" + (string-trim + (buffer-substring-no-properties + (point-min) + (min (point-max) 1000)))))) + (buf (get-buffer-create "*doom:vanilla-sandbox*"))) + (with-current-buffer buf + (erase-buffer) + (condition-case _ (gfm-mode) + (error (text-mode))) + (doom-template-insert "SUBMIT_BUG_REPORT") + (goto-char (point-max)) + (let ((pos (point))) + (save-excursion + (insert + "\n" (doom-info) "\n" + (if (and backtrace (not (string-empty-p backtrace))) + (format "\n
\nBacktrace\n\n```\n%s\n```\n
\n" + backtrace) + ""))) + (local-set-key (kbd "C-c C-c") #'doom--open-bug-report) + (local-set-key (kbd "C-c C-k") #'kill-this-buffer) + (setq header-line-format "C-c C-c to submit / C-c C-k to close") + ;; + (narrow-to-region (point-min) pos) + (goto-char (point-min))) + (pop-to-buffer buf)))) + + ;; ;; Profiling ;; diff --git a/core/templates/BUG_REPORT b/core/templates/BUG_REPORT new file mode 100644 index 000000000..a46909cce --- /dev/null +++ b/core/templates/BUG_REPORT @@ -0,0 +1,29 @@ +Please read through the following before you submit your issue. + ++ [ ] Running `make` (then restarting Emacs) did not fix my issue ++ [ ] If I have byte-compiled, I've tried recompiling with `make compile` ++ [ ] If I changed the version of Emacs installed, I've recompiled by plugins + with `make compile-elpa` ++ [ ] I ran `make doctor` and it produced no leads ++ [ ] My issue cannot be found [on the wiki](/docs/troubleshoot.org) ++ [ ] I filled out the four fields in the template below + +------------------------------------------------------------------- + +### Observed behavior + + + +### Expected behavior + + + +### Steps to reproduce + + + +### Extra details + + + +------------------------------------------------------------------- diff --git a/core/templates/VANILLA_SANDBOX b/core/templates/VANILLA_SANDBOX new file mode 100644 index 000000000..201ad51d1 --- /dev/null +++ b/core/templates/VANILLA_SANDBOX @@ -0,0 +1,7 @@ +;; Welcome to the vanilla sanbox! +;; +;; This is a test bed for Emacs Lisp to be run in a blank instance of Emacs +;; (free of Doom's clutches). This is equivalent to using emacs -Q with +;; package.el initialized and nothing else (so you have access to installed +;; plugins). + diff --git a/debug.el b/debug.el deleted file mode 100644 index 0aa3970a3..000000000 --- a/debug.el +++ /dev/null @@ -1,16 +0,0 @@ -;;; debug.el -*- lexical-binding: t; -*- - -;; To test something in a blank, vanilla Emacs session (Emacs -Q) load me: -;; -;; emacs -Q -l debug.el - -(setq user-emacs-directory (file-name-directory load-file-name) - package--init-file-ensured t - package-user-dir (expand-file-name ".local/packages/elpa" user-emacs-directory) - package-archives - '(("gnu" . "https://elpa.gnu.org/packages/") - ("melpa" . "https://melpa.org/packages/") - ("org" . "https://orgmode.org/elpa/"))) -(package-initialize) - -;; Then you can test packages in isolation here... From b82ef2cee67bc5891d79fa3b16706ec247f9205e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:14:36 +0200 Subject: [PATCH 1335/4235] Add open-manual command (docs don't exist yet though!) --- core/autoload/help.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/autoload/help.el b/core/autoload/help.el index e4c311b96..783492d12 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -41,6 +41,9 @@ (stylus-mode :lang web)) "TODO") +(defvar doom-docs-dir (concat doom-emacs-dir "docs/") + "TODO") + ;; ;; Helpers @@ -164,3 +167,8 @@ whose car is the list of faces and cadr is the list of overlay faces." (t (and (or faces overlays) (list faces overlays)))))) + +;;;###autoload +(defun doom//open-manual () + (interactive) + (find-file (expand-file-name "index.org" doom-docs-dir))) From 5c101f190904c964d1c1c01c402999a6a296c294 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:14:56 +0200 Subject: [PATCH 1336/4235] Update modules library: message! => print! --- core/autoload/modules.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index ffc6089ba..7535b6b4a 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -244,16 +244,16 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (abbreviate-file-name target)))) (cl-incf (cond ((eq result 'no-byte-compile) - (message! (dark (white "⚠ Ignored %s" short-name))) + (print! (dark (white "⚠ Ignored %s" short-name))) total-noop) ((null result) - (message! (red "✕ Failed to compile %s" short-name)) + (print! (red "✕ Failed to compile %s" short-name)) total-fail) (t - (message! (green "✓ Compiled %s" short-name)) + (print! (green "✓ Compiled %s" short-name)) (quiet! (load target t t)) total-ok)))))) - (message! + (print! (bold (color (if (= total-fail 0) 'green 'red) "%s %d/%d file(s) (%d ignored)" @@ -261,12 +261,12 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." total-ok (- (length compile-targets) total-noop) total-noop)))) (error - (message! (red "\n%%s\n\n%%s\n\n%%s") + (print! (red "\n%%s\n\n%%s\n\n%%s") "There were breaking errors." (error-message-string ex) "Reverting changes...") (quiet! (doom//clean-byte-compiled-files)) - (message! (green "Finished (nothing was byte-compiled)"))))))))) + (print! (green "Finished (nothing was byte-compiled)"))))))))) ;;;###autoload (defun doom//clean-byte-compiled-files () From 6aaa13d05e91d48eb697ccde481de489154d1bdb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:15:17 +0200 Subject: [PATCH 1337/4235] doctor: update Doom initialization --- bin/doom-doctor | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 39d3c8fd4..4cad3f24e 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -279,11 +279,11 @@ (message "\n----") (let (doom-core-packages doom-debug-mode) (condition-case ex - (let ((inhibit-message t)) - (load "~/.emacs.d/core/core.el" nil t) - (let (noninteractive) - (doom-initialize t) - (doom|finalize)) + (let ((inhibit-message t) + (noninteractive t)) + (load (concat user-emacs-directory "init.el") nil t) + (doom-initialize) + (doom|run-all-startup-hooks) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) ('error (warn! "Attempt to load DOOM: failed\n %s\n" From 7851e9e3b422f90884ddffb90d5e5847ca4254cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:15:35 +0200 Subject: [PATCH 1338/4235] doctor: pluralize issue count at the end It's features like these that separate us from animals. --- bin/doom-doctor | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 4cad3f24e..5d3210ace 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -316,5 +316,6 @@ ;; (message "\n----") (if (> doom-errors 0) - (warn! "There were %s issues!" doom-errors) + (warn! "There %s!" (if (= doom-errors 1) "is %d issue" "are %d issues") + doom-errors) (success! "Everything seems fine, happy Emacs'ing!")) From d4608c08f8c12ce3335afd0c7216db4eeeb50a8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:16:45 +0200 Subject: [PATCH 1339/4235] Defer dtrt-indent & don't detect indent in noninteractive Doom --- core/core-editor.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index da456d948..6971f2b67 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -176,13 +176,15 @@ fundamental-mode) for performance sake." command-log-mode-open-log-turns-on-mode t)) (def-package! dtrt-indent + :defer t :config (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) (defun doom|detect-indentation () (unless (or doom-inhibit-indent-detection (eq major-mode 'fundamental-mode)) (dtrt-indent-mode +1))) - (add-hook 'after-change-major-mode-hook #'doom|detect-indentation)) + (unless noninteractive + (add-hook 'after-change-major-mode-hook #'doom|detect-indentation))) (def-package! expand-region :commands (er/expand-region er/contract-region er/mark-symbol er/mark-word) From 8da3f56795b1cee0d2daf402dc9c296ccc09cdfc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:17:19 +0200 Subject: [PATCH 1340/4235] core-project: rename autoload-project-mode => init-project-mode To be consistent with other initializing hooks. --- core/core-projects.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 497b6c5b6..2d9eb8197 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -13,7 +13,7 @@ :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) - (add-hook 'find-file-hook #'doom|autoload-project-mode) + (add-hook 'find-file-hook #'doom|init-project-mode) (projectile-mode +1) ;; a more generic project root file @@ -131,7 +131,7 @@ for .dir-locals.el.") "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 () +(defun doom|init-project-mode () "Auto-enable the project(s) listed in `doom-project'." (when doom-project (if (symbolp doom-project) From da5c7d27cf76c8f96bf56f9b0492b7f649c06ef8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:18:48 +0200 Subject: [PATCH 1341/4235] Use correct init hook (doom-post-init-hook) --- core/core-keybinds.el | 2 +- core/core-ui.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 0fca8ca65..0a3495720 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -56,7 +56,7 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; embolden local bindings (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) - (add-hook 'doom-init-hook #'which-key-mode)) + (add-hook 'doom-post-init-hook #'which-key-mode)) (def-package! hydra diff --git a/core/core-ui.el b/core/core-ui.el index bf0bb9439..ad948c254 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -371,7 +371,7 @@ from the default." (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) (advice-add #'display-buffer :around #'doom*switch-buffer-hooks) (advice-add #'pop-to-buffer :around #'doom*switch-buffer-hooks)) -(add-hook 'doom-init-hook #'doom|init-custom-hooks) +(add-hook 'doom-post-init-hook #'doom|init-custom-hooks) (defun doom*load-theme-hooks (theme &rest _) (setq doom-theme theme) @@ -704,7 +704,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; (run-hooks 'doom-init-ui-hook)) -(add-hook 'doom-init-hook #'doom|init-ui) +(add-hook 'doom-post-init-hook #'doom|init-ui) (provide 'core-ui) ;;; core-ui.el ends here From f058505306bf4209943799c43c4c4ce88ec40bf6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 12:21:13 +0200 Subject: [PATCH 1342/4235] New bin/doom (eventual replacement for make) This commit adds bin/doom, which acts as the middle man that make once was (and will stay for a while, though the documentation will shift away from using it). It does everything the previous make interface did, but is faster and more flexible. bin/doom should eventually replace the makefile. bin/doom also makes it easier to run Doom outside of ~/.emacs.d and ~/.doom.d with, for example: bin/doom run -p ~/.other.doom.d/ -e ~/.other.emacs.d bin/doom.cmd is included for Windows users, but I don't recommend using it yet. It hasn't been tested nor have I ever written a batch script before. Also update init.example.el with new defaults. --- Makefile | 102 +++++------ bin/doom | 70 ++++++++ bin/doom.cmd | 14 ++ core/autoload/modules.el | 1 - core/autoload/test.el | 94 +++++----- core/core-dispatcher.el | 253 +++++++++++++++++++++++++++ core/core-packages.el | 3 + core/test/autoload-buffers.el | 25 +-- core/test/autoload-package.el | 3 + early-init.el | 5 +- init.el | 5 + init.example.el | 84 +++++---- modules/feature/evil/config.el | 2 +- modules/feature/workspaces/config.el | 2 +- 14 files changed, 493 insertions(+), 170 deletions(-) create mode 100755 bin/doom create mode 100644 bin/doom.cmd create mode 100644 core/core-dispatcher.el diff --git a/Makefile b/Makefile index 47758ab40..3d1b0a8e5 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,11 @@ # Ensure emacs always runs from this makefile's PWD -EMACS = emacs -q --eval "(setq user-emacs-directory default-directory load-prefer-newer t)" -DOOM = $(EMACS) --batch -l init.el -DOOMI = $(subst --batch,,$(DOOM)) +DOOM = bin/doom +EMACS = emacs -q $(ARGS) -l init.el MODULES = $(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) all: - @$(DOOM) -f doom//reload-packages + @$(DOOM) reload ## Shortcuts a: autoloads @@ -20,84 +19,65 @@ ce: compile-elpa re: recompile d: doctor -quickstart: | ~/.doom.d/init.el all recompile -~/.doom.d/init.el: - @echo "Creating ~/.doom.d directory" - @mkdir ~/.doom.d && cp init.example.el ~/.doom.d/init.el - @touch ~/.doom.d/config.el +quickstart: + @$(DOOM) quickstart + ## Package management -install: | .local/autoloads.el - @$(DOOM) -f doom//packages-install - -update: | .local/autoloads.el - @$(DOOM) -f doom//packages-update - -autoremove: | .local/autoloads.el - @$(DOOM) -f doom//packages-autoremove - +install: + @$(DOOM) install +update: + @$(DOOM) update +autoremove: + @$(DOOM) autoremove autoloads: - @$(DOOM) -f doom//reload-autoloads - -upgrade: | _upgrade recompile all -_upgrade: - @git pull origin $(shell git rev-parse --abbrev-ref HEAD) + @$(DOOM) autoloads +upgrade: + @$(DOOM) upgrade ## Byte compilation -# compile -# compile-core +compile: + @$(DOOM) compile +compile-core: + @$(DOOM) compile :core +compile-private: + @$(DOOM) compile :private +compile-plugins: + @$(DOOM) compile :plugins +recompile: + @$(DOOM) recompile +clean: + @$(DOOM) clean # compile-module # compile-module/submodule -compile: | clean - @$(DOOM) -f doom//byte-compile - -compile-core: | clean - @$(DOOM) -f doom//byte-compile-core - -compile-elpa: - @$(DOOM) -f doom//byte-recompile-plugins - $(patsubst %, compile-%, $(MODULES)): | .local/autoloads.el - @$(DOOM) -f doom//byte-compile -- $(patsubst compile-%, %, $@) - -recompile: - @$(DOOM) -f doom//byte-compile -- -r - -clean: - @$(DOOM) -f doom//clean-byte-compiled-files + @$(DOOM) $@ $(subst compile-, , $@) ## Unit tests -# test -# test-core +test: + @$(DOOM) test +test-core: + @$(DOOM) test :core # test-module # test-module/submodule -test: | .local/autoloads.el - @$(DOOM) -f doom//run-tests - -test-core $(patsubst %, test-%, $(MODULES)): | .local/autoloads.el - @$(DOOM) -f doom//run-tests -- $(subst test-, , $@) - +$(patsubst %, test-%, $(MODULES)): + @$(DOOM) test $(subst test-, , $@) # run tests interactively -testi: | .local/autoloads.el - @$(DOOMI) -f doom//run-tests +testi: + @$(EMACS) -l core/autoload/doom.el -f doom//run-tests ## Utility tasks # Runs Emacs from a different folder than ~/.emacs.d; only use this for testing! run: - @$(DOOMI) $(ARGS) --eval "(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)" + @$(EMACS) +# Prints debug info about your current setup +info: + @$(DOOM) info # Diagnoses potential OS/environment issues doctor: - @$(EMACS) --script bin/doom-doctor - -# Prints debug info about your current setup -info: - @$(EMACS) --batch -l core/core.el -l core/autoload/util.el -f doom/info - -## Internal tasks -.local/autoloads.el: - @$(DOOM) -f doom-initialize-autoloads + @$(DOOM) doctor .PHONY: all compile test testi clean diff --git a/bin/doom b/bin/doom new file mode 100755 index 000000000..f4001a61a --- /dev/null +++ b/bin/doom @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +":"; command -v emacs >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } # -*-emacs-lisp-*- +":"; VERSION=$(emacs --version | head -n1) +":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } +":"; [[ $1 != run ]] && { exec emacs --quick --script "$0" -- $@; exit 0; } +":"; cd $(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. +":"; shift; exec emacs -Q -l bin/doom $@ +":"; exit 0 + +(defun usage () + (with-temp-buffer + (insert (format! "%s %s [COMMAND] [ARGS...]\n" + (bold "Usage:") (file-name-nondirectory load-file-name)) + "\n" + "A command line interfacing for managing Doom Emacs; including\n" + "package management, diagnostics, unit tests, and byte-compilation.\n" + "\n" + "This tool also makes it trivial to launch Emacs out of a different\n" + "folder or with a different private module.\n" + "\n" + (format! (bold "Example:\n")) + " doom install\n" + " doom help update\n" + " doom compile :core lang/php lang/python\n" + " doom run\n" + " doom run -nw file.txt file2.el\n" + " doom run -p ~/.other.doom.d -e ~/.other.emacs.d -nw file.txt\n" + "\n" + (format! (bold "Options:\n")) + " -d --debug\t\tTurns on doom-debug-mode (and debug-on-error)\n" + " -e --emacsd DIR\tUse the emacs config at DIR (e.g. ~/.emacs.d)\n" + " -p --private DIR\tUse the private module at DIR (e.g. ~/.doom.d)\n\n") + (princ (buffer-string))) + (doom--dispatch-help)) + +;; +(let ((argv (cdr (cdr (cdr command-line-args)))) + (emacs-dir (expand-file-name "../" (file-name-directory load-file-name)))) + ;; Parse options + (while (ignore-errors (string-prefix-p "-" (car argv))) + (pcase (pop argv) + ((or "-d" "--debug") + (setq doom-debug-mode t)) + ((or "-p" "--private") + (setq doom-private-dir (expand-file-name (pop argv))) + (or (file-directory-p doom-private-dir) + (error "%s does not exist" doom-private-dir))) + ((or "-e" "--emacsd") + (setq emacs-dir (expand-file-name (pop argv))) + (or (file-directory-p emacs-dir) + (error "%s does not exist" emacs-dir))) + ("--") + (_))) + + ;; Bootstrap Doom + (load (expand-file-name "init" emacs-dir) + nil 'nomessage) + + (cond ((not noninteractive) + ;; Just incase you aren't using Doom! + (when (fboundp 'doom|run-all-startup-hooks) + (doom|run-all-startup-hooks))) + ((equal argv '("help")) + (usage)) + ((not argv) + (message "Expecting a command!\n") + (usage)) + ((let ((default-directory user-emacs-directory)) + (doom-dispatch argv))))) + diff --git a/bin/doom.cmd b/bin/doom.cmd new file mode 100644 index 000000000..2eeb0f2fe --- /dev/null +++ b/bin/doom.cmd @@ -0,0 +1,14 @@ +:: Forward the ./doom script to Emacs + +@ECHO OFF +PUSHD "%~dp0" >NUL + +IF %1=="run" ( + SHIFT + emacs -Q $* -l init.el -f "doom|run-all-startup-hooks" +) ELSE ( + emacs --quick --script ./doom -- $* +) + +POPD >NUL +ECHO ON diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 7535b6b4a..157a40b68 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -59,7 +59,6 @@ This should be run whenever init.el or an autoload file is modified. Running (generate-autoload-section-trailer "") (doom--stage 'autoloads) outdated) - (doom-initialize) (dolist (path (doom-module-load-path)) (let ((auto-dir (expand-file-name "autoload" path)) (auto-file (expand-file-name "autoload.el" path))) diff --git a/core/autoload/test.el b/core/autoload/test.el index 9017e9288..431fe0111 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -1,6 +1,5 @@ ;;; core/autoload/test.el -*- lexical-binding: t; no-byte-compile: t; -*- -;;;###autoload (defun doom//run-tests (&optional modules) "Run all loaded tests, specified by MODULES (a list of module cons cells) or command line args following a double dash (each arg should be in the @@ -8,56 +7,53 @@ command line args following a double dash (each arg should be in the If neither is available, run all tests in all enabled modules." (interactive) - (let ((doom-modules (make-hash-table :test #'equal))) - ;; ensure DOOM is initialized - (let (noninteractive) - ;; Core libraries aren't fully loaded in a noninteractive session, so we - ;; reload it with `noninteractive' set to nil to force them to. - (doom-initialize t) - (run-hooks 'doom-init-hook 'pre-command-hook 'doom-after-switch-buffer-hook)) - (condition-case-unless-debug ex - (let ((target-paths - ;; Convert targets (either from MODULES or `argv') into a list of - ;; string paths, pointing to the root directory of modules - (cond ((string= (car argv) "--") ; command line - (save-match-data - (cl-loop for arg in (cdr argv) - if (string= arg "core") collect doom-core-dir - else if (string-match-p "/" arg) - nconc (cl-loop for dir in doom-modules-dirs - collect (expand-file-name arg dir)) - else - nconc (cl-loop for dir in doom-modules-dirs - for path = (expand-file-name arg dir) - if (file-directory-p path) - nconc - (cl-remove-if-not - #'file-directory-p - (directory-files path t "^[^.]" t))) - finally do (setq argv nil)))) + (let (noninteractive) + ;; Core libraries aren't fully loaded in a noninteractive session, so we + ;; reload it with `noninteractive' set to nil to force them to. + (doom-initialize)) + (condition-case-unless-debug ex + (let ((target-paths + ;; Convert targets (either from MODULES or `argv') into a list of + ;; string paths, pointing to the root directory of modules + (cond ((stringp (car modules)) ; command line + (save-match-data + (cl-loop for arg in modules + if (string= arg "core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (cl-loop for dir in doom-modules-dirs + collect (expand-file-name arg dir)) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc + (cl-remove-if-not + #'file-directory-p + (directory-files path t "^[^.]" t))) + finally do (setq argv nil)))) - (modules ; cons-cells given to MODULES - (cl-loop for (module . submodule) in modules - if (doom-module-find-path module submodule) - collect it)) + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-locate-path module submodule) + collect it)) - ((let (noninteractive) - (load (expand-file-name "init.test.el" user-emacs-directory) nil t) - (append (list doom-core-dir) (doom-module-load-path))))))) - ;; Load all the unit test files... - (dolist (path target-paths) - (let ((test-path (expand-file-name "test/" path))) - (when (file-directory-p test-path) - (dolist (test-file (reverse (doom-packages--files test-path "\\.el$"))) - (load test-file nil :noerror))))) - ;; ... then run them - (if noninteractive - (ert-run-tests-batch-and-exit) - (call-interactively #'ert-run-tests-interactively))) - ('error - (lwarn 'doom-test :error - "%s -> %s" - (car ex) (error-message-string ex)))))) + ((append (list doom-core-dir) + (doom-module-load-path)))))) + ;; Load all the unit test files... + (dolist (path target-paths) + (let ((test-path (expand-file-name "test/" path))) + (when (file-directory-p test-path) + (dolist (test-file (reverse (doom-files-under test-path :match "\\.el$"))) + (load test-file nil :noerror))))) + ;; ... then run them + (switch-to-buffer (get-buffer-create "*blank*")) + (if noninteractive + (ert-run-tests-batch-and-exit) + (call-interactively #'ert-run-tests-interactively))) + ('error + (lwarn 'doom-test :error + "%s -> %s" + (car ex) (error-message-string ex))))) ;; --- Test helpers ----------------------- diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el new file mode 100644 index 000000000..c24112443 --- /dev/null +++ b/core/core-dispatcher.el @@ -0,0 +1,253 @@ +;;; -*- lexical-binding: t; no-byte-compile: t; -*- + +(load! autoload/packages) +(load! autoload/modules) +(load! autoload/debug) +(load! autoload/message) + + +;; +;; Dispatcher +;; + +(defvar doom-dispatch-command-alist () + "TODO") + +(defvar doom-dispatch-alias-alist () + "TODO") + +(defun doom--dispatch-format (desc &optional short) + (if (equal desc "TODO") + (format! (yellow "TODO")) + (with-temp-buffer + (let ((fill-column 72)) + (insert desc) + (goto-char (point-min)) + (while (re-search-forward "\n\n[^ \n]" nil t) + (fill-paragraph))) + (if (not short) + (buffer-string) + (goto-char (point-min)) + (buffer-substring-no-properties + (line-beginning-position) + (line-end-position)))))) + +(defun doom--dispatch-help (&optional command desc &rest args) + "TODO" + (if command + (princ (doom--dispatch-format desc)) + (print! (bold "%-10s\t%s\t%s" "Command:" "Alias" "Description")) + (dolist (spec (sort doom-dispatch-command-alist + (lambda (x y) (string-lessp (car x) (car y))))) + (cl-destructuring-bind (command &key desc _body) spec + (let ((alias (car (rassq command doom-dispatch-alias-alist)))) + (print! " %-10s\t%s\t%s" + command (or alias "") + (doom--dispatch-format desc t))))))) + +(defun doom-dispatch (args) + "TODO" + (let ((help (equal (car args) "help"))) + (if help (pop args)) + (cl-destructuring-bind (command &key desc body) + (let ((sym (intern (car args)))) + (or (assq sym doom-dispatch-command-alist) + (assq (cdr (assq sym doom-dispatch-alias-alist)) doom-dispatch-command-alist) + (error "Invalid command: %s" (car args)))) + (if help + (apply #'doom--dispatch-help command desc (cdr args)) + (funcall body (cdr args)))))) + +;; FIXME Clumsy way of registering commands, refactor! +(defmacro def-dispatcher! (command desc &rest body) + "TODO" + (declare (doc-string 2)) + (let* ((command (doom-enlist command)) + (cmd (car command)) + (alias (car (cdr command)))) + `(progn + ,(when alias + `(map-put doom-dispatch-alias-alist ',alias ',cmd)) + (map-put doom-dispatch-command-alist + ',cmd (list :desc ,desc :body (lambda (args) ,@body)))))) + +;; +(def-dispatcher! run + "Run Doom Emacs from bin/doom's parent directory. + +All arguments are passed on to Emacs (except for -p and -e). + + doom run + doom run -nw init.el + +Warning, this is for convenience and testing purposes, Doom will not run its +best or fastest when started in this manner.") + +(def-dispatcher! quickstart + "TODO" + (doom//quickstart)) + +(def-dispatcher! (install i) + "Installs requested plugins that aren't installed." + (doom-initialize) + (when (doom//packages-install) + (doom//reload-autoloads))) + +(def-dispatcher! (update u) + "Checks for and updates outdated plugins." + (doom-initialize) + (when (doom//packages-update) + (doom//reload-autoloads))) + +(def-dispatcher! (autoremove r) + "Removes orphaned plugins." + (doom-initialize) + (when (doom//packages-autoremove) + (doom//reload-autoloads))) + +(def-dispatcher! (autoloads a) + "Regenerates Doom's autoloads file. + +This file tells Emacs where to find your module's autoloaded functions and +plugins." + (doom-initialize) + (doom//reload-autoloads)) + +(def-dispatcher! (upgrade up) + "Checks out the latest Doom on this branch." + (doom//upgrade)) + +(def-dispatcher! (compile c) + "Byte-compiles your config or selected modules. + + compile [TARGETS...] + compile :core :private lang/python + compile feature lang + +Accepts :core, :private and :plugins as special arguments, indicating you want +to byte-compile Doom's core files, your private config or your ELPA plugins, +respectively." + (doom//byte-compile args)) + +(def-dispatcher! (recompile cc) + "Re-byte-compiles outdated *.elc files." + (doom//byte-compile args 'recompile)) + +(def-dispatcher! clean + "Delete all *.elc files." + (doom//clean-byte-compiled-files)) + +(def-dispatcher! test + "Run Doom unit tests." + (load! autoload/test) + (doom//run-tests args)) + +(def-dispatcher! info + "Output system info in markdown for bug reports." + (doom//info)) + +(def-dispatcher! (doctor d) + "Checks for issues with your current Doom config." + (load (expand-file-name "bin/doom-doctor" doom-emacs-dir) + nil t t)) + +(def-dispatcher! (version v) + "Reports the version of Doom and Emacs." + (doom//version)) + +(def-dispatcher! (reload re) + "Reload Doom. + +This is the equivalent of running autoremove, install, autoloads, then +recompile. Run this whenever you: + + 1. Modify your `doom!' block, + 2. Add or remove `package!' blocks to your config, + 3. Add or remove autoloaded functions in module autoloaded files. + 4. Update Doom outside of Doom (e.g. with git)" + (doom-initialize) + (if (let* ((doom--inhibit-reload t) + (autoremove-p (doom//packages-autoremove)) + (install-p (doom//packages-install))) + (or autoremove-p install-p)) + (doom//reload) + (doom//reload-autoloads)) + (doom//byte-compile nil 'recompile)) + + +;; +;; Quality of Life Commands +;; + +(defvar doom-remote "origin" + "TODO") + +(defun doom//upgrade () + "TODO" + (declare (interactive-only t)) + (interactive) + (let ((core-file (expand-file-name "init.el" doom-core-dir)) + (branch (vc-git--symbolic-ref core-file)) + (default-directory doom-emacs-dir)) + (unless (file-exists-p core-file) + (error "Couldn't find %s, was Doom cloned properly?" + (abbreviate-file-name core-file))) + (unless branch + (error "Couldn't detect what branch you're using. Is %s a repo?" + (abbreviate-file-name doom-emacs-dir))) + (unless (eq (vc-state core-file 'Git) 'up-to-date) + (user-error "Doom has been modified; refusing to upgrade. Stash or undo your changes")) + (with-temp-buffer + (let ((buf (current-buffer))) + (when (zerop (process-file "git" nil buf nil + "fetch" "--tags" doom-remote branch)) + (let ((current-rev (vc-git-working-revision core-file)) + (rev (shell-command-to-string (format "git rev-parse %s/%s" doom-remote branch)))) + (unless rev + (error "Couldn't detect Doom's version. Is %s a repo?" + (abbreviate-file-name doom-emacs-dir))) + (if (equal current-rev rev) + (message "Doom is up to date!") + + (when (or (getenv "YES") + (y-or-n-p "Doom is out of date, update?")) + (unless (zerop (process-file "git" nil buf nil + "checkout" (format "%s/%s" doom-remote branch))) + (error "An error occurred while checking out the latest commit")) + (when (file-exists-p (byte-compile-dest-file core-file)) + (message "Your config is byte-compiled, removing byte-compiled files") + (doom//clean-byte-compiled-files)) + (doom//reload) + (message "Done! Please restart Emacs for changes to take effect"))))))))) + +(defun doom//quickstart () + "TODO" + (declare (interactive-only t)) + (interactive) + (let ((short-private-dir (abbreviate-file-name doom-private-dir))) + (when (file-directory-p doom-private-dir) + (error "%s already exists! Aborting." short-private-dir)) + (message "Creating %s directory" short-private-dir) + (make-directory doom-private-dir) + (let ((init-file (expand-file-name "init.el" doom-private-dir))) + (if (not (file-exists-p init-file)) + (message "%sinit.el already exists. Skipping.") + (message "Copying init.example.el to %s" short-private-dir) + (copy-file (expand-file-name "init.example.el" doom-emacs-dir) + init-file))) + (let ((config-file (expand-file-name "config.el" doom-private-dir))) + (if (file-exists-p config-file) + (with-temp-file config-file + (insert "")) + (message "%sconfig.el already exists. Skipping.")))) + (doom-initialize) + (let* ((doom--inhibit-reload t) + (autoremove-p (doom//packages-autoremove)) + (install-p (doom//packages-install))) + (or autoremove-p install-p)) + (doom//reload-autoloads) + (message "\n\nDone! Doom Emacs is ready.\n") + (message "Remember to run M-x all-the-icons-install-fonts after starting Emacs for the first time.")) + +(provide 'core-dispatcher) +;;; core-dispatcher.el ends here diff --git a/core/core-packages.el b/core/core-packages.el index e1d16bfc3..08e67ad04 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -462,6 +462,9 @@ added, if the file exists." (autoload 'use-package "use-package" nil nil 'macro) +;; TODO :after-hook HOOK (load packages on first run of HOOK) +;; TODO Make + ;; diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el index 49f27c113..98242988a 100644 --- a/core/test/autoload-buffers.el +++ b/core/test/autoload-buffers.el @@ -7,17 +7,18 @@ (dolist (bsym buffer-args) (push `(,bsym (get-buffer-create ,(symbol-name bsym))) buffers)) - `(cl-flet ((buffer-list - (lambda () - (cl-remove-if-not #'buffer-live-p (list ,@(reverse (mapcar #'car buffers))))))) - (let* ((split-width-threshold 0) - (window-min-width 0) - persp-mode - ,@buffers) - (delete-other-windows) - ,@body - (let (kill-buffer-query-functions kill-buffer-hook) - (mapc #'kill-buffer (buffer-list))))))) + `(save-window-excursion + (cl-flet ((buffer-list + (lambda () + (cl-remove-if-not #'buffer-live-p (list ,@(reverse (mapcar #'car buffers))))))) + (let* ((split-width-threshold 0) + (window-min-width 0) + persp-mode + ,@buffers) + (delete-other-windows) + ,@body + (let (kill-buffer-query-functions kill-buffer-hook) + (mapc #'kill-buffer (buffer-list)))))))) ;; (def-test! get-buffers @@ -93,7 +94,7 @@ (with-temp-buffers!! (a b c d e) (dolist (buf (list a b)) (with-current-buffer buf - (emacs-lisp-mode))) + (delay-mode-hooks (emacs-lisp-mode)))) (dolist (buf (list c d e)) (with-current-buffer buf (text-mode))) diff --git a/core/test/autoload-package.el b/core/test/autoload-package.el index 22103070f..cb5f8595e 100644 --- a/core/test/autoload-package.el +++ b/core/test/autoload-package.el @@ -1,6 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/autoload-package.el +(require 'package) +(require 'quelpa) + (defun -pkg (name version &optional reqs) (package-desc-create :name name :version version :reqs reqs)) diff --git a/early-init.el b/early-init.el index e86bca68b..e47330734 100644 --- a/early-init.el +++ b/early-init.el @@ -11,7 +11,8 @@ ;; Faster to disable these here (before they've been initialized) (setq tool-bar-mode nil - menu-bar-mode nil) -(set-scroll-bar-mode nil) + menu-bar-mode nil + scroll-bar-mode nil) +(modify-all-frames-parameters '((vertical-scroll-bars))) ;; TODO Once Emacs 27 hits stable, perhaps replace init.el with early-init.el diff --git a/init.el b/init.el index 50621daa5..497941f17 100644 --- a/init.el +++ b/init.el @@ -27,4 +27,9 @@ ;; ;;; License: MIT +(setq user-emacs-directory (file-name-directory load-file-name) + load-prefer-newer noninteractive) + (require 'core (concat user-emacs-directory "core/core")) +(when noninteractive + (require 'core-dispatcher)) diff --git a/init.example.el b/init.example.el index 92a2163f1..6ad2287c4 100644 --- a/init.example.el +++ b/init.example.el @@ -26,9 +26,6 @@ +childframe) ; uses childframes for popups (Emacs 26+ only) :ui - (popup ; tame sudden yet inevitable temporary windows - +all ; catch all popups that start with an asterix - +defaults) ; default popup rules doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs doom-modeline ; a snazzy Atom-inspired mode-line @@ -37,6 +34,9 @@ hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping neotree ; a project drawer, like NERDTree for vim + (popup ; tame sudden yet inevitable temporary windows + +all ; catch all popups that start with an asterix + +defaults) ; default popup rules ;tabbar ; FIXME an (incomplete) tab bar for Emacs ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB @@ -45,68 +45,66 @@ :tools dired ; making dired pretty [functional] editorconfig ; let someone else argue about tabs vs spaces - ein ; tame Jupyter notebooks with emacs electric-indent ; smarter, keyword-based electric-indent + ;ein ; tame Jupyter notebooks with emacs eshell ; a consistent, cross-platform shell (WIP) - gist ; interacting with github gists + ;gist ; interacting with github gists imenu ; an imenu sidebar and searchable code index ;macos ; MacOS-specific commands - make ; run make tasks from Emacs + ;make ; run make tasks from Emacs ;magit ; - password-store ; password manager for nerds + ;password-store ; password manager for nerds pdf ; pdf enhancements - prodigy ; Managing external services + ;prodigy ; FIXME managing external services & code builders ;rgb ; creating color strings rotate-text ; cycle region at point between text candidates - term ; terminals in Emacs + ;term ; terminals in Emacs tmux ; an API for interacting with tmux upload ; map local to remote projects via ssh/ftp :lang - assembly ; assembly for fun or debugging - cc ; C/C++/Obj-C madness - crystal ; ruby at the speed of c - clojure ; java with a lisp - csharp ; unity, .NET, and mono shenanigans + ;assembly ; assembly for fun or debugging + ;cc ; C/C++/Obj-C madness + ;crystal ; ruby at the speed of c + ;clojure ; java with a lisp + ;csharp ; unity, .NET, and mono shenanigans data ; config/data formats ;erlang ; an elegant language for a more civilized age - elixir ; erlang done right - elm ; care for a cup of TEA? + ;elixir ; erlang done right + ;elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses - ess ; emacs speaks statistics - go ; the hipster dialect - (haskell +intero) ; a language that's lazier than I am - hy ; readability of scheme w/ speed of python - (java +meghanada) ; the poster child for carpal tunnel syndrome - javascript ; all(hope(abandon(ye(who(enter(here)))))) - julia ; a better, faster MATLAB - latex ; writing papers in Emacs has never been so fun - ledger ; an accounting system in Emacs - lua ; one-based indices? one-based indices + ;ess ; emacs speaks statistics + ;go ; the hipster dialect + ;(haskell +intero) ; a language that's lazier than I am + ;hy ; readability of scheme w/ speed of python + ;(java +meghanada) ; the poster child for carpal tunnel syndrome + ;javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;julia ; a better, faster MATLAB + ;latex ; writing papers in Emacs has never been so fun + ;ledger ; an accounting system in Emacs + ;lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore - nim ; python + lisp at the speed of c - nix ; I hereby declare "nix geht mehr!" - ocaml ; an objective camel + ;nim ; python + lisp at the speed of c + ;nix ; I hereby declare "nix geht mehr!" + ;ocaml ; an objective camel (org ; organize your plain life in plain text +attach ; custom attachment system +babel ; running code in org +capture ; org-capture in and outside of Emacs +export ; Exporting org to whatever you want - +present ; Emacs for presentations - +publish) ; Emacs+Org as a static site generator - perl ; write code no one else can comprehend - php ; perl's insecure younger brother - plantuml ; diagrams for confusing people more - purescript ; javascript, but functional - python ; beautiful is better than ugly - rest ; Emacs as a REST client - ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} - rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() - scala ; java, but good + +present) ; Emacs for presentations + ;perl ; write code no one else can comprehend + ;php ; perl's insecure younger brother + ;plantuml ; diagrams for confusing people more + ;purescript ; javascript, but functional + ;python ; beautiful is better than ugly + ;rest ; Emacs as a REST client + ;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + ;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;scala ; java, but good sh ; she sells (ba|z)sh shells on the C xor - swift ; who asked for emoji variables? - typescript ; javascript, but better - web ; the tubes + ;swift ; who asked for emoji variables? + ;web ; the tubes ;; Applications are complex and opinionated modules that transform Emacs ;; toward a specific purpose. They may have additional dependencies and diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 39c3830a7..dc28e4d68 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -61,7 +61,7 @@ evil-visual-state-cursor 'hollow) :config - (add-hook 'doom-init-hook #'evil-mode) + (add-hook 'doom-post-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) (set! :popup "^\\*evil-registers" '((size . 0.3))) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index fd8df7a29..4b6d1f4b4 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -77,7 +77,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (display-buffer-in-side-window warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))) - (add-hook 'doom-init-hook #'+workspaces|init t) + (add-hook 'doom-post-init-hook #'+workspaces|init t) :config (setq persp-autokill-buffer-on-remove 'kill-weak persp-nil-hidden t From f3f817257920d8e4b1cb541e9a72d4487328fea6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 15:17:59 +0200 Subject: [PATCH 1343/4235] Fix {copy,move}-this-file commands when file doesn't exist yet --- core/autoload/files.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index c2bf906b3..e77df3ec0 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -56,9 +56,10 @@ (not force-p) (not (y-or-n-p (format "File already exists at %s, overwrite?" short-new-name)))) (throw 'status 'aborted)) - (t + ((file-exists-p old-path) (copy-file old-path new-path t) - short-new-name)))) + short-new-name) + (short-new-name)))) ;;;###autoload (defun doom/delete-this-file (&optional path force-p) @@ -107,7 +108,8 @@ file if it exists, without confirmation." (let ((old-path (buffer-file-name)) (new-path (expand-file-name new-path))) (when-let* ((dest (doom--copy-file old-path new-path force-p))) - (delete-file old-path) + (when (file-exists-p old-path) + (delete-file old-path)) (kill-this-buffer) (find-file new-path) (doom--forget-file old-path new-path) From ddadb7995231526e9f5f6c664d0f0c817557652a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 15:18:36 +0200 Subject: [PATCH 1344/4235] Reduce noise from doom doctor And fix not-enough-arguments error from format. --- bin/doom-doctor | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 5d3210ace..0eb4b1b8e 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -112,11 +112,8 @@ (message "Compiled with:\n%s" (indented 2 system-configuration-features))) (message "uname -a:\n%s\n" (indented 2 (sh "uname -a"))) -(msg! "----\n") - ;; --- is emacs set up properly? ------------------------------ -(section! "test-emacs") (when (version< emacs-version "25.1") (error! "Important: Emacs %s detected [%s]" emacs-version (executable-find "emacs")) (explain! @@ -125,7 +122,6 @@ (concat "\nMacOS users should use homebrew (https://brew.sh) to install Emacs\n" " brew install emacs --with-modules --with-imagemagick --with-cocoa")))) -(section! "test-private-config") (let ((xdg-dir (concat (or (getenv "XDG_CONFIG_HOME") "~/.config") "/doom/")) @@ -140,14 +136,12 @@ ;; --- is the environment set up properly? -------------------- -;; windows? windows -(section! "test-windows") +;; on windows? (when (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 -(section! "test-fonts") +;; are all default fonts present? (if (not (fboundp 'find-font)) (progn (warn! "Warning: unable to detect font") @@ -170,7 +164,6 @@ "case, ignore this warning.")))))) ;; gnutls-cli & openssl -(section! "test-gnutls") (cond ((executable-find "gnutls-cli")) ((executable-find "openssl") (let* ((output (sh "openssl ciphers -v")) @@ -205,7 +198,7 @@ "network, provider, government, neckbearded mother-in-laws, geeky roommates, " "or just about anyone who knows more about computers than you do!"))) -(section! "test-tls") +;; are certificates validated properly? (cond ((not (string-match-p "\\_" system-configuration-features)) (warn! "Warning: You didn't install Emacs with gnutls support") (explain! @@ -254,8 +247,7 @@ ((error! "Nope!"))) -;; bsd vs gnu tar -(section! "test-tar") +;; which variant of tar is on your system? bsd or gnu tar? (let ((tar-bin (or (executable-find "gtar") (executable-find "tar")))) (if tar-bin @@ -291,7 +283,7 @@ (setq doom-modules nil)))) (when (bound-and-true-p doom-modules) - (section! "test-modules") + (section! "Running module doctors...") (let ((indent 4)) (advice-add #'require :around #'doom*shut-up) (maphash @@ -316,6 +308,7 @@ ;; (message "\n----") (if (> doom-errors 0) - (warn! "There %s!" (if (= doom-errors 1) "is %d issue" "are %d issues") - doom-errors) + (warn! "There %s!" + (format (if (= doom-errors 1) "is %d issue" "are %d issues") + doom-errors)) (success! "Everything seems fine, happy Emacs'ing!")) From f2c02e32c81c686e1e9200b0ac9b4904c388fd1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 15:23:37 +0200 Subject: [PATCH 1345/4235] General minor refactor & comment updates --- core/autoload/files.el | 3 +-- core/autoload/packages.el | 11 +++++----- core/core-packages.el | 45 ++++++++++++++++++++------------------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index e77df3ec0..687ee2d91 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -75,8 +75,7 @@ kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." ((not (or force-p (y-or-n-p (format "Really delete %s?" fbase)))) (message "Aborted") nil) - (t - (unwind-protect + ((unwind-protect (progn (delete-file path) t) (let ((short-path (file-relative-name path (doom-project-root)))) (if (file-exists-p path) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 58a1a008b..3439dab28 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -3,9 +3,6 @@ (load! cache) ;;; Private functions -(defsubst doom--sort-alpha (it other) - (string-lessp (symbol-name (car it)) - (symbol-name (car other)))) (defun doom--packages-choose (prompt) (let ((table (cl-loop for pkg in package-alist @@ -365,7 +362,8 @@ package.el as appropriate." "QUELPA") (t "ELPA")))) - (sort (cl-copy-list packages) #'doom--sort-alpha) + (cl-sort (cl-copy-list packages) #'string-lessp + :key #'car) "\n"))))) (error "Aborted!")) @@ -400,7 +398,8 @@ package.el as appropriate." (doom-initialize-packages) (print! "Looking for outdated packages...") (doom-refresh-packages-maybe doom-debug-mode) - (let ((packages (sort (doom-get-outdated-packages) #'doom--sort-alpha))) + (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp + :key #'car))) (cond ((not packages) (print! (green "Everything is up-to-date")) nil) @@ -411,7 +410,7 @@ package.el as appropriate." (length packages) (let ((max-len (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) - (lambda (it other) (> it other)))) + #'>)) 10))) (mapconcat (lambda (pkg) diff --git a/core/core-packages.el b/core/core-packages.el index 08e67ad04..3d431f1c7 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -248,29 +248,28 @@ to least)." (setq doom--refreshed-p t) (package-initialize)))) ;; 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"))) + (when-let* ((core-packages (cl-remove-if #'package-installed-p doom-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")) (unless noninteractive (add-hook 'doom-pre-init-hook #'doom|refresh-cache))) - ;; autoloads file + ;; Load autoloads file (doom-initialize-autoloads)) - ;; initialize Doom core + ;; Initialize Doom core (unless noninteractive (require 'core-ui) (require 'core-editor) (require 'core-projects) (require 'core-keybinds)) - ;; bootstrap Doom + ;; Bootstrap Doom (unless doom-init-p (unless noninteractive (add-hook! 'doom-reload-hook @@ -517,6 +516,7 @@ MODULES is an malformed plist of modules to load." (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) `(progn + ;; TODO Replace with custom use-package keyword ,(when-let* ((defer (plist-get plist :defer)) (value (or (car-safe defer) defer))) (setq plist (plist-put plist :defer (or (cdr-safe defer) t))) @@ -554,8 +554,7 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." package (substring (symbol-name when) 1))) ,@body))) - (t - (error "'%s' isn't a valid hook for def-package-hook!" when)))) + ((error "'%s' isn't a valid hook for def-package-hook!" when)))) (defmacro load! (filesym &optional path noerror) "Load a file relative to the current executing file (`load-file-name'). @@ -750,11 +749,13 @@ loads MODULE SUBMODULE's packages.el file." ;; Cross-module configuration ;; -;; I needed a way to reliably cross-configure modules without worrying about -;; whether they were enabled or not, so I wrote `set!'. If a setting doesn't -;; exist at runtime, the `set!' call is ignored and its arguments are left -;; unevaluated (and entirely omitted when byte-compiled). -(defvar doom-settings nil) +;; I needed a way to reliably cross-configure modules without littering my +;; modules with `after!' blocks or testing whether they were enabled, so I wrote +;; `set!'. If a setting doesn't exist at runtime, the `set!' call is ignored and +;; its arguments are left unevaluated (and entirely omitted when byte-compiled). + +(defvar doom-settings nil + "An alist mapping setting keywords to functions.") (defmacro def-setting! (keyword arglist &optional docstring &rest forms) "Define a setting. Like `defmacro', this should return a form to be executed From 16a9126b3ef03234816840faa9cd9b8e2328a067 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 15:51:47 +0200 Subject: [PATCH 1346/4235] Make after! noop if package is disabled After disabling a package, def-package! blocks for that package are ignored. Now, after! blocks for those packages will be ignored too. --- core/core-lib.el | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 527188cdf..67da60898 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -108,27 +108,29 @@ "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation." (declare (indent defun) (debug t)) - (list (if (or (not (bound-and-true-p byte-compile-current-file)) - (dolist (next (doom-enlist targets)) - (if (symbolp next) - (require next nil :no-error) - (load next :no-message :no-error)))) - #'progn - #'with-no-warnings) - (cond ((symbolp targets) - `(eval-after-load ',targets '(progn ,@body))) - ((and (consp targets) - (memq (car targets) '(:or :any))) - `(progn - ,@(cl-loop for next in (cdr targets) - collect `(after! ,next ,@body)))) - ((and (consp targets) - (memq (car targets) '(:and :all))) - (dolist (next (cdr targets)) - (setq body `(after! ,next ,@body))) - body) - ((listp targets) - `(after! (:all ,@targets) ,@body))))) + (unless (and (symbolp targets) + (memq targets doom-disabled-packages)) + (list (if (or (not (bound-and-true-p byte-compile-current-file)) + (dolist (next (doom-enlist targets)) + (if (symbolp next) + (require next nil :no-error) + (load next :no-message :no-error)))) + #'progn + #'with-no-warnings) + (cond ((symbolp targets) + `(eval-after-load ',targets '(progn ,@body))) + ((and (consp targets) + (memq (car targets) '(:or :any))) + `(progn + ,@(cl-loop for next in (cdr targets) + collect `(after! ,next ,@body)))) + ((and (consp targets) + (memq (car targets) '(:and :all))) + (dolist (next (cdr targets)) + (setq body `(after! ,next ,@body))) + body) + ((listp targets) + `(after! (:all ,@targets) ,@body)))))) (defmacro quiet! (&rest forms) "Run FORMS without making any output." From 454a962d6bade0546c6b69b227d8ea8b6279f582 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:03:37 +0200 Subject: [PATCH 1347/4235] Rewrite doom//reload (merge reload-load-path into it) --- core/autoload/modules.el | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 157a40b68..7c23b2e34 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -4,33 +4,19 @@ (defun doom//reload () "Reload your private Doom config. Experimental!" (interactive) - (let ((load-prefer-newer t)) - (message "Reloading your private config...") - (setq doom-modules (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0)) - (doom-initialize t) - (doom//reload-autoloads)) - (message "✓ Done!")) + (when (file-exists-p doom-packages-file) + (delete-file doom-packages-file)) + (cond ((and noninteractive (not (daemonp))) + (doom-initialize) + (doom//reload-autoloads) + (require 'server) + (when (server-running-p) + (message "Reloading active Emacs session...") + (server-eval-at server-name '(doom//reload)))) -;;;###autoload -(defun doom//reload-load-path () - "Reload `load-path' and recompile files (if necessary). - -Use this when `load-path' is out of sync with your plugins. This should only -happen if you manually modify/update/install packages from outside Emacs, while -an Emacs session is running. - -This isn't necessary if you use Doom's package management commands because they -call `doom//reload-load-path' remotely (through emacsclient)." - (interactive) - (unless doom--inhibit-reload - (when (file-exists-p doom-packages-file) - (delete-file doom-packages-file)) - (cond ((and noninteractive (not (daemonp))) - (require 'server) - (when (server-running-p) - (message "Reloading active Emacs session...") - (server-eval-at server-name '(doom//reload-load-path)))) - (t + ((let ((load-prefer-newer t) + doom-init-p) + (setq doom-modules (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0)) (doom-initialize t) (message "%d packages reloaded" (length package-alist)) (run-hooks 'doom-reload-hook))))) From 89c52e7d999b4c76c265c4c4f5b3af0b30d24d52 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:05:35 +0200 Subject: [PATCH 1348/4235] Rename reload dispatcher to refresh & refactor --- core/core-dispatcher.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index c24112443..33b887335 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -155,8 +155,8 @@ respectively." "Reports the version of Doom and Emacs." (doom//version)) -(def-dispatcher! (reload re) - "Reload Doom. +(def-dispatcher! (refresh re) + "Refresh Doom. This is the equivalent of running autoremove, install, autoloads, then recompile. Run this whenever you: @@ -166,13 +166,13 @@ recompile. Run this whenever you: 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)" (doom-initialize) - (if (let* ((doom--inhibit-reload t) - (autoremove-p (doom//packages-autoremove)) - (install-p (doom//packages-install))) - (or autoremove-p install-p)) - (doom//reload) - (doom//reload-autoloads)) - (doom//byte-compile nil 'recompile)) + (let (reload-p) + (when (let* ((doom--inhibit-reload t) + (autoremove-p (doom//packages-autoremove)) + (install-p (doom//packages-install))) + (or autoremove-p install-p)) + (doom//reload)) + (doom//byte-compile nil 'recompile))) ;; From 1369c51000834ea3f0f94bc5dc70e84187f57002 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:07:15 +0200 Subject: [PATCH 1349/4235] Replace :defer HOOK/FN with :after-call keyword --- core/core-editor.el | 16 ++++++++------ core/core-packages.el | 51 +++++++++++++++++++++++++++++++------------ core/core-ui.el | 4 ++-- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 6971f2b67..844052373 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -83,14 +83,15 @@ fundamental-mode) for performance sake." ;; revert buffers for changed files (def-package! autorevert - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) ;; persist variables across sessions (def-package! savehist - :defer (pre-command-hook . 1) + :defer 1 + :after-call post-command-hook :config (setq savehist-file (concat doom-cache-dir "savehist") savehist-save-minibuffer-history t @@ -100,7 +101,7 @@ fundamental-mode) for performance sake." ;; persistent point location in buffers (def-package! saveplace - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config (setq save-place-file (concat doom-cache-dir "saveplace")) (defun doom*recenter-on-load-saveplace (&rest _) @@ -112,7 +113,8 @@ fundamental-mode) for performance sake." ;; Keep track of recently opened files (def-package! recentf - :defer (pre-command-hook . 1) + :defer 1 + :after-call find-file-hook :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") @@ -135,7 +137,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :commands (sp-pair sp-local-pair sp-with-modes) :config (require 'smartparens-config) @@ -155,7 +157,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! @@ -176,7 +178,7 @@ fundamental-mode) for performance sake." command-log-mode-open-log-turns-on-mode t)) (def-package! dtrt-indent - :defer t + :after-call doom-before-switch-buffer-hook :config (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) diff --git a/core/core-packages.el b/core/core-packages.el index 3d431f1c7..ece2af661 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -459,11 +459,44 @@ added, if the file exists." ;; Use-package modifications ;; -(autoload 'use-package "use-package" nil nil 'macro) +(autoload 'use-package "use-package-core" nil 'macro) -;; TODO :after-hook HOOK (load packages on first run of HOOK) -;; TODO Make +(after! use-package-core + (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) + (setq use-package-keywords + (use-package-list-insert :after-call use-package-keywords :after)) + + (defalias 'use-package-normalize/:after-call + 'use-package-normalize-symlist) + + (defvar doom--deferred-packages-alist () + "TODO") + + (defun use-package-handler/:after-call (name-symbol _keyword hooks rest state) + (let ((fn (intern (format "doom|transient-hook--load-%s" name-symbol))) + (hooks (delete-dups hooks))) + (if (plist-get state :demand) + (use-package-process-keywords name rest state) + (use-package-concat + `((fset ',fn + (lambda (&rest _) + (require ',name-symbol) + (dolist (hook (cdr (assq ',name-symbol doom--deferred-packages-alist))) + (if (functionp hook) + (advice-remove hook #',fn) + (remove-hook hook #',fn))) + (map-delete doom--deferred-packages-alist ',name-symbol) + (fmakunbound ',fn)))) + (cl-mapcan (lambda (hook) + (if (functionp hook) + `((advice-add #',hook :before #',fn)) + `((add-hook ',hook #',fn)))) + hooks) + `((map-put doom--deferred-packages-alist + ',name-symbol + '(,@hooks ,@(cdr (assq name-symbol doom--deferred-packages-alist))))) + (use-package-process-keywords name rest state)))))) ;; @@ -515,17 +548,7 @@ MODULES is an malformed plist of modules to load." (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) - `(progn - ;; TODO Replace with custom use-package keyword - ,(when-let* ((defer (plist-get plist :defer)) - (value (or (car-safe defer) defer))) - (setq plist (plist-put plist :defer (or (cdr-safe defer) t))) - (unless (or (memq value '(t nil)) - (number-or-marker-p value)) - `(add-transient-hook! ',value - ,(intern (format "load-%s" name)) - (require ',name)))) - (use-package ,name ,@plist)))) + `(use-package ,name ,@plist))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. diff --git a/core/core-ui.el b/core/core-ui.el index ad948c254..f6f7faa5f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -290,13 +290,13 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; undo/redo changes to Emacs' window layout (def-package! winner - :defer doom-before-switch-window-hook + :after-call doom-before-switch-window-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) ;; highlight matching delimiters (def-package! paren - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t From 8ce5e96ea5676c54db1562d94681665613200928 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:07:46 +0200 Subject: [PATCH 1350/4235] recentf: auto-cleanup = 120; refactor temp-file detector --- core/core-editor.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 844052373..b4984600d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -118,16 +118,16 @@ fundamental-mode) for performance sake." :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") - recentf-auto-cleanup 60 + recentf-auto-cleanup 120 recentf-max-menu-items 0 recentf-max-saved-items 300 recentf-filename-handlers '(file-truename) recentf-exclude - (list #'file-remote-p "\\.\\(gz\\|gif\\|svg\\|png\\|jpe?g\\)$" + (list #'file-remote-p "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\)$" "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) - (concat "^" (file-truename doom-local-dir)))) + (lambda (file) (file-in-directory-p file doom-local-dir)))) (recentf-mode +1)) From ac5eaf0fb32ad71f028453a77c63d88f70ec716f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:08:03 +0200 Subject: [PATCH 1351/4235] Load core-lib before core-package So that core-package may use the Doom standard library. --- core/core-lib.el | 7 +++---- core/core.el | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 67da60898..6429d7699 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,9 +1,8 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(let ((load-path doom-site-load-path)) - (require 'subr-x) - (require 'cl-lib) - (require 'map)) +(require 'subr-x) +(require 'cl-lib) +(require 'map) (eval-and-compile (unless EMACS26+ diff --git a/core/core.el b/core/core.el index e9f68279f..3ea6b195c 100644 --- a/core/core.el +++ b/core/core.el @@ -197,8 +197,8 @@ this, you'll get stuttering and random freezes) and resets (add-to-list 'load-path doom-core-dir) -(require 'core-packages) (require 'core-lib) +(require 'core-packages) (require 'core-os) (unless noninteractive From 67269fdf2b87ea459633e0a02c2273d0e3307c3e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:08:38 +0200 Subject: [PATCH 1352/4235] add-transient-hook!: unintern => fmakunbound --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 6429d7699..2182b03f2 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -167,7 +167,7 @@ HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." ,@forms (cond ((functionp ,hook) (advice-remove ,hook #',fn)) ((symbolp ,hook) (remove-hook ,hook #',fn))) - (unintern ',fn nil))) + (fmakunbound ',fn))) (cond ((functionp ,hook) (advice-add ,hook ,(if append :after :before) #',fn)) ((symbolp ,hook) From 337d2e95338e222d0876810e2fdd860fa90d6e8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:09:01 +0200 Subject: [PATCH 1353/4235] Make bin/doom (with no args) equivalent to make all --- bin/doom | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index f4001a61a..b18d68e44 100755 --- a/bin/doom +++ b/bin/doom @@ -63,8 +63,8 @@ ((equal argv '("help")) (usage)) ((not argv) - (message "Expecting a command!\n") - (usage)) + (let ((default-directory user-emacs-directory)) + (doom-dispatch (list "refresh")))) ((let ((default-directory user-emacs-directory)) (doom-dispatch argv))))) From f853d8b407045ea2bc1334c4379a418d6c56df14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 May 2018 20:11:51 +0200 Subject: [PATCH 1354/4235] Update core autoload-message tests --- core/test/autoload-message.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/test/autoload-message.el b/core/test/autoload-message.el index c3e456a2f..0cdae9f09 100644 --- a/core/test/autoload-message.el +++ b/core/test/autoload-message.el @@ -10,15 +10,15 @@ "Hello World")) (should (equal (format! (green "Hello %s" "World")) (format "\e[%dm%s\e[0m" - (cdr (assq 'green doom-message-fg)) + (cadr (assq 'green doom-message-fg)) "Hello World"))) (should (equal (format! (on-red "Hello %s" "World")) (format "\e[%dm%s\e[0m" - (cdr (assq 'on-red doom-message-bg)) + (cadr (assq 'on-red doom-message-bg)) "Hello World"))) (should (equal (format! (bold "Hello %s" "World")) (format "\e[%dm%s\e[0m" - (cdr (assq 'bold doom-message-fx)) + (cadr (assq 'bold doom-message-fx)) "Hello World"))))) (def-test! ansi-format-nested From fbf8a7be56782ffcf654f334024582dfcc10a6ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 01:25:58 +0200 Subject: [PATCH 1355/4235] Remove vestigial references to doom//reload-load-path --- 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 3439dab28..7e405a0f5 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -388,7 +388,7 @@ package.el as appropriate." (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) "")))) (print! (bold (green "Finished!"))) - (doom//reload-load-path) + (doom//reload) success))))) ;;;###autoload @@ -432,7 +432,7 @@ package.el as appropriate." (color (if result 'green 'red) (if result "✓ DONE" "✕ FAILED")))))) (print! (bold (green "Finished!"))) - (doom//reload-load-path) + (doom//reload) success))))) ;;;###autoload @@ -478,7 +478,7 @@ package.el as appropriate." pkg))))) (print! (bold (green "Finished!"))) - (doom//reload-load-path) + (doom//reload) success))))) From cf54b3705b1b3dee84cfbfbf9dd1d12cd5ffbad4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 15:42:00 +0200 Subject: [PATCH 1356/4235] bin/doom: alias h => help --- bin/doom | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index b18d68e44..9ce2f8a0b 100755 --- a/bin/doom +++ b/bin/doom @@ -60,7 +60,8 @@ ;; Just incase you aren't using Doom! (when (fboundp 'doom|run-all-startup-hooks) (doom|run-all-startup-hooks))) - ((equal argv '("help")) + ((and (not (cdr argv)) + (member (car argv) '("help" "h"))) (usage)) ((not argv) (let ((default-directory user-emacs-directory)) From 553d00b598b8c4bb03c93575a03f84fa69afe639 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 15:42:27 +0200 Subject: [PATCH 1357/4235] Add doctor/help dummy dispatchers This way they show up in doom help + documentation. --- core/core-dispatcher.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 33b887335..70a71e5e4 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -83,6 +83,13 @@ All arguments are passed on to Emacs (except for -p and -e). Warning, this is for convenience and testing purposes, Doom will not run its best or fastest when started in this manner.") +(def-dispatcher! (doctor doc) + "Checks for issues with your current Doom config.") + +(def-dispatcher! (help h) + "Look up additional information about a command.") + +;; (def-dispatcher! quickstart "TODO" (doom//quickstart)) @@ -146,11 +153,6 @@ respectively." "Output system info in markdown for bug reports." (doom//info)) -(def-dispatcher! (doctor d) - "Checks for issues with your current Doom config." - (load (expand-file-name "bin/doom-doctor" doom-emacs-dir) - nil t t)) - (def-dispatcher! (version v) "Reports the version of Doom and Emacs." (doom//version)) From 1b8dce260bf65a510e412f6eb6ca2a78ad3befc3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 16:13:49 +0200 Subject: [PATCH 1358/4235] config/default: restore find-in-snippets command #597 And conditionally bind snippets keybinds --- modules/config/default/+bindings.el | 12 +++++++----- modules/config/default/autoload/default.el | 6 ++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a72aa6e2c..33df90bba 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -295,11 +295,13 @@ :desc "Browse remote files" :n "." #'ssh-deploy-browse-remote-handler :desc "Detect remote changes" :n ">" #'ssh-deploy-remote-changes-handler)) - (: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) + (:when (featurep! :feature snippets) + (:desc "snippets" :prefix "s" + :desc "New snippet" :n "n" #'yas-new-snippet + :desc "Insert snippet" :nv "i" #'yas-insert-snippet + :desc "Find snippet" :n "s" #'+default/find-in-snippets + :desc "Find snippet for mode" :n "S" #'+default/browse-snippets + :desc "Find global snippet" :n "/" #'yas-visit-snippet-file)) (:desc "toggle" :prefix "t" :desc "Flyspell" :n "s" #'flyspell-mode diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 6526c029e..738ea0a7b 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -36,8 +36,10 @@ ;;;###autoload (defun +default/browse-snippets () - (interactive) (doom-project-browse emacs-snippets-dir)) -;; NOTE No need for a browse-snippets variant, use `yas-visit-snippet-file' + (interactive) (doom-project-browse +snippets-dir)) +;;;###autoload +(defun +default/find-in-snippets () + (interactive) (doom-project-find-file +snippets-dir)) ;;;###autoload (defun +default/find-in-config () From af97dcdfe8a6e14f6d8c184bcaf6a69675fe2ddb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 16:33:15 +0200 Subject: [PATCH 1359/4235] config/default: add SPC-g-o/SPC-g-I for browsing remote/issues --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 33df90bba..50eb4bb28 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -197,8 +197,10 @@ :desc "Magit status" :n "g" #'magit-status :desc "List gists" :n "G" #'+gist:list :desc "Initialize repo" :n "i" #'magit-init + :desc "Browse issues tracker" :n "I" #'+vcs/git-browse-issues :desc "Magit buffer log" :n "l" #'magit-log-buffer-file :desc "List repositories" :n "L" #'magit-list-repositories + :desc "Browse remote" :n "o" #'+vcs/git-browse :desc "Magit push popup" :n "p" #'magit-push-popup :desc "Magit pull popup" :n "P" #'magit-pull-popup :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk From 4e18722d497ee91f324036c7d56123a068d12ed3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 16:33:50 +0200 Subject: [PATCH 1360/4235] config/default: update doom help/debug keybinds --- modules/config/default/+bindings.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 50eb4bb28..01b3bf7cc 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -215,9 +215,11 @@ (:desc "help" :prefix "h" :n "h" help-map :desc "Apropos" :n "a" #'apropos + :desc "Open Bug Report" :n "b" #'doom//open-bug-report :desc "Describe char" :n "c" #'describe-char :desc "Describe DOOM module" :n "d" #'doom/describe-module - :desc "Open Doom manual" :n "D" #'doom/help + :desc "Open Doom manual" :n "D" #'doom//open-manual + :desc "Open vanilla sandbox" :n "E" #'doom//open-vanilla-sandbox :desc "Describe function" :n "f" #'describe-function :desc "Describe face" :n "F" #'describe-face :desc "Info" :n "i" #'info-lookup-symbol @@ -227,7 +229,7 @@ :desc "Command log" :n "L" #'global-command-log-mode :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode - :desc "Toggle profiler" :n "p" #'doom/toggle-profiler + :desc "Toggle profiler" :n "p" #'doom//toggle-profiler :desc "Reload theme" :n "r" #'doom//reload-theme :desc "Reload private config" :n "R" #'doom//reload :desc "Describe DOOM setting" :n "s" #'doom/describe-setting @@ -235,7 +237,7 @@ :desc "Print Doom version" :n "V" #'doom/version :desc "Describe at point" :n "." #'helpful-at-point :desc "What face" :n "'" #'doom/what-face - :desc "What minor modes" :n ";" #'doom/what-minor-mode) + :desc "What minor modes" :n ";" #'doom/describe-active-minor-mode) (:desc "insert" :prefix "i" :desc "From kill-ring" :nv "y" #'counsel-yank-pop From 6a0812819466cc316dc353f40610b227bd2fa9aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 16:50:54 +0200 Subject: [PATCH 1361/4235] doctor: make feedback more informative --- bin/doom-doctor | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 0eb4b1b8e..5bf6865ed 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -18,6 +18,7 @@ ;; (defvar doom-init-p nil) +(defvar doom-warnings 0) (defvar doom-errors 0) (defmacro when! (cond &rest body) (declare (indent defun)) @@ -62,7 +63,7 @@ (format (concat prefix ,msg) ,@args)))) (defmacro error! (&rest args) `(progn (msg! (color 31 ,@args)) (setq doom-errors (+ doom-errors 1)))) -(defmacro warn! (&rest args) `(progn (msg! (color 33 ,@args)) (setq doom-errors (+ doom-errors 1)))) +(defmacro warn! (&rest args) `(progn (msg! (color 33 ,@args)) (setq doom-warnings (+ doom-warnings 1)))) (defmacro success! (&rest args) `(msg! (color 32 ,@args))) (defmacro section! (&rest args) `(msg! (color 1 (color 34 ,@args)))) @@ -137,11 +138,13 @@ ;; --- is the environment set up properly? -------------------- ;; on windows? +(section! "Checking your OS...") (when (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? +(section! "Checking your fonts...") (if (not (fboundp 'find-font)) (progn (warn! "Warning: unable to detect font") @@ -164,6 +167,7 @@ "case, ignore this warning.")))))) ;; gnutls-cli & openssl +(section! "Checking gnutls/openssl...") (cond ((executable-find "gnutls-cli")) ((executable-find "openssl") (let* ((output (sh "openssl ciphers -v")) @@ -199,6 +203,7 @@ "or just about anyone who knows more about computers than you do!"))) ;; are certificates validated properly? +(section! "Testing your root certificates...") (cond ((not (string-match-p "\\_" system-configuration-features)) (warn! "Warning: You didn't install Emacs with gnutls support") (explain! @@ -248,6 +253,7 @@ ((error! "Nope!"))) ;; which variant of tar is on your system? bsd or gnu tar? +(section! "Checking for GNU/BSD tar...") (let ((tar-bin (or (executable-find "gtar") (executable-find "tar")))) (if tar-bin @@ -268,7 +274,6 @@ ;; --- are your modules set up properly? ---------------------- -(message "\n----") (let (doom-core-packages doom-debug-mode) (condition-case ex (let ((inhibit-message t) @@ -283,7 +288,7 @@ (setq doom-modules nil)))) (when (bound-and-true-p doom-modules) - (section! "Running module doctors...") + (section! "Checking your enabled modules...") (let ((indent 4)) (advice-add #'require :around #'doom*shut-up) (maphash @@ -306,9 +311,13 @@ doom-modules))) ;; -(message "\n----") -(if (> doom-errors 0) - (warn! "There %s!" - (format (if (= doom-errors 1) "is %d issue" "are %d issues") - doom-errors)) +(message "\n") +(dolist (msg (list (list doom-errors "error" 31) + (list doom-warnings "warning" 33))) + (when (> (car msg) 0) + (message (color (nth 2 msg) (if (= (car msg) 1) "There is %d %s!" "There are %d %ss!") + (car msg) (nth 1 msg))))) + +(when (and (zerop doom-errors) + (zerop doom-warnings)) (success! "Everything seems fine, happy Emacs'ing!")) From 2e7831b8a4e8d54932367eff63ed0bad9a8016c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 16:51:10 +0200 Subject: [PATCH 1362/4235] doctor: reduce output for cert test --- bin/doom-doctor | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 5bf6865ed..33121fea9 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -225,8 +225,7 @@ (gnutls-verify-error t)) (dolist (url '("https://elpa.gnu.org" "https://melpa.org")) (when! (condition-case-unless-debug e - (if (let ((inhibit-message t)) (url-retrieve-synchronously url)) - (ignore (success! "Validated %s" url)) + (unless (let ((inhibit-message t)) (url-retrieve-synchronously url)) 'empty) ('timed-out 'timeout) ('error e)) @@ -243,7 +242,7 @@ t 'empty) ('timed-out 'timeout) - ('error (ignore (success! "Successfully rejected %s" url)))) + ('error)) (pcase it (`empty (error! "Couldn't reach %s" url)) (`timeout (error! "Timed out trying to contact %s" ex)) From 8ea0f3427088f59166fa814921b2395bd43a2f72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 May 2018 16:51:38 +0200 Subject: [PATCH 1363/4235] doctor: update doom bootstrap logic & fix error on built-in packages --- bin/doom-doctor | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 33121fea9..2f2030a1f 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -275,11 +275,9 @@ (let (doom-core-packages doom-debug-mode) (condition-case ex - (let ((inhibit-message t) - (noninteractive t)) + (let ((inhibit-message t)) (load (concat user-emacs-directory "init.el") nil t) - (doom-initialize) - (doom|run-all-startup-hooks) + (doom-initialize-modules) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) ('error (warn! "Attempt to load DOOM: failed\n %s\n" @@ -302,7 +300,8 @@ (doom--stage 'packages)) (when (load packages-file t t) (dolist (package (cl-remove-if #'package-installed-p doom-packages :key #'car)) - (error! "%s is not installed" (car package)))) + (unless (package-built-in-p (car package)) + (error! "%s is not installed" (car package))))) (let ((doom--stage 'doctor)) (load doctor-file t t))))) ('error From 53a7e3508213c7688f3e56b6bda2b15fc9d58a67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 May 2018 01:47:40 +0200 Subject: [PATCH 1364/4235] lang/javascript: fix rjsx-electric-gt reparsing advice --- modules/lang/javascript/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 8d7c4d202..ff5991288 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -67,8 +67,8 @@ ;; However, the parser doesn't run immediately, so a fast typist can outrun ;; it, causing issues, so force it to parse. (defun +javascript|reparse (n) - ;; if n != 0, then rjsx-maybe-reparse will be run elsewhere - (if (= n 0) (rjsx-maybe-reparse))) + ;; if n != 1, then rjsx-maybe-reparse will be run elsewhere + (if (= n 1) (rjsx-maybe-reparse))) (advice-add #'rjsx-electric-gt :before #'+javascript|reparse)) From 2637c415d3596082fe8468b7e2e348fedfc5f896 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 23 May 2018 19:09:09 +0200 Subject: [PATCH 1365/4235] Add error checks & docstrings to doom-keyword-* lib functions --- core/core-lib.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 2182b03f2..2ebfdc9fc 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -58,13 +58,15 @@ t))) (defun doom-keyword-intern (str) - "TODO" + "Converts STR (a string) into a keyword (`keywordp')." + (or (stringp str) + (signal 'wrong-type-argument (list 'stringp str))) (intern (concat ":" str))) (defun doom-keyword-name (keyword) - "TODO" + "Returns the string name of KEYWORD (`keywordp') minus the leading colon." (or (keywordp keyword) - (signal 'wrong-type-argument (list 'keyword keyword))) + (signal 'wrong-type-argument (list 'keywordp keyword))) (substring (symbol-name keyword) 1)) (cl-defun doom-files-in (dirs &key when unless full map (nosort t) (match "^[^.]")) From dc0175b8e13a223ff1d4c46f70a42b85cf31cc93 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 23 May 2018 19:16:33 +0200 Subject: [PATCH 1366/4235] Merge doom-files-under into doom-files-in; more powerful doom-files-in --- core/core-lib.el | 82 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 18 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 2ebfdc9fc..54655819d 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -69,25 +69,71 @@ (signal 'wrong-type-argument (list 'keywordp keyword))) (substring (symbol-name keyword) 1)) -(cl-defun doom-files-in (dirs &key when unless full map (nosort t) (match "^[^.]")) - "TODO" - (let ((results (cl-loop for dir in (doom-enlist dirs) - if (file-directory-p dir) - nconc (directory-files dir full match nosort)))) - (when when - (cl-delete-if-not when results)) - (when unless - (cl-delete-if unless results)) - (when map - (setq results (mapcar map results))) - results)) +(cl-defun doom-files-in + (path-or-paths &rest rest + &key + filter + map + full + (follow-symlinks t) + (type 'files) + (relative-to (unless full (if (nlistp path-or-paths) path-or-paths))) + (depth 99999) + (match "^[^.]")) + "Returns a list of files/directories in PATH-OR-PATHS (one string path or a +list of them). -(cl-defun doom-files-under (dirs &key include-dirs (match "^[^.]")) - "Like `directory-files-recursively', but traverses symlinks." - (cl-letf (((symbol-function #'file-symlink-p) #'ignore)) - (cl-loop for dir in (doom-enlist dirs) - if (file-directory-p dir) - nconc (directory-files-recursively dir match include-dirs)))) +FILTER is a function or symbol that takes one argument (the path). If it returns +non-nil, the entry will be excluded. + +MAP is a function or symbol which will be used to transform each entry in the +results. + +TYPE determines what kind of path will be included in the results. This can be t +(files and folders), 'files or 'dirs. + +By default, this function returns paths relative to PATH-OR-PATHS if it is a +single path. If it a list of paths, this function returns absolute paths. +Otherwise, by setting RELATIVE-TO to a path, the results will be transformed to +be relative to it. + +The search recurses up to DEPTH and no further. DEPTH is an integer. + +MATCH is a string regexp. Only entries that match it will be included." + (cond + ((listp path-or-paths) + (cl-loop for path in path-or-paths + if (file-directory-p path) + nconc (apply #'doom-files-in path (plist-put rest :relative-to relative-to)))) + ((let ((path path-or-paths) + result) + (dolist (file (file-name-all-completions "" path)) + (unless (member file '("./" "../")) + (let ((fullpath (expand-file-name file path))) + (cond ((directory-name-p fullpath) + (when (and (memq type '(t dirs)) + (string-match-p match file) + (not (and filter (funcall filter fullpath))) + (not (and (file-symlink-p fullpath) + (not follow-symlinks)))) + (setq result + (nconc result + (list (cond (map (funcall map fullpath)) + (relative-to (file-relative-name fullpath relative-to)) + (fullpath)))))) + (unless (<= depth 1) + (setq result + (nconc result (apply #'doom-files-in fullpath + (append `(:depth ,(1- depth) :relative-to ,relative-to) + rest)))))) + ((and (memq type '(t files)) + (string-match-p match file) + (not (and filter (funcall filter fullpath)))) + (push (if relative-to + (file-relative-name fullpath relative-to) + fullpath) + result)))))) + result)))) (defun doom*shut-up (orig-fn &rest args) "Generic advisor for silencing noisy functions." From b452aded76f32ee549b7827b863fb1ab466cf5a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 11:44:17 +0200 Subject: [PATCH 1367/4235] Mention doom-emacs-dir must end with a slash --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 3ea6b195c..9c2baa1b4 100644 --- a/core/core.el +++ b/core/core.el @@ -20,7 +20,7 @@ line or use --debug-init to enable this.") ;; (defvar doom-emacs-dir (eval-when-compile (file-truename user-emacs-directory)) - "The path to this emacs.d directory.") + "The path to this emacs.d directory. Must end in a slash.") (defvar doom-core-dir (concat doom-emacs-dir "core/") "Where essential files are stored.") From 5d42b1512b708e9201f9f50ffd1b00e3b4937014 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 11:49:01 +0200 Subject: [PATCH 1368/4235] Fix naive path concatenation for doom-private-dir #513 --- core/core.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 9c2baa1b4..3a504f5f9 100644 --- a/core/core.el +++ b/core/core.el @@ -49,9 +49,10 @@ Use this for files that change often, like cache files.") (defvar doom-private-dir (eval-when-compile - (or (let ((xdg-path (concat (or (getenv "XDG_CONFIG_HOME") - "~/.config") - "/doom/"))) + (or (let ((xdg-path + (expand-file-name "doom/" + (or (getenv "XDG_CONFIG_HOME") + "~/.config")))) (if (file-directory-p xdg-path) xdg-path)) "~/.doom.d/")) "Where your private customizations are placed. Must end in a slash. Respects From a48f75371b49f89d0a9cc0046e98b7976068f1e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 13:02:02 +0200 Subject: [PATCH 1369/4235] core-lib (doom-files-in): default relative-to to default-directory --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 54655819d..9c1205e96 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -77,7 +77,7 @@ full (follow-symlinks t) (type 'files) - (relative-to (unless full (if (nlistp path-or-paths) path-or-paths))) + (relative-to (unless full default-directory)) (depth 99999) (match "^[^.]")) "Returns a list of files/directories in PATH-OR-PATHS (one string path or a From 499630fdcd445da636450318804c846bedfc1fe9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:00:46 +0200 Subject: [PATCH 1370/4235] bin/doom: handle doc/doctor especially --- bin/doom | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index 9ce2f8a0b..b2d15728f 100755 --- a/bin/doom +++ b/bin/doom @@ -2,9 +2,10 @@ ":"; command -v emacs >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } # -*-emacs-lisp-*- ":"; VERSION=$(emacs --version | head -n1) ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } -":"; [[ $1 != run ]] && { exec emacs --quick --script "$0" -- $@; exit 0; } -":"; cd $(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. -":"; shift; exec emacs -Q -l bin/doom $@ +":"; DOOMDIR=$(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. +":"; [[ $1 == doc || $1 == doctor ]] && { cd "$DOOMDIR"; exec emacs --script bin/doom-doctor; exit 0; } +":"; [[ $1 == run ]] && { cd "$DOOMDIR"; shift; exec emacs -Q -l bin/doom "$@"; exit 0; } +":"; exec emacs --quick --script "$0" -- $@ ":"; exit 0 (defun usage () From 8a7ebebf160dbe073504c4b5c404c01a5d92671d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:02:57 +0200 Subject: [PATCH 1371/4235] bin/doom: add -y/--yes option --- bin/doom | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index b2d15728f..856028da7 100755 --- a/bin/doom +++ b/bin/doom @@ -30,7 +30,8 @@ (format! (bold "Options:\n")) " -d --debug\t\tTurns on doom-debug-mode (and debug-on-error)\n" " -e --emacsd DIR\tUse the emacs config at DIR (e.g. ~/.emacs.d)\n" - " -p --private DIR\tUse the private module at DIR (e.g. ~/.doom.d)\n\n") + " -p --private DIR\tUse the private module at DIR (e.g. ~/.doom.d)\n" + " -y --yes\t\tAuto-accept all confirmation prompts\n\n") (princ (buffer-string))) (doom--dispatch-help)) @@ -50,8 +51,8 @@ (setq emacs-dir (expand-file-name (pop argv))) (or (file-directory-p emacs-dir) (error "%s does not exist" emacs-dir))) - ("--") - (_))) + ((or "-y" "--yes") + (setq doom-auto-accept t)))) ;; Bootstrap Doom (load (expand-file-name "init" emacs-dir) From e1e47b91738321edbef0aadcc1d9b8fd19932883 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:03:23 +0200 Subject: [PATCH 1372/4235] bin/doom: minor refactor; no longer default to doom refresh Better to be explicit, otherwise you get some weird cases where incorrect commands fall through to a doom refresh. --- bin/doom | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/bin/doom b/bin/doom index 856028da7..3e7a2f4de 100755 --- a/bin/doom +++ b/bin/doom @@ -11,7 +11,8 @@ (defun usage () (with-temp-buffer (insert (format! "%s %s [COMMAND] [ARGS...]\n" - (bold "Usage:") (file-name-nondirectory load-file-name)) + (bold "Usage:") + (file-name-nondirectory load-file-name)) "\n" "A command line interfacing for managing Doom Emacs; including\n" "package management, diagnostics, unit tests, and byte-compilation.\n" @@ -36,38 +37,36 @@ (doom--dispatch-help)) ;; -(let ((argv (cdr (cdr (cdr command-line-args)))) +(let ((args (cdr (cdr (cdr command-line-args)))) (emacs-dir (expand-file-name "../" (file-name-directory load-file-name)))) ;; Parse options - (while (ignore-errors (string-prefix-p "-" (car argv))) - (pcase (pop argv) + (while (ignore-errors (string-prefix-p "-" (car args))) + (pcase (pop args) ((or "-d" "--debug") (setq doom-debug-mode t)) ((or "-p" "--private") - (setq doom-private-dir (expand-file-name (pop argv))) + (setq doom-private-dir (expand-file-name (pop args))) (or (file-directory-p doom-private-dir) (error "%s does not exist" doom-private-dir))) ((or "-e" "--emacsd") - (setq emacs-dir (expand-file-name (pop argv))) + (setq emacs-dir (expand-file-name (pop args))) (or (file-directory-p emacs-dir) (error "%s does not exist" emacs-dir))) ((or "-y" "--yes") (setq doom-auto-accept t)))) ;; Bootstrap Doom + (setq noninteractive 'doom) (load (expand-file-name "init" emacs-dir) nil 'nomessage) (cond ((not noninteractive) - ;; Just incase you aren't using Doom! - (when (fboundp 'doom|run-all-startup-hooks) - (doom|run-all-startup-hooks))) - ((and (not (cdr argv)) - (member (car argv) '("help" "h"))) + (doom|run-all-startup-hooks)) + ((and (not (cdr args)) + (member (car args) '("help" "h"))) (usage)) - ((not argv) - (let ((default-directory user-emacs-directory)) - (doom-dispatch (list "refresh")))) + ((not args) + (error "Expecting a command")) ((let ((default-directory user-emacs-directory)) - (doom-dispatch argv))))) + (doom-dispatch args))))) From bf3d35c287ed7b223c10aa3b480db27dc1b8de8c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:05:52 +0200 Subject: [PATCH 1373/4235] Clean up makefile & update it to match bin/doom --- Makefile | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 3d1b0a8e5..a233df3cf 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,8 @@ -# Ensure emacs always runs from this makefile's PWD DOOM = bin/doom -EMACS = emacs -q $(ARGS) -l init.el - MODULES = $(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) all: - @$(DOOM) reload + @$(DOOM) refresh ## Shortcuts a: autoloads @@ -15,7 +12,7 @@ U: upgrade r: autoremove c: compile cc: compile-core -ce: compile-elpa +cp: compile-plugins re: recompile d: doctor @@ -63,15 +60,12 @@ test-core: # test-module/submodule $(patsubst %, test-%, $(MODULES)): @$(DOOM) test $(subst test-, , $@) -# run tests interactively -testi: - @$(EMACS) -l core/autoload/doom.el -f doom//run-tests ## Utility tasks # Runs Emacs from a different folder than ~/.emacs.d; only use this for testing! run: - @$(EMACS) + @$(DOOM) run $(ARGS) # Prints debug info about your current setup info: @$(DOOM) info From 7cfab92f7cd5517987722cc96e5a21c31d7373fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:39:08 +0200 Subject: [PATCH 1374/4235] bin/doom-doctor: refactor bash bootstrapper --- bin/doom-doctor | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 2f2030a1f..0ad1e003a 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -1,6 +1,8 @@ #!/usr/bin/env bash ":"; command -v emacs >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } # -*-emacs-lisp-*- -":"; [[ $(emacs --version | head -n1) == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $(emacs --version | head -n1)"; echo "That version is too old to run the doctor. Check your PATH"; echo; exit 2; } || exec emacs --quick --script "$0" +":"; VERSION=$(emacs --version | head -n1) +":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run the doctor. Check your PATH"; echo; exit 2; } +":"; exec emacs --quick --script "$0"; exit 0 ;; Uses a couple simple heuristics to locate issues with your environment that ;; could interfere with running or setting up DOOM Emacs. From 592e16d76d6600b391a929699c78651ea2fd682f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:40:37 +0200 Subject: [PATCH 1375/4235] Conform debug commands to naming convention --- core/autoload/debug.el | 14 +++++++------- modules/config/default/+bindings.el | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 03c944765..586c0dc20 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -93,7 +93,7 @@ ready to be pasted in a bug report on github." ;; ;;;###autoload -(defun doom//info () +(defun doom/info () "Collects some debug information about your Emacs session, formats it into markdown and copies it to your clipboard, ready to be pasted into bug reports!" (declare (interactive-only t)) @@ -105,7 +105,7 @@ markdown and copies it to your clipboard, ready to be pasted into bug reports!" (message "Done! Copied to clipboard."))) ;;;###autoload -(defun doom//am-i-secure () +(defun doom/am-i-secure () "Test to see if your root certificates are securely configured in emacs." (declare (interactive-only t)) (interactive) @@ -129,7 +129,7 @@ markdown and copies it to your clipboard, ready to be pasted into bug reports!" t))))) ;;;###autoload -(defun doom//version () +(defun doom/version () "Display the current version of Doom & Emacs, including the current Doom branch and commit." (interactive) @@ -169,7 +169,7 @@ branch and commit." "--eval" (prin1-to-string `(delete-file ,file))))))) ;;;###autoload -(defun doom//open-vanilla-sandbox () +(defun doom/open-vanilla-sandbox () "Open an Emacs Lisp buffer destinated to run in a blank Emacs session. This vanilla sandbox is started with emacs -Q, and provides a testbed for @@ -221,7 +221,7 @@ access to the installed packages." (error (signal (car e) (car e))))))) ;;;###autoload -(defun doom//open-bug-report () +(defun doom/open-bug-report () "Open a markdown buffer destinated to populate the New Issue page on Doom Emacs' issue tracker. @@ -266,7 +266,7 @@ will be automatically appended to the result." (defvar doom--profiler nil) ;;;###autoload -(defun doom//toggle-profiler () +(defun doom/toggle-profiler () "Toggle the Emacs profiler. Run it again to see the profiling report." (interactive) (if (not doom--profiler) @@ -276,7 +276,7 @@ will be automatically appended to the result." (setq doom--profiler (not doom--profiler))) ;;;###autoload -(defun doom//profile-emacs () +(defun doom/profile-emacs () "Profile the startup time of Emacs in the background with ESUP. If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." (interactive) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 01b3bf7cc..2d4f221a3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -215,11 +215,11 @@ (:desc "help" :prefix "h" :n "h" help-map :desc "Apropos" :n "a" #'apropos - :desc "Open Bug Report" :n "b" #'doom//open-bug-report + :desc "Open Bug Report" :n "b" #'doom/open-bug-report :desc "Describe char" :n "c" #'describe-char :desc "Describe DOOM module" :n "d" #'doom/describe-module :desc "Open Doom manual" :n "D" #'doom//open-manual - :desc "Open vanilla sandbox" :n "E" #'doom//open-vanilla-sandbox + :desc "Open vanilla sandbox" :n "E" #'doom/open-vanilla-sandbox :desc "Describe function" :n "f" #'describe-function :desc "Describe face" :n "F" #'describe-face :desc "Info" :n "i" #'info-lookup-symbol @@ -229,7 +229,7 @@ :desc "Command log" :n "L" #'global-command-log-mode :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode - :desc "Toggle profiler" :n "p" #'doom//toggle-profiler + :desc "Toggle profiler" :n "p" #'doom/toggle-profiler :desc "Reload theme" :n "r" #'doom//reload-theme :desc "Reload private config" :n "R" #'doom//reload :desc "Describe DOOM setting" :n "s" #'doom/describe-setting @@ -255,7 +255,7 @@ :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl :desc "Neotree" :n "n" #'+neotree/open - :desc "Neotree: on this file" :n "N" #'+neotree/find-this-file + :desc "Neotree: find file" :n "N" #'+neotree/find-this-file :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle :desc "Terminal" :n "t" #'+term/open-popup-in-project From b25e215d59acc25e364f4c49583fc64c74698806 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 16:41:14 +0200 Subject: [PATCH 1376/4235] Increase last-pkg-refresh ttl from 900 -> 1200s --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 7e405a0f5..849816193 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -50,7 +50,7 @@ (progn (message "Refreshing package archives") (package-refresh-contents) - (doom-cache-set 'last-pkg-refresh t 900)) + (doom-cache-set 'last-pkg-refresh t 1200)) ('error (doom--refresh-pkg-cache) (message "Failed to refresh packages: (%s) %s" From e3bdeabe0b62dc0f6ebed1dbe070bf1843ed7c7b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 18:29:56 +0200 Subject: [PATCH 1377/4235] bin/doom: discard extra command line args --- bin/doom | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/doom b/bin/doom index 3e7a2f4de..1e455534a 100755 --- a/bin/doom +++ b/bin/doom @@ -68,5 +68,6 @@ ((not args) (error "Expecting a command")) ((let ((default-directory user-emacs-directory)) + (setq argv nil) (doom-dispatch args))))) From 47ccbb5d416c8dd701cf51c4db4a70b1725e46b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 18:30:36 +0200 Subject: [PATCH 1378/4235] print!: use terpri instead of princ for newline Will produce the appropriate newline for the current OS. --- core/autoload/message.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index f1b84a1b9..8aba7b918 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -101,4 +101,4 @@ Uses faces in interactive sessions and ANSI codes otherwise." (message (format! ,message ,@args)) ;; princ prints to stdout, message to stderr (princ (format! ,message ,@args)) - (princ "\n"))) + (terpri))) From b2186745b7750d5580b519f1f06de02b78261a1e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 18:35:06 +0200 Subject: [PATCH 1379/4235] Refactor doom--resolve-path-forms --- core/core-lib.el | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 9c1205e96..57fe6da0d 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -15,18 +15,40 @@ ;; Helpers ;; -(defun doom--resolve-path-forms (paths &optional root) - (cond ((stringp paths) +(defun doom--resolve-path-forms (spec &optional directory) + "Converts a simple nested series of or/and forms into a series of +`file-exists-p' checks. + +For example + + (doom--resolve-path-forms + '(or \"some-file\" (and path-var \"/an/absolute/path\")) + \"~\") + +Returns + + '(or (file-exists-p (expand-file-name \"some-file\" \"~\")) + (and (file-exists-p (expand-file-name path-var \"~\")) + (file-exists-p \"/an/absolute/path\"))) + +This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." + (cond ((stringp spec) `(file-exists-p - (expand-file-name - ,paths ,(if (or (string-prefix-p "./" paths) - (string-prefix-p "../" paths)) - 'default-directory - (or root `(doom-project-root)))))) - ((listp paths) - (cl-loop for i in paths - collect (doom--resolve-path-forms i root))) - (t paths))) + ,(if (file-name-absolute-p spec) + spec + `(expand-file-name ,spec ,directory)))) + ((symbolp spec) + `(file-exists-p ,(if directory + `(expand-file-name ,spec ,directory) + path))) + ((and (listp spec) + (memq (car spec) '(or and))) + `(,(car spec) + ,@(cl-loop for i in (cdr spec) + collect (doom--resolve-path-forms i directory)))) + ((listp spec) + (doom--resolve-path-forms (eval spec t) directory)) + (t spec))) (defun doom--resolve-hook-forms (hooks) (cl-loop with quoted-p = (eq (car-safe hooks) 'quote) @@ -314,7 +336,7 @@ Body forms can access the hook's arguments through the let-bound variable (not ,mode) (and buffer-file-name (not (file-remote-p buffer-file-name))) ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) - ,(if files (doom--resolve-path-forms files) t) + ,(if files (doom--resolve-path-forms files '(doom-project-root)) t) ,(or pred-form t)) (,mode 1))) ,@(if (and modes (listp modes)) From 4ee0b5ba6df1fb9ed88d77460909ce63e96c9a1d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 18:35:42 +0200 Subject: [PATCH 1380/4235] New macros file-exists-p! & project-file-exists-p! The latter replaces the doom-project-has! macro --- core/core-lib.el | 14 ++++++++++++++ core/core-projects.el | 4 ++-- core/test/core-lib.el | 4 ++-- core/test/core-projects.el | 12 ++++++------ modules/lang/cc/autoload.el | 2 +- modules/lang/java/autoload.el | 6 +++--- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 57fe6da0d..cbb4d16ea 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -348,5 +348,19 @@ Body forms can access the hook's arguments through the let-bound variable (t (user-error "associate! invalid rules for mode [%s] (modes %s) (match %s) (files %s)" mode modes match files)))))) +(defmacro file-exists-p! (spec &optional directory) + "Returns t if the files in SPEC all exist. + +SPEC can be a single file or a list of forms/files. It understands nested (and +...) and (or ...), as well. + +DIRECTORY is where to look for the files in SPEC if they aren't absolute. This +doesn't apply to variables, however. + +For example: + + (file-exists-p (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" + (doom--resolve-path-forms spec directory)) + (provide 'core-lib) ;;; core-lib.el ends here diff --git a/core/core-projects.el b/core/core-projects.el index 2d9eb8197..5ad28773b 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -94,12 +94,12 @@ If NOCACHE, don't fetch a cached answer." (defalias 'doom-project-expand #'projectile-expand-root) -(defmacro doom-project-has! (files) +(defmacro project-file-exists-p! (files) "Checks if the project has the specified FILES. Paths are relative to the project root, unless they start with ./ or ../ (in 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))) + (doom--resolve-path-forms files '(doom-project-root))) (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." diff --git a/core/test/core-lib.el b/core/test/core-lib.el index 2fff1fd6e..10a9d6ee3 100644 --- a/core/test/core-lib.el +++ b/core/test/core-lib.el @@ -7,8 +7,8 @@ (def-test! resolve-path-forms (should (equal (doom--resolve-path-forms '(and "fileA" "fileB")) - '(and (file-exists-p (expand-file-name "fileA" (doom-project-root))) - (file-exists-p (expand-file-name "fileB" (doom-project-root))))))) + '(and (file-exists-p (expand-file-name "fileA" nil)) + (file-exists-p (expand-file-name "fileB" nil)))))) ;; `doom--resolve-hook-forms' (def-test! resolve-hook-forms diff --git a/core/test/core-projects.el b/core/test/core-projects.el index d580b921e..47435061b 100644 --- a/core/test/core-projects.el +++ b/core/test/core-projects.el @@ -33,15 +33,15 @@ (should (equal (doom-project-expand "init.el") (expand-file-name "init.el" (doom-project-root)))))) -;; `doom-project-has!' +;; `project-file-exists-p!' (def-test! project-has! :minor-mode projectile-mode (let ((default-directory doom-core-dir)) ;; Resolve from project root - (should (doom-project-has! "init.el")) + (should (project-file-exists-p! "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 (project-file-exists-p! (and "init.el" "LICENSE"))) + (should (project-file-exists-p! (or "init.el" "does-not-exist"))) + (should (project-file-exists-p! (and "init.el" (or "LICENSE" "does-not-exist")))) ;; Should resolve relative paths from `default-directory' - (should (doom-project-has! (and "./core.el" "../init.el"))))) + (should (project-file-exists-p! (and "core/core.el" "./init.el"))))) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index d14f7c28e..cf6580425 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -6,7 +6,7 @@ (interactive) (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") + (unless (project-file-exists-p! "compile_commands.json") (user-error "No compile_commands.json file")) ;; first rtag (when (and (featurep 'rtags) diff --git a/modules/lang/java/autoload.el b/modules/lang/java/autoload.el index 3e7a73c78..fa1689503 100644 --- a/modules/lang/java/autoload.el +++ b/modules/lang/java/autoload.el @@ -24,9 +24,9 @@ ;;;###autoload (defun +java|android-mode-maybe () - (when (doom-project-has! (or "local.properties" - "AndroidManifest.xml" - "src/main/AndroidManifest.xml")) + (when (project-file-exists-p! (or "local.properties" + "AndroidManifest.xml" + "src/main/AndroidManifest.xml")) (android-mode +1) (doom/set-build-command "./gradlew %s" "build.gradle"))) From 3dd291a67590eaf1b7b3fd317e9942d6862f570b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 18:38:50 +0200 Subject: [PATCH 1381/4235] core-lib: improve function docstrings --- core/core-lib.el | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index cbb4d16ea..5f46425f7 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,5 +1,6 @@ ;;; core-lib.el -*- lexical-binding: t; -*- +;; Built in packages we use a lot of (require 'subr-x) (require 'cl-lib) (require 'map) @@ -7,6 +8,8 @@ (eval-and-compile (unless EMACS26+ (with-no-warnings + ;; if-let and when-let are deprecated in Emacs 26+ in favor of their + ;; if-let* variants, so we alias them for 25 users. (defalias 'if-let* #'if-let) (defalias 'when-let* #'when-let)))) @@ -59,6 +62,11 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." collect hook else collect (intern (format "%s-hook" (symbol-name hook))))) + +;; +;; Functions +;; + (defun doom-unquote (exp) "Return EXP unquoted." (while (memq (car-safe exp) '(quote function)) @@ -70,7 +78,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (if (listp exp) exp (list exp))) (defun doom-file-cookie-p (file) - "Returns the value of the ;;;###if predicate form in FILE." + "Returns the return value of the ;;;###if predicate form in FILE." (with-temp-buffer (insert-file-contents-literally file nil 0 256) (if (and (re-search-forward "^;;;###if " nil t) @@ -175,7 +183,7 @@ MATCH is a string regexp. Only entries that match it will be included." (defmacro after! (targets &rest body) "A smart wrapper around `with-eval-after-load'. Supresses warnings during -compilation." +compilation. This will no-op on features that have been disabled by the user." (declare (indent defun) (debug t)) (unless (and (symbolp targets) (memq targets doom-disabled-packages)) @@ -254,7 +262,7 @@ HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." 3. A function, list of functions, or body forms to be wrapped in a lambda. Examples: - (add-hook! 'some-mode-hook 'enable-something) + (add-hook! 'some-mode-hook 'enable-something) (same as `add-hook') (add-hook! some-mode '(enable-something and-another)) (add-hook! '(one-mode-hook second-mode-hook) 'enable-something) (add-hook! (one-mode second-mode) 'enable-something) @@ -317,7 +325,19 @@ Body forms can access the hook's arguments through the let-bound variable (nreverse forms)))) (defmacro associate! (mode &rest plist) - "Associate a minor mode to certain patterns and project files." + "Enables a minor mode if certain conditions are met. + +The available conditions are: + + :modes SYMBOL_LIST + A list of major/minor modes in which this minor mode may apply. + :match REGEXP + A regexp to be tested against the current file path. + :files SPEC + Accepts what `project-file-exists-p!' accepts. Checks if certain files exist + relative to the project root. + :when FORM + Whenever FORM returns non-nil." (declare (indent 1)) (unless noninteractive (let ((modes (plist-get plist :modes)) From 8746c12fae3324a700ec0b9571b32f72efc953de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:00:41 +0200 Subject: [PATCH 1382/4235] Redesign Doom bootstrap, caching & autoload generation logic The autoloads file has been split into doom-autoload-file and doom-package-autoload-file. The former is for Doom's modules and standard library; the latter is for compiling all package autoloads like load-path and auto-mode-alist (among other things). This reduced my startup speed from ~1s to ~0.5s --- core/autoload/modules.el | 350 +++++++++++++++++++++++++-------------- core/core-packages.el | 282 ++++++++++++++++++------------- core/core.el | 38 ++--- init.el | 2 - 4 files changed, 413 insertions(+), 259 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 7c23b2e34..ed8f162b1 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -1,149 +1,255 @@ ;;; core/autoload/modules.el -*- lexical-binding: t; -*- -;;;###autoload -(defun doom//reload () - "Reload your private Doom config. Experimental!" - (interactive) - (when (file-exists-p doom-packages-file) - (delete-file doom-packages-file)) - (cond ((and noninteractive (not (daemonp))) - (doom-initialize) - (doom//reload-autoloads) - (require 'server) - (when (server-running-p) - (message "Reloading active Emacs session...") - (server-eval-at server-name '(doom//reload)))) +(autoload 'print! "autoload/message" nil 'macro) +(autoload 'printerr! "autoload/message" nil 'macro) - ((let ((load-prefer-newer t) - doom-init-p) - (setq doom-modules (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0)) - (doom-initialize t) - (message "%d packages reloaded" (length package-alist)) - (run-hooks 'doom-reload-hook))))) +(defun doom--server-eval (body) + (require 'server) + (when (server-running-p) + (server-eval-at server-name body))) + +;;;###autoload +(defun doom//reload (&optional force-p) + "Reloads your config. This is experimental! + +If called from a noninteractive session, this will try to communicate with a +live server (if one is found) to tell it to run this function. + +If called from an interactive session, tries to reload autoloads files (if +necessary), reinistalize doom (via `doom-initialize') and reloads your private +init.el and config.el. Then runs `doom-reload-hook'." + (interactive) + (unless doom--inhibit-reload + (cond ((and noninteractive (not (daemonp))) + (require 'server) + (if (not (server-running-p)) + (doom//reload-autoloads force-p) + (print! "Reloading active Emacs session...") + (print! + (bold "%%s") + (if (server-eval-at server-name '(doom//reload)) + (green "Done!") + (red "There were issues!"))))) + ((let ((load-prefer-newer t)) + (doom//reload-autoloads force-p) + (doom-initialize t) + (doom-initialize-modules t) + (print! (green "%d packages reloaded" (length package-alist))) + (run-hooks 'doom-reload-hook)))))) + + +;; +;; Autoload file generation +;; + +(defvar doom-autoload-excluded-packages '(marshal gh) + "Packages that have silly or destructive autoload files that try to load +everyone in the universe and their dog, causing errors that make babies cry. No +one wants that.") + +(defun doom--byte-compile (file) + (let ((short-name (file-name-nondirectory file))) + (condition-case-unless-debug ex + (when (byte-compile-file file) + (load (byte-compile-dest-file file) nil t) + (unless noninteractive + (message "Finished compiling %s" short-name))) + ('error + (doom-delete-autoloads-file file) + (error "Error in %s: %s -- %s" + short-name + (car ex) (error-message-string ex)))))) + +;;;###autoload +(defun doom-delete-autoloads-file (file) + "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if +it exists." + (or (stringp file) + (signal 'wrong-type-argument (list 'stringp file))) + (when (file-exists-p file) + (delete-file file) + (ignore-errors (delete-file (byte-compile-dest-file file))) + (print! "Deleted old %s" (file-name-nondirectory file)))) + +;;;###autoload +(defun doom//reload-autoloads (&optional file force-p) + "Reloads FILE (an autoload file), if it needs reloading. + +FILE should be one of `doom-autoload-file' or `doom-package-autoload-file'. If +it is nil, it will try to reload both. If FORCE-P (universal argument) do it +even if it doesn't need reloading!" + (interactive + (list nil current-prefix-arg)) + (or (null file) + (stringp file) + (signal 'wrong-type-argument (list 'stringp file))) + (cond ((equal file doom-autoload-file) + (doom//reload-doom-autoloads force-p)) + ((equal file doom-package-autoload-file) + (doom//reload-package-autoloads force-p)) + ((progn + (doom//reload-doom-autoloads force-p) + (doom//reload-package-autoloads force-p))))) (defvar generated-autoload-load-name) ;;;###autoload -(defun doom//reload-autoloads (&optional force) - "Refreshes the autoloads.el file, specified by `doom-autoload-file'. +(defun doom//reload-doom-autoloads (&optional force-p) + "Refreshes the autoloads.el file, specified by `doom-autoload-file', if +necessary (or if FORCE-P is non-nil). It scans and reads core/autoload/*.el, modules/*/*/autoload.el and -modules/*/*/autoload/*.el, and generates an autoloads file at the path specified -by `doom-autoload-file'. This file tells Emacs where to find lazy-loaded -functions. +modules/*/*/autoload/*.el, and generates `doom-autoload-file'. This file tells +Emacs where to find lazy-loaded functions. -This should be run whenever init.el or an autoload file is modified. Running -'make autoloads' from the commandline executes this command." +This should be run whenever your `doom!' block, or a module autoload file, is +modified." (interactive) - ;; This function must not use autoloaded functions or external dependencies. - ;; It must assume nothing is set up! - (let ((default-directory doom-emacs-dir) + (let ((doom-modules (doom-module-table)) + (default-directory doom-emacs-dir) (targets (file-expand-wildcards - (expand-file-name "autoload/*.el" doom-core-dir))) - (generate-autoload-section-continuation "") - (generate-autoload-section-header "") - (generate-autoload-section-trailer "") - (doom--stage 'autoloads) - outdated) + (expand-file-name "autoload/*.el" doom-core-dir)))) (dolist (path (doom-module-load-path)) (let ((auto-dir (expand-file-name "autoload" path)) (auto-file (expand-file-name "autoload.el" path))) (when (file-exists-p auto-file) (push auto-file targets)) (when (file-directory-p auto-dir) - (dolist (file (doom-files-under auto-dir :match "\\.el$")) + (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) (push file targets))))) - (when (file-exists-p doom-autoload-file) - (delete-file doom-autoload-file) - (ignore-errors (delete-file (byte-compile-dest-file doom-autoload-file))) - (message "Deleted old autoloads.el")) - (message "Generating new autoloads.el") - (dolist (file (mapcar #'file-truename (reverse targets))) - (let ((generated-autoload-load-name (file-name-sans-extension file))) - (message - (cond ((not (doom-file-cookie-p file)) - "⚠ Ignoring %s") - ((update-file-autoloads file nil doom-autoload-file) - "✕ Nothing in %s") - ("✓ Scanned %s")) - (if (file-in-directory-p file default-directory) - (file-relative-name file) - (abbreviate-file-name file))))) - (make-directory (file-name-directory doom-autoload-file) t) - (let ((buf (find-file-noselect doom-autoload-file t)) - (load-path (append doom-psuedo-module-dirs - doom-modules-dirs - load-path)) - case-fold-search) - ;; FIXME Make me faster - (unwind-protect - (with-current-buffer buf - (goto-char (point-min)) - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-autoloads', DO NOT EDIT !!\n\n") + (if (and (not force-p) + (file-exists-p doom-autoload-file) + (not (cl-loop for file in targets + if (file-newer-than-file-p file doom-autoload-file) + return t))) + (ignore (print! (green "Doom core autoloads is up-to-date")) + (doom-initialize-autoloads doom-autoload-file)) + (doom-delete-autoloads-file doom-autoload-file) + ;; in case the buffer is open somewhere and modified + (when-let* ((buf (find-buffer-visiting doom-autoload-file))) + (with-current-buffer buf + (set-buffer-modified-p nil)) + (kill-buffer buf)) + (message "Generating new autoloads.el") + (dolist (file (nreverse targets)) + (let* ((file (file-truename file)) + (generated-autoload-load-name (file-name-sans-extension file)) + (noninteractive (not doom-debug-mode))) + (print! + (cond ((not (doom-file-cookie-p file)) + "⚠ Ignoring %s") + ((update-file-autoloads file nil doom-autoload-file) + (yellow "✕ Nothing in %%s")) + ((green "✓ Scanned %%s"))) + (if (file-in-directory-p file default-directory) + (file-relative-name file) + (abbreviate-file-name file))))) + (make-directory (file-name-directory doom-autoload-file) t) + (let ((buf (find-file-noselect doom-autoload-file t)) + case-fold-search) + (unwind-protect + (with-current-buffer buf + (goto-char (point-min)) + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-doom-autoloads', DO NOT EDIT !!\n\n") + (save-excursion + ;; Replace autoload paths (only for module autoloads) with + ;; absolute paths for faster resolution during load and + ;; simpler `load-path' + (let ((load-path (append doom-psuedo-module-dirs + doom-modules-dirs + load-path)) + cache) + (save-excursion + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + (replace-match + (or (cdr (assoc path cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path (abbreviate-file-name libpath)) cache) + libpath) + path) + t t nil 1))) + (print! (green "✓ Autoload paths expanded"))))) + ;; Remove byte-compile inhibiting file variables so we can + ;; byte-compile the file. + (when (re-search-forward "^;; no-byte-compile: t\n" nil t) + (replace-match "" t t)) + ;; Byte compile it to give the file a chance to reveal errors. + (save-buffer) + (doom--byte-compile doom-autoload-file) + (when (and noninteractive (not (daemonp))) + (doom--server-eval `(load-file ,doom-autoload-file))) + t) + (kill-buffer buf)))))) - ;; Replace autoload paths (only for module autoloads) with - ;; absolute paths for faster resolution during load and simpler - ;; `load-path' - (save-excursion - (let (cache) - (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) - (let ((path (match-string 1))) - (replace-match - (or (cdr (assoc path cache)) - (when-let* ((libpath (locate-library path)) - (libpath (file-name-sans-extension libpath))) - (push (cons path (abbreviate-file-name libpath)) cache) - libpath) - (progn - (warn "Couldn't find absolute path for: %s" path) - path)) - t t nil 1)))) - (message "✓ Autoload paths expanded")) +;;;###autoload +(defun doom//reload-package-autoloads (&optional force-p) + "Compiles `doom-package-autoload-file' from the autoloads files of all +installed packages. It also caches `load-path', `Info-directory-list', +`doom-disabled-packages', `package-activated-list' and `auto-mode-alist'. - ;; insert package autoloads - (save-excursion - (dolist (spec package-alist) - (let ((pkg (car spec))) - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file - (abbreviate-file-name - (concat (package--autoloads-file-name (cadr spec)) ".el")))) - (insert "(let ((load-file-name " (prin1-to-string file) "))\n") - (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) - (unless (nth 8 (syntax-ppss)) - (replace-match "" t t))) - (unless (bolp) (insert "\n")) - (insert ")\n"))))) - (message "✓ Package autoloads included")) +Will do nothing if none of your installed packages have been modified. If +FORCE-P (universal argument) is non-nil, regenerate it anyway. - ;; Remove `load-path' and `auto-mode-alist' modifications (most - ;; of them, at least); they are cached elsewhere, so these are - ;; unnecessary overhead. - (while (re-search-forward (concat "^\\s-*(\\(add-to-list\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)") - nil t) - (beginning-of-line) - (skip-chars-forward " \t") - (kill-sexp)) - (message "✓ load-path/auto-mode-alist entries removed") +This should be run whenever your `doom!' block or update your packages." + (interactive) + (if (and (not force-p) + (file-exists-p doom-package-autoload-file) + (not (cl-loop initially do (doom-ensure-packages-initialized t) + for (_pkg desc) in package-alist + for autoload-file = (concat (package--autoloads-file-name desc) ".el") + if (file-newer-than-file-p autoload-file doom-package-autoload-file) + return t))) + (ignore (print! (green "Doom package autoloads is up-to-date")) + (doom-initialize-autoloads doom-package-autoload-file)) + (doom-delete-autoloads-file doom-package-autoload-file) + (with-temp-file doom-package-autoload-file + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") + ;; insert package autoloads + (save-excursion + (dolist (spec package-alist) + (cl-destructuring-bind (pkg desc) spec + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file + (abbreviate-file-name + (concat (package--autoloads-file-name desc) ".el")))) + (when (file-exists-p file) + (insert "(let ((load-file-name " (prin1-to-string file) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n")))))) + (print! (green "✓ Package autoloads included")) + ;; Cache the important and expensive-to-initialize state here. + (doom-initialize-packages 'internal) + (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer)) + (print! (green "✓ Cached package state"))) + ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, + ;; at least); they are cached later, so all those membership checks are + ;; unnecessary overhead. + (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|when (boundp \\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) + (goto-char (match-beginning 1)) + (kill-sexp)) + (print! (green "✓ Removed load-path/auto-mode-alist entries"))) + (doom--byte-compile doom-package-autoload-file) + (when (and noninteractive (not (daemonp))) + (doom--server-eval `(load-file ,doom-package-autoload-file))) + t)) - ;; Remove byte-compile inhibiting file variables so we can - ;; byte-compile the file. - (when (re-search-forward "^;; no-byte-compile: t\n$" nil t) - (replace-match "" t t)) - (save-buffer) - ;; Byte compile it to give the file a chance to reveal errors. - (condition-case-unless-debug ex - (quiet! (byte-compile-file doom-autoload-file 'load)) - ('error - (delete-file doom-autoload-file) - (message "Deleting autoloads file!") - (error "Error in autoloads.el: %s -- %s" - (car ex) (error-message-string ex)))) - (message "Done!")) - (kill-buffer buf))))) +;; +;; Byte compilation +;; ;;;###autoload (defun doom//byte-compile (&optional modules recompile-p) diff --git a/core/core-packages.el b/core/core-packages.el index ece2af661..08b4f89e4 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -40,53 +40,47 @@ ;; See core/autoload/packages.el for more functions. (defvar doom-init-p nil - "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.") + "Non-nil if `doom-initialize' has run.") + +(defvar doom-init-modules-p nil + "Non-nil if `doom-initialize-modules' has run.") (defvar doom-init-time nil "The time it took, in seconds, for DOOM Emacs to initialize.") -(defvar doom-modules - (make-hash-table :test #'equal :size 100 :rehash-threshold 1.0) +(defvar doom-modules () "A hash table of enabled modules. Set by `doom-initialize-modules'.") (defvar doom-modules-dirs (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) "A list of module root directories. Order determines priority.") -(defvar doom-psuedo-module-dirs - (list doom-private-dir) +(defvar doom-psuedo-module-dirs (list doom-private-dir) "Additional paths for modules that are outside of `doom-modules-dirs'. -`doom//reload-autoloads', `doom//byte-compile' and `doom-initialize-packages' -will include the directories in this list.") +`doom//reload-doom-autoloads', `doom//byte-compile' and +`doom-initialize-packages' will include the directories in this list.") (defvar doom-packages () "A list of enabled packages. Each element is a sublist, whose CAR is the package's name as a symbol, and whose CDR is the plist supplied to its `package!' declaration. Set by `doom-initialize-packages'.") -(defvar doom-core-packages - '(persistent-soft use-package quelpa async) +(defvar doom-core-packages '(persistent-soft use-package quelpa async) "A list of packages that must be installed (and will be auto-installed if missing) and shouldn't be deleted.") (defvar doom-disabled-packages () "A list of packages that should be ignored by `def-package!'.") -(defvar doom-autoload-excluded-packages '(marshal gh) - "Packages that have silly or destructive autoload files that try to load -everyone in the universe and their dog, causing errors that make babies cry. No -one wants that.") - (defvar doom-site-load-path load-path "The starting load-path, before it is altered by `doom-initialize'.") (defvar doom-autoload-file (concat doom-local-dir "autoloads.el") - "Where `doom//reload-autoloads' will generate its autoloads file.") + "Where `doom//reload-doom-autoloads' will generate its core autoloads file.") -(defvar doom-packages-file (concat doom-cache-dir "packages.el") - "Where to cache `load-path', `Info-directory-list', `doom-disabled-packages' -and `auto-mode-alist'.") +(defvar doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el") + "Where `doom//reload-package-autoloads' will generate its package.el autoloads +file.") (defvar doom-reload-hook nil "A list of hooks to run when `doom//reload-load-path' is called.") @@ -150,22 +144,6 @@ and `auto-mode-alist'.") (file-relative-name load-file-name doom-emacs-dir) (abbreviate-file-name load-file-name)))) -(defun doom|refresh-cache () - "Refresh `doom-packages-file', which caches `load-path', -`Info-directory-list', `doom-disabled-packages', `auto-mode-alist' and -`package-activated-list'." - (doom-initialize-packages 'internal) - (let ((coding-system-for-write 'emacs-internal)) - (with-temp-file doom-packages-file - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file was autogenerated by `doom|refresh-cache', DO NOT EDIT!\n") - (prin1 `(setq load-path ',load-path - auto-mode-alist ',auto-mode-alist - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages - package-activated-list ',package-activated-list) - (current-buffer))))) - (defun doom|display-benchmark (&optional return-p) "Display a benchmark, showing number of packages and modules, and how quickly they were loaded at startup. @@ -195,17 +173,59 @@ session, with a different init.el, like so: 'window-setup-hook)) +;; +;; Bootstrap helpers +;; + +(defun doom-ensure-packages-initialized (&optional force-p) + "Make sure package.el is initialized." + (when (or force-p (not package--initialized)) + (require 'package) + (setq package-activated-list nil + package--initialized nil) + (let (byte-compile-warnings) + (condition-case _ + (quiet! (package-initialize)) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize)))))) + +(defun doom-ensure-core-packages () + "Make sure `doom-core-packages' are installed." + (when-let* ((core-packages (cl-remove-if #'package-installed-p doom-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"))) + +(defun doom-ensure-core-directories () + "Make sure all Doom's essential local directories (in and including +`doom-local-dir') 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)))) + + ;; ;; Bootstrap API ;; +(autoload 'doom//reload-doom-autoloads "autoload/modules" nil t) +(autoload 'doom//reload-package-autoloads "autoload/modules" nil t) + (defun doom-initialize (&optional force-p) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). -The bootstrap process involves making sure the essential directories exist, core -packages are installed, `doom-autoload-file' is loaded, `doom-packages-file' -cache exists (and is loaded) and, finally, loads your private init.el (which -should contain your `doom!' block). +The bootstrap process involves making sure 1) the essential directories exist, +2) the core packages are installed, 3) `doom-autoload-file' and +`doom-package-autoload-file' exist and have been loaded, and 4) Doom's core +files are loaded. If the cache exists, much of this function isn't run, which substantially reduces startup time. @@ -228,71 +248,54 @@ Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." (when (or force-p (not doom-init-p)) - (when (and (or force-p noninteractive) - (file-exists-p doom-packages-file)) - (message "Deleting packages.el cache") - (delete-file doom-packages-file)) - (unless (load doom-packages-file 'noerror 'nomessage 'nosuffix) - ;; 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 plugins have been initialized - (require 'package) - (setq package-activated-list nil - package--initialized nil) - (let (byte-compile-warnings) - (condition-case _ - (package-initialize) - ('error (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize)))) - ;; Ensure core packages are installed - (when-let* ((core-packages (cl-remove-if #'package-installed-p doom-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")) - (unless noninteractive - (add-hook 'doom-pre-init-hook #'doom|refresh-cache))) - ;; Load autoloads file - (doom-initialize-autoloads)) + ;; Set this to prevent infinite recursive calls to `doom-initialize' + (setq doom-init-p t) + ;; `doom-autoload-file' tells Emacs where to load all its autoloaded + ;; functions from. This includes everything in core/autoload/*.el and all + ;; the autoload files in your enabled modules. + (unless (doom-initialize-autoloads doom-autoload-file force-p) + (doom-ensure-core-directories) + (doom-ensure-packages-initialized force-p) + (doom-ensure-core-packages) + ;; Regenerate `doom-autoload-file', which tells Doom where to find all its + ;; module autoloaded functions. + (unless (or force-p noninteractive) + (doom//reload-doom-autoloads))) + ;; Loads `doom-package-autoload-file', which caches `load-path', + ;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and + ;; `package-activated-list'. A big reduction in startup time. + (unless (doom-initialize-autoloads doom-package-autoload-file force-p) + (unless (or force-p noninteractive) + (doom//reload-package-autoloads)))) ;; Initialize Doom core (unless noninteractive (require 'core-ui) (require 'core-editor) (require 'core-projects) - (require 'core-keybinds)) - ;; Bootstrap Doom - (unless doom-init-p + (require 'core-keybinds))) + +(defun doom-initialize-modules (&optional force-p) + "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy +session of Dooming. Will noop if used more than once, unless FORCE-P is +non-nil." + (when (or force-p (not doom-init-modules-p)) + ;; Set `doom-init-modules-p' early, so `doom-pre-init-hook' won't infinitely + ;; recurse by accident if any of them need `doom-initialize-modules'. + (setq doom-init-modules-p t) (unless noninteractive - (add-hook! 'doom-reload-hook - #'(doom|refresh-cache doom|display-benchmark)) (add-hook! 'emacs-startup-hook #'(doom|post-init doom|display-benchmark))) (run-hooks 'doom-pre-init-hook) (when doom-private-dir - (load (concat doom-private-dir "init") t t))) - (setq doom-init-p t)) + (let ((load-prefer-newer t)) + (load (expand-file-name "init" doom-private-dir) + 'noerror 'nomessage))))) -(defun doom-initialize-autoloads () - "Tries to load `doom-autoload-file', otherwise throws an error (unless in a -noninteractive session)." - (unless - (condition-case-unless-debug e - (load (substring doom-autoload-file 0 -3) 'noerror 'nomessage) - (error - (funcall (if noninteractive #'warn #'error) - "Autoload error: %s -> %s" - (car e) (error-message-string e)))) - (unless noninteractive - (error "No autoloads file! Run make autoloads")))) +(defun doom-initialize-autoloads (file &optional clear-p) + "Tries to load FILE (an autoloads file). Otherwise tries to regenerate it. If +CLEAR-P is non-nil, regenerate it anyway." + (unless clear-p + (load (file-name-sans-extension file) 'noerror 'nomessage))) (defun doom-initialize-packages (&optional force-p) "Ensures that Doom's package management system, package.el and quelpa are @@ -306,8 +309,8 @@ Use this before any of package.el, quelpa or Doom's package management's API to ensure all the necessary package metadata is initialized and available for them." (with-temp-buffer ; prevent buffer-local settings from propagating - ;; Prefer uncompiled files to reduce stale code issues - (let ((load-prefer-newer t)) + (let ((load-prefer-newer t) ; reduce stale code issues + (doom-modules (doom-module-table))) ;; package.el and quelpa handle themselves if their state changes during ;; the current session, but if you change an packages.el file in a module, ;; there's no non-trivial way to detect that, so we give you a way to @@ -454,6 +457,37 @@ added, if the file exists." collect (plist-get plist :path)) (cl-remove-if-not #'file-directory-p doom-psuedo-module-dirs))) +(defun doom-module-table (&optional modules) + "Converts MODULES (a malformed plist) into a hash table of modules, fit for +`doom-modules'. If MODULES is omitted, it will fetch your module mplist from the +`doom!' block in your private init.el file." + (let* ((doom-modules (make-hash-table :test #'equal + :size (if modules (length modules) 100) + :rehash-threshold 1.0))) + (when (null modules) + (let ((init-file (expand-file-name "init.el" doom-private-dir))) + (if (not (file-exists-p init-file)) + (error "%s doesn't exist" (abbreviate-file-name init-file)) + (with-temp-buffer + (insert-file-contents init-file) + (when (re-search-forward "^\\s-*\\((doom! \\)" nil t) + (goto-char (match-beginning 1)) + (setq modules (cdr (sexp-at-point)))))) + (unless modules + (error "Couldn't gather module list from %s" init-file)))) + (if (eq modules t) (setq modules nil)) + (let (category) + (dolist (m modules) + (cond ((keywordp m) (setq category m)) + ((not category) (error "No module category specified for %s" m)) + ((let ((module (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) + (if-let* ((path (doom-module-locate-path category module))) + (doom-module-set category module :flags flags :path path) + (when doom-debug-mode + (message "Couldn't find the %s %s module" category module)))))))) + doom-modules)) + ;; ;; Use-package modifications @@ -506,25 +540,40 @@ added, if the file exists." (defmacro doom! (&rest modules) "Bootstraps DOOM Emacs and its modules. -MODULES is an malformed plist of modules to load." - (let (init-forms config-forms file-name-handler-alist) - (let (module) - (dolist (m modules) - (cond ((keywordp m) (setq module m)) - ((not module) (error "No namespace specified in `doom!' for %s" m)) - ((let ((submodule (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (let ((path (doom-module-locate-path module submodule))) - (if (not path) - (when doom-debug-mode - (message "Couldn't find the %s %s module" module submodule)) - (doom-module-set module submodule :flags flags :path path) - (push `(let ((doom--current-module ',(cons module submodule))) - (load! init ,path t)) - init-forms) - (push `(let ((doom--current-module ',(cons module submodule))) - (load! config ,path t)) - config-forms)))))))) +The bootstrap process involves making sure the essential directories exist, core +packages are installed, `doom-autoload-file' is loaded, `doom-packages-file' +cache exists (and is loaded) and, finally, loads your private init.el (which +should contain your `doom!' block). + +If the cache exists, much of this function isn't run, which substantially +reduces startup time. + +The overall load order of Doom is as follows: + + ~/.emacs.d/init.el + ~/.emacs.d/core/core.el + `doom-pre-init-hook' + ~/.doom.d/init.el + Module init.el files + `doom-init-hook' + Module config.el files + ~/.doom.d/config.el + `after-init-hook' + `emacs-startup-hook' + `doom-post-init-hook' (at end of `emacs-startup-hook') + +Module load order is determined by your `doom!' block. See `doom-modules-dirs' +for a list of all recognized module trees. Order defines precedence (from most +to least)." + (let ((doom-modules (doom-module-table (or modules t))) + init-forms config-forms file-name-handler-alist) + (maphash (lambda (key value) + (let ((path (plist-get value :path))) + (push `(let ((doom--current-module ',key)) (load! init ,path t)) + init-forms) + (push `(let ((doom--current-module ',key)) (load! config ,path t)) + config-forms))) + doom-modules) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) @@ -533,8 +582,9 @@ MODULES is an malformed plist of modules to load." (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir - (load ,(concat doom-private-dir "config") - t (not doom-debug-mode)))))))) + (let ((load-prefer-newer t)) + (load ,(expand-file-name "config" doom-private-dir) + t (not doom-debug-mode))))))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." diff --git a/core/core.el b/core/core.el index 3a504f5f9..bfe831b34 100644 --- a/core/core.el +++ b/core/core.el @@ -58,6 +58,20 @@ Use this for files that change often, like cache files.") "Where your private customizations are placed. Must end in a slash. Respects XDG directory conventions if ~/.config/doom exists.") +;; Doom hooks +(defvar doom-pre-init-hook nil + "Hooks run after Doom is first initialized; after Doom's core files are +loaded, but before your private init.el file or anything else is loaded.") + +(defvar doom-init-hook nil + "Hooks run after all init.el files are loaded, including your private and all +module init.el files, but before their config.el files are loaded.") + +(defvar doom-post-init-hook nil + "A list of hooks run when Doom is fully initialized. Fires at the end of +`emacs-startup-hook', as late as possible. Guaranteed to run after everything +else (except for `window-setup-hook').") + ;;; ;; UTF-8 as the default coding system @@ -106,22 +120,6 @@ XDG directory conventions if ~/.config/doom exists.") url-configuration-directory (concat doom-etc-dir "url/")) -;; Custom init hooks; clearer than `after-init-hook', `emacs-startup-hook', and -;; `window-setup-hook'. -(defvar doom-pre-init-hook nil - "Hooks run after Doom is first initialized; after Doom's core files are -loaded, but before your private init.el file or anything else is loaded.") - -(defvar doom-init-hook nil - "Hooks run after all init.el files are loaded, including your private and all -module init.el files, but before their config.el files are loaded.") - -(defvar doom-post-init-hook nil - "A list of hooks run when Doom is fully initialized. Fires at the end of -`emacs-startup-hook', as late as possible. Guaranteed to run after everything -else (except for `window-setup-hook').") - - ;; ;; Emacs fixes/hacks ;; @@ -163,7 +161,7 @@ with functions that require it (like modeline segments)." (advice-add #'make-indirect-buffer :around #'doom*set-indirect-buffer-filename) ;; Truly silence startup message -(advice-add #'display-startup-echo-area-message :override #'ignore) +(fset #'display-startup-echo-area-message #'ignore) ;; @@ -202,8 +200,10 @@ this, you'll get stuttering and random freezes) and resets (require 'core-packages) (require 'core-os) -(unless noninteractive - (doom-initialize)) +(doom-initialize noninteractive) +(if noninteractive + (require 'core-dispatcher) + (doom-initialize-modules)) (provide 'core) ;;; core.el ends here diff --git a/init.el b/init.el index 497941f17..eda0e8894 100644 --- a/init.el +++ b/init.el @@ -31,5 +31,3 @@ load-prefer-newer noninteractive) (require 'core (concat user-emacs-directory "core/core")) -(when noninteractive - (require 'core-dispatcher)) From 3261f1fd710a09abd0f4f61ae76c9b84f02e3e3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:03:36 +0200 Subject: [PATCH 1383/4235] Finalize core-dispatcher API + Add doom-auto-accept to replace YES envvar. + Add docstrings & documentation to all commands. + Make dispatcher support more than one alias. + Document quickstart command + Update autoloads/install/autoremove/update/refresh to fit new initialization workflows + Rename doom//info and doom//version + Recompile alias is now rc instead of cc + Improve reliability of doom//quickstart --- core/core-dispatcher.el | 163 +++++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 69 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 70a71e5e4..861e58958 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -1,5 +1,8 @@ ;;; -*- lexical-binding: t; no-byte-compile: t; -*- +;; Eagerly load these libraries because this module may be loaded in a session +;; that hasn't been fully initialized (where autoloads files haven't been +;; generated or `load-path' populated). (load! autoload/packages) (load! autoload/modules) (load! autoload/debug) @@ -7,14 +10,16 @@ ;; -;; Dispatcher +;; Dispatcher API ;; -(defvar doom-dispatch-command-alist () - "TODO") +(defvar doom-auto-accept (getenv "YES") + "If non-nil, Doom will auto-accept any confirmation prompts during batch +commands like `doom//packages-install', `doom//packages-update' and +`doom//packages-autoremove'.") -(defvar doom-dispatch-alias-alist () - "TODO") +(defconst doom--dispatch-command-alist ()) +(defconst doom--dispatch-alias-alist ()) (defun doom--dispatch-format (desc &optional short) (if (equal desc "TODO") @@ -33,26 +38,29 @@ (line-end-position)))))) (defun doom--dispatch-help (&optional command desc &rest args) - "TODO" + "Display help documentation for a dispatcher command. If COMMAND and DESC are +omitted, show all available commands, their aliases and brief descriptions." (if command (princ (doom--dispatch-format desc)) (print! (bold "%-10s\t%s\t%s" "Command:" "Alias" "Description")) - (dolist (spec (sort doom-dispatch-command-alist + (dolist (spec (sort doom--dispatch-command-alist (lambda (x y) (string-lessp (car x) (car y))))) (cl-destructuring-bind (command &key desc _body) spec - (let ((alias (car (rassq command doom-dispatch-alias-alist)))) + (let ((aliases (cl-loop for (alias . cmd) in doom--dispatch-alias-alist + if (eq cmd command) + collect (symbol-name alias)))) (print! " %-10s\t%s\t%s" - command (or alias "") + command (if aliases (string-join aliases ",") "") (doom--dispatch-format desc t))))))) (defun doom-dispatch (args) - "TODO" + "Invoke a dispatcher command and pass ARGS to it." (let ((help (equal (car args) "help"))) (if help (pop args)) (cl-destructuring-bind (command &key desc body) (let ((sym (intern (car args)))) - (or (assq sym doom-dispatch-command-alist) - (assq (cdr (assq sym doom-dispatch-alias-alist)) doom-dispatch-command-alist) + (or (assq sym doom--dispatch-command-alist) + (assq (cdr (assq sym doom--dispatch-alias-alist)) doom--dispatch-command-alist) (error "Invalid command: %s" (car args)))) (if help (apply #'doom--dispatch-help command desc (cdr args)) @@ -60,18 +68,31 @@ ;; FIXME Clumsy way of registering commands, refactor! (defmacro def-dispatcher! (command desc &rest body) - "TODO" + "Define a dispatcher command. COMMAND is a symbol or a list of symbols +representing the aliases for this command. DESC is a string description. The +first line should be short (under 60 letters), as it will be displayed for +bin/doom help. + +BODY will be run when this dispatcher is called." (declare (doc-string 2)) (let* ((command (doom-enlist command)) (cmd (car command)) - (alias (car (cdr command)))) + (aliases (cdr command))) `(progn - ,(when alias - `(map-put doom-dispatch-alias-alist ',alias ',cmd)) - (map-put doom-dispatch-command-alist - ',cmd (list :desc ,desc :body (lambda (args) ,@body)))))) + ,(when aliases + `(dolist (alias ',aliases) + (map-put doom--dispatch-alias-alist alias ',cmd))) + (map-put doom--dispatch-command-alist + ',cmd (list :desc ,desc + ;; FIXME Implicit args var; ew + :body (lambda (args) ,@body)))))) + ;; +;; Dispatch commands +;; + +;; Dummy dispatchers (no-op because they're handled especially) (def-dispatcher! run "Run Doom Emacs from bin/doom's parent directory. @@ -80,8 +101,9 @@ All arguments are passed on to Emacs (except for -p and -e). doom run doom run -nw init.el -Warning, this is for convenience and testing purposes, Doom will not run its -best or fastest when started in this manner.") +WARNING: this command exists for convenience and testing. Doom will suffer +additional overhead for be started this way. For the best performance, it +is best to run Doom out of ~/.emacs.d and ~/.doom.d.") (def-dispatcher! (doctor doc) "Checks for issues with your current Doom config.") @@ -89,36 +111,43 @@ best or fastest when started in this manner.") (def-dispatcher! (help h) "Look up additional information about a command.") -;; -(def-dispatcher! quickstart - "TODO" - (doom//quickstart)) +;; Real dispatchers +(def-dispatcher! (quickstart qs) + "Quickly deploy a private module and Doom. + +This deploys a barebones config to ~/.doom.d. The destination can be changed +with the -p option, e.g. + + doom -p ~/.config/doom quickstart + +This command will refuse to overwrite the private directory if it already +exists." + (doom//quickstart args)) (def-dispatcher! (install i) "Installs requested plugins that aren't installed." - (doom-initialize) - (when (doom//packages-install) - (doom//reload-autoloads))) + (doom//reload-doom-autoloads) + (when (doom//packages-install doom-auto-accept) + (doom//reload))) (def-dispatcher! (update u) "Checks for and updates outdated plugins." - (doom-initialize) - (when (doom//packages-update) - (doom//reload-autoloads))) + (doom//reload-doom-autoloads) + (when (doom//packages-update doom-auto-accept) + (doom//reload))) (def-dispatcher! (autoremove r) "Removes orphaned plugins." - (doom-initialize) - (when (doom//packages-autoremove) - (doom//reload-autoloads))) + (doom//reload-doom-autoloads) + (when (doom//packages-autoremove doom-auto-accept) + (doom//reload))) (def-dispatcher! (autoloads a) "Regenerates Doom's autoloads file. This file tells Emacs where to find your module's autoloaded functions and plugins." - (doom-initialize) - (doom//reload-autoloads)) + (doom//reload-autoloads nil 'force)) (def-dispatcher! (upgrade up) "Checks out the latest Doom on this branch." @@ -136,7 +165,7 @@ to byte-compile Doom's core files, your private config or your ELPA plugins, respectively." (doom//byte-compile args)) -(def-dispatcher! (recompile cc) +(def-dispatcher! (recompile rc) "Re-byte-compiles outdated *.elc files." (doom//byte-compile args 'recompile)) @@ -151,14 +180,14 @@ respectively." (def-dispatcher! info "Output system info in markdown for bug reports." - (doom//info)) + (doom/info)) (def-dispatcher! (version v) "Reports the version of Doom and Emacs." - (doom//version)) + (doom/version)) (def-dispatcher! (refresh re) - "Refresh Doom. + "Refresh Doom. Same as autoremove+install+autoloads. This is the equivalent of running autoremove, install, autoloads, then recompile. Run this whenever you: @@ -167,26 +196,25 @@ recompile. Run this whenever you: 2. Add or remove `package!' blocks to your config, 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)" - (doom-initialize) - (let (reload-p) - (when (let* ((doom--inhibit-reload t) - (autoremove-p (doom//packages-autoremove)) - (install-p (doom//packages-install))) - (or autoremove-p install-p)) - (doom//reload)) - (doom//byte-compile nil 'recompile))) + (if (let* ((doom--inhibit-reload t) + (autoremove-p (with-demoted-errors "%s" (doom//packages-autoremove))) + (install-p (with-demoted-errors "%s" (doom//packages-install)))) + (or autoremove-p install-p)) + (doom//reload) + (doom//reload-autoloads)) + (doom//byte-compile nil 'recompile)) ;; ;; Quality of Life Commands ;; +;; FIXME Detect & enforce remote (defvar doom-remote "origin" "TODO") (defun doom//upgrade () - "TODO" - (declare (interactive-only t)) + "Upgrade Doom to the latest version." (interactive) (let ((core-file (expand-file-name "init.el" doom-core-dir)) (branch (vc-git--symbolic-ref core-file)) @@ -210,8 +238,7 @@ recompile. Run this whenever you: (abbreviate-file-name doom-emacs-dir))) (if (equal current-rev rev) (message "Doom is up to date!") - - (when (or (getenv "YES") + (when (or doom-auto-accept (y-or-n-p "Doom is out of date, update?")) (unless (zerop (process-file "git" nil buf nil "checkout" (format "%s/%s" doom-remote branch))) @@ -223,33 +250,31 @@ recompile. Run this whenever you: (message "Done! Please restart Emacs for changes to take effect"))))))))) (defun doom//quickstart () - "TODO" + "Quickly deploy a private module and Doom. + +This deploys a barebones config to `doom-private-dir', installs all missing +packages and regenerates the autoloads file." (declare (interactive-only t)) (interactive) (let ((short-private-dir (abbreviate-file-name doom-private-dir))) - (when (file-directory-p doom-private-dir) - (error "%s already exists! Aborting." short-private-dir)) - (message "Creating %s directory" short-private-dir) - (make-directory doom-private-dir) + (unless (file-directory-p doom-private-dir) + (print! "Creating %s" short-private-dir) + (make-directory doom-private-dir t)) (let ((init-file (expand-file-name "init.el" doom-private-dir))) - (if (not (file-exists-p init-file)) - (message "%sinit.el already exists. Skipping.") - (message "Copying init.example.el to %s" short-private-dir) + (if (file-exists-p init-file) + (print! "%sinit.el already exists. Skipping." short-private-dir) + (print! "Copying init.example.el to %s" short-private-dir) (copy-file (expand-file-name "init.example.el" doom-emacs-dir) init-file))) (let ((config-file (expand-file-name "config.el" doom-private-dir))) (if (file-exists-p config-file) - (with-temp-file config-file - (insert "")) - (message "%sconfig.el already exists. Skipping.")))) - (doom-initialize) - (let* ((doom--inhibit-reload t) - (autoremove-p (doom//packages-autoremove)) - (install-p (doom//packages-install))) - (or autoremove-p install-p)) + (print! "%sconfig.el already exists. Skipping." short-private-dir) + (with-temp-file config-file (insert ""))))) + (print! "Installing plugins & generating autoloads file, if necessary") + (doom//packages-install) (doom//reload-autoloads) - (message "\n\nDone! Doom Emacs is ready.\n") - (message "Remember to run M-x all-the-icons-install-fonts after starting Emacs for the first time.")) + (print! "\n\nDone! Doom Emacs is ready.\n") + (print! "Remember to run M-x all-the-icons-install-fonts after starting Emacs for the first time.")) (provide 'core-dispatcher) ;;; core-dispatcher.el ends here From 6ea5430c4dc5e630f3d8e3bc2bf138f1f4714605 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:09:23 +0200 Subject: [PATCH 1384/4235] Fix doom//byte-compile --- core/autoload/modules.el | 139 +++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 71 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index ed8f162b1..5a886c028 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -269,95 +269,92 @@ these files. If RECOMPILE-P is non-nil, only recompile out-of-date files." (interactive (list nil current-prefix-arg)) - (let ((default-directory doom-emacs-dir) - (recompile-p (or recompile-p (and (member "-r" (cdr argv)) t))) - (argv (delete "-r" argv))) + (let ((default-directory doom-emacs-dir)) (unless recompile-p (doom//clean-byte-compiled-files)) (let ((total-ok 0) (total-fail 0) (total-noop 0) - (modules (or modules (cdr argv))) - compile-plugins - compile-targets) - ;; Ensure that Doom has been fully loaded, some of its state may be - ;; pertinent to files compiled later. - (let ((doom--stage 'compile) - noninteractive) - ;; Core libraries aren't fully loaded in a noninteractive session, so we - ;; pretend to be interactive and reinitialize - (doom-initialize)) + compile-plugins-p + targets) + (dolist (module (delete-dups modules) (nreverse targets)) + (pcase module + (":core" (push doom-core-dir targets)) + (":private" (push doom-private-dir targets)) + (":plugins" + (byte-recompile-directory package-user-dir 0 t) + (setq compile-plugins-p t)) + ((pred file-directory-p) + (push module targets)) + ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) + (push (doom-module-locate-path + (intern (format ":%s" (match-string 1 module))) + (intern (match-string 2 module))) + targets)))) + (unless (equal modules (list ":plugins")) + (let ((inhibit-message t) + noninteractive) + ;; But first we must be sure that Doom and your private config have been + ;; fully loaded. Which usually aren't so in an noninteractive session. + (doom//reload-autoloads) + (doom-initialize t) + (unless (equal modules (list ":core")) + (doom-initialize-modules t)))) + ;; If no targets were supplied, then we use your module list. + (unless targets + (setq targets (append (list doom-core-dir) + (doom-module-load-path)))) ;; Assemble el files we want to compile; taking into account that MODULES ;; may be a list of MODULE/SUBMODULE strings from the command line. - (setq - modules (or modules (append (list doom-core-dir) (doom-module-load-path))) - compile-targets - (cl-loop for target in modules - if (equal target ":core") - nconc (nreverse (doom-files-under doom-core-dir :match "\\.el$")) - and collect (expand-file-name "init.el" doom-private-dir) - if (equal target ":private") - nconc (nreverse (doom-files-under doom-private-dir :match "\\.el$")) - if (equal target ":plugins") - do (setq compile-plugins t) - else if (file-directory-p target) - nconc (nreverse (doom-files-under target :match "\\.el$")) - else if (cl-member target doom-psuedo-module-dirs :test #'file-in-directory-p) - nconc (nreverse (doom-files-under it :match "\\.el$")) - else if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" target) - nconc (nreverse (doom-files-under - (doom-module-locate-path - (intern (format ":%s" (match-string 1 target))) - (intern (match-string 2 target))) - :match "\\.el$")) - else if (file-exists-p target) - collect target - finally do (setq argv nil))) - (if compile-plugins - (byte-recompile-directory package-user-dir 0 t) - (if (not compile-targets) - (message "No targets to compile") + (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) + (if (not target-files) + (unless compile-plugins-p + (message "No targets to %scompile" (if recompile-p "re" ""))) (condition-case ex (let ((use-package-expand-minimally t)) - (push (expand-file-name "init.el" doom-emacs-dir) compile-targets) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename compile-targets) :test #'equal)) - (when (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p target elc-file)))) - (let ((result (cond ((string-match-p "/\\(packages\\|doctor\\)\\.el$" target) - 'no-byte-compile) - ((doom-file-cookie-p target) - (byte-compile-file target)) - ('no-byte-compile))) - (short-name (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (cl-incf - (cond ((eq result 'no-byte-compile) - (print! (dark (white "⚠ Ignored %s" short-name))) - total-noop) - ((null result) - (print! (red "✕ Failed to compile %s" short-name)) - total-fail) - (t - (print! (green "✓ Compiled %s" short-name)) - (quiet! (load target t t)) - total-ok)))))) + ;; Always compile private init file + (cl-pushnew (expand-file-name "init.el" doom-private-dir) + target-files :test #'equal) + (cl-pushnew (expand-file-name "init.el" doom-emacs-dir) + target-files :test #'equal) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) + (if (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p target elc-file)))) + (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) + (not (doom-file-cookie-p target))) + 'no-byte-compile + (byte-compile-file target))) + (short-name (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (cl-incf + (cond ((eq result 'no-byte-compile) + (print! (dark (white "⚠ Ignored %s" short-name))) + total-noop) + ((null result) + (print! (red "✕ Failed to compile %s" short-name)) + total-fail) + (t + (print! (green "✓ Compiled %s" short-name)) + (quiet! (load target t t)) + total-ok)))) + (cl-incf total-noop))) (print! (bold (color (if (= total-fail 0) 'green 'red) "%s %d/%d file(s) (%d ignored)" (if recompile-p "Recompiled" "Compiled") - total-ok (- (length compile-targets) total-noop) + total-ok (- (length target-files) total-noop) total-noop)))) (error (print! (red "\n%%s\n\n%%s\n\n%%s") - "There were breaking errors." - (error-message-string ex) - "Reverting changes...") + "There were breaking errors." + (error-message-string ex) + "Reverting changes...") (quiet! (doom//clean-byte-compiled-files)) - (print! (green "Finished (nothing was byte-compiled)"))))))))) + (print! (yellow "Finished (nothing was byte-compiled)"))))))))) ;;;###autoload (defun doom//clean-byte-compiled-files () From b629f4f50765caaea1939a1fb75e39ddda7898e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:09:29 +0200 Subject: [PATCH 1385/4235] Fix doom//clean-byte-compiled-files --- core/autoload/modules.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 5a886c028..c5bcec55c 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -358,19 +358,20 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;;;###autoload (defun doom//clean-byte-compiled-files () - "Delete all the compiled elc files in your Emacs configuration. This excludes -compiled packages.'" + "Delete all the compiled elc files in your Emacs configuration and private +module. This does not include your byte-compiled, third party packages.'" (interactive) (cl-loop with default-directory = doom-emacs-dir - for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$") - (doom-files-in doom-psuedo-module-dirs :match "\\.elc$" :full t) - (doom-files-under doom-core-dir :match "\\.elc$") - (doom-files-under doom-modules-dirs :match "\\.elc$")) + for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 1) + (doom-files-in doom-psuedo-module-dirs :match "\\.elc$" :depth 1) + (doom-files-in doom-core-dir :match "\\.elc$") + (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) for truepath = (file-truename path) + if (file-exists-p path) do (delete-file path) and do - (message "✓ Deleted %s" - (if (file-in-directory-p truepath default-directory) - (file-relative-name truepath) - (abbreviate-file-name path))) - finally do (message "Everything is clean"))) + (print! (green "✓ Deleted %%s") + (if (file-in-directory-p truepath default-directory) + (file-relative-name truepath) + (abbreviate-file-name truepath))) + finally do (print! (bold (green "Everything is clean"))))) From 87e9365a41630fda5d4fd01ec9ecb94f31a865ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:10:29 +0200 Subject: [PATCH 1386/4235] Fix package autoremove/install/update batch commands --- core/autoload/packages.el | 305 +++++++++++++++++++------------------- 1 file changed, 152 insertions(+), 153 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 849816193..a94da7b7f 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -329,159 +329,6 @@ package.el as appropriate." t))) -;; -;; Batch/interactive commands -;; - -;;;###autoload -(defun doom//packages-install () - "Interactive command for installing missing packages." - (interactive) - (doom-initialize-packages) - (print! "Looking for packages to install...") - (let ((packages (reverse (doom-get-missing-packages)))) - (cond ((not packages) - (print! (green "No packages to install!")) - nil) - - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be installed:\n\n%s\n\nProceed?" - (length packages) - (mapconcat - (lambda (pkg) - (format "+ %s (%s)" - (car pkg) - (cond ((doom-package-different-recipe-p (car pkg)) - "new recipe") - ((doom-package-different-backend-p (car pkg)) - (if (plist-get (cdr pkg) :recipe) - "ELPA -> QUELPA" - "QUELPA -> ELPA")) - ((plist-get (cdr pkg) :recipe) - "QUELPA") - (t - "ELPA")))) - (cl-sort (cl-copy-list packages) #'string-lessp - :key #'car) - "\n"))))) - (error "Aborted!")) - - ((let (success) - (doom-refresh-packages-maybe doom-debug-mode) - (dolist (pkg packages) - (print! "Installing %s" (car pkg)) - (doom--condition-case! - (print! "%s%s" - (if (and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg))) - (not (doom-package-different-recipe-p (car pkg)))) - (dark (white "⚠ ALREADY INSTALLED")) - (condition-case e - (if (doom-install-package (car pkg) (cdr pkg)) - (prog1 (green "✓ DONE") - (setq success t)) - (red "✕ FAILED")) - (error - (red "✕ ERROR (%s)" e)))) - (if (plist-member (cdr pkg) :pin) - (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) - "")))) - (print! (bold (green "Finished!"))) - (doom//reload) - success))))) - -;;;###autoload -(defun doom//packages-update () - "Interactive command for updating packages." - (interactive) - (doom-initialize-packages) - (print! "Looking for outdated packages...") - (doom-refresh-packages-maybe doom-debug-mode) - (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp - :key #'car))) - (cond ((not packages) - (print! (green "Everything is up-to-date")) - nil) - - ((not (or (getenv "YES") - (y-or-n-p - (format "%s packages will be updated:\n\n%s\n\nProceed?" - (length packages) - (let ((max-len - (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) - #'>)) - 10))) - (mapconcat - (lambda (pkg) - (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) - (symbol-name (car pkg)) - (package-version-join (cadr pkg)) - (package-version-join (cl-caddr pkg)))) - packages - "\n")))))) - (error "Aborted!")) - - ((let (success) - (dolist (pkg packages) - (print! "Updating %s" (car pkg)) - (doom--condition-case! - (print! - (let ((result (doom-update-package (car pkg) t))) - (when result (setq success t)) - (color (if result 'green 'red) - (if result "✓ DONE" "✕ FAILED")))))) - (print! (bold (green "Finished!"))) - (doom//reload) - success))))) - -;;;###autoload -(defun doom//packages-autoremove () - "Interactive command for auto-removing orphaned packages." - (interactive) - (doom-initialize-packages) - (print! "Looking for orphaned packages...") - (let ((packages (doom-get-orphaned-packages))) - (cond ((not packages) - (print! (green "No unused packages to remove")) - nil) - - ((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) - (pcase backend - (`quelpa "QUELPA->ELPA") - (`elpa "ELPA->QUELPA") - (_ "removed")) - (upcase (symbol-name backend)))))) - (sort (cl-copy-list packages) #'string-lessp) - "\n"))))) - (error "Aborted!")) - - ((let (success) - (dolist (pkg packages) - (doom--condition-case! - (print! - (let ((result (doom-delete-package pkg t))) - (when result (setq success t)) - (color (if result 'green 'red) - "%s %s" - (if result "✓ Removed" "✕ Failed to remove") - pkg))))) - - (print! (bold (green "Finished!"))) - (doom//reload) - success))))) - - ;; ;; Interactive commands ;; @@ -531,3 +378,155 @@ calls." (when (file-exists-p path) (delete-directory path t)))))) + +;; +;; Package Management +;; + +;;;###autoload +(defun doom//packages-install (&optional auto-accept-p) + "Interactive command for installing missing packages." + (interactive "P") + (doom-initialize-packages) + (print! "Looking for packages to install...") + (let ((packages (reverse (doom-get-missing-packages)))) + (cond ((not packages) + (print! (green "No packages to install!")) + nil) + + ((not (or auto-accept-p + (y-or-n-p + (format "%s packages will be installed:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (pkg) + (format "+ %s (%s)" + (car pkg) + (cond ((doom-package-different-recipe-p (car pkg)) + "new recipe") + ((doom-package-different-backend-p (car pkg)) + (if (plist-get (cdr pkg) :recipe) + "ELPA -> QUELPA" + "QUELPA -> ELPA")) + ((plist-get (cdr pkg) :recipe) + "QUELPA") + (t + "ELPA")))) + (cl-sort (cl-copy-list packages) #'string-lessp + :key #'car) + "\n"))))) + (error "Aborted!")) + + ((let (success) + (doom-refresh-packages-maybe doom-debug-mode) + (dolist (pkg packages) + (print! "Installing %s" (car pkg)) + (doom--condition-case! + (print! "%s%s" + (if (and (package-installed-p (car pkg)) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg)))) + (dark (white "⚠ ALREADY INSTALLED")) + (condition-case e + (if (doom-install-package (car pkg) (cdr pkg)) + (prog1 (green "✓ DONE") + (setq success t)) + (red "✕ FAILED")) + (error + (red "✕ ERROR (%s)" e)))) + (if (plist-member (cdr pkg) :pin) + (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) + "")))) + (print! (bold (green "Finished!"))) + (if success (doom-delete-autoloads-file doom-package-autoload-file)) + success))))) + +;;;###autoload +(defun doom//packages-update (&optional auto-accept-p) + "Interactive command for updating packages." + (interactive "P") + (doom-initialize-packages) + (print! "Looking for outdated packages...") + (doom-refresh-packages-maybe doom-debug-mode) + (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp + :key #'car))) + (cond ((not packages) + (print! (green "Everything is up-to-date")) + nil) + + ((not (or auto-accept-p + (y-or-n-p + (format "%s packages will be updated:\n\n%s\n\nProceed?" + (length packages) + (let ((max-len + (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) + #'>)) + 10))) + (mapconcat + (lambda (pkg) + (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) + (symbol-name (car pkg)) + (package-version-join (cadr pkg)) + (package-version-join (cl-caddr pkg)))) + packages + "\n")))))) + (error "Aborted!")) + + ((let (success) + (dolist (pkg packages) + (print! "Updating %s" (car pkg)) + (doom--condition-case! + (print! + (let ((result (doom-update-package (car pkg) t))) + (when result (setq success t)) + (color (if result 'green 'red) + (if result "✓ DONE" "✕ FAILED")))))) + (print! (bold (green "Finished!"))) + (if success (doom-delete-autoloads-file doom-package-autoload-file)) + success))))) + +;;;###autoload +(defun doom//packages-autoremove (&optional auto-accept-p) + "Interactive command for auto-removing orphaned packages." + (interactive "P") + (doom-initialize-packages) + (print! "Looking for orphaned packages...") + (let ((packages (doom-get-orphaned-packages))) + (cond ((not packages) + (print! (green "No unused packages to remove")) + nil) + + ((not + (or auto-accept-p + (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) + (pcase backend + (`quelpa "QUELPA->ELPA") + (`elpa "ELPA->QUELPA") + (_ "removed")) + (upcase (symbol-name backend)))))) + (sort (cl-copy-list packages) #'string-lessp) + "\n"))))) + (error "Aborted!")) + + ((let (success) + (dolist (pkg packages) + (doom--condition-case! + (print! + (let ((result (doom-delete-package pkg t))) + (when result (setq success t)) + (color (if result 'green 'red) + "%s %s" + (if result "✓ Removed" "✕ Failed to remove") + pkg))))) + + (print! (bold (green "Finished!"))) + (if success (doom-delete-autoloads-file doom-package-autoload-file)) + success))))) From 18a6df5e6f96b7ea9c2cfb119baae15352d27818 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:11:33 +0200 Subject: [PATCH 1387/4235] Fix doom/info --- core/autoload/debug.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 586c0dc20..82a7d9424 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -15,7 +15,8 @@ ready to be pasted in a bug report on github." (doom-initialize) (require 'vc-git) - (let ((default-directory doom-emacs-dir)) + (let ((default-directory doom-emacs-dir) + (doom-modules (doom-module-table))) (format (concat "- OS: %s (%s)\n" "- Emacs: %s (%s)\n" @@ -64,11 +65,11 @@ ready to be pasted in a bug report on github." (async-get (async-start `(lambda () - (setq load-path ',load-path) - (load ,(expand-file-name "core/core.el" doom-emacs-dir)) - (load ,(expand-file-name "init.el" doom-emacs-dir)) - (load ,(expand-file-name "core/autoload/packages.el" doom-emacs-dir)) - (doom-get-packages)) + (let ((noninteractive t) + (load-path ',load-path) + (package-alist ',package-alist)) + (load ,(expand-file-name "init.el" doom-emacs-dir)) + (doom-get-packages))) (lambda (p) (setq packages p)))) (cl-loop for pkg in (cl-sort packages #'string-lessp :key (lambda (x) (symbol-name (car x)))) From 6dc375a8916bbf83be071df7cce63bf76b9a6ed7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 19:12:36 +0200 Subject: [PATCH 1388/4235] Fix catch-all text-mode entry in auto-mode-alist This indirectly fixes an issue where the elfeed db was opened in text-mode, triggering the large-file check. --- 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 b4984600d..491c50001 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -70,7 +70,7 @@ fundamental-mode) for performance sake." ;; Built-in plugins ;; -(push '("/[A-Z]+$" . text-mode) auto-mode-alist) +(push '("/LICENSE\\'" . text-mode) auto-mode-alist) (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. From 2a8da07e31c129227ff24ea9afea455963543949 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:14:40 +0200 Subject: [PATCH 1389/4235] Rename autoload-debug.el test to autoload-help.el --- core/test/{autoload-debug.el => autoload-help.el} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core/test/{autoload-debug.el => autoload-help.el} (94%) diff --git a/core/test/autoload-debug.el b/core/test/autoload-help.el similarity index 94% rename from core/test/autoload-debug.el rename to core/test/autoload-help.el index 062a16de5..262f8fecb 100644 --- a/core/test/autoload-debug.el +++ b/core/test/autoload-help.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; core/test/autoload-debug.el +;;; core/test/autoload-help.el (def-test! what-face (insert (propertize "Hello " 'face 'font-lock-keyword-face)) From b70ed84a3312725c47f2d2177d534e99941cee70 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:15:44 +0200 Subject: [PATCH 1390/4235] Fix doom//run-tests --- core/autoload/test.el | 57 +++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 431fe0111..0a65a6c33 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -7,43 +7,46 @@ command line args following a double dash (each arg should be in the If neither is available, run all tests in all enabled modules." (interactive) + (doom//reload-autoloads) (let (noninteractive) ;; Core libraries aren't fully loaded in a noninteractive session, so we ;; reload it with `noninteractive' set to nil to force them to. - (doom-initialize)) + (doom-initialize t) + (doom-initialize-modules t)) (condition-case-unless-debug ex - (let ((target-paths - ;; Convert targets (either from MODULES or `argv') into a list of - ;; string paths, pointing to the root directory of modules - (cond ((stringp (car modules)) ; command line - (save-match-data - (cl-loop for arg in modules - if (string= arg "core") collect doom-core-dir - else if (string-match-p "/" arg) - nconc (cl-loop for dir in doom-modules-dirs - collect (expand-file-name arg dir)) - else - nconc (cl-loop for dir in doom-modules-dirs - for path = (expand-file-name arg dir) - if (file-directory-p path) - nconc - (cl-remove-if-not - #'file-directory-p - (directory-files path t "^[^.]" t))) - finally do (setq argv nil)))) + (let* ((doom-modules (doom-module-table)) + (target-paths + ;; Convert targets (either from MODULES or `argv') into a list of + ;; string paths, pointing to the root directory of modules + (cond ((stringp (car modules)) ; command line + (save-match-data + (cl-loop for arg in modules + if (string= arg ":core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (cl-loop for dir in doom-modules-dirs + collect (expand-file-name arg dir)) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc + (cl-remove-if-not + #'file-directory-p + (directory-files path t "^[^.]" t))) + finally do (setq argv nil)))) - (modules ; cons-cells given to MODULES - (cl-loop for (module . submodule) in modules - if (doom-module-locate-path module submodule) - collect it)) + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-locate-path module submodule) + collect it)) - ((append (list doom-core-dir) - (doom-module-load-path)))))) + ((append (list doom-core-dir) + (doom-module-load-path)))))) ;; Load all the unit test files... (dolist (path target-paths) (let ((test-path (expand-file-name "test/" path))) (when (file-directory-p test-path) - (dolist (test-file (reverse (doom-files-under test-path :match "\\.el$"))) + (dolist (test-file (reverse (doom-files-in test-path :match "\\.el$" :full t))) (load test-file nil :noerror))))) ;; ... then run them (switch-to-buffer (get-buffer-create "*blank*")) From ea86b1075fad7cae57d37841e9c2b8f6da538e8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:15:54 +0200 Subject: [PATCH 1391/4235] Fix doom-template-exists-p --- core/autoload/debug.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 82a7d9424..f53e5b33d 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -2,7 +2,9 @@ (defun doom-template-exists-p (template) "TODO" - (file-exists-p (expand-file-name "templates/" doom-core-dir))) + (file-exists-p + (expand-file-name (format "templates/%s" template) + doom-core-dir))) (defun doom-template-insert (template) "TODO" From 8282280965275c602805073971b60035974cb8b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:17:23 +0200 Subject: [PATCH 1392/4235] core-packages: revise docstrings & comments --- core/core-packages.el | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 08b4f89e4..19c1746de 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -1,17 +1,17 @@ ;;; core-packages.el --- package management system -*- lexical-binding: t; -*- -;; Emacs package management is opinionated. Unfortunately, so am I. I've bound -;; together `use-package', `quelpa' and package.el to create my own, -;; rolling-release, lazily-loaded package management system for Emacs. +;; Emacs package management is opinionated, and so am I. I've bound together +;; `use-package', `quelpa' and package.el to create my own, rolling-release, +;; lazily-loaded package management system for Emacs. ;; ;; The three key commands are: ;; -;; + `make install` or `doom//packages-install': Installs packages that are +;; + `bin/doom install` or `doom//packages-install': Installs packages that are ;; wanted, but not installed. -;; + `make update` or `doom//packages-update': Updates packages that are +;; + `bin/doom update` or `doom//packages-update': Updates packages that are ;; out-of-date. -;; + `make autoremove` or `doom//packages-autoremove': Uninstalls packages that -;; are no longer needed. +;; + `bin/doom autoremove` or `doom//packages-autoremove': Uninstalls packages +;; that are no longer needed. ;; ;; This system reads packages.el files located in each activated module (and one ;; in `doom-core-dir'). These contain `package!' blocks that tell DOOM what @@ -164,8 +164,8 @@ If RETURN-P, return the message as a string instead of displaying it." (run-hooks 'doom-post-init-hook)) (defun doom|run-all-startup-hooks () - "Run all startup Emacs hooks. Meant to follow running Emacs in a vanilla -session, with a different init.el, like so: + "Run all startup Emacs hooks. Meant to be executed after starting Emacs with +-q or -Q, for example: emacs -Q -l init.el -f doom|run-all-startup-hooks" (run-hooks 'after-init-hook 'delayed-warnings-hook @@ -495,6 +495,15 @@ added, if the file exists." (autoload 'use-package "use-package-core" nil 'macro) +;; Adds the :after-call custom keyword to `use-package' (and consequently, +;; `def-package!'). :after-call takes a symbol ro list of symbols. These symbols +;; can be functions to hook variables. +;; +;; (use-package X :after-call find-file-hook) +;; +;; This will load X on the first invokation of `find-file-hook' (then it will +;; remove itself from the hook). +(defvar doom--deferred-packages-alist ()) (after! use-package-core (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) @@ -504,9 +513,6 @@ added, if the file exists." (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) - (defvar doom--deferred-packages-alist () - "TODO") - (defun use-package-handler/:after-call (name-symbol _keyword hooks rest state) (let ((fn (intern (format "doom|transient-hook--load-%s" name-symbol))) (hooks (delete-dups hooks))) From 30893b0ff1d8ec80fae7a96152ff998b1610c6bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:17:35 +0200 Subject: [PATCH 1393/4235] Fix doom-initialize-packages --- core/core-packages.el | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 19c1746de..f91ee5e1d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -316,28 +316,28 @@ them." ;; there's no non-trivial way to detect that, so we give you a way to ;; reload only doom-packages (by passing 'internal as FORCE-P). ;; `doom-packages' + (unless (eq force-p 'internal) + ;; `package-alist' + (when (or force-p (not (bound-and-true-p package-alist))) + (setq load-path doom-site-load-path) + (require 'package) + (setq package-activated-list nil + package--initialized nil) + (let (byte-compile-warnings) + (condition-case _ + (quiet! (package-initialize)) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize))))) + + ;; `quelpa-cache' + (when (or force-p (not (bound-and-true-p quelpa-cache))) + (require 'quelpa) + (setq quelpa-initialized-p nil) + (or (quelpa-setup-p) + (error "Could not initialize quelpa")))) + (when (or force-p (not doom-packages)) - (unless (eq force-p 'internal) - ;; `package-alist' - (when (or force-p (not (bound-and-true-p package-alist))) - (setq load-path doom-site-load-path) - (require 'package) - (setq package-activated-list nil - package--initialized nil) - (let (byte-compile-warnings) - (condition-case _ - (package-initialize) - ('error (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize))))) - - ;; `quelpa-cache' - (when (or force-p (not (bound-and-true-p quelpa-cache))) - (require 'quelpa) - (setq quelpa-initialized-p nil) - (or (quelpa-setup-p) - (error "Could not initialize quelpa")))) - (setq doom-packages nil) (cl-flet ((_load From 9e07940b7ce386e22e68fb9f364f9c768c0a3c1c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:17:45 +0200 Subject: [PATCH 1394/4235] Fix use-package autoload --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index f91ee5e1d..b258e1ece 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -493,7 +493,7 @@ added, if the file exists." ;; Use-package modifications ;; -(autoload 'use-package "use-package-core" nil 'macro) +(autoload 'use-package "use-package-core" nil nil t) ;; Adds the :after-call custom keyword to `use-package' (and consequently, ;; `def-package!'). :after-call takes a symbol ro list of symbols. These symbols From d35598520f8e917a8bda245eb36285bacc2a01d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:18:00 +0200 Subject: [PATCH 1395/4235] Only package-initialize if uninitialized (from package.el API advice) --- core/core-packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index b258e1ece..5f70d6396 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -809,7 +809,9 @@ loads MODULE SUBMODULE's packages.el file." ;; Make package.el cooperate with Doom ;; -(defun doom*initialize-packages (&rest _) (package-initialize)) +(defun doom*initialize-packages (&rest _) + (unless package--initialized + (package-initialize))) (advice-add #'package-delete :before #'doom*initialize-packages) (advice-add #'package-install :before #'doom*initialize-packages) From a55e2251e65c4a9df105102120fc16e88613e64f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:18:42 +0200 Subject: [PATCH 1396/4235] auto-mode-case-fold = nil This disables the case insensitive second pass through auto-mode-alist on case sensitive systems. --- core/core.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core.el b/core/core.el index bfe831b34..389004d16 100644 --- a/core/core.el +++ b/core/core.el @@ -90,6 +90,7 @@ else (except for `window-setup-hook').") debug-on-error doom-debug-mode ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often + auto-mode-case-fold nil ;; be quiet at startup; don't load or display anything unnecessary inhibit-startup-message t inhibit-startup-echo-area-message user-login-name From dea7c107717c19e05c185c2d4ee9c067373ab552 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 21:20:39 +0200 Subject: [PATCH 1397/4235] Don't do naive path concatenation for private custom-theme-directory --- 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 f6f7faa5f..8231627cd 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -57,7 +57,7 @@ with `doom//reload-theme').") compilation-scroll-output 'first-error confirm-nonexistent-file-or-buffer t cursor-in-non-selected-windows nil ; hide cursors in other windows - custom-theme-directory (concat doom-private-dir "themes/") + custom-theme-directory (expand-file-name "themes/" doom-private-dir) display-line-numbers-width 3 enable-recursive-minibuffers nil frame-inhibit-implied-resize t From 7c611df6a6dd3d56aa8820bdf5205be0d17a3b62 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 22:01:26 +0200 Subject: [PATCH 1398/4235] Have doom//reload return t on success --- core/autoload/modules.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index c5bcec55c..462cf6411 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -35,7 +35,8 @@ init.el and config.el. Then runs `doom-reload-hook'." (doom-initialize t) (doom-initialize-modules t) (print! (green "%d packages reloaded" (length package-alist))) - (run-hooks 'doom-reload-hook)))))) + (run-hooks 'doom-reload-hook) + t))))) ;; From 0b48575c1462f1c9bfa871005dd6de7760457792 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 22:03:17 +0200 Subject: [PATCH 1399/4235] Remove def-hydra! macro alias Causes byte-compilation issues and the alias is unnecessary. --- core/core-keybinds.el | 10 +++------- core/core-ui.el | 1 + modules/completion/ivy/config.el | 2 +- modules/feature/version-control/+git.el | 2 +- modules/feature/version-control/config.el | 10 +++++----- modules/tools/ein/config.el | 2 +- modules/tools/rgb/config.el | 2 +- 7 files changed, 13 insertions(+), 16 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 0a3495720..3d9e1ed57 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -60,15 +60,11 @@ If any hook returns non-nil, all hooks after it are ignored.") (def-package! hydra - :commands (defhydra defhydradio) - :init - ;; In case I later need to wrap defhydra in any special functionality. - (defalias 'def-hydra! 'defhydra) - (defalias 'def-hydra-radio! 'defhydradio) + :defer t :config (setq lv-use-seperator t) - (def-hydra! doom@text-zoom (:hint t :color red) + (defhydra doom@text-zoom (:hint t :color red) " Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset " @@ -76,7 +72,7 @@ If any hook returns non-nil, all hooks after it are ignored.") ("k" text-scale-decrease "out") ("0" (text-scale-set 0) "reset")) - (def-hydra! doom@window-nav (:hint nil) + (defhydra doom@window-nav (:hint nil) " Split: _v_ert _s_:horz Delete: _c_lose _o_nly diff --git a/core/core-ui.el b/core/core-ui.el index 8231627cd..438dc515b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -24,6 +24,7 @@ Expects a `font-spec'.") return a string). This changes the 'long' name of a major-mode, allowing for shorter major mode name in the mode-line. See `doom|set-mode-name'.") +;; (defvar doom-init-ui-hook nil "List of hooks to run when the UI has been initialized.") diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 60a201d32..51434fb26 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -141,7 +141,7 @@ immediately runs it on the current candidate (ending the ivy session)." "C-o" #'+ivy@coo/body "M-o" #'ivy-dispatching-done-hydra) :config - (def-hydra! +ivy@coo (:hint nil :color pink) + (defhydra +ivy@coo (:hint nil :color pink) " Move ^^^^^^^^^^ | Call ^^^^ | Cancel^^ | Options^^ | Action _w_/_s_/_a_: %s(ivy-action-name) ----------^^^^^^^^^^-+--------------^^^^-+-------^^-+--------^^-+--------------------------------- diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index cbb110f5f..88d610089 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -33,7 +33,7 @@ (ignore (git-gutter)))) (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t)) - (def-hydra! +version-control@git-gutter + (defhydra +version-control@git-gutter (:body-pre (git-gutter-mode 1) :hint nil) " ╭─────────────────┐ diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index 4a2a9791d..d49a806b1 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -28,11 +28,11 @@ (defalias #'smerge-diff-upper-lower #'smerge-diff-mine-other) (defalias #'smerge-diff-base-lower #'smerge-diff-base-other))) - (def-hydra! +hydra-smerge (:hint nil - :pre (smerge-mode 1) - ;; Disable `smerge-mode' when quitting hydra if - ;; no merge conflicts remain. - :post (smerge-auto-leave)) + (defhydra +hydra-smerge (:hint nil + :pre (smerge-mode 1) + ;; Disable `smerge-mode' when quitting hydra if + ;; no merge conflicts remain. + :post (smerge-auto-leave)) " ╭────────┐ Movement Keep Diff Other │ smerge │ diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 5633bf690..812e815a5 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -45,7 +45,7 @@ ;; Avy is required for showing links in the notebook list with ace-link. (require 'avy) ;; add hydra - (def-hydra! +ein/hydra (:hint t :color red) + (defhydra +ein/hydra (:hint t :color red) " Operations on Cells^^^^^^ Other ----------------------------^^^^^^ ----------------------------------^^^^ diff --git a/modules/tools/rgb/config.el b/modules/tools/rgb/config.el index b69768ce7..ffab008eb 100644 --- a/modules/tools/rgb/config.el +++ b/modules/tools/rgb/config.el @@ -10,7 +10,7 @@ (def-package! kurecolor :after rainbow-mode :config - (def-hydra! +rgb@kurecolor (:color pink :hint nil) + (defhydra +rgb@kurecolor (:color pink :hint nil) " Inc/Dec _w_/_W_ brightness _d_/_D_ saturation _e_/_E_ hue " ("w" kurecolor-decrease-brightness-by-step) From 4c73ac01117b1d6ef67beac9c1c50cb915729dbb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 22:12:32 +0200 Subject: [PATCH 1400/4235] config/default: Fix evil-collection anti-hacks #604 --- modules/config/default/+bindings.el | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2d4f221a3..9b2ef077d 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -772,14 +772,16 @@ ;; Evil-collection fixes ;; -(when (featurep 'evil-collection) - (defun +config|deal-with-evil-collections-bs (_feature keymaps) - "Unmap keys that conflict with Doom's defaults." - (dolist (map keymaps) - (evil-define-key '(normal visual motion) map - doom-leader-key nil - "C-j" nil "C-k" nil - "gd" nil "gf" nil - "K" nil - "]" nil "[" nil))) - (add-hook 'evil-collection-setup-hook #'+config|deal-with-evil-collections-bs)) +(defun +config|deal-with-evil-collections-bs (_feature keymaps) + "Unmap keys that conflict with Doom's defaults." + (dolist (map keymaps) + (evil-delay `(and (boundp ',map) (keymapp ,map)) + `(evil-define-key* '(normal visual motion) ,map + (kbd doom-leader-key) nil + (kbd "C-j") nil (kbd "C-k") nil + "gd" nil "gf" nil "K" nil + "]" nil "[" nil) + 'after-load-functions t nil + (format "+default-redefine-key-in-%s" map)))) + +(add-hook 'evil-collection-setup-hook #'+config|deal-with-evil-collections-bs) From b806ff937c21cdbf82835614a98ebde54ec30133 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 22:20:45 +0200 Subject: [PATCH 1401/4235] feature/file-templates: rewrite & fix wrong-number-of-args errors #602 --- modules/feature/file-templates/autoload.el | 8 +- modules/feature/file-templates/config.el | 219 ++++++++++----------- 2 files changed, 113 insertions(+), 114 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 2566434c0..348c14915 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -66,8 +66,12 @@ evil is loaded and enabled)." ;;;###autoload (defun +file-templates-get-short-path () "Fetches a short file path for the header in Doom module templates." - (when (string-match "/modules/\\(.+\\)$" buffer-file-truename) - (match-string 1 buffer-file-truename))) + (let ((path (file-truename (or buffer-file-name default-directory)))) + (cond ((string-match "/modules/\\(.+\\)$" path) + (match-string 1 path)) + ((file-in-directory-p path doom-emacs-dir) + (file-relative-name path doom-emacs-dir)) + ((abbreviate-file-name path))))) ;; diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 511bca956..8a9963c3d 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -6,142 +6,137 @@ (expand-file-name "templates/" (file-name-directory load-file-name)) "The path to a directory of yasnippet folders to use for file templates.") -(defvar +file-templates-alist () - "An alist of file template rules. The CAR of each rule is either a major mode -symbol or regexp string. The CDR is a plist. See `doom--set:file-template' for -more information.") - (defvar +file-templates-default-trigger "__" "The default yasnippet trigger key (a string) for file template rules that don't have a :trigger property in `+file-templates-alist'.") +(defvar +file-templates-alist + `(;; General + (gitignore-mode) + (dockerfile-mode) + ("/docker-compose\\.yml$" :mode yaml-mode) + ("/Makefile$" :mode makefile-gmake-mode) + ;; elisp + ("/.dir-locals.el$") + ("/packages\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-packages" + :mode emacs-lisp-mode) + ("/doctor\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-doctor" + :mode emacs-lisp-mode) + ("/test/.+\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-test" + :mode emacs-lisp-mode) + ("\\.el$" :when +file-templates-in-emacs-dirs-p + :trigger "__doom-module" + :mode emacs-lisp-mode) + ("-test\\.el$" :mode emacs-ert-mode) + (emacs-lisp-mode :trigger "__initfile") + (snippet-mode) + ;; C/C++ + ("/main\\.c\\(?:c\\|pp\\)$" :trigger "__main.cpp" :mode c++-mode) + ("/win32_\\.c\\(?:c\\|pp\\)$" :trigger "__winmain.cpp" :mode c++-mode) + ("\\.c\\(?:c\\|pp\\)$" :trigger "__cpp" :mode c++-mode) + ("\\.h\\(?:h\\|pp\\|xx\\)$" :trigger "__hpp" :mode c++-mode) + ("\\.h$" :trigger "__h" :mode c-mode) + (c-mode :trigger "__c" :mode c-mode) + ;; go + ("/main\\.go$" :trigger "__main.go" :mode go-mode :project t) + (go-mode :trigger "__.go") + ;; web-mode + ("/normalize\\.scss$" :trigger "__normalize.scss" :mode scss-mode) + ("/master\\.scss$" :trigger "__master.scss" :mode scss-mode) + ("\\.html$" :trigger "__.html" :mode web-mode) + (scss-mode) + ;; java + ("/main\\.java$" :trigger "__main" :mode java-mode) + ("/build\\.gradle$" :trigger "__build.gradle" :mode android-mode) + ("/src/.+\\.java$" :mode java-mode) + ;; javascript + ("/package\\.json$" :trigger "__package.json" :mode json-mode) + ("/bower\\.json$" :trigger "__bower.json" :mode json-mode) + ("/gulpfile\\.js$" :trigger "__gulpfile.js" :mode js-mode) + ("/webpack\\.config\\.js$" :trigger "__webpack.config.js" :mode js-mode) + ("\\.js\\(?:on\\|hintrc\\)$" :mode json-mode) + ;; Lua + ("/main\\.lua$" :trigger "__main.lua" :mode love-mode) + ("/conf\\.lua$" :trigger "__conf.lua" :mode love-mode) + ;; Markdown + (markdown-mode) + ;; Org + ("\\.org$" :trigger "__" :mode org-mode) + ("/README\\.org$" + :when +file-templates-in-emacs-dirs-p + :trigger "__doom-readme" + :mode org-mode) + ;; PHP + ("\\.class\\.php$" :trigger "__.class.php" :mode php-mode) + (php-mode) + ;; Python + ;; TODO ("tests?/test_.+\\.py$" :trigger "__" :mode nose-mode) + ;; TODO ("/setup\\.py$" :trigger "__setup.py" :mode python-mode) + (python-mode) + ;; Ruby + ("/lib/.+\\.rb$" :trigger "__module" :mode ruby-mode :project t) + ("/spec_helper\\.rb$" :trigger "__helper" :mode rspec-mode :project t) + ("_spec\\.rb$" :mode rspec-mode :project t) + ("/\\.rspec$" :trigger "__.rspec" :mode rspec-mode :project t) + ("\\.gemspec$" :trigger "__.gemspec" :mode ruby-mode :project t) + ("/Gemfile$" :trigger "__Gemfile" :mode ruby-mode :project t) + ("/Rakefile$" :trigger "__Rakefile" :mode ruby-mode :project t) + (ruby-mode) + ;; Rust + ("/Cargo.toml$" :trigger "__Cargo.toml" :mode rust-mode) + ("/main\\.rs$" :trigger "__main.rs" :mode rust-mode) + ;; Slim + ("/\\(?:index\\|main\\)\\.slim$" :mode slim-mode) + ;; Shell scripts + ("\\.zunit$" :trigger "__zunit" :mode sh-mode) + (fish-mode) + (sh-mode)) + "An alist of file template rules. The CAR of each rule is either a major mode +symbol or regexp string. The CDR is a plist. See `doom--set:file-template' for +more information.") + ;; -;; Bootstrap +;; Library ;; -(after! yasnippet - (add-to-list 'yas-snippet-dirs '+file-templates-dir 'append #'eq)) - (defun +file-template-p (rule) "Return t if RULE applies to the current buffer." (let ((pred (car rule)) (plist (cdr rule))) - (and (cond ((stringp pred) (string-match-p pred)) + (and (cond ((and (stringp pred) buffer-file-name) (string-match-p pred buffer-file-name)) ((symbolp pred) (eq major-mode pred))) (or (not (plist-member plist :when)) (funcall (plist-get plist :when) buffer-file-name)) rule))) -(defun +file-templates|init () - "Check if the current buffer is a candidate for file template expansion. It -must be non-read-only, empty, and there must be a rule in -`+file-templates-alist' that applies to it." - (when (and (not buffer-read-only) - (bobp) (eobp)) - (when-let* ((rule (cl-find-if #'+file-template-p +file-templates-alist))) - (apply #'+file-templates--expand rule)))) - -(add-hook 'find-file-hook #'+file-templates|init) - - -;; -;; File templates -;; - (defun +file-templates-in-emacs-dirs-p (file) "Returns t if FILE is in Doom or your private directory." (or (file-in-directory-p file doom-private-dir) (file-in-directory-p file doom-emacs-dir))) -(setq +file-templates-alist - `(;; General - (gitignore-mode) - (dockerfile-mode) - ("/docker-compose\\.yml$" :mode yaml-mode) - ("/Makefile$" :mode makefile-gmake-mode) - ;; elisp - ("/.dir-locals.el$") - ("/packages\\.el$" :when +file-templates-in-emacs-dirs-p - :trigger "__doom-packages" - :mode emacs-lisp-mode) - ("/doctor\\.el$" :when +file-templates-in-emacs-dirs-p - :trigger "__doom-doctor" - :mode emacs-lisp-mode) - ("/test/.+\\.el$" :when +file-templates-in-emacs-dirs-p - :trigger "__doom-test" - :mode emacs-lisp-mode) - ("\\.el$" :when +file-templates-in-emacs-dirs-p - :trigger "__doom-module" - :mode emacs-lisp-mode) - ("-test\\.el$" :mode emacs-ert-mode) - (emacs-lisp-mode :trigger "__initfile") - (snippet-mode) - ;; C/C++ - ("/main\\.c\\(?:c\\|pp\\)$" :trigger "__main.cpp" :mode c++-mode) - ("/win32_\\.c\\(?:c\\|pp\\)$" :trigger "__winmain.cpp" :mode c++-mode) - ("\\.c\\(?:c\\|pp\\)$" :trigger "__cpp" :mode c++-mode) - ("\\.h\\(?:h\\|pp\\|xx\\)$" :trigger "__hpp" :mode c++-mode) - ("\\.h$" :trigger "__h" :mode c-mode) - (c-mode :trigger "__c" :mode c-mode) - ;; go - ("/main\\.go$" :trigger "__main.go" :mode go-mode :project t) - (go-mode :trigger "__.go") - ;; web-mode - ("/normalize\\.scss$" :trigger "__normalize.scss" :mode scss-mode) - ("/master\\.scss$" :trigger "__master.scss" :mode scss-mode) - ("\\.html$" :trigger "__.html" :mode web-mode) - (scss-mode) - ;; java - ("/main\\.java$" :trigger "__main" :mode java-mode) - ("/build\\.gradle$" :trigger "__build.gradle" :mode android-mode) - ("/src/.+\\.java$" :mode java-mode) - ;; javascript - ("/package\\.json$" :trigger "__package.json" :mode json-mode) - ("/bower\\.json$" :trigger "__bower.json" :mode json-mode) - ("/gulpfile\\.js$" :trigger "__gulpfile.js" :mode js-mode) - ("/webpack\\.config\\.js$" :trigger "__webpack.config.js" :mode js-mode) - ("\\.js\\(?:on\\|hintrc\\)$" :mode json-mode) - ;; Lua - ("/main\\.lua$" :trigger "__main.lua" :mode love-mode) - ("/conf\\.lua$" :trigger "__conf.lua" :mode love-mode) - ;; Markdown - (markdown-mode) - ;; Org - ("\\.org$" :trigger "__" :mode org-mode) - ("/README\\.org$" - :when +file-templates-in-emacs-dirs-p - :trigger "__doom-readme" - :mode org-mode) - ;; PHP - ("\\.class\\.php$" :trigger "__.class.php" :mode php-mode) - (php-mode) - ;; Python - ;; TODO ("tests?/test_.+\\.py$" :trigger "__" :mode nose-mode) - ;; TODO ("/setup\\.py$" :trigger "__setup.py" :mode python-mode) - (python-mode) - ;; Ruby - ("/lib/.+\\.rb$" :trigger "__module" :mode ruby-mode :project t) - ("/spec_helper\\.rb$" :trigger "__helper" :mode rspec-mode :project t) - ("_spec\\.rb$" :mode rspec-mode :project t) - ("/\\.rspec$" :trigger "__.rspec" :mode rspec-mode :project t) - ("\\.gemspec$" :trigger "__.gemspec" :mode ruby-mode :project t) - ("/Gemfile$" :trigger "__Gemfile" :mode ruby-mode :project t) - ("/Rakefile$" :trigger "__Rakefile" :mode ruby-mode :project t) - (ruby-mode) - ;; Rust - ("/Cargo.toml$" :trigger "__Cargo.toml" :mode rust-mode) - ("/main\\.rs$" :trigger "__main.rs" :mode rust-mode) - ;; Slim - ("/\\(?:index\\|main\\)\\.slim$" :mode slim-mode) - ;; Shell scripts - ("\\.zunit$" :trigger "__zunit" :mode sh-mode) - (fish-mode) - (sh-mode) - )) +(defun +file-templates|check () + "Check if the current buffer is a candidate for file template expansion. It +must be non-read-only, empty, and there must be a rule in +`+file-templates-alist' that applies to it." + (when (and (not buffer-read-only) + (bobp) (eobp) + (not (string-match-p "^ *\\*" (buffer-name)))) + (when-let* ((rule (cl-find-if #'+file-template-p +file-templates-alist))) + (apply #'+file-templates--expand rule)))) ;; -;; Plugins +;; Bootstrap ;; +(defun +file-templates|init () + (after! yasnippet + (add-to-list 'yas-snippet-dirs '+file-templates-dir 'append #'eq)) + (add-hook 'find-file-hook #'+file-templates|check)) + +(add-hook 'doom-post-init-hook #'+file-templates|init) + From e8653d06289d2cd027574fd1b81370cf5add933d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 22:21:00 +0200 Subject: [PATCH 1402/4235] feature/file-templates: revise doom module README.org file template --- .../file-templates/templates/org-mode/__doom-readme | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/feature/file-templates/templates/org-mode/__doom-readme b/modules/feature/file-templates/templates/org-mode/__doom-readme index 901c25faf..8a6f23a5d 100644 --- a/modules/feature/file-templates/templates/org-mode/__doom-readme +++ b/modules/feature/file-templates/templates/org-mode/__doom-readme @@ -11,10 +11,9 @@ ${2:A short summary about what this module does.} ${3:If necessary, include a longer description below it that goes into more detail. This may be as long as you like. -+ If possible, include a list of features -+ Include links to major plugins that the module uses, if applicable -+ Use links whenever you can -+ Mention dependencies on other modules here} ++ If possible, include a brief list of feature highlights here ++ Like code completion, syntax checking or available snippets ++ Include links to packages & external things where possible * Table of Contents :TOC: @@ -25,11 +24,15 @@ This module provides no flags. This module has no prereqisites. * Features -A list of features, how to use them, and their dependencies. +An in-depth list of features, how to use them, and their dependencies. * Configuration +How to configure this module, including common problems and how to address them. * Appendix ** Commands ++ A list or table of public commands (and their keybinds) and functions that this module exposes. ++ A brief description of how to use them ** Hacks ++ Include a list of ways this module changes default behavior $0 \ No newline at end of file From 9e7703db2afa2293bc9b8cb44300cb29e3d5ccf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 22:35:45 +0200 Subject: [PATCH 1403/4235] core-lib (add-transient-hook!): set permanent-local-hook on hook fn --- core/core-lib.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-lib.el b/core/core-lib.el index 5f46425f7..9e76dc0dc 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -249,6 +249,7 @@ HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." (cond ((functionp ,hook) (advice-add ,hook ,(if append :after :before) #',fn)) ((symbolp ,hook) + (put ',fn 'permanent-local-hook t) (add-hook ,hook #',fn ,append)))))) (defmacro add-hook! (&rest args) From 6a140209b8ea648d9047480f4f8f9860c1a1979c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 24 May 2018 23:41:40 +0200 Subject: [PATCH 1404/4235] Optimize Doom core package configs --- core/core-ui.el | 91 ++++++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 54 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 438dc515b..7a4256f5c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -178,15 +178,11 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; Plugins ;; -(def-package! ace-link - :commands (ace-link-help ace-link-org ace-link-addr ace-link-mu4e)) - -(def-package! avy - :commands (avy-goto-char-2 avy-goto-line) - :config - (setq avy-all-windows nil - avy-background t)) +;; `avy' +(setq avy-all-windows nil + avy-background t) +;; `all-the-icons' (def-package! all-the-icons :commands (all-the-icons-octicon all-the-icons-faicon all-the-icons-fileicon all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon @@ -201,19 +197,41 @@ DEFAULT is non-nil, set the default mode-line for all buffers." all-the-icons-wicon all-the-icons-alltheicon)) (advice-add fn :around #'doom*disable-all-the-icons-in-tty))) -(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)) +;; `hide-mode-line-mode' +(add-hook 'completion-list-mode-hook #'hide-mode-line-mode) -(def-package! hide-mode-line - :commands hide-mode-line-mode - :init (add-hook 'completion-list-mode-hook #'hide-mode-line-mode)) +;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially +;; in parentheses-drunk languages like Lisp. +(def-package! rainbow-delimiters + :hook (lisp-mode . rainbow-delimiters-mode) + :config (setq rainbow-delimiters-max-face-count 3)) -(def-package! highlight-indentation - :commands (highlight-indentation-mode highlight-indentation-current-column-mode)) +;; `restart-emacs' +(setq restart-emacs--args (list "--restore")) -;; For modes with sub-par number fontification -(def-package! highlight-numbers :commands highlight-numbers-mode) +;; `visual-fill-column' For a distractions-free-like UI, that dynamically +;; resizes margins and can center a buffer. +(setq 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)) + + +;; +;; Built-in packages +;; + +;; `hideshow' +(setq hs-hide-comments-when-hiding-all nil) + +;; show typed keystrokes in minibuffer +(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) +(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) +(doom|enable-ui-keystrokes) +;; ...but hide them while isearch is active +(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) +(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) ;; Highlights the current line (def-package! hl-line ; built-in @@ -254,41 +272,6 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (add-hook 'evil-visual-state-entry-hook #'doom|disable-hl-line) (add-hook 'evil-visual-state-exit-hook #'doom|enable-hl-line-maybe))) -;; Helps us distinguish stacked delimiter pairs. Especially in parentheses-drunk -;; languages like Lisp. -(def-package! rainbow-delimiters - :hook (lisp-mode . rainbow-delimiters-mode) - :config (setq rainbow-delimiters-max-face-count 3)) - -(def-package! restart-emacs - :commands restart-emacs - :config (setq restart-emacs--args (list "--restore"))) - -;; For a distractions-free-like UI, that dynamically resizes margins and can -;; center a buffer. -(def-package! visual-fill-column - :commands visual-fill-column-mode - :config - (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))) - - -;; -;; Built-in packages -;; - -;; show typed keystrokes in minibuffer -(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) -(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) -(doom|enable-ui-keystrokes) -;; ...but hide them while isearch is active -(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) -(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) - ;; undo/redo changes to Emacs' window layout (def-package! winner :after-call doom-before-switch-window-hook @@ -317,7 +300,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (remove-hook 'kill-buffer-query-functions #'server-kill-buffer-query-function)) (add-hook 'server-visit-hook #'server-remove-kill-buffer-hook) -;; whitespace-mode settings +;; `whitespace-mode' (setq whitespace-line-column nil whitespace-style '(face indentation tabs tab-mark spaces space-mark newline newline-mark From 09cb4f6716129bb8267c0812eb1ea2ed3f194430 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:46:11 +0200 Subject: [PATCH 1405/4235] Major refactor & optimization of how modules load their packages Now that we are loading package autoloads files (as part of the generated doom-package-autoload-file when running make autoloads), many :commands properties are redundant. In fact, many def-package! blocks are redundant. In some cases, we can do without a config.el file entirely, and can move into the autoloads file or rely entirely on package autoloads. Also, many settings have been moved in their module's autoloads files, which makes them available ASAP; their use no longer depends on module load order. This gained me a modest ~10% boost in startup speed. --- modules/collab/impatient-mode/autoload.el | 3 +- modules/collab/impatient-mode/config.el | 6 -- modules/completion/company/config.el | 25 ++---- modules/completion/helm/config.el | 3 +- modules/completion/ivy/autoload/ivy.el | 6 +- modules/completion/ivy/config.el | 5 +- modules/config/default/config.el | 9 ++ modules/feature/debugger/config.el | 3 +- modules/feature/eval/config.el | 7 +- modules/feature/evil/autoload/evil.el | 20 +++++ modules/feature/evil/config.el | 38 +-------- modules/feature/lookup/autoload/devdocs.el | 11 +++ modules/feature/lookup/autoload/docsets.el | 40 +++++++++ modules/feature/lookup/config.el | 83 +++++-------------- modules/feature/snippets/config.el | 36 ++++---- modules/feature/snippets/doctor.el | 7 -- modules/feature/spellcheck/config.el | 2 +- modules/feature/spellcheck/packages.el | 14 ++-- modules/feature/syntax-checker/config.el | 22 ++--- modules/feature/version-control/+git.el | 17 +--- modules/feature/workspaces/config.el | 2 +- .../workspaces/test/autoload-workspaces.el | 1 + modules/lang/assembly/autoload.el | 4 + modules/lang/assembly/config.el | 8 -- modules/lang/cc/autoload.el | 7 -- modules/lang/cc/config.el | 34 ++++---- modules/lang/cc/doctor.el | 6 +- modules/lang/clojure/config.el | 10 +-- modules/lang/crystal/config.el | 6 +- modules/lang/csharp/config.el | 9 +- modules/lang/data/config.el | 43 +++------- modules/lang/elixir/config.el | 31 ++++--- modules/lang/elm/config.el | 15 ++-- modules/lang/emacs-lisp/autoload.el | 8 ++ modules/lang/emacs-lisp/config.el | 33 +++----- modules/lang/erlang/config.el | 22 +++-- modules/lang/ess/config.el | 6 +- modules/lang/go/config.el | 30 ++----- modules/lang/haskell/config.el | 15 +--- modules/lang/hy/config.el | 4 +- modules/lang/java/config.el | 4 +- modules/lang/javascript/config.el | 74 ++++++----------- modules/lang/julia/config.el | 1 - modules/lang/latex/config.el | 3 - modules/lang/ledger/config.el | 8 +- modules/lang/lua/config.el | 21 +---- modules/lang/markdown/config.el | 4 +- modules/lang/nim/config.el | 20 +---- modules/lang/nix/config.el | 4 - modules/lang/ocaml/config.el | 8 +- modules/lang/org/config.el | 8 +- modules/lang/plantuml/config.el | 2 +- modules/lang/purescript/config.el | 10 ++- modules/lang/python/config.el | 3 +- modules/lang/rest/config.el | 5 +- modules/lang/ruby/config.el | 27 ++---- modules/lang/rust/config.el | 12 +-- modules/lang/scala/config.el | 22 +++-- modules/lang/sh/config.el | 14 ++-- modules/lang/swift/config.el | 15 ++-- modules/lang/swift/packages.el | 3 + modules/lang/web/+css.el | 32 +++---- modules/lang/web/+html.el | 12 +-- modules/lang/web/packages.el | 6 +- modules/tools/editorconfig/config.el | 11 ++- modules/tools/ein/autoload.el | 30 ++++--- modules/tools/ein/config.el | 62 +++++++------- modules/tools/electric-indent/config.el | 22 ++--- modules/tools/eshell/config.el | 4 +- modules/tools/gist/config.el | 4 +- modules/tools/imenu/config.el | 9 +- modules/tools/magit/config.el | 9 +- modules/tools/password-store/config.el | 27 +++--- modules/tools/password-store/packages.el | 2 +- modules/tools/pdf/config.el | 3 +- modules/tools/prodigy/autoload.el | 20 +++++ modules/tools/prodigy/config.el | 27 +----- modules/tools/rgb/config.el | 3 - modules/tools/rotate-text/autoload.el | 17 ++++ modules/tools/rotate-text/config.el | 22 +---- modules/tools/term/config.el | 18 ++-- modules/ui/doom-dashboard/config.el | 21 ++--- modules/ui/doom-modeline/config.el | 11 +-- modules/ui/doom/config.el | 7 +- modules/ui/evil-goggles/config.el | 2 +- modules/ui/nav-flash/config.el | 2 +- modules/ui/popup/autoload.el | 68 +++++++++++++++ modules/ui/popup/init.el | 61 -------------- modules/ui/unicode/autoload.el | 23 +++++ modules/ui/unicode/config.el | 19 ----- modules/ui/vi-tilde-fringe/autoload.el | 4 + modules/ui/vi-tilde-fringe/config.el | 6 -- modules/ui/window-select/config.el | 7 +- 93 files changed, 644 insertions(+), 846 deletions(-) delete mode 100644 modules/collab/impatient-mode/config.el create mode 100644 modules/feature/lookup/autoload/devdocs.el create mode 100644 modules/feature/lookup/autoload/docsets.el delete mode 100644 modules/feature/snippets/doctor.el create mode 100644 modules/lang/assembly/autoload.el delete mode 100644 modules/lang/assembly/config.el delete mode 100644 modules/lang/nix/config.el create mode 100644 modules/tools/rotate-text/autoload.el delete mode 100644 modules/ui/popup/init.el create mode 100644 modules/ui/unicode/autoload.el delete mode 100644 modules/ui/unicode/config.el create mode 100644 modules/ui/vi-tilde-fringe/autoload.el delete mode 100644 modules/ui/vi-tilde-fringe/config.el diff --git a/modules/collab/impatient-mode/autoload.el b/modules/collab/impatient-mode/autoload.el index 3222b5477..41047d359 100644 --- a/modules/collab/impatient-mode/autoload.el +++ b/modules/collab/impatient-mode/autoload.el @@ -2,9 +2,8 @@ ;;;###autoload (defun +impatient-mode/toggle () - "TODO" + "Toggle `impatient-mode' in the current buffer." (interactive) - (require 'simple-httpd) (unless (process-status "httpd") (httpd-start)) (impatient-mode) diff --git a/modules/collab/impatient-mode/config.el b/modules/collab/impatient-mode/config.el deleted file mode 100644 index 0087bee52..000000000 --- a/modules/collab/impatient-mode/config.el +++ /dev/null @@ -1,6 +0,0 @@ -;;; collab/impatient-mode/config.el -*- lexical-binding: t; -*- - -;; Show off code as you write it - -(def-package! impatient-mode - :commands impatient-mode) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 12a1f352b..ec6113713 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -24,8 +24,7 @@ MODES should be one major-mode symbol or a list of them." ;; (def-package! company - :commands (company-mode global-company-mode company-complete - company-complete-common company-manual-begin company-grab-line) + :commands (company-complete-common company-manual-begin company-grab-line) :init (setq company-idle-delay nil company-tooltip-limit 14 @@ -48,7 +47,8 @@ MODES should be one major-mode symbol or a list of them." (def-package! company :when (featurep! +auto) - :defer pre-command-hook + :defer 2 + :after-call pre-command-hook :config (setq company-idle-delay 0.2)) @@ -73,27 +73,12 @@ MODES should be one major-mode symbol or a list of them." (def-package! company-dict - :commands company-dict + :defer t :config (defun +company|enable-project-dicts (mode &rest _) "Enable per-project dictionaries." (if (symbol-value mode) - (cl-pushnew mode company-dict-minor-mode-list :test #'eq) + (add-to-list 'company-dict-minor-mode-list mode #'eq) (setq company-dict-minor-mode-list (delq mode company-dict-minor-mode-list)))) (add-hook 'doom-project-hook #'+company|enable-project-dicts)) - -;; -;; Included with company.el -;; - -(autoload 'company-capf "company-capf") -(autoload 'company-dabbrev "company-dabbrev") -(autoload 'company-dabbrev-code "company-dabbrev-code") -(autoload 'company-elisp "company-elisp") -(autoload 'company-etags "company-etags") -(autoload 'company-files "company-files") -(autoload 'company-gtags "company-gtags") -(autoload 'company-ispell "company-ispell") -(autoload 'company-yasnippet "company-yasnippet") - diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index b4e6c5282..702208166 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -11,7 +11,8 @@ ;; (def-package! helm-mode - :defer (pre-command-hook . 1) + :defer 1 + :after-call pre-command-hook :config (helm-mode +1) ;; helm is too heavy for find-file-at-point diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index eef638f21..89ce56db5 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -116,9 +116,9 @@ If ARG (universal argument), open selection in other-window." "\\):?\\s-*\\(.+\\)") x) (error - (message! (red "Error matching task in file: (%s) %s" - (error-message-string ex) - (car (split-string x ":")))) + (print! (red "Error matching task in file: (%s) %s" + (error-message-string ex) + (car (split-string x ":")))) nil)) collect `((type . ,(match-string 3 x)) (desc . ,(match-string 4 x)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 51434fb26..9d3f3f705 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -24,7 +24,8 @@ immediately runs it on the current candidate (ending the ivy session)." ;; (def-package! ivy - :defer (pre-command-hook . 1) + :defer 1 + :after-call pre-command-hook :config (setq ivy-height 12 ivy-do-completion-in-region nil @@ -184,7 +185,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! wgrep - :commands (wgrep-setup wgrep-change-to-wgrep-mode) + :commands wgrep-change-to-wgrep-mode :config (setq wgrep-auto-save-buffer t)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 6d5ba386b..12bd8c5ec 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -35,6 +35,15 @@ (sp-pair "'" nil :unless unless-list) (sp-pair "\"" nil :unless unless-list)) + ;; Major-mode specific fixes + (sp-local-pair 'ruby-mode "{" "}" + :pre-handlers '(:rem sp-ruby-prehandler) + :post-handlers '(:rem sp-ruby-posthandler)) + ;; sp's default rules for these modes are obnoxious, so disable them + (provide 'smartparens-latex) + (provide 'smartparens-elixir) + (provide 'smartparens-lua) + ;; Expand {|} => { | } ;; Expand {|} => { ;; | diff --git a/modules/feature/debugger/config.el b/modules/feature/debugger/config.el index 1b7ef587d..78660ffa8 100644 --- a/modules/feature/debugger/config.el +++ b/modules/feature/debugger/config.el @@ -3,7 +3,8 @@ (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (set! :popup "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" '((size . 20))) + (set! :popup "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" + '((size . 20))) ;; TODO Temporary Ex commands for the debugger ;; (def-tmp-excmd! doom:def-debug-on doom:def-debug-off diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 72b086d15..1549eacb8 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -10,12 +10,7 @@ ;; (def-package! quickrun - :commands (quickrun - quickrun-region - quickrun-with-arg - quickrun-shell - quickrun-compile-only - quickrun-replace-region) + :defer t :init (unless (boundp 'display-line-numbers) (add-hook 'quickrun--mode-hook #'nlinum-mode)) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index f1c41106d..a04891154 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -1,6 +1,21 @@ ;; feature/evil/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) +;;;###autoload +(def-setting! :evil-state (modes state) + "Set the initialize STATE of MODE using `evil-set-initial-state'." + (let ((unquoted-modes (doom-unquote modes))) + (if (listp unquoted-modes) + `(progn + ,@(cl-loop for mode in unquoted-modes + collect `(evil-set-initial-state ',mode ,state))) + `(evil-set-initial-state ,modes ,state)))) + + +;; +;; Commands +;; + ;;;###autoload (defun +evil/visual-indent () "vnoremap < " evil-args-closers))) -(def-package! evil-indent-plus - :commands (evil-indent-plus-i-indent - evil-indent-plus-a-indent - evil-indent-plus-i-indent-up - evil-indent-plus-a-indent-up - evil-indent-plus-i-indent-up-down - evil-indent-plus-a-indent-up-down)) - - -(def-package! evil-textobj-anyblock - :commands (evil-textobj-anyblock-inner-block evil-textobj-anyblock-a-block)) - - ;; ;; Multiple cursors compatibility (for the plugins that use it) ;; diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el new file mode 100644 index 000000000..2b2c4a514 --- /dev/null +++ b/modules/feature/lookup/autoload/devdocs.el @@ -0,0 +1,11 @@ +;;; feature/lookup/autoload/devdocs.el -*- lexical-binding: t; -*- +;;;###if (featurep! +devdocs) + +;;;###autoload +(def-setting! :devdocs (modes docset) + "Map major MODES (one major-mode symbol or a list of them) to a devdocs +DOCSET (a string). + +See `devdocs-alist' for the defaults. " + `(dolist (mode ',modes) + (push (cons mode ,docset) devdocs-alist))) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el new file mode 100644 index 000000000..89fef163c --- /dev/null +++ b/modules/feature/lookup/autoload/docsets.el @@ -0,0 +1,40 @@ +;;; feature/lookup/autoload/docsets.el -*- lexical-binding: t; -*- +;;;###if (featurep! +docsets) + +;;;###autoload +(def-setting! :docset (modes &rest docsets) + "Registers a list of DOCSETS (strings) for MODES (either one major mode +symbol or a list of them). + +If MODES is a minor mode, you can use :add or :remove as the first element of +DOCSETS, to instruct it to append (or remove) those from the docsets already set +by a major-mode, if any. + +Used by `+lookup/in-docsets' and `+lookup/documentation'." + (let* ((modes (doom-unquote modes)) + (ivy-p (featurep! :completion ivy)) + (hook-sym (intern (format "+lookup|%s-docsets--%s" + (cond ((eq ',(car docsets) :add) 'add) + ((eq ',(car docsets) :remove) 'remove) + ('set)) + (string-join docsets "-")))) + (var-sym (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets))) + `(progn + (defun ,hook-sym () + (make-variable-buffer-local ',var-sym) + ,(cond ((eq ',(car docsets) :add) + `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) + ((eq ',(car docsets) :remove) + `(setq ,var-sym + (cl-loop with to-delete = (list ,@(cdr docsets)) + for docset in ,var-sym + unless (member docset to-delete) + collect docset))) + (`(setq ,var-sym (list ,@docsets))))) + (add-hook! ,modes #',hook-sym)))) + +;;;###autoload +(autoload 'helm-dash-installed-docsets "helm-dash") + +;;;###autoload +(autoload 'helm-dash-docset-installed-p "helm-dash") diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index b693f44bc..bbabb689a 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -122,33 +122,29 @@ ones." ;; (def-package! dumb-jump - :commands (dumb-jump-go dumb-jump-quick-look - dumb-jump-back dumb-jump-result-follow) + :commands dumb-jump-result-follow :config (setq dumb-jump-default-project doom-emacs-dir dumb-jump-aggressive nil dumb-jump-selector (cond ((featurep! :completion ivy) 'ivy) ((featurep! :completion helm) 'helm) - (t 'popup)))) + ('popup)))) ;; ;; xref ;; -(def-package! xref - :commands (xref-backend-identifier-at-point xref-find-definitions xref-find-references) - :config - ;; By default, `etags--xref-backend' is the default xref backend. No need. - ;; We'll set these up ourselves in other modules. - (setq-default xref-backend-functions '(t)) +;; By default, `etags--xref-backend' is the default xref backend. No need. We'll +;; set these up ourselves in other modules. +(setq-default xref-backend-functions '(t)) - ;; ...however, it breaks `projectile-find-tag', unless we put it back. - (defun +lookup*projectile-find-tag (orig-fn) - (let ((xref-backend-functions '(etags--xref-backend t))) - (funcall orig-fn))) - (advice-add #'projectile-find-tag :around #'+lookup*projectile-find-tag)) +;; ...however, it breaks `projectile-find-tag', unless we put it back. +(defun +lookup*projectile-find-tag (orig-fn) + (let ((xref-backend-functions '(etags--xref-backend t))) + (funcall orig-fn))) +(advice-add #'projectile-find-tag :around #'+lookup*projectile-find-tag) (def-package! ivy-xref @@ -168,41 +164,9 @@ ones." ;; (when (featurep! +docsets) - (def-setting! :docset (modes &rest docsets) - "Registers a list of DOCSETS (strings) for MODES (either one major mode -symbol or a list of them). - -If MODES is a minor mode, you can use :add or :remove as the first element of -DOCSETS, to instruct it to append (or remove) those from the docsets already set -by a major-mode, if any. - -Used by `+lookup/in-docsets' and `+lookup/documentation'." - (let* ((modes (doom-unquote modes)) - (ivy-p (featurep! :completion ivy)) - (hook-sym (intern (format "+lookup|%s-docsets--%s" - (cond ((eq ',(car docsets) :add) 'add) - ((eq ',(car docsets) :remove) 'remove) - ('set)) - (string-join docsets "-")))) - (var-sym (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets))) - `(progn - (defun ,hook-sym () - (make-variable-buffer-local ',var-sym) - ,(cond ((eq ',(car docsets) :add) - `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) - ((eq ',(car docsets) :remove) - `(setq ,var-sym - (cl-loop with to-delete = (list ,@(cdr docsets)) - for docset in ,var-sym - unless (member docset to-delete) - collect docset))) - (`(setq ,var-sym (list ,@docsets))))) - (add-hook! ,modes #',hook-sym)))) - ;; Both packages depend on helm-dash (def-package! helm-dash - :commands (helm-dash helm-dash-install-docset helm-dash-at-point - helm-dash-docset-installed-p helm-dash-installed-docsets) + :defer t :init (setq helm-dash-enable-debugging doom-debug-mode helm-dash-browser-func #'eww) @@ -214,7 +178,7 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (def-package! counsel-dash :when (featurep! :completion ivy) - :commands (counsel-dash counsel-dash-install-docset) + :commands counsel-dash-install-docset :config (setq counsel-dash-min-length 2))) @@ -223,20 +187,11 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." ;; (when (featurep! +devdocs) - (def-setting! :devdocs (modes docset) - "Map major MODES (one major-mode symbol or a list of them) to a devdocs -DOCSET (a string). - -See `devdocs-alist' for the defaults. " - `(dolist (mode ',modes) - (push (cons mode ,docset) devdocs-alist))) - - (def-package! devdocs-lookup - :commands (devdocs-setup devdocs-lookup) - :config - (setq devdocs-subjects - (append '(("SCSS" "scss") - ("GFM" "markdown") - ("Typescript" "typescript")) - devdocs-subjects)))) + (after! devdocs-lookup + (unless (assoc "SCSS" devdocs-subjects) + (setq devdocs-subjects + (append '(("SCSS" "scss") + ("GFM" "markdown") + ("Typescript" "typescript")) + devdocs-subjects))))) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index a9acfadd6..33757e31e 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -1,9 +1,16 @@ ;;; feature/snippets/config.el -*- lexical-binding: t; -*- +(defvar +snippets-dir (expand-file-name "snippets/" doom-private-dir) + "Directory where `yasnippet' will search for your private snippets.") + + +;; +;; Plugins +;; + (def-package! yasnippet - :commands (yas-minor-mode yas-minor-mode-on yas-expand yas-expand-snippet - yas-lookup-snippet yas-insert-snippet yas-new-snippet - yas-visit-snippet-file snippet-mode) + :commands (yas-minor-mode-on yas-expand yas-expand-snippet yas-lookup-snippet + yas-insert-snippet yas-new-snippet yas-visit-snippet-file) :preface (defvar yas-minor-mode-map (let ((map (make-sparse-keymap))) @@ -23,28 +30,25 @@ (setq yas-verbosity (if doom-debug-mode 3 0) yas-also-auto-indent-first-line t yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) - ;; Allow nested snippets - yas-triggers-in-field t) + yas-triggers-in-field t) ; Allow nested snippets - (cl-pushnew (expand-file-name "snippets/" doom-private-dir) yas-snippet-dirs - :test #'string=) + (add-to-list 'yas-snippet-dirs '+snippets-dir nil #'eq) (defun +snippets|enable-project-modes (mode &rest _) - "Enable snippets for project modes." + "Automatically enable snippet libraries for project minor modes defined with +`def-project-mode!'." (if (symbol-value mode) (yas-activate-extra-mode mode) (yas-deactivate-extra-mode mode))) (add-hook 'doom-project-hook #'+snippets|enable-project-modes) - ;; fix an error caused by smartparens interfering with yasnippet bindings - (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay) - ;; Exit snippets on ESC from normal mode - (add-hook 'doom-escape-hook #'yas-abort-snippet)) + (add-hook 'doom-escape-hook #'yas-abort-snippet) + + (after! smartparens + ;; fix an error caused by smartparens interfering with yasnippet bindings + (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay))) -(def-package! auto-yasnippet - :commands (aya-create aya-expand aya-open-line aya-persist-snippet) - :config +(after! auto-yasnippet (setq aya-persist-snippets-dir (concat doom-local-dir "auto-snippets/"))) - diff --git a/modules/feature/snippets/doctor.el b/modules/feature/snippets/doctor.el deleted file mode 100644 index 8ba004a36..000000000 --- a/modules/feature/snippets/doctor.el +++ /dev/null @@ -1,7 +0,0 @@ -;; -*- lexical-binding: t; no-byte-compile: t; -*- -;;; feature/snippets/doctor.el - -(require 'yasnippet) -(unless (ignore-errors (yas-reload-all) - (yas--get-snippet-tables)) - (warn! "Couldn't find any snippets in any of these directories: %s" yas-snippet-dirs)) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index c1f8b3bb6..2cc8dadb6 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -8,7 +8,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") (def-package! flyspell ; built-in - :commands flyspell-mode + :defer t :init (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) :config diff --git a/modules/feature/spellcheck/packages.el b/modules/feature/spellcheck/packages.el index bb01a00ba..97172953f 100644 --- a/modules/feature/spellcheck/packages.el +++ b/modules/feature/spellcheck/packages.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/spellcheck/packages.el -(package! flyspell-correct) -(cond ((featurep! :completion ivy) - (package! flyspell-correct-ivy)) - ((featurep! :completion helm) - (package! flyspell-correct-helm)) - (t - (package! flyspell-correct-popup))) +(when (package! flyspell-correct) + (cond ((featurep! :completion ivy) + (package! flyspell-correct-ivy)) + ((featurep! :completion helm) + (package! flyspell-correct-helm)) + (t + (package! flyspell-correct-popup)))) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 29048618e..9bdc0b5fa 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -1,18 +1,11 @@ ;;; feature/syntax-checker/config.el -*- lexical-binding: t; -*- -;; Since Doom doesn't use `package-initialize', pkg-info won't get autoloaded -;; when `flycheck-version' needs it, so we need this: -(autoload 'pkg-info-version-info "pkg-info") - (def-package! flycheck - :commands (flycheck-mode flycheck-list-errors flycheck-buffer) + :commands (flycheck-list-errors flycheck-buffer) :config ;; Emacs feels snappier without checks on newline (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) - ;; Popup - (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode) - (after! evil (defun +syntax-checkers|flycheck-buffer () "Flycheck buffer on ESC in normal mode." @@ -20,21 +13,16 @@ (ignore-errors (flycheck-buffer)) nil)) (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) - (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer) - - ;; With the option of flychecking the buffer on escape or leaving insert - ;; mode, we don't need auto-flychecking on idle-change (which can feel slow, - ;; esp on computers without SSDs). - (delq 'idle-change flycheck-check-syntax-automatically))) + (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer))) (def-package! flycheck-popup-tip - :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup)) + :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) + :init (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode)) (def-package! flycheck-posframe - :when EMACS26+ - :when (featurep! +childframe) + :when (and EMACS26+ (featurep! +childframe)) :commands flycheck-posframe-show-posframe :config (setq flycheck-posframe-warning-prefix "⚠ " diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 88d610089..8488f9076 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,10 +1,5 @@ ;;; feature/version-control/+git.el -*- lexical-binding: t; -*- -;; These don't need `def-package!' blocks because they've already been set up by -;; `doom-initialize'. -(autoload 'gitconfig-mode "gitconfig-mode" nil t) -(autoload 'gitignore-mode "gitignore-mode" nil t) - (when (featurep! :feature evil) (add-hook 'git-commit-mode-hook #'evil-insert-state)) @@ -59,7 +54,7 @@ (def-package! git-timemachine - :commands (git-timemachine git-timemachine-toggle) + :defer t :config ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of ;; showing revision details in the minibuffer, show them in @@ -67,10 +62,6 @@ (setq git-timemachine-show-minibuffer-details t) (advice-add #'git-timemachine--show-minibuffer-details :override #'+vcs*update-header-line) - ;; Force evil to rehash keybindings for the current state - (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state)) - - -(def-package! git-link - :commands (git-link git-link-commit git-link-homepage)) - + (after! evil + ;; Force evil to rehash keybindings for the current state + (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state))) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 4b6d1f4b4..bc1467bcf 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -27,7 +27,7 @@ new project directory.") stored in `persp-save-dir'.") (defun +workspaces-restore-last-session (&rest _) - (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) + (add-hook 'doom-post-init-hook #'+workspace/load-session 'append)) (map-put command-switch-alist '"--restore" #'+workspaces-restore-last-session) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index e7cc2e9bd..6367400ed 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -2,6 +2,7 @@ ;;; feature/workspaces/test/autoload-workspaces.el (require! :feature workspaces) +(doom|init-custom-hooks) (defmacro with-workspace!! (buffer-args &rest body) (declare (indent defun)) diff --git a/modules/lang/assembly/autoload.el b/modules/lang/assembly/autoload.el new file mode 100644 index 000000000..38b582a66 --- /dev/null +++ b/modules/lang/assembly/autoload.el @@ -0,0 +1,4 @@ +;;; lang/assembly/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(map-put auto-mode-alist "\\.hax\\'" 'haxor-mode) diff --git a/modules/lang/assembly/config.el b/modules/lang/assembly/config.el deleted file mode 100644 index 98b879b24..000000000 --- a/modules/lang/assembly/config.el +++ /dev/null @@ -1,8 +0,0 @@ -;;; lang/assembly/config.el -*- lexical-binding: t; -*- - -(def-package! mips-mode :mode "\\.mips$") - -(def-package! haxor-mode :mode "\\.hax$") - -(def-package! nasm-mode :commands nasm-mode) - diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index cf6580425..f063cf11c 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -89,13 +89,6 @@ compilation dbs." nconc (list "-I" path))) (doom-project-root))))) -;;;###autoload -(defun +cc|init-rtags () - "Start an rtags server in c-mode and c++-mode buffers." - (when (and (memq major-mode '(c-mode c++-mode)) - (rtags-executable-find "rtags")) - (rtags-start-process-unless-running))) - ;;;###autoload (defun +cc|cleanup-rtags () "Kill rtags server(s) if there are no C/C++ buffers open." diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 0077083c1..cb02a6558 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -55,10 +55,10 @@ compilation database is present in the project.") :config (set! :electric '(c-mode c++-mode objc-mode java-mode) - :chars '(?\n ?\})) + :chars '(?\n ?\})) (set! :company-backend - '(c-mode c++-mode objc-mode) - '(company-irony-c-headers company-irony)) + '(c-mode c++-mode objc-mode) + '(company-irony-c-headers company-irony)) ;;; Style/formatting ;; C/C++ style settings @@ -101,8 +101,8 @@ compilation database is present in the project.") (label . 0)))) ;;; Keybindings - ;; Completely disable electric keys because it interferes with smartparens and - ;; custom bindings. We'll do this ourselves. + ;; Disable electric keys because it interferes with smartparens and custom + ;; bindings. We'll do it ourselves (mostly). (setq c-tab-always-indent nil c-electric-flag nil) (dolist (key '("#" "}" "/" "*" ";" "," ":" "(" ")" "\177")) @@ -129,6 +129,7 @@ compilation database is present in the project.") (def-package! irony + :when (featurep! +irony) :commands (irony-install-server irony-mode) :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) @@ -172,23 +173,13 @@ compilation database is present in the project.") ;; (def-package! cmake-mode - :mode "/CMakeLists\\.txt$" - :mode "\\.cmake\\$" + :defer t :config (set! :company-backend 'cmake-mode '(company-cmake company-yasnippet))) -(def-package! cuda-mode :mode "\\.cuh?$") +(def-package! opencl-mode :mode "\\.cl\\'") -(def-package! opencl-mode :mode "\\.cl$") - -(def-package! demangle-mode - :hook llvm-mode) - -(def-package! glsl-mode - :mode "\\.glsl$" - :mode "\\.vert$" - :mode "\\.frag$" - :mode "\\.geom$") +(def-package! demangle-mode :hook llvm-mode) ;; @@ -213,7 +204,12 @@ compilation database is present in the project.") (def-package! rtags :commands rtags-executable-find :init - (add-hook! (c-mode c++-mode) #'+cc|init-rtags) + (defun +cc|init-rtags () + "Start an rtags server in c-mode and c++-mode buffers." + (when (and (memq major-mode '(c-mode c++-mode)) + (rtags-executable-find "rtags")) + (rtags-start-process-unless-running))) + (add-hook 'c-mode-common-hook #'+cc|init-rtags) :config (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil diff --git a/modules/lang/cc/doctor.el b/modules/lang/cc/doctor.el index 442798ce4..5f9799ecf 100644 --- a/modules/lang/cc/doctor.el +++ b/modules/lang/cc/doctor.el @@ -7,9 +7,9 @@ (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins))) ;; irony server -(require 'irony) -(unless (file-directory-p irony-server-install-prefix) - (warn! "Irony server isn't installed. Run M-x irony-install-server")) +(when (require 'irony nil t) + (unless (file-directory-p irony-server-install-prefix) + (warn! "Irony server isn't installed. Run M-x irony-install-server"))) (when (featurep! :completion company) ;; glslangValidator diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 53a18eded..e78813ef5 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,13 +1,7 @@ ;;; lang/clojure/config.el -*- lexical-binding: t; -*- -(def-package! clojure-mode - :mode "\\.clj$" - :mode "\\.edn$" - :mode "\\(?:build\\|profile\\)\\.boot$" - :mode ("\\.cljs$" . clojurescript-mode) - :mode ("\\.cljc$" . clojurec-mode) - :config - (add-hook 'clojure-mode #'rainbow-delimiters-mode)) +;; `clojure-mode' +(add-hook 'clojure-mode #'rainbow-delimiters-mode) (def-package! clj-refactor diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index f1b765e72..717a4137c 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -1,8 +1,7 @@ ;;; lang/crystal/config.el -*- lexical-binding: t; -*- (def-package! crystal-mode - :mode "\\.cr$" - :interpreter "crystal" + :defer t :config (set! :lookup 'crystal-mode :definition #'crystal-def-jump @@ -19,5 +18,4 @@ :config (add-hook 'crystal-mode-hook #'flycheck-mode)) -(def-package! inf-crystal - :commands (inf-crystal crystal-switch-to-inf)) +(def-package! inf-crystal :commands crystal-switch-to-inf) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 306f93b12..c7ecabe28 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,17 +1,16 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- -(def-package! csharp-mode :mode "\\.cs$") - -(def-package! shader-mode :mode "\\.shader$") ; unity shaders +(add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) ; unity shaders (def-package! omnisharp - :after csharp-mode + :hook (csharp-mode . omnisharp-mode) + :commands omnisharp-install-server :preface (setq omnisharp-auto-complete-want-documentation nil omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (add-hook! csharp-mode #'(flycheck-mode omnisharp-mode)) + (add-hook 'csharp-mode-hook #'flycheck-mode) (defun +csharp|cleanup-omnisharp-server () "Clean up the omnisharp server once you kill the last csharp-mode buffer." diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 60b1af9b2..77e9723de 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -1,47 +1,30 @@ ;;; lang/data/config.el -*- lexical-binding: t; -*- -(push '("/sxhkdrc" . conf-mode) auto-mode-alist) +;; Built in plugins +(dolist (spec '(("/sxhkdrc\\'" . conf-mode) + ("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) + ("\\.plist\\'" . nxml-mode))) + (map-put auto-mode-alist (car spec) (cdr spec))) + +(set! :company-backend 'nxml-mode '(company-nxml company-yasnippet)) -(def-package! dockerfile-mode - :mode "/Dockerfile$") - +;; +;; Third-party plugins +;; (def-package! graphql-mode - :mode "\\.g\\(?:raph\\)?ql$") - - -(def-package! hexl ; For ROM hacking or debugging - :mode ("\\.hex$" . hexl-mode) - :mode ("\\.nes$" . hexl-mode)) - + :mode "\\.gql\\'") (def-package! json-mode - :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)$" + :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)\\'" :config (when (featurep! :feature syntax-checker) (add-hook 'json-mode-hook #'flycheck-mode)) (set! :electric 'json-mode :chars '(?\n ?: ?{ ?}))) - -(def-package! nxml-mode - :mode "\\.plist$" - :config - (set! :company-backend 'nxml-mode '(company-nxml company-yasnippet))) - - -(def-package! toml-mode - :mode "\\.toml$") - - (def-package! vimrc-mode - :mode "/\\.?g?vimrc$" - :mode "\\.vimp?$" - :mode "\\.?vimperatorrc$") - - -(def-package! yaml-mode - :mode "\\.ya?ml$") + :mode "\\.?vimperatorrc\\'") ;; diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 590bb545a..6afd25471 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -1,21 +1,18 @@ ;;; lang/elixir/config.el -*- lexical-binding: t; -*- (def-package! elixir-mode - :mode "\\.exs?\\'" - :mode "\\.elixir2\\'" - :init - ;; sp's default elixir rules are obnoxious, so disable them - (provide 'smartparens-elixir) + :defer t :config ;; ...and only complete the basics - (sp-with-modes 'elixir-mode - (sp-local-pair "do" "end" - :when '(("RET" "")) - :unless '(sp-in-comment-p sp-in-string-p) - :skip-match 'sp-elixir-skip-def-p - :post-handlers '("||\n[i]")) - (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) - (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) + (after! smartparens + (sp-with-modes 'elixir-mode + (sp-local-pair "do" "end" + :when '(("RET" "")) + :unless '(sp-in-comment-p sp-in-string-p) + :skip-match 'sp-elixir-skip-def-p + :post-handlers '("||\n[i]")) + (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) + (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p))))) (def-package! alchemist @@ -30,13 +27,13 @@ (def-package! alchemist-company :when (featurep! :completion company) - :after elixir-mode + :commands alchemist-company + :init + (set! :company-backend 'elixir-mode '(alchemist-company company-yasnippet)) :config ;; Alchemist doesn't use hook symbols to add these backends, so we have to use ;; the entire closure to get rid of it. (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) (remove-hook 'alchemist-mode-hook fn) - (remove-hook 'alchemist-iex-mode-hook fn)) - - (set! :company-backend 'elixir-mode '(alchemist-company company-yasnippet))) + (remove-hook 'alchemist-iex-mode-hook fn))) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 6bc5f9c00..6cf23914d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -1,13 +1,12 @@ ;;; lang/elm/config.el -*- lexical-binding: t; -*- -(def-package! elm-mode - :mode "\\.elm$" - :config - (load "elm-mode-autoloads" nil t) - (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :company-backend 'elm-mode '(company-elm)) - (set! :repl 'elm-mode #'run-elm-interactive) - (setq elm-format-on-save t)) +;; `elm-mode' +(setq elm-format-on-save t) + +(add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + +(set! :company-backend 'elm-mode 'company-elm) +(set! :repl 'elm-mode #'run-elm-interactive) (def-package! flycheck-elm diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 05e3b6e96..4071df3f1 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -1,5 +1,13 @@ ;;; lang/emacs-lisp/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(autoload 'overseer-test "overseer" nil t) + + +;; +;; Library +;; + ;;;###autoload (defun +emacs-lisp/repl () "Open the Emacs Lisp REPL (`ielm')." diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 20033e171..97172e8b6 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -67,27 +67,17 @@ ;; Plugins ;; -(def-package! auto-compile - :commands auto-compile-on-save-mode - :config - (setq auto-compile-display-buffer nil - auto-compile-use-mode-line nil)) +;; `auto-compile' +(setq auto-compile-display-buffer nil + auto-compile-use-mode-line nil) -(def-package! highlight-quoted - :commands highlight-quoted-mode) +;; `slime' +(setq inferior-lisp-program "clisp") +(after! slime (require 'slime-fuzzy)) -(def-package! slime - :defer t - :config - (setq inferior-lisp-program "clisp") - (require 'slime-fuzzy)) - - -(def-package! macrostep - :commands macrostep-expand - :config +(after! macrostep (map! :map macrostep-keymap :n "RET" #'macrostep-expand :n "e" #'macrostep-expand @@ -104,6 +94,7 @@ :n "q" #'macrostep-collapse-all :n "C" #'macrostep-collapse-all) + ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't ;; apply for the very first invocation (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps)) @@ -111,18 +102,14 @@ (def-package! flycheck-cask :when (featurep! :feature syntax-checker) - :commands flycheck-cask-setup + :defer t :init (add-hook! 'emacs-lisp-mode-hook (add-hook 'flycheck-mode-hook #'flycheck-cask-setup nil t))) -(def-package! overseer - :commands overseer-test) - - -;; ;; +;; Project modes ;; (def-project-mode! +emacs-lisp-ert-mode diff --git a/modules/lang/erlang/config.el b/modules/lang/erlang/config.el index 8a180d37a..933c455f4 100644 --- a/modules/lang/erlang/config.el +++ b/modules/lang/erlang/config.el @@ -1,20 +1,19 @@ ;;; private/erlang/config.el -*- lexical-binding: t; -*- -(def-package! erlang - ;; customizations - :mode "\\.erlang$" - ;; rebar files - :mode "/rebar\\.config\\(?:\\.script\\)?$" - ;; erlang configs - :mode "/\\(?:app\\|sys\\)\\.config$") +(dolist (regexp '("\\.erlang$" + ;; rebar files + "/rebar\\.config\\(?:\\.script\\)?$" + ;; erlang configs + "/\\(?:app\\|sys\\)\\.config$")) + (map-put auto-mode-alist regexp 'erlang-mode)) + (def-package! flycheck-rebar3 :when (featurep! :feature syntax-checker) - :after erlang - :config - (flycheck-rebar3-setup)) + :after flycheck + :config (flycheck-rebar3-setup)) + -;; Completion via Ivy (def-package! ivy-erlang-complete :when (featurep! :completion ivy) :hook (erlang-mode . ivy-erlang-complete-init) @@ -23,7 +22,6 @@ (add-hook 'after-save-hook #'ivy-erlang-complete-reparse nil t))) -;; Completion via Company (def-package! company-erlang :when (featurep! :completion company) :hook (erlang-mode . company-erlang-init)) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index e08657a08..a1fc837b2 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -79,6 +79,6 @@ :n "cn" #'ess-noweb-next-chunk)))) -(def-package! ess-smart-equals - :hook ((ess-mode . ess-smart-equals-mode) - (inferior-ess-mode . ess-smart-equals-mode))) +;; `ess-smart-equals-mode' +(add-hook! (ess-mode inferior-ess) + #'ess-smart-equals-mode) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 34e4d57d5..f8e8c6050 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -4,10 +4,7 @@ ;; Plugins ;; -(def-package! go-mode - :mode "\\.go$" - :interpreter "go" - :config +(after! go-mode (set! :env "GOPATH" "GOROOT") (set! :repl 'go-mode #'gorepl-run) (set! :lookup 'go-mode @@ -15,11 +12,12 @@ :references #'go-guru-referrers :documentation #'godoc-at-point) - (when (executable-find "goimports") - (setq gofmt-command "goimports")) + (when-let* ((goimports (executable-find "goimports"))) + (setq gofmt-command goimports)) (setq gofmt-show-errors nil) ; Leave it to flycheck - (add-hook 'go-mode-hook #'flycheck-mode) + + (add-hook! 'go-mode-hook #'(flycheck-mode go-eldoc-setup)) (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t)) @@ -70,25 +68,13 @@ :v "r" #'go-play-region)) -(def-package! go-eldoc - :hook (go-mode . go-eldoc-setup)) - - -(def-package! go-guru - :commands (go-guru-describe go-guru-freevars go-guru-implements go-guru-peers - go-guru-referrers go-guru-definition go-guru-pointsto - go-guru-callstack go-guru-whicherrs go-guru-callers go-guru-callees - go-guru-expand-region)) - - (def-package! gorepl-mode - :commands (gorepl-run gorepl-run-load-current-file)) + :commands gorepl-run-load-current-file) (def-package! company-go :when (featurep! :completion company) - :init (setq command-go-gocode-command "gocode") :after go-mode :config - (setq company-go-show-annotation t) - (set! :company-backend 'go-mode '(company-go))) + (set! :company-backend 'go-mode 'company-go) + (setq company-go-show-annotation t)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index a97fa9bff..559b244aa 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -8,18 +8,7 @@ ;; Common plugins ;; -(def-package! haskell-mode - :mode "\\.hs$" - :mode ("\\.ghci$" . ghci-script-mode) - :mode ("\\.cabal$" . haskell-cabal-mode) - :interpreter (("runghc" . haskell-mode) - ("runhaskell" . haskell-mode)) - :config - (load "haskell-mode-autoloads" nil t) +(after! haskell-mode (set! :repl 'haskell-mode #'switch-to-haskell) - (push ".hi" completion-ignored-extensions) - - (autoload 'switch-to-haskell "inf-haskell" nil t) - (after! inf-haskell - (map! :map inferior-haskell-mode-map "ESC ESC" #'+popup/close))) + (add-to-list 'completion-ignored-extensions ".hi")) diff --git a/modules/lang/hy/config.el b/modules/lang/hy/config.el index bc106c784..bd24be0da 100644 --- a/modules/lang/hy/config.el +++ b/modules/lang/hy/config.el @@ -1,8 +1,8 @@ ;;; lang/hy/config.el -*- lexical-binding: t; -*- (def-package! hy-mode - :mode "\\.hy$" + :mode "\\.hy\\'" :interpreter "hy" :config (set! :repl 'hy-mode #'hy-shell-start-or-switch-to-shell) - (set! :company-backend 'hy-mode '(company-hy))) + (set! :company-backend 'hy-mode 'company-hy)) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 8be32f44c..5ace2680a 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -3,8 +3,8 @@ (add-hook 'java-mode-hook #'rainbow-delimiters-mode) (cond ((featurep! +meghanada) (load! +meghanada)) - ;; TODO lang/java +eclim - ;; ((featurep! +eclim) (load! +eclim)) + ;; TODO lang/java +lsp (lsp-java?) + ;; ((featurep! +lsp) (load! +lsp)) ) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index ff5991288..c5721ff22 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -22,6 +22,7 @@ (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set! :electric 'js2-mode :chars '(?\} ?\) ?. ?:)) + (set! :repl 'js2-mode #'+javascript/repl) ;; Conform switch-case indentation to js2 normal indent (defvaralias 'js-switch-indent-offset 'js2-basic-offset) @@ -31,19 +32,10 @@ (map! :map js2-mode-map :localleader - :n "S" #'+javascript/skewer-this-buffer)) - - -(def-package! typescript-mode - :commands typescript-mode - :config - (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :electric 'typescript-mode - :chars '(?\} ?\)) :words '("||" "&&"))) + :n "S" #'+javascript/skewer-this-buffer)) (def-package! rjsx-mode - :commands rjsx-mode :mode "components/.+\\.js$" :init (defun +javascript-jsx-file-p () @@ -54,8 +46,7 @@ magic-mode-regexp-match-limit t) (progn (goto-char (match-beginning 1)) (not (sp-point-in-string-or-comment))))) - - (push '(+javascript-jsx-file-p . rjsx-mode) magic-mode-alist) + (map-put magic-mode-alist #'+javascript-jsx-file-p 'rjsx-mode) :config (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (add-hook! 'rjsx-mode-hook @@ -67,14 +58,19 @@ ;; However, the parser doesn't run immediately, so a fast typist can outrun ;; it, causing issues, so force it to parse. (defun +javascript|reparse (n) - ;; if n != 1, then rjsx-maybe-reparse will be run elsewhere + ;; if n != 1, rjsx-electric-gt calls rjsx-maybe-reparse itself (if (= n 1) (rjsx-maybe-reparse))) (advice-add #'rjsx-electric-gt :before #'+javascript|reparse)) -(def-package! coffee-mode - :defer t ; file extensions registered by autoloads file - :init (setq coffee-indent-like-python-mode t)) +(after! typescript-mode + (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (set! :electric 'typescript-mode + :chars '(?\} ?\)) :words '("||" "&&"))) + + +;; `coffee-mode' +(setq coffee-indent-like-python-mode t) ;; @@ -86,6 +82,7 @@ :hook (typescript-mode . tide-setup) :init (defun +javascript|init-tide-in-web-mode () + "Enable `tide-mode' if in a *.tsx file." (when (string= (file-name-extension (or buffer-file-name "")) "tsx") (tide-setup))) (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) @@ -156,12 +153,6 @@ :init (set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend)) -(def-package! nodejs-repl - :commands nodejs-repl - :init - (set! :repl 'js2-mode #'+javascript/repl)) - - (def-package! js2-refactor :commands (js2r-extract-function js2r-extract-method js2r-introduce-parameter @@ -174,51 +165,38 @@ js2r-debug-this js2r-forward-slurp js2r-forward-barf)) -(def-package! web-beautify - :commands web-beautify-js - :init - (map! :map* (json-mode js2-mode-map) :n "gQ" #'web-beautify-js)) - - (def-package! eslintd-fix - :commands (eslintd-fix-mode eslintd-fix) + :commands eslintd-fix :config (defun +javascript|set-flycheck-executable-to-eslint () (setq flycheck-javascript-eslint-executable eslintd-fix-executable)) (add-hook 'eslintd-fix-mode-hook #'+javascript|set-flycheck-executable-to-eslint)) -(def-package! skewer-mode - :commands (skewer-mode run-skewer) - :config - (map! :map skewer-mode-map +;; `skewer-mode' +(map! (:after skewer-mode + :map skewer-mode-map :localleader :n "sE" #'skewer-eval-last-expression :n "se" #'skewer-eval-defun - :n "sf" #'skewer-load-buffer)) + :n "sf" #'skewer-load-buffer) - -(def-package! skewer-css ; in skewer-mode - :commands skewer-css-mode - :config - (map! :map skewer-css-mode-map + (:after skewer-css + :map skewer-css-mode-map :localleader :n "se" #'skewer-css-eval-current-declaration :n "sr" #'skewer-css-eval-current-rule :n "sb" #'skewer-css-eval-buffer - :n "sc" #'skewer-css-clear-all)) + :n "sc" #'skewer-css-clear-all) - -(def-package! skewer-html ; in skewer-mode - :commands skewer-html-mode - :config - (map! :map skewer-html-mode-map + (:after skewer-html + :map skewer-html-mode-map :localleader :n "se" #'skewer-html-eval-tag)) -(def-package! skewer-repl - :commands skewer-repl) +;; `web-beautify' +(map! :map* (json-mode-map js2-mode-map) :n "gQ" #'web-beautify-js) ;; @@ -226,7 +204,7 @@ ;; (def-project-mode! +javascript-screeps-mode - :match "/screeps\\(-ai\\)?/.+$" + :match "/screeps\\(?:-ai\\)?/.+$" :modes (+javascript-npm-mode) :add-hooks (+javascript|init-screeps-mode) :on-load (load! +screeps)) diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 2656fd4c8..c7be5a650 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -1,7 +1,6 @@ ;;; lang/julia/config.el -*- lexical-binding: t; -*- (use-package julia-mode - :mode "\\.jl$" :interpreter "julia" :config (set! :repl 'julia-mode #'+julia/repl) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 29ecefa08..dd33daf0f 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -18,9 +18,6 @@ "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." `(setq +latex-bibtex-dir ,dir)) -;; sp's default latex rules are obnoxious, so disable them -(provide 'smartparens-latex) - ;; ;; Plugins diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 5db4e7c71..0df0dbc5f 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -1,8 +1,7 @@ ;;; lang/ledger/config.el -*- lexical-binding: t; -*- -(def-package! ledger-mode - :mode "\\.ledger$" - :config (setq ledger-clear-whole-transactions 1)) +;; `ledger-mode' +(setq ledger-clear-whole-transactions 1) (def-package! evil-ledger @@ -12,4 +11,5 @@ (def-package! flycheck-ledger :when (featurep! :feature syntax-checker) - :init (add-hook 'ledger-mode-hook #'flycheck-mode)) + :after ledger-mode + :config (add-hook 'ledger-mode-hook #'flycheck-mode)) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 9a2dece5a..d8557f3b3 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,18 +1,12 @@ ;;; lang/lua/config.el -*- lexical-binding: t; -*- -(def-package! lua-mode - :mode "\\.lua$" - :interpreter "lua" - :init - ;; sp's default lua rules are obnoxious, so disable them. Use snippets - ;; instead! - (provide 'smartparens-lua) - :config +(after! lua-mode (add-hook 'lua-mode-hook #'flycheck-mode) (set! :lookup 'lua-mode :documentation 'lua-search-documentation) (set! :electric 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) + (set! :company-backend 'lua-mode '(company-lua company-yasnippet)) (def-menu! +lua/build-menu "Build/compilation commands for `lua-mode' buffers." @@ -24,15 +18,8 @@ :n "b" #'+lua/build-menu)) -(def-package! company-lua - :after (:all company lua-mode) - :config - (set! :company-backend 'lua-mode '(company-lua company-yasnippet))) - - -(def-package! moonscript - :mode ("\\.moon$" . moonscript-mode) - :config (defvaralias 'moonscript-indent-offset 'tab-width)) +(after! moonscript + (defvaralias 'moonscript-indent-offset 'tab-width)) ;; diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index b45cbe084..0438171e0 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -1,9 +1,7 @@ ;;; lang/markdown/config.el -*- lexical-binding: t; -*- (def-package! markdown-mode - :mode "/README$" - :mode ("/README\\.md$" . gfm-mode) - :mode "\\.m\\(?:d\\|arkdown\\)$" + :mode ("/README\\(?:\\.\\(?:markdown\\|md\\)\\)?\\'" . gfm-mode) :init (setq markdown-enable-wiki-links t markdown-enable-math t diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 4beffb199..c43aab0aa 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -1,32 +1,20 @@ ;;; lang/nim/config.el -*- lexical-binding: t; -*- -(def-package! nim-mode - :mode "\\.nim\\'" - :mode ("\\.nim\\(ble\\|s\\)\\'" . nimscript-mode) - :config - (load "nim-mode-autoloads" nil t) - ;; NOTE nim-mode autoloads sets up xref - +(after! nim-mode (defun +nim|init-nimsuggest-mode () "Conditionally load `nimsuggest-mode', instead of clumsily erroring out if nimsuggest isn't installed." - (when (executable-find "nimsuggest") + (when (file-executable-p nimsuggest-path) (nimsuggest-mode))) (add-hook 'nim-mode-hook #'+nim|init-nimsuggest-mode) (map! :map nim-mode-map :localleader - :n "b" #'+nim/build-menu) - - (def-menu! +nim/build-menu - "Building commands for `nim-mode' buffers." - '(("Build & run" :exec nim-compile)) - :prompt "Build")) + :n "b" #'nim-compile)) (def-package! flycheck-nim :when (featurep! :feature syntax-checker) :after nim-mode - :config - (add-hook 'nimsuggest-mode-hook #'flycheck-mode)) + :config (add-hook 'nimsuggest-mode-hook #'flycheck-mode)) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el deleted file mode 100644 index e9d090fc3..000000000 --- a/modules/lang/nix/config.el +++ /dev/null @@ -1,4 +0,0 @@ -;;; lang/nix/config.el -*- lexical-binding: t; -*- - -(def-package! nix-mode - :mode "\\.nix$") diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 22067cffb..bdd4974d2 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -1,9 +1,13 @@ ;;; lang/ocaml/config.el -*- lexical-binding: t; -*- (def-package! tuareg - :mode ("\\.ml[4ilpy]?$" . tuareg-mode)) + :mode ("\\.ml[4ilpy]?\\'" . tuareg-mode)) (def-package! merlin :after tuareg - :hook (tuareg-mode . merlin-mode)) + :hook (tuareg-mode . merlin-mode) + :config + (set! :company-backend 'tuareg-mode 'merlin-compand-backend) + (after! company + (remove-hook 'company-backends 'merlin-compand-backend))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a2c17bb28..ba5449039 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -16,12 +16,8 @@ ;; Plugins ;; -(def-package! toc-org - :commands toc-org-enable - :config (setq toc-org-hrefify-default "org")) - -(def-package! org-bullets - :commands org-bullets-mode) +;; `toc-org' +(setq toc-org-hrefify-default "org") (def-package! evil-org :when (featurep! :feature evil) diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index cb66d1495..a60b92e92 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -1,7 +1,7 @@ ;;; lang/plantuml/config.el -*- lexical-binding: t; -*- (def-package! plantuml-mode - :mode "\\.p\\(?:lant\\)?uml$" + :defer t :init (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") org-plantuml-jar-path plantuml-jar-path) diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index 39eafd64c..579391e8e 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -1,16 +1,18 @@ ;;; lang/purescript/config.el -*- lexical-binding: t; -*- -(def-package! purescript-mode - :mode "\\.purs$" - :config +(after! purescript-mode (add-hook! 'purescript-mode-hook - #'(flycheck-mode purescript-indentation-mode rainbow-delimiters-mode))) + #'(flycheck-mode + purescript-indentation-mode + rainbow-delimiters-mode))) + ;; (def-package! flycheck-purescript ;; :after purescript-mode ;; :config ;; (add-hook 'flycheck-mode-hook #'flycheck-purescript-setup)) + (def-package! psc-ide :hook (purescript-mode . psc-ide-mode)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 4c6fe44f1..4e129b9d3 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -16,7 +16,7 @@ is loaded.") ;; (def-package! python - :commands python-mode + :defer t :init (setq python-environment-directory doom-cache-dir python-indent-guess-indent-offset-verbose nil @@ -73,7 +73,6 @@ environment variables." (def-package! anaconda-mode - :after python :hook python-mode :init (setq anaconda-mode-installation-directory (concat doom-etc-dir "anaconda/") diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index c3781d2b1..117908050 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -1,8 +1,7 @@ ;;; lang/rest/config.el -*- lexical-binding: t; -*- (def-package! restclient - :commands restclient-mode - :mode ("\\.http$" . restclient-mode) + :mode ("\\.http\\'" . restclient-mode) :config (set! :popup "^\\*HTTP Response" '((size . 0.4)) '((quit . other))) (map! :mode restclient-mode @@ -16,4 +15,4 @@ (def-package! company-restclient :when (featurep! :completion company) :after restclient - :config (set! :company-backend 'restclient-mode '(company-restclient))) + :config (set! :company-backend 'restclient-mode 'company-restclient)) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 3d4fd3ae3..5eb32b4fc 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -12,15 +12,12 @@ ;; (def-package! ruby-mode - :mode "\\.rb$" - :mode "\\.rake$" - :mode "\\.gemspec$" - :mode "\\.\\(?:pry\\|irb\\)rc$" - :mode "/\\(?:Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file$" - :interpreter "ruby" + :mode "\\.\\(?:pry\\|irb\\)rc\\'" :config - (set! :company-backend 'ruby-mode '(company-dabbrev-code)) + (set! :company-backend 'ruby-mode 'company-dabbrev-code) (set! :electric 'ruby-mode :words '("else" "end" "elseif")) + (set! :env "RBENV_ROOT") + (set! :repl 'ruby-mode #'inf-ruby) ; `inf-ruby' (setq ruby-deep-indent-paren t) ;; Don't interfere with my custom RET behavior (define-key ruby-mode-map [?\n] nil) @@ -74,10 +71,8 @@ environment variables." (def-package! rspec-mode - :mode ("/\\.rspec$" . text-mode) + :mode ("/\\.rspec\\'" . text-mode) :init - (associate! rspec-mode :match "/\\.rspec$") - (associate! rspec-mode :modes (ruby-mode yaml-mode) :files ("/spec/")) (defvar rspec-mode-verifiable-map (make-sparse-keymap)) (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") @@ -96,18 +91,12 @@ environment variables." :n "v" #'rspec-verify)) -(def-package! inf-ruby - :commands (inf-ruby inf-ruby-console-auto) - :init (set! :repl 'ruby-mode 'inf-ruby)) - - (def-package! company-inf-ruby :when (featurep! :completion company) :after inf-ruby - :config (set! :company-backend 'inf-ruby-mode '(company-inf-ruby))) + :config (set! :company-backend 'inf-ruby-mode 'company-inf-ruby)) -(def-package! rake - :commands (rake rake-find-task rake-rerun) - :config (setq rake-completion-system 'default)) +;; `rake' +(setq rake-completion-system 'default) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 9a45ae71e..cd216273f 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -1,12 +1,6 @@ ;;; lang/rust/config.el -*- lexical-binding: t; -*- -;; -;; Plugins -;; - -(def-package! rust-mode - :mode "\\.rs$" - :config +(after! rust-mode (set! :env "RUST_SRC_PATH") (set! :docset 'rust-mode "Rust") (setq rust-indent-method-chain t) @@ -14,6 +8,7 @@ (map! :map rust-mode-map :localleader :n "b" #'+rust/build-menu) + (def-menu! +rust/build-menu "TODO" '(("cargo run" :exec "cargo run --color always") @@ -40,6 +35,5 @@ (def-package! flycheck-rust :when (featurep! :feature syntax-checker) :after rust-mode - :hook (flycheck-mode . flycheck-rust-setup) - :init (add-hook 'rust-mode-hook #'flycheck-mode)) + :config (add-hook! 'rust-mode-hook #'(flycheck-mode flycheck-rust-setup))) diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index b5a2a1bf0..44a39ced9 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -1,26 +1,24 @@ ;;; lang/scala/config.el -*- lexical-binding: t; -*- -(def-package! scala-mode - :mode "\\.s\\(?:cala\\|bt\\)$" - :config (setq scala-indent:align-parameters t)) +(after! scala-mode + (setq scala-indent:align-parameters t) + (add-to-list 'dtrt-indent-hook-mapping-list '(scala-mode c/c++/java scala-indent:step))) -(def-package! sbt-mode :after scala-mode) - - -(def-package! ensime - :commands (ensime ensime-scala-mode-hook) - :hook (scala-mode . ensime-mode) - :config - (set! :company-backend 'scala-mode '(ensime-company company-yasnippet)) - +(after! ensime (setq ensime-startup-snapshot-notification nil ensime-startup-notification nil ensime-eldoc-hints 'all ;; let DOOM handle company setup ensime-completion-style nil) + (set! :company-backend 'scala-mode '(ensime-company company-yasnippet)) + ;; Fix void-variable imenu-auto-rescan error caused by `ensime--setup-imenu' ;; trying to make imenu variables buffer local before imenu is loaded. (require 'imenu)) + +(def-package! sbt-mode + :after scala-mode + :config (set! :repl 'scala-mode #'run-scala)) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index d100a8c86..21444fb91 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -12,21 +12,19 @@ ;; (def-package! sh-script ; built-in - :mode ("\\.zsh$" . sh-mode) - :mode ("\\.zunit$" . sh-mode) - :mode ("/bspwmrc$" . sh-mode) - :init - (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) + :mode ("\\.zunit\\'" . sh-mode) + :mode ("/bspwmrc\\'" . sh-mode) :config + (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) (set! :electric 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) (set! :repl 'sh-mode #'+sh/repl) (setq sh-indent-after-continuation 'always) ;; recognize function names with dashes in them - (push '((sh . ((nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) - (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1)))) - sh-imenu-generic-expression) + (map-put sh-imenu-generic-expression + 'sh '((nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) + (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1))) ;; `sh-set-shell' is chatty about setting up indentation rules (advice-add #'sh-set-shell :around #'doom*shut-up) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index 9daae8f3a..6ba19cf0e 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -1,13 +1,14 @@ ;;; lang/swift/config.el -*- lexical-binding: t; -*- -;; TODO Set up emacs task runners for fruitstrap +;; `swift-mode' +(set! :repl 'swift-mode #'run-swift) -(def-package! swift-mode - :mode "\\.swift$" - :config - (add-hook 'swift-mode-hook #'flycheck-mode) - (set! :repl 'swift-mode #'swift-mode-run-repl) ; TODO test this - (push 'swift flycheck-checkers)) + +(def-package! flycheck-swift + :when (featurep! :feature syntax-checker) + :after swift-mode + :init (add-hook 'swift-mode-hook #'flycheck-mode) + :config (flycheck-swift-setup)) (def-package! company-sourcekit diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el index a9cc3a778..73e74da91 100644 --- a/modules/lang/swift/packages.el +++ b/modules/lang/swift/packages.el @@ -5,3 +5,6 @@ (when (featurep! :completion company) (package! company-sourcekit)) + +(when (featurep! :feature syntax-checker) + (package! flycheck-swift)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index d49d19292..834a2ae6e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -1,10 +1,5 @@ ;;; lang/web/+css.el -*- lexical-binding: t; -*- -;; css-mode hooks apply to scss and less-css modes -(add-hook 'css-mode-hook #'rainbow-delimiters-mode) -(add-hook! (css-mode sass-mode stylus-mode) - #'(yas-minor-mode-on flycheck-mode highlight-numbers-mode)) - ;; An improved newline+continue comment function (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) @@ -13,29 +8,36 @@ (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))))) (map! :map* (css-mode-map scss-mode-map less-css-mode-map) - :n "M-R" #'+css/web-refresh-browser - (:localleader - :n "rb" #'+css/toggle-inline-or-block)) + :localleader + :n "rb" #'+css/toggle-inline-or-block) ;; ;; Packages ;; +;; css-mode hooks apply to scss and less-css modes +(add-hook 'css-mode-hook #'rainbow-delimiters-mode) +(add-hook! (css-mode sass-mode stylus-mode) + #'(yas-minor-mode-on + flycheck-mode + highlight-numbers-mode + rainbow-mode)) + + (def-package! counsel-css :when (featurep! :completion ivy) - :commands (counsel-css counsel-css-imenu-setup) + :commands counsel-css :hook (css-mode . counsel-css-imenu-setup) :init (map! :map* (css-mode-map scss-mode-map less-css-mode-map) :localleader :n ";" #'counsel-css)) -(def-package! rainbow-mode - :hook (css-mode sass-mode)) - - -(after! css-mode ; contains both css-mode & scss-mode +(def-package! css-mode ; built-in + :defer t + :config + ;; contains both css-mode & scss-mode (set! :docset 'css-mode "CSS") (set! :docset 'scss-mode "Sass") (unless EMACS26+ @@ -45,7 +47,7 @@ (def-package! sass-mode - :commands sass-mode + :defer t :config (set! :docset 'sass-mode "Sass") (set! :company-backend 'sass-mode 'company-css) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index a01979605..4a27bd0ed 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -14,7 +14,6 @@ :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config - (set! :company-backend 'web-mode '(company-web-html company-yasnippet)) (setq web-mode-enable-html-entities-fontification t web-mode-enable-auto-quoting nil) @@ -91,10 +90,7 @@ :nv "[T" #'web-mode-element-parent)) -(def-package! company-web - :when (featurep! :completion company) - :after web-mode) - - -;; `pug-mode' -(set! :company-backend 'pug-mode '(company-yasnippet)) +;; +(set! :company-backend 'pug-mode 'company-web-jade) +(set! :company-backend 'web-mode 'company-web-html) +(set! :company-backend 'slim-mode 'company-web-slim) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index f89e975d7..9a864d1bc 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -13,9 +13,9 @@ (package! haml-mode) (package! pug-mode) (package! slim-mode) -(package! web-mode) -(when (featurep! :completion company) - (package! company-web)) +(when (package! web-mode) + (when (featurep! :completion company) + (package! company-web))) ;; +css.el (package! less-css-mode) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 2e5d98795..c458b8a2e 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -3,7 +3,8 @@ ;; Handles whitespace (tabs/spaces) settings externally. This way projects can ;; specify their own formatting rules. (def-package! editorconfig - :hook (doom-init . editorconfig-mode) + :defer 2 + :after-call doom-before-switch-buffer :config ;; Register missing indent variables (setq editorconfig-indentation-alist @@ -49,9 +50,7 @@ extension, try to guess one." ;; editorconfig to ignore indentation there. I prefer dynamic indentation ;; support built into Emacs. (dolist (mode '(emacs-lisp-mode lisp-mode)) - (map-delete editorconfig-indentation-alist mode))) - - -(def-package! editorconfig-conf-mode - :mode "\\.?editorconfig$") + (map-delete editorconfig-indentation-alist mode)) + ;; + (editorconfig-mode +1)) diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index d30f5119e..303deb947 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -1,9 +1,29 @@ ;;; tools/ein/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :ein-notebook-dir (dir) + "Set the default directory from where to open Jupyter notebooks." + `(setq ein:jupyter-default-notebook-directory ,dir)) + + +;; +;; Library +;; + +(defun +ein--collect-ein-buffer-links () + (let ((end (window-end)) + points) + (save-excursion + (goto-char (window-start)) + (while (re-search-forward "~?/.+\\|\s\\[" end t) + (push (+ (match-beginning 0) 1) points)) + (nreverse points)))) + ;;;###autoload (defun +ein/ace-link-ein () "Ace jump to links in ein notebooklist." (interactive) + (require 'avy) (let ((res (avy-with +ein/ace-link-ein (avy--process (+ein--collect-ein-buffer-links) @@ -13,14 +33,4 @@ (goto-char (1+ res)) (widget-button-press (point))))) -;;;###autoload -(defun +ein--collect-ein-buffer-links () - (interactive) - (let ((end (window-end)) - points) - (save-excursion - (goto-char (window-start)) - (while (re-search-forward "~?/.+\\|\s\\[" end t) - (push (+ (match-beginning 0) 1) points)) - (nreverse points)))) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 812e815a5..e3b469254 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -3,47 +3,49 @@ (defvar +ein-notebook-dir "~/" "Default directory from where Jupyter notebooks are to be opened.") -(def-setting! :ein-notebook-dir (dir) - "Set the default directory from where to open Jupyter notebooks." - `(setq +ein-notebook-dir ,dir)) +;; +;; Plugins +;; (def-package! ein - :commands (ein:notebooklist-open ein:notebooklist-login ein:jupyter-server-start) + :defer t :init - (push (lambda (buf) (string-match-p "^\\*ein: .*" (buffer-name buf))) - doom-real-buffer-functions) (set! :popup "\\*ein: .*" :ignore) - (set! :popup "\\*ein:tb .*" '((side . bottom) (size . 0.3)) '((quit . t) (transient) (select))) - (set! :popup "\\*ein:notebooklist *" '((side . left) (size . 50)) '((select))) - ;; Ace-link on notebook list buffers - (add-hook! 'ein:notebooklist-mode-hook - (map! :map ein:notebooklist-mode-map - "o" #'+ein/ace-link-ein)) - ;; Ein uses request to store http cookies. Store them in the cache dir. - (setq request-storage-directory (concat doom-cache-dir "/request")) + (set! :popup "\\*ein:tb .*" + '((side . bottom) (size . 0.3)) + '((quit . t) (transient) (select))) + (set! :popup "\\*ein:notebooklist *" + '((side . left) (size . 50)) + '((select))) + ;; Auto complete with company (when (featurep! :completion company) (setq ein:completion-backend 'ein:use-company-backend) - (set! :company-backend - '(ein:notebook-multilang-mode - ein:notebook-python-mode - ein:notebook-plain-mode) + (set! :company-backend '(ein:notebook-multilang-mode + ein:notebook-python-mode + ein:notebook-plain-mode) 'ein:company-backend)) :config - ;; Manually load the autoloads of EIN. This takes time... - (load "ein-loaddefs.el" nil t t) - (setq - ;; Slice images into rows so that we can navigate buffers with images more easily - ein:slice-image t - ein:jupyter-default-notebook-directory +ein-notebook-dir - ein:jupyter-default-server-command "jupyter" - ein:jupyter-server-args '("--no-browser") - ein:notebook-modes - '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode)) - ;; Avy is required for showing links in the notebook list with ace-link. - (require 'avy) + (setq ein:jupyter-server-args '("--no-browser") + ein:notebook-modes + '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) + ;; Slice images into rows; easier to navigate around images + ein:slice-image t) + + (unless ein:jupyter-default-notebook-directory + (setq ein:jupyter-default-notebook-directory "~/")) + + (defun +ein-buffer-p (buf) + (string-match-p "^\\*ein: .*" (buffer-name buf))) + (add-to-list 'doom-real-buffer-functions #'+ein-buffer-p nil #'eq) + + ;; Ace-link on notebook list buffers + (map! :after ein-notebooklist + :map ein:notebooklist-mode-map + "o" #'+ein/ace-link-ein) + ;; add hydra (defhydra +ein/hydra (:hint t :color red) " diff --git a/modules/tools/electric-indent/config.el b/modules/tools/electric-indent/config.el index 809b07800..01a1f3f86 100644 --- a/modules/tools/electric-indent/config.el +++ b/modules/tools/electric-indent/config.el @@ -8,16 +8,6 @@ (defvar-local doom-electric-indent-words '() "TODO") -(setq-default electric-indent-chars '(?\n ?\^?)) - -(defun +electric-indent|char (_c) - (when (and (eolp) doom-electric-indent-words) - (save-excursion - (backward-word) - (looking-at-p - (concat "\\<" (regexp-opt doom-electric-indent-words)))))) -(push #'+electric-indent|char electric-indent-functions) - (def-setting! :electric (modes &rest plist) "Declare :words (list of strings) or :chars (lists of chars) in MODES that trigger electric indentation." @@ -34,3 +24,15 @@ trigger electric indentation." ,@(if words `((setq doom-electric-indent-words ',words)))) (add-hook! ,modes #',fn-name)))))) +;; +(after! electric + (setq-default electric-indent-chars '(?\n ?\^?)) + + (defun +electric-indent|char (_c) + (when (and (eolp) doom-electric-indent-words) + (save-excursion + (backward-word) + (looking-at-p + (concat "\\<" (regexp-opt doom-electric-indent-words)))))) + (add-to-list 'electric-indent-functions #'+electric-indent|char)) + diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 26f919bd9..9c522e699 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -1,7 +1,5 @@ ;;; tools/eshell/config.el -*- lexical-binding: t; -*- -;; This is highly experimental. I don't use eshell often, so this may need work. - ;; see: ;; + `+eshell/open': open in current buffer ;; + `+eshell/open-popup': open in a popup @@ -9,7 +7,7 @@ ;; workspaces) (def-package! eshell ; built-in - :commands eshell-mode + :defer t :init (setq eshell-directory-name (let ((dir (concat doom-private-dir "eshell"))) diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index 46473990a..3e563de26 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -4,9 +4,7 @@ ;; errors. If that happens, try `+gist/kill-cache'. You may have to restart ;; Emacs. -(def-package! gist - :commands (gist-list gist-region-or-buffer-private gist-region-or-buffer) - :config +(after! gist (set! :evil-state 'gist-list-mode 'normal) (defun +gist*list-render (orig-fn &rest args) diff --git a/modules/tools/imenu/config.el b/modules/tools/imenu/config.el index 58628197d..577476ab9 100644 --- a/modules/tools/imenu/config.el +++ b/modules/tools/imenu/config.el @@ -1,13 +1,10 @@ ;;; tools/imenu/config.el -*- lexical-binding: t; -*- -(def-package! imenu-anywhere - :commands (ido-imenu-anywhere ivy-imenu-anywhere helm-imenu-anywhere) - :config (setq imenu-anywhere-delimiter ": ")) +;; `imenu-anywhere' +(setq imenu-anywhere-delimiter ": ") -(def-package! imenu-list - :commands (imenu-list-minor-mode imenu-list-smart-toggle) - :config +(after! imenu-list (setq imenu-list-idle-update-delay 0.5) (set! :popup "^\\*Ilist" diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index db32ca8d1..f5be64dc6 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -2,8 +2,6 @@ (def-package! magit :defer t - :init - (load "magit-autoloads" nil t) :config (setq magit-completing-read-function (if (featurep! :completion ivy) @@ -18,13 +16,11 @@ (map! :map magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) -(def-package! magit-blame - :commands magit-blame - :after git-timemachine) +(def-package! magit-blame :after git-timemachine) (def-package! magithub - :commands (magithub-clone magithub-feature-autoinject) + :commands magithub-feature-autoinject :after magit :preface (setq magithub-dir (concat doom-etc-dir "magithub/")) @@ -32,7 +28,6 @@ (setq magithub-clone-default-directory "~/" magithub-preferred-remote-method 'clone_url) :config - (load "magithub-autoloads" nil t) (magithub-feature-autoinject t)) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index f57b69c8d..4fac1bb32 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -11,17 +11,18 @@ ;; Plugins ;; -(def-package! password-store +;; `password-store' +(setq password-store-password-length 12) + + +;; `pass' +(def-package! pass :defer t :config - (setq password-store-password-length 12)) - - -(def-package! pass - :commands pass - :config (set! :evil-state 'pass-mode 'emacs) - (set! :popup "^\\*Password-Store" '((side . left) (size . 0.25)) '((quit))) + (set! :popup "^\\*Password-Store" + '((side . left) (size . 0.25)) + '((quit))) (map! :map pass-mode-map "j" #'pass-next-entry "k" #'pass-prev-entry @@ -30,12 +31,6 @@ "C-k" #'pass-next-directory)) -(def-package! helm-pass - :when (featurep! :completion helm) - :commands helm-pass) - - ;; Is built into Emacs 26+ -(def-package! auth-source-pass - :when (featurep! +auth) - :config (auth-source-pass-enable)) +(when (and EMACS26+ (featurep! +auth)) + (auth-source-pass-enable)) diff --git a/modules/tools/password-store/packages.el b/modules/tools/password-store/packages.el index 6827fc23e..dbc5f2afd 100644 --- a/modules/tools/password-store/packages.el +++ b/modules/tools/password-store/packages.el @@ -4,7 +4,7 @@ (package! pass) (package! password-store) -(when (featurep! +auth) +(when (and EMACS26+ (featurep! +auth)) (package! auth-source-pass)) (when (featurep! :completion helm) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 0dd7c0fc9..100246093 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -1,8 +1,7 @@ ;;; tools/pdf/config.el -*- lexical-binding: t; -*- (def-package! pdf-tools - :mode ("\\.pdf$" . pdf-view-mode) - :init (load "pdf-tools-autoloads" nil t) + :mode ("\\.pdf\\'" . pdf-view-mode) :config (unless noninteractive (pdf-tools-install)) diff --git a/modules/tools/prodigy/autoload.el b/modules/tools/prodigy/autoload.el index 88781dd3d..6f27d40df 100644 --- a/modules/tools/prodigy/autoload.el +++ b/modules/tools/prodigy/autoload.el @@ -1,5 +1,11 @@ ;;; tools/prodigy/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :service (&rest plist) + "TODO" + `(after! prodigy + (prodigy-define-service ,@plist))) + ;;;###autoload (defun +prodigy/create () "Interactively create a new prodigy service." @@ -32,3 +38,17 @@ (file-directory-p (plist-get service :project))) collect service into services finally do (setq prodigy-service services))) + +;;;###autoload +(defun +prodigy*services (orig-fn &rest args) + "Adds a new :project property to prodigy services, which hides the service +unless invoked from the relevant project." + (let ((project-root (downcase (doom-project-root))) + (services (apply orig-fn args))) + (if current-prefix-arg + services + (cl-remove-if-not (lambda (service) + (let ((project (plist-get service :project))) + (or (not project) + (file-in-directory-p project-root project)))) + services)))) diff --git a/modules/tools/prodigy/config.el b/modules/tools/prodigy/config.el index 8763db6a3..e9ba7ca32 100644 --- a/modules/tools/prodigy/config.el +++ b/modules/tools/prodigy/config.el @@ -1,38 +1,13 @@ ;;; tools/prodigy/config.el -*- lexical-binding: t; -*- -(def-setting! :service (&rest plist) - "TODO" - `(after! prodigy - (prodigy-define-service ,@plist))) - - -;; -;; Plugins -;; - -(def-package! prodigy - :commands (prodigy prodigy-view-mode prodigy-add-filter) - :config +(after! prodigy (set! :evil-state 'prodigy-mode 'emacs) ;; Make services, etc persistent between Emacs sessions (doom-cache-persist :prodigy '(prodigy-services prodigy-tags prodigy-filters)) - (defun +prodigy*services (orig-fn &rest args) - "Adds a new :project property to prodigy services, which hides the service -unless invoked from the relevant project." - (let ((project-root (downcase (doom-project-root))) - (services (apply orig-fn args))) - (if current-prefix-arg - services - (cl-remove-if-not (lambda (service) - (let ((project (plist-get service :project))) - (or (not project) - (file-in-directory-p project-root project)))) - services)))) (advice-add #'prodigy-services :around #'+prodigy*services) - ;; Keybindings (map! :map prodigy-mode-map "d" #'+prodigy/delete)) diff --git a/modules/tools/rgb/config.el b/modules/tools/rgb/config.el index ffab008eb..08a93d06a 100644 --- a/modules/tools/rgb/config.el +++ b/modules/tools/rgb/config.el @@ -4,9 +4,6 @@ ;; Plugins ;; -(def-package! rainbow-mode) - - (def-package! kurecolor :after rainbow-mode :config diff --git a/modules/tools/rotate-text/autoload.el b/modules/tools/rotate-text/autoload.el new file mode 100644 index 000000000..1cae4ba58 --- /dev/null +++ b/modules/tools/rotate-text/autoload.el @@ -0,0 +1,17 @@ +;;; tools/rotate-text/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(def-setting! :rotate (modes &rest plist) + "Declare :symbols, :words or :patterns (all lists of strings) that +`rotate-text' will cycle through." + (declare (indent 1)) + (let* ((modes (doom-enlist (doom-unquote modes))) + (fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-"))))) + `(progn + (defun ,fn-name () + (require 'rotate-text) + (let ((plist (list ,@plist))) + (setq rotate-text-local-symbols (plist-get plist :symbols) + rotate-text-local-words (plist-get plist :words) + rotate-text-local-patterns (plist-get plist :patterns)))) + (add-hook! ,modes #',fn-name)))) diff --git a/modules/tools/rotate-text/config.el b/modules/tools/rotate-text/config.el index 5fb81df5a..df310e3a5 100644 --- a/modules/tools/rotate-text/config.el +++ b/modules/tools/rotate-text/config.el @@ -1,22 +1,4 @@ ;;; tools/rotate-text/config.el -*- lexical-binding: t; -*- -(def-package! rotate-text - :commands (rotate-text rotate-text-backward) - :config - (push '("true" "false") rotate-text-words)) - - -(def-setting! :rotate (modes &rest plist) - "Declare :symbols, :words or :patterns (all lists of strings) that -`rotate-text' will cycle through." - (declare (indent 1)) - (let* ((modes (doom-enlist (doom-unquote modes))) - (fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-"))))) - `(progn - (defun ,fn-name () - (let ((plist (list ,@plist))) - (setq rotate-text-local-symbols (plist-get plist :symbols) - rotate-text-local-words (plist-get plist :words) - rotate-text-local-patterns (plist-get plist :patterns)))) - (add-hook! ,modes #',fn-name)))) - +(after! rotate-text + (add-to-list 'rotate-text-words '("true" "false"))) diff --git a/modules/tools/term/config.el b/modules/tools/term/config.el index adb1d470b..3263ddcb6 100644 --- a/modules/tools/term/config.el +++ b/modules/tools/term/config.el @@ -1,8 +1,14 @@ ;;; tools/term/config.el -*- lexical-binding: t; -*- -(def-package! multi-term - :commands (multi-term multi-term-next multi-term-prev) - :config - (setq multi-term-program (getenv "SHELL") - multi-term-dedicated-window-height 20 - multi-term-switch-after-close 'PREVIOUS)) +;; `multi-term' +(setq multi-term-dedicated-window-height 20 + multi-term-switch-after-close 'PREVIOUS) + +;; `term' (built-in) +(after! term + (set! :env "SHELL") + + ;; Consider term buffers real + (defun +term-p (buf) + (eq (buffer-local-value 'major-mode buf) 'term-mode)) + (add-to-list 'doom-real-buffer-functions #'+eshell-p #'eq)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 841235faf..acde3ad25 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -114,16 +114,17 @@ Possible values: (defun +doom-dashboard|init () "Initializes Doom's dashboard." - (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) - (add-hook 'window-size-change-functions #'+doom-dashboard|resize) - (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) - (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) - (unless (daemonp) - (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) - ;; `persp-mode' integration: update `default-directory' when switching - (add-hook 'persp-created-functions #'+doom-dashboard|record-project) - (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) - (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project) + (unless noninteractive + (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) + (add-hook 'window-size-change-functions #'+doom-dashboard|resize) + (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) + (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) + (unless (daemonp) + (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) + ;; `persp-mode' integration: update `default-directory' when switching + (add-hook 'persp-created-functions #'+doom-dashboard|record-project) + (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) + (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project)) (+doom-dashboard-reload t)) (defun +doom-dashboard|reload-on-kill () diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index f35a3a478..759132f89 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -4,11 +4,7 @@ ;; mode-line. (def-package! anzu - :commands (anzu-mode global-anzu-mode - anzu-query-replace anzu-query-replace-regexp - anzu-query-replace-at-cursor anzu-replace-at-cursor-thing) - :init - (add-transient-hook! #'isearch-mode (require 'anzu)) + :after-call isearch-mode :config (setq anzu-cons-mode-line-p nil anzu-minimum-input-length 1 @@ -35,10 +31,7 @@ (def-package! evil-anzu - :defer t - :init - (add-transient-hook! #'evil-ex-start-search (require 'evil-anzu)) - (add-transient-hook! #'evil-ex-start-word-search (require 'evil-anzu))) + :after-call (evil-ex-start-search evil-ex-start-word-search)) ;; fish-style modeline diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 3f8561302..b68313bef 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -22,10 +22,11 @@ ;; (def-package! doom-themes - :config + :defer t + :init (unless doom-theme (setq doom-theme 'doom-one)) - + :config ;; Reload common faces when reloading doom-themes live (defun +doom*reload-common (&rest _) (load "doom-themes-common.el" nil t)) (advice-add #'doom//reload-theme :before #'+doom*reload-common) @@ -41,7 +42,7 @@ (def-package! solaire-mode - :commands (solaire-mode turn-on-solaire-mode solaire-mode-swap-bg) + :defer t :init (defun +doom|solaire-mode-swap-bg-maybe () (when-let* ((rule (assq doom-theme +doom-solaire-themes))) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index 1a17d0ebe..e48f8a08a 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -2,7 +2,7 @@ (def-package! evil-goggles :when (featurep! :feature evil) - :defer pre-command-hook + :after-call pre-command-hook :init (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index a1519f993..3ab42ec28 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -1,7 +1,7 @@ ;;; ui/nav-flash/config.el -*- lexical-binding: t; -*- (def-package! nav-flash - :commands nav-flash-show + :defer t :init ;; NOTE In :feature lookup `recenter' is hooked to a bunch of jumping ;; commands, which will trigger nav-flash. diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 844e3d1ef..c1e318514 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -1,5 +1,73 @@ ;;; ui/popup/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defvar +popup--display-buffer-alist nil) + +;;;###autoload +(def-setting! :popup (condition &optional alist parameters) + "Register a popup rule. + +CONDITION can be a regexp string or a function. See `display-buffer' for a list +of possible entries for ALIST, which tells the display system how to initialize +the popup window. PARAMETERS is an alist of window parameters. See +`+popup-window-parameters' for a list of custom parameters provided by the popup +module. + +ALIST supports one custom parameter: `size', which will resolve to +`window-height' or `window-width' depending on `side'." + `(progn + (+popup-define ,condition ,alist ,parameters) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) + +;;;###autoload +(def-setting! :popups (&rest rules) + "Register multiple popup rules with :popup setting (`doom--set:popup'). For +example: + + (set! :popups + (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" + `(progn + ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist)) + +;;;###autoload +(defsubst +popup-define (condition &optional alist parameters) + "Define a popup rule. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +If CONDITION is met, the buffer will be displayed in a popup window with ALIST +and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may +contain and `+popup-window-parameters' for what window parameters that the popup +module supports. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +If certain attributes/parameters are omitted, the ones from +`+popup-default-alist' and `+popup-default-parameters' will be used." + (declare (indent 1)) + (push (if (eq alist :ignore) + (list condition nil) + `(,condition + (+popup-buffer) + ,@alist + (window-parameters ,@parameters))) + +popup--display-buffer-alist)) + + +;; +;; Library +;; + (defvar +popup--populate-wparams (not EMACS26+)) (defvar +popup--inhibit-transient nil) (defvar +popup--inhibit-select nil) diff --git a/modules/ui/popup/init.el b/modules/ui/popup/init.el deleted file mode 100644 index 8b6b99f16..000000000 --- a/modules/ui/popup/init.el +++ /dev/null @@ -1,61 +0,0 @@ -;;; ui/popup/init.el -*- lexical-binding: t; -*- - -(defvar +popup--display-buffer-alist nil) - -(defun +popup-define (condition &optional alist parameters) - "Define a popup rule. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. - -If CONDITION is met, the buffer will be displayed in a popup window with ALIST -and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may -contain and `+popup-window-parameters' for what window parameters that the popup -module supports. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -If certain attributes/parameters are omitted, the ones from -`+popup-default-alist' and `+popup-default-parameters' will be used." - (declare (indent 1)) - (push (if (eq alist :ignore) - (list condition nil) - `(,condition - (+popup-buffer) - ,@alist - (window-parameters ,@parameters))) - +popup--display-buffer-alist)) - -;; -(def-setting! :popup (condition &optional alist parameters) - "Register a popup rule. - -CONDITION can be a regexp string or a function. See `display-buffer' for a list -of possible entries for ALIST, which tells the display system how to initialize -the popup window. PARAMETERS is an alist of window parameters. See -`+popup-window-parameters' for a list of custom parameters provided by the popup -module. - -ALIST supports one custom parameter: `size', which will resolve to -`window-height' or `window-width' depending on `side'." - `(progn - (+popup-define ,condition ,alist ,parameters) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) - -(def-setting! :popups (&rest rules) - "Register multiple popup rules with :popup setting (`doom--set:popup'). For -example: - - (set! :popups - (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" - `(progn - ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) diff --git a/modules/ui/unicode/autoload.el b/modules/ui/unicode/autoload.el new file mode 100644 index 000000000..1af675c04 --- /dev/null +++ b/modules/ui/unicode/autoload.el @@ -0,0 +1,23 @@ +;;; ui/unicode/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook 'doom-post-init-hook #'+unicode|init-fonts) + +;;;###autoload +(defun +unicode|init-fonts () + "Set up `unicode-fonts' to eventually run; accomodating the daemon, if +necessary." + (setq-default bidi-display-reordering t + doom-unicode-font nil) + (if initial-window-system + (+unicode|setup-fonts (selected-frame)) + (add-hook 'after-make-frame-functions #'+unicode|setup-fonts))) + +;;;###autoload +(defun +unicode|setup-fonts (&optional frame) + "Initialize `unicode-fonts', if in a GUI session." + (when (and frame (display-graphic-p frame)) + (with-selected-frame frame + (require 'unicode-fonts) + ;; NOTE will impact startup time on first run + (unicode-fonts-setup)))) diff --git a/modules/ui/unicode/config.el b/modules/ui/unicode/config.el deleted file mode 100644 index a41ae6554..000000000 --- a/modules/ui/unicode/config.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; ui/unicode/config.el -*- lexical-binding: t; -*- - -(def-package! unicode-fonts - :init - (setq-default bidi-display-reordering t - doom-unicode-font nil) - - (defun +unicode|init-fonts (&optional frame) - "Initialize `unicode-fonts', if in a GUI session." - (when (and frame (display-graphic-p frame)) - (with-selected-frame frame - (require 'unicode-fonts) - ;; NOTE will impact startup time on first run - (unicode-fonts-setup)))) - - (add-hook! 'after-init-hook - (if initial-window-system - (+unicode|init-fonts (selected-frame)) - (add-hook 'after-make-frame-functions #'+unicode|init-fonts)))) diff --git a/modules/ui/vi-tilde-fringe/autoload.el b/modules/ui/vi-tilde-fringe/autoload.el new file mode 100644 index 000000000..ab9029cfc --- /dev/null +++ b/modules/ui/vi-tilde-fringe/autoload.el @@ -0,0 +1,4 @@ +;;; ui/vi-tilde-fringe/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook! (prog-mode text-mode conf-mode) #'vi-tilde-fringe-mode) diff --git a/modules/ui/vi-tilde-fringe/config.el b/modules/ui/vi-tilde-fringe/config.el deleted file mode 100644 index 1f099b7aa..000000000 --- a/modules/ui/vi-tilde-fringe/config.el +++ /dev/null @@ -1,6 +0,0 @@ -;;; ui/vi-tilde-fringe/config.el -*- lexical-binding: t; -*- - -;; indicators for empty lines past EOF -(def-package! vi-tilde-fringe - :hook ((prog-mode text-mode conf-mode) . vi-tilde-fringe-mode)) - diff --git a/modules/ui/window-select/config.el b/modules/ui/window-select/config.el index b055bb779..3989310e3 100644 --- a/modules/ui/window-select/config.el +++ b/modules/ui/window-select/config.el @@ -2,9 +2,7 @@ (def-package! switch-window :when (featurep! +switch-window) - :commands (switch-window switch-window-then-maximize switch-window-then-split-below - switch-window-then-split-right switch-window-then-delete - switch-window-then-swap-buffer) + :defer t :init (define-key global-map [remap other-window] #'switch-window) :config @@ -14,8 +12,7 @@ (def-package! ace-window :unless (featurep! +switch-window) - :commands (ace-window ace-swap-window ace-delete-window - ace-select-window ace-delete-other-windows) + :defer t :init (define-key global-map [remap other-window] #'ace-window) :config From 887e3e11af213bbdc96f445aecd0a5699267a8ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:49:03 +0200 Subject: [PATCH 1406/4235] Remove unused printerr! macro --- core/autoload/message.el | 10 ---------- core/autoload/modules.el | 1 - 2 files changed, 11 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 8aba7b918..3fcdc86a9 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -75,16 +75,6 @@ into faces or ANSI codes depending on the type of sesssion we're in." (apply #'doom-ansi-apply code format args)))) (format ,message ,@args))) -;;;###autoload -(defmacro printerr! (message &rest args) - "Uses `warn' in interative sessions and `message' otherwise (prints to -standard error). - -Can be colored using (color ...) blocks. See `print!' for details." - `(if noninteractive - (message (format! ,message ,@args)) - (warn ,message ,@args))) - ;;;###autoload (defmacro print! (message &rest args) "Uses `message' in interactive sessions and `princ' otherwise (prints to diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 462cf6411..f7a4e529d 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -1,7 +1,6 @@ ;;; core/autoload/modules.el -*- lexical-binding: t; -*- (autoload 'print! "autoload/message" nil 'macro) -(autoload 'printerr! "autoload/message" nil 'macro) (defun doom--server-eval (body) (require 'server) From 852193dfc54906748131c6ccb3cae6c16ef3c579 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:49:21 +0200 Subject: [PATCH 1407/4235] completion/helm: update command remappings --- modules/completion/helm/config.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 702208166..ec0c9a550 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -75,18 +75,19 @@ (map! :map global-map [remap apropos] #'helm-apropos - [remap find-file] #'helm-find-files - [remap recentf-open-files] #'helm-recentf - [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer - [remap projectile-recentf] #'helm-projectile-recentf - [remap projectile-find-file] #'helm-projectile-find-file - [remap imenu] #'helm-semantic-or-imenu [remap bookmark-jump] #'helm-bookmarks - [remap noop-show-kill-ring] #'helm-show-kill-ring - [remap projectile-switch-project] #'helm-projectile-switch-project - [remap projectile-find-file] #'helm-projectile-find-file + [remap bookmark-jump] #'helm-bookmarks + [remap execute-extended-command] #'helm-M-x + [remap find-file] #'helm-find-files [remap imenu-anywhere] #'helm-imenu-anywhere - [remap execute-extended-command] #'helm-M-x)) + [remap imenu-anywhere] #'helm-imenu-anywhere + [remap imenu] #'helm-semantic-or-imenu + [remap noop-show-kill-ring] #'helm-show-kill-ring + [remap projectile-find-file] #'helm-projectile-find-file + [remap projectile-recentf] #'helm-projectile-recentf + [remap projectile-switch-project] #'helm-projectile-switch-project + [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer + [remap recentf-open-files] #'helm-recentf)) (def-package! helm-locate From 55a3aeec9add75683c790db43abd74c540889ff5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:50:24 +0200 Subject: [PATCH 1408/4235] completion/ivy: don't pre-fill ag/rg/pt/grep searches w/ last search --- modules/completion/ivy/autoload/ivy.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 89ce56db5..1ef711277 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -202,7 +202,6 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;; File searching ;; -(defvar +ivy--file-last-search nil) (defvar +ivy--file-search-recursion-p t) (defvar +ivy--file-search-all-files-p nil) @@ -220,8 +219,7 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (let ((beg (or (bound-and-true-p evil-visual-beginning) (region-beginning))) (end (or (bound-and-true-p evil-visual-end) (region-end)))) (when (> (abs (- end beg)) 1) - (rxt-quote-pcre (buffer-substring-no-properties beg end))))) - +ivy--file-last-search)) + (rxt-quote-pcre (buffer-substring-no-properties beg end))))))) (prompt (format "%s%%s %s" (symbol-name engine) @@ -232,7 +230,6 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (t (file-relative-name directory project-root))))) (default-directory directory)) - (setq +ivy--file-last-search query) (require 'counsel) (cl-letf (((symbol-function 'counsel-ag-function) (symbol-function '+ivy*counsel-ag-function)) From b36eca2ae7c2b7d62f1fac49e8b08b54fe6a2497 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:50:33 +0200 Subject: [PATCH 1409/4235] completion/ivy: ivy-height = 15 --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 9d3f3f705..a37ea4baf 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -27,7 +27,7 @@ immediately runs it on the current candidate (ending the ivy session)." :defer 1 :after-call pre-command-hook :config - (setq ivy-height 12 + (setq ivy-height 15 ivy-do-completion-in-region nil ivy-wrap t ivy-fixed-height-minibuffer t From 9011593e38b4d0f8dd3ba94a5deb76a9ed307883 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:50:52 +0200 Subject: [PATCH 1410/4235] feature/workspaces: fix tests --- modules/feature/workspaces/test/autoload-workspaces.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el index 6367400ed..acd647ba9 100644 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ b/modules/feature/workspaces/test/autoload-workspaces.el @@ -14,7 +14,8 @@ (require 'persp-mode) (let (noninteractive) (persp-mode +1)) - (+workspace-switch +workspaces-main t) + (let (persp-before-switch-functions persp-activated-functions) + (+workspace-switch +workspaces-main t)) (let* (,@buffers) (cl-loop with persp = (get-current-persp) for buf in (list ,@(mapcar #'car buffers)) From fd87a0bd9eb84777b3c84eaf028f533a8ba596a7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:51:15 +0200 Subject: [PATCH 1411/4235] lang/org: add ]h/[h keybinds; correct bind motion keys to motion map --- modules/lang/org/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index ba5449039..13f12f7bb 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -274,12 +274,14 @@ between the two." :ni [M-return] (λ! (+org/insert-item 'below)) :ni [S-M-return] (λ! (+org/insert-item 'above)) ;; more org-ish vim motion keys - :n "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) - :n "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) - :n "]l" #'org-next-link - :n "[l" #'org-previous-link - :n "]s" #'org-babel-next-src-block - :n "[s" #'org-babel-previous-src-block + :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) + :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) + :m "]h" #'org-next-visible-heading + :m "[h" #'org-previous-visible-heading + :m "]l" #'org-next-link + :m "[l" #'org-previous-link + :m "]s" #'org-babel-next-src-block + :m "[s" #'org-babel-previous-src-block :m "^" #'evil-org-beginning-of-line :m "0" (λ! (let ((visual-line-mode)) (org-beginning-of-line))) :n "gQ" #'org-fill-paragraph From 5472cd4a37422b0dcf4191c0371c327ae8c08c46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:51:34 +0200 Subject: [PATCH 1412/4235] lang/org: set org-clock variables sooner --- modules/lang/org/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 13f12f7bb..a0c0e61b5 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -346,10 +346,11 @@ between the two." (def-package! org-clock :commands org-clock-save :hook (org-mode . org-clock-load) - :config + :init (setq org-clock-persist 'history org-clock-persist-file (concat doom-etc-dir "org-clock-save.el")) - (add-hook 'kill-emacs-hook 'org-clock-save)) + :config + (add-hook 'kill-emacs-hook #'org-clock-save)) ;; (when (featurep 'org) From ae95b9e8d5384bcb9032e65741f347c0e9d12b24 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:52:37 +0200 Subject: [PATCH 1413/4235] lang/sh: improve zsh shebang detection regexp --- modules/lang/sh/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 21444fb91..d705509da 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -50,7 +50,7 @@ (string-match-p "\\.zsh\\'" buffer-file-name)) (save-excursion (goto-char (point-min)) - (looking-at-p "^#!.+zsh[$\\s-]"))) + (looking-at-p "^#!.+/zsh[$ ]"))) (sh-set-shell "zsh"))) (add-hook 'sh-mode-hook #'+sh|detect-zsh)) From be9a06b126b0a820cfbd2d8072b562b45b3613c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:53:04 +0200 Subject: [PATCH 1414/4235] tools/magit: add magit-gitflow --- modules/tools/magit/config.el | 4 ++++ modules/tools/magit/packages.el | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index f5be64dc6..2d1d810f8 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -31,6 +31,10 @@ (magithub-feature-autoinject t)) +(def-package! magit-gitflow + :hook (magit-mode . turn-on-magit-gitflow)) + + (def-package! evil-magit :when (featurep! :feature evil) :after magit diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 132e1fc30..d510a8977 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,7 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -(package! magit) -(package! magithub) -(when (featurep! :feature evil) - (package! evil-magit)) +(when (package! magit) + (package! magithub) + (package! magit-gitflow) + (when (featurep! :feature evil) + (package! evil-magit))) From cf3c0d808dea51a0b4c046decfa33d27aca9e3cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:53:46 +0200 Subject: [PATCH 1415/4235] tools/tmux: minor refactor of +tmux/rerun --- modules/tools/tmux/autoload/tmux.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/tmux/autoload/tmux.el b/modules/tools/tmux/autoload/tmux.el index fdfaa6c5e..9508172a2 100644 --- a/modules/tools/tmux/autoload/tmux.el +++ b/modules/tools/tmux/autoload/tmux.el @@ -63,7 +63,7 @@ but do not execute them." (interactive "P") (unless +tmux-last-command (user-error "No last command to run")) - (apply #'+tmux (car +tmux-last-command) (cdr +tmux-last-command))) + (apply #'+tmux +tmux-last-command)) ;;;###autoload (defun +tmux/cd (&optional arg directory) From 2f83757018deb2b1994880feb3ba9f4dfbf9d844 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:54:05 +0200 Subject: [PATCH 1416/4235] ui/doom-dashboard: more robust feature detection In case you aren't using those modules, but have other means of loading those packages. --- modules/ui/doom-dashboard/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index acde3ad25..a446f2d8a 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -330,11 +330,11 @@ controlled by `+doom-dashboard-pwd-policy'." "\n\n")))) `(("Homepage" "mark-github" (browse-url "https://github.com/hlissner/doom-emacs")) - ,(when (and (featurep! :feature workspaces) + ,(when (and (bound-and-true-p persp-mode) (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) '("Reload last session" "history" (+workspace/load-session))) - ,(when (featurep! :lang org) + ,(when (fboundp 'org-agenda-list) '("See agenda for this week" "calendar" (call-interactively #'org-agenda-list))) ("Recently opened files" "file-text" From 643ff130532477d889eda890c0493a6e36ded18e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:55:03 +0200 Subject: [PATCH 1417/4235] ui/doom: make solaire-mode a little pickier Instead of only activating in buffers that a real (which is more selective), simply activate in buffers that are file-visiting (this means that real buffers that aren't highlighted can exist, particularly term/eshell buffers). --- modules/ui/doom/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index b68313bef..98edef3da 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -50,8 +50,7 @@ (if (cdr rule) (solaire-mode-swap-bg)))) (add-hook 'doom-load-theme-hook #'+doom|solaire-mode-swap-bg-maybe t) :config - (add-hook 'after-change-major-mode-hook #'turn-on-solaire-mode) - (setq solaire-mode-real-buffer-fn #'doom-real-buffer-p) + (add-hook 'change-major-mode-after-body-hook #'turn-on-solaire-mode) ;; fringe can become unstyled when deleting or focusing frames (add-hook 'focus-in-hook #'solaire-mode-reset) ;; Prevent color glitches when reloading either DOOM or loading a new theme From 1e4f108655f6cc46bb84a0a343d69bfe727cc5e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:56:15 +0200 Subject: [PATCH 1418/4235] ui/neotree: non-capturing groups in neo-hidden-regexp-list Slight optimization. --- modules/ui/neotree/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index 2723ab273..f7c8847db 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -24,13 +24,14 @@ neo-show-hidden-files t neo-hidden-regexp-list '(;; vcs folders - "^\\.\\(git\\|hg\\|svn\\)$" + "^\\.\\(?:git\\|hg\\|svn\\)$" ;; compiled files - "\\.\\(pyc\\|o\\|elc\\|lock\\|css.map\\|class\\)$" + "\\.\\(?:pyc\\|o\\|elc\\|lock\\|css.map\\|class\\)$" ;; generated files, caches or local pkgs - "^\\(node_modules\\|vendor\\|.\\(project\\|cask\\|yardoc\\|sass-cache\\)\\)$" + "^\\(?:node_modules\\|vendor\\|.\\(project\\|cask\\|yardoc\\|sass-cache\\)\\)$" ;; org-mode folders - "^\\.\\(sync\\|export\\|attach\\)$" + "^\\.\\(?:sync\\|export\\|attach\\)$" + ;; temp files "~$" "^#.*#$")) From 6b7083138699b3520755f0b14ff89d999669104d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:56:34 +0200 Subject: [PATCH 1419/4235] ui/evil-goggles: evil-goggles-enable-delete = nil --- modules/ui/evil-goggles/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index e48f8a08a..3d1f65fe2 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -6,7 +6,9 @@ :init (setq evil-goggles-duration 0.05 evil-goggles-pulse nil ; too slow - evil-goggles-enable-delete t + ;; evil-goggles provides a good indicator of what has been affected. + ;; delete/change is obvious, so I'd rather disable it for these. + evil-goggles-enable-delete nil evil-goggles-enable-change nil) :config (evil-goggles-mode +1)) From cce30367bb07393ab36b0ac78d0e97992002c99f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 00:58:09 +0200 Subject: [PATCH 1420/4235] tools/eshell: fix naive path concatenation for eshell-directory-name --- modules/tools/eshell/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 9c522e699..75870835a 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -10,7 +10,7 @@ :defer t :init (setq eshell-directory-name - (let ((dir (concat doom-private-dir "eshell"))) + (let ((dir (expand-file-name "eshell" doom-private-dir))) (if (file-directory-p dir) dir "~/.eshell")) From 0348686ccee2c0a665edef6adbb664a99b058df4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:00:04 +0200 Subject: [PATCH 1421/4235] tools/eshell: change split behavior to open non-eshell window --- modules/tools/eshell/autoload/eshell.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 57da503c8..059d0fba4 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -175,14 +175,14 @@ delete." "Create a new eshell window below the current one." (interactive) (select-window (split-window-vertically)) - (+eshell/open)) + (bury-buffer)) ;;;###autoload (defun +eshell/split-right () "Create a new eshell window to the right of the current one." (interactive) (select-window (split-window-horizontally)) - (+eshell/open)) + (bury-buffer)) ;; `make-ring' ;; `ring-ref' From 9a8b6a82e2b37c2be50f9e5dae2b9da7d3caf7a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:01:22 +0200 Subject: [PATCH 1422/4235] lang/web: add doctor.el --- modules/lang/web/doctor.el | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 modules/lang/web/doctor.el diff --git a/modules/lang/web/doctor.el b/modules/lang/web/doctor.el new file mode 100644 index 000000000..c351f0c73 --- /dev/null +++ b/modules/lang/web/doctor.el @@ -0,0 +1,8 @@ +;;; lang/web/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "js-beautify") + (warn! "Couldn't find js-beautify. Code formatting in JS/CSS/HTML modes will not work.")) + +(unless (executable-find "stylelint") + (warn! "Couldn't find stylelint. Linting for CSS modes will not work.")) + From 59f70c2a8721a403bd63632eef0f8f3e170244ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:11:53 +0200 Subject: [PATCH 1423/4235] Soft-fail if doom-module-table can't find your private init.el --- core/core-packages.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 5f70d6396..7788a1051 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -465,16 +465,17 @@ added, if the file exists." :size (if modules (length modules) 100) :rehash-threshold 1.0))) (when (null modules) - (let ((init-file (expand-file-name "init.el" doom-private-dir))) + (let ((init-file (expand-file-name "init.el" doom-private-dir)) + (short-init-file (abbreviate-file-name init-file))) (if (not (file-exists-p init-file)) - (error "%s doesn't exist" (abbreviate-file-name init-file)) + (warn "%s doesn't exist" short-init-file) (with-temp-buffer (insert-file-contents init-file) (when (re-search-forward "^\\s-*\\((doom! \\)" nil t) (goto-char (match-beginning 1)) (setq modules (cdr (sexp-at-point)))))) - (unless modules - (error "Couldn't gather module list from %s" init-file)))) + (unless (or modules noninteractive) + (warn "Couldn't gather module list from %s" short-init-file)))) (if (eq modules t) (setq modules nil)) (let (category) (dolist (m modules) From 11705d0920bf947a2dbf294d7cb11564a9833627 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:13:28 +0200 Subject: [PATCH 1424/4235] Fix void-variable error (let -> let*) --- core/core-packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 7788a1051..9143cf8d9 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -465,8 +465,8 @@ added, if the file exists." :size (if modules (length modules) 100) :rehash-threshold 1.0))) (when (null modules) - (let ((init-file (expand-file-name "init.el" doom-private-dir)) - (short-init-file (abbreviate-file-name init-file))) + (let* ((init-file (expand-file-name "init.el" doom-private-dir)) + (short-init-file (abbreviate-file-name init-file))) (if (not (file-exists-p init-file)) (warn "%s doesn't exist" short-init-file) (with-temp-buffer From a390ef8debedd0374e8bdd7d1318e8ae97f3358d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:17:01 +0200 Subject: [PATCH 1425/4235] Reduce doom-module-table calls significantly --- core/core-packages.el | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 9143cf8d9..124169d27 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -309,8 +309,7 @@ Use this before any of package.el, quelpa or Doom's package management's API to ensure all the necessary package metadata is initialized and available for them." (with-temp-buffer ; prevent buffer-local settings from propagating - (let ((load-prefer-newer t) ; reduce stale code issues - (doom-modules (doom-module-table))) + (let ((load-prefer-newer t)) ; reduce stale code issues ;; package.el and quelpa handle themselves if their state changes during ;; the current session, but if you change an packages.el file in a module, ;; there's no non-trivial way to detect that, so we give you a way to @@ -338,26 +337,27 @@ them." (error "Could not initialize quelpa")))) (when (or force-p (not doom-packages)) - (setq doom-packages nil) - (cl-flet - ((_load - (file &optional noerror interactive) - (condition-case-unless-debug ex - (let ((noninteractive (not interactive))) - (load file noerror 'nomessage 'nosuffix)) - ('error - (lwarn 'doom-initialize-packages :warning - "%s in %s: %s" - (car ex) - (file-relative-name file doom-emacs-dir) - (error-message-string ex)))))) - (let ((doom--stage 'packages)) - (_load (expand-file-name "packages.el" doom-core-dir)) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-path (car key) (cdr key) "packages.el") - do (let ((doom--current-module key)) (_load path t))) - (cl-loop for dir in doom-psuedo-module-dirs - do (_load (expand-file-name "packages.el" dir) t)))))))) + (let ((doom-modules (doom-module-table))) + (setq doom-packages nil) + (cl-flet + ((_load + (file &optional noerror interactive) + (condition-case-unless-debug ex + (let ((noninteractive (not interactive))) + (load file noerror 'nomessage 'nosuffix)) + ('error + (lwarn 'doom-initialize-packages :warning + "%s in %s: %s" + (car ex) + (file-relative-name file doom-emacs-dir) + (error-message-string ex)))))) + (let ((doom--stage 'packages)) + (_load (expand-file-name "packages.el" doom-core-dir)) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-path (car key) (cdr key) "packages.el") + do (let ((doom--current-module key)) (_load path t))) + (cl-loop for dir in doom-psuedo-module-dirs + do (_load (expand-file-name "packages.el" dir) t))))))))) ;; From 843c4d085fd0fc2adb5b047810069af772fa08ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:25:54 +0200 Subject: [PATCH 1426/4235] bin/doom: fix doom run --- bin/doom | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index 1e455534a..53e55de43 100755 --- a/bin/doom +++ b/bin/doom @@ -56,7 +56,6 @@ (setq doom-auto-accept t)))) ;; Bootstrap Doom - (setq noninteractive 'doom) (load (expand-file-name "init" emacs-dir) nil 'nomessage) @@ -68,6 +67,7 @@ ((not args) (error "Expecting a command")) ((let ((default-directory user-emacs-directory)) - (setq argv nil) + (setq argv nil + noninteractive 'doom) (doom-dispatch args))))) From 2990d5bd586f6367f094321c99c2d3b8807a2765 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:26:24 +0200 Subject: [PATCH 1427/4235] Fix hash-table-p and format type errors on blank startup --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 124169d27..d939135c9 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -155,7 +155,7 @@ If RETURN-P, return the message as a string instead of displaying it." ;; 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-site-load-path)) - (hash-table-count doom-modules) + (if doom-modules (hash-table-count doom-modules) 0) (or doom-init-time (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) From 6e82e6fa19dee8bf0a747080fa6cac51b83e1824 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 01:59:15 +0200 Subject: [PATCH 1428/4235] tools/term: fix void-function error due to misplaced reference to +eshell-p --- modules/tools/term/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/term/config.el b/modules/tools/term/config.el index 3263ddcb6..3aaad2453 100644 --- a/modules/tools/term/config.el +++ b/modules/tools/term/config.el @@ -11,4 +11,4 @@ ;; Consider term buffers real (defun +term-p (buf) (eq (buffer-local-value 'major-mode buf) 'term-mode)) - (add-to-list 'doom-real-buffer-functions #'+eshell-p #'eq)) + (add-to-list 'doom-real-buffer-functions #'+term-p #'eq)) From d9894f0b747e09270c3588d2810ff582ae4ce239 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:16:19 +0200 Subject: [PATCH 1429/4235] Fix package install not retrying after a 'bad request' error --- core/autoload/packages.el | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index a94da7b7f..09cc577fb 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -423,20 +423,17 @@ calls." (print! "Installing %s" (car pkg)) (doom--condition-case! (print! "%s%s" - (if (and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg))) - (not (doom-package-different-recipe-p (car pkg)))) - (dark (white "⚠ ALREADY INSTALLED")) - (condition-case e - (if (doom-install-package (car pkg) (cdr pkg)) - (prog1 (green "✓ DONE") - (setq success t)) - (red "✕ FAILED")) - (error - (red "✕ ERROR (%s)" e)))) - (if (plist-member (cdr pkg) :pin) - (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) - "")))) + (cond ((and (package-installed-p (car pkg)) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg)))) + (dark (white "⚠ ALREADY INSTALLED"))) + ((doom-install-package (car pkg) (cdr pkg)) + (setq success t) + (green "✓ DONE")) + ((red "✕ FAILED"))) + (if (plist-member (cdr pkg) :pin) + (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) + "")))) (print! (bold (green "Finished!"))) (if success (doom-delete-autoloads-file doom-package-autoload-file)) success))))) From 0bdf638813f5af21aa9d17be8cf7ad5480a07e3a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:18:29 +0200 Subject: [PATCH 1430/4235] lang/latex: refactor package loading mechanism --- modules/lang/latex/config.el | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index dd33daf0f..758f703a7 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -23,13 +23,7 @@ ;; Plugins ;; -(def-package! tex-site - :init - ;; Manually load the AUCTEX autoloads. This is normally done by - ;; package-initialize, ... which we do not use. - (load "auctex.el" nil t t) - (load "auctex-autoloads.el" nil t t) - :config +(after! tex-site ;; Set some varibles to fontify common LaTeX commands. (load! +fontification) (setq ;; Enable parse on load. @@ -179,7 +173,6 @@ (def-package! bibtex :defer t - :mode ("\\.bib\\'" . bibtex-mode) :config (setq bibtex-dialect 'biblatex bibtex-align-at-equal-sign t From 0aa7bf2d4a5618c02c5604f4347ce32f8d9b51a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:18:52 +0200 Subject: [PATCH 1431/4235] Insert package state before package autoloads in autoloads file Prevents issues where autoloads will try to load packages but `load-path` isn't initialized yet, causing "Cannot open load file" errors. --- core/autoload/modules.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index f7a4e529d..f3b189a64 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -208,8 +208,18 @@ This should be run whenever your `doom!' block or update your packages." (with-temp-file doom-package-autoload-file (insert ";;; -*- lexical-binding:t -*-\n" ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") - ;; insert package autoloads (save-excursion + ;; Cache the important and expensive-to-initialize state here. + (doom-initialize-packages 'internal) + (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer)) + (print! (green "✓ Cached package state")) + + ;; insert package autoloads (dolist (spec package-alist) (cl-destructuring-bind (pkg desc) spec (unless (memq pkg doom-autoload-excluded-packages) @@ -223,17 +233,8 @@ This should be run whenever your `doom!' block or update your packages." (unless (nth 8 (syntax-ppss)) (replace-match "" t t))) (unless (bolp) (insert "\n")) - (insert ")\n")))))) - (print! (green "✓ Package autoloads included")) - ;; Cache the important and expensive-to-initialize state here. - (doom-initialize-packages 'internal) - (prin1 `(setq load-path ',load-path - auto-mode-alist ',auto-mode-alist - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages - package-activated-list ',package-activated-list) - (current-buffer)) - (print! (green "✓ Cached package state"))) + (insert ")\n"))))))) + (print! (green "✓ Package autoloads included")) ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, ;; at least); they are cached later, so all those membership checks are ;; unnecessary overhead. From ef9cea4d119152848b42b8a3650cca5f81f3580a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:20:28 +0200 Subject: [PATCH 1432/4235] More aggressive autoloads reloading on install, autoremove, update & refresh --- core/core-dispatcher.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 861e58958..0128702c5 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -128,19 +128,19 @@ exists." "Installs requested plugins that aren't installed." (doom//reload-doom-autoloads) (when (doom//packages-install doom-auto-accept) - (doom//reload))) + (doom//reload-package-autoloads))) (def-dispatcher! (update u) "Checks for and updates outdated plugins." (doom//reload-doom-autoloads) (when (doom//packages-update doom-auto-accept) - (doom//reload))) + (doom//reload-package-autoloads))) (def-dispatcher! (autoremove r) "Removes orphaned plugins." (doom//reload-doom-autoloads) (when (doom//packages-autoremove doom-auto-accept) - (doom//reload))) + (doom//reload-package-autoloads))) (def-dispatcher! (autoloads a) "Regenerates Doom's autoloads file. @@ -196,12 +196,10 @@ recompile. Run this whenever you: 2. Add or remove `package!' blocks to your config, 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)" - (if (let* ((doom--inhibit-reload t) - (autoremove-p (with-demoted-errors "%s" (doom//packages-autoremove))) - (install-p (with-demoted-errors "%s" (doom//packages-install)))) - (or autoremove-p install-p)) - (doom//reload) - (doom//reload-autoloads)) + (let ((doom--inhibit-reload t)) + (with-demoted-errors "%s" (doom//packages-autoremove)) + (with-demoted-errors "%s" (doom//packages-install))) + (doom//reload-autoloads) (doom//byte-compile nil 'recompile)) From 0368e8f84bbb69b48f78d6a72ca816d6774aa278 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:41:23 +0200 Subject: [PATCH 1433/4235] Ensure package state is initialized before package management --- 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 09cc577fb..96aa9f6f3 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -387,7 +387,7 @@ calls." (defun doom//packages-install (&optional auto-accept-p) "Interactive command for installing missing packages." (interactive "P") - (doom-initialize-packages) + (doom-initialize-packages 'internal) (print! "Looking for packages to install...") (let ((packages (reverse (doom-get-missing-packages)))) (cond ((not packages) @@ -442,7 +442,7 @@ calls." (defun doom//packages-update (&optional auto-accept-p) "Interactive command for updating packages." (interactive "P") - (doom-initialize-packages) + (doom-initialize-packages 'internal) (print! "Looking for outdated packages...") (doom-refresh-packages-maybe doom-debug-mode) (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp @@ -486,7 +486,7 @@ calls." (defun doom//packages-autoremove (&optional auto-accept-p) "Interactive command for auto-removing orphaned packages." (interactive "P") - (doom-initialize-packages) + (doom-initialize-packages 'internal) (print! "Looking for orphaned packages...") (let ((packages (doom-get-orphaned-packages))) (cond ((not packages) From 7f31f4a1bd93c88c7b3e83844040d24a04c1709e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:53:48 +0200 Subject: [PATCH 1434/4235] Adjust package state initialization strategies --- core/autoload/packages.el | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 96aa9f6f3..8b3be26c2 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -140,7 +140,7 @@ Warning: this function is expensive; it re-evaluates all of doom's config files. Be careful not to use it in a loop. If INSTALLED-ONLY-P, only return packages that are installed." - (doom-initialize-packages (not noninteractive)) + (doom-initialize-packages t) (cl-loop with packages = (append doom-core-packages (mapcar #'car doom-packages)) for sym in (cl-delete-duplicates packages) if (and (or (not installed-only-p) @@ -173,7 +173,8 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom//packages-update'." - (doom-initialize-packages (not noninteractive)) + (doom-initialize-packages t) + (doom-refresh-packages-maybe doom-debug-mode) (require 'async) (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages @@ -221,7 +222,7 @@ Used by `doom//packages-update'." depended on. Used by `doom//packages-autoremove'." - (doom-initialize-packages (not noninteractive)) + (doom-initialize-packages t) (let ((package-selected-packages (append (mapcar #'car doom-packages) doom-core-packages))) (append (package--removable-packages) @@ -241,7 +242,6 @@ If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. Used by `doom//packages-install'." - (doom-initialize-packages (not noninteractive)) (cl-loop for desc in (doom-get-packages) for (name . plist) = desc if (and (or include-ignored-p @@ -387,7 +387,6 @@ calls." (defun doom//packages-install (&optional auto-accept-p) "Interactive command for installing missing packages." (interactive "P") - (doom-initialize-packages 'internal) (print! "Looking for packages to install...") (let ((packages (reverse (doom-get-missing-packages)))) (cond ((not packages) @@ -442,9 +441,7 @@ calls." (defun doom//packages-update (&optional auto-accept-p) "Interactive command for updating packages." (interactive "P") - (doom-initialize-packages 'internal) (print! "Looking for outdated packages...") - (doom-refresh-packages-maybe doom-debug-mode) (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp :key #'car))) (cond ((not packages) @@ -486,7 +483,6 @@ calls." (defun doom//packages-autoremove (&optional auto-accept-p) "Interactive command for auto-removing orphaned packages." (interactive "P") - (doom-initialize-packages 'internal) (print! "Looking for orphaned packages...") (let ((packages (doom-get-orphaned-packages))) (cond ((not packages) From 2b8efd67832dd3e6e26dc4778d92e6e9fc9bbd42 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 02:54:16 +0200 Subject: [PATCH 1435/4235] Error of private init.el doesn't exist (it really should!) --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index d939135c9..d73f14174 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -468,7 +468,7 @@ added, if the file exists." (let* ((init-file (expand-file-name "init.el" doom-private-dir)) (short-init-file (abbreviate-file-name init-file))) (if (not (file-exists-p init-file)) - (warn "%s doesn't exist" short-init-file) + (error "%s doesn't exist" short-init-file) (with-temp-buffer (insert-file-contents init-file) (when (re-search-forward "^\\s-*\\((doom! \\)" nil t) From d7a5f3b99723f6099c472cdaadcd73a6061f0fa8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 03:07:19 +0200 Subject: [PATCH 1436/4235] Fix doom-module-table failing to fetch module list ...because sexp-at-point needs a valid syntax table, and fundamental mode ain't got one. --- 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 d73f14174..faca27409 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -470,7 +470,8 @@ added, if the file exists." (if (not (file-exists-p init-file)) (error "%s doesn't exist" short-init-file) (with-temp-buffer - (insert-file-contents init-file) + (delay-mode-hooks (emacs-lisp-mode)) + (insert-file-contents-literally init-file) (when (re-search-forward "^\\s-*\\((doom! \\)" nil t) (goto-char (match-beginning 1)) (setq modules (cdr (sexp-at-point)))))) From e99d5c662434f56220d6002eb57e990a8a08b125 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 11:49:59 +0200 Subject: [PATCH 1437/4235] completion/helm: refactor how helm packages are loaded; fix command remaps --- modules/completion/helm/config.el | 66 ++++++++++++------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index ec0c9a550..7caa3e8a4 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -13,6 +13,22 @@ (def-package! helm-mode :defer 1 :after-call pre-command-hook + :init + (map! :map global-map + [remap apropos] #'helm-apropos + [remap bookmark-jump] #'helm-bookmarks + [remap bookmark-jump] #'helm-bookmarks + [remap execute-extended-command] #'helm-M-x + [remap find-file] #'helm-find-files + [remap imenu-anywhere] #'helm-imenu-anywhere + [remap imenu-anywhere] #'helm-imenu-anywhere + [remap imenu] #'helm-semantic-or-imenu + [remap noop-show-kill-ring] #'helm-show-kill-ring + [remap projectile-find-file] #'helm-projectile-find-file + [remap projectile-recentf] #'helm-projectile-recentf + [remap projectile-switch-project] #'helm-projectile-switch-project + [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer + [remap recentf-open-files] #'helm-recentf) :config (helm-mode +1) ;; helm is too heavy for find-file-at-point @@ -41,7 +57,6 @@ helm-move-to-line-cycle-in-source t) :config - (load "helm-autoloads" nil t) (setq projectile-completion-system 'helm) (defvar helm-projectile-find-file-map (make-sparse-keymap)) @@ -73,21 +88,7 @@ (setq-local cursor-type nil)))) (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe) - (map! :map global-map - [remap apropos] #'helm-apropos - [remap bookmark-jump] #'helm-bookmarks - [remap bookmark-jump] #'helm-bookmarks - [remap execute-extended-command] #'helm-M-x - [remap find-file] #'helm-find-files - [remap imenu-anywhere] #'helm-imenu-anywhere - [remap imenu-anywhere] #'helm-imenu-anywhere - [remap imenu] #'helm-semantic-or-imenu - [remap noop-show-kill-ring] #'helm-show-kill-ring - [remap projectile-find-file] #'helm-projectile-find-file - [remap projectile-recentf] #'helm-projectile-recentf - [remap projectile-switch-project] #'helm-projectile-switch-project - [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer - [remap recentf-open-files] #'helm-recentf)) + ) (def-package! helm-locate @@ -96,40 +97,28 @@ :config (set-keymap-parent helm-generic-files-map helm-map)) -(def-package! helm-bookmark - :commands helm-bookmark - :config (setq-default helm-bookmark-show-location t)) +(after! helm-bookmark + (setq-default helm-bookmark-show-location t)) -(def-package! helm-files - :defer t - :config +(after! helm-files (setq helm-boring-file-regexp-list (append (list "\\.projects$" "\\.DS_Store$") helm-boring-file-regexp-list))) -(def-package! helm-ag - :defer t - :config - (map! :map helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort)) +;; `helm-ag' +(map! :after helm-ag + :map helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) -(def-package! helm-css-scss ; https://github.com/ShingoFukuyama/helm-css-scss - :commands (helm-css-scss - helm-css-scss-multi - helm-css-scss-insert-close-comment) - :config +(after! helm-css-scss ; https://github.com/ShingoFukuyama/helm-css-scss (setq helm-css-scss-split-direction #'split-window-vertically helm-css-scss-split-with-multiple-windows t)) -(def-package! helm-for-files - :commands (helm-for-files helm-recentf helm-multi-files)) - - (def-package! helm-swoop ; https://github.com/ShingoFukuyama/helm-swoop - :commands (helm-swoop helm-multi-swoop helm-multi-swoop-all) + :commands helm-multi-swoop-all :config (setq helm-swoop-use-line-number-face t helm-swoop-candidate-number-limit 200 @@ -137,9 +126,6 @@ helm-swoop-pre-input-function (lambda () ""))) -(def-package! helm-describe-modes :commands helm-describe-modes) - - (def-package! wgrep - :commands (wgrep-setup wgrep-change-to-wgrep-mode) + :commands wgrep-change-to-wgrep-mode :config (setq wgrep-auto-save-buffer t)) From 81d3fe4a82931d4dff899ba6724411bbec4493d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 11:54:49 +0200 Subject: [PATCH 1438/4235] config/default: fix missing +ivy-do-action! error when ivy module is disabled --- modules/config/default/+bindings.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9b2ef077d..b4033b14a 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -393,11 +393,12 @@ [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))) + (:when (featurep! :completion ivy) + (: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)))) ;; easymotion :m "gs" #'+default/easymotion ; lazy-load `evil-easymotion' From d7d9da2210dab92a924e25179a46624ccbdc5518 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 11:55:57 +0200 Subject: [PATCH 1439/4235] Appease byte-compiler san kun chan sama sensei de gozaru --- modules/feature/lookup/autoload/lookup.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 56203adf5..167e12811 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -160,6 +160,7 @@ Goes down a list of possible backends: identifier (+lookup--online-provider (not current-prefix-arg)))))) +(defvar ffap-file-finder) ;;;###autoload (defun +lookup/file (path) "Figure out PATH from whatever is at point and open it. From 73045f9950569677c357ac962ef832a18830fb94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 12:49:23 +0200 Subject: [PATCH 1440/4235] Fix doom//quickstart & improve feedback (make quickstart) --- core/autoload/debug.el | 11 +++-------- core/core-dispatcher.el | 29 ++++++++++++++++++----------- core/templates/QUICKSTART_INTRO | 30 ++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 19 deletions(-) create mode 100644 core/templates/QUICKSTART_INTRO diff --git a/core/autoload/debug.el b/core/autoload/debug.el index f53e5b33d..2662128e5 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -1,15 +1,10 @@ ;;; core/autoload/debug.el -*- lexical-binding: t; -*- -(defun doom-template-exists-p (template) - "TODO" - (file-exists-p - (expand-file-name (format "templates/%s" template) - doom-core-dir))) - (defun doom-template-insert (template) "TODO" - (let ((dir (expand-file-name "templates/" doom-core-dir))) - (insert-file-contents (expand-file-name template dir)))) + (let ((file (expand-file-name (format "templates/%s" template) doom-core-dir))) + (when (file-exists-p file) + (insert-file-contents file)))) ;;;###autoload (defun doom-info () diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 0128702c5..6919d4878 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -122,7 +122,7 @@ with the -p option, e.g. This command will refuse to overwrite the private directory if it already exists." - (doom//quickstart args)) + (doom//quickstart)) (def-dispatcher! (install i) "Installs requested plugins that aren't installed." @@ -252,27 +252,34 @@ recompile. Run this whenever you: This deploys a barebones config to `doom-private-dir', installs all missing packages and regenerates the autoloads file." - (declare (interactive-only t)) (interactive) (let ((short-private-dir (abbreviate-file-name doom-private-dir))) - (unless (file-directory-p doom-private-dir) + (if (file-directory-p doom-private-dir) + (print! (yellow "%s directory already exists. Skipping." short-private-dir)) (print! "Creating %s" short-private-dir) - (make-directory doom-private-dir t)) + (make-directory doom-private-dir t) + (print! (green "Done!"))) (let ((init-file (expand-file-name "init.el" doom-private-dir))) (if (file-exists-p init-file) - (print! "%sinit.el already exists. Skipping." short-private-dir) + (print! (yellow "%sinit.el already exists. Skipping." short-private-dir)) (print! "Copying init.example.el to %s" short-private-dir) (copy-file (expand-file-name "init.example.el" doom-emacs-dir) - init-file))) + init-file) + (print! (green "Done!")))) (let ((config-file (expand-file-name "config.el" doom-private-dir))) (if (file-exists-p config-file) (print! "%sconfig.el already exists. Skipping." short-private-dir) - (with-temp-file config-file (insert ""))))) - (print! "Installing plugins & generating autoloads file, if necessary") + (print! "Deploying empty config.el file in %s" short-private-dir) + (with-temp-file config-file (insert "")) + (print! (green "Done!"))))) + (print! "Installing plugins") (doom//packages-install) - (doom//reload-autoloads) - (print! "\n\nDone! Doom Emacs is ready.\n") - (print! "Remember to run M-x all-the-icons-install-fonts after starting Emacs for the first time.")) + (print! "Regenerating autoloads files") + (doom//reload-autoloads nil 'force-p) + (print! (bold (green "\nFinished! Doom is ready to go!\n"))) + (with-temp-buffer + (doom-template-insert "QUICKSTART_INTRO") + (print! (buffer-string)))) (provide 'core-dispatcher) ;;; core-dispatcher.el ends here diff --git a/core/templates/QUICKSTART_INTRO b/core/templates/QUICKSTART_INTRO new file mode 100644 index 000000000..61a8af0ec --- /dev/null +++ b/core/templates/QUICKSTART_INTRO @@ -0,0 +1,30 @@ +Before you doom yourself, there are a few things you should know: + +1. If you use GUI Emacs, run `M-x all-the-icons-install-fonts` so you don't get + weird symbols all over the place. + +2. When you edit ~/.doom.d/init.el or modify modules, run: + + bin/doom refresh + + This will ensure all needed packages are installed, all orphaned packages are + removed, and your autoloads files are up to date. This is important! If you + forget to do this you will get errors! + +3. If something inexplicably goes wrong, it's a good idea to try: + + bin/doom doctor + + It will diagnose common issues with your environment and setup, and may give + you clues about what is wrong. + +4. To update doom, run + + bin/doom upgrade + + Doing it any other way will require you run `bin/doom refresh` otherwise, + +5. Check out `bin/doom help` to see what else it can do (it is also safe to add + ~/.emacs.d/bin to your PATH). + +Have fun! From 4aacd831b528926644091e721d7b98fcee8aa560 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 12:49:34 +0200 Subject: [PATCH 1441/4235] Fix doom//upgrade (make upgrade) --- core/core-dispatcher.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 6919d4878..d52f9a13b 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -214,6 +214,7 @@ recompile. Run this whenever you: (defun doom//upgrade () "Upgrade Doom to the latest version." (interactive) + (require 'vc-git) (let ((core-file (expand-file-name "init.el" doom-core-dir)) (branch (vc-git--symbolic-ref core-file)) (default-directory doom-emacs-dir)) From 27cee0bf5ab21fa34c882d5e82455c6860ed1cc3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 18:33:30 +0200 Subject: [PATCH 1442/4235] Remove redundant hexl-mode block --- modules/lang/data/config.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 4111c5972..80134d84d 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -27,10 +27,6 @@ (def-package! graphql-mode :mode "\\.gql\\'") -(def-package! hexl ; For ROM hacking or debugging - :mode ("\\.hex$" . hexl-mode) - :mode ("\\.nes$" . hexl-mode)) - (def-package! json-mode :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)\\'" :config From f5a0d89eda7d72e734014f17554c1e403938cc8c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:04:01 +0200 Subject: [PATCH 1443/4235] lang/solidity: conform to Doom conventions --- modules/lang/solidity/config.el | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index c8678ae10..653cdc6a0 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -4,25 +4,22 @@ ;; Plugins ;; -(def-package! solidity-mode - :mode "\\.sol$" - :init - (setq solidity-solc-path "~/.node_modules/lib/node_modules/solc/solcjs") - (setq solidity-solium-path "~/.node_modules/lib/node_modules/solium/bin/solium.js") +;; `solidity-mode' +(setq solidity-comment-style 'slash + solidity-flycheck-solc-checker-active t + solidity-flycheck-solium-checker-active t) - (setq solidity-flycheck-solc-checker-active t) - (setq solidity-flycheck-solium-checker-active t) - (setq flycheck-solidity-solc-addstd-contracts t) - :config - (setq solidity-comment-style 'slash)) +(def-package! solidity-flycheck ; included with solidity-mode + :when (featurep! :feature syntax-checker) + :after solidity-mode + :init (add-hook 'solidity-mode-hook #'flycheck-mode) + :config (setq flycheck-solidity-solc-addstd-contracts t) + (def-package! company-solidity :when (featurep! :completion company) :after solidity-mode :config - (add-hook 'solidity-mode-hook - (lambda () - (set (make-local-variable 'company-backends) - (append '((company-solidity company-capf company-dabbrev-code)) - company-backends))))) + (setq company-backends (delq 'company-solidity company-backends)) + (set! :company-backends 'solidity-mode 'company-solidity)) From 6be1ee17e5adf07d4088f6b1b9b41332d398847f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:06:29 +0200 Subject: [PATCH 1444/4235] lang/solidity: improve binary checks in doctor.el --- modules/lang/solidity/doctor.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/solidity/doctor.el b/modules/lang/solidity/doctor.el index 851008c5d..146d640ee 100644 --- a/modules/lang/solidity/doctor.el +++ b/modules/lang/solidity/doctor.el @@ -1,8 +1,8 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; lang/solidity/doctor.el -(unless (executable-find "solc") - (warn! "Solc isn't installed.")) - -(unless (executable-find "solium -V") - (warn! "Solium isn't installed.")) +(when (require 'solidity-common nil t) + (unless (executable-find solidity-solc-path) + (warn! "Solc isn't installed.")) + (unless (executable-find solidity-solium-path) + (warn! "Solium isn't installed."))) From 9a730c00357103b54d3475239615be25b40680f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:10:49 +0200 Subject: [PATCH 1445/4235] lang/solidity: conform README to doom conventions --- modules/lang/solidity/README.org | 36 +++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/modules/lang/solidity/README.org b/modules/lang/solidity/README.org index b407c498f..69214de12 100644 --- a/modules/lang/solidity/README.org +++ b/modules/lang/solidity/README.org @@ -4,28 +4,44 @@ This module adds [[https://github.com/ethereum/solidity][Solidity]] support thro + Syntax-checking (~flycheck~) + Code completion (~[[https://github.com/ssmolkin1/company-solidity][company-solidity]]~) -+ Gas estimation(~C-c C-g~) - -* Install -There are two options for linters. ++ Gas estimation (~C-c C-g~) -** [[https://github.com/ethereum/solc-js][Solc]] +* Table of Contents :TOC: +- [[Module Flags][Module Flags]] +- [[Prerequisites][Prerequisites]] + - [[Solc][Solc]] + - [[Solium][Solium]] +- [[TODO][TODO]] + +* Module Flags +This module provides no flags. + +* Prerequisites +This module requires one or both linters for syntax checking: + ++ [[https://github.com/ethereum/solc-js][Solc]] ++ [[http://solium.readthedocs.io/en/latest/user-guide.html#installation][Solium]] + +If both are enabled *Solc* is run first, then *Solium* if *Solc* catches no +errors. + +** Solc #+BEGIN_SRC sh npm install -g solc #+END_SRC -** [[http://solium.readthedocs.io/en/latest/user-guide.html#installation][Solium]] +** Solium #+BEGIN_SRC sh npm install -g solium #+END_SRC -By default *solium* looks for ~.soliumrc.json~ in the project directory, but you can set it to your own ~.soliumrc.json~ with this in your private doom ~config.el~ +By default *solium* looks for ~.soliumrc.json~ in the project directory, but you +can set it to your own ~.soliumrc.json~ with this in your private doom +~config.el~ #+BEGIN_SRC emacs-lisp -(setq flycheck-solidity-solium-soliumrcfile "/$HOME/.soliumrc.json") +(setq flycheck-solidity-solium-soliumrcfile "~/.soliumrc.json") #+END_SRC -They can be chained together so it's recommended you use both. *Solc* is ran first, and then *Solium* if *Solc* doesn't catch any errors. - * TODO + Snippets From 68c0d228bced32e0a5a6bee4eff88fa2eeb0ea4a Mon Sep 17 00:00:00 2001 From: Jeff Jewiss Date: Fri, 25 May 2018 18:13:28 +0100 Subject: [PATCH 1446/4235] support handlebars templates --- modules/lang/web/+html.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 4a27bd0ed..8e58e55b2 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -6,6 +6,7 @@ :mode "\\.erb$" :mode "\\.jsp$" :mode "\\.as[cp]x$" + :mode "\\.hbs$" :mode "\\.mustache$" :mode "\\.tsx$" :mode "\\.vue$" From 365201bfcf37c7ce20ecb08d4373095683472bcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 16:15:58 +0200 Subject: [PATCH 1447/4235] doom//upgrade: fix void-variable core-file error --- core/core-dispatcher.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index d52f9a13b..fa33c2383 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -215,9 +215,9 @@ recompile. Run this whenever you: "Upgrade Doom to the latest version." (interactive) (require 'vc-git) - (let ((core-file (expand-file-name "init.el" doom-core-dir)) - (branch (vc-git--symbolic-ref core-file)) - (default-directory doom-emacs-dir)) + (let* ((core-file (expand-file-name "init.el" doom-core-dir)) + (branch (vc-git--symbolic-ref core-file)) + (default-directory doom-emacs-dir)) (unless (file-exists-p core-file) (error "Couldn't find %s, was Doom cloned properly?" (abbreviate-file-name core-file))) From 5ef1228201d6ab7d5b17811eefd2c61a7c6ec1ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 16:31:55 +0200 Subject: [PATCH 1448/4235] Fix nested length form typos --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index faca27409..3560727fb 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -384,7 +384,7 @@ of PROPERTY and VALUEs." (plist-put plist property value) (when rest (when (cl-oddp (length rest)) - (signal 'wrong-number-of-arguments (length (length rest)))) + (signal 'wrong-number-of-arguments (list (length rest)))) (while rest (plist-put rest (pop rest) (pop rest)))) (puthash (cons category module) plist doom-modules))) From becc79089e37d3a6d7adbe15b7cb377cced7ce4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 16:41:02 +0200 Subject: [PATCH 1449/4235] feature/lookup: fix void-function xref-backend-identifier-at-point error --- modules/feature/lookup/autoload/lookup.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 167e12811..3003de0d5 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -22,7 +22,8 @@ ((use-region-p) (buffer-substring-no-properties (region-beginning) (region-end))) - ((xref-backend-identifier-at-point (xref-find-backend))))) + ((require 'xref nil t) + (xref-backend-identifier-at-point (xref-find-backend))))) (defun +lookup--jump-to (prop identifier) (cl-loop with origin = (point-marker) From ef9b30cdefad66b80561e08f88f76fa91b2a605b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 16:55:42 +0200 Subject: [PATCH 1450/4235] Fix doom//upgrade failing to detect branch & clean *.elc files before updating --- core/core-dispatcher.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index fa33c2383..bc68fe31c 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -215,7 +215,7 @@ recompile. Run this whenever you: "Upgrade Doom to the latest version." (interactive) (require 'vc-git) - (let* ((core-file (expand-file-name "init.el" doom-core-dir)) + (let* ((core-file (expand-file-name "core.el" doom-core-dir)) (branch (vc-git--symbolic-ref core-file)) (default-directory doom-emacs-dir)) (unless (file-exists-p core-file) @@ -239,12 +239,12 @@ recompile. Run this whenever you: (message "Doom is up to date!") (when (or doom-auto-accept (y-or-n-p "Doom is out of date, update?")) - (unless (zerop (process-file "git" nil buf nil - "checkout" (format "%s/%s" doom-remote branch))) - (error "An error occurred while checking out the latest commit")) (when (file-exists-p (byte-compile-dest-file core-file)) (message "Your config is byte-compiled, removing byte-compiled files") (doom//clean-byte-compiled-files)) + (unless (zerop (process-file "git" nil buf nil + "checkout" (format "%s/%s" doom-remote branch))) + (error "An error occurred while checking out the latest commit")) (doom//reload) (message "Done! Please restart Emacs for changes to take effect"))))))))) From 068979591aa5e99f8bade501d80a5f797755e888 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 16:56:08 +0200 Subject: [PATCH 1451/4235] doom//byte-compile: cl-pushnew => push (redundant w/ cl-delete-duplicates) --- core/autoload/modules.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index f3b189a64..a40e91045 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -314,10 +314,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (condition-case ex (let ((use-package-expand-minimally t)) ;; Always compile private init file - (cl-pushnew (expand-file-name "init.el" doom-private-dir) - target-files :test #'equal) - (cl-pushnew (expand-file-name "init.el" doom-emacs-dir) - target-files :test #'equal) + (push (expand-file-name "init.el" doom-private-dir) target-files) + (push (expand-file-name "init.el" doom-emacs-dir) target-files) (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) (if (or (not recompile-p) (let ((elc-file (byte-compile-dest-file target))) From 1d54ba4a3789e902a2643ee1109eafa2f01509d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 16:56:38 +0200 Subject: [PATCH 1452/4235] Seriously. Don't prioritize *.elc files in noninteractive sessions! --- init.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/init.el b/init.el index eda0e8894..61d66700c 100644 --- a/init.el +++ b/init.el @@ -27,7 +27,11 @@ ;; ;;; License: MIT -(setq user-emacs-directory (file-name-directory load-file-name) - load-prefer-newer noninteractive) +(defconst user-emacs-directory + (file-name-directory load-file-name)) + +(when noninteractive + (setq load-suffixes '(".el" ".elc" ".so") + load-prefer-newer noninteractive)) (require 'core (concat user-emacs-directory "core/core")) From 74c8df361837e59ef7e88c41d8aa48afbb03248d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 18:12:45 +0200 Subject: [PATCH 1453/4235] Fix reload-*-autoloads commands not remotely loading byte-compiled autoloads file --- core/autoload/modules.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index a40e91045..78c271429 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -2,10 +2,10 @@ (autoload 'print! "autoload/message" nil 'macro) -(defun doom--server-eval (body) +(defun doom--server-load (file) (require 'server) (when (server-running-p) - (server-eval-at server-name body))) + (server-eval-at server-name `(load-file ,(byte-compile-dest-file file))))) ;;;###autoload (defun doom//reload (&optional force-p) @@ -180,7 +180,7 @@ modified." (save-buffer) (doom--byte-compile doom-autoload-file) (when (and noninteractive (not (daemonp))) - (doom--server-eval `(load-file ,doom-autoload-file))) + (doom--server-load doom-autoload-file)) t) (kill-buffer buf)))))) @@ -244,7 +244,7 @@ This should be run whenever your `doom!' block or update your packages." (print! (green "✓ Removed load-path/auto-mode-alist entries"))) (doom--byte-compile doom-package-autoload-file) (when (and noninteractive (not (daemonp))) - (doom--server-eval `(load-file ,doom-package-autoload-file))) + (doom--server-load doom-package-autoload-file)) t)) From e3daf2b818e8fc127175254f8f226828d6ef0e6f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 18:20:01 +0200 Subject: [PATCH 1454/4235] Improve how reload-package-autoloads detects your packages have changed --- core/autoload/modules.el | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 78c271429..a3a478475 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -197,11 +197,7 @@ This should be run whenever your `doom!' block or update your packages." (interactive) (if (and (not force-p) (file-exists-p doom-package-autoload-file) - (not (cl-loop initially do (doom-ensure-packages-initialized t) - for (_pkg desc) in package-alist - for autoload-file = (concat (package--autoloads-file-name desc) ".el") - if (file-newer-than-file-p autoload-file doom-package-autoload-file) - return t))) + (not (file-newer-than-file-p package-user-dir doom-package-autoload-file))) (ignore (print! (green "Doom package autoloads is up-to-date")) (doom-initialize-autoloads doom-package-autoload-file)) (doom-delete-autoloads-file doom-package-autoload-file) @@ -210,7 +206,7 @@ This should be run whenever your `doom!' block or update your packages." ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") (save-excursion ;; Cache the important and expensive-to-initialize state here. - (doom-initialize-packages 'internal) + (doom-initialize-packages) (prin1 `(setq load-path ',load-path auto-mode-alist ',auto-mode-alist Info-directory-list ',Info-directory-list From debdb63100d7c60dab9b2424ef0c63dc5cf412b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 18:21:58 +0200 Subject: [PATCH 1455/4235] Handle wrong-num-of-args error correctly --- core/autoload/modules.el | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index a3a478475..e10e79ec7 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -214,22 +214,21 @@ This should be run whenever your `doom!' block or update your packages." package-activated-list ',package-activated-list) (current-buffer)) (print! (green "✓ Cached package state")) - ;; insert package autoloads (dolist (spec package-alist) - (cl-destructuring-bind (pkg desc) spec - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file - (abbreviate-file-name - (concat (package--autoloads-file-name desc) ".el")))) - (when (file-exists-p file) - (insert "(let ((load-file-name " (prin1-to-string file) "))\n") - (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) - (unless (nth 8 (syntax-ppss)) - (replace-match "" t t))) - (unless (bolp) (insert "\n")) - (insert ")\n"))))))) + (if-let* ((pkg (car spec)) + (desc (cadr spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file (concat (package--autoloads-file-name desc) ".el"))) + (when (file-exists-p file) + (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n")))) + (print! (yellow "⚠ Couldn't find package desc for %s" (car spec)))))) (print! (green "✓ Package autoloads included")) ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, ;; at least); they are cached later, so all those membership checks are From 06bd3dfccc0d738805a5211edf720adf87f11399 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 18:25:43 +0200 Subject: [PATCH 1456/4235] Improve how reload-doom-autoloads detects your modules have changed --- core/autoload/modules.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index e10e79ec7..f3d1fe5a5 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -119,6 +119,8 @@ modified." (push file targets))))) (if (and (not force-p) (file-exists-p doom-autoload-file) + (not (file-newer-than-file-p (expand-file-name "init.el" doom-private-dir) + doom-autoload-file)) (not (cl-loop for file in targets if (file-newer-than-file-p file doom-autoload-file) return t))) From 85c6d06c3f78c080c52888aab62f2b138ce1f5ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:25:15 +0200 Subject: [PATCH 1457/4235] Try to reload doom/package autoloads before before/after doom refresh --- core/core-dispatcher.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index bc68fe31c..abef3c1aa 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -196,10 +196,11 @@ recompile. Run this whenever you: 2. Add or remove `package!' blocks to your config, 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)" + (doom//reload-doom-autoloads) (let ((doom--inhibit-reload t)) (with-demoted-errors "%s" (doom//packages-autoremove)) (with-demoted-errors "%s" (doom//packages-install))) - (doom//reload-autoloads) + (doom//reload-package-autoloads) (doom//byte-compile nil 'recompile)) From 644dc17e32273cdfdecfc05d7ecef0487ba71343 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:25:47 +0200 Subject: [PATCH 1458/4235] Minor refactor of doom-initialize-packages --- core/core-packages.el | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 3560727fb..eddbfb98e 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -319,15 +319,7 @@ them." ;; `package-alist' (when (or force-p (not (bound-and-true-p package-alist))) (setq load-path doom-site-load-path) - (require 'package) - (setq package-activated-list nil - package--initialized nil) - (let (byte-compile-warnings) - (condition-case _ - (quiet! (package-initialize)) - ('error (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize))))) + (doom-ensure-packages-initialized t)) ;; `quelpa-cache' (when (or force-p (not (bound-and-true-p quelpa-cache))) From dc7488df73c66f15a80bfecbe1268a04a8b3801d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:26:08 +0200 Subject: [PATCH 1459/4235] Remove package-initialize hack before package commands Doesn't appear to be necessary anymore. --- core/core-packages.el | 9 --------- 1 file changed, 9 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index eddbfb98e..9cc8ff49b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -803,15 +803,6 @@ loads MODULE SUBMODULE's packages.el file." ;; Make package.el cooperate with Doom ;; -(defun doom*initialize-packages (&rest _) - (unless package--initialized - (package-initialize))) - -(advice-add #'package-delete :before #'doom*initialize-packages) -(advice-add #'package-install :before #'doom*initialize-packages) -(advice-add #'package-refresh-contents :before #'doom*initialize-packages) -(advice-add #'package-reinstall :before #'doom*initialize-packages) - ;; Updates QUELPA after deleting a package (advice-add #'package-delete :after #'doom*package-delete) From 242a28ddc92aaf3c33c83c5023e69ca1afc2d1a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 19:58:59 +0200 Subject: [PATCH 1460/4235] doctor: initialize more state for more accurate tests #603 --- bin/doom-doctor | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 0ad1e003a..2f4128033 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -277,9 +277,11 @@ (let (doom-core-packages doom-debug-mode) (condition-case ex - (let ((inhibit-message t)) - (load (concat user-emacs-directory "init.el") nil t) - (doom-initialize-modules) + (let ((inhibit-message t) + noninteractive) + (load (concat user-emacs-directory "core/core.el") nil t) + (doom-initialize t) + (doom-initialize-modules t) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) ('error (warn! "Attempt to load DOOM: failed\n %s\n" From 0750e877ab783aafc513c227db24dc43499be6ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 May 2018 20:06:01 +0200 Subject: [PATCH 1461/4235] Ensure private/emacs dirs end with a slash --- bin/doom | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index 53e55de43..ec26c7e55 100755 --- a/bin/doom +++ b/bin/doom @@ -45,11 +45,11 @@ ((or "-d" "--debug") (setq doom-debug-mode t)) ((or "-p" "--private") - (setq doom-private-dir (expand-file-name (pop args))) + (setq doom-private-dir (expand-file-name (concat (pop args) "/"))) (or (file-directory-p doom-private-dir) (error "%s does not exist" doom-private-dir))) ((or "-e" "--emacsd") - (setq emacs-dir (expand-file-name (pop args))) + (setq emacs-dir (expand-file-name (concat (pop args) "/"))) (or (file-directory-p emacs-dir) (error "%s does not exist" emacs-dir))) ((or "-y" "--yes") From fd86bfb0272419bec19d00943649bd44c9105c13 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 03:02:15 +0200 Subject: [PATCH 1462/4235] Fix load-path not including site-lisp directories This would cause plugins like mu4e to not be detected and included in the cached load-path generated by doom-package-autoload-file. --- bin/doom | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index ec26c7e55..e1f1d74e7 100755 --- a/bin/doom +++ b/bin/doom @@ -4,8 +4,8 @@ ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } ":"; DOOMDIR=$(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. ":"; [[ $1 == doc || $1 == doctor ]] && { cd "$DOOMDIR"; exec emacs --script bin/doom-doctor; exit 0; } -":"; [[ $1 == run ]] && { cd "$DOOMDIR"; shift; exec emacs -Q -l bin/doom "$@"; exit 0; } -":"; exec emacs --quick --script "$0" -- $@ +":"; [[ $1 == run ]] && { cd "$DOOMDIR"; shift; exec emacs -q --no-splash -l bin/doom "$@"; exit 0; } +":"; exec emacs --script "$0" -- $@ ":"; exit 0 (defun usage () From 9febfb047711b71d904c6ba4d917a34c45290065 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 03:06:22 +0200 Subject: [PATCH 1463/4235] Add fundamental-mode to doom-large-file-modes-list --- core/core-editor.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 491c50001..cb9924948 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -6,8 +6,9 @@ to avoid performance issues. Opening literally means that no major or minor modes are active and the buffer is read-only.") (defvar doom-large-file-modes-list - '(archive-mode tar-mode jka-compr git-commit-mode image-mode - doc-view-mode doc-view-mode-maybe ebrowse-tree-mode pdf-view-mode) + '(fundamental-mode special-mode archive-mode tar-mode jka-compr + git-commit-mode image-mode doc-view-mode doc-view-mode-maybe + ebrowse-tree-mode pdf-view-mode) "Major modes that `doom|check-large-file' will ignore.") (defvar-local doom-inhibit-indent-detection nil From 2d6bef33d3bd0f158b5c1149b89010e25e47c700 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 03:06:45 +0200 Subject: [PATCH 1464/4235] Disable doom|detect-indentation in fundamental or special modes This should fix #607, which is caused by whitespace-mode messing up the overlays/text properties in the mu4e sidebar. --- core/core-editor.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index cb9924948..cbbe3d437 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -184,7 +184,9 @@ fundamental-mode) for performance sake." (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) (defun doom|detect-indentation () - (unless (or doom-inhibit-indent-detection (eq major-mode 'fundamental-mode)) + (unless (or doom-inhibit-indent-detection + (eq major-mode 'fundamental-mode) + (not (derived-mode-p 'special-mode))) (dtrt-indent-mode +1))) (unless noninteractive (add-hook 'after-change-major-mode-hook #'doom|detect-indentation))) From 1aec48a84833d5fe0c5bdd2b2bf9d17c4caf7c8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 03:09:53 +0200 Subject: [PATCH 1465/4235] The *real* fix for whitespace-mode interfering with the mu4e sidebar #607 --- core/core-ui.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 7a4256f5c..e0a96a070 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -313,7 +313,9 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (defun doom|show-whitespace-maybe () "Show whitespace-mode when file has an `indent-tabs-mode' that is different from the default." - (unless (eq indent-tabs-mode (default-value 'indent-tabs-mode)) + (unless (or (eq indent-tabs-mode (default-value 'indent-tabs-mode)) + (eq major-mode fundamental-mode) + (derived-mode-p 'special-mode)) (require 'whitespace) (set (make-local-variable 'whitespace-style) (if (or (bound-and-true-p whitespace-mode) From e51e483c86f100130c7e504325ed8c8e66b46d21 Mon Sep 17 00:00:00 2001 From: Sean Dawson Date: Fri, 25 May 2018 21:17:13 -0400 Subject: [PATCH 1466/4235] Small fixes for go-mode: - Fixed typo for gocode command in `doctor.el` - Only enable flycheck mode if the syntax-checker feature is enabled --- modules/lang/go/config.el | 4 +++- modules/lang/go/doctor.el | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index f8e8c6050..88d1da442 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -16,8 +16,10 @@ (setq gofmt-command goimports)) (setq gofmt-show-errors nil) ; Leave it to flycheck + (if (featurep! :feature syntax-checker) + (add-hook! 'go-mode-hook #'flycheck-mode)) - (add-hook! 'go-mode-hook #'(flycheck-mode go-eldoc-setup)) + (add-hook! 'go-mode-hook #'go-eldoc-setup) (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t)) diff --git a/modules/lang/go/doctor.el b/modules/lang/go/doctor.el index cf47a544d..512780ba6 100644 --- a/modules/lang/go/doctor.el +++ b/modules/lang/go/doctor.el @@ -9,5 +9,5 @@ (when (featurep! :completion company) (require 'company-go) - (unless (executable-find command-go-gocode-command) + (unless (executable-find company-go-gocode-command) (warn! "Couldn't find gocode. Code completion won't work"))) From cfe6f5b4e0ceece8033f801542cf617b994aa1e9 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Fri, 25 May 2018 20:29:15 -0500 Subject: [PATCH 1467/4235] Update README.org Fix the broken link because of formatting. --- modules/lang/solidity/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/solidity/README.org b/modules/lang/solidity/README.org index 69214de12..e0800b5a8 100644 --- a/modules/lang/solidity/README.org +++ b/modules/lang/solidity/README.org @@ -3,7 +3,7 @@ This module adds [[https://github.com/ethereum/solidity][Solidity]] support through [[https://github.com/ethereum/emacs-solidity][solidity-mode]] + Syntax-checking (~flycheck~) -+ Code completion (~[[https://github.com/ssmolkin1/company-solidity][company-solidity]]~) ++ Code completion ([[https://github.com/ssmolkin1/company-solidity][company-solidity]]) + Gas estimation (~C-c C-g~) * Table of Contents :TOC: From 4200a1713c88f59cc1c606b38b36ba4447e7062b Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Fri, 25 May 2018 20:32:27 -0500 Subject: [PATCH 1468/4235] Update config.el Add a missing ) --- modules/lang/solidity/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index 653cdc6a0..ae60beb06 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -14,7 +14,7 @@ :when (featurep! :feature syntax-checker) :after solidity-mode :init (add-hook 'solidity-mode-hook #'flycheck-mode) - :config (setq flycheck-solidity-solc-addstd-contracts t) + :config (setq flycheck-solidity-solc-addstd-contracts t)) (def-package! company-solidity From 67eb749d1ecae079f8bd06c8bd5d394d04c4edbd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 10:33:55 +0200 Subject: [PATCH 1469/4235] lang/go: group flycheck config & use add-hook --- modules/lang/go/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 88d1da442..1089d5905 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -15,11 +15,11 @@ (when-let* ((goimports (executable-find "goimports"))) (setq gofmt-command goimports)) - (setq gofmt-show-errors nil) ; Leave it to flycheck - (if (featurep! :feature syntax-checker) - (add-hook! 'go-mode-hook #'flycheck-mode)) + (when (featurep! :feature syntax-checker) + (setq gofmt-show-errors nil) ; Leave it to flycheck + (add-hook 'go-mode-hook #'flycheck-mode)) - (add-hook! 'go-mode-hook #'go-eldoc-setup) + (add-hook 'go-mode-hook #'go-eldoc-setup) (add-hook! go-mode (add-hook 'before-save-hook #'gofmt-before-save nil t)) From dc86b617043c2802524c4afa7fcc622f57984672 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 11:13:21 +0200 Subject: [PATCH 1470/4235] Fix vcs/git-browse* commands #616 Caused by upstream changes to git-link, where `git-link--remote-host' was removed. --- modules/feature/version-control/autoload.el | 25 ++++++++++++--------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/feature/version-control/autoload.el b/modules/feature/version-control/autoload.el index e3f9a4cf4..65734f350 100644 --- a/modules/feature/version-control/autoload.el +++ b/modules/feature/version-control/autoload.el @@ -2,13 +2,12 @@ ;;;###autoload (defun +vcs-root () - "Get git url root." - (require 'git-link) - (let ((remote (git-link--select-remote))) - (if (git-link--remote-host remote) - (format "https://%s/%s" - (git-link--remote-host remote) - (git-link--remote-dir remote)) + "Return the root git repo URL for the current file." + (let* ((remote (git-link--select-remote)) + (remote-url (git-link--remote-url remote)) + (remote-info (if remote-url (git-link--parse-remote remote-url)))) + (if remote-info + (format "https://%s/%s" (car remote-info) (cadr remote-info)) (error "Remote `%s' is unknown or contains an unsupported URL" remote)))) (defvar git-link-open-in-browser) @@ -25,11 +24,15 @@ repository root." ;;;###autoload (defun +vcs/git-browse-issues () - "Open the github issues page for current repo." + "Open the issues page for current repo." (interactive) - (if-let* ((root (+vcs-root))) - (browse-url (concat root "/issues")) - (user-error "No git root found!"))) + (browse-url (format "%s/issues" (+vcs-root)))) + +;;;###autoload +(defun +vcs/git-browse-pulls () + "Open the pull requests page for current repo." + (interactive) + (browse-url (format "%s/pulls" (+vcs-root)))) ;;;###autoload (defun +vcs*update-header-line (revision) From 4e2beb8b7ecfae0fade0e08e16eae4780189912d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 14:20:23 +0200 Subject: [PATCH 1471/4235] Merge +popup-define's documentation into :popup setting's Users are more likely to view :popup's documentation for information on defining popup rules (they shouldn't be using +popup-define!). --- modules/ui/popup/autoload.el | 48 ++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index c1e318514..71459fe67 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -5,16 +5,27 @@ ;;;###autoload (def-setting! :popup (condition &optional alist parameters) - "Register a popup rule. + "Define a popup rule. -CONDITION can be a regexp string or a function. See `display-buffer' for a list -of possible entries for ALIST, which tells the display system how to initialize -the popup window. PARAMETERS is an alist of window parameters. See -`+popup-window-parameters' for a list of custom parameters provided by the popup -module. +CONDITION can be a regexp string or a function. -ALIST supports one custom parameter: `size', which will resolve to -`window-height' or `window-width' depending on `side'." +For ALIST, see `display-buffer' and `display-buffer-alist' for a list of +possible entries, which instruct the display system how to initialize the popup +window. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for +a list of custom parameters provided by the popup module. + +If certain attributes/parameters are omitted, the ones from +`+popup-default-alist' and `+popup-default-parameters' will be used. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean." `(progn (+popup-define ,condition ,alist ,parameters) (when (bound-and-true-p +popup-mode) @@ -23,8 +34,8 @@ ALIST supports one custom parameter: `size', which will resolve to ;;;###autoload (def-setting! :popups (&rest rules) - "Register multiple popup rules with :popup setting (`doom--set:popup'). For -example: + "Define multiple popup rules. See `doom--set:popup' for the specifications of +each individual rule. (set! :popups (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) @@ -37,23 +48,6 @@ example: ;;;###autoload (defsubst +popup-define (condition &optional alist parameters) - "Define a popup rule. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. - -If CONDITION is met, the buffer will be displayed in a popup window with ALIST -and window PARAMETERS. See `display-buffer-alist' for details on what ALIST may -contain and `+popup-window-parameters' for what window parameters that the popup -module supports. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -If certain attributes/parameters are omitted, the ones from -`+popup-default-alist' and `+popup-default-parameters' will be used." (declare (indent 1)) (push (if (eq alist :ignore) (list condition nil) From 177bf2a9de5aa5d0a1686c23f7094ecdaa4a9a82 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 18:55:37 +0200 Subject: [PATCH 1472/4235] Fix evil change/delete operators in eshell buffers evil-{change,delete}{,-line} now jump to the prompt before trying to modify the buffer. --- modules/tools/eshell/autoload/evil.el | 49 +++++++++++++-------------- modules/tools/eshell/config.el | 2 ++ 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/modules/tools/eshell/autoload/evil.el b/modules/tools/eshell/autoload/evil.el index 79a2df1bd..6e9ac223e 100644 --- a/modules/tools/eshell/autoload/evil.el +++ b/modules/tools/eshell/autoload/evil.el @@ -13,34 +13,33 @@ (evil-define-operator +eshell/evil-change (beg end type register yank-handler delete-func) "Like `evil-change' but will not delete/copy the prompt." (interactive "") - (let ((delete-func (or delete-func #'evil-delete)) - (nlines (1+ (evil-count-lines beg end)))) - (unless (eq evil-want-fine-undo t) - (evil-start-undo-step)) - (when (get-text-property beg 'read-only) - (save-excursion - (goto-char beg) - (evil-collection-eshell-next-prompt) - (setq beg (point)))) - (funcall delete-func beg end type register yank-handler) - (cond - ((eq type 'line) - (goto-char eshell-last-output-end) - (when (get-text-property (point) 'read-only) - (evil-collection-eshell-next-prompt)) - (evil-append 1)) - ((eq type 'block) (evil-insert 1 nlines)) - (t - (evil-insert 1))))) + (save-restriction + (narrow-to-region eshell-last-output-end (point-max)) + (evil-change (max beg (point-min)) + (if (eq type 'line) (point-max) (min (or end (point-max)) (point-max))) + type register yank-handler delete-func))) ;;;###autoload (autoload '+eshell/evil-change-line "tools/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-change-line (beg end type register yank-handler) "Change to end of line." :motion evil-end-of-line (interactive "") - (when (get-text-property beg 'read-only) - (save-excursion - (goto-char beg) - (evil-collection-eshell-next-prompt) - (setq beg (point)))) - (evil-change beg end type register yank-handler #'evil-delete-line)) + (+eshell/evil-change beg end type register yank-handler #'evil-delete-line)) + +;;;###autoload (autoload '+eshell/evil-delete "tools/eshell/autoload/evil" nil t) +(evil-define-operator +eshell/evil-delete (beg end type register yank-handler) + "Like `evil-delete' but will not delete/copy the prompt." + (interactive "") + (save-restriction + (narrow-to-region eshell-last-output-end (point-max)) + (evil-delete (if beg (max beg (point-min)) (point-min)) + (if (eq type 'line) (point-max) (min (or end (point-max)) (point-max))) + type register yank-handler))) + +;;;###autoload (autoload '+eshell/evil-delete-line "tools/eshell/autoload/evil" nil t) +(evil-define-operator +eshell/evil-delete-line (_beg end type register yank-handler) + "Change to end of line." + :motion nil + :keep-visual t + (interactive "") + (+eshell/evil-delete (point) end type register yank-handler)) diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 75870835a..b6708a5f7 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -50,6 +50,8 @@ redefines its keys every time `eshell-mode' is enabled." (map! :map eshell-mode-map :n "c" #'+eshell/evil-change :n "C" #'+eshell/evil-change-line + :n "d" #'+eshell/evil-delete + :n "D" #'+eshell/evil-delete-line :i "C-d" #'+eshell/quit-or-delete-char :i "C-p" #'eshell-previous-input :i "C-n" #'eshell-next-input From c1c3a0987cc23fb79b72d76cecf077cdfd050ac9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 18:58:00 +0200 Subject: [PATCH 1473/4235] Better move-to-prompt-on-insert-mode hook for eshell --- modules/tools/eshell/autoload/evil.el | 10 ++++++++++ modules/tools/eshell/config.el | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/modules/tools/eshell/autoload/evil.el b/modules/tools/eshell/autoload/evil.el index 6e9ac223e..60c1c52d3 100644 --- a/modules/tools/eshell/autoload/evil.el +++ b/modules/tools/eshell/autoload/evil.el @@ -1,6 +1,16 @@ ;;; tools/eshell/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) +;;;###autoload +(defun +eshell|goto-prompt-on-insert () + "Move cursor to the prompt when switching to insert mode (if point isn't +already there)." + (when (< (point) eshell-last-output-end) + (goto-char + (if (memq this-command '(evil-append evil-append-line)) + (point-max) + eshell-last-output-end)))) + ;;;###autoload (autoload '+eshell:run "tools/eshell/autoload/evil" nil t) (evil-define-command +eshell:run (command bang) ;; TODO Add COMMAND support diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index b6708a5f7..73ee8cdac 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -44,6 +44,14 @@ (append eshell-visual-commands '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim")) eshell-visual-subcommands '(("git" "log" "l" "diff" "show")))) + (defun +eshell|init-evil () + "Replace `evil-collection-eshell-next-prompt-on-insert' with +`+eshell|goto-prompt-on-insert'." + (dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook)) + (remove-hook hook 'evil-collection-eshell-next-prompt-on-insert t) + (add-hook hook '+eshell|goto-prompt-on-insert nil t))) + (add-hook 'eshell-mode-hook #'+eshell|init-evil) + (defun +eshell|init-keymap () "Setup eshell keybindings. This must be done in a hook because eshell-mode redefines its keys every time `eshell-mode' is enabled." From e70b1af49fd61001e1d805406b8abeec0094dfd4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 19:13:15 +0200 Subject: [PATCH 1474/4235] Bind RET to +eshell/goto-end-of-prompt from normal mode This command enters insert state. --- modules/tools/eshell/autoload/evil.el | 8 ++++++++ modules/tools/eshell/config.el | 1 + 2 files changed, 9 insertions(+) diff --git a/modules/tools/eshell/autoload/evil.el b/modules/tools/eshell/autoload/evil.el index 60c1c52d3..e331d9d51 100644 --- a/modules/tools/eshell/autoload/evil.el +++ b/modules/tools/eshell/autoload/evil.el @@ -11,6 +11,14 @@ already there)." (point-max) eshell-last-output-end)))) +;;;###autoload +(defun +eshell/goto-end-of-prompt () + "Move cursor to the prompt when switching to insert mode (if point isn't +already there)." + (interactive) + (goto-char (point-max)) + (evil-append 1)) + ;;;###autoload (autoload '+eshell:run "tools/eshell/autoload/evil" nil t) (evil-define-command +eshell:run (command bang) ;; TODO Add COMMAND support diff --git a/modules/tools/eshell/config.el b/modules/tools/eshell/config.el index 73ee8cdac..45e16e9f2 100644 --- a/modules/tools/eshell/config.el +++ b/modules/tools/eshell/config.el @@ -56,6 +56,7 @@ "Setup eshell keybindings. This must be done in a hook because eshell-mode redefines its keys every time `eshell-mode' is enabled." (map! :map eshell-mode-map + :n [return] #'+eshell/goto-end-of-prompt :n "c" #'+eshell/evil-change :n "C" #'+eshell/evil-change-line :n "d" #'+eshell/evil-delete From f9bcd2aff3e0455a03de2dbd51f11abf7afcc0da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 19:27:53 +0200 Subject: [PATCH 1475/4235] feature/evil: don't revert to initial state on window switch The issue this "fixes" wasn't really an issue to begin with. --- modules/feature/evil/autoload/evil.el | 9 --------- modules/feature/evil/config.el | 2 -- 2 files changed, 11 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index a04891154..98c432ae0 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -250,15 +250,6 @@ the first match on each line)." "Don't move cursor on indent." (save-excursion (apply orig-fn args))) -;;;###autoload -(defun +evil*restore-initial-state-on-windmove (orig-fn &rest args) - "Revert buffer to its initial state when switching to another window. This -prevents states from bleeding into other modes across windows." - (let ((initial-state (evil-initial-state major-mode 'normal))) - (unless (eq evil-state initial-state) - (evil-change-state initial-state))) - (apply orig-fn args)) - ;;;###autoload (defun +evil*resolve-vim-path (file-name) "Take a path and resolve any vim-like filename modifiers in it. This adds diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index edb65d5a1..e8215ce34 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -95,8 +95,6 @@ (add-hook 'after-save-hook #'+evil|save-buffer) ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. (advice-add #'evil-force-normal-state :after #'doom/escape) - ;; Ensure buffer is in initial mode when we leave it and return to it. - (advice-add #'windmove-do-window-select :around #'+evil*restore-initial-state-on-windmove) ;; Don't move cursor when indenting (advice-add #'evil-indent :around #'+evil*static-reindent) ;; monkey patch `evil-ex-replace-special-filenames' to improve support for From 33e478cf3360148ed97ba912143de34d104fce51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 20:13:19 +0200 Subject: [PATCH 1476/4235] Revert "Seriously. Don't prioritize *.elc files in noninteractive sessions!" This reverts commit 1d54ba4a3789e902a2643ee1109eafa2f01509d8 --- init.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/init.el b/init.el index 61d66700c..0733e4e02 100644 --- a/init.el +++ b/init.el @@ -31,7 +31,6 @@ (file-name-directory load-file-name)) (when noninteractive - (setq load-suffixes '(".el" ".elc" ".so") - load-prefer-newer noninteractive)) + (setq load-prefer-newer noninteractive)) (require 'core (concat user-emacs-directory "core/core")) From 13267250a41f2b9ea32be3a4cd4f01d42ad61e7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 21:20:30 +0200 Subject: [PATCH 1477/4235] Add :collab floobits #615 --- init.example.el | 1 + modules/collab/floobits/packages.el | 4 ++++ modules/config/default/+bindings.el | 15 ++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 modules/collab/floobits/packages.el diff --git a/init.example.el b/init.example.el index 55a4953fc..f74e349a4 100644 --- a/init.example.el +++ b/init.example.el @@ -120,6 +120,7 @@ ; +langtool) ; a proofreader (grammar/style check) for Emacs :collab + floobits ; peer programming for a price ;impatient-mode ; show off code over HTTP :config diff --git a/modules/collab/floobits/packages.el b/modules/collab/floobits/packages.el new file mode 100644 index 000000000..98eb4d29b --- /dev/null +++ b/modules/collab/floobits/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; collab/foobits/packages.el + +(package! floobits) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index b4033b14a..6e6511b81 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -259,11 +259,16 @@ :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle :desc "Terminal" :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 + (:when (featurep! :collab floobits) + :desc "floobits" :prefix "f" + :n "c" #'floobits-clear-highlights + :n "f" #'floobits-follow-user + :n "j" #'floobits-join-workspace + :n "l" #'floobits-leave-workspace + :n "R" #'floobits-share-dir-private + :n "s" #'floobits-summon + :n "t" #'floobits-follow-mode-toggle + :n "U" #'floobits-share-dir-public) ;; macos (:when IS-MAC From 4c2554c22bddb82636f8e9669efb141279ea9724 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 21:20:57 +0200 Subject: [PATCH 1478/4235] config/default: rethink term/eshell keybinds --- modules/config/default/+bindings.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 6e6511b81..828decabc 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -257,7 +257,10 @@ :desc "Neotree" :n "n" #'+neotree/open :desc "Neotree: find file" :n "N" #'+neotree/find-this-file :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle - :desc "Terminal" :n "t" #'+term/open-popup-in-project + :desc "Terminal" :n "t" #'+term/open + :desc "Terminal in popup" :n "T" #'+term/open-popup-in-project + :desc "Eshell" :n "e" #'+eshell/open + :desc "Eshell in popup" :n "E" #'+eshell/open-popup (:when (featurep! :collab floobits) :desc "floobits" :prefix "f" From 8c053fcfa5d65739f9303bc0555b9dd8463dc4b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 21:21:54 +0200 Subject: [PATCH 1479/4235] tools/eshell: remove useless remove-hook call You can't remove a hook function from a global hook list buffer locally. --- modules/tools/eshell/autoload/eshell.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 059d0fba4..33e36842b 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -134,7 +134,6 @@ module to be loaded." (defun +eshell|init () "Keep track of eshell buffers." (let ((buf (current-buffer))) - (remove-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers t) (dolist (buf (ring-elements +eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) From 6bfac0ada2b2801f730692fe84730c426b2bcc01 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 21:22:38 +0200 Subject: [PATCH 1480/4235] tools/eshell: fix split-window behavior not burying eshell This happens when there is no other buffer to replace it with. --- modules/tools/eshell/autoload/eshell.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/tools/eshell/autoload/eshell.el index 33e36842b..ae81c4530 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/tools/eshell/autoload/eshell.el @@ -169,19 +169,23 @@ delete." (eshell-life-is-too-much) (delete-char arg))) +(defsubst +eshell--bury-buffer () + (unless (switch-to-prev-buffer nil 'bury) + (switch-to-buffer (doom-fallback-buffer)))) + ;;;###autoload (defun +eshell/split-below () "Create a new eshell window below the current one." (interactive) (select-window (split-window-vertically)) - (bury-buffer)) + (+eshell--bury-buffer)) ;;;###autoload (defun +eshell/split-right () "Create a new eshell window to the right of the current one." (interactive) (select-window (split-window-horizontally)) - (bury-buffer)) + (+eshell--bury-buffer)) ;; `make-ring' ;; `ring-ref' From 41f4a31096d0b9774fadd80fc4f61525113a728c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 22:27:52 +0200 Subject: [PATCH 1481/4235] Refactor init.el (minor) --- init.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/init.el b/init.el index 0733e4e02..eda0e8894 100644 --- a/init.el +++ b/init.el @@ -27,10 +27,7 @@ ;; ;;; License: MIT -(defconst user-emacs-directory - (file-name-directory load-file-name)) - -(when noninteractive - (setq load-prefer-newer noninteractive)) +(setq user-emacs-directory (file-name-directory load-file-name) + load-prefer-newer noninteractive) (require 'core (concat user-emacs-directory "core/core")) From b5ec39f0eccc44d77f7a520248fbac155a2ddde1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 23:25:06 +0200 Subject: [PATCH 1482/4235] Rewrite (and hopefully fix) doom//upgrade again --- core/core-dispatcher.el | 45 ++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index abef3c1aa..79fd315b0 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -209,43 +209,50 @@ recompile. Run this whenever you: ;; ;; FIXME Detect & enforce remote -(defvar doom-remote "origin" +(defvar doom-repo-url "https://github.com/hlissner/doom-emacs" + "TODO") +(defvar doom-repo-remote "upgrade" "TODO") (defun doom//upgrade () "Upgrade Doom to the latest version." (interactive) (require 'vc-git) - (let* ((core-file (expand-file-name "core.el" doom-core-dir)) - (branch (vc-git--symbolic-ref core-file)) + (let* ((gitdir (expand-file-name ".git" doom-emacs-dir)) + (branch (vc-git--symbolic-ref doom-emacs-dir)) (default-directory doom-emacs-dir)) - (unless (file-exists-p core-file) + (unless (file-exists-p gitdir) (error "Couldn't find %s, was Doom cloned properly?" - (abbreviate-file-name core-file))) + (abbreviate-file-name gitdir))) (unless branch (error "Couldn't detect what branch you're using. Is %s a repo?" (abbreviate-file-name doom-emacs-dir))) - (unless (eq (vc-state core-file 'Git) 'up-to-date) - (user-error "Doom has been modified; refusing to upgrade. Stash or undo your changes")) + (unless (eq (vc-state doom-emacs-dir 'Git) 'up-to-date) + (user-error "Refusing to upgrade because Doom has been modified. Stash or undo your changes")) (with-temp-buffer (let ((buf (current-buffer))) - (when (zerop (process-file "git" nil buf nil - "fetch" "--tags" doom-remote branch)) - (let ((current-rev (vc-git-working-revision core-file)) - (rev (shell-command-to-string (format "git rev-parse %s/%s" doom-remote branch)))) + (process-file "git" nil buf nil "remote" "remove" doom-repo-remote) + (when (and (zerop (process-file "git" nil buf nil "remote" "add" + doom-repo-remote doom-repo-url)) + (zerop (process-file "git" nil buf nil + "fetch" "--tags" doom-repo-remote branch))) + (let ((current-rev (vc-git-working-revision doom-emacs-dir)) + (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) (unless rev (error "Couldn't detect Doom's version. Is %s a repo?" (abbreviate-file-name doom-emacs-dir))) (if (equal current-rev rev) (message "Doom is up to date!") - (when (or doom-auto-accept - (y-or-n-p "Doom is out of date, update?")) - (when (file-exists-p (byte-compile-dest-file core-file)) - (message "Your config is byte-compiled, removing byte-compiled files") - (doom//clean-byte-compiled-files)) - (unless (zerop (process-file "git" nil buf nil - "checkout" (format "%s/%s" doom-remote branch))) - (error "An error occurred while checking out the latest commit")) + (message "Doom is out of date.\n\n Old rev: %s\n New rev: %s\n" + current-rev rev) + (if (not (or doom-auto-accept + (y-or-n-p "Proceed?"))) + (error "Aborted") + (message "Removing byte-compiled files from your config (if any)") + (doom//clean-byte-compiled-files) + (unless (zerop (process-file "git" nil buf nil "pull" "--rebase")) + (error "An error occurred while checking out the latest commit\n\n%s" + (buffer-string))) (doom//reload) (message "Done! Please restart Emacs for changes to take effect"))))))))) From f3c7dac99790ca14b2178c850a39e7741a0ca418 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 23:25:57 +0200 Subject: [PATCH 1483/4235] Don't protect visible buffers that start with an asterix --- 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 e0a96a070..cf000b55b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -637,7 +637,7 @@ confirmation." "Don't kill the current buffer if it is visible in another window (bury it instead)." (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) - (not (equal (substring (buffer-name) 0 1) " "))))) + (not (member (substring (buffer-name) 0 1) '(" " "*")))))) (defun doom|protect-fallback-buffer () "Don't kill the scratch buffer." From fa17de9f19daef34c7dc884ad5b2135aecec4fae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 23:26:35 +0200 Subject: [PATCH 1484/4235] ui/popup: refactor :popup/:popups settings And move org popup settings to lang/org --- modules/lang/org/config.el | 17 +++++++ modules/ui/popup/autoload.el | 21 +++++---- modules/ui/popup/config.el | 88 +++++++++++++++--------------------- 3 files changed, 64 insertions(+), 62 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index d1ff4d5b8..09cf9b1f4 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -39,6 +39,7 @@ (add-hook! 'org-load-hook #'(org-crypt-use-before-save-magic +org|setup-ui + +org|setup-popups-rules +org|setup-agenda +org|setup-keybinds +org|setup-hacks)) @@ -130,6 +131,22 @@ unfold to point on startup." org-agenda-start-on-weekday nil org-agenda-start-day "-3d")) +(defun +org|setup-popups-rules () + "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." + (set! :popups + '("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" + ((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) + ((transient . 0))) + '("^\\*Org Agenda" + ((size . 0.35)) + ((select . t) (transient))) + '("^\\*Org Src" + ((size . 0.3)) + ((quit) (select . t))) + '("^CAPTURE.*\\.org$" + ((size . 0.2)) + ((quit) (select . t))))) + (defun +org|setup-ui () "Configures the UI for `org-mode'." (setq-default diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 71459fe67..ddb4995c9 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -27,7 +27,8 @@ will be tested against CONDITION, which is either a) a regexp string (which is matched against the buffer's name) or b) a function that takes no arguments and returns a boolean." `(progn - (+popup-define ,condition ,alist ,parameters) + (push (+popup--rule (list ,condition ,alist ,parameters)) + +popup--display-buffer-alist) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist)) @@ -41,21 +42,21 @@ each individual rule. (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" `(progn - ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) + (dolist (rule (nreverse (list ,@rules))) + (push (+popup--rule rule) +popup--display-buffer-alist)) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist)) ;;;###autoload -(defsubst +popup-define (condition &optional alist parameters) +(defsubst +popup--rule (args) (declare (indent 1)) - (push (if (eq alist :ignore) - (list condition nil) - `(,condition - (+popup-buffer) - ,@alist - (window-parameters ,@parameters))) - +popup--display-buffer-alist)) + (cl-destructuring-bind (condition &optional alist parameters) args + (if (eq alist :ignore) + (list condition nil) + `(,condition (+popup-buffer) + ,@alist + (window-parameters ,@parameters))))) ;; diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index d83c8d708..68a006653 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -103,60 +103,44 @@ deleted.") ;; (when (featurep! +all) - (+popup-define "^ \\*" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (+popup-define "^\\*" '((slot . 1) (vslot . -1)) '((select . t)))) + (set! :popups + '("^ \\*" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + '("^\\*" ((slot . 1) (vslot . -1)) ((select . t))))) (when (featurep! +defaults) - (+popup-define "^\\*Completions" - '((slot . -1) (vslot . -2)) - '((transient . 0))) - (+popup-define "^\\*Compil\\(?:ation\\|e-Log\\)" - '((size . 0.3)) - '((transient . 0) (quit . t))) - (+popup-define "^\\*\\(?:scratch\\|Messages\\)" - nil - '((autosave . t) (transient))) - (+popup-define "^\\*doom \\(?:term\\|eshell\\)" - '((size . 0.25) (vslot . -10)) - '((select . t) (quit) (transient . 0))) - (+popup-define "^\\*doom:" - '((size . 0.35) (side . bottom)) - '((autosave . t) (select . t) (modeline . t) (quit) (transient . t))) - (+popup-define "^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - '((size . +popup-shrink-to-fit)) - '((transient . 0) (select . ignore))) - (+popup-define "^\\*Customize" - '((slot . 2) (side . right)) - '((modeline . nil) (select . t) (quit . t))) - (+popup-define "^ \\*undo-tree\\*" - '((slot . 2) (side . left) (size . 20)) - '((modeline . nil) (select . t) (quit . t))) - - ;; `help-mode', `helpful-mode' - (+popup-define "^\\*[Hh]elp" - '((slot . 2) (vslot . 2) (size . 0.25)) - '((select . t))) - ;; `Info-mode' - (+popup-define "^\\*info\\*$" - '((slot . 2) (vslot . 2) (size . 0.35)) - '((select . t))) - - ;; `org-mode' - ;; Use org-load-hook instead of `after!' because the hook runs sooner, - ;; allowing users to override these later. - (add-hook! 'org-load-hook - (+popup-define "^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" - '((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) - '((transient . 0))) - (+popup-define "^\\*Org Agenda" - '((size . 0.35)) - '((select . t) (transient))) - (+popup-define "^\\*Org Src" - '((size . 0.3)) - '((quit) (select . t))) - (+popup-define "^CAPTURE.*\\.org$" - '((size . 0.2)) - '((quit) (select . t))))) + (set! :popups + '("^\\*Completions" + ((slot . -1) (vslot . -2)) + ((transient . 0))) + '("^\\*Compil\\(?:ation\\|e-Log\\)" + ((size . 0.3)) + ((transient . 0) (quit . t))) + '("^\\*\\(?:scratch\\|Messages\\)" + nil + ((autosave . t) (transient))) + '("^\\*doom \\(?:term\\|eshell\\)" + ((size . 0.25) (vslot . -10)) + ((select . t) (quit) (transient . 0))) + '("^\\*doom:" + ((size . 0.35) (side . bottom)) + ((autosave . t) (select . t) (modeline . t) (quit) (transient . t))) + '("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + ((size . +popup-shrink-to-fit)) + ((transient . 0) (select . ignore))) + '("^\\*Customize" + ((slot . 2) (side . right)) + ((modeline . nil) (select . t) (quit . t))) + '("^ \\*undo-tree\\*" + ((slot . 2) (side . left) (size . 20)) + ((modeline . nil) (select . t) (quit . t))) + ;; `help-mode', `helpful-mode' + '("^\\*[Hh]elp" + ((slot . 2) (vslot . 2) (size . 0.25)) + ((select . t))) + ;; `Info-mode' + '("^\\*info\\*$" + ((slot . 2) (vslot . 2) (size . 0.35)) + ((select . t))))) (add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook From d7f7efaa972091ef0847c7951c9b5e9ac5eaa5e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 23:27:18 +0200 Subject: [PATCH 1485/4235] git-commit-fill-column = 72 --- modules/feature/version-control/+git.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 8488f9076..b06af2527 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,5 +1,7 @@ ;;; feature/version-control/+git.el -*- lexical-binding: t; -*- +(setq git-commit-fill-column 72) + (when (featurep! :feature evil) (add-hook 'git-commit-mode-hook #'evil-insert-state)) From 06915312dd4f83be9a57a9934d5cbb35385b1b73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 26 May 2018 23:28:36 +0200 Subject: [PATCH 1486/4235] Update git-gutter on doom//escape, even for non-evil users --- modules/feature/version-control/+git.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index b06af2527..d5c1092cf 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -22,13 +22,13 @@ ;; Update git-gutter on focus (in case I was using git externally) (add-hook 'focus-in-hook #'git-gutter:update-all-windows) - (after! evil - (defun +version-control|update-git-gutter () - "Refresh git-gutter on ESC. Return nil to prevent shadowing other + (defun +version-control|update-git-gutter (&rest _) + "Refresh git-gutter on ESC. Return nil to prevent shadowing other `doom-escape-hook' hooks." - (when git-gutter-mode - (ignore (git-gutter)))) - (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t)) + (when git-gutter-mode + (ignore (git-gutter)))) + + (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t) (defhydra +version-control@git-gutter (:body-pre (git-gutter-mode 1) :hint nil) From 0c0276378f88fc7e78e878f8c3efc6418f404ef5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 27 May 2018 11:41:16 +0200 Subject: [PATCH 1487/4235] feature/evil: add evil-ediff --- modules/feature/evil/config.el | 4 ++++ modules/feature/evil/packages.el | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e8215ce34..3c56d402f 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -155,6 +155,10 @@ :commands (evilem-create evilem-default-keybindings)) +(def-package! evil-ediff + :after ediff) + + (def-package! evil-embrace :after evil-surround :commands (embrace-add-pair embrace-add-pair-regexp) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index 9de021a53..642acc328 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -6,6 +6,7 @@ (package! evil-commentary) (package! evil-collection) (package! evil-easymotion) +(package! evil-ediff) (package! evil-embrace) (package! evil-escape) (package! evil-exchange) From e2d055a40b4f937d7fa44d63ecb0b14612b375e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 27 May 2018 12:05:15 +0200 Subject: [PATCH 1488/4235] :boom: Move dired, electric-indent, eshell, imenu, term modules to :emacs --- init.example.el | 12 +++++++----- modules/{tools => emacs}/dired/config.el | 0 modules/{tools => emacs}/dired/packages.el | 0 modules/{tools => emacs}/electric-indent/config.el | 2 +- modules/{tools => emacs}/eshell/autoload/eshell.el | 2 +- modules/{tools => emacs}/eshell/autoload/evil.el | 12 ++++++------ modules/{tools => emacs}/eshell/config.el | 2 +- modules/{tools => emacs}/imenu/config.el | 2 +- modules/{tools => emacs}/imenu/packages.el | 2 +- modules/{tools => emacs}/term/autoload.el | 2 +- modules/{tools => emacs}/term/config.el | 2 +- modules/{tools => emacs}/term/packages.el | 2 +- 12 files changed, 21 insertions(+), 19 deletions(-) rename modules/{tools => emacs}/dired/config.el (100%) rename modules/{tools => emacs}/dired/packages.el (100%) rename modules/{tools => emacs}/electric-indent/config.el (95%) rename modules/{tools => emacs}/eshell/autoload/eshell.el (99%) rename modules/{tools => emacs}/eshell/autoload/evil.el (85%) rename modules/{tools => emacs}/eshell/config.el (98%) rename modules/{tools => emacs}/imenu/config.el (92%) rename modules/{tools => emacs}/imenu/packages.el (74%) rename modules/{tools => emacs}/term/autoload.el (95%) rename modules/{tools => emacs}/term/config.el (86%) rename modules/{tools => emacs}/term/packages.el (66%) diff --git a/init.example.el b/init.example.el index f74e349a4..638622f33 100644 --- a/init.example.el +++ b/init.example.el @@ -42,14 +42,17 @@ vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows - :tools + :emacs dired ; making dired pretty [functional] - editorconfig ; let someone else argue about tabs vs spaces electric-indent ; smarter, keyword-based electric-indent - ;ein ; tame Jupyter notebooks with emacs eshell ; a consistent, cross-platform shell (WIP) - ;gist ; interacting with github gists imenu ; an imenu sidebar and searchable code index + ;term ; terminals in Emacs + + :tools + editorconfig ; let someone else argue about tabs vs spaces + ;ein ; tame Jupyter notebooks with emacs + ;gist ; interacting with github gists ;macos ; MacOS-specific commands ;make ; run make tasks from Emacs ;magit ; @@ -58,7 +61,6 @@ ;prodigy ; FIXME managing external services & code builders ;rgb ; creating color strings rotate-text ; cycle region at point between text candidates - ;term ; terminals in Emacs tmux ; an API for interacting with tmux upload ; map local to remote projects via ssh/ftp diff --git a/modules/tools/dired/config.el b/modules/emacs/dired/config.el similarity index 100% rename from modules/tools/dired/config.el rename to modules/emacs/dired/config.el diff --git a/modules/tools/dired/packages.el b/modules/emacs/dired/packages.el similarity index 100% rename from modules/tools/dired/packages.el rename to modules/emacs/dired/packages.el diff --git a/modules/tools/electric-indent/config.el b/modules/emacs/electric-indent/config.el similarity index 95% rename from modules/tools/electric-indent/config.el rename to modules/emacs/electric-indent/config.el index 01a1f3f86..f823676c5 100644 --- a/modules/tools/electric-indent/config.el +++ b/modules/emacs/electric-indent/config.el @@ -1,4 +1,4 @@ -;;; tools/electric-indent/config.el -*- lexical-binding: t; -*- +;;; emacs/electric-indent/config.el -*- lexical-binding: t; -*- ;; Smarter, keyword-based electric-indent diff --git a/modules/tools/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el similarity index 99% rename from modules/tools/eshell/autoload/eshell.el rename to modules/emacs/eshell/autoload/eshell.el index ae81c4530..e2ff5f261 100644 --- a/modules/tools/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -1,4 +1,4 @@ -;;; tools/eshell/autoload/eshell.el -*- lexical-binding: t; -*- +;;; emacs/eshell/autoload/eshell.el -*- lexical-binding: t; -*- ;;;###autoload (defface +eshell-prompt-pwd '((t :inherit eshell-prompt)) diff --git a/modules/tools/eshell/autoload/evil.el b/modules/emacs/eshell/autoload/evil.el similarity index 85% rename from modules/tools/eshell/autoload/evil.el rename to modules/emacs/eshell/autoload/evil.el index e331d9d51..608b36354 100644 --- a/modules/tools/eshell/autoload/evil.el +++ b/modules/emacs/eshell/autoload/evil.el @@ -1,4 +1,4 @@ -;;; tools/eshell/autoload/evil.el -*- lexical-binding: t; -*- +;;; emacs/eshell/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) ;;;###autoload @@ -19,7 +19,7 @@ already there)." (goto-char (point-max)) (evil-append 1)) -;;;###autoload (autoload '+eshell:run "tools/eshell/autoload/evil" nil t) +;;;###autoload (autoload '+eshell:run "emacs/eshell/autoload/evil" nil t) (evil-define-command +eshell:run (command bang) ;; TODO Add COMMAND support (interactive "") @@ -27,7 +27,7 @@ already there)." (+eshell/open command) (+eshell/open-popup command))) -;;;###autoload (autoload '+eshell/evil-change "tools/eshell/autoload/evil" nil t) +;;;###autoload (autoload '+eshell/evil-change "emacs/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-change (beg end type register yank-handler delete-func) "Like `evil-change' but will not delete/copy the prompt." (interactive "") @@ -37,14 +37,14 @@ already there)." (if (eq type 'line) (point-max) (min (or end (point-max)) (point-max))) type register yank-handler delete-func))) -;;;###autoload (autoload '+eshell/evil-change-line "tools/eshell/autoload/evil" nil t) +;;;###autoload (autoload '+eshell/evil-change-line "emacs/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-change-line (beg end type register yank-handler) "Change to end of line." :motion evil-end-of-line (interactive "") (+eshell/evil-change beg end type register yank-handler #'evil-delete-line)) -;;;###autoload (autoload '+eshell/evil-delete "tools/eshell/autoload/evil" nil t) +;;;###autoload (autoload '+eshell/evil-delete "emacs/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-delete (beg end type register yank-handler) "Like `evil-delete' but will not delete/copy the prompt." (interactive "") @@ -54,7 +54,7 @@ already there)." (if (eq type 'line) (point-max) (min (or end (point-max)) (point-max))) type register yank-handler))) -;;;###autoload (autoload '+eshell/evil-delete-line "tools/eshell/autoload/evil" nil t) +;;;###autoload (autoload '+eshell/evil-delete-line "emacs/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-delete-line (_beg end type register yank-handler) "Change to end of line." :motion nil diff --git a/modules/tools/eshell/config.el b/modules/emacs/eshell/config.el similarity index 98% rename from modules/tools/eshell/config.el rename to modules/emacs/eshell/config.el index 45e16e9f2..4e9d5bf23 100644 --- a/modules/tools/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -1,4 +1,4 @@ -;;; tools/eshell/config.el -*- lexical-binding: t; -*- +;;; emacs/eshell/config.el -*- lexical-binding: t; -*- ;; see: ;; + `+eshell/open': open in current buffer diff --git a/modules/tools/imenu/config.el b/modules/emacs/imenu/config.el similarity index 92% rename from modules/tools/imenu/config.el rename to modules/emacs/imenu/config.el index 577476ab9..4aff311db 100644 --- a/modules/tools/imenu/config.el +++ b/modules/emacs/imenu/config.el @@ -1,4 +1,4 @@ -;;; tools/imenu/config.el -*- lexical-binding: t; -*- +;;; emacs/imenu/config.el -*- lexical-binding: t; -*- ;; `imenu-anywhere' (setq imenu-anywhere-delimiter ": ") diff --git a/modules/tools/imenu/packages.el b/modules/emacs/imenu/packages.el similarity index 74% rename from modules/tools/imenu/packages.el rename to modules/emacs/imenu/packages.el index 0328b7016..60b3cfc93 100644 --- a/modules/tools/imenu/packages.el +++ b/modules/emacs/imenu/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/imenu/packages.el +;;; emacs/imenu/packages.el (package! imenu-anywhere) (package! imenu-list) diff --git a/modules/tools/term/autoload.el b/modules/emacs/term/autoload.el similarity index 95% rename from modules/tools/term/autoload.el rename to modules/emacs/term/autoload.el index bb4391650..e1dabf554 100644 --- a/modules/tools/term/autoload.el +++ b/modules/emacs/term/autoload.el @@ -1,4 +1,4 @@ -;;; tools/term/autoload.el -*- lexical-binding: t; -*- +;;; emacs/term/autoload.el -*- lexical-binding: t; -*- ;;;###autoload (defun +term/open (&optional project-root) diff --git a/modules/tools/term/config.el b/modules/emacs/term/config.el similarity index 86% rename from modules/tools/term/config.el rename to modules/emacs/term/config.el index 3aaad2453..ac3487f09 100644 --- a/modules/tools/term/config.el +++ b/modules/emacs/term/config.el @@ -1,4 +1,4 @@ -;;; tools/term/config.el -*- lexical-binding: t; -*- +;;; emacs/term/config.el -*- lexical-binding: t; -*- ;; `multi-term' (setq multi-term-dedicated-window-height 20 diff --git a/modules/tools/term/packages.el b/modules/emacs/term/packages.el similarity index 66% rename from modules/tools/term/packages.el rename to modules/emacs/term/packages.el index 87724c0ef..963aff83e 100644 --- a/modules/tools/term/packages.el +++ b/modules/emacs/term/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/term/packages.el +;;; emacs/term/packages.el (package! multi-term) From bdee28609a9f33aa24a64ba5334e5249c20b29d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 27 May 2018 12:40:13 +0200 Subject: [PATCH 1489/4235] New emacs/ediff module Ediff config was moved out of core. Also includes evil compatibility (mvoed out of feature/evil) & wconf save/restore. --- core/core-editor.el | 5 ----- init.example.el | 1 + modules/emacs/ediff/config.el | 25 +++++++++++++++++++++++++ modules/emacs/ediff/packages.el | 5 +++++ modules/feature/evil/config.el | 4 ---- 5 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 modules/emacs/ediff/config.el create mode 100644 modules/emacs/ediff/packages.el diff --git a/core/core-editor.el b/core/core-editor.el index cbbe3d437..48a84c842 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -45,11 +45,6 @@ successfully sets indent_style/indent_size.") truncate-lines t truncate-partial-width-windows 50) -;; ediff -(setq ediff-diff-options "-w" - ediff-split-window-function #'split-window-horizontally - ediff-window-setup-function #'ediff-setup-windows-plain) - (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/init.example.el b/init.example.el index 638622f33..767ea199d 100644 --- a/init.example.el +++ b/init.example.el @@ -44,6 +44,7 @@ :emacs dired ; making dired pretty [functional] + ediff ; comparing files in Emacs electric-indent ; smarter, keyword-based electric-indent eshell ; a consistent, cross-platform shell (WIP) imenu ; an imenu sidebar and searchable code index diff --git a/modules/emacs/ediff/config.el b/modules/emacs/ediff/config.el new file mode 100644 index 000000000..9a9cea372 --- /dev/null +++ b/modules/emacs/ediff/config.el @@ -0,0 +1,25 @@ +;;; emacs/ediff/config.el -*- lexical-binding: t; -*- + +;; `ediff' +(setq ediff-diff-options "-w" ; turn off whitespace checking + ediff-split-window-function #'split-window-horizontally + ediff-window-setup-function #'ediff-setup-windows-plain) + +;; Restore window config after quitting ediff +(defvar +ediff--saved-wconf nil) + +(defun +ediff|save-wconf () + (setq +ediff--saved-wconf (current-window-configuration))) +(defun +ediff|restore-wconf () + (set-window-configuration +ediff--saved-wconf)) +(add-hook 'ediff-before-setup-hook #'+ediff|save-wconf) +(add-hook! '(ediff-quit-hook ediff-suspend-hook) #'+ediff|restore-wconf 'append) + + +;; +;; Plugins +;; + +(def-package! evil-ediff + :when (featurep! :feature evil) + :after ediff) diff --git a/modules/emacs/ediff/packages.el b/modules/emacs/ediff/packages.el new file mode 100644 index 000000000..6b06cb319 --- /dev/null +++ b/modules/emacs/ediff/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; emacs/ediff/packages.el + +(when (featurep! :feature evil) + (package! evil-ediff)) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 3c56d402f..e8215ce34 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -155,10 +155,6 @@ :commands (evilem-create evilem-default-keybindings)) -(def-package! evil-ediff - :after ediff) - - (def-package! evil-embrace :after evil-surround :commands (embrace-add-pair embrace-add-pair-regexp) From 1a452b68421070392a9b66ad086b4159accdeffd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 27 May 2018 12:44:22 +0200 Subject: [PATCH 1490/4235] :boom: Change first arg of load! macro load!'s first argument is no longer a symbol (that will cause void-variable errors now) to save on unnecessary interning and simplify compile-time logic. It accepts any valid form that evaluates to a string now. If you use load!, you need to change its argument to a string! e.g. (load! +my-module) => (load! "+my-module") --- core/autoload/packages.el | 2 +- core/core-dispatcher.el | 10 ++-- core/core-packages.el | 50 ++++++++----------- modules/app/email/config.el | 2 +- modules/config/default/config.el | 4 +- modules/feature/version-control/config.el | 4 +- modules/lang/haskell/config.el | 4 +- modules/lang/java/config.el | 4 +- modules/lang/javascript/config.el | 2 +- modules/lang/latex/config.el | 2 +- modules/lang/org/config.el | 12 ++--- modules/lang/web/config.el | 4 +- .../password-store/test/autoload-pass.el | 2 +- modules/ui/popup/config.el | 2 +- 14 files changed, 48 insertions(+), 56 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 8b3be26c2..6451cbae4 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -1,6 +1,6 @@ ;;; core/autoload/packages.el -*- lexical-binding: t; -*- -(load! cache) +(load! "cache") ;;; Private functions diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 79fd315b0..ccd0c73df 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -3,10 +3,10 @@ ;; Eagerly load these libraries because this module may be loaded in a session ;; that hasn't been fully initialized (where autoloads files haven't been ;; generated or `load-path' populated). -(load! autoload/packages) -(load! autoload/modules) -(load! autoload/debug) -(load! autoload/message) +(load! "autoload/packages") +(load! "autoload/modules") +(load! "autoload/debug") +(load! "autoload/message") ;; @@ -175,7 +175,7 @@ respectively." (def-dispatcher! test "Run Doom unit tests." - (load! autoload/test) + (load! "autoload/test") (doom//run-tests args)) (def-dispatcher! info diff --git a/core/core-packages.el b/core/core-packages.el index 9cc8ff49b..bcf3f6c97 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -566,12 +566,12 @@ Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." (let ((doom-modules (doom-module-table (or modules t))) - init-forms config-forms file-name-handler-alist) - (maphash (lambda (key value) - (let ((path (plist-get value :path))) - (push `(let ((doom--current-module ',key)) (load! init ,path t)) + init-forms config-forms) + (maphash (lambda (key plist) + (let ((path (plist-get plist :path))) + (push `(let ((doom--current-module ',key)) (load! "init" ,path t)) init-forms) - (push `(let ((doom--current-module ',key)) (load! config ,path t)) + (push `(let ((doom--current-module ',key)) (load! "config" ,path t)) config-forms))) doom-modules) `(let (file-name-handler-alist) @@ -629,34 +629,26 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." ,@body))) ((error "'%s' isn't a valid hook for def-package-hook!" when)))) -(defmacro load! (filesym &optional path noerror) +(defmacro load! (filename &optional path noerror) "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 +FILENAME 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). 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." - (or (symbolp filesym) - (signal 'wrong-type-argument (list 'symbolp filesym))) - (let ((path (or (when path - (cond ((stringp path) path) - ((symbolp path) (symbol-value path)) - ((listp path) (eval path t)))) - (and (bound-and-true-p byte-compile-current-file) - (file-name-directory byte-compile-current-file)) - (and load-file-name (file-name-directory load-file-name)) - (and buffer-file-name - (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' from '%s'" file path)))))) + (unless path + (setq path (or (and (bound-and-true-p byte-compile-current-file) + (file-name-directory byte-compile-current-file)) + (and load-file-name (file-name-directory load-file-name)) + (and buffer-file-name + (file-name-directory buffer-file-name)) + (error "Could not detect path to look for '%s' in" filename)))) + `(load ,(if path + `(expand-file-name ,filename ,path) + filename) + ,noerror ,(not doom-debug-mode))) (defmacro require! (module submodule &optional reload-p &rest plist) "Loads the module specified by MODULE (a property) and SUBMODULE (a symbol). @@ -671,9 +663,9 @@ The module is only loaded once. If RELOAD-P is non-nil, load it again." (if (file-directory-p module-path) `(condition-case-unless-debug ex (let ((doom--current-module ',(cons module submodule))) - (load! init ,module-path :noerror) + (load! "init" ,module-path :noerror) (let ((doom--stage 'config)) - (load! config ,module-path :noerror))) + (load! "config" ,module-path :noerror))) ('error (lwarn 'doom-modules :error "%s in '%s %s' -> %s" @@ -796,7 +788,7 @@ loads MODULE SUBMODULE's packages.el file." (flags ,flags)) (when flags (doom-module-put ,module ',submodule :flags flags)) - (load! packages ,(doom-module-locate-path module submodule) t))) + (load! "packages" ,(doom-module-locate-path module submodule) t))) ;; diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 8814d6752..49274f811 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -174,4 +174,4 @@ default/fallback account." ;; Sub-modules ;; -(if (featurep! +gmail) (load! +gmail)) +(if (featurep! +gmail) (load! "+gmail")) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 12bd8c5ec..2dacb9b11 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -1,6 +1,6 @@ ;;; config/default/config.el -*- lexical-binding: t; -*- -(if (featurep! +bindings) (load! +bindings)) +(if (featurep! +bindings) (load! "+bindings")) ;; @@ -79,7 +79,7 @@ (when (featurep 'evil) (when (featurep! +evil-commands) - (load! +evil-commands)) + (load! "+evil-commands")) (when (featurep! +bindings) (defvar +default-repeat-forward-key ";") diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index d49a806b1..646517675 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -1,7 +1,7 @@ ;;; feature/version-control/config.el -*- lexical-binding: t; -*- -(load! +git) -;; TODO (load! +hg) +(load! "+git") +;; TODO (load! "+hg") ;; (setq vc-make-backup-files nil) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 559b244aa..6f0513258 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -1,7 +1,7 @@ ;;; lang/haskell/config.el -*- lexical-binding: t; -*- -(cond ((featurep! +intero) (load! +intero)) - ((featurep! +dante) (load! +dante))) +(cond ((featurep! +intero) (load! "+intero")) + ((featurep! +dante) (load! "+dante"))) ;; diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 5ace2680a..0d0a10fab 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -2,9 +2,9 @@ (add-hook 'java-mode-hook #'rainbow-delimiters-mode) -(cond ((featurep! +meghanada) (load! +meghanada)) +(cond ((featurep! +meghanada) (load! "+meghanada")) ;; TODO lang/java +lsp (lsp-java?) - ;; ((featurep! +lsp) (load! +lsp)) + ;; ((featurep! +lsp) (load! "+lsp")) ) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index c5721ff22..adda012bc 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -207,7 +207,7 @@ :match "/screeps\\(?:-ai\\)?/.+$" :modes (+javascript-npm-mode) :add-hooks (+javascript|init-screeps-mode) - :on-load (load! +screeps)) + :on-load (load! "+screeps")) (def-project-mode! +javascript-gulp-mode :files "gulpfile.js") diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 758f703a7..3bd24da6e 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -25,7 +25,7 @@ (after! tex-site ;; Set some varibles to fontify common LaTeX commands. - (load! +fontification) + (load! "+fontification") (setq ;; Enable parse on load. TeX-parse-self t ;; When running TeX, just save, don't ask diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 09cf9b1f4..be1238292 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -4,12 +4,12 @@ "The directory where org files are kept.") ;; Sub-modules -(if (featurep! +attach) (load! +attach)) -(if (featurep! +babel) (load! +babel)) -(if (featurep! +capture) (load! +capture)) -(if (featurep! +export) (load! +export)) -(if (featurep! +present) (load! +present)) -;; TODO (if (featurep! +publish) (load! +publish)) +(if (featurep! +attach) (load! "+attach")) +(if (featurep! +babel) (load! "+babel")) +(if (featurep! +capture) (load! "+capture")) +(if (featurep! +export) (load! "+export")) +(if (featurep! +present) (load! "+present")) +;; TODO (if (featurep! +publish) (load! "+publish")) ;; diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index 3ea95eb9a..a539e3185 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -1,7 +1,7 @@ ;;; lang/web/config.el -*- lexical-binding: t; -*- -(load! +html) -(load! +css) +(load! "+html") +(load! "+css") (def-package! web-beautify diff --git a/modules/tools/password-store/test/autoload-pass.el b/modules/tools/password-store/test/autoload-pass.el index d9d190097..278159ef6 100644 --- a/modules/tools/password-store/test/autoload-pass.el +++ b/modules/tools/password-store/test/autoload-pass.el @@ -1,7 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/password-store/test/autoload-pass.el -(load! ../autoload) +(load! "../autoload") (defmacro with-passwords!! (buffer-args &rest body) (declare (indent defun)) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 68a006653..f98e0e3b5 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -160,4 +160,4 @@ deleted.") ;; Hacks ;; -(load! +hacks) +(load! "+hacks") From e5efd3b6739536a324085a7c901e3a076b5004b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 27 May 2018 12:47:36 +0200 Subject: [PATCH 1491/4235] feature/evil: don't change save behavior in noninteractive emacs --- modules/feature/evil/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e8215ce34..caddb9e80 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -91,8 +91,9 @@ (buffer-name)) (count-lines (point-min) (point-max)) (buffer-size))) - (setq save-silently t) - (add-hook 'after-save-hook #'+evil|save-buffer) + (unless noninteractive + (setq save-silently t) + (add-hook 'after-save-hook #'+evil|save-buffer)) ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. (advice-add #'evil-force-normal-state :after #'doom/escape) ;; Don't move cursor when indenting From 376adde0d8070571bdd8bd08c5bc3b37974ac467 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 27 May 2018 22:31:08 +0200 Subject: [PATCH 1492/4235] Optimize mode-line segments that are just variables --- core/core-ui.el | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index cf000b55b..f4fb397b5 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -111,22 +111,38 @@ with `doom//reload-theme').") ;; Modeline library ;; -(defmacro def-modeline-segment! (name &rest forms) +(defvar doom--modeline-alist ()) + +(defmacro def-modeline-segment! (name &rest body) "Defines a modeline segment and byte compiles it." (declare (indent defun) (doc-string 2)) - (let ((sym (intern (format "doom-modeline-segment--%s" name)))) - `(progn - (defun ,sym () ,@forms) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))) + (let ((docstring (if (stringp (car body)) (pop body)))) + (if (and (symbolp (car body)) + (not (cdr body))) + `(map-put doom--modeline-alist ',name ',(car body)) + (let ((sym (intern (format "doom-modeline-segment--%s" name)))) + `(progn + (defun ,sym () + ,(or docstring (format "%s modeline segment" name)) + ,@body) + (map-put doom--modeline-alist ',name ',sym) + ,(unless (bound-and-true-p byte-compile-current-file) + `(let (byte-compile-warnings) + (byte-compile #',sym)))))))) (defsubst doom--prepare-modeline-segments (segments) - (cl-loop for seg in segments - if (stringp seg) - collect seg - else - collect (list (intern (format "doom-modeline-segment--%s" (symbol-name seg)))))) + (let (forms it) + (dolist (seg segments) + (cond ((stringp seg) + (push seg forms)) + ((setq it (cdr (assq seg doom--modeline-alist))) + (push (cond ((boundp it) it) + ((fboundp it) (list it)) + ((error "%s is not a valid segment" seg))) + forms)) + ((fboundp seg) (push (list seg) forms)) + ((error "%s is not a valid segment" seg)))) + (nreverse forms))) (defmacro def-modeline! (name lhs &optional rhs) "Defines a modeline format and byte-compiles it. NAME is a symbol to identify From 5b31fd9505bd808761c93042cbc14ee4b40be4e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 00:08:14 +0200 Subject: [PATCH 1493/4235] Use company-dabbrev-code in prog-modes & company-dabbrev everywhere else --- modules/completion/company/autoload.el | 12 +++++++++++- modules/config/default/+bindings.el | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index b6c444382..ae89ac809 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -16,6 +16,16 @@ (= company-candidates-length 1)) (company-complete-common))) +;;;###autoload +(defun +company/dabbrev () + "Invokes `company-dabbrev-code' in prog-mode buffers and `company-dabbrev' +everywhere else." + (interactive) + (call-interactively + (if (derived-mode-p 'prog-mode) + #'company-dabbrev-code + #'company-dabbrev))) + ;;;###autoload (defun +company/whole-lines (command &optional arg &rest ignored) "`company-mode' completion backend that completes whole-lines, akin to vim's @@ -49,5 +59,5 @@ C-x C-l." (interactive) (require 'company-dabbrev) (let ((company-selection-wrap-around t)) - (call-interactively #'company-dabbrev-code) + (call-interactively #'+company/dabbrev) (company-select-previous-or-abort))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 828decabc..158399161 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -376,7 +376,7 @@ :i "s" #'company-ispell :i "C-s" #'company-yasnippet :i "C-o" #'company-capf - :i "C-n" #'company-dabbrev-code + :i "C-n" #'+company/dabbrev :i "C-p" #'+company/dabbrev-code-previous) (:after company (:map company-active-map From ee49b5ff29022289d95faf1128977eacfb855420 Mon Sep 17 00:00:00 2001 From: secondwtq Date: Mon, 28 May 2018 11:30:17 +0800 Subject: [PATCH 1494/4235] Fix typo in OCaml module. --- modules/lang/ocaml/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index bdd4974d2..5902dd181 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -8,6 +8,6 @@ :after tuareg :hook (tuareg-mode . merlin-mode) :config - (set! :company-backend 'tuareg-mode 'merlin-compand-backend) + (set! :company-backend 'tuareg-mode 'merlin-company-backend) (after! company - (remove-hook 'company-backends 'merlin-compand-backend))) + (remove-hook 'company-backends 'merlin-company-backend))) From c8b21e8cf8cbe12359ca547be1e8588481bd3ad2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 12:19:58 +0200 Subject: [PATCH 1495/4235] Fix doom//upgrade dirty-tree detection doom//upgrade refused to upgrade Doom because of unexpected behavior with vc-state, which unhelpfully returns 'unregistered for unmodified files. Instead, I manually test for output from git status --porcelain. --- core/core-dispatcher.el | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index ccd0c73df..1572c09ba 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -208,12 +208,19 @@ recompile. Run this whenever you: ;; Quality of Life Commands ;; -;; FIXME Detect & enforce remote (defvar doom-repo-url "https://github.com/hlissner/doom-emacs" "TODO") -(defvar doom-repo-remote "upgrade" +(defvar doom-repo-remote "_upgrade" "TODO") +(defun doom--working-tree-dirty-p (dir) + (with-temp-buffer + (let ((default-directory dir)) + (if (zerop (process-file "git" nil (current-buffer) nil + "status" "--porcelain")) + (string-match-p "[^ \t\n]" (buffer-string)) + (error "Failed to check working tree in %s" dir))))) + (defun doom//upgrade () "Upgrade Doom to the latest version." (interactive) @@ -227,7 +234,7 @@ recompile. Run this whenever you: (unless branch (error "Couldn't detect what branch you're using. Is %s a repo?" (abbreviate-file-name doom-emacs-dir))) - (unless (eq (vc-state doom-emacs-dir 'Git) 'up-to-date) + (when (doom--working-tree-dirty-p doom-emacs-dir) (user-error "Refusing to upgrade because Doom has been modified. Stash or undo your changes")) (with-temp-buffer (let ((buf (current-buffer))) From b84946318c3ca4858a0c763115605d441745485a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 12:23:47 +0200 Subject: [PATCH 1496/4235] No means no Saying no to a confirmation prompt should abort the refresh process. --- core/core-dispatcher.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 1572c09ba..3696c45c2 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -197,11 +197,12 @@ recompile. Run this whenever you: 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)" (doom//reload-doom-autoloads) - (let ((doom--inhibit-reload t)) - (with-demoted-errors "%s" (doom//packages-autoremove)) - (with-demoted-errors "%s" (doom//packages-install))) - (doom//reload-package-autoloads) - (doom//byte-compile nil 'recompile)) + (unwind-protect + (let ((doom--inhibit-reload t)) + (doom//packages-autoremove) + (doom//packages-install)) + (doom//reload-package-autoloads) + (doom//byte-compile nil 'recompile))) ;; From 3b85720c9c89e4e47927f1c0955db990af1dc0b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 12:26:03 +0200 Subject: [PATCH 1497/4235] Fix incorrect uses of add-to-list --- modules/completion/company/config.el | 2 +- modules/completion/ivy/config.el | 2 +- modules/emacs/electric-indent/config.el | 2 +- modules/emacs/eshell/config.el | 2 +- modules/emacs/term/config.el | 2 +- modules/feature/evil/config.el | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index ec6113713..804246ba6 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -78,7 +78,7 @@ MODES should be one major-mode symbol or a list of them." (defun +company|enable-project-dicts (mode &rest _) "Enable per-project dictionaries." (if (symbol-value mode) - (add-to-list 'company-dict-minor-mode-list mode #'eq) + (add-to-list 'company-dict-minor-mode-list mode nil #'eq) (setq company-dict-minor-mode-list (delq mode company-dict-minor-mode-list)))) (add-hook 'doom-project-hook #'+company|enable-project-dicts)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index a37ea4baf..822434c23 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -49,7 +49,7 @@ immediately runs it on the current candidate (ending the ivy session)." ivy-use-selectable-prompt t) (after! magit (setq magit-completing-read-function #'ivy-completing-read)) - (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt #'eq)) + (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) (map! [remap switch-to-buffer] #'ivy-switch-buffer [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer diff --git a/modules/emacs/electric-indent/config.el b/modules/emacs/electric-indent/config.el index f823676c5..4918f73ea 100644 --- a/modules/emacs/electric-indent/config.el +++ b/modules/emacs/electric-indent/config.el @@ -34,5 +34,5 @@ trigger electric indentation." (backward-word) (looking-at-p (concat "\\<" (regexp-opt doom-electric-indent-words)))))) - (add-to-list 'electric-indent-functions #'+electric-indent|char)) + (add-to-list 'electric-indent-functions #'+electric-indent|char nil #'eq)) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 4e9d5bf23..f78a8513f 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -31,7 +31,7 @@ ;; Consider eshell buffers real (defun +eshell-p (buf) (eq (buffer-local-value 'major-mode buf) 'eshell-mode)) - (add-to-list 'doom-real-buffer-functions #'+eshell-p #'eq) + (add-to-list 'doom-real-buffer-functions #'+eshell-p nil #'eq) ;; Keep track of open eshell buffers (add-hook 'eshell-mode-hook #'+eshell|init) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index ac3487f09..436a8d4f9 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -11,4 +11,4 @@ ;; Consider term buffers real (defun +term-p (buf) (eq (buffer-local-value 'major-mode buf) 'term-mode)) - (add-to-list 'doom-real-buffer-functions #'+term-p #'eq)) + (add-to-list 'doom-real-buffer-functions #'+term-p nil #'eq)) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index caddb9e80..c27a8836e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -293,7 +293,7 @@ the new algorithm is confusing, like in python or ruby." fn '((:default . evil-mc-execute-default-call)))) ;; disable evil-escape in evil-mc; causes unwanted text on invocation - (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode #'eq) + (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode nil #'eq) (defun +evil|escape-multiple-cursors () "Clear evil-mc cursors and restore state." From 2dc1be2ce841210572056c442877992416e8fdbd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 12:30:20 +0200 Subject: [PATCH 1498/4235] Update load! macro docstring --- 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 bcf3f6c97..7507cc0e6 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -632,10 +632,10 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (defmacro load! (filename &optional path noerror) "Load a file relative to the current executing file (`load-file-name'). -FILENAME 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). If omitted, -the lookup is relative to `load-file-name', `byte-compile-current-file' or -`buffer-file-name' (in that order). +FILENAME is either a file path string or a form that should evaluate to such a +string at run time. PATH is where to look for the file (a string representing a +directory path). If omitted, the lookup is relative to either `load-file-name', +`byte-compile-current-file' or `buffer-file-name' (checked in that order). If NOERROR is non-nil, don't throw an error if the file doesn't exist." (unless path From 2ffef6edce0864f86c58d88b13dbe289d7902ae8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 12:43:25 +0200 Subject: [PATCH 1499/4235] Fix void-variable +modeline error from outdated load! call --- modules/tools/pdf/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 100246093..85a4be1f8 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -15,7 +15,7 @@ (add-hook! 'pdf-view-mode-hook (cua-mode 0)) ;; Custom modeline that removes useless info and adds page numbers (when (featurep! :ui doom-modeline) - (load! +modeline) + (load! "+modeline") (add-hook! pdf-tools-enabled (doom-set-modeline 'pdf-tools-modeline))) ;; Handle PDF-tools related popups better (set! :popup "^\\*Outline*" '((side . right) (size . 40)) '((select))) From 61b22c1c7f5bd547b7030045273c73aef7bdc001 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 14:26:45 +0200 Subject: [PATCH 1500/4235] doom//upgrade: git reset instead of pull + error handling --- core/core-dispatcher.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 3696c45c2..203c2189f 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -258,9 +258,12 @@ recompile. Run this whenever you: (error "Aborted") (message "Removing byte-compiled files from your config (if any)") (doom//clean-byte-compiled-files) - (unless (zerop (process-file "git" nil buf nil "pull" "--rebase")) + (unless (zerop (process-file "git" nil buf nil "reset" "--hard" + (format "%s/%s" doom-repo-remote branch))) (error "An error occurred while checking out the latest commit\n\n%s" (buffer-string))) + (unless (equal (vc-git-working-revision doom-emacs-dir) rev) + (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) (doom//reload) (message "Done! Please restart Emacs for changes to take effect"))))))))) From 6b625e96b555eddc666bf831bea8e73fc2a8fab2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 14:27:14 +0200 Subject: [PATCH 1501/4235] bin/doom: add support for custom emacs binary (EMACS envvar) --- bin/doom | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bin/doom b/bin/doom index e1f1d74e7..b90ef48b5 100755 --- a/bin/doom +++ b/bin/doom @@ -1,11 +1,12 @@ #!/usr/bin/env bash -":"; command -v emacs >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } # -*-emacs-lisp-*- -":"; VERSION=$(emacs --version | head -n1) +":"; EMACS=${EMACS:-emacs} +":"; command -v $EMACS >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } # -*-emacs-lisp-*- +":"; VERSION=$($EMACS --version | head -n1) ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } ":"; DOOMDIR=$(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. -":"; [[ $1 == doc || $1 == doctor ]] && { cd "$DOOMDIR"; exec emacs --script bin/doom-doctor; exit 0; } -":"; [[ $1 == run ]] && { cd "$DOOMDIR"; shift; exec emacs -q --no-splash -l bin/doom "$@"; exit 0; } -":"; exec emacs --script "$0" -- $@ +":"; [[ $1 == doc || $1 == doctor ]] && { cd "$DOOMDIR"; exec $EMACS --script bin/doom-doctor; exit 0; } +":"; [[ $1 == run ]] && { cd "$DOOMDIR"; shift; exec $EMACS -q --no-splash -l bin/doom "$@"; exit 0; } +":"; exec $EMACS --script "$0" -- $@ ":"; exit 0 (defun usage () From ed5e8849cc4a6e154400d3779dc0f2e31229a1fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 15:50:11 +0200 Subject: [PATCH 1502/4235] Fix void-variable fundamental-mode error from unquoted symbol --- 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 f4fb397b5..56e5f2559 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -330,7 +330,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." "Show whitespace-mode when file has an `indent-tabs-mode' that is different from the default." (unless (or (eq indent-tabs-mode (default-value 'indent-tabs-mode)) - (eq major-mode fundamental-mode) + (eq major-mode 'fundamental-mode) (derived-mode-p 'special-mode)) (require 'whitespace) (set (make-local-variable 'whitespace-style) From f8b9cff4aaccc29ae1bacac5bc2dd1227f6dadde Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 16:07:11 +0200 Subject: [PATCH 1503/4235] Get rid of doom-pre-init-hook --- core/core-os.el | 73 +++++++++++++++++++++---------------------- core/core-packages.el | 7 ++--- core/core.el | 5 --- 3 files changed, 39 insertions(+), 46 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index b270aa375..faa6e1561 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -4,38 +4,38 @@ (defconst IS-LINUX (eq system-type 'gnu/linux)) (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) -;; clipboard -(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING) - ;; Use a shared clipboard - select-enable-clipboard t - select-enable-primary t) +(unless noninteractive + ;; clipboard + (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING) + ;; Use a shared clipboard + select-enable-clipboard t + select-enable-primary t) -;; stop copying each visual state move to the clipboard: -;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on -;; Most of this code grokked from: -;; http://stackoverflow.com/questions/15873346/elisp-rename-macro -(advice-add #'evil-visual-update-x-selection :override #'ignore) + ;; stop copying each visual state move to the clipboard: + ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on + ;; Most of this code grokked from: + ;; http://stackoverflow.com/questions/15873346/elisp-rename-macro + (advice-add #'evil-visual-update-x-selection :override #'ignore) -(cond (IS-MAC - (setq mac-command-modifier 'meta - mac-option-modifier 'alt - ;; sane trackpad/mouse scroll settings - mac-redisplay-dont-reset-vscroll t - mac-mouse-wheel-smooth-scroll nil - mouse-wheel-scroll-amount '(5 ((shift) . 2)) ; one line at a time - mouse-wheel-progressive-speed nil ; don't accelerate scrolling - ;; Curse Lion and its sudden but inevitable fullscreen mode! - ;; NOTE Meaningless to railwaycat's emacs-mac build - ns-use-native-fullscreen nil - ;; Don't open files from the workspace in a new frame - ns-pop-up-frames nil) + (cond (IS-MAC + (setq mac-command-modifier 'meta + mac-option-modifier 'alt + ;; sane trackpad/mouse scroll settings + mac-redisplay-dont-reset-vscroll t + mac-mouse-wheel-smooth-scroll nil + mouse-wheel-scroll-amount '(5 ((shift) . 2)) ; one line at a time + mouse-wheel-progressive-speed nil ; don't accelerate scrolling + ;; Curse Lion and its sudden but inevitable fullscreen mode! + ;; NOTE Meaningless to railwaycat's emacs-mac build + ns-use-native-fullscreen nil + ;; Don't open files from the workspace in a new frame + ns-pop-up-frames nil) - (if (not (display-graphic-p)) - (add-hook 'doom-post-init-hook #'osx-clipboard-mode) - ;; A known problem with GUI Emacs on MacOS: it runs in an isolated - ;; environment, so envvars will be wrong. That includes the PATH Emacs - ;; picks up. `exec-path-from-shell' fixes this. - (defun doom|init-exec-path () + (if (not (display-graphic-p)) + (add-hook 'doom-post-init-hook #'osx-clipboard-mode) + ;; A known problem with GUI Emacs on MacOS: it runs in an isolated + ;; environment, so envvars will be wrong. That includes the PATH Emacs + ;; picks up. `exec-path-from-shell' fixes this. (when (require 'exec-path-from-shell nil t) (def-setting! :env (&rest vars) "Inject VARS from your shell environment into Emacs." @@ -43,16 +43,15 @@ (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) - (exec-path-from-shell-initialize))) - (add-hook 'doom-pre-init-hook #'doom|init-exec-path))) + (exec-path-from-shell-initialize)))) - (IS-LINUX - (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! - x-underline-at-descent-line t)) ; draw underline lower + (IS-LINUX + (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! + x-underline-at-descent-line t)) ; draw underline lower - (IS-WINDOWS - (setq w32-get-true-file-attributes nil) ; fix file io slowdowns - )) + (IS-WINDOWS + (setq w32-get-true-file-attributes nil) ; fix file io slowdowns + ))) (provide 'core-os) ;;; core-os.el ends here diff --git a/core/core-packages.el b/core/core-packages.el index 7507cc0e6..347a1eb97 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -268,7 +268,10 @@ to least)." (unless (or force-p noninteractive) (doom//reload-package-autoloads)))) ;; Initialize Doom core + (require 'core-os) (unless noninteractive + (add-hook! 'emacs-startup-hook + #'(doom|post-init doom|display-benchmark)) (require 'core-ui) (require 'core-editor) (require 'core-projects) @@ -282,10 +285,6 @@ non-nil." ;; Set `doom-init-modules-p' early, so `doom-pre-init-hook' won't infinitely ;; recurse by accident if any of them need `doom-initialize-modules'. (setq doom-init-modules-p t) - (unless noninteractive - (add-hook! 'emacs-startup-hook - #'(doom|post-init doom|display-benchmark))) - (run-hooks 'doom-pre-init-hook) (when doom-private-dir (let ((load-prefer-newer t)) (load (expand-file-name "init" doom-private-dir) diff --git a/core/core.el b/core/core.el index 389004d16..9ff645f42 100644 --- a/core/core.el +++ b/core/core.el @@ -59,10 +59,6 @@ Use this for files that change often, like cache files.") XDG directory conventions if ~/.config/doom exists.") ;; Doom hooks -(defvar doom-pre-init-hook nil - "Hooks run after Doom is first initialized; after Doom's core files are -loaded, but before your private init.el file or anything else is loaded.") - (defvar doom-init-hook nil "Hooks run after all init.el files are loaded, including your private and all module init.el files, but before their config.el files are loaded.") @@ -199,7 +195,6 @@ this, you'll get stuttering and random freezes) and resets (require 'core-lib) (require 'core-packages) -(require 'core-os) (doom-initialize noninteractive) (if noninteractive From 4863f9fbf00161f7cf55cbaa86d4b5361f3573cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 17:31:44 +0200 Subject: [PATCH 1504/4235] Fix after! macro with multiple features --- core/core-lib.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 9e76dc0dc..14e57df0a 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -204,8 +204,8 @@ compilation. This will no-op on features that have been disabled by the user." ((and (consp targets) (memq (car targets) '(:and :all))) (dolist (next (cdr targets)) - (setq body `(after! ,next ,@body))) - body) + (setq body `((after! ,next ,@body)))) + (car body)) ((listp targets) `(after! (:all ,@targets) ,@body)))))) From edc09ecab8ec6abe52b032d1241a16947a326fd6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 May 2018 17:33:52 +0200 Subject: [PATCH 1505/4235] Make evil-mc cooperate with smartparens better --- modules/feature/evil/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index c27a8836e..181f8064b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -286,6 +286,13 @@ the new algorithm is confusing, like in python or ruby." :config (global-evil-mc-mode +1) + (after! smartparens + ;; Make evil-mc cooperate with smartparens better + (unless (memq (car sp--mc/cursor-specific-vars) (cdr (assq :default evil-mc-cursor-variables))) + (setcdr (assq :default evil-mc-cursor-variables) + (append (cdr (assq :default evil-mc-cursor-variables)) + sp--mc/cursor-specific-vars)))) + ;; Add custom commands to whitelisted commands (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol doom/backward-kill-to-bol-and-indent)) From e2979e5b829398142c85509d499e80e2bed8e104 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 00:42:33 +0200 Subject: [PATCH 1506/4235] Fix +workspace/delete when one workspace is left --- modules/feature/workspaces/autoload/workspaces.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 90b2d5b3c..158cfaf1f 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -289,8 +289,8 @@ workspace to delete." nil nil current-name) current-name)))) (condition-case-unless-debug ex - (let ((workspaces (length (+workspace-list-names)))) - (cond ((> workspaces 1) + (let ((workspaces (+workspace-list-names))) + (cond ((> (length workspaces) 1) (+workspace-delete name) (+workspace-switch (if (+workspace-exists-p +workspace--last) From a018bc75f652f56731113cfd9db376c47e95bb5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 02:08:31 +0200 Subject: [PATCH 1507/4235] feature/evil: add +evil-collection-disabled-list Use this list to disable certain features of evil-collection. It should be set before evil-collection is loaded (which shouldn't be until after doom has fully loaded). --- modules/feature/evil/config.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 181f8064b..28d22d96d 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -3,6 +3,14 @@ ;; I'm a vimmer at heart. Its modal philosophy suits me better, and this module ;; strives to make Emacs a much better vim than vim was. +(defvar +evil-collection-disabled-list + '(kotlin-mode ; doesn't do anything useful + simple) ; ditto + "A list of `evil-collection' modules to disable. See the definition of this +variable for an explanation of the defaults (in comments). See +`evil-collection-mode-list' for a list of available options.") + + (def-package! evil-collection :when (featurep! +everywhere) :defer 1 @@ -12,8 +20,8 @@ (setq evil-want-integration nil evil-collection-company-use-tng nil) :config - (delq 'kotlin-mode evil-collection-mode-list) ; doesn't do anything useful - (delq 'simple evil-collection-mode-list) ; breaks too much + (dolist (sym +evil-collection-disabled-list) + (setq evil-collection-mode-list (delq sym evil-collection-mode-list))) (evil-collection-init)) From 28c13c230f7fcc784e784936f8c6435f50f8db84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 02:09:35 +0200 Subject: [PATCH 1508/4235] Temporary fix for with-helm-buffer error caused by evil-collection-helm --- modules/feature/evil/config.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 28d22d96d..7fb005d57 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -20,6 +20,18 @@ variable for an explanation of the defaults (in comments). See (setq evil-want-integration nil evil-collection-company-use-tng nil) :config + ;; Until evil-collection#101 is resolved + (defun +evil*fix-evil-collection-fix-helm-bs () + "Prevents `with-helm-buffer' void-function errors when loading helm." + (when (with-current-buffer (helm-buffer-get) helm-echo-input-in-header-line) + (let ((ov (make-overlay (point-min) (point-max) nil nil t))) + (overlay-put ov 'window (selected-window)) + (overlay-put ov 'face (let ((bg-color (face-background 'default nil))) + `(:background ,bg-color :foreground ,bg-color))) + (setq-local cursor-type nil)))) + (advice-add #'evil-collection-helm-hide-minibuffer-maybe :override + #'+evil*fix-evil-collection-fix-helm-bs) + (dolist (sym +evil-collection-disabled-list) (setq evil-collection-mode-list (delq sym evil-collection-mode-list))) (evil-collection-init)) From f98f7ab55266f6f3184a4b47783210ef4e68f8dc Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Mon, 28 May 2018 13:56:56 +0800 Subject: [PATCH 1509/4235] Add: org: +ipython Add: packages --- modules/lang/org/+ipython.el | 46 +++++++ modules/lang/org/autoload/ipython.el | 194 +++++++++++++++++++++++++++ modules/lang/org/packages.el | 4 +- 3 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 modules/lang/org/+ipython.el create mode 100644 modules/lang/org/autoload/ipython.el diff --git a/modules/lang/org/+ipython.el b/modules/lang/org/+ipython.el new file mode 100644 index 000000000..82d8a22e6 --- /dev/null +++ b/modules/lang/org/+ipython.el @@ -0,0 +1,46 @@ +;;; lang/org/+ipython.el -*- lexical-binding: t; -*- +(defvar +org-ob-ipython-resources-dir ".ob-ipython-resrc") +(defvar +ob-ipython-local-runtime-dir + (substring (shell-command-to-string (concat "jupyter --runtime-dir")) 0 -1)) +(def-package! ob-ipython + :when (featurep! +ipython) + :after (ob) + :config + (setq ob-ipython-resources-dir +org-ob-ipython-resources-dir) + ;; popup + (set! + :popup "^\\*Org Src" + '((size . 100) + (side . right) + (slot . -1) + (window-height . 0.6)) + '((quit) + (select . t) + (modeline))) + (set! + :popup "^\\*Python" + '((slot . 0) + (side . right) + (size . 100)) + '((select) (quit) (transient))) + (set! + :popup "\\*ob-ipython.*" + '((slot . 2) + (side . right) + (size . 100) + (window-height . 0.2)) + '((select) (quit) (transient))) + (set! + :popup "\\*Python:.*" + '((slot . 0) + (side . right) + (size . 100)) + '((select) (quit) (transient))) + ;; advices for remote kernel and org-src-edit + (advice-add 'org-babel-edit-prep:ipython :override #'+org*org-babel-edit-prep:ipython) + (advice-add 'org-babel-ipython-initiate-session :override #'+org*org-babel-ipython-initiate-session) + (advice-add 'ob-ipython--create-repl :override #'+org*ob-ipython--create-repl) + (advice-add 'org-babel-execute:ipython :override #'+org*org-babel-execute:ipython) + ;; retina resolution image hack + (when (eq window-system 'ns) + (advice-add 'ob-ipython--write-base64-string :around #'+org*ob-ipython--write-base64-string))) diff --git a/modules/lang/org/autoload/ipython.el b/modules/lang/org/autoload/ipython.el new file mode 100644 index 000000000..f5fa6eb57 --- /dev/null +++ b/modules/lang/org/autoload/ipython.el @@ -0,0 +1,194 @@ +;;; lang/org/autoload/ipython.el -*- lexical-binding: t; -*- +;; * remote +;;;###autoload +(defun +org*org-babel-ipython-initiate-session (&optional session params) + "Create a session named SESSION according to PARAMS." + (if (string= session "none") + (error + "ob-ipython currently only supports evaluation using a session. +Make sure your src block has a :session param.") + (when (not (s-ends-with-p ".json" session)) + (ob-ipython--create-kernel + (ob-ipython--normalize-session + session) + (cdr (assoc :kernel params)))) + (ob-ipython--create-repl + (ob-ipython--normalize-session + session) + params))) + +;;;###autoload +(defun +org*ob-ipython--create-repl (name &optional params) + "Create repl based on NAME and PARAMS. +If PARAMS specifies remote kernel, copy the kernel config from remote server and +create a repl connecting to remote session." + (let ((cmd (s-join + " " + (ob-ipython--kernel-repl-cmd + name)))) + (if (string= "default" name) + (progn + (run-python cmd nil nil) + (format + "*%s*" + python-shell-buffer-name)) + (if (string-match + "^remote-.*ssh.json" + name) + (when (not (ignore-errors + (process-live-p + (get-process + (format + "Python:ob-ipython-%s" + name))))) + (let* ((remote (s-split "-" name)) + (remote-host (nth 1 remote)) + (remote-session (nth 3 remote))) + (+org/ob-ipython-generate-local-path-from-remote + remote-session + remote-host + params))) + (let* ((process-name (format + "Python:ob-ipython-%s" + name)) + (python-shell-prompt-detect-enabled nil) + (python-shell-completion-native-enable nil) + (buf (python-shell-make-comint + cmd + process-name + t)) + (dir (cdr (assoc :pydir params)))) + (if dir + (with-current-buffer + buf + (setq-local + default-directory + dir))) + (sleep-for 1) + (format "*%s*" process-name)))))) + +;;;###autoload +(defun +org*org-babel-execute:ipython (body params) + "Execute a BODY of IPython code with PARAMS in org-babel. +This function is called by `org-babel-execute-src-block'." + (message default-directory) + (let ((session (cdr (assoc :session params)))) + (org-babel-ipython-initiate-session + session + params)) + (ob-ipython--clear-output-buffer) + (if (cdr (assoc :async params)) + (ob-ipython--execute-async + body + params) + (ob-ipython--execute-sync + body + params))) + +;;;###autoload +(defun +org/ob-ipython-generate-local-path-from-remote (session host params) + "Given a remote SESSION with PARAMS and corresponding HOST, copy remote config to local, start a jupyter console to generate a new one." + (let* ((runtime-dir + (substring (shell-command-to-string (concat "ssh " host " jupyter --runtime-dir")) 0 -1)) + (runtime-file (concat runtime-dir "/" "kernel-" session ".json")) + (tramp-path (concat "/ssh:" host ":" runtime-file)) + (tramp-copy (concat +ob-ipython-local-runtime-dir "/remote-" host "-kernel-" session ".json")) + (local-path + (concat + "Python:ob-ipython-" + (file-name-sans-extension (file-name-nondirectory tramp-copy)) + "-ssh.json"))) + ;; scp remote file to local + (copy-file tramp-path tramp-copy t) + ;; connect to remote use new config + (let* ((python-shell-interpreter-interactive-arg " console --simple-prompt") + (python-shell-prompt-detect-enabled nil) + (python-shell-completion-native-enable nil) + (buf (python-shell-make-comint + (concat + ob-ipython-command + " console --simple-prompt --existing " + tramp-copy + " --ssh " + host) + (concat "" local-path) + t)) + (proc (get-buffer-process buf)) + (dir (cdr (assoc :pydir params)))) + (sleep-for 3) + (if dir + (with-current-buffer + buf + (setq-local default-directory dir))) + (format "*%s*" proc)))) + +;; * org-src-edit +;;;###autoload +(defun +org*org-babel-edit-prep:ipython (info) + (let* ((params (nth 2 info)) + (session (cdr (assoc :session params)))) + (org-babel-ipython-initiate-session + session + params)) + ;; Support for python.el's "send-code" commands within edit buffers. + (setq-local + python-shell-buffer-name + (format + "Python:ob-ipython-%s" + (->> + info + (nth 2) + (assoc :session) + cdr ob-ipython--normalize-session))) + (setq-local + default-directory + (format + "%s" + (->> + info + (nth 2) + (assoc :pydir) + cdr ob-ipython--normalize-session))) + (ob-ipython-mode 1) + ;; hack on company mode to use company-capf rather than company-anaconda + (when (featurep! :completion company) + (setq-local + company-backends + '(company-capf + company-dabbrev + company-files + company-yasnippet)) + (setq-local + company-idle-delay + nil)) + (when (featurep 'lpy) + (setq lispy-python-proc + (format + "Python:ob-ipython-%s" + (->> + info + (nth 2) + (assoc :session) + cdr ob-ipython--normalize-session))) + (setq lispy--python-middleware-loaded-p + nil) + (lispy--python-middleware-load))) + +;; * retina +;;;###autoload +(defun +org/ob-ipython-mac-2x-image-file-name (filename &optional scale) + "Return the name of high-resolution image file for FILENAME. +The optional arg SCALE is scale factor, and defaults to 2." + (let ((pos (or (string-match "\\.[^./]*\\'" filename) (length filename)))) + (format + "%s@%dx%s" + (substring filename 0 pos) + (or scale 2) + (substring filename pos)))) +;;;###autoload +(defun +org*ob-ipython--write-base64-string (oldfunc &rest args) + (let ((file (car args)) + (b64-string (cdr args))) + (let ((file2x (+org/ob-ipython-mac-2x-image-file-name file))) + (apply oldfunc file2x b64-string) + (shell-command (concat "convert " file2x " -resize 50% " file))))) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 91c73748e..da17aa643 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -29,7 +29,9 @@ (when (featurep! :lang restclient) (package! ob-restclient)) (when (featurep! :lang crystal) - (package! ob-crystal))) + (package! ob-crystal)) + (when (featurep! +ipython) + (package! ob-ipython))) (when (featurep! +export) (package! ox-pandoc) From 21631aa8bf7f9e222a9b3bcc486542f2731db0d2 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Mon, 28 May 2018 14:09:03 +0800 Subject: [PATCH 1510/4235] Add: org: +ipython `+right-popup` option --- modules/lang/org/+ipython.el | 57 ++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/modules/lang/org/+ipython.el b/modules/lang/org/+ipython.el index 82d8a22e6..8c483987c 100644 --- a/modules/lang/org/+ipython.el +++ b/modules/lang/org/+ipython.el @@ -8,34 +8,35 @@ :config (setq ob-ipython-resources-dir +org-ob-ipython-resources-dir) ;; popup - (set! - :popup "^\\*Org Src" - '((size . 100) - (side . right) - (slot . -1) - (window-height . 0.6)) - '((quit) - (select . t) - (modeline))) - (set! - :popup "^\\*Python" - '((slot . 0) - (side . right) - (size . 100)) - '((select) (quit) (transient))) - (set! - :popup "\\*ob-ipython.*" - '((slot . 2) - (side . right) - (size . 100) - (window-height . 0.2)) - '((select) (quit) (transient))) - (set! - :popup "\\*Python:.*" - '((slot . 0) - (side . right) - (size . 100)) - '((select) (quit) (transient))) + (when (featurep! +right-popup) + (set! + :popup "^\\*Org Src" + '((size . 100) + (side . right) + (slot . -1) + (window-height . 0.6)) + '((quit) + (select . t) + (modeline))) + (set! + :popup "^\\*Python" + '((slot . 0) + (side . right) + (size . 100)) + '((select) (quit) (transient))) + (set! + :popup "\\*ob-ipython.*" + '((slot . 2) + (side . right) + (size . 100) + (window-height . 0.2)) + '((select) (quit) (transient))) + (set! + :popup "\\*Python:.*" + '((slot . 0) + (side . right) + (size . 100)) + '((select) (quit) (transient)))) ;; advices for remote kernel and org-src-edit (advice-add 'org-babel-edit-prep:ipython :override #'+org*org-babel-edit-prep:ipython) (advice-add 'org-babel-ipython-initiate-session :override #'+org*org-babel-ipython-initiate-session) From d1812e040f56a7c6e6fc1878f4d4a4aadc1965e1 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Tue, 29 May 2018 18:29:42 +0800 Subject: [PATCH 1511/4235] Fix: packages.el: ob-ipython repo --- 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 da17aa643..b09375c88 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -31,7 +31,7 @@ (when (featurep! :lang crystal) (package! ob-crystal)) (when (featurep! +ipython) - (package! ob-ipython))) + (package! ob-ipython :recipe (:fetcher github :repo "fuxialexander/ob-ipython" :files ("*"))))) (when (featurep! +export) (package! ox-pandoc) From 734b4643736adfe481ae82d5b0b6039b41db4e7f Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Tue, 29 May 2018 18:32:52 +0800 Subject: [PATCH 1512/4235] Fix: load! ipython when featurep! --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index be1238292..ec0924aa5 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -8,6 +8,7 @@ (if (featurep! +babel) (load! "+babel")) (if (featurep! +capture) (load! "+capture")) (if (featurep! +export) (load! "+export")) +(if (featurep! +ipython) (load! "+ipython")) (if (featurep! +present) (load! "+present")) ;; TODO (if (featurep! +publish) (load! "+publish")) From f2be46d60f3cc16a18fe783785e91e1fd438406e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 11:12:14 +0200 Subject: [PATCH 1513/4235] lang/org: only load evil-org-agenda if evil is loaded --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index be1238292..ef19c674e 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -28,6 +28,7 @@ (add-hook 'org-load-hook #'+org|setup-evil)) (def-package! evil-org-agenda + :when (featurep! :feature evil) :after org-agenda :config (evil-org-agenda-set-keys)) From fbce2388ab46039ca9a19834a4556a1f941cce40 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 12:46:13 +0200 Subject: [PATCH 1514/4235] lang/latex: general refactor & load optimization --- modules/lang/latex/autoload.el | 10 ++ modules/lang/latex/config.el | 170 +++++++++++++++------------------ 2 files changed, 88 insertions(+), 92 deletions(-) diff --git a/modules/lang/latex/autoload.el b/modules/lang/latex/autoload.el index 6e95a3ff6..663be0d2b 100644 --- a/modules/lang/latex/autoload.el +++ b/modules/lang/latex/autoload.el @@ -1,5 +1,15 @@ ;;; lang/latex/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :latex-bibtex-file (file) + "Sets the default file RefTeX uses to search for citations." + `(setq +latex-bibtex-file ,file)) + +;;;###autoload +(def-setting! :latex-bibtex-dir (dir) + "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." + `(setq +latex-bibtex-dir ,dir)) + ;;;###autoload (defun +latex/LaTeX-indent-item () "Provide proper indentation for LaTeX \"itemize\",\"enumerate\", and \"description\" environments. diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 3bd24da6e..383b624c9 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -10,28 +10,17 @@ "Custom indentation level for items in enumeration-type environments") -(def-setting! :latex-bibtex-file (file) - "Sets the default file RefTeX uses to search for citations." - `(setq +latex-bibtex-file ,file)) - -(def-setting! :latex-bibtex-dir (dir) - "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." - `(setq +latex-bibtex-dir ,dir)) - - ;; ;; Plugins ;; -(after! tex-site +(after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") - (setq ;; Enable parse on load. - TeX-parse-self t - ;; When running TeX, just save, don't ask - TeX-save-query nil - ;; Enable parse on save. - TeX-auto-save t + + (setq TeX-parse-self t ; Enable parse on load. + TeX-save-query nil ; just save, don't ask + TeX-auto-save t ; Enable parse on save. ;; Use hidden directories for AUCTeX files. TeX-auto-local ".auctex-auto" TeX-style-local ".auctex-style" @@ -50,87 +39,86 @@ ;; (def-package! tex-style :defer t) ;; TeX Folding - (add-hook 'TeX-mode-hook #'TeX-fold-mode) - - (after! latex - (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. - '(LaTeX-section-heading - LaTeX-section-title - LaTeX-section-toc - LaTeX-section-section - LaTeX-section-label) - LaTeX-fill-break-at-separators nil - LaTeX-item-indent 0) ; item indentation. - - (map! :map LaTeX-mode-map "C-j" nil) - - ;; Do not prompt for Master files, this allows auto-insert to add templates - ;; to .tex files - (add-hook! '(LaTeX-mode TeX-mode) - (remove-hook 'find-file-hook (car find-file-hook) 'local)) - ;; Adding useful things for latex - (add-hook! 'LaTeX-mode-hook - #'(LaTeX-math-mode - TeX-source-correlate-mode - TeX-global-PDF-mode - TeX-PDF-mode - visual-line-mode)) - ;; Enable rainbow mode after applying styles to the buffer - (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) - (when (featurep! :feature spellcheck) - (add-hook 'LaTeX-mode-hook #'flyspell-mode)) - ;; Default language setting. - (setq ispell-dictionary "english") - ;; Use chktex to search for errors in a latex file. - (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") - ;; Set a custom item indentation - (setq LaTeX-indent-environment-list - (append '(("itemize" +latex/LaTeX-indent-item) - ("enumerate" +latex/LaTeX-indent-item) - ("description" +latex/LaTeX-indent-item)) - LaTeX-indent-environment-list)) - - ;; - ;; Use Okular if the user says so. - (when (featurep! +okular) - ;; Configure Okular as viewer. Including a bug fix - ;; (https://bugs.kde.org/show_bug.cgi?id=373855) - (map-put TeX-view-program-list - "Okular" '(("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) - (map-put TeX-view-program-list 'output-pdf '("Okular"))) - - ;; Or Skim - (when (featurep! +skim) - (map-put TeX-view-program-list - "Skim" '("/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) - (map-put TeX-view-program-selection 'output-pdf '("Skim"))) - - ;; Or PDF-tools, but only if the module is also loaded - (when (and (featurep! :tools pdf) - (featurep! +pdf-tools)) - (map-put TeX-view-program-list "PDF Tools" '("TeX-pdf-tools-sync-view")) - (map-put TeX-view-program-selection 'output-pdf '("PDF Tools")) - ;; Enable auto reverting the PDF document with PDF Tools - (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)))) + (add-hook 'TeX-mode-hook #'TeX-fold-mode)) +(after! latex + (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. + '(LaTeX-section-heading + LaTeX-section-title + LaTeX-section-toc + LaTeX-section-section + LaTeX-section-label) + LaTeX-fill-break-at-separators nil + LaTeX-item-indent 0) ; item indentation. + + (map! :map LaTeX-mode-map "C-j" nil) + + ;; Do not prompt for Master files, this allows auto-insert to add templates + ;; to .tex files + (add-hook! '(LaTeX-mode TeX-mode) + (remove-hook 'find-file-hook (car find-file-hook) 'local)) + ;; Adding useful things for latex + (add-hook! 'LaTeX-mode-hook + #'(LaTeX-math-mode + TeX-source-correlate-mode + TeX-global-PDF-mode + TeX-PDF-mode + visual-line-mode)) + ;; Enable rainbow mode after applying styles to the buffer + (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) + (when (featurep! :feature spellcheck) + (add-hook 'LaTeX-mode-hook #'flyspell-mode)) + ;; Default language setting. + (setq ispell-dictionary "english") + ;; Use chktex to search for errors in a latex file. + (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") + ;; Set a custom item indentation + (dolist (env '("itemize" "enumerate" "description")) + (map-put LaTeX-indent-environment-list + env '(+latex/LaTeX-indent-item))) + + ;; + ;; Use Okular if the user says so. + (when (featurep! +okular) + ;; Configure Okular as viewer. Including a bug fix + ;; (https://bugs.kde.org/show_bug.cgi?id=373855) + (map-put TeX-view-program-list + "Okular" '(("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) + (map-put TeX-view-program-list 'output-pdf '("Okular"))) + + ;; Or Skim + (when (featurep! +skim) + (map-put TeX-view-program-list + "Skim" '("/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) + (map-put TeX-view-program-selection 'output-pdf '("Skim"))) + + ;; Or PDF-tools, but only if the module is also loaded + (when (and (featurep! :tools pdf) + (featurep! +pdf-tools)) + (map-put TeX-view-program-list "PDF Tools" '("TeX-pdf-tools-sync-view")) + (map-put TeX-view-program-selection 'output-pdf '("PDF Tools")) + ;; Enable auto reverting the PDF document with PDF Tools + (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) + + +;; The preview package is currently broken with the latest AUCTeX version +;; ("11.90.2.2017-07-25) ... and Ghostscript 9.22. It's now fixed in AUCTeX +;; master, so we just have to wait. (def-package! preview - ;; The preview package is currently broken with the latest AUCTeX version - ;; ("11.90.2.2017-07-25) ... and Ghostscript 9.22. It's now fixed in AUCTeX - ;; master, so we just have to wait. - :init + :hook (LaTeX-mode . LaTeX-preview-setup) + :config (setq-default preview-scale 1.4 preview-scale-function - (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale))) - (add-hook 'LaTeX-mode-hook #'LaTeX-preview-setup)) + (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) (def-package! latex-preview-pane :when (featurep! +preview-pane) - :commands latex-preview-pane-enable + :hook ((latex-mode LaTeX-mode) . latex-preview-pane-enable) + :commands latex-preview-pane-mode :init (setq latex-preview-pane-multifile-mode 'auctex) - (add-hook! (latex-mode LaTeX-mode) #'latex-preview-pane-enable) (map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode)) (map-put TeX-view-program-selection 'output-pdf '("preview-pane")) :config @@ -141,11 +129,10 @@ (def-package! reftex - :commands turn-on-reftex + :hook ((latex-mode LaTeX-mode) . turn-on-reftex) :init (setq reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) - (add-hook! (latex-mode LaTeX-mode) #'turn-on-reftex) :config ;; Get ReTeX working with biblatex ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 @@ -190,6 +177,7 @@ (def-package! auctex-latexmk :when (featurep! +latexmk) + :after-call (latex-mode-hook LaTeX-mode-hook) :init ;; Pass the -pdf flag when TeX-PDF-mode is active (setq auctex-latexmk-inherit-TeX-PDF-mode t) @@ -225,7 +213,5 @@ ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap - :commands (adaptive-wrap-prefix-mode) - :init - (add-hook 'LaTeX-mode-hook #'adaptive-wrap-prefix-mode) - (setq-default adaptive-wrap-extra-indent 0)) + :hook (LaTeX-mode . adaptive-wrap-prefix-mode) + :init (setq-default adaptive-wrap-extra-indent 0)) From 9ae99deb650d674a5ff0742c9ff63200dbc3e4ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 14:03:31 +0200 Subject: [PATCH 1515/4235] ui/doom-modeline: optimize vcs segment (experimental) --- modules/ui/doom-modeline/config.el | 74 ++++++++++++++++-------------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 759132f89..8c552b297 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -376,40 +376,46 @@ directory, the file name, and its state (modified, read-only or non-existent)." ;; vcs ;; -(def-modeline-segment! vcs - "Displays the current branch, colored based on its state." - (when (and vc-mode buffer-file-name) - (let* ((backend (vc-backend buffer-file-name)) - (state (vc-state buffer-file-name backend))) - (let ((face 'mode-line-inactive) - (active (active)) - (all-the-icons-default-adjust -0.1)) - (concat " " - (cond ((memq state '(edited added)) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05)) - ((eq state 'needs-merge) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon "git-merge" :face face)) - ((eq state 'needs-update) - (if active (setq face 'doom-modeline-warning)) - (all-the-icons-octicon "arrow-down" :face face)) - ((memq state '(removed conflict unregistered)) - (if active (setq face 'doom-modeline-urgent)) - (all-the-icons-octicon "alert" :face face)) - (t - (if active (setq face 'font-lock-doc-face)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05))) - " " - (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face)) - " "))))) +(defvar +doom-modeline--vcs nil) +(defun +doom-modeline--update-vcs () + (setq +doom-modeline--vcs + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend))) + (let ((face 'mode-line-inactive) + (active (active)) + (all-the-icons-default-adjust -0.1)) + (concat " " + (cond ((memq state '(edited added)) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05)) + ((eq state 'needs-merge) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon "git-merge" :face face)) + ((eq state 'needs-update) + (if active (setq face 'doom-modeline-warning)) + (all-the-icons-octicon "arrow-down" :face face)) + ((memq state '(removed conflict unregistered)) + (if active (setq face 'doom-modeline-urgent)) + (all-the-icons-octicon "alert" :face face)) + (t + (if active (setq face 'font-lock-doc-face)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05))) + " " + (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) + 'face (if active face)) + " ")))))) +(add-hook 'after-save-hook #'+doom-modeline--update-vcs) +(add-hook 'find-file-hook #'+doom-modeline--update-vcs t) + +(def-modeline-var! vcs +doom-modeline--vcs + "Displays the current branch, colored based on its state.") ;; From 442aa91eeaa34d0242b2ca801b03ba8fb7ea4cbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 14:06:39 +0200 Subject: [PATCH 1516/4235] ui/doom-modeline: optimize/refactor flycheck segment --- modules/ui/doom-modeline/config.el | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 8c552b297..9754180f6 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -69,10 +69,6 @@ (defvar +doom-modeline-bar-width 3 "How wide the mode-line bar should be (only respected in GUI emacs).") -(defvar +doom-modeline-vspc - (propertize " " 'face 'variable-pitch) - "TODO") - (defvar +doom-modeline-buffer-file-name-style 'truncate-upto-project "Determines the style used by `+doom-modeline-buffer-file-name'. @@ -422,6 +418,10 @@ directory, the file name, and its state (modified, read-only or non-existent)." ;; flycheck ;; +(defvar +doom-modeline-vspc + (propertize " " 'face 'variable-pitch) + "TODO") + (defun +doom-ml-icon (icon &optional text face voffset) "Displays an octicon ICON with FACE, followed by TEXT. Uses `all-the-icons-octicon' to fetch the icon." @@ -453,10 +453,9 @@ directory, the file name, and its state (modified, read-only or non-existent)." ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) -(def-modeline-segment! flycheck +(def-modeline-var! flycheck +doom-modeline--flycheck "Displays color-coded flycheck error status in the current buffer with pretty -icons." - +doom-modeline--flycheck) +icons.") ;; From 456dc620512a43177654d310ecabe327eb832f12 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 14:50:42 +0200 Subject: [PATCH 1517/4235] Fix compile-time void-function errors from modeline --- core/core-ui.el | 70 +++++++++++++++++------------- modules/ui/doom-modeline/config.el | 12 ++--- 2 files changed, 46 insertions(+), 36 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 56e5f2559..166dbfd97 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -111,36 +111,40 @@ with `doom//reload-theme').") ;; Modeline library ;; -(defvar doom--modeline-alist ()) +(defvar doom--modeline-fn-alist ()) +(defvar doom--modeline-var-alist ()) (defmacro def-modeline-segment! (name &rest body) "Defines a modeline segment and byte compiles it." (declare (indent defun) (doc-string 2)) - (let ((docstring (if (stringp (car body)) (pop body)))) - (if (and (symbolp (car body)) - (not (cdr body))) - `(map-put doom--modeline-alist ',name ',(car body)) - (let ((sym (intern (format "doom-modeline-segment--%s" name)))) - `(progn - (defun ,sym () - ,(or docstring (format "%s modeline segment" name)) - ,@body) - (map-put doom--modeline-alist ',name ',sym) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))))) + (let ((sym (intern (format "doom-modeline-segment--%s" name))) + (docstring (if (stringp (car body)) + (pop body) + (format "%s modeline segment" name)))) + (cond ((and (symbolp (car body)) + (not (cdr body))) + (map-put doom--modeline-var-alist name (car body)) + `(map-put doom--modeline-var-alist ',name ',(car body))) + (t + (map-put doom--modeline-fn-alist name sym) + `(progn + (fset ',sym (lambda () ,docstring ,@body)) + (map-put doom--modeline-fn-alist ',name ',sym) + ,(unless (bound-and-true-p byte-compile-current-file) + `(let (byte-compile-warnings) + (byte-compile #',sym)))))))) (defsubst doom--prepare-modeline-segments (segments) (let (forms it) (dolist (seg segments) (cond ((stringp seg) (push seg forms)) - ((setq it (cdr (assq seg doom--modeline-alist))) - (push (cond ((boundp it) it) - ((fboundp it) (list it)) - ((error "%s is not a valid segment" seg))) - forms)) - ((fboundp seg) (push (list seg) forms)) + ((symbolp seg) + (cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) + (push (list it) forms)) + ((setq it (cdr (assq seg doom--modeline-var-alist))) + (push it forms)) + ((error "%s is not a defined segment" seg)))) ((error "%s is not a valid segment" seg)))) (nreverse forms))) @@ -158,17 +162,21 @@ Example: (lhs-forms (doom--prepare-modeline-segments lhs)) (rhs-forms (doom--prepare-modeline-segments rhs))) `(progn - (defun ,sym () - ,(concat "Modeline:\n" (format " %s\n %s" lhs rhs)) - (let ((lhs (list ,@lhs-forms)) - (rhs (list ,@rhs-forms))) - (let ((rhs-str (format-mode-line rhs))) - (list lhs - (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(+ 1 (string-width rhs-str)))))) - rhs-str)))) + (fset ',sym + (lambda () + ,(concat "Modeline:\n" + (format " %s\n %s" + (prin1-to-string lhs) + (prin1-to-string rhs))) + (let ((lhs (list ,@lhs-forms)) + (rhs (list ,@rhs-forms))) + (let ((rhs-str (format-mode-line rhs))) + (list lhs + (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(+ 1 (string-width rhs-str)))))) + rhs-str))))) ,(unless (bound-and-true-p byte-compile-current-file) `(let (byte-compile-warnings) (byte-compile #',sym)))))) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 9754180f6..61e7a2f7b 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -372,7 +372,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." ;; vcs ;; -(defvar +doom-modeline--vcs nil) +(defvar-local +doom-modeline--vcs nil) (defun +doom-modeline--update-vcs () (setq +doom-modeline--vcs (when (and vc-mode buffer-file-name) @@ -410,8 +410,9 @@ directory, the file name, and its state (modified, read-only or non-existent)." (add-hook 'after-save-hook #'+doom-modeline--update-vcs) (add-hook 'find-file-hook #'+doom-modeline--update-vcs t) -(def-modeline-var! vcs +doom-modeline--vcs - "Displays the current branch, colored based on its state.") +(def-modeline-segment! vcs + "Displays the current branch, colored based on its state." + +doom-modeline--vcs) ;; @@ -453,9 +454,10 @@ directory, the file name, and its state (modified, read-only or non-existent)." ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) -(def-modeline-var! flycheck +doom-modeline--flycheck +(def-modeline-segment! flycheck "Displays color-coded flycheck error status in the current buffer with pretty -icons.") +icons." + +doom-modeline--flycheck) ;; From 80f766c15194b9ab0c02423748ddd2f4abb5c5b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 14:51:51 +0200 Subject: [PATCH 1518/4235] ui/doom-modeline: load evil-anzu only if evil is enabled --- modules/ui/doom-modeline/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 61e7a2f7b..a1209a2b5 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -31,6 +31,7 @@ (def-package! evil-anzu + :when (featurep! :feature evil) :after-call (evil-ex-start-search evil-ex-start-word-search)) From 592d83a96822a7605147d9e20be42dba16d7a1af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 15:31:34 +0200 Subject: [PATCH 1519/4235] Fix doom//byte-compile not initializing module list in some contexts --- core/autoload/modules.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index f3d1fe5a5..2e4be26f6 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -295,11 +295,10 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;; But first we must be sure that Doom and your private config have been ;; fully loaded. Which usually aren't so in an noninteractive session. (doom//reload-autoloads) - (doom-initialize t) - (unless (equal modules (list ":core")) - (doom-initialize-modules t)))) + (doom-initialize t))) ;; If no targets were supplied, then we use your module list. (unless targets + (doom-initialize-modules t) (setq targets (append (list doom-core-dir) (doom-module-load-path)))) ;; Assemble el files we want to compile; taking into account that MODULES From 947fe345c31ea65bbfbc8519b41c51b9c50a8045 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 15:34:12 +0200 Subject: [PATCH 1520/4235] Minor, general refactor In some contexts, map-put is superior to add-to-list. --- core/core-ui.el | 3 +-- modules/feature/evil/config.el | 2 +- modules/lang/csharp/config.el | 2 +- modules/lang/org/+babel.el | 2 +- modules/tools/magit/config.el | 2 +- modules/ui/doom-modeline/config.el | 5 ++--- modules/ui/popup/autoload.el | 6 +++--- 7 files changed, 10 insertions(+), 12 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 166dbfd97..2c8e3d6f6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -693,8 +693,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (memq (previous-buffer) (list buf 'nil))) (switch-to-buffer (doom-fallback-buffer))) (kill-buffer buf))) - (t - (funcall orig-fn))))) + ((funcall orig-fn))))) (defun doom|init-ui () diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7fb005d57..8538f206b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -16,7 +16,7 @@ variable for an explanation of the defaults (in comments). See :defer 1 :after-call post-command-hook :preface - ;; must be set before evil/evil-collcetion is loaded + ;; must be set before evil/evil-collection is loaded (setq evil-want-integration nil evil-collection-company-use-tng nil) :config diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index c7ecabe28..ef54fe1c1 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,6 +1,6 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- -(add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) ; unity shaders +(map-put auto-mode-alist '"\\.shader$" 'dshader-mode) ; unity shaders (def-package! omnisharp diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 5511bebf0..c4f4cc9d8 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -29,7 +29,7 @@ libraries (ob-*.el) that don't match the name of the language.") (or (cdr (assoc (downcase language) +org-babel-mode-alist)) language))) nil t)) - (add-to-list 'org-babel-load-languages (cons lang-sym t))) + (map-put org-babel-load-languages lang-sym t)) (apply orig-fn args))) (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 2d1d810f8..67d81c9a4 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -38,7 +38,7 @@ (def-package! evil-magit :when (featurep! :feature evil) :after magit + :init (setq evil-magit-state 'normal) :config - (setq evil-magit-state 'normal) (map! :map (magit-mode-map magit-blame-read-only-mode-map) doom-leader-key nil)) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index a1209a2b5..cd686e1bb 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -363,7 +363,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." (concat (format-mode-line mode-name) (when (stringp mode-line-process) mode-line-process) - (and (featurep 'face-remap) + (and (boundp 'text-scale-mode-amount) (/= text-scale-mode-amount 0) (format " (%+d)" text-scale-mode-amount))) 'face (if (active) 'doom-modeline-buffer-major-mode))) @@ -495,8 +495,7 @@ lines are selected, or the NxM dimensions of a block selection." (format "%dL" lines)) ((> lines 1) (format "%dC %dL" (- end beg) lines)) - (t - (format "%dC" (- end beg)))) + ((format "%dC" (- end beg)))) (when +doom-modeline-enable-word-count (format " %dW" (count-words beg end))))) 'face 'doom-modeline-highlight)))) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index ddb4995c9..74ce99ee8 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -591,11 +591,11 @@ and may be called only if no window on SIDE exists yet." ;; Initialize `window-side' parameter of new window to SIDE and ;; make that parameter persistent. (set-window-parameter window 'window-side side) - (add-to-list 'window-persistent-parameters '(window-side . writable)) + (map-put window-persistent-parameters 'window-side 'writable) ;; Install `window-slot' parameter of new window and make that ;; parameter persistent. (set-window-parameter window 'window-slot slot) - (add-to-list 'window-persistent-parameters '(window-slot . writable)) + (map-put window-persistent-parameters 'window-slot 'writable) ;; Auto-adjust height/width of new window unless a size has been ;; explicitly requested. (unless (if left-or-right @@ -671,7 +671,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (lambda (_side) (frame-root-window (selected-frame))))) (when-let* ((window (window--make-major-side-window buffer side slot alist))) (set-window-parameter window 'window-vslot vslot) - (add-to-list 'window-persistent-parameters '(window-vslot . writable)) + (map-put window-persistent-parameters 'window-vslot 'writable) window))) (t ;; Scan windows on SIDE. From 6bb59467659ac52445bbcb7413be80b64ae6ea8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 15:34:45 +0200 Subject: [PATCH 1521/4235] tools/pdf: rename +pdf-tools-pages segment => +pdf-pages --- modules/tools/pdf/+modeline.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/tools/pdf/+modeline.el b/modules/tools/pdf/+modeline.el index eb0acb7bd..e88d3f440 100644 --- a/modules/tools/pdf/+modeline.el +++ b/modules/tools/pdf/+modeline.el @@ -1,10 +1,9 @@ ;;; tools/pdf/+modeline.el -*- lexical-binding: t; -*- - -(def-modeline-segment! +pdf-tools-pages +(def-modeline-segment! +pdf-pages "Current and total page indicator for PDF documents." (format " P %d/%d" (pdf-view-current-page) (pdf-cache-number-of-pages))) (def-modeline! pdf-tools-modeline - (bar matches " " buffer-info +pdf-tools-pages) + (bar matches " " buffer-info +pdf-pages) (major-mode vcs)) From 05c8daf24ab10612c6bc6f635371f327cc59e511 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 15:35:20 +0200 Subject: [PATCH 1522/4235] Support non-symbol entries in +evil-collection-disabled-list --- modules/feature/evil/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 8538f206b..7b51889be 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -33,7 +33,9 @@ variable for an explanation of the defaults (in comments). See #'+evil*fix-evil-collection-fix-helm-bs) (dolist (sym +evil-collection-disabled-list) - (setq evil-collection-mode-list (delq sym evil-collection-mode-list))) + (setq evil-collection-mode-list + (funcall (if (symbolp sym) #'delq #'delete) + sym evil-collection-mode-list))) (evil-collection-init)) From 7a61615666573587bb77b3b4ab48cd6096eaa918 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 15:47:17 +0200 Subject: [PATCH 1523/4235] Disable evil-snipe in Info-mode --- modules/feature/evil/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7b51889be..9d6051867 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -344,6 +344,7 @@ the new algorithm is confusing, like in python or ruby." evil-snipe-char-fold t evil-snipe-aliases '((?\; "[;:]"))) :config + (add-to-list 'evil-snipe-disabled-modes 'Info-mode nil #'eq) (evil-snipe-mode +1) (evil-snipe-override-mode +1)) From 73d083b1fa2a57338a4715082981af4383204262 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 16:00:16 +0200 Subject: [PATCH 1524/4235] ui/popup: larger Info popups --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index f98e0e3b5..552ed57c6 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -139,7 +139,7 @@ deleted.") ((select . t))) ;; `Info-mode' '("^\\*info\\*$" - ((slot . 2) (vslot . 2) (size . 0.35)) + ((slot . 2) (vslot . 2) (size . 0.45)) ((select . t))))) (add-hook 'doom-init-ui-hook #'+popup-mode) From 3b4aca6270cc5b531514595a4c78148434617270 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 16:00:51 +0200 Subject: [PATCH 1525/4235] lang/emacs-lisp: refactor macrostep config --- modules/lang/emacs-lisp/config.el | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 97172e8b6..c8987a07a 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -77,24 +77,26 @@ (after! slime (require 'slime-fuzzy)) -(after! macrostep - (map! :map macrostep-keymap - :n "RET" #'macrostep-expand - :n "e" #'macrostep-expand - :n "u" #'macrostep-collapse - :n "c" #'macrostep-collapse +;; `macrostep' +(map! :after macrostep + :map macrostep-keymap + :n "RET" #'macrostep-expand + :n "e" #'macrostep-expand + :n "u" #'macrostep-collapse + :n "c" #'macrostep-collapse - :n "TAB" #'macrostep-next-macro - :n "n" #'macrostep-next-macro - :n "J" #'macrostep-next-macro + :n "TAB" #'macrostep-next-macro + :n "n" #'macrostep-next-macro + :n "J" #'macrostep-next-macro - :n "S-TAB" #'macrostep-prev-macro - :n "K" #'macrostep-prev-macro - :n "p" #'macrostep-prev-macro + :n "S-TAB" #'macrostep-prev-macro + :n "K" #'macrostep-prev-macro + :n "p" #'macrostep-prev-macro - :n "q" #'macrostep-collapse-all - :n "C" #'macrostep-collapse-all) + :n "q" #'macrostep-collapse-all + :n "C" #'macrostep-collapse-all) +(after! evil ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't ;; apply for the very first invocation (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps)) From e88f84fd0243243880706f00b12a615a20764473 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 17:50:55 +0200 Subject: [PATCH 1526/4235] Rewrite tools/password-store API --- modules/tools/password-store/autoload.el | 173 ++++++++++++++++------- modules/tools/password-store/config.el | 14 +- modules/tools/password-store/packages.el | 6 +- 3 files changed, 135 insertions(+), 58 deletions(-) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index cbed035e8..b16244bc3 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -1,77 +1,142 @@ ;;; tools/password-store/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(defun +pass/open () - (interactive) - (cond ((featurep! :completion ivy) - (+pass/ivy)) - ((featurep! :completion helm) - (helm-pass)) - (t - (pass)))) - -;;;###autoload -(defalias '+pass--get-entry - #'auth-source-pass-parse-entry) - -;;;###autoload -(defun +pass-get-field (entry fields) - (if-let* ((data (if (listp entry) entry (+pass--get-entry entry)))) - (cl-loop for key in (doom-enlist fields) - when (assoc key data) - return (cdr it)) - (error "Couldn't find entry: %s" entry))) - -;;;###autoload -(defun +pass-get-user (entry) - (+pass-get-field entry +pass-user-fields)) - -;;;###autoload -(defun +pass-get-secret (entry) - (+pass-get-field entry 'secret)) - -(defun +pass-ivy-action--open-url (entry) +(defun +pass--open-url (entry) (if-let* ((url (+pass-get-field entry +pass-url-fields))) (and (or (string-match-p "https?://" url) (error "Field for %s doesn't look like an url" item)) (browse-url url)) (error "url not found."))) -(defun +pass-ivy-action--get-field (item) - (let* ((data (+pass--get-entry item)) - (field (if data (completing-read "Field: " (mapcar #'car data) nil t)))) - (if data - (progn - (password-store-clear) - (message "Copied %s's %s field to clipboard. Will clear in %s seconds" - item field (password-store-timeout)) - (kill-new (+pass-get-field data field)) - (setq password-store-timeout-timer - (run-at-time (password-store-timeout) nil 'password-store-clear))) - (error "Couldn't find entry: %s" item)))) +(defun +pass--copy (entry field text) + (password-store-clear) + (message "Copied %s's %s field to clipboard. Will clear in %s seconds" + entry field (password-store-timeout)) + (kill-new text) + (setq password-store-timeout-timer + (run-at-time (password-store-timeout) nil 'password-store-clear))) -(defun +pass-ivy-action--copy-username (entry) +(defun +pass--copy-username (entry) (if-let* ((user (+pass-get-field entry +pass-user-fields))) (progn (password-store-clear) (message "Copied username to the kill ring.") (kill-new user)) (error "Username not found."))) -(after! ivy - (ivy-add-actions - '+pass/ivy - '(("o" password-store-copy "copy password") - ("e" password-store-edit "edit entry") - ("u" +pass-ivy-action--copy-username "copy username") - ("b" +pass-ivy-action--open-url "open url in browser") - ("f" +pass-ivy-action--get-field "get field")))) +(defun +pass--completing-read-field (entry) + (let* ((data (+pass-get-entry entry)) + (field (if data (completing-read "Field: " (mapcar #'car data) nil t)))) + (+pass-get-field data field))) + + +;; +;; API +;; + +;;;###autoload (autoload 'auth-source-pass-parse-entry "auth-source-pass" nil nil t) +;;;###autoload +(defalias '+pass-get-entry #'auth-source-pass-parse-entry) ;;;###autoload -(defun +pass/ivy (&optional browse-url) +(defun +pass-get-field (entry fields &optional noerror) + "Fetches the value of a field. FIELDS can be a list of string field names or a +single one. If a list, the first field found will be returned. Will error out +otherwise, unless NOERROR is non-nill." + (if-let* ((data (if (listp entry) entry (+pass-get-entry entry)))) + (cl-loop for key in (doom-enlist fields) + when (assoc key data) + return (cdr it)) + (unless noerror + (error "Couldn't find entry: %s" entry)))) + +;;;###autoload +(defun +pass-get-user (entry) + "Fetches the user field from ENTRY. Each of `+pass-user-fields' are tried in +search of your username. May prompt for your gpg passphrase." + (+pass-get-field entry +pass-user-fields)) + +;;;###autoload +(defun +pass-get-secret (entry) + "Fetches your secret from ENTRY. May prompt for your gpg passphrase." + (+pass-get-field entry 'secret)) + + +;; +;; Commands +;; + +;;;###autoload (autoload 'password-store-list "pass" nil nil t) +;;;###autoload (autoload 'password-store--completing-read "password-store" nil nil t) + +;;;###autoload +(defun +pass/edit-entry (entry) + "Interactively search for and open a pass entry for editing." + (interactive + (list (password-store--completing-read))) + (find-file (concat (expand-file-name entry (password-store-dir)) ".gpg"))) + +;;;###autoload +(defun +pass/copy-field (entry) + "Interactively search for an entry and copy a particular field to your +clipboard." + (interactive + (list (password-store--completing-read))) + (let* ((data (+pass-get-entry entry)) + (field (if data (completing-read "Field: " (mapcar #'car data) nil t)))) + (+pass--copy entry field (+pass-get-field data field)))) + +;;;###autoload +(defun +pass/copy-secret (entry) + "Interactively search for an entry and copy its secret/password to your +clipboard." + (interactive + (list (password-store--completing-read))) + (+pass--copy entry 'secret (+pass-get-secret entry))) + +;;;###autoload +(defun +pass/copy-user (entry) + "Interactively search for an entry and copy the login to your clipboard. The +fields in `+pass-user-fields' is used to find the login field." + (interactive + (list (password-store--completing-read))) + (+pass--copy-username entry)) + +;;;###autoload +(defun +pass/browse-url (entry) + "Interactively search for an entry and open its url in your browser. The +fields in `+pass-url-fields' is used to find the url field." + (interactive + (list (password-store--completing-read))) + (+pass--open-url entry)) + + +;; +;; Ivy interface +;; + +(defun +pass/ivy (arg) + "TODO" (interactive "P") (ivy-read "Pass: " (password-store-list) - :action (if browse-url + :action (if arg #'password-store-url #'password-store-copy) :caller '+pass/ivy)) +(after! ivy + (ivy-add-actions + '+pass/ivy + '(("o" password-store-copy "copy password") + ("e" +pass/edit-entry "edit entry") + ("u" +pass/copy-login "copy username") + ("b" +pass/copy-url "open url in browser") + ("f" +pass/copy-field "get field")))) + + +;; +;; TODO Helm interface +;; + +;; (defun +pass/helm () +;; (interactive) +;; ) + diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 4fac1bb32..922361fdd 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -14,11 +14,19 @@ ;; `password-store' (setq password-store-password-length 12) +;; Fix hard-coded password-store location; respect PASSWORD_STORE_DIR envvar +(defun +password-store*read-entry (entry) + "Return a string with the file content of ENTRY." + (with-temp-buffer + (insert-file-contents + (expand-file-name (format "%s.gpg" entry) (password-store-dir))) + (buffer-substring-no-properties (point-min) (point-max)))) +(advice-add #'auth-source-pass--read-entry :override #'+password-store*read-entry) + ;; `pass' -(def-package! pass - :defer t - :config +(after! pass + (set! :env "PASSWORD_STORE_DIR") (set! :evil-state 'pass-mode 'emacs) (set! :popup "^\\*Password-Store" '((side . left) (size . 0.25)) diff --git a/modules/tools/password-store/packages.el b/modules/tools/password-store/packages.el index dbc5f2afd..10744af9d 100644 --- a/modules/tools/password-store/packages.el +++ b/modules/tools/password-store/packages.el @@ -3,9 +3,13 @@ (package! pass) (package! password-store) +(package! password-store-otp) -(when (and EMACS26+ (featurep! +auth)) +;; `auto-source-pass' is built into Emacs 26+ +(unless EMACS26+ (package! auth-source-pass)) +(when (featurep! :completion ivy) + (package! ivy-pass)) (when (featurep! :completion helm) (package! helm-pass)) From 05c098234cda635232359d6e5bb8a5e6159a13de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 17:52:26 +0200 Subject: [PATCH 1527/4235] Update git-gutter on magit-{un,}stage{file,} commands --- modules/feature/version-control/+git.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index d5c1092cf..d388c3ebe 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -30,6 +30,12 @@ (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t) + ;; update git-gutter when using these commands + (advice-add #'magit-stage :after #'+version-control|update-git-gutter) + (advice-add #'magit-unstage :after #'+version-control|update-git-gutter) + (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter) + (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter) + (defhydra +version-control@git-gutter (:body-pre (git-gutter-mode 1) :hint nil) " From 11c7a5c1f47a89a8fdf48069968c23853c272a76 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 17:55:34 +0200 Subject: [PATCH 1528/4235] Fix test for tools/password-store --- modules/tools/password-store/test/autoload-pass.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/password-store/test/autoload-pass.el b/modules/tools/password-store/test/autoload-pass.el index 278159ef6..ec3a9d0e4 100644 --- a/modules/tools/password-store/test/autoload-pass.el +++ b/modules/tools/password-store/test/autoload-pass.el @@ -6,7 +6,7 @@ (defmacro with-passwords!! (buffer-args &rest body) (declare (indent defun)) `(cl-letf - (((symbol-function '+pass--get-entry) + (((symbol-function '+pass-get-entry) (lambda (entry) (when (equal entry "fake/source") '((secret . "defuse-account-gad") From bd5ecc1aca073f6eb19e6236191c26dab6b6906d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 18:26:39 +0200 Subject: [PATCH 1529/4235] Display warning if a non-existent module is in your doom! block --- core/core-packages.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 347a1eb97..ef11a87b6 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -477,8 +477,7 @@ added, if the file exists." (flags (if (listp m) (cdr m)))) (if-let* ((path (doom-module-locate-path category module))) (doom-module-set category module :flags flags :path path) - (when doom-debug-mode - (message "Couldn't find the %s %s module" category module)))))))) + (warn "Couldn't find the %s %s module" category module))))))) doom-modules)) From debe3e0dd3f5d329ce94f6092115b790c6300ad5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 19:39:22 +0200 Subject: [PATCH 1530/4235] Remove unnused letvar doom--inhibit-reload --- core/autoload/modules.el | 33 ++++++++++++++++----------------- core/core-dispatcher.el | 5 ++--- core/core-packages.el | 1 - 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 2e4be26f6..db1950764 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -18,24 +18,23 @@ If called from an interactive session, tries to reload autoloads files (if necessary), reinistalize doom (via `doom-initialize') and reloads your private init.el and config.el. Then runs `doom-reload-hook'." (interactive) - (unless doom--inhibit-reload - (cond ((and noninteractive (not (daemonp))) - (require 'server) - (if (not (server-running-p)) - (doom//reload-autoloads force-p) - (print! "Reloading active Emacs session...") - (print! - (bold "%%s") - (if (server-eval-at server-name '(doom//reload)) - (green "Done!") - (red "There were issues!"))))) - ((let ((load-prefer-newer t)) + (cond ((and noninteractive (not (daemonp))) + (require 'server) + (if (not (server-running-p)) (doom//reload-autoloads force-p) - (doom-initialize t) - (doom-initialize-modules t) - (print! (green "%d packages reloaded" (length package-alist))) - (run-hooks 'doom-reload-hook) - t))))) + (print! "Reloading active Emacs session...") + (print! + (bold "%%s") + (if (server-eval-at server-name '(doom//reload)) + (green "Done!") + (red "There were issues!"))))) + ((let ((load-prefer-newer t)) + (doom//reload-autoloads force-p) + (doom-initialize t) + (ignore-errors (doom-initialize-modules t)) + (print! (green "%d packages reloaded" (length package-alist))) + (run-hooks 'doom-reload-hook) + t)))) ;; diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 203c2189f..af8990177 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -198,9 +198,8 @@ recompile. Run this whenever you: 4. Update Doom outside of Doom (e.g. with git)" (doom//reload-doom-autoloads) (unwind-protect - (let ((doom--inhibit-reload t)) - (doom//packages-autoremove) - (doom//packages-install)) + (progn (doom//packages-autoremove) + (doom//packages-install)) (doom//reload-package-autoloads) (doom//byte-compile nil 'recompile))) diff --git a/core/core-packages.el b/core/core-packages.el index ef11a87b6..6eb48fdb4 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -88,7 +88,6 @@ file.") (defvar doom--current-module nil) (defvar doom--refreshed-p nil) (defvar doom--stage 'init) -(defvar doom--inhibit-reload nil) ;; (setq autoload-compute-prefixes nil From bb6b91da9bebec125cdf847ebf6afd2bc7980cfb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 22:44:21 +0200 Subject: [PATCH 1531/4235] Downgrade missing module warnings to messages --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 6eb48fdb4..8c91e575d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -476,7 +476,7 @@ added, if the file exists." (flags (if (listp m) (cdr m)))) (if-let* ((path (doom-module-locate-path category module))) (doom-module-set category module :flags flags :path path) - (warn "Couldn't find the %s %s module" category module))))))) + (message "Couldn't find the %s %s module" category module))))))) doom-modules)) From add020485e262651fb89b39371563c5ba6b8d4f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 23:09:57 +0200 Subject: [PATCH 1532/4235] tools/ein: fix void-variable ein:jupyter-default-notebook-directory error --- modules/tools/ein/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index e3b469254..cb2ec56b9 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -28,14 +28,15 @@ 'ein:company-backend)) :config - (setq ein:jupyter-server-args '("--no-browser") - ein:notebook-modes + (setq ein:notebook-modes '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) ;; Slice images into rows; easier to navigate around images ein:slice-image t) - (unless ein:jupyter-default-notebook-directory - (setq ein:jupyter-default-notebook-directory "~/")) + (after! ein-jupyter + (setq ein:jupyter-server-args '("--no-browser")) + (unless ein:jupyter-default-notebook-directory + (setq ein:jupyter-default-notebook-directory "~/"))) (defun +ein-buffer-p (buf) (string-match-p "^\\*ein: .*" (buffer-name buf))) From d998ef3159a919a5f392850769ef64b5ee998019 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 May 2018 23:14:33 +0200 Subject: [PATCH 1533/4235] Fix emacs-lisp header in bin/doom --- bin/doom | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index b90ef48b5..e72602c7f 100755 --- a/bin/doom +++ b/bin/doom @@ -1,6 +1,6 @@ #!/usr/bin/env bash -":"; EMACS=${EMACS:-emacs} -":"; command -v $EMACS >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } # -*-emacs-lisp-*- +":"; EMACS=${EMACS:-emacs} # -*-emacs-lisp-*- +":"; command -v $EMACS >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } ":"; VERSION=$($EMACS --version | head -n1) ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } ":"; DOOMDIR=$(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. From acaba8ef3b859bdb81f77b1d424978c991c0fd8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 00:37:38 +0200 Subject: [PATCH 1534/4235] lang/latex: fix void-variable TeX-view-program-list error --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 383b624c9..20febcb30 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -119,9 +119,9 @@ :commands latex-preview-pane-mode :init (setq latex-preview-pane-multifile-mode 'auctex) + :config (map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode)) (map-put TeX-view-program-selection 'output-pdf '("preview-pane")) - :config (map! :map doc-view-mode-map "ESC" #'delete-window "q" #'delete-window From b4ebb2abca59108b041877656ad5878943cfb352 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 01:38:36 +0200 Subject: [PATCH 1535/4235] feature/evil: remove ; evil-snipe alias --- modules/feature/evil/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 9d6051867..afd7262f0 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -341,8 +341,7 @@ the new algorithm is confusing, like in python or ruby." (setq evil-snipe-smart-case t evil-snipe-scope 'line evil-snipe-repeat-scope 'visible - evil-snipe-char-fold t - evil-snipe-aliases '((?\; "[;:]"))) + evil-snipe-char-fold t) :config (add-to-list 'evil-snipe-disabled-modes 'Info-mode nil #'eq) (evil-snipe-mode +1) From 75e6ea6beeb7011e5d606c730c893a31af967f3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 01:39:16 +0200 Subject: [PATCH 1536/4235] ui/popup: delete old rule in :popup/:popups settings In case the settings are used or ran after initialization (e.g. in the case of doom//reload). --- modules/ui/popup/autoload.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 74ce99ee8..c434a8a41 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -27,6 +27,9 @@ will be tested against CONDITION, which is either a) a regexp string (which is matched against the buffer's name) or b) a function that takes no arguments and returns a boolean." `(progn + (when after-init-time + (setq +popup--display-buffer-alist + (map-delete +popup--display-buffer-alist ,condition))) (push (+popup--rule (list ,condition ,alist ,parameters)) +popup--display-buffer-alist) (when (bound-and-true-p +popup-mode) @@ -43,6 +46,9 @@ each individual rule. (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" `(progn (dolist (rule (nreverse (list ,@rules))) + (when after-init-time + (setq +popup--display-buffer-alist + (map-delete +popup--display-buffer-alist (car rule)))) (push (+popup--rule rule) +popup--display-buffer-alist)) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) From 6b1e1a2c58618b2528e4476a1702200fc42401f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 01:43:56 +0200 Subject: [PATCH 1537/4235] Fix doom-files-in returning files in arbitrary order This would cause compilation issues in doom//byte-compile because prerequisite files weren't compiled before dependent ones. --- core/core-lib.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 14e57df0a..4935f871e 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -105,6 +105,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." filter map full + nosort (follow-symlinks t) (type 'files) (relative-to (unless full default-directory)) @@ -137,10 +138,10 @@ MATCH is a string regexp. Only entries that match it will be included." nconc (apply #'doom-files-in path (plist-put rest :relative-to relative-to)))) ((let ((path path-or-paths) result) - (dolist (file (file-name-all-completions "" path)) - (unless (member file '("./" "../")) + (dolist (file (directory-files path nil "." nosort)) + (unless (member file '("." "..")) (let ((fullpath (expand-file-name file path))) - (cond ((directory-name-p fullpath) + (cond ((file-directory-p fullpath) (when (and (memq type '(t dirs)) (string-match-p match file) (not (and filter (funcall filter fullpath))) From c63cd0a688510228315ed512f5a61bcb61bf7649 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 01:44:56 +0200 Subject: [PATCH 1538/4235] feature/spellcheck: minor refactor --- modules/feature/spellcheck/config.el | 4 +--- modules/feature/spellcheck/packages.el | 13 ++++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 2cc8dadb6..712877181 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -30,8 +30,6 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (require 'flyspell-correct-helm)) ((featurep! :completion ivy) (require 'flyspell-correct-ivy)) - (t - (require 'flyspell-correct-popup) + ((require 'flyspell-correct-popup) (setq flyspell-popup-correct-delay 0.8) (define-key popup-menu-keymap [escape] #'keyboard-quit)))) - diff --git a/modules/feature/spellcheck/packages.el b/modules/feature/spellcheck/packages.el index 97172953f..87e8bd828 100644 --- a/modules/feature/spellcheck/packages.el +++ b/modules/feature/spellcheck/packages.el @@ -1,11 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/spellcheck/packages.el -(when (package! flyspell-correct) - (cond ((featurep! :completion ivy) - (package! flyspell-correct-ivy)) - ((featurep! :completion helm) - (package! flyspell-correct-helm)) - (t - (package! flyspell-correct-popup)))) +(package! flyspell-correct) +(cond ((featurep! :completion ivy) + (package! flyspell-correct-ivy)) + ((featurep! :completion helm) + (package! flyspell-correct-helm)) + ((package! flyspell-correct-popup))) From 49f16f681c6009818929bec825bdda6a6a3bfad6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 01:45:35 +0200 Subject: [PATCH 1539/4235] lang/org: realign/recalculate tables on exit evil replace mode --- modules/lang/org/autoload/org.el | 13 ++++++++++--- modules/lang/org/config.el | 6 ++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 1a945fcd3..0c890b61c 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -307,9 +307,16 @@ wrong places)." (defun +org|realign-table-maybe () "Auto-align table under cursor and re-calculate formulas." (when (and (org-at-table-p) org-table-may-need-update) - (quiet! - (org-table-recalculate) - (if org-table-may-need-update (org-table-align))))) + (save-excursion + (quiet! + (org-table-recalculate) + (if org-table-may-need-update (org-table-align)))))) + +;;;###autoload +(defun +org*realign-table-maybe (&rest _) + "Auto-align table under cursor and re-calculate formulas." + (when (eq major-mode 'org-mode) + (+org|realign-table-maybe))) ;;;###autoload (defun +org|update-cookies () diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index ef19c674e..7c7daed71 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -99,9 +99,11 @@ unfold to point on startup." (sp-local-pair "=" nil :unless '(:add sp-point-before-word-p))))) (defun +org|enable-auto-reformat-tables () - "Realign tables exiting insert mode (`evil-mode')." + "Realign tables & update formulas when exiting insert mode (`evil-mode')." (when (featurep 'evil) - (add-hook 'evil-insert-state-exit-hook #'+org|realign-table-maybe nil t))) + (add-hook 'evil-insert-state-exit-hook #'+org|realign-table-maybe nil t) + (add-hook 'evil-replace-state-exit-hook #'+org|realign-table-maybe nil t) + (advice-add #'evil-replace :after #'+org*realign-table-maybe))) (defun +org|enable-auto-update-cookies () "Update statistics cookies when saving or exiting insert mode (`evil-mode')." From ce4327e3a9bb56387f85c2cf7636ff8510b5505a Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 30 May 2018 13:46:09 +1000 Subject: [PATCH 1540/4235] completion/helm: cleanup and set some more sensible defaults --- modules/completion/helm/config.el | 37 +++++++++++++------------------ 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 7caa3e8a4..9dac9accf 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -38,23 +38,21 @@ (def-package! helm :after helm-mode :init - (setq helm-quick-update t - ;; Speedier without fuzzy matching - helm-mode-fuzzy-match nil - helm-buffers-fuzzy-matching nil - helm-apropos-fuzzy-match nil - helm-M-x-fuzzy-match nil - helm-recentf-fuzzy-match nil - helm-projectile-fuzzy-match nil - ;; Display extraineous helm UI elements - helm-display-header-line nil - helm-ff-auto-update-initial-value nil - helm-find-files-doc-header nil - ;; Don't override evil-ex's completion - helm-mode-handle-completion-in-region nil - helm-candidate-number-limit 50 - ;; Don't wrap item cycling - helm-move-to-line-cycle-in-source t) + (setq + ;; Fuzzy matching is pretty handy! + helm-mode-fuzzy-match t + helm-buffers-fuzzy-matching t + helm-apropos-fuzzy-match t + helm-M-x-fuzzy-match t + helm-recentf-fuzzy-match t + helm-projectile-fuzzy-match t + ;; Display extraineous helm UI elements + helm-display-header-line nil + helm-ff-auto-update-initial-value nil + helm-find-files-doc-header nil + ;; Don't override evil-ex's completion + helm-mode-handle-completion-in-region nil + helm-candidate-number-limit 50) :config (setq projectile-completion-system 'helm) @@ -86,10 +84,7 @@ (let ((bg-color (face-background 'default nil))) `(:background ,bg-color :foreground ,bg-color))) (setq-local cursor-type nil)))) - (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe) - - ) - + (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe)) (def-package! helm-locate :defer t From ded367eef56201604ad3fddd63fe427866328150 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 30 May 2018 13:55:09 +1000 Subject: [PATCH 1541/4235] Add posframes to helm in emacs 26+ --- init.example.el | 3 ++- modules/completion/helm/config.el | 19 +++++++++++++++++++ modules/completion/helm/packages.el | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 767ea199d..d8328ab96 100644 --- a/init.example.el +++ b/init.example.el @@ -20,7 +20,8 @@ (company ; the ultimate code completion backend +auto ; as-you-type code completion +childframe) ; a nicer company UI (Emacs 26+ only) - ;helm ; the *other* search engine for love and life + ;(helm ; the *other* search engine for love and life + ; +childframe) ; uses childframes for popups (Emacs 26+ only) ;ido ; the other *other* search engine... (ivy ; a search engine for love and life +childframe) ; uses childframes for popups (Emacs 26+ only) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 7caa3e8a4..7d22b1c08 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -63,6 +63,25 @@ (require 'helm-projectile) (set-keymap-parent helm-projectile-find-file-map helm-map) + ;; Posframes! + (when (and EMACS26+ (featurep! +childframe)) + (defvar helm-posframe-buffer nil) + + (defun helm-posframe-display (buffer &optional _resume) + (posframe-show + (setq helm-posframe-buffer buffer) + :poshandler #'posframe-poshandler-frame-bottom-left-corner + :left-fringe 10 + :width (frame-width) + :height 16 ;; ivy/+childframe uses 16 + :respect-header-line t)) + + (defun helm-posframe-cleanup () + (posframe-hide helm-posframe-buffer)) + + (add-hook! 'helm-cleanup-hook #'helm-posframe-cleanup) + (setq helm-display-function #'helm-posframe-display)) + ;;; Helm hacks (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index b4199e698..fb11d95b5 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -10,3 +10,5 @@ (package! helm-projectile) (package! helm-swoop) (package! wgrep) +(when (and EMACS26+ (featurep! +childframe)) + (package! posframe)) From dcd29762e7f6454ecb40163e28f2775544b55147 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 10:52:44 +0200 Subject: [PATCH 1542/4235] Gate fuzzy search config behind +fuzzy module flag Fuzzy search, on its own, is inaccurate when individual candidates are long. Helm's non-fuzzy search backend doesn't have this problem. This adds `flx` sorting to fuzzy search to make up for this. --- modules/completion/helm/config.el | 45 ++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 9dac9accf..928fbee21 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -38,21 +38,13 @@ (def-package! helm :after helm-mode :init - (setq - ;; Fuzzy matching is pretty handy! - helm-mode-fuzzy-match t - helm-buffers-fuzzy-matching t - helm-apropos-fuzzy-match t - helm-M-x-fuzzy-match t - helm-recentf-fuzzy-match t - helm-projectile-fuzzy-match t - ;; Display extraineous helm UI elements - helm-display-header-line nil - helm-ff-auto-update-initial-value nil - helm-find-files-doc-header nil - ;; Don't override evil-ex's completion - helm-mode-handle-completion-in-region nil - helm-candidate-number-limit 50) + (setq helm-candidate-number-limit 50 + ;; Display extraineous helm UI elements + helm-display-header-line nil + helm-ff-auto-update-initial-value nil + helm-find-files-doc-header nil + ;; Don't override evil-ex's completion + helm-mode-handle-completion-in-region nil) :config (setq projectile-completion-system 'helm) @@ -86,6 +78,29 @@ (setq-local cursor-type nil)))) (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe)) + +(def-package! helm-flx + :when (featurep! +fuzzy) + :after helm + :init + (setq helm-candidate-number-limit 40 + helm-M-x-fuzzy-match t + helm-apropos-fuzzy-match t + helm-bookmark-show-location t + helm-buffers-fuzzy-matching t + helm-completion-in-region-fuzzy-match t + helm-file-cache-fuzzy-match t + helm-imenu-fuzzy-match t + helm-locate-fuzzy-match t + helm-flx-for-helm-locate t + helm-mode-fuzzy-match t + helm-projectile-fuzzy-match t + helm-recentf-fuzzy-match t + helm-semantic-fuzzy-match t) + :config + (helm-flx-mode +1)) + + (def-package! helm-locate :defer t :init (defvar helm-generic-files-map (make-sparse-keymap)) From b94f9b269bd55009e6df0161dfb16e011644ecec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 10:54:25 +0200 Subject: [PATCH 1543/4235] Add helm-flx to helm packages --- modules/completion/helm/packages.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index b4199e698..deb8465c7 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -10,3 +10,5 @@ (package! helm-projectile) (package! helm-swoop) (package! wgrep) +(when (featurep! +fuzzy) + (package! helm-flx)) From a25e2e0c89293cf5e11b0faee2bfd1dc52720db7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 11:25:41 +0200 Subject: [PATCH 1544/4235] completion/ivy: add +fuzzy flag As mentioned in #626 --- modules/completion/ivy/config.el | 13 +++++++++++++ modules/completion/ivy/packages.el | 3 +++ 2 files changed, 16 insertions(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 822434c23..13dbb6cf0 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -220,3 +220,16 @@ immediately runs it on the current candidate (ending the ivy session)." ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) (map-put ivy-display-functions-alist fn nil))) + + +(def-package! flx + :when (featurep! +fuzzy) + :defer t ; is loaded by ivy + :init + (setq ivy-re-builders-alist + '((counsel-ag . ivy--regex-plus) + (counsel-rg . ivy--regex-plus) + (counsel-pt . ivy--regex-plus) + (counsel-grep-or-swiper . ivy--regex-plus) + (t . ivy--regex-fuzzy)) + ivy-initial-inputs-alist nil)) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 0d764a54d..b8b76609a 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -10,5 +10,8 @@ (package! ivy-rich) (package! wgrep) +(when (featurep! +fuzzy) + (package! flx)) + (when (and EMACS26+ (featurep! +childframe)) (package! ivy-posframe)) From 7377ba753765880260447b05f04868e0adcf5ef0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 11:29:10 +0200 Subject: [PATCH 1545/4235] Add +fuzzy flags to helm/ivy in init.example.el --- init.example.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/init.example.el b/init.example.el index 767ea199d..c68dd3b4f 100644 --- a/init.example.el +++ b/init.example.el @@ -20,10 +20,11 @@ (company ; the ultimate code completion backend +auto ; as-you-type code completion +childframe) ; a nicer company UI (Emacs 26+ only) - ;helm ; the *other* search engine for love and life + ;(helm ; the *other* search engine for love and life + ; +fuzzy) ; enable fuzzy search backend for helm ;ido ; the other *other* search engine... (ivy ; a search engine for love and life - +childframe) ; uses childframes for popups (Emacs 26+ only) + +fuzzy) ; enable fuzzy search backend for ivy :ui doom ; what makes DOOM look the way it does From c4bbffd7ee647fd59123d44e2599d71a4be582ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 11:42:35 +0200 Subject: [PATCH 1546/4235] Extract refresh dispatcher into doom//refresh --- core/core-dispatcher.el | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index af8990177..ef2738bc0 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -196,12 +196,7 @@ recompile. Run this whenever you: 2. Add or remove `package!' blocks to your config, 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)" - (doom//reload-doom-autoloads) - (unwind-protect - (progn (doom//packages-autoremove) - (doom//packages-install)) - (doom//reload-package-autoloads) - (doom//byte-compile nil 'recompile))) + (doom//refresh)) ;; @@ -221,6 +216,18 @@ recompile. Run this whenever you: (string-match-p "[^ \t\n]" (buffer-string)) (error "Failed to check working tree in %s" dir))))) +(defun doom//refresh () + "Ensure Doom is in a working state by checking autoloads and packages, and +recompiling any changed compiled files. This is the shotgun solution to most +problems with doom." + (interactive) + (doom//reload-doom-autoloads) + (unwind-protect + (progn (doom//packages-autoremove) + (doom//packages-install)) + (doom//reload-package-autoloads) + (doom//byte-compile nil 'recompile))) + (defun doom//upgrade () "Upgrade Doom to the latest version." (interactive) From 71dc572d7937bfa6db9e3e915b033fdbf578798f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 11:42:55 +0200 Subject: [PATCH 1547/4235] Run doom//refresh after successfull doom//upgrade --- core/core-dispatcher.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index ef2738bc0..467f099b3 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -270,7 +270,7 @@ problems with doom." (buffer-string))) (unless (equal (vc-git-working-revision doom-emacs-dir) rev) (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) - (doom//reload) + (doom//refresh) (message "Done! Please restart Emacs for changes to take effect"))))))))) (defun doom//quickstart () From c0b904afcaa9f7fd1e00e43bd3d131f246628d81 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 13:13:46 +0200 Subject: [PATCH 1548/4235] Fix void-variable nose-mode error in python #628 Caused by associate! only doing a fboundp check on MODE, but not boundp, before trying to access its value. --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 4935f871e..2f306a227 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -355,7 +355,7 @@ The available conditions are: `(progn (defun ,hook-name () (when (and (fboundp ',mode) - (not ,mode) + (not (bound-and-true-p ,mode)) (and buffer-file-name (not (file-remote-p buffer-file-name))) ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) ,(if files (doom--resolve-path-forms files '(doom-project-root)) t) From cf974db0bff8b92d2e055eebe25fa1f83d36e047 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 13:28:22 +0200 Subject: [PATCH 1549/4235] completion/ivy: remove redundant autoloads Many of these exist in {swiper,counsel,smex}-autoloads already. --- modules/completion/ivy/config.el | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 13dbb6cf0..87ff505af 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -67,16 +67,8 @@ immediately runs it on the current candidate (ending the ivy session)." (ivy-set-display-transformer cmd '+ivy-buffer-transformer))) -(def-package! swiper :commands (swiper swiper-all)) - - (def-package! counsel - :commands (counsel-ag counsel-rg counsel-pt counsel-apropos counsel-bookmark - counsel-describe-function counsel-describe-variable - counsel-describe-face counsel-M-x counsel-file-jump - counsel-find-file counsel-find-library counsel-info-lookup-symbol - counsel-imenu counsel-recentf counsel-yank-pop - counsel-descbinds counsel-org-capture counsel-grep-or-swiper) + :commands counsel-describe-face :init (map! [remap apropos] #'counsel-apropos [remap bookmark-jump] #'counsel-bookmark @@ -127,9 +119,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Used by `counsel-M-x' -(def-package! smex - :commands (smex smex-major-mode-commands) - :config +(after! smex (setq smex-save-file (concat doom-cache-dir "/smex-items")) (smex-initialize)) From bb9f00e2753d877973cb74cffcf0a072a5606f3a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 13:31:04 +0200 Subject: [PATCH 1550/4235] Fix unused return value warnings When byte-compiling or reloading autoloads files. --- core/autoload/modules.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index db1950764..72b01a7b6 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -234,7 +234,7 @@ This should be run whenever your `doom!' block or update your packages." ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, ;; at least); they are cached later, so all those membership checks are ;; unnecessary overhead. - (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|when (boundp \\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) + (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) (goto-char (match-beginning 1)) (kill-sexp)) (print! (green "✓ Removed load-path/auto-mode-alist entries"))) From 98b439e3bbb5af3a79b472c4ab7d82b9c954771d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 18:11:12 +0200 Subject: [PATCH 1551/4235] Refactor lang/org +babel lazy loader for src blocks Exposes +org-babel-load-functions, which are a list of functions that will be tried in order to load the dependencies of a src block. --- modules/lang/org/+babel.el | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index c4f4cc9d8..ccf8899a0 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -12,6 +12,11 @@ "An alist that maps languages to babel libraries. This is necessary for babel libraries (ob-*.el) that don't match the name of the language.") +(defvar +org-babel-load-functions () + "A list of functions that are used to try to load the current executing src +block. They take one argument (the language specified in the src block, as +string). Stops at the first function to return non-nil.") + (defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty org-src-preserve-indentation t ; use native major-mode indentation @@ -24,11 +29,12 @@ libraries (ob-*.el) that don't match the name of the language.") (let* ((language (org-element-property :language (org-element-at-point))) (lang-sym (intern language))) (when (and (not (cdr (assq lang-sym org-babel-load-languages))) - (require - (intern (format "ob-%s" - (or (cdr (assoc (downcase language) +org-babel-mode-alist)) - language))) - nil t)) + (or (run-hook-with-args-until-success '+org-babel-load-functions language) + (require + (intern (format "ob-%s" + (or (cdr (assoc (downcase language) +org-babel-mode-alist)) + language))) + nil t))) (map-put org-babel-load-languages lang-sym t)) (apply orig-fn args))) (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) From ebfc5648efdfe0eb59d18bbba8f9828c8a102ba2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 18:13:22 +0200 Subject: [PATCH 1552/4235] lang/org: major refactor of +ipython feature --- modules/lang/org/+babel.el | 44 +++++++ modules/lang/org/+ipython.el | 47 ------- modules/lang/org/autoload/ipython.el | 178 ++++++++++----------------- modules/lang/org/config.el | 1 - 4 files changed, 112 insertions(+), 158 deletions(-) delete mode 100644 modules/lang/org/+ipython.el diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index ccf8899a0..ea722d31c 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -50,3 +50,47 @@ string). Stops at the first function to return non-nil.") for p in params if (funcall fn (eq (car p) key)) collect p))) + + +;; +;; Plugins +;; + +(def-package! ob-ipython + :when (featurep! +ipython) + :defer t + :init + (defvar +ob-ipython-local-runtime-dir nil + "TODO") + + (setq ob-ipython-resources-dir ".ob-ipython-resrc") + + (defun +org|babel-load-ipython (language) + (and (string-match-p "^jupyter-" language) + (require 'ob-ipython nil t))) + (add-hook '+org-babel-load-functions #'+org|babel-load-ipython) + :config + (set! :popups + '("^\\*Org Src" + ((size . 100) (side . right) (slot . -1) (window-height . 0.6)) + ((quit) (select . t) (modeline))) + '("^\\*Python" + ((slot . 0) (side . right) (size . 100)) + ((select) (quit) (transient))) + '("\\*ob-ipython.*" + ((slot . 2) (side . right) (size . 100) (window-height . 0.2)) + ((select) (quit) (transient))) + '("\\*Python:.*" + ((slot . 0) (side . right) (size . 100)) + ((select) (quit) (transient)))) + ;; TODO Add more popup styles + + ;; advices for remote kernel and org-src-edit + (advice-add 'org-babel-edit-prep:ipython :override #'+org*org-babel-edit-prep:ipython) + (advice-add 'org-babel-ipython-initiate-session :override #'+org*org-babel-ipython-initiate-session) + (advice-add 'ob-ipython--create-repl :override #'+org*ob-ipython--create-repl) + (advice-add 'org-babel-execute:ipython :override #'+org*org-babel-execute:ipython) + + ;; retina resolution image hack + (when (eq window-system 'ns) + (advice-add 'ob-ipython--write-base64-string :around #'+org*ob-ipython--write-base64-string))) diff --git a/modules/lang/org/+ipython.el b/modules/lang/org/+ipython.el deleted file mode 100644 index 8c483987c..000000000 --- a/modules/lang/org/+ipython.el +++ /dev/null @@ -1,47 +0,0 @@ -;;; lang/org/+ipython.el -*- lexical-binding: t; -*- -(defvar +org-ob-ipython-resources-dir ".ob-ipython-resrc") -(defvar +ob-ipython-local-runtime-dir - (substring (shell-command-to-string (concat "jupyter --runtime-dir")) 0 -1)) -(def-package! ob-ipython - :when (featurep! +ipython) - :after (ob) - :config - (setq ob-ipython-resources-dir +org-ob-ipython-resources-dir) - ;; popup - (when (featurep! +right-popup) - (set! - :popup "^\\*Org Src" - '((size . 100) - (side . right) - (slot . -1) - (window-height . 0.6)) - '((quit) - (select . t) - (modeline))) - (set! - :popup "^\\*Python" - '((slot . 0) - (side . right) - (size . 100)) - '((select) (quit) (transient))) - (set! - :popup "\\*ob-ipython.*" - '((slot . 2) - (side . right) - (size . 100) - (window-height . 0.2)) - '((select) (quit) (transient))) - (set! - :popup "\\*Python:.*" - '((slot . 0) - (side . right) - (size . 100)) - '((select) (quit) (transient)))) - ;; advices for remote kernel and org-src-edit - (advice-add 'org-babel-edit-prep:ipython :override #'+org*org-babel-edit-prep:ipython) - (advice-add 'org-babel-ipython-initiate-session :override #'+org*org-babel-ipython-initiate-session) - (advice-add 'ob-ipython--create-repl :override #'+org*ob-ipython--create-repl) - (advice-add 'org-babel-execute:ipython :override #'+org*org-babel-execute:ipython) - ;; retina resolution image hack - (when (eq window-system 'ns) - (advice-add 'ob-ipython--write-base64-string :around #'+org*ob-ipython--write-base64-string))) diff --git a/modules/lang/org/autoload/ipython.el b/modules/lang/org/autoload/ipython.el index f5fa6eb57..4a602b6d5 100644 --- a/modules/lang/org/autoload/ipython.el +++ b/modules/lang/org/autoload/ipython.el @@ -1,5 +1,6 @@ ;;; lang/org/autoload/ipython.el -*- lexical-binding: t; -*- -;; * remote +;;;###if (featurep! +ipython) + ;;;###autoload (defun +org*org-babel-ipython-initiate-session (&optional session params) "Create a session named SESSION according to PARAMS." @@ -7,7 +8,7 @@ (error "ob-ipython currently only supports evaluation using a session. Make sure your src block has a :session param.") - (when (not (s-ends-with-p ".json" session)) + (when (not (string-suffix-p ".json" session t)) (ob-ipython--create-kernel (ob-ipython--normalize-session session) @@ -22,50 +23,34 @@ Make sure your src block has a :session param.") "Create repl based on NAME and PARAMS. If PARAMS specifies remote kernel, copy the kernel config from remote server and create a repl connecting to remote session." - (let ((cmd (s-join - " " - (ob-ipython--kernel-repl-cmd - name)))) - (if (string= "default" name) - (progn - (run-python cmd nil nil) - (format - "*%s*" - python-shell-buffer-name)) - (if (string-match - "^remote-.*ssh.json" - name) - (when (not (ignore-errors - (process-live-p - (get-process - (format - "Python:ob-ipython-%s" - name))))) - (let* ((remote (s-split "-" name)) - (remote-host (nth 1 remote)) - (remote-session (nth 3 remote))) - (+org/ob-ipython-generate-local-path-from-remote - remote-session - remote-host - params))) - (let* ((process-name (format - "Python:ob-ipython-%s" - name)) - (python-shell-prompt-detect-enabled nil) - (python-shell-completion-native-enable nil) - (buf (python-shell-make-comint - cmd - process-name - t)) - (dir (cdr (assoc :pydir params)))) - (if dir - (with-current-buffer - buf - (setq-local - default-directory - dir))) - (sleep-for 1) - (format "*%s*" process-name)))))) + (let ((cmd (string-join (ob-ipython--kernel-repl-cmd name) " "))) + (cond ((string= "default" name) + (run-python cmd nil nil) + (format "*%s*" python-shell-buffer-name)) + ((string-match "^remote-.*ssh.json" name) + (when (not (ignore-errors + (process-live-p + (get-process + (format + "Python:ob-ipython-%s" + name))))) + (let* ((remote (s-split "-" name)) + (remote-host (nth 1 remote)) + (remote-session (nth 3 remote))) + (+org/ob-ipython-generate-local-path-from-remote + remote-session + remote-host + params)))) + ((let* ((process-name (format "Python:ob-ipython-%s" name)) + (python-shell-prompt-detect-enabled nil) + (python-shell-completion-native-enable nil) + (buf (python-shell-make-comint cmd process-name t)) + (dir (cdr (assoc :pydir params)))) + (if dir + (with-current-buffer buf + (setq-local default-directory dir))) + (sleep-for 1) + (format "*%s*" process-name)))))) ;;;###autoload (defun +org*org-babel-execute:ipython (body params) @@ -73,17 +58,11 @@ create a repl connecting to remote session." This function is called by `org-babel-execute-src-block'." (message default-directory) (let ((session (cdr (assoc :session params)))) - (org-babel-ipython-initiate-session - session - params)) + (org-babel-ipython-initiate-session session params)) (ob-ipython--clear-output-buffer) (if (cdr (assoc :async params)) - (ob-ipython--execute-async - body - params) - (ob-ipython--execute-sync - body - params))) + (ob-ipython--execute-async body params) + (ob-ipython--execute-sync body params))) ;;;###autoload (defun +org/ob-ipython-generate-local-path-from-remote (session host params) @@ -92,7 +71,10 @@ This function is called by `org-babel-execute-src-block'." (substring (shell-command-to-string (concat "ssh " host " jupyter --runtime-dir")) 0 -1)) (runtime-file (concat runtime-dir "/" "kernel-" session ".json")) (tramp-path (concat "/ssh:" host ":" runtime-file)) - (tramp-copy (concat +ob-ipython-local-runtime-dir "/remote-" host "-kernel-" session ".json")) + (tramp-copy (concat (or +ob-ipython-local-runtime-dir + (substring (shell-command-to-string "jupyter --runtime-dir") + 0 -1)) + "/remote-" host "-kernel-" session ".json")) (local-path (concat "Python:ob-ipython-" @@ -105,21 +87,17 @@ This function is called by `org-babel-execute-src-block'." (python-shell-prompt-detect-enabled nil) (python-shell-completion-native-enable nil) (buf (python-shell-make-comint - (concat - ob-ipython-command - " console --simple-prompt --existing " - tramp-copy - " --ssh " - host) + (concat ob-ipython-command + " console --simple-prompt --existing " + tramp-copy " --ssh " host) (concat "" local-path) t)) (proc (get-buffer-process buf)) (dir (cdr (assoc :pydir params)))) (sleep-for 3) - (if dir - (with-current-buffer - buf - (setq-local default-directory dir))) + (when dir + (with-current-buffer buf + (setq-local default-directory dir))) (format "*%s*" proc)))) ;; * org-src-edit @@ -127,51 +105,31 @@ This function is called by `org-babel-execute-src-block'." (defun +org*org-babel-edit-prep:ipython (info) (let* ((params (nth 2 info)) (session (cdr (assoc :session params)))) - (org-babel-ipython-initiate-session - session - params)) + (org-babel-ipython-initiate-session session params)) ;; Support for python.el's "send-code" commands within edit buffers. - (setq-local - python-shell-buffer-name - (format - "Python:ob-ipython-%s" - (->> - info - (nth 2) - (assoc :session) - cdr ob-ipython--normalize-session))) - (setq-local - default-directory - (format - "%s" - (->> - info - (nth 2) - (assoc :pydir) - cdr ob-ipython--normalize-session))) + (setq-local python-shell-buffer-name + (format "Python:ob-ipython-%s" + (->> info (nth 2) (assoc :session) + cdr ob-ipython--normalize-session))) + (setq-local default-directory + (format "%s" + (->> info (nth 2) (assoc :pydir) + cdr ob-ipython--normalize-session))) (ob-ipython-mode 1) ;; hack on company mode to use company-capf rather than company-anaconda (when (featurep! :completion company) - (setq-local - company-backends - '(company-capf - company-dabbrev - company-files - company-yasnippet)) - (setq-local - company-idle-delay - nil)) + (setq-local company-backends + '(company-capf + company-dabbrev + company-files + company-yasnippet)) + (setq-local company-idle-delay nil)) (when (featurep 'lpy) (setq lispy-python-proc - (format - "Python:ob-ipython-%s" - (->> - info - (nth 2) - (assoc :session) - cdr ob-ipython--normalize-session))) - (setq lispy--python-middleware-loaded-p - nil) + (format "Python:ob-ipython-%s" + (->> info (nth 2) (assoc :session) + cdr ob-ipython--normalize-session)) + lispy--python-middleware-loaded-p nil) (lispy--python-middleware-load))) ;; * retina @@ -180,11 +138,11 @@ This function is called by `org-babel-execute-src-block'." "Return the name of high-resolution image file for FILENAME. The optional arg SCALE is scale factor, and defaults to 2." (let ((pos (or (string-match "\\.[^./]*\\'" filename) (length filename)))) - (format - "%s@%dx%s" - (substring filename 0 pos) - (or scale 2) - (substring filename pos)))) + (format "%s@%dx%s" + (substring filename 0 pos) + (or scale 2) + (substring filename pos)))) + ;;;###autoload (defun +org*ob-ipython--write-base64-string (oldfunc &rest args) (let ((file (car args)) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index f76c198cd..7c7daed71 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -8,7 +8,6 @@ (if (featurep! +babel) (load! "+babel")) (if (featurep! +capture) (load! "+capture")) (if (featurep! +export) (load! "+export")) -(if (featurep! +ipython) (load! "+ipython")) (if (featurep! +present) (load! "+present")) ;; TODO (if (featurep! +publish) (load! "+publish")) From ff3f18ccaf6f7885fa2362b8737bb7275f4c951a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 18:15:02 +0200 Subject: [PATCH 1553/4235] Use stock ob-ipython instead of fuxialexander's fork By @fuxialexander's request --- 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 b09375c88..da17aa643 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -31,7 +31,7 @@ (when (featurep! :lang crystal) (package! ob-crystal)) (when (featurep! +ipython) - (package! ob-ipython :recipe (:fetcher github :repo "fuxialexander/ob-ipython" :files ("*"))))) + (package! ob-ipython))) (when (featurep! +export) (package! ox-pandoc) From 5948a52a38ce424af80262bc7990633a947ace7c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 18:15:30 +0200 Subject: [PATCH 1554/4235] Fix jumpy cursor in org tables when using evil-replace --- modules/lang/org/autoload/org.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 0c890b61c..37d05addb 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -307,10 +307,11 @@ wrong places)." (defun +org|realign-table-maybe () "Auto-align table under cursor and re-calculate formulas." (when (and (org-at-table-p) org-table-may-need-update) - (save-excursion + (let ((pt (point))) (quiet! (org-table-recalculate) - (if org-table-may-need-update (org-table-align)))))) + (if org-table-may-need-update (org-table-align))) + (goto-char pt)))) ;;;###autoload (defun +org*realign-table-maybe (&rest _) From 3f6bfee027698e99284af57c32ded9159747a7fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 19:15:29 +0200 Subject: [PATCH 1555/4235] Remember customized settings (load custom-file) --- core/core.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core.el b/core/core.el index 9ff645f42..76ae0d8d8 100644 --- a/core/core.el +++ b/core/core.el @@ -115,6 +115,7 @@ else (except for `window-setup-hook').") tramp-persistency-file-name (concat doom-cache-dir "tramp-persistency.el") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) +(load custom-file t t t) ;; From 8b7888d58ff14d6e28ad8510052e9f6be48cb143 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 19:15:43 +0200 Subject: [PATCH 1556/4235] Increase GC threshold from 8 to 16mb --- core/core.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 76ae0d8d8..57b48793e 100644 --- a/core/core.el +++ b/core/core.el @@ -181,8 +181,8 @@ with functions that require it (like modeline segments)." this, you'll get stuttering and random freezes) and resets `file-name-handler-alist'." (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 8388608 - gc-cons-percentage 0.1)) + gc-cons-threshold 16777216 + gc-cons-percentage 0.2)) (add-hook 'emacs-startup-hook #'doom|finalize) (add-hook 'doom-reload-hook #'doom|finalize) From d443a9d2dd155c3db06965e8e5edd0d7d4680895 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 19:16:21 +0200 Subject: [PATCH 1557/4235] Respect git-commit style/length conventions See https://chris.beams.io/posts/git-commit/ --- modules/feature/version-control/+git.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index d388c3ebe..b61708d5f 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -1,6 +1,9 @@ ;;; feature/version-control/+git.el -*- lexical-binding: t; -*- -(setq git-commit-fill-column 72) +;; see https://chris.beams.io/posts/git-commit/ +(setq git-commit-fill-column 72 + git-commit-summary-max-length 50 + git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line)) (when (featurep! :feature evil) (add-hook 'git-commit-mode-hook #'evil-insert-state)) From 404f9db7482b58138578d4c4ddea6045be8fab21 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 19:17:24 +0200 Subject: [PATCH 1558/4235] tools/ein: minor refactor --- modules/tools/ein/config.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index cb2ec56b9..3228632ff 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -8,9 +8,14 @@ ;; Plugins ;; -(def-package! ein - :defer t - :init +(after! ein + (setq ein:notebook-modes + '(ein:notebook-multilang-mode + ein:notebook-python-mode + ein:notebook-plain-mode) + ;; Slice images into rows; easier to navigate around images + ein:slice-image t) + (set! :popup "\\*ein: .*" :ignore) (set! :popup "\\*ein:tb .*" '((side . bottom) (size . 0.3)) @@ -19,20 +24,14 @@ '((side . left) (size . 50)) '((select))) - ;; Auto complete with company (when (featurep! :completion company) + ;; Code completion with company (setq ein:completion-backend 'ein:use-company-backend) (set! :company-backend '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) 'ein:company-backend)) - :config - (setq ein:notebook-modes - '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) - ;; Slice images into rows; easier to navigate around images - ein:slice-image t) - (after! ein-jupyter (setq ein:jupyter-server-args '("--no-browser")) (unless ein:jupyter-default-notebook-directory From abd8f87e280a0d550f71c6aef47b3dcdbad78b75 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 23:02:36 +0200 Subject: [PATCH 1559/4235] Move popup keymaps to config.el This prevents void-variable +popup-buffer-mode-map errors that occur in some hard to reproduce scenarios. Also ensures that window-persistent-parameters is being restored when +popup-mode is disabled. --- modules/ui/popup/autoload.el | 12 ++---------- modules/ui/popup/config.el | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index c434a8a41..da2621a2e 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -257,15 +257,6 @@ Uses `shrink-window-if-larger-than-buffer'." ;; Minor mode ;; -;;;###autoload -(defvar +popup-mode-map (make-sparse-keymap) - "Active keymap in a session with the popup system enabled. See -`+popup-mode'.") - -;;;###autoload -(defvar +popup-buffer-mode-map (make-sparse-keymap) - "Active keymap in popup windows. See `+popup-buffer-mode'.") - ;;;###autoload (define-minor-mode +popup-mode "Global minor mode representing Doom's popup management system." @@ -291,7 +282,8 @@ Uses `shrink-window-if-larger-than-buffer'." window--sides-inhibit-check nil) (+popup|cleanup-rules) (dolist (prop +popup-window-parameters) - (map-delete window-persistent-parameters prop))))) + (setq window-persistent-parameters + (map-delete window-persistent-parameters prop)))))) ;;;###autoload (define-minor-mode +popup-buffer-mode diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 552ed57c6..47ab76df9 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -97,6 +97,19 @@ a brief description of some native window parameters that Emacs uses: "The default time-to-live for transient buffers whose popup buffers have been deleted.") +(defvar +popup-mode-map (make-sparse-keymap) + "Active keymap in a session with the popup system enabled. See +`+popup-mode'.") + +(defvar +popup-buffer-mode-map + (let ((map (make-sparse-keymap))) + (when (featurep! :feature evil) + ;; for maximum escape coverage in emacs state buffers + (define-key map [escape] #'doom/escape) + (define-key map (kbd "ESC") #'doom/escape)) + map) + "Active keymap in popup windows. See `+popup-buffer-mode'.") + ;; ;; Default popup rules & bootstrap @@ -148,13 +161,6 @@ deleted.") +popup|set-modeline-on-enable +popup|unset-modeline-on-disable)) -(let ((map +popup-buffer-mode-map)) - (when (featurep! :feature evil) - ;; for maximum escape coverage in emacs state buffers - (define-key map [escape] #'doom/escape) - (define-key map (kbd "ESC") #'doom/escape)) - map) - ;; ;; Hacks From d2ca6f65b3533b769de500ea6c5a55c3d7a92b0a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 May 2018 23:06:13 +0200 Subject: [PATCH 1560/4235] doom/cleanup-session: don't kill modified buffers --- core/autoload/buffers.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index ed44c5da9..e008dd3b0 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -244,8 +244,11 @@ ALL-P (universal argument), clean them up globally." (interactive) (let ((buffers (doom-buried-buffers buffer-list)) (n 0)) - (mapc #'kill-buffer buffers) - (setq n (+ n (length buffers) (doom/cleanup-buffer-processes))) + (dolist (buf buffers) + (unless (buffer-modified-p buf) + (kill-buffer buf) + (cl-incf n))) + (setq n (+ n (doom/cleanup-buffer-processes))) (dolist (hook doom-cleanup-hook) (let ((m (funcall hook))) (when (integerp m) From 2784e3cb7205e19796d0ac6ac94094d08cc43338 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 00:41:57 +0200 Subject: [PATCH 1561/4235] Disable company +childframe by default The feature is still available, it simply isn't the default anymore (at least until company-box is more stable). --- init.example.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/init.example.el b/init.example.el index c68dd3b4f..027fcacd1 100644 --- a/init.example.el +++ b/init.example.el @@ -18,8 +18,7 @@ :completion (company ; the ultimate code completion backend - +auto ; as-you-type code completion - +childframe) ; a nicer company UI (Emacs 26+ only) + +auto) ; as-you-type code completion ;(helm ; the *other* search engine for love and life ; +fuzzy) ; enable fuzzy search backend for helm ;ido ; the other *other* search engine... From b1ab80ec3f2bb0bcad5dda16f94189739e3c3104 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 01:31:33 +0200 Subject: [PATCH 1562/4235] Fix doom//byte-compile when recompiling plugins This would cause odd void-variable/function errors because doom//byte-compile would erroneously try to compile *everything* after recompiling plugins. --- core/autoload/modules.el | 46 ++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 72b01a7b6..ed71220b1 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -280,7 +280,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (":private" (push doom-private-dir targets)) (":plugins" (byte-recompile-directory package-user-dir 0 t) - (setq compile-plugins-p t)) + (setq compile-plugins-p t + modules (delete ":plugins" modules))) ((pred file-directory-p) (push module targets)) ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) @@ -288,24 +289,33 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (intern (format ":%s" (match-string 1 module))) (intern (match-string 2 module))) targets)))) - (unless (equal modules (list ":plugins")) - (let ((inhibit-message t) - noninteractive) - ;; But first we must be sure that Doom and your private config have been - ;; fully loaded. Which usually aren't so in an noninteractive session. - (doom//reload-autoloads) - (doom-initialize t))) - ;; If no targets were supplied, then we use your module list. - (unless targets - (doom-initialize-modules t) - (setq targets (append (list doom-core-dir) - (doom-module-load-path)))) - ;; Assemble el files we want to compile; taking into account that MODULES - ;; may be a list of MODULE/SUBMODULE strings from the command line. - (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) - (if (not target-files) - (unless compile-plugins-p + (cl-block 'byte-compile + ;; If we're just here to byte-compile our plugins, we're done! + (and (not modules) + compile-plugins-p + (cl-return-from 'byte-compile t)) + (unless targets + (let ((inhibit-message t) + noninteractive) + ;; But first we must be sure that Doom and your private config have + ;; been fully loaded. Which usually aren't so in an noninteractive + ;; session. + (doom//reload-autoloads) + (doom-initialize t))) + ;; If no targets were supplied, then we use your module list. + (unless modules + (doom-initialize-modules t) + (setq targets (append (list doom-core-dir) + (doom-module-load-path)))) + ;; Assemble el files we want to compile; taking into account that + ;; MODULES may be a list of MODULE/SUBMODULE strings from the command + ;; line. + (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) + (unless target-files + (if targets + (message "Couldn't find any valid targets") (message "No targets to %scompile" (if recompile-p "re" ""))) + (cl-return-from 'byte-compile)) (condition-case ex (let ((use-package-expand-minimally t)) ;; Always compile private init file From 90ddc673371351c4a5057bef268c14803952b498 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 01:34:53 +0200 Subject: [PATCH 1563/4235] Fix with-popup-rules! macro --- modules/ui/popup/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index da2621a2e..55b4c4ee2 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -474,7 +474,7 @@ should match the arguments of `+popup-define' or the :popup setting." (declare (indent defun)) `(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist) display-buffer-alist) - ,@(cl-loop for rule in rules collect `(+popup-define ,@rule)) + ,@(cl-loop for rule in rules collect `(set! :popup ,@rule)) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) ,@body)) From 5f3cbeadd0a9ea62bc460dedaf88cc6ff576352a Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 31 May 2018 11:25:33 +1000 Subject: [PATCH 1564/4235] Fix magithub not loading after magit I'd have to run a magithub command to get everything to pop up like pull requests and what not. I think this was an oversight -- just removing this will still lazyload it, but instead when magit runs! --- modules/tools/magit/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 67d81c9a4..06c0759a9 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -20,7 +20,6 @@ (def-package! magithub - :commands magithub-feature-autoinject :after magit :preface (setq magithub-dir (concat doom-etc-dir "magithub/")) From 7461b94efe422a2326778af1a5bd258d3d69bf40 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 31 May 2018 13:16:57 +1000 Subject: [PATCH 1565/4235] Add posframe def-package! --- modules/completion/helm/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 7d22b1c08..e10c715cb 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -148,3 +148,7 @@ (def-package! wgrep :commands wgrep-change-to-wgrep-mode :config (setq wgrep-auto-save-buffer t)) + +(def-package! posframe + :after helm + :when (and EMACS26+ (featurep! +childframe))) From 568a6c7e2cb2cf9799814368215135fd133faf9e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 11:27:23 +0200 Subject: [PATCH 1566/4235] lang/python: remove defunct advice --- modules/lang/python/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 4e129b9d3..afbb98075 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -84,7 +84,6 @@ environment variables." :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) - (advice-add #'anaconda-mode-doc-buffer :after #'doom*anaconda-mode-doc-buffer) (defun +python|auto-kill-anaconda-processes () "Kill anaconda processes if this buffer is the last python buffer." From c80baef05d61f44dd0218fce789ab3c602b96823 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 11:31:32 +0200 Subject: [PATCH 1567/4235] lang/python: minor refactor company-anaconda is *not* being removed, it just autoloads itself, so we don't need its def-package! block. --- modules/lang/python/config.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index afbb98075..d772027f5 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -25,7 +25,6 @@ is loaded.") (add-hook! 'python-mode-hook #'(flycheck-mode highlight-numbers-mode)) (set! :env "PYTHONPATH" "PYENV_ROOT") - (set! :company-backend 'python-mode '(company-anaconda)) (set! :electric 'python-mode :chars '(?:)) (set! :repl 'python-mode #'+python/repl) @@ -79,6 +78,7 @@ environment variables." anaconda-mode-eldoc-as-single-line t) :config (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) + (set! :company-backend 'python-mode '(company-anaconda)) (set! :popup "^\\*anaconda-mode" nil '((select))) (set! :lookup 'python-mode :definition #'anaconda-mode-find-definitions @@ -92,13 +92,8 @@ environment variables." (doom-buffers-in-mode 'python-mode (buffer-list))))) (anaconda-mode-stop))) (add-hook! 'python-mode-hook - (add-hook 'kill-buffer-hook #'+python|auto-kill-anaconda-processes nil t))) + (add-hook 'kill-buffer-hook #'+python|auto-kill-anaconda-processes nil t)) - -(def-package! company-anaconda - :when (featurep! :completion company) - :after anaconda-mode - :config (map! :map anaconda-mode-map :localleader :prefix "f" From 1f5dae917677fc32ef75645c2d5225293c79d893 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 11:32:26 +0200 Subject: [PATCH 1568/4235] Merge evil-collection-anaconda into lang/python #628 This is the first step of removing evil-collection from Doom. --- modules/feature/evil/config.el | 5 +++-- modules/lang/python/config.el | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index afd7262f0..7a733716c 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -4,8 +4,9 @@ ;; strives to make Emacs a much better vim than vim was. (defvar +evil-collection-disabled-list - '(kotlin-mode ; doesn't do anything useful - simple) ; ditto + '(kotlin-mode ; doesn't do anything useful + simple + anaconda-mode) ; we'll do it ourselves "A list of `evil-collection' modules to disable. See the definition of this variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index d772027f5..3d260ca63 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -124,3 +124,15 @@ environment variables." :n "O" #'nosetests-pdb-one :n "V" #'nosetests-pdb-module)) + +;; +;; Evil integration +;; + +(when (featurep! :feature evil +everywhere) + (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps) + (map! :after anaconda-mode + :map anaconda-view-mode-map + :m "]]" #'anaconda-view-mode-next-definition + :m "[[" #'anaconda-view-mode-previous-definition + :n "q" #'quit-window)) From 183ccbb8f17fad3225046ed06e738d3117a9c885 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 11:41:33 +0200 Subject: [PATCH 1569/4235] Merge evil-collection-ivy into completion/ivy Disables evil-collection-ivy. Another step toward the removal of evil-collection from Doom. --- modules/completion/ivy/config.el | 66 +++++++++++++++++++++++++++++ modules/config/default/+bindings.el | 19 ++------- modules/feature/evil/config.el | 1 + 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 87ff505af..d6f8728e2 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -223,3 +223,69 @@ immediately runs it on the current candidate (ending the ivy session)." (counsel-grep-or-swiper . ivy--regex-plus) (t . ivy--regex-fuzzy)) ivy-initial-inputs-alist nil)) + + +;; +;; Evil key fixes +;; + +(map! :when (featurep! :feature evil +everywhere) + :after ivy + :map ivy-occur-mode-map + :n [mouse-1] #'ivy-occur-click + :n "" #'ivy-occur-press-and-switch + :m "j" #'ivy-occur-next-line + :m "k" #'ivy-occur-previous-line + :m "h" #'evil-backward-char + :m "l" #'evil-forward-char + :m "g" nil + :m "gg" #'evil-goto-first-line + :n "gf" #'ivy-occur-press + :n "ga" #'ivy-occur-read-action + :n "go" #'ivy-occur-dispatch + :n "gc" #'ivy-occur-toggle-calling + :n "gr" #'ivy-occur-revert-buffer + :n "q" #'quit-window + + :map ivy-occur-grep-mode-map + :v "j" #'evil-next-line + :v "k" #'evil-previous-line + :n "D" #'ivy-occur-delete-candidate + :n "C-d" #'evil-scroll-down + :n "d" #'ivy-occur-delete-candidate + :n "C-x C-q" #'ivy-wgrep-change-to-wgrep-mode + :n "i" #'ivy-wgrep-change-to-wgrep-mode + :n "gd" #'ivy-occur-delete-candidate + :n [mouse-1] #'ivy-occur-click + :n "" #'ivy-occur-press-and-switch + :m "j" #'ivy-occur-next-line + :m "k" #'ivy-occur-previous-line + :m "h" #'evil-backward-char + :m "l" #'evil-forward-char + :m "g" nil + :m "gg" #'evil-goto-first-line + :n "gf" #'ivy-occur-press + :n "gr" #'ivy-occur-revert-buffer + :n "ga" #'ivy-occur-read-action + :n "go" #'ivy-occur-dispatch + :n "gc" #'ivy-occur-toggle-calling + ;; quit + :n "q" #'quit-window + + :map ivy-minibuffer-map + [escape] #'abort-recursive-edit + [return] #'exit-minibuffer + [backspace] #'ivy-backward-delete-char + "C-m" #'ivy-done + "C-j" #'ivy-next-line + "C-k" #'ivy-previous-line + "C-l" #'ivy-alt-done + "C-A-k" #'ivy-scroll-down-command + "C-A-j" #'ivy-scroll-up-command + "C-r" #'ivy-reverse-i-search + "C-n" #'ivy-next-line + "C-p" #'ivy-previous-line + "C-w" #'ivy-backward-kill-word + "C-u" #'ivy-kill-line + "C-b" #'backward-word + "C-f" #'forward-word) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 158399161..6c814b195 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -608,21 +608,10 @@ ;; ivy (:after ivy :map ivy-minibuffer-map - [escape] #'keyboard-escape-quit - "C-SPC" #'ivy-call-and-recenter - "M-z" #'undo - "M-v" #'yank - "C-v" #'yank - "C-r" #'evil-paste-from-register - "C-k" #'ivy-previous-line - "C-j" #'ivy-next-line - "C-A-k" #'ivy-scroll-down-command - "C-A-j" #'ivy-scroll-up-command - "C-l" #'ivy-alt-done - "C-w" #'ivy-backward-kill-word - "C-u" #'ivy-kill-line - "C-b" #'backward-word - "C-f" #'forward-word) + "C-SPC" #'ivy-call-and-recenter ; preview file + "M-z" #'undo + "M-v" #'yank + "C-v" #'yank) ;; neotree (:after neotree diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7a733716c..044b0db3e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -6,6 +6,7 @@ (defvar +evil-collection-disabled-list '(kotlin-mode ; doesn't do anything useful simple + ivy anaconda-mode) ; we'll do it ourselves "A list of `evil-collection' modules to disable. See the definition of this variable for an explanation of the defaults (in comments). See From 3a16b70022cb8234ad116f061ac8f8be4bc33b34 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 12:17:47 +0200 Subject: [PATCH 1570/4235] Add +magit/clone command & bind to SPC g C #633 magithub-clone doesn't support full urls, magit-clone doesn't support user/repo notation. +magit/clone supports both. --- modules/config/default/+bindings.el | 2 +- modules/tools/magit/autoload.el | 31 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 6c814b195..fcc53e2e3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -191,7 +191,7 @@ (:desc "git" :prefix "g" :desc "Magit blame" :n "b" #'magit-blame :desc "Magit commit" :n "c" #'magit-commit - :desc "Magit clone" :n "C" #'magit-clone + :desc "Magit clone" :n "C" #'+magit/clone :desc "Magit dispatch" :n "d" #'magit-dispatch-popup :desc "Magit find-file" :n "f" #'magit-find-file :desc "Magit status" :n "g" #'magit-status diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index c99088050..925032f49 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -20,3 +20,34 @@ (kill-process process) (kill-buffer buf))))))) +(defvar +magit-clone-history nil + "History for `+magit/clone' prompt.") +;;;###autoload +(defun +magit/clone (url-or-repo dir) + "Delegates to `magit-clone' or `magithub-clone' depending on the repo url +format." + (interactive + (progn + (require 'magithub) + (let* ((user (ghubp-username)) + (repo (read-from-minibuffer + "Clone repository (user/repo or url): " + (if user (concat user "/")) + nil nil '+magit-clone-history)) + (name (car (last (split-string repo "/" t))))) + (list repo + (read-directory-name + "Destination: " + magithub-clone-default-directory + name nil name))))) + (require 'magithub) + (if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" url-or-repo) + (let ((repo `((owner (login . ,(match-string 1 url-or-repo))) + (name . ,(match-string 2 url-or-repo))))) + (and (or (magithub-request + (ghubp-get-repos-owner-repo repo)) + (let-alist repo + (user-error "Repository %s/%s does not exist" + .owner.login .name))) + (magithub-clone repo dir))) + (magit-clone url-or-repo dir))) From 6ecdd390c1f36b10d86540a46e30deecdb28fd16 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 13:09:22 +0200 Subject: [PATCH 1571/4235] config/default: reformat +bindings.el and general keybinds are now separate (easier to fold or navigate). --- modules/config/default/+bindings.el | 524 ++++++++++++++-------------- 1 file changed, 263 insertions(+), 261 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index fcc53e2e3..a44d14db3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -72,262 +72,6 @@ "C-x p" #'+popup/other - ;; --- ------------------------------------- - (: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 - - ;; 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 "~" #'+popup/toggle - :desc "Eval expression" :n "`" #'eval-expression - :desc "Blink cursor line" :n "DEL" #'+nav-flash/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" #'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" #'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 "Spelling error" :nv "s" #'evil-next-flyspell-error - :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) - - (:desc "search" :prefix "/" - :desc "Project" :nv "p" #'+ivy/project-search - :desc "Directory" :nv "d" (λ! (+ivy/project-search t)) - :desc "Buffer" :nv "b" #'swiper - :desc "Symbols" :nv "i" #'imenu - :desc "Symbols across buffers" :nv "I" #'imenu-anywhere - :desc "Online providers" :nv "o" #'+lookup/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 "Rename workspace" :n "r" #'+workspace/rename - :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" #'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 "]" #'next-buffer - :desc "Previous buffer" :n "[" #'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" #'+lookup/definition - :desc "Jump to references" :n "D" #'+lookup/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 directory" :n "d" #'dired - :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 "Find file in private config" :n "p" #'+default/find-in-config - :desc "Browse private config" :n "P" #'+default/browse-config) - - (:desc "git" :prefix "g" - :desc "Magit blame" :n "b" #'magit-blame - :desc "Magit commit" :n "c" #'magit-commit - :desc "Magit clone" :n "C" #'+magit/clone - :desc "Magit dispatch" :n "d" #'magit-dispatch-popup - :desc "Magit find-file" :n "f" #'magit-find-file - :desc "Magit status" :n "g" #'magit-status - :desc "List gists" :n "G" #'+gist:list - :desc "Initialize repo" :n "i" #'magit-init - :desc "Browse issues tracker" :n "I" #'+vcs/git-browse-issues - :desc "Magit buffer log" :n "l" #'magit-log-buffer-file - :desc "List repositories" :n "L" #'magit-list-repositories - :desc "Browse remote" :n "o" #'+vcs/git-browse - :desc "Magit push popup" :n "p" #'magit-push-popup - :desc "Magit pull popup" :n "P" #'magit-pull-popup - :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk - :desc "Git revert file" :n "R" #'vc-revert - :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk - :desc "Git stage file" :n "S" #'magit-stage-file - :desc "Git time machine" :n "t" #'git-timemachine-toggle - :desc "Git unstage file" :n "U" #'magit-unstage-file - :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 "Open Bug Report" :n "b" #'doom/open-bug-report - :desc "Describe char" :n "c" #'describe-char - :desc "Describe DOOM module" :n "d" #'doom/describe-module - :desc "Open Doom manual" :n "D" #'doom//open-manual - :desc "Open vanilla sandbox" :n "E" #'doom/open-vanilla-sandbox - :desc "Describe function" :n "f" #'describe-function - :desc "Describe face" :n "F" #'describe-face - :desc "Info" :n "i" #'info-lookup-symbol - :desc "Describe key" :n "k" #'describe-key - :desc "Find documentation" :n "K" #'+lookup/documentation - :desc "Find library" :n "l" #'find-library - :desc "Command log" :n "L" #'global-command-log-mode - :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages - :desc "Describe mode" :n "M" #'describe-mode - :desc "Toggle profiler" :n "p" #'doom/toggle-profiler - :desc "Reload theme" :n "r" #'doom//reload-theme - :desc "Reload private config" :n "R" #'doom//reload - :desc "Describe DOOM setting" :n "s" #'doom/describe-setting - :desc "Describe variable" :n "v" #'describe-variable - :desc "Print Doom version" :n "V" #'doom/version - :desc "Describe at point" :n "." #'helpful-at-point - :desc "What face" :n "'" #'doom/what-face - :desc "What minor modes" :n ";" #'doom/describe-active-minor-mode) - - (:desc "insert" :prefix "i" - :desc "From kill-ring" :nv "y" #'counsel-yank-pop - :desc "From evil registers" :nv "r" #'counsel-evil-registers - :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) - - (: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/open - :desc "Neotree: find file" :n "N" #'+neotree/find-this-file - :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle - :desc "Terminal" :n "t" #'+term/open - :desc "Terminal in popup" :n "T" #'+term/open-popup-in-project - :desc "Eshell" :n "e" #'+eshell/open - :desc "Eshell in popup" :n "E" #'+eshell/open-popup - - (:when (featurep! :collab floobits) - :desc "floobits" :prefix "f" - :n "c" #'floobits-clear-highlights - :n "f" #'floobits-follow-user - :n "j" #'floobits-join-workspace - :n "l" #'floobits-leave-workspace - :n "R" #'floobits-share-dir-private - :n "s" #'floobits-summon - :n "t" #'floobits-follow-mode-toggle - :n "U" #'floobits-share-dir-public) - - ;; 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 "Compile project" :n "c" #'projectile-compile-project - :desc "Find other file" :n "o" #'projectile-find-other-file - :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 "Invalidate cache" :n "x" #'projectile-invalidate-cache) - - (:desc "quit" :prefix "q" - :desc "Save and quit" :n "q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit - :desc "Restart Doom Emacs" :n "r" #'restart-emacs) - - (:when (featurep! :tools upload) - (:desc "remote" :prefix "r" - :desc "Upload local" :n "u" #'ssh-deploy-upload-handler - :desc "Upload local (force)" :n "U" #'ssh-deploy-upload-handler-forced - :desc "Download remote" :n "d" #'ssh-deploy-download-handler - :desc "Diff local & remote" :n "D" #'ssh-deploy-diff-handler - :desc "Browse remote files" :n "." #'ssh-deploy-browse-remote-handler - :desc "Detect remote changes" :n ">" #'ssh-deploy-remote-changes-handler)) - - (:when (featurep! :feature snippets) - (:desc "snippets" :prefix "s" - :desc "New snippet" :n "n" #'yas-new-snippet - :desc "Insert snippet" :nv "i" #'yas-insert-snippet - :desc "Find snippet" :n "s" #'+default/find-in-snippets - :desc "Find snippet for mode" :n "S" #'+default/browse-snippets - :desc "Find global snippet" :n "/" #'yas-visit-snippet-file)) - - (: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 "Frame fullscreen" :n "F" #'toggle-frame-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-mode - :desc "org-tree-slide mode" :n "p" #'+org-present/start)) - - ;; --- Personal vim-esque bindings ------------------ :nv "K" #'+lookup/documentation :n "zx" #'kill-this-buffer @@ -589,14 +333,12 @@ [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))) @@ -691,9 +433,10 @@ ;; --- Built-in plugins ----------------------------- - (:after comint - ;; TAB auto-completion in term buffers - :map comint-mode-map [tab] #'company-complete) + (:when (featurep! :completion company) + (:after comint + ;; TAB auto-completion in term buffers + :map comint-mode-map [tab] #'company-complete)) (:map* (help-mode-map helpful-mode-map) :n "o" #'ace-link-help @@ -707,6 +450,265 @@ [remap quit-window] #'kill-this-buffer)) +;; +;; +;; + +(map! :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 + + ;; 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 "~" #'+popup/toggle + :desc "Eval expression" :n "`" #'eval-expression + :desc "Blink cursor line" :n "DEL" #'+nav-flash/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" #'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" #'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 "Spelling error" :nv "s" #'evil-next-flyspell-error + :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) + + (:desc "search" :prefix "/" + :desc "Project" :nv "p" #'+ivy/project-search + :desc "Directory" :nv "d" (λ! (+ivy/project-search t)) + :desc "Buffer" :nv "b" #'swiper + :desc "Symbols" :nv "i" #'imenu + :desc "Symbols across buffers" :nv "I" #'imenu-anywhere + :desc "Online providers" :nv "o" #'+lookup/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 "Rename workspace" :n "r" #'+workspace/rename + :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" #'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 "]" #'next-buffer + :desc "Previous buffer" :n "[" #'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" #'+lookup/definition + :desc "Jump to references" :n "D" #'+lookup/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 directory" :n "d" #'dired + :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 "Find file in private config" :n "p" #'+default/find-in-config + :desc "Browse private config" :n "P" #'+default/browse-config) + + (:desc "git" :prefix "g" + :desc "Magit blame" :n "b" #'magit-blame + :desc "Magit commit" :n "c" #'magit-commit + :desc "Magit clone" :n "C" #'+magit/clone + :desc "Magit dispatch" :n "d" #'magit-dispatch-popup + :desc "Magit find-file" :n "f" #'magit-find-file + :desc "Magit status" :n "g" #'magit-status + :desc "List gists" :n "G" #'+gist:list + :desc "Initialize repo" :n "i" #'magit-init + :desc "Browse issues tracker" :n "I" #'+vcs/git-browse-issues + :desc "Magit buffer log" :n "l" #'magit-log-buffer-file + :desc "List repositories" :n "L" #'magit-list-repositories + :desc "Browse remote" :n "o" #'+vcs/git-browse + :desc "Magit push popup" :n "p" #'magit-push-popup + :desc "Magit pull popup" :n "P" #'magit-pull-popup + :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk + :desc "Git revert file" :n "R" #'vc-revert + :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk + :desc "Git stage file" :n "S" #'magit-stage-file + :desc "Git time machine" :n "t" #'git-timemachine-toggle + :desc "Git unstage file" :n "U" #'magit-unstage-file + :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 "Open Bug Report" :n "b" #'doom/open-bug-report + :desc "Describe char" :n "c" #'describe-char + :desc "Describe DOOM module" :n "d" #'doom/describe-module + :desc "Open Doom manual" :n "D" #'doom//open-manual + :desc "Open vanilla sandbox" :n "E" #'doom/open-vanilla-sandbox + :desc "Describe function" :n "f" #'describe-function + :desc "Describe face" :n "F" #'describe-face + :desc "Info" :n "i" #'info-lookup-symbol + :desc "Describe key" :n "k" #'describe-key + :desc "Find documentation" :n "K" #'+lookup/documentation + :desc "Find library" :n "l" #'find-library + :desc "Command log" :n "L" #'global-command-log-mode + :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages + :desc "Describe mode" :n "M" #'describe-mode + :desc "Toggle profiler" :n "p" #'doom/toggle-profiler + :desc "Reload theme" :n "r" #'doom//reload-theme + :desc "Reload private config" :n "R" #'doom//reload + :desc "Describe DOOM setting" :n "s" #'doom/describe-setting + :desc "Describe variable" :n "v" #'describe-variable + :desc "Print Doom version" :n "V" #'doom/version + :desc "Describe at point" :n "." #'helpful-at-point + :desc "What face" :n "'" #'doom/what-face + :desc "What minor modes" :n ";" #'doom/describe-active-minor-mode) + + (:desc "insert" :prefix "i" + :desc "From kill-ring" :nv "y" #'counsel-yank-pop + :desc "From evil registers" :nv "r" #'counsel-evil-registers + :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) + + (: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/open + :desc "Neotree: find file" :n "N" #'+neotree/find-this-file + :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle + :desc "Terminal" :n "t" #'+term/open + :desc "Terminal in popup" :n "T" #'+term/open-popup-in-project + :desc "Eshell" :n "e" #'+eshell/open + :desc "Eshell in popup" :n "E" #'+eshell/open-popup + + (:when (featurep! :collab floobits) + :desc "floobits" :prefix "f" + :n "c" #'floobits-clear-highlights + :n "f" #'floobits-follow-user + :n "j" #'floobits-join-workspace + :n "l" #'floobits-leave-workspace + :n "R" #'floobits-share-dir-private + :n "s" #'floobits-summon + :n "t" #'floobits-follow-mode-toggle + :n "U" #'floobits-share-dir-public) + + ;; 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 "Compile project" :n "c" #'projectile-compile-project + :desc "Find other file" :n "o" #'projectile-find-other-file + :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 "Invalidate cache" :n "x" #'projectile-invalidate-cache) + + (:desc "quit" :prefix "q" + :desc "Save and quit" :n "q" #'evil-save-and-quit + :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit + :desc "Restart Doom Emacs" :n "r" #'restart-emacs) + + (:when (featurep! :tools upload) + (:desc "remote" :prefix "r" + :desc "Upload local" :n "u" #'ssh-deploy-upload-handler + :desc "Upload local (force)" :n "U" #'ssh-deploy-upload-handler-forced + :desc "Download remote" :n "d" #'ssh-deploy-download-handler + :desc "Diff local & remote" :n "D" #'ssh-deploy-diff-handler + :desc "Browse remote files" :n "." #'ssh-deploy-browse-remote-handler + :desc "Detect remote changes" :n ">" #'ssh-deploy-remote-changes-handler)) + + (:when (featurep! :feature snippets) + (:desc "snippets" :prefix "s" + :desc "New snippet" :n "n" #'yas-new-snippet + :desc "Insert snippet" :nv "i" #'yas-insert-snippet + :desc "Find snippet" :n "s" #'+default/find-in-snippets + :desc "Find snippet for mode" :n "S" #'+default/browse-snippets + :desc "Find global snippet" :n "/" #'yas-visit-snippet-file)) + + (: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 "Frame fullscreen" :n "F" #'toggle-frame-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-mode + :desc "org-tree-slide mode" :n "p" #'+org-present/start)) + + ;; ;; Keybinding fixes ;; From 601c9a654e91b12504f4b3d9853190f374cb6128 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 13:10:34 +0200 Subject: [PATCH 1572/4235] Merge evil-collection-dired into emacs/dired --- modules/emacs/dired/config.el | 158 +++++++++++++++++++++++++++++++++ modules/feature/evil/config.el | 4 +- 2 files changed, 161 insertions(+), 1 deletion(-) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 0dd520ae0..eb1bc9aab 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -59,3 +59,161 @@ (unless (file-remote-p default-directory) (apply orig-fn args))) (advice-add #'dired-k--highlight :around #'+dired*dired-k-highlight)) + + +;; +;; Evil integration +;; + +(map! :when (featurep! :feature evil +everywhere) + :after dired + :map dired-mode-map + :n "q" #'quit-window + :m "j" #'dired-next-line + :m "k" #'dired-previous-line + :n [mouse-2] 'dired-mouse-find-file-other-window + :n [follow-link] 'mouse-face + ;; Commands to mark or flag certain categories of files + :n "#" #'dired-flag-auto-save-files + :n "." #'dired-clean-directory + :n "~" #'dired-flag-backup-files + ;; Upper case keys (except !) for operating on the marked files + :n "A" #'dired-do-find-regexp + :n "C" #'dired-do-copy + :n "B" #'dired-do-byte-compile + :n "D" #'dired-do-delete + :n "gG" #'dired-do-chgrp ;; FIXME: This can probably live on a better binding. + :n "H" #'dired-do-hardlink + :n "L" #'dired-do-load + :n "M" #'dired-do-chmod + :n "O" #'dired-do-chown + :n "P" #'dired-do-print + :n "Q" #'dired-do-find-regexp-and-replace + :n "R" #'dired-do-rename + :n "S" #'dired-do-symlink + :n "T" #'dired-do-touch + :n "X" #'dired-do-shell-command + :n "Z" #'dired-do-compress + :n "c" #'dired-do-compress-to + :n "!" #'dired-do-shell-command + :n "&" #'dired-do-async-shell-command + ;; Comparison commands + :n "=" #'dired-diff + ;; Tree Dired commands + :n "M-C-?" #'dired-unmark-all-files + :n "M-C-d" #'dired-tree-down + :n "M-C-u" #'dired-tree-up + :n "M-C-n" #'dired-next-subdir + :n "M-C-p" #'dired-prev-subdir + ;; move to marked files + :n "M-{" #'dired-prev-marked-file + :n "M-}" #'dired-next-marked-file + ;; Make all regexp commands share a `%' prefix: + ;; We used to get to the submap via a symbol dired-regexp-prefix, but that + ;; seems to serve little purpose, and copy-keymap does a better job + ;; without it. + :n "%" nil + :n "%u" #'dired-upcase + :n "%l" #'dired-downcase + :n "%d" #'dired-flag-files-regexp + :n "%g" #'dired-mark-files-containing-regexp + :n "%m" #'dired-mark-files-regexp + :n "%r" #'dired-do-rename-regexp + :n "%C" #'dired-do-copy-regexp + :n "%H" #'dired-do-hardlink-regexp + :n "%R" #'dired-do-rename-regexp + :n "%S" #'dired-do-symlink-regexp + :n "%&" #'dired-flag-garbage-files + ;; mark + :n "*" nil + :n "**" #'dired-mark-executables + :n "*/" #'dired-mark-directories + :n "*@" #'dired-mark-symlinks + :n "*%" #'dired-mark-files-regexp + :n "*(" #'dired-mark-sexp + :n "*." #'dired-mark-extension + :n "*O" #'dired-mark-omitted + :n "*c" #'dired-change-marks + :n "*s" #'dired-mark-subdir-files + :n "*m" #'dired-mark + :n "*u" #'dired-unmark + :n "*?" #'dired-unmark-all-files + :n "*!" #'dired-unmark-all-marks + :n "U" #'dired-unmark-all-marks + :n "* " #'dired-unmark-backward + :n "* C-n" #'dired-next-marked-file + :n "* C-p" #'dired-prev-marked-file + :n "*t" #'dired-toggle-marks + ;; Lower keys for commands not operating on all the marked files + :n "a" #'dired-find-alternate-file + :n "d" #'dired-flag-file-deletion + :n "gf" #'dired-find-file + :n "C-m" #'dired-find-file + :n "gr" #'revert-buffer + :n "i" #'dired-toggle-read-only + :n "I" #'dired-maybe-insert-subdir + :n "J" #'dired-goto-file + :n "K" #'dired-do-kill-lines + :n "r" #'dired-do-redisplay + :n "m" #'dired-mark + :n "t" #'dired-toggle-marks + :n "u" #'dired-unmark ; also "*u" + :n "W" #'browse-url-of-dired-file + :n "x" #'dired-do-flagged-delete + :n "gy" #'dired-show-file-type ;; FIXME: This could probably go on a better key. + :n "Y" #'dired-copy-filename-as-kill + :n "+" #'dired-create-directory + ;; open + :n "" #'dired-find-file + :n "S-" #'dired-find-file-other-window + :n "M-" #'dired-display-file + :n "gO" #'dired-find-file-other-window + :n "go" #'dired-view-file + ;; sort + :n "o" #'dired-sort-toggle-or-edit + ;; moving + :m "gj" #'dired-next-dirline + :m "gk" #'dired-prev-dirline + :n "[" #'dired-prev-dirline + :n "]" #'dired-next-dirline + :n "<" #'dired-prev-dirline + :n ">" #'dired-next-dirline + :n "^" #'dired-up-directory + :n [?\S-\ ] 'dired-previous-line + :n [remap next-line] 'dired-next-line + :n [remap previous-line] 'dired-previous-line + ;; hiding + :n "g$" #'dired-hide-subdir ;; FIXME: This can probably live on a better binding. + :n "M-$" #'dired-hide-all + :n "(" #'dired-hide-details-mode + ;; isearch + :n "M-s a C-s" 'dired-do-isearch + :n "M-s a M-C-s" #'dired-do-isearch-regexp + :n "M-s f C-s" 'dired-isearch-filenames + :n "M-s f M-C-s" #'dired-isearch-filenames-regexp + ;; misc + :n [remap read-only-mode] 'dired-toggle-read-only + ;; `toggle-read-only' is an obsolete alias for `read-only-mode' + :n [remap toggle-read-only] 'dired-toggle-read-only + :n "g?" #'dired-summary + :n "" #'dired-unmark-backward + :n [remap undo] 'dired-undo + :n [remap advertised-undo] 'dired-undo + ;; thumbnail manipulation (image-dired) + :n "C-t d" #'image-dired-display-thumbs + :n "C-t t" #'image-dired-tag-files + :n "C-t r" #'image-dired-delete-tag + :n "C-t j" #'image-dired-jump-thumbnail-buffer + :n "C-t i" #'image-dired-dired-display-image + :n "C-t x" #'image-dired-dired-display-external + :n "C-t a" #'image-dired-display-thumbs-append + :n "C-t ." #'image-dired-display-thumb + :n "C-t c" #'image-dired-dired-comment-files + :n "C-t f" #'image-dired-mark-tagged-files + :n "C-t C-t" #'image-dired-dired-toggle-marked-thumbs + :n "C-t e" #'image-dired-dired-edit-comment-and-tags + ;; encryption and decryption (epa-dired) + :n ";d" #'epa-dired-do-decrypt + :n ";v" #'epa-dired-do-verify + :n ";s" #'epa-dired-do-sign + :n ";e" #'epa-dired-do-encrypt) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 044b0db3e..745a9cbbc 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -6,8 +6,10 @@ (defvar +evil-collection-disabled-list '(kotlin-mode ; doesn't do anything useful simple + ;; we'll do these ourselves + dired ivy - anaconda-mode) ; we'll do it ourselves + anaconda-mode) "A list of `evil-collection' modules to disable. See the definition of this variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") From acfa8a0bc1da97b8d4613aa5b2e7c89e5011b8e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 13:42:07 +0200 Subject: [PATCH 1573/4235] completion/helm: minor refactor Remove unnecessary after!/def-package! blocks (settings variables doesn't require the variables be defined). --- modules/completion/helm/config.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 928fbee21..3daca5d8d 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -101,14 +101,13 @@ (helm-flx-mode +1)) -(def-package! helm-locate - :defer t - :init (defvar helm-generic-files-map (make-sparse-keymap)) - :config (set-keymap-parent helm-generic-files-map helm-map)) +;; `helm-locate' +(defvar helm-generic-files-map (make-sparse-keymap)) +(after! helm-locate (set-keymap-parent helm-generic-files-map helm-map)) -(after! helm-bookmark - (setq-default helm-bookmark-show-location t)) +;; `helm-bookmark' +(setq helm-bookmark-show-location t) (after! helm-files @@ -122,9 +121,9 @@ :map helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) -(after! helm-css-scss ; https://github.com/ShingoFukuyama/helm-css-scss - (setq helm-css-scss-split-direction #'split-window-vertically - helm-css-scss-split-with-multiple-windows t)) +;; `helm-css-scss' -- https://github.com/ShingoFukuyama/helm-css-scss +(setq helm-css-scss-split-direction #'split-window-vertically + helm-css-scss-split-with-multiple-windows t) (def-package! helm-swoop ; https://github.com/ShingoFukuyama/helm-swoop From 9b3decaaa1e9bbea9bee560ed87bacb3697f0dde Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 13:44:04 +0200 Subject: [PATCH 1574/4235] Merge evil-collection-helm into completion/helm --- modules/completion/helm/config.el | 64 +++++++++++++++++++++++++++++++ modules/feature/evil/config.el | 1 + 2 files changed, 65 insertions(+) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 3daca5d8d..434d085cd 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -138,3 +138,67 @@ (def-package! wgrep :commands wgrep-change-to-wgrep-mode :config (setq wgrep-auto-save-buffer t)) + + +;; +;; Evil integration +;; + +(when (featurep! :feature evil +everywhere) + (setq helm-default-prompt-display-function #'+helm--set-prompt-display) + + (map! (:after helm + :map helm-map + :ni "M-[" #'helm-previous-source + :ni "M-]" #'helm-next-source + :ni "M-l" #'helm-execute-persistent-action + :ni "M-j" #'helm-next-line + :ni "M-k" #'helm-previous-line + :ni "C-f" #'helm-next-page + :ni "C-b" #'helm-previous-page + :n "" #'helm-select-action ; TODO: Ivy has "ga". + :n "[" #'helm-previous-source + :n "]" #'helm-next-source + :n "gk" #'helm-previous-source + :n "gj" #'helm-next-source + :n "(" #'helm-prev-visible-mark + :n ")" #'helm-next-visible-mark + :n "j" #'helm-next-line + :n "k" #'helm-previous-line + :n "gg" #'helm-beginning-of-buffer + :n "G" #'helm-end-of-buffer + :n "/" #'helm-quit-and-find-file + :n "gr" #'helm-refresh + :n "yp" #'helm-yank-selection + :n "yP" #'helm-copy-to-buffer + :n "yy" #'helm-kill-selection-and-quit) + (:after helm-files + :map (helm-find-files-map helm-read-file-map) + :n "go" #'helm-ff-run-switch-other-window + :n "/" #'helm-ff-run-find-sh-command + :ni "S-" #'helm-ff-run-switch-other-window + :ni "M-h" #'helm-find-files-up-one-level + :n "=" #'helm-ff-run-ediff-file + :n "%" #'helm-ff-run-query-replace-regexp + :n "D" #'helm-ff-run-delete-file) ; Ivy has "D". + (:after helm-locate + :map helm-generic-files-map + :n "go" #'helm-ff-run-switch-other-window + :ni "S-" #'helm-ff-run-switch-other-window) + (:after helm-buffers + :map helm-buffer-map + :n "go" #'helm-buffer-switch-other-window + :n "gO" #'display-buffer + :ni "S-" #'helm-buffer-switch-other-window + :ni "M-" #'display-buffer + :n "=" #'helm-buffer-run-ediff + :n "%" #'helm-buffer-run-query-replace-regexp + :n "D" #'helm-buffer-run-kill-persistent) ; Ivy has "D". + (:after helm-regexp + :map helm-moccur-map + :n "go" #'helm-moccur-run-goto-line-ow + :ni "S-" #'helm-moccur-run-goto-line-ow) + (:after helm-grep + :map helm-grep-map + :n "go" #'helm-grep-run-other-window-action + :ni "S-" #'helm-grep-run-other-window-action))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 745a9cbbc..26f48b42c 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -8,6 +8,7 @@ simple ;; we'll do these ourselves dired + helm ivy anaconda-mode) "A list of `evil-collection' modules to disable. See the definition of this From c2e2c4c11e1cefcd1b0c5c866b49c0789a767ce3 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 31 May 2018 23:39:17 +1000 Subject: [PATCH 1575/4235] Fix git-link not loading on SPC-g-I from fresh emacs start --- modules/feature/version-control/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/version-control/autoload.el b/modules/feature/version-control/autoload.el index 65734f350..8f01cff67 100644 --- a/modules/feature/version-control/autoload.el +++ b/modules/feature/version-control/autoload.el @@ -3,6 +3,7 @@ ;;;###autoload (defun +vcs-root () "Return the root git repo URL for the current file." + (require 'git-link) (let* ((remote (git-link--select-remote)) (remote-url (git-link--remote-url remote)) (remote-info (if remote-url (git-link--parse-remote remote-url)))) From 5e49239ff26d1f70cba3f00e61a9ae2099dc0671 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 15:59:52 +0200 Subject: [PATCH 1576/4235] Give feedback on +company/toggle-auto-completion --- modules/completion/company/autoload.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index ae89ac809..46d922bad 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -5,7 +5,9 @@ "Toggle as-you-type code completion." (interactive) (require 'company) - (setq company-idle-delay (unless company-idle-delay 0.2))) + (setq company-idle-delay (unless company-idle-delay 0.2)) + (message "Auto completion %s" + (if company-idle-delay "enabled" "disabled"))) ;;;###autoload (defun +company/complete () From 6536637cece5699fdb5707af4b06d9bbb362b289 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 16:16:24 +0200 Subject: [PATCH 1577/4235] Add +helm--set-prompt-display --- modules/completion/helm/autoload/evil.el | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/modules/completion/helm/autoload/evil.el b/modules/completion/helm/autoload/evil.el index d1c1841bd..722c2e714 100644 --- a/modules/completion/helm/autoload/evil.el +++ b/modules/completion/helm/autoload/evil.el @@ -58,3 +58,31 @@ (let ((helm-ag-base-command "rg --no-heading --maxdepth 1")) (+helm--file-search beg end query default-directory (if bang (list "-uu"))))) + +;;;###autoload +(defun +helm--set-prompt-display (pos) + "TODO" + (let (beg state region-active m) + (with-selected-window (minibuffer-window) + (setq beg (save-excursion (vertical-motion 0 (helm-window)) (point)) + state evil-state + region-active (region-active-p) + m (mark t))) + (when region-active + (setq m (- m beg)) + ;; Increment pos to handle the space before prompt (i.e `pref'). + (put-text-property (1+ (min m pos)) (+ 2 (max m pos)) + 'face + (list :background (face-background 'region)) + header-line-format)) + (put-text-property + ;; Increment pos to handle the space before prompt (i.e `pref'). + (+ 1 pos) (+ 2 pos) + 'face + (if (eq state 'insert) + 'underline + ;; Don't just use 'cursor, this can hide the current character. + (list :inverse-video t + :foreground (face-background 'cursor) + :background (face-background 'default))) + header-line-format))) From 97cbb13c2293c0027b53bfe14ac69d4097eda63e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 16:19:28 +0200 Subject: [PATCH 1578/4235] Improve which-key readability --- core/core-keybinds.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 3d9e1ed57..04417cdb0 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -51,11 +51,12 @@ If any hook returns non-nil, all hooks after it are ignored.") which-key-sort-uppercase-first nil which-key-add-column-padding 1 which-key-max-display-columns nil - which-key-min-display-lines 5 + which-key-min-display-lines 6 which-key-side-window-slot -10) ;; embolden local bindings (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) + (setq-hook! 'which-key-init-buffer-hook line-spacing 3) (add-hook 'doom-post-init-hook #'which-key-mode)) From a4d03654bdec21b2990e413f5d0d3acf63cce1be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 16:59:53 +0200 Subject: [PATCH 1579/4235] Fix associate!'s :files refusing a list of strings Due to changes under the hood, the :files FORM property requires FORM to either be a nested form of and/or sexps, or a single string. This is inconsistent with the plurality of ":files", so it has been fixed to accept a list of strings (with an implicit (and ...)). --- core/core-lib.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 2f306a227..b21d0fcc8 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -358,7 +358,10 @@ The available conditions are: (not (bound-and-true-p ,mode)) (and buffer-file-name (not (file-remote-p buffer-file-name))) ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) - ,(if files (doom--resolve-path-forms files '(doom-project-root)) t) + ,(if files (doom--resolve-path-forms + (if (stringp (car files)) (cons 'and files) files) + '(doom-project-root)) + t) ,(or pred-form t)) (,mode 1))) ,@(if (and modes (listp modes)) From 5c8ff3ada397b65730009f3a03f13dc669e5b121 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 17:25:59 +0200 Subject: [PATCH 1580/4235] Fix wrong-type-arg error from #+call() in org-mode #634 By rewriting the org babel library lazy-loader. --- modules/lang/org/+babel.el | 43 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index ea722d31c..3b590d1a9 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -3,12 +3,12 @@ (add-hook 'org-load-hook #'+org|init-babel) (defvar +org-babel-mode-alist - '(("cpp" . C) - ("C++" . C) - ("D" . C) - ("sh" . shell) - ("bash" . shell) - ("matlab" . octave)) + '((cpp . C) + (C++ . C) + (D . C) + (sh . shell) + (bash . shell) + (matlab . octave)) "An alist that maps languages to babel libraries. This is necessary for babel libraries (ob-*.el) that don't match the name of the language.") @@ -24,20 +24,21 @@ string). Stops at the first function to return non-nil.") org-src-window-setup 'current-window org-confirm-babel-evaluate nil) ; you don't need my permission - (defun +org*babel-execute-src-block (orig-fn &rest args) + (defun +org*babel-lazy-load-library (orig-fn info) "Load babel libraries as needed when babel blocks are executed." - (let* ((language (org-element-property :language (org-element-at-point))) - (lang-sym (intern language))) - (when (and (not (cdr (assq lang-sym org-babel-load-languages))) - (or (run-hook-with-args-until-success '+org-babel-load-functions language) - (require - (intern (format "ob-%s" - (or (cdr (assoc (downcase language) +org-babel-mode-alist)) - language))) - nil t))) - (map-put org-babel-load-languages lang-sym t)) - (apply orig-fn args))) - (advice-add #'org-babel-execute-src-block :around #'+org*babel-execute-src-block) + (when (funcall orig-fn info) + (let* ((lang (nth 0 info)) + (lang (if (symbolp lang) lang (intern lang)))) + (when (and (not (cdr (assq lang org-babel-load-languages))) + (or (run-hook-with-args-until-success '+org-babel-load-functions lang) + (require + (intern (format "ob-%s" + (or (cdr (assq lang +org-babel-mode-alist)) + lang))) + nil t))) + (map-put org-babel-load-languages lang t)) + t))) + (advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library) ;; I prefer C-c C-c for confirming over the default C-c ' (map! :map org-src-mode-map "C-c C-c" #'org-edit-src-exit) @@ -65,8 +66,8 @@ string). Stops at the first function to return non-nil.") (setq ob-ipython-resources-dir ".ob-ipython-resrc") - (defun +org|babel-load-ipython (language) - (and (string-match-p "^jupyter-" language) + (defun +org|babel-load-ipython (lang) + (and (string-match-p "^jupyter-" (symbol-name lang)) (require 'ob-ipython nil t))) (add-hook '+org-babel-load-functions #'+org|babel-load-ipython) :config From 1a28a0c0888ec74e477d4f865ba7af609fadbef9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 21:29:28 +0200 Subject: [PATCH 1581/4235] tools/magit: gate magithub behind +hub flag Use +magit-hub-features to customize which features to load. Set it to `t` to load all features. --- init.example.el | 2 +- modules/tools/magit/config.el | 12 +++++++++++- modules/tools/magit/packages.el | 3 ++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/init.example.el b/init.example.el index 027fcacd1..bd4a173e0 100644 --- a/init.example.el +++ b/init.example.el @@ -56,7 +56,7 @@ ;gist ; interacting with github gists ;macos ; MacOS-specific commands ;make ; run make tasks from Emacs - ;magit ; + ;(magit +hub) ; ;password-store ; password manager for nerds pdf ; pdf enhancements ;prodigy ; FIXME managing external services & code builders diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 06c0759a9..2cffe8aa5 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -1,5 +1,14 @@ ;;; tools/magit/config.el -*- lexical-binding: t; -*- +(defvar +magit-hub-features + '(pull-request-merge commit-browse completion) + "TODO") + + +;; +;; Plugins +;; + (def-package! magit :defer t :config @@ -20,6 +29,7 @@ (def-package! magithub + :when (featurep! +hub) :after magit :preface (setq magithub-dir (concat doom-etc-dir "magithub/")) @@ -27,7 +37,7 @@ (setq magithub-clone-default-directory "~/" magithub-preferred-remote-method 'clone_url) :config - (magithub-feature-autoinject t)) + (magithub-feature-autoinject +magit-hub-features)) (def-package! magit-gitflow diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index d510a8977..5cc34ba2f 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -2,7 +2,8 @@ ;;; tools/magit/packages.el (when (package! magit) - (package! magithub) (package! magit-gitflow) + (when (featurep! +hub) + (package! magithub)) (when (featurep! :feature evil) (package! evil-magit))) From dff6e44635fee368069bd2a2ca8318c0e57880de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 May 2018 21:31:29 +0200 Subject: [PATCH 1582/4235] tools/magit: gate evil-magit behind evil +everywhere flag --- modules/tools/magit/config.el | 2 +- modules/tools/magit/packages.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 2cffe8aa5..0fb3d7155 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -45,7 +45,7 @@ (def-package! evil-magit - :when (featurep! :feature evil) + :when (featurep! :feature evil +everywhere) :after magit :init (setq evil-magit-state 'normal) :config diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 5cc34ba2f..c96d9cfa0 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -5,5 +5,5 @@ (package! magit-gitflow) (when (featurep! +hub) (package! magithub)) - (when (featurep! :feature evil) + (when (featurep! :feature evil +everywhere) (package! evil-magit))) From 3359d351f51f4295a9df3e572642a8d0e4053614 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 02:15:19 +0200 Subject: [PATCH 1583/4235] Add define-key! macro; refactor config/default key fixes I'd like to phase out map! where it isn't absolutely necessary, since it isn't very well optimized. --- core/core-keybinds.el | 12 ++++ modules/config/default/+bindings.el | 102 ++++++++++++++++------------ 2 files changed, 70 insertions(+), 44 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 04417cdb0..36d8d69fe 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -153,6 +153,18 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (defvar doom--defer nil) (defvar doom--local nil) +(defmacro define-key! (keymap key def &rest rest) + "TODO" + (declare (indent defun)) + `(progn + (define-key ,keymap ,key ,def) + ,@(let (forms) + (while rest + (let ((key (pop rest)) + (def (pop rest))) + (push `(define-key ,keymap ,key ,def) forms))) + (nreverse forms)))) + (defmacro map! (&rest rest) "A nightmare of a key-binding macro that will use `evil-define-key*', `define-key', `local-set-key' and `global-set-key' depending on context and diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a44d14db3..e44425ef1 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -716,56 +716,70 @@ ;; 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 +(define-key input-decode-map [S-iso-lefttab] [backtab]) - ;; 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 +;; Fix TAB in terminal +(unless window-system + (define-key input-decode-map "TAB" [tab])) - ;; textmate-esque newline insertion - :i [M-return] #'evil-open-below - :i [S-M-return] #'evil-open-above - ;; textmate-esque deletion - :ig [M-backspace] #'doom/backward-kill-to-bol-and-indent - ;; Emacsien motions for insert mode - :i "C-b" #'backward-word - :i "C-f" #'forward-word +(after! evil + (evil-define-key* 'insert 'global + ;; 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. + "C-a" #'doom/backward-to-bol-or-indent + "C-e" #'doom/forward-to-last-non-comment-or-eol + "C-u" #'doom/backward-kill-to-bol-and-indent + ;; textmate-esque newline insertion + [M-return] #'evil-open-below + [S-M-return] #'evil-open-above + ;; Emacsien motions for insert mode + "C-b" #'backward-word + "C-f" #'forward-word) - ;; 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 - read-expression-map) - [escape] #'abort-recursive-edit - (:when (featurep 'evil) - "C-r" #'evil-paste-from-register) - "C-a" #'move-beginning-of-line - "C-w" #'backward-kill-word - "C-u" #'backward-kill-sentence - "C-b" #'backward-word - "C-f" #'forward-word - "C-z" (λ! (ignore-errors (call-interactively #'undo)))) + (evil-define-key* 'insert 'global + ;; textmate-esque deletion + [M-backspace] #'doom/backward-kill-to-bol-and-indent) - (:after evil - (:map evil-ex-completion-map - "C-a" #'move-beginning-of-line - "C-b" #'backward-word - "C-f" #'forward-word)) + (define-key! evil-ex-completion-map + "C-a" #'move-beginning-of-line + "C-b" #'backward-word + "C-f" #'forward-word)) - (:after tabulated-list - (:map tabulated-list-mode-map - "q" #'quit-window)) +(after! tabulated-list + (define-key tabulated-list-mode-map "q" #'quit-window)) - (:after view - (:map view-mode-map "" #'View-quit-all))) +(after! view + (define-key view-mode-map (kbd "") #'View-quit-all)) + +;; Restore common editing keys (and ESC) in minibuffer +(defun +default|fix-minibuffer-in-map (map) + (evil-define-key* nil map + [escape] #'abort-recursive-edit + "\C-a" #'move-beginning-of-line + "\C-w" #'backward-kill-word + "\C-u" #'backward-kill-sentence + "\C-b" #'backward-word + "\C-f" #'forward-word + "\C-z" (λ! (ignore-errors (call-interactively #'undo)))) + (when (featurep! :feature evil +everywhere) + (evil-define-key* nil map + "\C-r" #'abort-recursive-edit + "\C-j" #'next-line + "\C-k" #'previous-line + "\C-d" #'scroll-down-command + "\C-u" #'scroll-up-command))) + +(mapc #'+default|fix-minibuffer-in-map + (list minibuffer-local-map + minibuffer-local-ns-map + minibuffer-local-completion-map + minibuffer-local-must-match-map + minibuffer-local-isearch-map + read-expression-map)) + +(after! ivy (+default|fix-minibuffer-in-map ivy-minibuffer-map)) ;; From 4d9ddf27a980a85e0f2f3264a7821c05589370c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 02:18:46 +0200 Subject: [PATCH 1584/4235] Fix over-zealous evil-integration in ivy #636 --- modules/completion/ivy/config.el | 20 +------------------- modules/config/default/+bindings.el | 1 + 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index d6f8728e2..c2ca832c2 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -270,22 +270,4 @@ immediately runs it on the current candidate (ending the ivy session)." :n "go" #'ivy-occur-dispatch :n "gc" #'ivy-occur-toggle-calling ;; quit - :n "q" #'quit-window - - :map ivy-minibuffer-map - [escape] #'abort-recursive-edit - [return] #'exit-minibuffer - [backspace] #'ivy-backward-delete-char - "C-m" #'ivy-done - "C-j" #'ivy-next-line - "C-k" #'ivy-previous-line - "C-l" #'ivy-alt-done - "C-A-k" #'ivy-scroll-down-command - "C-A-j" #'ivy-scroll-up-command - "C-r" #'ivy-reverse-i-search - "C-n" #'ivy-next-line - "C-p" #'ivy-previous-line - "C-w" #'ivy-backward-kill-word - "C-u" #'ivy-kill-line - "C-b" #'backward-word - "C-f" #'forward-word) + :n "q" #'quit-window) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e44425ef1..78938d4f7 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -351,6 +351,7 @@ (:after ivy :map ivy-minibuffer-map "C-SPC" #'ivy-call-and-recenter ; preview file + "C-l" #'ivy-alt-done "M-z" #'undo "M-v" #'yank "C-v" #'yank) From 3bdb3d4e5d6db629cf93897a93826fd88ea667c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 02:20:00 +0200 Subject: [PATCH 1585/4235] Update uses of associate! --- modules/lang/data/config.el | 4 ++-- modules/lang/javascript/config.el | 4 ++-- modules/lang/php/config.el | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 80134d84d..a7a8424f8 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -44,8 +44,8 @@ (def-project-mode! +data-ansible-mode :modes (yaml-mode) - :files "roles/") + :files ("roles/")) (def-project-mode! +data-vagrant-mode - :files "Vagrantfile") + :files ("Vagrantfile")) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index adda012bc..58e89c416 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -210,10 +210,10 @@ :on-load (load! "+screeps")) (def-project-mode! +javascript-gulp-mode - :files "gulpfile.js") + :files ("gulpfile.js")) (def-project-mode! +javascript-npm-mode :modes (html-mode css-mode web-mode js2-mode markdown-mode) - :files "package.json" + :files ("package.json") :add-hooks (+javascript|add-node-modules-path)) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index bcbf730f4..8485d9521 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -98,5 +98,5 @@ (def-project-mode! +php-composer-mode :modes (web-mode php-mode) - :files "composer.json") + :files ("composer.json")) From 4b0e3af42441dd2b82d3dd98fe6f61e645f35fa1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 02:23:24 +0200 Subject: [PATCH 1586/4235] Set default ispell-dictionary sooner #630 This makes it easier to change and won't override user's customizations. --- modules/lang/latex/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 20febcb30..8462c0453 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -14,6 +14,10 @@ ;; Plugins ;; +;; Default language setting. +(defvar ispell-dictionary "english") + + (after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") @@ -69,8 +73,6 @@ (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) (add-hook 'LaTeX-mode-hook #'flyspell-mode)) - ;; Default language setting. - (setq ispell-dictionary "english") ;; Use chktex to search for errors in a latex file. (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") ;; Set a custom item indentation From 4f4495ca2ad28bc7f00a656a2ca56dce61c9c82a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 02:25:38 +0200 Subject: [PATCH 1587/4235] Move ispell-dictionary default to feature/spellcheck #630 Makes more sense to be here. --- modules/feature/spellcheck/config.el | 3 +++ modules/lang/latex/config.el | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 712877181..435d2c5f0 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -7,6 +7,9 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") +;; `ispell' +(defvar ispell-dictionary "english") + (def-package! flyspell ; built-in :defer t :init diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 8462c0453..750b988af 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -14,10 +14,6 @@ ;; Plugins ;; -;; Default language setting. -(defvar ispell-dictionary "english") - - (after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") From 592205e1dda4e5de49d4d018532bdf2724d3ae1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 02:42:36 +0200 Subject: [PATCH 1588/4235] Fix borked keys in insert mode Due to unescapted ctrl key specs. --- modules/config/default/+bindings.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 78938d4f7..bdaed67c0 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -721,7 +721,7 @@ ;; Fix TAB in terminal (unless window-system - (define-key input-decode-map "TAB" [tab])) + (define-key input-decode-map (kbd "TAB") [tab])) (after! evil (evil-define-key* 'insert 'global @@ -729,24 +729,24 @@ ;; 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. - "C-a" #'doom/backward-to-bol-or-indent - "C-e" #'doom/forward-to-last-non-comment-or-eol - "C-u" #'doom/backward-kill-to-bol-and-indent + "\C-a" #'doom/backward-to-bol-or-indent + "\C-e" #'doom/forward-to-last-non-comment-or-eol + "\C-u" #'doom/backward-kill-to-bol-and-indent ;; textmate-esque newline insertion [M-return] #'evil-open-below [S-M-return] #'evil-open-above ;; Emacsien motions for insert mode - "C-b" #'backward-word - "C-f" #'forward-word) + "\C-b" #'backward-word + "\C-f" #'forward-word) (evil-define-key* 'insert 'global ;; textmate-esque deletion [M-backspace] #'doom/backward-kill-to-bol-and-indent) (define-key! evil-ex-completion-map - "C-a" #'move-beginning-of-line - "C-b" #'backward-word - "C-f" #'forward-word)) + "\C-a" #'move-beginning-of-line + "\C-b" #'backward-word + "\C-f" #'forward-word)) (after! tabulated-list (define-key tabulated-list-mode-map "q" #'quit-window)) From bab530ea2ea76901e1a7320855f270754102a1bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 10:53:08 +0200 Subject: [PATCH 1589/4235] Revert +hub flag, but disable magithub by default Must be enabled on a per-project basis. You can change this behavior by setting +magit-hub-enabled-by-default to non-nil (before magit is loaded). Magithub has been made opt-in because: 1. Magithub is imposing, asking the user for a token, especially for users who don't use github (much or at all), but may occasionally have a project with a github remote. 2. magithub is really slow on first load for medium-to-large repos. 3. It's really easy to enable it through the magithub popup (H C e). magithub.enabled is saved into the project's .git/config file, so the setting will persist. Also added a docstring to +magit-hub-features --- init.example.el | 2 +- modules/tools/magit/autoload.el | 16 ++++++++++++++++ modules/tools/magit/config.el | 16 ++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/init.example.el b/init.example.el index bd4a173e0..027fcacd1 100644 --- a/init.example.el +++ b/init.example.el @@ -56,7 +56,7 @@ ;gist ; interacting with github gists ;macos ; MacOS-specific commands ;make ; run make tasks from Emacs - ;(magit +hub) ; + ;magit ; ;password-store ; password manager for nerds pdf ; pdf enhancements ;prodigy ; FIXME managing external services & code builders diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 925032f49..9645426e8 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -51,3 +51,19 @@ format." .owner.login .name))) (magithub-clone repo dir))) (magit-clone url-or-repo dir))) + + +;; +;; Advice +;; + +;;;###autoload +(defun +magit*hub-settings--format-magithub.enabled () + "Change the setting to display 'false' as its default." + (magit--format-popup-variable:choices "magithub.enabled" '("true" "false") "false")) + +;;;###autoload +(defun +magit*hub-enabled-p () + "Disables magithub by default." + (magithub-settings--value-or "magithub.enabled" nil + #'magit-get-boolean)) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 0fb3d7155..488d4a7a5 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -1,8 +1,12 @@ ;;; tools/magit/config.el -*- lexical-binding: t; -*- +(defvar +magit-hub-enable-by-default nil + "Whether or not to enable magithub features for all projects by default.") + (defvar +magit-hub-features '(pull-request-merge commit-browse completion) - "TODO") + "What features to initialize when `magithub' is loaded. Set this to `t' to +load everything.") ;; @@ -29,7 +33,6 @@ (def-package! magithub - :when (featurep! +hub) :after magit :preface (setq magithub-dir (concat doom-etc-dir "magithub/")) @@ -37,6 +40,15 @@ (setq magithub-clone-default-directory "~/" magithub-preferred-remote-method 'clone_url) :config + (unless +magit-hub-enable-by-default + ;; Disable magit by default. Can be enabled through magithub settings popup, + ;; or setting `+magit-hub-enable-by-default'. + (advice-add #'magithub-enabled-p :override #'+magit*hub-enabled-p) + ;; I don't use `magithub-settings--simple' to redefine this because it + ;; changes the order of settings. Obnoxious, but the alternative is even + ;; more so. + (advice-add #'magithub-settings--format-magithub.enabled + :override #'+magit*hub-settings--format-magithub.enabled)) (magithub-feature-autoinject +magit-hub-features)) From 2b052a9563b98041d6839a76f806fd7395abee4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 11:25:47 +0200 Subject: [PATCH 1590/4235] Ignore untracked files on make upgrade In case temporary/cache files are saved outside of .local, for example. --- core/core-dispatcher.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 467f099b3..2a27bb665 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -212,7 +212,7 @@ recompile. Run this whenever you: (with-temp-buffer (let ((default-directory dir)) (if (zerop (process-file "git" nil (current-buffer) nil - "status" "--porcelain")) + "status" "--porcelain" "-uno")) (string-match-p "[^ \t\n]" (buffer-string)) (error "Failed to check working tree in %s" dir))))) From f1bf9d163267cd8d03bf99d69d22147510444c2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 12:00:57 +0200 Subject: [PATCH 1591/4235] ivy-do-completion-in-region = t #640 Evil ex command completion is now handled by ivy, if it's enabled. --- modules/completion/ivy/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index c2ca832c2..702afd189 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -28,7 +28,6 @@ immediately runs it on the current candidate (ending the ivy session)." :after-call pre-command-hook :config (setq ivy-height 15 - ivy-do-completion-in-region nil ivy-wrap t ivy-fixed-height-minibuffer t projectile-completion-system 'ivy From 82f240ffc99d21f7a54fcfa868943beda91ae30e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 12:13:56 +0200 Subject: [PATCH 1592/4235] Bind SPC h w to +default/man-or-woman #639 Woman is essentially elisp-only Man; useful for systems without man (Windows, particularly). --- modules/config/default/+bindings.el | 1 + modules/config/default/autoload/default.el | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index bdaed67c0..09d6deab7 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -617,6 +617,7 @@ :desc "Describe DOOM setting" :n "s" #'doom/describe-setting :desc "Describe variable" :n "v" #'describe-variable :desc "Print Doom version" :n "V" #'doom/version + :desc "Man pages" :n "w" #'+default/man-or-woman :desc "Describe at point" :n "." #'helpful-at-point :desc "What face" :n "'" #'doom/what-face :desc "What minor modes" :n ";" #'doom/describe-active-minor-mode) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 738ea0a7b..52943b47e 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -68,3 +68,12 @@ If ARG (universal argument), runs `compile' from the current directory." (if arg #'projectile-compile-project #'compile)))) + +;;;###autoload +(defun +default/man-or-woman () + "Invoke `man' if man is installed, otherwise use `woman'." + (interactive) + (call-interactively + (if (executable-find "man") + #'man + #'woman))) From 83db654058f9efe30a3b0084456dac1312defc78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 12:19:11 +0200 Subject: [PATCH 1593/4235] Fix anaconda-mode loading late in python-mode #638 This would mean anaconda-mode's config wouldn't work until the second opened python buffer (or invokation of python-mode). --- modules/lang/python/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 3d260ca63..8219bb12b 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -72,11 +72,12 @@ environment variables." (def-package! anaconda-mode - :hook python-mode + :after python :init (setq anaconda-mode-installation-directory (concat doom-etc-dir "anaconda/") anaconda-mode-eldoc-as-single-line t) :config + (add-hook 'python-mode-hook #'anaconda-mode) (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) (set! :company-backend 'python-mode '(company-anaconda)) (set! :popup "^\\*anaconda-mode" nil '((select))) From 8f673f52fc43b633267068716246b7daf9460c22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 13:03:25 +0200 Subject: [PATCH 1594/4235] Conform helm posframe code to Doom conventions --- modules/completion/helm/config.el | 38 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 8487961c6..cda2c9bf4 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -53,25 +53,6 @@ (require 'helm-projectile) (set-keymap-parent helm-projectile-find-file-map helm-map) - ;; Posframes! - (when (and EMACS26+ (featurep! +childframe)) - (defvar helm-posframe-buffer nil) - - (defun helm-posframe-display (buffer &optional _resume) - (posframe-show - (setq helm-posframe-buffer buffer) - :poshandler #'posframe-poshandler-frame-bottom-left-corner - :left-fringe 10 - :width (frame-width) - :height 16 ;; ivy/+childframe uses 16 - :respect-header-line t)) - - (defun helm-posframe-cleanup () - (posframe-hide helm-posframe-buffer)) - - (add-hook! 'helm-cleanup-hook #'helm-posframe-cleanup) - (setq helm-display-function #'helm-posframe-display)) - ;;; Helm hacks (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." @@ -161,7 +142,24 @@ (def-package! posframe :when (and EMACS26+ (featurep! +childframe)) - :after helm) + :after helm + :config + (defvar +helm--posframe-buffer nil) + + (defun +helm-posframe-display (buffer &optional _resume) + (posframe-show + (setq +helm--posframe-buffer buffer) + :poshandler #'posframe-poshandler-frame-bottom-left-corner + :left-fringe 10 + :width (frame-width) + :height 16 ;; ivy/+childframe uses 16 + :respect-header-line t)) + + (defun +helm|posframe-cleanup () + (posframe-hide +helm--posframe-buffer)) + + (add-hook! 'helm-cleanup-hook #'+helm|posframe-cleanup) + (setq helm-display-function #'+helm-posframe-display)) ;; From cc159ed9a92b89d0b303c620a2e87ec02724c4d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 13:06:30 +0200 Subject: [PATCH 1595/4235] completion/helm: add-hook! => add-hook add-hook! is unnecessary for adding 1-to-1 hook. --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index cda2c9bf4..b345b0530 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -158,7 +158,7 @@ (defun +helm|posframe-cleanup () (posframe-hide +helm--posframe-buffer)) - (add-hook! 'helm-cleanup-hook #'+helm|posframe-cleanup) + (add-hook 'helm-cleanup-hook #'+helm|posframe-cleanup) (setq helm-display-function #'+helm-posframe-display)) From 3c967cf3a3f77ae5d1f02ef82395baaf639d6a98 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 12:29:51 +0200 Subject: [PATCH 1596/4235] Resume evil-mc upon switching to insert mode #618 I believe this is intuitive, but I've designed it to be easily disabled with: (remove-hook 'evil-insert-state-entry-hook #'+evil-mc|resume-cursors) --- modules/feature/evil/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 26f48b42c..1d4379ccd 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -326,6 +326,10 @@ the new algorithm is confusing, like in python or ruby." (map-put evil-mc-custom-known-commands fn '((:default . evil-mc-execute-default-call)))) + ;; Activate evil-mc cursors upon switching to insert mode + (defun +evil-mc|resume-cursors () (setq evil-mc-frozen nil)) + (add-hook 'evil-insert-state-entry-hook #'+evil-mc|resume-cursors) + ;; disable evil-escape in evil-mc; causes unwanted text on invocation (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode nil #'eq) From 002f514b22369c0c5fcbaded7d8efa2fd94e8723 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 12:31:03 +0200 Subject: [PATCH 1597/4235] Minor refactor of evil-mc->smartparens integration --- modules/feature/evil/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 1d4379ccd..34bdc3887 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -315,10 +315,10 @@ the new algorithm is confusing, like in python or ruby." (after! smartparens ;; Make evil-mc cooperate with smartparens better - (unless (memq (car sp--mc/cursor-specific-vars) (cdr (assq :default evil-mc-cursor-variables))) - (setcdr (assq :default evil-mc-cursor-variables) - (append (cdr (assq :default evil-mc-cursor-variables)) - sp--mc/cursor-specific-vars)))) + (let ((vars (cdr (assq :default evil-mc-cursor-variables)))) + (unless (memq (car sp--mc/cursor-specific-vars) vars) + (setcdr (assq :default evil-mc-cursor-variables) + (append vars sp--mc/cursor-specific-vars))))) ;; Add custom commands to whitelisted commands (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol From c5df4e7d2f960ea1e465299ac2884cf3e292840c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 13:40:22 +0200 Subject: [PATCH 1598/4235] tools/magit: remove +hub check around magithub package --- modules/tools/magit/packages.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index c96d9cfa0..51682daa9 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -3,7 +3,6 @@ (when (package! magit) (package! magit-gitflow) - (when (featurep! +hub) - (package! magithub)) + (package! magithub) (when (featurep! :feature evil +everywhere) (package! evil-magit))) From 334b6f3adfd85db4445c9a0fb58d1ac9139cb3f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 13:46:52 +0200 Subject: [PATCH 1599/4235] tools/dired: SPC o - => dired-jump; show symlink targets Inspired by #625 --- modules/config/default/+bindings.el | 1 + modules/emacs/dired/config.el | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 09d6deab7..62a0819fa 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -637,6 +637,7 @@ :desc "Debugger" :n "d" #'+debug/open :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl + :desc "Dired" :n "-" #'dired-jump :desc "Neotree" :n "n" #'+neotree/open :desc "Neotree: find file" :n "N" #'+neotree/find-this-file :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index eb1bc9aab..31679b398 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -1,7 +1,7 @@ ;;; tools/dired/config.el -*- lexical-binding: t; -*- (def-package! dired - :defer t + :commands dired-jump :init (setq ;; Always copy/delete recursively dired-recursive-copies 'always @@ -9,6 +9,7 @@ ;; Auto refresh dired, but be quiet about it global-auto-revert-non-file-buffers t auto-revert-verbose nil + dired-hide-details-hide-symlink-targets nil ;; files image-dired-dir (concat doom-cache-dir "image-dired/") image-dired-db-file (concat image-dired-dir "db.el") From bb71e069771e83bbf47cd95b21e11f012ec69c3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 13:49:40 +0200 Subject: [PATCH 1600/4235] Fix formatting in config/default/+bindings.el --- modules/config/default/+bindings.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 62a0819fa..fce2662ee 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -546,13 +546,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" #'+lookup/definition :desc "Jump to references" :n "D" #'+lookup/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 @@ -636,7 +636,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 "Dired" :n "-" #'dired-jump :desc "Neotree" :n "n" #'+neotree/open :desc "Neotree: find file" :n "N" #'+neotree/find-this-file From 3a809153f9e52765420d7ac8e3047c37866e7003 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 13:56:29 +0200 Subject: [PATCH 1601/4235] Fix scroll-*-command & C-r in minibuffer+ivy C-u was overwriting backward-kill-sentence & C-r was bound to the incorrect command for evil users. --- modules/config/default/+bindings.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index fce2662ee..fd30d8744 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -768,11 +768,11 @@ "\C-z" (λ! (ignore-errors (call-interactively #'undo)))) (when (featurep! :feature evil +everywhere) (evil-define-key* nil map - "\C-r" #'abort-recursive-edit + "\C-r" #'evil-paste-from-register "\C-j" #'next-line "\C-k" #'previous-line - "\C-d" #'scroll-down-command - "\C-u" #'scroll-up-command))) + "\C-J" #'scroll-up-command + "\C-K" #'scroll-down-command))) (mapc #'+default|fix-minibuffer-in-map (list minibuffer-local-map From 80bd587d878139a056d170820f076fd30423c9c3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 14:53:49 +0200 Subject: [PATCH 1602/4235] Move :company-backend setting to autoload.el This decouples the company module from module load-order. --- modules/completion/company/autoload.el | 19 +++++++++++++++++++ modules/completion/company/config.el | 23 ----------------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 46d922bad..ac35aa3e5 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -1,5 +1,24 @@ ;;; completion/company/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :company-backend (modes &rest backends) + "Prepends BACKENDS to `company-backends' in major MODES. + +MODES should be one major-mode symbol or a list of them." + `(progn + ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) + for def-name = (intern (format "doom--init-company-%s" mode)) + collect + `(defun ,def-name () + (when (and (or (eq major-mode ',mode) + (bound-and-true-p ,mode)) + ,(not (eq backends '(nil)))) + (require 'company) + (make-variable-buffer-local 'company-backends) + (dolist (backend (list ,@(reverse backends))) + (cl-pushnew backend company-backends :test #'equal)))) + collect `(add-hook! ,mode #',def-name)))) + ;;;###autoload (defun +company/toggle-auto-completion () "Toggle as-you-type code completion." diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 804246ba6..c56290ce8 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -1,28 +1,5 @@ ;;; completion/company/config.el -*- lexical-binding: t; -*- -(def-setting! :company-backend (modes &rest backends) - "Prepends BACKENDS to `company-backends' in major MODES. - -MODES should be one major-mode symbol or a list of them." - `(progn - ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) - for def-name = (intern (format "doom--init-company-%s" mode)) - collect - `(defun ,def-name () - (when (and (or (eq major-mode ',mode) - (bound-and-true-p ,mode)) - ,(not (eq backends '(nil)))) - (require 'company) - (make-variable-buffer-local 'company-backends) - (dolist (backend (list ,@(reverse backends))) - (cl-pushnew backend company-backends :test #'equal)))) - collect `(add-hook! ,mode #',def-name)))) - - -;; -;; Packages -;; - (def-package! company :commands (company-complete-common company-manual-begin company-grab-line) :init From c8a7005a22fc8c4cb023e921239ef321248e8e21 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 15:36:14 +0200 Subject: [PATCH 1603/4235] app/twitter: decouple from feature/workspaces --- modules/app/twitter/autoload.el | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/modules/app/twitter/autoload.el b/modules/app/twitter/autoload.el index 97e23eb02..1214c0537 100644 --- a/modules/app/twitter/autoload.el +++ b/modules/app/twitter/autoload.el @@ -1,5 +1,8 @@ ;;; app/twitter/autoload.el -*- lexical-binding: t; -*- +(defvar +twitter-workspace-name "*Twitter*" + "The name to use for the twitter workspace.") + ;;;###autoload (defun +twitter-display-buffer (buf) "A replacement display-buffer command for `twittering-pop-to-buffer-function' @@ -20,13 +23,18 @@ that works with the feature/popup module." ;; Commands ;; +(defvar +twitter--old-wconf nil) ;;;###autoload -(defun =twitter () +(defun =twitter (arg) "Opens a workspace dedicated to `twittering-mode'." - (interactive) + (interactive "P") (condition-case _ (progn - (+workspace/new "*Twitter*") + (if (and (not arg) (featurep! :feature workspaces)) + (+workspace/new +twitter-workspace-name) + (setq +twitter--old-wconf (current-window-configuration)) + (delete-other-windows) + (switch-to-buffer (doom-fallback-buffer))) (call-interactively #'twit) (unless (get-buffer (car twittering-initial-timeline-spec-string)) (error "Failed to open twitter")) @@ -44,13 +52,20 @@ that works with the feature/popup module." (interactive) (when (eq major-mode 'twittering-mode) (twittering-kill-buffer) - (+workspace/close-window-or-workspace))) + (cond ((one-window-p) (+twitter/quit-all)) + ((featurep! :feature workspaces) + (+workspace/close-window-or-workspace)) + ((delete-window))))) ;;;###autoload (defun +twitter/quit-all () "Close all open `twitter-mode' buffers and the associated workspace, if any." (interactive) - (+workspace/delete "*Twitter*") + (when (featurep! :feature workspaces) + (+workspace/delete +twitter-workspace-name)) + (when +twitter--old-wconf + (set-window-configuration +twitter--old-wconf) + (setq +twitter--old-wconf nil)) (dolist (buf (doom-buffers-in-mode 'twittering-mode (buffer-list) t)) (twittering-kill-buffer buf))) From dc2dad0af361785b92ce783e8ec737e7daebff8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 16:19:36 +0200 Subject: [PATCH 1604/4235] Disable evil-collection-ruby-mode May indirectly fix broken :localleader keybinds on ruby-mode-map --- modules/feature/evil/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 34bdc3887..8345ba7b4 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -7,10 +7,11 @@ '(kotlin-mode ; doesn't do anything useful simple ;; we'll do these ourselves + anaconda-mode dired helm ivy - anaconda-mode) + ruby-mode) "A list of `evil-collection' modules to disable. See the definition of this variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") From 553867bf617342a938aff7a3722219cfc72c8c45 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 16:20:11 +0200 Subject: [PATCH 1605/4235] Remove evil-collection-helm hack (it's disabled) --- modules/feature/evil/config.el | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 8345ba7b4..52dcb741b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -25,19 +25,7 @@ variable for an explanation of the defaults (in comments). See ;; must be set before evil/evil-collection is loaded (setq evil-want-integration nil evil-collection-company-use-tng nil) - :config - ;; Until evil-collection#101 is resolved - (defun +evil*fix-evil-collection-fix-helm-bs () - "Prevents `with-helm-buffer' void-function errors when loading helm." - (when (with-current-buffer (helm-buffer-get) helm-echo-input-in-header-line) - (let ((ov (make-overlay (point-min) (point-max) nil nil t))) - (overlay-put ov 'window (selected-window)) - (overlay-put ov 'face (let ((bg-color (face-background 'default nil))) - `(:background ,bg-color :foreground ,bg-color))) - (setq-local cursor-type nil)))) - (advice-add #'evil-collection-helm-hide-minibuffer-maybe :override - #'+evil*fix-evil-collection-fix-helm-bs) - + ;; :config (dolist (sym +evil-collection-disabled-list) (setq evil-collection-mode-list (funcall (if (symbolp sym) #'delq #'delete) From 43152d774f01e74d0f121d3a75ac67779c3946e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 16:32:38 +0200 Subject: [PATCH 1606/4235] Fix commented out :config causing errors Semicolons, what have you done? --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 52dcb741b..cf9c59b35 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -25,7 +25,7 @@ variable for an explanation of the defaults (in comments). See ;; must be set before evil/evil-collection is loaded (setq evil-want-integration nil evil-collection-company-use-tng nil) - ;; :config + :config (dolist (sym +evil-collection-disabled-list) (setq evil-collection-mode-list (funcall (if (symbolp sym) #'delq #'delete) From 8e38209394afef387049b1bf1d02c48136ea9d78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 16:36:33 +0200 Subject: [PATCH 1607/4235] Fix travis.yml (renamed to emacs-26.1-travis) And removed emacs-25.1-travis. I'll be phasing out support for emacs <= 25.2. --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 19e39d973..9a94bfd6e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,8 @@ before_install: - cp init.test.el ~/.config/doom/init.el - INSECURE=1 YES=1 make install env: - - EVM_EMACS=emacs-25.1-travis - EVM_EMACS=emacs-25.3-travis - - EVM_EMACS=emacs-26-pretest-travis + - EVM_EMACS=emacs-26.1-travis script: - emacs --version - DEBUG=1 make test From 36c36ca27103ef41970bb44660ead4e808004a4c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 16:40:14 +0200 Subject: [PATCH 1608/4235] Optimize switch buffer/window hooks Significantly reduces nested triggering of these hooks. --- core/core-ui.el | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 2c8e3d6f6..d55bebdf7 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -356,6 +356,9 @@ from the default." ;; Custom hooks ;; +(defvar doom-inhibit-switch-buffer-hooks nil) +(defvar doom-inhibit-switch-window-hooks nil) + (defun doom*switch-frame-hooks (orig-fn frame &optional norecord) (if (eq frame (selected-frame)) (funcall orig-fn frame norecord) @@ -363,17 +366,26 @@ from the default." (prog1 (funcall orig-fn frame norecord) (run-hooks 'doom-after-switch-frame-hook)))) (defun doom*switch-window-hooks (orig-fn window &optional norecord) - (if (or (eq window (selected-window)) + (if (or doom-inhibit-switch-window-hooks + (eq window (selected-window)) (window-minibuffer-p) (window-minibuffer-p window)) (funcall orig-fn window norecord) (run-hooks 'doom-before-switch-window-hook) - (prog1 (funcall orig-fn window norecord) + (prog1 + (let ((doom-inhibit-switch-window-hooks t)) + (funcall orig-fn window norecord)) (run-hooks 'doom-after-switch-window-hook)))) -(defun doom*switch-buffer-hooks (orig-fn &rest args) - (run-hooks 'doom-before-switch-buffer-hook) - (prog1 (apply orig-fn args) - (run-hooks 'doom-after-switch-buffer-hook))) +(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) + (let ((buf (window-normalize-buffer-to-switch-to buffer-or-name))) + (if (or doom-inhibit-switch-buffer-hooks + (eq buf (current-buffer))) + (apply orig-fn buf args) + (run-hooks 'doom-before-switch-buffer-hook) + (prog1 + (let ((doom-inhibit-switch-buffer-hooks t)) + (apply orig-fn buf args)) + (run-hooks 'doom-after-switch-buffer-hook))))) (defun doom|init-custom-hooks () (advice-add #'select-frame :around #'doom*switch-frame-hooks) From fd95bfee07ca11d6c9ac82ddf41089ad4d0da1dc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 16:59:25 +0200 Subject: [PATCH 1609/4235] Fix rspec-mode activation & localleader keybinds --- modules/lang/ruby/config.el | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 5eb32b4fc..d9c8566ae 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -73,7 +73,9 @@ environment variables." (def-package! rspec-mode :mode ("/\\.rspec\\'" . text-mode) :init - (defvar rspec-mode-verifiable-map (make-sparse-keymap)) + (associate! rspec-mode :match "/\\.rspec$") + (associate! rspec-mode :in (ruby-mode yaml-mode) :files ("spec/")) + (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") ("begin" ("rescue" "ensure") "end") @@ -82,7 +84,8 @@ environment variables." ;; Rake (("task" "namespace") () "end"))) :config - (map! :map rspec-mode-map + (remove-hook 'ruby-mode-hook #'rspec-enable-appropriate-mode) + (map! :map (rspec-mode-map rspec-verifiable-mode-map) :localleader :prefix "t" :n "r" #'rspec-rerun @@ -100,3 +103,11 @@ environment variables." ;; `rake' (setq rake-completion-system 'default) + +;; +;; Evil integration +;; + +(when (featurep! :feature evil +everywhere) + (add-hook! '(rspec-mode-hook rspec-verifiable-mode-hook) + #'evil-normalize-keymaps)) From 6bad6d12f32d5bc01e1ee191d591ee69b0d02f7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:01:39 +0200 Subject: [PATCH 1610/4235] Remove doom-psuedo-modules-dir Not needed with now that doom-private-dir has first class support. --- core/autoload/modules.el | 5 ++--- core/core-packages.el | 10 ++-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index ed71220b1..303baa235 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -157,8 +157,7 @@ modified." ;; Replace autoload paths (only for module autoloads) with ;; absolute paths for faster resolution during load and ;; simpler `load-path' - (let ((load-path (append doom-psuedo-module-dirs - doom-modules-dirs + (let ((load-path (append doom-modules-dirs load-path)) cache) (save-excursion @@ -367,7 +366,7 @@ module. This does not include your byte-compiled, third party packages.'" (interactive) (cl-loop with default-directory = doom-emacs-dir for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 1) - (doom-files-in doom-psuedo-module-dirs :match "\\.elc$" :depth 1) + (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) (doom-files-in doom-core-dir :match "\\.elc$") (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) for truepath = (file-truename path) diff --git a/core/core-packages.el b/core/core-packages.el index 8c91e575d..0c3098d38 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -55,11 +55,6 @@ (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) "A list of module root directories. Order determines priority.") -(defvar doom-psuedo-module-dirs (list doom-private-dir) - "Additional paths for modules that are outside of `doom-modules-dirs'. -`doom//reload-doom-autoloads', `doom//byte-compile' and -`doom-initialize-packages' will include the directories in this list.") - (defvar doom-packages () "A list of enabled packages. Each element is a sublist, whose CAR is the package's name as a symbol, and whose CDR is the plist supplied to its @@ -346,8 +341,7 @@ them." (cl-loop for key being the hash-keys of doom-modules for path = (doom-module-path (car key) (cdr key) "packages.el") do (let ((doom--current-module key)) (_load path t))) - (cl-loop for dir in doom-psuedo-module-dirs - do (_load (expand-file-name "packages.el" dir) t))))))))) + (_load (expand-file-name "packages.el" doom-private-dir))))))))) ;; @@ -445,7 +439,7 @@ This doesn't require modules to be enabled. For enabled modules us added, if the file exists." (append (cl-loop for plist being the hash-values of doom-modules collect (plist-get plist :path)) - (cl-remove-if-not #'file-directory-p doom-psuedo-module-dirs))) + (list doom-private-dir))) (defun doom-module-table (&optional modules) "Converts MODULES (a malformed plist) into a hash table of modules, fit for From c04bccc68b679ff523bc88a4e3925584cb7efbb1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:03:01 +0200 Subject: [PATCH 1611/4235] Fix disabled packages not being disabled By loading the private packages.el in two passes. The first time ensures later modules will know about disabled packages and the second time ensures overwritten packages are properly overwritten. Not the most efficient, but efficiency is low priority in noninteractive sessions (i.e. during package management), the performance loss is negligible, and packages.el files (should) have no other side effects anyway. --- core/core-packages.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/core-packages.el b/core/core-packages.el index 0c3098d38..e0145f8ae 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -338,6 +338,10 @@ them." (error-message-string ex)))))) (let ((doom--stage 'packages)) (_load (expand-file-name "packages.el" doom-core-dir)) + ;; We load the private packages file twice to ensure disabled + ;; packages are seen ASAP, and a second time to ensure privately + ;; overridden packages are properly overwritten. + (_load (expand-file-name "packages.el" doom-private-dir)) (cl-loop for key being the hash-keys of doom-modules for path = (doom-module-path (car key) (cdr key) "packages.el") do (let ((doom--current-module key)) (_load path t))) From 6480a45f848e7b8d9409dbc1abdf79662ff751aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:06:03 +0200 Subject: [PATCH 1612/4235] Fix reload-package-autoloads outdated detection The package autoloads generator wouldn't take module packages.el files into consideration when detecting whether the autoloads file should be regenerated. Now it does. --- core/autoload/modules.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 303baa235..348cbc8d2 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -197,7 +197,12 @@ This should be run whenever your `doom!' block or update your packages." (interactive) (if (and (not force-p) (file-exists-p doom-package-autoload-file) - (not (file-newer-than-file-p package-user-dir doom-package-autoload-file))) + (not (file-newer-than-file-p package-user-dir doom-package-autoload-file)) + (not (ignore-errors + (cl-loop for key being the hash-keys of (doom-module-table) + for path = (doom-module-path (car key) (cdr key) "packages.el") + if (file-newer-than-file-p path doom-package-autoload-file) + return t)))) (ignore (print! (green "Doom package autoloads is up-to-date")) (doom-initialize-autoloads doom-package-autoload-file)) (doom-delete-autoloads-file doom-package-autoload-file) From b28d3414bb0d380b687fa5829e1e93b6775af517 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:07:53 +0200 Subject: [PATCH 1613/4235] Remove load-prefer-newer letvar around private init Doesn't actually help and only slows things down. --- core/core-packages.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e0145f8ae..4c31c3bce 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -280,9 +280,8 @@ non-nil." ;; recurse by accident if any of them need `doom-initialize-modules'. (setq doom-init-modules-p t) (when doom-private-dir - (let ((load-prefer-newer t)) - (load (expand-file-name "init" doom-private-dir) - 'noerror 'nomessage))))) + (load (expand-file-name "init" doom-private-dir) + 'noerror 'nomessage)))) (defun doom-initialize-autoloads (file &optional clear-p) "Tries to load FILE (an autoloads file). Otherwise tries to regenerate it. If From 48ee4ff71e82b0fbec2c2621e20d2555511db334 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:08:48 +0200 Subject: [PATCH 1614/4235] lang/markdown: markdown-enable-math = nil Not a common necessity when writing markdown, and slows down modes with markdown submode regions (like magithub, when initializing issue/PR bodies). This is easily toggled with markdown-toggle-math anyway. --- modules/lang/markdown/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 0438171e0..230d41f01 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -4,7 +4,6 @@ :mode ("/README\\(?:\\.\\(?:markdown\\|md\\)\\)?\\'" . gfm-mode) :init (setq markdown-enable-wiki-links t - markdown-enable-math t markdown-italic-underscore t markdown-asymmetric-header t markdown-make-gfm-checkboxes-buttons t From 1938a0d25355bef85151337f85b0f6c65262dda6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:10:30 +0200 Subject: [PATCH 1615/4235] Enforce encrypted authinfo & store in doom-etc-dir Plaintext authinfo should not be the default. --- modules/config/default/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 2dacb9b11..c4cdfd157 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -16,6 +16,11 @@ ;; Config ;; +;; Don't store authinfo in non-encrypted files! +(defvar auth-sources + (list (expand-file-name "authinfo.gpg" doom-etc-dir) + "~/.authinfo.gpg")) + (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 From cb4b94cc12d97ada1ed8a85ceae266963ba8b77a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 17:14:17 +0200 Subject: [PATCH 1616/4235] Conditionally install anaconda-mode dependencies --- modules/lang/python/packages.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index 8ed17820e..c7877f223 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -3,9 +3,8 @@ ;; requires: python jedi setuptools -(package! anaconda-mode) (package! nose) (package! pip-requirements) - -(when (featurep! :completion company) - (package! company-anaconda)) +(when (package! anaconda-mode) + (when (featurep! :completion company) + (package! company-anaconda))) From 3b1f7c02cc9cfdcfba04b4411b39ec03e5c1705c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Jun 2018 21:12:18 +0200 Subject: [PATCH 1617/4235] Fix C-S-j/C-S-k keybinds in ivy/minibuffer --- modules/config/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index fd30d8744..90df0043c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -771,8 +771,8 @@ "\C-r" #'evil-paste-from-register "\C-j" #'next-line "\C-k" #'previous-line - "\C-J" #'scroll-up-command - "\C-K" #'scroll-down-command))) + (kbd "C-S-j") #'scroll-up-command + (kbd "C-S-k") #'scroll-down-command))) (mapc #'+default|fix-minibuffer-in-map (list minibuffer-local-map From 83232ac9aa24298aeb2e37dfd6748e975604e8ed Mon Sep 17 00:00:00 2001 From: Nealot Date: Fri, 1 Jun 2018 18:23:35 -0400 Subject: [PATCH 1618/4235] Add basic qt support --- init.example.el | 1 + modules/lang/qt/config.el | 5 +++++ modules/lang/qt/packages.el | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 modules/lang/qt/config.el create mode 100644 modules/lang/qt/packages.el diff --git a/init.example.el b/init.example.el index 027fcacd1..5ca5f6922 100644 --- a/init.example.el +++ b/init.example.el @@ -101,6 +101,7 @@ ;plantuml ; diagrams for confusing people more ;purescript ; javascript, but functional ;python ; beautiful is better than ugly + ;qt ; the 'cutest' gui framework ever ;rest ; Emacs as a REST client ;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} ;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() diff --git a/modules/lang/qt/config.el b/modules/lang/qt/config.el new file mode 100644 index 000000000..6e8641f15 --- /dev/null +++ b/modules/lang/qt/config.el @@ -0,0 +1,5 @@ +;;; lang/qt/config.el -*- lexical-binding: t; -*- + +(def-package! qml-mode :mode "\\.qml\\'") +(def-package! qt-pro-mode :mode "\\.pro\\'" "\\.pri\\'") + diff --git a/modules/lang/qt/packages.el b/modules/lang/qt/packages.el new file mode 100644 index 000000000..a41b28abb --- /dev/null +++ b/modules/lang/qt/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/qt/packages.el + +(package! qml-mode) +(package! qt-pro-mode) From a0bec8499761f1c8cec8ee07ede0e734e630e46f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 01:08:23 +0200 Subject: [PATCH 1619/4235] Don't complain if no private packages.el --- core/core-packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 4c31c3bce..3c34f09fd 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -340,11 +340,11 @@ them." ;; We load the private packages file twice to ensure disabled ;; packages are seen ASAP, and a second time to ensure privately ;; overridden packages are properly overwritten. - (_load (expand-file-name "packages.el" doom-private-dir)) + (_load (expand-file-name "packages.el" doom-private-dir) t) (cl-loop for key being the hash-keys of doom-modules for path = (doom-module-path (car key) (cdr key) "packages.el") do (let ((doom--current-module key)) (_load path t))) - (_load (expand-file-name "packages.el" doom-private-dir))))))))) + (_load (expand-file-name "packages.el" doom-private-dir) t)))))))) ;; From 92fd24ff0fdf1a82ce628536afea1c9a42b4549f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 02:39:31 +0200 Subject: [PATCH 1620/4235] config/default: refactor evil key fixes Also fixes #643, which is caused because evil is disabled and these fixes clumsily use evil-define-key* (which won't exist). --- modules/config/default/+bindings.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 90df0043c..b0c195c6f 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -717,7 +717,7 @@ ;; ;; This section is dedicated to "fixing" certain keys so that they behave -;; properly, more like vim, or how I like it. +;; sensibly (and consistently with similar contexts). (define-key input-decode-map [S-iso-lefttab] [backtab]) @@ -725,7 +725,10 @@ (unless window-system (define-key input-decode-map (kbd "TAB") [tab])) -(after! evil +(after! tabulated-list + (define-key tabulated-list-mode-map "q" #'quit-window)) + +(when (featurep! :feature evil +everywhere) (evil-define-key* 'insert 'global ;; 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, @@ -748,18 +751,14 @@ (define-key! evil-ex-completion-map "\C-a" #'move-beginning-of-line "\C-b" #'backward-word - "\C-f" #'forward-word)) + "\C-f" #'forward-word) -(after! tabulated-list - (define-key tabulated-list-mode-map "q" #'quit-window)) - -(after! view - (define-key view-mode-map (kbd "") #'View-quit-all)) + (after! view + (define-key view-mode-map (kbd "") #'View-quit-all))) ;; Restore common editing keys (and ESC) in minibuffer (defun +default|fix-minibuffer-in-map (map) - (evil-define-key* nil map - [escape] #'abort-recursive-edit + (define-key! map "\C-a" #'move-beginning-of-line "\C-w" #'backward-kill-word "\C-u" #'backward-kill-sentence @@ -767,7 +766,8 @@ "\C-f" #'forward-word "\C-z" (λ! (ignore-errors (call-interactively #'undo)))) (when (featurep! :feature evil +everywhere) - (evil-define-key* nil map + (define-key! map + [escape] #'abort-recursive-edit "\C-r" #'evil-paste-from-register "\C-j" #'next-line "\C-k" #'previous-line From c747bc46e3e7ac1348dcf8076f45aaa34c760221 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 02:53:54 +0200 Subject: [PATCH 1621/4235] Optimize lang/qt #642 --- modules/lang/qt/autoload.el | 4 ++++ modules/lang/qt/config.el | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 modules/lang/qt/autoload.el delete mode 100644 modules/lang/qt/config.el diff --git a/modules/lang/qt/autoload.el b/modules/lang/qt/autoload.el new file mode 100644 index 000000000..ba5db146c --- /dev/null +++ b/modules/lang/qt/autoload.el @@ -0,0 +1,4 @@ +;;; lang/qt/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.pr[io]\\'" . qt-pro-mode)) diff --git a/modules/lang/qt/config.el b/modules/lang/qt/config.el deleted file mode 100644 index 6e8641f15..000000000 --- a/modules/lang/qt/config.el +++ /dev/null @@ -1,5 +0,0 @@ -;;; lang/qt/config.el -*- lexical-binding: t; -*- - -(def-package! qml-mode :mode "\\.qml\\'") -(def-package! qt-pro-mode :mode "\\.pro\\'" "\\.pri\\'") - From 6fdd6cb14c5dc72ecb2190df9d4eb5ea78e5125a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 02:55:50 +0200 Subject: [PATCH 1622/4235] bin/doom: respond to -h/--help In case people try that before `help` --- bin/doom | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/doom b/bin/doom index e72602c7f..c908e734d 100755 --- a/bin/doom +++ b/bin/doom @@ -43,6 +43,8 @@ ;; Parse options (while (ignore-errors (string-prefix-p "-" (car args))) (pcase (pop args) + ((or "-h" "--help") + (error "Did you mean 'doom help'?")) ((or "-d" "--debug") (setq doom-debug-mode t)) ((or "-p" "--private") From 08a453bd5ef76c3b00d33447efd8cf3250287248 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 02:56:18 +0200 Subject: [PATCH 1623/4235] bin/doom: show usage info if no command is entered --- bin/doom | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index c908e734d..08e6c5959 100755 --- a/bin/doom +++ b/bin/doom @@ -68,7 +68,9 @@ (member (car args) '("help" "h"))) (usage)) ((not args) - (error "Expecting a command")) + (usage) + (message "") + (error "No command detected, aborting!")) ((let ((default-directory user-emacs-directory)) (setq argv nil noninteractive 'doom) From e66abfb9e8db68bc309254ca9786eac599dee072 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 10:48:55 +0200 Subject: [PATCH 1624/4235] Use newline-based alignment technique on dashboard Fixes #645, because Emacs' mouse events don't appear to compensate for variable-width whitespace. --- modules/ui/doom-dashboard/config.el | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a446f2d8a..3bb095155 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -161,22 +161,15 @@ whose dimensions may not be fully initialized by the time this is run." (save-excursion (with-silent-modifications (goto-char (point-min)) - (cond ((display-graphic-p) - (delete-region (line-beginning-position) (1+ (line-end-position))) - (insert (propertize - (char-to-string ?\uE001) - 'display `((space :align-to 0 - :height ,(max 0 (- (/ (window-height (get-buffer-window)) 2) - (/ (count-lines (point-min) (point-max)) 2.5)))))) - "\n")) - (t - (while (string-empty-p (buffer-substring-no-properties (line-beginning-position) (line-end-position))) - (delete-region (line-beginning-position) (1+ (line-end-position)))) - (insert - "\n" - (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) - (/ (count-lines (point-min) (point-max)) 2))) - ?\n)))))))))) + (delete-region (line-beginning-position) + (save-excursion (skip-chars-forward "\n") + (point))) + (insert (make-string + (max 0 (- (/ (window-height (get-buffer-window)) 2) + (truncate (/ (count-lines (point-min) (point-max)) + 2)) + 2)) ?\n) + "\n"))))))) (defun +doom-dashboard|detect-project (&rest _) "Check for a `last-project-root' parameter in the perspective, and set the From 6d218fc5a0b20470c8c133c64ed386dde09cf538 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 10:53:51 +0200 Subject: [PATCH 1625/4235] Consider magit buffers real So they can be switched to if buried --- modules/tools/magit/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 488d4a7a5..e9d96b972 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -23,6 +23,12 @@ load everything.") magit-revision-show-gravatars '("^Author: " . "^Commit: ")) (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) + + ;; Consider magit buffers real (so they can switched to) + (defun +magit-buffer-p (buf) + (with-current-buffer buf (derived-mode-p 'magit-mode))) + (add-to-list 'doom-real-buffer-functions #'+magit-buffer-p nil #'eq) + ;; no mode-line in magit popups (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) ;; Clean up after magit by properly killing buffers From 1ffdf616e854de3bb738a112cb577ef1b5704061 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 10:54:12 +0200 Subject: [PATCH 1626/4235] Hide mode-line in magit windows (experimental) --- modules/tools/magit/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index e9d96b972..4a286205d 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -30,7 +30,8 @@ load everything.") (add-to-list 'doom-real-buffer-functions #'+magit-buffer-p nil #'eq) ;; no mode-line in magit popups - (add-hook 'magit-popup-mode-hook #'hide-mode-line-mode) + (add-hook! '(magit-mode-hook magit-popup-mode-hook) + #'hide-mode-line-mode) ;; Clean up after magit by properly killing buffers (map! :map magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) From 1dd4076f8dd6289f30ecf2bfc630f3139cf4fa29 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 10:54:30 +0200 Subject: [PATCH 1627/4235] Handle magit windows w/ fullframe-status-v1 This new default was chosen to keep magit consistent with fullscreen :app workflows (which work very similarly). It is also more predictable than the default method. --- modules/tools/magit/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 4a286205d..2d1aae6e8 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -20,7 +20,9 @@ load everything.") (if (featurep! :completion ivy) #'ivy-completing-read #'magit-builtin-completing-read) - magit-revision-show-gravatars '("^Author: " . "^Commit: ")) + magit-revision-show-gravatars '("^Author: " . "^Commit: ") + magit-display-buffer-function + #'magit-display-buffer-fullframe-status-v1) (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) From d20ffca78d896370440f1222ee4fae25ea0b862b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 10:56:04 +0200 Subject: [PATCH 1628/4235] tools/magit: minor refactor/reformatting --- modules/tools/magit/config.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 2d1aae6e8..fe7099dfc 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -1,7 +1,8 @@ ;;; tools/magit/config.el -*- lexical-binding: t; -*- (defvar +magit-hub-enable-by-default nil - "Whether or not to enable magithub features for all projects by default.") + "Whether or not to enable magithub features for all projects by default. Must +be set before `magithub' (and `magit') is loaded.") (defvar +magit-hub-features '(pull-request-merge commit-browse completion) @@ -25,17 +26,15 @@ load everything.") #'magit-display-buffer-fullframe-status-v1) (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) - ;; Consider magit buffers real (so they can switched to) (defun +magit-buffer-p (buf) (with-current-buffer buf (derived-mode-p 'magit-mode))) (add-to-list 'doom-real-buffer-functions #'+magit-buffer-p nil #'eq) - ;; no mode-line in magit popups (add-hook! '(magit-mode-hook magit-popup-mode-hook) #'hide-mode-line-mode) ;; Clean up after magit by properly killing buffers - (map! :map magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) + (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) (def-package! magit-blame :after git-timemachine) From ae7ead6e87f880cb6a18df9f4b1689ea08db0a42 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 13:56:39 +0200 Subject: [PATCH 1629/4235] Refactor doom//upgrade --- core/core-dispatcher.el | 69 +++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 2a27bb665..91b64eb81 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -229,49 +229,58 @@ problems with doom." (doom//byte-compile nil 'recompile))) (defun doom//upgrade () - "Upgrade Doom to the latest version." + "Upgrade Doom to the latest version non-destructively." (interactive) (require 'vc-git) (let* ((gitdir (expand-file-name ".git" doom-emacs-dir)) (branch (vc-git--symbolic-ref doom-emacs-dir)) (default-directory doom-emacs-dir)) (unless (file-exists-p gitdir) - (error "Couldn't find %s, was Doom cloned properly?" + (error "Couldn't find %s. Was Doom cloned properly?" (abbreviate-file-name gitdir))) (unless branch - (error "Couldn't detect what branch you're using. Is %s a repo?" + (error "Couldn't detect what branch you're using. Is Doom detached?" (abbreviate-file-name doom-emacs-dir))) (when (doom--working-tree-dirty-p doom-emacs-dir) (user-error "Refusing to upgrade because Doom has been modified. Stash or undo your changes")) (with-temp-buffer (let ((buf (current-buffer))) - (process-file "git" nil buf nil "remote" "remove" doom-repo-remote) - (when (and (zerop (process-file "git" nil buf nil "remote" "add" - doom-repo-remote doom-repo-url)) - (zerop (process-file "git" nil buf nil - "fetch" "--tags" doom-repo-remote branch))) - (let ((current-rev (vc-git-working-revision doom-emacs-dir)) - (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) - (unless rev - (error "Couldn't detect Doom's version. Is %s a repo?" - (abbreviate-file-name doom-emacs-dir))) - (if (equal current-rev rev) - (message "Doom is up to date!") - (message "Doom is out of date.\n\n Old rev: %s\n New rev: %s\n" - current-rev rev) - (if (not (or doom-auto-accept - (y-or-n-p "Proceed?"))) - (error "Aborted") - (message "Removing byte-compiled files from your config (if any)") - (doom//clean-byte-compiled-files) - (unless (zerop (process-file "git" nil buf nil "reset" "--hard" - (format "%s/%s" doom-repo-remote branch))) - (error "An error occurred while checking out the latest commit\n\n%s" - (buffer-string))) - (unless (equal (vc-git-working-revision doom-emacs-dir) rev) - (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) - (doom//refresh) - (message "Done! Please restart Emacs for changes to take effect"))))))))) + (condition-case e + (progn + (process-file "git" nil buf nil "remote" "remove" doom-repo-remote) + (unless (zerop (process-file "git" nil buf nil "remote" "add" + doom-repo-remote doom-repo-url)) + (error "Failed to add %s to remotes" doom-repo-remote)) + (unless (zerop (process-file "git" nil buf nil "fetch" "--tags" + doom-repo-remote branch)) + (error "Failed to fetch from upstream")) + (when + (let ((current-rev (vc-git-working-revision doom-emacs-dir)) + (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) + (unless rev + (error "Couldn't detect Doom's version. Is %s a repo?" + (abbreviate-file-name doom-emacs-dir))) + (unless (equal current-rev rev) + (user-error "Doom is up to date!")) + (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" + current-rev rev) + ;; TODO Display newsletter diff + (unless (or doom-auto-accept (y-or-n-p "Proceed?")) + (error "Aborted")) + (message "Removing byte-compiled files from your config (if any)") + (doom//clean-byte-compiled-files) + (unless (zerop (process-file "git" nil buf nil "reset" "--hard" + (format "%s/%s" doom-repo-remote branch))) + (error "An error occurred while checking out the latest commit\n\n%s" + (buffer-string))) + (unless (equal (vc-git-working-revision doom-emacs-dir) rev) + (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) + (doom//refresh) + (message "Done! Please restart Emacs for changes to take effect")))) + (error + (message "There was an unexpected error.\n\n%s -> %s\n\nOutput:\n%s" + (car e) (error-message-string e) + (buffer-string)))))))) (defun doom//quickstart () "Quickly deploy a private module and Doom. From e5a4415d589eb01f055b76fc6837849738440d8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 13:58:04 +0200 Subject: [PATCH 1630/4235] General, minor reformatting/refactor --- core/core-keybinds.el | 1 - core/core-lib.el | 2 +- core/core-ui.el | 2 +- modules/config/default/config.el | 2 +- modules/lang/latex/config.el | 8 ++++---- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 36d8d69fe..91258aac8 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -299,7 +299,6 @@ Example forms) (throw 'skip 'local)) ((and doom--keymaps states) - (dolist (keymap doom--keymaps) (when (memq 'global states) (push `(define-key ,keymap ,key ,def) forms)) diff --git a/core/core-lib.el b/core/core-lib.el index b21d0fcc8..020f9fb12 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -367,7 +367,7 @@ The available conditions are: ,@(if (and modes (listp modes)) (cl-loop for hook in (doom--resolve-hook-forms modes) collect `(add-hook ',hook #',hook-name)) - `((add-hook 'after-change-major-mode-hook ',hook-name)))))) + `((add-hook 'after-change-major-mode-hook #',hook-name)))))) (match `(map-put doom-auto-minor-mode-alist ,match ',mode)) (t (user-error "associate! invalid rules for mode [%s] (modes %s) (match %s) (files %s)" diff --git a/core/core-ui.el b/core/core-ui.el index d55bebdf7..a5a371dd6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -195,7 +195,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (setf (if default (default-value 'mode-line-format) (buffer-local-value 'mode-line-format (current-buffer))) - modeline))) + (list "%e" modeline)))) ;; diff --git a/modules/config/default/config.el b/modules/config/default/config.el index c4cdfd157..22855bf85 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -45,8 +45,8 @@ :pre-handlers '(:rem sp-ruby-prehandler) :post-handlers '(:rem sp-ruby-posthandler)) ;; sp's default rules for these modes are obnoxious, so disable them - (provide 'smartparens-latex) (provide 'smartparens-elixir) + (provide 'smartparens-latex) (provide 'smartparens-lua) ;; Expand {|} => { | } diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 750b988af..585873e53 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -61,10 +61,10 @@ ;; Adding useful things for latex (add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode - TeX-source-correlate-mode - TeX-global-PDF-mode - TeX-PDF-mode - visual-line-mode)) + TeX-source-correlate-mode + TeX-global-PDF-mode + TeX-PDF-mode + visual-line-mode)) ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) From 8aa21517a206ebafec07abb3a5388c37a5d693e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 14:01:16 +0200 Subject: [PATCH 1631/4235] Remap swiper => helm-swoop for helm users #644 Plus remove redundant remappings --- modules/completion/helm/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index b345b0530..458e5cf95 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -17,12 +17,11 @@ (map! :map global-map [remap apropos] #'helm-apropos [remap bookmark-jump] #'helm-bookmarks - [remap bookmark-jump] #'helm-bookmarks [remap execute-extended-command] #'helm-M-x [remap find-file] #'helm-find-files [remap imenu-anywhere] #'helm-imenu-anywhere - [remap imenu-anywhere] #'helm-imenu-anywhere [remap imenu] #'helm-semantic-or-imenu + [remap swiper] #'helm-swoop [remap noop-show-kill-ring] #'helm-show-kill-ring [remap projectile-find-file] #'helm-projectile-find-file [remap projectile-recentf] #'helm-projectile-recentf From 7f002215516b3019a8d55165d3f54e47485d0208 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 14:34:12 +0200 Subject: [PATCH 1632/4235] Refactor ivy project-search functionality To prepare for Helm counterpart --- modules/completion/ivy/autoload/ivy.el | 65 +++++++++++--------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 1ef711277..a35c7df04 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -202,17 +202,18 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;; File searching ;; -(defvar +ivy--file-search-recursion-p t) -(defvar +ivy--file-search-all-files-p nil) - -(defun +ivy--file-search (engine &optional query directory) +(cl-defun +ivy--file-search (engine &key query in all-files (recursive t)) (let* ((project-root (doom-project-root)) - (directory (or directory project-root)) - (recursion-p +ivy--file-search-recursion-p) - (all-files-p +ivy--file-search-all-files-p) + (directory (or in project-root)) + (default-directory directory) (engine (or engine (and (executable-find "rg") 'rg) - (and (executable-find "ag") 'ag))) + (and (executable-find "ag") 'ag) + (and (executable-find "pt") 'pt) + (and (or (executable-find "grep") + (executable-find "git")) + 'grep) + (error "No search engine specified (is ag, rg, pt or git installed?)"))) (query (or query (when (use-region-p) @@ -228,8 +229,7 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ((equal directory project-root) (projectile-project-name)) (t - (file-relative-name directory project-root))))) - (default-directory directory)) + (file-relative-name directory project-root)))))) (require 'counsel) (cl-letf (((symbol-function 'counsel-ag-function) (symbol-function '+ivy*counsel-ag-function)) @@ -237,10 +237,9 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (symbol-function '+ivy*counsel-git-grep-function))) (pcase engine ('grep - (let ((args (if recursion-p " -r")) - (counsel-projectile-grep-initial-input query) - (default-directory directory)) - (if all-files-p + (let ((args (if recursive " -r")) + (counsel-projectile-grep-initial-input query)) + (if all-files (cl-letf (((symbol-function #'projectile-ignored-directories-rel) (symbol-function #'ignore)) ((symbol-function #'projectile-ignored-files-rel) @@ -248,18 +247,18 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (counsel-projectile-grep args)) (counsel-projectile-grep args)))) ('ag - (let ((args (concat (if all-files-p " -a") - (unless recursion-p " --depth 1")))) + (let ((args (concat (if all-files " -a") + (unless recursive " --depth 1")))) (counsel-ag query directory args (format prompt args)))) ('rg - (let ((args (concat (if all-files-p " -uu") - (unless recursion-p " --maxdepth 1")))) + (let ((args (concat (if all-files " -uu") + (unless recursive " --maxdepth 1")))) (counsel-rg query directory args (format prompt args)))) ('pt (let ((counsel-pt-base-command (concat counsel-pt-base-command - (if all-files-p " -U") - (unless recursion-p " --depth=1"))) + (if all-files " -U") + (unless recursive " --depth=1"))) (default-directory directory)) (counsel-pt query))) (_ (error "No search engine specified")))))) @@ -287,8 +286,7 @@ If ALL-FILES-P, don't respect .gitignore files and search everything. NOTE: ripgrep doesn't support multiline searches (yet)." (interactive "P") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'rg query directory))) + (+ivy--file-search 'rg :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +ivy/ag (all-files-p &optional query directory) @@ -298,8 +296,7 @@ the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive "P") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'ag query directory))) + (+ivy--file-search 'ag :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +ivy/pt (all-files-p &optional query directory) @@ -309,8 +306,7 @@ the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive "P") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'pt query directory))) + (+ivy--file-search 'pt :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +ivy/grep (all-files-p &optional query directory) @@ -320,41 +316,36 @@ active, the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive "P") - (let ((+ivy--file-search-all-files-p all-files-p)) - (+ivy--file-search 'grep query directory))) - + (+ivy--file-search 'grep :query query :in directory :all-files all-files-p)) +;; Relative to current directory ;;;###autoload (defun +ivy/rg-from-cwd (recursive-p &optional query) "Like `+ivy/rg', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (let ((+ivy--file-search-recursion-p recursive-p)) - (+ivy/rg t query default-directory))) + (+ivy--file-search 'rg :query query :in default-directory :recursive recursive-p)) ;;;###autoload (defun +ivy/ag-from-cwd (recursive-p &optional query) "Like `+ivy/ag', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (let ((+ivy--file-search-recursion-p recursive-p)) - (+ivy/ag t query default-directory))) + (+ivy--file-search 'ag :query query :in default-directory :recursive recursive-p)) ;;;###autoload (defun +ivy/pt-from-cwd (recursive-p &optional query) "Like `+ivy/pt', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (let ((+ivy--file-search-recursion-p recursive-p)) - (+ivy/pt t query default-directory))) + (+ivy--file-search 'pt :query query :in default-directory :recursive recursive-p)) ;;;###autoload (defun +ivy/grep-from-cwd (recursive-p &optional query) "Like `+ivy/grep', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (let ((+ivy--file-search-recursion-p recursive-p)) - (+ivy/grep t query default-directory))) + (+ivy--file-search 'grep :query query :in default-directory :recursive recursive-p)) ;; From 385cb476baaf5a133b8cceb2416d1cdfdffac9e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 15:22:41 +0200 Subject: [PATCH 1633/4235] Fix redundant minor mode entries in elisp imenu --- modules/lang/emacs-lisp/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index c8987a07a..dc395d0e5 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -42,7 +42,6 @@ ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) - ("Minor modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-\\)?minor-mode +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") From 428f1e1d07c80243be3e47921cae569cb077978a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 16:23:50 +0200 Subject: [PATCH 1634/4235] Refactor def-setting!/set! implementation The `doom-settings` variable has been removed. Setting checks are done with fboundp now, which is simpler. --- core/autoload/help.el | 17 ++++++++++++----- core/core-packages.el | 28 ++++++++++------------------ core/test/core-lib.el | 7 +++---- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 783492d12..b2d8f431b 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -68,13 +68,20 @@ Defaults to the " (interactive - (let ((sym (symbol-at-point))) + (let ((settings (cl-loop with case-fold-search = nil + for sym being the symbols of obarray + for sym-name = (symbol-name sym) + if (string-match "^doom--set\\(:.+\\)" sym-name) + collect (match-string 1 sym-name))) + (sym (symbol-at-point))) (list (completing-read "Describe setting: " - (sort (mapcar #'car doom-settings) #'string-lessp) + (sort settings #'string-lessp) nil t (if (keywordp sym) (symbol-name sym)))))) - (let ((fn (cdr (assq (intern setting) doom-settings)))) - (unless fn - (error "'%s' is not a valid DOOM setting" setting)) + (or (stringp setting) + (signal 'wrong-type-argument (list 'stringp setting))) + (let ((fn (intern-soft (format "doom--set%s" setting)))) + (or (fboundp fn) + (error "'%s' is not a valid DOOM setting" setting)) (describe-function fn))) ;;;###autoload diff --git a/core/core-packages.el b/core/core-packages.el index 3c34f09fd..c459e65d1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -806,9 +806,6 @@ loads MODULE SUBMODULE's packages.el file." ;; `set!'. If a setting doesn't exist at runtime, the `set!' call is ignored and ;; its arguments are left unevaluated (and entirely omitted when byte-compiled). -(defvar doom-settings nil - "An alist mapping setting keywords to functions.") - (defmacro def-setting! (keyword arglist &optional docstring &rest forms) "Define a setting. Like `defmacro', this should return a form to be executed when called with `set!'. FORMS are not evaluated until `set!' calls it. @@ -817,14 +814,10 @@ See `doom/describe-setting' for a list of available settings. Do not use this for configuring Doom core." (declare (indent defun) (doc-string 3)) - (unless (keywordp keyword) - (error "Not a valid property name: %s" keyword)) - (let ((fn (intern (format "doom--set%s" keyword)))) - `(progn - (defun ,fn ,arglist - ,docstring - ,@forms) - (map-put doom-settings ,keyword #',fn)))) + (or (keywordp keyword) + (signal 'wrong-type-argument (list 'keywordp keyword))) + `(fset ',(intern (format "doom--set%s" keyword)) + (lambda ,arglist ,docstring ,@forms))) (defmacro set! (keyword &rest values) "Set an option defined by `def-setting!'. Skip if doesn't exist. See @@ -832,13 +825,12 @@ Do not use this for configuring Doom core." VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." (declare (indent defun)) - (unless values - (error "Empty set! for %s" keyword)) - (if-let* ((fn (cdr (assq keyword doom-settings)))) - (apply fn values) - (when doom-debug-mode - (message "No setting found for %s" keyword) - nil))) + (let ((fn (intern-soft (format "doom--set%s" keyword)))) + (if (and fn (fboundp fn)) + (apply fn values) + (when doom-debug-mode + (message "No setting found for %s" keyword) + nil)))) (provide 'core-packages) ;;; core-packages.el ends here diff --git a/core/test/core-lib.el b/core/test/core-lib.el index 10a9d6ee3..bf1d1a934 100644 --- a/core/test/core-lib.el +++ b/core/test/core-lib.el @@ -107,11 +107,10 @@ (def-test! set (eval-and-compile - (let (doom-settings) - (def-setting! :-test-setting (x) `(setq result ,x)) - (should (assq :-test-setting doom-settings)) + (def-setting! :-test-setting (x) `(setq result ,x)) + (should (fboundp 'doom--set:-test-setting)) (let ((inhibit-message t) result) (set! :-test-setting t) (should result) - (set! :non-existant-setting (error "This shouldn't trigger")))))) + (set! :non-existant-setting (error "This shouldn't trigger"))))) From 209b281dc6736fea4bc45e68f8b5a7d67973f3b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 16:58:56 +0200 Subject: [PATCH 1635/4235] Move popup mode keymaps to autoload.el --- modules/ui/popup/autoload.el | 15 +++++++++++++++ modules/ui/popup/config.el | 13 ------------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 55b4c4ee2..ec9516fd4 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -257,6 +257,21 @@ Uses `shrink-window-if-larger-than-buffer'." ;; Minor mode ;; +;;;###autoload +(defvar +popup-mode-map (make-sparse-keymap) + "Active keymap in a session with the popup system enabled. See +`+popup-mode'.") + +;;;###autoload +(defvar +popup-buffer-mode-map + (let ((map (make-sparse-keymap))) + (when (featurep! :feature evil) + ;; for maximum escape coverage in emacs state buffers + (define-key map [escape] #'doom/escape) + (define-key map (kbd "ESC") #'doom/escape)) + map) + "Active keymap in popup windows. See `+popup-buffer-mode'.") + ;;;###autoload (define-minor-mode +popup-mode "Global minor mode representing Doom's popup management system." diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 47ab76df9..0c964c4f0 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -97,19 +97,6 @@ a brief description of some native window parameters that Emacs uses: "The default time-to-live for transient buffers whose popup buffers have been deleted.") -(defvar +popup-mode-map (make-sparse-keymap) - "Active keymap in a session with the popup system enabled. See -`+popup-mode'.") - -(defvar +popup-buffer-mode-map - (let ((map (make-sparse-keymap))) - (when (featurep! :feature evil) - ;; for maximum escape coverage in emacs state buffers - (define-key map [escape] #'doom/escape) - (define-key map (kbd "ESC") #'doom/escape)) - map) - "Active keymap in popup windows. See `+popup-buffer-mode'.") - ;; ;; Default popup rules & bootstrap From dd57a521f30735f6a9c60fa586e7e52e26c2dad2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 16:59:26 +0200 Subject: [PATCH 1636/4235] Correct :popup/:popups docstrings --- modules/ui/popup/autoload.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index ec9516fd4..0f87e9cf6 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -17,10 +17,9 @@ ALIST also supports the `size' parameter, which will be translated to `window-width' or `window-height' depending on `side'. PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for -a list of custom parameters provided by the popup module. - -If certain attributes/parameters are omitted, the ones from -`+popup-default-alist' and `+popup-default-parameters' will be used. +a list of custom parameters provided by the popup module. If certain +attributes/parameters are omitted, the ones from `+popup-default-alist' and +`+popup-default-parameters' will be used. The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' will be tested against CONDITION, which is either a) a regexp string (which is @@ -42,8 +41,8 @@ returns a boolean." each individual rule. (set! :popups - (\"^ \\*\" '((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (\"^\\*\" '((slot . 1) (vslot . -1)) '((select . t))))" + '(\"^ \\*\" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + '(\"^\\*\" ((slot . 1) (vslot . -1)) ((select . t))))" `(progn (dolist (rule (nreverse (list ,@rules))) (when after-init-time From e4c56d0f158932ab42ec2f2b986e37ed3af9c5bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 17:01:04 +0200 Subject: [PATCH 1637/4235] Fix +default:multi-*-line motions in magit buffers --- modules/config/default/autoload/evil.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index 521bc72f2..b3cf49b6d 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -5,14 +5,14 @@ (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)))) + (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode 'magit-mode)))) (evil-line-move (* 6 (or count 1))))) ;;;###autoload (autoload '+default:multi-previous-line "config/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)))) + (let ((line-move-visual (or visual-line-mode (derived-mode-p 'text-mode 'magit-mode)))) (evil-line-move (- (* 6 (or count 1)))))) ;;;###autoload (autoload '+default:cd "config/default/autoload/evil" nil t) From de014a817b2a083f5d33581d4670b46cfec6e856 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 17:02:08 +0200 Subject: [PATCH 1638/4235] Move :lookup setting to autoload.el --- modules/feature/lookup/autoload/lookup.el | 42 +++++++++++++++++++++++ modules/feature/lookup/config.el | 41 ---------------------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 3003de0d5..6a327c799 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -4,6 +4,48 @@ (defvar +lookup--ag-installed-p (executable-find "ag")) (defvar +lookup--last-provider nil) +;;;###autoload +(def-setting! :lookup (modes &rest plist) + "Defines a jump target for major MODES. PLIST accepts the following +properties: + + :definition FN + Run when jumping to a symbol's definition. + Used by `+lookup/definition'. + :references FN + Run when looking for usage references of a symbol in the current project. + Used by `+lookup/references'. + :documentation FN + Run when looking up documentation for a symbol. + Used by `+lookup/documentation'. + :file FN + Run when looking up the file for a symbol/string. Typically a file path. + Used by `+lookup/file'. + :xref-backend FN + Defines an xref backend for a major-mode. With this, :definition and + :references are unnecessary. + +Using this multiple times overwrites previous properties and unsets omitted +ones." + `(progn + ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) + for def-name = (intern (format "doom--init-lookup-%s" mode)) + collect + `(defun ,def-name () + (when (or (eq major-mode ',mode) + (bound-and-true-p ,mode)) + (let ((xref ,(plist-get plist :xref-backend)) + (def ,(plist-get plist :definition)) + (ref ,(plist-get plist :references)) + (fil ,(plist-get plist :file)) + (doc ,(plist-get plist :documentation))) + (if xref (add-hook 'xref-backend-functions xref nil t)) + (if def (add-hook '+lookup-definition-functions def nil t)) + (if ref (add-hook '+lookup-references-functions ref nil t)) + (if fil (add-hook '+lookup-file-functions fil nil t)) + (if doc (add-hook '+lookup-documentation-functions doc nil t))))) + collect `(add-hook! ,mode #',def-name)))) + ;; Helpers (defun +lookup--online-provider (&optional force-p namespace) (let ((key (or namespace major-mode))) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index bbabb689a..03432aecd 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -69,47 +69,6 @@ If the argument is interactive (satisfies `commandp'), it is called with `call-interactively' (with no arguments). Otherwise, it is called with one argument: the identifier at point.") -(def-setting! :lookup (modes &rest plist) - "Defines a jump target for major MODES. PLIST accepts the following -properties: - - :definition FN - Run when jumping to a symbol's definition. - Used by `+lookup/definition'. - :references FN - Run when looking for usage references of a symbol in the current project. - Used by `+lookup/references'. - :documentation FN - Run when looking up documentation for a symbol. - Used by `+lookup/documentation'. - :file FN - Run when looking up the file for a symbol/string. Typically a file path. - Used by `+lookup/file'. - :xref-backend FN - Defines an xref backend for a major-mode. With this, :definition and - :references are unnecessary. - -Using this multiple times overwrites previous properties and unsets omitted -ones." - `(progn - ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) - for def-name = (intern (format "doom--init-lookup-%s" mode)) - collect - `(defun ,def-name () - (when (or (eq major-mode ',mode) - (bound-and-true-p ,mode)) - (let ((xref ,(plist-get plist :xref-backend)) - (def ,(plist-get plist :definition)) - (ref ,(plist-get plist :references)) - (fil ,(plist-get plist :file)) - (doc ,(plist-get plist :documentation))) - (if xref (add-hook 'xref-backend-functions xref nil t)) - (if def (add-hook '+lookup-definition-functions def nil t)) - (if ref (add-hook '+lookup-references-functions ref nil t)) - (if fil (add-hook '+lookup-file-functions fil nil t)) - (if doc (add-hook '+lookup-documentation-functions doc nil t))))) - collect `(add-hook! ,mode #',def-name)))) - ;; Recenter buffer after certain jumps (add-hook! '(imenu-after-jump-hook evil-jumps-post-jump-hook From 8f847682fac5326946d05d5b462ce85a89735f1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 17:42:57 +0200 Subject: [PATCH 1639/4235] app/rss: fix invalid window errors #646 The popup system cleans up after closed popup windows, so a delete-window following a kill-buffer will operate on a dead window, causing this error. --- modules/app/rss/autoload.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 2be7a71af..19268ad78 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -30,10 +30,11 @@ (defun +rss/delete-pane () "Delete the *elfeed-entry* split pane." (interactive) - (let* ((buff (get-buffer "*elfeed-entry*")) - (window (get-buffer-window buff))) - (kill-buffer buff) - (delete-window window))) + (let* ((buf (get-buffer "*elfeed-entry*")) + (window (get-buffer-window buf))) + (delete-window window) + (when (buffer-live-p buf) + (kill-buffer buf)))) ;;;###autoload (defun +rss/open (entry) From b72764c6eae883701a7768cab8aeb24b2090cbbe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 20:31:50 +0200 Subject: [PATCH 1640/4235] fixup! Refactor ivy project-search functionality --- modules/completion/ivy/autoload/evil.el | 16 ++++++++-------- modules/completion/ivy/autoload/ivy.el | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index b60b28d31..0f408044b 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -42,26 +42,26 @@ ;;;###autoload (autoload '+ivy:pt-from-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:pt-from-cwd (query &optional bang) +(evil-define-command +ivy:pt-from-cwd (query &optional recurse-p) "Ex interface for `+ivy/pt-from-cwd'." (interactive "
") - (+ivy/pt-from-cwd (not bang) query)) + (+ivy/pt-from-cwd (not recurse-p) query)) ;;;###autoload (autoload '+ivy:grep-from-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:grep-from-cwd (query &optional bang) +(evil-define-command +ivy:grep-from-cwd (query &optional recurse-p) "Ex interface for `+ivy/grep-from-cwd'." (interactive "") - (+ivy/grep-from-cwd (not bang) query)) + (+ivy/grep-from-cwd (not recurse-p) query)) ;;;###autoload (autoload '+ivy:ag-from-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:ag-from-cwd (query &optional bang) +(evil-define-command +ivy:ag-from-cwd (query &optional recurse-p) "Ex interface for `+ivy/ag-from-cwd'." (interactive "") - (+ivy/ag-from-cwd (not bang) query)) + (+ivy/ag-from-cwd (not recurse-p) query)) ;;;###autoload (autoload '+ivy:rg-from-cwd "completion/ivy/autoload/evil" nil t) -(evil-define-command +ivy:rg-from-cwd (query &optional bang) +(evil-define-command +ivy:rg-from-cwd (query &optional recurse-p) "Ex interface for `+ivy/rg-from-cwd'." (interactive "") - (+ivy/rg-from-cwd (not bang) query)) + (+ivy/rg-from-cwd (not recurse-p) query)) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index a35c7df04..187b66956 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -237,7 +237,7 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (symbol-function '+ivy*counsel-git-grep-function))) (pcase engine ('grep - (let ((args (if recursive " -r")) + (let ((args (if recursive " -R")) (counsel-projectile-grep-initial-input query)) (if all-files (cl-letf (((symbol-function #'projectile-ignored-directories-rel) From 6e6dfc2215f91c9e70d03b16eebfd8217d93ef25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 20:32:52 +0200 Subject: [PATCH 1641/4235] Implement helm project search functionality #644 Adds +helm/project-search, as well as +helm/ag and +helm/ag-from-cwd, and variants for rg, pt and grep/git-grep, to mirror the functionality available to :completion ivy. Also updates the evil ex commands and keybinds --- modules/completion/helm/autoload/evil.el | 93 ++++++------ modules/completion/helm/autoload/helm.el | 172 +++++++++++++++++++++++ modules/completion/helm/config.el | 7 +- modules/config/default/+bindings.el | 11 +- modules/config/default/+evil-commands.el | 8 +- modules/ui/popup/+hacks.el | 9 ++ 6 files changed, 247 insertions(+), 53 deletions(-) create mode 100644 modules/completion/helm/autoload/helm.el diff --git a/modules/completion/helm/autoload/evil.el b/modules/completion/helm/autoload/evil.el index 722c2e714..45ef949d7 100644 --- a/modules/completion/helm/autoload/evil.el +++ b/modules/completion/helm/autoload/evil.el @@ -7,57 +7,58 @@ (interactive "") (helm-swoop :$query search :$multiline bang)) -(defun +helm--file-search (beg end query &optional directory options) - (require 'helm-ag) - (helm-ag--init-state) - (let ((helm-ag--default-directory (or directory (doom-project-root))) - (query (or query - (if (evil-visual-state-p) - (and beg end - (> (abs (- end beg)) 1) - (rxt-quote-pcre (buffer-substring-no-properties beg end))) - +helm--file-last-query) - +helm--file-last-query)) - (helm-ag-command-option (concat helm-ag-command-option " " (string-join options " ")))) - (setq helm-ag--last-query query) - (helm-attrset 'search-this-file nil helm-ag-source) - (helm-attrset 'name (helm-ag--helm-header helm-ag--default-directory) helm-ag-source) - (helm :sources '(helm-ag-source) - :input query - :buffer "*helm-ag*" - :keymap helm-ag-map - :history 'helm-ag--helm-history))) -(defvar +helm--file-last-search nil) +;; --- file searching --------------------- + +;;;###autoload (autoload '+helm:pt "completion/helm/autoload/evil" nil t) +(evil-define-command +helm:pt (all-files-p query) + "Ex interface for `+helm/pt'" + (interactive "") + (+helm/pt all-files-p query)) + +;;;###autoload (autoload '+helm:grep "completion/helm/autoload/evil" nil t) +(evil-define-command +helm:grep (all-files-p query) + "Ex interface for `+helm/grep'" + (interactive "") + (+helm/grep all-files-p query)) + ;;;###autoload (autoload '+helm:ag "completion/helm/autoload/evil" nil t) -(evil-define-command +helm:ag (beg end query &optional bang) - "TODO" - (interactive "") - (+helm--file-search beg end query nil - (if bang (list "-a" "--hidden")))) - -;;;###autoload (autoload '+helm:ag-cwd "completion/helm/autoload/evil" nil t) -(evil-define-command +helm:ag-cwd (beg end query &optional bang) - "TODO" - (interactive "") - (+helm--file-search beg end query default-directory - (list "-n" (if bang "-a")))) +(evil-define-command +helm:ag (all-files-p query) + "Ex interface for `+helm/ag'" + (interactive "") + (+helm/ag all-files-p query)) ;;;###autoload (autoload '+helm:rg "completion/helm/autoload/evil" nil t) -(evil-define-command +helm:rg (beg end query &optional bang) - "TODO" - (interactive "") - (let ((helm-ag-base-command "rg --no-heading")) - (+helm--file-search beg end query nil - (if bang (list "-uu"))))) +(evil-define-command +helm:rg (all-files-p query) + "Ex interface for `+helm/rg'" + (interactive "") + (+helm/rg all-files-p query)) + + +;;;###autoload (autoload '+helm:pt-from-cwd "completion/helm/autoload/evil" nil t) +(evil-define-command +helm:pt-from-cwd (query &optional recurse-p) + "Ex interface for `+helm/pt-from-cwd'." + (interactive "") + (+helm/pt-from-cwd (not recurse-p) query)) + +;;;###autoload (autoload '+helm:grep-from-cwd "completion/helm/autoload/evil" nil t) +(evil-define-command +helm:grep-from-cwd (query &optional recurse-p) + "Ex interface for `+helm/grep-from-cwd'." + (interactive "") + (+helm/grep-from-cwd (not recurse-p) query)) + +;;;###autoload (autoload '+helm:ag-from-cwd "completion/helm/autoload/evil" nil t) +(evil-define-command +helm:ag-from-cwd (query &optional recurse-p) + "Ex interface for `+helm/ag-from-cwd'." + (interactive "") + (+helm/ag-from-cwd (not recurse-p) query)) + +;;;###autoload (autoload '+helm:rg-from-cwd "completion/helm/autoload/evil" nil t) +(evil-define-command +helm:rg-from-cwd (query &optional recurse-p) + "Ex interface for `+helm/rg-from-cwd'." + (interactive "") + (+helm/rg-from-cwd (not recurse-p) query)) -;;;###autoload (autoload '+helm:rg-cwd "completion/helm/autoload/evil" nil t) -(evil-define-command +helm:rg-cwd (beg end query &optional bang) - "TODO" - (interactive "") - (let ((helm-ag-base-command "rg --no-heading --maxdepth 1")) - (+helm--file-search beg end query default-directory - (if bang (list "-uu"))))) ;;;###autoload (defun +helm--set-prompt-display (pos) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el new file mode 100644 index 000000000..59d2e67d7 --- /dev/null +++ b/modules/completion/helm/autoload/helm.el @@ -0,0 +1,172 @@ +;;; completion/helm/autoload/helm.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +helm/tasks (&optional _arg) + (interactive "P") + ;; TODO Implement `+helm/tasks' + (error "Not implemented yet")) + + +;; +;; Project search +;; + +(cl-defun +helm--file-search (engine &key query in all-files (recursive t)) + (require 'helm-ag) + (helm-ag--init-state) + (let* ((project-root (doom-project-root)) + (directory (or in project-root)) + (default-directory directory) + (helm-ag--default-directory directory) + (engine (or engine + (and (executable-find "rg") 'rg) + (and (executable-find "ag") 'ag) + (and (executable-find "pt") 'pt) + (and (or (executable-find "grep") + (executable-find "git")) + 'grep) + (error "No search engine specified (is ag, rg, pt or git installed?)"))) + (query (or query + (when (use-region-p) + (let ((beg (or (bound-and-true-p evil-visual-beginning) (region-beginning))) + (end (or (bound-and-true-p evil-visual-end) (region-end)))) + (when (> (abs (- end beg)) 1) + (rxt-quote-pcre (buffer-substring-no-properties beg end))))) + "")) + (prompt (format "%s%%s %s" + (symbol-name engine) + (cond ((equal directory default-directory) + "./") + ((equal directory project-root) + (projectile-project-name)) + (t + (file-relative-name directory project-root))))) + (command + (pcase engine + ('grep + (let* ((helm-ff-default-directory directory) + (helm-grep-in-recurse recursive) + (helm-grep-ignored-files + (unless all-files + (cl-union (projectile-ignored-files-rel) grep-find-ignored-files))) + (helm-grep-ignored-directories + (unless all-files + (cl-union (mapcar 'directory-file-name (projectile-ignored-directories-rel)) + grep-find-ignored-directories))) + (helm-grep-default-command + (if (and nil (eq (projectile-project-vcs) 'git)) + (format "git --no-pager grep --no-color -n%%c -e %%p %s -- %%f" + (if recursive "" "--max-depth 1 ")) + (format "grep -si -a%s %%e -n%%cH -e %%p %%f %s" + (if recursive " -R" "") + (if recursive "." "./*")))) + (helm-grep-default-recurse-command helm-grep-default-command)) + (message "-- %s (%s)" helm-grep-default-command query) + (setq helm-source-grep + (helm-build-async-source (capitalize (helm-grep-command t)) + :header-name (lambda (_name) "Helm Projectile Grep (C-c ? Help)") + :candidates-process #'helm-grep-collect-candidates + :filter-one-by-one #'helm-grep-filter-one-by-one + :candidate-number-limit 9999 + :nohighlight t + :keymap helm-grep-map + :history 'helm-grep-history + :action (apply #'helm-make-actions helm-projectile-grep-or-ack-actions) + :persistent-action 'helm-grep-persistent-action + :persistent-help "Jump to line (`C-u' Record in mark ring)" + :requires-pattern 2)) + (helm :sources 'helm-source-grep + :input query + :prompt prompt + :buffer "*helm grep*" + :default-directory directory + :keymap helm-grep-map + :history 'helm-grep-history + :truncate-lines helm-grep-truncate-lines)) + (cl-return t)) + (`ag + (list "ag -zS --nocolor --nogroup" + (when all-files "-a") + (unless recursive "--depth 1"))) + (`rg + (list "rg -zS --no-heading --line-number --color never" + (when all-files "-uu") + (unless recursive "--maxdepth 1"))) + (`pt + (list "pt -zS --nocolor --nogroup -e" + (when all-files "-a") + (unless recursive "--depth 1"))))) + (helm-ag-base-command (string-join command " "))) + (setq helm-ag--last-query query) + (helm-attrset 'search-this-file nil helm-ag-source) + (helm-attrset 'name (helm-ag--helm-header helm-ag--default-directory) helm-ag-source) + (helm :sources '(helm-ag-source) + :input query + :prompt prompt + :buffer "*helm-ag*" + :keymap helm-ag-map + :history 'helm-ag--helm-history))) + +;;;###autoload +(defun +helm/project-search (arg) + "Performs a project search using the first available search backend from a +list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), +preform search from current directory." + (interactive "P") + (call-interactively + (cond ((executable-find "rg") (if arg #'+helm/rg-from-cwd #'+helm/rg)) + ((executable-find "ag") (if arg #'+helm/ag-from-cwd #'+helm/ag)) + ((executable-find "pt") (if arg #'+helm/pt-from-cwd #'+helm/pt)) + (arg #'+helm/grep-from-cwd) + (#'+helm/grep)))) + +;; Relative to project root +;;;###autoload +(defun +helm/rg (all-files-p &optional query directory) + "TODO" + (interactive "P") + (+helm--file-search 'rg :query query :in directory :all-files all-files-p)) + +;;;###autoload +(defun +helm/ag (all-files-p &optional query directory) + "TODO" + (interactive "P") + (+helm--file-search 'ag :query query :in directory :all-files all-files-p)) + +;;;###autoload +(defun +helm/pt (all-files-p &optional query directory) + "TODO" + (interactive "P") + (+helm--file-search 'pt :query query :in directory :all-files all-files-p)) + +;;;###autoload +(defun +helm/grep (all-files-p &optional query directory) + "TODO" + (interactive "P") + (+helm--file-search 'grep :query query :in directory :all-files all-files-p)) + +;; Relative to current directory +;;;###autoload +(defun +helm/rg-from-cwd (recurse-p &optional query) + "TODO" + (interactive "P") + (+helm--file-search 'rg :query query :in default-directory :recursive recurse-p)) + +;;;###autoload +(defun +helm/ag-from-cwd (recurse-p &optional query) + "TODO" + (interactive "P") + (+helm--file-search 'ag :query query :in default-directory :recursive recurse-p)) + +;;;###autoload +(defun +helm/pt-from-cwd (recurse-p &optional query) + "TODO" + (interactive "P") + (+helm--file-search 'pt :query query :in default-directory :recursive recurse-p)) + +;;;###autoload +(defun +helm/grep-from-cwd (recurse-p &optional query) + "TODO" + (interactive "P") + (+helm--file-search 'grep :query query :in default-directory :recursive recurse-p)) + diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 458e5cf95..2233d7b07 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -116,8 +116,11 @@ ;; `helm-ag' -(map! :after helm-ag - :map helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) +(after! helm-ag + (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) + (set! :popup "^\\*helm-ag-edit" + '((size . 0.35)) + '((transient . 0) (quit)))) ;; `helm-css-scss' -- https://github.com/ShingoFukuyama/helm-css-scss diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index b0c195c6f..f8c27527b 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -497,9 +497,14 @@ :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) (:desc "search" :prefix "/" - :desc "Project" :nv "p" #'+ivy/project-search - :desc "Directory" :nv "d" (λ! (+ivy/project-search t)) - :desc "Buffer" :nv "b" #'swiper + (:when (featurep! :completion ivy) + :desc "Buffer" :nv "b" #'swiper + :desc "Project" :nv "p" #'+ivy/project-search + :desc "Directory" :nv "d" (λ! (+ivy/project-search t))) + (:when (featurep! :completion helm) + :desc "Buffer" :nv "b" #'helm-swoop + :desc "Project" :nv "p" #'+helm/project-search + :desc "Directory" :nv "d" (λ! (+helm/project-search t))) :desc "Symbols" :nv "i" #'imenu :desc "Symbols across buffers" :nv "I" #'imenu-anywhere :desc "Online providers" :nv "o" #'+lookup/online-select) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index f520be83d..732e6070c 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -103,9 +103,13 @@ command from the current directory instead of the project root." (ex! "todo" #'+ivy:todo)) ((featurep! :completion helm) (ex! "ag" #'+helm:ag) - (ex! "agc[wd]" #'+helm:ag-cwd) + (ex! "agc[wd]" #'+helm:ag-from-cwd) (ex! "rg" #'+helm:rg) - (ex! "rgc[wd]" #'+helm:rg-cwd) + (ex! "rgc[wd]" #'+helm:rg-from-cwd) + (ex! "pt" #'+helm:pt) + (ex! "ptc[wd]" #'+helm:pt-from-cwd) + (ex! "grep" #'+helm:grep) + (ex! "grepc[wd]" #'+helm:grep-from-cwd) (ex! "sw[oop]" #'+helm:swoop) (ex! "todo" #'+helm:todo))) ;; Project tools diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 34ff826be..bfa620cfb 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -167,6 +167,15 @@ the command buffer." (advice-add #'helpful--navigate :override #'+popup*helpful--navigate)) +;; `helm-ag' +(after! helm-ag + (defun +helm*pop-to-buffer (orig-fn &rest args) + (pop-to-buffer + (save-window-excursion (apply orig-fn args) + (current-buffer)))) + (advice-add #'helm-ag--edit :around #'+helm*pop-to-buffer)) + + ;; `Info' (defun +popup*switch-to-info-window (&rest _) (when-let* ((win (get-buffer-window "*info*"))) From 1a1d74afa3edfbf138c0a86a75ac4f52a5583b88 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 21:31:14 +0200 Subject: [PATCH 1642/4235] Refactor package management API To make backtraces a little less cluttered, in case of the notorious arrayp error, which I am yet unable to reproduce or understand. --- core/autoload/packages.el | 76 ++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 6451cbae4..a35641f3d 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -409,8 +409,7 @@ calls." "QUELPA -> ELPA")) ((plist-get (cdr pkg) :recipe) "QUELPA") - (t - "ELPA")))) + ("ELPA")))) (cl-sort (cl-copy-list packages) #'string-lessp :key #'car) "\n"))))) @@ -421,18 +420,24 @@ calls." (dolist (pkg packages) (print! "Installing %s" (car pkg)) (doom--condition-case! - (print! "%s%s" - (cond ((and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg))) - (not (doom-package-different-recipe-p (car pkg)))) - (dark (white "⚠ ALREADY INSTALLED"))) - ((doom-install-package (car pkg) (cdr pkg)) - (setq success t) - (green "✓ DONE")) - ((red "✕ FAILED"))) - (if (plist-member (cdr pkg) :pin) - (format " [pinned: %s]" (plist-get (cdr pkg) :pin)) - "")))) + (let ((result + (or (and (package-installed-p (car pkg)) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg))) + 'already-installed) + (and (doom-install-package (car pkg) (cdr pkg)) + (setq success t) + 'success) + 'failure)) + (pin-label + (and (plist-member (cdr pkg) :pin) + (format " [pinned: %s]" (plist-get (cdr pkg) :pin))))) + (print! "%s%s" + (pcase result + (`already-installed (dark (white "⚠ ALREADY INSTALLED"))) + (`success (green "✓ DONE")) + (`failure (red "✕ FAILED"))) + (or pin-label ""))))) (print! (bold (green "Finished!"))) (if success (doom-delete-autoloads-file doom-package-autoload-file)) success))))) @@ -492,34 +497,31 @@ calls." ((not (or auto-accept-p (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) - (pcase backend - (`quelpa "QUELPA->ELPA") - (`elpa "ELPA->QUELPA") - (_ "removed")) - (upcase (symbol-name backend)))))) - (sort (cl-copy-list packages) #'string-lessp) - "\n"))))) + (format "%s packages will be deleted:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (sym) + (let ((backend (doom-package-backend sym))) + (format "+ %s (%s)" sym + (if (doom-package-different-backend-p sym) + (pcase backend + (`quelpa "QUELPA->ELPA") + (`elpa "ELPA->QUELPA") + (_ "removed")) + (upcase (symbol-name backend)))))) + (sort (cl-copy-list packages) #'string-lessp) + "\n"))))) (error "Aborted!")) ((let (success) (dolist (pkg packages) (doom--condition-case! - (print! - (let ((result (doom-delete-package pkg t))) - (when result (setq success t)) - (color (if result 'green 'red) - "%s %s" - (if result "✓ Removed" "✕ Failed to remove") - pkg))))) - + (let ((result (doom-delete-package pkg t))) + (if result (setq success t)) + (print! (color (if result 'green 'red) + "%s %s" + (if result "✓ Removed" "✕ Failed to remove") + pkg))))) (print! (bold (green "Finished!"))) (if success (doom-delete-autoloads-file doom-package-autoload-file)) success))))) From 4d2e1dd5268c188c35d0e0155f51e296a742c42a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 21:40:57 +0200 Subject: [PATCH 1643/4235] Fix modeline growing incrementally on big font mode Fixes #575 --- modules/ui/doom-modeline/autoload.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-modeline/autoload.el b/modules/ui/doom-modeline/autoload.el index 7af38a44e..1c188ef9f 100644 --- a/modules/ui/doom-modeline/autoload.el +++ b/modules/ui/doom-modeline/autoload.el @@ -1,15 +1,18 @@ ;;; ui/doom-modeline/autoload.el -*- lexical-binding: t; -*- +(defvar +doom-modeline--old-bar-height nil) ;;;###autoload (defun +doom-modeline|resize-for-big-font () "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was made to be added to `doom-big-font-mode-hook'." - (let ((default-height (default-value '+doom-modeline-height))) + (unless +doom-modeline--old-bar-height + (setq +doom-modeline--old-bar-height +doom-modeline-height)) + (let ((default-height +doom-modeline--old-bar-height)) (if doom-big-font-mode (let* ((font-size (font-get doom-font :size)) (big-size (font-get doom-big-font :size)) (ratio (/ (float big-size) font-size))) - (setq +doom-modeline-height (ceiling (* default-height ratio)))) + (setq +doom-modeline-height (ceiling (* default-height ratio 0.75)))) (setq +doom-modeline-height default-height)) ;; already has a variable watcher in Emacs 26+ (unless EMACS26+ (+doom-modeline|refresh-bars)))) From 29ed19b612311e16aaab21be24892d584e6e4eff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Jun 2018 21:42:11 +0200 Subject: [PATCH 1644/4235] lang/elm: wrap elm-mode config in after! block --- modules/lang/elm/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 6cf23914d..bd845f842 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -3,10 +3,10 @@ ;; `elm-mode' (setq elm-format-on-save t) -(add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - -(set! :company-backend 'elm-mode 'company-elm) -(set! :repl 'elm-mode #'run-elm-interactive) +(after! elm-mode + (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (set! :company-backend 'elm-mode 'company-elm) + (set! :repl 'elm-mode #'run-elm-interactive)) (def-package! flycheck-elm From b2dfc4b8e851a6020f9caa919fca6c064f1a0a09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 01:38:35 +0200 Subject: [PATCH 1645/4235] Delete plugin *.elc before recompiling plugins --- core/autoload/modules.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 348cbc8d2..a41b4430a 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -283,6 +283,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (":core" (push doom-core-dir targets)) (":private" (push doom-private-dir targets)) (":plugins" + (dolist (file (doom-files-in package-user-dir :match "\\.elc$")) + (ignore-errors (delete-file file))) (byte-recompile-directory package-user-dir 0 t) (setq compile-plugins-p t modules (delete ":plugins" modules))) From 2761e8c8414b41f7f6200b52f64acb30cdbbd0eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 01:38:51 +0200 Subject: [PATCH 1646/4235] lang/org: switch to hard word wrapping Evil's motions are gimped in soft-wrapped buffers. It also hurts performance. --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 7c7daed71..ae83966af 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -50,7 +50,7 @@ org-bullets-mode ; "prettier" bullets org-indent-mode ; margin-based indentation toc-org-enable ; auto-table of contents - visual-line-mode ; line wrapping + auto-fill-mode ; line wrapping +org|enable-auto-reformat-tables +org|enable-auto-update-cookies From bcc01628a36196528c1781a8246bf135eed74577 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 11:20:43 +0200 Subject: [PATCH 1647/4235] Remove anaconda-view-mode-map keybinds It, with anaconda-view-mode, have been removed upstream. --- modules/lang/python/config.el | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 8219bb12b..fc56b36c7 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -131,9 +131,4 @@ environment variables." ;; (when (featurep! :feature evil +everywhere) - (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps) - (map! :after anaconda-mode - :map anaconda-view-mode-map - :m "]]" #'anaconda-view-mode-next-definition - :m "[[" #'anaconda-view-mode-previous-definition - :n "q" #'quit-window)) + (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps)) From ad5713cd78124a4eb3c6466d35357a5175b74656 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 11:21:32 +0200 Subject: [PATCH 1648/4235] add-hook 'nose-mode-hook #'evil-normalize-keymaps Ensures nose-mode-map keybinds work in nose-mode. --- modules/lang/python/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index fc56b36c7..89067bc3e 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -131,4 +131,5 @@ environment variables." ;; (when (featurep! :feature evil +everywhere) - (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps)) + (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps) + (add-hook 'nose-mode-hook #'evil-normalize-keymaps)) From 01b07e573effb51c5d90dc86cee49c23316e25c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 12:04:42 +0200 Subject: [PATCH 1649/4235] Fix visual j/k in dashboard and evil-mode In case you've remapped j/k to gj/gk universally. --- modules/ui/doom-dashboard/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 3bb095155..01c1f0d14 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -82,6 +82,8 @@ Possible values: (:when (featurep! :feature evil) :m "j" #'forward-button :m "k" #'backward-button + [remap evil-next-visual-line] #'forward-button + [remap evil-previous-visual-line] #'backward-button [remap evil-delete] #'ignore [remap evil-delete-line] #'ignore From da9096acac5ab71fa020d4ae04d6e5b2cf748935 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 12:08:33 +0200 Subject: [PATCH 1650/4235] Fix evil-org-mode keybinds on first org buffer evil keeps track of auxiliary keymaps. This list is updated when you switch states, but it _really_ needs to be updated when minor modes (with keymaps) are toggled. When this isn't done, their keymaps aren't recognized and their keys will be unavailable at first. Since there is no global hook for enabling minor modes, we have to manually add evil-normalize-keymaps to minor mode hooks. This commit, specifically, fixes evil-org-mode-map. This also indirectly fixes folding src blocks for evil users (on the first org buffer). --- modules/lang/org/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index ae83966af..bb4c2807b 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -25,7 +25,8 @@ :hook (org-load . evil-org-set-key-theme) :init (setq evil-org-key-theme '(navigation insert textobjects)) - (add-hook 'org-load-hook #'+org|setup-evil)) + (add-hook 'org-load-hook #'+org|setup-evil) + (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps)) (def-package! evil-org-agenda :when (featurep! :feature evil) From ae86498a412ae2495386798b8bdb037fa817b393 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 12:20:16 +0200 Subject: [PATCH 1651/4235] Tie evil-org/evil-org-agenda to +everywhere flag --- modules/lang/org/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index bb4c2807b..0a50fbddc 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -20,7 +20,7 @@ (setq toc-org-hrefify-default "org") (def-package! evil-org - :when (featurep! :feature evil) + :when (featurep! :feature evil +everywhere) :hook (org-mode . evil-org-mode) :hook (org-load . evil-org-set-key-theme) :init @@ -29,7 +29,7 @@ (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps)) (def-package! evil-org-agenda - :when (featurep! :feature evil) + :when (featurep! :feature evil +everywhere) :after org-agenda :config (evil-org-agenda-set-keys)) From f9be8887fbbd8497ffa0010e560a8882e14d5725 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 12:22:39 +0200 Subject: [PATCH 1652/4235] lang/org: minor refactor/reformatting Also reduce internal use of map! (toward eventual switch to general) --- modules/lang/org/autoload/org.el | 24 +++--- modules/lang/org/config.el | 128 +++++++++++++++---------------- 2 files changed, 76 insertions(+), 76 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 37d05addb..aa69f5955 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -313,12 +313,6 @@ wrong places)." (if org-table-may-need-update (org-table-align))) (goto-char pt)))) -;;;###autoload -(defun +org*realign-table-maybe (&rest _) - "Auto-align table under cursor and re-calculate formulas." - (when (eq major-mode 'org-mode) - (+org|realign-table-maybe))) - ;;;###autoload (defun +org|update-cookies () "Update counts in headlines (aka \"cookies\")." @@ -329,9 +323,8 @@ wrong places)." (defun +org|yas-expand-maybe () "Tries to expand a yasnippet snippet, if one is available. Made for `org-tab-first-hook'." - (when (and (if (bound-and-true-p evil-mode) - (eq evil-state 'insert) - t) + (when (and (or (not (bound-and-true-p evil-mode)) + (eq evil-state 'insert)) (bound-and-true-p yas-minor-mode) (yas--templates-for-key-at-point)) (call-interactively #'yas-expand) @@ -354,6 +347,13 @@ with `org-cycle')." ;;;###autoload (defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) +;;;###autoload +(defun +org|remove-occur-highlights () + "Remove org occur highlights on ESC in normal mode." + (when org-occur-highlights + (org-remove-occur-highlights) + t)) + ;; ;; Advice @@ -365,3 +365,9 @@ with `org-cycle')." (when (org-in-src-block-p t) (org-babel-do-in-edit-buffer (call-interactively #'indent-for-tab-command)))) + +;;;###autoload +(defun +org*realign-table-maybe (&rest _) + "Auto-align table under cursor and re-calculate formulas." + (when (eq major-mode 'org-mode) + (+org|realign-table-maybe))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0a50fbddc..24430fd52 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -245,84 +245,80 @@ unfold to point on startup." (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies between the two." - (defun +org|remove-occur-highlights () - "Remove org occur highlights on ESC in normal mode." - (when org-occur-highlights - (org-remove-occur-highlights) - t)) (add-hook 'doom-escape-hook #'+org|remove-occur-highlights) - ;; C-a & C-e act like `doom/backward-to-bol-or-indent' and ;; `doom/forward-to-last-non-comment-or-eol', but with more org awareness. (setq org-special-ctrl-a/e t) - + ;; Try indenting normally or expanding snippets on TAB (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) - ;; Tell `doom/delete-backward-char' to respect org tables (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char) - - (map! :map org-mode-map - "C-c C-S-l" #'+org/remove-link - "C-c C-i" #'org-toggle-inline-images - [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line - [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) + ;; Custom keybinds + (define-key! org-mode-map + (kbd "C-c C-S-l") #'+org/remove-link + (kbd "C-c C-i") #'org-toggle-inline-images + [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line + [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) (defun +org|setup-evil () (require 'evil-org) - + ;; By default, TAB cycles the visibility of all children under the current + ;; tree between three states. I want to toggle the tree between two states, + ;; without affecting its children. (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold t) - ;; Fix newline-and-indent behavior in src blocks (advice-add #'org-return-indent :after #'+org*return-indent-in-src-blocks) - - (map! :map outline-mode-map - :n "^" nil - :n [backtab] nil - :n "C-j" nil - :n "C-k" nil - :n "]" nil - :n "[" nil - - :map evil-org-mode-map - :i [backtab] #'+org/dedent - ;; navigate table cells (from insert-mode) - :i "C-l" #'+org/table-next-field - :i "C-h" #'+org/table-previous-field - :i "C-k" #'+org/table-previous-row - :i "C-j" #'+org/table-next-row - ;; expand tables (or shiftmeta move) - :ni "C-S-l" #'+org/table-append-field-or-shift-right - :ni "C-S-h" #'+org/table-prepend-field-or-shift-left - :ni "C-S-k" #'org-metaup - :ni "C-S-j" #'org-metadown - ;; more intuitive RET keybinds - :i "RET" #'org-return-indent - :n "RET" #'+org/dwim-at-point - :ni [M-return] (λ! (+org/insert-item 'below)) - :ni [S-M-return] (λ! (+org/insert-item 'above)) - ;; more org-ish vim motion keys - :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) - :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) - :m "]h" #'org-next-visible-heading - :m "[h" #'org-previous-visible-heading - :m "]l" #'org-next-link - :m "[l" #'org-previous-link - :m "]s" #'org-babel-next-src-block - :m "[s" #'org-babel-previous-src-block - :m "^" #'evil-org-beginning-of-line - :m "0" (λ! (let ((visual-line-mode)) (org-beginning-of-line))) - :n "gQ" #'org-fill-paragraph - ;; sensible code-folding vim keybinds - :n "za" #'+org/toggle-fold - :n "zA" #'org-shifttab - :n "zc" #'outline-hide-subtree - :n "zC" (λ! (outline-hide-sublevels 1)) - :n "zd" (lambda (&optional arg) (interactive "p") (outline-hide-sublevels (or arg 3))) - :n "zm" (λ! (outline-hide-sublevels 1)) - :n "zo" #'outline-show-subtree - :n "zO" #'outline-show-all - :n "zr" #'outline-show-all - + ;; Undo `evil-collection-outline' + (evil-define-key* 'normal outline-mode-map + "^" nil + [backtab] nil + "\C-j" nil "\C-k" nil + "]" nil "[" nil) + (evil-define-key* 'insert evil-org-mode-map + ;; dedent with shift-tab in insert mode + [backtab] #'+org/dedent + ;; navigate table cells (from insert-mode) + "\C-l" #'+org/table-next-field + "\C-h" #'+org/table-previous-field + "\C-k" #'+org/table-previous-row + "\C-j" #'+org/table-next-row) + ;; expand tables or move fields + (evil-define-key* '(insert normal) evil-org-mode-map + (kbd "C-S-l") #'+org/table-append-field-or-shift-right + (kbd "C-S-h") #'+org/table-prepend-field-or-shift-left + (kbd "C-S-k") #'org-metaup + (kbd "C-S-j") #'org-metadown) + ;; more intuitive RET keybinds + (evil-define-key* 'insert evil-org-mode-map + [return] #'org-return-indent) + (evil-define-key* '(insert normal) evil-org-mode-map + [M-return] (λ! (+org/insert-item 'below)) + [S-M-return] (λ! (+org/insert-item 'above))) + ;; more vim-esque org motion keys + (evil-define-key* 'motion evil-org-mode-map + "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) + "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) + "]h" #'org-next-visible-heading + "[h" #'org-previous-visible-heading + "]l" #'org-next-link + "[l" #'org-previous-link + "]s" #'org-babel-next-src-block + "[s" #'org-babel-previous-src-block + "^" #'evil-org-beginning-of-line + "0" (λ! (let (visual-line-mode) (org-beginning-of-line)))) + ;; sensible vim-esque folding keybinds + (evil-define-key* 'normal evil-org-mode-map + "za" #'+org/toggle-fold + "zA" #'org-shifttab + "zc" #'outline-hide-subtree + "zC" (λ! (outline-hide-sublevels 1)) + "zd" (lambda (&optional arg) (interactive "p") (outline-hide-sublevels (or arg 3))) + "zm" (λ! (outline-hide-sublevels 1)) + "zo" #'outline-show-subtree + "zO" #'outline-show-all + "zr" #'outline-show-all) + ;; + (map! :map evil-org-mode-map :localleader :n "d" #'org-deadline :n "t" #'org-todo @@ -337,7 +333,6 @@ between the two." "Getting org to behave." ;; Don't open separate windows (map-put org-link-frame-setup 'file #'find-file) - ;; Let OS decide what to do with files when opened (setq org-file-apps `(("pdf" . default) @@ -346,7 +341,6 @@ between the two." (directory . emacs) (t . ,(cond (IS-MAC "open -R \"%s\"") (IS-LINUX "xdg-open \"%s\""))))) - ;; Don't clobber recentf or current workspace with agenda files (defun +org|exclude-agenda-buffers-from-workspace () (let (persp-autokill-buffer-on-remove) From 3d893ea53e95e26390bd7b6a3a8f20ff7432e329 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 12:23:17 +0200 Subject: [PATCH 1653/4235] Update org-format-latex-options when theme changes --- modules/lang/org/config.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 24430fd52..a3173eb48 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -189,16 +189,21 @@ unfold to point on startup." org-use-sub-superscripts '{} outline-blank-line t - ;; LaTeX previews are too small and usually render to light backgrounds, so - ;; this enlargens them and ensures their background (and foreground) match - ;; the current theme. + ;; Scale up LaTeX previews a bit (default is too small) org-preview-latex-image-directory (concat doom-cache-dir "org-latex/") - org-format-latex-options (plist-put org-format-latex-options :scale 1.5) - org-format-latex-options - (plist-put org-format-latex-options - :background (face-attribute (or (cadr (assq 'default face-remapping-alist)) - 'default) - :background nil t))) + org-format-latex-options (plist-put org-format-latex-options :scale 1.5)) + + ;; Previews are usually rendered with light backgrounds, so ensure their + ;; background (and foreground) match the current theme. + (defun +org|update-latex-faces () + (setq-default + org-format-latex-options + (plist-put org-format-latex-options + :background + (face-attribute (or (cadr (assq 'default face-remapping-alist)) + 'default) + :background nil t)))) + (add-hook 'doom-load-theme-hook #'+org|update-latex-faces) ;; Custom links (setq org-link-abbrev-alist From 83590d65bab2c24f18e684c23c4508538f2a4e24 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 15:01:21 +0200 Subject: [PATCH 1654/4235] Refactor/optimize completion/ido module Ensure initialization only occurs once when ido is first used. Special steps are needed because ido is automatically loaded at startup by Emacs. --- modules/completion/ido/config.el | 56 ++++++++++++++------------------ 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/modules/completion/ido/config.el b/modules/completion/ido/config.el index 4ca406efc..de96fc24b 100644 --- a/modules/completion/ido/config.el +++ b/modules/completion/ido/config.el @@ -1,7 +1,6 @@ ;;; completion/ido/config.el -*- lexical-binding: t; -*- -(def-package! ido - :config +(defun +ido|init () (setq ido-ignore-buffers '("\\` " "^\\*ESS\\*" "^\\*Messages\\*" "^\\*Help\\*" "^\\*Buffer" "^\\*.*Completions\\*$" "^\\*Ediff" "^\\*tramp" "^\\*cvs-" @@ -16,29 +15,18 @@ ido-enable-last-directory-history t ido-save-directory-list-file (concat doom-cache-dir "ido.last")) - (push "\\`.DS_Store$" ido-ignore-files) - (push "Icon\\?$" ido-ignore-files) + (unless (member "\\`.DS_Store$" ido-ignore-files) + (push "\\`.DS_Store$" ido-ignore-files) + (push "Icon\\?$" ido-ignore-files)) - (ido-mode 1) - (ido-everywhere 1) - (require 'ido-completing-read+) - (ido-ubiquitous-mode 1) - - (defun +ido|init () - (require 'ido-vertical-mode) - (ido-vertical-mode 1) - - (require 'flx-ido) - (flx-ido-mode +1) - - (require 'crm-custom) - (crm-custom-mode +1) - - (map! :map (ido-common-completion-map ido-completion-map ido-file-completion-map) - "C-n" #'ido-next-match - "C-p" #'ido-prev-match - "C-w" #'ido-delete-backward-word-updir)) - (add-hook 'ido-setup-hook #'+ido|init) + (define-key! (ido-common-completion-map ido-completion-map ido-file-completion-map) + "\C-n" #'ido-next-match + "\C-p" #'ido-prev-match + "\C-w" #'ido-delete-backward-word-updir + ;; Go to $HOME with ~ + "~" (λ! (if (looking-back "/" (point-min)) + (insert "~/") + (call-interactively #'self-insert-command)))) (defun +ido*sort-mtime () "Sort ido filelist by mtime instead of alphabetically." @@ -55,10 +43,16 @@ (advice-add #'ido-sort-mtime :override #'+ido*sort-mtime) (add-hook! (ido-make-file-list ido-make-dir-list) #'+ido*sort-mtime) - (defun +ido|setup-home-keybind () - "Go to $HOME with ~" - (define-key ido-file-completion-map (kbd "~") - (λ! (if (looking-back "/" (point-min)) - (insert "~/") - (call-interactively #'self-insert-command))))) - (add-hook 'ido-setup-hook #'+ido|setup-home-keybind)) + ;; + (ido-mode 1) + (ido-everywhere 1) + (ido-ubiquitous-mode 1) + (ido-vertical-mode 1) + (flx-ido-mode +1) + (crm-custom-mode +1) + + ;; + (remove-hook 'ido-setup-hook #'+ido|init)) + +;; +(add-hook 'ido-setup-hook #'+ido|init) From 1e81a3546142e06b9e4e9a0ae3f599c98c3f5c6c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 15:46:00 +0200 Subject: [PATCH 1655/4235] Minimize dependence on map! This is in preparation for general.el integration coming in 2.1.1. It is very likely that map! will change (and even more, be split into several macros). Not much, but change none-the-less. Specifically, the state keywords (e.g. :nvi, :n, :i) will be removed in favor of a :state property that takes a list, e.g. (normal visual insert). In any case, both map! and general are also relatively expensive compared to define-key and evil-define-key* (and the new define-key! macro), so use that when we can. This also means changes to either API won't affect Doom's modules in the long term. --- core/core-keybinds.el | 27 ++++++--- modules/app/calendar/config.el | 2 +- modules/app/irc/config.el | 4 +- modules/app/rss/config.el | 35 ++++++------ modules/app/twitter/config.el | 51 ++++++++--------- modules/completion/helm/config.el | 27 +++++---- modules/completion/ivy/config.el | 56 +++++++++--------- modules/config/default/autoload/evil.el | 2 +- modules/emacs/eshell/config.el | 33 ++++++----- modules/feature/evil/config.el | 40 +++++++------ modules/lang/cc/config.el | 4 +- modules/lang/ess/config.el | 75 +++++++++++++------------ modules/lang/latex/config.el | 12 ++-- modules/lang/markdown/config.el | 55 +++++++++--------- modules/lang/org/+babel.el | 2 +- modules/tools/ein/config.el | 5 +- modules/tools/password-store/config.el | 12 ++-- modules/tools/pdf/config.el | 6 +- modules/tools/prodigy/config.el | 2 +- modules/ui/doom-dashboard/config.el | 65 ++++++++++++--------- 20 files changed, 276 insertions(+), 239 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 91258aac8..95c7d0881 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -153,17 +153,26 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (defvar doom--defer nil) (defvar doom--local nil) -(defmacro define-key! (keymap key def &rest rest) +(defmacro define-key! (keymaps key def &rest rest) "TODO" (declare (indent defun)) - `(progn - (define-key ,keymap ,key ,def) - ,@(let (forms) - (while rest - (let ((key (pop rest)) - (def (pop rest))) - (push `(define-key ,keymap ,key ,def) forms))) - (nreverse forms)))) + (if (and (listp keymaps) + (not (eq (car-safe keymaps) 'quote))) + `(dolist (map (list ,@keymaps)) + ,(macroexpand `(define-key! map ,key ,def ,@rest))) + (when (eq (car-safe keymaps) 'quote) + (pcase (cadr keymaps) + (`global (setq keymaps '(current-global-map))) + (`local (setq keymaps '(current-local-map))) + (x (error "%s is not a valid keymap" x)))) + `(let ((map ,keymaps)) + (define-key map ,key ,def) + ,@(let (forms) + (while rest + (let ((key (pop rest)) + (def (pop rest))) + (push `(define-key map ,key ,def) forms))) + (nreverse forms))))) (defmacro map! (&rest rest) "A nightmare of a key-binding macro that will use `evil-define-key*', diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index c607b2898..b359e1212 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -27,7 +27,7 @@ cfw:fchar-top-left-corner ?┏ cfw:fchar-top-right-corner ?┓) - (map! :map cfw:calendar-mode-map "q" #'+calendar/quit) + (define-key cfw:calendar-mode-map "q" #'+calendar/quit) (when (featurep 'solaire-mode) (add-hook 'cfw:calendar-mode-hook #'solaire-mode)) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 7d7c6df11..703ac4122 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -103,7 +103,7 @@ playback.") (advice-add 'circe--irc-conn-disconnected :after #'+irc*circe-disconnect-hook) ;; Let `+irc/quit' and `circe' handle buffer cleanup - (map! :map circe-mode-map [remap kill-buffer] #'bury-buffer) + (define-key circe-mode-map [remap kill-buffer] #'bury-buffer) (defun +irc*circe-truncate-nicks () "Truncate long nicknames in chat output non-destructively." @@ -163,7 +163,7 @@ playback.") (def-package! lui :commands lui-mode :config - (map! :map lui-mode-map "C-u" #'lui-kill-to-beginning-of-line) + (define-key lui-mode-map "\C-u" #'lui-kill-to-beginning-of-line) (when (featurep! :feature spellcheck) (setq lui-flyspell-p t lui-fill-type nil)) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index e3908aa80..606bbaedf 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -39,23 +39,24 @@ paths.") ;; Enhance readability of a post (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) - (map! (:map (elfeed-search-mode-map elfeed-show-mode-map) - [remap kill-this-buffer] #'+rss/quit - [remap kill-buffer] #'+rss/quit) - - (:map elfeed-search-mode-map - :n "q" #'+rss/quit - :n "r" #'elfeed-update - :n "s" #'elfeed-search-live-filter - :n "RET" #'elfeed-search-show-entry - :n "M-RET" #'elfeed-search-browse-url) - - (:map elfeed-show-mode-map - :n "q" #'elfeed-kill-buffer - :m "j" #'evil-next-visual-line - :m "k" #'evil-previous-visual-line - [remap next-buffer] #'+rss/next - [remap previous-buffer] #'+rss/previous))) + (define-key! (elfeed-search-mode-map elfeed-show-mode-map) + [remap kill-this-buffer] #'+rss/quit + [remap kill-buffer] #'+rss/quit) + (define-key! elfeed-show-mode-map + [remap next-buffer] #'+rss/next + [remap previous-buffer] #'+rss/previous) + (when (featurep 'evil) + (evil-define-key* 'normal elfeed-search-mode-map + "q" #'+rss/quit + "r" #'elfeed-update + "s" #'elfeed-search-live-filter + (kbd "RET") #'elfeed-search-show-entry + (kbd "M-RET") #'elfeed-search-browse-url) + (evil-define-key* 'normal elfeed-show-mode-map + "q" #'elfeed-kill-buffer) + (evil-define-key* 'motion elfeed-show-mode-map + "j" #'evil-next-visual-line + "k" #'evil-previous-visual-line))) (def-package! elfeed-org diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index acc592b40..4238172e0 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -52,28 +52,29 @@ mode-line-format nil)) (add-hook 'twittering-mode-hook #'+twitter|switch-mode-and-header-line) - (map! :map twittering-mode-map - "q" #'+twitter/quit - "Q" #'+twitter/quit-all - [remap twittering-kill-buffer] #'+twitter/quit - [remap delete-window] #'+twitter/quit - [remap +workspace/close-window-or-workspace] #'+twitter/quit - (:when (featurep! :feature evil) - [remap evil-window-delete] #'+twitter/quit - "f" #'twittering-favorite - "F" #'twittering-unfavorite - "C-f" #'twittering-follow - "C-F" #'twittering-unfollow - "d" #'twittering-delete-status - "r" #'twittering-retweet - "R" #'twittering-toggle-or-retrieve-replied-statuses - "o" #'twittering-update-status-interactive - "O" #'+twitter/ace-link - "/" #'twittering-search - "J" #'twittering-goto-next-status - "K" #'twittering-goto-previous-status - "g" nil - "gg" #'twittering-goto-first-status - "G" #'twittering-goto-last-status - "gj" #'twittering-goto-next-status-of-user - "gk" #'twittering-goto-previous-status-of-user))) + (define-key! twittering-mode-map + "q" #'+twitter/quit + "Q" #'+twitter/quit-all + [remap twittering-kill-buffer] #'+twitter/quit + [remap delete-window] #'+twitter/quit + [remap +workspace/close-window-or-workspace] #'+twitter/quit) + (when (featurep! :feature evil +everywhere) + (define-key! twittering-mode-map + [remap evil-window-delete] #'+twitter/quit + "f" #'twittering-favorite + "F" #'twittering-unfavorite + "\C-f" #'twittering-follow + "\C-F" #'twittering-unfollow + "d" #'twittering-delete-status + "r" #'twittering-retweet + "R" #'twittering-toggle-or-retrieve-replied-statuses + "o" #'twittering-update-status-interactive + "O" #'+twitter/ace-link + "/" #'twittering-search + "J" #'twittering-goto-next-status + "K" #'twittering-goto-previous-status + "g" nil + "gg" #'twittering-goto-first-status + "G" #'twittering-goto-last-status + "gj" #'twittering-goto-next-status-of-user + "gk" #'twittering-goto-previous-status-of-user))) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 2233d7b07..7d137e6d9 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -14,20 +14,19 @@ :defer 1 :after-call pre-command-hook :init - (map! :map global-map - [remap apropos] #'helm-apropos - [remap bookmark-jump] #'helm-bookmarks - [remap execute-extended-command] #'helm-M-x - [remap find-file] #'helm-find-files - [remap imenu-anywhere] #'helm-imenu-anywhere - [remap imenu] #'helm-semantic-or-imenu - [remap swiper] #'helm-swoop - [remap noop-show-kill-ring] #'helm-show-kill-ring - [remap projectile-find-file] #'helm-projectile-find-file - [remap projectile-recentf] #'helm-projectile-recentf - [remap projectile-switch-project] #'helm-projectile-switch-project - [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer - [remap recentf-open-files] #'helm-recentf) + (define-key! 'global + [remap apropos] #'helm-apropos + [remap bookmark-jump] #'helm-bookmarks + [remap execute-extended-command] #'helm-M-x + [remap find-file] #'helm-find-files + [remap imenu-anywhere] #'helm-imenu-anywhere + [remap imenu] #'helm-semantic-or-imenu + [remap noop-show-kill-ring] #'helm-show-kill-ring + [remap projectile-find-file] #'helm-projectile-find-file + [remap projectile-recentf] #'helm-projectile-recentf + [remap projectile-switch-project] #'helm-projectile-switch-project + [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer + [remap recentf-open-files] #'helm-recentf) :config (helm-mode +1) ;; helm is too heavy for find-file-at-point diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 702afd189..596fff5b3 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -50,9 +50,10 @@ immediately runs it on the current candidate (ending the ivy session)." (after! magit (setq magit-completing-read-function #'ivy-completing-read)) (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) - (map! [remap switch-to-buffer] #'ivy-switch-buffer - [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer - [remap imenu-anywhere] #'ivy-imenu-anywhere) + (define-key! 'global + [remap switch-to-buffer] #'ivy-switch-buffer + [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer + [remap imenu-anywhere] #'ivy-imenu-anywhere) (ivy-mode +1)) @@ -69,19 +70,21 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel :commands counsel-describe-face :init - (map! [remap apropos] #'counsel-apropos - [remap bookmark-jump] #'counsel-bookmark - [remap describe-face] #'counsel-describe-face - [remap describe-function] #'counsel-describe-function - [remap describe-variable] #'counsel-describe-variable - [remap execute-extended-command] #'counsel-M-x - [remap find-file] #'counsel-find-file - [remap find-library] #'counsel-find-library - [remap info-lookup-symbol] #'counsel-info-lookup-symbol - [remap imenu] #'counsel-imenu - [remap recentf-open-files] #'counsel-recentf - [remap org-capture] #'counsel-org-capture - [remap swiper] #'counsel-grep-or-swiper) + (define-key! 'global + [remap apropos] #'counsel-apropos + [remap bookmark-jump] #'counsel-bookmark + [remap describe-face] #'counsel-describe-face + [remap describe-function] #'counsel-describe-function + [remap describe-variable] #'counsel-describe-variable + [remap execute-extended-command] #'counsel-M-x + [remap find-file] #'counsel-find-file + [remap find-library] #'counsel-find-library + [remap info-lookup-symbol] #'counsel-info-lookup-symbol + [remap imenu] #'counsel-imenu + [remap recentf-open-files] #'counsel-recentf + [remap org-capture] #'counsel-org-capture + [remap swiper] #'counsel-grep-or-swiper) + :config (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) @@ -106,12 +109,13 @@ immediately runs it on the current candidate (ending the ivy session)." :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init - (map! [remap projectile-find-file] #'counsel-projectile-find-file - [remap projectile-find-dir] #'counsel-projectile-find-dir - [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer - [remap projectile-grep] #'counsel-projectile-grep - [remap projectile-ag] #'counsel-projectile-ag - [remap projectile-switch-project] #'counsel-projectile-switch-project) + (define-key! 'global + [remap projectile-find-file] #'counsel-projectile-find-file + [remap projectile-find-dir] #'counsel-projectile-find-dir + [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer + [remap projectile-grep] #'counsel-projectile-grep + [remap projectile-ag] #'counsel-projectile-ag + [remap projectile-switch-project] #'counsel-projectile-switch-project) :config ;; Highlight entries that have been visited (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) @@ -126,10 +130,10 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-hydra :commands (+ivy@coo/body ivy-dispatching-done-hydra) :init - (map! :after ivy - :map ivy-minibuffer-map - "C-o" #'+ivy@coo/body - "M-o" #'ivy-dispatching-done-hydra) + (after! ivy + (define-key! ivy-minibuffer-map + "\C-o" #'+ivy@coo/body + (kbd "M-o") #'ivy-dispatching-done-hydra)) :config (defhydra +ivy@coo (:hint nil :color pink) " diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index b3cf49b6d..1d35ac8bf 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -42,7 +42,7 @@ buffers." integration." (interactive) (let ((prefix (this-command-keys))) - (map! :m prefix nil) + (evil-define-key* 'motion 'global prefix nil) (evilem-default-keybindings prefix) (set-transient-map evilem-map) (which-key-reload-key-sequence prefix))) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index f78a8513f..90ed2816c 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -55,20 +55,23 @@ (defun +eshell|init-keymap () "Setup eshell keybindings. This must be done in a hook because eshell-mode redefines its keys every time `eshell-mode' is enabled." - (map! :map eshell-mode-map - :n [return] #'+eshell/goto-end-of-prompt - :n "c" #'+eshell/evil-change - :n "C" #'+eshell/evil-change-line - :n "d" #'+eshell/evil-delete - :n "D" #'+eshell/evil-delete-line - :i "C-d" #'+eshell/quit-or-delete-char - :i "C-p" #'eshell-previous-input - :i "C-n" #'eshell-next-input - [remap doom/backward-to-bol-or-indent] #'eshell-bol - [remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input - [remap split-window-below] #'+eshell/split-below - [remap split-window-right] #'+eshell/split-right - [remap evil-window-split] #'+eshell/split-below - [remap evil-window-vsplit] #'+eshell/split-right)) + (when (featurep 'evil) + (evil-define-key* 'normal eshell-mode-map + [return] #'+eshell/goto-end-of-prompt + "c" #'+eshell/evil-change + "C" #'+eshell/evil-change-line + "d" #'+eshell/evil-delete + "D" #'+eshell/evil-delete-line) + (evil-define-key* 'insert eshell-mode-map + "\C-d" #'+eshell/quit-or-delete-char + "\C-p" #'eshell-previous-input + "\C-n" #'eshell-next-input)) + (define-key! eshell-mode-map + [remap split-window-below] #'+eshell/split-below + [remap split-window-right] #'+eshell/split-right + [remap doom/backward-to-bol-or-indent] #'eshell-bol + [remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input + [remap evil-window-split] #'+eshell/split-below + [remap evil-window-vsplit] #'+eshell/split-right)) (add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap)) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index cf9c59b35..5f6ad5f43 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -63,6 +63,8 @@ variable for an explanation of the defaults (in comments). See (add-hook 'doom-post-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) + (put 'evil-define-key* 'lisp-indent-function 'defun) + (set! :popup "^\\*evil-registers" '((size . 0.3))) (set! :popup "^\\*Command Line" '((size . 8))) @@ -77,18 +79,20 @@ variable for an explanation of the defaults (in comments). See ;; --- keybind fixes ---------------------- - (map! (:after wgrep - ;; A wrapper that invokes `wgrep-mark-deletion' across lines you use - ;; `evil-delete' in wgrep buffers. - :map wgrep-mode-map [remap evil-delete] #'+evil-delete) + (after! wgrep + ;; A wrapper that invokes `wgrep-mark-deletion' across lines you use + ;; `evil-delete' in wgrep buffers. + (define-key! wgrep-mode-map + [remap evil-delete] #'+evil-delete)) - ;; replace native folding commands - [remap evil-toggle-fold] #'+evil:fold-toggle - [remap evil-close-fold] #'+evil:fold-close - [remap evil-open-fold] #'+evil:fold-open - [remap evil-open-fold-rec] #'+evil:fold-open - [remap evil-close-folds] #'+evil:fold-close-all - [remap evil-open-folds] #'+evil:fold-open-all) + ;; replace native folding commands + (define-key! 'global + [remap evil-toggle-fold] #'+evil:fold-toggle + [remap evil-close-fold] #'+evil:fold-close + [remap evil-open-fold] #'+evil:fold-open + [remap evil-open-fold-rec] #'+evil:fold-open + [remap evil-close-folds] #'+evil:fold-close-all + [remap evil-open-folds] #'+evil:fold-open-all) (defun +evil|disable-highlights () "Disable ex search buffer highlights." @@ -234,7 +238,7 @@ variable for an explanation of the defaults (in comments). See evil-escape-key-sequence "jk" evil-escape-delay 0.25) (add-hook 'pre-command-hook #'evil-escape-pre-command-hook) - (map! :irvo "C-g" #'evil-escape) + (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config ;; no `evil-escape' in minibuffer (add-hook 'evil-escape-inhibit-functions #'minibufferp)) @@ -259,8 +263,9 @@ variable for an explanation of the defaults (in comments). See evilmi-outer-text-object evilmi-inner-text-object) :config (global-evil-matchit-mode 1) :init - (map! [remap evil-jump-item] #'evilmi-jump-items - :textobj "%" #'evilmi-inner-text-object #'evilmi-outer-text-object) + (define-key! 'global [remap evil-jump-item] #'evilmi-jump-items) + (define-key evil-inner-text-objects-map "%" #'evilmi-inner-text-object) + (define-key evil-outer-text-objects-map "%" #'evilmi-outer-text-object) :config ;; Fixes #519 where d% wouldn't leave a dangling end-parenthesis (evil-set-command-properties 'evilmi-jump-items :type 'inclusive :jump t) @@ -374,8 +379,9 @@ the new algorithm is confusing, like in python or ruby." evil-visualstar/begin-search-forward evil-visualstar/begin-search-backward) :init - (map! :v "*" #'evil-visualstar/begin-search-forward - :v "#" #'evil-visualstar/begin-search-backward) + (evil-define-key* 'visual 'global + "*" #'evil-visualstar/begin-search-forward + "#" #'evil-visualstar/begin-search-backward) :config (global-evil-visualstar-mode 1)) @@ -402,7 +408,7 @@ the new algorithm is confusing, like in python or ruby." ;; 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) + (evil-define-key* '(normal emacs) [escape] #'mc/keyboard-quit) (defvar +evil--mc-compat-evil-prev-state nil) (defvar +evil--mc-compat-mark-was-active nil) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index cb02a6558..cd053efe3 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -110,7 +110,7 @@ compilation database is present in the project.") ;; Smartparens and cc-mode both try to autoclose angle-brackets intelligently. ;; The result isn't very intelligent (causes redundant characters), so just do ;; it ourselves. - (map! :map c++-mode-map "<" nil ">" nil) + (define-key! c++-mode-map "<" nil ">" nil) ;; ...and leave it to smartparens (sp-with-modes '(c++-mode objc-mode) @@ -228,7 +228,7 @@ compilation database is present in the project.") (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) + (define-key! (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) (add-hook 'rtags-after-find-file-hook #'recenter) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index a1fc837b2..aca1c81d5 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -41,44 +41,45 @@ (ess-toggle-underscore t) (set! :repl 'ess-mode #'+ess/r-repl) (set! :lookup 'ess-mode :documentation #'ess-display-help-on-object) - (map! (:map ess-doc-map - "h" #'ess-display-help-on-object - "p" #'ess-R-dv-pprint - "t" #'ess-R-dv-ctable) - (:map ess-mode-map - "" #'ess-eval-line - "" #'comint-next-input - "" #'comint-previous-input - (:localleader - :nv "," #'ess-eval-region-or-function-or-paragraph-and-step - :n "'" #'R - :n "" #'ess-switch-to-inferior-or-script-buffer - :n "" #'ess-switch-process - :n ;; REPL - :n "B" #'ess-eval-buffer-and-go - :n "b" #'ess-eval-buffer - :nv "d" #'ess-eval-region-or-line-and-step - :n "D" #'ess-eval-function-or-paragraph-and-step - :n "L" #'ess-eval-line-and-go - :n "l" #'ess-eval-line - :nv "R" #'ess-eval-region-and-go - :nv "r" #'ess-eval-region - :n "F" #'ess-eval-function-and-go - :n "f" #'ess-eval-function - ;; predefined keymaps - :n "h" #'ess-doc-map - :n "x" #'ess-extra-map - :n "p" #'ess-r-package-dev-map - :n "v" #'ess-dev-map - ;; noweb - :n "cC" #'ess-eval-chunk-and-go - :n "cc" #'ess-eval-chunk - :n "cd" #'ess-eval-chunk-and-step - :n "cm" #'ess-noweb-mark-chunk - :n "cp" #'ess-noweb-previous-chunk - :n "cn" #'ess-noweb-next-chunk)))) + (define-key! ess-doc-map + "h" #'ess-display-help-on-object + "p" #'ess-R-dv-pprint + "t" #'ess-R-dv-ctable) + (define-key! ess-doc-map + [s-return] #'ess-eval-line + [up] #'comint-next-input + [down] #'comint-previous-input) + (map! :map ess-mode-map + :localleader + :nv "," #'ess-eval-region-or-function-or-paragraph-and-step + :n "'" #'R + :n "" #'ess-switch-to-inferior-or-script-buffer + :n "" #'ess-switch-process + :n ;; REPL + :n "B" #'ess-eval-buffer-and-go + :n "b" #'ess-eval-buffer + :nv "d" #'ess-eval-region-or-line-and-step + :n "D" #'ess-eval-function-or-paragraph-and-step + :n "L" #'ess-eval-line-and-go + :n "l" #'ess-eval-line + :nv "R" #'ess-eval-region-and-go + :nv "r" #'ess-eval-region + :n "F" #'ess-eval-function-and-go + :n "f" #'ess-eval-function + ;; predefined keymaps + :n "h" #'ess-doc-map + :n "x" #'ess-extra-map + :n "p" #'ess-r-package-dev-map + :n "v" #'ess-dev-map + ;; noweb + :n "cC" #'ess-eval-chunk-and-go + :n "cc" #'ess-eval-chunk + :n "cd" #'ess-eval-chunk-and-step + :n "cm" #'ess-noweb-mark-chunk + :n "cp" #'ess-noweb-previous-chunk + :n "cn" #'ess-noweb-next-chunk)) ;; `ess-smart-equals-mode' -(add-hook! (ess-mode inferior-ess) +(add-hook! '(ess-mode-hook inferior-ess-hook) #'ess-smart-equals-mode) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 585873e53..bf76d3daf 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -52,7 +52,7 @@ LaTeX-fill-break-at-separators nil LaTeX-item-indent 0) ; item indentation. - (map! :map LaTeX-mode-map "C-j" nil) + (define-key LaTeX-mode-map "C-j" nil) ;; Do not prompt for Master files, this allows auto-insert to add templates ;; to .tex files @@ -120,10 +120,10 @@ :config (map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode)) (map-put TeX-view-program-selection 'output-pdf '("preview-pane")) - (map! :map doc-view-mode-map - "ESC" #'delete-window - "q" #'delete-window - "k" (λ! (quit-window) (delete-window)))) + (define-key! doc-view-mode-map + (kbd "ESC") #'delete-window + "q" #'delete-window + "k" (λ! (quit-window) (delete-window)))) (def-package! reftex @@ -170,7 +170,7 @@ bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir) bibtex-completion-pdf-open-function (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath)))) - (map! :map bibtex-mode-map "C-c \\" #'bibtex-fill-entry)) + (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) (def-package! auctex-latexmk diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 230d41f01..c28067b72 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -18,32 +18,35 @@ (add-hook 'markdown-mode-hook #'+markdown|set-fill-column-and-line-spacing) (add-hook 'markdown-mode-hook #'auto-fill-mode) - (map! (:map markdown-mode-map - [remap find-file-at-point] #'markdown-follow-thing-at-point - "M-*" #'markdown-insert-list-item - "M-b" #'markdown-insert-bold - "M-i" #'markdown-insert-italic - "M-`" #'+markdown/insert-del - :m "gj" #'markdown-next-visible-heading - :m "gk" #'markdown-previous-visible-heading - ;; Assumes you have a markdown renderer plugin in chrome - :n "M-r" #'browse-url-of-file - ;; TODO: Make context sensitive - :m "]h" #'markdown-next-visible-heading - :m "[h" #'markdown-previous-visible-heading - :m "[p" #'markdown-promote - :m "]p" #'markdown-demote - :m "[l" #'markdown-next-link - :m "]l" #'markdown-previous-link - :i "M--" #'markdown-insert-hr - - (:localleader - :nv "o" #'markdown-open - :nv "b" #'markdown-preview - (:prefix "i" - :nv "t" #'markdown-toc-generate-toc - :nv "i" #'markdown-insert-image - :nv "l" #'markdown-insert-link))))) + (define-key! markdown-mode-map + [remap find-file-at-point] #'markdown-follow-thing-at-point + (kbd "M-*") #'markdown-insert-list-item + (kbd "M-b") #'markdown-insert-bold + (kbd "M-i") #'markdown-insert-italic + (kbd "M-`") #'+markdown/insert-del) + (when (featurep! :feature evil +everywhere) + (evil-define-key* 'motion markdown-mode-map + "gj" #'markdown-next-visible-heading + "gk" #'markdown-previous-visible-heading + ;; TODO: Make context sensitive + "]h" #'markdown-next-visible-heading + "[h" #'markdown-previous-visible-heading + "[p" #'markdown-promote + "]p" #'markdown-demote + "[l" #'markdown-next-link + "]l" #'markdown-previous-link) + (evil-define-key* 'insert markdown-mode-map + (kbd "M--") #'markdown-insert-hr) + (evil-define-key* 'normal markdown-mode-map + (kbd "M-r") #'browse-url-of-file)) + (map! :map markdown-mode-map + :localleader + :nv "o" #'markdown-open + :nv "b" #'markdown-preview + (:prefix "i" + :nv "t" #'markdown-toc-generate-toc + :nv "i" #'markdown-insert-image + :nv "l" #'markdown-insert-link))) (def-package! markdown-toc diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 3b590d1a9..909695e77 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -41,7 +41,7 @@ string). Stops at the first function to return non-nil.") (advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library) ;; I prefer C-c C-c for confirming over the default C-c ' - (map! :map org-src-mode-map "C-c C-c" #'org-edit-src-exit) + (define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) ;; In a recent update, `org-babel-get-header' was removed from org-mode, which ;; is something a fair number of babel plugins use. So until those plugins diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 3228632ff..c2e290cec 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -42,9 +42,8 @@ (add-to-list 'doom-real-buffer-functions #'+ein-buffer-p nil #'eq) ;; Ace-link on notebook list buffers - (map! :after ein-notebooklist - :map ein:notebooklist-mode-map - "o" #'+ein/ace-link-ein) + (after! ein-notebooklist + (define-key ein:notebooklist-mode-map "o" #'+ein/ace-link-ein)) ;; add hydra (defhydra +ein/hydra (:hint t :color red) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 922361fdd..e05bf4b73 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -31,12 +31,12 @@ (set! :popup "^\\*Password-Store" '((side . left) (size . 0.25)) '((quit))) - (map! :map pass-mode-map - "j" #'pass-next-entry - "k" #'pass-prev-entry - "d" #'pass-kill - "C-j" #'pass-next-directory - "C-k" #'pass-next-directory)) + (define-key! pass-mode-map + "j" #'pass-next-entry + "k" #'pass-prev-entry + "d" #'pass-kill + "\C-j" #'pass-next-directory + "\C-k" #'pass-next-directory)) ;; Is built into Emacs 26+ diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 85a4be1f8..27da28d94 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -6,9 +6,9 @@ (unless noninteractive (pdf-tools-install)) - (map! :map pdf-view-mode-map - "q" #'kill-this-buffer - doom-leader-key nil) + (define-key! pdf-view-mode-map + "q" #'kill-this-buffer + (kbd doom-leader-key) nil) (setq-default pdf-view-display-size 'fit-page) ;; Turn off cua so copy works diff --git a/modules/tools/prodigy/config.el b/modules/tools/prodigy/config.el index e9ba7ca32..b06d7278a 100644 --- a/modules/tools/prodigy/config.el +++ b/modules/tools/prodigy/config.el @@ -9,5 +9,5 @@ (advice-add #'prodigy-services :around #'+prodigy*services) - (map! :map prodigy-mode-map "d" #'+prodigy/delete)) + (define-key prodigy-mode-map "d" #'+prodigy/delete)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 01c1f0d14..5749fb3b6 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -66,35 +66,46 @@ Possible values: (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) - (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) + (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t) + ;; + (setq-local which-key-idle-delay 0.01) + (setq-local which-key-min-display-lines 9)) -(map! :map +doom-dashboard-mode-map - "n" #'forward-button - :gn [down] #'forward-button - :gn "C-n" #'forward-button - :gn [tab] #'forward-button - :gn "TAB" #'forward-button - "p" #'backward-button - :gn [up] #'backward-button - :gn "C-p" #'backward-button - :gn [backtab] #'backward-button - :gn "S-TAB" #'backward-button - (:when (featurep! :feature evil) - :m "j" #'forward-button - :m "k" #'backward-button - [remap evil-next-visual-line] #'forward-button - [remap evil-previous-visual-line] #'backward-button +(define-key! +doom-dashboard-mode-map + "n" #'forward-button + "p" #'backward-button + "\C-n" #'forward-button + "\C-p" #'backward-button + [down] #'forward-button + [up] #'backward-button + [tab] #'forward-button + [backtab] #'backward-button) - [remap evil-delete] #'ignore - [remap evil-delete-line] #'ignore - [remap evil-insert] #'ignore - [remap evil-append] #'ignore - [remap evil-replace] #'ignore - [remap evil-replace-state] #'ignore - [remap evil-change] #'ignore - [remap evil-change-line] #'ignore - [remap evil-visual-char] #'ignore - [remap evil-visual-line] #'ignore)) +(when (featurep 'evil) + (evil-define-key* 'normal +doom-dashboard-mode-map + "j" #'forward-button + "k" #'backward-button + "n" #'forward-button + "p" #'backward-button + "\C-n" #'forward-button + "\C-p" #'backward-button + [down] #'forward-button + [up] #'backward-button + [tab] #'forward-button + [backtab] #'backward-button) + (define-key! +doom-dashboard-mode-map + [remap evil-next-visual-line] #'forward-button + [remap evil-previous-visual-line] #'backward-button + [remap evil-delete] #'ignore + [remap evil-delete-line] #'ignore + [remap evil-insert] #'ignore + [remap evil-append] #'ignore + [remap evil-replace] #'ignore + [remap evil-replace-state] #'ignore + [remap evil-change] #'ignore + [remap evil-change-line] #'ignore + [remap evil-visual-char] #'ignore + [remap evil-visual-line] #'ignore)) ;; From b81ac61d84896277c877310e7a1cce3e0540f953 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 15:50:46 +0200 Subject: [PATCH 1656/4235] Remove unnecessary markdown-toc def-package! block markdown-toc-generate-toc is autoloaded by the package, so we don't need to. --- modules/lang/markdown/config.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index c28067b72..74c8b5601 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -47,8 +47,3 @@ :nv "t" #'markdown-toc-generate-toc :nv "i" #'markdown-insert-image :nv "l" #'markdown-insert-link))) - - -(def-package! markdown-toc - :commands markdown-toc-generate-toc) - From 32a2a2b64df2ecc5471f8f7f08c80693c71c0539 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 15:51:59 +0200 Subject: [PATCH 1657/4235] General, minor refactor + Group hooks with add-hook! + Sharpquote elfeed call + Extract elfeed buffer detector into function and ensure idempotency of doom-real-buffer-functions --- modules/app/rss/autoload.el | 2 +- modules/app/rss/config.el | 5 +++-- modules/lang/python/config.el | 4 ++-- modules/tools/pdf/config.el | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 19268ad78..176f253df 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -4,7 +4,7 @@ (defun =rss () "Activate (or switch to) `elfeed' in its workspace." (interactive) - (call-interactively 'elfeed)) + (call-interactively #'elfeed)) ;;;###autoload (defun +rss/quit () diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 606bbaedf..1de35ecea 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -33,8 +33,9 @@ paths.") (make-directory elfeed-db-directory t) ;; Ensure elfeed buffers are treated as real - (push (lambda (buf) (string-match-p "^\\*elfeed" (buffer-name buf))) - doom-real-buffer-functions) + (defun +rss-buffer-p (buf) + (string-match-p "^\\*elfeed" (buffer-name buf))) + (add-to-list 'doom-real-buffer-functions #'+rss-buffer-p nil #'eq) ;; Enhance readability of a post (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 89067bc3e..e51b513a7 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -131,5 +131,5 @@ environment variables." ;; (when (featurep! :feature evil +everywhere) - (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps) - (add-hook 'nose-mode-hook #'evil-normalize-keymaps)) + (add-hook! '(anaconda-mode-hook nose-mode-hook) + #'evil-normalize-keymaps)) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 27da28d94..cec7d69d5 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -16,7 +16,7 @@ ;; Custom modeline that removes useless info and adds page numbers (when (featurep! :ui doom-modeline) (load! "+modeline") - (add-hook! pdf-tools-enabled (doom-set-modeline 'pdf-tools-modeline))) + (add-hook! #'pdf-tools-enabled-hook (doom-set-modeline 'pdf-tools-modeline))) ;; Handle PDF-tools related popups better (set! :popup "^\\*Outline*" '((side . right) (size . 40)) '((select))) ;; TODO: Add additional important windows that should be handled differently From 37b9beb9c9c9c0bb608fbc914274866d934fb53d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 15:58:49 +0200 Subject: [PATCH 1658/4235] Fix doom//upgrade not detecting updates --- core/core-dispatcher.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 91b64eb81..ffb301334 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -260,7 +260,7 @@ problems with doom." (unless rev (error "Couldn't detect Doom's version. Is %s a repo?" (abbreviate-file-name doom-emacs-dir))) - (unless (equal current-rev rev) + (when (equal current-rev rev) (user-error "Doom is up to date!")) (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" current-rev rev) @@ -277,9 +277,11 @@ problems with doom." (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) (doom//refresh) (message "Done! Please restart Emacs for changes to take effect")))) + (user-error + (message "%s Aborting." (error-message-string e))) (error (message "There was an unexpected error.\n\n%s -> %s\n\nOutput:\n%s" - (car e) (error-message-string e) + (car e) (buffer-string)))))))) (defun doom//quickstart () From e2bf5206825afeb8714931359fe8542e933a2b6f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 16:18:02 +0200 Subject: [PATCH 1659/4235] Fix dwim RET keybind in evil org-mode Accidentally removed in 1e81a354 --- modules/lang/org/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a3173eb48..4220fe200 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -296,6 +296,8 @@ between the two." ;; more intuitive RET keybinds (evil-define-key* 'insert evil-org-mode-map [return] #'org-return-indent) + (evil-define-key* 'normal evil-org-mode-map + [return] #'+org/dwim-at-point) (evil-define-key* '(insert normal) evil-org-mode-map [M-return] (λ! (+org/insert-item 'below)) [S-M-return] (λ! (+org/insert-item 'above))) From e71cd9348864fec629a1ffa6fdc5779def3ffea1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 17:22:23 +0200 Subject: [PATCH 1660/4235] Don't change which-key settings in doom dashboard --- modules/ui/doom-dashboard/config.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 5749fb3b6..a8ec6313c 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -66,10 +66,7 @@ Possible values: (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) - (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t) - ;; - (setq-local which-key-idle-delay 0.01) - (setq-local which-key-min-display-lines 9)) + (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) (define-key! +doom-dashboard-mode-map "n" #'forward-button From 48fdc8a5b5cea38962bfd720895bdd3433513257 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 18:11:49 +0200 Subject: [PATCH 1661/4235] feature/evil: fix missing keymap in key def --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 5f6ad5f43..bcdb682eb 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -408,7 +408,7 @@ the new algorithm is confusing, like in python or ruby." ;; 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 - (evil-define-key* '(normal emacs) [escape] #'mc/keyboard-quit) + (evil-define-key* '(normal emacs) mc/keymap [escape] #'mc/keyboard-quit) (defvar +evil--mc-compat-evil-prev-state nil) (defvar +evil--mc-compat-mark-was-active nil) From 7acfcf907a92bc7feccaa8b79b8b474ae3add54b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 22:00:40 +0200 Subject: [PATCH 1662/4235] Add warning prompt to byte-compile Byte-compiling should be a considered an advanced workflow. Warn users of the dangers. The prompt can be suppressed with the -y option. e.g. bin/doom -y compile You won't get the prompt for byte-compiling :core or :plugins however. --- core/autoload/modules.el | 205 +++++++++++++++++++++------------------ 1 file changed, 110 insertions(+), 95 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index a41b4430a..36af02fb1 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -270,101 +270,116 @@ these files. If RECOMPILE-P is non-nil, only recompile out-of-date files." (interactive (list nil current-prefix-arg)) - (let ((default-directory doom-emacs-dir)) - (unless recompile-p - (doom//clean-byte-compiled-files)) - (let ((total-ok 0) - (total-fail 0) - (total-noop 0) - compile-plugins-p - targets) - (dolist (module (delete-dups modules) (nreverse targets)) - (pcase module - (":core" (push doom-core-dir targets)) - (":private" (push doom-private-dir targets)) - (":plugins" - (dolist (file (doom-files-in package-user-dir :match "\\.elc$")) - (ignore-errors (delete-file file))) - (byte-recompile-directory package-user-dir 0 t) - (setq compile-plugins-p t - modules (delete ":plugins" modules))) - ((pred file-directory-p) - (push module targets)) - ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) - (push (doom-module-locate-path - (intern (format ":%s" (match-string 1 module))) - (intern (match-string 2 module))) - targets)))) - (cl-block 'byte-compile - ;; If we're just here to byte-compile our plugins, we're done! - (and (not modules) - compile-plugins-p - (cl-return-from 'byte-compile t)) - (unless targets - (let ((inhibit-message t) - noninteractive) - ;; But first we must be sure that Doom and your private config have - ;; been fully loaded. Which usually aren't so in an noninteractive - ;; session. - (doom//reload-autoloads) - (doom-initialize t))) - ;; If no targets were supplied, then we use your module list. - (unless modules - (doom-initialize-modules t) - (setq targets (append (list doom-core-dir) - (doom-module-load-path)))) - ;; Assemble el files we want to compile; taking into account that - ;; MODULES may be a list of MODULE/SUBMODULE strings from the command - ;; line. - (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) - (unless target-files - (if targets - (message "Couldn't find any valid targets") - (message "No targets to %scompile" (if recompile-p "re" ""))) - (cl-return-from 'byte-compile)) - (condition-case ex - (let ((use-package-expand-minimally t)) - ;; Always compile private init file - (push (expand-file-name "init.el" doom-private-dir) target-files) - (push (expand-file-name "init.el" doom-emacs-dir) target-files) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) - (if (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p target elc-file)))) - (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) - (not (doom-file-cookie-p target))) - 'no-byte-compile - (byte-compile-file target))) - (short-name (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (cl-incf - (cond ((eq result 'no-byte-compile) - (print! (dark (white "⚠ Ignored %s" short-name))) - total-noop) - ((null result) - (print! (red "✕ Failed to compile %s" short-name)) - total-fail) - (t - (print! (green "✓ Compiled %s" short-name)) - (quiet! (load target t t)) - total-ok)))) - (cl-incf total-noop))) - (print! - (bold - (color (if (= total-fail 0) 'green 'red) - "%s %d/%d file(s) (%d ignored)" - (if recompile-p "Recompiled" "Compiled") - total-ok (- (length target-files) total-noop) - total-noop)))) - (error - (print! (red "\n%%s\n\n%%s\n\n%%s") - "There were breaking errors." - (error-message-string ex) - "Reverting changes...") - (quiet! (doom//clean-byte-compiled-files)) - (print! (yellow "Finished (nothing was byte-compiled)"))))))))) + (let ((default-directory doom-emacs-dir) + (total-ok 0) + (total-fail 0) + (total-noop 0) + compile-plugins-p + targets) + (dolist (module (delete-dups modules) (nreverse targets)) + (pcase module + (":core" (push doom-core-dir targets)) + (":private" (push doom-private-dir targets)) + (":plugins" + (dolist (file (doom-files-in package-user-dir :match "\\.elc$")) + (ignore-errors (delete-file file))) + (byte-recompile-directory package-user-dir 0 t) + (setq compile-plugins-p t + modules (delete ":plugins" modules))) + ((pred file-directory-p) + (push module targets)) + ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) + (push (doom-module-locate-path + (intern (format ":%s" (match-string 1 module))) + (intern (match-string 2 module))) + targets)))) + (cl-block 'byte-compile + (unless (or (equal modules '(":core")) + recompile-p) + (unless (and (not doom-auto-accept) + (y-or-n-p + (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" + "efforts to debug issues. It is not recommended you do it if you frequently\n" + "tinker with your Emacs config.\n\n" + "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" + "Doom core files, as these don't change often.\n\n" + "If you have issues, please make sure byte-compilation isn't the cause by using\n" + "`bin/doom clean` to clear out your *.elc files.\n\n" + "Byte-compile anyway?"))) + (message "Aborting.") + (cl-return-from 'byte-compile))) + ;; If we're just here to byte-compile our plugins, we're done! + (and (not modules) + compile-plugins-p + (cl-return-from 'byte-compile t)) + (unless recompile-p + (doom//clean-byte-compiled-files)) + (unless targets + (message "Regenerating autoloads files (if necessary)") + (let ((inhibit-message t) + noninteractive) + ;; But first we must be sure that Doom and your private config have + ;; been fully loaded. Which usually aren't so in an noninteractive + ;; session. + (quiet! (doom//reload-autoloads)) + (doom-initialize t))) + ;; If no targets were supplied, then we use your module list. + (unless modules + (doom-initialize-modules t) + (setq targets (append (list doom-core-dir) + (doom-module-load-path)))) + ;; Assemble el files we want to compile; taking into account that + ;; MODULES may be a list of MODULE/SUBMODULE strings from the command + ;; line. + (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) + (unless target-files + (if targets + (message "Couldn't find any valid targets") + (message "No targets to %scompile" (if recompile-p "re" ""))) + (cl-return-from 'byte-compile)) + (condition-case ex + (let ((use-package-expand-minimally t)) + ;; Always compile private init file + (push (expand-file-name "init.el" doom-private-dir) target-files) + (push (expand-file-name "init.el" doom-emacs-dir) target-files) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) + (if (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p target elc-file)))) + (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) + (not (doom-file-cookie-p target))) + 'no-byte-compile + (byte-compile-file target))) + (short-name (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (cl-incf + (cond ((eq result 'no-byte-compile) + (print! (dark (white "⚠ Ignored %s" short-name))) + total-noop) + ((null result) + (print! (red "✕ Failed to compile %s" short-name)) + total-fail) + (t + (print! (green "✓ Compiled %s" short-name)) + (quiet! (load target t t)) + total-ok)))) + (cl-incf total-noop))) + (print! + (bold + (color (if (= total-fail 0) 'green 'red) + "%s %d/%d file(s) (%d ignored)" + (if recompile-p "Recompiled" "Compiled") + total-ok (- (length target-files) total-noop) + total-noop)))) + (error + (print! (red "\n%%s\n\n%%s\n\n%%s") + "There were breaking errors." + (error-message-string ex) + "Reverting changes...") + (quiet! (doom//clean-byte-compiled-files)) + (print! (yellow "Finished (nothing was byte-compiled)")))))))) ;;;###autoload (defun doom//clean-byte-compiled-files () From 0018d1c80970659112c0bc638dd79c1377e9437f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 23:27:06 +0200 Subject: [PATCH 1663/4235] Change default company-backends to capf+yasnippet And list their results separately. --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c56290ce8..04e540c69 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -16,7 +16,7 @@ '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) company-backends - '(company-capf company-dabbrev company-ispell company-yasnippet) + '((:separate company-capf company-yasnippet)) company-transformers '(company-sort-by-occurrence)) :config (global-company-mode +1)) From cd0e9826ac7b6368ab9f0741832662fa7aab4ba7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 23:28:44 +0200 Subject: [PATCH 1664/4235] Remove company-statistics package Was a little slow, not terribly helpful and would clash with certain company backends (like company-lsp). --- modules/completion/company/config.el | 6 ------ modules/completion/company/packages.el | 1 - 2 files changed, 7 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 04e540c69..dac4ce257 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -29,12 +29,6 @@ :config (setq company-idle-delay 0.2)) -(def-package! company-statistics - :hook (company-mode . company-statistics-mode) - :init (advice-add #'company-statistics-mode :around #'doom*shut-up) - :config (setq company-statistics-file (concat doom-cache-dir "company-stats-cache.el"))) - - (def-package! company-box :when (and EMACS26+ (featurep! +childframe)) :hook (company-mode . company-box-mode) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index ee90c7e62..3de2d1da3 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -3,6 +3,5 @@ (package! company) (package! company-dict) -(package! company-statistics) (when (and EMACS26+ (featurep! +childframe)) (package! company-box)) From 818cb27724ce55798fe9840239486fcd3812eabb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 23:43:27 +0200 Subject: [PATCH 1665/4235] Refactor feature/file-templates This removes its dependency on the feature/snippets. --- modules/feature/file-templates/autoload.el | 11 +++++++++++ modules/feature/file-templates/config.el | 22 ++++++++++------------ modules/feature/file-templates/packages.el | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 348c14915..649801d02 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -73,6 +73,17 @@ evil is loaded and enabled)." (file-relative-name path doom-emacs-dir)) ((abbreviate-file-name path))))) +;;;###autoload +(defun +file-template-p (rule) + "Return t if RULE applies to the current buffer." + (let ((pred (car rule)) + (plist (cdr rule))) + (and (cond ((and (stringp pred) buffer-file-name) (string-match-p pred buffer-file-name)) + ((symbolp pred) (eq major-mode pred))) + (or (not (plist-member plist :when)) + (funcall (plist-get plist :when) buffer-file-name)) + rule))) + ;; ;; Commands diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 8a9963c3d..d54679be4 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -1,7 +1,5 @@ ;;; feature/file-templates/config.el -*- lexical-binding: t; -*- -(require! :feature snippets) - (defvar +file-templates-dir (expand-file-name "templates/" (file-name-directory load-file-name)) "The path to a directory of yasnippet folders to use for file templates.") @@ -103,16 +101,6 @@ more information.") ;; Library ;; -(defun +file-template-p (rule) - "Return t if RULE applies to the current buffer." - (let ((pred (car rule)) - (plist (cdr rule))) - (and (cond ((and (stringp pred) buffer-file-name) (string-match-p pred buffer-file-name)) - ((symbolp pred) (eq major-mode pred))) - (or (not (plist-member plist :when)) - (funcall (plist-get plist :when) buffer-file-name)) - rule))) - (defun +file-templates-in-emacs-dirs-p (file) "Returns t if FILE is in Doom or your private directory." (or (file-in-directory-p file doom-private-dir) @@ -133,6 +121,16 @@ must be non-read-only, empty, and there must be a rule in ;; Bootstrap ;; +(def-package! yasnippet + :unless (featurep! :feature snippets) + :config + (setq yas-verbosity (if doom-debug-mode 3 0) + yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) + yas-snippet-dirs nil) + ;; Exit snippets on ESC from normal mode + (add-hook 'doom-escape-hook #'yas-abort-snippet)) + + (defun +file-templates|init () (after! yasnippet (add-to-list 'yas-snippet-dirs '+file-templates-dir 'append #'eq)) diff --git a/modules/feature/file-templates/packages.el b/modules/feature/file-templates/packages.el index 8259e198e..0c62823ab 100644 --- a/modules/feature/file-templates/packages.el +++ b/modules/feature/file-templates/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/file-templates/packages.el -(depends-on! :feature snippets) +(package! yasnippet) From 796af69c28193f882e6b48038a52975b19ee3231 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 23:52:21 +0200 Subject: [PATCH 1666/4235] Move define-key! macro to core-lib --- core/core-keybinds.el | 21 --------------------- core/core-lib.el | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 95c7d0881..6c02ab1f6 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -153,27 +153,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (defvar doom--defer nil) (defvar doom--local nil) -(defmacro define-key! (keymaps key def &rest rest) - "TODO" - (declare (indent defun)) - (if (and (listp keymaps) - (not (eq (car-safe keymaps) 'quote))) - `(dolist (map (list ,@keymaps)) - ,(macroexpand `(define-key! map ,key ,def ,@rest))) - (when (eq (car-safe keymaps) 'quote) - (pcase (cadr keymaps) - (`global (setq keymaps '(current-global-map))) - (`local (setq keymaps '(current-local-map))) - (x (error "%s is not a valid keymap" x)))) - `(let ((map ,keymaps)) - (define-key map ,key ,def) - ,@(let (forms) - (while rest - (let ((key (pop rest)) - (def (pop rest))) - (push `(define-key map ,key ,def) forms))) - (nreverse forms))))) - (defmacro map! (&rest rest) "A nightmare of a key-binding macro that will use `evil-define-key*', `define-key', `local-set-key' and `global-set-key' depending on context and diff --git a/core/core-lib.el b/core/core-lib.el index 020f9fb12..30a2f07fd 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -387,5 +387,33 @@ For example: (file-exists-p (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" (doom--resolve-path-forms spec directory)) +(defmacro define-key! (keymaps key def &rest rest) + "Like `define-key', but accepts a variable number of KEYMAPS and/or KEY+DEFs. + +KEYMAPS can also be (or contain) 'global or 'local, to make this equivalent to +using `global-set-key' and `local-set-key'. + +KEY is a key string or vector. It is *not* piped through `kbd'." + (declare (indent defun)) + (or (cl-evenp (length rest)) + (signal 'wrong-number-of-arguments (list 'evenp (length rest)))) + (if (and (listp keymaps) + (not (eq (car-safe keymaps) 'quote))) + `(dolist (map (list ,@keymaps)) + ,(macroexpand `(define-key! map ,key ,def ,@rest))) + (when (eq (car-safe keymaps) 'quote) + (pcase (cadr keymaps) + (`global (setq keymaps '(current-global-map))) + (`local (setq keymaps '(current-local-map))) + (x (error "%s is not a valid keymap" x)))) + `(let ((map ,keymaps)) + (define-key map ,key ,def) + ,@(let (forms) + (while rest + (let ((key (pop rest)) + (def (pop rest))) + (push `(define-key map ,key ,def) forms))) + (nreverse forms))))) + (provide 'core-lib) ;;; core-lib.el ends here From b53df20dd544c57b90b47b1420f3d4fae3292b68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Jun 2018 23:56:25 +0200 Subject: [PATCH 1667/4235] Minor refactor of associate! macro --- core/core-lib.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 30a2f07fd..4849f8cc3 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -353,17 +353,18 @@ The available conditions are: (user-error "associate! :files expects a string or list of strings")) (let ((hook-name (intern (format "doom--init-mode-%s" mode)))) `(progn - (defun ,hook-name () - (when (and (fboundp ',mode) + (fset ',hook-name + (lambda () + (and (fboundp ',mode) (not (bound-and-true-p ,mode)) (and buffer-file-name (not (file-remote-p buffer-file-name))) ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) - ,(if files (doom--resolve-path-forms - (if (stringp (car files)) (cons 'and files) files) - '(doom-project-root)) - t) - ,(or pred-form t)) - (,mode 1))) + ,(or (not files) + (doom--resolve-path-forms + (if (stringp (car files)) (cons 'and files) files) + '(doom-project-root))) + ,(or pred-form t) + (,mode 1)))) ,@(if (and modes (listp modes)) (cl-loop for hook in (doom--resolve-hook-forms modes) collect `(add-hook ',hook #',hook-name)) From 9ba76b60dc48d4d69a635a3f97488c83df00684a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 00:06:01 +0200 Subject: [PATCH 1668/4235] Refactor require! macro --- core/core-packages.el | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index c459e65d1..8987c6094 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -644,29 +644,26 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." filename) ,noerror ,(not doom-debug-mode))) -(defmacro require! (module submodule &optional reload-p &rest plist) - "Loads the module specified by MODULE (a property) and SUBMODULE (a symbol). - -The module is only loaded once. If RELOAD-P is non-nil, load it again." - (let ((enabled-p (doom-module-p module submodule))) - (when (or (not enabled-p) plist) - (apply #'doom-module-set module submodule - (mapcar #'eval plist))) - (when (or reload-p (not enabled-p)) - (let ((module-path (doom-module-locate-path module submodule))) - (if (file-directory-p module-path) - `(condition-case-unless-debug ex - (let ((doom--current-module ',(cons module submodule))) - (load! "init" ,module-path :noerror) - (let ((doom--stage 'config)) - (load! "config" ,module-path :noerror))) - ('error - (lwarn 'doom-modules :error - "%s in '%s %s' -> %s" - (car ex) ,module ',submodule - (error-message-string ex)))) - (warn 'doom-modules :warning "Couldn't find module '%s %s'" - module submodule)))))) +(defmacro require! (category module &rest plist) + "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." + (let ((enabled-p (doom-module-p category module)) + (doom-modules (copy-hash-table doom-modules))) + (apply #'doom-module-set category module + (mapcar #'eval plist)) + (let ((module-path (doom-module-locate-path category module))) + (if (directory-name-p module-path) + `(condition-case-unless-debug ex + (let ((doom--current-module ',(cons category module))) + (load! "init" ,module-path :noerror) + (let ((doom--stage 'config)) + (load! "config" ,module-path :noerror))) + ('error + (lwarn 'doom-modules :error + "%s in '%s %s' -> %s" + (car ex) ,category ',module + (error-message-string ex)))) + (warn 'doom-modules :warning "Couldn't find module '%s %s'" + category module))))) (defmacro featurep! (module &optional submodule flag) "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if From b2030c6ed3bbe74bc895839035889fe0731d2aa2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 00:07:03 +0200 Subject: [PATCH 1669/4235] Refactor doom/escape Now returns first hook that returns non-nil; this makes it a little easier to debug doom-escape-hook. --- core/core-keybinds.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 6c02ab1f6..82b4fe966 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -35,11 +35,11 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; quit the minibuffer if open. (abort-recursive-edit)) ;; Run all escape hooks. If any returns non-nil, then stop there. - ((run-hook-with-args-until-success 'doom-escape-hook)) + ((cl-find-if #'funcall doom-escape-hook)) ;; don't abort macros ((or defining-kbd-macro executing-kbd-macro) nil) ;; Back to the default - (t (keyboard-quit)))) + ((keyboard-quit)))) (global-set-key [remap keyboard-quit] #'doom/escape) From 7cd97588e639c994275bf65ed98a852f1452dd1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 00:11:13 +0200 Subject: [PATCH 1670/4235] lang/cc: change default standard to c++1z --- 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 cd053efe3..6bed531d6 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -8,7 +8,7 @@ database.") (defvar +cc-default-compiler-options `((c-mode . nil) (c++-mode - . ,(list "-std=c++11" ; use C++11 by default + . ,(list "-std=c++1z" ; use C++17 draft by default (when IS-MAC ;; NOTE beware: you'll get abi-inconsistencies when passing ;; std-objects to libraries linked with libstdc++ (e.g. if you From b7d619fc8e992a47a1ed305305569bea8ff25d44 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 00:12:02 +0200 Subject: [PATCH 1671/4235] Fix objc-mode auto-mode-alist regexp It had no line terminator. COME WITH ME IF YOU WANT TO LIVE. --- 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 6bed531d6..16389c367 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -25,7 +25,7 @@ compilation database is present in the project.") (def-package! cc-mode :commands (c-mode c++-mode objc-mode java-mode) - :mode ("\\.mm" . objc-mode) + :mode ("\\.mm\\'" . objc-mode) :preface (defalias 'cpp-mode 'c++-mode) From 6729de9918006942211297adba595196b5df5590 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 00:12:51 +0200 Subject: [PATCH 1672/4235] evil-goggles-duration = 0.1 Display a little longer. --- modules/ui/evil-goggles/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/evil-goggles/config.el index 3d1f65fe2..df185ac11 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/evil-goggles/config.el @@ -4,7 +4,7 @@ :when (featurep! :feature evil) :after-call pre-command-hook :init - (setq evil-goggles-duration 0.05 + (setq evil-goggles-duration 0.1 evil-goggles-pulse nil ; too slow ;; evil-goggles provides a good indicator of what has been affected. ;; delete/change is obvious, so I'd rather disable it for these. From baa405babb08530b36ff8ce670c9c57e5d01159d Mon Sep 17 00:00:00 2001 From: crshd Date: Mon, 4 Jun 2018 09:17:04 +0200 Subject: [PATCH 1673/4235] Disable lui-mode line wrapping regardless of :feature spellcheck --- modules/app/irc/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 703ac4122..a32ecf355 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -164,9 +164,10 @@ playback.") :commands lui-mode :config (define-key lui-mode-map "\C-u" #'lui-kill-to-beginning-of-line) + (setq lui-fill-type nil) + (when (featurep! :feature spellcheck) - (setq lui-flyspell-p t - lui-fill-type nil)) + (setq lui-flyspell-p t)) (after! evil (defun +irc|evil-insert () From e13ccf3e081b70ac03f6a6b364a68bb0e1f59aa9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 12:17:57 +0200 Subject: [PATCH 1674/4235] Rebind SPC q keybinds SPC q q -> evil-quit-all SPC q Q -> evil-save-and-quit SPC q X -> +workspace/kill-session-and-quit --- modules/config/default/+bindings.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index f8c27527b..896afa9ac 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -683,8 +683,9 @@ :desc "Invalidate cache" :n "x" #'projectile-invalidate-cache) (:desc "quit" :prefix "q" - :desc "Save and quit" :n "q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "Q" #'+workspace/kill-session-and-quit + :desc "Quit Emacs" :n "q" #'evil-quit-all + :desc "Save and quit" :n "Q" #'evil-save-and-quit + :desc "Quit (forget session)" :n "X" #'+workspace/kill-session-and-quit :desc "Restart Doom Emacs" :n "r" #'restart-emacs) (:when (featurep! :tools upload) From 52a04fd8c66a8a95de0f30efbb279392f3b65f3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 13:57:18 +0200 Subject: [PATCH 1675/4235] Optimize file-exists-p! & project-file-exists-p! --- core/core-lib.el | 18 ++++++++++++------ core/core-projects.el | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 4849f8cc3..2f758f42b 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -30,9 +30,10 @@ For example Returns - '(or (file-exists-p (expand-file-name \"some-file\" \"~\")) - (and (file-exists-p (expand-file-name path-var \"~\")) - (file-exists-p \"/an/absolute/path\"))) + '(let ((_directory \"~\")) + (or (file-exists-p (expand-file-name \"some-file\" _directory)) + (and (file-exists-p (expand-file-name path-var _directory)) + (file-exists-p \"/an/absolute/path\")))) This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (cond ((stringp spec) @@ -41,7 +42,9 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." spec `(expand-file-name ,spec ,directory)))) ((symbolp spec) - `(file-exists-p ,(if directory + `(file-exists-p ,(if (and directory + (or (not (stringp directory)) + (file-name-absolute-p directory))) `(expand-file-name ,spec ,directory) path))) ((and (listp spec) @@ -385,8 +388,11 @@ doesn't apply to variables, however. For example: - (file-exists-p (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" - (doom--resolve-path-forms spec directory)) + (file-exists-p! (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" + (if directory + `(let ((_directory ,directory)) + ,(doom--resolve-path-forms spec '_directory)) + (doom--resolve-path-forms spec))) (defmacro define-key! (keymaps key def &rest rest) "Like `define-key', but accepts a variable number of KEYMAPS and/or KEY+DEFs. diff --git a/core/core-projects.el b/core/core-projects.el index 5ad28773b..509b7c244 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -99,7 +99,7 @@ If NOCACHE, don't fetch a cached answer." Paths are relative to the project root, unless they start with ./ or ../ (in 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))) + `(file-exists-p! ,files (doom-project-root))) (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." From c96086d426276f6af391b754ab42c69f79f5b662 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 14:05:11 +0200 Subject: [PATCH 1676/4235] Fix reference to void variable path In certain uses of file-exists-p! and project-file-exists-p! --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 2f758f42b..62afe9a6f 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -46,7 +46,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (or (not (stringp directory)) (file-name-absolute-p directory))) `(expand-file-name ,spec ,directory) - path))) + spec))) ((and (listp spec) (memq (car spec) '(or and))) `(,(car spec) From 8762129e8d83094c2c7244632f51799a88fb3d18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 15:03:27 +0200 Subject: [PATCH 1677/4235] Don't prompt when byte-compiling plugins The warning only applies to full byte-compilation of your config. --- core/autoload/modules.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 36af02fb1..459f31994 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -294,6 +294,10 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (intern (match-string 2 module))) targets)))) (cl-block 'byte-compile + ;; If we're just here to byte-compile our plugins, we're done! + (and (not modules) + compile-plugins-p + (cl-return-from 'byte-compile t)) (unless (or (equal modules '(":core")) recompile-p) (unless (and (not doom-auto-accept) @@ -308,10 +312,6 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "Byte-compile anyway?"))) (message "Aborting.") (cl-return-from 'byte-compile))) - ;; If we're just here to byte-compile our plugins, we're done! - (and (not modules) - compile-plugins-p - (cl-return-from 'byte-compile t)) (unless recompile-p (doom//clean-byte-compiled-files)) (unless targets From f7a6089956d930d3cf5f0c885415986f1fcebd3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 17:46:39 +0200 Subject: [PATCH 1678/4235] Restore vim zr, zR, zm, & zM folding in org-mode For evil users. --- modules/lang/org/autoload/org.el | 63 +++++++++++++++++++++++++++----- modules/lang/org/config.el | 14 +++---- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index aa69f5955..51b1fcd24 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -256,6 +256,52 @@ wrong places)." (interactive) (org-toggle-checkbox '(4))) +;;;###autoload +(defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) + +;;;###autoload +(defun +org/open-fold () + "Open the current fold (not but its children)." + (interactive) + (+org/toggle-fold t)) + +;;;###autoload +(defalias #'+org/close-fold #'outline-hide-subtree) + +(defun +org--get-foldlevel () + (let ((max 1)) + (save-restriction + (narrow-to-region (window-start) (window-end)) + (save-excursion + (goto-char (point-min)) + (while (not (eobp)) + (org-next-visible-heading 1) + (when (outline-invisible-p (line-end-position)) + (let ((level (org-outline-level))) + (when (> level max) + (setq max level)))))) + max))) + +;;;###autoload +(defun +org/show-next-fold-level () + "Decrease the fold-level of the visible area of the buffer. This unfolds +another level of headings on each invocation." + (interactive) + (let* ((current-level (+org--get-foldlevel)) + (new-level (1+ current-level))) + (outline-hide-sublevels new-level) + (message "Folded to level %s" new-level))) + +;;;###autoload +(defun +org/hide-next-fold-level () + "Increase the global fold-level of the visible area of the buffer. This folds +another level of headings on each invocation." + (interactive) + (let* ((current-level (+org--get-foldlevel)) + (new-level (max 1 (1- current-level)))) + (outline-hide-sublevels new-level) + (message "Folded to level %s" new-level))) + ;; ;; Hooks @@ -331,21 +377,20 @@ wrong places)." t)) ;;;###autoload -(defun +org|toggle-only-current-fold () +(defun +org|toggle-only-current-fold (&optional arg) "Toggle the local fold at the point (as opposed to cycling through all levels with `org-cycle')." - (interactive) + (interactive "P") (unless (eq this-command 'org-shifttab) (save-excursion (org-beginning-of-line) (when (org-at-heading-p) - (outline-toggle-children) - (unless (outline-invisible-p (line-end-position)) - (org-cycle-hide-drawers 'subtree)) - t)))) - -;;;###autoload -(defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) + (when (or (not arg) + (outline-invisible-p (line-end-position))) + (outline-toggle-children) + (unless (outline-invisible-p (line-end-position)) + (org-cycle-hide-drawers 'subtree)) + t))))) ;;;###autoload (defun +org|remove-occur-highlights () diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 4220fe200..43ef5267f 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -317,13 +317,13 @@ between the two." (evil-define-key* 'normal evil-org-mode-map "za" #'+org/toggle-fold "zA" #'org-shifttab - "zc" #'outline-hide-subtree - "zC" (λ! (outline-hide-sublevels 1)) - "zd" (lambda (&optional arg) (interactive "p") (outline-hide-sublevels (or arg 3))) - "zm" (λ! (outline-hide-sublevels 1)) - "zo" #'outline-show-subtree - "zO" #'outline-show-all - "zr" #'outline-show-all) + "zc" #'+org/close-fold + "zC" #'outline-hide-subtree + "zm" #'+org/hide-next-fold-level + "zo" #'+org/open-fold + "zO" #'outline-show-subtree + "zr" #'+org/show-next-fold-level + "zR" #'outline-show-all) ;; (map! :map evil-org-mode-map :localleader From 8cf407caffade41f02aeac317c466ee9af7b8b4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 17:47:46 +0200 Subject: [PATCH 1679/4235] Re-init custom keys after evil-org-set-key-theme evil-org-set-key-theme blanks out evil-org-mode-map, undoing all our custom keybinds. Using it isn't the correct way to customize evil-org, but it is understandable people would use it expecting it to be, so `+org|setup-evil` will now run after it is called. The "Doom" way to customize evil-org would be to modify the `evil-org-key-theme` variable, but with this change, either will work. --- modules/lang/org/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 43ef5267f..b3254c3bc 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -22,11 +22,13 @@ (def-package! evil-org :when (featurep! :feature evil +everywhere) :hook (org-mode . evil-org-mode) - :hook (org-load . evil-org-set-key-theme) :init (setq evil-org-key-theme '(navigation insert textobjects)) (add-hook 'org-load-hook #'+org|setup-evil) - (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps)) + (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) + :config + ;; in case it is called later + (advice-add #'evil-org-set-key-theme :after #'+org|setup-evil)) (def-package! evil-org-agenda :when (featurep! :feature evil +everywhere) @@ -265,7 +267,7 @@ between the two." [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) -(defun +org|setup-evil () +(defun +org|setup-evil (&rest _) (require 'evil-org) ;; By default, TAB cycles the visibility of all children under the current ;; tree between three states. I want to toggle the tree between two states, From 7493c953fd8a20dcc7127869a036a68a47cfecf0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 17:50:48 +0200 Subject: [PATCH 1680/4235] Restore gQ -> org-fill-paragraph key in org-mode When gq is insufficient. --- modules/lang/org/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b3254c3bc..72212aa7f 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -315,8 +315,9 @@ between the two." "[s" #'org-babel-previous-src-block "^" #'evil-org-beginning-of-line "0" (λ! (let (visual-line-mode) (org-beginning-of-line)))) - ;; sensible vim-esque folding keybinds (evil-define-key* 'normal evil-org-mode-map + "gQ" #'org-fill-paragraph + ;; sensible vim-esque folding keybinds "za" #'+org/toggle-fold "zA" #'org-shifttab "zc" #'+org/close-fold From 5c5b4931cf2b41559b99d04b2612a96c3997b6c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 18:30:25 +0200 Subject: [PATCH 1681/4235] Autoload the +macos!open-width macro --- modules/tools/macos/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/macos/autoload.el b/modules/tools/macos/autoload.el index 46323f7d3..a500e110c 100644 --- a/modules/tools/macos/autoload.el +++ b/modules/tools/macos/autoload.el @@ -18,6 +18,7 @@ (message "Running: %s" command) (shell-command command))) +;;;###autoload (defmacro +macos!open-with (id &optional app dir) `(defun ,(intern (format "+macos/%s" id)) () (interactive) From 23bd9d3efa144f7c5624ced486e54c0ab7eb6427 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 18:43:51 +0200 Subject: [PATCH 1682/4235] Add FILE support to +org-get-property & optimize Can now be used to grab properties from remote org files. Also only reads the first 2048 bytes of the document by default, for performance reasons. --- modules/lang/org/autoload/org.el | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 51b1fcd24..81be38bdb 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -1,12 +1,23 @@ ;;; org/org/autoload/org.el -*- lexical-binding: t; -*- -;;;###autoload -(defun +org-get-property (name &optional _file) ; TODO Add FILE - "Get a propery from an org file." +(defun +org--get-property (name &optional bound) (save-excursion - (goto-char 1) - (re-search-forward (format "^#\\+%s:[ \t]*\\([^\n]+\\)" (upcase name)) nil t) - (buffer-substring-no-properties (match-beginning 1) (match-end 1)))) + (let ((re (format "^#\\+%s:[ \t]*\\([^\n]+\\)" (upcase name)))) + (goto-char (point-min)) + (when (re-search-forward re bound t) + (buffer-substring-no-properties (match-beginning 1) (match-end 1)))))) + +;;;###autoload +(defun +org-get-property (name &optional file bound) + "Get a document property named NAME (string) from an org FILE (defaults to +current file). Only scans first 2048 bytes of the document." + (unless bound + (setq bound 2048)) + (if file + (with-temp-buffer + (insert-file-contents-literally file nil 0 bound) + (+org--get-property name)) + (+org--get-property name bound))) ;; From 84c17b0413e9dedd5f2fecd8f0c4ffae95e8911f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 18:48:54 +0200 Subject: [PATCH 1683/4235] Add docstring to +org-pretty-mode --- modules/lang/org/autoload/org.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 81be38bdb..7a27bdeb1 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -26,7 +26,7 @@ current file). Only scans first 2048 bytes of the document." ;;;###autoload (define-minor-mode +org-pretty-mode - "TODO" + "Hides emphasis markers and toggles pretty entities." :init-value nil :lighter " *" :group 'evil-org From ee154a3eb74725039e284c4c67d0b70dfa02bacc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 19:58:35 +0200 Subject: [PATCH 1684/4235] Add Emacs version check to noninteractive session Changing Emacs versions can cause incompatibilities. Doom now warns the user about these. --- core/autoload/modules.el | 6 ++++-- core/core-dispatcher.el | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 459f31994..b519716e5 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -122,7 +122,8 @@ modified." doom-autoload-file)) (not (cl-loop for file in targets if (file-newer-than-file-p file doom-autoload-file) - return t))) + return t)) + (doom-same-emacs-version-p)) (ignore (print! (green "Doom core autoloads is up-to-date")) (doom-initialize-autoloads doom-autoload-file)) (doom-delete-autoloads-file doom-autoload-file) @@ -202,7 +203,8 @@ This should be run whenever your `doom!' block or update your packages." (cl-loop for key being the hash-keys of (doom-module-table) for path = (doom-module-path (car key) (cdr key) "packages.el") if (file-newer-than-file-p path doom-package-autoload-file) - return t)))) + return t))) + (doom-same-emacs-version-p)) (ignore (print! (green "Doom package autoloads is up-to-date")) (doom-initialize-autoloads doom-package-autoload-file)) (doom-delete-autoloads-file doom-package-autoload-file) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index ffb301334..e37b3bdbb 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -1,5 +1,32 @@ ;;; -*- lexical-binding: t; no-byte-compile: t; -*- +;; Do an Emacs version check and warn the user if it has changed. +(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) +(defvar doom--last-emacs-version nil) + +(defun doom-refresh-emacs-version () + (with-temp-file doom--last-emacs-file + (princ `(setq doom--last-emacs-version ,(prin1-to-string emacs-version)) + (current-buffer)))) + +(defun doom-same-emacs-version-p () + (if (or doom--last-emacs-version + (load doom--last-emacs-file t t t)) + (equal emacs-version doom--last-emacs-version) + (setq doom--last-emacs-version emacs-version) + (doom-refresh-emacs-version) + t)) + +(unless (doom-same-emacs-version-p) + (unless (y-or-n-p + (format (concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n" + "issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n" + "Continue?") + doom--last-emacs-version + emacs-version)) + (error "Aborting")) + (doom-refresh-emacs-version)) + ;; Eagerly load these libraries because this module may be loaded in a session ;; that hasn't been fully initialized (where autoloads files haven't been ;; generated or `load-path' populated). From 3027ed2f7f90893aa724ea4fcbe738b9ff979b1c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:06:57 +0200 Subject: [PATCH 1685/4235] Add new doom|mark-buffer-as-real hook to term/eshell This is simpler (and perhaps faster) than doom-real-buffer-functions. Better to reserve that for more complex logic. --- core/autoload/buffers.el | 10 ++++++++++ modules/emacs/eshell/config.el | 4 +--- modules/emacs/term/config.el | 4 +--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index e008dd3b0..7177fbb09 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -174,6 +174,16 @@ regex PATTERN. Returns the number of killed buffers." (kill-buffer buf)))) +;; +;; Hooks +;; + +;;;###autoload +(defun doom|mark-buffer-as-real () + "Hook function that marks the current buffer as real." + (doom-set-buffer-real (current-buffer) t)) + + ;; ;; Interactive commands ;; diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 90ed2816c..e8afe0b23 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -29,9 +29,7 @@ :config ;; Consider eshell buffers real - (defun +eshell-p (buf) - (eq (buffer-local-value 'major-mode buf) 'eshell-mode)) - (add-to-list 'doom-real-buffer-functions #'+eshell-p nil #'eq) + (add-hook 'eshell-mode-hook #'doom|mark-buffer-as-real) ;; Keep track of open eshell buffers (add-hook 'eshell-mode-hook #'+eshell|init) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index 436a8d4f9..c65b42afb 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -9,6 +9,4 @@ (set! :env "SHELL") ;; Consider term buffers real - (defun +term-p (buf) - (eq (buffer-local-value 'major-mode buf) 'term-mode)) - (add-to-list 'doom-real-buffer-functions #'+term-p nil #'eq)) + (add-hook 'term-mode-hook #'doom|mark-buffer-as-real)) From 625a8a9056aca9f3de25db45c5e03fb276b4d451 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:08:19 +0200 Subject: [PATCH 1686/4235] Fix multi-term buffers missing from buffer list Caused because switch buffer hooks weren't triggering, due to multi-term's odd use of set-buffer before switch-to-buffer. --- modules/emacs/term/autoload.el | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/emacs/term/autoload.el b/modules/emacs/term/autoload.el index e1dabf554..16ed2bb9c 100644 --- a/modules/emacs/term/autoload.el +++ b/modules/emacs/term/autoload.el @@ -5,20 +5,26 @@ "Open a terminal buffer in the current window. If PROJECT-ROOT (C-u) is non-nil, cd into the current project's root." (interactive "P") - (let ((default-directory (if project-root (doom-project-root 'nocache) default-directory))) - (call-interactively #'multi-term))) + (let ((default-directory + (if project-root + (doom-project-root 'nocache) + default-directory))) + ;; Doom's switch-buffer hooks prevent themselves from triggering when + ;; switching from buffer A back to A. Because `multi-term' uses `set-buffer' + ;; before `switch-to-buffer', the hooks don't trigger, so we use this + ;; roundabout way to trigger them properly. + (switch-to-buffer (save-window-excursion (multi-term))))) ;;;###autoload (defun +term/open-popup (arg) "Open a terminal popup window. If ARG (universal argument) is non-nil, cd into the current project's root." (interactive "P") - (require 'multi-term) - (let ((default-directory (if arg (doom-project-root 'nocache) default-directory)) - (buffer (multi-term-get-buffer current-prefix-arg))) - (pop-to-buffer buffer) - (setq multi-term-buffer-list (nconc multi-term-buffer-list (list buffer))) - (multi-term-internal))) + (let ((default-directory + (if arg + (doom-project-root 'nocache) + default-directory))) + (pop-to-buffer (save-window-excursion (multi-term))))) ;;;###autoload (defun +term/open-popup-in-project (arg) From fdb95d9ee67c03396e00e92b03d95d87cb626aa9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:09:24 +0200 Subject: [PATCH 1687/4235] Minor optimization of doom*switch-buffer-hooks --- core/core-ui.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index a5a371dd6..a052e7dbf 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -377,15 +377,15 @@ from the default." (funcall orig-fn window norecord)) (run-hooks 'doom-after-switch-window-hook)))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) - (let ((buf (window-normalize-buffer-to-switch-to buffer-or-name))) - (if (or doom-inhibit-switch-buffer-hooks - (eq buf (current-buffer))) - (apply orig-fn buf args) - (run-hooks 'doom-before-switch-buffer-hook) - (prog1 - (let ((doom-inhibit-switch-buffer-hooks t)) - (apply orig-fn buf args)) - (run-hooks 'doom-after-switch-buffer-hook))))) + (if (or doom-inhibit-switch-buffer-hooks + (eq (window-normalize-buffer-to-switch-to buffer-or-name) + (current-buffer))) + (apply orig-fn buffer-or-name args) + (run-hooks 'doom-before-switch-buffer-hook) + (prog1 + (let ((doom-inhibit-switch-buffer-hooks t)) + (apply orig-fn buffer-or-name args)) + (run-hooks 'doom-after-switch-buffer-hook)))) (defun doom|init-custom-hooks () (advice-add #'select-frame :around #'doom*switch-frame-hooks) From 1d9ae834f24262f035bb019954dd56734f307877 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:13:19 +0200 Subject: [PATCH 1688/4235] Minor refactors & docstring revision These are not the refactors you are looking for. --- core/core.el | 4 ++-- modules/feature/snippets/config.el | 4 ++-- modules/lang/cc/config.el | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/core.el b/core/core.el index 57b48793e..f55ac5bbd 100644 --- a/core/core.el +++ b/core/core.el @@ -1,8 +1,8 @@ ;;; core.el --- the heart of the beast -*- lexical-binding: t; -*- (eval-when-compile - (when (version< emacs-version "25") - (error "Doom only supports Emacs 25.1 and higher!"))) + (and (version< emacs-version "25") + (error "Doom only supports Emacs 25.1 and higher!"))) ;; (defvar doom-version "2.0.9" diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 33757e31e..e31f33124 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -50,5 +50,5 @@ (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay))) -(after! auto-yasnippet - (setq aya-persist-snippets-dir (concat doom-local-dir "auto-snippets/"))) +;; `auto-yasnippet' +(setq aya-persist-snippets-dir (concat doom-local-dir "auto-snippets/")) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 16389c367..c88ba638a 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -87,8 +87,9 @@ compilation database is present in the project.") (substatement-label . 0) (statement-cont . +) (case-label . +) - ;; align args with open brace OR don't indent at all (if open brace - ;; is at eolp and close brace is after arg with no trailing comma) + ;; align args with open brace OR don't indent at all (if open + ;; brace is at eolp and close brace is after arg with no trailing + ;; comma) (arglist-intro . +) (arglist-close +cc-lineup-arglist-close 0) ;; don't over-indent lambda blocks From 3491ac369fd930c2c238bdc9868b70adfb2df086 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:15:03 +0200 Subject: [PATCH 1689/4235] Translate ESC to [escape] (experimental) This is to fix a keymapping edge case. It _may_ have other reprecussions, so it must be tested further! --- modules/config/default/+bindings.el | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 896afa9ac..20adc586e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -335,13 +335,13 @@ [tab] #'helm-execute-persistent-action) (:after helm-files (:map helm-generic-files-map - :e "ESC" #'helm-keyboard-quit) + :e [escape] #'helm-keyboard-quit) (:map helm-find-files-map "C-w" #'helm-find-files-up-one-level - "TAB" #'helm-execute-persistent-action)) + [tab] #'helm-execute-persistent-action)) (:after helm-ag (:map helm-ag-map - "" #'helm-ag-edit))) + [backtab] #'helm-ag-edit))) ;; hl-todo :m "]t" #'hl-todo-next @@ -418,8 +418,8 @@ [backspace] #'+snippets/delete-backward-char [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map - :ig "" yas-maybe-expand - :v "" #'yas-insert-snippet + :ig [(tab)] yas-maybe-expand + :v [(tab)] #'yas-insert-snippet :ig "TAB" yas-maybe-expand :v "TAB" #'yas-insert-snippet)) @@ -725,10 +725,11 @@ ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). -(define-key input-decode-map [S-iso-lefttab] [backtab]) - -;; Fix TAB in terminal -(unless window-system +(if window-system + (define-key! input-decode-map + [S-iso-lefttab] [backtab] ;; Fix MacOS shift+tab + (kbd "ESC") [escape]) + ;; Fix TAB in terminal (define-key input-decode-map (kbd "TAB") [tab])) (after! tabulated-list @@ -748,9 +749,7 @@ [S-M-return] #'evil-open-above ;; Emacsien motions for insert mode "\C-b" #'backward-word - "\C-f" #'forward-word) - - (evil-define-key* 'insert 'global + "\C-f" #'forward-word ;; textmate-esque deletion [M-backspace] #'doom/backward-kill-to-bol-and-indent) @@ -760,7 +759,7 @@ "\C-f" #'forward-word) (after! view - (define-key view-mode-map (kbd "") #'View-quit-all))) + (define-key view-mode-map [escape] #'View-quit-all))) ;; Restore common editing keys (and ESC) in minibuffer (defun +default|fix-minibuffer-in-map (map) From 29005d99754a75e69221bc302830e48bd80c3d77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:19:46 +0200 Subject: [PATCH 1690/4235] Load quelpa uncompiled to fix arrayp errors #647 Hopefully... --- core/core-packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 8987c6094..6d4e572de 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -315,7 +315,9 @@ them." ;; `quelpa-cache' (when (or force-p (not (bound-and-true-p quelpa-cache))) - (require 'quelpa) + ;; ensure un-byte-compiled version of quelpa is loaded + (unless (featurep 'quelpa) + (load (locate-library "quelpa.el") nil t t)) (setq quelpa-initialized-p nil) (or (quelpa-setup-p) (error "Could not initialize quelpa")))) From 6da8e5b3abc9b0562ad8e5b9dcd492027084be18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Jun 2018 21:20:13 +0200 Subject: [PATCH 1691/4235] Add error handling when loading autoloads files --- 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 6d4e572de..b2ca03d75 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -287,7 +287,11 @@ non-nil." "Tries to load FILE (an autoloads file). Otherwise tries to regenerate it. If CLEAR-P is non-nil, regenerate it anyway." (unless clear-p - (load (file-name-sans-extension file) 'noerror 'nomessage))) + (condition-case-unless-debug e + (load (file-name-sans-extension file) 'noerror 'nomessage) + ('error + (message "Autoload error: %s -> %s" + (car e) (error-message-string e)))))) (defun doom-initialize-packages (&optional force-p) "Ensures that Doom's package management system, package.el and quelpa are From 686d102ee7372b6c5b0f8dd08ca09527c0c4a4ed Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Mon, 4 Jun 2018 18:42:15 -0500 Subject: [PATCH 1692/4235] Add conda --- modules/lang/python/+conda.el | 18 ++++++++++++++ modules/lang/python/autoload/conda.el | 36 +++++++++++++++++++++++++++ modules/lang/python/packages.el | 2 ++ 3 files changed, 56 insertions(+) create mode 100644 modules/lang/python/+conda.el create mode 100644 modules/lang/python/autoload/conda.el diff --git a/modules/lang/python/+conda.el b/modules/lang/python/+conda.el new file mode 100644 index 000000000..91eae8690 --- /dev/null +++ b/modules/lang/python/+conda.el @@ -0,0 +1,18 @@ +;;; lang/python/+conda.el -*- lexical-binding: t; -*- +;;;###if (featurep! +conda) + +(def-package! conda + :when (featurep! +conda) + :after (python) + :init + (defvar +python-conda-home '("~/.anaconda3" "/usr/bin/anaconda3" "~/.anaconda") ++ "A list of host pattern and corresponding anaconda home.") + :config + (advice-add 'anaconda-mode-bootstrap :override #'*anaconda-mode-bootstrap) + (conda-env-autoactivate-mode -1) + ;; (add-hook 'python-mode-hook #'conda-env-activate-for-buffer) + (conda-env-initialize-interactive-shells) + (conda-env-initialize-eshell) + ;; Version management with conda + (add-hook 'conda-postactivate-hook #'+python|add-version-to-modeline) + (add-hook 'conda-postdeactivate-hook #'+python|add-version-to-modeline)) diff --git a/modules/lang/python/autoload/conda.el b/modules/lang/python/autoload/conda.el new file mode 100644 index 000000000..84d53ceab --- /dev/null +++ b/modules/lang/python/autoload/conda.el @@ -0,0 +1,36 @@ +;;; lang/python/autoload/conda.el -*- lexical-binding: t; -*- +;;;###if (featurep! +conda) + +;;;###autoload +(defun +python/set-conda-home () + (interactive) + (ivy-read "Set conda home:" +python-conda-home + :history +python/set-conda-home--history + :action (lambda (cand) (setq conda-anaconda-home cand)))) + +;;;###autoload +(defun +python|add-version-to-modeline () + "Add version string to the major mode in the modeline." + (setq mode-name + (if conda-env-current-name + (format "Py:conda:%s" conda-env-current-name) + "Python"))) +;;;###autoload +(defun *anaconda-mode-bootstrap (&optional callback) + "Run `anaconda-mode' server. +CALLBACK function will be called when `anaconda-mode-port' will +be bound." + (setq anaconda-mode-process + (start-pythonic :process anaconda-mode-process-name + :buffer anaconda-mode-process-buffer + :cwd (anaconda-mode-server-directory) + :filter (lambda (process output) (anaconda-mode-bootstrap-filter process output)) + :sentinel 'anaconda-mode-bootstrap-sentinel + :query-on-exit nil + :args (list "-c" + anaconda-mode-server-command + (if (pythonic-remote-p) + "0.0.0.0" "127.0.0.1") + (or (pythonic-file-name pythonic-environment) "")))) + (process-put anaconda-mode-process 'server-directory (anaconda-mode-server-directory))) + diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index c7877f223..0b67053d2 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -8,3 +8,5 @@ (when (package! anaconda-mode) (when (featurep! :completion company) (package! company-anaconda))) +(when (featurep! +conda) + (package! conda)) From 3c52c36c2fa3393c2b56832e63cec474df67871b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 02:06:01 +0200 Subject: [PATCH 1693/4235] lang/cc: general refactor For idempotence and to group dependencies so certain sub-packages (like irony's) aren't loaded if irony is disabled. --- modules/lang/cc/autoload.el | 8 ++++ modules/lang/cc/config.el | 79 ++++++++++++++++--------------------- modules/lang/cc/packages.el | 3 +- 3 files changed, 43 insertions(+), 47 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index f063cf11c..9b8a18ef1 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -1,5 +1,13 @@ ;;; lang/cc/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(add-to-list 'auto-mode-alist '("\\.cl\\'" . opencl-mode)) + + +;; +;; Library +;; + ;;;###autoload (defun +cc/reload-compile-db () "Reload the current project's JSON compilation database." diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index c88ba638a..753f9e1cd 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -27,7 +27,10 @@ compilation database is present in the project.") :commands (c-mode c++-mode objc-mode java-mode) :mode ("\\.mm\\'" . objc-mode) :preface + ;; The plusses in c++-mode can be annoying to search for ivy/helm (which reads + ;; queries as regexps), so wee add these for convenience. (defalias 'cpp-mode 'c++-mode) + (defvaralias 'cpp-mode-map 'c++-mode-map) (defun +cc-c++-header-file-p () (and buffer-file-name @@ -45,8 +48,9 @@ compilation database is present in the project.") (equal (file-name-extension buffer-file-name) "h") (re-search-forward "@\\" magic-mode-regexp-match-limit t))) - (push '(+cc-c++-header-file-p . c++-mode) magic-mode-alist) - (push '(+cc-objc-header-file-p . objc-mode) magic-mode-alist) + (unless (assq '+cc-c++-header-file-p magic-mode-alist) + (push '(+cc-c++-header-file-p . c++-mode) magic-mode-alist) + (push '(+cc-objc-header-file-p . objc-mode) magic-mode-alist)) :init (setq-default c-basic-offset tab-width @@ -54,21 +58,13 @@ compilation database is present in the project.") c-default-style "doom") :config - (set! :electric '(c-mode c++-mode objc-mode java-mode) - :chars '(?\n ?\})) - (set! :company-backend - '(c-mode c++-mode objc-mode) - '(company-irony-c-headers company-irony)) - - ;;; Style/formatting - ;; C/C++ style settings - (c-toggle-electric-state -1) - (c-toggle-auto-newline -1) + (set! :electric '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) - (add-hook! (c-mode c++-mode) #'highlight-numbers-mode) - (add-hook! (c-mode c++-mode) #'+cc|fontify-constants) + (add-hook! '(c-mode-hook c++-mode-hook) + #'(highlight-numbers-mode + +cc|fontify-constants)) ;; Custom style, based off of linux (map-put c-style-alist "doom" @@ -104,6 +100,8 @@ compilation database is present in the project.") ;;; Keybindings ;; Disable electric keys because it interferes with smartparens and custom ;; bindings. We'll do it ourselves (mostly). + (c-toggle-electric-state -1) + (c-toggle-auto-newline -1) (setq c-tab-always-indent nil c-electric-flag nil) (dolist (key '("#" "}" "/" "*" ";" "," ":" "(" ")" "\177")) @@ -141,11 +139,13 @@ compilation database is present in the project.") (add-hook 'c-mode-common-hook #'+cc|init-irony-mode) :config (setq irony-cdb-search-directory-list '("." "build" "build-conda")) + ;; Initialize compilation database, if present. Otherwise, fall back on ;; `+cc-default-compiler-options'. (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options) - (def-package! irony-eldoc :hook (irony-mode . irony-eldoc)) + (def-package! irony-eldoc + :hook (irony-mode . irony-eldoc)) (def-package! flycheck-irony :when (featurep! :feature syntax-checker) @@ -155,47 +155,35 @@ compilation database is present in the project.") (def-package! company-irony :when (featurep! :completion company) - :after irony) - - (def-package! company-irony-c-headers - :when (featurep! :completion company) - :after company-irony)) - - -;; -;; Tools -;; - -(def-package! disaster :commands disaster) + :init + (set! :company-backend + '(c-mode c++-mode objc-mode) + '(:separate company-irony-c-headers company-irony)) + :config + (require 'company-irony-c-headers))) ;; ;; Major modes ;; -(def-package! cmake-mode - :defer t - :config - (set! :company-backend 'cmake-mode '(company-cmake company-yasnippet))) - -(def-package! opencl-mode :mode "\\.cl\\'") - -(def-package! demangle-mode :hook llvm-mode) - - -;; -;; Company plugins -;; +;; `cmake-mode' +(set! :company-backend 'cmake-mode '(company-cmake company-yasnippet)) (def-package! company-cmake :when (featurep! :completion company) :after cmake-mode) + +;; `demangle-mode' +(add-hook 'llvm-mode-hook #'demangle-mode) + + +;; `glsl-mode' (def-package! company-glsl :when (featurep! :completion company) :after glsl-mode - :config - (set! :company-backend 'glsl-mode '(company-glsl))) + :config (set! :company-backend 'glsl-mode '(company-glsl))) ;; @@ -226,20 +214,19 @@ compilation database is present in the project.") :references #'rtags-find-references-at-point) (add-hook 'doom-cleanup-hook #'+cc|cleanup-rtags) - (add-hook! kill-emacs (ignore-errors (rtags-cancel-process))) + (add-hook! 'kill-emacs-hook (ignore-errors (rtags-cancel-process))) ;; Use rtags-imenu instead of imenu/counsel-imenu (define-key! (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) - (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) + (when (featurep 'evil) + (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 :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 661fda6b3..49a2aaa06 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -12,7 +12,8 @@ (when (featurep! :completion company) (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")))) -(when (package! irony) +(when (featurep! +irony) + (package! irony) (package! irony-eldoc) (when (featurep! :feature syntax-checker) (package! flycheck-irony)) From 9c62ef9dfa4dafa6f514b47d32409c22cfae2c51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 03:20:19 +0200 Subject: [PATCH 1694/4235] Fix flycheck-posframe errors #653 The +childframe check was too simple (and unnecessary, since the posframe function autoloaded). --- modules/feature/syntax-checker/autoload.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/feature/syntax-checker/autoload.el b/modules/feature/syntax-checker/autoload.el index 2265061f9..d0f6b9de2 100644 --- a/modules/feature/syntax-checker/autoload.el +++ b/modules/feature/syntax-checker/autoload.el @@ -18,9 +18,7 @@ "TODO" :lighter nil :group 'doom - (if (featurep! +childframe) - (require 'flycheck-posframe) - (require 'flycheck-popup-tip)) + (require 'flycheck-popup-tip) (let ((hooks '(post-command-hook focus-out-hook))) (cond ;; Use our display function and remember the old one but only if we haven't From fa4a9a38d4351c2e266391e2e2b7314e6c0721dc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 03:21:26 +0200 Subject: [PATCH 1695/4235] Less intrusive error prefix for flycheck popups The default character was taller than a line. My OCD won't have it. --- modules/feature/syntax-checker/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 9bdc0b5fa..e1995dc44 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -18,7 +18,8 @@ (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) - :init (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode)) + :init (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode) + :config (setq flycheck-popup-tip-error-prefix "✕ ")) (def-package! flycheck-posframe From 3119238f42b1af9269416de558f27330c4502d10 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Tue, 5 Jun 2018 14:40:26 +1000 Subject: [PATCH 1696/4235] config/default: add helm bindings for SPC-i-y --- modules/config/default/+bindings.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 20adc586e..26866a294 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -628,8 +628,11 @@ :desc "What minor modes" :n ";" #'doom/describe-active-minor-mode) (:desc "insert" :prefix "i" - :desc "From kill-ring" :nv "y" #'counsel-yank-pop - :desc "From evil registers" :nv "r" #'counsel-evil-registers + (:when (featurep! :completion helm) + :desc "From kill-ring" :nv "y" #'helm-show-kill-ring) + (:when (featurep! :completion ivy) + :desc "From kill-ring" :nv "y" #'counsel-yank-pop + :desc "From evil registers" :nv "r" #'counsel-evil-registers) :desc "From snippet" :nv "s" #'yas-insert-snippet) (:desc "notes" :prefix "n" From 022a64d2e36b0183f5354398bc1c921fd3c772c5 Mon Sep 17 00:00:00 2001 From: Aria Edmonds <8436007+ar1a@users.noreply.github.com> Date: Tue, 5 Jun 2018 17:40:54 +1000 Subject: [PATCH 1697/4235] rtags is `rdm` not `rtags` silly henrik --- 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 753f9e1cd..1e7b937c3 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -196,7 +196,7 @@ compilation database is present in the project.") (defun +cc|init-rtags () "Start an rtags server in c-mode and c++-mode buffers." (when (and (memq major-mode '(c-mode c++-mode)) - (rtags-executable-find "rtags")) + (rtags-executable-find "rdm")) (rtags-start-process-unless-running))) (add-hook 'c-mode-common-hook #'+cc|init-rtags) :config From 7b1a83079d210b97daa45e2e0bfcedaf8649d155 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 10:35:02 +0200 Subject: [PATCH 1698/4235] Fix C-j being treated as a prefix in lang/latex --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index bf76d3daf..809507d71 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -52,7 +52,7 @@ LaTeX-fill-break-at-separators nil LaTeX-item-indent 0) ; item indentation. - (define-key LaTeX-mode-map "C-j" nil) + (define-key LaTeX-mode-map "\C-j" nil) ;; Do not prompt for Master files, this allows auto-insert to add templates ;; to .tex files From 282e0d66539bb38ca7b565acdcdafa9cb275ba71 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 11:18:36 +0200 Subject: [PATCH 1699/4235] Move emacs version check into doom-initialize Also fixes void-function errors caused by (now removed) doom-same-emacs-version-p not being defined in all the contexts it was needed. Where it was before was clumsy design. --- core/autoload/modules.el | 10 +++++----- core/core-dispatcher.el | 27 --------------------------- core/core-packages.el | 28 ++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index b519716e5..f26b5fdf8 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -117,13 +117,13 @@ modified." (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) (push file targets))))) (if (and (not force-p) + (not doom-emacs-changed-p) (file-exists-p doom-autoload-file) (not (file-newer-than-file-p (expand-file-name "init.el" doom-private-dir) doom-autoload-file)) (not (cl-loop for file in targets if (file-newer-than-file-p file doom-autoload-file) - return t)) - (doom-same-emacs-version-p)) + return t))) (ignore (print! (green "Doom core autoloads is up-to-date")) (doom-initialize-autoloads doom-autoload-file)) (doom-delete-autoloads-file doom-autoload-file) @@ -197,14 +197,14 @@ FORCE-P (universal argument) is non-nil, regenerate it anyway. This should be run whenever your `doom!' block or update your packages." (interactive) (if (and (not force-p) + (not doom-emacs-changed-p) (file-exists-p doom-package-autoload-file) (not (file-newer-than-file-p package-user-dir doom-package-autoload-file)) (not (ignore-errors (cl-loop for key being the hash-keys of (doom-module-table) for path = (doom-module-path (car key) (cdr key) "packages.el") if (file-newer-than-file-p path doom-package-autoload-file) - return t))) - (doom-same-emacs-version-p)) + return t)))) (ignore (print! (green "Doom package autoloads is up-to-date")) (doom-initialize-autoloads doom-package-autoload-file)) (doom-delete-autoloads-file doom-package-autoload-file) @@ -317,8 +317,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (unless recompile-p (doom//clean-byte-compiled-files)) (unless targets - (message "Regenerating autoloads files (if necessary)") (let ((inhibit-message t) + doom-emacs-changed-p noninteractive) ;; But first we must be sure that Doom and your private config have ;; been fully loaded. Which usually aren't so in an noninteractive diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index e37b3bdbb..ffb301334 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -1,32 +1,5 @@ ;;; -*- lexical-binding: t; no-byte-compile: t; -*- -;; Do an Emacs version check and warn the user if it has changed. -(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) -(defvar doom--last-emacs-version nil) - -(defun doom-refresh-emacs-version () - (with-temp-file doom--last-emacs-file - (princ `(setq doom--last-emacs-version ,(prin1-to-string emacs-version)) - (current-buffer)))) - -(defun doom-same-emacs-version-p () - (if (or doom--last-emacs-version - (load doom--last-emacs-file t t t)) - (equal emacs-version doom--last-emacs-version) - (setq doom--last-emacs-version emacs-version) - (doom-refresh-emacs-version) - t)) - -(unless (doom-same-emacs-version-p) - (unless (y-or-n-p - (format (concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n" - "issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n" - "Continue?") - doom--last-emacs-version - emacs-version)) - (error "Aborting")) - (doom-refresh-emacs-version)) - ;; Eagerly load these libraries because this module may be loaded in a session ;; that hasn't been fully initialized (where autoloads files haven't been ;; generated or `load-path' populated). diff --git a/core/core-packages.el b/core/core-packages.el index b2ca03d75..e86e10d45 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -80,6 +80,10 @@ file.") (defvar doom-reload-hook nil "A list of hooks to run when `doom//reload-load-path' is called.") +(defvar doom-emacs-changed-p nil + "If non-nil, the running version of Emacs is different from the first time +Doom was setup, which can cause problems.") + (defvar doom--current-module nil) (defvar doom--refreshed-p nil) (defvar doom--stage 'init) @@ -171,6 +175,29 @@ If RETURN-P, return the message as a string instead of displaying it." ;; Bootstrap helpers ;; +(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) +(defvar doom--last-emacs-version nil) + +(defun doom-ensure-same-emacs-version-p () + "Do an Emacs version check and set `doom-emacs-changed-p' if it has changed." + (if (load doom--last-emacs-file 'noerror 'nomessage 'nosuffix) + (setq doom-emacs-changed-p + (not (equal emacs-version doom--last-emacs-version))) + (with-temp-file doom--last-emacs-file + (princ `(setq doom--last-emacs-version ,(prin1-to-string emacs-version)) + (current-buffer)))) + (cond ((not doom-emacs-changed-p)) + ((y-or-n-p + (format + (concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n" + "issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n" + "Continue?") + doom--last-emacs-version + emacs-version)) + (delete-file doom--last-emacs-file)) + (noninteractive (error "Aborting")) + ((kill-emacs)))) + (defun doom-ensure-packages-initialized (&optional force-p) "Make sure package.el is initialized." (when (or force-p (not package--initialized)) @@ -248,6 +275,7 @@ to least)." ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. (unless (doom-initialize-autoloads doom-autoload-file force-p) + (doom-ensure-same-emacs-version-p) (doom-ensure-core-directories) (doom-ensure-packages-initialized force-p) (doom-ensure-core-packages) From f71d4634e8c902dae30fd841847a63403909c4ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 11:19:34 +0200 Subject: [PATCH 1700/4235] Remove TODO colorizing in bin/doom help It's unused and excessive. KISS! --- core/core-dispatcher.el | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index ffb301334..a4f9ffead 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -22,20 +22,18 @@ commands like `doom//packages-install', `doom//packages-update' and (defconst doom--dispatch-alias-alist ()) (defun doom--dispatch-format (desc &optional short) - (if (equal desc "TODO") - (format! (yellow "TODO")) - (with-temp-buffer - (let ((fill-column 72)) - (insert desc) - (goto-char (point-min)) - (while (re-search-forward "\n\n[^ \n]" nil t) - (fill-paragraph))) - (if (not short) - (buffer-string) - (goto-char (point-min)) - (buffer-substring-no-properties - (line-beginning-position) - (line-end-position)))))) + (with-temp-buffer + (let ((fill-column 72)) + (insert desc) + (goto-char (point-min)) + (while (re-search-forward "\n\n[^ \n]" nil t) + (fill-paragraph))) + (if (not short) + (buffer-string) + (goto-char (point-min)) + (buffer-substring-no-properties + (line-beginning-position) + (line-end-position))))) (defun doom--dispatch-help (&optional command desc &rest args) "Display help documentation for a dispatcher command. If COMMAND and DESC are From 1ef581d376eec020f3c9ad7ed8922d03c29cb21b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 11:20:06 +0200 Subject: [PATCH 1701/4235] Load company (+auto) on post-self-insert-hook This is a little later than pre-command-hook, but makes more sense. Needs more testing though! --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index dac4ce257..a15e9c523 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -25,7 +25,7 @@ (def-package! company :when (featurep! +auto) :defer 2 - :after-call pre-command-hook + :after-call post-self-insert-hook :config (setq company-idle-delay 0.2)) From d24807cc2c5badd804517707d20239997a5c9021 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 11:20:39 +0200 Subject: [PATCH 1702/4235] Don't overwrite ivy-height for ivy-posframe This would undo user's customizations to this variable. --- 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 596fff5b3..b616f7da2 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -191,8 +191,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; wasteful, so... (advice-add #'ivy-posframe-setup :override #'ignore) :config - (setq ivy-height 16 - ivy-fixed-height-minibuffer nil + (setq ivy-fixed-height-minibuffer nil ivy-posframe-parameters `((min-width . 90) (min-height . ,ivy-height) (internal-border-width . 10))) From 8124d5a893c1d5e3369a3bc03d9ad28754fc0212 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 11:21:24 +0200 Subject: [PATCH 1703/4235] Use package-activated-list for package count Now that this variable is cached, it should always be available. --- core/core-packages.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e86e10d45..ef8afec25 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -149,10 +149,7 @@ they were loaded at startup. If RETURN-P, return the message as a string instead of displaying it." (funcall (if return-p #'format #'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-site-load-path)) + (length package-activated-list) (if doom-modules (hash-table-count doom-modules) 0) (or doom-init-time (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) From c9bfb58369429babcacef2a266caaf119598df36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 11:22:20 +0200 Subject: [PATCH 1704/4235] Minor, general refactor Remove redundant keybinds, unused letvars, and fix doom-module-load-path's docstring referencing its former signature. --- core/core-packages.el | 9 +++------ modules/config/default/+bindings.el | 6 ++---- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index ef8afec25..344464b8f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -469,8 +469,7 @@ This doesn't require modules to be enabled. For enabled modules us (intern submodule)))))))) (defun doom-module-load-path () - "Returns a list of absolute file paths to activated modules, with APPEND-FILE -added, if the file exists." + "Returns a list of absolute file paths to activated modules." (append (cl-loop for plist being the hash-values of doom-modules collect (plist-get plist :path)) (list doom-private-dir))) @@ -667,8 +666,7 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." (setq path (or (and (bound-and-true-p byte-compile-current-file) (file-name-directory byte-compile-current-file)) (and load-file-name (file-name-directory load-file-name)) - (and buffer-file-name - (file-name-directory buffer-file-name)) + (and buffer-file-name (file-name-directory buffer-file-name)) (error "Could not detect path to look for '%s' in" filename)))) `(load ,(if path `(expand-file-name ,filename ,path) @@ -677,8 +675,7 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." (defmacro require! (category module &rest plist) "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." - (let ((enabled-p (doom-module-p category module)) - (doom-modules (copy-hash-table doom-modules))) + (let ((doom-modules (copy-hash-table doom-modules))) (apply #'doom-module-set category module (mapcar #'eval plist)) (let ((module-path (doom-module-locate-path category module))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 26866a294..c936cd02e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -133,9 +133,7 @@ "C-s" #'company-filter-candidates "C-S-s" #'company-search-candidates "C-SPC" #'company-complete-common - "TAB" #'company-complete-common-or-cycle [tab] #'company-complete-common-or-cycle - "S-TAB" #'company-select-previous [backtab] #'company-select-previous) ;; Automatically applies to `company-filter-map' (:map company-search-map @@ -418,8 +416,8 @@ [backspace] #'+snippets/delete-backward-char [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map - :ig [(tab)] yas-maybe-expand - :v [(tab)] #'yas-insert-snippet + :ig [tab] yas-maybe-expand + :v [tab] #'yas-insert-snippet :ig "TAB" yas-maybe-expand :v "TAB" #'yas-insert-snippet)) From 4978a64678433a32dce474ce1cc283b0d7318660 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 12:09:42 +0200 Subject: [PATCH 1705/4235] Create core directories before checking version Otherwise the version cache file can't be written to! --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 344464b8f..d54480977 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -272,8 +272,8 @@ to least)." ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. (unless (doom-initialize-autoloads doom-autoload-file force-p) - (doom-ensure-same-emacs-version-p) (doom-ensure-core-directories) + (doom-ensure-same-emacs-version-p) (doom-ensure-packages-initialized force-p) (doom-ensure-core-packages) ;; Regenerate `doom-autoload-file', which tells Doom where to find all its From d5934ec8f7200af22f3c357b7af443f42f129912 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 13:23:37 +0200 Subject: [PATCH 1706/4235] feature/evil: update evil-shift-width manually (experimental) --- modules/feature/evil/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index bcdb682eb..f941795f9 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -77,6 +77,10 @@ variable for an explanation of the defaults (in comments). See (setq +evil--default-cursor-color (face-background 'cursor))) (add-hook 'doom-load-theme-hook #'+evil|update-cursor-color) + (defun +evil|update-shift-width () + (setq evil-shift-width tab-width)) + (add-hook 'after-change-major-mode-hook #'+evil|update-shift-width t) + ;; --- keybind fixes ---------------------- (after! wgrep From c9a3c9e615aa32fcb93aa06b54904c777fe64f2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 13:23:46 +0200 Subject: [PATCH 1707/4235] Disable evil-collection-minibuffer --- modules/feature/evil/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f941795f9..5f3de983a 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -11,6 +11,7 @@ dired helm ivy + minibuffer ruby-mode) "A list of `evil-collection' modules to disable. See the definition of this variable for an explanation of the defaults (in comments). See From 43c65ab628b9533c7ff3d008579ad869655c261c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 13:44:53 +0200 Subject: [PATCH 1708/4235] Disable :collab floobits by default --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 5ca5f6922..de355bca0 100644 --- a/init.example.el +++ b/init.example.el @@ -124,7 +124,7 @@ ; +langtool) ; a proofreader (grammar/style check) for Emacs :collab - floobits ; peer programming for a price + ;floobits ; peer programming for a price ;impatient-mode ; show off code over HTTP :config From 3661462a7a5a8167a29eb0a216bdd86172714446 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 14:06:30 +0200 Subject: [PATCH 1709/4235] Use dynamic byte-compilation for autoload files Very experimental! This reduces the size and overhead of autoload files slightly, but may have other reprecussions! --- core/autoload/modules.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index f26b5fdf8..53518580c 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -46,8 +46,10 @@ init.el and config.el. Then runs `doom-reload-hook'." everyone in the universe and their dog, causing errors that make babies cry. No one wants that.") -(defun doom--byte-compile (file) - (let ((short-name (file-name-nondirectory file))) +(defun doom--byte-compile-file (file) + (let ((short-name (file-name-nondirectory file)) + (byte-compile-dynamic t) + (byte-compile-dynamic-docstrings t)) (condition-case-unless-debug ex (when (byte-compile-file file) (load (byte-compile-dest-file file) nil t) @@ -179,7 +181,7 @@ modified." (replace-match "" t t)) ;; Byte compile it to give the file a chance to reveal errors. (save-buffer) - (doom--byte-compile doom-autoload-file) + (doom--byte-compile-file doom-autoload-file) (when (and noninteractive (not (daemonp))) (doom--server-load doom-autoload-file)) t) @@ -244,7 +246,7 @@ This should be run whenever your `doom!' block or update your packages." (goto-char (match-beginning 1)) (kill-sexp)) (print! (green "✓ Removed load-path/auto-mode-alist entries"))) - (doom--byte-compile doom-package-autoload-file) + (doom--byte-compile-file doom-package-autoload-file) (when (and noninteractive (not (daemonp))) (doom--server-load doom-package-autoload-file)) t)) From bc4fb8f18edc1ff672a0cad3a5653a2e98132504 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 14:08:29 +0200 Subject: [PATCH 1710/4235] Fix helm macro errors due to load order Some packages (like evil-collection and dumb-jump) use helm macros, but Doom cannot ensure helm will be installed by the time these packages are byte-compiled during installation. In fact, the default load order prevents this. Rather than imposing hard load order requirements, we just make sure helm is higher on the packages list, so it gets installed sooner. --- modules/feature/evil/packages.el | 7 +++++++ modules/feature/lookup/packages.el | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index 642acc328..cafea2efc 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -1,6 +1,13 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/evil/packages.el +;; `evil-collection' uses the `with-helm-buffer' macro, but this requires helm +;; be loaded before it is byte-compiled during installation. To ensure this, we +;; declare helm before evil-collection. +(when (featurep! :completion helm) + (depends-on! :completion helm)) + +;; (package! evil) (package! evil-args) (package! evil-commentary) diff --git a/modules/feature/lookup/packages.el b/modules/feature/lookup/packages.el index cf09f591b..edfc1acad 100644 --- a/modules/feature/lookup/packages.el +++ b/modules/feature/lookup/packages.el @@ -1,6 +1,13 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/lookup/packages.el +;; `dumb-jump' uses the `helm-build-sync-source' macro, but this requires helm be +;; loaded before it is byte-compiled during installation. To ensure this, we +;; declare helm before dumb-jump. +(when (featurep! :completion helm) + (depends-on! :completion helm)) + +;; (package! dumb-jump) (when (featurep! :completion ivy) (package! ivy-xref)) From f5fe36af23382896d7e2397a7a9d19231e99efbe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 15:38:58 +0200 Subject: [PATCH 1711/4235] Add :config literate module It will tangle and byte-compile a config.org in your private config. Doom will then load the resulting config.elc later. Org is only loaded when updating this file. --- init.example.el | 4 ++++ modules/config/literate/config.el | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 modules/config/literate/config.el diff --git a/init.example.el b/init.example.el index de355bca0..7d03efd15 100644 --- a/init.example.el +++ b/init.example.el @@ -128,6 +128,10 @@ ;impatient-mode ; show off code over HTTP :config + ;; For literate config users. This will tangle+compile a config.org + ;; literate config in your `doom-private-dir' whenever it changes. + ;literate + ;; The default module set reasonable defaults for Emacs. It also provides ;; a Spacemacs-inspired keybinding scheme, a custom yasnippet library, ;; and additional ex commands for evil-mode. Use it as a reference for diff --git a/modules/config/literate/config.el b/modules/config/literate/config.el new file mode 100644 index 000000000..47223c057 --- /dev/null +++ b/modules/config/literate/config.el @@ -0,0 +1,31 @@ +;;; config/literate/config.el -*- lexical-binding: t; -*- + +(defvar +literate-config-file "config.org" + "The literate config file, searched for in `doom-private-dir' (unless this is +an absolute path).") + +(defvar +literate-config-dest-file "config.el" + "The file that `+literate-config-file' will be tangled to, then byte-compiled +from.") + + +;; +(let ((org (expand-file-name +literate-config-file doom-private-dir)) + (elc (expand-file-name (concat +literate-config-dest-file "c") doom-private-dir))) + ;; If config is pre-compiled, then load that + (when (file-newer-than-file-p org elc) + ;; We tangle in a separate, blank process because loading it here would load + ;; all of :lang org, which will be more expensive than it needs to be. + (or (zerop (call-process + "emacs" nil nil nil + "-q" "--batch" "-l" "ob-tangle" "--eval" + (format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")" + org +literate-config-dest-file))) + (error "There was a problem tangling your literate config!")) + + ;; Then byte-compile it! + (require 'bytecomp) + (byte-compile-file +literate-config-dest-file))) + +;; No need to load the resulting file. Doom will do this for us after all +;; modules have finished loading. From 47efd56fd41d6ef7370e0fe8a872341f87f7287f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 16:09:03 +0200 Subject: [PATCH 1712/4235] compile/literate: refactor & recompile on save And add autoloaded commands. This may need work to ensure you don't spawn multiple instances of Emacs all vying to compile the same file. --- modules/config/literate/autoload.el | 23 ++++++++++++++ modules/config/literate/config.el | 48 ++++++++++++++++------------- 2 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 modules/config/literate/autoload.el diff --git a/modules/config/literate/autoload.el b/modules/config/literate/autoload.el new file mode 100644 index 000000000..d4b711b4c --- /dev/null +++ b/modules/config/literate/autoload.el @@ -0,0 +1,23 @@ +;;; config/literate/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook 'org-mode-hook #'+literate|enable-compile-on-save) + +;;;###autoload +(defun +literate|enable-compile-on-save () + "TODO" + (add-hook 'after-save-hook #'+literate|compile-on-save nil 'local)) + +;;;###autoload +(defun +literate|compile-on-save () + "TODO" + (when (and (eq major-mode 'org-mode) + buffer-file-name + (file-in-directory-p buffer-file-name ))) + (+literate/compile)) + +;;;###autoload +(defun +literate/compile (&optional load) + "TODO" + (interactive "P") + (+literate-compile load)) diff --git a/modules/config/literate/config.el b/modules/config/literate/config.el index 47223c057..328a1fa89 100644 --- a/modules/config/literate/config.el +++ b/modules/config/literate/config.el @@ -1,31 +1,37 @@ ;;; config/literate/config.el -*- lexical-binding: t; -*- -(defvar +literate-config-file "config.org" - "The literate config file, searched for in `doom-private-dir' (unless this is -an absolute path).") +(defvar +literate-config-file + (expand-file-name "config.org" doom-private-dir) + "The file path of your literate config file.") -(defvar +literate-config-dest-file "config.el" - "The file that `+literate-config-file' will be tangled to, then byte-compiled -from.") +(defvar +literate-config-dest-file + (expand-file-name "config.el" doom-private-dir) + "The file path that `+literate-config-file' will be tangled to, then +byte-compiled from.") ;; -(let ((org (expand-file-name +literate-config-file doom-private-dir)) - (elc (expand-file-name (concat +literate-config-dest-file "c") doom-private-dir))) - ;; If config is pre-compiled, then load that - (when (file-newer-than-file-p org elc) - ;; We tangle in a separate, blank process because loading it here would load - ;; all of :lang org, which will be more expensive than it needs to be. - (or (zerop (call-process - "emacs" nil nil nil - "-q" "--batch" "-l" "ob-tangle" "--eval" - (format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")" - org +literate-config-dest-file))) - (error "There was a problem tangling your literate config!")) +(defun +literate-compile (&optional load) + "Tangles & compiles `+literate-config-file' if it has changed. If LOAD is +non-nil, load it too!" + (let ((org +literate-config-file) + (elc (concat +literate-config-dest-file "c"))) + ;; If config is pre-compiled, then load that + (when (file-newer-than-file-p org elc) + ;; We tangle in a separate, blank process because loading it here would load + ;; all of :lang org, which will be more expensive than it needs to be. + (or (zerop (call-process + "emacs" nil nil nil + "-q" "--batch" "-l" "ob-tangle" "--eval" + (format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")" + org +literate-config-dest-file))) + (error "There was a problem tangling your literate config!")) + ;; Then byte-compile it! + (require 'bytecomp) + (byte-compile-file +literate-config-dest-file load)))) - ;; Then byte-compile it! - (require 'bytecomp) - (byte-compile-file +literate-config-dest-file))) +;; Let 'er rip! +(+literate-compile) ;; No need to load the resulting file. Doom will do this for us after all ;; modules have finished loading. From 3245c365d7d0b6991da0a9f32229b6132b6590ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 16:14:38 +0200 Subject: [PATCH 1713/4235] config/literate: log compilation --- modules/config/literate/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/literate/config.el b/modules/config/literate/config.el index 328a1fa89..05e2a870e 100644 --- a/modules/config/literate/config.el +++ b/modules/config/literate/config.el @@ -18,6 +18,7 @@ non-nil, load it too!" (elc (concat +literate-config-dest-file "c"))) ;; If config is pre-compiled, then load that (when (file-newer-than-file-p org elc) + (message "Compiling your literate config...") ;; We tangle in a separate, blank process because loading it here would load ;; all of :lang org, which will be more expensive than it needs to be. (or (zerop (call-process @@ -28,7 +29,8 @@ non-nil, load it too!" (error "There was a problem tangling your literate config!")) ;; Then byte-compile it! (require 'bytecomp) - (byte-compile-file +literate-config-dest-file load)))) + (byte-compile-file +literate-config-dest-file load) + (message "Done!")))) ;; Let 'er rip! (+literate-compile) From 21779f66ad4f9e6ddb06e68a9a913322a32e82a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 16:35:16 +0200 Subject: [PATCH 1714/4235] config/literate: remove compile-on-save hooks Too volatile and slow. --- modules/config/literate/autoload.el | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modules/config/literate/autoload.el b/modules/config/literate/autoload.el index d4b711b4c..ecb096aa6 100644 --- a/modules/config/literate/autoload.el +++ b/modules/config/literate/autoload.el @@ -1,21 +1,5 @@ ;;; config/literate/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(add-hook 'org-mode-hook #'+literate|enable-compile-on-save) - -;;;###autoload -(defun +literate|enable-compile-on-save () - "TODO" - (add-hook 'after-save-hook #'+literate|compile-on-save nil 'local)) - -;;;###autoload -(defun +literate|compile-on-save () - "TODO" - (when (and (eq major-mode 'org-mode) - buffer-file-name - (file-in-directory-p buffer-file-name ))) - (+literate/compile)) - ;;;###autoload (defun +literate/compile (&optional load) "TODO" From dd3872dd327e8568332896dae60c1215c647ac76 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 17:20:20 +0200 Subject: [PATCH 1715/4235] Add DOOMDIR envvar So doom-private-dir can be customized via shell dotfiles (or chemacs). --- core/core.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index f55ac5bbd..4c3174ff5 100644 --- a/core/core.el +++ b/core/core.el @@ -49,7 +49,8 @@ Use this for files that change often, like cache files.") (defvar doom-private-dir (eval-when-compile - (or (let ((xdg-path + (or (getenv "DOOMDIR") + (let ((xdg-path (expand-file-name "doom/" (or (getenv "XDG_CONFIG_HOME") "~/.config")))) From a3889dc8b12ede2459ef93fa1be1aeb6cd81ce6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 17:26:31 +0200 Subject: [PATCH 1716/4235] bin/doom: don't set DOOMDIR Now that we use it for doom-private-dir --- bin/doom | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index 08e6c5959..301f23176 100755 --- a/bin/doom +++ b/bin/doom @@ -3,9 +3,9 @@ ":"; command -v $EMACS >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } ":"; VERSION=$($EMACS --version | head -n1) ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } -":"; DOOMDIR=$(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. -":"; [[ $1 == doc || $1 == doctor ]] && { cd "$DOOMDIR"; exec $EMACS --script bin/doom-doctor; exit 0; } -":"; [[ $1 == run ]] && { cd "$DOOMDIR"; shift; exec $EMACS -q --no-splash -l bin/doom "$@"; exit 0; } +":"; DOOMBASE=$(dirname "${BASH_SOURCE:-${(%):-%x}}")/.. +":"; [[ $1 == doc || $1 == doctor ]] && { cd "$DOOMBASE"; exec $EMACS --script bin/doom-doctor; exit 0; } +":"; [[ $1 == run ]] && { cd "$DOOMBASE"; shift; exec $EMACS -q --no-splash -l bin/doom "$@"; exit 0; } ":"; exec $EMACS --script "$0" -- $@ ":"; exit 0 From 90be135d8bbe4ae635c005dcebc6a244ca07d1a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 17:26:45 +0200 Subject: [PATCH 1717/4235] bin/doom: ensure default-directory is in emacs dir user-emacs-directory could be changed elsewhere. --- bin/doom | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index 301f23176..302a8288e 100755 --- a/bin/doom +++ b/bin/doom @@ -71,7 +71,7 @@ (usage) (message "") (error "No command detected, aborting!")) - ((let ((default-directory user-emacs-directory)) + ((let ((default-directory emacs-dir)) (setq argv nil noninteractive 'doom) (doom-dispatch args))))) From e4e2fb55ed22735c38b51ef5d77051b01c4dc7c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 18:39:50 +0200 Subject: [PATCH 1718/4235] feature/workspaces: remove non-side-window fix This was fixed upstream in persp-mode#90. --- modules/feature/workspaces/config.el | 9 --------- 1 file changed, 9 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index bc1467bcf..ebea3ff14 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -123,15 +123,6 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; On `doom/cleanup-session', delete buffers associated with no perspectives (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) - (defun +workspaces|select-non-side-window (&rest _) - "Ensure a side window isn't current when switching workspaces." - (when (window-parameter nil 'window-side) - (select-window - (cl-loop for win in (window-list) - unless (window-parameter win 'window-side) - return win)))) - (add-hook 'persp-before-deactivate-functions #'+workspaces|select-non-side-window) - ;; per-frame workspaces (setq persp-init-frame-behaviour t persp-init-new-frame-behaviour-override nil From 641425ab77aaa55ecf7308b11ed0f56197128369 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 19:49:34 +0200 Subject: [PATCH 1719/4235] Fix "failed" error from +helm/ag{,-from-cwd} #644 Only affected Ag backend. --- modules/completion/helm/autoload/helm.el | 26 ++++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 59d2e67d7..5969e9425 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -18,6 +18,7 @@ (directory (or in project-root)) (default-directory directory) (helm-ag--default-directory directory) + (helm-ag--default-target (list directory)) (engine (or engine (and (executable-find "rg") 'rg) (and (executable-find "ag") 'ag) @@ -61,7 +62,6 @@ (if recursive " -R" "") (if recursive "." "./*")))) (helm-grep-default-recurse-command helm-grep-default-command)) - (message "-- %s (%s)" helm-grep-default-command query) (setq helm-source-grep (helm-build-async-source (capitalize (helm-grep-command t)) :header-name (lambda (_name) "Helm Projectile Grep (C-c ? Help)") @@ -85,7 +85,8 @@ :truncate-lines helm-grep-truncate-lines)) (cl-return t)) (`ag - (list "ag -zS --nocolor --nogroup" + (list "ag -zS" + (if IS-WINDOWS "--vimgrep" "--nocolor --nogroup") (when all-files "-a") (unless recursive "--depth 1"))) (`rg @@ -97,15 +98,18 @@ (when all-files "-a") (unless recursive "--depth 1"))))) (helm-ag-base-command (string-join command " "))) - (setq helm-ag--last-query query) - (helm-attrset 'search-this-file nil helm-ag-source) - (helm-attrset 'name (helm-ag--helm-header helm-ag--default-directory) helm-ag-source) - (helm :sources '(helm-ag-source) - :input query - :prompt prompt - :buffer "*helm-ag*" - :keymap helm-ag-map - :history 'helm-ag--helm-history))) + (if (and (eq engine 'ag) + (equal query "")) + (helm-do-ag directory) + (setq helm-ag--last-query query) + (helm-attrset 'search-this-file nil helm-ag-source) + (helm-attrset 'name (helm-ag--helm-header helm-ag--default-directory) helm-ag-source) + (helm :sources '(helm-ag-source) + :input query + :prompt prompt + :buffer "*helm-ag*" + :keymap helm-ag-map + :history 'helm-ag--helm-history)))) ;;;###autoload (defun +helm/project-search (arg) From 530bdca0977f2cd145e497054f00a72b7c80e306 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Jun 2018 19:50:56 +0200 Subject: [PATCH 1720/4235] Refactor persp-mode-map keybinds Use define-key! instead of individual define-key's --- modules/feature/workspaces/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index ebea3ff14..2d1f359fe 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -115,9 +115,10 @@ Uses `+workspaces-main' to determine the name of the main workspace." (add-hook 'persp-after-load-state-functions #'+workspaces|leave-nil-perspective) ;; Modify `delete-window' to close the workspace if used on the last window - (define-key persp-mode-map [remap restart-emacs] #'+workspace/restart-emacs-then-restore) - (define-key persp-mode-map [remap delete-window] #'+workspace/close-window-or-workspace) - (define-key persp-mode-map [remap evil-delete-window] #'+workspace/close-window-or-workspace) + (define-key! persp-mode-map + [remap restart-emacs] #'+workspace/restart-emacs-then-restore + [remap delete-window] #'+workspace/close-window-or-workspace + [remap evil-delete-window] #'+workspace/close-window-or-workspace) ;; only auto-save when real buffers are present (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) ;; On `doom/cleanup-session', delete buffers associated with no perspectives From fada449bd4e3def83fff928e3f41d35edd48446e Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Tue, 5 Jun 2018 18:02:46 -0500 Subject: [PATCH 1721/4235] Get rid of a stray + --- modules/lang/python/+conda.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/+conda.el b/modules/lang/python/+conda.el index 91eae8690..c94d4d6e9 100644 --- a/modules/lang/python/+conda.el +++ b/modules/lang/python/+conda.el @@ -6,7 +6,7 @@ :after (python) :init (defvar +python-conda-home '("~/.anaconda3" "/usr/bin/anaconda3" "~/.anaconda") -+ "A list of host pattern and corresponding anaconda home.") + "A list of host pattern and corresponding anaconda home.") :config (advice-add 'anaconda-mode-bootstrap :override #'*anaconda-mode-bootstrap) (conda-env-autoactivate-mode -1) From 13413a72e828f0fbb862bed4e053a96096ba9882 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Wed, 6 Jun 2018 18:08:02 +1000 Subject: [PATCH 1722/4235] tools/magit: Show word-granularity on chosen hunk This really seems like it should be a default, it's so handy to get better diffs, sort of like how github does it. if set to 'all then it'll show on all of them, but I think t is good enough. --- modules/tools/magit/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index fe7099dfc..2315682a3 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -22,6 +22,7 @@ load everything.") #'ivy-completing-read #'magit-builtin-completing-read) magit-revision-show-gravatars '("^Author: " . "^Commit: ") + magit-diff-refine-hunk t ;; Show word-granularity on the currently selected hunk magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1) From 732c2979c45840c6927c9b60c71f89dfde930820 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Thu, 7 Jun 2018 01:06:02 +0800 Subject: [PATCH 1723/4235] Naming convention and add docs; Avoid conflicting pyenv. --- modules/lang/python/+conda.el | 6 +++--- modules/lang/python/autoload/conda.el | 23 +++++++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/modules/lang/python/+conda.el b/modules/lang/python/+conda.el index c94d4d6e9..2ff74999c 100644 --- a/modules/lang/python/+conda.el +++ b/modules/lang/python/+conda.el @@ -8,11 +8,11 @@ (defvar +python-conda-home '("~/.anaconda3" "/usr/bin/anaconda3" "~/.anaconda") "A list of host pattern and corresponding anaconda home.") :config - (advice-add 'anaconda-mode-bootstrap :override #'*anaconda-mode-bootstrap) + (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap) (conda-env-autoactivate-mode -1) ;; (add-hook 'python-mode-hook #'conda-env-activate-for-buffer) (conda-env-initialize-interactive-shells) (conda-env-initialize-eshell) ;; Version management with conda - (add-hook 'conda-postactivate-hook #'+python|add-version-to-modeline) - (add-hook 'conda-postdeactivate-hook #'+python|add-version-to-modeline)) + (add-hook 'conda-postactivate-hook #'+python|add-conda-env-to-modeline) + (add-hook 'conda-postdeactivate-hook #'+python|add-conda-env-to-modeline)) diff --git a/modules/lang/python/autoload/conda.el b/modules/lang/python/autoload/conda.el index 84d53ceab..62778c27d 100644 --- a/modules/lang/python/autoload/conda.el +++ b/modules/lang/python/autoload/conda.el @@ -3,21 +3,28 @@ ;;;###autoload (defun +python/set-conda-home () - (interactive) - (ivy-read "Set conda home:" +python-conda-home - :history +python/set-conda-home--history - :action (lambda (cand) (setq conda-anaconda-home cand)))) + "Set the CONDA HOME. +Usually it's `~/.anaconda3' on local machine, but you can also set it to a +remote directory using TRAMP syntax such as `/ssh:host:/usr/bin/anaconda3'. In +that way you can use the remote conda environment as well as the corresponding +remote python executable and packages." + (interactive) + (ivy-read "Set conda home:" +python-conda-home + :history +python/set-conda-home--history + :action (lambda (cand) (setq conda-anaconda-home cand)))) ;;;###autoload -(defun +python|add-version-to-modeline () - "Add version string to the major mode in the modeline." +(defun +python|add-conda-env-to-modeline () + "Add conda environment string to the major mode in the modeline." (setq mode-name (if conda-env-current-name (format "Py:conda:%s" conda-env-current-name) "Python"))) ;;;###autoload -(defun *anaconda-mode-bootstrap (&optional callback) - "Run `anaconda-mode' server. +(defun +python*anaconda-mode-bootstrap (&optional callback) + "Advice to set up the anaconda-mode even in remote environment. +Original doc: +Run `anaconda-mode' server. CALLBACK function will be called when `anaconda-mode-port' will be bound." (setq anaconda-mode-process From 1d6d11e803906f1b2170a844608de3a823588486 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Thu, 7 Jun 2018 01:12:03 +0800 Subject: [PATCH 1724/4235] add meta doc --- modules/lang/python/+conda.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/python/+conda.el b/modules/lang/python/+conda.el index 2ff74999c..78f373b8a 100644 --- a/modules/lang/python/+conda.el +++ b/modules/lang/python/+conda.el @@ -1,6 +1,9 @@ ;;; lang/python/+conda.el -*- lexical-binding: t; -*- ;;;###if (featurep! +conda) +;; This file add conda support to doom-emacs. To get started, try `M-x' +;; `+python/set-conda-home' and then `M-x' `conda-env-activate'. + (def-package! conda :when (featurep! +conda) :after (python) From b26bbd476241ea992022d5f66ed7158c6de84c18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 02:38:39 +0200 Subject: [PATCH 1725/4235] Fix args-out-of-range in enable-minor-mode-maybe Caused by trying to use out-of-scope match data. --- core/core.el | 2 +- modules/tools/magit/config.el | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 4c3174ff5..47fd3e018 100644 --- a/core/core.el +++ b/core/core.el @@ -138,7 +138,7 @@ enable multiple minor modes for the same regexp.") (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)) + (string-match (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) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 2315682a3..ecaaa75c8 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -24,7 +24,18 @@ load everything.") magit-revision-show-gravatars '("^Author: " . "^Commit: ") magit-diff-refine-hunk t ;; Show word-granularity on the currently selected hunk magit-display-buffer-function - #'magit-display-buffer-fullframe-status-v1) + #'+magit-display-buffer-fullscreen) + + (defun +magit-display-buffer-fullscreen (buffer) + (cond ((eq (with-current-buffer buffer major-mode) + 'magit-status-mode) + (display-buffer buffer '(magit--display-buffer-fullframe))) + ((if-let* ((status (magit-mode-get-buffer 'magit-status-mode t nil nil))) + (when-let* ((window (get-buffer-window status))) + (unless (window-parameter window 'side) + (delete-other-windows window) + (display-buffer-in-side-window status '((side . left))))) + (magit-display-buffer-traditional buffer))))) (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) ;; Consider magit buffers real (so they can switched to) From 85a0c9efc96c953ccbab08be94fd499f607b2e03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 15:01:28 +0200 Subject: [PATCH 1726/4235] New default display-buffer handler for magit +magit-display-buffer-fullscreen is a more sophisticated (albeit experimental) replacement for magit-display-buffer-fullframe-status-v1, which fullscreens magit, but will also: a) Keep the status window visible b) Treat magit buffers not opened from magit-status as popups --- modules/tools/magit/autoload.el | 34 +++++++++++++++++++++++++++++++++ modules/tools/magit/config.el | 18 ++--------------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 9645426e8..4bc336c7c 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -1,5 +1,39 @@ ;;; tools/magit/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +magit-display-buffer-fullscreen (buffer) + "Like `magit-display-buffer-fullframe-status-v1' with two differences: + +1. Magit sub-buffers that aren't spawned from a status screen are opened as + popups. +2. The status screen isn't buried when viewing diffs or logs from the status + screen." + (display-buffer + buffer (cond ((derived-mode-p 'magit-mode) + (when (eq major-mode 'magit-status-mode) + (display-buffer-in-side-window + (current-buffer) '((side . left) + (window-width . 0.35) + (window-parameters (quit))))) + '(display-buffer-same-window)) + ((bound-and-true-p git-commit-mode) + '(display-buffer-below-selected)) + ((buffer-local-value 'git-commit-mode buffer) + '(magit--display-buffer-fullframe)) + ((memq (buffer-local-value 'major-mode buffer) + '(magit-process-mode + magit-revision-mode + magit-log-mode + magit-diff-mode + magit-stash-mode)) + '(display-buffer-in-side-window)) + ('(magit--display-buffer-fullframe))))) + + +;; +;; Commands +;; + ;;;###autoload (defun +magit/quit (&optional _kill-buffer) "Clean up magit buffers after quitting `magit-status'." diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index ecaaa75c8..720e957e0 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -23,25 +23,11 @@ load everything.") #'magit-builtin-completing-read) magit-revision-show-gravatars '("^Author: " . "^Commit: ") magit-diff-refine-hunk t ;; Show word-granularity on the currently selected hunk - magit-display-buffer-function - #'+magit-display-buffer-fullscreen) - - (defun +magit-display-buffer-fullscreen (buffer) - (cond ((eq (with-current-buffer buffer major-mode) - 'magit-status-mode) - (display-buffer buffer '(magit--display-buffer-fullframe))) - ((if-let* ((status (magit-mode-get-buffer 'magit-status-mode t nil nil))) - (when-let* ((window (get-buffer-window status))) - (unless (window-parameter window 'side) - (delete-other-windows window) - (display-buffer-in-side-window status '((side . left))))) - (magit-display-buffer-traditional buffer))))) + magit-display-buffer-function #'+magit-display-buffer-fullscreen) (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) ;; Consider magit buffers real (so they can switched to) - (defun +magit-buffer-p (buf) - (with-current-buffer buf (derived-mode-p 'magit-mode))) - (add-to-list 'doom-real-buffer-functions #'+magit-buffer-p nil #'eq) + (add-hook 'magit-mode-hook #'doom|mark-buffer-as-real) ;; no mode-line in magit popups (add-hook! '(magit-mode-hook magit-popup-mode-hook) #'hide-mode-line-mode) From b4e6022c82efb51d80c3d39f8a9b17900a735c5a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 15:04:58 +0200 Subject: [PATCH 1727/4235] Fix buffer/window/frame hooks not being triggered In certain edge cases, the buffer/window/frame switch would not make the new buffer/window/frame current, which is what the after switch hooks should reasonably expect, causing some shenanigans. For example, persp wouldn't register magit buffers because `doom-after-switch-buffer-hook` was run in the context of the previous buffer. --- core/core-ui.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index a052e7dbf..ebec467b4 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -364,7 +364,8 @@ from the default." (funcall orig-fn frame norecord) (run-hooks 'doom-before-switch-frame-hook) (prog1 (funcall orig-fn frame norecord) - (run-hooks 'doom-after-switch-frame-hook)))) + (with-selected-frame frame + (run-hooks 'doom-after-switch-frame-hook))))) (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks (eq window (selected-window)) @@ -375,17 +376,20 @@ from the default." (prog1 (let ((doom-inhibit-switch-window-hooks t)) (funcall orig-fn window norecord)) - (run-hooks 'doom-after-switch-window-hook)))) + (with-selected-window window + (run-hooks 'doom-after-switch-window-hook))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) (if (or doom-inhibit-switch-buffer-hooks (eq (window-normalize-buffer-to-switch-to buffer-or-name) (current-buffer))) (apply orig-fn buffer-or-name args) - (run-hooks 'doom-before-switch-buffer-hook) - (prog1 - (let ((doom-inhibit-switch-buffer-hooks t)) - (apply orig-fn buffer-or-name args)) - (run-hooks 'doom-after-switch-buffer-hook)))) + (let ((dest (window-normalize-buffer-to-switch-to buffer-or-name))) + (run-hooks 'doom-before-switch-buffer-hook) + (prog1 + (let ((doom-inhibit-switch-buffer-hooks t)) + (apply orig-fn dest args)) + (with-current-buffer dest + (run-hooks 'doom-after-switch-buffer-hook)))))) (defun doom|init-custom-hooks () (advice-add #'select-frame :around #'doom*switch-frame-hooks) From e4a55d31bc24b717997f70d710c6e94bec12074f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 15:06:56 +0200 Subject: [PATCH 1728/4235] Don't abort package install on aborting autoremove Originally, it would not bother running doom//packages-install if you aborted (answered "n" to the prompt) during doom//packages-autoremove. --- core/core-dispatcher.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index a4f9ffead..0db531811 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -221,8 +221,8 @@ problems with doom." (interactive) (doom//reload-doom-autoloads) (unwind-protect - (progn (doom//packages-autoremove) - (doom//packages-install)) + (progn (ignore-errors (doom//packages-autoremove)) + (ignore-errors (doom//packages-install))) (doom//reload-package-autoloads) (doom//byte-compile nil 'recompile))) From fcb5284393497fe51aa083a5512a1403034616fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 15:15:56 +0200 Subject: [PATCH 1729/4235] Update switch-buffer hooks' docstrings --- core/core-ui.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index ebec467b4..c3fec02fa 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -41,12 +41,16 @@ with `doom//reload-theme').") `doom-before-switch-window-hook'.") (defvar doom-before-switch-buffer-hook nil - "Hook run before `switch-to-buffer' and `display-buffer' are called. See -`doom-after-switch-buffer-hook'.") + "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-after-switch-buffer-hook'.") (defvar doom-after-switch-buffer-hook nil - "Hook run before `switch-to-buffer' and `display-buffer' are called. See -`doom-before-switch-buffer-hook'.") + "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-before-switch-buffer-hook'.") (setq-default From dda81f7b54261537640e61c860148dc83643c898 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 19:21:27 +0200 Subject: [PATCH 1730/4235] Fix insertion order of add-hook! when appending When appending multiple functions to a hook(s) with add-hook!, insertion order was not preserved. e.g. => (add-hook! :append 'some-mode-hook #'(hook-1 hook-2)) => some-mode-hook (hook-2 hook-1) --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 62afe9a6f..83b891fbd 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -304,7 +304,7 @@ Body forms can access the hook's arguments through the let-bound variable `(remove-hook ',hook ,fn ,local-p) `(add-hook ',hook ,fn ,append-p ,local-p)) forms))) - `(progn ,@forms)))) + `(progn ,@(if append-p (nreverse forms) forms))))) (defmacro remove-hook! (&rest args) "Convenience macro for `remove-hook'. Takes the same arguments as From ef9d8fb2e8ade7508608674b2513ab986d40e47b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Jun 2018 19:23:27 +0200 Subject: [PATCH 1731/4235] Don't trigger whitespace-mode if already on Normally doom|show-whitespace-maybe turns on whitespace-mode with a subset of its features when indent-tabs-mode was different in that buffer versus it's global default. e.g. If your default was spaces and you opened a file with tabs. This is to make it easier to notice whitespace style discrepancies. However, it have side effects if whitespace-mode/global-whitespace-mode was already on. --- core/core-ui.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index c3fec02fa..ffb5585f8 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -341,7 +341,9 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (defun doom|show-whitespace-maybe () "Show whitespace-mode when file has an `indent-tabs-mode' that is different from the default." - (unless (or (eq indent-tabs-mode (default-value 'indent-tabs-mode)) + (unless (or (bound-and-true-p global-whitespace-mode) + (bound-and-true-p whitespace-mode) + (eq indent-tabs-mode (default-value 'indent-tabs-mode)) (eq major-mode 'fundamental-mode) (derived-mode-p 'special-mode)) (require 'whitespace) From 69a796ff60f4d61765460c5ab5ac12b9f8397913 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 02:43:07 +0200 Subject: [PATCH 1732/4235] Don't invoke doom/escape too eagerly from evil This fixes an issue where certain evil plugins would call evil-force-normal-state non-interactively, causing `doom-escape-hook` to wreck havoc. Instead, this should only happen when evil-force-normal-state is called interactively (e.g. via ESC in normal mode). Fixes evil-mc-make-cursor-move-next-line and evil-mc-make-cursor-move-prev-line. --- modules/feature/evil/autoload/evil.el | 6 ++++++ modules/feature/evil/config.el | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 98c432ae0..20fd27355 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -358,3 +358,9 @@ more information on modifiers." (when (and (not count) evil-auto-balance-windows) (balance-windows (window-parent))) (if file (evil-edit file))) + +;;;###autoload +(defun +evil*escape (&rest _) + "Call `doom/escape' if `evil-force-normal-state' is called interactively." + (when (called-interactively-p 'any) + (call-interactively #'doom/escape))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 5f3de983a..25ae2790d 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -120,7 +120,7 @@ variable for an explanation of the defaults (in comments). See (setq save-silently t) (add-hook 'after-save-hook #'+evil|save-buffer)) ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. - (advice-add #'evil-force-normal-state :after #'doom/escape) + (advice-add #'evil-force-normal-state :after #'+evil*escape) ;; Don't move cursor when indenting (advice-add #'evil-indent :around #'+evil*static-reindent) ;; monkey patch `evil-ex-replace-special-filenames' to improve support for From a149313e71e31dff93d1ab0b1a18648ea25743d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 02:44:59 +0200 Subject: [PATCH 1733/4235] config/default: add gzj/gzk binds for evil-mc --- modules/config/default/+bindings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index c936cd02e..ca0655594 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -225,7 +225,9 @@ :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) + :nv "D" #'evil-mc-make-and-goto-prev-match + :nv "j" #'evil-mc-make-cursor-move-next-line + :nv "k" #'evil-mc-make-cursor-move-prev-line) (:after evil-mc :map evil-mc-key-map :nv "C-n" #'evil-mc-make-and-goto-next-cursor From f22eeff7634532ad2f1882cf3b41eb4bc1caed7f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 02:45:45 +0200 Subject: [PATCH 1734/4235] Add treemacs-mode to evil-escape-excluded-major-modes Fixes an unresponsive "j" key in treemacs-mode. --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 25ae2790d..48038f748 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -239,7 +239,7 @@ variable for an explanation of the defaults (in comments). See :commands (evil-escape evil-escape-mode evil-escape-pre-command-hook) :init (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) - evil-escape-excluded-major-modes '(neotree-mode) + evil-escape-excluded-major-modes '(neotree-mode treemacs-mode) evil-escape-key-sequence "jk" evil-escape-delay 0.25) (add-hook 'pre-command-hook #'evil-escape-pre-command-hook) From 37946080e293d563fce3fcdb0cf1c9f1ce1dae3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 02:48:03 +0200 Subject: [PATCH 1735/4235] Add :yas-minor-mode setting to feature/snippets --- modules/feature/snippets/autoload/snippets.el | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index dd36f8520..31ae098aa 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -1,5 +1,20 @@ ;;; feature/snippets/autoload/snippets.el -*- lexical-binding: t; -*- +;;;###autoload +(def-setting! :yas-minor-mode (mode) + "Register a minor MODE with yasnippet so it can have its own snippets +category, if the folder exists." + (let* ((mode (doom-unquote mode)) + (hookfn (intern (format "+snippets--register-%s" mode)))) + `(after! yasnippet + (fset ',hookfn (lambda () (+snippets|enable-project-modes ',mode))) + (add-hook! ,mode #',hookfn)))) + + +;; +;; Commands +;; + ;;;###autoload (defun +snippets/goto-start-of-field () "Go to the beginning of the current field." From b207c4040b2f587b814cb12240f14087faef24e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 02:49:32 +0200 Subject: [PATCH 1736/4235] Minor, general refactor --- core/core-packages.el | 1 - core/core-projects.el | 10 +++++----- core/core-ui.el | 2 +- modules/config/default/config.el | 5 +++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index d54480977..6e626a48d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -119,7 +119,6 @@ Doom was setup, which can cause problems.") quelpa-verbose doom-debug-mode quelpa-dir (expand-file-name "quelpa" doom-packages-dir) - byte-compile-dynamic nil byte-compile-verbose doom-debug-mode byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local)) diff --git a/core/core-projects.el b/core/core-projects.el index 509b7c244..4446b28ec 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -25,11 +25,11 @@ "node_modules" "flow-typed")) projectile-other-file-alist (append projectile-other-file-alist - '(("css" . ("scss" "sass" "less" "styl")) - ("scss" . ("css")) - ("sass" . ("css")) - ("less" . ("css")) - ("styl" . ("css"))))) + '(("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. diff --git a/core/core-ui.el b/core/core-ui.el index ffb5585f8..9452ed007 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -677,7 +677,7 @@ confirmation." (setq mode-name (cond ((functionp name) (funcall name)) ((stringp name) name) - (t (error "'%s' isn't a valid name for %s" name major-mode)))))) + ((error "'%s' isn't a valid name for %s" name major-mode)))))) (defun doom|protect-visible-buffers () "Don't kill the current buffer if it is visible in another window (bury it diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 22855bf85..272ad49d7 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -98,8 +98,9 @@ customized by changing `+default-repeat-forward-key' and (let ((fn-sym (intern (format "+evil*repeat-%s" (doom-unquote command))))) `(progn (defun ,fn-sym (&rest _) - (define-key evil-motion-state-map +default-repeat-forward-key #',next-func) - (define-key evil-motion-state-map +default-repeat-backward-key #',prev-func)) + (define-key! evil-motion-state-map + +default-repeat-forward-key #',next-func + +default-repeat-backward-key #',prev-func)) (advice-add #',command :before #',fn-sym))))) ;; n/N From 363407d9e61ab83c07ca6e7103e569b9844f8740 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 7 Jun 2018 13:53:13 +0200 Subject: [PATCH 1737/4235] Fix C-g resetting latex windows after opening the reftex-toc --- modules/lang/latex/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 809507d71..dbb90c62f 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -152,8 +152,7 @@ :e "j" #'next-line :e "k" #'previous-line :e "q" #'kill-buffer-and-window - :e "ESC" #'kill-buffer-and-window - "C-g" #'reftex-toc-quit))) + :e "ESC" #'kill-buffer-and-window))) (def-package! bibtex From ee262e7737b08a1c7c0037af009c125d23a8464c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 17:59:23 +0200 Subject: [PATCH 1738/4235] Refactor error handling in package management API I am hoping this will improve the ambiguous errors that originate from package.el or quelpa.el. --- core/autoload/packages.el | 50 ++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index a35641f3d..c890a9cec 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -16,18 +16,14 @@ (defmacro doom--condition-case! (&rest body) `(condition-case-unless-debug ex - (condition-case ex2 - (progn ,@body) - ('file-error - (print! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) - (print! " Trying again...") - (quiet! (doom-refresh-packages-maybe t)) - ,@body)) + (progn ,@body) ('user-error - (print! (bold (red " ERROR: %s" ex)))) - ('error - (doom--refresh-pkg-cache) - (print! (bold (red " FATAL ERROR: %s" ex)))))) + (print! (bold (red " NOTICE: %s" ex)))) + ('file-error + (print! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) + (print! " Trying again...") + (quiet! (doom-refresh-packages-maybe t)) + ,@body))) (defun doom--refresh-pkg-cache () "Clear the cache for `doom-refresh-packages-maybe'." @@ -60,7 +56,7 @@ (defun doom-package-backend (name &optional noerror) "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) + (cl-check-type name symbol) (cond ((assq name quelpa-cache) 'quelpa) ((assq name package-alist) @@ -75,7 +71,7 @@ quelpa. Throws an error if NOERROR is nil and the package isn't installed." "Determine whether NAME (a symbol) is outdated or not. If outdated, returns a list, whose car is NAME, and cdr the current version list and latest version list of the package." - (cl-assert (symbolp name) t) + (cl-check-type name symbol) (when-let* ((desc (cadr (assq name package-alist)))) (let* ((old-version (package-desc-version desc)) (new-version @@ -100,15 +96,16 @@ list of the package." ;;;###autoload (defun doom-package-prop (name prop) "Return PROPerty in NAME's plist." - (cl-assert (symbolp name) t) - (cl-assert (keywordp prop) t) + (cl-check-type name symbol) + (cl-check-type prop keyword) (plist-get (cdr (assq name doom-packages)) prop)) ;;;###autoload (defun doom-package-different-backend-p (name) "Return t if a package named NAME (a symbol) has a new backend than what it was installed with. Returns nil otherwise, or if package isn't installed." - (cl-assert (symbolp name) t) + (cl-check-type name symbol) + (doom-initialize-packages) (and (package-installed-p name) (let* ((plist (cdr (assq name doom-packages))) (old-backend (doom-package-backend name 'noerror)) @@ -119,7 +116,7 @@ was installed with. Returns nil otherwise, or if package isn't installed." (defun doom-package-different-recipe-p (name) "Return t if a package named NAME (a symbol) has a different recipe than it was installed with." - (cl-assert (symbolp name) t) + (cl-check-type name symbol) (when (package-installed-p name) (let ((quelpa-recipe (assq name quelpa-cache)) (doom-recipe (assq name doom-packages))) @@ -153,14 +150,17 @@ 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." + (cl-check-type name symbol) (when (package-built-in-p name) (error "Can't get the dependency tree for built-in packages")) - (when-let* ((desc (cadr (assq name package-alist)))) - (mapcar #'package-desc-name (package--used-elsewhere-p desc nil t)))) + (if-let* ((desc (cadr (assq name package-alist)))) + (mapcar #'package-desc-name (package--used-elsewhere-p desc nil t)) + (error "Couldn't find %s, is it installed?" name))) ;;;###autoload (defun doom-get-dependencies-for (name &optional only) "Return a list of dependencies for a package." + (cl-check-type name symbol) (when (package-built-in-p name) (error "Can't get the dependency tree for built-in packages")) (package--get-deps name only)) @@ -262,6 +262,7 @@ Used by `doom//packages-install'." (defun doom-install-package (name &optional plist) "Installs package NAME with optional quelpa RECIPE (see `quelpa-recipe' for an example; the package name can be omitted)." + (cl-check-type name symbol) (doom-initialize-packages) (when (and (package-installed-p name) (not (package-built-in-p name))) @@ -286,6 +287,8 @@ 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." + (cl-check-type name symbol) + (doom-initialize-packages) (unless (package-installed-p name) (user-error "%s isn't installed" name)) (when (doom-package-different-backend-p name) @@ -294,10 +297,10 @@ package.el as appropriate." (let ((inhibit-message (not doom-debug-mode)) (desc (cadr (assq name package-alist)))) (pcase (doom-package-backend name) - ('quelpa + (`quelpa (let ((quelpa-upgrade-p t)) (quelpa (assq name quelpa-cache)))) - ('elpa + (`elpa (let* ((archive (cadr (assq name package-archive-contents))) (packages (if (package-desc-p archive) @@ -313,6 +316,8 @@ package.el as appropriate." ;;;###autoload (defun doom-delete-package (name &optional force-p) "Uninstalls package NAME if it exists, and clears it from `quelpa-cache'." + (cl-check-type name symbol) + (doom-initialize-packages) (unless (package-installed-p name) (user-error "%s isn't installed" name)) (let ((inhibit-message (not doom-debug-mode)) @@ -322,7 +327,8 @@ package.el as appropriate." (quelpa-save-cache) (setq quelpa-p t)) (package-delete (cadr (assq name package-alist)) force-p) - (unless (package-installed-p name) + (when (or (not (package-installed-p name)) + (package-built-in-p name)) (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) (when (and quelpa-p (file-directory-p pkg-build-dir)) (delete-directory pkg-build-dir t))) From 99afb013157e45ac507637775fa9cdbc575c07b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 18:01:06 +0200 Subject: [PATCH 1739/4235] equals -> file-equal-p refactor Use more reliable file comparison function. --- core/autoload/files.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 687ee2d91..31a166567 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -49,8 +49,7 @@ (make-directory new-path-dir t)) (when (buffer-modified-p) (save-buffer)) - (cond ((equal (file-truename old-path) - (file-truename new-path)) + (cond ((file-equal-p old-path new-path) (throw 'status 'overwrite-self)) ((and (file-exists-p new-path) (not force-p) From ab980202952eebb3d864df9c81d4e877984a5fd8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 18:01:39 +0200 Subject: [PATCH 1740/4235] Optimize buffer normalization in switch hooks get-buffer is faster than window-normalize-buffer-to-switch-to. --- core/core-ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9452ed007..07f2150f6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -386,10 +386,10 @@ from the default." (run-hooks 'doom-after-switch-window-hook))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) (if (or doom-inhibit-switch-buffer-hooks - (eq (window-normalize-buffer-to-switch-to buffer-or-name) + (eq (get-buffer buffer-or-name) (current-buffer))) (apply orig-fn buffer-or-name args) - (let ((dest (window-normalize-buffer-to-switch-to buffer-or-name))) + (let ((dest (get-buffer buffer-or-name))) (run-hooks 'doom-before-switch-buffer-hook) (prog1 (let ((doom-inhibit-switch-buffer-hooks t)) From 56b4cba96422453016303eceb70a717336efcfab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 18:03:58 +0200 Subject: [PATCH 1741/4235] Fix solium error preventing solidity-mode #659 Now conditionally activates flycheckers using the existence of their binaries at load time. --- modules/lang/solidity/config.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index ae60beb06..860997c7f 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -5,17 +5,20 @@ ;; ;; `solidity-mode' -(setq solidity-comment-style 'slash - solidity-flycheck-solc-checker-active t - solidity-flycheck-solium-checker-active t) +(setq solidity-comment-style 'slash) (def-package! solidity-flycheck ; included with solidity-mode :when (featurep! :feature syntax-checker) :after solidity-mode :init (add-hook 'solidity-mode-hook #'flycheck-mode) - :config (setq flycheck-solidity-solc-addstd-contracts t)) - + :config + (setq flycheck-solidity-solc-addstd-contracts t) + (when (funcall flycheck-executable-find solidity-solc-path) + (add-to-list 'flycheck-checkers 'solidity-checker nil #'eq)) + (when (funcall flycheck-executable-find solidity-solium-path) + (add-to-list 'flycheck-checkers 'solium-checker nil #'eq))) + (def-package! company-solidity :when (featurep! :completion company) From e918040e708bba99af9a08400a472cef84c97704 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 18:28:31 +0200 Subject: [PATCH 1742/4235] Add :ui fci module for fill-column-indicator --- modules/ui/fci/autoload.el | 16 ++++++++++++++++ modules/ui/fci/config.el | 14 ++++++++++++++ modules/ui/fci/packages.el | 4 ++++ 3 files changed, 34 insertions(+) create mode 100644 modules/ui/fci/autoload.el create mode 100644 modules/ui/fci/config.el create mode 100644 modules/ui/fci/packages.el diff --git a/modules/ui/fci/autoload.el b/modules/ui/fci/autoload.el new file mode 100644 index 000000000..f59f555db --- /dev/null +++ b/modules/ui/fci/autoload.el @@ -0,0 +1,16 @@ +;;; ui/fci/autoload.el -*- lexical-binding: t; -*- + +(defvar-local +fci-last-state nil) + +;;;###autoload +(defun +fci|disable-when-company-activates (&rest ignore) + "TODO" + (setq +fci-last-state fci-mode) + (when fci-mode + (fci-mode -1))) + +;;;###autoload +(defun +fci|enable-when-company-deactivates (&rest ignore) + "TODO" + (when +fci-last-state + (fci-mode 1))) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el new file mode 100644 index 000000000..5aaf50ef3 --- /dev/null +++ b/modules/ui/fci/config.el @@ -0,0 +1,14 @@ +;;; ui/fci/config.el -*- lexical-binding: t; -*- + +(def-package! fill-column-indicator + :hook ((text-mode prog-mode conf-mode) . turn-on-fci-mode) + :config + (defun +fci|set-color () + (setq fci-rule-color (face-foreground 'line-number))) + (add-hook 'doom-load-theme-hook #'+fci|set-color) + (+fci|set-color) + + (when (featurep! :completion company) + (add-hook 'company-completion-started-hook #'+fci|disable-when-company-activates) + (add-hook! '(company-completion-finished-hook company-completion-cancelled-hook) + #'+fci|enable-when-company-deactivates))) diff --git a/modules/ui/fci/packages.el b/modules/ui/fci/packages.el new file mode 100644 index 000000000..26d8b1335 --- /dev/null +++ b/modules/ui/fci/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/fci/packages.el + +(package! fill-column-indicator) From 70ce322e99fb996cf47bd5da907b69105703195d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Jun 2018 18:33:00 +0200 Subject: [PATCH 1743/4235] Add :tools wakatime module --- modules/tools/wakatime/autoload.el | 13 +++++++++++++ modules/tools/wakatime/packages.el | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 modules/tools/wakatime/autoload.el create mode 100644 modules/tools/wakatime/packages.el diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el new file mode 100644 index 000000000..915abcce9 --- /dev/null +++ b/modules/tools/wakatime/autoload.el @@ -0,0 +1,13 @@ +;;; tools/wakatime/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook 'doom-after-switch-buffer-hook #'+wakatime-init) + +;;;###autoload +(defun +wakatime-init () + "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a +warning)." + (if wakatime-api-key + (global-wakatime-mode +1) + (message "No `wakatime-api-key' set! wakaktime-mode will stay disabled.")) + (remove-hook 'doom-after-switch-buffer-hook #'+wakatime-init)) diff --git a/modules/tools/wakatime/packages.el b/modules/tools/wakatime/packages.el new file mode 100644 index 000000000..2df681c92 --- /dev/null +++ b/modules/tools/wakatime/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/wakatime/packages.el + +(package! wakatime-mode) From 426935e4ee871063e10921b063287ba9bcc1ac62 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 01:45:05 +0200 Subject: [PATCH 1744/4235] Add wakatime/fci to init.example.el --- init.example.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/init.example.el b/init.example.el index 7d03efd15..ecefd0b92 100644 --- a/init.example.el +++ b/init.example.el @@ -31,6 +31,7 @@ doom-modeline ; a snazzy Atom-inspired mode-line doom-quit ; DOOM quit-message prompts when you quit Emacs evil-goggles ; display visual hints when editing in evil + ;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping neotree ; a project drawer, like NERDTree for vim @@ -64,6 +65,7 @@ rotate-text ; cycle region at point between text candidates tmux ; an API for interacting with tmux upload ; map local to remote projects via ssh/ftp + ;wakatime :lang ;assembly ; assembly for fun or debugging From 99d6927e563bcc18d73581a2fae306fd9aa5cfec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 01:42:08 +0200 Subject: [PATCH 1745/4235] Improve error-handling for quelpa packages --- core/autoload/packages.el | 46 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c890a9cec..ca5a00921 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -258,6 +258,14 @@ Used by `doom//packages-install'." ;; Main functions ;; +(defun doom--delete-package-files (name-or-desc) + (let ((pkg-build-dir + (if (package-desc-p name-or-desc) + (package-desc-dir name-or-desc) + (expand-file-name (symbol-name name-or-desc) quelpa-build-dir)))) + (when (file-directory-p pkg-build-dir) + (delete-directory pkg-build-dir t)))) + ;;;###autoload (defun doom-install-package (name &optional plist) "Installs package NAME with optional quelpa RECIPE (see `quelpa-recipe' for an @@ -273,13 +281,14 @@ example; the package name can be omitted)." (let* ((inhibit-message (not doom-debug-mode)) (plist (or plist (cdr (assq name doom-packages))))) (if-let* ((recipe (plist-get plist :recipe))) - (let (quelpa-upgrade-p) - (quelpa recipe)) + (condition-case e + (let (quelpa-upgrade-p) + (quelpa recipe)) + ('error (doom--delete-package-files name) + (signal (car e) (cdr e)))) (package-install name)) (if (not (package-installed-p name)) - (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) - (when (file-directory-p pkg-build-dir) - (delete-directory pkg-build-dir t))) + (doom--delete-package-files name) (map-put doom-packages name plist) name))) @@ -298,8 +307,11 @@ package.el as appropriate." (desc (cadr (assq name package-alist)))) (pcase (doom-package-backend name) (`quelpa - (let ((quelpa-upgrade-p t)) - (quelpa (assq name quelpa-cache)))) + (condition-case e + (let ((quelpa-upgrade-p t)) + (quelpa (assq name quelpa-cache))) + ('error (doom--delete-package-files name) + (signal (car e) (cdr e))))) (`elpa (let* ((archive (cadr (assq name package-archive-contents))) (packages @@ -308,9 +320,7 @@ package.el as appropriate." (package-compute-transaction () (list (list archive)))))) (package-download-transaction packages)))) (unless (doom-package-outdated-p name) - (when-let* ((old-dir (package-desc-dir desc))) - (when (file-directory-p old-dir) - (delete-directory old-dir t))) + (doom--delete-package-files desc) t)))) ;;;###autoload @@ -323,16 +333,12 @@ package.el as appropriate." (let ((inhibit-message (not doom-debug-mode)) quelpa-p) (when (assq name quelpa-cache) - (map-delete quelpa-cache name) + (setq quelpa-cache (map-delete quelpa-cache name)) (quelpa-save-cache) (setq quelpa-p t)) (package-delete (cadr (assq name package-alist)) force-p) - (when (or (not (package-installed-p name)) - (package-built-in-p name)) - (let ((pkg-build-dir (expand-file-name (symbol-name name) quelpa-build-dir))) - (when (and quelpa-p (file-directory-p pkg-build-dir)) - (delete-directory pkg-build-dir t))) - t))) + (doom--delete-package-files name) + (not (package-installed-p name)))) ;; @@ -378,11 +384,9 @@ calls." (let ((name (package-desc-name desc))) (when (and (not (package-installed-p name)) (assq name quelpa-cache)) - (map-delete quelpa-cache name) + (setq quelpa-cache (map-delete quelpa-cache name)) (quelpa-save-cache) - (let ((path (expand-file-name (symbol-name name) quelpa-build-dir))) - (when (file-exists-p path) - (delete-directory path t)))))) + (doom--delete-package-files name)))) ;; From fb6490288a5f9ed7923147c49b561b68bd135ba0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 01:45:41 +0200 Subject: [PATCH 1746/4235] Disable eshell, pdf, tmux, & upload by default To enforce Doom's "opt-in or best default" principle. --- init.example.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/init.example.el b/init.example.el index ecefd0b92..7adc6bbbb 100644 --- a/init.example.el +++ b/init.example.el @@ -47,7 +47,7 @@ dired ; making dired pretty [functional] ediff ; comparing files in Emacs electric-indent ; smarter, keyword-based electric-indent - eshell ; a consistent, cross-platform shell (WIP) + ;eshell ; a consistent, cross-platform shell (WIP) imenu ; an imenu sidebar and searchable code index ;term ; terminals in Emacs @@ -59,12 +59,12 @@ ;make ; run make tasks from Emacs ;magit ; ;password-store ; password manager for nerds - pdf ; pdf enhancements + ;pdf ; pdf enhancements ;prodigy ; FIXME managing external services & code builders ;rgb ; creating color strings rotate-text ; cycle region at point between text candidates - tmux ; an API for interacting with tmux - upload ; map local to remote projects via ssh/ftp + ;tmux ; an API for interacting with tmux + ;upload ; map local to remote projects via ssh/ftp ;wakatime :lang From d008a7e97765c6d6b7324d229ac399317caeac16 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 13:29:06 +0200 Subject: [PATCH 1747/4235] Make ui/fci's automatic color change customizable --- modules/ui/fci/config.el | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index 5aaf50ef3..424faae2c 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -1,12 +1,28 @@ ;;; ui/fci/config.el -*- lexical-binding: t; -*- +(defvar +fci-rule-color-function + (lambda () (face-foreground 'line-number)) + "Color used to draw the fill-column rule. + +Accepts a color string or a function that returns a color. + +Changes to this variable do not take effect until `fci-mode' is restarted.") + + +;; +;; Plugins +;; + (def-package! fill-column-indicator :hook ((text-mode prog-mode conf-mode) . turn-on-fci-mode) :config (defun +fci|set-color () - (setq fci-rule-color (face-foreground 'line-number))) - (add-hook 'doom-load-theme-hook #'+fci|set-color) - (+fci|set-color) + "Automatically change `fci-rule-color' based on `+fci-rule-color-function's +return value. To disable this, either set `+fci-rule-color-function' to nil or +remove `+fci|set-color' from `fci-mode-hook'." + (when (functionp +fci-rule-color-function) + (setq fci-rule-color (funcall +fci-rule-color-function)))) + (add-hook 'fci-mode-hook #'+fci|set-color) (when (featurep! :completion company) (add-hook 'company-completion-started-hook #'+fci|disable-when-company-activates) From bc2f8a0ec9908dbb92d0dd1cb2e84fa9196e8e8c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 13:30:20 +0200 Subject: [PATCH 1748/4235] Don't complain about used _directory letvar Byte-compiler-sama must be appeased. --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 83b891fbd..4df5de6f1 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -390,7 +390,7 @@ For example: (file-exists-p! (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" (if directory - `(let ((_directory ,directory)) + `(let ((--directory-- ,directory)) ,(doom--resolve-path-forms spec '_directory)) (doom--resolve-path-forms spec))) From 81c465a545a69533493f9df8c3bcef18cbc22e7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 13:31:45 +0200 Subject: [PATCH 1749/4235] Move OS constants to core/core.el So it is universally available to all of Doom, rather than excluding sessions that haven't called doom-initialize interactively. --- core/core-os.el | 89 ++++++++++++++++++++----------------------- core/core-packages.el | 2 +- core/core.el | 4 ++ 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index faa6e1561..fe8a9ade5 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -1,57 +1,52 @@ ;;; core-os.el -*- lexical-binding: t; -*- -(defconst IS-MAC (eq system-type 'darwin)) -(defconst IS-LINUX (eq system-type 'gnu/linux)) -(defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) +;; clipboard +(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING) + ;; Use a shared clipboard + select-enable-clipboard t + select-enable-primary t) -(unless noninteractive - ;; clipboard - (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING) - ;; Use a shared clipboard - select-enable-clipboard t - select-enable-primary t) +;; stop copying each visual state move to the clipboard: +;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on +;; Most of this code grokked from: +;; http://stackoverflow.com/questions/15873346/elisp-rename-macro +(advice-add #'evil-visual-update-x-selection :override #'ignore) - ;; stop copying each visual state move to the clipboard: - ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on - ;; Most of this code grokked from: - ;; http://stackoverflow.com/questions/15873346/elisp-rename-macro - (advice-add #'evil-visual-update-x-selection :override #'ignore) +(cond (IS-MAC + (setq mac-command-modifier 'meta + mac-option-modifier 'alt + ;; sane trackpad/mouse scroll settings + mac-redisplay-dont-reset-vscroll t + mac-mouse-wheel-smooth-scroll nil + mouse-wheel-scroll-amount '(5 ((shift) . 2)) ; one line at a time + mouse-wheel-progressive-speed nil ; don't accelerate scrolling + ;; Curse Lion and its sudden but inevitable fullscreen mode! + ;; NOTE Meaningless to railwaycat's emacs-mac build + ns-use-native-fullscreen nil + ;; Don't open files from the workspace in a new frame + ns-pop-up-frames nil) - (cond (IS-MAC - (setq mac-command-modifier 'meta - mac-option-modifier 'alt - ;; sane trackpad/mouse scroll settings - mac-redisplay-dont-reset-vscroll t - mac-mouse-wheel-smooth-scroll nil - mouse-wheel-scroll-amount '(5 ((shift) . 2)) ; one line at a time - mouse-wheel-progressive-speed nil ; don't accelerate scrolling - ;; Curse Lion and its sudden but inevitable fullscreen mode! - ;; NOTE Meaningless to railwaycat's emacs-mac build - ns-use-native-fullscreen nil - ;; Don't open files from the workspace in a new frame - ns-pop-up-frames nil) + (if (not (display-graphic-p)) + (add-hook 'doom-post-init-hook #'osx-clipboard-mode) + ;; A known problem with GUI Emacs on MacOS: it runs in an isolated + ;; environment, so envvars will be wrong. That includes the PATH Emacs + ;; picks up. `exec-path-from-shell' fixes this. + (when (require 'exec-path-from-shell nil t) + (def-setting! :env (&rest vars) + "Inject VARS from your shell environment into Emacs." + `(exec-path-from-shell-copy-envs (list ,@vars))) + (setq exec-path-from-shell-check-startup-files nil + exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) + (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) + (exec-path-from-shell-initialize)))) - (if (not (display-graphic-p)) - (add-hook 'doom-post-init-hook #'osx-clipboard-mode) - ;; A known problem with GUI Emacs on MacOS: it runs in an isolated - ;; environment, so envvars will be wrong. That includes the PATH Emacs - ;; picks up. `exec-path-from-shell' fixes this. - (when (require 'exec-path-from-shell nil t) - (def-setting! :env (&rest vars) - "Inject VARS from your shell environment into Emacs." - `(exec-path-from-shell-copy-envs (list ,@vars))) - (setq exec-path-from-shell-check-startup-files nil - exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) - (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) - (exec-path-from-shell-initialize)))) + (IS-LINUX + (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! + x-underline-at-descent-line t)) ; draw underline lower - (IS-LINUX - (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! - x-underline-at-descent-line t)) ; draw underline lower - - (IS-WINDOWS - (setq w32-get-true-file-attributes nil) ; fix file io slowdowns - ))) + (IS-WINDOWS + (setq w32-get-true-file-attributes nil) ; fix file io slowdowns + )) (provide 'core-os) ;;; core-os.el ends here diff --git a/core/core-packages.el b/core/core-packages.el index 6e626a48d..d3d6a3559 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -286,10 +286,10 @@ to least)." (unless (or force-p noninteractive) (doom//reload-package-autoloads)))) ;; Initialize Doom core - (require 'core-os) (unless noninteractive (add-hook! 'emacs-startup-hook #'(doom|post-init doom|display-benchmark)) + (require 'core-os) (require 'core-ui) (require 'core-editor) (require 'core-projects) diff --git a/core/core.el b/core/core.el index 47fd3e018..2ecb8edbe 100644 --- a/core/core.el +++ b/core/core.el @@ -16,6 +16,10 @@ line or use --debug-init to enable this.") (eval-when-compile (not (version< emacs-version "26")))) (defconst EMACS27+ (eval-when-compile (not (version< emacs-version "27")))) +(defconst IS-MAC (eq system-type 'darwin)) +(defconst IS-LINUX (eq system-type 'gnu/linux)) +(defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) + ;; (defvar doom-emacs-dir From dd2d7041375a234bcb302a264c24fc8318cf0977 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 13:39:04 +0200 Subject: [PATCH 1750/4235] Fix reference to renamed _directory variable Whoops! --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 4df5de6f1..86aa2e9d4 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -391,7 +391,7 @@ For example: (file-exists-p! (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" (if directory `(let ((--directory-- ,directory)) - ,(doom--resolve-path-forms spec '_directory)) + ,(doom--resolve-path-forms spec '--directory--)) (doom--resolve-path-forms spec))) (defmacro define-key! (keymaps key def &rest rest) From 4b8ac0ad3d6a8c1809d1d3694e33c892d87c7481 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 14:29:38 +0200 Subject: [PATCH 1751/4235] Disable fci-mode in org-mode by default Too many issues caused by variable font and icon sizes in org-mode (see --- modules/ui/fci/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index 424faae2c..5283cb4cf 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -16,6 +16,8 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") (def-package! fill-column-indicator :hook ((text-mode prog-mode conf-mode) . turn-on-fci-mode) :config + (add-hook 'org-mode-hook #'turn-off-fci-mode) + (defun +fci|set-color () "Automatically change `fci-rule-color' based on `+fci-rule-color-function's return value. To disable this, either set `+fci-rule-color-function' to nil or From dfa955dd2c516c47790da0506f3bc7f9018c5f1a Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Fri, 8 Jun 2018 16:10:00 +0200 Subject: [PATCH 1752/4235] Better looking default indentation for nested latex lists --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index dbb90c62f..7668cec12 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -6,7 +6,7 @@ (defvar +latex-bibtex-dir "" "Where bibtex files are kept.") -(defvar +latex-indent-level-item-continuation 8 +(defvar +latex-indent-level-item-continuation 4 "Custom indentation level for items in enumeration-type environments") From 7175c7dffb137cf1169fccabb10906936f79e052 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 12:16:29 +1000 Subject: [PATCH 1753/4235] Add initial treemacs module --- modules/ui/treemacs/config.el | 45 +++++++++++++++++++++++++++++++++ modules/ui/treemacs/packages.el | 7 +++++ 2 files changed, 52 insertions(+) create mode 100644 modules/ui/treemacs/config.el create mode 100644 modules/ui/treemacs/packages.el diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el new file mode 100644 index 000000000..15fdd19f6 --- /dev/null +++ b/modules/ui/treemacs/config.el @@ -0,0 +1,45 @@ +;;; ui/treemacs/config.el -*- lexical-binding: t; -*- + +(defvar treemacs-use-git-mode + (pcase (cons (not (null (executable-find "git"))) + (not (null (executable-find "python3")))) + (`(t . t) 'extended) + (`(t . _) 'simple)) + "Type of git integration for `treemacs-git-mode'. +There are 2 possible values: +1) simple, which highlights only files based on their git status, and is + slightly faster +2) extended, which highlights both files and directories, but requires python") + +(def-package! treemacs + :commands (treemacs treemacs-find-file treemacs-bookmark) + :config + (setq treemacs-no-png-images t + treemacs-follow-after-init t + treemacs-width 35 + treemacs-position 'left + treemacs-is-never-other-window t + treemacs-silent-refresh nil + treemacs-indentation 2 + treemacs-sorting 'alphabetic-desc + treemacs-show-hidden-files t + treemacs-goto-tag-strategy 'refetch-index + treemacs-collapse-dirs (if (executable-find "python3") 3 0)) + (treemacs-follow-mode t) + (treemacs-filewatch-mode t) + (when (memq treemacs-use-git-mode '(simple extended)) + (treemacs-git-mode treemacs-use-git-mode))) + +(add-hook! 'doom-post-init-hook + (map! :leader + :prefix "f" + :desc "Open treemacs" :nv "t" #'treemacs + :desc "Find file in treemacs" :nv "T" #'treemacs-find-file + :desc "Go to bookmark" :nv "b" #'treemacs-bookmark)) + +(def-package! treemacs-evil + :after (treemacs evil) + :if (featurep! :feature evil)) + +(def-package! treemacs-projectile + :after (treemacs projectile)) diff --git a/modules/ui/treemacs/packages.el b/modules/ui/treemacs/packages.el new file mode 100644 index 000000000..7125f777a --- /dev/null +++ b/modules/ui/treemacs/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/treemacs/packages.el + +(package! treemacs) +(when (featurep! :feature evil) + (package! treemacs-evil)) +(package! treemacs-projectile) From 8dbebf658811097d16147e40bd1862da4d6e1797 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 12:16:53 +1000 Subject: [PATCH 1754/4235] Add treemacs to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9e9f3ed2c..96aba118a 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ network-security.data # transient files *.cache-* *.log +/.cache/treemacs-persist From 981116d5091224f5a786bc2dea0b3ee6eb9fa01c Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 12:18:16 +1000 Subject: [PATCH 1755/4235] Add treemacs to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 7d03efd15..78c9c05b4 100644 --- a/init.example.el +++ b/init.example.el @@ -34,6 +34,7 @@ hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping neotree ; a project drawer, like NERDTree for vim + treemacs ; a project drawer, like neotree but cooler (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules From 29ea01b77260cb77e9a8e4eb0b0c15c845fbb99b Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 21:47:26 +1000 Subject: [PATCH 1756/4235] lang/emacs-lisp: Add +parinfer feature --- init.example.el | 3 ++- modules/lang/emacs-lisp/+parinfer.el | 22 ++++++++++++++++++++++ modules/lang/emacs-lisp/config.el | 2 ++ modules/lang/emacs-lisp/packages.el | 3 +++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 modules/lang/emacs-lisp/+parinfer.el diff --git a/init.example.el b/init.example.el index 7d03efd15..c272bcd19 100644 --- a/init.example.el +++ b/init.example.el @@ -75,7 +75,8 @@ ;erlang ; an elegant language for a more civilized age ;elixir ; erlang done right ;elm ; care for a cup of TEA? - emacs-lisp ; drown in parentheses + (emacs-lisp ; drown in parentheses + +parinfer) ; A handy addon to sort of turn lisp into python ;ess ; emacs speaks statistics ;go ; the hipster dialect ;(haskell +intero) ; a language that's lazier than I am diff --git a/modules/lang/emacs-lisp/+parinfer.el b/modules/lang/emacs-lisp/+parinfer.el new file mode 100644 index 000000000..60a6f4d98 --- /dev/null +++ b/modules/lang/emacs-lisp/+parinfer.el @@ -0,0 +1,22 @@ +;;; lang/emacs-lisp/+parinfer.el -*- lexical-binding: t; -*- + + +(def-package! parinfer + :commands (parinfer-mode) + :init + (add-hook! emacs-lisp-mode + (yas-minor-mode -1) + (parinfer-mode)) + (setq parinfer-extensions + '(defaults + pretty-parens + smart-tab + smart-yank)) + (if (featurep! :feature evil) + (push 'evil parinfer-extensions)) + :config + (map! :map emacs-lisp-mode-map + :i "" #'parinfer-smart-tab:dwim-right + :i "" #'parinfer-smart-tab:dwim-left + :localleader + :nv "m" #'parinfer-toggle-mode)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index dc395d0e5..20d7077e1 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -116,3 +116,5 @@ (def-project-mode! +emacs-lisp-ert-mode :modes (emacs-lisp-mode) :match "/test[/-].+\\.el$") + +(when (featurep! +parinfer) (load! "+parinfer")) diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index 24b02c21b..07f484dd9 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -9,3 +9,6 @@ (when (featurep! :feature syntax-checker) (package! flycheck-cask)) + +(when (featurep! +parinfer) + (package! parinfer)) From c3db907204d3633793d4243c0066cdb6cb0749dd Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 22:58:45 +1000 Subject: [PATCH 1757/4235] Fix wakatime breaking emacs if no api-key set --- modules/tools/wakatime/autoload.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 915abcce9..ad6f435c8 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -3,6 +3,9 @@ ;;;###autoload (add-hook 'doom-after-switch-buffer-hook #'+wakatime-init) +;;;###autoload +(defvar wakatime-api-key nil) + ;;;###autoload (defun +wakatime-init () "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a From e88de1692d9c6ec26d820c4a38dfe9be9e3fb5ef Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 23:43:39 +1000 Subject: [PATCH 1758/4235] Don't shadow wakatime-api-key --- modules/tools/wakatime/autoload.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index ad6f435c8..1589ca5bb 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -3,14 +3,11 @@ ;;;###autoload (add-hook 'doom-after-switch-buffer-hook #'+wakatime-init) -;;;###autoload -(defvar wakatime-api-key nil) - ;;;###autoload (defun +wakatime-init () "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." - (if wakatime-api-key + (if (boundp 'wakatime-api-key) (global-wakatime-mode +1) (message "No `wakatime-api-key' set! wakaktime-mode will stay disabled.")) (remove-hook 'doom-after-switch-buffer-hook #'+wakatime-init)) From ad5afa1ab26c510e3dd64ca04518a9af6e6f7c2d Mon Sep 17 00:00:00 2001 From: Marcelo dos Santos Date: Sat, 9 Jun 2018 13:26:36 -0300 Subject: [PATCH 1759/4235] Fix the hook variable --- modules/lang/clojure/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index e78813ef5..b8b0a1452 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,7 +1,7 @@ ;;; lang/clojure/config.el -*- lexical-binding: t; -*- ;; `clojure-mode' -(add-hook 'clojure-mode #'rainbow-delimiters-mode) +(add-hook! 'clojure-mode-hook #'rainbow-delimiters-mode) (def-package! clj-refactor From 72d87c19c953acd5ec5d4715eba8feb5fcb0e335 Mon Sep 17 00:00:00 2001 From: Zaiste Date: Sat, 9 Jun 2018 23:59:52 +0200 Subject: [PATCH 1760/4235] bindings: magit | add `file-delete` as `SPC g x` --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ca0655594..2ef8b2f67 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -582,6 +582,7 @@ :desc "Magit dispatch" :n "d" #'magit-dispatch-popup :desc "Magit find-file" :n "f" #'magit-find-file :desc "Magit status" :n "g" #'magit-status + :desc "Magit file delete" :n "x" #'magit-file-delete :desc "List gists" :n "G" #'+gist:list :desc "Initialize repo" :n "i" #'magit-init :desc "Browse issues tracker" :n "I" #'+vcs/git-browse-issues From 3ccd459ddb14ca963ccd628ae26aa30710dff4c8 Mon Sep 17 00:00:00 2001 From: Zwb Date: Sun, 10 Jun 2018 22:33:26 +0800 Subject: [PATCH 1761/4235] lang/cc: set rtags-install-path to ${doom-etc-dir}/rtags/ --- modules/lang/cc/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 1e7b937c3..db232e707 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -192,6 +192,8 @@ compilation database is present in the project.") (def-package! rtags :commands rtags-executable-find + :preface + (setq rtags-install-path (concat doom-etc-dir "rtags/")) :init (defun +cc|init-rtags () "Start an rtags server in c-mode and c++-mode buffers." From 14890376b185f2821ebccac4009128186f6f41ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 14:48:48 +0200 Subject: [PATCH 1762/4235] Propagate buffer errors up the call stack Delegates set-buffer(nil) errors (when switch hooks are called with an invalid or dead buffer) to the caller to handle. Fixes #668, #674 --- core/core-ui.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 07f2150f6..2928c6c19 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -366,7 +366,7 @@ from the default." (defvar doom-inhibit-switch-window-hooks nil) (defun doom*switch-frame-hooks (orig-fn frame &optional norecord) - (if (eq frame (selected-frame)) + (if (or (null frame) (eq frame (selected-frame))) (funcall orig-fn frame norecord) (run-hooks 'doom-before-switch-frame-hook) (prog1 (funcall orig-fn frame norecord) @@ -374,6 +374,7 @@ from the default." (run-hooks 'doom-after-switch-frame-hook))))) (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks + (null window) (eq window (selected-window)) (window-minibuffer-p) (window-minibuffer-p window)) @@ -385,11 +386,11 @@ from the default." (with-selected-window window (run-hooks 'doom-after-switch-window-hook))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) - (if (or doom-inhibit-switch-buffer-hooks - (eq (get-buffer buffer-or-name) - (current-buffer))) - (apply orig-fn buffer-or-name args) - (let ((dest (get-buffer buffer-or-name))) + (let ((dest (get-buffer buffer-or-name))) + (if (or doom-inhibit-switch-buffer-hooks + (null dest) + (eq dest (current-buffer))) + (apply orig-fn dest args) (run-hooks 'doom-before-switch-buffer-hook) (prog1 (let ((doom-inhibit-switch-buffer-hooks t)) From d4869228f5b4e9471d611eeeb165b7cfdcb68b3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 14:52:22 +0200 Subject: [PATCH 1763/4235] Inhibit recursive switch-hooks in sub-hooks too --- core/core-ui.el | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 2928c6c19..37a4fd693 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -379,31 +379,32 @@ from the default." (window-minibuffer-p) (window-minibuffer-p window)) (funcall orig-fn window norecord) - (run-hooks 'doom-before-switch-window-hook) - (prog1 - (let ((doom-inhibit-switch-window-hooks t)) - (funcall orig-fn window norecord)) - (with-selected-window window - (run-hooks 'doom-after-switch-window-hook))))) + (let ((doom-inhibit-switch-window-hooks t)) + (run-hooks 'doom-before-switch-window-hook) + (prog1 (funcall orig-fn window norecord) + (with-selected-window window + (run-hooks 'doom-after-switch-window-hook)))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) (let ((dest (get-buffer buffer-or-name))) (if (or doom-inhibit-switch-buffer-hooks (null dest) (eq dest (current-buffer))) (apply orig-fn dest args) - (run-hooks 'doom-before-switch-buffer-hook) - (prog1 - (let ((doom-inhibit-switch-buffer-hooks t)) - (apply orig-fn dest args)) - (with-current-buffer dest - (run-hooks 'doom-after-switch-buffer-hook)))))) + (let ((doom-inhibit-switch-buffer-hooks t)) + (run-hooks 'doom-before-switch-buffer-hook) + (prog1 (apply orig-fn dest args) + (with-current-buffer dest + (run-hooks 'doom-after-switch-buffer-hook))))))) -(defun doom|init-custom-hooks () - (advice-add #'select-frame :around #'doom*switch-frame-hooks) - (advice-add #'select-window :around #'doom*switch-window-hooks) - (advice-add #'switch-to-buffer :around #'doom*switch-buffer-hooks) - (advice-add #'display-buffer :around #'doom*switch-buffer-hooks) - (advice-add #'pop-to-buffer :around #'doom*switch-buffer-hooks)) +(defun doom|init-custom-hooks (&optional disable) + (dolist (spec '((select-frame . doom*switch-frame-hooks) + (select-window . doom*switch-window-hooks) + (switch-to-buffer . doom*switch-buffer-hooks) + (display-buffer . doom*switch-buffer-hooks) + (pop-to-buffer . doom*switch-buffer-hooks))) + (if disable + (advice-remove (car spec) (cdr spec)) + (advice-add (car spec) :around (cdr spec))))) (add-hook 'doom-post-init-hook #'doom|init-custom-hooks) (defun doom*load-theme-hooks (theme &rest _) From 1e2fc4227ace3b865693f99949cb6241d68aed47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 16:04:31 +0200 Subject: [PATCH 1764/4235] Fix void-variable: package--initialized error --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index d3d6a3559..217eb6e52 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -196,7 +196,7 @@ If RETURN-P, return the message as a string instead of displaying it." (defun doom-ensure-packages-initialized (&optional force-p) "Make sure package.el is initialized." - (when (or force-p (not package--initialized)) + (when (or force-p (not (bound-and-true-p package--initialized))) (require 'package) (setq package-activated-list nil package--initialized nil) From 0ec4d6ee436cd8ae3ee16642ab1d2821114bef0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Jun 2018 16:23:13 +0200 Subject: [PATCH 1765/4235] config/literate: earlier check & no byte-compile Making the compile check happen earlier fixes an edge case where the resulting files from a literate config being tangled into multiple files aren't recognized by Doom's package management or autoload generation systems. Disabling byte-compiling fixes an all too common issue where packages and macros are undefined at compile time, causing a plethora of invalid function errors. Leave byte-compilation to `bin/doom compile`! --- .../config/literate/{config.el => init.el} | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) rename modules/config/literate/{config.el => init.el} (68%) diff --git a/modules/config/literate/config.el b/modules/config/literate/init.el similarity index 68% rename from modules/config/literate/config.el rename to modules/config/literate/init.el index 05e2a870e..a7a7c19e7 100644 --- a/modules/config/literate/config.el +++ b/modules/config/literate/init.el @@ -1,3 +1,5 @@ +;;; config/literate/init.el -*- lexical-binding: t; -*- + ;;; config/literate/config.el -*- lexical-binding: t; -*- (defvar +literate-config-file @@ -15,21 +17,19 @@ byte-compiled from.") "Tangles & compiles `+literate-config-file' if it has changed. If LOAD is non-nil, load it too!" (let ((org +literate-config-file) - (elc (concat +literate-config-dest-file "c"))) - ;; If config is pre-compiled, then load that - (when (file-newer-than-file-p org elc) + (el +literate-config-dest-file)) + (when (file-newer-than-file-p org el) (message "Compiling your literate config...") - ;; We tangle in a separate, blank process because loading it here would load - ;; all of :lang org, which will be more expensive than it needs to be. + + ;; We tangle in a separate, blank process because loading it here would + ;; load all of :lang org (very expensive!). We only need ob-tangle. (or (zerop (call-process "emacs" nil nil nil "-q" "--batch" "-l" "ob-tangle" "--eval" (format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")" - org +literate-config-dest-file))) - (error "There was a problem tangling your literate config!")) - ;; Then byte-compile it! - (require 'bytecomp) - (byte-compile-file +literate-config-dest-file load) + org el))) + (warn "There was a problem tangling your literate config!")) + (message "Done!")))) ;; Let 'er rip! From 9bd5cb862dd3c559a32a692a6db4b07fb9c359a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 01:31:55 +0200 Subject: [PATCH 1766/4235] Don't set org-agenda-files by default Leave this to the user --- modules/lang/org/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 72212aa7f..a40c00ba4 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -127,7 +127,6 @@ unfold to point on startup." (defun +org|setup-agenda () (setq-default org-agenda-dim-blocked-tasks nil - org-agenda-files (ignore-errors (directory-files +org-dir t "\\.org$" t)) org-agenda-inhibit-startup t org-agenda-skip-unavailable-files t) ;; Move the agenda to show the previous 3 days and the next 7 days for a bit From 7f31704815aa1fc27311dab794bb529b2749a5e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 01:32:19 +0200 Subject: [PATCH 1767/4235] Minor reformatting of org-agenda config --- modules/lang/org/config.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a40c00ba4..7d7679bb2 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -128,13 +128,13 @@ unfold to point on startup." (setq-default org-agenda-dim-blocked-tasks nil org-agenda-inhibit-startup t - org-agenda-skip-unavailable-files t) - ;; Move the agenda to show the previous 3 days and the next 7 days for a bit - ;; better context instead of just the current week which is a bit confusing - ;; on, for example, a sunday - (setq org-agenda-span 10 - org-agenda-start-on-weekday nil - org-agenda-start-day "-3d")) + org-agenda-skip-unavailable-files t + ;; Move the agenda to show the previous 3 days and the next 7 days for a bit + ;; better context instead of just the current week which is a bit confusing + ;; on, for example, a sunday + org-agenda-span 10 + org-agenda-start-on-weekday nil + org-agenda-start-day "-3d")) (defun +org|setup-popups-rules () "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." From 01d1a814f9cbcb3556e1a195eaa63faa9c3c54c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Jun 2018 20:13:20 +0200 Subject: [PATCH 1768/4235] Refactor doom-initialize functions Removes doom-module-table; which was inflexible (though more stable). It prevented you from putting your doom! block in anywhere but ~/.doom.d/init.el. It is replaced (somewhat) by (doom-modules). --- bin/doom-doctor | 2 - core/autoload/debug.el | 4 +- core/autoload/modules.el | 30 ++++++------- core/core-packages.el | 96 ++++++++++++++++++---------------------- core/core.el | 8 ++-- 5 files changed, 61 insertions(+), 79 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 2f4128033..c3ad96a7a 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -280,8 +280,6 @@ (let ((inhibit-message t) noninteractive) (load (concat user-emacs-directory "core/core.el") nil t) - (doom-initialize t) - (doom-initialize-modules t) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) ('error (warn! "Attempt to load DOOM: failed\n %s\n" diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 2662128e5..cf1ba243d 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -10,10 +10,8 @@ (defun doom-info () "Returns diagnostic information about the current Emacs session in markdown, ready to be pasted in a bug report on github." - (doom-initialize) (require 'vc-git) - (let ((default-directory doom-emacs-dir) - (doom-modules (doom-module-table))) + (let ((default-directory doom-emacs-dir)) (format (concat "- OS: %s (%s)\n" "- Emacs: %s (%s)\n" diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 53518580c..cca13f9af 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -30,8 +30,9 @@ init.el and config.el. Then runs `doom-reload-hook'." (red "There were issues!"))))) ((let ((load-prefer-newer t)) (doom//reload-autoloads force-p) - (doom-initialize t) - (ignore-errors (doom-initialize-modules t)) + (doom-initialize 'force) + (with-demoted-errors "PRIVATE CONFIG ERROR: %s" + (doom-initialize-modules 'force)) (print! (green "%d packages reloaded" (length package-alist))) (run-hooks 'doom-reload-hook) t)))) @@ -105,8 +106,7 @@ Emacs where to find lazy-loaded functions. This should be run whenever your `doom!' block, or a module autoload file, is modified." (interactive) - (let ((doom-modules (doom-module-table)) - (default-directory doom-emacs-dir) + (let ((default-directory doom-emacs-dir) (targets (file-expand-wildcards (expand-file-name "autoload/*.el" doom-core-dir)))) @@ -203,7 +203,7 @@ This should be run whenever your `doom!' block or update your packages." (file-exists-p doom-package-autoload-file) (not (file-newer-than-file-p package-user-dir doom-package-autoload-file)) (not (ignore-errors - (cl-loop for key being the hash-keys of (doom-module-table) + (cl-loop for key being the hash-keys of (doom-modules) for path = (doom-module-path (car key) (cdr key) "packages.el") if (file-newer-than-file-p path doom-package-autoload-file) return t)))) @@ -317,19 +317,17 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (message "Aborting.") (cl-return-from 'byte-compile))) (unless recompile-p - (doom//clean-byte-compiled-files)) - (unless targets - (let ((inhibit-message t) - doom-emacs-changed-p - noninteractive) - ;; But first we must be sure that Doom and your private config have - ;; been fully loaded. Which usually aren't so in an noninteractive - ;; session. - (quiet! (doom//reload-autoloads)) - (doom-initialize t))) + (doom//clean-byte-compiled-files) + (doom//reload-autoloads)) + (let (doom-emacs-changed-p + noninteractive) + ;; But first we must be sure that Doom and your private config have + ;; been fully loaded. Which usually aren't so in an noninteractive + ;; session. + (doom-initialize) + (doom-initialize-modules 'force)) ;; If no targets were supplied, then we use your module list. (unless modules - (doom-initialize-modules t) (setq targets (append (list doom-core-dir) (doom-module-load-path)))) ;; Assemble el files we want to compile; taking into account that diff --git a/core/core-packages.el b/core/core-packages.el index 217eb6e52..090e45d95 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -282,9 +282,10 @@ to least)." ;; Loads `doom-package-autoload-file', which caches `load-path', ;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and ;; `package-activated-list'. A big reduction in startup time. - (unless (doom-initialize-autoloads doom-package-autoload-file force-p) - (unless (or force-p noninteractive) - (doom//reload-package-autoloads)))) + (unless (or force-p + (doom-initialize-autoloads doom-package-autoload-file) + noninteractive) + (doom//reload-package-autoloads))) ;; Initialize Doom core (unless noninteractive (add-hook! 'emacs-startup-hook @@ -307,9 +308,8 @@ non-nil." (load (expand-file-name "init" doom-private-dir) 'noerror 'nomessage)))) -(defun doom-initialize-autoloads (file &optional clear-p) - "Tries to load FILE (an autoloads file). Otherwise tries to regenerate it. If -CLEAR-P is non-nil, regenerate it anyway." +(defun doom-initialize-autoloads (file) + "Tries to load FILE (an autoloads file)." (unless clear-p (condition-case-unless-debug e (load (file-name-sans-extension file) 'noerror 'nomessage) @@ -339,7 +339,7 @@ them." ;; `package-alist' (when (or force-p (not (bound-and-true-p package-alist))) (setq load-path doom-site-load-path) - (doom-ensure-packages-initialized t)) + (doom-ensure-packages-initialized 'force)) ;; `quelpa-cache' (when (or force-p (not (bound-and-true-p quelpa-cache))) @@ -351,7 +351,7 @@ them." (error "Could not initialize quelpa")))) (when (or force-p (not doom-packages)) - (let ((doom-modules (doom-module-table))) + (let ((doom-modules (doom-modules))) (setq doom-packages nil) (cl-flet ((_load @@ -370,11 +370,12 @@ them." ;; We load the private packages file twice to ensure disabled ;; packages are seen ASAP, and a second time to ensure privately ;; overridden packages are properly overwritten. - (_load (expand-file-name "packages.el" doom-private-dir) t) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-path (car key) (cdr key) "packages.el") - do (let ((doom--current-module key)) (_load path t))) - (_load (expand-file-name "packages.el" doom-private-dir) t)))))))) + (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) + (_load private-packages t) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-path (car key) (cdr key) "packages.el") + do (let ((doom--current-module key)) (_load path t))) + (_load private-packages t))))))))) ;; @@ -468,42 +469,16 @@ This doesn't require modules to be enabled. For enabled modules us (intern submodule)))))))) (defun doom-module-load-path () - "Returns a list of absolute file paths to activated modules." - (append (cl-loop for plist being the hash-values of doom-modules + "Return a list of absolute file paths to activated modules." + (append (cl-loop for plist being the hash-values of (doom-modules) collect (plist-get plist :path)) (list doom-private-dir))) -(defun doom-module-table (&optional modules) - "Converts MODULES (a malformed plist) into a hash table of modules, fit for -`doom-modules'. If MODULES is omitted, it will fetch your module mplist from the -`doom!' block in your private init.el file." - (let* ((doom-modules (make-hash-table :test #'equal - :size (if modules (length modules) 100) - :rehash-threshold 1.0))) - (when (null modules) - (let* ((init-file (expand-file-name "init.el" doom-private-dir)) - (short-init-file (abbreviate-file-name init-file))) - (if (not (file-exists-p init-file)) - (error "%s doesn't exist" short-init-file) - (with-temp-buffer - (delay-mode-hooks (emacs-lisp-mode)) - (insert-file-contents-literally init-file) - (when (re-search-forward "^\\s-*\\((doom! \\)" nil t) - (goto-char (match-beginning 1)) - (setq modules (cdr (sexp-at-point)))))) - (unless (or modules noninteractive) - (warn "Couldn't gather module list from %s" short-init-file)))) - (if (eq modules t) (setq modules nil)) - (let (category) - (dolist (m modules) - (cond ((keywordp m) (setq category m)) - ((not category) (error "No module category specified for %s" m)) - ((let ((module (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (if-let* ((path (doom-module-locate-path category module))) - (doom-module-set category module :flags flags :path path) - (message "Couldn't find the %s %s module" category module))))))) - doom-modules)) +(defun doom-modules (&optional refresh-p) + "Minimally initialize `doom-modules' (a hash table) and return it." + (let ((noninteractive t)) + (doom-initialize-modules refresh-p)) + doom-modules) ;; @@ -588,15 +563,28 @@ The overall load order of Doom is as follows: Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." - (let ((doom-modules (doom-module-table (or modules t))) + (let ((doom-modules + (make-hash-table :test #'equal + :size (if modules (length modules) 100) + :rehash-threshold 1.0)) + category init-forms config-forms) - (maphash (lambda (key plist) - (let ((path (plist-get plist :path))) - (push `(let ((doom--current-module ',key)) (load! "init" ,path t)) - init-forms) - (push `(let ((doom--current-module ',key)) (load! "config" ,path t)) - config-forms))) - doom-modules) + (dolist (m modules) + (cond ((keywordp m) (setq category m)) + ((not category) (error "No module category specified for %s" m)) + ((let* ((module (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m))) + (path (doom-module-locate-path category module))) + (if (not path) + (message "Couldn't find the %s %s module" category module) + (let ((key (cons category module))) + (doom-module-set category module :flags flags :path path) + (push `(let ((doom--current-module ',key)) + (load! "init" ,path t)) + init-forms) + (push `(let ((doom--current-module ',key)) + (load! "config" ,path t)) + config-forms))))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) diff --git a/core/core.el b/core/core.el index 2ecb8edbe..01fc2812c 100644 --- a/core/core.el +++ b/core/core.el @@ -120,7 +120,6 @@ else (except for `window-setup-hook').") tramp-persistency-file-name (concat doom-cache-dir "tramp-persistency.el") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) -(load custom-file t t t) ;; @@ -201,11 +200,12 @@ this, you'll get stuttering and random freezes) and resets (require 'core-lib) (require 'core-packages) +(when noninteractive + (require 'core-dispatcher)) +(load custom-file t t t) (doom-initialize noninteractive) -(if noninteractive - (require 'core-dispatcher) - (doom-initialize-modules)) +(doom-initialize-modules) (provide 'core) ;;; core.el ends here From ee154911ae9d25dabf17d34d689be08e7114d1e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:07:23 +0200 Subject: [PATCH 1769/4235] Redesign doom-get-package Now more useful for filtering packages by certain properties. --- core/autoload/packages.el | 48 +++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index ca5a00921..e388bae7a 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -125,27 +125,42 @@ was installed with." (cdr (plist-get (cdr doom-recipe) :recipe)))))))) ;;;###autoload -(defun doom-get-packages (&optional installed-only-p) - "Retrieves a list of explicitly installed packages (i.e. non-dependencies). -Each element is a cons cell, whose car is the package symbol and whose cdr is -the quelpa recipe (if any). +(cl-defun doom-get-packages (&key installed backend private disabled all sort) + "Retrieves a list of primary packages (i.e. non-dependencies). Each element is +a cons cell, whose car is the package symbol and whose cdr is the quelpa recipe +(if any). BACKEND can be 'quelpa or 'elpa, and will instruct this function to return only the packages relevant to that backend. -Warning: this function is expensive; it re-evaluates all of doom's config files. -Be careful not to use it in a loop. +If INSTALLED is non-nil, only return installed packages. -If INSTALLED-ONLY-P, only return packages that are installed." - (doom-initialize-packages t) - (cl-loop with packages = (append doom-core-packages (mapcar #'car doom-packages)) - for sym in (cl-delete-duplicates packages) - if (and (or (not installed-only-p) +If PRIVATE, only return private packages. + +If DISABLED, only return disabled packages. + +If ALL, include disabled packages. + +Warning: this function is expensive, as it re-evaluates your all packages.el +files." + (doom-initialize-packages (if (or installed backend) t 'internal)) + (cl-loop with packages = (append (mapcar #'list doom-core-packages) + doom-packages) + for (sym . plist) + in (if sort + (cl-sort packages #'string-lessp :key #'car) + packages) + if (and (or all + (not (plist-get plist :disabled))) + (or (not disabled) + (plist-get plist :disabled)) + (or (not installed) (package-installed-p sym)) - (or (assq sym doom-packages) - (and (assq sym package-alist) - (list sym)))) - collect it)) + (or (not backend) + (eq (doom-package-backend sym t) backend)) + (or (not private) + (plist-get plist :private))) + collect (cons sym plist))) ;;;###autoload (defun doom-get-depending-on (name) @@ -222,9 +237,8 @@ Used by `doom//packages-update'." depended on. Used by `doom//packages-autoremove'." - (doom-initialize-packages t) (let ((package-selected-packages - (append (mapcar #'car doom-packages) doom-core-packages))) + (mapcar #'car (doom-get-packages :installed t)))) (append (package--removable-packages) (cl-loop for pkg in package-selected-packages if (and (doom-package-different-backend-p pkg) From 88f1ae3797ba4b09926b03d5e61c1a30eb02aa41 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:13:20 +0200 Subject: [PATCH 1770/4235] Refactor autoloads init in doom-initialize Simplify doom-initialize-autoloads --- core/autoload/modules.el | 11 ----------- core/core-packages.el | 29 +++++++++++++++++++++-------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index cca13f9af..bc192aaa0 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -62,17 +62,6 @@ one wants that.") short-name (car ex) (error-message-string ex)))))) -;;;###autoload -(defun doom-delete-autoloads-file (file) - "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if -it exists." - (or (stringp file) - (signal 'wrong-type-argument (list 'stringp file))) - (when (file-exists-p file) - (delete-file file) - (ignore-errors (delete-file (byte-compile-dest-file file))) - (print! "Deleted old %s" (file-name-nondirectory file)))) - ;;;###autoload (defun doom//reload-autoloads (&optional file force-p) "Reloads FILE (an autoload file), if it needs reloading. diff --git a/core/core-packages.el b/core/core-packages.el index 090e45d95..ae15bc90c 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -228,6 +228,15 @@ If RETURN-P, return the message as a string instead of displaying it." (unless (file-directory-p dir) (make-directory dir t)))) +(defun doom-delete-autoloads-file (file) + "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if +it exists." + (cl-check-type file string) + (when (file-exists-p file) + (delete-file file) + (ignore-errors (delete-file (byte-compile-dest-file file))) + (message "Deleted old %s" (file-name-nondirectory file)))) + ;; ;; Bootstrap API @@ -267,10 +276,15 @@ to least)." (when (or force-p (not doom-init-p)) ;; Set this to prevent infinite recursive calls to `doom-initialize' (setq doom-init-p t) + ;; Delete autoloads file so we can regenerate them later. + (when force-p + (mapc #'doom-delete-autoloads-file + (list doom-autoload-file + doom-package-autoload-file))) ;; `doom-autoload-file' tells Emacs where to load all its autoloaded ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. - (unless (doom-initialize-autoloads doom-autoload-file force-p) + (unless (doom-initialize-autoloads doom-autoload-file) (doom-ensure-core-directories) (doom-ensure-same-emacs-version-p) (doom-ensure-packages-initialized force-p) @@ -309,13 +323,12 @@ non-nil." 'noerror 'nomessage)))) (defun doom-initialize-autoloads (file) - "Tries to load FILE (an autoloads file)." - (unless clear-p - (condition-case-unless-debug e - (load (file-name-sans-extension file) 'noerror 'nomessage) - ('error - (message "Autoload error: %s -> %s" - (car e) (error-message-string e)))))) + "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." + (condition-case-unless-debug e + (load (file-name-sans-extension file) 'noerror 'nomessage) + ('error + (message "Autoload error: %s -> %s" + (car e) (error-message-string e))))) (defun doom-initialize-packages (&optional force-p) "Ensures that Doom's package management system, package.el and quelpa are From edb6fd1964fc22e3c1232577d8f3c18f070e853a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:14:49 +0200 Subject: [PATCH 1771/4235] Change how private & disabled packages are marked They are now included in doom-packages, but with :private t or :disabled t properties. This allows us to search for them if we wish (e.g. for doom info). --- core/core-packages.el | 51 ++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index ae15bc90c..37a787b5d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -753,31 +753,32 @@ Returns t if package is successfully registered, and nil if it was disabled elsewhere." (declare (indent defun)) (doom--assert-stage-p 'packages #'package!) - (cond ((memq name doom-disabled-packages) nil) - ((let ((disable (plist-get plist :disable))) - (and disable (eval disable))) - (push name doom-disabled-packages) - (setq doom-packages (map-delete doom-packages name)) - nil) - ((let* ((old-plist (assq name doom-packages)) - (pkg-recipe (or (plist-get plist :recipe) - (and old-plist (plist-get old-plist :recipe)))) - (pkg-pin (or (plist-get plist :pin) - (and old-plist (plist-get old-plist :pin))))) - (when pkg-recipe - (when (= 0 (% (length pkg-recipe) 2)) - (plist-put plist :recipe (cons name pkg-recipe))) - (when pkg-pin - (plist-put plist :pin nil))) - (dolist (prop '(:ignore :freeze)) - (let ((val (plist-get plist prop))) - (when val - (plist-put plist prop (eval val))))) - `(progn - ,(when (and pkg-pin t) - `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist) - t))))) + (let* ((old-plist (cdr (assq name doom-packages))) + (pkg-recipe (or (plist-get plist :recipe) + (and old-plist (plist-get old-plist :recipe)))) + (pkg-pin (or (plist-get plist :pin) + (and old-plist (plist-get old-plist :pin)))) + (pkg-disable (or (plist-get plist :disable) + (and old-plist (plist-get old-plist :disable))))) + (when pkg-disable + (add-to-list 'doom-disabled-packages name nil #'eq)) + (when pkg-recipe + (when (= 0 (% (length pkg-recipe) 2)) + (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) + (when pkg-pin + (setq plist (plist-put plist :pin nil)))) + (dolist (prop '(:ignore :freeze)) + (when-let* ((val (plist-get plist prop))) + (setq plist (plist-put plist prop (eval val))))) + (when (file-in-directory-p (or (bound-and-true-p byte-compile-current-file) + load-file-name) + doom-private-dir) + (setq plist (plist-put plist :private t))) + `(progn + ,(when (and pkg-pin t) + `(map-put package-pinned-packages ',name ,pkg-pin)) + (map-put doom-packages ',name ',plist) + (not ,pkg-disable)))) (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple From 7e00a83accadf4e30e853d5e320b1fb16f7b7578 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:16:50 +0200 Subject: [PATCH 1772/4235] Update & refactor doom-info --- core/autoload/debug.el | 50 ++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 34 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index cf1ba243d..713554305 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -20,30 +20,32 @@ ready to be pasted in a bug report on github." "- System features: %s\n" "- Details:\n" " ```elisp\n" + " elc count: %s\n" " uname -a: %s\n" " modules: %s\n" " packages: %s\n" - " elc dirs: %s\n" " exec-path: %s\n" " ```") system-type system-configuration emacs-version (format-time-string "%b %d, %Y" emacs-build-time) doom-version - (if-let* ((branch (vc-git--symbolic-ref "core/core.el"))) - branch - "n/a") - (if-let* ((rev (vc-git-working-revision "core/core.el"))) - rev - "n/a") + (or (vc-git--symbolic-ref "core/core.el") + "n/a") + (or (vc-git-working-revision "core/core.el") + "n/a") (display-graphic-p) (daemonp) (bound-and-true-p system-configuration-features) ;; details + (length (doom-files-in `(,@doom-modules-dirs + ,doom-core-dir + ,doom-private-dir) + :type 'files :match "\\.elc$")) (with-temp-buffer (unless (zerop (call-process "uname" nil t nil "-a")) (insert (format "%s" system-type))) (string-trim (buffer-string))) (or (cl-loop with cat = nil - for key being the hash-keys of doom-modules + for key being the hash-keys of (doom-modules) if (or (not cat) (not (eq cat (car key)))) do (setq cat (car key)) and collect cat else collect @@ -52,33 +54,13 @@ ready to be pasted in a bug report on github." `(,(cdr key) ,@flags) (cdr key)))) "n/a") - (or (let (packages) - (ignore-errors - (require 'async) - ;; collect these in another session to protect this - ;; session's state - (async-get - (async-start - `(lambda () - (let ((noninteractive t) - (load-path ',load-path) - (package-alist ',package-alist)) - (load ,(expand-file-name "init.el" doom-emacs-dir)) - (doom-get-packages))) - (lambda (p) (setq packages p)))) - (cl-loop for pkg in (cl-sort packages #'string-lessp - :key (lambda (x) (symbol-name (car x)))) - collect (if (cdr pkg) - (format "%s" pkg) - (symbol-name (car pkg)))))) - "n/a") (or (ignore-errors - (cl-delete-duplicates - (cl-loop for file in (append (reverse (directory-files-recursively doom-core-dir "\\.elc$")) - (cl-loop for dir in doom-modules-dirs - nconc (directory-files-recursively dir "\\.elc$"))) - collect (file-relative-name (file-name-directory file) doom-emacs-dir)) - :test #'equal)) + (require 'use-package) + (cl-loop for (pkg . plist) in (doom-get-packages :all t :private t :sort #'string-lessp) + if (use-package-plist-delete (copy-seq plist) :private) + collect (format "%s" (cons pkg it)) + else + collect (symbol-name pkg))) "n/a") ;; abbreviate $HOME to hide username (mapcar #'abbreviate-file-name exec-path)))) From b079db8ec3a2024fca60dcc9ddc3b4f2637c0905 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:18:39 +0200 Subject: [PATCH 1773/4235] Refactor unneeded arg out of local function _load In doom-initialize-packages. --- core/core-dispatcher.el | 2 +- core/core-packages.el | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 0db531811..f30e5aafd 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -173,7 +173,7 @@ respectively." (def-dispatcher! test "Run Doom unit tests." - (load! "autoload/test") + (require 'core-unit-tests) (doom//run-tests args)) (def-dispatcher! info diff --git a/core/core-packages.el b/core/core-packages.el index 37a787b5d..865294ef4 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -368,17 +368,17 @@ them." (setq doom-packages nil) (cl-flet ((_load - (file &optional noerror interactive) + (file &optional noerror) (condition-case-unless-debug ex - (let ((noninteractive (not interactive))) - (load file noerror 'nomessage 'nosuffix)) + (load file noerror 'nomessage 'nosuffix) ('error (lwarn 'doom-initialize-packages :warning "%s in %s: %s" (car ex) (file-relative-name file doom-emacs-dir) (error-message-string ex)))))) - (let ((doom--stage 'packages)) + (let ((doom--stage 'packages) + (noninteractive t)) (_load (expand-file-name "packages.el" doom-core-dir)) ;; We load the private packages file twice to ensure disabled ;; packages are seen ASAP, and a second time to ensure privately From 383ecf7a08a8fbfb0eb57973385ece8060ece345 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:22:03 +0200 Subject: [PATCH 1774/4235] Fix magit rebase/log windows being hidden by diffs --- modules/tools/magit/autoload.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 4bc336c7c..e87ab320c 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -9,15 +9,16 @@ 2. The status screen isn't buried when viewing diffs or logs from the status screen." (display-buffer - buffer (cond ((derived-mode-p 'magit-mode) + buffer (cond ((or (bound-and-true-p git-commit-mode) + (derived-mode-p 'magit-log-mode)) + '(display-buffer-below-selected)) + ((derived-mode-p 'magit-mode) (when (eq major-mode 'magit-status-mode) (display-buffer-in-side-window (current-buffer) '((side . left) (window-width . 0.35) (window-parameters (quit))))) '(display-buffer-same-window)) - ((bound-and-true-p git-commit-mode) - '(display-buffer-below-selected)) ((buffer-local-value 'git-commit-mode buffer) '(magit--display-buffer-fullframe)) ((memq (buffer-local-value 'major-mode buffer) From 3498d5c6b1533ee443f16f28ddbdfb48767e99c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:22:57 +0200 Subject: [PATCH 1775/4235] Catch more *.elc files with bin/doom clean --- core/autoload/modules.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index bc192aaa0..d0cddeb77 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -379,7 +379,7 @@ module. This does not include your byte-compiled, third party packages.'" (interactive) (cl-loop with default-directory = doom-emacs-dir for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 1) - (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) + (doom-files-in doom-private-dir :match "\\.elc$" :depth 2) (doom-files-in doom-core-dir :match "\\.elc$") (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) for truepath = (file-truename path) From a87641635f8ff19e233218967edf3850c1980712 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:23:16 +0200 Subject: [PATCH 1776/4235] load-prefer-newer = nil for private config load-prefer-newer = t makes debugging harder and reduces the predictability of your config. --- core/core-packages.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 865294ef4..d1e809d7c 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -606,9 +606,8 @@ to least)." (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir - (let ((load-prefer-newer t)) - (load ,(expand-file-name "config" doom-private-dir) - t (not doom-debug-mode))))))))) + (load ,(expand-file-name "config" doom-private-dir) + t (not doom-debug-mode)))))))) (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." From 2605a3938e42df9eb9ecf27ebfab4e31fd792161 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:24:34 +0200 Subject: [PATCH 1777/4235] Initialize modules conditionally doom-modules will be initialized on demand in non-interactive sessions. --- core/core.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 01fc2812c..30011ea33 100644 --- a/core/core.el +++ b/core/core.el @@ -200,12 +200,12 @@ this, you'll get stuttering and random freezes) and resets (require 'core-lib) (require 'core-packages) -(when noninteractive - (require 'core-dispatcher)) (load custom-file t t t) (doom-initialize noninteractive) -(doom-initialize-modules) +(if noninteractive + (require 'core-dispatcher) + (doom-initialize-modules)) (provide 'core) ;;; core.el ends here From fbdbd26851ea8e0b12ad885133f1bed758642c35 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:25:40 +0200 Subject: [PATCH 1778/4235] emacs/term: minor refactor of universal args --- modules/emacs/term/autoload.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/emacs/term/autoload.el b/modules/emacs/term/autoload.el index 16ed2bb9c..c1f6705b3 100644 --- a/modules/emacs/term/autoload.el +++ b/modules/emacs/term/autoload.el @@ -1,12 +1,12 @@ ;;; emacs/term/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +term/open (&optional project-root) - "Open a terminal buffer in the current window. If PROJECT-ROOT (C-u) is +(defun +term/open (arg) + "Open a terminal buffer in the current window. If ARG (universal argument) is non-nil, cd into the current project's root." (interactive "P") (let ((default-directory - (if project-root + (if arg (doom-project-root 'nocache) default-directory))) ;; Doom's switch-buffer hooks prevent themselves from triggering when @@ -27,9 +27,7 @@ non-nil, cd into the current project's root." (pop-to-buffer (save-window-excursion (multi-term))))) ;;;###autoload -(defun +term/open-popup-in-project (arg) - "Open a terminal popup window in the root of the current project. - -If ARG (universal argument) is non-nil, open it in `default-directory' instead." - (interactive "P") - (+term/open-popup (not arg))) +(defun +term/open-popup-in-project () + "Open a terminal popup window in the root of the current project." + (interactive) + (+term/open-popup t)) From 9cc190adc9b799270c81b550096d3655710ab9ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:26:20 +0200 Subject: [PATCH 1779/4235] Minor reformat & refactor keyword intern --- core/autoload/modules.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index d0cddeb77..663734743 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -149,8 +149,7 @@ modified." ;; Replace autoload paths (only for module autoloads) with ;; absolute paths for faster resolution during load and ;; simpler `load-path' - (let ((load-path (append doom-modules-dirs - load-path)) + (let ((load-path (append doom-modules-dirs load-path)) cache) (save-excursion (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) @@ -283,7 +282,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (push module targets)) ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) (push (doom-module-locate-path - (intern (format ":%s" (match-string 1 module))) + (doom-keyword-intern (match-string 1 module)) (intern (match-string 2 module))) targets)))) (cl-block 'byte-compile From 400a4dafdb2a38996aa0796aec4f10733e0266e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:36:11 +0200 Subject: [PATCH 1780/4235] Revert unit test breakage This hunk was accidentally committed ahead of time! --- core/core-dispatcher.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index f30e5aafd..0db531811 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -173,7 +173,7 @@ respectively." (def-dispatcher! test "Run Doom unit tests." - (require 'core-unit-tests) + (load! "autoload/test") (doom//run-tests args)) (def-dispatcher! info From 8d4971d02b037eb14cda3e88a5d4569b27fd6ec1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 17:48:48 +0200 Subject: [PATCH 1781/4235] Remove vestigial reference to doom-module-table --- core/autoload/test.el | 51 +++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/core/autoload/test.el b/core/autoload/test.el index 0a65a6c33..7a357a449 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -14,34 +14,33 @@ If neither is available, run all tests in all enabled modules." (doom-initialize t) (doom-initialize-modules t)) (condition-case-unless-debug ex - (let* ((doom-modules (doom-module-table)) - (target-paths - ;; Convert targets (either from MODULES or `argv') into a list of - ;; string paths, pointing to the root directory of modules - (cond ((stringp (car modules)) ; command line - (save-match-data - (cl-loop for arg in modules - if (string= arg ":core") collect doom-core-dir - else if (string-match-p "/" arg) - nconc (cl-loop for dir in doom-modules-dirs - collect (expand-file-name arg dir)) - else - nconc (cl-loop for dir in doom-modules-dirs - for path = (expand-file-name arg dir) - if (file-directory-p path) - nconc - (cl-remove-if-not - #'file-directory-p - (directory-files path t "^[^.]" t))) - finally do (setq argv nil)))) + (let ((target-paths + ;; Convert targets (either from MODULES or `argv') into a list of + ;; string paths, pointing to the root directory of modules + (cond ((stringp (car modules)) ; command line + (save-match-data + (cl-loop for arg in modules + if (string= arg ":core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (cl-loop for dir in doom-modules-dirs + collect (expand-file-name arg dir)) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc + (cl-remove-if-not + #'file-directory-p + (directory-files path t "^[^.]" t))) + finally do (setq argv nil)))) - (modules ; cons-cells given to MODULES - (cl-loop for (module . submodule) in modules - if (doom-module-locate-path module submodule) - collect it)) + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-locate-path module submodule) + collect it)) - ((append (list doom-core-dir) - (doom-module-load-path)))))) + ((append (list doom-core-dir) + (doom-module-load-path)))))) ;; Load all the unit test files... (dolist (path target-paths) (let ((test-path (expand-file-name "test/" path))) From f1446911576a4ca05922ca55fbb111f877e199ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 19:07:37 +0200 Subject: [PATCH 1782/4235] Don't delete autoloads file Turns out to be more error prone. Better to just ignore the existing one when force-initializing Doom. --- core/core-packages.el | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index d1e809d7c..09971b391 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -276,15 +276,10 @@ to least)." (when (or force-p (not doom-init-p)) ;; Set this to prevent infinite recursive calls to `doom-initialize' (setq doom-init-p t) - ;; Delete autoloads file so we can regenerate them later. - (when force-p - (mapc #'doom-delete-autoloads-file - (list doom-autoload-file - doom-package-autoload-file))) ;; `doom-autoload-file' tells Emacs where to load all its autoloaded ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. - (unless (doom-initialize-autoloads doom-autoload-file) + (unless (or force-p (doom-initialize-autoloads doom-autoload-file)) (doom-ensure-core-directories) (doom-ensure-same-emacs-version-p) (doom-ensure-packages-initialized force-p) From 85704bea33c000a81af707989472b08cfdbfc4c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 19:10:58 +0200 Subject: [PATCH 1783/4235] Fix void-variable ex2 error while package managing --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index e388bae7a..33641b572 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -20,7 +20,7 @@ ('user-error (print! (bold (red " NOTICE: %s" ex)))) ('file-error - (print! (bold (red " FILE ERROR: %s" (error-message-string ex2)))) + (print! (bold (red " FILE ERROR: %s" (error-message-string ex)))) (print! " Trying again...") (quiet! (doom-refresh-packages-maybe t)) ,@body))) From 2d5ac8a164dd266dfb139b20e892989a3281b645 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 19:15:39 +0200 Subject: [PATCH 1784/4235] Fix void-variable package--builtins error Occurs while running make install because package.el wasn't loaded in time. --- core/autoload/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 33641b572..0ec4632d1 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -256,6 +256,7 @@ If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. Used by `doom//packages-install'." + (doom-initialize-packages) (cl-loop for desc in (doom-get-packages) for (name . plist) = desc if (and (or include-ignored-p From 5295f36115244ab7d99478f021cd52d0ce6f4204 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 20:54:32 +0200 Subject: [PATCH 1785/4235] case-fold-search = nil in reload-package-autoloads Slight optimization. --- core/autoload/modules.el | 67 ++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/core/autoload/modules.el b/core/autoload/modules.el index 663734743..9d90c7cc6 100644 --- a/core/autoload/modules.el +++ b/core/autoload/modules.el @@ -201,39 +201,40 @@ This should be run whenever your `doom!' block or update your packages." (with-temp-file doom-package-autoload-file (insert ";;; -*- lexical-binding:t -*-\n" ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") - (save-excursion - ;; Cache the important and expensive-to-initialize state here. - (doom-initialize-packages) - (prin1 `(setq load-path ',load-path - auto-mode-alist ',auto-mode-alist - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages - package-activated-list ',package-activated-list) - (current-buffer)) - (print! (green "✓ Cached package state")) - ;; insert package autoloads - (dolist (spec package-alist) - (if-let* ((pkg (car spec)) - (desc (cadr spec))) - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file (concat (package--autoloads-file-name desc) ".el"))) - (when (file-exists-p file) - (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") - (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) - (unless (nth 8 (syntax-ppss)) - (replace-match "" t t))) - (unless (bolp) (insert "\n")) - (insert ")\n")))) - (print! (yellow "⚠ Couldn't find package desc for %s" (car spec)))))) - (print! (green "✓ Package autoloads included")) - ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, - ;; at least); they are cached later, so all those membership checks are - ;; unnecessary overhead. - (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) - (goto-char (match-beginning 1)) - (kill-sexp)) - (print! (green "✓ Removed load-path/auto-mode-alist entries"))) + (let (case-fold-search) + (save-excursion + ;; Cache the important and expensive-to-initialize state here. + (doom-initialize-packages) + (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer)) + (print! (green "✓ Cached package state")) + ;; insert package autoloads + (dolist (spec package-alist) + (if-let* ((pkg (car spec)) + (desc (cadr spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file (concat (package--autoloads-file-name desc) ".el"))) + (when (file-exists-p file) + (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n")))) + (print! (yellow "⚠ Couldn't find package desc for %s" (car spec)))))) + (print! (green "✓ Package autoloads included")) + ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, + ;; at least); they are cached later, so all those membership checks are + ;; unnecessary overhead. + (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) + (goto-char (match-beginning 1)) + (kill-sexp)) + (print! (green "✓ Removed load-path/auto-mode-alist entries")))) (doom--byte-compile-file doom-package-autoload-file) (when (and noninteractive (not (daemonp))) (doom--server-load doom-package-autoload-file)) From 19deb4b9268775953b42ec5c601c4706675f48f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 20:55:42 +0200 Subject: [PATCH 1786/4235] Fix buffer-read-only: autoloads.el error --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 09971b391..8fb349c2f 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -279,7 +279,7 @@ to least)." ;; `doom-autoload-file' tells Emacs where to load all its autoloaded ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. - (unless (or force-p (doom-initialize-autoloads doom-autoload-file)) + (when (or force-p (not (doom-initialize-autoloads doom-autoload-file))) (doom-ensure-core-directories) (doom-ensure-same-emacs-version-p) (doom-ensure-packages-initialized force-p) From f02156286b17c168e07b539d82b83fc42d4ad53e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 20:57:14 +0200 Subject: [PATCH 1787/4235] Error if autoloads are missing interactively Trying to regenerate them greatly complicates doom-initialize's potential use-cases. Keep it simple stupid! --- core/core-packages.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 8fb349c2f..989ea611c 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -242,9 +242,6 @@ it exists." ;; Bootstrap API ;; -(autoload 'doom//reload-doom-autoloads "autoload/modules" nil t) -(autoload 'doom//reload-package-autoloads "autoload/modules" nil t) - (defun doom-initialize (&optional force-p) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). @@ -287,14 +284,14 @@ to least)." ;; Regenerate `doom-autoload-file', which tells Doom where to find all its ;; module autoloaded functions. (unless (or force-p noninteractive) - (doom//reload-doom-autoloads))) + (user-error "Your doom autoloads are missing! Run `bin/doom refresh' to regenerate them"))) ;; Loads `doom-package-autoload-file', which caches `load-path', ;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and ;; `package-activated-list'. A big reduction in startup time. (unless (or force-p (doom-initialize-autoloads doom-package-autoload-file) noninteractive) - (doom//reload-package-autoloads))) + (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) ;; Initialize Doom core (unless noninteractive (add-hook! 'emacs-startup-hook From 6f98aeebfbd7e5772b2f104100eda9606dbc7150 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 20:58:00 +0200 Subject: [PATCH 1788/4235] Don't set doom-init-modules-p from doom-modules Causes user config to not be loaded if doom-modules is used earlier. --- core/core-packages.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 989ea611c..7cd1d292b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -481,9 +481,12 @@ This doesn't require modules to be enabled. For enabled modules us (defun doom-modules (&optional refresh-p) "Minimally initialize `doom-modules' (a hash table) and return it." - (let ((noninteractive t)) - (doom-initialize-modules refresh-p)) - doom-modules) + (or (unless refresh-p doom-modules) + (let ((noninteractive t) + doom-init-modules-p) + (message "Initializing modules") + (doom-initialize-modules t) + doom-modules))) ;; From 1afc5965dff95de816bb2c51ad69eee57539cdc9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 22:25:29 +0200 Subject: [PATCH 1789/4235] add-hook! -> add-hook for one-to-one hook --- modules/lang/clojure/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index b8b0a1452..30b93c398 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,7 +1,7 @@ ;;; lang/clojure/config.el -*- lexical-binding: t; -*- ;; `clojure-mode' -(add-hook! 'clojure-mode-hook #'rainbow-delimiters-mode) +(add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) (def-package! clj-refactor From 24c57e785f9fc10432fb197f0f5414c3bfe82ed7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 23:15:58 +0200 Subject: [PATCH 1790/4235] Disable both treemacs by default Once treemacs has been through its rounds (and I've customed its icons), it will likely become the new default, but for now, neotree still wins. --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 78c9c05b4..f3996ae58 100644 --- a/init.example.el +++ b/init.example.el @@ -34,7 +34,7 @@ hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping neotree ; a project drawer, like NERDTree for vim - treemacs ; a project drawer, like neotree but cooler + ;treemacs ; a project drawer, like neotree but cooler (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules From cb0ab2fcda3f8519407f87168c458587a354d3e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 23:16:50 +0200 Subject: [PATCH 1791/4235] Refactor ui/treemacs --- modules/ui/treemacs/config.el | 70 +++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 15fdd19f6..5b7074763 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -1,45 +1,53 @@ ;;; ui/treemacs/config.el -*- lexical-binding: t; -*- -(defvar treemacs-use-git-mode - (pcase (cons (not (null (executable-find "git"))) - (not (null (executable-find "python3")))) - (`(t . t) 'extended) - (`(t . _) 'simple)) - "Type of git integration for `treemacs-git-mode'. +(setq treemacs-no-png-images t + treemacs-follow-after-init t + treemacs-width 35 + treemacs-position 'left + treemacs-is-never-other-window t + treemacs-silent-refresh nil + treemacs-indentation 2 + treemacs-sorting 'alphabetic-desc + treemacs-show-hidden-files t + treemacs-goto-tag-strategy 'refetch-index) + + +(after! treemacs-persistence + (setq treemacs--persist-file (concat doom-cache-dir "treemacs-persist")) + + ;; Because `treemacs--persist-file' is defined with `defconst' and used + ;; immediately afterwards, it cannot be easily customized before + ;; `treemacs--restore' uses its value. So, we call it a second time so the + ;; customization can take effect. + (unless (featurep 'treemacs) + (treemacs--restore))) + + +(after! treemacs + (defvar +treemacs-use-git-mode + (pcase (cons (not (null (executable-find "git"))) + (not (null (executable-find "python3")))) + (`(t . t) 'extended) + (`(t . _) 'simple)) + "Type of git integration for `treemacs-git-mode'. There are 2 possible values: 1) simple, which highlights only files based on their git status, and is slightly faster 2) extended, which highlights both files and directories, but requires python") -(def-package! treemacs - :commands (treemacs treemacs-find-file treemacs-bookmark) - :config - (setq treemacs-no-png-images t - treemacs-follow-after-init t - treemacs-width 35 - treemacs-position 'left - treemacs-is-never-other-window t - treemacs-silent-refresh nil - treemacs-indentation 2 - treemacs-sorting 'alphabetic-desc - treemacs-show-hidden-files t - treemacs-goto-tag-strategy 'refetch-index - treemacs-collapse-dirs (if (executable-find "python3") 3 0)) + (defvar treemacs-collapse-dirs + (if (executable-find "python3") 3 0)) + (treemacs-follow-mode t) (treemacs-filewatch-mode t) - (when (memq treemacs-use-git-mode '(simple extended)) - (treemacs-git-mode treemacs-use-git-mode))) + (when (memq +treemacs-use-git-mode '(simple extended)) + (treemacs-git-mode +treemacs-use-git-mode))) -(add-hook! 'doom-post-init-hook - (map! :leader - :prefix "f" - :desc "Open treemacs" :nv "t" #'treemacs - :desc "Find file in treemacs" :nv "T" #'treemacs-find-file - :desc "Go to bookmark" :nv "b" #'treemacs-bookmark)) (def-package! treemacs-evil - :after (treemacs evil) - :if (featurep! :feature evil)) + :when (featurep! :feature evil +everywhere) + :after treemacs) + (def-package! treemacs-projectile - :after (treemacs projectile)) + :after treemacs) From cf6b4f891e82660d69f0128d3a5e938a4006b1e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 23:17:12 +0200 Subject: [PATCH 1792/4235] Add +everywhere flag to treemacs-evil --- modules/ui/treemacs/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/treemacs/packages.el b/modules/ui/treemacs/packages.el index 7125f777a..8d203580f 100644 --- a/modules/ui/treemacs/packages.el +++ b/modules/ui/treemacs/packages.el @@ -2,6 +2,6 @@ ;;; ui/treemacs/packages.el (package! treemacs) -(when (featurep! :feature evil) +(when (featurep! :feature evil +everywhere) (package! treemacs-evil)) (package! treemacs-projectile) From 7ebedf90ab610e56a9e0655e73743db0293f9061 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 23:18:27 +0200 Subject: [PATCH 1793/4235] Remove .gitignore entry treemacs--persist-file has been changed --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 96aba118a..9e9f3ed2c 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,3 @@ network-security.data # transient files *.cache-* *.log -/.cache/treemacs-persist From 6bf529ddf8d5a08f2e829cc7a129569d9a448787 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Jun 2018 23:23:09 +0200 Subject: [PATCH 1794/4235] Add magit/vcs support to doom file commands --- core/autoload/files.el | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 31a166567..5efcb3b5a 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -25,12 +25,23 @@ (when new-path (recentf-add-file new-path)) (recentf-remove-if-non-kept old-path)) - (when (and projectile-mode + (when (and (bound-and-true-p projectile-mode) (projectile-project-p) (projectile-file-cached-p old-path (projectile-project-root))) (projectile-purge-file-from-cache old-path)) (when (bound-and-true-p save-place-mode) - (save-place-forget-unreadable-files))) + (save-place-forget-unreadable-files)) + (when (featurep 'vc) + (when-let* ((backend (vc-backend old-path)) + (default-directory (file-name-directory old-path))) + (vc-call-backend backend 'delete-file old-path)))) + +(defun doom--update-file (path) + (when (featurep 'vc) + (vc-file-clearprops path) + (vc-resynch-buffer path nil t)) + (when (featurep 'magit) + (magit-refresh))) (defun doom--copy-file (old-path new-path &optional force-p) (let* ((new-path (expand-file-name new-path)) @@ -83,6 +94,7 @@ kills the buffer. If FORCE-P, force the deletion (don't ask for confirmation)." ;; to real buffers (`doom-real-buffer-p') (doom/kill-this-buffer-in-all-windows buf t) (doom--forget-file path) + (doom--update-file path) (message "Successfully deleted %s" short-path)))))))) ;;;###autoload @@ -92,6 +104,7 @@ file if it exists, without confirmation." (interactive "F") (pcase (catch 'status (when-let* ((dest (doom--copy-file (buffer-file-name) new-path force-p))) + (doom--update-file new-path) (message "File successfully copied to %s" dest))) (`overwrite-self (error "Cannot overwrite self")) (`aborted (message "Aborted")) @@ -111,6 +124,7 @@ file if it exists, without confirmation." (kill-this-buffer) (find-file new-path) (doom--forget-file old-path new-path) + (doom--update-file new-path) (message "File successfully moved to %s" dest)))) (`overwrite-self (error "Cannot overwrite self")) (`aborted (message "Aborted")) From 8c6e4032158db1cc12d96ff2b47e8d8fb3275b09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 00:11:04 +0200 Subject: [PATCH 1795/4235] Hide mode-line in treemacs --- modules/ui/treemacs/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 5b7074763..f814fd85a 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -41,7 +41,9 @@ There are 2 possible values: (treemacs-follow-mode t) (treemacs-filewatch-mode t) (when (memq +treemacs-use-git-mode '(simple extended)) - (treemacs-git-mode +treemacs-use-git-mode))) + (treemacs-git-mode +treemacs-use-git-mode)) + + (add-hook 'treemacs-mode-hook #'hide-mode-line-mode)) (def-package! treemacs-evil From c8783f3291936c91b010677b5e696d312bd35496 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 00:11:20 +0200 Subject: [PATCH 1796/4235] ESC -> close treemacs for evil users --- modules/ui/treemacs/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index f814fd85a..87e1c4761 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -48,7 +48,8 @@ There are 2 possible values: (def-package! treemacs-evil :when (featurep! :feature evil +everywhere) - :after treemacs) + :after treemacs + :config (define-key evil-treemacs-state-map [escape] #'delete-window)) (def-package! treemacs-projectile From dd9f8d47af8b904849a8564b4e2782afe24c9f14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 00:39:55 +0200 Subject: [PATCH 1797/4235] Fix infinite recursion in buffer switch hooks Caused by advice functions trying to manipulate non-existent buffers that were intended to be created after switching to them. --- core/core-ui.el | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 37a4fd693..ca704ecc3 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -385,16 +385,14 @@ from the default." (with-selected-window window (run-hooks 'doom-after-switch-window-hook)))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) - (let ((dest (get-buffer buffer-or-name))) - (if (or doom-inhibit-switch-buffer-hooks - (null dest) - (eq dest (current-buffer))) - (apply orig-fn dest args) - (let ((doom-inhibit-switch-buffer-hooks t)) - (run-hooks 'doom-before-switch-buffer-hook) - (prog1 (apply orig-fn dest args) - (with-current-buffer dest - (run-hooks 'doom-after-switch-buffer-hook))))))) + (if (or doom-inhibit-switch-buffer-hooks + (eq (get-buffer buffer-or-name) (current-buffer))) + (apply orig-fn buffer-or-name args) + (let ((doom-inhibit-switch-buffer-hooks t)) + (run-hooks 'doom-before-switch-buffer-hook) + (prog1 (apply orig-fn buffer-or-name args) + (with-current-buffer buffer-or-name + (run-hooks 'doom-after-switch-buffer-hook)))))) (defun doom|init-custom-hooks (&optional disable) (dolist (spec '((select-frame . doom*switch-frame-hooks) From 87ccdecd461985ca197dec3cab0f7035d11d858f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 01:06:41 +0200 Subject: [PATCH 1798/4235] Autoload magit-file-delete --- modules/tools/magit/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 720e957e0..031c87200 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -15,7 +15,7 @@ load everything.") ;; (def-package! magit - :defer t + :commands magit-file-delete :config (setq magit-completing-read-function (if (featurep! :completion ivy) From a25eff0189c156cc3ce864548d03c6bd09447a96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 01:01:27 +0200 Subject: [PATCH 1799/4235] delete-this-file: don't propagate deletion to vcs Doom shouldn't assume the user always wants to stage the current deletion after every delete. --- core/autoload/files.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 5efcb3b5a..9afcb041d 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -30,11 +30,7 @@ (projectile-file-cached-p old-path (projectile-project-root))) (projectile-purge-file-from-cache old-path)) (when (bound-and-true-p save-place-mode) - (save-place-forget-unreadable-files)) - (when (featurep 'vc) - (when-let* ((backend (vc-backend old-path)) - (default-directory (file-name-directory old-path))) - (vc-call-backend backend 'delete-file old-path)))) + (save-place-forget-unreadable-files))) (defun doom--update-file (path) (when (featurep 'vc) From d178d78b2b5c8bfd7310e60582efe8d585e0df29 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 9 Jun 2018 22:01:09 +1000 Subject: [PATCH 1800/4235] Move +parinfer to :editor parinfer --- init.example.el | 6 ++++-- .../emacs-lisp/+parinfer.el => editor/parinfer/config.el} | 6 +++++- modules/editor/parinfer/packages.el | 4 ++++ modules/lang/emacs-lisp/config.el | 2 -- modules/lang/emacs-lisp/packages.el | 3 --- 5 files changed, 13 insertions(+), 8 deletions(-) rename modules/{lang/emacs-lisp/+parinfer.el => editor/parinfer/config.el} (80%) create mode 100644 modules/editor/parinfer/packages.el diff --git a/init.example.el b/init.example.el index c272bcd19..b57ab2566 100644 --- a/init.example.el +++ b/init.example.el @@ -75,8 +75,7 @@ ;erlang ; an elegant language for a more civilized age ;elixir ; erlang done right ;elm ; care for a cup of TEA? - (emacs-lisp ; drown in parentheses - +parinfer) ; A handy addon to sort of turn lisp into python + emacs-lisp ; drown in parentheses ;ess ; emacs speaks statistics ;go ; the hipster dialect ;(haskell +intero) ; a language that's lazier than I am @@ -128,6 +127,9 @@ ;floobits ; peer programming for a price ;impatient-mode ; show off code over HTTP + :editor + parinfer ; A handy addon to sort of turn lisp into python + :config ;; For literate config users. This will tangle+compile a config.org ;; literate config in your `doom-private-dir' whenever it changes. diff --git a/modules/lang/emacs-lisp/+parinfer.el b/modules/editor/parinfer/config.el similarity index 80% rename from modules/lang/emacs-lisp/+parinfer.el rename to modules/editor/parinfer/config.el index 60a6f4d98..4da768520 100644 --- a/modules/lang/emacs-lisp/+parinfer.el +++ b/modules/editor/parinfer/config.el @@ -4,7 +4,11 @@ (def-package! parinfer :commands (parinfer-mode) :init - (add-hook! emacs-lisp-mode + (add-hook! (emacs-lisp-mode + clojure-mode + common-lisp-mode + scheme-mode + lisp-mode) (yas-minor-mode -1) (parinfer-mode)) (setq parinfer-extensions diff --git a/modules/editor/parinfer/packages.el b/modules/editor/parinfer/packages.el new file mode 100644 index 000000000..56af803d7 --- /dev/null +++ b/modules/editor/parinfer/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/parinfer/packages.el + +(package! parinfer) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 20d7077e1..dc395d0e5 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -116,5 +116,3 @@ (def-project-mode! +emacs-lisp-ert-mode :modes (emacs-lisp-mode) :match "/test[/-].+\\.el$") - -(when (featurep! +parinfer) (load! "+parinfer")) diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index 07f484dd9..24b02c21b 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -9,6 +9,3 @@ (when (featurep! :feature syntax-checker) (package! flycheck-cask)) - -(when (featurep! +parinfer) - (package! parinfer)) From 3fec00a5341fdc0a4b3fc92cf06a7cc83e3aff3e Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Mon, 11 Jun 2018 10:10:34 +1000 Subject: [PATCH 1801/4235] Swap from emacs-lisp-mode-map to parinfer-mode-map --- modules/editor/parinfer/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/parinfer/config.el b/modules/editor/parinfer/config.el index 4da768520..b470da534 100644 --- a/modules/editor/parinfer/config.el +++ b/modules/editor/parinfer/config.el @@ -19,7 +19,7 @@ (if (featurep! :feature evil) (push 'evil parinfer-extensions)) :config - (map! :map emacs-lisp-mode-map + (map! :map parinfer-mode-map :i "" #'parinfer-smart-tab:dwim-right :i "" #'parinfer-smart-tab:dwim-left :localleader From b9a179eeed5faa948a562ba17584ec6ee31bcde7 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Mon, 11 Jun 2018 12:28:03 +1000 Subject: [PATCH 1802/4235] Make +wakatime-init interactive Sometimes it doesn't prompt to decrypt gpg, etc etc. Regardless, I think this should be interactive so it's easily re-initialized --- modules/tools/wakatime/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 1589ca5bb..77f9fff0d 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -7,6 +7,7 @@ (defun +wakatime-init () "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." + (interactive) (if (boundp 'wakatime-api-key) (global-wakatime-mode +1) (message "No `wakatime-api-key' set! wakaktime-mode will stay disabled.")) From db45248adfa31f9694c5727f6191854fa86de3ce Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Mon, 11 Jun 2018 21:55:34 +1000 Subject: [PATCH 1803/4235] Add yasnippet back to parinfer --- modules/editor/parinfer/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/editor/parinfer/config.el b/modules/editor/parinfer/config.el index b470da534..3142978e7 100644 --- a/modules/editor/parinfer/config.el +++ b/modules/editor/parinfer/config.el @@ -9,7 +9,6 @@ common-lisp-mode scheme-mode lisp-mode) - (yas-minor-mode -1) (parinfer-mode)) (setq parinfer-extensions '(defaults @@ -20,7 +19,7 @@ (push 'evil parinfer-extensions)) :config (map! :map parinfer-mode-map - :i "" #'parinfer-smart-tab:dwim-right + :i "" #'parinfer-smart-tab:dwim-right-or-complete :i "" #'parinfer-smart-tab:dwim-left :localleader :nv "m" #'parinfer-toggle-mode)) From f70c9ebb71751a67365a665d8bb46b2925732aad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 14:21:35 +0200 Subject: [PATCH 1804/4235] Fix void-symbol errors in compilation buffers Occurs when :lang ruby is enabled, because the rspec-mode package autoloads an advice, but not the advice function. Still, it seems silly to do this advice before the package is loaded, so we disable it. --- modules/lang/ruby/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index d9c8566ae..cce232a60 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -83,6 +83,13 @@ environment variables." (("class" "def" "while" "do" "module" "for" "until") () "end") ;; Rake (("task" "namespace") () "end"))) + + ;; This package autoloads this advice, but does not autoload the advice + ;; function, causing void-symbol errors when using the compilation buffer + ;; (even for things unrelated to ruby/rspec). Even if the function were + ;; autoloaded, it seems silly to add this advice before rspec-mode is loaded, + ;; so remove it anyway! + (advice-remove 'compilation-buffer-name 'rspec-compilation-buffer-name-wrapper) :config (remove-hook 'ruby-mode-hook #'rspec-enable-appropriate-mode) (map! :map (rspec-mode-map rspec-verifiable-mode-map) From 0741c8851a33c0a9d4021eaa44c28afcc10d52a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 23:18:15 +0200 Subject: [PATCH 1805/4235] Split core-packages into two (packages & modules) + Move doom-initialize et co into core.el + Lazy load core-packages + load! has been moved into core-lib + Added FILE! and DIR! macros + Fix package! not returning correct value when package is disabled + Remove :disabled support for def-package-hook! officially --- core/autoload/packages.el | 16 + core/core-lib.el | 42 ++- core/core-modules.el | 384 ++++++++++++++++++++++ core/core-packages.el | 652 ++------------------------------------ core/core.el | 241 ++++++++++++-- 5 files changed, 681 insertions(+), 654 deletions(-) create mode 100644 core/core-modules.el diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 0ec4632d1..c8856ab44 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -550,3 +550,19 @@ calls." (print! (bold (green "Finished!"))) (if success (doom-delete-autoloads-file doom-package-autoload-file)) success))))) + + +;; +;; Make package.el cooperate with Doom +;; + +;; Updates QUELPA after deleting a package +;;;###autoload +(advice-add #'package-delete :after #'doom*package-delete) + +;; Replace with Doom variants +;;;###autoload +(advice-add #'package-autoremove :override #'doom//packages-autoremove) +;;;###autoload +(advice-add #'package-install-selected-packages :override #'doom//packages-install) + diff --git a/core/core-lib.el b/core/core-lib.el index 86aa2e9d4..918c2fc49 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -65,6 +65,16 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." collect hook else collect (intern (format "%s-hook" (symbol-name hook))))) +(defun doom--assert-stage-p (stage macro) + (cl-assert (eq stage doom--stage) + nil + "Found %s call in non-%s.el file (%s)" + macro (symbol-name stage) + (let ((path (FILE!))) + (if (file-in-directory-p path doom-emacs-dir) + (file-relative-name path doom-emacs-dir) + (abbreviate-file-name path))))) + ;; ;; Functions @@ -178,6 +188,18 @@ MATCH is a string regexp. Only entries that match it will be included." ;; Macros ;; +(defmacro FILE! () + "TODO" + `(cond ((bound-and-true-p byte-compile-current-file)) + ((stringp (car-safe current-load-list)) (car current-load-list)) + (load-file-name) + (buffer-file-name))) + +(defmacro DIR! () + "TODO" + `(let ((file (FILE!))) + (and file (file-name-directory file)))) + (defmacro λ! (&rest body) "A shortcut for inline interactive lambdas." (declare (doc-string 1)) @@ -190,7 +212,7 @@ MATCH is a string regexp. Only entries that match it will be included." compilation. This will no-op on features that have been disabled by the user." (declare (indent defun) (debug t)) (unless (and (symbolp targets) - (memq targets doom-disabled-packages)) + (memq targets (bound-and-true-p doom-disabled-packages))) (list (if (or (not (bound-and-true-p byte-compile-current-file)) (dolist (next (doom-enlist targets)) (if (symbolp next) @@ -422,5 +444,23 @@ KEY is a key string or vector. It is *not* piped through `kbd'." (push `(define-key map ,key ,def) forms))) (nreverse forms))))) +(defmacro load! (filename &optional path noerror) + "Load a file relative to the current executing file (`load-file-name'). + +FILENAME is either a file path string or a form that should evaluate to such a +string at run time. PATH is where to look for the file (a string representing a +directory path). If omitted, the lookup is relative to either `load-file-name', +`byte-compile-current-file' or `buffer-file-name' (checked in that order). + +If NOERROR is non-nil, don't throw an error if the file doesn't exist." + (unless path + (setq path (or (DIR!) + (error "Could not detect path to look for '%s' in" + filename)))) + `(load ,(if path + `(expand-file-name ,filename ,path) + filename) + ,noerror ,(not doom-debug-mode))) + (provide 'core-lib) ;;; core-lib.el ends here diff --git a/core/core-modules.el b/core/core-modules.el new file mode 100644 index 000000000..0d67b3e23 --- /dev/null +++ b/core/core-modules.el @@ -0,0 +1,384 @@ +;;; core-modules.el --- module & package management system -*- lexical-binding: t; -*- + +(defvar doom-init-modules-p nil + "Non-nil if `doom-initialize-modules' has run.") + +(defvar doom-modules () + "A hash table of enabled modules. Set by `doom-initialize-modules'.") + +(defvar doom-modules-dirs + (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) + "A list of module root directories. Order determines priority.") + +(defvar doom--current-module nil) + + +;; +;; Bootstrap API +;; + +(defun doom-initialize-modules (&optional force-p) + "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy +session of Dooming. Will noop if used more than once, unless FORCE-P is +non-nil." + (when (or force-p (not doom-init-modules-p)) + ;; Set `doom-init-modules-p' early, so `doom-pre-init-hook' won't infinitely + ;; recurse by accident if any of them need `doom-initialize-modules'. + (setq doom-init-modules-p t) + (when doom-private-dir + (load (expand-file-name "init" doom-private-dir) + 'noerror 'nomessage)))) + +(defun doom-initialize-autoloads (file) + "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." + (condition-case-unless-debug e + (load (file-name-sans-extension file) 'noerror 'nomessage) + ('error + (message "Autoload error: %s -> %s" + (car e) (error-message-string e))))) + + +;; +;; Module API +;; + +(defun doom-module-p (category module) + "Returns t if CATEGORY MODULE is enabled (ie. present in `doom-modules')." + (and (hash-table-p doom-modules) + (gethash (cons category module) doom-modules) + t)) + +(defun doom-module-get (category module &optional property) + "Returns the plist for CATEGORY MODULE. Gets PROPERTY, specifically, if set." + (when-let* ((plist (gethash (cons category module) doom-modules))) + (if property + (plist-get plist property) + plist))) + +(defun doom-module-put (category module property value &rest rest) + "Set a PROPERTY for CATEGORY MODULE to VALUE. PLIST should be additional pairs +of PROPERTY and VALUEs." + (when-let* ((plist (doom-module-get category module))) + (plist-put plist property value) + (when rest + (when (cl-oddp (length rest)) + (signal 'wrong-number-of-arguments (list (length rest)))) + (while rest + (plist-put rest (pop rest) (pop rest)))) + (puthash (cons category module) plist doom-modules))) + +(defun doom-module-set (category module &rest plist) + "Enables a module by adding it to `doom-modules'. + +CATEGORY is a keyword, module is a symbol, PLIST is a plist that accepts the +following properties: + + :flags [SYMBOL LIST] list of enabled category flags + :path [STRING] path to category root directory + +Example: + (doom-module-set :lang 'haskell :flags '(+intero))" + (when plist + (let ((old-plist (doom-module-get category module))) + (unless (plist-member plist :flags) + (plist-put plist :flags (plist-get old-plist :flags))) + (unless (plist-member plist :path) + (plist-put plist :path (or (plist-get old-plist :path) + (doom-module-locate-path category module)))))) + (let ((key (cons category module))) + (puthash key plist doom-modules))) + +(defun doom-module-path (category module &optional file) + "Like `expand-file-name', but expands FILE relative to CATEGORY (keywordp) and +MODULE (symbol). + +If the category isn't enabled this will always return nil. For finding disabled +modules use `doom-module-locate-path'." + (let ((path (doom-module-get category module :path))) + (if file (expand-file-name file path) + path))) + +(defun doom-module-locate-path (category &optional module file) + "Searches `doom-modules-dirs' to find the path to a module. + +CATEGORY is a keyword (e.g. :lang) and MODULE is a symbol (e.g. 'python). FILE +is a string that will be appended to the resulting path. If no path exists, this +returns nil, otherwise an absolute path. + +This doesn't require modules to be enabled. For enabled modules us +`doom-module-path'." + (when (keywordp category) + (setq category (substring (symbol-name category) 1))) + (when (and module (symbolp module)) + (setq module (symbol-name module))) + (cl-loop for default-directory in doom-modules-dirs + for path = (concat category "/" module "/" file) + if (file-exists-p path) + return (expand-file-name path))) + +(defun doom-module-from-path (&optional path) + "Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path)." + (or doom--current-module + (when path + (save-match-data + (setq path (file-truename path)) + (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) + (when-let* ((module (match-string 1 path)) + (submodule (match-string 2 path))) + (cons (intern (concat ":" module)) + (intern submodule)))))))) + +(defun doom-module-load-path () + "Return a list of absolute file paths to activated modules." + (append (cl-loop for plist being the hash-values of (doom-modules) + collect (plist-get plist :path)) + (list doom-private-dir))) + +(defun doom-modules (&optional refresh-p) + "Minimally initialize `doom-modules' (a hash table) and return it." + (or (unless refresh-p doom-modules) + (let ((noninteractive t) + doom-init-modules-p) + (message "Initializing modules") + (doom-initialize-modules t) + doom-modules))) + + +;; +;; Use-package modifications +;; + +(autoload 'use-package "use-package-core" nil nil t) + +;; Adds the :after-call custom keyword to `use-package' (and consequently, +;; `def-package!'). :after-call takes a symbol or list of symbols. These symbols +;; can be functions to hook variables. +;; +;; (use-package X :after-call find-file-hook) +;; +;; This will load X on the first invokation of `find-file-hook' (then it will +;; remove itself from the hook/function). +(defvar doom--deferred-packages-alist ()) +(after! use-package-core + (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) + + (setq use-package-keywords + (use-package-list-insert :after-call use-package-keywords :after)) + + (defalias 'use-package-normalize/:after-call + 'use-package-normalize-symlist) + + (defun use-package-handler/:after-call (name-symbol _keyword hooks rest state) + (let ((fn (intern (format "doom|transient-hook--load-%s" name-symbol))) + (hooks (delete-dups hooks))) + (if (plist-get state :demand) + (use-package-process-keywords name rest state) + (use-package-concat + `((fset ',fn + (lambda (&rest _) + (require ',name-symbol) + (dolist (hook (cdr (assq ',name-symbol doom--deferred-packages-alist))) + (if (functionp hook) + (advice-remove hook #',fn) + (remove-hook hook #',fn))) + (map-delete doom--deferred-packages-alist ',name-symbol) + (fmakunbound ',fn)))) + (cl-mapcan (lambda (hook) + (if (functionp hook) + `((advice-add #',hook :before #',fn)) + `((add-hook ',hook #',fn)))) + hooks) + `((map-put doom--deferred-packages-alist + ',name-symbol + '(,@hooks ,@(cdr (assq name-symbol doom--deferred-packages-alist))))) + (use-package-process-keywords name rest state)))))) + + +;; +;; Module config macros +;; + +(defmacro doom! (&rest modules) + "Bootstraps DOOM Emacs and its modules. + +The bootstrap process involves making sure the essential directories exist, core +packages are installed, `doom-autoload-file' is loaded, `doom-packages-file' +cache exists (and is loaded) and, finally, loads your private init.el (which +should contain your `doom!' block). + +If the cache exists, much of this function isn't run, which substantially +reduces startup time. + +The overall load order of Doom is as follows: + + ~/.emacs.d/init.el + ~/.emacs.d/core/core.el + `doom-pre-init-hook' + ~/.doom.d/init.el + Module init.el files + `doom-init-hook' + Module config.el files + ~/.doom.d/config.el + `after-init-hook' + `emacs-startup-hook' + `doom-post-init-hook' (at end of `emacs-startup-hook') + +Module load order is determined by your `doom!' block. See `doom-modules-dirs' +for a list of all recognized module trees. Order defines precedence (from most +to least)." + (let ((doom-modules + (make-hash-table :test #'equal + :size (if modules (length modules) 100) + :rehash-threshold 1.0)) + category + init-forms config-forms) + (dolist (m modules) + (cond ((keywordp m) (setq category m)) + ((not category) (error "No module category specified for %s" m)) + ((let* ((module (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m))) + (path (doom-module-locate-path category module))) + (if (not path) + (message "Couldn't find the %s %s module" category module) + (let ((key (cons category module))) + (doom-module-set category module :flags flags :path path) + (push `(let ((doom--current-module ',key)) + (load! "init" ,path t)) + init-forms) + (push `(let ((doom--current-module ',key)) + (load! "config" ,path t)) + config-forms))))))) + `(let (file-name-handler-alist) + (setq doom-modules ',doom-modules) + ,@(nreverse init-forms) + (run-hooks 'doom-init-hook) + (unless noninteractive + (let ((doom--stage 'config)) + ,@(nreverse config-forms) + (when doom-private-dir + (load ,(expand-file-name "config" doom-private-dir) + t (not doom-debug-mode)))))))) + +(defmacro def-package! (name &rest plist) + "A thin wrapper around `use-package'." + ;; Ignore package if NAME is in `doom-disabled-packages' + (when (and (memq name (bound-and-true-p doom-disabled-packages)) + (not (memq :disabled 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) + (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) + (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) + (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) + `(use-package ,name ,@plist))) + +(defmacro def-package-hook! (package when &rest body) + "Reconfigures a package's `def-package!' block. + +Only use this macro in a module's init.el file. + +Under the hood, this uses use-package's `use-package-inject-hooks'. + +PACKAGE is a symbol; the package's name. +WHEN should be one of the following: + :pre-init :post-init :pre-config :post-config + +WARNING: If :pre-init or :pre-config hooks return nil, the original +`def-package!''s :init/:config block (respectively) is overwritten, so remember +to have them return non-nil (or exploit that to overwrite Doom's config)." + (declare (indent defun)) + (doom--assert-stage-p 'init #'package!) + (unless (memq when '(:pre-init :post-init :pre-config :post-config)) + (error "'%s' isn't a valid hook for def-package-hook!" when)) + `(progn + (setq use-package-inject-hooks t) + (add-hook! + ',(intern (format "use-package--%s--%s-hook" + package + (substring (symbol-name when) 1))) + ,@body))) + +(defmacro require! (category module &rest plist) + "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." + (let ((doom-modules (copy-hash-table doom-modules))) + (apply #'doom-module-set category module + (mapcar #'eval plist)) + (let ((module-path (doom-module-locate-path category module))) + (if (directory-name-p module-path) + `(condition-case-unless-debug ex + (let ((doom--current-module ',(cons category module))) + (load! "init" ,module-path :noerror) + (let ((doom--stage 'config)) + (load! "config" ,module-path :noerror))) + ('error + (lwarn 'doom-modules :error + "%s in '%s %s' -> %s" + (car ex) ,category ',module + (error-message-string ex)))) + (warn 'doom-modules :warning "Couldn't find module '%s %s'" + category module))))) + +(defmacro featurep! (module &optional submodule flag) + "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if +MODULE SUBMODULE has FLAG enabled. + + (featurep! :config default) + +Module FLAGs are set in your config's `doom!' block, typically in +~/.emacs.d/init.el. Like so: + + :config (default +flag1 -flag2) + +When this macro is used from inside a module, MODULE and SUBMODULE can be +omitted. eg. (featurep! +flag1)" + (unless submodule + (let* ((path (FILE!)) + (module-pair (doom-module-from-path path))) + (unless module-pair + (error "featurep! couldn't detect what module its in! (in %s)" path)) + (setq flag module + module (car module-pair) + submodule (cdr module-pair)))) + (if flag + (and (memq flag (doom-module-get module submodule :flags)) t) + (doom-module-p module submodule))) + + +;; +;; Cross-module configuration +;; + +;; I needed a way to reliably cross-configure modules without littering my +;; modules with `after!' blocks or testing whether they were enabled, so I wrote +;; `set!'. If a setting doesn't exist at runtime, the `set!' call is ignored and +;; its arguments are left unevaluated (and entirely omitted when byte-compiled). + +(defmacro def-setting! (keyword arglist &optional docstring &rest forms) + "Define a setting. Like `defmacro', this should return a form to be executed +when called with `set!'. FORMS are not evaluated until `set!' calls it. + +See `doom/describe-setting' for a list of available settings. + +Do not use this for configuring Doom core." + (declare (indent defun) (doc-string 3)) + (or (keywordp keyword) + (signal 'wrong-type-argument (list 'keywordp keyword))) + `(fset ',(intern (format "doom--set%s" keyword)) + (lambda ,arglist ,docstring ,@forms))) + +(defmacro set! (keyword &rest values) + "Set an option defined by `def-setting!'. Skip if doesn't exist. See +`doom/describe-setting' for a list of available settings. + +VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." + (declare (indent defun)) + (let ((fn (intern-soft (format "doom--set%s" keyword)))) + (if (and fn (fboundp fn)) + (apply fn values) + (when doom-debug-mode + (message "No setting found for %s" keyword) + nil)))) + +(provide 'core-modules) +;;; core-modules.el ends here diff --git a/core/core-packages.el b/core/core-packages.el index 7cd1d292b..dbb4fb8d0 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -1,4 +1,4 @@ -;;; core-packages.el --- package management system -*- lexical-binding: t; -*- +;;; core/core-packages.el -*- lexical-binding: t; -*- ;; Emacs package management is opinionated, and so am I. I've bound together ;; `use-package', `quelpa' and package.el to create my own, rolling-release, @@ -39,22 +39,6 @@ ;; ;; See core/autoload/packages.el for more functions. -(defvar doom-init-p nil - "Non-nil if `doom-initialize' has run.") - -(defvar doom-init-modules-p nil - "Non-nil if `doom-initialize-modules' has run.") - -(defvar doom-init-time nil - "The time it took, in seconds, for DOOM Emacs to initialize.") - -(defvar doom-modules () - "A hash table of enabled modules. Set by `doom-initialize-modules'.") - -(defvar doom-modules-dirs - (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) - "A list of module root directories. Order determines priority.") - (defvar doom-packages () "A list of enabled packages. Each element is a sublist, whose CAR is the package's name as a symbol, and whose CDR is the plist supplied to its @@ -67,30 +51,7 @@ missing) and shouldn't be deleted.") (defvar doom-disabled-packages () "A list of packages that should be ignored by `def-package!'.") -(defvar doom-site-load-path load-path - "The starting load-path, before it is altered by `doom-initialize'.") - -(defvar doom-autoload-file (concat doom-local-dir "autoloads.el") - "Where `doom//reload-doom-autoloads' will generate its core autoloads file.") - -(defvar doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el") - "Where `doom//reload-package-autoloads' will generate its package.el autoloads -file.") - -(defvar doom-reload-hook nil - "A list of hooks to run when `doom//reload-load-path' is called.") - -(defvar doom-emacs-changed-p nil - "If non-nil, the running version of Emacs is different from the first time -Doom was setup, which can cause problems.") - -(defvar doom--current-module nil) -(defvar doom--refreshed-p nil) -(defvar doom--stage 'init) - -;; -(setq autoload-compute-prefixes nil - package--init-file-ensured t +(setq package--init-file-ensured t package-user-dir (expand-file-name "elpa" doom-packages-dir) package-enable-at-startup nil package-archives @@ -100,27 +61,13 @@ Doom was setup, which can cause problems.") ;; I omit Marmalade because its packages are manually submitted rather ;; than pulled, so packages are often out of date with upstream. - ;; security settings - gnutls-verify-error (not (getenv "INSECURE")) ; you shouldn't use this - tls-checktrust gnutls-verify-error - tls-program (list "gnutls-cli --x509cafile %t -p %p %h" - ;; compatibility fallbacks - "gnutls-cli -p %p %h" - "openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof") - - use-package-verbose doom-debug-mode - use-package-minimum-reported-time (if doom-debug-mode 0 0.1) - ;; Don't track MELPA, we'll use package.el for that quelpa-checkout-melpa-p nil quelpa-update-melpa-p nil quelpa-melpa-recipe-stores nil quelpa-self-upgrade-p nil quelpa-verbose doom-debug-mode - quelpa-dir (expand-file-name "quelpa" doom-packages-dir) - - byte-compile-verbose doom-debug-mode - byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local)) + quelpa-dir (expand-file-name "quelpa" doom-packages-dir)) ;; accommodate INSECURE setting (unless gnutls-verify-error @@ -129,199 +76,9 @@ Doom was setup, which can cause problems.") ;; -;; Helpers 'n hooks +;; Bootstrapper ;; -(defun doom--assert-stage-p (stage macro) - (cl-assert (eq stage doom--stage) - nil - "Found %s call in non-%s.el file (%s)" - macro (symbol-name stage) - (if (file-in-directory-p load-file-name doom-emacs-dir) - (file-relative-name load-file-name doom-emacs-dir) - (abbreviate-file-name load-file-name)))) - -(defun doom|display-benchmark (&optional return-p) - "Display a benchmark, showing number of packages and modules, and how quickly -they were loaded at startup. - -If RETURN-P, return the message as a string instead of displaying it." - (funcall (if return-p #'format #'message) - "Doom loaded %s packages across %d modules in %.03fs" - (length package-activated-list) - (if doom-modules (hash-table-count doom-modules) 0) - (or doom-init-time - (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) - -(defun doom|post-init () - "Run `doom-post-init-hook'. That's all." - (run-hooks 'doom-post-init-hook)) - -(defun doom|run-all-startup-hooks () - "Run all startup Emacs hooks. Meant to be executed after starting Emacs with --q or -Q, for example: - - emacs -Q -l init.el -f doom|run-all-startup-hooks" - (run-hooks 'after-init-hook 'delayed-warnings-hook - 'emacs-startup-hook 'term-setup-hook - 'window-setup-hook)) - - -;; -;; Bootstrap helpers -;; - -(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) -(defvar doom--last-emacs-version nil) - -(defun doom-ensure-same-emacs-version-p () - "Do an Emacs version check and set `doom-emacs-changed-p' if it has changed." - (if (load doom--last-emacs-file 'noerror 'nomessage 'nosuffix) - (setq doom-emacs-changed-p - (not (equal emacs-version doom--last-emacs-version))) - (with-temp-file doom--last-emacs-file - (princ `(setq doom--last-emacs-version ,(prin1-to-string emacs-version)) - (current-buffer)))) - (cond ((not doom-emacs-changed-p)) - ((y-or-n-p - (format - (concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n" - "issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n" - "Continue?") - doom--last-emacs-version - emacs-version)) - (delete-file doom--last-emacs-file)) - (noninteractive (error "Aborting")) - ((kill-emacs)))) - -(defun doom-ensure-packages-initialized (&optional force-p) - "Make sure package.el is initialized." - (when (or force-p (not (bound-and-true-p package--initialized))) - (require 'package) - (setq package-activated-list nil - package--initialized nil) - (let (byte-compile-warnings) - (condition-case _ - (quiet! (package-initialize)) - ('error (package-refresh-contents) - (setq doom--refreshed-p t) - (package-initialize)))))) - -(defun doom-ensure-core-packages () - "Make sure `doom-core-packages' are installed." - (when-let* ((core-packages (cl-remove-if #'package-installed-p doom-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"))) - -(defun doom-ensure-core-directories () - "Make sure all Doom's essential local directories (in and including -`doom-local-dir') 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)))) - -(defun doom-delete-autoloads-file (file) - "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if -it exists." - (cl-check-type file string) - (when (file-exists-p file) - (delete-file file) - (ignore-errors (delete-file (byte-compile-dest-file file))) - (message "Deleted old %s" (file-name-nondirectory file)))) - - -;; -;; Bootstrap API -;; - -(defun doom-initialize (&optional force-p) - "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). - -The bootstrap process involves making sure 1) the essential directories exist, -2) the core packages are installed, 3) `doom-autoload-file' and -`doom-package-autoload-file' exist and have been loaded, and 4) Doom's core -files are loaded. - -If the cache exists, much of this function isn't run, which substantially -reduces startup time. - -The overall load order of Doom is as follows: - - ~/.emacs.d/init.el - ~/.emacs.d/core/core.el - `doom-pre-init-hook' - ~/.doom.d/init.el - Module init.el files - `doom-init-hook' - Module config.el files - ~/.doom.d/config.el - `after-init-hook' - `emacs-startup-hook' - `doom-post-init-hook' (at end of `emacs-startup-hook') - -Module load order is determined by your `doom!' block. See `doom-modules-dirs' -for a list of all recognized module trees. Order defines precedence (from most -to least)." - (when (or force-p (not doom-init-p)) - ;; Set this to prevent infinite recursive calls to `doom-initialize' - (setq doom-init-p t) - ;; `doom-autoload-file' tells Emacs where to load all its autoloaded - ;; functions from. This includes everything in core/autoload/*.el and all - ;; the autoload files in your enabled modules. - (when (or force-p (not (doom-initialize-autoloads doom-autoload-file))) - (doom-ensure-core-directories) - (doom-ensure-same-emacs-version-p) - (doom-ensure-packages-initialized force-p) - (doom-ensure-core-packages) - ;; Regenerate `doom-autoload-file', which tells Doom where to find all its - ;; module autoloaded functions. - (unless (or force-p noninteractive) - (user-error "Your doom autoloads are missing! Run `bin/doom refresh' to regenerate them"))) - ;; Loads `doom-package-autoload-file', which caches `load-path', - ;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and - ;; `package-activated-list'. A big reduction in startup time. - (unless (or force-p - (doom-initialize-autoloads doom-package-autoload-file) - noninteractive) - (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) - ;; Initialize Doom core - (unless noninteractive - (add-hook! 'emacs-startup-hook - #'(doom|post-init doom|display-benchmark)) - (require 'core-os) - (require 'core-ui) - (require 'core-editor) - (require 'core-projects) - (require 'core-keybinds))) - -(defun doom-initialize-modules (&optional force-p) - "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy -session of Dooming. Will noop if used more than once, unless FORCE-P is -non-nil." - (when (or force-p (not doom-init-modules-p)) - ;; Set `doom-init-modules-p' early, so `doom-pre-init-hook' won't infinitely - ;; recurse by accident if any of them need `doom-initialize-modules'. - (setq doom-init-modules-p t) - (when doom-private-dir - (load (expand-file-name "init" doom-private-dir) - 'noerror 'nomessage)))) - -(defun doom-initialize-autoloads (file) - "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." - (condition-case-unless-debug e - (load (file-name-sans-extension file) 'noerror 'nomessage) - ('error - (message "Autoload error: %s -> %s" - (car e) (error-message-string e))))) - (defun doom-initialize-packages (&optional force-p) "Ensures that Doom's package management system, package.el and quelpa are initialized, and `doom-packages', `packages-alist' and `quelpa-cache' are @@ -384,334 +141,35 @@ them." ;; -;; Module API +;; Package API ;; -(defun doom-module-p (category module) - "Returns t if CATEGORY MODULE is enabled (ie. present in `doom-modules')." - (and (hash-table-p doom-modules) - (gethash (cons category module) doom-modules) - t)) +(defun doom-ensure-packages-initialized (&optional force-p) + "Make sure package.el is initialized." + (when (or force-p (not (bound-and-true-p package--initialized))) + (require 'package) + (setq package-activated-list nil + package--initialized nil) + (let (byte-compile-warnings) + (condition-case _ + (quiet! (package-initialize)) + ('error (package-refresh-contents) + (setq doom--refreshed-p t) + (package-initialize)))))) -(defun doom-module-get (category module &optional property) - "Returns the plist for CATEGORY MODULE. Gets PROPERTY, specifically, if set." - (when-let* ((plist (gethash (cons category module) doom-modules))) - (if property - (plist-get plist property) - plist))) - -(defun doom-module-put (category module property value &rest rest) - "Set a PROPERTY for CATEGORY MODULE to VALUE. PLIST should be additional pairs -of PROPERTY and VALUEs." - (when-let* ((plist (doom-module-get category module))) - (plist-put plist property value) - (when rest - (when (cl-oddp (length rest)) - (signal 'wrong-number-of-arguments (list (length rest)))) - (while rest - (plist-put rest (pop rest) (pop rest)))) - (puthash (cons category module) plist doom-modules))) - -(defun doom-module-set (category module &rest plist) - "Enables a module by adding it to `doom-modules'. - -CATEGORY is a keyword, module is a symbol, PLIST is a plist that accepts the -following properties: - - :flags [SYMBOL LIST] list of enabled category flags - :path [STRING] path to category root directory - -Example: - (doom-module-set :lang 'haskell :flags '(+intero))" - (when plist - (let ((old-plist (doom-module-get category module))) - (unless (plist-member plist :flags) - (plist-put plist :flags (plist-get old-plist :flags))) - (unless (plist-member plist :path) - (plist-put plist :path (or (plist-get old-plist :path) - (doom-module-locate-path category module)))))) - (let ((key (cons category module))) - (puthash key plist doom-modules))) - -(defun doom-module-path (category module &optional file) - "Like `expand-file-name', but expands FILE relative to CATEGORY (keywordp) and -MODULE (symbol). - -If the category isn't enabled this will always return nil. For finding disabled -modules use `doom-module-locate-path'." - (let ((path (doom-module-get category module :path))) - (if file (expand-file-name file path) - path))) - -(defun doom-module-locate-path (category &optional module file) - "Searches `doom-modules-dirs' to find the path to a module. - -CATEGORY is a keyword (e.g. :lang) and MODULE is a symbol (e.g. 'python). FILE -is a string that will be appended to the resulting path. If no path exists, this -returns nil, otherwise an absolute path. - -This doesn't require modules to be enabled. For enabled modules us -`doom-module-path'." - (when (keywordp category) - (setq category (substring (symbol-name category) 1))) - (when (and module (symbolp module)) - (setq module (symbol-name module))) - (cl-loop for default-directory in doom-modules-dirs - for path = (concat category "/" module "/" file) - if (file-exists-p path) - return (expand-file-name path))) - -(defun doom-module-from-path (&optional path) - "Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path)." - (or doom--current-module - (when path - (save-match-data - (setq path (file-truename path)) - (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) - (when-let* ((module (match-string 1 path)) - (submodule (match-string 2 path))) - (cons (intern (concat ":" module)) - (intern submodule)))))))) - -(defun doom-module-load-path () - "Return a list of absolute file paths to activated modules." - (append (cl-loop for plist being the hash-values of (doom-modules) - collect (plist-get plist :path)) - (list doom-private-dir))) - -(defun doom-modules (&optional refresh-p) - "Minimally initialize `doom-modules' (a hash table) and return it." - (or (unless refresh-p doom-modules) - (let ((noninteractive t) - doom-init-modules-p) - (message "Initializing modules") - (doom-initialize-modules t) - doom-modules))) - - -;; -;; Use-package modifications -;; - -(autoload 'use-package "use-package-core" nil nil t) - -;; Adds the :after-call custom keyword to `use-package' (and consequently, -;; `def-package!'). :after-call takes a symbol ro list of symbols. These symbols -;; can be functions to hook variables. -;; -;; (use-package X :after-call find-file-hook) -;; -;; This will load X on the first invokation of `find-file-hook' (then it will -;; remove itself from the hook). -(defvar doom--deferred-packages-alist ()) -(after! use-package-core - (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) - - (setq use-package-keywords - (use-package-list-insert :after-call use-package-keywords :after)) - - (defalias 'use-package-normalize/:after-call - 'use-package-normalize-symlist) - - (defun use-package-handler/:after-call (name-symbol _keyword hooks rest state) - (let ((fn (intern (format "doom|transient-hook--load-%s" name-symbol))) - (hooks (delete-dups hooks))) - (if (plist-get state :demand) - (use-package-process-keywords name rest state) - (use-package-concat - `((fset ',fn - (lambda (&rest _) - (require ',name-symbol) - (dolist (hook (cdr (assq ',name-symbol doom--deferred-packages-alist))) - (if (functionp hook) - (advice-remove hook #',fn) - (remove-hook hook #',fn))) - (map-delete doom--deferred-packages-alist ',name-symbol) - (fmakunbound ',fn)))) - (cl-mapcan (lambda (hook) - (if (functionp hook) - `((advice-add #',hook :before #',fn)) - `((add-hook ',hook #',fn)))) - hooks) - `((map-put doom--deferred-packages-alist - ',name-symbol - '(,@hooks ,@(cdr (assq name-symbol doom--deferred-packages-alist))))) - (use-package-process-keywords name rest state)))))) - - -;; -;; Module config macros -;; - -(defmacro doom! (&rest modules) - "Bootstraps DOOM Emacs and its modules. - -The bootstrap process involves making sure the essential directories exist, core -packages are installed, `doom-autoload-file' is loaded, `doom-packages-file' -cache exists (and is loaded) and, finally, loads your private init.el (which -should contain your `doom!' block). - -If the cache exists, much of this function isn't run, which substantially -reduces startup time. - -The overall load order of Doom is as follows: - - ~/.emacs.d/init.el - ~/.emacs.d/core/core.el - `doom-pre-init-hook' - ~/.doom.d/init.el - Module init.el files - `doom-init-hook' - Module config.el files - ~/.doom.d/config.el - `after-init-hook' - `emacs-startup-hook' - `doom-post-init-hook' (at end of `emacs-startup-hook') - -Module load order is determined by your `doom!' block. See `doom-modules-dirs' -for a list of all recognized module trees. Order defines precedence (from most -to least)." - (let ((doom-modules - (make-hash-table :test #'equal - :size (if modules (length modules) 100) - :rehash-threshold 1.0)) - category - init-forms config-forms) - (dolist (m modules) - (cond ((keywordp m) (setq category m)) - ((not category) (error "No module category specified for %s" m)) - ((let* ((module (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m))) - (path (doom-module-locate-path category module))) - (if (not path) - (message "Couldn't find the %s %s module" category module) - (let ((key (cons category module))) - (doom-module-set category module :flags flags :path path) - (push `(let ((doom--current-module ',key)) - (load! "init" ,path t)) - init-forms) - (push `(let ((doom--current-module ',key)) - (load! "config" ,path t)) - config-forms))))))) - `(let (file-name-handler-alist) - (setq doom-modules ',doom-modules) - ,@(nreverse init-forms) - (run-hooks 'doom-init-hook) - (unless noninteractive - (let ((doom--stage 'config)) - ,@(nreverse config-forms) - (when doom-private-dir - (load ,(expand-file-name "config" doom-private-dir) - t (not doom-debug-mode)))))))) - -(defmacro def-package! (name &rest plist) - "A thin wrapper around `use-package'." - ;; Ignore package if NAME is in `doom-disabled-packages' - (when (and (memq name doom-disabled-packages) - (not (memq :disabled 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) - (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) - (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) - (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) - `(use-package ,name ,@plist))) - -(defmacro def-package-hook! (package when &rest body) - "Reconfigures a package's `def-package!' block. - -Only use this macro in a module's init.el file. - -Under the hood, this uses use-package's `use-package-inject-hooks'. - -PACKAGE is a symbol; the package's name. -WHEN should be one of the following: - :pre-init :post-init :pre-config :post-config - -WARNING: If :pre-init or :pre-config hooks return nil, the original -`def-package!''s :init/:config block (respectively) is overwritten, so remember -to have them return non-nil (or exploit that to overwrite Doom's config)." - (declare (indent defun)) - (doom--assert-stage-p 'init #'package!) - (cond ((eq when :disable) - (message "Using :disable with `def-package-hook!' is deprecated. Use :disable in `package!' instead.") - (ignore (push package doom-disabled-packages))) - ((memq when '(:pre-init :post-init :pre-config :post-config)) - `(progn - (setq use-package-inject-hooks t) - (add-hook! - ',(intern (format "use-package--%s--%s-hook" - package - (substring (symbol-name when) 1))) - ,@body))) - ((error "'%s' isn't a valid hook for def-package-hook!" when)))) - -(defmacro load! (filename &optional path noerror) - "Load a file relative to the current executing file (`load-file-name'). - -FILENAME is either a file path string or a form that should evaluate to such a -string at run time. PATH is where to look for the file (a string representing a -directory path). If omitted, the lookup is relative to either `load-file-name', -`byte-compile-current-file' or `buffer-file-name' (checked in that order). - -If NOERROR is non-nil, don't throw an error if the file doesn't exist." - (unless path - (setq path (or (and (bound-and-true-p byte-compile-current-file) - (file-name-directory byte-compile-current-file)) - (and load-file-name (file-name-directory load-file-name)) - (and buffer-file-name (file-name-directory buffer-file-name)) - (error "Could not detect path to look for '%s' in" filename)))) - `(load ,(if path - `(expand-file-name ,filename ,path) - filename) - ,noerror ,(not doom-debug-mode))) - -(defmacro require! (category module &rest plist) - "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." - (let ((doom-modules (copy-hash-table doom-modules))) - (apply #'doom-module-set category module - (mapcar #'eval plist)) - (let ((module-path (doom-module-locate-path category module))) - (if (directory-name-p module-path) - `(condition-case-unless-debug ex - (let ((doom--current-module ',(cons category module))) - (load! "init" ,module-path :noerror) - (let ((doom--stage 'config)) - (load! "config" ,module-path :noerror))) - ('error - (lwarn 'doom-modules :error - "%s in '%s %s' -> %s" - (car ex) ,category ',module - (error-message-string ex)))) - (warn 'doom-modules :warning "Couldn't find module '%s %s'" - category module))))) - -(defmacro featurep! (module &optional submodule flag) - "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if -MODULE SUBMODULE has FLAG enabled. - - (featurep! :config default) - -Module FLAGs are set in your config's `doom!' block, typically in -~/.emacs.d/init.el. Like so: - - :config (default +flag1 -flag2) - -When this macro is used from inside a module, MODULE and SUBMODULE can be -omitted. eg. (featurep! +flag1)" - (unless submodule - (let* ((path (or (bound-and-true-p byte-compile-current-file) - load-file-name)) - (module-pair (doom-module-from-path path))) - (unless module-pair - (error "featurep! couldn't detect what module its in! (in %s)" path)) - (setq flag module - module (car module-pair) - submodule (cdr module-pair)))) - (if flag - (and (memq flag (doom-module-get module submodule :flags)) t) - (doom-module-p module submodule))) +(defun doom-ensure-core-packages () + "Make sure `doom-core-packages' are installed." + (when-let* ((core-packages (cl-remove-if #'package-installed-p doom-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"))) ;; @@ -772,7 +230,7 @@ elsewhere." ,(when (and pkg-pin t) `(map-put package-pinned-packages ',name ,pkg-pin)) (map-put doom-packages ',name ',plist) - (not ,pkg-disable)))) + (not (memq ',name doom-disabled-packages))))) (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple @@ -804,53 +262,5 @@ loads MODULE SUBMODULE's packages.el file." (doom-module-put ,module ',submodule :flags flags)) (load! "packages" ,(doom-module-locate-path module submodule) t))) - -;; -;; Make package.el cooperate with Doom -;; - -;; Updates QUELPA after deleting a package -(advice-add #'package-delete :after #'doom*package-delete) - -;; Replace with Doom variants -(advice-add #'package-autoremove :override #'doom//packages-autoremove) -(advice-add #'package-install-selected-packages :override #'doom//packages-install) - - -;; -;; Cross-module configuration -;; - -;; I needed a way to reliably cross-configure modules without littering my -;; modules with `after!' blocks or testing whether they were enabled, so I wrote -;; `set!'. If a setting doesn't exist at runtime, the `set!' call is ignored and -;; its arguments are left unevaluated (and entirely omitted when byte-compiled). - -(defmacro def-setting! (keyword arglist &optional docstring &rest forms) - "Define a setting. Like `defmacro', this should return a form to be executed -when called with `set!'. FORMS are not evaluated until `set!' calls it. - -See `doom/describe-setting' for a list of available settings. - -Do not use this for configuring Doom core." - (declare (indent defun) (doc-string 3)) - (or (keywordp keyword) - (signal 'wrong-type-argument (list 'keywordp keyword))) - `(fset ',(intern (format "doom--set%s" keyword)) - (lambda ,arglist ,docstring ,@forms))) - -(defmacro set! (keyword &rest values) - "Set an option defined by `def-setting!'. Skip if doesn't exist. See -`doom/describe-setting' for a list of available settings. - -VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." - (declare (indent defun)) - (let ((fn (intern-soft (format "doom--set%s" keyword)))) - (if (and fn (fboundp fn)) - (apply fn values) - (when doom-debug-mode - (message "No setting found for %s" keyword) - nil)))) - (provide 'core-packages) ;;; core-packages.el ends here diff --git a/core/core.el b/core/core.el index 30011ea33..4da84da45 100644 --- a/core/core.el +++ b/core/core.el @@ -63,7 +63,39 @@ Use this for files that change often, like cache files.") "Where your private customizations are placed. Must end in a slash. Respects XDG directory conventions if ~/.config/doom exists.") +(defconst doom-autoload-file (concat doom-local-dir "autoloads.el") + "Where `doom//reload-doom-autoloads' will generate its core autoloads file.") + +(defconst doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el") + "Where `doom//reload-package-autoloads' will generate its package.el autoloads +file.") + + +;; +;; State variables +;; + +(defvar doom-init-p nil + "Non-nil if `doom-initialize' has run.") + +(defvar doom-init-time nil + "The time it took, in seconds, for DOOM Emacs to initialize.") + +(defvar doom-emacs-changed-p nil + "If non-nil, the running version of Emacs is different from the first time +Doom was setup, which can cause problems.") + +(defvar doom-site-load-path load-path + "The starting load-path, before it is altered by `doom-initialize'.") + +(defvar doom--refreshed-p nil) +(defvar doom--stage 'init) + + +;; ;; Doom hooks +;; + (defvar doom-init-hook nil "Hooks run after all init.el files are loaded, including your private and all module init.el files, but before their config.el files are loaded.") @@ -73,8 +105,40 @@ module init.el files, but before their config.el files are loaded.") `emacs-startup-hook', as late as possible. Guaranteed to run after everything else (except for `window-setup-hook').") +(defvar doom-reload-hook nil + "A list of hooks to run when `doom//reload-load-path' is called.") + + +;; +;; Optimize startup +;; + +(defvar doom--file-name-handler-alist file-name-handler-alist) +(unless (or after-init-time noninteractive) + ;; A big contributor to long startup times is the garbage collector, so we up + ;; its memory threshold, temporarily and reset it later in `doom|finalize'. + (setq gc-cons-threshold 402653184 + gc-cons-percentage 1.0 + ;; consulted on every `require', `load' and various file reading + ;; functions. You get a minor speed up by nooping this. + file-name-handler-alist nil)) + +(defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes) and resets +`file-name-handler-alist'." + (setq file-name-handler-alist doom--file-name-handler-alist + gc-cons-threshold 16777216 + gc-cons-percentage 0.2)) + +(add-hook 'emacs-startup-hook #'doom|finalize) +(add-hook 'doom-reload-hook #'doom|finalize) + + +;; +;; Emacs core configuration +;; -;;; ;; UTF-8 as the default coding system (when (fboundp 'set-charset-priority) (set-charset-priority 'unicode)) ; pretty @@ -88,11 +152,12 @@ else (except for `window-setup-hook').") (setq-default ad-redefinition-action 'accept ; silence advised function warnings apropos-do-all t ; make `apropos' more useful + auto-mode-case-fold nil + autoload-compute-prefixes nil debug-on-error doom-debug-mode ffap-machine-p-known 'reject ; don't ping things that look like domain names idle-update-delay 2 ; update ui less often - auto-mode-case-fold nil -;; be quiet at startup; don't load or display anything unnecessary + ;; be quiet at startup; don't load or display anything unnecessary inhibit-startup-message t inhibit-startup-echo-area-message user-login-name inhibit-default-init t @@ -105,6 +170,19 @@ else (except for `window-setup-hook').") create-lockfiles nil history-length 500 make-backup-files nil ; don't create backup~ files + ;; `use-package' + use-package-verbose doom-debug-mode + use-package-minimum-reported-time (if doom-debug-mode 0 0.1) + ;; byte compilation + byte-compile-verbose doom-debug-mode + byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local) + ;; security + gnutls-verify-error (not (getenv "INSECURE")) ; you shouldn't use this + tls-checktrust gnutls-verify-error + tls-program (list "gnutls-cli --x509cafile %t -p %p %h" + ;; compatibility fallbacks + "gnutls-cli -p %p %h" + "openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof") ;; files abbrev-file-name (concat doom-local-dir "abbrev.el") auto-save-list-file-name (concat doom-cache-dir "autosave") @@ -121,11 +199,6 @@ else (except for `window-setup-hook').") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/")) - -;; -;; Emacs fixes/hacks -;; - (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 @@ -167,29 +240,129 @@ with functions that require it (like modeline segments)." ;; -;; Optimize startup +;; Bootstrap helpers ;; -(defvar doom--file-name-handler-alist file-name-handler-alist) -(unless (or after-init-time noninteractive) - ;; A big contributor to long startup times is the garbage collector, so we up - ;; its memory threshold, temporarily and reset it later in `doom|finalize'. - (setq gc-cons-threshold 402653184 - gc-cons-percentage 1.0 - ;; consulted on every `require', `load' and various file reading - ;; functions. You get a minor speed up by nooping this. - file-name-handler-alist nil)) +(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) +(defvar doom--last-emacs-version nil) -(defun doom|finalize () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes) and resets -`file-name-handler-alist'." - (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 16777216 - gc-cons-percentage 0.2)) +(defun doom-ensure-same-emacs-version-p () + "Do an Emacs version check and set `doom-emacs-changed-p' if it has changed." + (if (load doom--last-emacs-file 'noerror 'nomessage 'nosuffix) + (setq doom-emacs-changed-p + (not (equal emacs-version doom--last-emacs-version))) + (with-temp-file doom--last-emacs-file + (princ `(setq doom--last-emacs-version ,(prin1-to-string emacs-version)) + (current-buffer)))) + (cond ((not doom-emacs-changed-p)) + ((y-or-n-p + (format + (concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n" + "issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n" + "Continue?") + doom--last-emacs-version + emacs-version)) + (delete-file doom--last-emacs-file)) + (noninteractive (error "Aborting")) + ((kill-emacs)))) -(add-hook 'emacs-startup-hook #'doom|finalize) -(add-hook 'doom-reload-hook #'doom|finalize) +(defun doom-ensure-core-directories () + "Make sure all Doom's essential local directories (in and including +`doom-local-dir') 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)))) + +(defun doom|display-benchmark (&optional return-p) + "Display a benchmark, showing number of packages and modules, and how quickly +they were loaded at startup. + +If RETURN-P, return the message as a string instead of displaying it." + (funcall (if return-p #'format #'message) + "Doom loaded %s packages across %d modules in %.03fs" + (length package-activated-list) + (if doom-modules (hash-table-count doom-modules) 0) + (or doom-init-time + (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) + +(defun doom|post-init () + "Run `doom-post-init-hook'. That's all." + (run-hooks 'doom-post-init-hook)) + +(defun doom|run-all-startup-hooks () + "Run all startup Emacs hooks. Meant to be executed after starting Emacs with +-q or -Q, for example: + + emacs -Q -l init.el -f doom|run-all-startup-hooks" + (run-hooks 'after-init-hook 'delayed-warnings-hook + 'emacs-startup-hook 'term-setup-hook + 'window-setup-hook)) + + +;; +;; Bootstrap functions +;; + +(defun doom-initialize (&optional force-p) + "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). + +The bootstrap process involves making sure 1) the essential directories exist, +2) the core packages are installed, 3) `doom-autoload-file' and +`doom-package-autoload-file' exist and have been loaded, and 4) Doom's core +files are loaded. + +If the cache exists, much of this function isn't run, which substantially +reduces startup time. + +The overall load order of Doom is as follows: + + ~/.emacs.d/init.el + ~/.emacs.d/core/core.el + ~/.doom.d/init.el + Module init.el files + `doom-init-hook' + Module config.el files + ~/.doom.d/config.el + `after-init-hook' + `emacs-startup-hook' + `doom-post-init-hook' (at end of `emacs-startup-hook') + +Module load order is determined by your `doom!' block. See `doom-modules-dirs' +for a list of all recognized module trees. Order defines precedence (from most +to least)." + (when (or force-p (not doom-init-p)) + ;; Set this to prevent infinite recursive calls to `doom-initialize' + (setq doom-init-p t) + ;; `doom-autoload-file' tells Emacs where to load all its autoloaded + ;; functions from. This includes everything in core/autoload/*.el and all + ;; the autoload files in your enabled modules. + (when (or force-p (not (doom-initialize-autoloads doom-autoload-file))) + (doom-ensure-core-directories) + (doom-ensure-same-emacs-version-p) + ;; Ensure packages are set up and initialized + (require 'core-packages) + (doom-ensure-packages-initialized force-p) + (doom-ensure-core-packages) + ;; Regenerate `doom-autoload-file', which tells Doom where to find all its + ;; module autoloaded functions. + (unless (or force-p noninteractive) + (user-error "Your doom autoloads are missing! Run `bin/doom refresh' to regenerate them"))) + ;; Loads `doom-package-autoload-file', which caches `load-path', + ;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and + ;; `package-activated-list'. A big reduction in startup time. + (unless (or force-p + (doom-initialize-autoloads doom-package-autoload-file) + noninteractive) + (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) + ;; Initialize Doom core + (unless noninteractive + (add-hook! 'emacs-startup-hook + #'(doom|post-init doom|display-benchmark)) + (require 'core-os) + (require 'core-ui) + (require 'core-editor) + (require 'core-projects) + (require 'core-keybinds))) ;; @@ -198,14 +371,18 @@ this, you'll get stuttering and random freezes) and resets (add-to-list 'load-path doom-core-dir) -(require 'core-lib) -(require 'core-packages) - (load custom-file t t t) +(require 'core-lib) +(require 'core-modules) +(when noninteractive + (require 'core-dispatcher)) + (doom-initialize noninteractive) -(if noninteractive - (require 'core-dispatcher) +(unless noninteractive (doom-initialize-modules)) +(after! package + (require 'core-packages)) + (provide 'core) ;;; core.el ends here From 0be2be5c821ddbcdc0642bf631560f6e81dcfbc1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 23:20:45 +0200 Subject: [PATCH 1806/4235] Remove autoload/modules library Move batch commands into core-dispatcher and doom//reload into autoload/help. It will soon be renamed doom/reload. --- core/autoload/help.el | 30 +++ core/autoload/modules.el | 393 --------------------------------------- core/core-dispatcher.el | 364 +++++++++++++++++++++++++++++++++++- 3 files changed, 393 insertions(+), 394 deletions(-) delete mode 100644 core/autoload/modules.el diff --git a/core/autoload/help.el b/core/autoload/help.el index b2d8f431b..0888a78dd 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -179,3 +179,33 @@ whose car is the list of faces and cadr is the list of overlay faces." (defun doom//open-manual () (interactive) (find-file (expand-file-name "index.org" doom-docs-dir))) + +;;;###autoload +(defun doom//reload (&optional force-p) + "Reloads your config. This is experimental! + +If called from a noninteractive session, this will try to communicate with a +live server (if one is found) to tell it to run this function. + +If called from an interactive session, tries to reload autoloads files (if +necessary), reinistalize doom (via `doom-initialize') and reloads your private +init.el and config.el. Then runs `doom-reload-hook'." + (interactive) + (cond ((and noninteractive (not (daemonp))) + (require 'server) + (if (not (server-running-p)) + (doom//reload-autoloads force-p) + (print! "Reloading active Emacs session...") + (print! + (bold "%%s") + (if (server-eval-at server-name '(doom//reload)) + (green "Done!") + (red "There were issues!"))))) + ((let ((load-prefer-newer t)) + (doom//reload-autoloads force-p) + (doom-initialize 'force) + (with-demoted-errors "PRIVATE CONFIG ERROR: %s" + (doom-initialize-modules 'force)) + (print! (green "%d packages reloaded" (length package-alist))) + (run-hooks 'doom-reload-hook) + t)))) diff --git a/core/autoload/modules.el b/core/autoload/modules.el deleted file mode 100644 index 9d90c7cc6..000000000 --- a/core/autoload/modules.el +++ /dev/null @@ -1,393 +0,0 @@ -;;; core/autoload/modules.el -*- lexical-binding: t; -*- - -(autoload 'print! "autoload/message" nil 'macro) - -(defun doom--server-load (file) - (require 'server) - (when (server-running-p) - (server-eval-at server-name `(load-file ,(byte-compile-dest-file file))))) - -;;;###autoload -(defun doom//reload (&optional force-p) - "Reloads your config. This is experimental! - -If called from a noninteractive session, this will try to communicate with a -live server (if one is found) to tell it to run this function. - -If called from an interactive session, tries to reload autoloads files (if -necessary), reinistalize doom (via `doom-initialize') and reloads your private -init.el and config.el. Then runs `doom-reload-hook'." - (interactive) - (cond ((and noninteractive (not (daemonp))) - (require 'server) - (if (not (server-running-p)) - (doom//reload-autoloads force-p) - (print! "Reloading active Emacs session...") - (print! - (bold "%%s") - (if (server-eval-at server-name '(doom//reload)) - (green "Done!") - (red "There were issues!"))))) - ((let ((load-prefer-newer t)) - (doom//reload-autoloads force-p) - (doom-initialize 'force) - (with-demoted-errors "PRIVATE CONFIG ERROR: %s" - (doom-initialize-modules 'force)) - (print! (green "%d packages reloaded" (length package-alist))) - (run-hooks 'doom-reload-hook) - t)))) - - -;; -;; Autoload file generation -;; - -(defvar doom-autoload-excluded-packages '(marshal gh) - "Packages that have silly or destructive autoload files that try to load -everyone in the universe and their dog, causing errors that make babies cry. No -one wants that.") - -(defun doom--byte-compile-file (file) - (let ((short-name (file-name-nondirectory file)) - (byte-compile-dynamic t) - (byte-compile-dynamic-docstrings t)) - (condition-case-unless-debug ex - (when (byte-compile-file file) - (load (byte-compile-dest-file file) nil t) - (unless noninteractive - (message "Finished compiling %s" short-name))) - ('error - (doom-delete-autoloads-file file) - (error "Error in %s: %s -- %s" - short-name - (car ex) (error-message-string ex)))))) - -;;;###autoload -(defun doom//reload-autoloads (&optional file force-p) - "Reloads FILE (an autoload file), if it needs reloading. - -FILE should be one of `doom-autoload-file' or `doom-package-autoload-file'. If -it is nil, it will try to reload both. If FORCE-P (universal argument) do it -even if it doesn't need reloading!" - (interactive - (list nil current-prefix-arg)) - (or (null file) - (stringp file) - (signal 'wrong-type-argument (list 'stringp file))) - (cond ((equal file doom-autoload-file) - (doom//reload-doom-autoloads force-p)) - ((equal file doom-package-autoload-file) - (doom//reload-package-autoloads force-p)) - ((progn - (doom//reload-doom-autoloads force-p) - (doom//reload-package-autoloads force-p))))) - -(defvar generated-autoload-load-name) -;;;###autoload -(defun doom//reload-doom-autoloads (&optional force-p) - "Refreshes the autoloads.el file, specified by `doom-autoload-file', if -necessary (or if FORCE-P is non-nil). - -It scans and reads core/autoload/*.el, modules/*/*/autoload.el and -modules/*/*/autoload/*.el, and generates `doom-autoload-file'. This file tells -Emacs where to find lazy-loaded functions. - -This should be run whenever your `doom!' block, or a module autoload file, is -modified." - (interactive) - (let ((default-directory doom-emacs-dir) - (targets - (file-expand-wildcards - (expand-file-name "autoload/*.el" doom-core-dir)))) - (dolist (path (doom-module-load-path)) - (let ((auto-dir (expand-file-name "autoload" path)) - (auto-file (expand-file-name "autoload.el" path))) - (when (file-exists-p auto-file) - (push auto-file targets)) - (when (file-directory-p auto-dir) - (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) - (push file targets))))) - (if (and (not force-p) - (not doom-emacs-changed-p) - (file-exists-p doom-autoload-file) - (not (file-newer-than-file-p (expand-file-name "init.el" doom-private-dir) - doom-autoload-file)) - (not (cl-loop for file in targets - if (file-newer-than-file-p file doom-autoload-file) - return t))) - (ignore (print! (green "Doom core autoloads is up-to-date")) - (doom-initialize-autoloads doom-autoload-file)) - (doom-delete-autoloads-file doom-autoload-file) - ;; in case the buffer is open somewhere and modified - (when-let* ((buf (find-buffer-visiting doom-autoload-file))) - (with-current-buffer buf - (set-buffer-modified-p nil)) - (kill-buffer buf)) - (message "Generating new autoloads.el") - (dolist (file (nreverse targets)) - (let* ((file (file-truename file)) - (generated-autoload-load-name (file-name-sans-extension file)) - (noninteractive (not doom-debug-mode))) - (print! - (cond ((not (doom-file-cookie-p file)) - "⚠ Ignoring %s") - ((update-file-autoloads file nil doom-autoload-file) - (yellow "✕ Nothing in %%s")) - ((green "✓ Scanned %%s"))) - (if (file-in-directory-p file default-directory) - (file-relative-name file) - (abbreviate-file-name file))))) - (make-directory (file-name-directory doom-autoload-file) t) - (let ((buf (find-file-noselect doom-autoload-file t)) - case-fold-search) - (unwind-protect - (with-current-buffer buf - (goto-char (point-min)) - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-doom-autoloads', DO NOT EDIT !!\n\n") - (save-excursion - ;; Replace autoload paths (only for module autoloads) with - ;; absolute paths for faster resolution during load and - ;; simpler `load-path' - (let ((load-path (append doom-modules-dirs load-path)) - cache) - (save-excursion - (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) - (let ((path (match-string 1))) - (replace-match - (or (cdr (assoc path cache)) - (when-let* ((libpath (locate-library path)) - (libpath (file-name-sans-extension libpath))) - (push (cons path (abbreviate-file-name libpath)) cache) - libpath) - path) - t t nil 1))) - (print! (green "✓ Autoload paths expanded"))))) - ;; Remove byte-compile inhibiting file variables so we can - ;; byte-compile the file. - (when (re-search-forward "^;; no-byte-compile: t\n" nil t) - (replace-match "" t t)) - ;; Byte compile it to give the file a chance to reveal errors. - (save-buffer) - (doom--byte-compile-file doom-autoload-file) - (when (and noninteractive (not (daemonp))) - (doom--server-load doom-autoload-file)) - t) - (kill-buffer buf)))))) - -;;;###autoload -(defun doom//reload-package-autoloads (&optional force-p) - "Compiles `doom-package-autoload-file' from the autoloads files of all -installed packages. It also caches `load-path', `Info-directory-list', -`doom-disabled-packages', `package-activated-list' and `auto-mode-alist'. - -Will do nothing if none of your installed packages have been modified. If -FORCE-P (universal argument) is non-nil, regenerate it anyway. - -This should be run whenever your `doom!' block or update your packages." - (interactive) - (if (and (not force-p) - (not doom-emacs-changed-p) - (file-exists-p doom-package-autoload-file) - (not (file-newer-than-file-p package-user-dir doom-package-autoload-file)) - (not (ignore-errors - (cl-loop for key being the hash-keys of (doom-modules) - for path = (doom-module-path (car key) (cdr key) "packages.el") - if (file-newer-than-file-p path doom-package-autoload-file) - return t)))) - (ignore (print! (green "Doom package autoloads is up-to-date")) - (doom-initialize-autoloads doom-package-autoload-file)) - (doom-delete-autoloads-file doom-package-autoload-file) - (with-temp-file doom-package-autoload-file - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") - (let (case-fold-search) - (save-excursion - ;; Cache the important and expensive-to-initialize state here. - (doom-initialize-packages) - (prin1 `(setq load-path ',load-path - auto-mode-alist ',auto-mode-alist - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages - package-activated-list ',package-activated-list) - (current-buffer)) - (print! (green "✓ Cached package state")) - ;; insert package autoloads - (dolist (spec package-alist) - (if-let* ((pkg (car spec)) - (desc (cadr spec))) - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file (concat (package--autoloads-file-name desc) ".el"))) - (when (file-exists-p file) - (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") - (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) - (unless (nth 8 (syntax-ppss)) - (replace-match "" t t))) - (unless (bolp) (insert "\n")) - (insert ")\n")))) - (print! (yellow "⚠ Couldn't find package desc for %s" (car spec)))))) - (print! (green "✓ Package autoloads included")) - ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, - ;; at least); they are cached later, so all those membership checks are - ;; unnecessary overhead. - (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) - (goto-char (match-beginning 1)) - (kill-sexp)) - (print! (green "✓ Removed load-path/auto-mode-alist entries")))) - (doom--byte-compile-file doom-package-autoload-file) - (when (and noninteractive (not (daemonp))) - (doom--server-load doom-package-autoload-file)) - t)) - - -;; -;; Byte compilation -;; - -;;;###autoload -(defun doom//byte-compile (&optional modules recompile-p) - "Byte compiles your emacs configuration. - -init.el is always byte-compiled by this. - -If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are -byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom -core. It always ignores unit tests and files with `no-byte-compile' enabled. - -Doom was designed to benefit from byte-compilation, but the process may take a -while. Also, while your config files are byte-compiled, changes to them will not -take effect! Use `doom//clean-byte-compiled-files' or `make clean' to remove -these files. - -If RECOMPILE-P is non-nil, only recompile out-of-date files." - (interactive - (list nil current-prefix-arg)) - (let ((default-directory doom-emacs-dir) - (total-ok 0) - (total-fail 0) - (total-noop 0) - compile-plugins-p - targets) - (dolist (module (delete-dups modules) (nreverse targets)) - (pcase module - (":core" (push doom-core-dir targets)) - (":private" (push doom-private-dir targets)) - (":plugins" - (dolist (file (doom-files-in package-user-dir :match "\\.elc$")) - (ignore-errors (delete-file file))) - (byte-recompile-directory package-user-dir 0 t) - (setq compile-plugins-p t - modules (delete ":plugins" modules))) - ((pred file-directory-p) - (push module targets)) - ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) - (push (doom-module-locate-path - (doom-keyword-intern (match-string 1 module)) - (intern (match-string 2 module))) - targets)))) - (cl-block 'byte-compile - ;; If we're just here to byte-compile our plugins, we're done! - (and (not modules) - compile-plugins-p - (cl-return-from 'byte-compile t)) - (unless (or (equal modules '(":core")) - recompile-p) - (unless (and (not doom-auto-accept) - (y-or-n-p - (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" - "efforts to debug issues. It is not recommended you do it if you frequently\n" - "tinker with your Emacs config.\n\n" - "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" - "Doom core files, as these don't change often.\n\n" - "If you have issues, please make sure byte-compilation isn't the cause by using\n" - "`bin/doom clean` to clear out your *.elc files.\n\n" - "Byte-compile anyway?"))) - (message "Aborting.") - (cl-return-from 'byte-compile))) - (unless recompile-p - (doom//clean-byte-compiled-files) - (doom//reload-autoloads)) - (let (doom-emacs-changed-p - noninteractive) - ;; But first we must be sure that Doom and your private config have - ;; been fully loaded. Which usually aren't so in an noninteractive - ;; session. - (doom-initialize) - (doom-initialize-modules 'force)) - ;; If no targets were supplied, then we use your module list. - (unless modules - (setq targets (append (list doom-core-dir) - (doom-module-load-path)))) - ;; Assemble el files we want to compile; taking into account that - ;; MODULES may be a list of MODULE/SUBMODULE strings from the command - ;; line. - (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) - (unless target-files - (if targets - (message "Couldn't find any valid targets") - (message "No targets to %scompile" (if recompile-p "re" ""))) - (cl-return-from 'byte-compile)) - (condition-case ex - (let ((use-package-expand-minimally t)) - ;; Always compile private init file - (push (expand-file-name "init.el" doom-private-dir) target-files) - (push (expand-file-name "init.el" doom-emacs-dir) target-files) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) - (if (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p target elc-file)))) - (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) - (not (doom-file-cookie-p target))) - 'no-byte-compile - (byte-compile-file target))) - (short-name (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (cl-incf - (cond ((eq result 'no-byte-compile) - (print! (dark (white "⚠ Ignored %s" short-name))) - total-noop) - ((null result) - (print! (red "✕ Failed to compile %s" short-name)) - total-fail) - (t - (print! (green "✓ Compiled %s" short-name)) - (quiet! (load target t t)) - total-ok)))) - (cl-incf total-noop))) - (print! - (bold - (color (if (= total-fail 0) 'green 'red) - "%s %d/%d file(s) (%d ignored)" - (if recompile-p "Recompiled" "Compiled") - total-ok (- (length target-files) total-noop) - total-noop)))) - (error - (print! (red "\n%%s\n\n%%s\n\n%%s") - "There were breaking errors." - (error-message-string ex) - "Reverting changes...") - (quiet! (doom//clean-byte-compiled-files)) - (print! (yellow "Finished (nothing was byte-compiled)")))))))) - -;;;###autoload -(defun doom//clean-byte-compiled-files () - "Delete all the compiled elc files in your Emacs configuration and private -module. This does not include your byte-compiled, third party packages.'" - (interactive) - (cl-loop with default-directory = doom-emacs-dir - for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 1) - (doom-files-in doom-private-dir :match "\\.elc$" :depth 2) - (doom-files-in doom-core-dir :match "\\.elc$") - (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) - for truepath = (file-truename path) - if (file-exists-p path) - do (delete-file path) - and do - (print! (green "✓ Deleted %%s") - (if (file-in-directory-p truepath default-directory) - (file-relative-name truepath) - (abbreviate-file-name truepath))) - finally do (print! (bold (green "Everything is clean"))))) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 0db531811..67b42b1c2 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -4,7 +4,6 @@ ;; that hasn't been fully initialized (where autoloads files haven't been ;; generated or `load-path' populated). (load! "autoload/packages") -(load! "autoload/modules") (load! "autoload/debug") (load! "autoload/message") @@ -316,5 +315,368 @@ packages and regenerates the autoloads file." (doom-template-insert "QUICKSTART_INTRO") (print! (buffer-string)))) + +;; +;; Autoload file generation +;; + +(defvar doom-autoload-excluded-packages '(marshal gh) + "Packages that have silly or destructive autoload files that try to load +everyone in the universe and their dog, causing errors that make babies cry. No +one wants that.") + +(defun doom-delete-autoloads-file (file) + "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if +it exists." + (cl-check-type file string) + (when (file-exists-p file) + (delete-file file) + (ignore-errors (delete-file (byte-compile-dest-file file))) + (message "Deleted old %s" (file-name-nondirectory file)))) + +(defun doom--server-load (file) + (require 'server) + (when (server-running-p) + (server-eval-at server-name `(load-file ,(byte-compile-dest-file file))))) + +(defun doom--byte-compile-file (file) + (let ((short-name (file-name-nondirectory file)) + (byte-compile-dynamic-docstrings t)) + (condition-case-unless-debug ex + (when (byte-compile-file file) + (load (byte-compile-dest-file file) nil t) + (unless noninteractive + (message "Finished compiling %s" short-name))) + ('error + (doom-delete-autoloads-file file) + (error "Error in %s: %s -- %s" + short-name + (car ex) (error-message-string ex)))))) + +(defun doom//reload-autoloads (&optional file force-p) + "Reloads FILE (an autoload file), if it needs reloading. + +FILE should be one of `doom-autoload-file' or `doom-package-autoload-file'. If +it is nil, it will try to reload both. If FORCE-P (universal argument) do it +even if it doesn't need reloading!" + (interactive + (list nil current-prefix-arg)) + (or (null file) + (stringp file) + (signal 'wrong-type-argument (list 'stringp file))) + (cond ((equal file doom-autoload-file) + (doom//reload-doom-autoloads force-p)) + ((equal file doom-package-autoload-file) + (doom//reload-package-autoloads force-p)) + ((progn + (doom//reload-doom-autoloads force-p) + (doom//reload-package-autoloads force-p))))) + +(defvar generated-autoload-load-name) +(defun doom//reload-doom-autoloads (&optional force-p) + "Refreshes the autoloads.el file, specified by `doom-autoload-file', if +necessary (or if FORCE-P is non-nil). + +It scans and reads core/autoload/*.el, modules/*/*/autoload.el and +modules/*/*/autoload/*.el, and generates `doom-autoload-file'. This file tells +Emacs where to find lazy-loaded functions. + +This should be run whenever your `doom!' block, or a module autoload file, is +modified." + (interactive) + (let ((default-directory doom-emacs-dir) + (targets + (file-expand-wildcards + (expand-file-name "autoload/*.el" doom-core-dir)))) + (dolist (path (doom-module-load-path)) + (let ((auto-dir (expand-file-name "autoload" path)) + (auto-file (expand-file-name "autoload.el" path))) + (when (file-exists-p auto-file) + (push auto-file targets)) + (when (file-directory-p auto-dir) + (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) + (push file targets))))) + (if (and (not force-p) + (not doom-emacs-changed-p) + (file-exists-p doom-autoload-file) + (not (file-newer-than-file-p (expand-file-name "init.el" doom-private-dir) + doom-autoload-file)) + (not (cl-loop for file in targets + if (file-newer-than-file-p file doom-autoload-file) + return t))) + (ignore (print! (green "Doom core autoloads is up-to-date")) + (doom-initialize-autoloads doom-autoload-file)) + (doom-delete-autoloads-file doom-autoload-file) + ;; in case the buffer is open somewhere and modified + (when-let* ((buf (find-buffer-visiting doom-autoload-file))) + (with-current-buffer buf + (set-buffer-modified-p nil)) + (kill-buffer buf)) + (message "Generating new autoloads.el") + (dolist (file (nreverse targets)) + (let* ((file (file-truename file)) + (generated-autoload-load-name (file-name-sans-extension file)) + (noninteractive (not doom-debug-mode))) + (print! + (cond ((not (doom-file-cookie-p file)) + "⚠ Ignoring %s") + ((update-file-autoloads file nil doom-autoload-file) + (yellow "✕ Nothing in %%s")) + ((green "✓ Scanned %%s"))) + (if (file-in-directory-p file default-directory) + (file-relative-name file) + (abbreviate-file-name file))))) + (make-directory (file-name-directory doom-autoload-file) t) + (let ((buf (find-file-noselect doom-autoload-file t)) + case-fold-search) + (unwind-protect + (with-current-buffer buf + (goto-char (point-min)) + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-doom-autoloads', DO NOT EDIT !!\n\n") + (save-excursion + ;; Replace autoload paths (only for module autoloads) with + ;; absolute paths for faster resolution during load and + ;; simpler `load-path' + (let ((load-path (append doom-modules-dirs load-path)) + cache) + (save-excursion + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + (replace-match + (or (cdr (assoc path cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path (abbreviate-file-name libpath)) cache) + libpath) + path) + t t nil 1))) + (print! (green "✓ Autoload paths expanded"))))) + ;; Remove byte-compile inhibiting file variables so we can + ;; byte-compile the file. + (when (re-search-forward "^;; no-byte-compile: t\n" nil t) + (replace-match "" t t)) + ;; Byte compile it to give the file a chance to reveal errors. + (save-buffer) + (doom--byte-compile-file doom-autoload-file) + (when (and noninteractive (not (daemonp))) + (doom--server-load doom-autoload-file)) + t) + (kill-buffer buf)))))) + +(defun doom//reload-package-autoloads (&optional force-p) + "Compiles `doom-package-autoload-file' from the autoloads files of all +installed packages. It also caches `load-path', `Info-directory-list', +`doom-disabled-packages', `package-activated-list' and `auto-mode-alist'. + +Will do nothing if none of your installed packages have been modified. If +FORCE-P (universal argument) is non-nil, regenerate it anyway. + +This should be run whenever your `doom!' block or update your packages." + (interactive) + (if (and (not force-p) + (not doom-emacs-changed-p) + (file-exists-p doom-package-autoload-file) + (not (file-newer-than-file-p package-user-dir doom-package-autoload-file)) + (not (ignore-errors + (cl-loop for key being the hash-keys of (doom-modules) + for path = (doom-module-path (car key) (cdr key) "packages.el") + if (file-newer-than-file-p path doom-package-autoload-file) + return t)))) + (ignore (print! (green "Doom package autoloads is up-to-date")) + (doom-initialize-autoloads doom-package-autoload-file)) + (doom-delete-autoloads-file doom-package-autoload-file) + (with-temp-file doom-package-autoload-file + (insert ";;; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") + (let (case-fold-search) + (save-excursion + ;; Cache the important and expensive-to-initialize state here. + (doom-initialize-packages) + (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer)) + (print! (green "✓ Cached package state")) + ;; insert package autoloads + (dolist (spec package-alist) + (if-let* ((pkg (car spec)) + (desc (cadr spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file (concat (package--autoloads-file-name desc) ".el"))) + (when (file-exists-p file) + (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n")))) + (print! (yellow "⚠ Couldn't find package desc for %s" (car spec)))))) + (print! (green "✓ Package autoloads included")) + ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, + ;; at least); they are cached later, so all those membership checks are + ;; unnecessary overhead. + (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) + (goto-char (match-beginning 1)) + (kill-sexp)) + (print! (green "✓ Removed load-path/auto-mode-alist entries")))) + (doom--byte-compile-file doom-package-autoload-file) + (when (and noninteractive (not (daemonp))) + (doom--server-load doom-package-autoload-file)) + t)) + + +;; +;; Byte compilation +;; + +(defun doom//byte-compile (&optional modules recompile-p) + "Byte compiles your emacs configuration. + +init.el is always byte-compiled by this. + +If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are +byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom +core. It always ignores unit tests and files with `no-byte-compile' enabled. + +Doom was designed to benefit from byte-compilation, but the process may take a +while. Also, while your config files are byte-compiled, changes to them will not +take effect! Use `doom//clean-byte-compiled-files' or `make clean' to remove +these files. + +If RECOMPILE-P is non-nil, only recompile out-of-date files." + (interactive + (list nil current-prefix-arg)) + (let ((default-directory doom-emacs-dir) + (total-ok 0) + (total-fail 0) + (total-noop 0) + compile-plugins-p + targets) + (dolist (module (delete-dups modules) (nreverse targets)) + (pcase module + (":core" (push doom-core-dir targets)) + (":private" (push doom-private-dir targets)) + (":plugins" + (dolist (file (doom-files-in package-user-dir :match "\\.elc$")) + (ignore-errors (delete-file file))) + (byte-recompile-directory package-user-dir 0 t) + (setq compile-plugins-p t + modules (delete ":plugins" modules))) + ((pred file-directory-p) + (push module targets)) + ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) + (push (doom-module-locate-path + (doom-keyword-intern (match-string 1 module)) + (intern (match-string 2 module))) + targets)))) + (cl-block 'byte-compile + ;; If we're just here to byte-compile our plugins, we're done! + (and (not modules) + compile-plugins-p + (cl-return-from 'byte-compile t)) + (unless (or (equal modules '(":core")) + recompile-p) + (unless (and (not doom-auto-accept) + (y-or-n-p + (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" + "efforts to debug issues. It is not recommended you do it if you frequently\n" + "tinker with your Emacs config.\n\n" + "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" + "Doom core files, as these don't change often.\n\n" + "If you have issues, please make sure byte-compilation isn't the cause by using\n" + "`bin/doom clean` to clear out your *.elc files.\n\n" + "Byte-compile anyway?"))) + (message "Aborting.") + (cl-return-from 'byte-compile))) + (unless recompile-p + (doom//clean-byte-compiled-files) + (doom//reload-autoloads)) + (let (doom-emacs-changed-p + noninteractive) + ;; But first we must be sure that Doom and your private config have + ;; been fully loaded. Which usually aren't so in an noninteractive + ;; session. + (doom-initialize) + (doom-initialize-modules 'force)) + ;; If no targets were supplied, then we use your module list. + (unless modules + (setq targets (append (list doom-core-dir) + (doom-module-load-path)))) + ;; Assemble el files we want to compile; taking into account that + ;; MODULES may be a list of MODULE/SUBMODULE strings from the command + ;; line. + (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) + (unless target-files + (if targets + (message "Couldn't find any valid targets") + (message "No targets to %scompile" (if recompile-p "re" ""))) + (cl-return-from 'byte-compile)) + (condition-case ex + (let ((use-package-expand-minimally t)) + ;; Always compile private init file + (push (expand-file-name "init.el" doom-private-dir) target-files) + (push (expand-file-name "init.el" doom-emacs-dir) target-files) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) + (if (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p target elc-file)))) + (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) + (not (doom-file-cookie-p target))) + 'no-byte-compile + (byte-compile-file target))) + (short-name (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (cl-incf + (cond ((eq result 'no-byte-compile) + (print! (dark (white "⚠ Ignored %s" short-name))) + total-noop) + ((null result) + (print! (red "✕ Failed to compile %s" short-name)) + total-fail) + (t + (print! (green "✓ Compiled %s" short-name)) + (quiet! (load target t t)) + total-ok)))) + (cl-incf total-noop))) + (print! + (bold + (color (if (= total-fail 0) 'green 'red) + "%s %d/%d file(s) (%d ignored)" + (if recompile-p "Recompiled" "Compiled") + total-ok (- (length target-files) total-noop) + total-noop)))) + (error + (print! (red "\n%%s\n\n%%s\n\n%%s") + "There were breaking errors." + (error-message-string ex) + "Reverting changes...") + (quiet! (doom//clean-byte-compiled-files)) + (print! (yellow "Finished (nothing was byte-compiled)")))))))) + +(defun doom//clean-byte-compiled-files () + "Delete all the compiled elc files in your Emacs configuration and private +module. This does not include your byte-compiled, third party packages.'" + (interactive) + (cl-loop with default-directory = doom-emacs-dir + for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 1) + (doom-files-in doom-private-dir :match "\\.elc$" :depth 2) + (doom-files-in doom-core-dir :match "\\.elc$") + (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) + for truepath = (file-truename path) + if (file-exists-p path) + do (delete-file path) + and do + (print! (green "✓ Deleted %%s") + (if (file-in-directory-p truepath default-directory) + (file-relative-name truepath) + (abbreviate-file-name truepath))) + finally do (print! (bold (green "Everything is clean"))))) + (provide 'core-dispatcher) ;;; core-dispatcher.el ends here From 72201fead5a29023dc4359ccace3cb5db3ff1514 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 23:21:56 +0200 Subject: [PATCH 1807/4235] Major refactor of package management API Fixes issues where: + package!'s :disable property was ignored and def-package! wouldn't ignore disabled packages. + Certain quelpa packages were being removed/reinstalled infinitely + Improved flexibility of doom-get-packages (its docstring needs to be updated!) --- core/autoload/debug.el | 6 +- core/autoload/packages.el | 114 +++++++++++++++++++++++--------------- 2 files changed, 72 insertions(+), 48 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 713554305..a352ffc66 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -56,11 +56,11 @@ ready to be pasted in a bug report on github." "n/a") (or (ignore-errors (require 'use-package) - (cl-loop for (pkg . plist) in (doom-get-packages :all t :private t :sort #'string-lessp) + (cl-loop for (name . plist) in (doom-get-packages :private t) if (use-package-plist-delete (copy-seq plist) :private) - collect (format "%s" (cons pkg it)) + collect (format "%s" (cons name it)) else - collect (symbol-name pkg))) + collect (symbol-name name))) "n/a") ;; abbreviate $HOME to hide username (mapcar #'abbreviate-file-name exec-path)))) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c8856ab44..b8d5f8149 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -3,7 +3,6 @@ (load! "cache") ;;; Private functions - (defun doom--packages-choose (prompt) (let ((table (cl-loop for pkg in package-alist unless (package-built-in-p (cdr pkg)) @@ -57,14 +56,10 @@ "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-check-type name symbol) - (cond ((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)))) + (cond ((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)))) ;;;###autoload (defun doom-package-outdated-p (name) @@ -117,49 +112,80 @@ was installed with. Returns nil otherwise, or if package isn't installed." "Return t if a package named NAME (a symbol) has a different recipe than it was installed with." (cl-check-type name symbol) - (when (package-installed-p name) - (let ((quelpa-recipe (assq name quelpa-cache)) - (doom-recipe (assq name doom-packages))) - (and quelpa-recipe doom-recipe - (not (equal (cdr quelpa-recipe) - (cdr (plist-get (cdr doom-recipe) :recipe)))))))) + (doom-initialize-packages) + (and (package-installed-p name) + (when-let* ((quelpa-recipe (assq name quelpa-cache)) + (doom-recipe (assq name doom-packages))) + (not (equal (cdr quelpa-recipe) + (cdr (plist-get (cdr doom-recipe) :recipe))))))) ;;;###autoload -(cl-defun doom-get-packages (&key installed backend private disabled all sort) +(cl-defun doom-get-packages (&key (installed 'any) + (private 'any) + (disabled 'any) + (pinned 'any) + (ignored 'any) + (sort t) + changed + backend) "Retrieves a list of primary packages (i.e. non-dependencies). Each element is a cons cell, whose car is the package symbol and whose cdr is the quelpa recipe (if any). -BACKEND can be 'quelpa or 'elpa, and will instruct this function to return only -the packages relevant to that backend. +You can build a filtering criteria using one or more of the following +properties: -If INSTALLED is non-nil, only return installed packages. + :backend BACKEND + Can be 'quelpa, 'elpa or 'emacs + :installed BOOL + Only return installed packages (t) or uninstalled packages (nil) + :private BOOL + Only return private packages (t) or non-private packages (nil) + :disabled BOOL + Only return packages that are disabled (t) or otherwise (nil) + :ignored BOOL + Only return packages that are ignored (t) or otherwise (nil) + :pinned BOOL|ARCHIVE + Only return packages that are pinned (t), not pinned (nil) or pinned to a + specific archive (stringp) -If PRIVATE, only return private packages. - -If DISABLED, only return disabled packages. - -If ALL, include disabled packages. +The resulting list is sorted unless :sort nil is passed to this function. Warning: this function is expensive, as it re-evaluates your all packages.el files." - (doom-initialize-packages (if (or installed backend) t 'internal)) - (cl-loop with packages = (append (mapcar #'list doom-core-packages) - doom-packages) + (doom-initialize-packages) + (cl-loop with packages = + (cl-remove-duplicates (append (mapcar #'list doom-core-packages) + doom-packages) + :key #'car) for (sym . plist) in (if sort - (cl-sort packages #'string-lessp :key #'car) + (cl-sort (copy-sequence packages) #'string-lessp :key #'car) packages) - if (and (or all - (not (plist-get plist :disabled))) - (or (not disabled) - (plist-get plist :disabled)) - (or (not installed) - (package-installed-p sym)) - (or (not backend) + if (and (or (not backend) (eq (doom-package-backend sym t) backend)) - (or (not private) - (plist-get plist :private))) + (or (eq ignored 'any) + (if ignored + (plist-get plist :ignore) + (not (plist-get plist :ignore)))) + (or (eq disabled 'any) + (if disabled + (plist-get plist :disable) + (not (plist-get plist :disable)))) + (or (eq installed 'any) + (if installed + (package-installed-p sym) + (not (package-installed-p sym)))) + (or (eq private 'any) + (if private + (plist-get plist :private) + (not (plist-get plist :private)))) + (or (eq pinned 'any) + (cond ((eq pinned 't) + (plist-get plist :pin)) + ((null pinned) + (not (plist-get plist :pin))) + ((equal (plist-get plist :pin) pinned))))) collect (cons sym plist))) ;;;###autoload @@ -238,7 +264,7 @@ depended on. Used by `doom//packages-autoremove'." (let ((package-selected-packages - (mapcar #'car (doom-get-packages :installed t)))) + (mapcar #'car (doom-get-packages :disabled nil)))) (append (package--removable-packages) (cl-loop for pkg in package-selected-packages if (and (doom-package-different-backend-p pkg) @@ -246,7 +272,7 @@ Used by `doom//packages-autoremove'." collect pkg)))) ;;;###autoload -(defun doom-get-missing-packages (&optional include-ignored-p) +(cl-defun doom-get-missing-packages (&key (ignored 'any)) "Return a list of requested packages that aren't installed or built-in, but are enabled (with a `package!' directive). Each element is a list whose CAR is the package symbol, and whose CDR is a plist taken from that package's @@ -257,16 +283,14 @@ i.e. they have an :ignore property. Used by `doom//packages-install'." (doom-initialize-packages) - (cl-loop for desc in (doom-get-packages) - for (name . plist) = desc - if (and (or include-ignored-p - (not (plist-get plist :ignore))) - (or (plist-get plist :pin) + (cl-loop for (name . plist) + in (doom-get-packages :ignored ignored :disabled nil) + if (and (or (plist-get plist :pin) (not (assq name package--builtins))) (or (not (assq name package-alist)) (doom-package-different-backend-p name) (doom-package-different-recipe-p name))) - collect desc)) + collect (cons name plist))) ;; From 1c3183b29882416ef6231d8ce5f8811930799258 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Jun 2018 23:56:07 +0200 Subject: [PATCH 1808/4235] Remove space in backend labels during install Minor reformatting. To be consistent with the backend transition labels in doom//packages-autoremove. --- core/autoload/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index b8d5f8149..42fdd6713 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -454,8 +454,8 @@ calls." "new recipe") ((doom-package-different-backend-p (car pkg)) (if (plist-get (cdr pkg) :recipe) - "ELPA -> QUELPA" - "QUELPA -> ELPA")) + "ELPA->QUELPA" + "QUELPA->ELPA")) ((plist-get (cdr pkg) :recipe) "QUELPA") ("ELPA")))) From fe6afa19a3e0cf3db04df0c4bc6fe898028dfb0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 00:25:11 +0200 Subject: [PATCH 1809/4235] Add docstrings to FILE! & DIR! macros --- core/core-lib.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 918c2fc49..5b078c988 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -189,14 +189,14 @@ MATCH is a string regexp. Only entries that match it will be included." ;; (defmacro FILE! () - "TODO" + "Return the emacs lisp file this macro is called from." `(cond ((bound-and-true-p byte-compile-current-file)) ((stringp (car-safe current-load-list)) (car current-load-list)) (load-file-name) (buffer-file-name))) (defmacro DIR! () - "TODO" + "Returns the directory of the emacs lisp file this macro is called from." `(let ((file (FILE!))) (and file (file-name-directory file)))) From f7a86ae281a0a59c3e14231009ca98ffad53b483 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 00:26:28 +0200 Subject: [PATCH 1810/4235] Refactor def-package! It is no longer necessary to gate use-package calls with :if/:when/:unless checks during byte-compilation. This was fixed somewhere along the way. --- core/core-modules.el | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 0d67b3e23..5e16a4fd0 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -265,13 +265,7 @@ to least)." (when (and (memq name (bound-and-true-p doom-disabled-packages)) (not (memq :disabled 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) - (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) - (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) - (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) - `(use-package ,name ,@plist))) + `(use-package ,name ,@plist)) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. From 64e02e4232681b3cc58bf0e2e86e55510d01fe43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 01:45:52 +0200 Subject: [PATCH 1811/4235] Load core-packages in doom//run-tests --- core/autoload/test.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/test.el b/core/autoload/test.el index 7a357a449..98243f517 100644 --- a/core/autoload/test.el +++ b/core/autoload/test.el @@ -7,6 +7,7 @@ command line args following a double dash (each arg should be in the If neither is available, run all tests in all enabled modules." (interactive) + (require 'core-packages) (doom//reload-autoloads) (let (noninteractive) ;; Core libraries aren't fully loaded in a noninteractive session, so we From 4c40195d401d602f205faca577028af202d04cd6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 01:47:43 +0200 Subject: [PATCH 1812/4235] Slightly better version check error --- core/core.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 4da84da45..5d5ae0179 100644 --- a/core/core.el +++ b/core/core.el @@ -2,7 +2,8 @@ (eval-when-compile (and (version< emacs-version "25") - (error "Doom only supports Emacs 25.1 and higher!"))) + (error "Detected Emacs %s. Doom only supports Emacs 25.1 and higher" + emacs-version))) ;; (defvar doom-version "2.0.9" From 4425fdfca48249da717ee11b1ff88759c1d53bcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 01:48:09 +0200 Subject: [PATCH 1813/4235] defvar -> defconst for dir vars --- core/core.el | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/core/core.el b/core/core.el index 5d5ae0179..5d35adcf4 100644 --- a/core/core.el +++ b/core/core.el @@ -5,11 +5,15 @@ (error "Detected Emacs %s. Doom only supports Emacs 25.1 and higher" emacs-version))) + ;; -(defvar doom-version "2.0.9" +;; Constants +;; + +(defconst doom-version "2.0.9" "Current version of DOOM emacs.") -(defvar doom-debug-mode (or (getenv "DEBUG") init-file-debug) +(defconst doom-debug-mode (or (getenv "DEBUG") init-file-debug) "If non-nil, all doom functions will be verbose. Set DEBUG=1 in the command line or use --debug-init to enable this.") @@ -17,42 +21,43 @@ line or use --debug-init to enable this.") (eval-when-compile (not (version< emacs-version "26")))) (defconst EMACS27+ (eval-when-compile (not (version< emacs-version "27")))) + (defconst IS-MAC (eq system-type 'darwin)) (defconst IS-LINUX (eq system-type 'gnu/linux)) (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) ;; -(defvar doom-emacs-dir +(defconst doom-emacs-dir (eval-when-compile (file-truename user-emacs-directory)) "The path to this emacs.d directory. Must end in a slash.") -(defvar doom-core-dir (concat doom-emacs-dir "core/") +(defconst doom-core-dir (concat doom-emacs-dir "core/") "Where essential files are stored.") -(defvar doom-modules-dir (concat doom-emacs-dir "modules/") +(defconst doom-modules-dir (concat doom-emacs-dir "modules/") "The main directory where Doom modules are stored.") -(defvar doom-local-dir (concat doom-emacs-dir ".local/") +(defconst 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-etc-dir (concat doom-local-dir "etc/") +(defconst doom-etc-dir (concat doom-local-dir "etc/") "Directory for non-volatile storage. 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/") +(defconst doom-cache-dir (concat doom-local-dir "cache/") "Directory for volatile storage. Use this for files that change often, like cache files.") -(defvar doom-packages-dir (concat doom-local-dir "packages/") +(defconst doom-packages-dir (concat doom-local-dir "packages/") "Where package.el and quelpa plugins (and their caches) are stored.") -(defvar doom-private-dir +(defconst doom-private-dir (eval-when-compile (or (getenv "DOOMDIR") (let ((xdg-path From 9ec046116221bd51223373bc51e43e81332e2534 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 01:58:06 +0200 Subject: [PATCH 1814/4235] Revert "Refactor def-package!" This reverts commit f7a86ae281a0a59c3e14231009ca98ffad53b483. Turns out it's still needed when byte-compiling! --- core/core-modules.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/core-modules.el b/core/core-modules.el index 5e16a4fd0..0d67b3e23 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -265,7 +265,13 @@ to least)." (when (and (memq name (bound-and-true-p doom-disabled-packages)) (not (memq :disabled plist))) (setq plist `(:disabled t ,@plist))) - `(use-package ,name ,@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) + (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) + (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) + (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) + `(use-package ,name ,@plist))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. From 85591ca296625cdce479df63849b66f76c877a3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 12:17:33 +0200 Subject: [PATCH 1815/4235] Move custom-file into local-dir (not etc-dir) Makes more sense to put more vital files in local than etc or cache. --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 5d35adcf4..0ba5cd983 100644 --- a/core/core.el +++ b/core/core.el @@ -193,7 +193,7 @@ this, you'll get stuttering and random freezes) and resets abbrev-file-name (concat doom-local-dir "abbrev.el") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) - custom-file (concat doom-etc-dir "custom.el") + custom-file (concat doom-local-dir "custom.el") mc/list-file (concat doom-etc-dir "mc-lists.el") pcache-directory (concat doom-cache-dir "pcache/") request-storage-directory (concat doom-cache-dir "request") From 77ac16465134438dc0f20f287e15f42954abff96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 12:18:21 +0200 Subject: [PATCH 1816/4235] Fix core libraries not loading Caused because the load-path is reset to doom-site-load-path in doom-initialize-packages, which was initialized before doom-core-dir was added to it, so core-* libraries couldn't be found. --- core/core-packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index dbb4fb8d0..d212c929b 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -100,7 +100,7 @@ them." (unless (eq force-p 'internal) ;; `package-alist' (when (or force-p (not (bound-and-true-p package-alist))) - (setq load-path doom-site-load-path) + (setq load-path (cons doom-core-dir doom-site-load-path)) (doom-ensure-packages-initialized 'force)) ;; `quelpa-cache' From c6324da59dd51d65f870987c1988cba31b963a03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 12:26:48 +0200 Subject: [PATCH 1817/4235] Add force-p parameter to doom//refresh Also force autoloads regeneration on doom upgrade. --- core/core-dispatcher.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 67b42b1c2..ae28ca551 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -213,16 +213,16 @@ recompile. Run this whenever you: (string-match-p "[^ \t\n]" (buffer-string)) (error "Failed to check working tree in %s" dir))))) -(defun doom//refresh () +(defun doom//refresh (&optional force-p) "Ensure Doom is in a working state by checking autoloads and packages, and recompiling any changed compiled files. This is the shotgun solution to most problems with doom." - (interactive) - (doom//reload-doom-autoloads) + (interactive "P") + (doom//reload-doom-autoloads force-p) (unwind-protect (progn (ignore-errors (doom//packages-autoremove)) (ignore-errors (doom//packages-install))) - (doom//reload-package-autoloads) + (doom//reload-package-autoloads force-p) (doom//byte-compile nil 'recompile))) (defun doom//upgrade () @@ -272,7 +272,7 @@ problems with doom." (buffer-string))) (unless (equal (vc-git-working-revision doom-emacs-dir) rev) (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) - (doom//refresh) + (doom//refresh 'force) (message "Done! Please restart Emacs for changes to take effect")))) (user-error (message "%s Aborting." (error-message-string e))) From 98d2a35a593af507eefcdf9de7b1a5c0fdfc9573 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 12:58:47 +0200 Subject: [PATCH 1818/4235] Compile plugins in the correct order Compile order will affect some packages, so `bin/doom compile :plugins` will now byte-compile plugins in the order they're declared in, but after their dependencies. --- core/core-dispatcher.el | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index ae28ca551..5b03ccdbf 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -561,9 +561,18 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (":core" (push doom-core-dir targets)) (":private" (push doom-private-dir targets)) (":plugins" - (dolist (file (doom-files-in package-user-dir :match "\\.elc$")) - (ignore-errors (delete-file file))) - (byte-recompile-directory package-user-dir 0 t) + (doom-initialize-packages) + (let (visited) + (dolist (name (append doom-core-packages (mapcar #'car doom-packages))) + (unless (memq name visited) + (when-let* ((desc (cadr (assq name package-alist)))) + (cl-loop for dep in (package--get-deps name) + if (and (not (memq dep visited)) + (assq dep package-alist)) + do (package--compile (cadr it)) + and do (push dep visited)) + (package--compile desc) + (push name visited))))) (setq compile-plugins-p t modules (delete ":plugins" modules))) ((pred file-directory-p) From a77a967299fb7fac4cff240aa9d63c5d799b89bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 14:13:12 +0200 Subject: [PATCH 1819/4235] Fix elusive 'already at top-level' error I have hunted this bug on and off for nearly a year now. It would kill processes randomly, move the point suddenly, and quit the active minibuffer without warning. The only clue it'd leave behind is an announcement in the minibuffer: "Already at top-level". Thanks to @UndeadKernel for the last piece of the puzzle! Fixes #436 --- modules/ui/popup/autoload.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index 0f87e9cf6..b1fc35021 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -90,17 +90,18 @@ the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) (let ((inhibit-quit t) (kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) - (cond ((eq ttl 0) - (kill-buffer buffer)) - ((get-buffer-window buffer) + (cond ((get-buffer-window buffer) (with-current-buffer buffer (setq +popup--timer (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) + ((eq ttl 0) + (kill-buffer buffer)) ((with-demoted-errors "Error killing transient buffer: %s" (let (confirm-kill-processes) - (when-let* ((process (get-buffer-process (current-buffer)))) - (kill-process process))) - (kill-buffer buffer))))))) + (when-let* ((process (get-buffer-process buffer))) + (kill-process process)) + (let (kill-buffer-hook kill-buffer-query-functions) + (kill-buffer buffer))))))))) (defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the From 99daa9bd43c4281cc23973ed4f186d2e347076b2 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Tue, 12 Jun 2018 15:32:39 +0200 Subject: [PATCH 1820/4235] Fix: restore the display of current and total pages in PDF docs A refactoring spree introduced a bug by incorrectly making a symbol a function. This fixes this. --- modules/tools/pdf/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index cec7d69d5..edd277624 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -16,7 +16,7 @@ ;; Custom modeline that removes useless info and adds page numbers (when (featurep! :ui doom-modeline) (load! "+modeline") - (add-hook! #'pdf-tools-enabled-hook (doom-set-modeline 'pdf-tools-modeline))) + (add-hook! 'pdf-tools-enabled-hook (doom-set-modeline 'pdf-tools-modeline))) ;; Handle PDF-tools related popups better (set! :popup "^\\*Outline*" '((side . right) (size . 40)) '((select))) ;; TODO: Add additional important windows that should be handled differently From 6dc413c044b0be171cda59263588aa46df74eb69 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 14:24:11 +0200 Subject: [PATCH 1821/4235] Remove :latex-bibtex-{file,dir} settings Setting a single variable is preferrable to using a setting to abstract it. --- modules/lang/latex/autoload.el | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/modules/lang/latex/autoload.el b/modules/lang/latex/autoload.el index 663be0d2b..6e95a3ff6 100644 --- a/modules/lang/latex/autoload.el +++ b/modules/lang/latex/autoload.el @@ -1,15 +1,5 @@ ;;; lang/latex/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(def-setting! :latex-bibtex-file (file) - "Sets the default file RefTeX uses to search for citations." - `(setq +latex-bibtex-file ,file)) - -;;;###autoload -(def-setting! :latex-bibtex-dir (dir) - "Sets the directory where AUCTeX will search for PDFs associated to BibTeX references." - `(setq +latex-bibtex-dir ,dir)) - ;;;###autoload (defun +latex/LaTeX-indent-item () "Provide proper indentation for LaTeX \"itemize\",\"enumerate\", and \"description\" environments. From acbad5ca019e5297db8772d6671372030c489250 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 15:03:45 +0200 Subject: [PATCH 1822/4235] Add ALL-P parameter to doom-module-load-path Allowing it to return path to *all* modules, whether or not they are activated. --- core/core-modules.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 0d67b3e23..156b9dad9 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -128,10 +128,17 @@ This doesn't require modules to be enabled. For enabled modules us (cons (intern (concat ":" module)) (intern submodule)))))))) -(defun doom-module-load-path () - "Return a list of absolute file paths to activated modules." - (append (cl-loop for plist being the hash-values of (doom-modules) - collect (plist-get plist :path)) +(defun doom-module-load-path (&optional all-p) + "Return a list of absolute file paths to activated modules. If ALL-P is +non-nil, return paths of possible modules, activated or otherwise." + (append (if all-p + (doom-files-in doom-modules-dirs + :type 'dirs + :mindepth 1 + :depth 1 + :full t) + (cl-loop for plist being the hash-values of (doom-modules) + collect (plist-get plist :path))) (list doom-private-dir))) (defun doom-modules (&optional refresh-p) From 399591b951c089f0356b3d6f85b1d0a3ed1f88cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 16:01:11 +0200 Subject: [PATCH 1823/4235] Add :mindepth property to doom-files-in + don't error out if directory doesn't exist. + :depth now starts from 0, instead of 1 --- core/core-dispatcher.el | 6 ++--- core/core-lib.el | 60 ++++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 5b03ccdbf..a26baa996 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -673,10 +673,10 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." module. This does not include your byte-compiled, third party packages.'" (interactive) (cl-loop with default-directory = doom-emacs-dir - for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 1) - (doom-files-in doom-private-dir :match "\\.elc$" :depth 2) + for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) + (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) (doom-files-in doom-core-dir :match "\\.elc$") - (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) + (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 3)) for truepath = (file-truename path) if (file-exists-p path) do (delete-file path) diff --git a/core/core-lib.el b/core/core-lib.el index 5b078c988..e22918f22 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -123,6 +123,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (type 'files) (relative-to (unless full default-directory)) (depth 99999) + (mindepth 0) (match "^[^.]")) "Returns a list of files/directories in PATH-OR-PATHS (one string path or a list of them). @@ -151,33 +152,38 @@ MATCH is a string regexp. Only entries that match it will be included." nconc (apply #'doom-files-in path (plist-put rest :relative-to relative-to)))) ((let ((path path-or-paths) result) - (dolist (file (directory-files path nil "." nosort)) - (unless (member file '("." "..")) - (let ((fullpath (expand-file-name file path))) - (cond ((file-directory-p fullpath) - (when (and (memq type '(t dirs)) - (string-match-p match file) - (not (and filter (funcall filter fullpath))) - (not (and (file-symlink-p fullpath) - (not follow-symlinks)))) - (setq result - (nconc result - (list (cond (map (funcall map fullpath)) - (relative-to (file-relative-name fullpath relative-to)) - (fullpath)))))) - (unless (<= depth 1) - (setq result - (nconc result (apply #'doom-files-in fullpath - (append `(:depth ,(1- depth) :relative-to ,relative-to) - rest)))))) - ((and (memq type '(t files)) - (string-match-p match file) - (not (and filter (funcall filter fullpath)))) - (push (if relative-to - (file-relative-name fullpath relative-to) - fullpath) - result)))))) - result)))) + (when (file-directory-p path) + (dolist (file (directory-files path nil "." nosort)) + (unless (member file '("." "..")) + (let ((fullpath (expand-file-name file path))) + (cond ((file-directory-p fullpath) + (when (and (memq type '(t dirs)) + (string-match-p match file) + (not (and filter (funcall filter fullpath))) + (not (and (file-symlink-p fullpath) + (not follow-symlinks))) + (<= mindepth 0)) + (setq result + (nconc result + (list (cond (map (funcall map fullpath)) + (relative-to (file-relative-name fullpath relative-to)) + (fullpath)))))) + (unless (< depth 1) + (setq result + (nconc result (apply #'doom-files-in fullpath + (append `(:mindepth ,(1- mindepth) + :depth ,(1- depth) + :relative-to ,relative-to) + rest)))))) + ((and (memq type '(t files)) + (string-match-p match file) + (not (and filter (funcall filter fullpath))) + (<= mindepth 0)) + (push (if relative-to + (file-relative-name fullpath relative-to) + fullpath) + result)))))) + result))))) (defun doom*shut-up (orig-fn &rest args) "Generic advisor for silencing noisy functions." From 64d354ae35ccb981ca3142c1724e97dd343c99a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 17:45:13 +0200 Subject: [PATCH 1824/4235] emacs/ediff: remove evil-ediff package Evil+ediff integration was merged into evil-collection. --- modules/emacs/ediff/config.el | 9 --------- modules/emacs/ediff/packages.el | 5 ----- 2 files changed, 14 deletions(-) delete mode 100644 modules/emacs/ediff/packages.el diff --git a/modules/emacs/ediff/config.el b/modules/emacs/ediff/config.el index 9a9cea372..120a3ebdd 100644 --- a/modules/emacs/ediff/config.el +++ b/modules/emacs/ediff/config.el @@ -14,12 +14,3 @@ (set-window-configuration +ediff--saved-wconf)) (add-hook 'ediff-before-setup-hook #'+ediff|save-wconf) (add-hook! '(ediff-quit-hook ediff-suspend-hook) #'+ediff|restore-wconf 'append) - - -;; -;; Plugins -;; - -(def-package! evil-ediff - :when (featurep! :feature evil) - :after ediff) diff --git a/modules/emacs/ediff/packages.el b/modules/emacs/ediff/packages.el deleted file mode 100644 index 6b06cb319..000000000 --- a/modules/emacs/ediff/packages.el +++ /dev/null @@ -1,5 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; emacs/ediff/packages.el - -(when (featurep! :feature evil) - (package! evil-ediff)) From 4c2107d5952b61eeb724908c4870ab45d797958f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 20:50:41 +0200 Subject: [PATCH 1825/4235] Refactor doom-module-from-path If PATH is omitted, use (FILE!); also use doom-keyword-intern. --- core/core-modules.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 156b9dad9..dca992c08 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -119,14 +119,14 @@ This doesn't require modules to be enabled. For enabled modules us (defun doom-module-from-path (&optional path) "Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path)." (or doom--current-module - (when path + (let ((path (or path (FILE!)))) (save-match-data (setq path (file-truename path)) (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) - (when-let* ((module (match-string 1 path)) - (submodule (match-string 2 path))) - (cons (intern (concat ":" module)) - (intern submodule)))))))) + (when-let* ((category (match-string 1 path)) + (module (match-string 2 path))) + (cons (doom-keyword-intern category) + (intern module)))))))) (defun doom-module-load-path (&optional all-p) "Return a list of absolute file paths to activated modules. If ALL-P is From 63552338ec98dbf3605601ac011bc7dcd254cbd4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 21:34:47 +0200 Subject: [PATCH 1826/4235] Conform editor/parinfer to Doom conventions + Use evil +everywhere flag for universal evil integration, + Use :hook instead of `add-hook!` and implicit lambda, + Fix path in header. --- modules/editor/parinfer/config.el | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/modules/editor/parinfer/config.el b/modules/editor/parinfer/config.el index 3142978e7..b7e2edb1f 100644 --- a/modules/editor/parinfer/config.el +++ b/modules/editor/parinfer/config.el @@ -1,22 +1,15 @@ -;;; lang/emacs-lisp/+parinfer.el -*- lexical-binding: t; -*- - +;;; editor/parinfer/config.el -*- lexical-binding: t; -*- (def-package! parinfer - :commands (parinfer-mode) + :hook ((emacs-lisp clojure-mode common-lisp scheme lisp) . parinfer-mode) :init - (add-hook! (emacs-lisp-mode - clojure-mode - common-lisp-mode - scheme-mode - lisp-mode) - (parinfer-mode)) (setq parinfer-extensions '(defaults - pretty-parens - smart-tab - smart-yank)) - (if (featurep! :feature evil) - (push 'evil parinfer-extensions)) + pretty-parens + smart-tab + smart-yank)) + (when (featurep! :feature evil +everywhere) + (push 'evil parinfer-extensions)) :config (map! :map parinfer-mode-map :i "" #'parinfer-smart-tab:dwim-right-or-complete From 5d79729c1596571afad15d02cf881898ff66cd80 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Jun 2018 21:36:09 +0200 Subject: [PATCH 1827/4235] Move :editor to top; disable parinfer by default And shorten post-comment. --- init.example.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/init.example.el b/init.example.el index b57ab2566..46aba12e7 100644 --- a/init.example.el +++ b/init.example.el @@ -41,6 +41,9 @@ ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows + + :editor + ;parinfer ; turn lisp into python, sort of :emacs dired ; making dired pretty [functional] @@ -127,9 +130,6 @@ ;floobits ; peer programming for a price ;impatient-mode ; show off code over HTTP - :editor - parinfer ; A handy addon to sort of turn lisp into python - :config ;; For literate config users. This will tangle+compile a config.org ;; literate config in your `doom-private-dir' whenever it changes. From 000dee7abf123e6d88fa87d9da639079d3ea3db9 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Wed, 13 Jun 2018 09:50:09 +1000 Subject: [PATCH 1828/4235] Upstream changes to wakatime --- modules/tools/wakatime/autoload.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 77f9fff0d..3babe8bb5 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -1,10 +1,13 @@ ;;; tools/wakatime/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(add-hook 'doom-after-switch-buffer-hook #'+wakatime-init) +(add-hook 'doom-after-switch-buffer-hook #'+wakatime|autostart) ;;;###autoload -(defun +wakatime-init () +(defalias '+wakatime/start '+wakatime|autostart) + +;;;###autoload +(defun +wakatime|autostart () "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." (interactive) From 6426da353321b6fa02a1391cd373af183a71d52c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 11:51:26 +0200 Subject: [PATCH 1829/4235] Fix :hook modes for parinfer-mode --- modules/editor/parinfer/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/parinfer/config.el b/modules/editor/parinfer/config.el index b7e2edb1f..2bb70e243 100644 --- a/modules/editor/parinfer/config.el +++ b/modules/editor/parinfer/config.el @@ -1,7 +1,7 @@ ;;; editor/parinfer/config.el -*- lexical-binding: t; -*- (def-package! parinfer - :hook ((emacs-lisp clojure-mode common-lisp scheme lisp) . parinfer-mode) + :hook ((emacs-lisp-mode clojure-mode scheme-mode lisp-mode) . parinfer-mode) :init (setq parinfer-extensions '(defaults From eb254afd51ad28ba1c302aa3d59011ef158e72d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 19:22:59 +0200 Subject: [PATCH 1830/4235] Fix doom doctor Update doom loader to reflect recent changes. --- bin/doom-doctor | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index c3ad96a7a..995edc243 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -275,16 +275,17 @@ ;; --- are your modules set up properly? ---------------------- -(let (doom-core-packages doom-debug-mode) - (condition-case ex - (let ((inhibit-message t) - noninteractive) - (load (concat user-emacs-directory "core/core.el") nil t) - (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) - ('error - (warn! "Attempt to load DOOM: failed\n %s\n" - (or (cdr-safe ex) (car ex))) - (setq doom-modules nil)))) +(condition-case ex + (let ((inhibit-message t) + noninteractive) + (load-file (concat user-emacs-directory "core/core.el")) + (require 'core-packages) + (doom-initialize-packages) + (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) + ('error + (warn! "Attempt to load DOOM: failed\n %s\n" + (or (cdr-safe ex) (car ex))) + (setq doom-modules nil))) (when (bound-and-true-p doom-modules) (section! "Checking your enabled modules...") From 8889d5cc2b7c124d65bef5f565dfa5a3dbca23a1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 20:10:20 +0200 Subject: [PATCH 1831/4235] Add :lang common-lisp --- modules/lang/common-lisp/config.el | 20 ++++++++++++++++++++ modules/lang/common-lisp/packages.el | 6 ++++++ modules/lang/emacs-lisp/config.el | 5 ----- modules/lang/emacs-lisp/packages.el | 1 - 4 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 modules/lang/common-lisp/config.el create mode 100644 modules/lang/common-lisp/packages.el diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el new file mode 100644 index 000000000..c73333eda --- /dev/null +++ b/modules/lang/common-lisp/config.el @@ -0,0 +1,20 @@ +;;; lang/common-lisp/config.el -*- lexical-binding: t; -*- + +;; `slime' +(setq slime-contribs '(slime-fancy)) +(after! slime + (setq inferior-lisp-program (executable-find "sbcl"))) + + +(def-package! slime-company + :when (featurep! :completion company) + :commands slime-company + :init + (push 'slime-company slime-contribs) + + ;; Don't override the global `company-backends'! + (defun +common-lisp|make-company-backends-local (&rest _) + (make-variable-buffer-local 'company-backends)) + (advice-add #'slime-company-maybe-enable + :before #'+common-lisp|make-company-backends-local)) + diff --git a/modules/lang/common-lisp/packages.el b/modules/lang/common-lisp/packages.el new file mode 100644 index 000000000..8c8d4b4af --- /dev/null +++ b/modules/lang/common-lisp/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/common-lisp/packages.el + +(package! slime) +(when (featurep! :completion company) + (package! slime-company)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index dc395d0e5..72d72feda 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -71,11 +71,6 @@ auto-compile-use-mode-line nil) -;; `slime' -(setq inferior-lisp-program "clisp") -(after! slime (require 'slime-fuzzy)) - - ;; `macrostep' (map! :after macrostep :map macrostep-keymap diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index 24b02c21b..cd22e35b0 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -5,7 +5,6 @@ (package! highlight-quoted) (package! macrostep) (package! overseer) -(package! slime) (when (featurep! :feature syntax-checker) (package! flycheck-cask)) From 6a6652d394cb0069dc4fcaba6f62d81b119ffc8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 22:14:22 +0200 Subject: [PATCH 1832/4235] lang/common-lisp: replace slime with sly Also add sly server auto-start and cleanup hooks. --- modules/lang/common-lisp/config.el | 39 ++++++++++++++++++---------- modules/lang/common-lisp/packages.el | 5 ++-- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index c73333eda..ee4b2c74a 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -1,20 +1,31 @@ ;;; lang/common-lisp/config.el -*- lexical-binding: t; -*- ;; `slime' -(setq slime-contribs '(slime-fancy)) -(after! slime - (setq inferior-lisp-program (executable-find "sbcl"))) +(after! sly + (setq inferior-lisp-program "sbcl") + (defun +common-lisp|cleanup-sly-maybe () + "Kill processes and leftover buffers when killing the last sly buffer." + (unless (cl-loop for buf in (delq (current-buffer) (buffer-list)) + if (and (buffer-local-value 'sly-mode buf) + (get-buffer-window buf)) + return t) + (dolist (conn (sly--purge-connections)) + (sly-quit-lisp-internal conn 'sly-quit-sentinel t)) + (let (kill-buffer-hook kill-buffer-query-functions) + (mapc #'kill-buffer + (cl-loop for buf in (delq (current-buffer) (buffer-list)) + if (buffer-local-value 'sly-mode buf) + collect buf))))) -(def-package! slime-company - :when (featurep! :completion company) - :commands slime-company - :init - (push 'slime-company slime-contribs) - - ;; Don't override the global `company-backends'! - (defun +common-lisp|make-company-backends-local (&rest _) - (make-variable-buffer-local 'company-backends)) - (advice-add #'slime-company-maybe-enable - :before #'+common-lisp|make-company-backends-local)) + (defun +common-lisp|init-sly () + "Attempt to auto-start sly when opening a lisp buffer." + (cond ((sly-connected-p)) + ((executable-find inferior-lisp-program) + (let ((sly-auto-start 'always)) + (sly-auto-start) + (add-hook 'kill-buffer-hook #'+common-lisp|cleanup-sly-maybe nil t))) + ((message "WARNING: Couldn't find `inferior-lisp-program' (%s)" + inferior-lisp-program)))) + (add-hook 'sly-mode-hook #'+common-lisp|init-sly)) diff --git a/modules/lang/common-lisp/packages.el b/modules/lang/common-lisp/packages.el index 8c8d4b4af..8541ea496 100644 --- a/modules/lang/common-lisp/packages.el +++ b/modules/lang/common-lisp/packages.el @@ -1,6 +1,5 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/common-lisp/packages.el -(package! slime) -(when (featurep! :completion company) - (package! slime-company)) +(package! sly) +(package! sly-macrostep) From b6f9bc9675771b60fd0e665e4b6db10f9a7fc896 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 22:15:08 +0200 Subject: [PATCH 1833/4235] Fix package manager not :ignore'ing packages --- 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 42fdd6713..c9ebfe14d 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -264,7 +264,7 @@ depended on. Used by `doom//packages-autoremove'." (let ((package-selected-packages - (mapcar #'car (doom-get-packages :disabled nil)))) + (mapcar #'car (doom-get-packages :ignored nil :disabled nil)))) (append (package--removable-packages) (cl-loop for pkg in package-selected-packages if (and (doom-package-different-backend-p pkg) @@ -272,7 +272,7 @@ Used by `doom//packages-autoremove'." collect pkg)))) ;;;###autoload -(cl-defun doom-get-missing-packages (&key (ignored 'any)) +(defun doom-get-missing-packages (&optional include-ignored-p) "Return a list of requested packages that aren't installed or built-in, but are enabled (with a `package!' directive). Each element is a list whose CAR is the package symbol, and whose CDR is a plist taken from that package's @@ -284,7 +284,7 @@ i.e. they have an :ignore property. Used by `doom//packages-install'." (doom-initialize-packages) (cl-loop for (name . plist) - in (doom-get-packages :ignored ignored :disabled nil) + in (doom-get-packages :ignored (if include-ignored-p 'any) :disabled nil) if (and (or (plist-get plist :pin) (not (assq name package--builtins))) (or (not (assq name package-alist)) From 933023d779b84c763343737669338613e74a4794 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 22:16:08 +0200 Subject: [PATCH 1834/4235] Minor reformatting & docstring revision in core.el --- core/core.el | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/core/core.el b/core/core.el index 0ba5cd983..24714a9bd 100644 --- a/core/core.el +++ b/core/core.el @@ -78,7 +78,7 @@ file.") ;; -;; State variables +;; Doom core variables ;; (defvar doom-init-p nil @@ -94,14 +94,6 @@ Doom was setup, which can cause problems.") (defvar doom-site-load-path load-path "The starting load-path, before it is altered by `doom-initialize'.") -(defvar doom--refreshed-p nil) -(defvar doom--stage 'init) - - -;; -;; Doom hooks -;; - (defvar doom-init-hook nil "Hooks run after all init.el files are loaded, including your private and all module init.el files, but before their config.el files are loaded.") @@ -114,6 +106,11 @@ else (except for `window-setup-hook').") (defvar doom-reload-hook nil "A list of hooks to run when `doom//reload-load-path' is called.") +(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) +(defvar doom--last-emacs-version nil) +(defvar doom--refreshed-p nil) +(defvar doom--stage 'init) + ;; ;; Optimize startup @@ -249,11 +246,9 @@ with functions that require it (like modeline segments)." ;; Bootstrap helpers ;; -(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) -(defvar doom--last-emacs-version nil) - (defun doom-ensure-same-emacs-version-p () - "Do an Emacs version check and set `doom-emacs-changed-p' if it has changed." + "Check if the running version of Emacs has changed and set +`doom-emacs-changed-p' if it has." (if (load doom--last-emacs-file 'noerror 'nomessage 'nosuffix) (setq doom-emacs-changed-p (not (equal emacs-version doom--last-emacs-version))) @@ -264,7 +259,8 @@ with functions that require it (like modeline segments)." ((y-or-n-p (format (concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n" - "issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n" + "issues. If you run into errors, run `bin/doom compile :plugins` or reinstall your\n" + "plugins to resolve them.\n\n" "Continue?") doom--last-emacs-version emacs-version)) From 1f07b37c9ce5450f400ce8a00fdedcd37960f3ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Jun 2018 23:25:40 +0200 Subject: [PATCH 1835/4235] Fix elusive back-to-top-level error These occurred because of disruptive kill-buffer-hooks running when the backtrace buffer was auto-killed by the popup cleanup system. No more! --- modules/ui/popup/autoload.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload.el index b1fc35021..2d8f54777 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload.el @@ -97,11 +97,12 @@ the buffer is visible, then set another timer and try again later." ((eq ttl 0) (kill-buffer buffer)) ((with-demoted-errors "Error killing transient buffer: %s" - (let (confirm-kill-processes) - (when-let* ((process (get-buffer-process buffer))) - (kill-process process)) - (let (kill-buffer-hook kill-buffer-query-functions) - (kill-buffer buffer))))))))) + (with-current-buffer buffer + (let (confirm-kill-processes) + (when-let* ((process (get-buffer-process buffer))) + (kill-process process)) + (let (kill-buffer-hook kill-buffer-query-functions) + (kill-buffer buffer)))))))))) (defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the From 08a4701774d356b93b06bbbbdbe1af759e14713d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:01:14 +0200 Subject: [PATCH 1836/4235] Fix case where private init.el has no doom! block This shouldn't error out. It's better if Doom ran normally, just without any of its modules activated. Addresses issue mentioned in #681 --- core/core-modules.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/core-modules.el b/core/core-modules.el index dca992c08..3c84a9e32 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -148,6 +148,11 @@ non-nil, return paths of possible modules, activated or otherwise." doom-init-modules-p) (message "Initializing modules") (doom-initialize-modules t) + (unless doom-modules + (setq doom-modules + (make-hash-table :test #'equal + :size 20 + :rehash-threshold 1.0))) doom-modules))) From 69c6e0b8fbecb20efe53891a761b6db228ca1b55 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:04:12 +0200 Subject: [PATCH 1837/4235] Add doom-get-package-alist New function returns a list of (NAME . DESC) cons cells in the order they were declared (in module packages.el files). Fixes a load-order issue where autoloads from one package would depend on the autoloads of another package, but was inserted into doom-package-autoload-file *before* the depended package, causing void-variable errors. Also allows for a big refactor of the :plugins byte-compile target. --- core/autoload/packages.el | 17 +++++++++++++++++ core/core-dispatcher.el | 20 +++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c9ebfe14d..b2c798689 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -188,6 +188,23 @@ files." ((equal (plist-get plist :pin) pinned))))) collect (cons sym plist))) +;;;###autoload +(defun doom-get-package-alist () + "Returns a list of all desired packages, their dependencies and their desc +objects, in the order of their `package! blocks.'" + (doom-initialize-packages) + (cl-remove-duplicates + (let (packages) + (dolist (name (append (mapcar #'car doom-packages) doom-core-packages)) + (when-let* ((desc (cadr (assq name package-alist)))) + (push (cons name desc) packages) + (cl-loop for dep in (package--get-deps name) + if (assq dep package-alist) + do (push (cons dep (cadr it)) packages)))) + packages) + :key #'car + :from-end t)) + ;;;###autoload (defun doom-get-depending-on (name) "Return a list of packages that depend on the package named NAME." diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index a26baa996..52775e6aa 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -501,9 +501,9 @@ This should be run whenever your `doom!' block or update your packages." (current-buffer)) (print! (green "✓ Cached package state")) ;; insert package autoloads - (dolist (spec package-alist) - (if-let* ((pkg (car spec)) - (desc (cadr spec))) + (dolist (spec (doom-get-package-alist)) + (if-let* ((pkg (car spec)) + (desc (cdr spec))) (unless (memq pkg doom-autoload-excluded-packages) (let ((file (concat (package--autoloads-file-name desc) ".el"))) (when (file-exists-p file) @@ -561,18 +561,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (":core" (push doom-core-dir targets)) (":private" (push doom-private-dir targets)) (":plugins" - (doom-initialize-packages) - (let (visited) - (dolist (name (append doom-core-packages (mapcar #'car doom-packages))) - (unless (memq name visited) - (when-let* ((desc (cadr (assq name package-alist)))) - (cl-loop for dep in (package--get-deps name) - if (and (not (memq dep visited)) - (assq dep package-alist)) - do (package--compile (cadr it)) - and do (push dep visited)) - (package--compile desc) - (push name visited))))) + (cl-loop for (name . desc) in (doom-get-package-alist) + do (package--compile desc)) (setq compile-plugins-p t modules (delete ":plugins" modules))) ((pred file-directory-p) From 36171f5b3346716ebacabc69654ab2b8cb2ec601 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:08:16 +0200 Subject: [PATCH 1838/4235] Fix :after-call deferred packages not loading If you open emacs with a file (emacs file.txt), the file is switched to before the switch-buffer hooks are set up. However, many core packages are hooked to those switch-buffer hooks (to load when they're first triggered). They miss the boat and don't get loaded. These packages are now hooked onto after-find-file as well (and immediately), which will fire when a file is opened, before or after initialization. Fixes #680 --- core/core-editor.el | 10 +++++----- core/core-ui.el | 2 +- modules/tools/editorconfig/config.el | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 48a84c842..bced33c52 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -79,7 +79,7 @@ fundamental-mode) for performance sake." ;; revert buffers for changed files (def-package! autorevert - :after-call doom-before-switch-buffer-hook + :after-call after-find-file :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) @@ -97,7 +97,7 @@ fundamental-mode) for performance sake." ;; persistent point location in buffers (def-package! saveplace - :after-call doom-before-switch-buffer-hook + :after-call (after-find-file dired-initial-position-hook) :config (setq save-place-file (concat doom-cache-dir "saveplace")) (defun doom*recenter-on-load-saveplace (&rest _) @@ -110,7 +110,7 @@ fundamental-mode) for performance sake." ;; Keep track of recently opened files (def-package! recentf :defer 1 - :after-call find-file-hook + :after-call after-find-file :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") @@ -133,7 +133,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :after-call doom-before-switch-buffer-hook + :after-call (doom-before-switch-buffer-hook after-find-file) :commands (sp-pair sp-local-pair sp-with-modes) :config (require 'smartparens-config) @@ -153,7 +153,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :after-call doom-before-switch-buffer-hook + :after-call (doom-before-switch-buffer-hook after-find-file) :config ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! diff --git a/core/core-ui.el b/core/core-ui.el index ca704ecc3..653eeb4ea 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -308,7 +308,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; highlight matching delimiters (def-package! paren - :after-call doom-before-switch-buffer-hook + :after-call post-command-hook :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index c458b8a2e..fa0245a38 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -4,7 +4,7 @@ ;; specify their own formatting rules. (def-package! editorconfig :defer 2 - :after-call doom-before-switch-buffer + :after-call (doom-before-switch-buffer after-find-file) :config ;; Register missing indent variables (setq editorconfig-indentation-alist From 5b78cf7ed6f1002216ab3fb15d327ad8f1984c30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:11:52 +0200 Subject: [PATCH 1839/4235] tools/editorconfig: conform to name conventions Renamed doom-editorconfig-mode-alist to +editorconfig-mode-alist --- modules/tools/editorconfig/config.el | 29 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index fa0245a38..318ff7dc2 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -1,5 +1,19 @@ ;;; tools/editorconfig/config.el -*- lexical-binding: t; -*- +;; editorconfig cannot procure the correct settings for extension-less files. +;; Executable scripts with a shebang line, for example. So why not use Emacs' +;; major mode to drop editorconfig a hint? This is accomplished by temporarily +;; appending an extension to `buffer-file-name' when we talk to editorconfig. +(defvar +editorconfig-mode-alist + '((sh-mode . "sh") + (python-mode . "py") + (ruby-mode . "rb") + (perl-mode . "pl") + (php-mode . "php")) + "An alist mapping major modes to extensions. Used by +`doom*editorconfig-smart-detection' to give editorconfig filetype hints.") + + ;; Handles whitespace (tabs/spaces) settings externally. This way projects can ;; specify their own formatting rules. (def-package! editorconfig @@ -13,19 +27,6 @@ (nasm-mode nasm-basic-offset)) editorconfig-indentation-alist)) - ;; editorconfig cannot procure the correct settings for extension-less files. - ;; Executable scripts with a shebang line, for example. So why not use Emacs' - ;; major mode to drop editorconfig a hint? This is accomplished by temporarily - ;; appending an extension to `buffer-file-name' when we talk to editorconfig. - (defvar doom-editorconfig-mode-alist - '((sh-mode . "sh") - (python-mode . "py") - (ruby-mode . "rb") - (perl-mode . "pl") - (php-mode . "php")) - "An alist mapping major modes to extensions. Used by -`doom*editorconfig-smart-detection' to give editorconfig filetype hints.") - (defun doom*editorconfig-smart-detection (orig-fn &rest args) "Retrieve the properties for the current file. If it doesn't have an extension, try to guess one." @@ -34,7 +35,7 @@ extension, try to guess one." (file-name-extension buffer-file-name)) buffer-file-name (format "%s%s" buffer-file-name - (if-let* ((ext (cdr (assq major-mode doom-editorconfig-mode-alist)))) + (if-let* ((ext (cdr (assq major-mode +editorconfig-mode-alist)))) (concat "." ext) ""))))) (apply orig-fn args))) From ac546220a42a0c5dee2e46cc6a9a119d77644ad2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:38:44 +0200 Subject: [PATCH 1840/4235] Refactor core-editor def-package! blocks --- core/core-editor.el | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index bced33c52..b8d6ce9ed 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -167,27 +167,25 @@ fundamental-mode) for performance sake." ;; Autoloaded Plugins ;; -(def-package! command-log-mode - :commands (command-log-mode global-command-log-mode) - :config - (setq command-log-mode-auto-show t - command-log-mode-open-log-turns-on-mode t)) +(setq command-log-mode-auto-show t + command-log-mode-open-log-turns-on-mode t) (def-package! dtrt-indent - :after-call doom-before-switch-buffer-hook - :config - (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) - + :unless noninteractive + :defer t + :init (defun doom|detect-indentation () (unless (or doom-inhibit-indent-detection - (eq major-mode 'fundamental-mode) - (not (derived-mode-p 'special-mode))) + buffer-read-only + (not (derived-mode-p 'prog-mode 'text-mode 'conf-mode))) (dtrt-indent-mode +1))) - (unless noninteractive - (add-hook 'after-change-major-mode-hook #'doom|detect-indentation))) + (add-hook! (prog-mode text-mode conf-mode) + #'doom|detect-indentation) + :config + (setq dtrt-indent-verbosity (if doom-debug-mode 2 0))) (def-package! expand-region - :commands (er/expand-region er/contract-region er/mark-symbol er/mark-word) + :commands (er/contract-region er/mark-symbol er/mark-word) :config (defun doom*quit-expand-region () (when (memq last-command '(er/expand-region er/contract-region)) @@ -196,19 +194,16 @@ fundamental-mode) for performance sake." (advice-add #'doom/escape :before #'doom*quit-expand-region)) (def-package! helpful - :commands (helpful-callable helpful-function helpful-macro helpful-command - helpful-key helpful-variable helpful-at-point) + :defer t :init (setq counsel-describe-function-function #'helpful-callable counsel-describe-variable-function #'helpful-variable) - (global-set-key [remap describe-function] #'helpful-callable) - (global-set-key [remap describe-command] #'helpful-command) - (global-set-key [remap describe-variable] #'helpful-variable) - (global-set-key [remap describe-key] #'helpful-key)) - -(def-package! pcre2el - :commands rxt-quote-pcre) + (define-key! 'global + [remap describe-function] #'helpful-callable + [remap describe-command] #'helpful-command + [remap describe-variable] #'helpful-variable + [remap describe-key] #'helpful-key)) (provide 'core-editor) ;;; core-editor.el ends here From b21d575eacec25b5331cc519bde390efb2ce39af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:48:26 +0200 Subject: [PATCH 1841/4235] Init custom hooks on init-ui instead of post-init Makes more sense to be on doom-init-ui-hook. --- 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 653eeb4ea..0b1acb401 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -403,7 +403,7 @@ from the default." (if disable (advice-remove (car spec) (cdr spec)) (advice-add (car spec) :around (cdr spec))))) -(add-hook 'doom-post-init-hook #'doom|init-custom-hooks) +(add-hook 'doom-init-ui-hook #'doom|init-custom-hooks) (defun doom*load-theme-hooks (theme &rest _) (setq doom-theme theme) From 6571c9eabf1a1b4e8149958f3b9480e97ea61344 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 00:49:48 +0200 Subject: [PATCH 1842/4235] Update :depth in doom-files-in call Was searching for *.el files one level too deep. --- core/core-dispatcher.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 52775e6aa..3c5e39ccd 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -608,7 +608,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;; Assemble el files we want to compile; taking into account that ;; MODULES may be a list of MODULE/SUBMODULE strings from the command ;; line. - (let ((target-files (doom-files-in targets :depth 2 :match "\\.el$"))) + (let ((target-files (doom-files-in targets :depth 1 :match "\\.el$"))) (unless target-files (if targets (message "Couldn't find any valid targets") From 8c4d8d739be87106d185c5531c284b5e65e892aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 03:06:49 +0200 Subject: [PATCH 1843/4235] Remove (provide ...) forms from package autoloads --- core/core-dispatcher.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 3c5e39ccd..879e15469 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -509,7 +509,7 @@ This should be run whenever your `doom!' block or update your packages." (when (file-exists-p file) (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\)" nil t) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\|(provide '[^\n]+\\)" nil t) (unless (nth 8 (syntax-ppss)) (replace-match "" t t))) (unless (bolp) (insert "\n")) From cc3fd3126a52b1f66ac9c08814c3299e51849e25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 11:53:52 +0200 Subject: [PATCH 1844/4235] Fix "Failed to parse X" errors from use-package use-package-handler/:after-call was (accidentally) relying on the dynamic value of `name`, but now that use-package uses lexical binding, this isn't possible anymore, causes errors. --- core/core-modules.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 3c84a9e32..570373fc7 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -164,7 +164,7 @@ non-nil, return paths of possible modules, activated or otherwise." ;; Adds the :after-call custom keyword to `use-package' (and consequently, ;; `def-package!'). :after-call takes a symbol or list of symbols. These symbols -;; can be functions to hook variables. +;; can be functions or hook variables. ;; ;; (use-package X :after-call find-file-hook) ;; @@ -180,20 +180,20 @@ non-nil, return paths of possible modules, activated or otherwise." (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) - (defun use-package-handler/:after-call (name-symbol _keyword hooks rest state) - (let ((fn (intern (format "doom|transient-hook--load-%s" name-symbol))) + (defun use-package-handler/:after-call (name _keyword hooks rest state) + (let ((fn (intern (format "doom|transient-hook--load-%s" name))) (hooks (delete-dups hooks))) (if (plist-get state :demand) (use-package-process-keywords name rest state) (use-package-concat `((fset ',fn (lambda (&rest _) - (require ',name-symbol) - (dolist (hook (cdr (assq ',name-symbol doom--deferred-packages-alist))) + (require ',name) + (dolist (hook (cdr (assq ',name doom--deferred-packages-alist))) (if (functionp hook) (advice-remove hook #',fn) (remove-hook hook #',fn))) - (map-delete doom--deferred-packages-alist ',name-symbol) + (map-delete doom--deferred-packages-alist ',name) (fmakunbound ',fn)))) (cl-mapcan (lambda (hook) (if (functionp hook) @@ -201,8 +201,8 @@ non-nil, return paths of possible modules, activated or otherwise." `((add-hook ',hook #',fn)))) hooks) `((map-put doom--deferred-packages-alist - ',name-symbol - '(,@hooks ,@(cdr (assq name-symbol doom--deferred-packages-alist))))) + ',name + '(,@hooks ,@(cdr (assq name doom--deferred-packages-alist))))) (use-package-process-keywords name rest state)))))) From da6ce8e3f905ec6c2097720625ff96227165486a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 13:57:03 +0200 Subject: [PATCH 1845/4235] Fix over-aggressive theme reloading `display-graphic-p` returns a boolean (possibly a recent change in Emacs 27), which will never match any window system, causing the theme to be reloaded on every new frame. Also default doom-last-window-system to initial-window-system. --- core/core-ui.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 0b1acb401..4ad92a1a2 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -546,7 +546,8 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defvar doom-last-window-system (if (daemonp) 'daemon window-system) +(defvar doom-last-window-system + (if (daemonp) 'daemon initial-window-system) "The `window-system' of the last frame. If this doesn't match the current frame's window-system, the theme will be reloaded.") @@ -588,7 +589,7 @@ frame's window-system, the theme will be reloaded.") (defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." (when (and (framep frame) - (not (eq doom-last-window-system (display-graphic-p frame)))) + (not (eq doom-last-window-system (framep-on-display frame)))) (with-selected-frame frame (doom|init-theme)) (setq doom-last-window-system (display-graphic-p frame)))) From 2908a6389e3a9c427cbc35a5f70ef19ec01fd71e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 13:59:04 +0200 Subject: [PATCH 1846/4235] Fix font loading in daemon-spawned frames set-face-attribute wasn't reliable for changing the fixed-pitch and variable-pitch faces. custom-set-faces uses a custom, internal user theme that has the highest precedence, making this the superior choice for default font-setting. --- core/core-ui.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 4ad92a1a2..a185d6b37 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -555,16 +555,16 @@ frame's window-system, the theme will be reloaded.") "Initialize fonts." (condition-case-unless-debug ex (progn - (when (fontp doom-font) - (map-put default-frame-alist 'font (font-xlfd-name doom-font)) - (set-face-attribute 'fixed-pitch nil :font doom-font)) + (custom-set-faces + (when (fontp doom-font) + (map-put default-frame-alist 'font (font-xlfd-name doom-font)) + `(fixed-pitch ((t (:font ,doom-font))))) + (when (fontp doom-variable-pitch-font) + `(variable-pitch ((t (:font ,doom-variable-pitch-font)))))) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) (setq use-default-font-for-symbols nil) - (set-fontset-font t 'unicode doom-unicode-font nil)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font))) + (set-fontset-font t 'unicode doom-unicode-font nil))) ('error (if (string-prefix-p "Font not available: " (error-message-string ex)) (lwarn 'doom-ui :warning From b2b6ff67f28f3b9f9b7d170d3b547fac39891eed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 14:01:25 +0200 Subject: [PATCH 1847/4235] Prevent treemacs from creating ~/.emacs.d/.cache Alexander-Miller/treemacs#212 introduced treemacs-persist-file, which we now use instead of tools/treemacs' old treemacs-persistence hack (which didn't work). Relevant to #669 --- modules/ui/treemacs/config.el | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 87e1c4761..8b17a8893 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -9,18 +9,9 @@ treemacs-indentation 2 treemacs-sorting 'alphabetic-desc treemacs-show-hidden-files t - treemacs-goto-tag-strategy 'refetch-index) - - -(after! treemacs-persistence - (setq treemacs--persist-file (concat doom-cache-dir "treemacs-persist")) - - ;; Because `treemacs--persist-file' is defined with `defconst' and used - ;; immediately afterwards, it cannot be easily customized before - ;; `treemacs--restore' uses its value. So, we call it a second time so the - ;; customization can take effect. - (unless (featurep 'treemacs) - (treemacs--restore))) + treemacs-goto-tag-strategy 'refetch-index + ;; for `treemacs-persistence' + treemacs-persist-file (concat doom-cache-dir "treemacs-persist")) (after! treemacs From f44ebbb7ed5d7011a5a05e62780e761fe1403bdd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:46:31 +0200 Subject: [PATCH 1848/4235] Refactor autoload generator, plus autodef support Soon, autodefs will replace settings (i.e. def-setting! & set!). This refactor prepares for it. --- core/core-dispatcher.el | 288 ++++++++++++++++++++++++++-------------- 1 file changed, 189 insertions(+), 99 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 879e15469..a23b93b02 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -330,6 +330,10 @@ one wants that.") it exists." (cl-check-type file string) (when (file-exists-p file) + (when-let* ((buf (find-buffer-visiting doom-autoload-file))) + (with-current-buffer buf + (set-buffer-modified-p nil)) + (kill-buffer buf)) (delete-file file) (ignore-errors (delete-file (byte-compile-dest-file file))) (message "Deleted old %s" (file-name-nondirectory file)))) @@ -372,7 +376,103 @@ even if it doesn't need reloading!" (doom//reload-doom-autoloads force-p) (doom//reload-package-autoloads force-p))))) -(defvar generated-autoload-load-name) + +;; +;; Doom autoloads +;; + +(defun doom--generate-header (func) + (goto-char (point-min)) + (insert ";; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `" (symbol-name func) "', DO NOT EDIT !!\n\n")) + +(defun doom--generate-autoloads (targets) + (require 'autoload) + (dolist (file targets) + (let* ((file (file-truename file)) + (generated-autoload-file doom-autoload-file) + (generated-autoload-load-name (file-name-sans-extension file)) + (noninteractive (not doom-debug-mode)) + autoload-timestamps) + (print! + (cond ((not (doom-file-cookie-p file)) + "⚠ Ignoring %s") + ((autoload-generate-file-autoloads file (current-buffer)) + (yellow "✕ Nothing in %%s")) + ((green "✓ Scanned %%s"))) + (if (file-in-directory-p file default-directory) + (file-relative-name file) + (abbreviate-file-name file)))))) + +(defun doom--expand-autoloads () + (let ((load-path (append doom-modules-dirs load-path)) + cache) + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + (replace-match + (or (cdr (assoc path cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path (abbreviate-file-name libpath)) cache) + libpath) + path) + t t nil 1))))) + +(defun doom--generate-autodefs (targets enabled-targets) + (goto-char (point-max)) + (search-backward ";;;***" nil t) + (save-excursion (insert "\n")) + (dolist (path targets) + (insert + (with-temp-buffer + (insert-file-contents path) + (let ((member-p (or (member path enabled-targets) + (file-in-directory-p path doom-core-dir))) + forms sexp cond) + (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) + (setq sexp (sexp-at-point) + cond (match-string 1)) + (when cond + (setq cond (read cond))) + (let* ((type (car sexp)) + (name (nth 1 sexp)) + (arglist (nth 2 sexp)) + (docstring (format "(Actually defined in %s)\n\n%s" + (abbreviate-file-name path) + (if (stringp (nth 3 sexp)) (nth 3 sexp) "No docstring"))) + (body (cdddr (if (stringp (nth 3 sexp)) (cdr sexp) sexp)))) + (cond ((not (memq type '(defun defmacro cl-defun cl-defmacro))) + (message "Ignoring invalid autodef %s (found %s)" + name type)) + ((and member-p + (or (null cond) + (eval cond t))) + (push (if (memq type '(defmacro cl-defmacro)) + sexp + (make-autoload sexp path)) + forms)) + (sexp + (condition-case e + (push (append (list 'defmacro name arglist docstring) + (cl-loop for arg in arglist + if (and (symbolp arg) + (not (keywordp arg)) + (not (memq arg cl--lambda-list-keywords))) + collect (list 'ignore arg))) + forms) + ('error + (message "Ignoring autodef %s (%s)" + name e))))))) + (if forms + (concat (string-join (mapcar #'prin1-to-string forms) "\n") + "\n") + "")))))) + +(defun doom--cleanup-autoloads () + (goto-char (point-min)) + (when (re-search-forward "^;;\\(;[^\n]*\\| no-byte-compile: t\\)\n" nil t) + (replace-match "" t t))) + (defun doom//reload-doom-autoloads (&optional force-p) "Refreshes the autoloads.el file, specified by `doom-autoload-file', if necessary (or if FORCE-P is non-nil). @@ -384,18 +484,25 @@ Emacs where to find lazy-loaded functions. This should be run whenever your `doom!' block, or a module autoload file, is modified." (interactive) - (let ((default-directory doom-emacs-dir) - (targets - (file-expand-wildcards - (expand-file-name "autoload/*.el" doom-core-dir)))) - (dolist (path (doom-module-load-path)) - (let ((auto-dir (expand-file-name "autoload" path)) - (auto-file (expand-file-name "autoload.el" path))) + (let* ((default-directory doom-emacs-dir) + (doom-modules (doom-modules)) + (targets + (file-expand-wildcards + (expand-file-name "autoload/*.el" doom-core-dir))) + (enabled-targets (copy-sequence targets)) + case-fold-search) + (dolist (path (doom-module-load-path t)) + (let* ((auto-dir (expand-file-name "autoload" path)) + (auto-file (expand-file-name "autoload.el" path)) + (module (doom-module-from-path auto-file)) + (module-p (or (doom-module-p (car module) (cdr module)) + (file-equal-p path doom-private-dir)))) (when (file-exists-p auto-file) - (push auto-file targets)) - (when (file-directory-p auto-dir) - (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) - (push file targets))))) + (push auto-file targets) + (if module-p (push auto-file enabled-targets))) + (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) + (push file targets) + (if module-p (push file enabled-targets))))) (if (and (not force-p) (not doom-emacs-changed-p) (file-exists-p doom-autoload-file) @@ -404,65 +511,70 @@ modified." (not (cl-loop for file in targets if (file-newer-than-file-p file doom-autoload-file) return t))) - (ignore (print! (green "Doom core autoloads is up-to-date")) - (doom-initialize-autoloads doom-autoload-file)) + (progn (print! (green "Doom core autoloads is up-to-date")) + (doom-initialize-autoloads doom-autoload-file) + nil) (doom-delete-autoloads-file doom-autoload-file) - ;; in case the buffer is open somewhere and modified - (when-let* ((buf (find-buffer-visiting doom-autoload-file))) - (with-current-buffer buf - (set-buffer-modified-p nil)) - (kill-buffer buf)) (message "Generating new autoloads.el") - (dolist (file (nreverse targets)) - (let* ((file (file-truename file)) - (generated-autoload-load-name (file-name-sans-extension file)) - (noninteractive (not doom-debug-mode))) - (print! - (cond ((not (doom-file-cookie-p file)) - "⚠ Ignoring %s") - ((update-file-autoloads file nil doom-autoload-file) - (yellow "✕ Nothing in %%s")) - ((green "✓ Scanned %%s"))) - (if (file-in-directory-p file default-directory) - (file-relative-name file) - (abbreviate-file-name file))))) (make-directory (file-name-directory doom-autoload-file) t) - (let ((buf (find-file-noselect doom-autoload-file t)) - case-fold-search) - (unwind-protect - (with-current-buffer buf - (goto-char (point-min)) - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-doom-autoloads', DO NOT EDIT !!\n\n") - (save-excursion - ;; Replace autoload paths (only for module autoloads) with - ;; absolute paths for faster resolution during load and - ;; simpler `load-path' - (let ((load-path (append doom-modules-dirs load-path)) - cache) - (save-excursion - (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) - (let ((path (match-string 1))) - (replace-match - (or (cdr (assoc path cache)) - (when-let* ((libpath (locate-library path)) - (libpath (file-name-sans-extension libpath))) - (push (cons path (abbreviate-file-name libpath)) cache) - libpath) - path) - t t nil 1))) - (print! (green "✓ Autoload paths expanded"))))) - ;; Remove byte-compile inhibiting file variables so we can - ;; byte-compile the file. - (when (re-search-forward "^;; no-byte-compile: t\n" nil t) - (replace-match "" t t)) - ;; Byte compile it to give the file a chance to reveal errors. - (save-buffer) - (doom--byte-compile-file doom-autoload-file) - (when (and noninteractive (not (daemonp))) - (doom--server-load doom-autoload-file)) - t) - (kill-buffer buf)))))) + (with-temp-file doom-autoload-file + (doom--generate-header 'doom//reload-doom-autoloads) + (save-excursion + (doom--generate-autoloads (reverse enabled-targets))) + ;; Replace autoload paths (only for module autoloads) with absolute + ;; paths for faster resolution during load and simpler `load-path' + (save-excursion + (doom--expand-autoloads) + (print! (green "✓ Expanded module autoload paths"))) + ;; Generates stub definitions for functions/macros defined in disabled + ;; modules, so that you will never get a void-function when you use + ;; them. + (save-excursion + (doom--generate-autodefs (reverse targets) enabled-targets)) + ;; Remove byte-compile inhibiting file variables so we can byte-compile + ;; the file, and autoload comments. + (doom--cleanup-autoloads) + (print! (green "✓ Clean up autoloads"))) + ;; Byte compile it to give the file a chance to reveal errors. + (doom--byte-compile-file doom-autoload-file) + (when (and noninteractive (not (daemonp))) + (doom--server-load doom-autoload-file)) + t))) + + +;; +;; Package autoloads +;; + +(defun doom--generate-package-autoloads () + (dolist (spec (doom-get-package-alist)) + (if-let* ((pkg (car spec)) + (desc (cdr spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file (concat (package--autoloads-file-name desc) ".el"))) + (when (file-exists-p file) + (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\|(provide '[^\n]+\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n")))) + (message "Couldn't find package desc for %s" (car spec))))) + +(defun doom--generate-var-cache () + (doom-initialize-packages) + (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer))) + +(defun doom--cleanup-package-autoloads () + (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) + (goto-char (match-beginning 1)) + (kill-sexp))) (defun doom//reload-package-autoloads (&optional force-p) "Compiles `doom-package-autoload-file' from the autoloads files of all @@ -485,43 +597,21 @@ This should be run whenever your `doom!' block or update your packages." return t)))) (ignore (print! (green "Doom package autoloads is up-to-date")) (doom-initialize-autoloads doom-package-autoload-file)) - (doom-delete-autoloads-file doom-package-autoload-file) - (with-temp-file doom-package-autoload-file - (insert ";;; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `doom//reload-package-autoloads', DO NOT EDIT !!\n\n") - (let (case-fold-search) + (let (case-fold-search) + (doom-delete-autoloads-file doom-package-autoload-file) + (with-temp-file doom-package-autoload-file + (doom--generate-header 'doom//reload-package-autoloads) (save-excursion ;; Cache the important and expensive-to-initialize state here. - (doom-initialize-packages) - (prin1 `(setq load-path ',load-path - auto-mode-alist ',auto-mode-alist - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages - package-activated-list ',package-activated-list) - (current-buffer)) + (doom--generate-var-cache) (print! (green "✓ Cached package state")) - ;; insert package autoloads - (dolist (spec (doom-get-package-alist)) - (if-let* ((pkg (car spec)) - (desc (cdr spec))) - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file (concat (package--autoloads-file-name desc) ".el"))) - (when (file-exists-p file) - (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") - (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\|(provide '[^\n]+\\)" nil t) - (unless (nth 8 (syntax-ppss)) - (replace-match "" t t))) - (unless (bolp) (insert "\n")) - (insert ")\n")))) - (print! (yellow "⚠ Couldn't find package desc for %s" (car spec)))))) - (print! (green "✓ Package autoloads included")) + ;; Loop through packages and concatenate all their autoloads files. + (doom--generate-package-autoloads) + (print! (green "✓ Package autoloads included"))) ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, ;; at least); they are cached later, so all those membership checks are ;; unnecessary overhead. - (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) - (goto-char (match-beginning 1)) - (kill-sexp)) + (doom--cleanup-package-autoloads) (print! (green "✓ Removed load-path/auto-mode-alist entries")))) (doom--byte-compile-file doom-package-autoload-file) (when (and noninteractive (not (daemonp))) From 04ec62c8f22d3d9f2f7ddc8e62f29112a0f035f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:49:03 +0200 Subject: [PATCH 1849/4235] General, minor refactor & feedback revision --- core/core-dispatcher.el | 10 ++++++---- core/core-modules.el | 3 +-- core/core-packages.el | 3 +-- core/core.el | 1 + core/templates/QUICKSTART_INTRO | 10 +++++----- init.example.el | 2 +- 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index a23b93b02..229fc361a 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -632,10 +632,12 @@ If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom core. It always ignores unit tests and files with `no-byte-compile' enabled. -Doom was designed to benefit from byte-compilation, but the process may take a -while. Also, while your config files are byte-compiled, changes to them will not -take effect! Use `doom//clean-byte-compiled-files' or `make clean' to remove -these files. +WARNING: byte-compilation yields marginal gains and makes debugging new issues +difficult. It is recommended you don't use it unless you understand the +reprecussions. + +Use `doom//clean-byte-compiled-files' or `make clean' to reverse +byte-compilation. If RECOMPILE-P is non-nil, only recompile out-of-date files." (interactive diff --git a/core/core-modules.el b/core/core-modules.el index 570373fc7..890fdbb45 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -274,8 +274,7 @@ to least)." (defmacro def-package! (name &rest plist) "A thin wrapper around `use-package'." ;; Ignore package if NAME is in `doom-disabled-packages' - (when (and (memq name (bound-and-true-p doom-disabled-packages)) - (not (memq :disabled plist))) + (when (memq name (bound-and-true-p doom-disabled-packages)) (setq plist `(:disabled t ,@plist))) ;; If byte-compiling, ignore this package if it doesn't meet the condition. ;; This avoids false-positive load errors. diff --git a/core/core-packages.el b/core/core-packages.el index d212c929b..54f4e0ef6 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -227,8 +227,7 @@ elsewhere." doom-private-dir) (setq plist (plist-put plist :private t))) `(progn - ,(when (and pkg-pin t) - `(map-put package-pinned-packages ',name ,pkg-pin)) + ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) (map-put doom-packages ',name ',plist) (not (memq ',name doom-disabled-packages))))) diff --git a/core/core.el b/core/core.el index 24714a9bd..8501332a2 100644 --- a/core/core.el +++ b/core/core.el @@ -174,6 +174,7 @@ this, you'll get stuttering and random freezes) and resets history-length 500 make-backup-files nil ; don't create backup~ files ;; `use-package' + use-package-compute-statistics doom-debug-mode use-package-verbose doom-debug-mode use-package-minimum-reported-time (if doom-debug-mode 0 0.1) ;; byte compilation diff --git a/core/templates/QUICKSTART_INTRO b/core/templates/QUICKSTART_INTRO index 61a8af0ec..bf3abef0e 100644 --- a/core/templates/QUICKSTART_INTRO +++ b/core/templates/QUICKSTART_INTRO @@ -3,7 +3,7 @@ Before you doom yourself, there are a few things you should know: 1. If you use GUI Emacs, run `M-x all-the-icons-install-fonts` so you don't get weird symbols all over the place. -2. When you edit ~/.doom.d/init.el or modify modules, run: +2. Whenever you edit ~/.doom.d/init.el or modify modules, run: bin/doom refresh @@ -15,8 +15,8 @@ Before you doom yourself, there are a few things you should know: bin/doom doctor - It will diagnose common issues with your environment and setup, and may give - you clues about what is wrong. + This will diagnose common issues with your environment and setup, and may + give you clues about what is wrong. 4. To update doom, run @@ -24,7 +24,7 @@ Before you doom yourself, there are a few things you should know: Doing it any other way will require you run `bin/doom refresh` otherwise, -5. Check out `bin/doom help` to see what else it can do (it is also safe to add - ~/.emacs.d/bin to your PATH). +5. Check out `bin/doom help` to see what else it can do (it is recommended you + add ~/.emacs.d/bin to your PATH). Have fun! diff --git a/init.example.el b/init.example.el index f5147963f..52bcb62af 100644 --- a/init.example.el +++ b/init.example.el @@ -43,7 +43,7 @@ ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows - + :editor ;parinfer ; turn lisp into python, sort of From 733ac8bed740023a624abb4cd0ebc9ed5e6542a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:49:55 +0200 Subject: [PATCH 1850/4235] Add :lang common-lisp to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 52bcb62af..37c63ef5a 100644 --- a/init.example.el +++ b/init.example.el @@ -74,6 +74,7 @@ :lang ;assembly ; assembly for fun or debugging ;cc ; C/C++/Obj-C madness + ;common-lisp ; if you've seen one lisp, you've seen them all ;crystal ; ruby at the speed of c ;clojure ; java with a lisp ;csharp ; unity, .NET, and mono shenanigans From 3228369d736aca8fcb177246506f6ca453b621ed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:50:27 +0200 Subject: [PATCH 1851/4235] Fix void-function errors from doom//reload Because certain commands aren't available without core-dispatcher. --- core/autoload/help.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/help.el b/core/autoload/help.el index 0888a78dd..2ca6c3208 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -191,6 +191,7 @@ If called from an interactive session, tries to reload autoloads files (if necessary), reinistalize doom (via `doom-initialize') and reloads your private init.el and config.el. Then runs `doom-reload-hook'." (interactive) + (require 'core-dispatcher) (cond ((and noninteractive (not (daemonp))) (require 'server) (if (not (server-running-p)) From 421d00f085d8390f8bc1c2993334be64fc588bba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:51:11 +0200 Subject: [PATCH 1852/4235] Refactor doom|check-large-file More checks, fewer false positives. --- core/core-editor.el | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b8d6ce9ed..0e7be0e69 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -49,16 +49,18 @@ successfully sets indent_style/indent_size.") "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 fundamental-mode) for performance sake." - (let ((size (nth 7 (file-attributes buffer-file-name)))) - (when (and (not (memq major-mode doom-large-file-modes-list)) - size (> size (* 1024 1024 doom-large-file-size)) - (y-or-n-p - (format (concat "%s is a large file, open literally to " - "avoid performance issues?") - (file-relative-name buffer-file-name)))) - (setq buffer-read-only t) - (buffer-disable-undo) - (fundamental-mode)))) + (when (and (not (memq major-mode doom-large-file-modes-list)) + auto-mode-alist + (get-buffer-window (current-buffer))) + (when-let* ((size (nth 7 (file-attributes buffer-file-name)))) + (when (and (> size (* 1024 1024 doom-large-file-size)) + (y-or-n-p + (format (concat "%s is a large file, open literally to " + "avoid performance issues?") + (file-relative-name buffer-file-name)))) + (setq buffer-read-only t) + (buffer-disable-undo) + (fundamental-mode))))) (add-hook 'find-file-hook #'doom|check-large-file) From 0020631b2eb77a79b5288dc451bafab4d75827be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:52:15 +0200 Subject: [PATCH 1853/4235] Fontify autodef/if cookies & *! symbols in elisp --- modules/lang/emacs-lisp/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 72d72feda..838123621 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -29,10 +29,12 @@ (defun +emacs-lisp|extra-fontification () "Display lambda as a smybol and fontify doom module functions." (font-lock-add-keywords - nil `(;; Display "lambda" as λ + nil `(;; Highlight custom Doom cookies + ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) + ;; Display "lambda" as λ ("(\\(lambda\\)" (1 (ignore (compose-region (match-beginning 1) (match-end 1) ?λ #'decompose-region)))) ;; Highlight doom/module functions - ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\)[) \n]" (2 font-lock-keyword-face))))) + ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) (defun +emacs-lisp|init-imenu () "Improve imenu support with better expression regexps and Doom-specific forms." From 6fe0017e24f48c0a815868583ee36ab281b0eb9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 19:55:36 +0200 Subject: [PATCH 1854/4235] Add popup hacks for pdf-tools' annot list windows Annotations are displayed in stacked windows to the left of the pdf. Thanks to @UndeadKernel for help figuring this out. --- modules/ui/popup/+hacks.el | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index bfa620cfb..beb11988a 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -184,6 +184,10 @@ the command buffer." (advice-add #'info-lookup-symbol :after #'+popup*switch-to-info-window) +;; `multi-term' +(setq multi-term-buffer-name "doom terminal") + + ;; `neotree' (after! neotree (advice-add #'neo-util--set-window-width :override #'ignore) @@ -244,9 +248,22 @@ instead of switch-to-buffer-*." (advice-add #'persp-load-state-from-file :after #'+popup*persp-mode-restore-popups)) -;; `multi-term' -(after! multi-term - (setq multi-term-buffer-name "doom terminal")) +;; `pdf-tools' +(after! pdf-tools + (setq tablist-context-window-display-action + '((+popup-display-buffer) + (side . left) + (slot . 2) + (window-height . 0.3) + (inhibit-same-window . t)) + pdf-annot-list-display-buffer-action + '((+popup-display-buffer) + (side . left) + (slot . 3) + (inhibit-same-window . t))) + + (add-hook 'pdf-annot-list-mode-hook #'hide-mode-line-mode) + (set! :popup "\\(^\\*Contents\\|'s annots\\*$\\)" :ignore t)) ;; `wgrep' From 209f33c12e27ee3aafa9f5baa71c533d5c4eb88c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 23:36:42 +0200 Subject: [PATCH 1855/4235] Refactor tools/eshell Make eshell-directory-name easier to customize & remove unnecessary def-package! block. --- modules/emacs/eshell/config.el | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index e8afe0b23..8f72b09ca 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -6,15 +6,19 @@ ;; + `+eshell/open-workspace': open in separate tab (requires :feature ;; workspaces) -(def-package! eshell ; built-in - :defer t - :init - (setq eshell-directory-name - (let ((dir (expand-file-name "eshell" doom-private-dir))) - (if (file-directory-p dir) - dir - "~/.eshell")) - eshell-scroll-to-bottom-on-input 'all +(defvar eshell-directory-name + (let ((dir (expand-file-name "eshell" doom-private-dir))) + (if (file-directory-p dir) + dir + "~/.eshell"))) + + +;; +;; Plugins +;; + +(after! eshell ; built-in + (setq eshell-scroll-to-bottom-on-input 'all eshell-scroll-to-bottom-on-output 'all eshell-buffer-shorthand t eshell-kill-processes-on-exit t @@ -27,7 +31,6 @@ eshell-glob-case-insensitive t eshell-error-if-no-glob t) - :config ;; Consider eshell buffers real (add-hook 'eshell-mode-hook #'doom|mark-buffer-as-real) From 40e4c872f49e271804efe8b9efb6a6f047417d7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Jun 2018 23:40:08 +0200 Subject: [PATCH 1856/4235] Remove redundant eshell-error-if-no-glob setting --- modules/emacs/eshell/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 8f72b09ca..8c4108b3e 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -22,7 +22,6 @@ eshell-scroll-to-bottom-on-output 'all eshell-buffer-shorthand t eshell-kill-processes-on-exit t - eshell-error-if-no-glob t eshell-hist-ignoredups t ;; em-prompt eshell-prompt-regexp "^.* λ " From db8b4091dde423ee97a5a403ffc1a2cfda050d85 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 00:25:20 +0200 Subject: [PATCH 1857/4235] Fix bin/doom ignoring -d flag defconst -> defvar --- core/core.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index 8501332a2..33421040b 100644 --- a/core/core.el +++ b/core/core.el @@ -5,6 +5,10 @@ (error "Detected Emacs %s. Doom only supports Emacs 25.1 and higher" emacs-version))) +(defvar doom-debug-mode (or (getenv "DEBUG") init-file-debug) + "If non-nil, all doom functions will be verbose. Set DEBUG=1 in the command +line or use --debug-init to enable this.") + ;; ;; Constants @@ -13,10 +17,6 @@ (defconst doom-version "2.0.9" "Current version of DOOM emacs.") -(defconst doom-debug-mode (or (getenv "DEBUG") init-file-debug) - "If non-nil, all doom functions will be verbose. Set DEBUG=1 in the command -line or use --debug-init to enable this.") - (defconst EMACS26+ (eval-when-compile (not (version< emacs-version "26")))) (defconst EMACS27+ From 6693db48afca69437a7fa44158d33bb6a51a3539 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 00:45:26 +0200 Subject: [PATCH 1858/4235] Mark +org-dir obsolete (use org-directory instead) I prefer not to invent new variables when they aren't strictly necessary. org-directory is one such variable (although the other path variables are still necessary). --- modules/app/rss/autoload.el | 2 +- modules/app/rss/config.el | 6 +++--- modules/config/default/autoload/default.el | 4 ++-- modules/lang/org/+attach.el | 16 ++++++++-------- modules/lang/org/+capture.el | 6 ++---- modules/lang/org/+export.el | 8 ++++---- modules/lang/org/autoload/org-attach.el | 10 +++++----- modules/lang/org/config.el | 11 +++++------ 8 files changed, 30 insertions(+), 33 deletions(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 176f253df..ce89ef798 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -13,7 +13,7 @@ (elfeed-db-compact) (doom-kill-matching-buffers "^\\*elfeed") (dolist (file +rss-elfeed-files) - (when-let* ((buf (get-file-buffer (expand-file-name file +org-dir)))) + (when-let* ((buf (get-file-buffer (expand-file-name file org-directory)))) (kill-buffer buf)))) ;;;###autoload diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 1de35ecea..2dd134aa1 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -5,8 +5,8 @@ ;; don't care for the UI you can invoke elfeed directly with `elfeed'. (defvar +rss-elfeed-files (list "elfeed.org") - "Where to look for elfeed.org files, relative to `+org-dir'. Can be absolute -paths.") + "Where to look for elfeed.org files, relative to `org-directory'. Can be +absolute paths.") (defvar +rss-split-direction 'below "What direction to pop up the entry buffer in elfeed.") @@ -65,6 +65,6 @@ paths.") :after elfeed :config (setq rmh-elfeed-org-files - (let ((default-directory +org-dir)) + (let ((default-directory org-directory)) (mapcar #'expand-file-name +rss-elfeed-files))) (elfeed-org)) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 52943b47e..c49518f0e 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -29,10 +29,10 @@ ;;;###autoload (defun +default/browse-notes () - (interactive) (doom-project-browse +org-dir)) + (interactive) (doom-project-browse org-directory)) ;;;###autoload (defun +default/find-in-notes () - (interactive) (doom-project-find-file +org-dir)) + (interactive) (doom-project-find-file org-directory)) ;;;###autoload (defun +default/browse-snippets () diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 8c366b6d3..4f7982909 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -6,9 +6,9 @@ ;; files with metadata I don't want. So I wrote my own, which: ;; ;; + Places attachments in a centralized location (`+org-attach-dir' in -;; `+org-dir'), using an attach:* link abbreviation. -;; + Use `+org-attach/sync' to index all attachments in `+org-dir' that use the -;; attach:* abbreviation and delete orphaned ones that are no longer +;; `org-directory'), using an attach:* link abbreviation. +;; + Use `+org-attach/sync' to index all attachments in `org-directory' that use +;; the attach:* abbreviation and delete orphaned ones that are no longer ;; referenced. ;; + Adds drag-and-drop support for images (with inline image preview) ;; + Adds drag-and-drop support for media files (pdfs, zips, etc) with a @@ -21,7 +21,7 @@ ;; + `+org-attach/sync' (defvar +org-attach-dir ".attach/" - "Where to store attachments relative to `+org-dir'.") + "Where to store attachments relative to `org-directory'.") ;; @@ -55,14 +55,14 @@ (advice-add #'org-download-insert-link :override #'+org-attach*insert-link) (defun +org-attach*download-subdir () - (when (file-in-directory-p buffer-file-name +org-dir) - (file-relative-name buffer-file-name +org-dir))) + (when (file-in-directory-p buffer-file-name org-directory) + (file-relative-name buffer-file-name org-directory))) (defun +org-attach*download-fullname (path) "Write PATH relative to current file." (let ((dir (or (if buffer-file-name (file-name-directory buffer-file-name)) default-directory))) - (if (file-in-directory-p dir +org-dir) + (if (file-in-directory-p dir org-directory) (file-relative-name path dir) path))) (advice-add #'org-download--dir-2 :override #'ignore) @@ -75,7 +75,7 @@ ;; (defun +org|init-attach () - (setq org-attach-directory (expand-file-name +org-attach-dir +org-dir)) + (setq org-attach-directory (expand-file-name +org-attach-dir org-directory)) ;; A shorter link to attachments (push (cons "attach" (abbreviate-file-name org-attach-directory)) org-link-abbrev-alist) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index b8fe048b1..988b71400 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -29,10 +29,8 @@ (defun +org|init-capture () - (defvaralias 'org-default-notes-file '+org-default-notes-file) - - (setq org-default-notes-file (expand-file-name +org-default-notes-file +org-dir) - +org-default-todo-file (expand-file-name +org-default-todo-file +org-dir)) + (setq org-default-notes-file (expand-file-name +org-default-notes-file org-directory) + +org-default-todo-file (expand-file-name +org-default-todo-file org-directory)) (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index 8097283e4..975977cb0 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -23,17 +23,17 @@ (when (executable-find "pandoc") (require 'ox-pandoc)) - ;; Export to a central location by default or if target isn't in `+org-dir'. - (setq org-export-directory (expand-file-name ".export" +org-dir)) + ;; Export to a central location by default or if target isn't in `org-directory'. + (setq org-export-directory (expand-file-name ".export" org-directory)) (unless (file-directory-p org-export-directory) (make-directory org-export-directory t)) (defun +org*export-output-file-name (args) "Return a centralized export location unless one is provided or the current -file isn't in `+org-dir'." +file isn't in `org-directory'." (when (and (not (nth 2 args)) buffer-file-name - (file-in-directory-p (file-truename buffer-file-name) (file-truename +org-dir))) + (file-in-directory-p (file-truename buffer-file-name) (file-truename org-directory))) (setq args (append args (list org-export-directory)))) args) (advice-add #'org-export-output-file-name :filter-args #'+org*export-output-file-name)) diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index ad74b56b9..1eb724d7c 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -17,7 +17,7 @@ ;; (defvar +org-attachments nil - "A list of all indexed attachments in `+org-dir'.") + "A list of all indexed attachments in `org-directory'.") (defvar +org-attachments-files nil "A list of all attachments in `org-attach-directory'.") @@ -42,7 +42,7 @@ and END (defaults to `point-min' and `point-max')." ;;;###autoload (defun +org-attach/sync (arg) - "Reindex all attachments in `+org-dir' and delete orphaned attachments in + "Reindex all attachments in `org-directory' and delete orphaned attachments in `org-attach-directory'. If ARG (universal arg), conduct a dry run." (declare (interactive-only t)) (interactive "P") @@ -50,7 +50,7 @@ and END (defaults to `point-min' and `point-max')." (setq +org-attachments-files (directory-files org-attach-directory nil "^[^.]" t)) (with-temp-buffer (delay-mode-hooks (org-mode)) - (dolist (org-file (directory-files-recursively +org-dir "\\.org$")) + (dolist (org-file (directory-files-recursively org-directory "\\.org$")) (insert-file-contents-literally org-file)) (setq +org-attachments (+org-attachments--list))) ;; clean up @@ -132,8 +132,8 @@ an file icon produced by `+org-attach--icon')." (format "#+attr_latex: :width %dcm\n" org-download-image-latex-width)) (cond ((file-in-directory-p filename org-attach-directory) (format "[[attach:%s]]" (file-relative-name filename org-attach-directory))) - ((file-in-directory-p filename +org-dir) - (format org-download-link-format (file-relative-name filename +org-dir))) + ((file-in-directory-p filename org-directory) + (format org-download-link-format (file-relative-name filename org-directory))) (t (format org-download-link-format filename))))) (org-display-inline-images)) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 7d7679bb2..37e4fe4dd 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -1,7 +1,9 @@ ;;; lang/org/config.el -*- lexical-binding: t; -*- -(defvar +org-dir (expand-file-name "~/org/") - "The directory where org files are kept.") +;; FIXME deprecated +(define-obsolete-variable-alias '+org-dir 'org-directory "2.1.0") + +(defvar org-directory "~/org/") ;; Sub-modules (if (featurep! +attach) (load! "+attach")) @@ -61,9 +63,6 @@ +org|unfold-to-2nd-level-or-point +org|show-paren-mode-compatibility)) -(after! org - (defvaralias 'org-directory '+org-dir)) - ;; ;; `org-mode' hooks @@ -240,7 +239,7 @@ unfold to point on startup." 'org-link 'error))))) - (def-org-file-link! "org" +org-dir) + (def-org-file-link! "org" org-directory) (def-org-file-link! "doom" doom-emacs-dir) (def-org-file-link! "doom-docs" doom-docs-dir) (def-org-file-link! "doom-modules" doom-modules-dir) From d8b1e469bc0f3137b2e9258899e531bee4b7c9dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 02:58:12 +0200 Subject: [PATCH 1859/4235] Introduce autodefs to replace some settings + :popup -> set-popup-rule! + :popups -> set-popup-rules! + :company-backend -> set-company-backend! + :evil-state -> set-evil-initial-state! I am slowly phasing out the setting system (def-setting! and set!), starting with these. What are autodefs? These are functions that are always defined, whether or not their respective modules are enabled. However, when their modules are disabled, they are replaced with macros that no-op and don't waste time evaluating their arguments. The old set! function will still work, for a while. --- core/core-modules.el | 14 ++- modules/app/regex/config.el | 11 +- modules/app/rss/config.el | 2 +- modules/app/twitter/config.el | 2 +- modules/completion/company/autoload.el | 33 +++--- modules/completion/helm/config.el | 2 +- modules/completion/ivy/config.el | 2 +- modules/emacs/imenu/config.el | 2 +- modules/feature/debugger/config.el | 2 +- modules/feature/eval/config.el | 2 +- modules/feature/evil/autoload/evil.el | 18 ++- modules/feature/evil/config.el | 5 +- modules/feature/file-templates/autoload.el | 20 +++- modules/feature/version-control/+git.el | 2 +- modules/feature/version-control/config.el | 11 +- modules/lang/cc/config.el | 7 +- modules/lang/clojure/config.el | 2 +- modules/lang/csharp/config.el | 2 +- modules/lang/data/config.el | 3 +- modules/lang/elixir/config.el | 27 +++-- modules/lang/elm/config.el | 2 +- modules/lang/go/config.el | 2 +- modules/lang/haskell/+dante.el | 2 +- modules/lang/hy/config.el | 2 +- modules/lang/java/+eclim.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/latex/config.el | 4 +- modules/lang/lua/config.el | 2 +- modules/lang/ocaml/config.el | 2 +- modules/lang/org/+babel.el | 26 ++--- modules/lang/org/config.el | 26 ++--- modules/lang/php/config.el | 4 +- modules/lang/plantuml/config.el | 2 +- modules/lang/python/config.el | 6 +- modules/lang/rest/config.el | 4 +- modules/lang/ruby/config.el | 4 +- modules/lang/rust/config.el | 2 +- modules/lang/scala/config.el | 2 +- modules/lang/sh/config.el | 2 +- modules/lang/solidity/config.el | 2 +- modules/lang/swift/config.el | 2 +- modules/lang/web/+css.el | 4 +- modules/lang/web/+html.el | 9 +- modules/tools/ein/config.el | 17 +-- modules/tools/gist/config.el | 2 +- modules/tools/magit/config.el | 2 +- modules/tools/password-store/config.el | 4 +- modules/tools/pdf/config.el | 6 +- modules/tools/prodigy/config.el | 2 +- modules/ui/neotree/config.el | 2 +- modules/ui/popup/+hacks.el | 2 +- .../popup/{autoload.el => autoload/popup.el} | 73 +----------- modules/ui/popup/autoload/settings.el | 107 ++++++++++++++++++ modules/ui/popup/config.el | 76 ++++++------- 54 files changed, 329 insertions(+), 248 deletions(-) rename modules/ui/popup/{autoload.el => autoload/popup.el} (91%) create mode 100644 modules/ui/popup/autoload/settings.el diff --git a/core/core-modules.el b/core/core-modules.el index 890fdbb45..3bd05ccd6 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -357,7 +357,7 @@ omitted. eg. (featurep! +flag1)" ;; -;; Cross-module configuration +;; Cross-module configuration (DEPRECATED) ;; ;; I needed a way to reliably cross-configure modules without littering my @@ -375,8 +375,16 @@ Do not use this for configuring Doom core." (declare (indent defun) (doc-string 3)) (or (keywordp keyword) (signal 'wrong-type-argument (list 'keywordp keyword))) - `(fset ',(intern (format "doom--set%s" keyword)) - (lambda ,arglist ,docstring ,@forms))) + (let ((alias (plist-get forms :obsolete))) + (when alias + (setq forms (plist-put forms :obsolete 'nil))) + `(fset ',(intern (format "doom--set%s" keyword)) + (lambda ,arglist ,docstring + (prog1 (progn ,@forms) + ,(when alias + `(unless noninteractive + (message ,(format "The `%s' setting is deprecated, use `%s' instead" + keyword alias))))))))) (defmacro set! (keyword &rest values) "Set an option defined by `def-setting!'. Skip if doesn't exist. See diff --git a/modules/app/regex/config.el b/modules/app/regex/config.el index ba3912e35..539297e46 100644 --- a/modules/app/regex/config.el +++ b/modules/app/regex/config.el @@ -46,8 +46,11 @@ http://regexr.com/foo.html?q=bar https://mediatemple.net" "TODO") -(set! :popup "^\\*doom-regex\\*$" '((size . 4)) '((quit))) -(set! :popup "^\\*doom-regex-groups" - '((side . left) (size . 28)) - '((select) (quit))) +(set-popup-rules! + '(("^\\*doom-regex\\*$" + ((size . 4)) + ((quit))) + ("^\\*doom-regex-groups" + ((side . left) (size . 28)) + ((select) (quit))))) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 2dd134aa1..4710079e5 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -26,7 +26,7 @@ absolute paths.") elfeed-show-entry-delete #'+rss/delete-pane shr-max-image-proportion 0.6) - (set! :popup "^\\*elfeed-entry" + (set-popup-rule! "^\\*elfeed-entry" '((size . 0.75) (side . bottom)) '((select . t) (quit) (transient . t))) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index 4238172e0..ed7075592 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -25,7 +25,7 @@ twittering-initial-timeline-spec-string '(":home" ":mentions" ":direct_messages")) - (set! :popup "^\\*twittering-edit" + (set-popup-rule! "^\\*twittering-edit" '((size . 15)) '((transient) (quit) (select . t))) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index ac35aa3e5..9ab318d44 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -1,23 +1,30 @@ ;;; completion/company/autoload.el -*- lexical-binding: t; -*- +;;;###autodef +(defun set-company-backend! (modes &rest backends) + "Prepends BACKENDS to `company-backends' in major MODES. + +MODES should be one major-mode symbol or a list of them." + (cl-loop for mode in modes + for def-name = (intern (format "doom--init-company-%s" mode)) + do + (fset def-name + (lambda () (when (or (eq major-mode mode) + (and (boundp mode) (symbol-value mode))) + (require 'company) + (make-variable-buffer-local 'company-backends) + (dolist (backend backends) + (cl-pushnew backend company-backends :test #'equal))))) + and do (add-hook (intern (format "%s-hook" mode)) def-name))) + +;; FIXME obsolete :company-backend ;;;###autoload (def-setting! :company-backend (modes &rest backends) "Prepends BACKENDS to `company-backends' in major MODES. MODES should be one major-mode symbol or a list of them." - `(progn - ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) - for def-name = (intern (format "doom--init-company-%s" mode)) - collect - `(defun ,def-name () - (when (and (or (eq major-mode ',mode) - (bound-and-true-p ,mode)) - ,(not (eq backends '(nil)))) - (require 'company) - (make-variable-buffer-local 'company-backends) - (dolist (backend (list ,@(reverse backends))) - (cl-pushnew backend company-backends :test #'equal)))) - collect `(add-hook! ,mode #',def-name)))) + :obsolete set-company-backend! + `(set-company-backend! ,modes ,@backends)) ;;;###autoload (defun +company/toggle-auto-completion () diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 7d137e6d9..ae0b5b5c1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -117,7 +117,7 @@ ;; `helm-ag' (after! helm-ag (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) - (set! :popup "^\\*helm-ag-edit" + (set-popup-rule! "^\\*helm-ag-edit" '((size . 0.35)) '((transient . 0) (quit)))) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index b616f7da2..b2d697f49 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -86,7 +86,7 @@ immediately runs it on the current candidate (ending the ivy session)." [remap swiper] #'counsel-grep-or-swiper) :config - (set! :popup "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) + (set-popup-rule! "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)" ;; Add smart-casing and compressed archive searching (-zS) to default diff --git a/modules/emacs/imenu/config.el b/modules/emacs/imenu/config.el index 4aff311db..37cd79361 100644 --- a/modules/emacs/imenu/config.el +++ b/modules/emacs/imenu/config.el @@ -7,7 +7,7 @@ (after! imenu-list (setq imenu-list-idle-update-delay 0.5) - (set! :popup "^\\*Ilist" + (set-popup-rule! "^\\*Ilist" '((side . right) (size . 35)) '((quit . current) (select) (transient . 0))) diff --git a/modules/feature/debugger/config.el b/modules/feature/debugger/config.el index 78660ffa8..77d0858e2 100644 --- a/modules/feature/debugger/config.el +++ b/modules/feature/debugger/config.el @@ -3,7 +3,7 @@ (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (set! :popup "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" + (set-popup-rule! "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" '((size . 20))) ;; TODO Temporary Ex commands for the debugger diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 1549eacb8..53545e4f0 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -17,7 +17,7 @@ :config (setq quickrun-focus-p nil) - (set! :popup "^\\*quickrun" '((size . 0.3)) '((transient . 0))) + (set-popup-rule! "^\\*quickrun" '((size . 0.3)) '((transient . 0))) (defun +eval*quickrun-auto-close (&rest _) "Allows us to silently re-run quickrun from within the quickrun buffer." diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 20fd27355..42fda391a 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -1,15 +1,21 @@ ;; feature/evil/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) +;;;###autodef +(defun set-evil-initial-state! (modes state) + "Set the initialize STATE of MODE using `evil-set-initial-state'." + (after! evil + (if (listp modes) + (dolist (mode modes) + (evil-set-initial-state mode state)) + (evil-set-initial-state modes state)))) + +;; FIXME obsolete :evil-state ;;;###autoload (def-setting! :evil-state (modes state) "Set the initialize STATE of MODE using `evil-set-initial-state'." - (let ((unquoted-modes (doom-unquote modes))) - (if (listp unquoted-modes) - `(progn - ,@(cl-loop for mode in unquoted-modes - collect `(evil-set-initial-state ',mode ,state))) - `(evil-set-initial-state ,modes ,state)))) + :obsolete set-evil-initial-state! + `(set-evil-initial-state! ,modes ,state)) ;; diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 48038f748..5b932d71f 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -66,8 +66,9 @@ variable for an explanation of the defaults (in comments). See (put 'evil-define-key* 'lisp-indent-function 'defun) - (set! :popup "^\\*evil-registers" '((size . 0.3))) - (set! :popup "^\\*Command Line" '((size . 8))) + (set-popup-rules! + '(("^\\*evil-registers" ((size . 0.3))) + ("^\\*Command Line" ((size . 8))))) ;; Change the cursor color in emacs mode (defvar +evil--default-cursor-color "#ffffff") diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 649801d02..4cd82e4ff 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -1,7 +1,7 @@ ;;; feature/file-templates/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(def-setting! :file-template (pred &rest plist) +;;;###autodef +(defun set-file-template! (pred &rest plist) "Register a file template. PRED can either be a regexp string or a major mode symbol. PLIST may contain @@ -24,11 +24,23 @@ these properties: file template rule against this buffer." `(push (list ,pred ,@plist) +file-templates-alist)) -;;;###autoload -(def-setting! :file-templates (&rest templates) +;;;###autodef +(defun set-file-templates! (&rest templates) "Like `doom--set:file-template', but register many file templates at once." `(setq +file-templates-alist (append (list ,@templates) +file-templates-alist))) +;; FIXME obsolete :file-template +;;;###autoload +(def-setting! :file-template (pred &rest plist) + :obsolete set-file-template! + `(set-file-template! ,pred ,@plist)) + +;; FIXME obsolete :file-templates +;;;###autoload +(def-setting! :file-templates (&rest templates) + :obsolete set-file-templates! + `(set-file-templates! ,@templates)) + ;; ;; Library diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index b61708d5f..534649369 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -20,7 +20,7 @@ (git-gutter-mode +1))) (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) :config - (set! :popup "^\\*git-gutter" nil '((select))) + (set-popup-rule! "^\\*git-gutter" nil '((select))) ;; Update git-gutter on focus (in case I was using git externally) (add-hook 'focus-in-hook #'git-gutter:update-all-windows) diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index 646517675..353daedbd 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -11,11 +11,12 @@ (after! vc-annotate - (set! :popup "^\\vc-d" nil '((select))) ; *vc-diff* - (set! :popup "^\\vc-c" nil '((select . t))) ; *vc-change-log* - - (set! :evil-state 'vc-annotate-mode 'normal) - (set! :evil-state 'vc-git-log-view-mode 'normal)) + (set-popup-rules! + '(("^\\vc-d" nil ((select))) ; *vc-diff* + ("^\\vc-c" nil ((select . t))))) ; *vc-change-log* + (set-evil-initial-state! + '(vc-annotate-mode vc-git-log-view-mode) + 'normal)) (def-package! smerge-mode :hook (find-file . +vcs|enable-smerge-mode-maybe) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index db232e707..3d4d4684c 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -156,7 +156,7 @@ compilation database is present in the project.") (def-package! company-irony :when (featurep! :completion company) :init - (set! :company-backend + (set-company-backend! '(c-mode c++-mode objc-mode) '(:separate company-irony-c-headers company-irony)) :config @@ -168,7 +168,8 @@ compilation database is present in the project.") ;; ;; `cmake-mode' -(set! :company-backend 'cmake-mode '(company-cmake company-yasnippet)) +(after! cmake-mode + (set-company-backend! 'cmake-mode '(company-cmake company-yasnippet))) (def-package! company-cmake :when (featurep! :completion company) @@ -183,7 +184,7 @@ compilation database is present in the project.") (def-package! company-glsl :when (featurep! :completion company) :after glsl-mode - :config (set! :company-backend 'glsl-mode '(company-glsl))) + :config (set-company-backend! 'glsl-mode '(company-glsl))) ;; diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 30b93c398..729fc7b8c 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -30,7 +30,7 @@ (figwheel-sidecar.repl-api/start-figwheel!) (figwheel-sidecar.repl-api/cljs-repl))") - (set! :popup "^\\*cider-repl" nil '((quit) (select))) + (set-popup-rule! "^\\*cider-repl" nil '((quit) (select))) (set! :repl 'clojure-mode #'+clojure/repl) (set! :eval 'clojure-mode #'cider-eval-region) (set! :lookup 'clojure-mode diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index ef54fe1c1..322cd3d8d 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -18,7 +18,7 @@ (omnisharp-stop-server))) (add-hook! csharp-mode (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) - (set! :company-backend 'csharp-mode '(company-omnisharp)) + (set-company-backend! 'csharp-mode '(company-omnisharp)) (set! :lookup 'csharp-mode :definition #'omnisharp-go-to-definition diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index a7a8424f8..d7f448334 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -6,7 +6,8 @@ ("\\.plist\\'" . nxml-mode))) (map-put auto-mode-alist (car spec) (cdr spec))) -(set! :company-backend 'nxml-mode '(company-nxml company-yasnippet)) +(after! nxml-mode + (set-company-backend! 'nxml-mode '(company-nxml company-yasnippet))) ;; diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 6afd25471..b5184ba2d 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -12,7 +12,19 @@ :skip-match 'sp-elixir-skip-def-p :post-handlers '("||\n[i]")) (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) - (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p))))) + (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) + + (def-package! alchemist-company + :when (featurep! :completion company) + :commands alchemist-company + :init + (set-company-backend! 'elixir-mode '(alchemist-company company-yasnippet)) + :config + ;; Alchemist doesn't use hook symbols to add these backends, so we have to use + ;; the entire closure to get rid of it. + (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) + (remove-hook 'alchemist-mode-hook fn) + (remove-hook 'alchemist-iex-mode-hook fn)))) (def-package! alchemist @@ -24,16 +36,3 @@ (set! :eval 'elixir-mode #'alchemist-eval-region) (set! :repl 'elixir-mode #'alchemist-iex-project-run)) - -(def-package! alchemist-company - :when (featurep! :completion company) - :commands alchemist-company - :init - (set! :company-backend 'elixir-mode '(alchemist-company company-yasnippet)) - :config - ;; Alchemist doesn't use hook symbols to add these backends, so we have to use - ;; the entire closure to get rid of it. - (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) - (remove-hook 'alchemist-mode-hook fn) - (remove-hook 'alchemist-iex-mode-hook fn))) - diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index bd845f842..68d30c3c8 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -5,7 +5,7 @@ (after! elm-mode (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :company-backend 'elm-mode 'company-elm) + (set-company-backend! 'elm-mode 'company-elm) (set! :repl 'elm-mode #'run-elm-interactive)) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 1089d5905..0c75e67db 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -78,5 +78,5 @@ :when (featurep! :completion company) :after go-mode :config - (set! :company-backend 'go-mode 'company-go) + (set-company-backend! 'go-mode 'company-go) (setq company-go-show-annotation t)) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 93ab83bbc..c388d0150 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -16,4 +16,4 @@ (add-hook 'haskell-mode-hook #'ghc-comp-init) :config (setq company-ghc-show-info 'oneline) - (set! :company-backend 'haskell-mode #'company-ghc)) + (set-company-backend! 'haskell-mode #'company-ghc)) diff --git a/modules/lang/hy/config.el b/modules/lang/hy/config.el index bd24be0da..bee40e479 100644 --- a/modules/lang/hy/config.el +++ b/modules/lang/hy/config.el @@ -5,4 +5,4 @@ :interpreter "hy" :config (set! :repl 'hy-mode #'hy-shell-start-or-switch-to-shell) - (set! :company-backend 'hy-mode 'company-hy)) + (set-company-backend! 'hy-mode 'company-hy)) diff --git a/modules/lang/java/+eclim.el b/modules/lang/java/+eclim.el index f44a4dcba..6f07ab0ef 100644 --- a/modules/lang/java/+eclim.el +++ b/modules/lang/java/+eclim.el @@ -55,4 +55,4 @@ :when (featurep! :completion company) :after java-mode :config - (set! :company-backend 'java-mode '(company-emacs-eclim))) + (set-company-backend! 'java-mode '(company-emacs-eclim))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 58e89c416..195d0e62a 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -94,7 +94,7 @@ ;; tide affects the global `company-backends', undo this so doom can handle ;; it buffer-locally (setq-default company-backends (delq 'company-tide (default-value 'company-backends)))) - (set! :company-backend 'tide-mode 'company-tide) + (set-company-backend! 'tide-mode 'company-tide) ;; navigation (set! :lookup 'tide-mode diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 7668cec12..bc9e1dc11 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -33,7 +33,7 @@ font-latex-fontify-sectioning 1.15) (setq-default TeX-master nil) ;; Display the output of the latex commands in a popup. - (set! :popup " output\\*$" '((size . 15))) + (set-popup-rule! " output\\*$" '((size . 15))) ;; TeX Font Styling ;; (def-package! tex-style :defer t) @@ -200,7 +200,7 @@ :when (featurep! :completion company) :commands (company-auctex-init) :init - ;; We can't use the (set! :company-backend ...) because Auctex reports its + ;; We can't use the (set-company-backend! ...) because Auctex reports its ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is ;; not anticipated by :company-backend (and shouldn't have to!) (add-hook! LaTeX-mode diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index d8557f3b3..9696267c1 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -6,7 +6,7 @@ (set! :lookup 'lua-mode :documentation 'lua-search-documentation) (set! :electric 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) - (set! :company-backend 'lua-mode '(company-lua company-yasnippet)) + (set-company-backend! 'lua-mode '(company-lua company-yasnippet)) (def-menu! +lua/build-menu "Build/compilation commands for `lua-mode' buffers." diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 5902dd181..409e0dbef 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -8,6 +8,6 @@ :after tuareg :hook (tuareg-mode . merlin-mode) :config - (set! :company-backend 'tuareg-mode 'merlin-company-backend) + (set-company-backend! 'tuareg-mode 'merlin-company-backend) (after! company (remove-hook 'company-backends 'merlin-company-backend))) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 909695e77..39dd2222a 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -71,19 +71,19 @@ string). Stops at the first function to return non-nil.") (require 'ob-ipython nil t))) (add-hook '+org-babel-load-functions #'+org|babel-load-ipython) :config - (set! :popups - '("^\\*Org Src" - ((size . 100) (side . right) (slot . -1) (window-height . 0.6)) - ((quit) (select . t) (modeline))) - '("^\\*Python" - ((slot . 0) (side . right) (size . 100)) - ((select) (quit) (transient))) - '("\\*ob-ipython.*" - ((slot . 2) (side . right) (size . 100) (window-height . 0.2)) - ((select) (quit) (transient))) - '("\\*Python:.*" - ((slot . 0) (side . right) (size . 100)) - ((select) (quit) (transient)))) + (set-popup-rules! + '(("^\\*Org Src" + ((size . 100) (side . right) (slot . -1) (window-height . 0.6)) + ((quit) (select . t) (modeline))) + ("^\\*Python" + ((slot . 0) (side . right) (size . 100)) + ((select) (quit) (transient))) + ("\\*ob-ipython.*" + ((slot . 2) (side . right) (size . 100) (window-height . 0.2)) + ((select) (quit) (transient))) + ("\\*Python:.*" + ((slot . 0) (side . right) (size . 100)) + ((select) (quit) (transient))))) ;; TODO Add more popup styles ;; advices for remote kernel and org-src-edit diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 37e4fe4dd..3a351a229 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -137,19 +137,19 @@ unfold to point on startup." (defun +org|setup-popups-rules () "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." - (set! :popups - '("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" - ((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) - ((transient . 0))) - '("^\\*Org Agenda" - ((size . 0.35)) - ((select . t) (transient))) - '("^\\*Org Src" - ((size . 0.3)) - ((quit) (select . t))) - '("^CAPTURE.*\\.org$" - ((size . 0.2)) - ((quit) (select . t))))) + (set-popup-rules! + '(("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" + ((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) + ((transient . 0))) + ("^\\*Org Agenda" + ((size . 0.35)) + ((select . t) (transient))) + ("^\\*Org Src" + ((size . 0.3)) + ((quit) (select . t))) + ("^CAPTURE.*\\.org$" + ((size . 0.2)) + ((quit) (select . t)))))) (defun +org|setup-ui () "Configures the UI for `org-mode'." diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 8485d9521..7022e03e5 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -3,7 +3,7 @@ ;; (def-package! hack-mode ;; :mode "\\.hh$" ;; :config -;; (set! :company-backend 'hack-mode '(company-capf))) +;; (set-company-backend! 'hack-mode '(company-capf))) (def-package! php-mode @@ -22,7 +22,7 @@ ;; ac-php provides custom autocompletion, php-extras provides autocompletion ;; for built-in libraries - (set! :company-backend 'php-mode '(company-ac-php-backend php-extras-company)) + (set-company-backend! 'php-mode '(company-ac-php-backend php-extras-company)) ;; default is 10; this optimizes `smartparens' performance, but limits sp ;; pairs to 6 characters. diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index a60b92e92..a798870ad 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -6,7 +6,7 @@ (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") org-plantuml-jar-path plantuml-jar-path) :config - (set! :popup "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0)))) + (set-popup-rule! "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0)))) (def-package! flycheck-plantuml diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index e51b513a7..734cea5ea 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -79,8 +79,8 @@ environment variables." :config (add-hook 'python-mode-hook #'anaconda-mode) (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) - (set! :company-backend 'python-mode '(company-anaconda)) - (set! :popup "^\\*anaconda-mode" nil '((select))) + (set-company-backend! 'python-mode '(company-anaconda)) + (set-popup-rule! "^\\*anaconda-mode" nil '((select))) (set! :lookup 'python-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references @@ -112,7 +112,7 @@ environment variables." :init (associate! nose-mode :match "/test_.+\\.py$" :modes (python-mode)) :config - (set! :popup "^\\*nosetests" '((size . 0.4)) '((select))) + (set-popup-rule! "^\\*nosetests" '((size . 0.4)) '((select))) (set! :yas-minor-mode 'nose-mode) (map! :map nose-mode-map :localleader diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 117908050..2114e2015 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -3,7 +3,7 @@ (def-package! restclient :mode ("\\.http\\'" . restclient-mode) :config - (set! :popup "^\\*HTTP Response" '((size . 0.4)) '((quit . other))) + (set-popup-rule! "^\\*HTTP Response" '((size . 0.4)) '((quit . other))) (map! :mode restclient-mode :n [M-return] 'restclient-http-send-current :localleader @@ -15,4 +15,4 @@ (def-package! company-restclient :when (featurep! :completion company) :after restclient - :config (set! :company-backend 'restclient-mode 'company-restclient)) + :config (set-company-backend! 'restclient-mode 'company-restclient)) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index cce232a60..61f89ae6d 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -14,7 +14,7 @@ (def-package! ruby-mode :mode "\\.\\(?:pry\\|irb\\)rc\\'" :config - (set! :company-backend 'ruby-mode 'company-dabbrev-code) + (set-company-backend! 'ruby-mode 'company-dabbrev-code) (set! :electric 'ruby-mode :words '("else" "end" "elseif")) (set! :env "RBENV_ROOT") (set! :repl 'ruby-mode #'inf-ruby) ; `inf-ruby' @@ -104,7 +104,7 @@ environment variables." (def-package! company-inf-ruby :when (featurep! :completion company) :after inf-ruby - :config (set! :company-backend 'inf-ruby-mode 'company-inf-ruby)) + :config (set-company-backend! 'inf-ruby-mode 'company-inf-ruby)) ;; `rake' diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index cd216273f..65dfdfd9d 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -29,7 +29,7 @@ (def-package! company-racer :when (featurep! :completion company) :after racer - :config (set! :company-backend 'rust-mode '(company-racer))) + :config (set-company-backend! 'rust-mode '(company-racer))) (def-package! flycheck-rust diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index 44a39ced9..cbea665f1 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -12,7 +12,7 @@ ;; let DOOM handle company setup ensime-completion-style nil) - (set! :company-backend 'scala-mode '(ensime-company company-yasnippet)) + (set-company-backend! 'scala-mode '(ensime-company company-yasnippet)) ;; Fix void-variable imenu-auto-rescan error caused by `ensime--setup-imenu' ;; trying to make imenu variables buffer local before imenu is loaded. diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index d705509da..a9390745a 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -59,6 +59,6 @@ :when (featurep! :completion company) :after sh-script :config - (set! :company-backend 'sh-mode '(company-shell company-files)) + (set-company-backend! 'sh-mode '(company-shell company-files)) (setq company-shell-delete-duplicates t)) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index 860997c7f..b7b130b8f 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -25,4 +25,4 @@ :after solidity-mode :config (setq company-backends (delq 'company-solidity company-backends)) - (set! :company-backends 'solidity-mode 'company-solidity)) + (set-company-backend! 'solidity-mode 'company-solidity)) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index 6ba19cf0e..cd371e88c 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -15,5 +15,5 @@ :when (featurep! :completion company) :after swift-mode :config - (set! :company-backend 'swift-mode '(company-sourcekit company-yasnippet))) + (set-company-backend! 'swift-mode '(company-sourcekit company-yasnippet))) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 834a2ae6e..cd2175c0e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -42,7 +42,7 @@ (set! :docset 'scss-mode "Sass") (unless EMACS26+ ;; css-mode's built in completion is superior - (set! :company-backend '(css-mode scss-mode) 'company-css)) + (set-company-backend! '(css-mode scss-mode) 'company-css)) (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) @@ -50,6 +50,6 @@ :defer t :config (set! :docset 'sass-mode "Sass") - (set! :company-backend 'sass-mode 'company-css) + (set-company-backend! 'sass-mode 'company-css) (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 8e58e55b2..c25b2b4d6 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -92,6 +92,9 @@ ;; -(set! :company-backend 'pug-mode 'company-web-jade) -(set! :company-backend 'web-mode 'company-web-html) -(set! :company-backend 'slim-mode 'company-web-slim) +(after! pug-mode + (set-company-backend! 'pug-mode 'company-web-jade)) +(after! web-mode + (set-company-backend! 'web-mode 'company-web-html)) +(after! slim-mode + (set-company-backend! 'slim-mode 'company-web-slim)) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index c2e290cec..dda5acd71 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -16,18 +16,19 @@ ;; Slice images into rows; easier to navigate around images ein:slice-image t) - (set! :popup "\\*ein: .*" :ignore) - (set! :popup "\\*ein:tb .*" - '((side . bottom) (size . 0.3)) - '((quit . t) (transient) (select))) - (set! :popup "\\*ein:notebooklist *" - '((side . left) (size . 50)) - '((select))) + (set-popup-rules! + '(("\\*ein: .*" :ignore t) + ("\\*ein:tb .*" + ((side . bottom) (size . 0.3)) + ((quit . t) (transient) (select))) + ("\\*ein:notebooklist *" + ((side . left) (size . 50)) + ((select))))) (when (featurep! :completion company) ;; Code completion with company (setq ein:completion-backend 'ein:use-company-backend) - (set! :company-backend '(ein:notebook-multilang-mode + (set-company-backend! '(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode) 'ein:company-backend)) diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index 3e563de26..9fa0e730d 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -5,7 +5,7 @@ ;; Emacs. (after! gist - (set! :evil-state 'gist-list-mode 'normal) + (set-evil-initial-state! 'gist-list-mode 'normal) (defun +gist*list-render (orig-fn &rest args) (funcall orig-fn (car args) t) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 031c87200..d309068d7 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -25,7 +25,7 @@ load everything.") magit-diff-refine-hunk t ;; Show word-granularity on the currently selected hunk magit-display-buffer-function #'+magit-display-buffer-fullscreen) - (set! :popup "^\\(?:\\*magit\\|magit:\\)" :ignore) + (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore) ;; Consider magit buffers real (so they can switched to) (add-hook 'magit-mode-hook #'doom|mark-buffer-as-real) ;; no mode-line in magit popups diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index e05bf4b73..3f4da27ac 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -27,8 +27,8 @@ ;; `pass' (after! pass (set! :env "PASSWORD_STORE_DIR") - (set! :evil-state 'pass-mode 'emacs) - (set! :popup "^\\*Password-Store" + (set-evil-initial-state! 'pass-mode 'emacs) + (set-popup-rule! "^\\*Password-Store" '((side . left) (size . 0.25)) '((quit))) (define-key! pass-mode-map diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index edd277624..412238da4 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -18,9 +18,9 @@ (load! "+modeline") (add-hook! 'pdf-tools-enabled-hook (doom-set-modeline 'pdf-tools-modeline))) ;; Handle PDF-tools related popups better - (set! :popup "^\\*Outline*" '((side . right) (size . 40)) '((select))) + (set-popup-rule! "^\\*Outline*" '((side . right) (size . 40)) '((select))) ;; TODO: Add additional important windows that should be handled differently ;; TODO: These two next rules don't work (they should), investigate - ;; (set! :popup "\\*Contents\\*" '((side . right) (size . 40)) nil) - ;; (set! :popup "* annots\\*$" '((side . left) (size . 40)) '((select))) + ;; (set-popup-rule! "\\*Contents\\*" '((side . right) (size . 40)) nil) + ;; (set-popup-rule! "* annots\\*$" '((side . left) (size . 40)) '((select))) ) diff --git a/modules/tools/prodigy/config.el b/modules/tools/prodigy/config.el index b06d7278a..76f8b1078 100644 --- a/modules/tools/prodigy/config.el +++ b/modules/tools/prodigy/config.el @@ -1,7 +1,7 @@ ;;; tools/prodigy/config.el -*- lexical-binding: t; -*- (after! prodigy - (set! :evil-state 'prodigy-mode 'emacs) + (set-evil-initial-state! 'prodigy-mode 'emacs) ;; Make services, etc persistent between Emacs sessions (doom-cache-persist diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index f7c8847db..dca65e7c4 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -35,7 +35,7 @@ "~$" "^#.*#$")) - (set! :popup "^ ?\\*NeoTree" + (set-popup-rule! "^ ?\\*NeoTree" `((side . ,neo-window-position) (size . ,neo-window-width)) '((quit . current) (select . t))) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index beb11988a..881b4d2b4 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -263,7 +263,7 @@ instead of switch-to-buffer-*." (inhibit-same-window . t))) (add-hook 'pdf-annot-list-mode-hook #'hide-mode-line-mode) - (set! :popup "\\(^\\*Contents\\|'s annots\\*$\\)" :ignore t)) + (set-popup-rule! "\\(^\\*Contents\\|'s annots\\*$\\)" :ignore t)) ;; `wgrep' diff --git a/modules/ui/popup/autoload.el b/modules/ui/popup/autoload/popup.el similarity index 91% rename from modules/ui/popup/autoload.el rename to modules/ui/popup/autoload/popup.el index 2d8f54777..428dd3633 100644 --- a/modules/ui/popup/autoload.el +++ b/modules/ui/popup/autoload/popup.el @@ -1,72 +1,4 @@ -;;; ui/popup/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defvar +popup--display-buffer-alist nil) - -;;;###autoload -(def-setting! :popup (condition &optional alist parameters) - "Define a popup rule. - -CONDITION can be a regexp string or a function. - -For ALIST, see `display-buffer' and `display-buffer-alist' for a list of -possible entries, which instruct the display system how to initialize the popup -window. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for -a list of custom parameters provided by the popup module. If certain -attributes/parameters are omitted, the ones from `+popup-default-alist' and -`+popup-default-parameters' will be used. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean." - `(progn - (when after-init-time - (setq +popup--display-buffer-alist - (map-delete +popup--display-buffer-alist ,condition))) - (push (+popup--rule (list ,condition ,alist ,parameters)) - +popup--display-buffer-alist) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) - -;;;###autoload -(def-setting! :popups (&rest rules) - "Define multiple popup rules. See `doom--set:popup' for the specifications of -each individual rule. - - (set! :popups - '(\"^ \\*\" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - '(\"^\\*\" ((slot . 1) (vslot . -1)) ((select . t))))" - `(progn - (dolist (rule (nreverse (list ,@rules))) - (when after-init-time - (setq +popup--display-buffer-alist - (map-delete +popup--display-buffer-alist (car rule)))) - (push (+popup--rule rule) +popup--display-buffer-alist)) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - +popup--display-buffer-alist)) - -;;;###autoload -(defsubst +popup--rule (args) - (declare (indent 1)) - (cl-destructuring-bind (condition &optional alist parameters) args - (if (eq alist :ignore) - (list condition nil) - `(,condition (+popup-buffer) - ,@alist - (window-parameters ,@parameters))))) - - -;; -;; Library -;; +;;; ui/popup/autoload/popup.el -*- lexical-binding: t; -*- (defvar +popup--populate-wparams (not EMACS26+)) (defvar +popup--inhibit-transient nil) @@ -135,6 +67,7 @@ and enables `+popup-buffer-mode'." `transient' window parameter (see `+popup-window-parameters'). + And finally deletes the window!" (let ((buffer (window-buffer window)) + (inhibit-quit t) ttl) (when (and (buffer-file-name buffer) (buffer-modified-p buffer) @@ -490,7 +423,7 @@ should match the arguments of `+popup-define' or the :popup setting." (declare (indent defun)) `(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist) display-buffer-alist) - ,@(cl-loop for rule in rules collect `(set! :popup ,@rule)) + ,@(cl-loop for rule in rules collect `(set-popup-rule! ,@rule)) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) ,@body)) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el new file mode 100644 index 000000000..40ebdece0 --- /dev/null +++ b/modules/ui/popup/autoload/settings.el @@ -0,0 +1,107 @@ +;;; ui/popup/autoload/settings.el -*- lexical-binding: t; -*- + +(defvar +popup--display-buffer-alist nil) + +(defsubst +popup--rule (args) + (cl-destructuring-bind (condition &optional alist parameters) args + (if (eq alist :ignore) + (list condition nil) + `(,condition (+popup-buffer) + ,@alist + (window-parameters ,@parameters))))) + +(defun +popup--define (condition &optional alist parameters) + (when after-init-time + (setq +popup--display-buffer-alist + (map-delete +popup--display-buffer-alist condition))) + (push (+popup--rule (list condition alist parameters)) + +popup--display-buffer-alist)) + +;;;###autodef +(defun set-popup-rule! (condition &optional alist parameters) + "Define a popup rule. + +CONDITION can be a regexp string or a function. + +For ALIST, see `display-buffer' and `display-buffer-alist' for a list of +possible entries, which instruct the display system how to initialize the popup +window. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for +a list of custom parameters provided by the popup module. If certain +attributes/parameters are omitted, the ones from `+popup-default-alist' and +`+popup-default-parameters' will be used. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +See `def-popups!' for defining multiple rules in bulk." + (+popup--define condition alist parameters) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist) + +;;;###autodef +(defun set-popup-rules! (&rest rulesets) + "Define multiple popup rules. See `def-popup!' for the specifications of each +individual rule. + + (set-popup-rules! + '((\"^ \\*\" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (\"^\\*\" ((slot . 1) (vslot . -1)) ((select . t)))))" + (dolist (ruleset rulesets) + (dolist (rule ruleset) + (apply #'+popup--define rule))) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + +popup--display-buffer-alist) + + +;; +;; Obsolete +;; + +;; FIXME obsolete :popup +;;;###autoload +(def-setting! :popup (condition &optional alist parameters) + "Define a popup rule. + +CONDITION can be a regexp string or a function. + +For ALIST, see `display-buffer' and `display-buffer-alist' for a list of +possible entries, which instruct the display system how to initialize the popup +window. + +ALIST also supports the `size' parameter, which will be translated to +`window-width' or `window-height' depending on `side'. + +PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for +a list of custom parameters provided by the popup module. If certain +attributes/parameters are omitted, the ones from `+popup-default-alist' and +`+popup-default-parameters' will be used. + +The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' +will be tested against CONDITION, which is either a) a regexp string (which is +matched against the buffer's name) or b) a function that takes no arguments and +returns a boolean. + +See `def-popups!' for defining multiple rules in bulk." + :obsolete set-popup-rule! + `(set-popup-rule! ,condition ,alist ,parameters)) + +;; FIXME obsolete :popups +;;;###autoload +(def-setting! :popups (&rest rulesets) + "Define multiple popup rules. See `def-popup!' for the specifications of each +individual rule. + + (set-popup-rules! + '((\"^ \\*\" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) + (\"^\\*\" ((slot . 1) (vslot . -1)) ((select . t)))))" + :obsolete set-popup-rules! + `(set-popup-rules! ,@rulesets)) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 0c964c4f0..0ceae160b 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -102,45 +102,43 @@ deleted.") ;; Default popup rules & bootstrap ;; -(when (featurep! +all) - (set! :popups - '("^ \\*" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - '("^\\*" ((slot . 1) (vslot . -1)) ((select . t))))) - -(when (featurep! +defaults) - (set! :popups - '("^\\*Completions" - ((slot . -1) (vslot . -2)) - ((transient . 0))) - '("^\\*Compil\\(?:ation\\|e-Log\\)" - ((size . 0.3)) - ((transient . 0) (quit . t))) - '("^\\*\\(?:scratch\\|Messages\\)" - nil - ((autosave . t) (transient))) - '("^\\*doom \\(?:term\\|eshell\\)" - ((size . 0.25) (vslot . -10)) - ((select . t) (quit) (transient . 0))) - '("^\\*doom:" - ((size . 0.35) (side . bottom)) - ((autosave . t) (select . t) (modeline . t) (quit) (transient . t))) - '("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - ((size . +popup-shrink-to-fit)) - ((transient . 0) (select . ignore))) - '("^\\*Customize" - ((slot . 2) (side . right)) - ((modeline . nil) (select . t) (quit . t))) - '("^ \\*undo-tree\\*" - ((slot . 2) (side . left) (size . 20)) - ((modeline . nil) (select . t) (quit . t))) - ;; `help-mode', `helpful-mode' - '("^\\*[Hh]elp" - ((slot . 2) (vslot . 2) (size . 0.25)) - ((select . t))) - ;; `Info-mode' - '("^\\*info\\*$" - ((slot . 2) (vslot . 2) (size . 0.45)) - ((select . t))))) +(set-popup-rules! + (when (featurep! +all) + '(("^\\*" ((slot . 1) (vslot . -1)) ((select . t))) + ("^ \\*" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))))) + (when (featurep! +defaults) + '(("^\\*Completions" + ((slot . -1) (vslot . -2)) + ((transient . 0))) + ("^\\*Compil\\(?:ation\\|e-Log\\)" + ((size . 0.3)) + ((transient . 0) (quit . t))) + ("^\\*\\(?:scratch\\|Messages\\)" + nil + ((autosave . t) (transient))) + ("^\\*doom \\(?:term\\|eshell\\)" + ((size . 0.25) (vslot . -10)) + ((select . t) (quit) (transient . 0))) + ("^\\*doom:" + ((size . 0.35) (side . bottom)) + ((autosave . t) (select . t) (modeline . t) (quit) (transient . t))) + ("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" + ((size . +popup-shrink-to-fit)) + ((transient . 0) (select . ignore))) + ("^\\*Customize" + ((slot . 2) (side . right)) + ((modeline . nil) (select . t) (quit . t))) + ("^ \\*undo-tree\\*" + ((slot . 2) (side . left) (size . 20)) + ((modeline . nil) (select . t) (quit . t))) + ;; `help-mode', `helpful-mode' + ("^\\*[Hh]elp" + ((slot . 2) (vslot . 2) (size . 0.25)) + ((select . t))) + ;; `Info-mode' + ("^\\*info\\*$" + ((slot . 2) (vslot . 2) (size . 0.45)) + ((select . t)))))) (add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook From 2496e0348dc70b696b8422c69537a3e9dbca2cf7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:03:32 +0200 Subject: [PATCH 1860/4235] Add :when support to after! This lets you delay a body of code until an arbitrary condition is met (which is checked whenever a file is loaded). Also refactors set-file-template! to wait until +file-templates-alist is defined. --- core/core-lib.el | 15 ++++++++++++++- modules/feature/file-templates/autoload.el | 6 ++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index e22918f22..72bf0cb94 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -226,7 +226,20 @@ compilation. This will no-op on features that have been disabled by the user." (load next :no-message :no-error)))) #'progn #'with-no-warnings) - (cond ((symbolp targets) + (cond ((eq (car-safe targets) :when) + `(if ,(cadr targets) + (progn ,@body) + ,(let* ((hook 'after-load-functions) + (fun (intern (format "doom|delay-form-in-%s" hook)))) + `(progn + (fset ',fun (lambda (&rest args) + (when ,(or (car (cdr-safe targets)) t) + (remove-hook ',hook #',fun) + (ignore args) + ,@body))) + (put ',fun 'permanent-local-hook t) + (add-hook ',hook #',fun))))) + ((symbolp targets) `(eval-after-load ',targets '(progn ,@body))) ((and (consp targets) (memq (car targets) '(:or :any))) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 4cd82e4ff..43315b931 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -22,12 +22,14 @@ these properties: :ignore BOOL If non-nil, don't expand any template for this file and don't test any other file template rule against this buffer." - `(push (list ,pred ,@plist) +file-templates-alist)) + (after! (:when (boundp '+file-templates-alist)) + (push `(,pred ,@plist) +file-templates-alist))) ;;;###autodef (defun set-file-templates! (&rest templates) "Like `doom--set:file-template', but register many file templates at once." - `(setq +file-templates-alist (append (list ,@templates) +file-templates-alist))) + (after! (:when (boundp '+file-templates-alist)) + (setq +file-templates-alist (append (list templates) +file-templates-alist)))) ;; FIXME obsolete :file-template ;;;###autoload From 2023aac314f58271c5497e5009a8c2510372dd43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:10:55 +0200 Subject: [PATCH 1861/4235] Add +treemacs/toggle command --- modules/ui/treemacs/autoload.el | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 modules/ui/treemacs/autoload.el diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el new file mode 100644 index 000000000..ba5814106 --- /dev/null +++ b/modules/ui/treemacs/autoload.el @@ -0,0 +1,22 @@ +;;; ui/treemacs/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +treemacs/toggle () + "Initialize or toggle treemacs. +* If the treemacs window is visible hide it. +* If a treemacs buffer exists, but is not visible show it. +* If no treemacs buffer exists for the current frame create and show it. +* If the workspace is empty additionally ask for the root path of the first + project to add." + (interactive) + (require 'treemacs) + (-pcase (treemacs--current-visibility) + ['visible (delete-window (treemacs--is-visible?))] + ['exists (treemacs-select-window)] + ['none + (let ((project-root (doom-project-root 'nocache))) + (when project-root + (unless (treemacs--find-project-for-path project-root) + (treemacs-add-project-at (treemacs--canonical-path project-root) + (doom-project-name 'nocache)))) + (treemacs--init project-root))])) From 3b0fad871f6c2bd3c3ff1b8f0562f1bdaf267587 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:11:08 +0200 Subject: [PATCH 1862/4235] Add :lang common-lisp doctor --- modules/lang/common-lisp/doctor.el | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 modules/lang/common-lisp/doctor.el diff --git a/modules/lang/common-lisp/doctor.el b/modules/lang/common-lisp/doctor.el new file mode 100644 index 000000000..891f5ae8e --- /dev/null +++ b/modules/lang/common-lisp/doctor.el @@ -0,0 +1,6 @@ +;;; lang/common-lisp/doctor.el -*- lexical-binding: t; -*- + +(when (require 'sly nil t) + (unless (executable-find inferior-lisp-program) + (warn! "Couldn't find your `inferior-lisp-program' (%s). Is it installed?" + inferior-lisp-program))) From 98d2f1de3fd4090d7aa2ad1766768c910cad8b46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:15:34 +0200 Subject: [PATCH 1863/4235] Add set-env! autodef; make :env obsolete --- core/autoload/os.el | 9 +++++++++ core/core-os.el | 7 +++++-- modules/emacs/term/config.el | 2 +- modules/lang/go/config.el | 2 +- modules/lang/python/config.el | 2 +- modules/lang/ruby/config.el | 2 +- modules/lang/rust/config.el | 2 +- modules/tools/password-store/config.el | 2 +- 8 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 core/autoload/os.el diff --git a/core/autoload/os.el b/core/autoload/os.el new file mode 100644 index 000000000..871eea21d --- /dev/null +++ b/core/autoload/os.el @@ -0,0 +1,9 @@ +;;; core/autoload/os.el -*- lexical-binding: t; no-byte-compile: t -*- + +;; FIXME obsolete :env +;;;###autoload +(def-setting! :env (&rest vars) + "TODO" + :obsolete set-env! + (when (featurep 'exec-path-from-shell) + `(exec-path-from-shell-copy-envs ,@vars))) diff --git a/core/core-os.el b/core/core-os.el index fe8a9ade5..8469faeb8 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -12,6 +12,9 @@ ;; http://stackoverflow.com/questions/15873346/elisp-rename-macro (advice-add #'evil-visual-update-x-selection :override #'ignore) +(defmacro set-env! (&rest _vars) + "Inject VARS from your shell environment into Emacs.") + (cond (IS-MAC (setq mac-command-modifier 'meta mac-option-modifier 'alt @@ -32,9 +35,9 @@ ;; environment, so envvars will be wrong. That includes the PATH Emacs ;; picks up. `exec-path-from-shell' fixes this. (when (require 'exec-path-from-shell nil t) - (def-setting! :env (&rest vars) + (defun set-env! (&rest vars) "Inject VARS from your shell environment into Emacs." - `(exec-path-from-shell-copy-envs (list ,@vars))) + (exec-path-from-shell-copy-envs vars)) (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index c65b42afb..6be92ed5b 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -6,7 +6,7 @@ ;; `term' (built-in) (after! term - (set! :env "SHELL") + (set-env! "SHELL") ;; Consider term buffers real (add-hook 'term-mode-hook #'doom|mark-buffer-as-real)) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 0c75e67db..47837c324 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -5,7 +5,7 @@ ;; (after! go-mode - (set! :env "GOPATH" "GOROOT") + (set-env! "GOPATH" "GOROOT") (set! :repl 'go-mode #'gorepl-run) (set! :lookup 'go-mode :definition #'go-guru-definition diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 734cea5ea..ef1ea1d77 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -24,7 +24,7 @@ is loaded.") :config (add-hook! 'python-mode-hook #'(flycheck-mode highlight-numbers-mode)) - (set! :env "PYTHONPATH" "PYENV_ROOT") + (set-env! "PYTHONPATH" "PYENV_ROOT") (set! :electric 'python-mode :chars '(?:)) (set! :repl 'python-mode #'+python/repl) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 61f89ae6d..21e63dd15 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -16,7 +16,7 @@ :config (set-company-backend! 'ruby-mode 'company-dabbrev-code) (set! :electric 'ruby-mode :words '("else" "end" "elseif")) - (set! :env "RBENV_ROOT") + (set-env! "RBENV_ROOT") (set! :repl 'ruby-mode #'inf-ruby) ; `inf-ruby' (setq ruby-deep-indent-paren t) ;; Don't interfere with my custom RET behavior diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 65dfdfd9d..7902ea517 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -1,7 +1,7 @@ ;;; lang/rust/config.el -*- lexical-binding: t; -*- (after! rust-mode - (set! :env "RUST_SRC_PATH") + (set-env! "RUST_SRC_PATH") (set! :docset 'rust-mode "Rust") (setq rust-indent-method-chain t) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 3f4da27ac..27e7ca61e 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -26,7 +26,7 @@ ;; `pass' (after! pass - (set! :env "PASSWORD_STORE_DIR") + (set-env! "PASSWORD_STORE_DIR") (set-evil-initial-state! 'pass-mode 'emacs) (set-popup-rule! "^\\*Password-Store" '((side . left) (size . 0.25)) From eaca8c58fae4342e9461788c74e054768b4d6e5d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:31:54 +0200 Subject: [PATCH 1864/4235] Move unit tests from ert to buttercup Easier to organize and write. Now I can hopefully strive for better coverage! --- core/autoload/test.el | 169 ------------------ core/core-dispatcher.el | 2 +- core/core-tests.el | 68 +++++++ core/packages.el | 3 + core/test/autoload-buffers.el | 130 -------------- core/test/autoload-help.el | 17 -- core/test/autoload-message.el | 41 ----- core/test/autoload-package.el | 72 -------- core/test/core-lib.el | 116 ------------ core/test/core-projects.el | 47 ----- core/test/core-ui.el | 34 ---- core/test/test-autoload-buffers.el | 114 ++++++++++++ core/test/test-autoload-files.el | 54 ++++++ core/test/test-autoload-help.el | 31 ++++ core/test/test-autoload-message.el | 37 ++++ core/test/test-autoload-package.el | 128 +++++++++++++ core/test/test-core-lib.el | 90 ++++++++++ core/test/test-core-modules.el | 4 + core/test/test-core-packages.el | 4 + core/test/test-core-projects.el | 46 +++++ core/test/test-core-ui.el | 132 ++++++++++++++ core/test/test-core.el | 56 ++++++ modules/completion/company/test/company.el | 21 --- .../completion/company/test/test-company.el | 44 +++++ modules/feature/evil/autoload/evil.el | 30 ++++ modules/feature/evil/config.el | 22 --- modules/feature/evil/test/autoload-files.el | 47 ----- modules/feature/evil/test/evil.el | 59 ------ modules/feature/evil/test/test-evil.el | 66 +++++++ .../workspaces/test/autoload-workspaces.el | 124 ------------- .../workspaces/test/test-workspaces.el | 135 ++++++++++++++ modules/lang/emacs-lisp/config.el | 10 +- modules/lang/org/test/autoload-org.el | 62 ------- modules/lang/org/test/test-org.el | 145 +++++++++++++++ modules/lang/web/test/autoload-css.el | 32 ---- modules/lang/web/test/autoload-html.el | 14 -- modules/lang/web/test/test-web.el | 93 ++++++++++ .../password-store/test/autoload-pass.el | 42 ----- .../tools/password-store/test/test-pass.el | 41 +++++ .../ui/doom-dashboard/test/doom-dashboard.el | 50 ------ .../test/test-doom-dashboard.el | 40 +++++ 41 files changed, 1371 insertions(+), 1101 deletions(-) delete mode 100644 core/autoload/test.el create mode 100644 core/core-tests.el delete mode 100644 core/test/autoload-buffers.el delete mode 100644 core/test/autoload-help.el delete mode 100644 core/test/autoload-message.el delete mode 100644 core/test/autoload-package.el delete mode 100644 core/test/core-lib.el delete mode 100644 core/test/core-projects.el delete mode 100644 core/test/core-ui.el create mode 100644 core/test/test-autoload-buffers.el create mode 100644 core/test/test-autoload-files.el create mode 100644 core/test/test-autoload-help.el create mode 100644 core/test/test-autoload-message.el create mode 100644 core/test/test-autoload-package.el create mode 100644 core/test/test-core-lib.el create mode 100644 core/test/test-core-modules.el create mode 100644 core/test/test-core-packages.el create mode 100644 core/test/test-core-projects.el create mode 100644 core/test/test-core-ui.el create mode 100644 core/test/test-core.el delete mode 100644 modules/completion/company/test/company.el create mode 100644 modules/completion/company/test/test-company.el delete mode 100644 modules/feature/evil/test/autoload-files.el delete mode 100644 modules/feature/evil/test/evil.el create mode 100644 modules/feature/evil/test/test-evil.el delete mode 100644 modules/feature/workspaces/test/autoload-workspaces.el create mode 100644 modules/feature/workspaces/test/test-workspaces.el delete mode 100644 modules/lang/org/test/autoload-org.el create mode 100644 modules/lang/org/test/test-org.el delete mode 100644 modules/lang/web/test/autoload-css.el delete mode 100644 modules/lang/web/test/autoload-html.el create mode 100644 modules/lang/web/test/test-web.el delete mode 100644 modules/tools/password-store/test/autoload-pass.el create mode 100644 modules/tools/password-store/test/test-pass.el delete mode 100644 modules/ui/doom-dashboard/test/doom-dashboard.el create mode 100644 modules/ui/doom-dashboard/test/test-doom-dashboard.el diff --git a/core/autoload/test.el b/core/autoload/test.el deleted file mode 100644 index 98243f517..000000000 --- a/core/autoload/test.el +++ /dev/null @@ -1,169 +0,0 @@ -;;; core/autoload/test.el -*- lexical-binding: t; no-byte-compile: t; -*- - -(defun doom//run-tests (&optional modules) - "Run all loaded tests, specified by MODULES (a list of module cons cells) or -command line args following a double dash (each arg should be in the -'module/submodule' format). - -If neither is available, run all tests in all enabled modules." - (interactive) - (require 'core-packages) - (doom//reload-autoloads) - (let (noninteractive) - ;; Core libraries aren't fully loaded in a noninteractive session, so we - ;; reload it with `noninteractive' set to nil to force them to. - (doom-initialize t) - (doom-initialize-modules t)) - (condition-case-unless-debug ex - (let ((target-paths - ;; Convert targets (either from MODULES or `argv') into a list of - ;; string paths, pointing to the root directory of modules - (cond ((stringp (car modules)) ; command line - (save-match-data - (cl-loop for arg in modules - if (string= arg ":core") collect doom-core-dir - else if (string-match-p "/" arg) - nconc (cl-loop for dir in doom-modules-dirs - collect (expand-file-name arg dir)) - else - nconc (cl-loop for dir in doom-modules-dirs - for path = (expand-file-name arg dir) - if (file-directory-p path) - nconc - (cl-remove-if-not - #'file-directory-p - (directory-files path t "^[^.]" t))) - finally do (setq argv nil)))) - - (modules ; cons-cells given to MODULES - (cl-loop for (module . submodule) in modules - if (doom-module-locate-path module submodule) - collect it)) - - ((append (list doom-core-dir) - (doom-module-load-path)))))) - ;; Load all the unit test files... - (dolist (path target-paths) - (let ((test-path (expand-file-name "test/" path))) - (when (file-directory-p test-path) - (dolist (test-file (reverse (doom-files-in test-path :match "\\.el$" :full t))) - (load test-file nil :noerror))))) - ;; ... then run them - (switch-to-buffer (get-buffer-create "*blank*")) - (if noninteractive - (ert-run-tests-batch-and-exit) - (call-interactively #'ert-run-tests-interactively))) - ('error - (lwarn 'doom-test :error - "%s -> %s" - (car ex) (error-message-string ex))))) - - -;; --- Test helpers ----------------------- - -(defmacro def-test! (name &rest body) - "Define a namespaced ERT test." - (declare (indent defun) (doc-string 2)) - (let (plist) - (while (keywordp (car body)) - (push (pop body) plist) - (push (pop body) plist)) - (setq plist (reverse plist)) - (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 - ,(intern (format "%s::%s" - (if (file-in-directory-p load-file-name doom-core-dir) - (format "core/%s" (file-name-base load-file-name)) - (replace-regexp-in-string "^.*/modules/\\([^/]+\\)/\\([^/]+\\)/test/" "\\1/\\2:" - (file-name-sans-extension load-file-name))) - name)) - () - ,(if (plist-get plist :skip) - `(ert-skip ,(plist-get plist :skip)) - `(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. - -INITIAL will recognize cursor markers in the form {[0-9]}. A {0} marker marks -where the cursor should be after setup. Otherwise, the cursor will be placed at -`point-min'. - -EXPECTED will recognize one (optional) cursor marker: {|}, this is the -'expected' location of the cursor after BODY is finished, and will be tested -against." - (declare (indent 2)) - `(with-temp-buffer - (cl-loop for line in ',initial - do (insert line "\n")) - (goto-char (point-min)) - (let (marker-list) - (save-excursion - (while (re-search-forward "{\\([0-9]\\)}" nil t) - (push (cons (match-string 1) - (set-marker (make-marker) (match-beginning 0))) - marker-list) - (replace-match "" t t)) - (if (not marker-list) - (goto-char (point-min)) - (sort marker-list - (lambda (m1 m2) (< (marker-position m1) - (marker-position m2)))) - (when (equal (caar marker-list) "0") - (goto-char! 0))) - ,@body - (let ((result-text (buffer-string)) - (point (point)) - expected-text) - (with-temp-buffer - (cl-loop for line in ',expected - do (insert line "\n")) - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "{|}" nil t) - (replace-match "" t t) - (should (equal (point) point)))) - (setq expected-text (buffer-string)) - (should (equal expected-text result-text)))))))) - -(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)." - `(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) - "Activate a minor mode while in BODY, deactivating it after." - (declare (indent defun)) - `(progn (,mode +1) - ,@body - (,mode -1))) - -(defmacro let-advice! (binds &rest body) - "Temporarily bind advice in BINDS while in BODY. - -e.g. (old-fn :before advice-fn) - (old-fn :around advice-fn)" - (declare (indent defun)) - `(progn - ,@(cl-loop for (target type advice) in binds - collect `(advice-add #',target ,type #',advice)) - ,@body - ,@(cl-loop for (target type advice) in binds - collect `(advice-remove #',target #',advice)))) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 229fc361a..34255dd32 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -172,7 +172,7 @@ respectively." (def-dispatcher! test "Run Doom unit tests." - (load! "autoload/test") + (require 'core-tests) (doom//run-tests args)) (def-dispatcher! info diff --git a/core/core-tests.el b/core/core-tests.el new file mode 100644 index 000000000..efcb89a8b --- /dev/null +++ b/core/core-tests.el @@ -0,0 +1,68 @@ +;;; core/core-tests.el -*- lexical-binding: t; -*- + +(defun doom//run-tests (&optional modules) + "Run all loaded tests, specified by MODULES (a list of module cons cells) or +command line args following a double dash (each arg should be in the +'module/submodule' format). + +If neither is available, run all tests in all enabled modules." + (interactive) + (let (noninteractive) + ;; Core libraries aren't fully loaded in a noninteractive session, so we + ;; reload it with `noninteractive' set to nil to force them to. + (quiet! (doom//reload-autoloads)) + (doom-initialize t)) + (let ((target-paths + ;; Convert targets into a list of string paths, pointing to the root + ;; directory of modules + (cond ((stringp (car modules)) ; command line + (save-match-data + (cl-loop for arg in modules + if (string= arg ":core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (mapcar (apply-partially #'expand-file-name arg) + doom-modules-dirs) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc + (doom-files-in + path :type 'dirs :depth 1 :full t)) + finally do (setq argv nil)))) + + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-locate-path module submodule) + collect it)) + + ((append (list doom-core-dir) + (doom-module-load-path)))))) + ;; Load all the unit test files... + (require 'buttercup) + (mapc (lambda (file) (load file :noerror (not doom-debug-mode))) + (doom-files-in (mapcar (apply-partially #'expand-file-name "test/") + target-paths) + :match "\\.el$" :full t)) + ;; ... then run them + (when doom-debug-mode + (setq buttercup-stack-frame-style 'pretty)) + (let ((split-width-threshold 0) + (split-height-threshold 0) + (window-min-width 0) + (window-min-height 0)) + (buttercup-run)))) + + +;; +(defmacro def-test! (_name &rest _body)) + +(defmacro insert! (&rest text) + "Insert TEXT in buffer, then move cursor to last {0} marker." + `(progn + (insert ,@text) + (when (search-backward "{0}" nil t) + (replace-match "" t t)))) + +(provide 'core-tests) +;;; core-tests.el ends here diff --git a/core/packages.el b/core/packages.el index a6f962fde..d640bcb90 100644 --- a/core/packages.el +++ b/core/packages.el @@ -39,3 +39,6 @@ ;; autoload/debug.el (package! esup) + +;; autoload/test.el +(package! buttercup) diff --git a/core/test/autoload-buffers.el b/core/test/autoload-buffers.el deleted file mode 100644 index 98242988a..000000000 --- a/core/test/autoload-buffers.el +++ /dev/null @@ -1,130 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; core/test/autoload-buffers.el - -(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* ((split-width-threshold 0) - (window-min-width 0) - persp-mode - ,@buffers) - (delete-other-windows) - ,@body - (let (kill-buffer-query-functions kill-buffer-hook) - (mapc #'kill-buffer (buffer-list)))))))) - -;; -(def-test! get-buffers - (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) - (cons b doom-emacs-dir) - (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))) - (should (cl-every (lambda (x) (memq x buffers)) (list a b c)))) - ;; should produce only project buffers - (let ((buffers (doom-project-buffer-list))) - (should (cl-every (lambda (x) (memq x buffers)) (list a b))) - (should-not (memq c buffers)))) - ;; 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))))) - (projectile-mode -1))) - -(def-test! real-buffers - (let (doom-real-buffer-functions) - (with-temp-buffers!! (a b c d) - (with-current-buffer a - (setq-local buffer-file-name "x")) - (with-current-buffer b - (setq-local doom-real-buffer-p t)) - (with-current-buffer c - (rename-buffer "*C*")) - (should (doom-real-buffer-p a)) - (should (doom-real-buffer-p b)) - (should-not (doom-real-buffer-p c)) - (should-not (doom-real-buffer-p d)) - (let ((buffers (doom-real-buffer-list))) - (should (= (length buffers) 2)) - (should (cl-every (lambda (x) (memq x buffers)) (list a b))) - (should (cl-notany (lambda (x) (memq x buffers)) (list c d))))))) - -;; `doom-visible-windows' -;; `doom-visible-buffers' -;; `doom-buried-buffers' -(def-test! visible-buffers-and-windows - (with-temp-buffers!! (a b c d) - (switch-to-buffer a) - (should (eq (current-buffer) a)) - (should (eq (selected-window) (get-buffer-window a))) - (split-window nil 1) - (switch-to-buffer b) - (should (eq (current-buffer) b)) - (should (eq (selected-window) (get-buffer-window b))) - (should (cl-intersection (list a b) (doom-visible-buffers))) - (should (cl-intersection (list c d) (doom-buried-buffers))) - (should (cl-intersection (mapcar #'get-buffer-window (list a b)) - (doom-visible-windows))))) - -;; `doom-matching-buffers' -(def-test! matching-buffers - (with-temp-buffers!! (a b c) - (let ((buffers (doom-matching-buffers "^[ac]$"))) - (should (= 2 (length buffers))) - (should (cl-every #'bufferp buffers)) - (should (cl-every (lambda (x) (memq x buffers)) (list a c))) - (should (equal buffers (doom-matching-buffers "^[ac]$")))))) - -;; `doom-buffers-in-mode' -(def-test! buffers-in-mode - (with-temp-buffers!! (a b c d e) - (dolist (buf (list a b)) - (with-current-buffer buf - (delay-mode-hooks (emacs-lisp-mode)))) - (dolist (buf (list c d e)) - (with-current-buffer buf - (text-mode))) - (let ((el-buffers (doom-buffers-in-mode 'emacs-lisp-mode)) - (txt-buffers (doom-buffers-in-mode 'text-mode))) - (should (cl-every #'buffer-live-p (append el-buffers txt-buffers))) - (should (= 2 (length el-buffers))) - (should (= 3 (length txt-buffers)))))) - -;; `doom-fallback-buffer' -(def-test! fallback-buffer - (let ((fallback (doom-fallback-buffer))) - (should (buffer-live-p fallback)) - (should (equal (buffer-name fallback) doom-fallback-buffer-name)))) - -;; `doom-kill-buffer-and-windows' -(def-test! kill-buffer-and-windows - (with-temp-buffers!! (a b) - (switch-to-buffer a) (split-window-horizontally) - (switch-to-buffer b) (split-window-horizontally) - (switch-to-buffer a) - - (should (= (length (doom-visible-windows)) 3)) - (should (= (length (doom-buffer-list)) 2)) - - (doom-kill-buffer-and-windows a) - (should-not (buffer-live-p a)) - (should (= (length (doom-visible-windows)) 1)))) - -;; TODO doom/kill-all-buffers -;; TODO doom/kill-other-buffers -;; TODO doom/kill-matching-buffers -;; TODO doom/cleanup-session diff --git a/core/test/autoload-help.el b/core/test/autoload-help.el deleted file mode 100644 index 262f8fecb..000000000 --- a/core/test/autoload-help.el +++ /dev/null @@ -1,17 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; core/test/autoload-help.el - -(def-test! what-face - (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)))) - -(def-test! what-face-overlays - (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)))) diff --git a/core/test/autoload-message.el b/core/test/autoload-message.el deleted file mode 100644 index 0cdae9f09..000000000 --- a/core/test/autoload-message.el +++ /dev/null @@ -1,41 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; core/test/autoload-message.el - -;; ansi messages -(def-test! ansi-format - (let ((noninteractive t)) - (should (equal (format! "Hello %s" "World") - "Hello World")) - (should (equal (format! (red "Hello %s" "World")) - "Hello World")) - (should (equal (format! (green "Hello %s" "World")) - (format "\e[%dm%s\e[0m" - (cadr (assq 'green doom-message-fg)) - "Hello World"))) - (should (equal (format! (on-red "Hello %s" "World")) - (format "\e[%dm%s\e[0m" - (cadr (assq 'on-red doom-message-bg)) - "Hello World"))) - (should (equal (format! (bold "Hello %s" "World")) - (format "\e[%dm%s\e[0m" - (cadr (assq 'bold doom-message-fx)) - "Hello World"))))) - -(def-test! ansi-format-nested - (let ((noninteractive t)) - (should (equal (format! (bold (red "Hello %s" "World"))) - (format "\e[%dm%s\e[0m" 1 - (format "\e[%dm%s\e[0m" 31 "Hello World")))) - (should (equal (format! (on-red (bold "Hello %s" "World"))) - (format "\e[%dm%s\e[0m" 41 - (format "\e[%dm%s\e[0m" 1 "Hello World")))) - (should (equal (format! (dark (white "Hello %s" "World"))) - (format "\e[%dm%s\e[0m" 2 - (format "\e[%dm%s\e[0m" 37 "Hello World")))))) - -(def-test! ansi-format-apply - (let ((noninteractive t)) - (should (equal (format! (color 'red "Hello %s" "World")) - (format! (red "Hello %s" "World")))) - (should (equal (format! (color (if nil 'red 'blue) "Hello %s" "World")) - (format! (blue "Hello %s" "World")))))) diff --git a/core/test/autoload-package.el b/core/test/autoload-package.el deleted file mode 100644 index cb5f8595e..000000000 --- a/core/test/autoload-package.el +++ /dev/null @@ -1,72 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; core/test/autoload-package.el - -(require 'package) -(require 'quelpa) - -(defun -pkg (name version &optional reqs) - (package-desc-create :name name :version version :reqs reqs)) - -(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 _)))) - ,@body)) - ;; (delete-directory doom-packages-dir t) - )) - - -;; -;; Tests -;; - -(def-test! backend-detection - (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 'org) 'emacs)))) - -(def-test! elpa-outdated-detection - (let* ((package-alist - `((doom-dummy ,(-pkg 'doom-dummy '(20160405 1234))))) - (package-archive-contents - `((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))))))) - -;; TODO quelpa-outdated-detection - -(def-test! get-packages - (let ((quelpa-initialized-p t)) - (with-packages!! - '((doom-dummy)) - '((doom-dummy nil) - (doom-dummy-unwanted nil) - (doom-dummy-dep nil)) - (should (equal (doom-get-packages) '((doom-dummy))))))) - -(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!! - '((doom-dummy)) - `((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!! - '((doom-dummy) (doom-dummy-installed)) - `((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 deleted file mode 100644 index bf1d1a934..000000000 --- a/core/test/core-lib.el +++ /dev/null @@ -1,116 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; core/test/core-lib.el - -;; --- Helpers ---------------------------- - -;; `doom--resolve-path-forms' -(def-test! resolve-path-forms - (should - (equal (doom--resolve-path-forms '(and "fileA" "fileB")) - '(and (file-exists-p (expand-file-name "fileA" nil)) - (file-exists-p (expand-file-name "fileB" nil)))))) - -;; `doom--resolve-hook-forms' -(def-test! resolve-hook-forms - (should (equal (doom--resolve-hook-forms '(js2-mode haskell-mode)) - '(js2-mode-hook haskell-mode-hook))) - (should (equal (doom--resolve-hook-forms '(quote (js2-mode-hook haskell-mode-hook))) - '(js2-mode-hook haskell-mode-hook)))) - -;; `doom-unquote' -(def-test! unquote - (should (equal (doom-unquote '(quote (a b c))) '(a b c))) - ;; nested - (should (equal (doom-unquote '(quote (quote (a b c)))) '(a b c))) - ;; sub-quote - (should (equal (doom-unquote '(quote (a (quote b) c))) '(a (quote b) c))) - ;; function - (should (equal (doom-unquote '(function a)) 'a))) - -;; `doom-enlist' -(def-test! enlist - (should (equal (doom-enlist 'a) '(a))) - (should (equal (doom-enlist '(a)) '(a)))) - - -;; --- Macros ----------------------------- - -;; `add-hook!' -(def-test! add-one-to-one-hook - (let ((hooks '(old-hook))) - (add-hook! 'hooks 'a-hook) - (should (equal hooks '(a-hook old-hook))))) - -(def-test! add-many-to-one-hook - (let ((hooks '(hook-x))) - (add-hook! 'hooks '(hook-a hook-b hook-c)) - (should (equal hooks '(hook-a hook-b hook-c hook-x))))) - -(def-test! add-one-to-many-hooks - (let (hooks-a hooks-b hooks-c) - (add-hook! '(hooks-a hooks-b hooks-c) 'a-hook) - (should (equal hooks-a '(a-hook))) - (should (equal hooks-b '(a-hook))) - (should (equal hooks-c '(a-hook))))) - -(def-test! add-many-to-many-hooks - (let (hooks-a hooks-b hooks-c) - (add-hook! '(hooks-a hooks-b hooks-c) '(hook-a hook-b hook-c)) - (should (equal hooks-a '(hook-a hook-b hook-c))) - (should (equal hooks-b '(hook-a hook-b hook-c))) - (should (equal hooks-c '(hook-a hook-b hook-c))))) - -(def-test! add-non-literal-hooks - (let (some-mode-hook) - (add-hook! some-mode 'a-hook) - (should (equal some-mode-hook '(a-hook))))) - -;; `remove-hook!' -(def-test! remove-hooks - (let ((hooks-a '(hook-c hook-b hook-a)) - (hooks-b '(hook-c hook-b hook-a)) - (hooks-c '(hook-c hook-b hook-a))) - (remove-hook! '(hooks-a hooks-b hooks-c) '(hook-a hook-b hook-c)) - (should (null hooks-a)) - (should (null hooks-b)) - (should (null hooks-c)))) - -(def-test! remove-hook-forms - (let (hooks) - (add-hook! 'hooks (message "Hello world")) - (should hooks) - (remove-hook! 'hooks (message "Hello world")) - (should (null hooks)))) - -;; `add-transient-hook!' -(def-test! transient-hooks - (let (hooks value) - (add-transient-hook! 'hooks (setq value t)) - (run-hooks 'hooks) - (should (eq value t)) - (should (null hooks)))) - -(def-test! transient-function - (let (value) - (add-transient-hook! #'ignore (setq value (not value))) - (ignore t) - (should (eq value t)) - ;; repeat to ensure it was only run once - (ignore t) - (should (eq value t)))) - - -;; TODO `associate!' - - -;; --- Settings --------------------------- - -(def-test! set - (eval-and-compile - (def-setting! :-test-setting (x) `(setq result ,x)) - (should (fboundp 'doom--set:-test-setting)) - (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 deleted file mode 100644 index 47435061b..000000000 --- a/core/test/core-projects.el +++ /dev/null @@ -1,47 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ../core/test/core-projects.el - -(require 'projectile) - -;; -;; `doom-project-p' -(def-test! project-p - :minor-mode projectile-mode - (let ((buffer-file-name (expand-file-name "init.el" doom-emacs-dir)) - (default-directory doom-emacs-dir)) - (should (doom-project-p))) - (let ((buffer-file-name (expand-file-name "test" "~")) - (default-directory (expand-file-name "~"))) - (should-not (doom-project-p)))) - -;; `doom-project-root' -(def-test! project-root - :minor-mode projectile-mode - ;; Should resolve to project root - (let ((buffer-file-name (expand-file-name "core.el" doom-core-dir)) - (default-directory doom-core-dir)) - (should (equal (doom-project-root) doom-emacs-dir))) - ;; Should resolve to `default-directory' if not a project - (let ((buffer-file-name (expand-file-name "test" "~")) - (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)))))) - -;; `project-file-exists-p!' -(def-test! project-has! - :minor-mode projectile-mode - (let ((default-directory doom-core-dir)) - ;; Resolve from project root - (should (project-file-exists-p! "init.el")) - ;; Chained file checks - (should (project-file-exists-p! (and "init.el" "LICENSE"))) - (should (project-file-exists-p! (or "init.el" "does-not-exist"))) - (should (project-file-exists-p! (and "init.el" (or "LICENSE" "does-not-exist")))) - ;; Should resolve relative paths from `default-directory' - (should (project-file-exists-p! (and "core/core.el" "./init.el"))))) diff --git a/core/test/core-ui.el b/core/test/core-ui.el deleted file mode 100644 index 9491628a7..000000000 --- a/core/test/core-ui.el +++ /dev/null @@ -1,34 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ../core/test/core-ui.el - -(defmacro with-temp-windows!! (&rest body) - (declare (indent defun)) - `(cl-flet ((split-window (symbol-function #'split-window-horizontally))) - (delete-other-windows) - (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 ((after-change-major-mode-hook '(doom|set-mode-name)) - (doom-major-mode-names '((text-mode . "abc") - (lisp-mode . (lambda () "xyz")) - (js-mode . t)))) - (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))))) diff --git a/core/test/test-autoload-buffers.el b/core/test/test-autoload-buffers.el new file mode 100644 index 000000000..931c4ddfa --- /dev/null +++ b/core/test/test-autoload-buffers.el @@ -0,0 +1,114 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-autoload-buffers.el + +(load! "autoload/buffers" doom-core-dir) + +;; +(describe "core/autoload/buffers" + :var (a b c d) + (before-all + (spy-on 'buffer-list :and-call-fake + (lambda (&optional _) + (cl-remove-if-not #'buffer-live-p (list a b c d))))) + (before-each + (delete-other-windows) + (setq a (switch-to-buffer (get-buffer-create "a")) + b (get-buffer-create "b") + c (get-buffer-create "c") + d (get-buffer-create "d"))) + (after-each + (kill-buffer a) + (kill-buffer b) + (kill-buffer c) + (kill-buffer d)) + + (describe "buffer-list" + (it "should only see four buffers" + (expect (doom-buffer-list) :to-have-same-items-as (list a b c d)))) + + (describe "project-buffer-list" + :var (projectile-projects-cache-time projectile-projects-cache) + (before-all (require 'projectile)) + (after-all (unload-feature 'projectile t)) + + (before-each + (with-current-buffer a (setq default-directory doom-emacs-dir)) + (with-current-buffer b (setq default-directory doom-emacs-dir)) + (with-current-buffer c (setq default-directory "/tmp/")) + (with-current-buffer d (setq default-directory "~")) + (projectile-mode +1)) + (after-each + (projectile-mode -1)) + + (it "returns buffers in the same project" + (with-current-buffer a + (expect (doom-project-buffer-list) + :to-have-same-items-as (list a b)))) + + (it "returns all buffers if not in a project" + (with-current-buffer c + (expect (doom-project-buffer-list) + :to-have-same-items-as (buffer-list))))) + + (describe "fallback-buffer" + (it "returns a live buffer" + (expect (buffer-live-p (doom-fallback-buffer))))) + + (describe "real buffers" + (before-each + (doom-set-buffer-real a t) + (with-current-buffer b (setq buffer-file-name "x")) + (with-current-buffer c (rename-buffer "*C*"))) + + (describe "real-buffer-p" + (it "returns t for buffers manually marked real" + (expect (doom-real-buffer-p a))) + (it "returns t for file-visiting buffers" + (expect (doom-real-buffer-p b))) + (it "returns nil for temporary buffers" + (expect (doom-real-buffer-p c) :to-be nil) + (expect (doom-real-buffer-p d) :to-be nil))) + + (describe "real-buffer-list" + (it "returns only real buffers" + (expect (doom-real-buffer-list) :to-have-same-items-as (list a b))))) + + (describe "buffer/window management" + (describe "buffer search methods" + (before-each + (with-current-buffer a (lisp-mode)) + (with-current-buffer b (text-mode)) + (with-current-buffer c (text-mode)) + (split-window) + (switch-to-buffer b)) + + (it "can match buffers by regexp" + (expect (doom-matching-buffers "^[ac]$") :to-have-same-items-as (list a c))) + (it "can match buffers by major-mode" + (expect (doom-buffers-in-mode 'text-mode) :to-have-same-items-as (list b c))) + (it "can find all buried buffers" + (expect (doom-buried-buffers) + :to-have-same-items-as (list c d))) + (it "can find all visible buffers" + (expect (doom-visible-buffers) + :to-have-same-items-as (list a b))) + (it "can find all visible windows" + (expect (doom-visible-windows) + :to-have-same-items-as + (mapcar #'get-buffer-window (list a b))))) + + (describe "kill-buffer-and-windows" + (before-each + (split-window) (switch-to-buffer b) + (split-window) (switch-to-buffer a)) + + (it "kills the selected buffers and all its windows" + (doom-kill-buffer-and-windows a) + (expect (buffer-live-p a) :to-be nil) + (expect (length (doom-visible-windows)) :to-be 1))) + + ;; TODO + (describe "kill-all-buffers") + (describe "kill-other-buffers") + (describe "kill-matching-buffers") + (describe "cleanup-session"))) diff --git a/core/test/test-autoload-files.el b/core/test/test-autoload-files.el new file mode 100644 index 000000000..996cd7e17 --- /dev/null +++ b/core/test/test-autoload-files.el @@ -0,0 +1,54 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-autoload-files.el + +(describe "core/autoload/files" + :var (src dest projectile-projects-cache-time projectile-projects-cache) + (before-all (require 'projectile)) + (after-all (unload-feature 'projectile t)) + + (before-each + (setq src (make-temp-file "test-src") + existing (make-temp-file "test-existing") + dest (expand-file-name "test-dest" temporary-file-directory)) + (quiet! (find-file-literally src)) + (spy-on 'y-or-n-p :and-return-value nil) + (projectile-mode +1)) + + (after-each + (projectile-mode -1) + (switch-to-buffer (doom-fallback-buffer)) + (ignore-errors (delete-file src)) + (ignore-errors (delete-file existing)) + (ignore-errors (delete-file dest))) + + (describe "move-this-file" + (it "won't move to itself" + (expect (quiet! (doom/move-this-file src)) :to-throw)) + (it "will move to another file" + (expect (quiet! (doom/move-this-file dest t))) + (expect (file-exists-p dest)) + (expect (file-exists-p src) :to-be nil)) + (it "will prompt if overwriting a file" + (quiet! (doom/move-this-file existing)) + (expect 'y-or-n-p :to-have-been-called-times 1) + (expect (file-exists-p src)))) + + (describe "copy-this-file" + (it "refuses to copy to itself" + (expect (quiet! (doom/copy-this-file src)) :to-throw)) + (it "copies to another file" + (expect (quiet! (doom/copy-this-file dest t))) + (expect (file-exists-p! src dest))) + (it "prompts if overwriting a file" + (quiet! (quiet! (doom/copy-this-file existing))) + (expect 'y-or-n-p :to-have-been-called-times 1))) + + (describe "delete-this-file" + (it "fails gracefully on non-existent files" + (expect (quiet! (doom/delete-this-file dest)) :to-throw)) + (it "deletes existing files" + (quiet! (doom/delete-this-file existing t)) + (expect (file-exists-p existing) :to-be nil)) + (it "prompts to delete any existing file" + (quiet! (doom/delete-this-file existing)) + (expect 'y-or-n-p :to-have-been-called-times 1)))) diff --git a/core/test/test-autoload-help.el b/core/test/test-autoload-help.el new file mode 100644 index 000000000..765e51f95 --- /dev/null +++ b/core/test/test-autoload-help.el @@ -0,0 +1,31 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-autoload-help.el + +(load! "autoload/help" doom-core-dir) + +;; +(describe "core/autoload/help" + :var (a) + (before-each (setq a (switch-to-buffer (get-buffer-create "a")))) + (after-each (kill-buffer a)) + + (describe "what-face" + (before-each + (insert (propertize "Hello " 'face 'font-lock-keyword-face)) + (insert "world")) + (it "returns list of faces at point" + (expect (doom/what-face (point-min)) :to-equal '((font-lock-keyword-face) ()))) + (it "returns nil if no faces at point" + (expect (doom/what-face (point-max)) :to-be nil))) + + (describe "what-face overlays" + (before-each + (insert "Hello world") + (let ((ov (make-overlay 1 6))) + (overlay-put ov 'face 'font-lock-keyword-face))) + + (it "returns list of overlays at point" + (expect (doom/what-face (point-min)) :to-equal '(() (font-lock-keyword-face)))) + (it "returns nil if no overlays at point" + (expect (doom/what-face (point-max)) :to-be nil)))) + diff --git a/core/test/test-autoload-message.el b/core/test/test-autoload-message.el new file mode 100644 index 000000000..bc8644786 --- /dev/null +++ b/core/test/test-autoload-message.el @@ -0,0 +1,37 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-autoload-message.el + +(describe "core/autoload/message" + (describe "format!" + :var (noninteractive) + (before-all (setq noninteractive t)) + + (it "should be a drop-in replacement for `format'" + (expect (format! "Hello %s" "World") + :to-equal "Hello World")) + + (it "supports ansi coloring in noninteractive sessions" + (expect (format! (red "Hello %s" "World")) + :to-equal "Hello World")) + + (it "supports faces in interactive sessions" + (let (noninteractive) + (expect (get-text-property 0 'face (format! (red "Hello %s" "World"))) + :to-equal (list :foreground (face-foreground 'term-color-red))))) + + (it "supports nested color specs" + (expect (format! (bold (red "Hello %s" "World"))) + :to-equal (format "\e[%dm%s\e[0m" 1 + (format "\e[%dm%s\e[0m" 31 "Hello World"))) + (expect (format! (on-red (bold "Hello %s" "World"))) + :to-equal (format "\e[%dm%s\e[0m" 41 + (format "\e[%dm%s\e[0m" 1 "Hello World"))) + (expect (format! (dark (white "Hello %s" "World"))) + :to-equal (format "\e[%dm%s\e[0m" 2 + (format "\e[%dm%s\e[0m" 37 "Hello World")))) + + (it "supports dynamic color apply syntax" + (expect (format! (color 'red "Hello %s" "World")) + :to-equal (format! (red "Hello %s" "World"))) + (expect (format! (color (if nil 'red 'blue) "Hello %s" "World")) + :to-equal (format! (blue "Hello %s" "World")))))) diff --git a/core/test/test-autoload-package.el b/core/test/test-autoload-package.el new file mode 100644 index 000000000..73ba65722 --- /dev/null +++ b/core/test/test-autoload-package.el @@ -0,0 +1,128 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-autoload-package.el + +(describe "core/autoload/packages" + :var (package-alist + package-archive-contents + doom-packages + quelpa-cache + quelpa-initialized-p + doom-packages-dir + doom-core-packages + package-user-dir + quelpa-dir + pkg) + + (before-all + (fset 'pkg + (lambda (name version &optional reqs) + (package-desc-create :name name :version version :reqs reqs))) + (require 'package) + (require 'quelpa) + (setq 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) + quelpa-initialized-p t + doom-core-packages nil) + (spy-on #'doom-initialize-packages :and-call-fake (lambda (&optional _))) + (spy-on #'package-refresh-contents :and-call-fake (lambda (&optional _))) + (spy-on #'quelpa-checkout :and-call-fake + (lambda (rcp _dir) + (when (eq (car rcp) 'doom-quelpa-dummy) + "20170405.1234")))) + + (after-all + (unload-feature 'package t) + (unload-feature 'quelpa t)) + + (before-each + (setq package-alist + `((doom-dummy ,(pkg 'doom-dummy '(20160405 1234))) + (doom-uptodate-dummy ,(pkg 'doom-uptodate-dummy '(20160605 1234))) + (doom-unwanted-dummy ,(pkg 'doom-unwanted-dummy '(20160605 1234))) + (doom-quelpa-dummy ,(pkg 'doom-quelpa-dummy '(20160405 1234))) + (doom-noquelpa-dummy ,(pkg 'doom-noquelpa-dummy '(20160405 1234)))) + package-archive-contents + `((doom-dummy ,(pkg 'doom-dummy '(20170405 1234))) + (doom-uptodate-dummy ,(pkg 'doom-uptodate-dummy '(20160605 1234)))) + doom-packages + '((doom-dummy) + (doom-uptodate-dummy) + (doom-missing-dummy) + (doom-noquelpa-dummy) + (doom-disabled-dummy :disable t) + (doom-private-dummy :private t) + (doom-disabled-private-dummy :private t :disable t) + (doom-quelpa-dummy :recipe (doom-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist"))) + quelpa-cache + '((doom-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist") + (doom-noquelpa-dummy :fetcher github :repo "hlissner/does-not-exist-3") + (doom-new-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist-2")))) + + (describe "package-backend" + (it "determines the correct backend of a package" + (expect (doom-package-backend 'doom-dummy) :to-be 'elpa) + (expect (doom-package-backend 'doom-quelpa-dummy) :to-be 'quelpa) + (expect (doom-package-backend 'org) :to-be 'emacs)) + (it "errors out if package isn't installed" + (expect (doom-package-backend 'xyz) :to-throw))) + + (describe "package-outdated-p (elpa)" + (it "detects outdated ELPA packages and returns both versions" + (expect (doom-package-outdated-p 'doom-dummy) + :to-equal '(doom-dummy (20160405 1234) (20170405 1234)))) + (it "ignores up-to-date ELPA packages" + (expect (doom-package-outdated-p 'doom-uptodate-dummy) :to-be nil)) + + (it "detects outdated QUELPA packages and returns both versions" + (expect (doom-package-outdated-p 'doom-quelpa-dummy) + :to-equal '(doom-quelpa-dummy (20160405 1234) (20170405 1234)))) + (it "ignores up-to-date QUELPA packages" + (expect (doom-package-outdated-p 'doom-uptodate-dummy) :to-be nil)) + + (it "returns nil if package isn't installed" + (expect (doom-package-outdated-p 'xyz) :to-be nil))) + + (describe "get-packages" + (it "returns all packages" + (expect (mapcar #'car (doom-get-packages)) + :to-have-same-items-as + (mapcar #'car doom-packages))) + (it "returns only disabled packages" + (expect (mapcar #'car (doom-get-packages :disabled t)) + :to-have-same-items-as + '(doom-disabled-dummy doom-disabled-private-dummy))) + (it "returns only non-disabled packages" + (expect (mapcar #'car (doom-get-packages :disabled nil)) + :to-have-same-items-as + '(doom-dummy doom-uptodate-dummy doom-quelpa-dummy doom-missing-dummy doom-noquelpa-dummy doom-private-dummy))) + (it "returns only installed packages" + (expect (mapcar #'car (doom-get-packages :disabled nil :installed t)) + :to-have-same-items-as + '(doom-dummy doom-uptodate-dummy doom-quelpa-dummy doom-noquelpa-dummy))) + (it "returns only non-installed packages" + (expect (mapcar #'car (doom-get-packages :disabled nil :installed nil)) + :to-have-same-items-as + '(doom-missing-dummy doom-private-dummy))) + (it "returns only private packages" + (expect (mapcar #'car (doom-get-packages :private t)) + :to-have-same-items-as + '(doom-private-dummy doom-disabled-private-dummy))) + (it "returns only disabled and private packages" + (expect (mapcar #'car (doom-get-packages :disabled t :private t)) + :to-have-same-items-as + '(doom-disabled-private-dummy)))) + + (describe "get-orphaned-packages" + (it "returns orphaned packages" + (expect (doom-get-orphaned-packages) :to-contain 'doom-unwanted-dummy)) + (it "returns packages that have changed backends" + (expect (doom-get-orphaned-packages) :to-contain 'doom-noquelpa-dummy))) + + (describe "get-missing-packages" + (it "returns packages that haven't been installed" + (expect (mapcar #'car (doom-get-missing-packages)) + :to-contain 'doom-missing-dummy)) + (it "returns packages that have changed backends" + (expect (mapcar #'car (doom-get-missing-packages)) + :to-contain 'doom-noquelpa-dummy)))) diff --git a/core/test/test-core-lib.el b/core/test/test-core-lib.el new file mode 100644 index 000000000..761cd49a2 --- /dev/null +++ b/core/test/test-core-lib.el @@ -0,0 +1,90 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-core-lib.el + +(describe "core/lib" + ;; --- Helpers ---------------------------- + (describe "doom-unquote" + (it "unquotes a quoted form" + (expect (doom-unquote '(quote hello)) :to-be 'hello)) + (it "unquotes nested-quoted forms" + (expect (doom-unquote '(quote (quote (a b c)))) :to-equal '(a b c))) + (it "unquotes function-quoted forms" + (expect (doom-unquote '(function a)) :to-be 'a)) + (it "does nothing to unquoted forms" + (expect (doom-unquote 'hello) :to-be 'hello))) + + (describe "doom-enlist" + (it "creates a list out of non-lists" + (expect (doom-enlist 'a) :to-equal '(a))) + (it "does nothing to lists" + (expect (doom-enlist '(a)) :to-equal '(a)))) + + + ;; --- Macros ----------------------------- + (describe "hooks" + (describe "add-hook!" + :var (fake-mode-hook other-mode-hook some-mode-hook) + (before-each + (setq fake-mode-hook '(first-hook) + other-mode-hook nil + some-mode-hook '(first-hook second-hook))) + + (it "adds one-to-one hook" + (add-hook! fake-mode #'hook-2) + (add-hook! 'fake-mode-hook #'hook-1) + (expect fake-mode-hook :to-equal '(hook-1 hook-2 first-hook))) + + (it "adds many-to-one hook" + (add-hook! (fake-mode other-mode some-mode) #'hook-2) + (add-hook! '(fake-mode-hook other-mode-hook some-mode-hook) #'hook-1) + (add-hook! :append (fake-mode other-mode some-mode) #'last-hook) + (expect fake-mode-hook :to-equal '(hook-1 hook-2 first-hook last-hook)) + (expect other-mode-hook :to-equal '(hook-1 hook-2 last-hook)) + (expect some-mode-hook :to-equal '(hook-1 hook-2 first-hook second-hook last-hook))) + + (it "adds many-to-many hooks and preserve provided order" + (add-hook! (fake-mode other-mode some-mode) #'(hook-3 hook-4)) + (add-hook! '(fake-mode-hook other-mode-hook some-mode-hook) #'(hook-1 hook-2)) + (add-hook! :append '(fake-mode-hook other-mode-hook some-mode-hook) #'(last-hook-1 last-hook-2)) + (expect fake-mode-hook :to-equal '(hook-1 hook-2 hook-3 hook-4 first-hook last-hook-1 last-hook-2)) + (expect other-mode-hook :to-equal '(hook-1 hook-2 hook-3 hook-4 last-hook-1 last-hook-2)) + (expect some-mode-hook :to-equal '(hook-1 hook-2 hook-3 hook-4 first-hook second-hook last-hook-1 last-hook-2))) + + (it "adds implicit lambda to one hook" + (add-hook! fake-mode (progn)) + (add-hook! 'other-mode-hook (ignore)) + (add-hook! :append 'some-mode-hook (ignore)) + (expect (caar fake-mode-hook) :to-be 'lambda) + (expect (caar other-mode-hook) :to-be 'lambda) + (expect (caar (last other-mode-hook)) :to-be 'lambda))) + + (describe "remove-hook!" + :var (fake-mode-hook) + (before-each + (setq fake-mode-hook '(first-hook second-hook third-hook fourth-hook))) + (it "removes one hook" + (remove-hook! fake-mode #'third-hook) + (remove-hook! 'fake-mode-hook #'second-hook) + (expect fake-mode-hook :to-equal '(first-hook fourth-hook))) + (it "removes multiple hooks" + (remove-hook! fake-mode #'(first-hook third-hook)) + (remove-hook! 'fake-mode-hook #'(second-hook fourth-hook)) + (expect fake-mode-hook :to-be nil)))) + + (describe "add-transient-hook!" + (it "adds a transient function to hooks" + (let (hooks value) + (add-transient-hook! 'hooks (setq value t)) + (run-hooks 'hooks) + (expect value) + (expect hooks :to-be nil))) + (it "advises a function with a transient advisor" + (let (value) + (add-transient-hook! #'ignore (setq value (not value))) + (ignore t) + (expect value) + ;; repeat to ensure it was only run once + (ignore t) + (expect value)))) + + (xdescribe "associate!")) ; TODO diff --git a/core/test/test-core-modules.el b/core/test/test-core-modules.el new file mode 100644 index 000000000..bd9aea708 --- /dev/null +++ b/core/test/test-core-modules.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-core-modules.el + +(describe "core-modules") diff --git a/core/test/test-core-packages.el b/core/test/test-core-packages.el new file mode 100644 index 000000000..ff3104b76 --- /dev/null +++ b/core/test/test-core-packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-core-packages.el + +(describe "core-packages") diff --git a/core/test/test-core-projects.el b/core/test/test-core-projects.el new file mode 100644 index 000000000..e2c715283 --- /dev/null +++ b/core/test/test-core-projects.el @@ -0,0 +1,46 @@ +;; -*- no-byte-compile: t; -*- +;;; ../core/test/test-core-projects.el + +(require 'core-projects) + +(describe "core/projects" + (before-all (require 'projectile)) + (after-all (unload-feature 'projectile t)) + + (before-each (projectile-mode +1)) + (after-each (projectile-mode -1)) + + (describe "project-p" + (it "Should detect when in a valid project" + (let ((buffer-file-name (expand-file-name "init.el" doom-emacs-dir)) + (default-directory doom-emacs-dir)) + (expect (doom-project-p)))) + (it "Should detect when not in a valid project" + (let ((buffer-file-name (expand-file-name "test" "~")) + (default-directory (expand-file-name "~"))) + (expect (doom-project-p) :to-be nil)))) + + (describe "project-root" + (it "should resolve to the project's root" + (let ((buffer-file-name (expand-file-name "core.el" doom-core-dir)) + (default-directory doom-core-dir)) + (expect (doom-project-root) :to-equal doom-emacs-dir))) + (it "should resolve to the `default-directory'" + (let ((buffer-file-name (expand-file-name "test" "/")) + (default-directory (expand-file-name "/"))) + (expect (doom-project-root) :to-equal default-directory)))) + + (describe "project-expand" + (it "expands to a path relative to the project root" + (let ((default-directory doom-core-dir)) + (expect (doom-project-expand "init.el") + :to-equal (expand-file-name "init.el" (doom-project-root)))))) + + (describe "project-file-exists-p!" + (let ((default-directory doom-core-dir)) + ;; Resolve from project root + (expect (project-file-exists-p! "init.el")) + ;; Chained file checks + (expect (project-file-exists-p! (and "init.el" "LICENSE"))) + (expect (project-file-exists-p! (or "init.el" "does-not-exist"))) + (expect (project-file-exists-p! (and "init.el" (or "LICENSE" "does-not-exist"))))))) diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el new file mode 100644 index 000000000..d347392f9 --- /dev/null +++ b/core/test/test-core-ui.el @@ -0,0 +1,132 @@ +;; -*- no-byte-compile: t; -*- +;;; ../core/test/test-core-ui.el + +(describe "core/ui" + (describe "doom|set-mode-name" + :var (doom-major-mode-names after-change-major-mode-hook) + (before-all + (setq doom-major-mode-names + '((text-mode . "abc") + (lisp-mode . (lambda () "xyz")) + (js-mode . t)) + after-change-major-mode-hook '(doom|set-mode-name))) + + (it "changes `mode-name' to match a given string" + (text-mode) + (expect mode-name :to-equal "abc")) + + (it "changes `mode-name' to the result of a function" + (lisp-mode) + (expect mode-name :to-equal "xyz")) + + (it "should fail if given an invalid name" + (expect (js-mode) :to-throw 'error))) + + + (describe "doom|protect-visible-buffers" + :var (kill-buffer-query-functions wconf a b) + (before-each + (setq a (switch-to-buffer (get-buffer-create "a")) + b (get-buffer-create "b") + kill-buffer-query-functions '(doom|protect-visible-buffers) + wconf (current-window-configuration)) + (delete-other-windows)) + + (after-each + (let (kill-buffer-query-functions kill-buffer-hook) + (kill-buffer a) + (kill-buffer b)) + (set-window-configuration wconf)) + + (it "shouldn't kill buffers that are visible in more than one window" + (with-temp-buffer-window + (switch-to-buffer a) (split-window) + (switch-to-buffer b) (split-window) + (switch-to-buffer a) + (expect (kill-buffer) :to-be nil) + + (select-window (get-buffer-window b)) + (expect (kill-buffer))))) + + + (describe "doom|protect-fallback-buffer" + :var (kill-buffer-query-functions a b) + (before-all + (setq kill-buffer-query-functions '(doom|protect-fallback-buffer))) + + (it "should kill other buffers" + (expect (kill-buffer (get-buffer-create "a")))) + + (it "shouldn't kill the fallback buffer" + (expect (not (kill-buffer (doom-fallback-buffer)))))) + + + (describe "switch hooks" + :var (before-hook after-hook a b) + (before-each + (setq a (switch-to-buffer (get-buffer-create "a")) + b (get-buffer-create "b")) + (spy-on 'before-hook) + (spy-on 'after-hook) + (doom|init-custom-hooks)) + (after-each + (doom|init-custom-hooks 'disable) + (kill-buffer a) + (kill-buffer b)) + + + (describe "switch-buffer" + :var (doom-before-switch-buffer-hook + doom-after-switch-buffer-hook) + (before-each + (setq doom-before-switch-buffer-hook '(before-hook) + doom-after-switch-buffer-hook '(after-hook))) + (after-each + (setq doom-before-switch-buffer-hook nil + doom-after-switch-buffer-hook nil)) + + (it "should trigger when switching buffers" + (switch-to-buffer b) + (switch-to-buffer a) + (switch-to-buffer b) + (expect 'before-hook :to-have-been-called-times 3) + (expect 'after-hook :to-have-been-called-times 3)) + + (it "should trigger only once on the same buffer" + (switch-to-buffer b) + (switch-to-buffer b) + (switch-to-buffer a) + (expect 'before-hook :to-have-been-called-times 2) + (expect 'after-hook :to-have-been-called-times 2))) + + + (describe "switch-window" + :var (doom-before-switch-window-hook + doom-after-switch-window-hook + x y) + (before-each + (delete-other-windows) + (setq x (get-buffer-window a) + y (save-selected-window (split-window))) + (with-selected-window y + (switch-to-buffer b)) + (select-window x) + (spy-calls-reset 'before-hook) + (spy-calls-reset 'after-hook) + (setq doom-before-switch-window-hook '(before-hook) + doom-after-switch-window-hook '(after-hook))) + + (it "should trigger when switching windows" + (select-window y) + (select-window x) + (select-window y) + (expect 'before-hook :to-have-been-called-times 3) + (expect 'after-hook :to-have-been-called-times 3)) + + (it "should trigger only once on the same window" + (select-window y) + (select-window y) + (select-window x) + (expect 'before-hook :to-have-been-called-times 2) + (expect 'after-hook :to-have-been-called-times 2))))) + diff --git a/core/test/test-core.el b/core/test/test-core.el new file mode 100644 index 000000000..437df8173 --- /dev/null +++ b/core/test/test-core.el @@ -0,0 +1,56 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-core.el + +(xdescribe "core" + (describe "initialize" + :var (doom-init-p doom-init-modules-p doom-private-dir) + (before-each + (setq doom-init-p nil + doom-init-modules-p nil + doom-private-dir doom-emacs-dir) + + (spy-on 'require) + (spy-on 'load) + (spy-on 'doom//reload-doom-autoloads) + (spy-on 'doom//reload-package-autoloads) + (spy-on 'doom-initialize-autoloads) + (spy-on 'doom-ensure-core-directories) + (spy-on 'doom-ensure-core-packages) + (spy-on 'doom-ensure-packages-initialized) + (spy-on 'doom-ensure-same-emacs-version-p)) + + (describe "in interactive session" + :var (noninteractive) + (before-each (setq noninteractive t)) + + (it "initializes once, unless forced") + (it "does not initialize on consecutive invokations") + (it "loads all core libraries" ) + (it "loads autoloads file" ) + (it "does not load autoloads file if forced" ) + (it "regenerates missing autoloads" )) + + (describe "in non-interactive session" + :var (noninteractive) + (before-each (setq noninteractive nil)) + + (it "initializes once, unless forced") + (it "does not initialize on consecutive invokations") + (it "does not load all core libraries" ) + (it "loads autoloads file" ) + (it "does not load autoloads file if forced" ) + (it "does not regenerate missing autoloads" ))) + + (describe "initialize-packages" + (before-each (spy-on 'quelpa-setup-p)) + + (it "initializes package.el once, unless forced" ) + (it "initializes quelpa once, unless forced" ) + (it "initializes doom-packages once, unless forced" )) + + (describe "initialize-modules" + (it "loads private init.el once, unless forced" )) + + (describe "initialize-autoloads" + (it "loads autoloads file" ) + (it "ignores autoloads file if cleared" ))) diff --git a/modules/completion/company/test/company.el b/modules/completion/company/test/company.el deleted file mode 100644 index 5e4eadf3d..000000000 --- a/modules/completion/company/test/company.el +++ /dev/null @@ -1,21 +0,0 @@ -;; -*- lexical-binding: t; no-byte-compile: t; -*- -;;; completion/company/test/company.el - -;; -(def-test! set-company-backend - :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 company-backends '((backend-1) default)))) - (with-temp-buffer - (lisp-interaction-mode) - (should (equal company-backends '(backend-1 backend-2 default)))) - (with-temp-buffer - (text-mode) - (should (equal company-backends '(backend-1 default)))) - ;; global backends shouldn't be affected - (should (equal company-backends '(default))))) diff --git a/modules/completion/company/test/test-company.el b/modules/completion/company/test/test-company.el new file mode 100644 index 000000000..8d7c3d61a --- /dev/null +++ b/modules/completion/company/test/test-company.el @@ -0,0 +1,44 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; completion/company/test/test-company.el + +(load! "../autoload") + +;; +(xdescribe "completion/company" + :var (company-backends) + + (before-all + (provide 'company)) + (after-all + (unload-feature 'company t)) + + (describe ":company-backend" + :var (text-mode-hook company-backends) + (before-each + (setq company-backends '(default) + text-mode-hook nil)) + + (it "adds grouped backends" + (set-company-backend! 'text-mode '(backend-1)) + (with-temp-buffer + (text-mode) + (expect company-backends :to-equal '((backend-1) default)))) + + (it "adds multiple backends" + (set-company-backend! 'text-mode 'backend-1 'backend-2) + (with-temp-buffer + (text-mode) + (expect company-backends :to-equal '(backend-1 backend-2 default)))) + + (it "adds single backend" + (set-company-backend! 'text-mode 'backend-1) + (with-temp-buffer + (text-mode) + (expect company-backends :to-equal '(backend-1 default)))) + + (it "overwrites past values" + (set-company-backend! 'text-mode 'backend-1) + (set-company-backend! 'text-mode 'backend-2) + (with-temp-buffer + (text-mode) + (expect company-backends :to-equal '(backend-2 default)))))) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 42fda391a..51ba28006 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -18,6 +18,36 @@ `(set-evil-initial-state! ,modes ,state)) +;; +;; Custom arguments / interactive codes +;; + +;;;###autoload +(after! evil + ;; These arg types will highlight matches in the current buffer + (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) + (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) + ;; Other commands can make use of this + (evil-define-interactive-code "" + :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) + (macroexpand ' + (evil-define-interactive-code "" + :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument)))) + + ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've + ;; got to write my own argument type and interactive code to get it to do so. + (evil-ex-define-argument-type global-delim-match :runner +evil-ex-global-delim-match) + (dolist (sym '(evil-ex-global evil-ex-global-inverted)) + (evil-set-command-property sym :ex-arg 'global-delim-match)) + + ;; Forward declare these so that ex completion works, even if the autoloaded + ;; functions aren't loaded yet. + (evil-set-command-properties + '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) + (evil-set-command-properties + '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t)) + + ;; ;; Commands ;; diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 5b932d71f..52a854dcd 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -141,28 +141,6 @@ variable for an explanation of the defaults (in comments). See (advice-add #'evil-window-split :override #'+evil*window-split) (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) - ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've - ;; got to write my own argument type and interactive code to get it to do so. - (evil-ex-define-argument-type global-delim-match :runner +evil-ex-global-delim-match) - (dolist (sym '(evil-ex-global evil-ex-global-inverted)) - (evil-set-command-property sym :ex-arg 'global-delim-match)) - - ;; These arg types will highlight matches in the current buffer - (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) - (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) - ;; Other commands can make use of this - (evil-define-interactive-code "" - :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) - (evil-define-interactive-code "" - :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument))) - - ;; Forward declare these so that ex completion works, even if the autoloaded - ;; functions aren't loaded yet. - (evil-set-command-properties - '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) - (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t) - ;; Ensure jump points are created (defun +evil*set-jump (&rest _) (evil-set-jump)) diff --git a/modules/feature/evil/test/autoload-files.el b/modules/feature/evil/test/autoload-files.el deleted file mode 100644 index 1dd09486c..000000000 --- a/modules/feature/evil/test/autoload-files.el +++ /dev/null @@ -1,47 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; feature/evil/test/autoload-files.el - -(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)) - `(let ((it ,src) - (other ,dest)) - (with-temp-file it - (insert "Hello world")) - (with-minor-mode! projectile-mode - (unwind-protect - (progn - (should (file-exists-p it)) - (find-file-literally it) - (should (equal (buffer-string) "Hello world")) - (should (equal (buffer-file-name) it)) - (let ((inhibit-message (not doom-debug-mode))) - ,@body)) - (ignore-errors (delete-file it)) - ,(if dest `(ignore-errors (delete-file other))))))) - -;; -(def-test! move-this-file - ":mv" - (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)) - (should (not (file-exists-p it))))) - -(def-test! copy-this-file - ":cp" - (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)) - (should (file-exists-p it)))) - -(def-test! delete-this-file - ":rm" - (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 deleted file mode 100644 index 525f4f153..000000000 --- a/modules/feature/evil/test/evil.el +++ /dev/null @@ -1,59 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; feature/evil/test/evil.el - -;; -;; `evil-ex-replace-special-filenames' -(def-test! resolve-vim-path - (cl-flet ((do-it #'evil-ex-replace-special-filenames)) - ;; file modifiers - (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") - (default-directory "~/.emacs.d/test/modules/")) - (should (equal (do-it "%") "feature/test-evil.el")) - (should (equal (do-it "%:r") "feature/test-evil")) - (should (equal (do-it "%:r.elc") "feature/test-evil.elc")) - (should (equal (do-it "%:e") "el")) - (should (equal (do-it "%:p") (expand-file-name buffer-file-name))) - (should (equal (do-it "%:h") "feature")) - (should (equal (do-it "%:t") "test-evil.el")) - (should (equal (do-it "%:.") "feature/test-evil.el")) - (should (equal (do-it "%:~") "~/.emacs.d/test/modules/feature/test-evil.el")) - (should (equal (file-truename (do-it "%:p")) - (file-truename buffer-file-name)))) - ;; nested file modifiers - (let ((buffer-file-name "~/vim/src/version.c") - (default-directory "~/vim/")) - (should (equal (do-it "%:p") (expand-file-name "~/vim/src/version.c"))) - (should (equal (do-it "%:p:.") "src/version.c")) - (should (equal (do-it "%:p:~") "~/vim/src/version.c")) - (should (equal (do-it "%:h") "src")) - (should (equal (do-it "%:p:h") (expand-file-name "~/vim/src"))) - (should (equal (do-it "%:p:h:h") (expand-file-name "~/vim"))) - (should (equal (do-it "%:t") "version.c")) - (should (equal (do-it "%:p:t") "version.c")) - (should (equal (do-it "%:r") "src/version")) - (should (equal (do-it "%:p:r") (expand-file-name "~/vim/src/version"))) - (should (equal (do-it "%:t:r") "version"))) - ;; empty file modifiers - (let (buffer-file-name default-directory) - (should (equal (do-it "%") "")) - (should (equal (do-it "%:r") "")) - (should (equal (do-it "%:e") "")) - (should (equal (do-it "%:h") "")) - (should (equal (do-it "%:t") "")) - (should (equal (do-it "%:.") "")) - (should (equal (do-it "%:~") "")) - (should (equal (do-it "%:P") ""))))) - -(def-test! file-modifiers - (cl-flet ((do-it #'evil-ex-replace-special-filenames)) - (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") - (default-directory "~/.emacs.d/test/modules/")) - (should (equal (do-it "%:s?e?x?") "fxature/test-evil.el")) - (should (equal (do-it "%:gs?e?x?") "fxaturx/txst-xvil.xl"))))) - -(def-test! empty-file-modifiers - (cl-flet ((do-it #'evil-ex-replace-special-filenames)) - (let (buffer-file-name default-directory) - (should (equal (do-it "%:s?e?x?") "")) - (should (equal (do-it "%:gs?e?x?") ""))))) - diff --git a/modules/feature/evil/test/test-evil.el b/modules/feature/evil/test/test-evil.el new file mode 100644 index 000000000..844e37d86 --- /dev/null +++ b/modules/feature/evil/test/test-evil.el @@ -0,0 +1,66 @@ +;; -*- no-byte-compile: t; -*- +;;; feature/evil/test/test-evil.el + +(describe "feature/evil" + :var (resv project-root) + (before-all (require 'evil)) + (after-all (unload-feature 'evil t)) + (before-each + (fset 'resv #'+evil*resolve-vim-path) + (spy-on 'doom-project-root :and-call-fake (lambda () project-root))) + + ;; `evil-ex-replace-special-filenames' / `+evil*resolve-vim-path' + (describe "file modifiers" + (it "supports basic vim file modifiers" + (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") + (default-directory "~/.emacs.d/test/modules/") + (project-root "~/.emacs.d/")) + (expect (resv "%") :to-equal "feature/test-evil.el") + (expect (resv "%:r") :to-equal "feature/test-evil") + (expect (resv "%:r.elc") :to-equal "feature/test-evil.elc") + (expect (resv "%:e") :to-equal "el") + (expect (resv "%:p") :to-equal (expand-file-name buffer-file-name)) + (expect (resv "%:h") :to-equal "feature") + (expect (resv "%:t") :to-equal "test-evil.el") + (expect (resv "%:.") :to-equal "feature/test-evil.el") + (expect (resv "%:~") :to-equal "~/.emacs.d/test/modules/feature/test-evil.el") + (expect (file-truename (resv "%:p")) + :to-equal (file-truename buffer-file-name)))) + + (it "supports nested vim file modifiers" + (let ((buffer-file-name "~/vim/src/version.c") + (default-directory "~/vim/") + (project-root "~/vim/")) + (expect (resv "%:p") :to-equal (expand-file-name "~/vim/src/version.c")) + (expect (resv "%:p:.") :to-equal "src/version.c") + (expect (resv "%:p:~") :to-equal "~/vim/src/version.c") + (expect (resv "%:h") :to-equal "src") + (expect (resv "%:p:h") :to-equal (expand-file-name "~/vim/src")) + (expect (resv "%:p:h:h") :to-equal (expand-file-name "~/vim")) + (expect (resv "%:t") :to-equal "version.c") + (expect (resv "%:p:t") :to-equal "version.c") + (expect (resv "%:r") :to-equal "src/version") + (expect (resv "%:p:r") :to-equal (expand-file-name "~/vim/src/version")) + (expect (resv "%:t:r") :to-equal "version"))) + + (it "cleans up empty file modifiers" + (let (buffer-file-name default-directory) + (expect (resv "%") :to-equal "") + (expect (resv "%:r") :to-equal "") + (expect (resv "%:e") :to-equal "") + (expect (resv "%:h") :to-equal "") + (expect (resv "%:t") :to-equal "") + (expect (resv "%:.") :to-equal "") + (expect (resv "%:~") :to-equal "") + (expect (resv "%:P") :to-equal ""))) + + (it "supports substitution modifiers" + (let ((buffer-file-name "~/.emacs.d/test/modules/feature/test-evil.el") + (default-directory "~/.emacs.d/test/modules/")) + (expect (resv "%:s?e?x?") :to-equal "fxature/test-evil.el") + (expect (resv "%:gs?e?x?") :to-equal "fxaturx/txst-xvil.xl"))) + + (it "cleans up empty substitution modifiers" + (let (buffer-file-name default-directory) + (expect (resv "%:s?e?x?") :to-equal "") + (expect (resv "%:gs?e?x?") :to-equal ""))))) diff --git a/modules/feature/workspaces/test/autoload-workspaces.el b/modules/feature/workspaces/test/autoload-workspaces.el deleted file mode 100644 index acd647ba9..000000000 --- a/modules/feature/workspaces/test/autoload-workspaces.el +++ /dev/null @@ -1,124 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; feature/workspaces/test/autoload-workspaces.el - -(require! :feature workspaces) -(doom|init-custom-hooks) - -(defmacro with-workspace!! (buffer-args &rest body) - (declare (indent defun)) - (let ((buffers - (cl-loop for bsym in buffer-args - collect `(,bsym (get-buffer-create ,(symbol-name bsym)))))) - `(let ((persp-auto-resume-time -1) - (persp-auto-save-opt 0)) - (require 'persp-mode) - (let (noninteractive) - (persp-mode +1)) - (let (persp-before-switch-functions persp-activated-functions) - (+workspace-switch +workspaces-main t)) - (let* (,@buffers) - (cl-loop with persp = (get-current-persp) - for buf in (list ,@(mapcar #'car buffers)) - do (persp-add-buffer buf persp) - do (with-current-buffer buf - (setq buffer-file-name (make-temp-file "workspaces-test-")))) - ,@body - (let (kill-buffer-query-functions kill-buffer-hook) - (mapc #'kill-buffer (list ,@(mapcar #'car buffers))))) - (let (noninteractive) - (persp-mode -1))))) - -;; `+workspaces|init' -(def-test! init - (with-workspace!! () - (should (equal (+workspace-current-name) +workspaces-main)))) - -;; `+workspaces*auto-add-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))))) - -;; `+workspace-current' -;; `+workspace-current-name' -(def-test! current - (with-workspace!! () - (should (equal (+workspace-current-name) +workspaces-main)) - (should (+workspace-exists-p +workspaces-main)) - (let ((workspace (+workspace-get +workspaces-main)) - (current-workspace (+workspace-current))) - (should workspace) - (should (+workspace-p workspace)) - (should (+workspace-p current-workspace)) - (should (equal workspace current-workspace))))) - -;; `+workspace-list' -;; `+workspace-list-names' -(def-test! workspace-list - (with-workspace!! () - (should (equal (+workspace-list-names) - (list (+workspace-current-name)))) - (should (equal (+workspace-list) - (list (+workspace-current)))))) - -;; `+workspace-new' -;; `+workspace-rename' -;; `+workspace-delete' -(def-test! workspace-crud - "Creating, reading, updating and deleting workspaces." - (with-workspace!! () - (let ((new-workspace-name "*new-test*") - (renamed-workspace-name "*old-test*")) - (should (+workspace-new new-workspace-name)) - (should (seq-contains (+workspace-list-names) new-workspace-name)) - (should (equal new-workspace-name - (+workspace-rename new-workspace-name renamed-workspace-name))) - (should-not (seq-contains (+workspace-list-names) new-workspace-name)) - (should (seq-contains (+workspace-list-names) renamed-workspace-name)) - (should (= (length (+workspace-list-names)) 2)) - (+workspace-delete renamed-workspace-name) - (should (= (length (+workspace-list-names)) 1))))) - -;; `+workspace-switch' -(def-test! workspace-switch - (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))))) - -;; `+workspace-buffer-list' -;; `+workspace-contains-buffer-p' -(def-test! buffer-list - (with-workspace!! (a b) - (let ((c (get-buffer-create "c")) - (d (get-buffer-create "d"))) - (should (+workspace-contains-buffer-p a)) - (should (+workspace-contains-buffer-p b)) - (should-not (+workspace-contains-buffer-p c)) - ;; New (and real) buffers should be added to workspace buffer list. - (doom-set-buffer-real c t) - (switch-to-buffer "c") - (should (+workspace-contains-buffer-p c)) - ;; unreal buffers shouldn't - (switch-to-buffer "d") - (should-not (+workspace-contains-buffer-p d))))) - -;; `+workspace/close-window-or-workspace' -(def-test! close-window-or-workspace - (with-workspace!! (a b) - (let ((ws (+workspace-current-name)) - (inhibit-message t)) - (+workspace-switch "test" t) - (split-window) - (should (equal (+workspace-current-name) "test")) - (should (= (length (doom-visible-windows)) 2)) - ;; kill window if more than one - (+workspace/close-window-or-workspace) - (should (= (length (doom-visible-windows)) 1)) - ;; kill workspace on last window - (+workspace/close-window-or-workspace) - (should (equal (+workspace-current-name) "main"))))) diff --git a/modules/feature/workspaces/test/test-workspaces.el b/modules/feature/workspaces/test/test-workspaces.el new file mode 100644 index 000000000..7d7d1f6a9 --- /dev/null +++ b/modules/feature/workspaces/test/test-workspaces.el @@ -0,0 +1,135 @@ +;; -*- no-byte-compile: t; -*- +;;; feature/workspaces/test/test-workspaces.el + +(describe "feature/workspaces" + :var (persp-auto-resume-time + persp-auto-save-opt + persp-switch-to-added-buffer + in1 in2 out1 out2 + persp1 persp1-name persp2 persp2-name + doom-before-switch-buffer-hook + doom-after-switch-buffer-hook) + + (before-all + (require! :feature workspaces) + (require 'persp-mode)) + (after-all + (unload-feature 'persp-mode t)) + + (before-each + (setq persp-auto-resume-time -1 + persp-auto-save-opt 0 + persp-switch-to-added-buffer nil + in1 (get-buffer-create "a") + in2 (get-buffer-create "b") + out1 (get-buffer-create "c") + out2 (get-buffer-create "d")) + (doom-set-buffer-real in1 t) + (doom-set-buffer-real out1 t) + (let (noninteractive) + (persp-mode +1)) + (let (persp-before-switch-functions persp-activated-functions) + (setq persp1-name +workspaces-main + persp1 (persp-add-new persp1-name) + persp2-name "test" + persp2 (persp-add-new persp2-name)) + (persp-frame-switch +workspaces-main)) + (delete-other-windows) + (switch-to-buffer in1) + (persp-add-buffer (list in1 in2)) + (spy-on 'persp-add-buffer :and-call-through) + (doom|init-custom-hooks)) + + (after-each + (doom|init-custom-hooks 'disable) + (let (kill-buffer-query-functions kill-buffer-hook) + (mapc #'kill-buffer (list in1 in2 out1 out2))) + (let (noninteractive) + (mapc #'persp-kill (cdr (persp-names))) + (persp-mode -1))) + + ;; + (describe "switch" + (it "throws an error when switching to a non-existent workspace" + (expect (+workspace-switch "non-existent") :to-throw)) + (it "switches to a valid workspace" + (+workspace-switch persp2-name) + (expect (+workspace-current-name) :to-equal persp2-name))) + + (describe "current" + (it "returns the current workspace persp" + (expect (+workspace-p (+workspace-current))) + (expect (+workspace-current) :to-equal (get-current-persp))) + (it "returns the current workspace's name" + (expect (+workspace-current-name) :to-equal persp1-name) + (persp-switch (persp-name persp2)) + (expect (+workspace-current-name) :to-equal persp2-name))) + + (describe "exists-p" + (it "returns t for valid workspaces" + (expect (+workspace-exists-p persp1-name))) + (it "returns t for non-current (but valid) workspaces" + (expect (+workspace-exists-p persp2-name))) + (it "returns nil for non-existent workspaces" + (expect (+workspace-exists-p "non-existent") :to-be nil))) + + (describe "buffer membership" + (it "returns t for buffers in current workspace" + (expect (+workspace-contains-buffer-p in1))) + (it "returns nil for buffers outside of current workspace" + (expect (+workspace-contains-buffer-p out1) :to-be nil)) + (it "automatically adds interactively opened buffers" + (expect (+workspace-contains-buffer-p out1) :to-be nil) + (switch-to-buffer out1) + (expect (+workspace-contains-buffer-p out1))) + (xit "returns a list of orphaned buffers" + (expect (+workspace-orphaned-buffer-list) :to-contain out2))) + + (describe "list" + (it "returns a list of names" + (expect (+workspace-list-names) + :to-have-same-items-as (list persp1-name persp2-name))) + (it "returns a list of perspective structs" + (expect (+workspace-list) + :to-have-same-items-as (list persp1 persp2)))) + + (describe "CRUD" + (it "creates new workspaces" + (+workspace-new "X") + (expect (+workspace-list-names) :to-contain "X")) + (it "renames an existing workspace" + (+workspace-rename persp2-name "X") + (expect (persp-name persp2) :to-equal "X") + (expect (+workspace-list-names) + :to-have-same-items-as (list persp1-name "X"))) + (it "deletes a live workspace" + (+workspace-delete persp2-name) + (expect (+workspace-list-names) :not :to-contain persp2-name))) + + (describe "command" + (describe "new" + (it "creates a new, blank workspace" + (quiet! (+workspace/new "X")) + (expect (one-window-p)) + (expect (current-buffer) :to-be (doom-fallback-buffer))) + (it "clones a workspace" + (quiet! (+workspace/new "X" t)) + (expect (current-buffer) :to-be in1))) + + (describe "rename" + (it "renames the current workspace" + (quiet! (+workspace/rename "X")) + (expect (+workspace-current-name) :to-equal "X"))) + + (describe "close-window-or-workspace" + (before-each + (+workspace-switch persp2-name) + (split-window) + (expect (length (doom-visible-windows)) :to-be 2)) + (it "kills window if more than one window" + (quiet! (+workspace/close-window-or-workspace)) + (expect (length (doom-visible-windows)) :to-be 1)) + (it "kills workspace on last window" + (quiet! (+workspace/close-window-or-workspace) + (+workspace/close-window-or-workspace)) + (expect (+workspace-current-name) :to-equal persp1-name))))) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 838123621..d3f41f539 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -40,7 +40,7 @@ "Improve imenu support with better expression regexps and Doom-specific forms." (setq imenu-generic-expression '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|def-test!\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) @@ -113,3 +113,11 @@ (def-project-mode! +emacs-lisp-ert-mode :modes (emacs-lisp-mode) :match "/test[/-].+\\.el$") + +(associate! buttercup-minor-mode + :modes (emacs-lisp-mode) + :match "/test[/-].+\\.el$") + +(after! buttercup + (set! :yas-minor-mode 'buttercup-minor-mode)) + diff --git a/modules/lang/org/test/autoload-org.el b/modules/lang/org/test/autoload-org.el deleted file mode 100644 index 3c7b9a6bc..000000000 --- a/modules/lang/org/test/autoload-org.el +++ /dev/null @@ -1,62 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; lang/org/test/autoload-org.el - -(require! :lang org) - -(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* {|}") - (+org/insert-item 'below)) - (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** {|}") - (+org/insert-item 'below)) - (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+ {|}") - (+org/insert-item 'below)) - (should-org-buffer!! ("+ {0}List item" - " + Sub item") - ("+ List item" - " + Sub item" - "+ {|}") - (+org/insert-item 'below)) - (should-org-buffer!! ("+ {0}List item" - "+ Next item") - ("+ List item" - "+ {|}" - "+ Next item") - (+org/insert-item 'below))) - -(def-test! insert-item-numbered-list - "Should append/prepend new second-level (and higher) headers without an extra -newline." - (should-org-buffer!! ("1. {0}List item") ("1. List item\n2. {|}") - (+org/insert-item 'below)) - (should-org-buffer!! ("1. {0}List item" - "2. Sub item") - ("1. List item" - "2. {|}" - "3. Sub item") - (+org/insert-item 'below)) - (should-org-buffer!! ("1. {0}List item" - "2. Next item") - ("1. {|}" - "2. List item" - "3. Next item") - (+org/insert-item 'above))) diff --git a/modules/lang/org/test/test-org.el b/modules/lang/org/test/test-org.el new file mode 100644 index 000000000..40f78bd1e --- /dev/null +++ b/modules/lang/org/test/test-org.el @@ -0,0 +1,145 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/org/test/test-autoload-org.el + +(describe "lang/org" + ;; `+org/insert-item' + (describe "insert-item" + (before-all + (require 'org) + (load! "../autoload/org.el")) + (after-all + (unload-feature 'org t)) + + (before-each + (set-buffer (get-buffer-create "org")) + (erase-buffer) + (delay-mode-hooks (org-mode))) + (after-each + (kill-buffer (get-buffer "org"))) + + (describe "headlines" + (it "appends first-level headlines with an extra newline" + (insert! "* {0}Header") + (+org/insert-item 'below) + (expect (eobp)) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal "* Header\n\n* ")) + (it "prepends first-level headlines with an extra newline" + (insert! "* {0}Header") + (+org/insert-item 'above) + (expect (eolp)) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal "* \n\n* Header")) + + (it "appends second-level headlines with an no extra newline" + (insert! "** {0}Header") + (+org/insert-item 'below) + (expect (eobp)) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal "** Header\n** ")) + (it "prepends second-level headlines with an no extra newline" + (insert! "** {0}Header") + (+org/insert-item 'above) + (expect (eolp)) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal "** \n** Header")) + + (it "appends headlines, skipping subtrees" + (insert! "** {0}First\n" + "*** sub 1\n" + "*** sub 2\n" + "**** subsub 1\n" + "** Header") + (+org/insert-item 'below) + (expect (eolp)) + (expect (line-number-at-pos) :to-be 5) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal + (string-join '("** First" + "*** sub 1" + "*** sub 2" + "**** subsub 1" + "** " + "** Header") + "\n"))) + (it "prepends headlines, skipping subtrees" + (insert! "** First\n" + "*** sub 1\n" + "*** sub 2\n" + "**** {0}subsub 1\n" + "** Header") + (+org/insert-item 'above) + (expect (eolp)) + (expect (line-number-at-pos) :to-be 4) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal + (string-join '("** First" + "*** sub 1" + "*** sub 2" + "**** " + "**** subsub 1" + "** Header") + "\n")))) + + (describe "plain lists" + (it "appends items" + (insert! "+ {0}List item") + (+org/insert-item 'below) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal "+ List item\n+ ")) + (it "prepends items" + (insert! "+ {0}List item") + (+org/insert-item 'above) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal "+ \n+ List item")) + + (it "appends items, but skips over child items" + (insert! "+ {0}List item\n" + " + Sub item\n" + "+ List item") + (+org/insert-item 'below) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal + (string-join '("+ List item" + " + Sub item" + "+ " + "+ List item") + "\n"))) + (it "prepends items, but skips over child items" + (insert! "+ List item\n" + " + Sub item\n" + "+ {0}List item") + (+org/insert-item 'above) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal + (string-join '("+ List item" + " + Sub item" + "+ " + "+ List item") + "\n")))) + + (describe "numbered lists" + (it "appends items and updates numbers" + (insert! "1. {0}List item\n" + "2. Sub item\n" + "3. List item") + (+org/insert-item 'below) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal + (string-join '("1. List item" + "2. " + "3. Sub item" + "4. List item") + "\n"))) + (it "prepends items and updates numbers" + (insert! "1. List item\n" + "2. Sub item\n" + "3. {0}List item") + (+org/insert-item 'above) + (expect (buffer-substring-no-properties (point-min) (point-max)) + :to-equal + (string-join '("1. List item" + "2. Sub item" + "3. " + "4. List item") + "\n")))))) diff --git a/modules/lang/web/test/autoload-css.el b/modules/lang/web/test/autoload-css.el deleted file mode 100644 index 5dc3104a6..000000000 --- a/modules/lang/web/test/autoload-css.el +++ /dev/null @@ -1,32 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; lang/web/test/autoload-css.el - -(def-test! toggle-inline-or-block - (let ((css-indent-offset 2)) - (should-buffer! - ("body { color: red{0}; font-size: 2em; }") - ("body {" - " color: red{|};" - " font-size: 2em;" - "}") - (delay-mode-hooks (css-mode)) - (+css/toggle-inline-or-block)))) - -(def-test! comment-indent-new-line - (should-buffer! - ("// test{0}" - "body { color: red; font-size: 2em; }") - ("// test" - "// {|}" - "body { color: red; font-size: 2em; }") - (delay-mode-hooks (scss-mode)) - (+css/comment-indent-new-line)) - (should-buffer! - ("// test{0}" - "body { color: red; font-size: 2em; }") - ("// test" - "// {|}" - "body { color: red; font-size: 2em; }") - (delay-mode-hooks (scss-mode)) - (+css/comment-indent-new-line))) - diff --git a/modules/lang/web/test/autoload-html.el b/modules/lang/web/test/autoload-html.el deleted file mode 100644 index 95b6cc88f..000000000 --- a/modules/lang/web/test/autoload-html.el +++ /dev/null @@ -1,14 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; lang/web/test/autoload-html.el - -(def-test! encode-entities - (should (equal (+web-encode-entities "Hello world") - "Hello world")) - (should (equal (+web-encode-entities "H€llø wørld") - "H€llø wørld"))) - -(def-test! decode-entities - (should (equal (+web-decode-entities "Hello world") - "Hello world")) - (should (equal (+web-decode-entities "H€llø wørld") - "H€llø wørld"))) diff --git a/modules/lang/web/test/test-web.el b/modules/lang/web/test/test-web.el new file mode 100644 index 000000000..27edb7c73 --- /dev/null +++ b/modules/lang/web/test/test-web.el @@ -0,0 +1,93 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/web/test/test-autoload-web.el + +(describe "lang/web" + (describe "+html" + (before-all (load! "../autoload/html.el")) + + (describe "encode entities" + (it "encodes strings with html entities" + (expect (+web-encode-entities "H€llø wørld") + :to-equal "H€llø wørld")) + (it "does nothing when html entities are absent" + (expect (+web-encode-entities "Hello world") + :to-equal "Hello world"))) + + (describe "decode entities" + (it "decodes strings with html entities" + (expect (+web-decode-entities "H€llø wørld") + :to-equal "H€llø wørld")) + (it "does nothing when html entities are absent" + (expect (+web-decode-entities "Hello world") + :to-equal "Hello world")))) + + (describe "+css" + :var (css-indent-offset) + (before-all + (load! "../autoload/css.el") + (require 'smartparens) + (smartparens-mode +1)) + (after-all + (smartparens-mode -1) + (unload-feature 'smartparens t)) + + (before-each + (setq css-indent-offset 2) + (set-buffer (get-buffer-create "css")) + (delay-mode-hooks (css-mode))) + (after-each + (kill-buffer (get-buffer "css"))) + + (describe "toggle-inline-or-block" + (after-each + (+css/toggle-inline-or-block) + (expect (string-trim (buffer-string)) :to-equal + (string-join + '("body {" + " color: red;" + " font-size: 2em;" + "}") + "\n"))) + + (describe "css-mode" + (before-each ) + (it "converts inline statements into multiline blocks" + (insert! "body { color: red{0}; font-size: 2em; }")) + (it "works when cursor is on closing brace" + (insert! "body { color: red; font-size: 2em; {0}}")) + (it "works when cursor is on opening brace" + (insert! "body {{0} color: red; font-size: 2em; }")) + (it "works when cursor is on same line" + (insert! "{0}body { color: red; font-size: 2em; }")))) + + (describe "comment-indent-new-line" + (before-each + (delay-mode-hooks (scss-mode))) + + (it "continues commented lines on newline" + (insert! "// test{0}\n" + "body { color: red; font-size: 2em; }") + (+css/comment-indent-new-line) + (expect (string-trim (buffer-string)) :to-equal + (string-join + '("// test" + "// " + "body { color: red; font-size: 2em; }") + "\n")) + (expect (eolp)) + (expect (line-number-at-pos) :to-be 2)) + (it "preserves indentation within continued comments" + (insert! "// test{0}\n" + "body { color: red; font-size: 2em; }") + (+css/comment-indent-new-line) + (expect (string-trim (buffer-string)) :to-equal + (string-join + '("// test" + "// " + "body { color: red; font-size: 2em; }") + "\n")) + (expect (eolp)) + (expect (line-number-at-pos) :to-be 2))))) + + +;; diff --git a/modules/tools/password-store/test/autoload-pass.el b/modules/tools/password-store/test/autoload-pass.el deleted file mode 100644 index ec3a9d0e4..000000000 --- a/modules/tools/password-store/test/autoload-pass.el +++ /dev/null @@ -1,42 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; tools/password-store/test/autoload-pass.el - -(load! "../autoload") - -(defmacro with-passwords!! (buffer-args &rest body) - (declare (indent defun)) - `(cl-letf - (((symbol-function '+pass-get-entry) - (lambda (entry) - (when (equal entry "fake/source") - '((secret . "defuse-account-gad") - ("login" . "HL2532-GANDI") - ("alt-login" . "hlissner") - ("email" . "henrik@lissner.net") - ("url" . "https://www.gandi.net/login")))))) - ,@body)) - -;; -(def-test! get-field - (with-passwords!! - (should (equal (+pass-get-field "fake/source" "login") - "HL2532-GANDI")) - (should (equal (+pass-get-field "fake/source" "email") - "henrik@lissner.net")) - (should (equal (+pass-get-field "fake/source" '("alt-login" "email")) - "hlissner")) - (should (equal (+pass-get-field "fake/source" '("username" "email")) - "henrik@lissner.net")))) - -(def-test! missing-fields-return-nil - (with-passwords!! - (should-not (+pass-get-field "fake/source" '("x" "y" "z"))))) - -(def-test! missing-entries-throw-error - (with-passwords!! - (should-error (+pass-get-field "nonexistent/source" "login")))) - -(def-test! get-login - (with-passwords!! - (should (equal (+pass-get-user "fake/source") "HL2532-GANDI")) - (should (equal (+pass-get-secret "fake/source") "defuse-account-gad")))) diff --git a/modules/tools/password-store/test/test-pass.el b/modules/tools/password-store/test/test-pass.el new file mode 100644 index 000000000..b1138fa75 --- /dev/null +++ b/modules/tools/password-store/test/test-pass.el @@ -0,0 +1,41 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/password-store/test/test-pass.el + +(describe "tools/password-store" + (before-all + (load! "../autoload")) + + (before-each + (spy-on 'auth-source-pass-parse-entry :and-call-fake + (lambda (entry) + (when (equal entry "fake/source") + '((secret . "defuse-account-gad") + ("login" . "HL2532") + ("alt-login" . "hlissner") + ("email" . "henrik@lissner.net") + ("url" . "https://some-place.net/login")))))) + + (describe "get field" + (it "returns specific fields" + (expect (+pass-get-field "fake/source" "email") + :to-equal "henrik@lissner.net")) + (it "returns first existing of a list of fields" + (expect (+pass-get-field "fake/source" '("alt-login" "email")) + :to-equal "hlissner") + (expect (+pass-get-field "fake/source" '("username" "email")) + :to-equal "henrik@lissner.net")) + (it "returns nil for missing fields" + (expect (+pass-get-field "fake/source" '("x" "y" "z")) + :to-be nil)) + (it "throws error on missing entries" + (expect (+pass-get-field "nonexistent/source" "login") + :to-throw))) + + (describe "get user/secret" + (it "returns the user" + (let ((+pass-user-fields '("login" "user" "username" "email"))) + (expect (+pass-get-user "fake/source") + :to-equal "HL2532"))) + (it "returns the secret" + (expect (+pass-get-secret "fake/source") + :to-equal "defuse-account-gad")))) diff --git a/modules/ui/doom-dashboard/test/doom-dashboard.el b/modules/ui/doom-dashboard/test/doom-dashboard.el deleted file mode 100644 index cfa828ca9..000000000 --- a/modules/ui/doom-dashboard/test/doom-dashboard.el +++ /dev/null @@ -1,50 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ui/doom-dashboard/test/doom-dashboard.el - -(require! :ui doom-dashboard) - -(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 buffer-file-name file - default-directory (file-name-directory file) - doom-real-buffer-p t)) - (should +doom-dashboard--last-cwd) - (+doom-dashboard-update-pwd) - (should (equal (buffer-local-value 'default-directory fallback-buffer) - (cdr spec))))) - -;; -(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)))) - -(def-test! get-pwd - :minor-mode projectile-mode - (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) - (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! pwd-policy - :minor-mode projectile-mode - (dolist (spec (list (cons 'last-project doom-emacs-dir) - (cons 'last 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) diff --git a/modules/ui/doom-dashboard/test/test-doom-dashboard.el b/modules/ui/doom-dashboard/test/test-doom-dashboard.el new file mode 100644 index 000000000..558b96328 --- /dev/null +++ b/modules/ui/doom-dashboard/test/test-doom-dashboard.el @@ -0,0 +1,40 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/doom-dashboard/test/test-doom-dashboard.el + +(require! :ui doom-dashboard) + +(describe "ui/doom-dashboard" + :var (default-directory projectile-enable-caching) + (before-all + (require 'projectile) + (setq projectile-enable-caching nil)) + (after-all + (unload-feature 'projectile t)) + + (before-each (projectile-mode +1)) + (after-each (projectile-mode +1)) + + (describe "get-pwd" + :var (+doom-dashboard--last-cwd) + (before-each + (setq +doom-dashboard--last-cwd doom-core-dir + default-directory doom-core-dir)) + (it "returns the current directory when policy is nil" + (let (+doom-dashboard-pwd-policy) + (expect (+doom-dashboard--get-pwd) :to-equal default-directory))) + (it "returns a path if policy is a path" + (let ((+doom-dashboard-pwd-policy "~")) + (expect (+doom-dashboard--get-pwd) :to-equal (expand-file-name "~")))) + (it "returns return value of policy as a function" + (let ((+doom-dashboard-pwd-policy (lambda (x) "x"))) + (expect (+doom-dashboard--get-pwd) :to-equal "x"))) + (it "returns last cwd if policy is 'last" + (let ((+doom-dashboard-pwd-policy 'last)) + (expect (+doom-dashboard--get-pwd) :to-equal doom-core-dir))) + (it "returns last project if policy is 'last-project" + (let ((+doom-dashboard-pwd-policy 'last-project)) + (expect (+doom-dashboard--get-pwd) :to-equal doom-emacs-dir)))) + + (describe "dashboard-p" + (it "changes the fallback buffer to the dashboard buffer" + (expect (+doom-dashboard-p (doom-fallback-buffer)))))) From 0ef522bbf2540ab3574f3efd8a21db36420078c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:32:46 +0200 Subject: [PATCH 1865/4235] tools/pdf: close annotation lists when killing pdf --- modules/tools/pdf/config.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 412238da4..2d917ce2b 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -10,6 +10,22 @@ "q" #'kill-this-buffer (kbd doom-leader-key) nil) + (when (featurep! :feature evil +everywhere) + (evil-define-key* 'normal pdf-view-mode-map + "q" #'kill-this-buffer)) + + (defun +pdf|cleanup-windows () + "Kill left-over annotation buffers when the document is killed." + (when (buffer-live-p pdf-annot-list-document-buffer) + (pdf-info-close pdf-annot-list-document-buffer)) + (when (buffer-live-p pdf-annot-list-buffer) + (kill-buffer pdf-annot-list-buffer)) + (let ((contents-buffer (get-buffer "*Contents*"))) + (when (and contents-buffer (buffer-live-p contents-buffer)) + (kill-buffer contents-buffer)))) + (add-hook! 'pdf-view-mode-hook + (add-hook 'kill-buffer-hook #'+pdf|cleanup-windows nil t)) + (setq-default pdf-view-display-size 'fit-page) ;; Turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0)) From bd55e536919d97bbc9180a001c78b687c430359f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 03:58:04 +0200 Subject: [PATCH 1866/4235] Add -i/--insecure flag to bin/doom --- bin/doom | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/doom b/bin/doom index 302a8288e..6af576b2f 100755 --- a/bin/doom +++ b/bin/doom @@ -32,6 +32,7 @@ (format! (bold "Options:\n")) " -d --debug\t\tTurns on doom-debug-mode (and debug-on-error)\n" " -e --emacsd DIR\tUse the emacs config at DIR (e.g. ~/.emacs.d)\n" + " -i --insecure\t\tDisable TLS/SSL validation (not recommended)\n" " -p --private DIR\tUse the private module at DIR (e.g. ~/.doom.d)\n" " -y --yes\t\tAuto-accept all confirmation prompts\n\n") (princ (buffer-string))) @@ -47,6 +48,8 @@ (error "Did you mean 'doom help'?")) ((or "-d" "--debug") (setq doom-debug-mode t)) + ((or "-i" "--insecure") + (setenv "INSECURE" "1")) ((or "-p" "--private") (setq doom-private-dir (expand-file-name (concat (pop args) "/"))) (or (file-directory-p doom-private-dir) From cbb5b2ed7d61734bb50c26579009490f9d8a540a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:03:22 +0200 Subject: [PATCH 1867/4235] Fix unknown interactive code error in evil tests --- modules/feature/evil/test/test-evil.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/test/test-evil.el b/modules/feature/evil/test/test-evil.el index 844e37d86..94c571648 100644 --- a/modules/feature/evil/test/test-evil.el +++ b/modules/feature/evil/test/test-evil.el @@ -3,8 +3,11 @@ (describe "feature/evil" :var (resv project-root) - (before-all (require 'evil)) - (after-all (unload-feature 'evil t)) + (before-all + (require 'evil) + (load! "../autoload/evil")) + (after-all + (unload-feature 'evil t)) (before-each (fset 'resv #'+evil*resolve-vim-path) (spy-on 'doom-project-root :and-call-fake (lambda () project-root))) From eea729fdf33dfbcb1c346f6e83ef0436966a095c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:03:48 +0200 Subject: [PATCH 1868/4235] Use bin/doom in travis.yml --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9a94bfd6e..a5d3b1211 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,10 +11,10 @@ before_install: - evm install $EVM_EMACS --use --skip - mkdir -p ~/.config/doom - cp init.test.el ~/.config/doom/init.el - - INSECURE=1 YES=1 make install + - bin/doom -y -i -d refresh env: - EVM_EMACS=emacs-25.3-travis - EVM_EMACS=emacs-26.1-travis script: - - emacs --version - - DEBUG=1 make test + - bin/doom version + - bin/doom -d test From 2c0e93773badfed83317ff64965c69805d84a0d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:13:03 +0200 Subject: [PATCH 1869/4235] bin/doom: set YES and DEBUG envvars on -y/-d --- bin/doom | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index 6af576b2f..ce956c46f 100755 --- a/bin/doom +++ b/bin/doom @@ -47,7 +47,8 @@ ((or "-h" "--help") (error "Did you mean 'doom help'?")) ((or "-d" "--debug") - (setq doom-debug-mode t)) + (setq doom-debug-mode t) + (setenv "DEBUG" "1")) ((or "-i" "--insecure") (setenv "INSECURE" "1")) ((or "-p" "--private") @@ -59,7 +60,8 @@ (or (file-directory-p emacs-dir) (error "%s does not exist" emacs-dir))) ((or "-y" "--yes") - (setq doom-auto-accept t)))) + (setq doom-auto-accept t) + (setenv "YES" "1")))) ;; Bootstrap Doom (load (expand-file-name "init" emacs-dir) From fb406a165b38e45612f46d7b4d45ac4fe64296b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:22:05 +0200 Subject: [PATCH 1870/4235] bin/doom: more feedback about enabled options --- bin/doom | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/bin/doom b/bin/doom index ce956c46f..9ddbc2b54 100755 --- a/bin/doom +++ b/bin/doom @@ -48,20 +48,26 @@ (error "Did you mean 'doom help'?")) ((or "-d" "--debug") (setq doom-debug-mode t) - (setenv "DEBUG" "1")) + (setenv "DEBUG" "1") + (message "Debug mode on")) ((or "-i" "--insecure") - (setenv "INSECURE" "1")) + (setenv "INSECURE" "1") + (message "Insecure mode on")) ((or "-p" "--private") (setq doom-private-dir (expand-file-name (concat (pop args) "/"))) (or (file-directory-p doom-private-dir) - (error "%s does not exist" doom-private-dir))) + (error "%s does not exist" doom-private-dir)) + (setenv "DOOMDIR" doom-private-dir) + (message "DOOMDIR changed to %s" doom-private-dir)) ((or "-e" "--emacsd") (setq emacs-dir (expand-file-name (concat (pop args) "/"))) (or (file-directory-p emacs-dir) - (error "%s does not exist" emacs-dir))) + (error "%s does not exist" emacs-dir)) + (message "Emacs directory changed to %s" emacs-dir)) ((or "-y" "--yes") (setq doom-auto-accept t) - (setenv "YES" "1")))) + (setenv "YES" "1") + (message "Auto-yes mode on")))) ;; Bootstrap Doom (load (expand-file-name "init" emacs-dir) From 8da06c0b621400d4779a66fa5c3009273c39c48a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:22:30 +0200 Subject: [PATCH 1871/4235] travis: use doom install instead of refresh --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index a5d3b1211..b18afce32 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_install: - evm install $EVM_EMACS --use --skip - mkdir -p ~/.config/doom - cp init.test.el ~/.config/doom/init.el - - bin/doom -y -i -d refresh + - bin/doom -y -i -d install env: - EVM_EMACS=emacs-25.3-travis - EVM_EMACS=emacs-26.1-travis From 13426eecdee876918128360e455d6094a2c44c96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:24:48 +0200 Subject: [PATCH 1872/4235] Fix YES/-y support in doom refresh dispatcher --- core/core-dispatcher.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 34255dd32..d6e1f289d 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -220,8 +220,8 @@ problems with doom." (interactive "P") (doom//reload-doom-autoloads force-p) (unwind-protect - (progn (ignore-errors (doom//packages-autoremove)) - (ignore-errors (doom//packages-install))) + (progn (ignore-errors (doom//packages-autoremove doom-auto-accept)) + (ignore-errors (doom//packages-install doom-auto-accept))) (doom//reload-package-autoloads force-p) (doom//byte-compile nil 'recompile))) From 46062db9782dc80a13eb444eb72d06c765bcf882 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:33:41 +0200 Subject: [PATCH 1873/4235] travis: disable debug output while installing --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b18afce32..da351bd35 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_install: - evm install $EVM_EMACS --use --skip - mkdir -p ~/.config/doom - cp init.test.el ~/.config/doom/init.el - - bin/doom -y -i -d install + - bin/doom -y -i install env: - EVM_EMACS=emacs-25.3-travis - EVM_EMACS=emacs-26.1-travis From 5a427b1c2be537a43b2e739f774b4dd7b1a7a37d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:45:09 +0200 Subject: [PATCH 1874/4235] Move custom evil arg types back to config.el No need to autoload that. --- modules/feature/evil/autoload/evil.el | 30 --------------------------- modules/feature/evil/config.el | 26 ++++++++++++++++++++++- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 51ba28006..42fda391a 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -18,36 +18,6 @@ `(set-evil-initial-state! ,modes ,state)) -;; -;; Custom arguments / interactive codes -;; - -;;;###autoload -(after! evil - ;; These arg types will highlight matches in the current buffer - (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) - (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) - ;; Other commands can make use of this - (evil-define-interactive-code "" - :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) - (macroexpand ' - (evil-define-interactive-code "" - :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument)))) - - ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've - ;; got to write my own argument type and interactive code to get it to do so. - (evil-ex-define-argument-type global-delim-match :runner +evil-ex-global-delim-match) - (dolist (sym '(evil-ex-global evil-ex-global-inverted)) - (evil-set-command-property sym :ex-arg 'global-delim-match)) - - ;; Forward declare these so that ex completion works, even if the autoloaded - ;; functions aren't loaded yet. - (evil-set-command-properties - '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) - (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t)) - - ;; ;; Commands ;; diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 52a854dcd..509e58b9b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -144,7 +144,31 @@ variable for an explanation of the defaults (in comments). See ;; Ensure jump points are created (defun +evil*set-jump (&rest _) (evil-set-jump)) - (advice-add #'counsel-git-grep-action :before #'+evil*set-jump)) + (advice-add #'counsel-git-grep-action :before #'+evil*set-jump) + + ;; --- custom interactive codes ----------- + ;; These arg types will highlight matches in the current buffer + (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) + (evil-ex-define-argument-type global-match :runner +evil-ex-global-match) + ;; Other commands can make use of this + (evil-define-interactive-code "" + :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) + (macroexpand ' + (evil-define-interactive-code "" + :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument)))) + + ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've + ;; got to write my own argument type and interactive code to get it to do so. + (evil-ex-define-argument-type global-delim-match :runner +evil-ex-global-delim-match) + (dolist (sym '(evil-ex-global evil-ex-global-inverted)) + (evil-set-command-property sym :ex-arg 'global-delim-match)) + + ;; Forward declare these so that ex completion works, even if the autoloaded + ;; functions aren't loaded yet. + (evil-set-command-properties + '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) + (evil-set-command-properties + '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t)) ;; From f801939ce7978e76baa3e692e22a815534fc7fe5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 04:46:13 +0200 Subject: [PATCH 1875/4235] test-evil: load :feature evil module --- modules/feature/evil/test/test-evil.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/test/test-evil.el b/modules/feature/evil/test/test-evil.el index 94c571648..41fe1b3a9 100644 --- a/modules/feature/evil/test/test-evil.el +++ b/modules/feature/evil/test/test-evil.el @@ -4,6 +4,7 @@ (describe "feature/evil" :var (resv project-root) (before-all + (require! :feature evil) (require 'evil) (load! "../autoload/evil")) (after-all From 9f0ebe42e8d86ff9b1f7e2a9116b645052fa3945 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 12:30:56 +0200 Subject: [PATCH 1876/4235] Replace :electric with set-electric-rules! And general refactor of the emacs/electric-indent module. Also updates (set! :electric ...) references in various :lang modules --- modules/emacs/electric-indent/autoload.el | 25 +++++++++++++++++++ modules/emacs/electric-indent/config.el | 29 ++++------------------- modules/lang/cc/config.el | 2 +- modules/lang/data/config.el | 2 +- modules/lang/javascript/config.el | 6 ++--- modules/lang/lua/config.el | 2 +- modules/lang/python/config.el | 2 +- modules/lang/ruby/config.el | 2 +- modules/lang/sh/config.el | 2 +- 9 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 modules/emacs/electric-indent/autoload.el diff --git a/modules/emacs/electric-indent/autoload.el b/modules/emacs/electric-indent/autoload.el new file mode 100644 index 000000000..f6a8e6838 --- /dev/null +++ b/modules/emacs/electric-indent/autoload.el @@ -0,0 +1,25 @@ +;;; emacs/electric-indent/autoload.el -*- lexical-binding: t; -*- + +;;;###autodef +(defun set-electric! (modes &rest plist) + "Declare :words (list of strings) or :chars (lists of chars) in MODES that +trigger electric indentation." + (declare (indent 1)) + (cl-destructuring-bind (&key char words) plist + (when (or chars words) + (let* ((name (mapconcat #'symbol-name modes "-")) + (fn (intern (format "+electric-indent--init-%s" name)))) + (fset fn + (lambda () (electric-indent-local-mode +1) + (if chars (setq electric-indent-chars chars)) + (if words (setq +electric-indent-words words)))) + (dolist (mode modes) + (add-hook (intern (format "%s-hook" mode)) fn-name)))))) + +;; FIXME obsolete :electric +;;;###autoload +(def-setting! :electric (modes &rest plist) + "Declare :words (list of strings) or :chars (lists of chars) in MODES that +trigger electric indentation." + :obsolete set-electric! + `(set-electric! ,modes ,@plist)) diff --git a/modules/emacs/electric-indent/config.el b/modules/emacs/electric-indent/config.el index 4918f73ea..2c0a9c3e4 100644 --- a/modules/emacs/electric-indent/config.el +++ b/modules/emacs/electric-indent/config.el @@ -2,37 +2,18 @@ ;; Smarter, keyword-based electric-indent -(defvar doom-electric-indent-p nil - "TODO") - -(defvar-local doom-electric-indent-words '() - "TODO") - -(def-setting! :electric (modes &rest plist) - "Declare :words (list of strings) or :chars (lists of chars) in MODES that -trigger electric indentation." - (declare (indent 1)) - (let ((modes (doom-enlist (doom-unquote modes))) - (chars (doom-unquote (plist-get plist :chars))) - (words (doom-unquote (plist-get plist :words)))) - (when (or chars words) - (let ((fn-name (intern (format "doom--init-electric-%s" (mapconcat #'symbol-name modes "-"))))) - `(progn - (defun ,fn-name () - (electric-indent-local-mode +1) - ,@(if chars `((setq electric-indent-chars ',chars))) - ,@(if words `((setq doom-electric-indent-words ',words)))) - (add-hook! ,modes #',fn-name)))))) +(defvar-local +electric-indent-words '() + "The list of electric words. Typing these will trigger reindentation of the +current line.") ;; (after! electric (setq-default electric-indent-chars '(?\n ?\^?)) (defun +electric-indent|char (_c) - (when (and (eolp) doom-electric-indent-words) + (when (and (eolp) +electric-indent-words) (save-excursion (backward-word) - (looking-at-p - (concat "\\<" (regexp-opt doom-electric-indent-words)))))) + (looking-at-p (concat "\\<" (regexp-opt +electric-indent-words)))))) (add-to-list 'electric-indent-functions #'+electric-indent|char nil #'eq)) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 3d4d4684c..c034041c2 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -58,7 +58,7 @@ compilation database is present in the project.") c-default-style "doom") :config - (set! :electric '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) + (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index d7f448334..a1829fdc0 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -33,7 +33,7 @@ :config (when (featurep! :feature syntax-checker) (add-hook 'json-mode-hook #'flycheck-mode)) - (set! :electric 'json-mode :chars '(?\n ?: ?{ ?}))) + (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))) (def-package! vimrc-mode :mode "\\.?vimperatorrc\\'") diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 195d0e62a..93594083d 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -21,7 +21,7 @@ (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :electric 'js2-mode :chars '(?\} ?\) ?. ?:)) + (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set! :repl 'js2-mode #'+javascript/repl) ;; Conform switch-case indentation to js2 normal indent @@ -48,7 +48,7 @@ (not (sp-point-in-string-or-comment))))) (map-put magic-mode-alist #'+javascript-jsx-file-p 'rjsx-mode) :config - (set! :electric 'rjsx-mode :chars '(?\} ?\) ?. ?>)) + (set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (add-hook! 'rjsx-mode-hook ;; jshint doesn't know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers)) @@ -65,7 +65,7 @@ (after! typescript-mode (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - (set! :electric 'typescript-mode + (set-electric! 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&"))) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 9696267c1..ea2c14c5f 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -4,7 +4,7 @@ (add-hook 'lua-mode-hook #'flycheck-mode) (set! :lookup 'lua-mode :documentation 'lua-search-documentation) - (set! :electric 'lua-mode :words '("else" "end")) + (set-electric! 'lua-mode :words '("else" "end")) (set! :repl 'lua-mode #'+lua/repl) (set-company-backend! 'lua-mode '(company-lua company-yasnippet)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index ef1ea1d77..e5b38a3c5 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -25,7 +25,7 @@ is loaded.") (add-hook! 'python-mode-hook #'(flycheck-mode highlight-numbers-mode)) (set-env! "PYTHONPATH" "PYENV_ROOT") - (set! :electric 'python-mode :chars '(?:)) + (set-electric! 'python-mode :chars '(?:)) (set! :repl 'python-mode #'+python/repl) (when (executable-find "ipython") diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 21e63dd15..d8eb37c9a 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -15,7 +15,7 @@ :mode "\\.\\(?:pry\\|irb\\)rc\\'" :config (set-company-backend! 'ruby-mode 'company-dabbrev-code) - (set! :electric 'ruby-mode :words '("else" "end" "elseif")) + (set-electric! 'ruby-mode :words '("else" "end" "elseif")) (set-env! "RBENV_ROOT") (set! :repl 'ruby-mode #'inf-ruby) ; `inf-ruby' (setq ruby-deep-indent-paren t) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index a9390745a..8a1449a29 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -16,7 +16,7 @@ :mode ("/bspwmrc\\'" . sh-mode) :config (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) - (set! :electric 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) + (set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) (set! :repl 'sh-mode #'+sh/repl) (setq sh-indent-after-continuation 'always) From 715167bec8450b0992561726e15a59de0a224fb0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 13:05:40 +0200 Subject: [PATCH 1877/4235] Add ability to mark modules as obsolete or moved Better way to communicate to users that modules have moved without breaking their config. --- core/core-modules.el | 40 ++++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 3bd05ccd6..0485f1f77 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -10,6 +10,15 @@ (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) "A list of module root directories. Order determines priority.") +(defconst doom-obsolete-modules () + "An alist of deprecated modules, mapping deprecated modules to an optional new +location (which will create an alias). Each CAR and CDR is a (CATEGORY . +MODULE). E.g. + + ((:emacs . electric-indent) . (:emacs . electric)) + +A warning will be put out if these deprecated modules are used.") + (defvar doom--current-module nil) @@ -248,18 +257,25 @@ to least)." (cond ((keywordp m) (setq category m)) ((not category) (error "No module category specified for %s" m)) ((let* ((module (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m))) - (path (doom-module-locate-path category module))) - (if (not path) - (message "Couldn't find the %s %s module" category module) - (let ((key (cons category module))) - (doom-module-set category module :flags flags :path path) - (push `(let ((doom--current-module ',key)) - (load! "init" ,path t)) - init-forms) - (push `(let ((doom--current-module ',key)) - (load! "config" ,path t)) - config-forms))))))) + (flags (if (listp m) (cdr m)))) + (when-let* ((new (assoc (cons category module) doom-obsolete-modules))) + (if-let* ((newkey (cdr new))) + (message "Warning: the %s module has been moved to %s" + (list category module) + (list (setq category (car newkey)) + (setq module (cdr newkey)))) + (message "Warning: the %s module is deprecated" key))) + (let ((path (doom-module-locate-path category module))) + (if (not path) + (message "Couldn't find the %s %s module" category module) + (let ((key (cons category module))) + (doom-module-set category module :flags flags :path path) + (push `(let ((doom--current-module ',key)) + (load! "init" ,path t)) + init-forms) + (push `(let ((doom--current-module ',key)) + (load! "config" ,path t)) + config-forms)))))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) From c22b3da9f94ff86854f4a34abf3a8441845cb9ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 13:10:00 +0200 Subject: [PATCH 1878/4235] Move emacs/electric-indent to emacs/electric This module will later be expanded to customize more of electric's functionality. --- core/core-modules.el | 3 ++- modules/emacs/{electric-indent => electric}/autoload.el | 2 +- modules/emacs/{electric-indent => electric}/config.el | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) rename modules/emacs/{electric-indent => electric}/autoload.el (93%) rename modules/emacs/{electric-indent => electric}/config.el (89%) diff --git a/core/core-modules.el b/core/core-modules.el index 0485f1f77..b88d3d760 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -10,7 +10,8 @@ (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) "A list of module root directories. Order determines priority.") -(defconst doom-obsolete-modules () +(defconst doom-obsolete-modules + '(((:emacs . electric-indent) . (:emacs . electric))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . MODULE). E.g. diff --git a/modules/emacs/electric-indent/autoload.el b/modules/emacs/electric/autoload.el similarity index 93% rename from modules/emacs/electric-indent/autoload.el rename to modules/emacs/electric/autoload.el index f6a8e6838..9fd5b4443 100644 --- a/modules/emacs/electric-indent/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -1,4 +1,4 @@ -;;; emacs/electric-indent/autoload.el -*- lexical-binding: t; -*- +;;; emacs/electric/autoload.el -*- lexical-binding: t; -*- ;;;###autodef (defun set-electric! (modes &rest plist) diff --git a/modules/emacs/electric-indent/config.el b/modules/emacs/electric/config.el similarity index 89% rename from modules/emacs/electric-indent/config.el rename to modules/emacs/electric/config.el index 2c0a9c3e4..2075d3c3a 100644 --- a/modules/emacs/electric-indent/config.el +++ b/modules/emacs/electric/config.el @@ -1,4 +1,4 @@ -;;; emacs/electric-indent/config.el -*- lexical-binding: t; -*- +;;; emacs/electric/config.el -*- lexical-binding: t; -*- ;; Smarter, keyword-based electric-indent From 3c7c5d5120857750c6c0a56100ee78a6e3bc1eca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 13:27:24 +0200 Subject: [PATCH 1879/4235] Move doom-file-cookie-p to core-dispatcher And rename it to doom--file-cookie-p --- core/core-dispatcher.el | 14 ++++++++++++-- core/core-lib.el | 10 ---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index d6e1f289d..2333c6190 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -381,6 +381,16 @@ even if it doesn't need reloading!" ;; Doom autoloads ;; +(defun doom--file-cookie-p (file) + "Returns the return value of the ;;;###if predicate form in FILE." + (with-temp-buffer + (insert-file-contents-literally file nil 0 256) + (if (and (re-search-forward "^;;;###if " nil t) + (<= (line-number-at-pos) 3)) + (let ((load-file-name file)) + (eval (sexp-at-point))) + t))) + (defun doom--generate-header (func) (goto-char (point-min)) (insert ";; -*- lexical-binding:t -*-\n" @@ -395,7 +405,7 @@ even if it doesn't need reloading!" (noninteractive (not doom-debug-mode)) autoload-timestamps) (print! - (cond ((not (doom-file-cookie-p file)) + (cond ((not (doom--file-cookie-p file)) "⚠ Ignoring %s") ((autoload-generate-file-autoloads file (current-buffer)) (yellow "✕ Nothing in %%s")) @@ -717,7 +727,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (and (file-exists-p elc-file) (file-newer-than-file-p target elc-file)))) (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) - (not (doom-file-cookie-p target))) + (not (doom--file-cookie-p target))) 'no-byte-compile (byte-compile-file target))) (short-name (if (file-in-directory-p target doom-emacs-dir) diff --git a/core/core-lib.el b/core/core-lib.el index 72bf0cb94..d4f802432 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -90,16 +90,6 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." "Return EXP wrapped in a list, or as-is if already a list." (if (listp exp) exp (list exp))) -(defun doom-file-cookie-p (file) - "Returns the return value of the ;;;###if predicate form in FILE." - (with-temp-buffer - (insert-file-contents-literally file nil 0 256) - (if (and (re-search-forward "^;;;###if " nil t) - (<= (line-number-at-pos) 3)) - (let ((load-file-name file)) - (eval (sexp-at-point))) - t))) - (defun doom-keyword-intern (str) "Converts STR (a string) into a keyword (`keywordp')." (or (stringp str) From cccccbb3fd0fb158acded32876aa80781125fb2a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 13:29:25 +0200 Subject: [PATCH 1880/4235] set-electric!: fix & improve error handling --- modules/emacs/electric/autoload.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 9fd5b4443..18e99a24e 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -5,16 +5,18 @@ "Declare :words (list of strings) or :chars (lists of chars) in MODES that trigger electric indentation." (declare (indent 1)) + (unless plist + (signal 'wrong-number-of-arguments + (list '(:char :words) plist))) (cl-destructuring-bind (&key char words) plist - (when (or chars words) - (let* ((name (mapconcat #'symbol-name modes "-")) - (fn (intern (format "+electric-indent--init-%s" name)))) + (dolist (mode (doom-enlist modes)) + (let ((fn (intern (format "+electric-indent--init-%s" mode)))) (fset fn - (lambda () (electric-indent-local-mode +1) + (lambda () + (electric-indent-local-mode +1) (if chars (setq electric-indent-chars chars)) (if words (setq +electric-indent-words words)))) - (dolist (mode modes) - (add-hook (intern (format "%s-hook" mode)) fn-name)))))) + (add-hook (intern (format "%s-hook" mode)) fn))))) ;; FIXME obsolete :electric ;;;###autoload From b99ab59578254ff84f674f8d9f30a0fd75c5c3f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 13:31:34 +0200 Subject: [PATCH 1881/4235] Replace :docset with set-docset! autodef --- modules/feature/lookup/autoload/docsets.el | 65 +++++++++++++++------- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/rust/config.el | 2 +- modules/lang/web/+css.el | 6 +- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 89fef163c..27e6e7134 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -1,6 +1,48 @@ ;;; feature/lookup/autoload/docsets.el -*- lexical-binding: t; -*- ;;;###if (featurep! +docsets) +;;;###autodef +(defun set-docset! (modes &rest docsets) + "Registers a list of DOCSETS (strings) for MODES (either one major mode +symbol or a list of them). + +If MODES is a minor mode, you can use :add or :remove as the first element of +DOCSETS, to instruct it to append (or remove) those from the docsets already set +by a major-mode, if any. + +Used by `+lookup/in-docsets' and `+lookup/documentation'." + (dolist (mode (doom-enlist modes)) + (let ((hook-sym + (intern (format "+lookup|%s-docsets--%s" + (pcase (car docsets) + (:add 'add) + (:remove 'remove) + (_ 'set)) + mode)))) + (fset hook-sym + (lambda () + (let (var-sym) + (cond ((featurep! :completion ivy) + (require 'counsel-dash) + (setq var-sym 'counsel-dash-docsets)) + ((featurep! :completion helm) + (require 'helm-dash) + (setq var-sym 'helm-dash-docsets))) + (when var-sym + (let ((val (symbol-value var-sym))) + (make-variable-buffer-local var-sym) + (pcase (car docsets) + (:add + (set var-sym (append val (cdr docsets)))) + (:remove + (set var-sym + (cl-loop with to-delete = (cdr docsets) + for docset in val + unless (member docset to-delete) + collect docset))) + (_ (set var-sym (cdr docsets))))))))) + (add-hook (intern (format "%s-hook" mode)) hook-sym)))) + ;;;###autoload (def-setting! :docset (modes &rest docsets) "Registers a list of DOCSETS (strings) for MODES (either one major mode @@ -11,27 +53,8 @@ DOCSETS, to instruct it to append (or remove) those from the docsets already set by a major-mode, if any. Used by `+lookup/in-docsets' and `+lookup/documentation'." - (let* ((modes (doom-unquote modes)) - (ivy-p (featurep! :completion ivy)) - (hook-sym (intern (format "+lookup|%s-docsets--%s" - (cond ((eq ',(car docsets) :add) 'add) - ((eq ',(car docsets) :remove) 'remove) - ('set)) - (string-join docsets "-")))) - (var-sym (if ivy-p 'counsel-dash-docsets 'helm-dash-docsets))) - `(progn - (defun ,hook-sym () - (make-variable-buffer-local ',var-sym) - ,(cond ((eq ',(car docsets) :add) - `(setq ,var-sym (append ,var-sym (list ,@(cdr docsets))))) - ((eq ',(car docsets) :remove) - `(setq ,var-sym - (cl-loop with to-delete = (list ,@(cdr docsets)) - for docset in ,var-sym - unless (member docset to-delete) - collect docset))) - (`(setq ,var-sym (list ,@docsets))))) - (add-hook! ,modes #',hook-sym)))) + :obsolete set-docset! + `(set-docset! ,modes ,@docsets)) ;;;###autoload (autoload 'helm-dash-installed-docsets "helm-dash") diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index d3f41f539..47f7e0e37 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -6,7 +6,7 @@ (set! :repl 'emacs-lisp-mode #'+emacs-lisp/repl) (set! :eval 'emacs-lisp-mode #'+emacs-lisp-eval) (set! :lookup 'emacs-lisp-mode :documentation 'info-lookup-symbol) - (set! :docset '(lisp-mode emacs-lisp-mode) "Emacs Lisp") + (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") (set! :rotate 'emacs-lisp-mode :symbols '(("t" "nil") diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 7902ea517..b0a892093 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -2,7 +2,7 @@ (after! rust-mode (set-env! "RUST_SRC_PATH") - (set! :docset 'rust-mode "Rust") + (set-docset! 'rust-mode "Rust") (setq rust-indent-method-chain t) (map! :map rust-mode-map diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index cd2175c0e..171775876 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -38,8 +38,8 @@ :defer t :config ;; contains both css-mode & scss-mode - (set! :docset 'css-mode "CSS") - (set! :docset 'scss-mode "Sass") + (set-docset! 'css-mode "CSS") + (set-docset! 'scss-mode "Sass") (unless EMACS26+ ;; css-mode's built in completion is superior (set-company-backend! '(css-mode scss-mode) 'company-css)) @@ -49,7 +49,7 @@ (def-package! sass-mode :defer t :config - (set! :docset 'sass-mode "Sass") + (set-docset! 'sass-mode "Sass") (set-company-backend! 'sass-mode 'company-css) (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) From 7b1db08ea2d1956b7b19336bca307d934a752fba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 13:36:43 +0200 Subject: [PATCH 1882/4235] Replace :devdocs with set-devdocs! autodef --- modules/feature/lookup/autoload/devdocs.el | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el index 2b2c4a514..9233a5750 100644 --- a/modules/feature/lookup/autoload/devdocs.el +++ b/modules/feature/lookup/autoload/devdocs.el @@ -1,11 +1,20 @@ ;;; feature/lookup/autoload/devdocs.el -*- lexical-binding: t; -*- ;;;###if (featurep! +devdocs) +;;;###autodef +(defun set-devdocs! (modes docset) + "Map major MODES (one major-mode symbol or a list of them) to a devdocs +DOCSET (a string). + +See `devdocs-alist' for the defaults. " + (after! (:when (boundp 'devdocs-alist)) + (map-put devdocs-alist mode docsets))) + ;;;###autoload (def-setting! :devdocs (modes docset) "Map major MODES (one major-mode symbol or a list of them) to a devdocs DOCSET (a string). See `devdocs-alist' for the defaults. " - `(dolist (mode ',modes) - (push (cons mode ,docset) devdocs-alist))) + :obsolete set-devdocs! + `(set-devdocs! ,modes ,docset)) From bbda4343655fdb901d22fe104ce9482e2d7cc608 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 14:10:06 +0200 Subject: [PATCH 1883/4235] Move startup optimizations into init.el Doesn't really belong in core.el and only applies to interactive sessions. --- core/core.el | 26 -------------------------- init.el | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/core/core.el b/core/core.el index 33421040b..894efadaf 100644 --- a/core/core.el +++ b/core/core.el @@ -112,32 +112,6 @@ else (except for `window-setup-hook').") (defvar doom--stage 'init) -;; -;; Optimize startup -;; - -(defvar doom--file-name-handler-alist file-name-handler-alist) -(unless (or after-init-time noninteractive) - ;; A big contributor to long startup times is the garbage collector, so we up - ;; its memory threshold, temporarily and reset it later in `doom|finalize'. - (setq gc-cons-threshold 402653184 - gc-cons-percentage 1.0 - ;; consulted on every `require', `load' and various file reading - ;; functions. You get a minor speed up by nooping this. - file-name-handler-alist nil)) - -(defun doom|finalize () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes) and resets -`file-name-handler-alist'." - (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 16777216 - gc-cons-percentage 0.2)) - -(add-hook 'emacs-startup-hook #'doom|finalize) -(add-hook 'doom-reload-hook #'doom|finalize) - - ;; ;; Emacs core configuration ;; diff --git a/init.el b/init.el index eda0e8894..68af9def2 100644 --- a/init.el +++ b/init.el @@ -27,7 +27,42 @@ ;; ;;; License: MIT +;; Ensure Doom is always running out of this file's directory (setq user-emacs-directory (file-name-directory load-file-name) load-prefer-newer noninteractive) + +;; +;; Optimize startup +;; + +(unless noninteractive + (defvar doom--file-name-handler-alist + file-name-handler-alist) + (unless after-init-time + ;; A big contributor to long startup times is the garbage collector, so we + ;; up its memory threshold, temporarily and reset it later in + ;; `doom|finalize'. + (setq gc-cons-threshold 402653184 + gc-cons-percentage 1.0 + ;; consulted on every `require', `load' and various file reading + ;; functions. You get a minor speed up by nooping this. + file-name-handler-alist nil)) + + (defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes) and resets +`file-name-handler-alist'." + (setq file-name-handler-alist doom--file-name-handler-alist + gc-cons-threshold 16777216 + gc-cons-percentage 0.2)) + + (add-hook 'emacs-startup-hook #'doom|finalize) + (add-hook 'doom-reload-hook #'doom|finalize)) + + +;; +;; Bootstrap Doom +;; + (require 'core (concat user-emacs-directory "core/core")) From da5e2d54cac860ec03a4c71eb147fd747bbc266b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 14:56:45 +0200 Subject: [PATCH 1884/4235] Refactor autodef generator; put metadata in autodefs Adds the doom-module and doom-file symbol properties to autodefs, allowing functions like doom/describe-setting some insight into the origin of the autodef. --- core/core-dispatcher.el | 77 ++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 2333c6190..0b037054f 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -438,43 +438,50 @@ even if it doesn't need reloading!" (insert-file-contents path) (let ((member-p (or (member path enabled-targets) (file-in-directory-p path doom-core-dir))) - forms sexp cond) + forms) (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) - (setq sexp (sexp-at-point) - cond (match-string 1)) - (when cond - (setq cond (read cond))) - (let* ((type (car sexp)) - (name (nth 1 sexp)) - (arglist (nth 2 sexp)) - (docstring (format "(Actually defined in %s)\n\n%s" - (abbreviate-file-name path) - (if (stringp (nth 3 sexp)) (nth 3 sexp) "No docstring"))) - (body (cdddr (if (stringp (nth 3 sexp)) (cdr sexp) sexp)))) - (cond ((not (memq type '(defun defmacro cl-defun cl-defmacro))) - (message "Ignoring invalid autodef %s (found %s)" - name type)) - ((and member-p - (or (null cond) - (eval cond t))) - (push (if (memq type '(defmacro cl-defmacro)) - sexp - (make-autoload sexp path)) - forms)) - (sexp - (condition-case e - (push (append (list 'defmacro name arglist docstring) - (cl-loop for arg in arglist - if (and (symbolp arg) - (not (keywordp arg)) - (not (memq arg cl--lambda-list-keywords))) - collect (list 'ignore arg))) - forms) - ('error - (message "Ignoring autodef %s (%s)" - name e))))))) + (let ((sexp (sexp-at-point)) + (pred (match-string 1))) + (if (not (memq (car sexp) '(defun defmacro cl-defun cl-defmacro def-setting!))) + (message "Ignoring invalid autodef %s (found %s)" + name type) + (cl-destructuring-bind (type name arglist docstring &rest body) sexp + (unless (stringp docstring) + (push docstring body) + (setq docstring "No documentation.")) + (let ((origin (cond ((doom-module-from-path path)) + ((file-in-directory-p path doom-private-dir) + `(:private . ,(intern (file-name-base path)))) + ((file-in-directory-p path doom-emacs-dir) + `(:core . ,(intern (file-name-base path))))))) + (push (cond ((not (and member-p + (or (null pred) + (eval (read pred) t)))) + (condition-case-unless-debug e + (append + (list 'defmacro name arglist + (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" + origin + docstring)) + (cl-loop for arg in arglist + if (and (symbolp arg) + (not (keywordp arg)) + (not (memq arg cl--lambda-list-keywords))) + collect (list 'ignore arg) + else if (listp arg) + collect (list 'ignore (car arg)))) + ('error + (message "Ignoring autodef %s (%s)" + name e) + nil))) + ((memq type '(defmacro cl-defmacro def-setting!)) + sexp) + ((make-autoload sexp path))) + forms) + (push `(put ',name 'doom-file ',(abbreviate-file-name path)) forms) + (push `(put ',name 'doom-module ',origin) forms)))))) (if forms - (concat (string-join (mapcar #'prin1-to-string forms) "\n") + (concat (string-join (mapcar #'prin1-to-string (reverse forms)) "\n") "\n") "")))))) From 1184967531df8e65f8fae72f68df2dd6a996b506 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 14:58:31 +0200 Subject: [PATCH 1885/4235] Advise symbol-file to return doom-file property ...if it exists. Otherwise fall back on original functionality. This allows certain symbols to overwrite where Emacs thinks they were defined. Warning: only use this for autodefs! It may have unintended side-effects for other symbols. --- core/core.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/core.el b/core/core.el index 894efadaf..b67f37553 100644 --- a/core/core.el +++ b/core/core.el @@ -213,6 +213,13 @@ with functions that require it (like modeline segments)." buffer)) (advice-add #'make-indirect-buffer :around #'doom*set-indirect-buffer-filename) +(defun doom*symbol-file (orig-fn symbol &optional type) + "If a `doom-file' symbol property exists on SYMBOL, use that instead of the +original value of `symbol-file'." + (or (get symbol 'doom-file) + (funcall orig-fn symbol type))) +(advice-add #'symbol-file :around #'doom*symbol-file) + ;; Truly silence startup message (fset #'display-startup-echo-area-message #'ignore) From a500bfb0a0e8fe8df7ab6cf2f8a3cdf4dd0e0bd7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 15:47:29 +0200 Subject: [PATCH 1886/4235] Rewrite+rename describe-settings->describe-setters Will now list autodefs instead of def-settings, including an origin module label to tell you where it comes from at a glance. --- core/autoload/help.el | 60 +++++++++++++++++++++-------- modules/config/default/+bindings.el | 2 +- 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 2ca6c3208..f2f6a777b 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -63,26 +63,56 @@ ;; ;;;###autoload -(defun doom/describe-setting (setting) - "Open the documentation of SETTING (a keyword defined with `def-setting!'). +(define-obsolete-function-alias 'doom/describe-setting 'doom/describe-setters "2.1.0") -Defaults to the " +;;;###autoload +(defun doom/describe-setters (setting) + "Open the documentation of Doom functions and configuration macros." (interactive - (let ((settings (cl-loop with case-fold-search = nil - for sym being the symbols of obarray - for sym-name = (symbol-name sym) - if (string-match "^doom--set\\(:.+\\)" sym-name) - collect (match-string 1 sym-name))) - (sym (symbol-at-point))) - (list (completing-read "Describe setting: " - (sort settings #'string-lessp) - nil t (if (keywordp sym) (symbol-name sym)))))) + (let* ((settings + (cl-loop with case-fold-search = nil + for sym being the symbols of obarray + for sym-name = (symbol-name sym) + if (and (or (functionp sym) + (macrop sym)) + (string-match-p "[a-z]!$" sym-name)) + collect sym)) + (sym (symbol-at-point)) + (setting + (completing-read + "Describe setting: " + ;; TODO Could be cleaner (refactor me!) + (cl-loop with maxwidth = (apply #'max (mapcar #'length (mapcar #'symbol-name settings))) + for def in (sort settings #'string-lessp) + if (or (get def 'doom-module) + (doom-module-from-path (symbol-file def))) + collect + (format (format "%%-%ds%%s" (+ maxwidth 4)) + def (propertize (format "%s %s" (car it) (cdr it)) + 'face 'font-lock-comment-face)) + else if (file-in-directory-p (symbol-file def) doom-core-dir) + collect + (format (format "%%-%ds%%s" (+ maxwidth 4)) + def (propertize (format "%s %s" :core (file-name-sans-extension (file-relative-name (symbol-file def) doom-core-dir))) + 'face 'font-lock-comment-face)) + else + collect (symbol-name def)) + nil t + (when (and (symbolp sym) + (string-match-p "!$" (symbol-name sym))) + (symbol-name sym))))) + (list (and setting (car (split-string setting " ")))))) (or (stringp setting) - (signal 'wrong-type-argument (list 'stringp setting))) - (let ((fn (intern-soft (format "doom--set%s" setting)))) + (functionp setting) + (signal 'wrong-type-argument (list '(stringp functionp) setting))) + (let ((fn (if (functionp setting) + setting + (intern-soft setting)))) (or (fboundp fn) (error "'%s' is not a valid DOOM setting" setting)) - (describe-function fn))) + (if (fboundp 'helpful-callable) + (helpful-callable fn) + (describe-function fn)))) ;;;###autoload (defun doom/describe-module (module) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2ef8b2f67..d7d813271 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -620,7 +620,7 @@ :desc "Toggle profiler" :n "p" #'doom/toggle-profiler :desc "Reload theme" :n "r" #'doom//reload-theme :desc "Reload private config" :n "R" #'doom//reload - :desc "Describe DOOM setting" :n "s" #'doom/describe-setting + :desc "Describe DOOM setting" :n "s" #'doom/describe-setters :desc "Describe variable" :n "v" #'describe-variable :desc "Print Doom version" :n "V" #'doom/version :desc "Man pages" :n "w" #'+default/man-or-woman From 58601488d94c03599695f3cebded3ebe451c2646 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 15:51:05 +0200 Subject: [PATCH 1887/4235] describe-module: shows all modules, dim disabled Shows all modules, whether or not they are enabled and dims disabled modules. --- core/autoload/help.el | 92 ++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index f2f6a777b..72c57ea06 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -115,49 +115,61 @@ (describe-function fn)))) ;;;###autoload -(defun doom/describe-module (module) - "Open the documentation of MODULE (a string that represents the category and -submodule in the format, e.g. ':feature evil'). +(defun doom/describe-module (category module) + "Open the documentation of CATEGORY MODULE. -Defaults to either a) the module at point (in init.el), b) the module derived -from a `featurep!' or `require!' call, c) the module that the current file is -in, or d) the module associated with the current major mode (see +CATEGORY is a keyword and MODULE is a symbol. e.g. :feature and 'evil. + +Automatically selects a) the module at point (in private init files), b) the +module derived from a `featurep!' or `require!' call, c) the module that the +current file is in, or d) the module associated with the current major mode (see `doom--module-mode-alist')." (interactive - (let ((module - (cond ((and buffer-file-name - (eq major-mode 'emacs-lisp-mode) - (string= (file-name-nondirectory buffer-file-name) - "init.el") - (thing-at-point 'sexp t))) - ((save-excursion - (require 'smartparens) - (ignore-errors - (sp-beginning-of-sexp) - (unless (eq (char-after) ?\() - (backward-char)) - (let ((sexp (sexp-at-point))) - (when (memq (car-safe sexp) '(featurep! require!)) - (format "%s %s" (nth 1 sexp) (nth 2 sexp))))))) - ((and buffer-file-name - (when-let* ((mod (doom-module-from-path buffer-file-name))) - (format "%s %s" (car mod) (cdr mod))))) - ((when-let* ((mod (cdr (assq major-mode doom--module-mode-alist)))) - (format "%s %s" - (symbol-name (car mod)) - (symbol-name (cadr mod)))))))) - (list (completing-read "Describe module: " - (cl-loop for (module . sub) in (reverse (hash-table-keys doom-modules)) - collect (format "%s %s" module sub)) - nil t nil nil module)))) - (cl-destructuring-bind (category submodule) - (mapcar #'intern (split-string module " ")) - (unless (doom-module-p category submodule) - (error "'%s' isn't a valid module" module)) - (let ((doc-path (doom-module-path category submodule "README.org"))) - (unless (file-exists-p doc-path) - (error "There is no documentation for this module")) - (find-file doc-path)))) + (let* ((module + (cond ((and buffer-file-name + (eq major-mode 'emacs-lisp-mode) + (file-in-directory-p buffer-file-name doom-private-dir) + (save-excursion (goto-char (point-min)) + (re-search-forward "^\\s-*(doom! " nil t)) + (thing-at-point 'sexp t))) + ((save-excursion + (require 'smartparens) + (ignore-errors + (sp-beginning-of-sexp) + (unless (eq (char-after) ?\() + (backward-char)) + (let ((sexp (sexp-at-point))) + (when (memq (car-safe sexp) '(featurep! require!)) + (format "%s %s" (nth 1 sexp) (nth 2 sexp))))))) + ((and buffer-file-name + (when-let* ((mod (doom-module-from-path buffer-file-name))) + (format "%s %s" (car mod) (cdr mod))))) + ((when-let* ((mod (cdr (assq major-mode doom--module-mode-alist)))) + (format "%s %s" + (symbol-name (car mod)) + (symbol-name (cadr mod))))))) + (module-string + (completing-read + "Describe module: " + (cl-loop for path in (doom-module-load-path 'all) + for (cat . mod) = (doom-module-from-path path) + for format = (format "%s %s" cat mod) + if (doom-module-p cat mod) + collect format + else + collect (propertize format 'face 'font-lock-comment-face)) + nil t nil nil module)) + (key (split-string module-string " "))) + (list (intern (car key)) + (intern (cadr key))))) + (cl-check-type category symbol) + (cl-check-type module symbol) + (or (doom-module-p category module) + (error "'%s %s' isn't a valid module" category module)) + (let ((doc-path (doom-module-path category module "README.org"))) + (unless (file-exists-p doc-path) + (error "There is no documentation for this module (%s)" doc-path)) + (find-file doc-path))) ;;;###autoload (defun doom/describe-active-minor-mode (mode) From 98632fe0861533e32db326d5f7fb985627ceb97b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:04:27 +0200 Subject: [PATCH 1888/4235] Fix doom-module-from-path on module directories Allow PATH to be an exact path to a module. --- core/core-modules.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-modules.el b/core/core-modules.el index b88d3d760..c6e7b0b55 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -132,7 +132,7 @@ This doesn't require modules to be enabled. For enabled modules us (let ((path (or path (FILE!)))) (save-match-data (setq path (file-truename path)) - (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)/.*$" path) + (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)\\(?:/.*\\)?$" path) (when-let* ((category (match-string 1 path)) (module (match-string 2 path))) (cons (doom-keyword-intern category) From 588359cc5f2c2e7a2efa54d3e73c14a13d8b2696 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:07:24 +0200 Subject: [PATCH 1889/4235] Replace :eval/:repl with autodef functions + :eval => set-eval-handler! + :repl => set-repl-handler! + Updates all internal references. --- modules/feature/eval/autoload/settings.el | 76 +++++++++++++++++++++++ modules/feature/eval/init.el | 50 --------------- modules/lang/clojure/config.el | 4 +- modules/lang/crystal/config.el | 2 +- modules/lang/elixir/config.el | 4 +- modules/lang/elm/config.el | 2 +- modules/lang/emacs-lisp/config.el | 4 +- modules/lang/ess/config.el | 2 +- modules/lang/go/config.el | 2 +- modules/lang/haskell/config.el | 2 +- modules/lang/hy/config.el | 2 +- modules/lang/java/config.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/julia/config.el | 2 +- modules/lang/lua/config.el | 2 +- modules/lang/php/config.el | 2 +- modules/lang/python/config.el | 2 +- modules/lang/ruby/config.el | 2 +- modules/lang/scala/config.el | 2 +- modules/lang/sh/config.el | 2 +- modules/lang/swift/config.el | 2 +- 21 files changed, 98 insertions(+), 72 deletions(-) create mode 100644 modules/feature/eval/autoload/settings.el delete mode 100644 modules/feature/eval/init.el diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el new file mode 100644 index 000000000..9f0cff8f7 --- /dev/null +++ b/modules/feature/eval/autoload/settings.el @@ -0,0 +1,76 @@ +;;; feature/eval/autoload/settings.el -*- lexical-binding: t; -*- + +;; +;; REPLs +;; + +(defvar +eval-repls nil + "An alist mapping major modes to plists that describe REPLs. Used by +`+eval/open-repl' and filled with the `:repl' setting.") + +;;;###autodef +(defun set-repl-handler! (mode command) + "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a +function that creates and returns the REPL buffer." + (push (cons mode command) +eval-repls)) + +;; FIXME obsolete :repl +;;;###autoload +(def-setting! :repl (mode command) + "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a +function that creates and returns the REPL buffer." + :obsolete set-repl-handler! + `(push (cons ,mode ,command) +eval-repls)) + + +;; +;; Evaluation +;; + + +(defvar +eval-runners nil + "Alist mapping major modes to interactive runner functions.") + +;;;###autodef +(defun set-eval-handler! (mode command) + "Define a code evaluator for major mode MODE with `quickrun'. + +1. If MODE is a string and COMMAND is the string, MODE is a file regexp and + COMMAND is a string key for an entry in `quickrun-file-alist'. +2. If MODE is not a string and COMMAND is a string, MODE is a major-mode symbol + and COMMAND is a key (for `quickrun--language-alist'), and will be registered + in `quickrun--major-mode-alist'. +3. If MODE is not a string and COMMAND is an alist, see `quickrun-add-command': + (quickrun-add-command MODE COMMAND :mode MODE). +4. If MODE is not a string and COMMANd is a symbol, add it to + `+eval-runners', which is used by `+eval/region'." + (cond ((symbolp command) + (push (cons mode command) +eval-runners)) + ((stringp command) + (after! quickrun + (push (cons mode command) + (if (stringp mode) + quickrun-file-alist + quickrun--major-mode-alist)))) + ((listp command) + (after! quickrun + (quickrun-add-command + (symbol-name mode) + command :mode mode))))) + +;; FIXME obsolete :eval +;;;###autoload +(def-setting! :eval (mode command) + "Define a code evaluator for major mode MODE with `quickrun'. + +1. If MODE is a string and COMMAND is the string, MODE is a file regexp and + COMMAND is a string key for an entry in `quickrun-file-alist'. +2. If MODE is not a string and COMMAND is a string, MODE is a major-mode symbol + and COMMAND is a key (for `quickrun--language-alist'), and will be registered + in `quickrun--major-mode-alist'. +3. If MODE is not a string and COMMAND is an alist, see `quickrun-add-command': + (quickrun-add-command MODE COMMAND :mode MODE). +4. If MODE is not a string and COMMANd is a symbol, add it to + `+eval-runners', which is used by `+eval/region'." + :obsolete set-eval-handler! + `(set-eval-handler! ,mode ,command)) diff --git a/modules/feature/eval/init.el b/modules/feature/eval/init.el deleted file mode 100644 index 291df33d4..000000000 --- a/modules/feature/eval/init.el +++ /dev/null @@ -1,50 +0,0 @@ -;;; feature/eval/init.el -*- lexical-binding: t; -*- - -;; -;; REPLs -;; - -(defvar +eval-repls nil - "An alist mapping major modes to plists that describe REPLs. Used by -`+eval/open-repl' and filled with the `:repl' setting.") - -(def-setting! :repl (mode command) - "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a -function that creates and returns the REPL buffer." - `(push (cons ,mode ,command) +eval-repls)) - - -;; -;; Evaluation -;; - - -(defvar +eval-runners nil - "Alist mapping major modes to interactive runner functions.") - -(def-setting! :eval (mode command) - "Define a code evaluator for major mode MODE with `quickrun'. - -1. If MODE is a string and COMMAND is the string, MODE is a file regexp and - COMMAND is a string key for an entry in `quickrun-file-alist'. -2. If MODE is not a string and COMMAND is a string, MODE is a major-mode symbol - and COMMAND is a key (for `quickrun--language-alist'), and will be registered - in `quickrun--major-mode-alist'. -3. If MODE is not a string and COMMAND is an alist, see `quickrun-add-command': - (quickrun-add-command MODE COMMAND :mode MODE). -4. If MODE is not a string and COMMANd is a symbol, add it to - `+eval-runners', which is used by `+eval/region'." - (let ((command (doom-unquote command))) - (cond ((symbolp command) - `(push (cons ,mode ',command) +eval-runners)) - ((stringp command) - `(after! quickrun - (push (cons ,mode ',command) - ,(if (stringp mode) - 'quickrun-file-alist - 'quickrun--major-mode-alist)))) - ((listp command) - `(after! quickrun - (quickrun-add-command - ,(symbol-name (doom-unquote mode)) - ',command :mode ,mode)))))) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 729fc7b8c..05317c153 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -31,8 +31,8 @@ (figwheel-sidecar.repl-api/cljs-repl))") (set-popup-rule! "^\\*cider-repl" nil '((quit) (select))) - (set! :repl 'clojure-mode #'+clojure/repl) - (set! :eval 'clojure-mode #'cider-eval-region) + (set-repl-handler! 'clojure-mode #'+clojure/repl) + (set-eval-handler! 'clojure-mode #'cider-eval-region) (set! :lookup 'clojure-mode :definition #'cider-browse-ns-find-at-point :documentation #'cider-browse-ns-doc-at-point) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index 717a4137c..df4dbdc78 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -6,7 +6,7 @@ (set! :lookup 'crystal-mode :definition #'crystal-def-jump :references #'crystal-tool-imp) - (set! :eval 'crystal-mode + (set-eval-handler! 'crystal-mode '((:command . "crystal") (:exec . "%c %s") (:description . "Run Crystal script")))) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index b5184ba2d..4b86375db 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -33,6 +33,6 @@ (set! :lookup 'elixir-mode :definition #'alchemist-goto-definition-at-point :documentation #'alchemist-help-search-at-point) - (set! :eval 'elixir-mode #'alchemist-eval-region) - (set! :repl 'elixir-mode #'alchemist-iex-project-run)) + (set-eval-handler! 'elixir-mode #'alchemist-eval-region) + (set-repl-handler! 'elixir-mode #'alchemist-iex-project-run)) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 68d30c3c8..ea7b57d8d 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -6,7 +6,7 @@ (after! elm-mode (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set-company-backend! 'elm-mode 'company-elm) - (set! :repl 'elm-mode #'run-elm-interactive)) + (set-repl-handler! 'elm-mode #'run-elm-interactive)) (def-package! flycheck-elm diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 47f7e0e37..2d0057624 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -3,8 +3,8 @@ (def-package! elisp-mode ; built-in :mode ("/Cask$" . emacs-lisp-mode) :config - (set! :repl 'emacs-lisp-mode #'+emacs-lisp/repl) - (set! :eval 'emacs-lisp-mode #'+emacs-lisp-eval) + (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) + (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set! :lookup 'emacs-lisp-mode :documentation 'info-lookup-symbol) (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index aca1c81d5..048983584 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -39,7 +39,7 @@ ess-nuke-trailing-whitespace-p t ess-default-style 'DEFAULT) (ess-toggle-underscore t) - (set! :repl 'ess-mode #'+ess/r-repl) + (set-repl-handler! 'ess-mode #'+ess/r-repl) (set! :lookup 'ess-mode :documentation #'ess-display-help-on-object) (define-key! ess-doc-map "h" #'ess-display-help-on-object diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 47837c324..2760a9414 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -6,7 +6,7 @@ (after! go-mode (set-env! "GOPATH" "GOROOT") - (set! :repl 'go-mode #'gorepl-run) + (set-repl-handler! 'go-mode #'gorepl-run) (set! :lookup 'go-mode :definition #'go-guru-definition :references #'go-guru-referrers diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 6f0513258..7da71bb97 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -9,6 +9,6 @@ ;; (after! haskell-mode - (set! :repl 'haskell-mode #'switch-to-haskell) + (set-repl-handler! 'haskell-mode #'switch-to-haskell) (add-to-list 'completion-ignored-extensions ".hi")) diff --git a/modules/lang/hy/config.el b/modules/lang/hy/config.el index bee40e479..92163ac89 100644 --- a/modules/lang/hy/config.el +++ b/modules/lang/hy/config.el @@ -4,5 +4,5 @@ :mode "\\.hy\\'" :interpreter "hy" :config - (set! :repl 'hy-mode #'hy-shell-start-or-switch-to-shell) + (set-repl-handler! 'hy-mode #'hy-shell-start-or-switch-to-shell) (set-company-backend! 'hy-mode 'company-hy)) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 0d0a10fab..7e3dffd61 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -24,5 +24,5 @@ (def-package! groovy-mode :mode "\\.g\\(?:radle\\|roovy\\)$" :config - (set! :eval 'groovy-mode "groovy")) + (set-eval-handler! 'groovy-mode "groovy")) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 93594083d..a2b0285af 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -22,7 +22,7 @@ (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) - (set! :repl 'js2-mode #'+javascript/repl) + (set-repl-handler! 'js2-mode #'+javascript/repl) ;; Conform switch-case indentation to js2 normal indent (defvaralias 'js-switch-indent-offset 'js2-basic-offset) diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index c7be5a650..06d706ba2 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -3,7 +3,7 @@ (use-package julia-mode :interpreter "julia" :config - (set! :repl 'julia-mode #'+julia/repl) + (set-repl-handler! 'julia-mode #'+julia/repl) ;; Borrow matlab.el's fontification of math operators ;; From diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index ea2c14c5f..70c1b4d33 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -5,7 +5,7 @@ (set! :lookup 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) - (set! :repl 'lua-mode #'+lua/repl) + (set-repl-handler! 'lua-mode #'+lua/repl) (set-company-backend! 'lua-mode '(company-lua company-yasnippet)) (def-menu! +lua/build-menu diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 7022e03e5..e092410ce 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -17,7 +17,7 @@ ;; php+html. Use the .phtml (setq php-template-compatibility nil) - (set! :repl 'php-mode #'php-boris) + (set-repl-handler! 'php-mode #'php-boris) (set! :lookup 'php-mode :documentation #'php-search-documentation) ;; ac-php provides custom autocompletion, php-extras provides autocompletion diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index e5b38a3c5..27037d0b9 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -26,7 +26,7 @@ is loaded.") (set-env! "PYTHONPATH" "PYENV_ROOT") (set-electric! 'python-mode :chars '(?:)) - (set! :repl 'python-mode #'+python/repl) + (set-repl-handler! 'python-mode #'+python/repl) (when (executable-find "ipython") (setq python-shell-interpreter "ipython" diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index d8eb37c9a..1bbb50255 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -17,7 +17,7 @@ (set-company-backend! 'ruby-mode 'company-dabbrev-code) (set-electric! 'ruby-mode :words '("else" "end" "elseif")) (set-env! "RBENV_ROOT") - (set! :repl 'ruby-mode #'inf-ruby) ; `inf-ruby' + (set-repl-handler! 'ruby-mode #'inf-ruby) ; `inf-ruby' (setq ruby-deep-indent-paren t) ;; Don't interfere with my custom RET behavior (define-key ruby-mode-map [?\n] nil) diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index cbea665f1..74f9a7b21 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -21,4 +21,4 @@ (def-package! sbt-mode :after scala-mode - :config (set! :repl 'scala-mode #'run-scala)) + :config (set-repl-handler! 'scala-mode #'run-scala)) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 8a1449a29..2b4c8ad01 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -17,7 +17,7 @@ :config (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) (set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) - (set! :repl 'sh-mode #'+sh/repl) + (set-repl-handler! 'sh-mode #'+sh/repl) (setq sh-indent-after-continuation 'always) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index cd371e88c..2c9dc359c 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -1,7 +1,7 @@ ;;; lang/swift/config.el -*- lexical-binding: t; -*- ;; `swift-mode' -(set! :repl 'swift-mode #'run-swift) +(set-repl-handler! 'swift-mode #'run-swift) (def-package! flycheck-swift From 9e54e393eac41f6bf4288fbc51010d95dba3bfab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:08:23 +0200 Subject: [PATCH 1890/4235] Use new evil-collection blacklist instead of hook --- modules/config/default/+bindings.el | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index d7d813271..0ac49394a 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -794,20 +794,7 @@ (after! ivy (+default|fix-minibuffer-in-map ivy-minibuffer-map)) -;; ;; Evil-collection fixes -;; - -(defun +config|deal-with-evil-collections-bs (_feature keymaps) - "Unmap keys that conflict with Doom's defaults." - (dolist (map keymaps) - (evil-delay `(and (boundp ',map) (keymapp ,map)) - `(evil-define-key* '(normal visual motion) ,map - (kbd doom-leader-key) nil - (kbd "C-j") nil (kbd "C-k") nil - "gd" nil "gf" nil "K" nil - "]" nil "[" nil) - 'after-load-functions t nil - (format "+default-redefine-key-in-%s" map)))) - -(add-hook 'evil-collection-setup-hook #'+config|deal-with-evil-collections-bs) +(setq evil-collection-key-blacklist + (list "C-j" "C-k" "gd" "gf" "K" "[" "]" + doom-leader-key doom-localleader-key)) From 11b5a7116f58fbc01c8e4d12c1e779d94efa867d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:15:24 +0200 Subject: [PATCH 1891/4235] Allow map!'s :prefix to accept key vectors --- core/core-keybinds.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 82b4fe966..578c9f4a7 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -249,7 +249,13 @@ Example forms))) (:prefix (let ((def (pop rest))) - (setq doom--prefix `(vconcat ,doom--prefix (kbd ,def))) + (setq doom--prefix + `(vconcat ,doom--prefix + ,(if (or (stringp def) + (and (symbolp def) + (stringp (symbol-value def)))) + `(kbd ,def) + def))) (when desc (push `(doom--keybind-register ,(key-description (eval doom--prefix)) ,desc ',modes) From d588332aa09cbb2c5030e4d4ba4f9de412250f37 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:16:40 +0200 Subject: [PATCH 1892/4235] Fix SPC TAB leader prefix not being recognized Due to a TAB => [tab] remap later in config/default. --- modules/config/default/+bindings.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 0ac49394a..cd4a0a0c0 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -419,9 +419,7 @@ [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map :ig [tab] yas-maybe-expand - :v [tab] #'yas-insert-snippet - :ig "TAB" yas-maybe-expand - :v "TAB" #'yas-insert-snippet)) + :v [tab] #'yas-insert-snippet)) ;; --- Major mode bindings -------------------------- @@ -509,8 +507,8 @@ :desc "Symbols across buffers" :nv "I" #'imenu-anywhere :desc "Online providers" :nv "o" #'+lookup/online-select) - (:desc "workspace" :prefix "TAB" - :desc "Display tab bar" :n "TAB" #'+workspace/display + (: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)) From e63be8329875ef3535a5f1601379b75ca1d7836c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:17:26 +0200 Subject: [PATCH 1893/4235] Bind SPC f X to doom/delete-this-file --- modules/config/default/+bindings.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index cd4a0a0c0..63a25d379 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -571,7 +571,8 @@ :desc "Recent project files" :n "R" #'projectile-recentf :desc "Yank filename" :n "y" #'+default/yank-buffer-filename :desc "Find file in private config" :n "p" #'+default/find-in-config - :desc "Browse private config" :n "P" #'+default/browse-config) + :desc "Browse private config" :n "P" #'+default/browse-config + :desc "Delete this file" :n "X" #'doom/delete-this-file) (:desc "git" :prefix "g" :desc "Magit blame" :n "b" #'magit-blame From 51aa60d67dec9034655162bc0729c78122a5a8aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:50:39 +0200 Subject: [PATCH 1894/4235] Fix set-electric! complaining about :char A typo! Should be :chars --- modules/emacs/electric/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 18e99a24e..25b18b7b4 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -8,7 +8,7 @@ trigger electric indentation." (unless plist (signal 'wrong-number-of-arguments (list '(:char :words) plist))) - (cl-destructuring-bind (&key char words) plist + (cl-destructuring-bind (&key chars words) plist (dolist (mode (doom-enlist modes)) (let ((fn (intern (format "+electric-indent--init-%s" mode)))) (fset fn From f81a0e6f41191bb69a1fd8c61b8635cade098d4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 16:54:39 +0200 Subject: [PATCH 1895/4235] Remove redundant def-setting! docstrings def-setting! will now grab the autodef's docstring if it has an :obsolete property defined. --- core/autoload/os.el | 1 - core/core-modules.el | 8 ++++++- modules/completion/company/autoload.el | 3 --- modules/emacs/electric/autoload.el | 2 -- modules/feature/eval/autoload/settings.el | 13 ----------- modules/feature/evil/autoload/evil.el | 1 - modules/ui/popup/autoload/settings.el | 28 ----------------------- 7 files changed, 7 insertions(+), 49 deletions(-) diff --git a/core/autoload/os.el b/core/autoload/os.el index 871eea21d..c77c4eeb5 100644 --- a/core/autoload/os.el +++ b/core/autoload/os.el @@ -3,7 +3,6 @@ ;; FIXME obsolete :env ;;;###autoload (def-setting! :env (&rest vars) - "TODO" :obsolete set-env! (when (featurep 'exec-path-from-shell) `(exec-path-from-shell-copy-envs ,@vars))) diff --git a/core/core-modules.el b/core/core-modules.el index c6e7b0b55..18adaf511 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -392,11 +392,17 @@ Do not use this for configuring Doom core." (declare (indent defun) (doc-string 3)) (or (keywordp keyword) (signal 'wrong-type-argument (list 'keywordp keyword))) + (unless (stringp docstring) + (push docstring forms) + (setq docstring nil)) (let ((alias (plist-get forms :obsolete))) (when alias (setq forms (plist-put forms :obsolete 'nil))) `(fset ',(intern (format "doom--set%s" keyword)) - (lambda ,arglist ,docstring + (lambda ,arglist + ,(if (and (not docstring) (fboundp alias)) + (documentation alias t) + docstring) (prog1 (progn ,@forms) ,(when alias `(unless noninteractive diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 9ab318d44..17809e849 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -20,9 +20,6 @@ MODES should be one major-mode symbol or a list of them." ;; FIXME obsolete :company-backend ;;;###autoload (def-setting! :company-backend (modes &rest backends) - "Prepends BACKENDS to `company-backends' in major MODES. - -MODES should be one major-mode symbol or a list of them." :obsolete set-company-backend! `(set-company-backend! ,modes ,@backends)) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 25b18b7b4..f10575145 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -21,7 +21,5 @@ trigger electric indentation." ;; FIXME obsolete :electric ;;;###autoload (def-setting! :electric (modes &rest plist) - "Declare :words (list of strings) or :chars (lists of chars) in MODES that -trigger electric indentation." :obsolete set-electric! `(set-electric! ,modes ,@plist)) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 9f0cff8f7..2925c6ee6 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -17,8 +17,6 @@ function that creates and returns the REPL buffer." ;; FIXME obsolete :repl ;;;###autoload (def-setting! :repl (mode command) - "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a -function that creates and returns the REPL buffer." :obsolete set-repl-handler! `(push (cons ,mode ,command) +eval-repls)) @@ -61,16 +59,5 @@ function that creates and returns the REPL buffer." ;; FIXME obsolete :eval ;;;###autoload (def-setting! :eval (mode command) - "Define a code evaluator for major mode MODE with `quickrun'. - -1. If MODE is a string and COMMAND is the string, MODE is a file regexp and - COMMAND is a string key for an entry in `quickrun-file-alist'. -2. If MODE is not a string and COMMAND is a string, MODE is a major-mode symbol - and COMMAND is a key (for `quickrun--language-alist'), and will be registered - in `quickrun--major-mode-alist'. -3. If MODE is not a string and COMMAND is an alist, see `quickrun-add-command': - (quickrun-add-command MODE COMMAND :mode MODE). -4. If MODE is not a string and COMMANd is a symbol, add it to - `+eval-runners', which is used by `+eval/region'." :obsolete set-eval-handler! `(set-eval-handler! ,mode ,command)) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 42fda391a..284e7b46b 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -13,7 +13,6 @@ ;; FIXME obsolete :evil-state ;;;###autoload (def-setting! :evil-state (modes state) - "Set the initialize STATE of MODE using `evil-set-initial-state'." :obsolete set-evil-initial-state! `(set-evil-initial-state! ,modes ,state)) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 40ebdece0..9dbaf085f 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -69,39 +69,11 @@ individual rule. ;; FIXME obsolete :popup ;;;###autoload (def-setting! :popup (condition &optional alist parameters) - "Define a popup rule. - -CONDITION can be a regexp string or a function. - -For ALIST, see `display-buffer' and `display-buffer-alist' for a list of -possible entries, which instruct the display system how to initialize the popup -window. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for -a list of custom parameters provided by the popup module. If certain -attributes/parameters are omitted, the ones from `+popup-default-alist' and -`+popup-default-parameters' will be used. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. - -See `def-popups!' for defining multiple rules in bulk." :obsolete set-popup-rule! `(set-popup-rule! ,condition ,alist ,parameters)) ;; FIXME obsolete :popups ;;;###autoload (def-setting! :popups (&rest rulesets) - "Define multiple popup rules. See `def-popup!' for the specifications of each -individual rule. - - (set-popup-rules! - '((\"^ \\*\" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (\"^\\*\" ((slot . 1) (vslot . -1)) ((select . t)))))" :obsolete set-popup-rules! `(set-popup-rules! ,@rulesets)) From c3d3638832a221bf58c0917cd8284e02fb442155 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 17:12:54 +0200 Subject: [PATCH 1896/4235] Fix js defvaralias errors in Emacs 27 In later versions of Emacs, if a var alias is created *after* it has been assigned a value, an error is thrown. This prevents the user from opening js files. --- modules/lang/javascript/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index a2b0285af..c2ec87fbd 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -21,12 +21,12 @@ (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + ;; Indent switch-case another step + (setq-hook! 'js2-mode-hook js-switch-indent-offset js2-basic-offset) + (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/repl) - ;; Conform switch-case indentation to js2 normal indent - (defvaralias 'js-switch-indent-offset 'js2-basic-offset) - (sp-with-modes '(js2-mode rjsx-mode) (sp-local-pair "/*" "*/" :post-handlers '(("| " "SPC")))) From bfdc00cf42b2b267cfe4f011e5c32040ba8607b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 17:15:25 +0200 Subject: [PATCH 1897/4235] Prevent tide-mode error when node isn't installed This error prevents you from opening js files. --- modules/lang/javascript/config.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index c2ec87fbd..52a301945 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -78,9 +78,16 @@ ;; (def-package! tide - :hook (js2-mode . tide-setup) - :hook (typescript-mode . tide-setup) + :defer t :init + ;; Don't let hard errors stop the user from opening js files. + (defun +javascript|init-tide () + "Enable `tide-mode' if node is available." + (if (executable-find "node") + (tide-setup) + (message "Couldn't find `node', aborting tide server"))) + (add-hook! (js2-mode typescript-mode) #'+javascript|init-tide) + (defun +javascript|init-tide-in-web-mode () "Enable `tide-mode' if in a *.tsx file." (when (string= (file-name-extension (or buffer-file-name "")) "tsx") @@ -89,6 +96,7 @@ :config (setq tide-completion-detailed t tide-always-show-documentation t) + ;; code completion (after! company ;; tide affects the global `company-backends', undo this so doom can handle From c0251aaceefedb6f2f165d6af9794f4e55a75672 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 17:27:48 +0200 Subject: [PATCH 1898/4235] Replace :lookup with set-lookup-handlers! autodef And update all internal references. --- modules/feature/lookup/autoload/lookup.el | 46 +++++++++++++---------- modules/lang/cc/config.el | 2 +- modules/lang/clojure/config.el | 2 +- modules/lang/crystal/config.el | 2 +- modules/lang/csharp/config.el | 2 +- modules/lang/elixir/config.el | 2 +- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/ess/config.el | 2 +- modules/lang/go/config.el | 2 +- modules/lang/haskell/+intero.el | 2 +- modules/lang/java/+eclim.el | 2 +- modules/lang/java/+meghanada.el | 2 +- modules/lang/javascript/config.el | 4 +- modules/lang/lua/config.el | 2 +- modules/lang/php/config.el | 2 +- modules/lang/python/config.el | 2 +- modules/lang/rust/config.el | 2 +- 17 files changed, 43 insertions(+), 37 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 6a327c799..5f910a3e1 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -4,8 +4,8 @@ (defvar +lookup--ag-installed-p (executable-find "ag")) (defvar +lookup--last-provider nil) -;;;###autoload -(def-setting! :lookup (modes &rest plist) +;;;###autodef +(cl-defun set-lookup-handlers! (modes &key definition references documentation file xref-backend) "Defines a jump target for major MODES. PLIST accepts the following properties: @@ -27,24 +27,30 @@ properties: Using this multiple times overwrites previous properties and unsets omitted ones." - `(progn - ,@(cl-loop for mode in (doom-enlist (doom-unquote modes)) - for def-name = (intern (format "doom--init-lookup-%s" mode)) - collect - `(defun ,def-name () - (when (or (eq major-mode ',mode) - (bound-and-true-p ,mode)) - (let ((xref ,(plist-get plist :xref-backend)) - (def ,(plist-get plist :definition)) - (ref ,(plist-get plist :references)) - (fil ,(plist-get plist :file)) - (doc ,(plist-get plist :documentation))) - (if xref (add-hook 'xref-backend-functions xref nil t)) - (if def (add-hook '+lookup-definition-functions def nil t)) - (if ref (add-hook '+lookup-references-functions ref nil t)) - (if fil (add-hook '+lookup-file-functions fil nil t)) - (if doc (add-hook '+lookup-documentation-functions doc nil t))))) - collect `(add-hook! ,mode #',def-name)))) + (dolist (mode (doom-enlist modes)) + (let ((def-name (intern (format "+lookup--init-%s" mode)))) + (fset def-name + (lambda () + (when (or (eq major-mode mode) + (and (boundp mode) + (symbol-value mode))) + (when definition + (add-hook '+lookup-definition-functions definition nil t)) + (when references + (add-hook '+lookup-references-functions references nil t)) + (when documentation + (add-hook '+lookup-documentation-functions documentation nil t)) + (when file + (add-hook '+lookup-file-functions file nil t)) + (when xref-backend + (add-hook 'xref-backend-functions xref-backend nil t))))) + (add-hook (intern (format "%s-hook" mode)) def-name)))) + +;;;###autoload +(def-setting! :lookup (modes &rest plist) + :obsolete set-lookup-handlers! + `(set-lookup-handlers! ,modes ,@plist)) + ;; Helpers (defun +lookup--online-provider (&optional force-p namespace) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index c034041c2..d99f9aa34 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -212,7 +212,7 @@ 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) - (set! :lookup '(c-mode c++-mode) + (set-lookup-handlers! '(c-mode c++-mode) :definition #'rtags-find-symbol-at-point :references #'rtags-find-references-at-point) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 05317c153..f61172558 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -33,7 +33,7 @@ (set-popup-rule! "^\\*cider-repl" nil '((quit) (select))) (set-repl-handler! 'clojure-mode #'+clojure/repl) (set-eval-handler! 'clojure-mode #'cider-eval-region) - (set! :lookup 'clojure-mode + (set-lookup-handlers! 'clojure-mode :definition #'cider-browse-ns-find-at-point :documentation #'cider-browse-ns-doc-at-point) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index df4dbdc78..d6f5c9753 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -3,7 +3,7 @@ (def-package! crystal-mode :defer t :config - (set! :lookup 'crystal-mode + (set-lookup-handlers! 'crystal-mode :definition #'crystal-def-jump :references #'crystal-tool-imp) (set-eval-handler! 'crystal-mode diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 322cd3d8d..5acd23383 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -20,7 +20,7 @@ (set-company-backend! 'csharp-mode '(company-omnisharp)) - (set! :lookup 'csharp-mode + (set-lookup-handlers! 'csharp-mode :definition #'omnisharp-go-to-definition :references #'omnisharp-find-usages :documentation #'omnisharp-current-type-documentation) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 4b86375db..eb0f7e857 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -30,7 +30,7 @@ (def-package! alchemist :hook (elixir-mode . alchemist-mode) :config - (set! :lookup 'elixir-mode + (set-lookup-handlers! 'elixir-mode :definition #'alchemist-goto-definition-at-point :documentation #'alchemist-help-search-at-point) (set-eval-handler! 'elixir-mode #'alchemist-eval-region) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 2d0057624..87b0a156f 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -5,7 +5,7 @@ :config (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) - (set! :lookup 'emacs-lisp-mode :documentation 'info-lookup-symbol) + (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") (set! :rotate 'emacs-lisp-mode diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 048983584..f3e78ccc1 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -40,7 +40,7 @@ ess-default-style 'DEFAULT) (ess-toggle-underscore t) (set-repl-handler! 'ess-mode #'+ess/r-repl) - (set! :lookup 'ess-mode :documentation #'ess-display-help-on-object) + (set-lookup-handlers! 'ess-mode :documentation #'ess-display-help-on-object) (define-key! ess-doc-map "h" #'ess-display-help-on-object "p" #'ess-R-dv-pprint diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 2760a9414..62670b88a 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -7,7 +7,7 @@ (after! go-mode (set-env! "GOPATH" "GOROOT") (set-repl-handler! 'go-mode #'gorepl-run) - (set! :lookup 'go-mode + (set-lookup-handlers! 'go-mode :definition #'go-guru-definition :references #'go-guru-referrers :documentation #'godoc-at-point) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 7463cfa8a..bda348e9b 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -14,7 +14,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config (add-hook 'intero-mode-hook #'flycheck-mode) - (set! :lookup 'haskell-mode :definition #'intero-goto-definition)) + (set-lookup-handlers! 'haskell-mode :definition #'intero-goto-definition)) (def-package! hindent diff --git a/modules/lang/java/+eclim.el b/modules/lang/java/+eclim.el index 6f07ab0ef..3848324ab 100644 --- a/modules/lang/java/+eclim.el +++ b/modules/lang/java/+eclim.el @@ -6,7 +6,7 @@ (def-package! eclim :hook (java-mode . eclim-mode) :config - (set! :lookup 'java-mode + (set-lookup-handlers! 'java-mode :definition #'eclim-java-find-declaration :references #'eclim-java-find-references :documentation #'eclim-java-show-documentation-for-current-element) diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 4a0ee7767..4eaa530e1 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -10,7 +10,7 @@ meghanada-use-eldoc t meghanada-use-auto-start t) - (set! :lookup 'java-mode + (set-lookup-handlers! 'java-mode :definition #'meghanada-jump-declaration :references #'meghanada-reference) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 52a301945..3a7e17245 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -105,7 +105,7 @@ (set-company-backend! 'tide-mode 'company-tide) ;; navigation - (set! :lookup 'tide-mode + (set-lookup-handlers! 'tide-mode :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) @@ -158,7 +158,7 @@ (def-package! xref-js2 :when (featurep! :feature lookup) :commands xref-js2-xref-backend - :init (set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend)) + :init (set-lookup-handlers! 'js2-mode :xref-backend #'xref-js2-xref-backend)) (def-package! js2-refactor diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 70c1b4d33..b0eaf1f66 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -3,7 +3,7 @@ (after! lua-mode (add-hook 'lua-mode-hook #'flycheck-mode) - (set! :lookup 'lua-mode :documentation 'lua-search-documentation) + (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) (set-repl-handler! 'lua-mode #'+lua/repl) (set-company-backend! 'lua-mode '(company-lua company-yasnippet)) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index e092410ce..c8b9cecff 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -18,7 +18,7 @@ (setq php-template-compatibility nil) (set-repl-handler! 'php-mode #'php-boris) - (set! :lookup 'php-mode :documentation #'php-search-documentation) + (set-lookup-handlers! 'php-mode :documentation #'php-search-documentation) ;; ac-php provides custom autocompletion, php-extras provides autocompletion ;; for built-in libraries diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 27037d0b9..381bfea00 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -81,7 +81,7 @@ environment variables." (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) (set-company-backend! 'python-mode '(company-anaconda)) (set-popup-rule! "^\\*anaconda-mode" nil '((select))) - (set! :lookup 'python-mode + (set-lookup-handlers! 'python-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index b0a892093..3ebab3937 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -21,7 +21,7 @@ :after rust-mode :config (add-hook 'rust-mode-hook #'racer-mode) - (set! :lookup 'rust-mode + (set-lookup-handlers! 'rust-mode :definition #'racer-find-definition :documentation #'racer-describe)) From 8b739fb3b0539012adbd18cc8f17ca2804fc12a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 17:35:20 +0200 Subject: [PATCH 1899/4235] Set doom-file property less eagerly Reduces the size of the autoloads file by 6-10% by only setting doom-file property on raw forms or no-op macros. --- core/core-dispatcher.el | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 0b037054f..2e74acf62 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -442,7 +442,7 @@ even if it doesn't need reloading!" (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) (let ((sexp (sexp-at-point)) (pred (match-string 1))) - (if (not (memq (car sexp) '(defun defmacro cl-defun cl-defmacro def-setting!))) + (if (not (memq (car sexp) '(defun defmacro cl-defun cl-defmacro))) (message "Ignoring invalid autodef %s (found %s)" name type) (cl-destructuring-bind (type name arglist docstring &rest body) sexp @@ -453,10 +453,13 @@ even if it doesn't need reloading!" ((file-in-directory-p path doom-private-dir) `(:private . ,(intern (file-name-base path)))) ((file-in-directory-p path doom-emacs-dir) - `(:core . ,(intern (file-name-base path))))))) + `(:core . ,(intern (file-name-base path)))))) + (doom-file-form + `(put ',name 'doom-file ,(abbreviate-file-name path)))) (push (cond ((not (and member-p (or (null pred) (eval (read pred) t)))) + (push doom-file-form forms) (condition-case-unless-debug e (append (list 'defmacro name arglist @@ -474,11 +477,11 @@ even if it doesn't need reloading!" (message "Ignoring autodef %s (%s)" name e) nil))) - ((memq type '(defmacro cl-defmacro def-setting!)) + ((memq type '(defmacro cl-defmacro)) + (push doom-file-form forms) sexp) ((make-autoload sexp path))) forms) - (push `(put ',name 'doom-file ',(abbreviate-file-name path)) forms) (push `(put ',name 'doom-module ',origin) forms)))))) (if forms (concat (string-join (mapcar #'prin1-to-string (reverse forms)) "\n") From 8ca88aba9e71808c6d324228d21c02b128667ae2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 17:37:58 +0200 Subject: [PATCH 1900/4235] Replace :email with set-email-account! autodef --- modules/app/email/autoload/email.el | 46 +++++++++++++++++++++++++++++ modules/app/email/config.el | 38 ------------------------ 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index d0767f41a..0502c38fb 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -1,5 +1,51 @@ ;;; app/email/autoload/email.el -*- lexical-binding: t; -*- +;;;###autodef +(defun set-email-account! (label letvars &optional default-p) + "Registers an email address for mu4e. The LABEL is a string. LETVARS are a +list of cons cells (VARIABLE . VALUE) -- you may want to modify: + + + `user-full-name' (this or the global `user-full-name' is required) + + `user-mail-address' (required) + + `smtpmail-smtp-user' (required for sending mail from Emacs) + +OPTIONAL: + + `mu4e-sent-folder' + + `mu4e-drafts-folder' + + `mu4e-trash-folder' + + `mu4e-refile-folder' + + `mu4e-compose-signature' + +DEFAULT-P is a boolean. If non-nil, it marks that email account as the +default/fallback account." + (after! mu4e + (when-let* ((address (cdr (assq 'user-mail-address letvars-vars)))) + (add-to-list 'mu4e-user-mail-address-list address)) + (setq mu4e-contexts + (cl-delete-if (apply-partially #'string= label) mu4e-contexts + :key #'mu4e-context-name)) + (let ((context (make-mu4e-context + :name label + :enter-func (lambda () (mu4e-message "Switched to %s" ,label)) + :leave-func (lambda () (mu4e-clear-caches)) + :match-func + (lambda (msg) + (when msg + (string-prefix-p (format "/%s" ,label) + (mu4e-message-field msg :maildir)))) + :vars letvars))) + (push context mu4e-contexts) + (when default-p + (setq-default mu4e-context-current context)) + context))) + +;;;###autoload +(def-setting! :email (label letvars &optional default-p) + :obsolete set-email-account! + `(set-email-acount! ,label ,letvars ,default-p)) + + + (defvar +email-workspace-name "*mu4e*" "TODO") diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 49274f811..e26b708f0 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -7,44 +7,6 @@ (defvar +email-backend 'mbsync "Which backend to use. Can either be offlineimap, mbsync or nil (manual).") -(def-setting! :email (label letvars &optional default-p) - "Registers an email address for mu4e. The LABEL is a string. LETVARS are a -list of cons cells (VARIABLE . VALUE) -- you may want to modify: - - + `user-full-name' (this or the global `user-full-name' is required) - + `user-mail-address' (required) - + `smtpmail-smtp-user' (required for sending mail from Emacs) - -OPTIONAL: - + `mu4e-sent-folder' - + `mu4e-drafts-folder' - + `mu4e-trash-folder' - + `mu4e-refile-folder' - + `mu4e-compose-signature' - -DEFAULT-P is a boolean. If non-nil, it marks that email account as the -default/fallback account." - `(after! mu4e - (let ((account-vars ,letvars)) - (when-let* ((address (cdr (assq 'user-mail-address account-vars)))) - (cl-pushnew address mu4e-user-mail-address-list :test #'equal)) - (setq mu4e-contexts - (cl-delete-if (lambda (c) (string= (mu4e-context-name c) ,label)) - mu4e-contexts)) - (let ((context (make-mu4e-context - :name ,label - :enter-func (lambda () (mu4e-message "Switched to %s" ,label)) - :leave-func (lambda () (mu4e-clear-caches)) - :match-func - (lambda (msg) - (when msg - (string-prefix-p (format "/%s" ,label) - (mu4e-message-field msg :maildir)))) - :vars ,letvars))) - (push context mu4e-contexts) - ,(if default-p `(setq-default mu4e-context-current context)) - context)))) - ;; ;; Plugins From ab9b8d97bca1d304e4d9a62969dc2247300bc47b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 17:58:21 +0200 Subject: [PATCH 1901/4235] Replace :rotate with set-rotate-patterns! autodef And its references. --- modules/lang/emacs-lisp/config.el | 2 +- modules/tools/rotate-text/autoload.el | 28 +++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 87b0a156f..ab1151d3b 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -8,7 +8,7 @@ (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") - (set! :rotate 'emacs-lisp-mode + (set-rotate-patterns! 'emacs-lisp-mode :symbols '(("t" "nil") ("let" "let*") ("when" "unless") diff --git a/modules/tools/rotate-text/autoload.el b/modules/tools/rotate-text/autoload.el index 1cae4ba58..dbdbbf4ac 100644 --- a/modules/tools/rotate-text/autoload.el +++ b/modules/tools/rotate-text/autoload.el @@ -1,17 +1,21 @@ ;;; tools/rotate-text/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(def-setting! :rotate (modes &rest plist) +;;;###autodef +(cl-defun set-rotate-patterns! (modes &key symbols words patterns) "Declare :symbols, :words or :patterns (all lists of strings) that `rotate-text' will cycle through." (declare (indent 1)) - (let* ((modes (doom-enlist (doom-unquote modes))) - (fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-"))))) - `(progn - (defun ,fn-name () - (require 'rotate-text) - (let ((plist (list ,@plist))) - (setq rotate-text-local-symbols (plist-get plist :symbols) - rotate-text-local-words (plist-get plist :words) - rotate-text-local-patterns (plist-get plist :patterns)))) - (add-hook! ,modes #',fn-name)))) + (dolist (mode (doom-enlist modes)) + (let ((fn-name (intern (format "+rotate-text--init-%s" mode)))) + (fset fn-name + (lambda () + (setq-local rotate-text-local-symbols symbols) + (setq-local rotate-text-local-words words) + (setq-local rotate-text-local-patterns patterns))) + (add-hook (intern (format "%s-hook" mode)) fn-name)))) + +;; FIXME obsolete :rotate +;;;###autoload +(def-setting! :rotate (modes &rest plist) + :obsolete set-rotate-patterns! + `(set-rotate-patterns! ,modes ,@plist)) From 4d017ae19e6651987404b62631b601e886fd6f07 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 18:03:11 +0200 Subject: [PATCH 1902/4235] Replace :yas-minor-mode with set-yas-minor-mode! --- modules/feature/snippets/autoload/settings.el | 15 +++++++++++++++ modules/feature/snippets/autoload/snippets.el | 11 ----------- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/java/config.el | 2 +- modules/lang/python/config.el | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 modules/feature/snippets/autoload/settings.el diff --git a/modules/feature/snippets/autoload/settings.el b/modules/feature/snippets/autoload/settings.el new file mode 100644 index 000000000..7eff149b3 --- /dev/null +++ b/modules/feature/snippets/autoload/settings.el @@ -0,0 +1,15 @@ +;;; feature/snippets/autoload/settings.el -*- lexical-binding: t; -*- + +;;;###autodef +(defun set-yas-minor-mode! (mode) + "Register a minor MODE with yasnippet so it can have its own snippets +category, if the folder exists." + (after! yasnippet + (let ((fn (intern (format "+snippets--register-%s" mode)))) + (fset fn (lambda () (+snippets|enable-project-modes mode))) + (add-hook (intern (format "%s-hook" mode)) fn)))) + +;;;###autoload +(def-setting! :yas-minor-mode (mode) + :obsolete set-yas-minor-mode! + `(set-yas-minor-mode! ,mode)) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index 31ae098aa..c232ec0d7 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -1,16 +1,5 @@ ;;; feature/snippets/autoload/snippets.el -*- lexical-binding: t; -*- -;;;###autoload -(def-setting! :yas-minor-mode (mode) - "Register a minor MODE with yasnippet so it can have its own snippets -category, if the folder exists." - (let* ((mode (doom-unquote mode)) - (hookfn (intern (format "+snippets--register-%s" mode)))) - `(after! yasnippet - (fset ',hookfn (lambda () (+snippets|enable-project-modes ',mode))) - (add-hook! ,mode #',hookfn)))) - - ;; ;; Commands ;; diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index ab1151d3b..fe015ff0f 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -119,5 +119,5 @@ :match "/test[/-].+\\.el$") (after! buttercup - (set! :yas-minor-mode 'buttercup-minor-mode)) + (set-yas-minor-mode! 'buttercup-minor-mode)) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 7e3dffd61..04ac04ae6 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -17,7 +17,7 @@ :init (add-hook! (java-mode groovy-mode nxml-mode) #'+java|android-mode-maybe) :config - (set! :yas-minor-mode 'android-mode) + (set-yas-minor-mode! 'android-mode) (set! :company-dict-minor-mode 'android-mode)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 381bfea00..c2b7a11d0 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -113,7 +113,7 @@ environment variables." (associate! nose-mode :match "/test_.+\\.py$" :modes (python-mode)) :config (set-popup-rule! "^\\*nosetests" '((size . 0.4)) '((select))) - (set! :yas-minor-mode 'nose-mode) + (set-yas-minor-mode! 'nose-mode) (map! :map nose-mode-map :localleader :prefix "t" From 60e7b7873939470a4a20099e7e1cb99c4a7e52b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 18:32:53 +0200 Subject: [PATCH 1903/4235] Minor refactor of doom/describe-active-minor-mode --- core/autoload/help.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 72c57ea06..7417800be 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -176,13 +176,11 @@ current file is in, or d) the module associated with the current major mode (see "Get information on an active minor mode. Use `describe-minor-mode' for a selection of all minor-modes, active or not." (interactive - (list (completing-read "Minor mode: " - (doom-active-minor-modes)))) + (list (completing-read "Minor mode: " (doom-active-minor-modes)))) (describe-minor-mode-from-symbol - (cl-typecase mode - (string (intern mode)) - (symbol mode) - (t (error "Expected a symbol/string, got a %s" (type-of mode)))))) + (cond ((stringp mode) (intern mode)) + ((symbolp mode) mode) + ((error "Expected a symbol/string, got a %s" (type-of mode)))))) ;;;###autoload (defun doom/what-face (&optional pos) From 4d5a247d53d5403b3852708af3b4117210320ae3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 18:50:45 +0200 Subject: [PATCH 1904/4235] With C-u, doom/what-face doesn't fontify results In case you get a face that's too hard to see. --- core/autoload/help.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 7417800be..be4361f00 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -183,12 +183,12 @@ selection of all minor-modes, active or not." ((error "Expected a symbol/string, got a %s" (type-of mode)))))) ;;;###autoload -(defun doom/what-face (&optional pos) +(defun doom/what-face (arg &optional pos) "Shows all faces and overlay faces at point. Interactively prints the list to the echo area. Noninteractively, returns a list whose car is the list of faces and cadr is the list of overlay faces." - (interactive) + (interactive "P") (let* ((pos (or pos (point))) (faces (let ((face (get-text-property pos 'face))) (if (keywordp (car-safe face)) @@ -201,7 +201,7 @@ whose car is the list of faces and cadr is the list of overlay faces." (propertize "Faces:" 'face 'font-lock-comment-face) (if faces (cl-loop for face in faces - if (listp face) + if (or (listp face) arg) concat (format "'%s " face) else concat (concat (propertize (symbol-name face) 'face face) " ")) @@ -209,7 +209,8 @@ whose car is the list of faces and cadr is the list of overlay faces." (propertize "Overlays:" 'face 'font-lock-comment-face) (if overlays (cl-loop for ov in overlays - concat (concat (propertize (symbol-name ov) 'face ov) " ")) + if arg concat (concat (symbol-name ov) " ") + else concat (concat (propertize (symbol-name ov) 'face ov) " ")) "n/a"))) (t (and (or faces overlays) From d0abe742f96552c0913c84ca09bc5e631baff54e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 20:52:00 +0200 Subject: [PATCH 1905/4235] Don't set ispell-program-name ispell already looks for aspell, ispell, and hunspell on initialization. --- modules/feature/spellcheck/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 435d2c5f0..a6638c251 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -15,8 +15,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: :init (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) :config - (setq ispell-program-name (executable-find "aspell") - ispell-list-command "--list" + (setq ispell-list-command "--list" ispell-extr-args '("--dont-tex-check-comments")) (defun +spellcheck|immediately () From 9e85acec2cae3d6affed6debced2ea2d7d4112e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 21:00:38 +0200 Subject: [PATCH 1906/4235] Append flyspell-mode to LaTeX-mode-hook #654 If run too soon, the user has no opportunity to change +spellcheck-immediately. --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index bc9e1dc11..6de7f6d2e 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -68,7 +68,7 @@ ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) - (add-hook 'LaTeX-mode-hook #'flyspell-mode)) + (add-hook 'LaTeX-mode-hook #'flyspell-mode :append)) ;; Use chktex to search for errors in a latex file. (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") ;; Set a custom item indentation From 4a0b98ef1c6d983ab76ad42ef3f97858eec5e349 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 21:16:37 +0200 Subject: [PATCH 1907/4235] lang/latex: fix removal of master file prompt It makes me sad that this is necessary. Friends don't let friends use anonymous functions for their package's hooks. --- modules/lang/latex/config.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 6de7f6d2e..5035be1ed 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -54,10 +54,12 @@ (define-key LaTeX-mode-map "\C-j" nil) - ;; Do not prompt for Master files, this allows auto-insert to add templates - ;; to .tex files - (add-hook! '(LaTeX-mode TeX-mode) - (remove-hook 'find-file-hook (car find-file-hook) 'local)) + ;; Do not prompt for Master files, this allows auto-insert to add templates to + ;; .tex files + (add-hook! '(LaTeX-mode-hook TeX-mode-hook) + (remove-hook 'find-file-hook + (cl-find-if #'byte-code-function-p find-file-hook) + 'local)) ;; Adding useful things for latex (add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode From 4856217c840591c3690ebba54891e0549417f0bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 21:25:32 +0200 Subject: [PATCH 1908/4235] Set default ispell-dictionary Prevents wrong-type-argument stringp errors when starting flyspell-mode. --- modules/feature/spellcheck/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index a6638c251..ceee1c467 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -8,7 +8,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") ;; `ispell' -(defvar ispell-dictionary "english") +(setq ispell-dictionary "english") (def-package! flyspell ; built-in :defer t From 7773a312aaa9c262db3c0291de0c58fa2c78c1ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 21:31:13 +0200 Subject: [PATCH 1909/4235] Update tests for doom/what-face --- core/test/test-autoload-help.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/test/test-autoload-help.el b/core/test/test-autoload-help.el index 765e51f95..1f80a8e73 100644 --- a/core/test/test-autoload-help.el +++ b/core/test/test-autoload-help.el @@ -14,9 +14,9 @@ (insert (propertize "Hello " 'face 'font-lock-keyword-face)) (insert "world")) (it "returns list of faces at point" - (expect (doom/what-face (point-min)) :to-equal '((font-lock-keyword-face) ()))) + (expect (doom/what-face nil (point-min)) :to-equal '((font-lock-keyword-face) ()))) (it "returns nil if no faces at point" - (expect (doom/what-face (point-max)) :to-be nil))) + (expect (doom/what-face nil (point-max)) :to-be nil))) (describe "what-face overlays" (before-each @@ -25,7 +25,7 @@ (overlay-put ov 'face 'font-lock-keyword-face))) (it "returns list of overlays at point" - (expect (doom/what-face (point-min)) :to-equal '(() (font-lock-keyword-face)))) + (expect (doom/what-face nil (point-min)) :to-equal '(() (font-lock-keyword-face)))) (it "returns nil if no overlays at point" - (expect (doom/what-face (point-max)) :to-be nil)))) + (expect (doom/what-face nil (point-max)) :to-be nil)))) From ef9063343229af32a2b544a97d553cc4935f139e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 21:37:36 +0200 Subject: [PATCH 1910/4235] Fix docset lookup & lazyload *-dash Have to forward declare *-dash-docsets so we can lazy load the *-dash libraries. Also fixes a void-variable error because helm-dash-docsets isn't defined by helm-dash, just used. --- modules/feature/lookup/autoload/docsets.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 27e6e7134..88196c1aa 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -1,6 +1,12 @@ ;;; feature/lookup/autoload/docsets.el -*- lexical-binding: t; -*- ;;;###if (featurep! +docsets) +(defvar-local helm-dash-docsets nil + "Docsets to use for this buffer.") + +(defvar-local counsel-dash-docsets nil + "Docsets to use for this buffer.") + ;;;###autodef (defun set-docset! (modes &rest docsets) "Registers a list of DOCSETS (strings) for MODES (either one major mode @@ -23,14 +29,11 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (lambda () (let (var-sym) (cond ((featurep! :completion ivy) - (require 'counsel-dash) (setq var-sym 'counsel-dash-docsets)) ((featurep! :completion helm) - (require 'helm-dash) (setq var-sym 'helm-dash-docsets))) (when var-sym (let ((val (symbol-value var-sym))) - (make-variable-buffer-local var-sym) (pcase (car docsets) (:add (set var-sym (append val (cdr docsets)))) From 1db3830bf3c48228614697689adb595546be94b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 21:44:44 +0200 Subject: [PATCH 1911/4235] Defer server startup MY PRECIOUS MILLISECONDS OF STARTUP TIME --- core/core-editor.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 0e7be0e69..1ce50532b 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -72,11 +72,6 @@ fundamental-mode) for performance sake." (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. -(when (and (display-graphic-p) - (require 'server nil t) - (not (server-running-p))) - (server-start)) - (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) ;; revert buffers for changed files @@ -128,6 +123,14 @@ fundamental-mode) for performance sake." (lambda (file) (file-in-directory-p file doom-local-dir)))) (recentf-mode +1)) +(def-package! server + :when (display-graphic-p) + :defer 1 + :after-call (pre-command-hook after-find-file) + :config + (unless (server-running-p) + (server-start))) + ;; ;; Core Plugins From cdcc4eec5d090e7c3ac951891ff4e08800f50e24 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 22:10:40 +0200 Subject: [PATCH 1912/4235] Refactor +helm*replace-prompt In case +helm-global-prompt is nil, which will effectively disable this advice. --- modules/completion/helm/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index ae0b5b5c1..6ce2696b5 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -54,10 +54,11 @@ ;;; Helm hacks (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." - (if (keywordp (car plist)) - (plist-put plist :prompt +helm-global-prompt) - (setf (nth 2 plist) +helm-global-prompt) - plist)) + (cond ((not +helm-global-prompt) plist) + ((keywordp (car plist)) + (plist-put plist :prompt +helm-global-prompt)) + ((setf (nth 2 plist) +helm-global-prompt) + plist))) (advice-add #'helm :filter-args #'+helm*replace-prompt) (defun +helm*hide-header (&rest _) From fe6a9b0cd83c0d4d08fd52161cacf48dd3b96d8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 22:13:44 +0200 Subject: [PATCH 1913/4235] ui/popup: tie +defaults flag to +hacks --- modules/ui/popup/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 0ceae160b..2d7dbdcfc 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -151,4 +151,5 @@ deleted.") ;; Hacks ;; -(load! "+hacks") +(when (featurep! +defaults) + (load! "+hacks")) From 253fd77b2adc7ec5cda64135c76e64f076623ce5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 22:16:49 +0200 Subject: [PATCH 1914/4235] Fix intero-goto-definition #683 #684 It wasn't working in the first haskell buffer because of a race condition. Intero was loading too late to register lookup handlers for haskell-mode (for the first buffer). By setting it to intero-mode, it is registered in time for intero-mode's activation. --- modules/lang/haskell/+intero.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index bda348e9b..5eeb71046 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -14,7 +14,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config (add-hook 'intero-mode-hook #'flycheck-mode) - (set-lookup-handlers! 'haskell-mode :definition #'intero-goto-definition)) + (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) (def-package! hindent From 5aeea4dcaeeaacb9974e160509f051462b0dc26e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 22:24:53 +0200 Subject: [PATCH 1915/4235] Refactor elm+flycheck integration #686 Ensure flycheck is started soon enough and its initializing code is grouped with flycheck-elm's config. --- modules/lang/elm/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index ea7b57d8d..35a5f303e 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -4,7 +4,7 @@ (setq elm-format-on-save t) (after! elm-mode - (add-hook! 'elm-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (add-hook 'elm-mode-hook #'rainbow-delimiters-mode) (set-company-backend! 'elm-mode 'company-elm) (set-repl-handler! 'elm-mode #'run-elm-interactive)) @@ -12,5 +12,6 @@ (def-package! flycheck-elm :when (featurep! :feature syntax-checker) :after elm-mode - :hook (flycheck-mode . flycheck-elm-setup)) + :init (add-hook 'elm-mode-hook #'flycheck-mode) + :config (add-to-list 'flycheck-checkers 'elm nil #'eq)) From c0e271ef5a13c20c66798139495e6a4dc484a90e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 22:44:20 +0200 Subject: [PATCH 1916/4235] Fix "Invalid read syntax: '#'" errors Caused when Emacs reads back the unserialized font-specs it saved in .local/custom.el. So we store them in xlfd format instead. --- core/core-ui.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index a185d6b37..bbde3d863 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -557,10 +557,11 @@ frame's window-system, the theme will be reloaded.") (progn (custom-set-faces (when (fontp doom-font) - (map-put default-frame-alist 'font (font-xlfd-name doom-font)) - `(fixed-pitch ((t (:font ,doom-font))))) + (let ((xlfd (font-xlfd-name doom-font))) + (map-put default-frame-alist 'font xlfd) + `(fixed-pitch ((t (:font ,xlfd)))))) (when (fontp doom-variable-pitch-font) - `(variable-pitch ((t (:font ,doom-variable-pitch-font)))))) + `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font))))))) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) (setq use-default-font-for-symbols nil) From 8e6519ef1a30f6b58597ed39b50594f17652c3e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 23:52:19 +0200 Subject: [PATCH 1917/4235] Fix & refactor after!'s :when keyword support It no longer tries to load keywords (like :when and :any) as packages, and won't treat :when's arguments as a require target. --- core/core-lib.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index d4f802432..12fd42980 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -210,25 +210,27 @@ compilation. This will no-op on features that have been disabled by the user." (unless (and (symbolp targets) (memq targets (bound-and-true-p doom-disabled-packages))) (list (if (or (not (bound-and-true-p byte-compile-current-file)) + (eq (car-safe targets) :when) (dolist (next (doom-enlist targets)) - (if (symbolp next) - (require next nil :no-error) - (load next :no-message :no-error)))) + (unless (keywordp next) + (if (symbolp next) + (require next nil :no-error) + (load next :no-message :no-error))))) #'progn #'with-no-warnings) (cond ((eq (car-safe targets) :when) `(if ,(cadr targets) (progn ,@body) - ,(let* ((hook 'after-load-functions) - (fun (intern (format "doom|delay-form-in-%s" hook)))) + ,(let ((fun (gensym "doom|delay-form-"))) `(progn (fset ',fun (lambda (&rest args) (when ,(or (car (cdr-safe targets)) t) - (remove-hook ',hook #',fun) + (remove-hook 'after-load-functions #',fun) + (unintern ',fun nil) (ignore args) ,@body))) (put ',fun 'permanent-local-hook t) - (add-hook ',hook #',fun))))) + (add-hook 'after-load-functions #',fun))))) ((symbolp targets) `(eval-after-load ',targets '(progn ,@body))) ((and (consp targets) From 2047a52fcd85704676482d0186258bd53634ffd7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Jun 2018 23:54:07 +0200 Subject: [PATCH 1918/4235] Refactor add-transient-hook! Use gensym instead of counter (and unintern the function symbol after it's been used). --- core/core-lib.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 12fd42980..54c70314c 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -262,7 +262,6 @@ compilation. This will no-op on features that have been disabled by the user." (save-silently t)) ,@forms)))) -(defvar doom--transient-counter 0) (defmacro add-transient-hook! (hook &rest forms) "Attaches transient forms to a HOOK. @@ -272,17 +271,17 @@ invoked, then never again. HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." (declare (indent 1)) (let ((append (if (eq (car forms) :after) (pop forms))) - (fn (intern (format "doom|transient-hook-%s" - (if (not (symbolp (car forms))) - (cl-incf doom--transient-counter) - (pop forms)))))) + (fn (if (symbolp (car forms)) + (intern (format "doom|transient-hook-%s" (pop forms))) + (gensym "doom|transient-hook-")))) `(progn (fset ',fn (lambda (&rest _) ,@forms (cond ((functionp ,hook) (advice-remove ,hook #',fn)) ((symbolp ,hook) (remove-hook ,hook #',fn))) - (fmakunbound ',fn))) + (fmakunbound ',fn) + (unintern ',fn nil))) (cond ((functionp ,hook) (advice-add ,hook ,(if append :after :before) #',fn)) ((symbolp ,hook) From a1278f3dff715bc43b844ea52a6f0e8bc72d6a53 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 00:36:27 +0200 Subject: [PATCH 1919/4235] Refactor def-package! Rely on use-package mechanisms. def-package! should be as thin a wrapper as possible. Ideally, we should simply be an alias, but there is no way to inject :disabled into a use-package declaration, because it is treated especially. --- core/core-modules.el | 49 +++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 18adaf511..c6ea3b5ef 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -172,24 +172,33 @@ non-nil, return paths of possible modules, activated or otherwise." (autoload 'use-package "use-package-core" nil nil t) -;; Adds the :after-call custom keyword to `use-package' (and consequently, -;; `def-package!'). :after-call takes a symbol or list of symbols. These symbols -;; can be functions or hook variables. -;; -;; (use-package X :after-call find-file-hook) -;; -;; This will load X on the first invokation of `find-file-hook' (then it will -;; remove itself from the hook/function). (defvar doom--deferred-packages-alist ()) (after! use-package-core - (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) + ;; Prevent packages from being loaded at compile time if they don't meet their + ;; own predicates. + (push (list :no-require t + (lambda (name args) + (and (bound-and-true-p byte-compile-current-file) + (or (when-let* ((pred (or (plist-get args :if) + (plist-get args :when)))) + (not (eval pred t))) + (when-let* ((pred (plist-get args :unless))) + (eval pred t)))))) + use-package-defaults) + ;; Adds the :after-call custom keyword to `use-package' (and consequently, + ;; `def-package!'). :after-call takes a symbol or list of symbols. These + ;; symbols can be functions or hook variables. + ;; + ;; (use-package X :after-call find-file-hook) + ;; + ;; This will load X on the first invokation of `find-file-hook' (then it will + ;; remove itself from the hook/function). + (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) (setq use-package-keywords (use-package-list-insert :after-call use-package-keywords :after)) - (defalias 'use-package-normalize/:after-call - 'use-package-normalize-symlist) - + (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) (defun use-package-handler/:after-call (name _keyword hooks rest state) (let ((fn (intern (format "doom|transient-hook--load-%s" name))) (hooks (delete-dups hooks))) @@ -288,18 +297,12 @@ to least)." (load ,(expand-file-name "config" doom-private-dir) t (not doom-debug-mode)))))))) +(defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) - "A thin wrapper around `use-package'." - ;; Ignore package if NAME is in `doom-disabled-packages' - (when (memq name (bound-and-true-p doom-disabled-packages)) - (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) - (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) - (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) - (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) - `(use-package ,name ,@plist))) + "This is a thin wrapper around `use-package'." + `(use-package ,name + ,@(append (if (memq name doom-disabled-packages) `(:disabled t)) + plist))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. From 33839f54e9a23a13d4f496038c9113f9f1879dac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 00:37:50 +0200 Subject: [PATCH 1920/4235] Minor refactor doom|init-fonts Take advantage of custom-set-faces taking variadic arguments to group all font-initializing forms in one form. --- core/core-ui.el | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index bbde3d863..05231927b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -554,18 +554,18 @@ frame's window-system, the theme will be reloaded.") (defun doom|init-fonts () "Initialize fonts." (condition-case-unless-debug ex - (progn - (custom-set-faces - (when (fontp doom-font) - (let ((xlfd (font-xlfd-name doom-font))) - (map-put default-frame-alist 'font xlfd) - `(fixed-pitch ((t (:font ,xlfd)))))) - (when (fontp doom-variable-pitch-font) - `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font))))))) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (setq use-default-font-for-symbols nil) - (set-fontset-font t 'unicode doom-unicode-font nil))) + (custom-set-faces + (when (fontp doom-font) + (let ((xlfd (font-xlfd-name doom-font))) + (map-put default-frame-alist 'font xlfd) + `(fixed-pitch ((t (:font ,xlfd)))))) + (when (fontp doom-variable-pitch-font) + `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font)))))) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (setq use-default-font-for-symbols nil) + (set-fontset-font t 'unicode doom-unicode-font nil) + nil)) ('error (if (string-prefix-p "Font not available: " (error-message-string ex)) (lwarn 'doom-ui :warning From 435c940af958eb7d1ca093c15168be60e83139a7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 00:38:57 +0200 Subject: [PATCH 1921/4235] Remove unused setting :company-dict-minor-mode --- modules/lang/java/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 04ac04ae6..bd5a11904 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -17,8 +17,7 @@ :init (add-hook! (java-mode groovy-mode nxml-mode) #'+java|android-mode-maybe) :config - (set-yas-minor-mode! 'android-mode) - (set! :company-dict-minor-mode 'android-mode)) + (set-yas-minor-mode! 'android-mode)) (def-package! groovy-mode From 1cfc146e3a41c4c9f2e098d0dff5831cde5cc746 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 00:39:20 +0200 Subject: [PATCH 1922/4235] Fix indentation of set-popup-rule!'s arguments --- modules/ui/popup/autoload/settings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 9dbaf085f..ab5f4cecd 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -41,6 +41,7 @@ matched against the buffer's name) or b) a function that takes no arguments and returns a boolean. See `def-popups!' for defining multiple rules in bulk." + (declare (indent defun)) (+popup--define condition alist parameters) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) From 9c748600a52e5e671d5686c96cf4fd3d2c956aba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 01:12:41 +0200 Subject: [PATCH 1923/4235] Fix set-email-account! & minor refactor Mentioned by @myme --- modules/app/email/autoload/email.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index 0502c38fb..f7a3a3272 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -19,19 +19,20 @@ OPTIONAL: DEFAULT-P is a boolean. If non-nil, it marks that email account as the default/fallback account." (after! mu4e - (when-let* ((address (cdr (assq 'user-mail-address letvars-vars)))) + (when-let* ((address (cdr (assq 'user-mail-address letvars)))) (add-to-list 'mu4e-user-mail-address-list address)) (setq mu4e-contexts - (cl-delete-if (apply-partially #'string= label) mu4e-contexts - :key #'mu4e-context-name)) + (cl-loop for context in mu4e-contexts + unless (string= (mu4e-context-name context) label) + collect context)) (let ((context (make-mu4e-context :name label - :enter-func (lambda () (mu4e-message "Switched to %s" ,label)) + :enter-func (lambda () (mu4e-message "Switched to %s" label)) :leave-func (lambda () (mu4e-clear-caches)) :match-func (lambda (msg) (when msg - (string-prefix-p (format "/%s" ,label) + (string-prefix-p (format "/%s" label) (mu4e-message-field msg :maildir)))) :vars letvars))) (push context mu4e-contexts) From 02d532a09acd4ad53416b196405f5755ff5351be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 10:22:59 +0200 Subject: [PATCH 1924/4235] Set ibuffer-use-other-window in ui/popup/+hacks.el It was originally set to accommodate the popup system. --- core/core-ui.el | 1 - modules/ui/popup/+hacks.el | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 05231927b..fb297391b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -76,7 +76,6 @@ Also see `doom-before-switch-buffer-hook'.") 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 diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 881b4d2b4..ead941ec4 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -176,6 +176,10 @@ the command buffer." (advice-add #'helm-ag--edit :around #'+helm*pop-to-buffer)) +;; `ibuffer' +(setq ibuffer-use-other-window t) + + ;; `Info' (defun +popup*switch-to-info-window (&rest _) (when-let* ((win (get-buffer-window "*info*"))) From 5501b949efc964c4ce0eef89f0a7adcd841a3ef4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:34:19 +0200 Subject: [PATCH 1925/4235] Refactor def-project-mode! with cl-defmacro --- core/core-projects.el | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 4446b28ec..b34634783 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -140,7 +140,15 @@ state are passed in.") unless (symbol-value mode) do (funcall mode))))) -(defmacro def-project-mode! (name &rest plist) +(cl-defmacro def-project-mode! (name &key + modes + files + when + match + add-hooks + on-load + on-enter + on-exit) "Define a project minor-mode named NAME (a symbol) and declare where and how it is activated. Project modes allow you to configure 'sub-modes' for major-modes that are specific to a specific folder, certain project structure, @@ -175,37 +183,25 @@ should be activated. If they are *all* true, NAME is activated. :on-exit FORM -- FORM is run each time the mode is disabled. Relevant: `doom-project-hook'." - (declare (indent 1) (doc-string 2)) - (let ((doc-string (if (stringp (car plist)) - (prog1 (car plist) - (setq plist (cdr plist))) - "A project minor mode.")) - (modes (plist-get plist :modes)) - (files (plist-get plist :files)) - (when (plist-get plist :when)) - (match (plist-get plist :match)) - (hooks (plist-get plist :add-hooks)) - (load-form (plist-get plist :on-load)) - (enter-form (plist-get plist :on-enter)) - (exit-form (plist-get plist :on-exit)) - (init-var (intern (format "%s-init" name)))) + (declare (indent 1)) + (let ((init-var (intern (format "%s-init" name)))) `(progn - ,(if load-form `(defvar ,init-var nil)) + ,(if on-load `(defvar ,init-var nil)) (define-minor-mode ,name - ,doc-string + "A project minor mode generated by `def-project-mode!'." :init-value nil :lighter "" :keymap (make-sparse-keymap) (if (not ,name) - ,exit-form + ,on-exit (run-hook-with-args 'doom-project-hook ',name ,name) - ,(when load-form + ,(when on-load `(unless ,init-var - ,load-form + ,on-load (setq ,init-var t))) - ,enter-form)) - ,(when hooks - `(setq ,(intern (format "%s-hook" name)) ',hooks)) + ,on-enter)) + ,(when add-hooks + `(setq ,(intern (format "%s-hook" name)) ',add-hooks)) ,(when (or modes match files when) `(associate! ,name :modes ,modes From 126b7b6383f2133acf2331d392ee41290fb91ff6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:34:42 +0200 Subject: [PATCH 1926/4235] Refactor associate! with cl-defmacro --- core/core-lib.el | 60 ++++++++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 54c70314c..ba118a2cd 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -361,7 +361,7 @@ Body forms can access the hook's arguments through the let-bound variable (push `(setq-local ,var ,val) forms))) (nreverse forms)))) -(defmacro associate! (mode &rest plist) +(cl-defmacro associate! (mode &key modes match files when) "Enables a minor mode if certain conditions are met. The available conditions are: @@ -377,37 +377,33 @@ The available conditions are: Whenever FORM returns non-nil." (declare (indent 1)) (unless noninteractive - (let ((modes (plist-get plist :modes)) - (match (plist-get plist :match)) - (files (plist-get plist :files)) - (pred-form (plist-get plist :when))) - (cond ((or files modes pred-form) - (when (and files - (not (or (listp files) - (stringp files)))) - (user-error "associate! :files expects a string or list of strings")) - (let ((hook-name (intern (format "doom--init-mode-%s" mode)))) - `(progn - (fset ',hook-name - (lambda () - (and (fboundp ',mode) - (not (bound-and-true-p ,mode)) - (and buffer-file-name (not (file-remote-p buffer-file-name))) - ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) - ,(or (not files) - (doom--resolve-path-forms - (if (stringp (car files)) (cons 'and files) files) - '(doom-project-root))) - ,(or pred-form t) - (,mode 1)))) - ,@(if (and modes (listp modes)) - (cl-loop for hook in (doom--resolve-hook-forms modes) - collect `(add-hook ',hook #',hook-name)) - `((add-hook 'after-change-major-mode-hook #',hook-name)))))) - (match - `(map-put doom-auto-minor-mode-alist ,match ',mode)) - (t (user-error "associate! invalid rules for mode [%s] (modes %s) (match %s) (files %s)" - mode modes match files)))))) + (cond ((or files modes when) + (when (and files + (not (or (listp files) + (stringp files)))) + (user-error "associate! :files expects a string or list of strings")) + (let ((hook-name (intern (format "doom--init-mode-%s" mode)))) + `(progn + (fset ',hook-name + (lambda () + (and (fboundp ',mode) + (not (bound-and-true-p ,mode)) + (and buffer-file-name (not (file-remote-p buffer-file-name))) + ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) + ,(or (not files) + (doom--resolve-path-forms + (if (stringp (car files)) (cons 'and files) files) + '(doom-project-root))) + ,(or when t) + (,mode 1)))) + ,@(if (and modes (listp modes)) + (cl-loop for hook in (doom--resolve-hook-forms modes) + collect `(add-hook ',hook #',hook-name)) + `((add-hook 'after-change-major-mode-hook #',hook-name)))))) + (match + `(map-put doom-auto-minor-mode-alist ,match ',mode)) + ((user-error "Invalid `associate!' rules for mode [%s] (:modes %s :match %s :files %s :when %s)" + mode modes match files when))))) (defmacro file-exists-p! (spec &optional directory) "Returns t if the files in SPEC all exist. From b656e68bc3050fb15eb64f4902bbcdae536560d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:38:19 +0200 Subject: [PATCH 1927/4235] Move startup optimization to early-init Also load early-init from init if early-init-file isn't bound. This improves startup a modest 3-5% for Emacs 27 users. --- core/core-ui.el | 3 --- early-init.el | 51 ++++++++++++++++++++++++++++++++++++++----------- init.el | 39 ++----------------------------------- 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index fb297391b..09eb5e883 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -609,9 +609,6 @@ frame's window-system, the theme will be reloaded.") (setq frame-title-format '("%b – Doom Emacs")) ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only -(menu-bar-mode -1) -(if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) -(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) ;; prompts the user for confirmation when deleting a non-empty frame (define-key global-map [remap delete-frame] #'doom/delete-frame) diff --git a/early-init.el b/early-init.el index e47330734..af00a89e5 100644 --- a/early-init.el +++ b/early-init.el @@ -1,18 +1,47 @@ ;;; early-init.el -*- lexical-binding: t; -*- ;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el, -;; before most of its package and UI initialization happens. We can use this -;; opportunity to cull parts of the startup process early. +;; before package and UI initialization happens. We can use this opportunity to +;; cull parts of the startup process early and optimize Emacs startup ASAP. -;; Package initialize occurs automatically, before `user-init-file' is loaded, -;; but after `early-init-file'. Doom handles package initialization, so we must -;; prevent Emacs from doing it early! -(setq package-enable-at-startup nil) +(unless noninteractive + (defvar doom--file-name-handler-alist + file-name-handler-alist) + (unless after-init-time + ;; A big contributor to long startup times is the garbage collector, so we + ;; up its memory threshold, temporarily and reset it later in + ;; `doom|finalize'. + (setq gc-cons-threshold 402653184 + gc-cons-percentage 1.0 + ;; consulted on every `require', `load' and various file reading + ;; functions. You get a minor speed up by nooping this. + file-name-handler-alist nil)) -;; Faster to disable these here (before they've been initialized) -(setq tool-bar-mode nil - menu-bar-mode nil - scroll-bar-mode nil) -(modify-all-frames-parameters '((vertical-scroll-bars))) + (defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes) and resets +`file-name-handler-alist'." + (setq file-name-handler-alist doom--file-name-handler-alist + gc-cons-threshold 16777216 + gc-cons-percentage 0.15)) + + (add-hook 'emacs-startup-hook #'doom|finalize) + (add-hook 'doom-reload-hook #'doom|finalize)) + +;; Ensure Doom is always running out of this file's directory +(setq user-emacs-directory (file-name-directory load-file-name) + ;; In noninteractive sessions, we hope that non-byte-compiled files will + ;; take precedence over byte-compiled ones, however, if you're getting odd + ;; recursive load errors, it may help to set this to nil. + load-prefer-newer noninteractive + ;; Package initialize occurs automatically, before `user-init-file' is + ;; loaded, but after `early-init-file'. Doom handles package + ;; initialization, so we must prevent Emacs from doing it early! + package-enable-at-startup nil) + +;; Prevent the glimpse of un-styled Emacs by setting these early. +(if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) +(if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) +(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) ;; TODO Once Emacs 27 hits stable, perhaps replace init.el with early-init.el diff --git a/init.el b/init.el index 68af9def2..ac0ca2237 100644 --- a/init.el +++ b/init.el @@ -27,42 +27,7 @@ ;; ;;; License: MIT -;; Ensure Doom is always running out of this file's directory -(setq user-emacs-directory (file-name-directory load-file-name) - load-prefer-newer noninteractive) - - -;; -;; Optimize startup -;; - -(unless noninteractive - (defvar doom--file-name-handler-alist - file-name-handler-alist) - (unless after-init-time - ;; A big contributor to long startup times is the garbage collector, so we - ;; up its memory threshold, temporarily and reset it later in - ;; `doom|finalize'. - (setq gc-cons-threshold 402653184 - gc-cons-percentage 1.0 - ;; consulted on every `require', `load' and various file reading - ;; functions. You get a minor speed up by nooping this. - file-name-handler-alist nil)) - - (defun doom|finalize () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes) and resets -`file-name-handler-alist'." - (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 16777216 - gc-cons-percentage 0.2)) - - (add-hook 'emacs-startup-hook #'doom|finalize) - (add-hook 'doom-reload-hook #'doom|finalize)) - - -;; -;; Bootstrap Doom -;; +(unless (boundp 'early-init-file) + (load (concat (file-name-directory load-file-name) "early-init"))) (require 'core (concat user-emacs-directory "core/core")) From c81304d18b869c320b2e6377aff2a011d0f000c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:41:07 +0200 Subject: [PATCH 1928/4235] Enable smartparens in eval-expression This is experimental, so we can have delimiter/quote autopairing while we write lisp into eval-expression. --- core/autoload/editor.el | 2 +- core/core-editor.el | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 4baa3fc93..f577f78d0 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -186,7 +186,7 @@ possible, or just one char if that's not possible." (insert-char ?\s (- ocol (current-column)) nil)))) ;; ((and (= n 1) - (not (minibufferp))) + (bound-and-true-p smartparens-mode)) (cond ((and (memq (char-before) (list ?\ ?\t)) (save-excursion (and (> (- (skip-chars-backward " \t" (line-beginning-position))) 0) diff --git a/core/core-editor.el b/core/core-editor.el index 1ce50532b..29a3475d7 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -151,6 +151,12 @@ fundamental-mode) for performance sake." (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) + (defun doom|init-smartparens-in-eval-expression () + "Enable `smartparens-mode' in the minibuffer, during `eval-expression'." + (when (eq this-command 'eval-expression) + (smartparens-mode))) + (add-hook 'minibuffer-setup-hook #'doom|init-smartparens-in-eval-expression) + (sp-local-pair '(xml-mode nxml-mode php-mode) "" :post-handlers '(("| " "SPC"))) From 9a2f96c0f1a501aaa3e501a77509328a678db8b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:42:37 +0200 Subject: [PATCH 1929/4235] Lazy load projectile (experimental) I can feel it; the power coursing through my veins. Every millisecond saved at startup makes me more powerful. This world will be mine. Mine I tell you! --- core/autoload/projects.el | 90 +++++++++++++++++++++++++++++++++++++++ core/core-projects.el | 73 +------------------------------ 2 files changed, 92 insertions(+), 71 deletions(-) create mode 100644 core/autoload/projects.el diff --git a/core/autoload/projects.el b/core/autoload/projects.el new file mode 100644 index 000000000..d70fc0c11 --- /dev/null +++ b/core/autoload/projects.el @@ -0,0 +1,90 @@ +;;; core/autoload/projects.el -*- lexical-binding: t; -*- + +;; +;; Macros +;; + +;;;###autoload +(defmacro without-project-cache! (&rest body) + "Run BODY with projectile's project-root cache disabled. This is necessary if +you want to interactive with a project other than the one you're in." + `(let (projectile-project-name + projectile-require-project-root + projectile-cached-buffer-file-name + projectile-cached-project-root) + ,@body)) + +;;;###autoload +(defmacro project-file-exists-p! (files) + "Checks if the project has the specified FILES. +Paths are relative to the project root, unless they start with ./ or ../ (in +which case they're relative to `default-directory'). If they start with a slash, +they are absolute." + `(file-exists-p! ,files (doom-project-root))) + + +;; +;; Commands +;; + +;;;###autoload +(defun doom//reload-project () + "Reload the project root cache." + (interactive) + (projectile-invalidate-cache nil) + (projectile-reset-cached-project-root) + (dolist (fn projectile-project-root-files-functions) + (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) + + +;; +;; Library +;; + +;;;###autoload +(defun doom-project-p (&optional nocache) + "Return t if this buffer is currently in a project. +If NOCACHE, don't fetch a cached answer." + (if nocache + (without-project-cache! (doom-project-p nil)) + (let ((projectile-require-project-root t)) + (and (projectile-project-p) t)))) + +;;;###autoload +(defun doom-project-name (&optional nocache) + "Return the name of the current project. +If NOCACHE, don't fetch a cached answer." + (if nocache + (without-project-cache! (doom-project-name nil)) + (projectile-project-name))) + +;;;###autoload +(defun doom-project-root (&optional nocache) + "Returns the root of your project, or `default-directory' if none was found. +If NOCACHE, don't fetch a cached answer." + (if nocache + (without-project-cache! (doom-project-root nil)) + (let (projectile-require-project-root) + (projectile-project-root)))) + +;;;###autoload +(defalias 'doom-project-expand #'projectile-expand-root) + +;;;###autoload +(defun doom-project-find-file (dir) + "Fuzzy-find a file under DIR." + (let ((default-directory dir)) + (without-project-cache! + (call-interactively + ;; completion modules may remap this command + (or (command-remapping #'projectile-find-file) + #'projectile-find-file))))) + +;;;###autoload +(defun doom-project-browse (dir) + "Traverse a file structure starting linearly from DIR." + (let ((default-directory dir)) + (call-interactively + ;; completion modules may remap this command + (or (command-remapping #'find-file) + #'find-file)))) diff --git a/core/core-projects.el b/core/core-projects.el index b34634783..38d3f69e3 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,6 +1,8 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile + :after-call (pre-command-hook after-find-file dired-before-readin-hook) + :commands (projectile-project-root projectile-project-name projectile-project-p) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) @@ -48,77 +50,6 @@ (advice-add #'projectile-cache-current-file :around #'doom*projectile-cache-current-file)) -;; -;; Library -;; - -(defmacro without-project-cache! (&rest body) - "Run BODY with projectile's project-root cache disabled. This is necessary if -you want to interactive with a project other than the one you're in." - `(let (projectile-project-name - projectile-require-project-root - projectile-cached-buffer-file-name - projectile-cached-project-root) - ,@body)) - -(defun doom//reload-project () - "Reload the project root cache." - (interactive) - (projectile-invalidate-cache nil) - (projectile-reset-cached-project-root) - (dolist (fn projectile-project-root-files-functions) - (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) - -(defun doom-project-p (&optional nocache) - "Return t if this buffer is currently in a project. -If NOCACHE, don't fetch a cached answer." - (if nocache - (without-project-cache! (doom-project-p nil)) - (let ((projectile-require-project-root t)) - (and (projectile-project-p) t)))) - -(defun doom-project-name (&optional nocache) - "Return the name of the current project. -If NOCACHE, don't fetch a cached answer." - (if nocache - (without-project-cache! (doom-project-name nil)) - (projectile-project-name))) - -(defun doom-project-root (&optional nocache) - "Returns the root of your project, or `default-directory' if none was found. -If NOCACHE, don't fetch a cached answer." - (if nocache - (without-project-cache! (doom-project-root nil)) - (let (projectile-require-project-root) - (projectile-project-root)))) - -(defalias 'doom-project-expand #'projectile-expand-root) - -(defmacro project-file-exists-p! (files) - "Checks if the project has the specified FILES. -Paths are relative to the project root, unless they start with ./ or ../ (in -which case they're relative to `default-directory'). If they start with a slash, -they are absolute." - `(file-exists-p! ,files (doom-project-root))) - -(defun doom-project-find-file (dir) - "Fuzzy-find a file under DIR." - (let ((default-directory dir)) - (without-project-cache! - (call-interactively - ;; completion modules may remap this command - (or (command-remapping #'projectile-find-file) - #'projectile-find-file))))) - -(defun doom-project-browse (dir) - "Traverse a file structure starting linearly from DIR." - (let ((default-directory dir)) - (call-interactively - ;; completion modules may remap this command - (or (command-remapping #'find-file) - #'find-file)))) - - ;; ;; Projects ;; From 74d364776e3aa8678df1549b217f0f8bd0d230c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:45:09 +0200 Subject: [PATCH 1930/4235] Move no-other-window to +popup-default-parameters Should be customizable. --- modules/ui/popup/autoload/popup.el | 1 - modules/ui/popup/config.el | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 428dd3633..4426f0438 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -47,7 +47,6 @@ and enables `+popup-buffer-mode'." (dolist (param (cdr (assq 'window-parameters alist))) (set-window-parameter window (car param) (cdr param)))) (set-window-parameter window 'popup t) - (set-window-parameter window 'no-other-window t) (set-window-parameter window 'delete-window #'+popup--delete-window) (set-window-parameter window 'delete-other-windows #'+popup/close-all) (set-window-dedicated-p window 'popup) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 2d7dbdcfc..e27f455fb 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -90,7 +90,8 @@ a brief description of some native window parameters that Emacs uses: (defvar +popup-default-parameters '((transient . t) (quit . t) - (select . ignore)) + (select . ignore) + (no-other-window . t)) "The default window parameters.") (defvar +popup-ttl 5 From 3f2318bc69732c3803df91ff8d4a2d63e6d22f8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 11:50:55 +0200 Subject: [PATCH 1931/4235] Fix wrong-type-argument errors on backspace Caused when pressed at the beginning or end of a buffer. --- core/autoload/editor.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index f577f78d0..2457981e0 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -127,10 +127,11 @@ possible, or just one char if that's not possible." open-len close-len) (cond ;; When in strings (sp acts weird with quotes; this is the fix) ;; Also, skip closing delimiters - ((and (string= op cl) - (and (string= (char-to-string (char-before)) op) + ((and op cl + (string= op cl) + (and (string= (char-to-string (or (char-before) 0)) op) (setq open-len (length op))) - (and (string= (char-to-string (char-after)) cl) + (and (string= (char-to-string (or (char-after) 0)) cl) (setq close-len (length cl)))) (delete-char (- open-len)) (delete-char close-len)) From b5baeb81a73d4ed31f532e4aa5a1cad18ad6db8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 12:22:50 +0200 Subject: [PATCH 1932/4235] Improve error handling in snippet commands Fixes wrong-type-argument errors when fields or overlays are not actually fields or overlays. Such heresy! --- modules/feature/snippets/autoload/snippets.el | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index c232ec0d7..5ec7a9fd2 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -9,7 +9,8 @@ "Go to the beginning of the current field." (interactive) (let* ((snippet (car (yas-active-snippets))) - (position (yas--field-start (yas--snippet-active-field snippet)))) + (active-field (yas--snippet-active-field snippet)) + (position (if (yas--field-p active-field) (yas--field-start active-field) -1))) (if (= (point) position) (move-beginning-of-line 1) (goto-char position)))) @@ -19,7 +20,8 @@ "Go to the end of the current field." (interactive) (let* ((snippet (car (yas-active-snippets))) - (position (yas--field-end (yas--snippet-active-field snippet)))) + (active-field (yas--snippet-active-field snippet)) + (position (if (yas--field-p active-field) (yas--field-end active-field) -1))) (if (= (point) position) (move-end-of-line 1) (goto-char position)))) @@ -28,11 +30,12 @@ (defun +snippets/delete-backward-char (&optional field) "Prevents Yas from interfering with backspace deletion." (interactive) - (let ((field (or field (and yas--active-field-overlay + (let ((field (or field (and (overlayp yas--active-field-overlay) (overlay-buffer yas--active-field-overlay) (overlay-get yas--active-field-overlay 'yas--field))))) - (cond ((eq (point) (marker-position (yas--field-start field))) nil) - (t (call-interactively #'delete-backward-char))))) + (unless (and (yas--field-p field) + (eq (point) (marker-position (yas--field-start field)))) + (call-interactively #'delete-backward-char)))) ;;;###autoload (defun +snippets/delete-forward-char-or-field (&optional field) @@ -42,21 +45,24 @@ buggy behavior when is pressed in an empty field." (let ((field (or field (and yas--active-field-overlay (overlay-buffer yas--active-field-overlay) (overlay-get yas--active-field-overlay 'yas--field))))) - (cond ((and field - (not (yas--field-modified-p field)) + (cond ((not (yas--field-p field)) + (delete-char 1)) + ((and (not (yas--field-modified-p field)) (eq (point) (marker-position (yas--field-start field)))) (yas--skip-and-clear field) (yas-next-field 1)) ((eq (point) (marker-position (yas--field-end field))) nil) - (t (delete-char 1))))) + ((delete-char 1))))) ;;;###autoload (defun +snippets/delete-to-start-of-field (&optional field) "Delete to start-of-field." (interactive) - (let* ((field (or field (and yas--active-field-overlay - (overlay-buffer yas--active-field-overlay) - (overlay-get yas--active-field-overlay 'yas--field)))) - (sof (marker-position (yas--field-start field)))) - (when (and field (> (point) sof)) - (delete-region sof (point))))) + (unless field + (setq field (and (overlayp yas--active-field-overlay) + (overlay-buffer yas--active-field-overlay) + (overlay-get yas--active-field-overlay 'yas--field)))) + (when (yas--field-p field) + (let ((sof (marker-position (yas--field-start field)))) + (when (and field (> (point) sof)) + (delete-region sof (point)))))) From 02caf4eeaca2cbc33ad8077b3ee6f5cb5083e9f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 12:23:47 +0200 Subject: [PATCH 1933/4235] Fix file templates expanding non-interactively #553 File templates should not expand unless the current file was opened interactively. We use a simple heuristic to detect this: if the opened buffer's is visible or not. --- modules/feature/file-templates/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index d54679be4..7edda6d9c 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -112,6 +112,7 @@ must be non-read-only, empty, and there must be a rule in `+file-templates-alist' that applies to it." (when (and (not buffer-read-only) (bobp) (eobp) + (get-buffer-window) (not (string-match-p "^ *\\*" (buffer-name)))) (when-let* ((rule (cl-find-if #'+file-template-p +file-templates-alist))) (apply #'+file-templates--expand rule)))) From 44363cae40290b4667c34abaa5e4056dc513a51f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 12:26:58 +0200 Subject: [PATCH 1934/4235] General, minor refactor & revision Across the board. All the boards. --- core/autoload/help.el | 2 +- core/core-editor.el | 2 +- modules/app/email/autoload/email.el | 2 +- modules/completion/helm/config.el | 4 +--- modules/config/default/+bindings.el | 5 ++--- modules/feature/workspaces/config.el | 4 ++-- modules/lang/org/+attach.el | 4 +++- modules/ui/popup/+hacks.el | 3 +-- 8 files changed, 12 insertions(+), 14 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index be4361f00..8b825635d 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -80,7 +80,7 @@ (sym (symbol-at-point)) (setting (completing-read - "Describe setting: " + "Describe setter: " ;; TODO Could be cleaner (refactor me!) (cl-loop with maxwidth = (apply #'max (mapcar #'length (mapcar #'symbol-name settings))) for def in (sort settings #'string-lessp) diff --git a/core/core-editor.el b/core/core-editor.el index 29a3475d7..1eed0509d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -51,7 +51,7 @@ for confirmation to open it literally (read-only, disabled undo and in fundamental-mode) for performance sake." (when (and (not (memq major-mode doom-large-file-modes-list)) auto-mode-alist - (get-buffer-window (current-buffer))) + (get-buffer-window)) (when-let* ((size (nth 7 (file-attributes buffer-file-name)))) (when (and (> size (* 1024 1024 doom-large-file-size)) (y-or-n-p diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index f7a3a3272..232adfdad 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -28,7 +28,7 @@ default/fallback account." (let ((context (make-mu4e-context :name label :enter-func (lambda () (mu4e-message "Switched to %s" label)) - :leave-func (lambda () (mu4e-clear-caches)) + :leave-func #'mu4e-clear-caches :match-func (lambda (msg) (when msg diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 6ce2696b5..d3a7f96c1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -1,7 +1,5 @@ ;;; completion/helm/config.el -*- lexical-binding: t; -*- -;; Warning: since I don't use helm, this may be out of date. - (defvar +helm-global-prompt "››› " "The helm text prompt prefix string is globally replaced with this string.") @@ -180,7 +178,7 @@ :ni "M-k" #'helm-previous-line :ni "C-f" #'helm-next-page :ni "C-b" #'helm-previous-page - :n "" #'helm-select-action ; TODO: Ivy has "ga". + :n [tab] #'helm-select-action ; TODO: Ivy has "ga". :n "[" #'helm-previous-source :n "]" #'helm-next-source :n "gk" #'helm-previous-source diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 63a25d379..9559d4760 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -614,7 +614,7 @@ :desc "Find documentation" :n "K" #'+lookup/documentation :desc "Find library" :n "l" #'find-library :desc "Command log" :n "L" #'global-command-log-mode - :desc "Toggle Emacs log" :n "m" #'view-echo-area-messages + :desc "View *Messages*" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode :desc "Toggle profiler" :n "p" #'doom/toggle-profiler :desc "Reload theme" :n "r" #'doom//reload-theme @@ -665,8 +665,7 @@ :n "t" #'floobits-follow-mode-toggle :n "U" #'floobits-share-dir-public) - ;; macos - (:when IS-MAC + (:when (featurep! :tools macos) :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 diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 2d1f359fe..04b0d0835 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -58,8 +58,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." (with-selected-frame frame ;; The default perspective persp-mode makes (defined by ;; `persp-nil-name') is special and doesn't actually represent a real - ;; persp object, so buffers can't really be assigned to it, among other - ;; quirks. We create a *real* main workspace to fill this role. + ;; persp object, so buffers can't really be assigned to it, among + ;; other quirks. We create a *real* main workspace to fill this role. (unless (persp-get-by-name +workspaces-main) (persp-add-new +workspaces-main)) ;; Switch to it if we aren't auto-loading the last session diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 4f7982909..5210d2d0c 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -78,7 +78,9 @@ (setq org-attach-directory (expand-file-name +org-attach-dir org-directory)) ;; A shorter link to attachments - (push (cons "attach" (abbreviate-file-name org-attach-directory)) org-link-abbrev-alist) + (push (cons "attach" (abbreviate-file-name org-attach-directory)) + org-link-abbrev-alist) + (org-link-set-parameters "attach" :follow (lambda (link) (find-file (expand-file-name link org-attach-directory))) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index ead941ec4..a67f6a117 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -151,13 +151,12 @@ the command buffer." ;; `helpful' (after! helpful + ;; Open link in origin window (non-popup) instead of inside the popup window. (defun +popup*helpful--navigate (button) (let ((path (substring-no-properties (button-get button 'path))) origin) (save-popups! (find-file path) - ;; We use `get-text-property' to work around an Emacs 25 bug: - ;; http://git.savannah.gnu.org/cgit/emacs.git/commit/?id=f7c4bad17d83297ee9a1b57552b1944020f23aea (-when-let (pos (get-text-property button 'position (marker-buffer button))) (goto-char pos)) From b170119d4b48134e2db9e60b2f446901cb6592fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 12:40:57 +0200 Subject: [PATCH 1935/4235] Add smartparens to evil-ex; disable quote autopair Don't autopair ' in eval-expression or evil-ex (doesn't make sense) --- core/core-editor.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 1eed0509d..57894fd28 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -152,11 +152,13 @@ fundamental-mode) for performance sake." (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) (defun doom|init-smartparens-in-eval-expression () - "Enable `smartparens-mode' in the minibuffer, during `eval-expression'." - (when (eq this-command 'eval-expression) + "Enable `smartparens-mode' in the minibuffer, during `eval-expression' or +`evil-ex'." + (when (memq this-command '(eval-expression evil-ex)) (smartparens-mode))) (add-hook 'minibuffer-setup-hook #'doom|init-smartparens-in-eval-expression) + (sp-local-pair 'minibuffer-inactive-mode "'" nil :actions nil) (sp-local-pair '(xml-mode nxml-mode php-mode) "" :post-handlers '(("| " "SPC"))) From 3ad16f660fbbbd918ae06df2166740ef30db6d9e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 12:46:57 +0200 Subject: [PATCH 1936/4235] Refactor set-company-backend! --- modules/completion/company/autoload.el | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 17809e849..393761988 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -5,17 +5,16 @@ "Prepends BACKENDS to `company-backends' in major MODES. MODES should be one major-mode symbol or a list of them." - (cl-loop for mode in modes - for def-name = (intern (format "doom--init-company-%s" mode)) - do - (fset def-name - (lambda () (when (or (eq major-mode mode) - (and (boundp mode) (symbol-value mode))) - (require 'company) - (make-variable-buffer-local 'company-backends) - (dolist (backend backends) - (cl-pushnew backend company-backends :test #'equal))))) - and do (add-hook (intern (format "%s-hook" mode)) def-name))) + (dolist (mode (doom-enlist modes)) + (let ((def-name (intern (format "+company--init-%s" mode)))) + (fset def-name + (lambda () (when (or (eq major-mode mode) + (and (boundp mode) (symbol-value mode))) + (require 'company) + (make-variable-buffer-local 'company-backends) + (dolist (backend backends) + (cl-pushnew backend company-backends :test #'equal))))) + (add-hook (intern (format "%s-hook" mode)) def-name)))) ;; FIXME obsolete :company-backend ;;;###autoload From 709c7083760c6a76582b249e9b235d611679d31b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 14:38:06 +0200 Subject: [PATCH 1937/4235] Open magit-popup is a side window Instead of in a split below the current window. --- modules/tools/magit/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index d309068d7..438e59219 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -22,8 +22,9 @@ load everything.") #'ivy-completing-read #'magit-builtin-completing-read) magit-revision-show-gravatars '("^Author: " . "^Commit: ") - magit-diff-refine-hunk t ;; Show word-granularity on the currently selected hunk - magit-display-buffer-function #'+magit-display-buffer-fullscreen) + magit-diff-refine-hunk t ; show word-granularity on selected hunk + magit-display-buffer-function #'+magit-display-buffer-fullscreen + magit-popup-display-buffer-action '((display-buffer-in-side-window))) (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore) ;; Consider magit buffers real (so they can switched to) From c305d63dd7c976755a750787254d749d7fca7365 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 14:38:52 +0200 Subject: [PATCH 1938/4235] Improve magit display-buffer logic Now opens derivative magit buffers (from popup magit windows) in fullscreen. --- modules/tools/magit/autoload.el | 56 ++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index e87ab320c..99b80631b 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -8,27 +8,41 @@ popups. 2. The status screen isn't buried when viewing diffs or logs from the status screen." - (display-buffer - buffer (cond ((or (bound-and-true-p git-commit-mode) - (derived-mode-p 'magit-log-mode)) - '(display-buffer-below-selected)) - ((derived-mode-p 'magit-mode) - (when (eq major-mode 'magit-status-mode) - (display-buffer-in-side-window - (current-buffer) '((side . left) - (window-width . 0.35) - (window-parameters (quit))))) - '(display-buffer-same-window)) - ((buffer-local-value 'git-commit-mode buffer) - '(magit--display-buffer-fullframe)) - ((memq (buffer-local-value 'major-mode buffer) - '(magit-process-mode - magit-revision-mode - magit-log-mode - magit-diff-mode - magit-stash-mode)) - '(display-buffer-in-side-window)) - ('(magit--display-buffer-fullframe))))) + (let ((buffer-mode (buffer-local-value 'major-mode buffer))) + (display-buffer + buffer (cond + ;; If opened from a magit window from a popup, open the results + ;; full screen. We want to see it all. + ((eq (window-dedicated-p) 'side) + '(magit--display-buffer-fullframe)) + ;; From a commit or magit-log buffer, open detail buffers below + ;; this one. + ((or (bound-and-true-p git-commit-mode) + (derived-mode-p 'magit-log-mode)) + '(display-buffer-below-selected)) + ;; From a magit buffer, set aside the magit-status window if it + ;; exists (we want it always to be visible), then display the + ;; target buffer in the current window. + ((derived-mode-p 'magit-mode) + (when (eq major-mode 'magit-status-mode) + (display-buffer-in-side-window + (current-buffer) '((side . left) + (window-width . 0.35) + (window-parameters (quit))))) + '(display-buffer-same-window)) + ;; If the target buffer opening is a commit, revision or diff, we + ;; want to see the whole thing. + ((or (buffer-local-value 'git-commit-mode buffer) + (memq buffer-mode '(magit-revision-mode magit-diff-mode))) + '(magit--display-buffer-fullframe)) + ;; log/stash/process buffers, unless opened from a magit-status + ;; window, should be opened in popups. + ((memq buffer-mode '(magit-process-mode + magit-log-mode + magit-stash-mode)) + '(display-buffer-in-side-window)) + ;; Last resort: plain old fullscreen. + ('(magit--display-buffer-fullframe)))))) ;; From 635fbb4a976ad1dade0d99b92c1cd8420a50f6bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 14:42:47 +0200 Subject: [PATCH 1939/4235] Fix "selecting deleted buffer" errors in helm #665 By properly handling helm popups. --- modules/ui/popup/+hacks.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index a67f6a117..2174a3eb1 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -166,6 +166,12 @@ the command buffer." (advice-add #'helpful--navigate :override #'+popup*helpful--navigate)) +;; `helm' +(after! helm + (setq helm-default-display-buffer-functions '(+popup-display-buffer)) + (set-popup-rule! "^\\*helm" :ignore t)) + + ;; `helm-ag' (after! helm-ag (defun +helm*pop-to-buffer (orig-fn &rest args) From 4122ff431479c96aaf1577980e5715c6c8392a99 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 15:04:27 +0200 Subject: [PATCH 1940/4235] Reformat helm package configs --- modules/completion/helm/config.el | 36 ++++++++++++++++++------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index d3a7f96c1..f15f3152a 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -98,21 +98,6 @@ (helm-flx-mode +1)) -;; `helm-locate' -(defvar helm-generic-files-map (make-sparse-keymap)) -(after! helm-locate (set-keymap-parent helm-generic-files-map helm-map)) - - -;; `helm-bookmark' -(setq helm-bookmark-show-location t) - - -(after! helm-files - (setq helm-boring-file-regexp-list - (append (list "\\.projects$" "\\.DS_Store$") - helm-boring-file-regexp-list))) - - ;; `helm-ag' (after! helm-ag (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) @@ -121,6 +106,27 @@ '((transient . 0) (quit)))) +;; `helm-bookmark' +(setq helm-bookmark-show-location t) + + +;; `helm-css-scss' -- https://github.com/ShingoFukuyama/helm-css-scss +(setq helm-css-scss-split-direction #'split-window-vertically + helm-css-scss-split-with-multiple-windows t) + + +;; `helm-files' +(after! helm-files + (setq helm-boring-file-regexp-list + (append (list "\\.projects$" "\\.DS_Store$") + helm-boring-file-regexp-list))) + + +;; `helm-locate' +(defvar helm-generic-files-map (make-sparse-keymap)) +(after! helm-locate (set-keymap-parent helm-generic-files-map helm-map)) + + ;; `helm-css-scss' -- https://github.com/ShingoFukuyama/helm-css-scss (setq helm-css-scss-split-direction #'split-window-vertically helm-css-scss-split-with-multiple-windows t) From f8625a62acffac4db461073ee585dc529503fe9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 15:04:52 +0200 Subject: [PATCH 1941/4235] Lazy-load helm-projectile --- modules/completion/helm/config.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index f15f3152a..b39f09b9b 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -43,13 +43,6 @@ helm-mode-handle-completion-in-region nil) :config - (setq projectile-completion-system 'helm) - - (defvar helm-projectile-find-file-map (make-sparse-keymap)) - (require 'helm-projectile) - (set-keymap-parent helm-projectile-find-file-map helm-map) - - ;;; Helm hacks (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." (cond ((not +helm-global-prompt) plist) @@ -127,9 +120,17 @@ (after! helm-locate (set-keymap-parent helm-generic-files-map helm-map)) -;; `helm-css-scss' -- https://github.com/ShingoFukuyama/helm-css-scss -(setq helm-css-scss-split-direction #'split-window-vertically - helm-css-scss-split-with-multiple-windows t) +;; `helm-projectile' +(def-package! helm-projectile + :commands (helm-projectile-find-file + helm-projectile-recentf + helm-projectile-switch-project + helm-projectile-switch-to-buffer) + :init + (setq projectile-completion-system 'helm) + (defvar helm-projectile-find-file-map (make-sparse-keymap)) + :config + (set-keymap-parent helm-projectile-find-file-map helm-map)) (def-package! helm-swoop ; https://github.com/ShingoFukuyama/helm-swoop From 01b2856cc244ef1ec3f8db7b8349294c2c20bb4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 15:20:10 +0200 Subject: [PATCH 1942/4235] From eshell, open magit buffers in same window --- modules/tools/magit/autoload.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 99b80631b..b8df2b14a 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -11,6 +11,9 @@ (let ((buffer-mode (buffer-local-value 'major-mode buffer))) (display-buffer buffer (cond + ;; If opened from an eshell window, use the same window. + ((derived-mode-p 'eshell-mode) + '(display-buffer-same-window)) ;; If opened from a magit window from a popup, open the results ;; full screen. We want to see it all. ((eq (window-dedicated-p) 'side) From c0f601721c4b30f9d45100fcbd567feae2d5ff0b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 16:37:43 +0200 Subject: [PATCH 1943/4235] emacs/eshell: fix pcomplete+ivy/helm integration Use ivy/helm instead of the popup at the bottom. --- modules/emacs/eshell/autoload/eshell.el | 8 ++++++++ modules/emacs/eshell/config.el | 1 + 2 files changed, 9 insertions(+) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index e2ff5f261..d24488d40 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -125,6 +125,14 @@ module to be loaded." (insert command) (eshell-send-input nil t))) +;;;###autoload +(defun +eshell/pcomplete () + "Use pcomplete with completion-in-region backend instead of popup window at +bottom. This ties pcomplete into ivy or helm, if they are enabled." + (interactive) + (require 'pcomplete) + (pcomplete-std-complete)) + ;; ;; Hooks diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 8c4108b3e..3e7e1156c 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -63,6 +63,7 @@ redefines its keys every time `eshell-mode' is enabled." "d" #'+eshell/evil-delete "D" #'+eshell/evil-delete-line) (evil-define-key* 'insert eshell-mode-map + [tab] #'+eshell/pcomplete "\C-d" #'+eshell/quit-or-delete-char "\C-p" #'eshell-previous-input "\C-n" #'eshell-next-input)) From aa1b203d1f7708f4df4e5808ce4089b77f0bb47a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 16:38:39 +0200 Subject: [PATCH 1944/4235] Add z and bd commands to eshell, plus aliases --- modules/emacs/eshell/config.el | 8 ++++++++ modules/emacs/eshell/packages.el | 4 ++++ 2 files changed, 12 insertions(+) create mode 100644 modules/emacs/eshell/packages.el diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 3e7e1156c..f5c61bab0 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -37,6 +37,11 @@ (add-hook 'eshell-mode-hook #'+eshell|init) (add-hook 'eshell-exit-hook #'+eshell|cleanup) + (after! em-alias + ;; Emulates popular shell utilities + (map-put eshell-command-aliases-list "z" '("cd =$1")) + (map-put eshell-command-aliases-list "bd" '("eshell-up $1"))) + (after! em-term ;; Visual commands require a proper terminal. Eshell can't handle that, so ;; it delegates these commands to a term buffer. @@ -76,3 +81,6 @@ redefines its keys every time `eshell-mode' is enabled." [remap evil-window-vsplit] #'+eshell/split-right)) (add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap)) + +(def-package! eshell-up + :commands (eshell-up eshell-up-peek)) diff --git a/modules/emacs/eshell/packages.el b/modules/emacs/eshell/packages.el new file mode 100644 index 000000000..d2ca8a2ec --- /dev/null +++ b/modules/emacs/eshell/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; emacs/eshell/packages.el + +(package! eshell-up) From d9944bfc7fb77d65d964278d212142343e59f100 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 16:39:48 +0200 Subject: [PATCH 1945/4235] Replace fringes in eshell buffers with a margin I think it looks better this way. Especially if you use solaire-mode. --- modules/emacs/eshell/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index f5c61bab0..4d3d45dc2 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -33,6 +33,14 @@ ;; Consider eshell buffers real (add-hook 'eshell-mode-hook #'doom|mark-buffer-as-real) + ;; UI enhancements + (defun +eshell|replace-fringes-with-margins () + "Remove eshell's fringes and give it a margin of 1." + (set-window-fringes nil 0 0) + (set-window-margins nil 1 1)) + (add-hook 'eshell-mode-hook #'+eshell|replace-fringes-with-margins) + (add-hook 'eshell-mode-hook #'hide-mode-line-mode) + ;; Keep track of open eshell buffers (add-hook 'eshell-mode-hook #'+eshell|init) (add-hook 'eshell-exit-hook #'+eshell|cleanup) From 2addfebf8e82b7acf6782112a23febbb3a2fdd6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 16:42:26 +0200 Subject: [PATCH 1946/4235] Refactor eshell-visual-commands (and add ncmpcpp) --- modules/emacs/eshell/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 4d3d45dc2..86f34264c 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -53,9 +53,8 @@ (after! em-term ;; Visual commands require a proper terminal. Eshell can't handle that, so ;; it delegates these commands to a term buffer. - (setq eshell-visual-commands - (append eshell-visual-commands '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim")) - eshell-visual-subcommands '(("git" "log" "l" "diff" "show")))) + (dolist (cmd '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim" "ncmpcpp")) + (cl-pushnew cmd eshell-visual-commands))) (defun +eshell|init-evil () "Replace `evil-collection-eshell-next-prompt-on-insert' with From a4ccc2fc812e28fb5760d54a77a1c5e8548c5fc4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 16:51:43 +0200 Subject: [PATCH 1947/4235] Use shrink-path on eshell PWD in default prompt Makes longer paths easier to deal with. --- modules/emacs/eshell/autoload/eshell.el | 4 +++- modules/emacs/eshell/config.el | 4 ++++ modules/emacs/eshell/packages.el | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index d24488d40..edd2f7ad0 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -63,7 +63,9 @@ ;;;###autoload (defun +eshell-prompt () "Generate the prompt string for eshell. Use for `eshell-prompt-function'." - (concat (propertize (abbreviate-file-name (eshell/pwd)) 'face '+eshell-prompt-pwd) + (concat (if (bobp) "" "\n") + (propertize (abbreviate-file-name (shrink-path-file (eshell/pwd))) + 'face '+eshell-prompt-pwd) (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) (propertize " λ " 'face '+eshell-prompt-char))) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 86f34264c..e87bde4f0 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -91,3 +91,7 @@ redefines its keys every time `eshell-mode' is enabled." (def-package! eshell-up :commands (eshell-up eshell-up-peek)) + + +(def-package! shrink-path + :commands shrink-path-file) diff --git a/modules/emacs/eshell/packages.el b/modules/emacs/eshell/packages.el index d2ca8a2ec..fcaed73f5 100644 --- a/modules/emacs/eshell/packages.el +++ b/modules/emacs/eshell/packages.el @@ -2,3 +2,4 @@ ;;; emacs/eshell/packages.el (package! eshell-up) +(package! shrink-path) From b991af552c51c7d77410eb41353ff0464f2e9838 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 16:59:33 +0200 Subject: [PATCH 1948/4235] A slightly more informative default eshell banner --- modules/emacs/eshell/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index e87bde4f0..7200a6e37 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -18,7 +18,13 @@ ;; (after! eshell ; built-in - (setq eshell-scroll-to-bottom-on-input 'all + (setq eshell-banner-message + '(format "%s %s\n" + (propertize (format " %s " (string-trim (buffer-name))) + 'face 'mode-line-highlight) + (propertize (current-time-string) + 'face 'font-lock-keyword-face)) + eshell-scroll-to-bottom-on-input 'all eshell-scroll-to-bottom-on-output 'all eshell-buffer-shorthand t eshell-kill-processes-on-exit t From ec8ae0bedc8e5613b61727db6fdea62d189497c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 19:32:25 +0200 Subject: [PATCH 1949/4235] Add :ui pretty-code & set-pretty-symbols! autodef Along with defaults for C/C++, elm, elisp, js, typescript, web-mode, and org-mode. Thanks to @ar1a for inspiration. --- init.example.el | 1 + modules/lang/cc/config.el | 16 ++++++ modules/lang/elm/config.el | 11 +++- modules/lang/emacs-lisp/config.el | 5 +- modules/lang/javascript/config.el | 36 ++++++++++++- modules/lang/org/config.el | 10 +++- modules/lang/python/config.el | 18 +++++++ modules/ui/pretty-code/autoload.el | 86 ++++++++++++++++++++++++++++++ modules/ui/pretty-code/packages.el | 5 ++ 9 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 modules/ui/pretty-code/autoload.el create mode 100644 modules/ui/pretty-code/packages.el diff --git a/init.example.el b/init.example.el index 37c63ef5a..60ac24e02 100644 --- a/init.example.el +++ b/init.example.el @@ -39,6 +39,7 @@ (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules + ;pretty-code ; replace bits of code with pretty symbols ;tabbar ; FIXME an (incomplete) tab bar for Emacs ;unicode ; extended unicode support for various languages vi-tilde-fringe ; fringe tildes to mark beyond EOB diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index d99f9aa34..4b4ba614b 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -60,6 +60,22 @@ compilation database is present in the project.") :config (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) + (set-pretty-symbols! '(c-mode-hook c++-mode-hook) + ;; Functional + ;; :def "void " + ;; Types + :null "nullptr" + :true "true" :false "false" + :int "int" :float "float" + :str "std::string" + :bool "bool" + ;; Flow + :not "!" + :and "&&" :or "||" + :for "for" + :return "return" + :yield "#require") + ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) (add-hook! '(c-mode-hook c++-mode-hook) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 35a5f303e..500d28d61 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -6,7 +6,16 @@ (after! elm-mode (add-hook 'elm-mode-hook #'rainbow-delimiters-mode) (set-company-backend! 'elm-mode 'company-elm) - (set-repl-handler! 'elm-mode #'run-elm-interactive)) + (set-repl-handler! 'elm-mode #'run-elm-interactive) + (set-pretty-symbols! 'elm-mode + :null "null" + :true "true" :false "false" + :int "Int" :str "String" + :float "Float" + :bool "Bool" + + :not "not" + :and "&&" :or "||")) (def-package! flycheck-elm diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index fe015ff0f..7ac57c3cb 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -8,6 +8,9 @@ (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") + (set-pretty-symbols! 'emacs-lisp-mode + :lambda "lambda") + (set-rotate-patterns! 'emacs-lisp-mode :symbols '(("t" "nil") ("let" "let*") @@ -31,8 +34,6 @@ (font-lock-add-keywords nil `(;; Highlight custom Doom cookies ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; Display "lambda" as λ - ("(\\(lambda\\)" (1 (ignore (compose-region (match-beginning 1) (match-end 1) ?λ #'decompose-region)))) ;; Highlight doom/module functions ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 3a7e17245..a145a24a6 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -1,5 +1,23 @@ ;;; lang/javascript/config.el -*- lexical-binding: t; -*- +(after! (:any js2-mode web-mode) + (set-pretty-symbols! '(js2-mode web-mode) + '(;; Functional + :def "function" + :lambda "() =>" + :composition "compose" + ;; Types + :null "null" + :true "true" :false "false" + ;; Flow + :not "!" + :and "&&" :or "||" + :for "for" + :return "return" + ;; Other + :yield "import"))) + + ;; ;; Major modes ;; @@ -66,7 +84,23 @@ (after! typescript-mode (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) (set-electric! 'typescript-mode - :chars '(?\} ?\)) :words '("||" "&&"))) + :chars '(?\} ?\)) :words '("||" "&&")) + (set-pretty-symbols! 'typescript-mode + ;; Functional + :def "function" + :lambda "() =>" + :composition "compose" + ;; Types + :null "null" + :true "true" :false "false" + :int "number" + :str "string" + :bool "boolean" + ;; Flow + :not "!" + :and "&&" :or "||" + :for "for" + :return "return" :yield "import")) ;; `coffee-mode' diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 3a351a229..0c006e6fc 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -48,7 +48,8 @@ +org|setup-popups-rules +org|setup-agenda +org|setup-keybinds - +org|setup-hacks)) + +org|setup-hacks + +org|setup-pretty-code)) (add-hook! 'org-mode-hook #'(doom|disable-line-numbers ; org doesn't really need em @@ -151,6 +152,13 @@ unfold to point on startup." ((size . 0.2)) ((quit) (select . t)))))) +(defun +org|setup-pretty-code () + "Setup the default pretty symbols for" + (set-pretty-symbols! 'org-mode + :name "#+NAME:" + :src_block "#+BEGIN_SRC" + :src_block_end "#+END_SRC")) + (defun +org|setup-ui () "Configures the UI for `org-mode'." (setq-default diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index c2b7a11d0..48ba4f077 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -28,6 +28,24 @@ is loaded.") (set-electric! 'python-mode :chars '(?:)) (set-repl-handler! 'python-mode #'+python/repl) + (set-pretty-symbols! 'python-mode + ;; Functional + :def "def" + :lambda "lambda" + ;; Types + :null "None" + :true "True" :false "False" + :int "int" :str "str" + :float "float" + :bool "bool" + :tuple "tuple" + ;; Flow + :not "not" + :in "in" :not-in "not in" + :and "and" :or "or" + :for "for" + :return "return" :yield "yield") + (when (executable-find "ipython") (setq python-shell-interpreter "ipython" python-shell-interpreter-args "-i --simple-prompt --no-color-info" diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el new file mode 100644 index 000000000..7954207eb --- /dev/null +++ b/modules/ui/pretty-code/autoload.el @@ -0,0 +1,86 @@ +;;; ui/pretty-code/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defvar +pretty-code-enabled-modes + '(c++-mode-hook + c-mode-hook + elm-mode + emacs-lisp-mode + js2-mode + org-mode + python-mode + typescript-mode + web-mode) + "List of major modes in which `prettify-symbols-mode' should be enabled.") + +;;;###autoload +(defvar +pretty-code-symbols + '(;; org + :name "»" + :src_block "»" + :src_block_end " " + ;; Functional + :lambda "λ" + :def "ƒ" + :composition "∘" + ;; Types + :null "∅" + :true "𝕋" + :false "𝔽" + :int "ℤ" + :float "ℝ" + :str "𝕊" + :bool "𝔹" + ;; Flow + :not "¬" + :in "∈" + :not-in "∉" + :and "∧" + :or "∨" + :for "∀" + :some "∃" + :return "⟼" + :yield "⟻" + ;; Other + :tuple "⨂" + :pipe "") + "Options plist for `pretty-code-get-pairs'.") + +;; When you get to the right edge, it goes back to how it normally prints +;;;###autoload +(setq prettify-symbols-unprettify-at-point 'right-edge) + +;;;###autodef +(defun set-pretty-symbols! (modes &rest plist) + "Associates string patterns with icons in certain major-modes. + + MODES is a major mode symbol or a list of them. + PLIST is a property list whose keys must match keys in `+pretty-code-symbols', +and whose values are strings representing the text to be replaced with that +symbol. + +For example, the rule for emacs-lisp-mode is very simple: + + (set-pretty-symbols! 'emacs-lisp-mode + :lambda \"lambda\") + +This will replace any instances of \"lambda\" in emacs-lisp-mode with the symbol +assicated with :lambda in `+pretty-code-symbols'." + (declare (indent 1)) + (dolist (mode (doom-enlist modes)) + (let ((fn (intern (format "+pretty-code|init-%s" mode)))) + (fset fn + (lambda () + (when (and (eq major-mode mode) + (memq major-mode +pretty-code-enabled-modes)) + (let (results prop icon) + (while plist + (let ((prop (pop plist)) + (sym (pop plist))) + (when-let* ((icon (plist-get +pretty-code-symbols prop))) + (push (cons sym (prettify-utils-string icon)) + results)))) + (setq prettify-symbols-alist results)) + (prettify-symbols-mode -1) + (prettify-symbols-mode +1)))) + (add-hook (intern (format "%s-hook" mode)) fn)))) diff --git a/modules/ui/pretty-code/packages.el b/modules/ui/pretty-code/packages.el new file mode 100644 index 000000000..80e5b016d --- /dev/null +++ b/modules/ui/pretty-code/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/pretty-code/packages.el + +(package! prettify-utils + :recipe (:fetcher github :repo "Ilazki/prettify-utils.el")) From 8c64644450d2bb8064b6a6dce0ab280c1bfe5d22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 20:57:51 +0200 Subject: [PATCH 1950/4235] setq->defvar (prettify-symbols-unprettify-at-point) --- modules/ui/pretty-code/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 7954207eb..556555eb3 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -48,7 +48,7 @@ ;; When you get to the right edge, it goes back to how it normally prints ;;;###autoload -(setq prettify-symbols-unprettify-at-point 'right-edge) +(defvar prettify-symbols-unprettify-at-point 'right-edge) ;;;###autodef (defun set-pretty-symbols! (modes &rest plist) From 08986d910122b8bd5f17610c711cca30271f64f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:00:01 +0200 Subject: [PATCH 1951/4235] Simplify dashboard initial buffer check We only need to check if we're in the scratch buffer. doom-real-buffer-p is overkill for that. This also reduces file loads at startup for autoloaded functions added to the doom-real-buffer-functions and doom-unreal-buffer-functions. --- modules/ui/doom-dashboard/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a8ec6313c..51623f603 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -207,9 +207,9 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (if (doom-real-buffer-p) - (current-buffer) - (doom-fallback-buffer))) + (if (eq (current-buffer) (get-buffer "*scratch*")) + (doom-fallback-buffer) + (current-buffer))) (defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." From 486019d853eecd0509175181cb40e35481dcda45 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:01:16 +0200 Subject: [PATCH 1952/4235] Remove leading space in dashboard buffer's name The leading space indicates a temporary buffer. The dashboard is no such thing! --- 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 51623f603..f8b316958 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -1,6 +1,6 @@ ;;; ui/doom-dashboard/config.el -*- lexical-binding: t; -*- -(defvar +doom-dashboard-name " *doom*" +(defvar +doom-dashboard-name "*doom*" "The name to use for the dashboard buffer.") (defvar +doom-dashboard-functions '(doom-dashboard-widget-banner From bf44c1abcc292604b6b899a813c5b4569dd188bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:02:40 +0200 Subject: [PATCH 1953/4235] Add doom-temp-buffer-p predicate function --- core/autoload/buffers.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 7177fbb09..701e82af9 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -75,7 +75,12 @@ If no project is active, return all buffers." ;;;###autoload (defun doom-special-buffer-p (buf) "Returns non-nil if BUF's name starts and ends with an *." - (string-match-p "^\\s-*\\*" (buffer-name buf))) + (equal (substring (buffer-name buf) 0 1) "*")) + +;;;###autoload +(defun doom-temp-buffer-p (buf) + "Returns non-nil if BUF is temporary." + (equal (substring (buffer-name buf) 0 2) " *")) ;;;###autoload (defun doom-non-file-visiting-buffer-p (buf) From ec6372ef66e612c594cac0fd4594ba6f0df854d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:02:54 +0200 Subject: [PATCH 1954/4235] Mark all temp buffers as unreal Hopefully there are no plugins that use temp buffers to display things! --- core/autoload/buffers.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 701e82af9..df417f493 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -112,6 +112,7 @@ The exact criteria for a real buffer is: 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) + (not (doom-temp-buffer-p buf)) (run-hook-with-args-until-success 'doom-real-buffer-functions buf) (not (run-hook-with-args-until-success 'doom-unreal-buffer-functions buf))))) From 48c9936f8d672a7cb116fa81fa94fa17dbd09fa2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:04:20 +0200 Subject: [PATCH 1955/4235] Fix eshell buffers omitted from workspace buffers The mode was set before the window was displayed, which is where persp-mode's check is. --- modules/emacs/eshell/autoload/eshell.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index edd2f7ad0..e89508c0a 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -79,10 +79,10 @@ "Open eshell in the current buffer." (interactive) (let ((buf (+eshell--buffer (eq major-mode 'eshell-mode)))) - (switch-to-buffer buf) - (+eshell--set-window (get-buffer-window buf) t) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) + (switch-to-buffer buf) + (+eshell--set-window (get-buffer-window buf) t) (when command (+eshell-run-command command)))) From cc6809bcf86e1a514ac2966e36085548f707a214 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:08:08 +0200 Subject: [PATCH 1956/4235] Move windows with C-hjkl eshell's insert mode --- modules/emacs/eshell/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 7200a6e37..cf6457222 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -82,6 +82,10 @@ redefines its keys every time `eshell-mode' is enabled." "D" #'+eshell/evil-delete-line) (evil-define-key* 'insert eshell-mode-map [tab] #'+eshell/pcomplete + "\C-j" #'evil-window-down + "\C-k" #'evil-window-up + "\C-h" #'evil-window-left + "\C-l" #'evil-window-right "\C-d" #'+eshell/quit-or-delete-char "\C-p" #'eshell-previous-input "\C-n" #'eshell-next-input)) From 5e23429309d071dc448342680a5c075b900668a8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:16:24 +0200 Subject: [PATCH 1957/4235] Fix set-devdocs! Was not applying to all MODES and was using incorrect variable (docsets -> docset), causing a void-variable error. --- modules/feature/lookup/autoload/devdocs.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el index 9233a5750..77ece1d4d 100644 --- a/modules/feature/lookup/autoload/devdocs.el +++ b/modules/feature/lookup/autoload/devdocs.el @@ -8,7 +8,8 @@ DOCSET (a string). See `devdocs-alist' for the defaults. " (after! (:when (boundp 'devdocs-alist)) - (map-put devdocs-alist mode docsets))) + (dolist (mode (doom-enlist modes)) + (map-put devdocs-alist modes docset)))) ;;;###autoload (def-setting! :devdocs (modes docset) From e50b485948f1af2dc2d6d087a2e0c270beabd990 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:19:57 +0200 Subject: [PATCH 1958/4235] All hail, our glorious byte compiler Hush. Stop your complaining. --- modules/ui/pretty-code/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 556555eb3..c09721eda 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -73,7 +73,7 @@ assicated with :lambda in `+pretty-code-symbols'." (lambda () (when (and (eq major-mode mode) (memq major-mode +pretty-code-enabled-modes)) - (let (results prop icon) + (let (results) (while plist (let ((prop (pop plist)) (sym (pop plist))) From b880175d794924da56774a0771ad7aea156046c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:40:46 +0200 Subject: [PATCH 1959/4235] Remove switch-frame hooks They are too unreliable. Use after-focus-change-function if you must (though, that's an latest-Emacs-27-only feature atm). --- core/core-ui.el | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 09eb5e883..c9a08e1ef 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -364,13 +364,6 @@ from the default." (defvar doom-inhibit-switch-buffer-hooks nil) (defvar doom-inhibit-switch-window-hooks nil) -(defun doom*switch-frame-hooks (orig-fn frame &optional norecord) - (if (or (null frame) (eq frame (selected-frame))) - (funcall orig-fn frame norecord) - (run-hooks 'doom-before-switch-frame-hook) - (prog1 (funcall orig-fn frame norecord) - (with-selected-frame frame - (run-hooks 'doom-after-switch-frame-hook))))) (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks (null window) @@ -394,8 +387,7 @@ from the default." (run-hooks 'doom-after-switch-buffer-hook)))))) (defun doom|init-custom-hooks (&optional disable) - (dolist (spec '((select-frame . doom*switch-frame-hooks) - (select-window . doom*switch-window-hooks) + (dolist (spec '((select-window . doom*switch-window-hooks) (switch-to-buffer . doom*switch-buffer-hooks) (display-buffer . doom*switch-buffer-hooks) (pop-to-buffer . doom*switch-buffer-hooks))) From 79413be1f0f7373a573432e6bef71b5d1a5754f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:41:39 +0200 Subject: [PATCH 1960/4235] Improve doom modeline focus hooks More reliable deactivation when unfocusing or switching away from Emacs. --- modules/ui/doom-modeline/config.el | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index cd686e1bb..c7938c3e4 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -54,10 +54,18 @@ (force-mode-line-update)) (add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) -(add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) -(add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window) (add-hook 'doom-after-switch-window-hook #'+doom-modeline|set-selected-window) -(add-hook 'doom-after-switch-frame-hook #'+doom-modeline|set-selected-window) +(if (boundp 'after-focus-change-function) + (progn + (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) + (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) + (defun +doom-modeline|refresh-frame () + (setq +doom-modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq +doom-modeline-current-window (frame-selected-window frame))) + (force-mode-line-update)) + (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)) ;; From fd949e7063e351d5045f4bdc37d76bc88aa41cfa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 21:48:37 +0200 Subject: [PATCH 1961/4235] Make diff larger when committing via magit The diff window contains more important information, so we shrink the git commit window and enlargen the diff window. --- modules/tools/magit/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index b8df2b14a..ad15fa351 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -22,7 +22,7 @@ ;; this one. ((or (bound-and-true-p git-commit-mode) (derived-mode-p 'magit-log-mode)) - '(display-buffer-below-selected)) + '(display-buffer-below-selected . ((window-height . 0.7)))) ;; From a magit buffer, set aside the magit-status window if it ;; exists (we want it always to be visible), then display the ;; target buffer in the current window. From 30c5f2fa264c57472057a3b1141103c8287c9011 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Jun 2018 22:56:16 +0200 Subject: [PATCH 1962/4235] set-pretty-symbols!: add :iosevka, :merge & :alist MORE. POWER. --- modules/ui/pretty-code/autoload.el | 286 +++++++++++++++++++++++++++-- 1 file changed, 271 insertions(+), 15 deletions(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index c09721eda..db947942f 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -1,5 +1,17 @@ ;;; ui/pretty-code/autoload.el -*- lexical-binding: t; -*- +;; When you get to the right edge, it goes back to how it normally prints +(defvar prettify-symbols-unprettify-at-point 'right-edge) + +;;;###autoload +(defvar +pretty-code-iosevka-ligatures-enabled-by-default nil + "If non-nil, iosevka ligeratures are enabled by default in modes +`set-pretty-symbols!' has been used on. + +This requires the iosevka font! + +Use the :iosevka property to enable (or disable) it regardless.") + ;;;###autoload (defvar +pretty-code-enabled-modes '(c++-mode-hook @@ -46,18 +58,252 @@ :pipe "") "Options plist for `pretty-code-get-pairs'.") -;; When you get to the right edge, it goes back to how it normally prints -;;;###autoload -(defvar prettify-symbols-unprettify-at-point 'right-edge) +(defvar +pretty-code--iosevka-ligeratures-enabled nil) +(defun +pretty-code-setup-iosevka-ligatures () + (unless +pretty-code--iosevka-ligeratures-enabled + (set-fontset-font t '(#xe100 . #xe16f) "Iosevka")) + (setq prettify-symbols-alist + (append prettify-symbols-alist + '(;; Double-ended hyphen arrows + ("<->" . #Xe100) + ("<-->" . #Xe101) + ("<--->" . #Xe102) + ("<---->" . #Xe103) + ("<----->" . #Xe104) + ;; Double-ended equals arrows + ("<=>" . #Xe105) + ("<==>" . #Xe106) + ("<===>" . #Xe107) + ("<====>" . #Xe108) + ("<=====>" . #Xe109) + ;; Double-ended asterisk operators + ("<**>" . #Xe10a) + ("<***>" . #Xe10b) + ("<****>" . #Xe10c) + ("<*****>" . #Xe10d) + ;; HTML comments + ("" . #Xe152) + ("-->-" . #Xe153) + ("-->--" . #Xe154) + ("-->>" . #Xe155) + ("-->>-" . #Xe156) + ("-->>--" . #Xe157) + ("-->>>" . #Xe158) + ("-->>>-" . #Xe159) + ("-->>>--" . #Xe15a) + (">-" . #Xe15b) + (">--" . #Xe15c) + (">>-" . #Xe15d) + (">>--" . #Xe15e) + (">>>-" . #Xe15f) + (">>>--" . #Xe160) + ("=>" . #Xe161) + ("=>=" . #Xe162) + ("=>==" . #Xe163) + ("=>>" . #Xe164) + ("=>>=" . #Xe165) + ("=>>==" . #Xe166) + ("=>>>" . #Xe167) + ("=>>>=" . #Xe168) + ("=>>>==" . #Xe169) + ("==>" . #Xe16a) + ("==>=" . #Xe16b) + ("==>==" . #Xe16c) + ("==>>" . #Xe16d) + ("==>>=" . #Xe16e) + ("==>>==" . #Xe16f) + ("==>>>" . #Xe170) + ("==>>>=" . #Xe171) + ("==>>>==" . #Xe172) + (">=" . #Xe173) + (">==" . #Xe174) + (">>=" . #Xe175) + (">>==" . #Xe176) + (">>>=" . #Xe177) + (">>>==" . #Xe178) + ("<-" . #Xe179) + ("-<-" . #Xe17a) + ("--<-" . #Xe17b) + ("<<-" . #Xe17c) + ("-<<-" . #Xe17d) + ("--<<-" . #Xe17e) + ("<<<-" . #Xe17f) + ("-<<<-" . #Xe180) + ("--<<<-" . #Xe181) + ("<--" . #Xe182) + ("-<--" . #Xe183) + ("--<--" . #Xe184) + ("<<--" . #Xe185) + ("-<<--" . #Xe186) + ("--<<--" . #Xe187) + ("<<<--" . #Xe188) + ("-<<<--" . #Xe189) + ("--<<<--" . #Xe18a) + ("-<" . #Xe18b) + ("--<" . #Xe18c) + ("-<<" . #Xe18d) + ("--<<" . #Xe18e) + ("-<<<" . #Xe18f) + ("--<<<" . #Xe190) + ("<=" . #Xe191) + ("=<=" . #Xe192) + ("==<=" . #Xe193) + ("<<=" . #Xe194) + ("=<<=" . #Xe195) + ("==<<=" . #Xe196) + ("<<<=" . #Xe197) + ("=<<<=" . #Xe198) + ("==<<<=" . #Xe199) + ("<==" . #Xe19a) + ("=<==" . #Xe19b) + ("==<==" . #Xe19c) + ("<<==" . #Xe19d) + ("=<<==" . #Xe19e) + ("==<<==" . #Xe19f) + ("<<<==" . #Xe1a0) + ("=<<<==" . #Xe1a1) + ("==<<<==" . #Xe1a2) + ("=<" . #Xe1a3) + ("==<" . #Xe1a4) + ("=<<" . #Xe1a5) + ("==<<" . #Xe1a6) + ("=<<<" . #Xe1a7) + ("==<<<" . #Xe1a8) + ;; Monadic operators + (">=>" . #Xe1a9) + (">->" . #Xe1aa) + (">-->" . #Xe1ab) + (">==>" . #Xe1ac) + ("<=<" . #Xe1ad) + ("<-<" . #Xe1ae) + ("<--<" . #Xe1af) + ("<==<" . #Xe1b0) + ;; Composition operators + (">>" . #Xe1b1) + (">>>" . #Xe1b2) + ("<<" . #Xe1b3) + ("<<<" . #Xe1b4) + ;; Lens operators + (":+" . #Xe1b5) + (":-" . #Xe1b6) + (":=" . #Xe1b7) + ("+:" . #Xe1b8) + ("-:" . #Xe1b9) + ("=:" . #Xe1ba) + ("=^" . #Xe1bb) + ("=+" . #Xe1bc) + ("=-" . #Xe1bd) + ("=*" . #Xe1be) + ("=/" . #Xe1bf) + ("=%" . #Xe1c0) + ("^=" . #Xe1c1) + ("+=" . #Xe1c2) + ("-=" . #Xe1c3) + ("*=" . #Xe1c4) + ("/=" . #Xe1c5) + ("%=" . #Xe1c6) + ;; Logical + ("/\\" . #Xe1c7) + ("\\/" . #Xe1c8) + ;; Semigroup/monoid operators + ("<>" . #Xe1c9) + ("<+" . #Xe1ca) + ("<+>" . #Xe1cb) + ("+>" . #Xe1cc))))) ;;;###autodef (defun set-pretty-symbols! (modes &rest plist) "Associates string patterns with icons in certain major-modes. MODES is a major mode symbol or a list of them. - PLIST is a property list whose keys must match keys in `+pretty-code-symbols', -and whose values are strings representing the text to be replaced with that -symbol. + PLIST is a property list whose keys must match keys in +`+pretty-code-symbols', and whose values are strings representing the +text to be replaced with that symbol. + +The following properties are special: + + :iosevka BOOL + Enables (or disables) iosevka ligeratures for MODES. See the definition of + `+pretty-code-setup-iosevka-ligatures' for more info. + `+pretty-code-iosevka-ligatures-enabled-by-default' determines the default + setting. + :alist ALIST + Appends ALIST to `prettify-symbols-alist' literally, without mapping text to + `+pretty-code-symbols'. + :merge BOOL + If non-nil, merge with previously defined `prettify-symbols-alist', + otherwise overwrite it. For example, the rule for emacs-lisp-mode is very simple: @@ -73,14 +319,24 @@ assicated with :lambda in `+pretty-code-symbols'." (lambda () (when (and (eq major-mode mode) (memq major-mode +pretty-code-enabled-modes)) - (let (results) - (while plist - (let ((prop (pop plist)) - (sym (pop plist))) - (when-let* ((icon (plist-get +pretty-code-symbols prop))) - (push (cons sym (prettify-utils-string icon)) - results)))) - (setq prettify-symbols-alist results)) - (prettify-symbols-mode -1) + (unless (cadr (plist-member plist :merge)) + (setq prettify-symbols-alist nil)) + (if-let ((alist (plist-get plist :alist))) + (setq prettify-symbols-alist (append alist prettify-symbols-alist)) + (let ((plist plist) + results) + (while plist + (let ((prop (car plist)) + (sym (cadr plist))) + (when-let* ((icon (plist-get +pretty-code-symbols prop))) + (push (cons sym (prettify-utils-string icon)) + results)) + (setq plist (cddr plist)))) + (setq prettify-symbols-alist (append results prettify-symbols-alist)))) + (when (or (cadr (plist-member plist :iosevka)) + +pretty-code-iosevka-ligatures-enabled-by-default) + (+pretty-code-setup-iosevka-ligatures)) + (when prettify-symbols-mode + (prettify-symbols-mode -1)) (prettify-symbols-mode +1)))) (add-hook (intern (format "%s-hook" mode)) fn)))) From 9b5a219373f9796c1f9e064f1991df4821425645 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 01:59:51 +0200 Subject: [PATCH 1963/4235] Improve robustness of popup predicates & checks --- modules/ui/popup/autoload/popup.el | 32 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 4426f0438..b72c3b9f1 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -123,22 +123,24 @@ and enables `+popup-buffer-mode'." ;;;###autoload (defun +popup-buffer-p (&optional buffer) "Return non-nil if BUFFER is a popup buffer. Defaults to the current buffer." - (unless buffer - (setq buffer (current-buffer))) - (cl-assert (bufferp buffer) t) - (and (buffer-live-p buffer) - (buffer-local-value '+popup-buffer-mode buffer) - buffer)) + (when +popup-mode + (unless buffer + (setq buffer (current-buffer))) + (cl-assert (bufferp buffer) t) + (and (buffer-live-p buffer) + (buffer-local-value '+popup-buffer-mode buffer) + buffer))) ;;;###autoload (defun +popup-window-p (&optional window) "Return non-nil if WINDOW is a popup window. Defaults to the current window." - (unless window - (setq window (selected-window))) - (cl-assert (windowp window) t) - (and (window-live-p window) - (window-parameter window 'popup) - window)) + (when +popup-mode + (unless window + (setq window (selected-window))) + (cl-assert (windowp window) t) + (and (window-live-p window) + (window-parameter window 'popup) + window))) ;;;###autoload (defun +popup-buffer (buffer &optional alist) @@ -258,7 +260,7 @@ that window has been changed or closed." (defun +popup|adjust-fringes () "Hides the fringe in popup windows, restoring them if `+popup-buffer-mode' is disabled." - (let ((f (if +popup-buffer-mode 0))) + (let ((f (if (bound-and-true-p +popup-buffer-mode) 0))) (set-window-fringes nil f f fringes-outside-margins))) ;;;###autoload @@ -270,7 +272,7 @@ disabled." + If nil (or omitted), then hide the modeline entirely (the default). + If a function, it takes the current buffer as its argument and must return one of the above values." - (when +popup-buffer-mode + (when (bound-and-true-p +popup-buffer-mode) (let ((modeline (+popup-parameter-fn 'modeline nil (current-buffer)))) (cond ((eq modeline 't)) ((or (eq modeline 'nil) @@ -283,7 +285,7 @@ disabled." ;;;###autoload (defun +popup|unset-modeline-on-disable () "Restore the modeline when `+popup-buffer-mode' is deactivated." - (when (and (not +popup-buffer-mode) + (when (and (not (bound-and-true-p +popup-buffer-mode)) (bound-and-true-p hide-mode-line-mode)) (hide-mode-line-mode -1))) From c3988a8298831944c43a3ae3e2f3a56edd332668 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:01:11 +0200 Subject: [PATCH 1964/4235] Give popups a small margin To make up for lack of fringe. --- modules/ui/popup/autoload/popup.el | 8 ++++++++ modules/ui/popup/config.el | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index b72c3b9f1..7fd12b176 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -263,6 +263,14 @@ disabled." (let ((f (if (bound-and-true-p +popup-buffer-mode) 0))) (set-window-fringes nil f f fringes-outside-margins))) +;;;###autoload +(defun +popup|adjust-margins () + "Creates padding for the popup window determined by `+popup-margin-width', +restoring it if `+popup-buffer-mode' is disabled." + (when +popup-margin-width + (let ((m (if (bound-and-true-p +popup-buffer-mode) +popup-margin-width))) + (set-window-margins nil m m)))) + ;;;###autoload (defun +popup|set-modeline-on-enable () "Don't show modeline in popup windows without a `modeline' window-parameter. diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index e27f455fb..56b7ea365 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -94,9 +94,9 @@ a brief description of some native window parameters that Emacs uses: (no-other-window . t)) "The default window parameters.") -(defvar +popup-ttl 5 - "The default time-to-live for transient buffers whose popup buffers have been -deleted.") +(defvar +popup-margin-width 1 + "Size of the margins to give popup windows. Set this to nil to disable margin +adjustment.") ;; @@ -144,6 +144,7 @@ deleted.") (add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes + +popup|adjust-margins +popup|set-modeline-on-enable +popup|unset-modeline-on-disable)) From 1eae57a0b42ac13dc821d9d62e4acaf466bcf48d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:03:05 +0200 Subject: [PATCH 1965/4235] Rename +popup-display-buffer To +popup-display-buffer-stacked-side-window, to make it more obvious what it actually does. --- modules/ui/popup/+hacks.el | 8 ++++---- modules/ui/popup/autoload/popup.el | 6 +++--- modules/ui/popup/config.el | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 2174a3eb1..444777c93 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -168,7 +168,7 @@ the command buffer." ;; `helm' (after! helm - (setq helm-default-display-buffer-functions '(+popup-display-buffer)) + (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window)) (set-popup-rule! "^\\*helm" :ignore t)) @@ -260,13 +260,13 @@ instead of switch-to-buffer-*." ;; `pdf-tools' (after! pdf-tools (setq tablist-context-window-display-action - '((+popup-display-buffer) + '((+popup-display-buffer-stacked-side-window) (side . left) (slot . 2) (window-height . 0.3) (inhibit-same-window . t)) pdf-annot-list-display-buffer-action - '((+popup-display-buffer) + '((+popup-display-buffer-stacked-side-window) (side . left) (slot . 3) (inhibit-same-window . t))) @@ -290,7 +290,7 @@ instead of switch-to-buffer-*." (lambda (act-popup-dim) (cl-letf (((symbol-function 'display-buffer-in-side-window) (lambda (buffer alist) - (+popup-display-buffer + (+popup-display-buffer-stacked-side-window buffer (append '((vslot . -9999)) alist))))) (which-key--show-buffer-side-window act-popup-dim)))) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 7fd12b176..1da49a664 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -574,10 +574,10 @@ and may be called only if no window on SIDE exists yet." (advice-add #'window--sides-check :override #'ignore)) ;;;###autoload -(defun +popup-display-buffer (buffer alist) +(defun +popup-display-buffer-stacked-side-window (buffer alist) "A `display-buffer' action that serves as an alternative to -`display-buffer-in-side-window', but allows for stacking popups not only -laterally with the `vslot' alist entry. +`display-buffer-in-side-window', but allows for stacking popups with the `vslot' +alist entry. Accepts the same arguments as `display-buffer-in-side-window'. You must set `window--sides-inhibit-check' to non-nil for this work properly." diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 56b7ea365..579cfd51c 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -79,7 +79,7 @@ a brief description of some native window parameters that Emacs uses: `pop-to-buffer'. Doom popups sets this. The default is nil.") (defvar +popup-display-buffer-actions - '(display-buffer-reuse-window +popup-display-buffer) + '(display-buffer-reuse-window +popup-display-buffer-stacked-side-window) "The functions to use to display the popup buffer.") (defvar +popup-default-alist From 194bcf4c607cb088803d097cd8aa7e571907a024 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:04:41 +0200 Subject: [PATCH 1966/4235] Silence byte-compiler warning: unused lexical arg --- core/core-modules.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-modules.el b/core/core-modules.el index c6ea3b5ef..b7c4b29c9 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -177,7 +177,7 @@ non-nil, return paths of possible modules, activated or otherwise." ;; Prevent packages from being loaded at compile time if they don't meet their ;; own predicates. (push (list :no-require t - (lambda (name args) + (lambda (_name args) (and (bound-and-true-p byte-compile-current-file) (or (when-let* ((pred (or (plist-get args :if) (plist-get args :when)))) From a6116c6547e65521d3b2c855ce9838bd74af2146 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:05:33 +0200 Subject: [PATCH 1967/4235] eshell: fix prompt face bleeding into command --- modules/emacs/eshell/autoload/eshell.el | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index e89508c0a..13737f1ff 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -1,17 +1,12 @@ ;;; emacs/eshell/autoload/eshell.el -*- lexical-binding: t; -*- ;;;###autoload -(defface +eshell-prompt-pwd '((t :inherit eshell-prompt)) +(defface +eshell-prompt-pwd '((t :inherit font-lock-constant-face)) "TODO" :group 'eshell) ;;;###autoload -(defface +eshell-prompt-git-branch '((t :inherit font-lock-function-name-face)) - "TODO" - :group 'eshell) - -;;;###autoload -(defface +eshell-prompt-char '((t :inherit font-lock-constant-face)) +(defface +eshell-prompt-git-branch '((t :inherit font-lock-builtin-face)) "TODO" :group 'eshell) @@ -66,8 +61,9 @@ (concat (if (bobp) "" "\n") (propertize (abbreviate-file-name (shrink-path-file (eshell/pwd))) 'face '+eshell-prompt-pwd) - (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) - (propertize " λ " 'face '+eshell-prompt-char))) + (propertize (+eshell--current-git-branch) + 'face '+eshell-prompt-git-branch) + " λ ")) ;; @@ -231,8 +227,8 @@ delete." (defun +eshell/switch (buffer) "Interactively switch to another eshell buffer." (interactive - (let ((buffers (cl-remove-if-not (lambda (buf) (eq (buffer-local-value 'major-mode buf) 'eshell-mode)) - (delete (current-buffer) (ring-elements +eshell-buffers))))) + (let ((buffers (doom-buffers-in-mode + 'eshell-mode (delq (current-buffer) (ring-elements +eshell-buffers))))) (if (not buffers) (user-error "No eshell buffers are available") (list (completing-read From d31052d9db911302cd84d234e80a95d8bbf6f057 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:07:14 +0200 Subject: [PATCH 1968/4235] Reformat popup library: move polyfills down --- modules/ui/popup/autoload/popup.el | 190 ++++++++++++++--------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 1da49a664..ab988a67a 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -478,101 +478,6 @@ prevent the popup(s) from messing up the UI (or vice versa)." prevent the popup(s) from messing up the UI (or vice versa)." (save-popups! (apply orig-fn args))) - -;; -;; Popup actions -;; - -(unless EMACS26+ - (defvar window-sides-reversed nil) - - (defun window--sides-reverse-on-frame-p (frame) - "Return non-nil when side windows should appear reversed on FRAME. -This uses some heuristics to guess the user's intentions when the -selected window of FRAME is a side window ." - (cond - ;; Reverse when `window-sides-reversed' is t. Do not reverse when - ;; `window-sides-reversed' is nil. - ((memq window-sides-reversed '(nil t)) - window-sides-reversed) - ;; Reverse when FRAME's selected window shows a right-to-left buffer. - ((let ((window (frame-selected-window frame))) - (when (and (not (window-parameter window 'window-side)) - (or (not (window-minibuffer-p window)) - (setq window (minibuffer-selected-window)))) - (with-current-buffer (window-buffer window) - (eq bidi-paragraph-direction 'right-to-left))))) - ;; Reverse when FRAME's `window-sides-main-selected-window' parameter - ;; specifies a live window showing a right-to-left buffer. - ((let ((window (frame-parameter - frame 'window-sides-main-selected-window))) - (when (window-live-p window) - (with-current-buffer (window-buffer window) - (eq bidi-paragraph-direction 'right-to-left))))) - ;; Reverse when all windows in FRAME's main window show right-to-left - ;; buffers. - (t - (catch 'found - (walk-window-subtree - (lambda (window) - (with-current-buffer (window-buffer window) - (when (eq bidi-paragraph-direction 'left-to-right) - (throw 'found nil)))) - (window-main-window frame)) - t)))) - - (defun window--make-major-side-window (buffer side slot &optional alist) - "Display BUFFER in a new major side window on the selected frame. -SIDE must be one of `left', `top', `right' or `bottom'. SLOT -specifies the slot to use. ALIST is an association list of -symbols and values as passed to `display-buffer-in-side-window'. -Return the new window, nil if its creation failed. - -This is an auxiliary function of `display-buffer-in-side-window' -and may be called only if no window on SIDE exists yet." - (let* ((left-or-right (memq side '(left right))) - (next-to (window--make-major-side-window-next-to side)) - (on-side (cond - ((eq side 'top) 'above) - ((eq side 'bottom) 'below) - (t side))) - (window--sides-inhibit-check t) - ;; The following two bindings will tell `split-window' to take - ;; the space for the new window from the selected frame's main - ;; window and not make a new parent window unless needed. - (window-combination-resize 'side) - (window-combination-limit nil) - (window (ignore-errors (split-window next-to nil on-side)))) - (when window - ;; Initialize `window-side' parameter of new window to SIDE and - ;; make that parameter persistent. - (set-window-parameter window 'window-side side) - (map-put window-persistent-parameters 'window-side 'writable) - ;; Install `window-slot' parameter of new window and make that - ;; parameter persistent. - (set-window-parameter window 'window-slot slot) - (map-put window-persistent-parameters 'window-slot 'writable) - ;; Auto-adjust height/width of new window unless a size has been - ;; explicitly requested. - (unless (if left-or-right - (cdr (assq 'window-width alist)) - (cdr (assq 'window-height alist))) - (setq alist - (cons - (cons - (if left-or-right 'window-width 'window-height) - (/ (window-total-size (frame-root-window) left-or-right) - ;; By default use a fourth of the size of the frame's - ;; root window. - 4)) - alist))) - (with-current-buffer buffer - (setq window--sides-shown t)) - ;; Install BUFFER in new window and return WINDOW. - (window--display-buffer buffer window 'window alist 'side)))) - - (advice-add #'window--sides-check :override #'ignore)) - ;;;###autoload (defun +popup-display-buffer-stacked-side-window (buffer alist) "A `display-buffer' action that serves as an alternative to @@ -701,3 +606,98 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (setq window--sides-shown t)) (window--display-buffer buffer best-window 'reuse alist dedicated))))))))) + + +;; +;; Emacs backwards compatibility +;; + +(unless EMACS26+ + (defvar window-sides-reversed nil) + + (defun window--sides-reverse-on-frame-p (frame) + "Return non-nil when side windows should appear reversed on FRAME. +This uses some heuristics to guess the user's intentions when the +selected window of FRAME is a side window ." + (cond + ;; Reverse when `window-sides-reversed' is t. Do not reverse when + ;; `window-sides-reversed' is nil. + ((memq window-sides-reversed '(nil t)) + window-sides-reversed) + ;; Reverse when FRAME's selected window shows a right-to-left buffer. + ((let ((window (frame-selected-window frame))) + (when (and (not (window-parameter window 'window-side)) + (or (not (window-minibuffer-p window)) + (setq window (minibuffer-selected-window)))) + (with-current-buffer (window-buffer window) + (eq bidi-paragraph-direction 'right-to-left))))) + ;; Reverse when FRAME's `window-sides-main-selected-window' parameter + ;; specifies a live window showing a right-to-left buffer. + ((let ((window (frame-parameter + frame 'window-sides-main-selected-window))) + (when (window-live-p window) + (with-current-buffer (window-buffer window) + (eq bidi-paragraph-direction 'right-to-left))))) + ;; Reverse when all windows in FRAME's main window show right-to-left + ;; buffers. + (t + (catch 'found + (walk-window-subtree + (lambda (window) + (with-current-buffer (window-buffer window) + (when (eq bidi-paragraph-direction 'left-to-right) + (throw 'found nil)))) + (window-main-window frame)) + t)))) + + (defun window--make-major-side-window (buffer side slot &optional alist) + "Display BUFFER in a new major side window on the selected frame. +SIDE must be one of `left', `top', `right' or `bottom'. SLOT +specifies the slot to use. ALIST is an association list of +symbols and values as passed to `display-buffer-in-side-window'. +Return the new window, nil if its creation failed. + +This is an auxiliary function of `display-buffer-in-side-window' +and may be called only if no window on SIDE exists yet." + (let* ((left-or-right (memq side '(left right))) + (next-to (window--make-major-side-window-next-to side)) + (on-side (cond + ((eq side 'top) 'above) + ((eq side 'bottom) 'below) + (t side))) + (window--sides-inhibit-check t) + ;; The following two bindings will tell `split-window' to take + ;; the space for the new window from the selected frame's main + ;; window and not make a new parent window unless needed. + (window-combination-resize 'side) + (window-combination-limit nil) + (window (ignore-errors (split-window next-to nil on-side)))) + (when window + ;; Initialize `window-side' parameter of new window to SIDE and + ;; make that parameter persistent. + (set-window-parameter window 'window-side side) + (map-put window-persistent-parameters 'window-side 'writable) + ;; Install `window-slot' parameter of new window and make that + ;; parameter persistent. + (set-window-parameter window 'window-slot slot) + (map-put window-persistent-parameters 'window-slot 'writable) + ;; Auto-adjust height/width of new window unless a size has been + ;; explicitly requested. + (unless (if left-or-right + (cdr (assq 'window-width alist)) + (cdr (assq 'window-height alist))) + (setq alist + (cons + (cons + (if left-or-right 'window-width 'window-height) + (/ (window-total-size (frame-root-window) left-or-right) + ;; By default use a fourth of the size of the frame's + ;; root window. + 4)) + alist))) + (with-current-buffer buffer + (setq window--sides-shown t)) + ;; Install BUFFER in new window and return WINDOW. + (window--display-buffer buffer window 'window alist 'side)))) + + (advice-add #'window--sides-check :override #'ignore)) From c1b8d6f508d233d703d65f9edb5439b2b658a410 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:12:14 +0200 Subject: [PATCH 1969/4235] More configuration for smartparens Fewer overlay highlights and show-pair-from-inside, in case we use that feature later. --- core/core-editor.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 57894fd28..8c962e9b7 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -143,8 +143,11 @@ fundamental-mode) for performance sake." :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil + sp-highlight-wrap-overlay nil + sp-highlight-wrap-tag-overlay nil + sp-show-pair-from-inside t sp-cancel-autoskip-on-backward-movement nil - sp-show-pair-delay 0 + sp-show-pair-delay 0.1 sp-max-pair-length 3) ;; smartparens conflicts with evil-mode's replace state From 17981d6a61561c089000ccd5d146cf4a9a1f294f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:13:46 +0200 Subject: [PATCH 1970/4235] Conform hook names to conventions Also minor reformatting & comment corrections. --- modules/completion/company/autoload.el | 2 +- modules/emacs/electric/autoload.el | 2 +- modules/feature/lookup/autoload/lookup.el | 2 +- modules/feature/snippets/autoload/settings.el | 2 +- modules/lang/emacs-lisp/config.el | 5 +---- modules/lang/latex/config.el | 4 ++-- modules/tools/rotate-text/autoload.el | 2 +- 7 files changed, 8 insertions(+), 11 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 393761988..dfbcc6746 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -6,7 +6,7 @@ MODES should be one major-mode symbol or a list of them." (dolist (mode (doom-enlist modes)) - (let ((def-name (intern (format "+company--init-%s" mode)))) + (let ((def-name (intern (format "+company|init-%s" mode)))) (fset def-name (lambda () (when (or (eq major-mode mode) (and (boundp mode) (symbol-value mode))) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index f10575145..dc22a08b0 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -10,7 +10,7 @@ trigger electric indentation." (list '(:char :words) plist))) (cl-destructuring-bind (&key chars words) plist (dolist (mode (doom-enlist modes)) - (let ((fn (intern (format "+electric-indent--init-%s" mode)))) + (let ((fn (intern (format "+electric|init-%s" mode)))) (fset fn (lambda () (electric-indent-local-mode +1) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 5f910a3e1..bd3b0570e 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -28,7 +28,7 @@ properties: Using this multiple times overwrites previous properties and unsets omitted ones." (dolist (mode (doom-enlist modes)) - (let ((def-name (intern (format "+lookup--init-%s" mode)))) + (let ((def-name (intern (format "+lookup|init-%s" mode)))) (fset def-name (lambda () (when (or (eq major-mode mode) diff --git a/modules/feature/snippets/autoload/settings.el b/modules/feature/snippets/autoload/settings.el index 7eff149b3..f02d5f187 100644 --- a/modules/feature/snippets/autoload/settings.el +++ b/modules/feature/snippets/autoload/settings.el @@ -5,7 +5,7 @@ "Register a minor MODE with yasnippet so it can have its own snippets category, if the folder exists." (after! yasnippet - (let ((fn (intern (format "+snippets--register-%s" mode)))) + (let ((fn (intern (format "+snippets|register-%s" mode)))) (fset fn (lambda () (+snippets|enable-project-modes mode))) (add-hook (intern (format "%s-hook" mode)) fn)))) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7ac57c3cb..6c43eda49 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -7,10 +7,7 @@ (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") - - (set-pretty-symbols! 'emacs-lisp-mode - :lambda "lambda") - + (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") (set-rotate-patterns! 'emacs-lisp-mode :symbols '(("t" "nil") ("let" "let*") diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 5035be1ed..d7e127d2a 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -202,9 +202,9 @@ :when (featurep! :completion company) :commands (company-auctex-init) :init - ;; We can't use the (set-company-backend! ...) because Auctex reports its + ;; We can't use the `set-company-backend!' because Auctex reports its ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is - ;; not anticipated by :company-backend (and shouldn't have to!) + ;; not something `set-company-backend!' anticipates (and shouldn't have to!) (add-hook! LaTeX-mode (make-variable-buffer-local 'company-backends) (company-auctex-init))) diff --git a/modules/tools/rotate-text/autoload.el b/modules/tools/rotate-text/autoload.el index dbdbbf4ac..e7662db99 100644 --- a/modules/tools/rotate-text/autoload.el +++ b/modules/tools/rotate-text/autoload.el @@ -6,7 +6,7 @@ `rotate-text' will cycle through." (declare (indent 1)) (dolist (mode (doom-enlist modes)) - (let ((fn-name (intern (format "+rotate-text--init-%s" mode)))) + (let ((fn-name (intern (format "+rotate-text|init-%s" mode)))) (fset fn-name (lambda () (setq-local rotate-text-local-symbols symbols) From 913394bfe72a658837db57a2e3e8b704740266d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:23:49 +0200 Subject: [PATCH 1971/4235] Be quiet, recentf! --- 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 8c962e9b7..2a2c5d569 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -121,7 +121,7 @@ fundamental-mode) for performance sake." "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) (lambda (file) (file-in-directory-p file doom-local-dir)))) - (recentf-mode +1)) + (quiet! (recentf-mode +1))) (def-package! server :when (display-graphic-p) From b731aeea8f69e3a6b6d0798acc0edd8175a7870d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:24:25 +0200 Subject: [PATCH 1972/4235] Bind q to kill-this-buffer in Man-mode --- modules/config/default/+bindings.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9559d4760..d0ac26715 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -791,6 +791,9 @@ (after! ivy (+default|fix-minibuffer-in-map ivy-minibuffer-map)) +(after! man + (evil-define-key* 'normal Man-mode-map "q" #'kill-this-buffer)) + ;; Evil-collection fixes (setq evil-collection-key-blacklist From f3aadf6c77dfe25a27036149cae719eabfe725c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:30:02 +0200 Subject: [PATCH 1973/4235] Fix doom-temp-buffer-p & doom-real-buffer-p A regression caused the former to error out (if the buffer name was less than 2 characters long) and the latter to return t too eagerly (because of an incorrect condition chain). --- core/autoload/buffers.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index df417f493..6b7a36e61 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -80,7 +80,7 @@ If no project is active, return all buffers." ;;;###autoload (defun doom-temp-buffer-p (buf) "Returns non-nil if BUF is temporary." - (equal (substring (buffer-name buf) 0 2) " *")) + (equal (substring (buffer-name buf) 0 1) " ")) ;;;###autoload (defun doom-non-file-visiting-buffer-p (buf) @@ -111,10 +111,10 @@ The exact criteria for a real buffer is: 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) - (not (doom-temp-buffer-p buf)) - (run-hook-with-args-until-success 'doom-real-buffer-functions buf) - (not (run-hook-with-args-until-success 'doom-unreal-buffer-functions buf))))) + (and (not (doom-temp-buffer-p buf)) + (or (buffer-local-value 'doom-real-buffer-p buf) + (run-hook-with-args-until-success 'doom-real-buffer-functions buf) + (not (run-hook-with-args-until-success 'doom-unreal-buffer-functions buf)))))) ;;;###autoload (defun doom-buffers-in-mode (modes &optional buffer-list derived-p) From 41bac99a5fd10d0a9b6c6d4fd72284fdfad91613 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:34:06 +0200 Subject: [PATCH 1974/4235] eshell: color prompt red if last command failed --- modules/emacs/eshell/autoload/eshell.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 13737f1ff..0cf4c1ea3 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -63,7 +63,8 @@ 'face '+eshell-prompt-pwd) (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) - " λ ")) + (propertize " λ" 'face (if (zerop eshell-last-command-status) 'success 'error)) + " ")) ;; From d822560b34e514b6e1d1cc037f79e375ce349dd3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 02:54:14 +0200 Subject: [PATCH 1975/4235] Fix void-variable after-focus-change-function error This variable is introduced in the latest Emacs and the condition around it was inverted. --- modules/ui/doom-modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index c7938c3e4..85aaaaf55 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -55,7 +55,7 @@ (add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) (add-hook 'doom-after-switch-window-hook #'+doom-modeline|set-selected-window) -(if (boundp 'after-focus-change-function) +(if (not (boundp 'after-focus-change-function)) (progn (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) From 0fd8e1dd6b277539c364de21c4a44894c02fc142 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 11:34:55 +0200 Subject: [PATCH 1976/4235] Restore +popup-ttl Accidentally removed in a recent commit. Fixes #692 --- modules/ui/popup/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 579cfd51c..3e020c3a9 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -94,6 +94,10 @@ a brief description of some native window parameters that Emacs uses: (no-other-window . t)) "The default window parameters.") +(defvar +popup-ttl 5 + "The default time-to-live for transient buffers whose popup buffers have been +deleted.") + (defvar +popup-margin-width 1 "Size of the margins to give popup windows. Set this to nil to disable margin adjustment.") From 5400d608f465fadb16512d8cfcf8070df7aa06d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 12:40:00 +0200 Subject: [PATCH 1977/4235] Improve bin/org-tangle #691 Adds tag filtering. Also tangles regularly by default (with -p/--print, it will print tangled blocks to stdout instead). --- bin/org-tangle | 95 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 83 insertions(+), 12 deletions(-) diff --git a/bin/org-tangle b/bin/org-tangle index fbe90fb23..c07d91ccf 100755 --- a/bin/org-tangle +++ b/bin/org-tangle @@ -2,19 +2,29 @@ ":"; exec emacs --quick --script "$0" -- "$@" # -*- mode: emacs-lisp; lexical-binding: t; -*- ;;; bin/org-tangle -;; Extracts source blocks from org files and prints them to stdout. Debug/info -;; messages are directed to stderr and can be ignored. -l/--lang can be used to -;; only tangle blocks of a certain language. +;; Tangles source blocks from org files. Debug/info messages are directed to +;; stderr and can be ignored. +;; +;; -l/--lang LANG +;; Only include blocks in the specified language (e.g. emacs-lisp). +;; -a/--all +;; Tangle all blocks by default (unless it has :tangle nil set or a +;; :notangle: tag) +;; -t/--tag TAG +;; --and TAG +;; --or TAG +;; Only include blocks in trees that have these tags. Combine multiple --and +;; and --or's, or just use --tag (implicit --and). +;; -p/--print +;; Prints tangled code to stdout instead of to files ;; ;; Usage: org-tangle [[-l|--lang] LANG] some-file.org another.org ;; Examples: -;; org-tangle modules/ui/doom/README.org > install_fira_mono.sh +;; org-tangle -l sh modules/some/module/README.org > install_module.sh ;; org-tangle -l sh modules/lang/go/README.org | sh +;; org-tangle --and tagA --and tagB my/literate/config.org -(load (expand-file-name "../core/core.el" (file-name-directory load-file-name)) nil t) - -(require 'org-install) -(require 'org) +(require 'cl-lib) (require 'ob-tangle) (defun *org-babel-tangle (orig-fn &rest args) @@ -23,21 +33,82 @@ (lambda (start end filename &optional append visit lockname mustbenew) (princ (buffer-string))))) (apply orig-fn args))) -(advice-add #'org-babel-tangle :around #'*org-babel-tangle) -(let (lang srcs) +(defun *org-babel-tangle-collect-blocks (&optional language tangle-file) + "Like `org-babel-tangle-collect-blocks', but will ignore blocks that are in +trees with the :notangle: tag." + (let ((counter 0) last-heading-pos blocks) + (org-babel-map-src-blocks (buffer-file-name) + (let ((current-heading-pos + (org-with-wide-buffer + (org-with-limited-levels (outline-previous-heading))))) + (if (eq last-heading-pos current-heading-pos) (cl-incf counter) + (setq counter 1) + (setq last-heading-pos current-heading-pos))) + (unless (org-in-commented-heading-p) + (require 'org) + (let* ((tags (org-get-tags-at)) + (info (org-babel-get-src-block-info 'light)) + (src-lang (nth 0 info)) + (src-tfile (cdr (assq :tangle (nth 2 info))))) + (cond ((member "notangle" tags)) + + ((and (or or-tags and-tags) + (or (not and-tags) + (let ((a (cl-intersection and-tags tags :test #'string=)) + (b and-tags)) + (not (or (cl-set-difference a b :test #'equal) + (cl-set-difference b a :test #'equal))))) + (or (not or-tags) + (cl-intersection or-tags tags :test #'string=)) + t)) + + ((or (not (or all-blocks src-tfile)) + (string= src-tfile "no") ; tangle blocks by default + (and tangle-file (not (equal tangle-file src-tfile))) + (and language (not (string= language src-lang))))) + + ;; Add the spec for this block to blocks under its language. + ((let ((by-lang (assoc src-lang blocks)) + (block (org-babel-tangle-single-block counter))) + (if by-lang + (setcdr by-lang (cons block (cdr by-lang))) + (push (cons src-lang (list block)) blocks)))))))) + ;; Ensure blocks are in the correct order. + (mapcar (lambda (b) (cons (car b) (nreverse (cdr b)))) blocks))) +(advice-add #'org-babel-tangle-collect-blocks + :override #'*org-babel-tangle-collect-blocks) + +(defvar all-blocks) +(defvar and-tags) +(defvar or-tags) +(let (lang srcs and-tags or-tags) (pop argv) (while argv (let ((arg (pop argv))) (pcase arg + ((or "-h" "--help") + ;; TODO + (error "No help yet, sorry!")) + ((or "-a" "--all") + (setq all-blocks t)) ((or "--lang" "-l") (setq lang (pop argv))) + ((or "-p" "--print") + (advice-add #'org-babel-tangle :around #'*org-babel-tangle)) + ((or "-t" "--tag" "--and") + (push (pop argv) and-tags)) + ("--or" + (push (pop argv) or-tags)) ((guard (string-match-p "^--lang=" arg)) (setq lang (cadr (split-string arg "=" t t)))) + ((guard (file-directory-p arg)) + (setq srcs + (append (directory-files-recursively arg "\\.org$") + srcs))) ((guard (file-exists-p arg)) (push arg srcs)) - (_ - (error "Unknown option or file: %s" arg))))) + (_ (error "Unknown option or file: %s" arg))))) (dolist (file srcs) (org-babel-tangle-file file nil lang)) From 51d49639f63b90493eb4e36e88f1a83e1da3e483 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 12:53:32 +0200 Subject: [PATCH 1978/4235] Change M-k/M-j keys to gk/gj in magit-rebase Avoid meta keys where possible. --- modules/tools/magit/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 438e59219..c462b5551 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -68,5 +68,12 @@ load everything.") :after magit :init (setq evil-magit-state 'normal) :config + (after! git-rebase + (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) + (setcar (assoc (car key) evil-magit-rebase-commands-w-descriptions) + (cdr key))) + (evil-define-key* evil-magit-state git-rebase-mode-map + "gj" #'git-rebase-move-line-down + "gk" #'git-rebase-move-line-up)) (map! :map (magit-mode-map magit-blame-read-only-mode-map) doom-leader-key nil)) From 97f74064690e7a17493eb9f97b324bf15e576a77 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Sun, 17 Jun 2018 12:12:35 +0200 Subject: [PATCH 1979/4235] Use :modes instead of :in. --- modules/lang/ruby/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 1bbb50255..168cfec9f 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -74,7 +74,7 @@ environment variables." :mode ("/\\.rspec\\'" . text-mode) :init (associate! rspec-mode :match "/\\.rspec$") - (associate! rspec-mode :in (ruby-mode yaml-mode) :files ("spec/")) + (associate! rspec-mode :modes (ruby-mode yaml-mode) :files ("spec/")) (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") From d0e4e0801f8fa9114ab6f15c511b085cf992af83 Mon Sep 17 00:00:00 2001 From: Julien Wintz Date: Sun, 17 Jun 2018 12:12:13 +0200 Subject: [PATCH 1980/4235] Setup solaie mode for doom themes. --- modules/ui/doom/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 98edef3da..81846cb29 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -9,6 +9,7 @@ (doom-nova . nil) (doom-one . t) (doom-one-light . t) + (doom-opera . t) (doom-solarized-light . nil) (doom-spacegrey . nil) (doom-vibrant . nil)) From 3188d67d6efd325c4232d5eeb0d225ba36ac6d6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 13:11:33 +0200 Subject: [PATCH 1981/4235] Hide modeline in Man-mode --- core/core-ui.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-ui.el b/core/core-ui.el index c9a08e1ef..21a2305f8 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -226,6 +226,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; `hide-mode-line-mode' (add-hook 'completion-list-mode-hook #'hide-mode-line-mode) +(add-hook 'Man-mode-hook #'hide-mode-line-mode) ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially ;; in parentheses-drunk languages like Lisp. From 1866bb75f03defeb5c2c30b213c3fb3f999af639 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 14:42:23 +0200 Subject: [PATCH 1982/4235] Gate rtags packages behind +rtags module flag #693 --- modules/lang/cc/config.el | 1 + modules/lang/cc/packages.el | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 4b4ba614b..058564ae8 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -208,6 +208,7 @@ compilation database is present in the project.") ;; (def-package! rtags + :when (featurep! +rtags) :commands rtags-executable-find :preface (setq rtags-install-path (concat doom-etc-dir "rtags/")) diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el index 49a2aaa06..776b58a3c 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -21,7 +21,8 @@ (package! company-irony) (package! company-irony-c-headers))) -(when (package! rtags) +(when (featurep! +rtags) + (package! rtags) (when (featurep! :completion ivy) (package! ivy-rtags)) (when (featurep! :completion helm) From bac00f7d0a5306a7b0135bd4e38b22b441b62550 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 14:42:40 +0200 Subject: [PATCH 1983/4235] Enable +irony +rtags by default in init.example.el --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 60ac24e02..117863d6e 100644 --- a/init.example.el +++ b/init.example.el @@ -74,7 +74,7 @@ :lang ;assembly ; assembly for fun or debugging - ;cc ; C/C++/Obj-C madness + ;(cc +irony +rtags); C/C++/Obj-C madness ;common-lisp ; if you've seen one lisp, you've seen them all ;crystal ; ruby at the speed of c ;clojure ; java with a lisp From 36992037d1d0ae67a8480e32c65772a726d4b8d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 14:43:37 +0200 Subject: [PATCH 1984/4235] Update package dir mtimes for stale checks This helps doom//reload-package-autoloads detect if packages have changed. --- core/autoload/packages.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index b2c798689..a2e2ecdef 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -505,7 +505,9 @@ calls." (`failure (red "✕ FAILED"))) (or pin-label ""))))) (print! (bold (green "Finished!"))) - (if success (doom-delete-autoloads-file doom-package-autoload-file)) + (when success + (set-file-times doom-packages-dir) + (doom-delete-autoloads-file doom-package-autoload-file)) success))))) ;;;###autoload @@ -547,7 +549,9 @@ calls." (color (if result 'green 'red) (if result "✓ DONE" "✕ FAILED")))))) (print! (bold (green "Finished!"))) - (if success (doom-delete-autoloads-file doom-package-autoload-file)) + (when success + (set-file-times doom-packages-dir) + (doom-delete-autoloads-file doom-package-autoload-file)) success))))) ;;;###autoload @@ -589,7 +593,9 @@ calls." (if result "✓ Removed" "✕ Failed to remove") pkg))))) (print! (bold (green "Finished!"))) - (if success (doom-delete-autoloads-file doom-package-autoload-file)) + (when success + (set-file-times doom-packages-dir) + (doom-delete-autoloads-file doom-package-autoload-file)) success))))) From 233a1f6469a91eef0c637ddc2cc73b6d79234e85 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 14:50:34 +0200 Subject: [PATCH 1985/4235] evil-magit-use-z-for-folds = t And remove old meta key fold commands. Stashing commands are available through Z, instead. --- modules/tools/magit/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index c462b5551..a65ed7ee0 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -66,8 +66,14 @@ load everything.") (def-package! evil-magit :when (featurep! :feature evil +everywhere) :after magit - :init (setq evil-magit-state 'normal) + :init (setq evil-magit-state 'normal + evil-magit-use-z-for-folds t) :config + (define-key! magit-mode-map + (kbd "M-1") nil + (kbd "M-2") nil + (kbd "M-3") nil + (kbd "M-4") nil) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (setcar (assoc (car key) evil-magit-rebase-commands-w-descriptions) From e973acad6f16d68d588a99d5cd969766225d8c9e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 14:52:07 +0200 Subject: [PATCH 1986/4235] Defer projectile config in org Now that projectile is lazy loaded. --- modules/lang/org/+attach.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 5210d2d0c..ac9160886 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -92,10 +92,10 @@ 'org-link 'error))) - (push (car (last (split-string +org-attach-dir "/" t))) - projectile-globally-ignored-directories) + (after! projectile + (push (car (last (split-string +org-attach-dir "/" t))) + projectile-globally-ignored-directories)) - ;; (after! recentf (push (format "%s.+$" (regexp-quote org-attach-directory)) recentf-exclude))) From 19f1c70144ee1f9e14ecfaeabf729e6dc8c66be5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 16:43:10 +0200 Subject: [PATCH 1987/4235] Refactor company keybinds Also merge evil-collection-company into Doom. Two new features to note: C-S-s will invoke your completion engine for the remaining results. --- modules/config/default/+bindings.el | 12 ++++++++++-- modules/feature/evil/config.el | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index d0ac26715..06448938e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -126,12 +126,18 @@ (: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-j" #'company-select-next + "C-k" #'company-select-previous "C-h" #'company-show-doc-buffer + "C-u" #'company-previous-page + "C-d" #'company-next-page "C-s" #'company-filter-candidates - "C-S-s" #'company-search-candidates + (:when (featurep! :completion helm) + "C-S-s" #'helm-company) + (:when (featurep! :completion ivy) + "C-S-s" #'counsel-company) "C-SPC" #'company-complete-common [tab] #'company-complete-common-or-cycle [backtab] #'company-select-previous) @@ -139,6 +145,8 @@ (:map company-search-map "C-n" #'company-select-next-or-abort "C-p" #'company-select-previous-or-abort + "C-j" #'company-select-next-or-abort + "C-k" #'company-select-previous-or-abort "C-s" (λ! (company-search-abort) (company-filter-candidates)) [escape] #'company-search-abort)) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 509e58b9b..2cf3fa314 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -8,6 +8,7 @@ simple ;; we'll do these ourselves anaconda-mode + company dired helm ivy From 09369593a783c66512f48a02066e8669ef0225c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 16:46:51 +0200 Subject: [PATCH 1988/4235] M-f = swiper or helm-swoop --- modules/config/default/+bindings.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 06448938e..8fb861da9 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -57,7 +57,10 @@ :ne "M-a" #'mark-whole-buffer :ne "M-c" #'evil-yank :ne "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) - :ne "M-f" #'swiper + (:when (featurep! :completion helm) + :ne "M-f" #'helm-swoop) + (:when (featurep! :completion ivy) + :ne "M-f" #'swiper) :n "M-s" #'save-buffer :m "A-j" #'+default:multi-next-line :m "A-k" #'+default:multi-previous-line From ce86fa055749016b716a4c80f630bf443c686c39 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 17:19:33 +0200 Subject: [PATCH 1989/4235] helm-swoop: always split below current window --- modules/completion/helm/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index b39f09b9b..a4a8a4537 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -139,7 +139,10 @@ (setq helm-swoop-use-line-number-face t helm-swoop-candidate-number-limit 200 helm-swoop-speed-or-color t - helm-swoop-pre-input-function (lambda () ""))) + ;; no initial input + helm-swoop-pre-input-function (lambda () "") + ;; Always split below current window + helm-swoop-split-with-multiple-windows t)) (def-package! wgrep From 6490c4b922a04408de62b5679a953ba2b4954740 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 17:26:15 +0200 Subject: [PATCH 1990/4235] Prevent unsafe file variable prompts on help links --- modules/ui/popup/+hacks.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 444777c93..1314d5f6d 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -110,7 +110,7 @@ the command buffer." ;; `help-mode' (after! help-mode (defun doom--switch-from-popup (location) - (let (origin) + (let (origin enable-local-variables) (save-popups! (switch-to-buffer (car location) nil t) (if (not (cdr location)) @@ -154,6 +154,7 @@ the command buffer." ;; Open link in origin window (non-popup) instead of inside the popup window. (defun +popup*helpful--navigate (button) (let ((path (substring-no-properties (button-get button 'path))) + enable-local-variables origin) (save-popups! (find-file path) From 6b73f408aaa5139c1126d736527f562460854007 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 18:22:18 +0200 Subject: [PATCH 1991/4235] Remove prettify-utils dependency --- modules/ui/pretty-code/autoload.el | 11 ++++++++++- modules/ui/pretty-code/packages.el | 5 ----- 2 files changed, 10 insertions(+), 6 deletions(-) delete mode 100644 modules/ui/pretty-code/packages.el diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index db947942f..537467c42 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -282,6 +282,15 @@ Use the :iosevka property to enable (or disable) it regardless.") ("<+>" . #Xe1cb) ("+>" . #Xe1cc))))) +(defun +pretty-code--icon-to-char (l) + "Borrowed from `prettify-utils'." + (let ((glue '(Br . Bl)) + (head (car l)) + (tail (cdr l))) + (cond ((not (consp l)) '()) + ((not (consp tail)) (list head)) + ((cons head (cons nil (+pretty-code--icon-to-char tail))))))) + ;;;###autodef (defun set-pretty-symbols! (modes &rest plist) "Associates string patterns with icons in certain major-modes. @@ -329,7 +338,7 @@ assicated with :lambda in `+pretty-code-symbols'." (let ((prop (car plist)) (sym (cadr plist))) (when-let* ((icon (plist-get +pretty-code-symbols prop))) - (push (cons sym (prettify-utils-string icon)) + (push (cons sym (+pretty-code--icon-to-char (append icon nil))) results)) (setq plist (cddr plist)))) (setq prettify-symbols-alist (append results prettify-symbols-alist)))) diff --git a/modules/ui/pretty-code/packages.el b/modules/ui/pretty-code/packages.el deleted file mode 100644 index 80e5b016d..000000000 --- a/modules/ui/pretty-code/packages.el +++ /dev/null @@ -1,5 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ui/pretty-code/packages.el - -(package! prettify-utils - :recipe (:fetcher github :repo "Ilazki/prettify-utils.el")) From 01d4223f189711dbdea116573630e35af131ebb9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 18:22:40 +0200 Subject: [PATCH 1992/4235] Fix prettify-symbols not unprettifying at point defvar wasn't being set soon enough. --- modules/ui/pretty-code/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 537467c42..46fe9a629 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -1,7 +1,7 @@ ;;; ui/pretty-code/autoload.el -*- lexical-binding: t; -*- ;; When you get to the right edge, it goes back to how it normally prints -(defvar prettify-symbols-unprettify-at-point 'right-edge) +(setq prettify-symbols-unprettify-at-point 'right-edge) ;;;###autoload (defvar +pretty-code-iosevka-ligatures-enabled-by-default nil From 648f4bb5859536dfe167542b07aff7bc4d4c447e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 20:39:40 +0200 Subject: [PATCH 1993/4235] Remove CHANGELOG.org, this will be replaced --- CHANGELOG.org | 1005 ------------------------------------------------- 1 file changed, 1005 deletions(-) delete mode 100644 CHANGELOG.org diff --git a/CHANGELOG.org b/CHANGELOG.org deleted file mode 100644 index ce6b4c018..000000000 --- a/CHANGELOG.org +++ /dev/null @@ -1,1005 +0,0 @@ -#+TITLE: Changelog - -- [[#unreleased-develop][Unreleased (develop)]] -- [[#208-dec-09-2017][2.0.8 (Dec 09, 2017)]] -- [[#207-nov-08-2017][2.0.7 (Nov 08, 2017)]] -- [[#206-oct-05-2017][2.0.6 (Oct 05, 2017)]] -- [[#205-sep-03-2017][2.0.5 (Sep 03, 2017)]] -- [[#204-jul-14-2017][2.0.4 (Jul 14, 2017)]] -- [[#203-jun-11-2017][2.0.3 (Jun 11, 2017)]] -- [[#202-may-13-2017][2.0.2 (May 13, 2017)]] -- [[#201-apr-8-2017][2.0.1 (Apr 8, 2017)]] -- [[#200-jan-17-2017][2.0.0 (Jan 17, 2017)]] - -* Unreleased (develop) -+ *Module changes:* - + 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 - 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 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-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]]). - + 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 - 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= - + =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. - + 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 - 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. - -* 2.0.8 (Dec 09, 2017) -+ *Module changes:* - + New module: =lang/nix=, adds support for editing nix configuration files. - Contributed by [[https://github.com/ocharles][ocharles]]. - + The =org/*= modules have been moved to =lang/org= and sub-modules therein. - With the introduction of module flags in 2.0.5, it was unnecessary that - org-mode had its own category. - + Any module can now have an =init.el=, which will be loaded before any other - modules are loaded. -+ =general= - + Removed all core def-setting! definitions, because ~set!~ was intended for - cross-module configuration, where modules may or may not be enabled. This - consideration is unnecessary for Doom core configuration. The following - settings have been removed: ~:editorconfig~, ~:theme~, ~:font~, - ~:variable-font~, ~:unicode-font~, ~:big-font~. - + Address various byte-compiler warnings that crop up in Emacs 26+, including - obsolete (if|when)-let macro warnings. - + Fix byte-compiler complaining that packages couldn't be found when that - package is unwanted (e.g. conditionally installed or disabled packages). - + =private/{user-login-name}= is no longer a "magic" module that is - automatically loaded. - + =core-packages= *BREAKING* Packages are no longer deferred by default. i.e. - ~use-package-always-defer~ is now nil, as per the default. - + =core-popup= Fix window-live-p error when using ~doom/other-popup~ (or its - alias, ~other-popup~). - + =core-ui= Fix hl-line highlighting the rest of the window past end-of-file - in Emacs 26+. This is caused by a strange dynamic between hl-line and the - new line numbers feature. -+ =feature= - + =version-control= Fix an issue with shackle not managing magit's popups - properly. This could cause the pointer to end up in the wrong places (e.g. - when you try to commit; the commit message and diff buffers pop up and the - pointer gets stuck in the diff window) (see [[https://github.com/hlissner/doom-emacs/issues/282][#282]]). -+ =completion= - + =helm= Implement ~:agcwd~, ~:rg~, and ~:rgcwd~ commands for searching with - helm. - + =ivy= - + Add C-SPC binding for "previewing" the selected candidate. Useful for - previewing files in ~counsel-find-file~ or ~counsel-projectile-find-file~. - This keybinding is defined in =private/hlissner/+bindings.el=. - + Disable "very magic" regular expressions in ivy. Specifically, parentheses - are now literal, and must be escaped to make them special. This is - consistent with evil-search regex. - + Fix a bug where ~:rgcwd~ wasn't showing any results, due to an incorrect - option argument in the ripgrep command string. -+ =ui= - + =doom-modeline= Remove the let-binds for ~all-the-icons-scale-factor~, so - that users can customize it themselves (see [[https://github.com/hlissner/doom-emacs/issues/278][#278]]). -+ =tools= - + =password-store= Fix compatibility with Emacs 26. -+ =lang= - + =clojure= - + This module has been rewritten with improved Cider and clojurescript - support, as well as new refactoring commands. Thanks to [[https://github.com/teesloane][teesloane]]! - + =crystal= - + Add flycheck integration for the Crystal language, powered by - ~flycheck-crystal~. - + Use the ELPA source for ~crystal-mode~. The former QUELPA source - (dotmilk's fork) is no longer maintained. - + =org= - + Fix scenario where built-in (and incorrect) version of org-mode (8.x) was loaded - instead of 9.0+. - + This module is incredibly opinionated. More opinionated than I'd like, but - org-mode is an ongoing effort. To address this, =lang/org= has been - reorganized. Variables are now set with ~defvar~ instead of ~setq~, which - makes them more accessible for configuring from private modules. - + Use the ELPA source for ~ob-rust~. The former QUELPA source (zweifisch's - fork) is no longer maintained. - + Fix an over-aggressive smartparens config for org-mode that would cause - certain markers and delimiters (like spaces or square brackets) being - repeated in places you didn't want them to be, like inside a checkbox. - -* 2.0.7 (Nov 08, 2017) -+ *Module changes:* - + *BREAKING* Split =lang/java= into two submodules: one for eclim, and another for - meghanada. You will need to update your =init.el= to enable one. - submodule is experimental, since I have few opportunities to test it. - + *BREAKING* Ace-window is no longer part of Doom core. It has been moved to - =ui/window-select=, which offers two submodules for interactive window - selection/moving: ace-window and switch-window. -+ =general= - + New command naming convention: ~doom//...~ -- denotes that this an - interactive command meant for: - + Altering or maintaining your Emacs configuration itself. - + And can be safely called through a batch session on the command line. E.g. - ~emacs --batch -f doom//some-command~. - + New macro for defining fuzzy-find menus (powered by whatever completion - engine you have active): ~def-menu!~. - + Autoload files can now specify a predicate cookie to tell the - compiler/autoload reader whether or not to ignore that file. They look like - ~;;;###if (featurep! :feature evil)~. - + =core-keybinds= Add :g flag to ~map!~ for defining global keybinds along - with vim keybinds, so you don't have to repeat yourself, just for a global - binding. - + =core-packages= Fix an issue where Doom's package management system wouldn't - know what to do with a package that was initially installed with one backend - (e.g. ELPA), and whose ~package!~ definition was later changed so that it - should be handled by another (e.g. QUELPA). This would cause "FAILED" error - messages while trying to install or update these packages (see [[https://github.com/hlissner/doom-emacs/issues/222][#222]]). -+ =feature= - + =file-templates= Disable file templates for .dir-locals.el files. - + =jump= New command ~+jump/online-select~, which is like ~+jump/online~, but - will always prompt for which provider to use. -+ =ui= - + =doom= This module no longer sets a default font. This is left to the user - to set in their own private module. Use ~(set! :font "Font Name" :size N)~ - to do so. -+ =lang= - + =sh= - + Improve how variables and subshells in double-quoted strings are - fontified. - + Fix imenu not recognizing functions with dashes in their names. - + =java= - + Polished meghanada-mode integration. - + New (and optional) +eclim submodule and module flag. - + =rust= - + Now checks the ~RUST_SRC_PATH~ environment variable before looking for - Rust's source in ~+rust-src-dir~. - + Now looks for a ~racer~ binary in ~PATH~ before looking in - ~+rust-src-dir~. - -* 2.0.6 (Oct 05, 2017) -+ *Module changes:* - + Add =lang/ledger= - + Add =ui/vi-tilde-fringe= -- used to be in =core-ui=; indicates beyond-EOB, - using tildes in the fringe (inspired by vim). - + Add =feature/services= -- used to be =tools/prodigy=. Adds a way of managing - external processes and services. - + Add =tools/make= -- for running project Makefile commands from Emacs. - + Add =tools/imenu= -- adds a sidebar for imenu (~imenu-list~), and a way of - jumping to imenu entries across all open buffers (~imenu-anywhere~). - + Move =feature/hydra= into =core-keybinds=. - + Rename =feature/debug= to =feature/debugger= (and disabled it by default; it - is currently unstable and needs some work). - + Remove =org/org-notebook=. It was unused and too small to warrant its own - module. Useful tidbits were merged into =org/org=. -+ =general= - + =Makefile= - + Fix ~make update~ to work even if Doom is installed somewhere other than - ~\~/.emacs.d~ (see [[https://github.com/hlissner/doom-emacs/issues/190][#190]]). - + Removed colons from makefile task target names (like =compile:core=); - replaced them with dashses, e.g. =compile-core=. Colons broke compatibility - with certain versions of make. - + =autoload= - + New library: =menu.el= -- allows context-sensitive and customizable - fuzzy-searchable menus; this was written to replace long lists of - major-mode-local key bindings, like refactoring and code building - commands. This replaces =feature/eval='s build task system. - + =editor.el= Fix old scratch buffer commands and renamed them: - ~doom/open-scratch-buffer~ and ~doom/open-project-scratch-buffer~. The - former opens a temporary, transient scratch buffer, the latter opens a - permanent one tied to the current project, kept in - ~doom-scratch-files-dir~. - + =window.el= Changed ~doom-resize-window~ to accept two more arguments, - =WINDOW= and =FORCE-P=: ~doom-resize-window WINDOW NEW-SIZE &optional - HORIZONTAL FORCE-P~. If =FORCE-P= is non-nil, this function will resize a - window regardless of ~window-size-fixed~. - + =core-keybinds= Add new =def-hydra!= alias macro for ~defhydra~ (for - consistency, and in case we want to wrap it later). - + =core-projects= Redesign ~def-project-mode!~ for efficiency, and: - + The =:init FORM= property is now =:on-load FORM=. - + Three new properties: =:on-enter FORM=, =:on-exit FORM= and =:add-hooks - LIST=. - + =core-popups= - + Added two new popup properties: - + ~:static~ If non-nil, treat this popup like a permanent window, making - it impervious to automatic closing and being tracked in popup history. - This is excellent for semi-permanent popups, like sidebars (think - Neotree or imenu-list). - + ~:autofit~ If non-nil, this popup will resize to fit its buffer - contents. This only works with popups where the buffer content is - immediately available, and not for, say, buffers tied to async - processes. - + ~doom-popup-buffer~ and ~doom-popup-file~ no longer take a variadic - argument. Their signature is now ~doom-popup-buffer buffer plist &optional - extend-p~ and ~doom-popup-file file plist &optional extend-p~, where - =EXTEND-P= will cause =PLIST= to extend from the base rule for that - buffer. - + Rename ~doom-popup-prop~ to ~doom-popup-property~. - + Add support for moving popup windows. See the ~doom/popup-move-*~ - commands. There are used by ~+evil/window-move-*~, which provides - universal support for moving windows. - + Add command: ~doom/popup-raise~, for promoting a popup into a regular - window. - + Add helper macro: ~save-popup! BODY~ -- hides the popups before running - BODY. - + Fix ~doom/popup-toggle~ and ~save-popups!~ killing popups with an - =:autokill= property. -+ =feature= - + =hydra= Display a separator on the bottom of hydra windows for contrast. - + =eval= Build-task management has been removed from =feature/eval= in favor - of ~def-menu!~. -+ =ui= - + =doom-dashboard= - + Fix /horizontal/ centering discrepancies caused by multiple visible - dashboards in windows/frames with different sizes (see [[https://github.com/hlissner/doom-emacs/issues/192][#192]]). Still - doesn't address vertical centering. - + Fix dashboard's default-directory not changing to the last open project - when switched to. - + =doom-modeline= Add a new style to ~+doom-modeline-buffer-file-name-style~: - ~relative-from-project~, which displays on the buffer's path relative to - (and including) the project. - + =hl-todo= Add face-based detection for commented regions, so hl-todo can - work in modes with no/poor syntax-table support. -+ =tools= - + =neotree= - + Fix neotree shrinking by 1 when vertical splits were closed. - + Fix Neotree popup rule not taking ~neo-window-width~ and - ~neo-window-position~ into account. - + =term= Renamed commands for consistency (to ~+term/open~, ~+term/open-popup~ - and ~+term/open-popup-in-project~). - + =eshell= Renamed commands for consistency (to ~+eshell/open~, - ~+eshell/open-popup~ and ~+eshell/open-workspace~). -+ =lang= - + =ruby= Add rake support. See the ~rake~ command. - + =web= Only install company-web if =:completion company= is enabled. - + =javascript= - + Add eslint_d and eslint_d-fix detection and support. - + =./node_modules/.bin= is now added to ~exec-path~ in NPM project buffers. - + =haskell= There is no longer a 'default' implementation for Haskell. The - =+intero= and/or =+dante= module flags must be specified in init.el. - + =java= Meghanada is no longer the 'default' implementation for Java. The - =+meghanada= and/or =+eclim= module flags must be specified in init.el. -+ =org= - + If a table is under point when ~+org/toggle-fold~ is invoked, the table is - realigned. - + Fix the incorrect version of org being loaded (site, instead of ELPA) by - pushing it up further in the ~load-path~. - + Fix ~+org/insert-item~ not jumping over sublists to append a new list item. - -* 2.0.5 (Sep 03, 2017) -+ =doom= - + Added new module: ~tools/rgb~, with tools for dealing with colors (thanks to - [[https://github.com/bandresen][bandresen]]) - + Added new module: ~tools/prodigy~, with tools for managing external services - (thanks to [[https://github.com/bandresen][bandresen]]) - + Added new module: ~feature/hydra~, offers an extra and customizable layer of - modal keybinds (thanks to [[https://github.com/bandresen][bandresen]]) - + Added two new core-lib helpers for macros: ~doom-enlist~ and ~doom-unquote~. - + Switch to ~doom-fallback-buffer~ after using ~doom/kill-all-buffers~ (or - ~:killall!~). - + ~make doctor~ now does font detection and will complain when fonts are - missing. - + When switching to a new project, a new workspace is spawned and a fuzzy - find-file prompt is opened. However, a buffer from the previous workspace - would linger on screen *and* the scratch buffer would CD to HOME, rather - than the project root. This is fixed now. - + Added module flags to the ~doom!~ macro in init.el, and modified the - ~featurep!~ macro so that it can be used to detect these flags from within - modules. It is up to modules how to interpret them. More information in - [[https://github.com/hlissner/.emacs.d/commit/0b7b8800a2478588bde408c92fcdfa0e43a5baf0][0b7b880]]. - + Fix projectile-find-file not respecting ~default-directory~ (caused by - changes upstream). - + Rewrote, revised and expanded module documentation, and created a [[https://github.com/hlissner/.emacs.d/wiki][wiki]] with - more information. - + Removed the =:L= flag from =map!= and replaced it with a =:local= property. - + Added new function: ~doom|disable-vi-tilde-fringe~ for turning off - vi-tilde-fringe in select buffers. - + Added support for relative line numbers (see ~doom-line-numbers-style~), - using nlinum-relative on Emacs <26, and display-line-numbers on Emacs 26+. -+ =feature= - + =file-templates= Added a file template for: - + *.org files - + Module README.org files. - + =jump= - + Added documentation for ~:jump~ setting, describing the three properties - it supports (~:definition~, ~:references~ and ~:documentation~). - + Rewrote ~+jump/online~ to: - + Use the current selection, if active, or prompt for a query otherwise - (with the thing at point as the initial input). - + Prompts for the provider (search engine) on first use, and reuses the - last provider on consecutive uses. If the universal argument is - supplied, force ~+jump/online~ to prompt for the provider anyway. - + =workspaces= Fix interactive renaming of workspaces, as well as the ability - to save and load workspaces from files (see [[https://github.com/hlissner/doom-emacs/pull/200][#200]]). -+ =completion= - + Added all-the-icons support to ~ivy-switch-buffer~ and - ~+ivy/switch-workspace-buffer~. Enable this with ~(setq +ivy-buffer-icons - t)~. -+ =ui= - + rainbow-mode is no longer activated on ~prog-mode-hook~. - + =doom-modeline= - + Modeline now uses shrink-path.el to shrink the buffer name in the case of - a small frame (thanks to [[https://github.com/bandresen][bandresen]]). [[https://github.com/hlissner/.emacs.d/pull/176][See #176]] - + Fixed mode-line going blank in terminal Emacs (thanks to [[https://github.com/bandresen][bandresen]]). - + =doom-dashboard= Fixed "Load last session" button on dashboard. -+ =tools= - + =eshell= General improvements made to further integrate eshell with Doom - (thanks to [[https://github.com/bandresen][bandresen]]). [[https://github.com/hlissner/.emacs.d/pull/160][See #160]] - + =pass= ~+pass-get-field~ now no-ops if used in a non-interactive session - (e.g. during testing or byte compilation). - + =neotree= Add =r= and =d= bindings for renaming and deleting files, - respectively. -+ =lang= - + =cc= The advise function ~c-lineup-arglist~ was missing, and has now been - reimplemented. - + =haskell= With module flags implemented, Intero support is now available to - lang/haskell and is now the default. Dante support is still available with - the ~+dante~ flag. - + =java= Now auto-installs meghanda-server on first use, and fixed - code-completion in java buffers. -+ =org= - + Fixed vanilla C-j/C-k bindings overshadowing custom window navigation - bindings. - + Added C-[hjkl] keybindings in insert mode for org table navigation. - + Fixed ~+org/insert-item~ throwing =save-excursion: Wrong type argument: - listp, 1= error when used from BOL on the first sub-item in a list. - -* 2.0.4 (Jul 14, 2017) -+ *Module changes:* - + Added =tools/password-store= -- Emacs as a password manager, using [[https://www.passwordstore.org/][pass]] as a - backend (contributed by [[https://github.com/bandresen][brandresen]]). - + Added =app/irc= -- Emacs as an IRC client, using circe (contributed by - [[https://github.com/bandresen][brandresen]]). - + ~+pass/ivy~ for ivy integration, with edit/copy field/open url actions. - + ~helm-pass~ for helm integration. - + Added =lang/hy= -- support for [[http://hylang.org][hylang]], a combination of Lisp and Python - (thanks to [[https://github.com/bandresen][bandresen]]). - + Added =lang/ocaml= -- support for [[https://ocaml.org/][OCAML]] (thanks to [[https://github.com/Ptival][Ptival]]) - + Added =lang/plantuml= -- drawing diagrams in plain text - + Added =lang/perl= -- Perl6 support for Emacs - + Added =ui/tabbar= -- add tabs to Doom via [[https://github.com/dholm/tabbar][tabbar]] (I don't recommend using - it) - + Removed =lang/org= - + Added =org= -- a new module category for org and org extensions - + Removed =app/present= (replaced mostly with =org/org-present=) - + =org/org-babel= -- executable code snippets in org-mode, with support for - a variety of languages. - + =org/org-capture= -- a better org-capture, in or outside of Emacs. - + =org/org-export= -- a centralized export system with more export backends. - + =org/org-notebook= -- org-mode as a general notebook. - + =org/org-present= -- org-mode for presentations. - + Added =tools/impatient-mode= -- show off live buffers via HTTP. -+ =core= - + New variable: ~doom-host-dir~, as a base path for ~doom-etc-dir~ and - ~doom-cache-dir~. - + New hooks: ~doom-init-hook~ and ~doom-post-init-hook~, which are run on - ~emacs-startup-hook~. This is meant to simplify post-Emacs initialization - hooks (~after-init-hook~, ~emacs-startup-hook~ and ~window-setup-hook~) into - two unambiguous ones. - + Fix =private//init.el= not being auto-loaded when the - user's private module is absent in the root init.el file. - + Improve error handling across the board. Emacs should now report more - helpful errors. Catastrophic errors will be less likely to inhibit later - modules from being loaded. - + Unit-tests have been moved to their respective modules (and =core/test/=). - + Fix ~def-setting!~ to act more like ~defmacro~; don't aggressively evaluate - its arguments on expansion. - + New function: ~doom-set-buffer-real BUFFER FLAG~ -- makes Doom consider - BUFFER real, no matter what. - + Add INSTALLED-ONLY-P argument to ~doom-get-packages~ to filter packages that - aren't installed. - + =core-ui= - + Add quit confirmation when trying to close a frame that contains real - buffers. - + Fix quit confirmations for clients connected to ~emacs --daemon~ with - ~emacsclient~. - + Brought back [[https://github.com/hlissner/emacs-nlinum-hl][nlinum-hl]], which offers some line number fixes for web-mode - and markdown-mode. - + Don't report the buffer modified when injecting (or deleting) trailing - whitespace in ~doom|inject-trailing-whitespace~ and - ~doom|init-highlight-indentation~. - + [[https://github.com/domtronn/all-the-icons.el][all-the-icons]] now fails gracefully in the terminal. - + New hook: ~doom-init-ui-hook~, run whenever the UI needs to be reloaded - (and once at startup). Theme and font loading is also attached to this - hook. - + New variables for font and theme loading: ~doom-theme~, ~doom-font~, - ~doom-variable-pitch-font~, and ~doom-unicode-font~. - + New variables for customizing line numbers: ~doom-line-number-lpad~, - ~doom-line-number-rpad~, and ~doom-line-number-pad-char~. These were added - to facilitate custom whitespace characters in line numbers, e.g. /u2002 (a - unicode character that looks like a space). Doing so fixes an issue where - ~whitespace-mode~ with ~space-mark~ would replace all space characters - indiscriminately, even in line numbers. - + Add hooks ~doom-pre-reload-theme-hook~ and ~doom-post-reload-theme-hook~ - to ~doom/reload-theme~ command. - + =core-popups= - + Fix an issue where more specific popup rules were being overriden by more - general rules. - + New command: ~doom/other-popup~ -- cycles between open popup windows and - the original buffer that you originated from. Discussed in [[https://github.com/hlissner/.emacs.d/issues/141][#141]]. - + =core-editor= - + Change what files recentf will ignore: everything in ~doom-host-dir~ is - now ignored and anything else in ~doom-local-dir~ won't be. - + New interactive command: ~doom/scratch-buffer~ (replaces - ~+doom:scratch-buffer~ in =:ui doom=). - + =core-packages= - + Generalize ~doom-package-*-p~ functions into ~(doom-package-prop NAME - PROPERTY)~. - + Fix quelpa temporary files (in ~quelpa-build-dir~) not being removed when - a quelpa package was uninstalled. - + New hook: ~doom-reload-hook~ (sort of). This has been around for a while, - but now it is defined and documented. It runs when ~doom/reload-load-path~ - is called (which gets called remotely if you run package management while - an Emacs session is active). - + ~load!~ can now accept a string as its first argument (the path). -+ =feature= - + =feature/evil= - + Remove =goto-last-change=, which conflicts with =goto-chg=, which is a - dependency of evil (that does the exact same thing, but is what evil - uses). - + =feature/jump= - + Remove ~:xref-backend~ setting (replaced with ~:jump~). - + Add ~:jump MAJOR-MODE &rest PLIST~ setting, which recognizes four - properties (that accept functions/commands): - + ~:definition~: jumps to the definition of the symbol under point. - + ~:references~: lists all references of the symbol at point and lets you - jump to them. - + ~:documentation~: shows documentation for the symbol at point. - + ~:xref-backend~: a function that serves as an xref backend; this - replaces ~:definition~ and ~:references~. - + =feature/workspaces= - + New function: ~+workspace-contains-buffer-p &optional BUFFER PERSP~ -- - return non-nil if BUFFER (defaults to current buffer) is in PERSP - (defaults to current perspective). - + Fix ~+workspace-p~ not detecting a perspective struct. - + Fix ~+workspace-buffer-list~ not preserving buffer order (by recency). -+ =completion= - + =completion/company= - + Add ~company-dabbrev~ and ~company-ispell~ to the default Company - backends. This ensures you have some completion available in buffers - previously without any. This is especially useful for text-mode buffers. - Discussed in [[https://github.com/hlissner/.emacs.d/issues/134][#134]]. -+ =ui= - + =ui/doom= - + Vastly improve daemon and terminal support for doom-themes by reloading - the theme when a new client is attached, or new terminal/daemon frame is - created. This prevents incorrect colors from bleeding across face class - barriers. - + Removed evil command ~+doom:scratch-buffer~ (replaced with - ~doom/scratch-buffer~ in =core-ui=). - + Decoupled font and theme loading from this module. This has now been - delegated to =core-ui=. These variables no longer exist: ~+doom-theme~, - ~+doom-font~, ~+doom-variable-pitch-font~, ~+doom-unicode-font~. Discussed - in [[https://github.com/hlissner/.emacs.d/issues/117][#117]]. - + =ui/doom-dashboard= - + Fix dashboard not opening in emacsclient/daemon frames. - + Add =gg= and =G= keybinds in dashboard for moving to the first and last - button (respectively). - + =ui/doom-modeline= - + Reorganize order of modeline segments, placing the vc branch last. This - minimizes the non-uniform spacing caused by all-the-icon icons. - + Fix blank mode-line caused by a nil buffer-file-name (used in vcs - segment). For example, in org indirect buffers. -+ =tools= - + =tools/neotree= - + Fix neotree refusing to open when it was already open in another frame. - This is especially frustrating when neotree is open in a (likely buried) - terminal emacsclient session, and you're trying to open neotree in - another. -+ =lang= - + =lang/cc= - + Add code completion to glsl-mode (powered by [[https://github.com/Kaali/company-glsl][company-glsl]]). - + =lang/markdown= - + Source blocks are now fontified natively, with the fontification of their - native major-modes (see ~markdown-fontify-code-blocks-natively~). - + =lang/sh= - + Fix fontification of command substitutions in double-quoted strings to - help distinguish them from the rest of string literals. - + =lang/web= - + Fix HTML entity encoding/decoding functions. -+ =org= - + =org/org= - + Fix M-RET in plain lists not preserving indent level for new items. - + Fix cursor jumping away when toggling folds or realigning org tables - (pressing TAB). - + Minimized keybindings into the bare necessities; most custom bindings have - been moved to my private module. - + =org/org-capture= - + Start org-capture-mode in insert-mode (if evil is loaded). - -* 2.0.3 (Jun 11, 2017) -+ *New modules* - + =ui/unicode= -- fixes unicode font-rendering for a variety of languages, - using [[https://github.com/rolandwalker/unicode-fonts][unicode-fonts]]. - + =ui/evil-goggles= -- visual feedback for edit operations in evil-mode, using - [[https://github.com/edkolev/evil-goggles][evil-goggles]]. - + =ui/nav-flash= (extracted from =ui/doom=) -- flashes current line when - moving cursor considerable distrances, using [[https://github.com/rolandwalker/nav-flash][nav-flash]]. - + =tools/neotree= (extracted from =feature/evil=) -- a file explorer sidebar, - using [[https://github.com/jaypei/emacs-neotree/][neotree]]. -+ =core= - + New special file: =private//init.el= is now loaded before - modules (after core). - + =:private = is now automatically loaded by ~doom!~. - + New help command: ~doom/describe-module~ -- for DOOM modules. - + New help command: ~doom/describe-setting~ -- for possible ~set!~ targets. - + Add =make doctor= to diagnose common issues with your setup & environment. - + Removed ~def-bootstrap~ & ~doom-bootstrap~. It was a clumsy system. I'll - replace it with README.org files in each module, with working, tangle-able - source blocks. - + =core-os= - + Don't use GTK tooltips on Linux (ugly!). - + =core-ui= - + New plugin: [[https://github.com/syl20bnr/vi-tilde-fringe][vi-tilde-fringe]] -- subtle, vim-ish empty-line indicator. - + New variable: ~doom-ui-mode-names~ (alist) -- for changing ~mode-name~ of - major-modes. - + Fix left-over hl-line overlays when hl-line-mode is uncleanly killed (e.g. - when the major-mode is changed). - + Fix disappearing line numbers in nlinum (thanks to [[https://github.com/gilbertw1][gilbertw1]]). - + Move theme/font bootstrap to core-ui. - + New hook: ~doom-init-ui-hook~ - + New global minor-mode ~doom-big-font-mode~ and variable ~doom-big-font~. - + =core-keybinds= - + New property for ~map!~: ~:textobj~ -- for binding to evil text objects - keymaps. - + Fix ~:after~ & ~:map*~ properties in ~map!~ macro (wasn't working at all). - + Change keybinding scheme; the leader key is now =SPC= and localleader =SPC - m=, inspired by spacemacs. - + Enable which-key pops up for all keys. - + =core-popups= - + Properly persist ~popup~ window parameter between sessions. - + Improve magit+shackle integration; ensures that links will be followed - within the popup they were opened. - + Add ~doom-popup-no-fringe~ option (default = t). When non-nil, fringes - will be disabled in popup windows (in ~doom-popup-mode~). - + =core-packages= - + Fix failure to detect out-of-date QUELPA packages. - + Fix ~custom-file~ (and custom settings) not being loaded. - + Fix crash in ~doom-update-package~ caused by unreachable, new - dependencies. - + Make ~doom-update-package~ atomic in case of failure. - + Make ~doom-refresh-packages~ async. - + Improve the security of package management (via ELPA) by a) forcing Emacs - to verify TLS connections and b) use HTTPS sources for MELPA and ELPA. - + Make ~doom-get-outdated-packages~ asynchronous, producing a substantial - speed-up when updating packages from Quelpa sources. -+ =feature= - + =feature/evil= - + Add ~+evil:mc~ command [[https://github.com/gabesoft/evil-mc][evil-mc]]. - + Add ~+evil/mc-make-cursor-here~, with visual-block support for [[https://github.com/gabesoft/evil-mc][evil-mc]]. - + =d= (operator) now invokes ~wgrep-mark-deletion~ in wgrep buffers. - + New code folding system that combines hideshow (built-in; for - indent/marker-based folds) and [[https://github.com/alexmurray/evil-vimish-fold][evil-vimish-fold]] (for arbitrary folds). - + Fix [[https://github.com/redguardtoo/evil-matchit][evil-matchit]] in visual mode. - + Fix [[https://github.com/hlissner/evil-multiedit][evil-multiedit]] M-d bindings. - + Fix stringp error caused by unintialized state in hideshow. - + Fix evil normal-mode keybindings in help-mode popups. - + Change how ~+evil-esc-hook~ hooks are handled: they now short-circuit on - the first hook to return non-nil. - + Remove ~+evil/matchit~ (thin wrapper around ~evilmi-jump-items~). - + Remove [[https://github.com/jaypei/emacs-neotree/][neotree]] plugin (moved to =tools/neotree=). - + =feature/jump= - + Call ~recenter~ after using [[https://github.com/jacktasia/dumb-jump][dumb-jump]]. - + =feature/workspaces= - + No longer saves session on quit if session was blank. - + Fix persp-mode switching to main workspace if auto-resume is on. - + Fix ~+workspace-get~ returning a non-nil "null perspective" on some - occasions where NAME doesn't exist. This is because ~persp-get-by-name~ - returns the value of ~persp-not-persp~ to signify null instead of actual - nil. - + Decouple workspace buffer-list functions from doom buffer library. Now, - the workspaces module will explicitly advise ~doom-buffer-list~. - + ~+workspace-list~ now returns a list of perspective structs, rather than a - list of strings. ~+workspace-list-names~ was introduced for the latter. -+ =completion= - + =completion/company= - + Change ~:company-backends~ to accept a variadic list of backends to - prepend to ~company-backends~. Its signature is now ~(set! - :company-backends MODES &rest BACKENDS)~ ([[https://github.com/hlissner/.emacs.d/pull/125][#125]]). - + =completion/ivy= - + Flexible column width for ~+ivy/tasks~. -+ =ui= - + =ui/doom= - + New plugin: [[https://github.com/hlissner/emacs-solaire-mode][solaire-mode]] -- replaces ~doom-buffer-mode~; brightens source - windows and dims transient, temporary, or popup windows. - + BREAKING CHANGE: Decoupled theme and font loading from ui/doom. This has - been moved to core-ui. The following variables have been renamed: - + ~+doom-theme~ => ~doom-theme~ - + ~+doom-font~ => ~doom-font~ - + ~+doom-variable-pitch-font~ => ~doom-variable-pitch-font~ - + ~+doom-unicode-font~ => ~doom-unicode-font~ - + =ui/doom-modeline= - + Reduce excess whitespace on right of flycheck segment. - + Buffer-path and file-name segments now use different faces. - + The vcs segment now uses a slightly darker color (in clean branches). - + Fix blank mode-line when buffer-file-name is nil ([[https://github.com/hlissner/.emacs.d/pull/130][#130]]) - + =ui/nav-flash= - + Fix over-aggressive nav-flash'ing on evil-multiedit or in eshell/term - buffers. -+ =tools= - + =tools/gist= - + Changed new gists to be private by default. -+ =lang= - + =lang/haskell= - + New plugin: [[https://github.com/iquiw/company-ghc][company-ghc]] -- code-completion support for haskell (requires - ~ghc-mod~). - + =lang/php= - + New plugin: [[https://github.com/xcwen/ac-php][company-php]] -- code-completion support for php (requires a - TAGs file created with [[https://github.com/xcwen/phpctags][phpctags]]). - + =lang/emacs-lisp= - + Omit defuns inside macros from the imenu index. - + Don't enable ~flycheck-mode~ in emacs.d files. - + =lang/org= - + Replace org-bullets source with more up-to-date fork. - + =lang/scala= - + Fix ~void-variable imenu-auto-rescan~ error caused by - ~ensime--setup-imenu~ trying to use imenu variables before loading imenu. -+ =private/hlissner= - + Add =gzz= binding (~+evil/mc-make-cursor-here~) - + Add =:mc= ex command (~+evil:mc~) - + Add =:lookup= ex command (~+jump:online~). - + Add =:gblame= ex command (~magit-blame~). - + Add =:grevert= ex command (~git-gutter:revert-hook~). - -* 2.0.2 (May 13, 2017) -+ *New modules* - + =tools/gist= -- allows you to manage and create gists, using [[https://github.com/defunkt/gist.el][gist.el]]. - + =tools/term= -- quickly spawn a terminal (in a popup or buffer) using - [[https://github.com/emacsorphanage/multi-term][multi-term]] - + =app/twitter= -- Emacs as a twitter client, using [[https://github.com/hayamiz/twittering-mode][twittering-mode]] -+ =core= - + Stop "buffer is read-only" messages while in minibuffer, when I accidentally - try to edit the prompt. It's correct behavior, but it consumes the - minibuffers, hiding what I'm typing. - + Fix Emacs daemon compatibility with DOOM, which assumed a frame will always - be visible on startup, causing errors when Emacs is launched as a daemon. - + Code-style change: use sharp-quote for functions. This makes the - byte-compiler output missing-function warnings when they can't be found, - which is helpful. - + Stop projectile & git-gutter checks when in a TRAMP buffer; it causes - tremendous slowdowns, to the point of being unusable. - + Add ~message!~ & ~format!~ macros for printing colored output either a) in a - popup buffer when in an interactive session or b) with ansi codes when in an - noninteractive session. - + Changed ~doom/recompile~ to aggresively recompile =core/core.el= to fix - load-path inconsistencies when you've byte-compiled your config and run a - package management command. - + =core-lib= - + Add ~:append~ support to ~add-transient-hook!~ macro. - + =core-popups= - + Fix over-eager ESC binding killing all popups indiscriminantly - + =core-ui= - + Remove references to ~ace-maximize-window~ (obsolete) - + Fix whitespace adjustment in ~highlight-indentation-current-column-mode~ - + =core-packages= - + Package management now produces colored and detailed feedback. -+ =ui= - + =ui/doom= - + Git-gutter fringe bitmaps no longer appear truncated. - + Fix lack of syntax highlighting in scratch buffer - + Use comment face as default color for ~+doom-folded-face~ - + =ui/doom-modeline= - + Fix modeline disappearing due to loss of state. ~doom--modeline-format~ - was being killed when switching major modes. -+ =feature= - + =feature/eval= - + Fix ~:repl~ & ~+eval/repl-send-region~. - + Fix ~+eval/region~ failing only on first invocation because - ~+eval-runners~ wasn't populated until quickrun is loaded. - + Add TAB auto-completion in comint-mode and REPL buffers - + =feature/evil= - + Fix ~:mv~ & ~:rm~. - + Fix Neotree forgetting that it's a neotree window when switching - perspectives. - + New plugin: [[https://github.com/gabesoft/evil-mc][evil-mc]] -- multiple cursors for evil-mode (thanks to - [[https://github.com/gilbertw1][gilbertw1]]) - + Achieve vim parity w/ file modifiers - (~+evil*ex-replace-special-filenames~) - + =feature/version-control= - + New plugin: [[https://github.com/pidu/git-timemachine][git-timemachine]] -- stepping through a file's git history. - + New plugin: [[https://github.com/sshaw/git-link][git-link]] -- generates and opens links to "this file"'s remote - repo with your default browser. - + Add ~:gbrowse~: find this file on github/gitlab/bitbucket in your browser. - + Add ~:gissues~: open this project's issues page in your browser. - + Fix ~+vcs/git-browse~ and ~+vcs/git-browse-issues~. - + =feature/workspaces= - + Add BANG modifier to ~:cleanup~ to span all workspaces. - + Since persp-mode handles its "nil" perspective differently from others, - pretend that it doesn't exist and spawn a new "main" perspective. -+ =completion= - + =completion/ivy= - + Add ~+ivy-do-action!~ factory macro. Use it for in-ivy keybindings. - + Add ripgrep file search support. Ripgrep doesn't support multiline - searches, but is faster. Use =ag= for multiline (or more PCRE-compliant) - searches. - + Reverse ivy's built-in behavior of reversing escaping of parentheses when - using the_silver_searcher or ripgrep. If you want literal parentheses, - escape them explicitly. - + Removed ~def-counsel-action!~ - + When a selection is used for ~:ag~, the selected text is now - regexp-escaped. -+ =tools= - + =tools/tmux= - + Fix and refactor library (general update). -+ =lang= - + =lang/cc= - + Integrate counsel-ivy into [[https://github.com/Sarcasm/irony-mode][irony-mode]] - + =lang/javascript= - + Improve electric indent support for ~js2-mode~ and ~rjsx-mode~ - + =lang/org= - + Fix org-checkbox-statistics not respecting underlying faces - + Disable ~show-paren-mode~ in org-mode due to conflicts with org-indent - which cause indentation flickering. - + Bind ~M-z~ (~undo~), ~C-u~ (~delete-line~) and ~C-w~ (~delete-word~) in - ~org-store-link~ and ~org-insert-link~ prompts. - + Apply org-headline-done face to checked-checkbox lines, to match how DONE - headlines look. Also applies this to items whose subitems are all - complete. - + Changed default fold behavior when loading an org-file to unfold first - level folds. - + Add =bin/org-capture= shell script for invoking the org-capture frame from - outside Emacs. - + Add babel support for: rust, restclient, sql, google translate, haskell - and go. - + Add ~+org-pretty-mode~ for toggling "pretty" fontification. Prettified - entities or hidden regions can make editing difficult. - + =lang/python= - + Add ipython detection and REPL support - + Simplify matchit key (%) in python. The default is to prioritize if-else - and other blocks over brackets. I found this frustrating. - + =lang/web= - + Fix ~+web-encode-entities~, ~+web-decode-entities~, - ~+web/encode-entities-region~ and ~+web/decode-entities-region~. -+ =app= - + =app/email= - + Replace mbsync with offlineimap. - + Add support for marking multiple emails when in visual-mode (evil) in a - ~mu4e-headers-mode~ buffer. - + Fix trash mark causing duplicates upstream. - + Make refiling more compatible with archiving in gmail. -+ =private/hlissner= - + Add keybinds for [[https://github.com/gabesoft/evil-mc][evil-mc]]: based around ~gz~ (like ~gzz~ to toggle cursor - freeze, and ~gzc~ to create a cursor "here"). - + Add keybinds for [[https://github.com/hlissner/evil-multiedit][evil-multiedit]]: based around ~M-d~ and ~M-D~. - + Replace ~:find~ with ~:ag~, ~:agc[wd]~, ~:rg~ and ~:rgc[wd]~. - + Fix ~:x~ ex command (open scratch buffer) - -* 2.0.1 (Apr 8, 2017) -+ *New modules* - + =feature/jump= -- extra code navigation tools, a jump-to-definition - implementation that just works ([[https://github.com/jacktasia/dumb-jump][dumb-jump]]), and tools for looking things up - online. - + =app/rss= -- Emacs as an RSS reader, using [[https://github.com/skeeto/elfeed][elfeed]] -+ =core= - + Fix ~doom-kill-process-buffers~ not killing process buffers. - + Fix ~hippie-expand~ in ex mode/the minibuffer. - + Remove unnecessary ~provide~'s in core autoloaded libraries. - + Fix ~doom-buffers-in-mode~ not detecting buffers in major-modes derived from - the target mode. - + Fix out-of-bounds error in ~doom/backward-delete-whitespace-to-column~. - + Remove ~doom/append-semicolon~; use evil append mode instead. - + Add module bootstrapping mechanism (for installing external dependencies); - see ~doom-bootstrap~, ~make bootstrap~ and ~def-bootstrap!~. - + Use ~doom-local-dir~ for TRAMP's temp files. - + New variable: ~doom-real-buffer-functions~ -- for customizing how - ~doom-real-buffer-p~ determines what a "real" buffer is. - + Add ~def-memoize!~ for defining memoized functions and ~doom-memoize~ for - memoizing existing ones. - + =core-lib= - + Fix ~remove-hook!~ macro not expanding correctly. - + New macro: ~add-transient-hook!~; attach a hook to a hook or function that - will remove itself once it runs. - + =core-packages= - + Add ~doom/recompile~, for re-byte-compiling DOOM. - + Add ~doom/compile-lite~ / ~make compile-lite~, which will only - byte-compile DOOM's core files, which is a lighter alternative to - ~doom/compile~. - + Fix duplicates packages appearing in package-management retrieval library. - + =core-os= - + Reducing how aggressive ~exec-path~ caching is. A =persistent-soft= /and/ - byte-compilation cache is excessive. The latter is good (and flexible) - enough. - + =core-popups= - + Set default ~:align~ and ~:select~ shackle properties (of =8= and =below=). - + =core-editor= - + Advise ~delete-trailing-whitespace~ to not affect current line. If evil is - loaded, then it may affect the current line if we're *not* in insert mode. - + =core-projects= - + Recognize =package.json= as a project-root file (see - ~projectile-project-root-files~). - + Fix ~:files~ property in ~def-project-mode!~ not detecting project files. - + =core-ui= - + Replace [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides-mode]] with [[https://github.com/antonj/Highlight-Indentation-for-Emacs/][highlight-indentation-mode]]; the - former won't display indent guides on blank lines, even with my whitespace - injection hook. -+ =feature= - + =feature/eval= - + Fix build tasks system; now tested and works. - + Complete rewrite of the module. - + =feature/evil= - + Fix error in ~+evil:file-move~ if ~save-place-mode~ is disabled. - + =feature/snippets= - + Don't hijack TAB in other modes. - + Enable ~yas-triggers-in-field~, which adds support for nested snippets. - + Fix snippet aliases (~%alias~). - + =feature/version-control= - + Remove ~evil-magit~ and evil-ified bindings for magit in general. Instead, - just use emacs mode. If evil is needed, toggle it with =C-z=. - + =feature/workspaces= - + Fix ~+workspace/kill-session~ not actually killing the session. - + Revert forcing persp-mode to stay quiet when it saves the session to file. - It just isn't important enough. - + Create a new perspective when switching projects (integrates projectile - with persp-mode). - + Create a new perspective for new frames. -+ =ui= - + =ui/doom= - + Improve ~doom-buffer-mode~ heuristics with ~doom-real-buffer-p~, so that - only truly real buffers are enlightened. - + Replace plugin [[https://github.com/Malabarba/beacon][beacon]] with [[https://github.com/rolandwalker/nav-flash][nav-flash]] -- the former had a habit of causing - pauses and pushing my cursor. It also didn't look as nice. - + =ui/doom-modeline= - + Complete rewrite of the module for code readability and performance. - + =ui/doom-dashboard= - + Fix a ~max-specpdl-size~ error caused on MacOS, having to do with a - ~kill-buffer-query-function~ hook being attached way too soon in the - startup process. -+ =lang= - + =lang/cc= - + Fix empty ~buffer-file-name~ in ~magic-mode-alist~ rule for obj-c. - + Fix irony-mode initialization in cc modes. - + =lang/emacs-lisp= - + Add xref support for elisp. - + =lang/go= - + Add code-completion support with [[https://github.com/nsf/gocode][gocode and company-go]]. - + Add code navigation support with [[https://github.com/dominikh/go-mode.el/blob/master/go-guru.el][go-guru]] (built-in to go-mode). - + Add REPL support with [[https://github.com/manute/gorepl-mode][gore and gorepl-mode]]. - + =lang/haskell= - + New plugin: [[https://github.com/jyp/dante][dante]] -- offers xref and flycheck integration, as well as - code-navigation tools, like finding definitions, references, type info, - etc. - + Fix errors on haskell-mode (caused by missing dependencies). - + =lang/javascript= - + New plugin: [[https://github.com/skeeto/skewer-mode][skewer-mode]] -- provides live JS/CSS/HTML evaluation in a - browser. - + New plugin: [[https://github.com/yasuyk/web-beautify][web-beautify]] -- js reformatting. - + New plugin: [[https://github.com/NicolasPetton/xref-js2][xref-js2]] -- xref integration for javascript. - + New plugin: [[https://github.com/felipeochoa/rjsx-mode][rjsx-mode]] -- adds jsx support. - + Fix ~doom/newline-and-indent~ in rjsx-mode - + Remove electric =<= in rjsx-mode - + Enable [[https://github.com/smihica/emmet-mode][emmet-mode]] in rjsx-mode - + Fix empty ~buffer-file-name~ in ~magic-mode-alist~ rule for ~rjsx-mode~. - + Force [[https://github.com/ternjs/tern][tern]] use projectile for project path detection and resolution. - + Add gulpfile.js detection (~+javascript-gulp-mode~). - + =lang/latex= - + Improve integration between auctex, evil and ~reftex-toc-mode~: j/k motion - keys have been bound in reftex-toc-mode, the modeline is hidden, and - ~reftex-toc-rescan~ is run automatically. - + =lang/org= - + Add =+notes= submodule, which makes it easy to access org-mode based notes - for the current major-mode or the current project. See - ~+org/browse-notes-for-major-mode~ and ~+org/browse-notes-for-project~. - + Ensure newer org-mode 9.0+ (downloaded from ELPA) is loaded instead of the - older, built-in version of org-mode (8.3). - + Update ~+org/dwim-at-point~, ~+org/insert-item~ & ~+org/toggle-checkbox~ - for org-mode 9.0 - + Fix shackle popup integration with org-export dispatch window. - + =lang/ruby= - + Add ={Pod,Puppet,Berks}file= detection for ~ruby-mode~. - + =lang/web= - + New plugin: [[https://github.com/yasuyk/web-beautify][web-beautify]] -- html/css reformatting - + Remove ~+web-bower-mode~. I don't use it anymore; I prefer npm as my sole - package manager. - + Improve ~+web-angularjs-mode~ detection by searching for angular 1 and 2 - dependencies in package.json. - + Add ~+web-react-mode~ and detect it by searching for reactjs dependencies - in package.json. -+ =app= - + =app/rss= - + Hide modeline in ~elfeed-search-mode~ buffer. - + =app/present= - + New plugin: [[https://github.com/yjwen/org-reveal/][ox-reveal]] -- export a presentation to html, js & css from - org-mode using [[http://lab.hakim.se/reveal-js/][reveal.js]]. - + New plugin: [[https://github.com/takaxp/org-tree-slide][org-tree-slides]] -- use ~org-mode~ directly for presentations. - + Add ~+present/big-mode~; which will toggle large fonts, controlled by - ~+present-big-font~. - + New plugin: [[https://github.com/skeeto/impatient-mode][impatient-mode]] -- show off current buffer(s) over HTTP. - + =app/email= - + Add support for writing emails in org-mode, which renders to HTML on send. - + Add support for sending email through SMTP on a secure port. - + Add basic mu4e support. -+ =private/hlissner= - + Fix TAB hijacking in magit. - -* 2.0.0 (Jan 17, 2017) -+ *New modules* - + =tools/upload= -- map local files to remotes, allowing you to - upload/download files between them. - + =feature/jump= -- offers a system for navigating codebases that "just - works", powered by xref (new experimental Emacs reference API) & [[https://github.com/jacktasia/dumb-jump][dumb-jump]]. - + =feature/workspaces= -- offers grouped buffers/windows and persistent - sessions. Recently replaced [[https://github.com/pashinin/workgroups2][workgroups2]] with the much-faster [[https://github.com/Bad-ptr/persp-mode.el][persp-mode]]. -+ =core= - + Add .travis.yml and unit-tests. - + Remove mplist library -- it was unused and poorly written. - + =core-popups= - + Replaced popwin with shackle; which is significantly lighter and more - stable. -+ =feature/spellcheck= - + Add selection popup for correcting spelling mistakes highlighted by - flyspell. -+ =completion/ivy= - + Add ~+ivy:todo~ for jumping to TODO/FIXME tags in your project. -+ =lang/org= - + Make TAB do-what-I-mean (~+org/dwim-at-point~), which will either: follow a - link, realign/recalculate tables, toggle checkboxes, toggle TODO/DONE tags, - cycle archived subtrees, toggle latex preview fragments, execute babel - blocks, or refresh inline images -- depending on where the cursor is. -+ =lang/web= - + Add ~+css/toggle-inline-or-block~ command; it will expand/contract - curly-braced blocks. -+ =private/hlissner= - + Add ~:todo~ ex command (~+ivy:todo~) - From 03022d09f9e47e6786003a728b020fd59dd30395 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 21:35:58 +0200 Subject: [PATCH 1994/4235] Remove doom//x naming convention This naming convention was meant to be for batch commands, but it grew to include "commands that were helpful with managing Doom", but many of these commands shouldn't be interactive in the first place! --- core/autoload/help.el | 17 +++-- core/autoload/packages.el | 22 +++--- core/autoload/ui.el | 2 +- core/core-dispatcher.el | 109 +++++++++++++--------------- core/core-packages.el | 9 +-- core/core-tests.el | 5 +- core/core-ui.el | 4 +- core/core.el | 4 +- core/test/test-core.el | 4 +- modules/config/default/+bindings.el | 4 +- modules/ui/doom/config.el | 2 +- 11 files changed, 85 insertions(+), 97 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 8b825635d..ce33d49e0 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -217,12 +217,16 @@ whose car is the list of faces and cadr is the list of overlay faces." (list faces overlays)))))) ;;;###autoload -(defun doom//open-manual () +(defalias 'doom/help 'doom/open-manual) + +;;;###autoload +(defun doom/open-manual () + "TODO" (interactive) (find-file (expand-file-name "index.org" doom-docs-dir))) ;;;###autoload -(defun doom//reload (&optional force-p) +(defun doom/reload (&optional force-p) "Reloads your config. This is experimental! If called from a noninteractive session, this will try to communicate with a @@ -236,15 +240,16 @@ init.el and config.el. Then runs `doom-reload-hook'." (cond ((and noninteractive (not (daemonp))) (require 'server) (if (not (server-running-p)) - (doom//reload-autoloads force-p) + (doom-reload-autoloads force-p) (print! "Reloading active Emacs session...") (print! (bold "%%s") - (if (server-eval-at server-name '(doom//reload)) + (if (server-eval-at server-name '(doom/reload)) (green "Done!") (red "There were issues!"))))) - ((let ((load-prefer-newer t)) - (doom//reload-autoloads force-p) + ((progn + (require 'core-packages) + (doom-reload-autoloads force-p) (doom-initialize 'force) (with-demoted-errors "PRIVATE CONFIG ERROR: %s" (doom-initialize-modules 'force)) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index a2e2ecdef..c23ef0607 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -230,7 +230,7 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. -Used by `doom//packages-update'." +Used by `doom-packages-update'." (doom-initialize-packages t) (doom-refresh-packages-maybe doom-debug-mode) (require 'async) @@ -279,7 +279,7 @@ Used by `doom//packages-update'." "Return a list of symbols representing packages that are no longer needed or depended on. -Used by `doom//packages-autoremove'." +Used by `doom-packages-autoremove'." (let ((package-selected-packages (mapcar #'car (doom-get-packages :ignored nil :disabled nil)))) (append (package--removable-packages) @@ -298,7 +298,7 @@ the package symbol, and whose CDR is a plist taken from that package's If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, i.e. they have an :ignore property. -Used by `doom//packages-install'." +Used by `doom-packages-install'." (doom-initialize-packages) (cl-loop for (name . plist) in (doom-get-packages :ignored (if include-ignored-p 'any) :disabled nil) @@ -450,9 +450,8 @@ calls." ;; ;;;###autoload -(defun doom//packages-install (&optional auto-accept-p) +(defun doom-packages-install (&optional auto-accept-p) "Interactive command for installing missing packages." - (interactive "P") (print! "Looking for packages to install...") (let ((packages (reverse (doom-get-missing-packages)))) (cond ((not packages) @@ -511,9 +510,8 @@ calls." success))))) ;;;###autoload -(defun doom//packages-update (&optional auto-accept-p) +(defun doom-packages-update (&optional auto-accept-p) "Interactive command for updating packages." - (interactive "P") (print! "Looking for outdated packages...") (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp :key #'car))) @@ -555,9 +553,8 @@ calls." success))))) ;;;###autoload -(defun doom//packages-autoremove (&optional auto-accept-p) +(defun doom-packages-autoremove (&optional auto-accept-p) "Interactive command for auto-removing orphaned packages." - (interactive "P") (print! "Looking for orphaned packages...") (let ((packages (doom-get-orphaned-packages))) (cond ((not packages) @@ -609,7 +606,8 @@ calls." ;; Replace with Doom variants ;;;###autoload -(advice-add #'package-autoremove :override #'doom//packages-autoremove) -;;;###autoload -(advice-add #'package-install-selected-packages :override #'doom//packages-install) +(advice-add #'package-autoremove :override (λ! (doom-packages-autoremove current-prefix-arg))) + +;;;###autoload +(advice-add #'package-install-selected-packages :override (λ! (doom-packages-install current-prefix-arg))) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index a3056e886..82f89cdf7 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -95,7 +95,7 @@ presentations." (set-frame-font doom-font t t))) ;;;###autoload -(defun doom//reload-theme () +(defun doom/reload-theme () "Reset the current color theme and fonts." (interactive) (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 2e74acf62..f6bac5709 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -14,8 +14,8 @@ (defvar doom-auto-accept (getenv "YES") "If non-nil, Doom will auto-accept any confirmation prompts during batch -commands like `doom//packages-install', `doom//packages-update' and -`doom//packages-autoremove'.") +commands like `doom-packages-install', `doom-packages-update' and +`doom-packages-autoremove'.") (defconst doom--dispatch-command-alist ()) (defconst doom--dispatch-alias-alist ()) @@ -213,21 +213,19 @@ recompile. Run this whenever you: (string-match-p "[^ \t\n]" (buffer-string)) (error "Failed to check working tree in %s" dir))))) -(defun doom//refresh (&optional force-p) +(defun doom-refresh (&optional force-p) "Ensure Doom is in a working state by checking autoloads and packages, and recompiling any changed compiled files. This is the shotgun solution to most problems with doom." - (interactive "P") - (doom//reload-doom-autoloads force-p) + (doom-reload-doom-autoloads force-p) (unwind-protect - (progn (ignore-errors (doom//packages-autoremove doom-auto-accept)) - (ignore-errors (doom//packages-install doom-auto-accept))) - (doom//reload-package-autoloads force-p) - (doom//byte-compile nil 'recompile))) + (progn (ignore-errors (doom-packages-autoremove doom-auto-accept)) + (ignore-errors (doom-packages-install doom-auto-accept))) + (doom-reload-package-autoloads force-p) + (doom-byte-compile nil 'recompile))) -(defun doom//upgrade () +(defun doom-upgrade () "Upgrade Doom to the latest version non-destructively." - (interactive) (require 'vc-git) (let* ((gitdir (expand-file-name ".git" doom-emacs-dir)) (branch (vc-git--symbolic-ref doom-emacs-dir)) @@ -251,29 +249,28 @@ problems with doom." (unless (zerop (process-file "git" nil buf nil "fetch" "--tags" doom-repo-remote branch)) (error "Failed to fetch from upstream")) - (when - (let ((current-rev (vc-git-working-revision doom-emacs-dir)) - (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) - (unless rev - (error "Couldn't detect Doom's version. Is %s a repo?" - (abbreviate-file-name doom-emacs-dir))) - (when (equal current-rev rev) - (user-error "Doom is up to date!")) - (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" - current-rev rev) - ;; TODO Display newsletter diff - (unless (or doom-auto-accept (y-or-n-p "Proceed?")) - (error "Aborted")) - (message "Removing byte-compiled files from your config (if any)") - (doom//clean-byte-compiled-files) - (unless (zerop (process-file "git" nil buf nil "reset" "--hard" - (format "%s/%s" doom-repo-remote branch))) - (error "An error occurred while checking out the latest commit\n\n%s" - (buffer-string))) - (unless (equal (vc-git-working-revision doom-emacs-dir) rev) - (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) - (doom//refresh 'force) - (message "Done! Please restart Emacs for changes to take effect")))) + (let ((current-rev (vc-git-working-revision doom-emacs-dir)) + (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) + (unless rev + (error "Couldn't detect Doom's version. Is %s a repo?" + (abbreviate-file-name doom-emacs-dir))) + (when (equal current-rev rev) + (user-error "Doom is up to date!")) + (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" + current-rev rev) + ;; TODO Display newsletter diff + (unless (or doom-auto-accept (y-or-n-p "Proceed?")) + (error "Aborted")) + (message "Removing byte-compiled files from your config (if any)") + (doom-clean-byte-compiled-files) + (unless (zerop (process-file "git" nil buf nil "reset" "--hard" + (format "%s/%s" doom-repo-remote branch))) + (error "An error occurred while checking out the latest commit\n\n%s" + (buffer-string))) + (unless (equal (vc-git-working-revision doom-emacs-dir) rev) + (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) + (doom-refresh 'force) + (message "Done! Please restart Emacs for changes to take effect"))) (user-error (message "%s Aborting." (error-message-string e))) (error @@ -281,12 +278,11 @@ problems with doom." (car e) (buffer-string)))))))) -(defun doom//quickstart () +(defun doom-quickstart () "Quickly deploy a private module and Doom. This deploys a barebones config to `doom-private-dir', installs all missing packages and regenerates the autoloads file." - (interactive) (let ((short-private-dir (abbreviate-file-name doom-private-dir))) (if (file-directory-p doom-private-dir) (print! (yellow "%s directory already exists. Skipping." short-private-dir)) @@ -307,9 +303,9 @@ packages and regenerates the autoloads file." (with-temp-file config-file (insert "")) (print! (green "Done!"))))) (print! "Installing plugins") - (doom//packages-install) + (doom-packages-install) (print! "Regenerating autoloads files") - (doom//reload-autoloads nil 'force-p) + (doom-reload-autoloads nil 'force-p) (print! (bold (green "\nFinished! Doom is ready to go!\n"))) (with-temp-buffer (doom-template-insert "QUICKSTART_INTRO") @@ -357,24 +353,22 @@ it exists." short-name (car ex) (error-message-string ex)))))) -(defun doom//reload-autoloads (&optional file force-p) +(defun doom-reload-autoloads (&optional file force-p) "Reloads FILE (an autoload file), if it needs reloading. FILE should be one of `doom-autoload-file' or `doom-package-autoload-file'. If it is nil, it will try to reload both. If FORCE-P (universal argument) do it even if it doesn't need reloading!" - (interactive - (list nil current-prefix-arg)) (or (null file) (stringp file) (signal 'wrong-type-argument (list 'stringp file))) (cond ((equal file doom-autoload-file) - (doom//reload-doom-autoloads force-p)) + (doom-reload-doom-autoloads force-p)) ((equal file doom-package-autoload-file) - (doom//reload-package-autoloads force-p)) + (doom-reload-package-autoloads force-p)) ((progn - (doom//reload-doom-autoloads force-p) - (doom//reload-package-autoloads force-p))))) + (doom-reload-doom-autoloads force-p) + (doom-reload-package-autoloads force-p))))) ;; @@ -493,7 +487,7 @@ even if it doesn't need reloading!" (when (re-search-forward "^;;\\(;[^\n]*\\| no-byte-compile: t\\)\n" nil t) (replace-match "" t t))) -(defun doom//reload-doom-autoloads (&optional force-p) +(defun doom-reload-doom-autoloads (&optional force-p) "Refreshes the autoloads.el file, specified by `doom-autoload-file', if necessary (or if FORCE-P is non-nil). @@ -503,7 +497,6 @@ Emacs where to find lazy-loaded functions. This should be run whenever your `doom!' block, or a module autoload file, is modified." - (interactive) (let* ((default-directory doom-emacs-dir) (doom-modules (doom-modules)) (targets @@ -538,7 +531,7 @@ modified." (message "Generating new autoloads.el") (make-directory (file-name-directory doom-autoload-file) t) (with-temp-file doom-autoload-file - (doom--generate-header 'doom//reload-doom-autoloads) + (doom--generate-header 'doom-reload-doom-autoloads) (save-excursion (doom--generate-autoloads (reverse enabled-targets))) ;; Replace autoload paths (only for module autoloads) with absolute @@ -596,7 +589,7 @@ modified." (goto-char (match-beginning 1)) (kill-sexp))) -(defun doom//reload-package-autoloads (&optional force-p) +(defun doom-reload-package-autoloads (&optional force-p) "Compiles `doom-package-autoload-file' from the autoloads files of all installed packages. It also caches `load-path', `Info-directory-list', `doom-disabled-packages', `package-activated-list' and `auto-mode-alist'. @@ -605,7 +598,6 @@ Will do nothing if none of your installed packages have been modified. If FORCE-P (universal argument) is non-nil, regenerate it anyway. This should be run whenever your `doom!' block or update your packages." - (interactive) (if (and (not force-p) (not doom-emacs-changed-p) (file-exists-p doom-package-autoload-file) @@ -620,7 +612,7 @@ This should be run whenever your `doom!' block or update your packages." (let (case-fold-search) (doom-delete-autoloads-file doom-package-autoload-file) (with-temp-file doom-package-autoload-file - (doom--generate-header 'doom//reload-package-autoloads) + (doom--generate-header 'doom-reload-package-autoloads) (save-excursion ;; Cache the important and expensive-to-initialize state here. (doom--generate-var-cache) @@ -643,7 +635,7 @@ This should be run whenever your `doom!' block or update your packages." ;; Byte compilation ;; -(defun doom//byte-compile (&optional modules recompile-p) +(defun doom-byte-compile (&optional modules recompile-p) "Byte compiles your emacs configuration. init.el is always byte-compiled by this. @@ -656,12 +648,10 @@ WARNING: byte-compilation yields marginal gains and makes debugging new issues difficult. It is recommended you don't use it unless you understand the reprecussions. -Use `doom//clean-byte-compiled-files' or `make clean' to reverse +Use `doom-clean-byte-compiled-files' or `make clean' to reverse byte-compilation. If RECOMPILE-P is non-nil, only recompile out-of-date files." - (interactive - (list nil current-prefix-arg)) (let ((default-directory doom-emacs-dir) (total-ok 0) (total-fail 0) @@ -704,8 +694,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (message "Aborting.") (cl-return-from 'byte-compile))) (unless recompile-p - (doom//clean-byte-compiled-files) - (doom//reload-autoloads)) + (doom-clean-byte-compiled-files) + (doom-reload-autoloads)) (let (doom-emacs-changed-p noninteractive) ;; But first we must be sure that Doom and your private config have @@ -767,13 +757,12 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "There were breaking errors." (error-message-string ex) "Reverting changes...") - (quiet! (doom//clean-byte-compiled-files)) + (quiet! (doom-clean-byte-compiled-files)) (print! (yellow "Finished (nothing was byte-compiled)")))))))) -(defun doom//clean-byte-compiled-files () +(defun doom-clean-byte-compiled-files () "Delete all the compiled elc files in your Emacs configuration and private module. This does not include your byte-compiled, third party packages.'" - (interactive) (cl-loop with default-directory = doom-emacs-dir for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) diff --git a/core/core-packages.el b/core/core-packages.el index 54f4e0ef6..2933791eb 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -6,12 +6,9 @@ ;; ;; The three key commands are: ;; -;; + `bin/doom install` or `doom//packages-install': Installs packages that are -;; wanted, but not installed. -;; + `bin/doom update` or `doom//packages-update': Updates packages that are -;; out-of-date. -;; + `bin/doom autoremove` or `doom//packages-autoremove': Uninstalls packages -;; that are no longer needed. +;; + `bin/doom install`: Installs packages that are wanted, but not installed. +;; + `bin/doom update`: Updates packages that are out-of-date. +;; + `bin/doom autoremove`: Uninstalls packages that are no longer needed. ;; ;; This system reads packages.el files located in each activated module (and one ;; in `doom-core-dir'). These contain `package!' blocks that tell DOOM what diff --git a/core/core-tests.el b/core/core-tests.el index efcb89a8b..10db96efe 100644 --- a/core/core-tests.el +++ b/core/core-tests.el @@ -1,16 +1,15 @@ ;;; core/core-tests.el -*- lexical-binding: t; -*- -(defun doom//run-tests (&optional modules) +(defun doom-run-tests (&optional modules) "Run all loaded tests, specified by MODULES (a list of module cons cells) or command line args following a double dash (each arg should be in the 'module/submodule' format). If neither is available, run all tests in all enabled modules." - (interactive) (let (noninteractive) ;; Core libraries aren't fully loaded in a noninteractive session, so we ;; reload it with `noninteractive' set to nil to force them to. - (quiet! (doom//reload-autoloads)) + (quiet! (doom-reload-autoloads)) (doom-initialize t)) (let ((target-paths ;; Convert targets into a list of string paths, pointing to the root diff --git a/core/core-ui.el b/core/core-ui.el index 21a2305f8..d2d8147d2 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -30,7 +30,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (defvar doom-load-theme-hook nil "Hook run when the theme (and font) is initialized (or reloaded -with `doom//reload-theme').") +with `doom/reload-theme').") (defvar doom-before-switch-window-hook nil "Hook run before `switch-window' or `switch-frame' are called. See @@ -578,7 +578,7 @@ frame's window-system, the theme will be reloaded.") ;; out daemon and emacsclient frames. ;; ;; There will still be issues with simultaneous gui and terminal (emacsclient) -;; frames, however. There's always `doom//reload-theme' if you need it! +;; frames, however. There's always `doom/reload-theme' if you need it! (defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." (when (and (framep frame) diff --git a/core/core.el b/core/core.el index b67f37553..c64cb65f7 100644 --- a/core/core.el +++ b/core/core.el @@ -70,10 +70,10 @@ Use this for files that change often, like cache files.") XDG directory conventions if ~/.config/doom exists.") (defconst doom-autoload-file (concat doom-local-dir "autoloads.el") - "Where `doom//reload-doom-autoloads' will generate its core autoloads file.") + "Where `doom-reload-doom-autoloads' will generate its core autoloads file.") (defconst doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el") - "Where `doom//reload-package-autoloads' will generate its package.el autoloads + "Where `doom-reload-package-autoloads' will generate its package.el autoloads file.") diff --git a/core/test/test-core.el b/core/test/test-core.el index 437df8173..4e69aa1e4 100644 --- a/core/test/test-core.el +++ b/core/test/test-core.el @@ -11,8 +11,8 @@ (spy-on 'require) (spy-on 'load) - (spy-on 'doom//reload-doom-autoloads) - (spy-on 'doom//reload-package-autoloads) + (spy-on 'doom-reload-doom-autoloads) + (spy-on 'doom-reload-package-autoloads) (spy-on 'doom-initialize-autoloads) (spy-on 'doom-ensure-core-directories) (spy-on 'doom-ensure-core-packages) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 8fb861da9..346832cbd 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -628,8 +628,8 @@ :desc "View *Messages*" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode :desc "Toggle profiler" :n "p" #'doom/toggle-profiler - :desc "Reload theme" :n "r" #'doom//reload-theme - :desc "Reload private config" :n "R" #'doom//reload + :desc "Reload theme" :n "r" #'doom/reload-theme + :desc "Reload private config" :n "R" #'doom/reload :desc "Describe DOOM setting" :n "s" #'doom/describe-setters :desc "Describe variable" :n "v" #'describe-variable :desc "Print Doom version" :n "V" #'doom/version diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 81846cb29..6dbac3128 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -30,7 +30,7 @@ :config ;; Reload common faces when reloading doom-themes live (defun +doom*reload-common (&rest _) (load "doom-themes-common.el" nil t)) - (advice-add #'doom//reload-theme :before #'+doom*reload-common) + (advice-add #'doom/reload-theme :before #'+doom*reload-common) ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) From faf09288ceb1d658cc9bbf092ba4ab9c4a47b512 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 21:38:30 +0200 Subject: [PATCH 1995/4235] Major refactor of core-dispatcher --- core/core-dispatcher.el | 108 ++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index f6bac5709..a5a6ac42f 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -63,15 +63,14 @@ omitted, show all available commands, their aliases and brief descriptions." (apply #'doom--dispatch-help command desc (cdr args)) (funcall body (cdr args)))))) -;; FIXME Clumsy way of registering commands, refactor! -(defmacro def-dispatcher! (command desc &rest body) +(defmacro dispatcher! (command form &optional docstring) "Define a dispatcher command. COMMAND is a symbol or a list of symbols representing the aliases for this command. DESC is a string description. The first line should be short (under 60 letters), as it will be displayed for bin/doom help. BODY will be run when this dispatcher is called." - (declare (doc-string 2)) + (declare (doc-string 3)) (let* ((command (doom-enlist command)) (cmd (car command)) (aliases (cdr command))) @@ -80,9 +79,9 @@ BODY will be run when this dispatcher is called." `(dolist (alias ',aliases) (map-put doom--dispatch-alias-alist alias ',cmd))) (map-put doom--dispatch-command-alist - ',cmd (list :desc ,desc + ',cmd (list :desc ,docstring ;; FIXME Implicit args var; ew - :body (lambda (args) ,@body)))))) + :body (lambda (args) ,form)))))) ;; @@ -90,7 +89,7 @@ BODY will be run when this dispatcher is called." ;; ;; Dummy dispatchers (no-op because they're handled especially) -(def-dispatcher! run +(dispatcher! run :noop "Run Doom Emacs from bin/doom's parent directory. All arguments are passed on to Emacs (except for -p and -e). @@ -102,14 +101,15 @@ WARNING: this command exists for convenience and testing. Doom will suffer additional overhead for be started this way. For the best performance, it is best to run Doom out of ~/.emacs.d and ~/.doom.d.") -(def-dispatcher! (doctor doc) +(dispatcher! (doctor doc) :noop "Checks for issues with your current Doom config.") -(def-dispatcher! (help h) +(dispatcher! (help h) :noop "Look up additional information about a command.") + ;; Real dispatchers -(def-dispatcher! (quickstart qs) +(dispatcher! (quickstart qs) (doom-quickstart) "Quickly deploy a private module and Doom. This deploys a barebones config to ~/.doom.d. The destination can be changed @@ -118,39 +118,28 @@ with the -p option, e.g. doom -p ~/.config/doom quickstart This command will refuse to overwrite the private directory if it already -exists." - (doom//quickstart)) +exists.") -(def-dispatcher! (install i) - "Installs requested plugins that aren't installed." - (doom//reload-doom-autoloads) - (when (doom//packages-install doom-auto-accept) - (doom//reload-package-autoloads))) +(dispatcher! (install i) (doom--do 'doom-packages-install) + "Installs requested plugins that aren't installed.") -(def-dispatcher! (update u) - "Checks for and updates outdated plugins." - (doom//reload-doom-autoloads) - (when (doom//packages-update doom-auto-accept) - (doom//reload-package-autoloads))) +(dispatcher! (update u) (doom--do 'doom-packages-update) + "Installs requested plugins that aren't installed.") -(def-dispatcher! (autoremove r) - "Removes orphaned plugins." - (doom//reload-doom-autoloads) - (when (doom//packages-autoremove doom-auto-accept) - (doom//reload-package-autoloads))) +(dispatcher! (autoremove r) (doom--do 'doom-packages-autoremove) + "Installs requested plugins that aren't installed.") -(def-dispatcher! (autoloads a) +(dispatcher! (autoloads a) (doom-reload-autoloads nil 'force) "Regenerates Doom's autoloads file. This file tells Emacs where to find your module's autoloaded functions and -plugins." - (doom//reload-autoloads nil 'force)) +plugins.") -(def-dispatcher! (upgrade up) - "Checks out the latest Doom on this branch." - (doom//upgrade)) -(def-dispatcher! (compile c) +(dispatcher! (upgrade up) (doom-upgrade) + "Checks out the latest Doom on this branch.") + +(dispatcher! (compile c) (doom-byte-compile args) "Byte-compiles your config or selected modules. compile [TARGETS...] @@ -159,31 +148,38 @@ plugins." Accepts :core, :private and :plugins as special arguments, indicating you want to byte-compile Doom's core files, your private config or your ELPA plugins, -respectively." - (doom//byte-compile args)) +respectively.") -(def-dispatcher! (recompile rc) - "Re-byte-compiles outdated *.elc files." - (doom//byte-compile args 'recompile)) +(dispatcher! (compile c) (doom-byte-compile args) + "Byte-compiles your config or selected modules. -(def-dispatcher! clean - "Delete all *.elc files." - (doom//clean-byte-compiled-files)) + compile [TARGETS...] + compile :core :private lang/python + compile feature lang -(def-dispatcher! test - "Run Doom unit tests." - (require 'core-tests) - (doom//run-tests args)) +Accepts :core, :private and :plugins as special arguments, indicating you want +to byte-compile Doom's core files, your private config or your ELPA plugins, +respectively.") -(def-dispatcher! info - "Output system info in markdown for bug reports." - (doom/info)) +(dispatcher! (recompile rc) (doom-byte-compile args 'recompile) + "Re-byte-compiles outdated *.elc files.") -(def-dispatcher! (version v) - "Reports the version of Doom and Emacs." - (doom/version)) +(dispatcher! clean (doom-clean-byte-compiled-files) + "Delete all *.elc files.") -(def-dispatcher! (refresh re) + +(dispatcher! test + (progn (require 'core-tests) + (doom-run-tests args)) + "Run Doom unit tests.") + +(dispatcher! info (doom/info) + "Output system info in markdown for bug reports.") + +(dispatcher! (version v) (doom/version) + "Reports the version of Doom and Emacs.") + +(dispatcher! (refresh re) (doom-refresh) "Refresh Doom. Same as autoremove+install+autoloads. This is the equivalent of running autoremove, install, autoloads, then @@ -192,8 +188,7 @@ recompile. Run this whenever you: 1. Modify your `doom!' block, 2. Add or remove `package!' blocks to your config, 3. Add or remove autoloaded functions in module autoloaded files. - 4. Update Doom outside of Doom (e.g. with git)" - (doom//refresh)) + 4. Update Doom outside of Doom (e.g. with git)") ;; @@ -334,6 +329,11 @@ it exists." (ignore-errors (delete-file (byte-compile-dest-file file))) (message "Deleted old %s" (file-name-nondirectory file)))) +(defun doom--do (fn) + (doom-reload-doom-autoloads) + (when (funcall fn doom-auto-accept) + (doom-reload-package-autoloads))) + (defun doom--server-load (file) (require 'server) (when (server-running-p) From 0a20159eeeb9d1899dce1df45a26560ac89055bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 21:38:53 +0200 Subject: [PATCH 1996/4235] Check doom-packages-dir mtime Now that package management commands update its mtime manually, this is the most reliable method of detecting package changes. --- core/core-dispatcher.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index a5a6ac42f..cd632fe17 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -601,7 +601,7 @@ This should be run whenever your `doom!' block or update your packages." (if (and (not force-p) (not doom-emacs-changed-p) (file-exists-p doom-package-autoload-file) - (not (file-newer-than-file-p package-user-dir doom-package-autoload-file)) + (not (file-newer-than-file-p doom-packages-dir doom-package-autoload-file)) (not (ignore-errors (cl-loop for key being the hash-keys of (doom-modules) for path = (doom-module-path (car key) (cdr key) "packages.el") From 26caea7f2bcd887024e2aa1e0934051135b5b47b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 21:39:40 +0200 Subject: [PATCH 1997/4235] Move doom-docs-dir to core.el --- core/autoload/help.el | 3 --- core/core.el | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index ce33d49e0..ec5aa41c3 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -41,9 +41,6 @@ (stylus-mode :lang web)) "TODO") -(defvar doom-docs-dir (concat doom-emacs-dir "docs/") - "TODO") - ;; ;; Helpers diff --git a/core/core.el b/core/core.el index c64cb65f7..cf29ad423 100644 --- a/core/core.el +++ b/core/core.el @@ -57,6 +57,9 @@ Use this for files that change often, like cache files.") (defconst doom-packages-dir (concat doom-local-dir "packages/") "Where package.el and quelpa plugins (and their caches) are stored.") +(defconst doom-docs-dir (concat doom-emacs-dir "docs/") + "Where the Doom manual is stored.") + (defconst doom-private-dir (eval-when-compile (or (getenv "DOOMDIR") From 97b42c449bedf0e7ce6a602aa0dd85797e49c488 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 21:40:32 +0200 Subject: [PATCH 1998/4235] Allow set-company-backend! to unset backends Passing nil as its second argument will unset previously set backends. --- modules/completion/company/autoload.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index dfbcc6746..d9934721b 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -6,15 +6,20 @@ MODES should be one major-mode symbol or a list of them." (dolist (mode (doom-enlist modes)) - (let ((def-name (intern (format "+company|init-%s" mode)))) - (fset def-name - (lambda () (when (or (eq major-mode mode) - (and (boundp mode) (symbol-value mode))) - (require 'company) - (make-variable-buffer-local 'company-backends) - (dolist (backend backends) - (cl-pushnew backend company-backends :test #'equal))))) - (add-hook (intern (format "%s-hook" mode)) def-name)))) + (let ((fn (intern (format "+company|init-%s" mode))) + (hook (intern (format "%s-hook" mode)))) + (cond (backends + (fset fn + (lambda () (when (or (eq major-mode mode) + (and (boundp mode) (symbol-value mode))) + (require 'company) + (make-variable-buffer-local 'company-backends) + (dolist (backend backends) + (cl-pushnew backend company-backends :test #'equal))))) + (add-hook hook fn)) + (t + (fmakunbound fn) + (remove-hook hook fn)))))) ;; FIXME obsolete :company-backend ;;;###autoload From 68903ae398291a17c52513251c785f0d16d6ca11 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 21:41:44 +0200 Subject: [PATCH 1999/4235] Set exec-path-from-shell-debug instead of aliasing Also fixes the defvaralias error that occurs on the latest Emacs (but only on MacOS). --- core/core-os.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 8469faeb8..c1f57ad83 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -39,8 +39,8 @@ "Inject VARS from your shell environment into Emacs." (exec-path-from-shell-copy-envs vars)) (setq exec-path-from-shell-check-startup-files nil - exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments)) - (defvaralias 'exec-path-from-shell-debug 'doom-debug-mode) + exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments) + exec-path-from-shell-debug doom-debug-mode) (exec-path-from-shell-initialize)))) (IS-LINUX From 3ac7ec5120d2a73f43ba0e16d9ca6500fe0a9736 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Jun 2018 22:21:32 +0200 Subject: [PATCH 2000/4235] Bind C-s to minibuffer-history search in helm/ivy --- modules/config/default/+bindings.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 346832cbd..3edf3f22d 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -339,6 +339,7 @@ "C-u" #'helm-delete-minibuffer-contents "C-w" #'backward-kill-word "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! + "C-s" #'helm-minibuffer-history "C-b" #'backward-word [left] #'backward-char [right] #'forward-char @@ -777,6 +778,9 @@ ;; Restore common editing keys (and ESC) in minibuffer (defun +default|fix-minibuffer-in-map (map) (define-key! map + "\C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history) "\C-a" #'move-beginning-of-line "\C-w" #'backward-kill-word "\C-u" #'backward-kill-sentence From 4e5c8b6052e3e90817cbe68b897f878daadede1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 01:55:37 +0200 Subject: [PATCH 2001/4235] Improve autoload generator Adds support for defalias and arbitrary forms. --- core/core-dispatcher.el | 105 +++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 44 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index cd632fe17..06d8a1529 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -434,49 +434,65 @@ even if it doesn't need reloading!" (file-in-directory-p path doom-core-dir))) forms) (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) - (let ((sexp (sexp-at-point)) - (pred (match-string 1))) - (if (not (memq (car sexp) '(defun defmacro cl-defun cl-defmacro))) - (message "Ignoring invalid autodef %s (found %s)" - name type) - (cl-destructuring-bind (type name arglist docstring &rest body) sexp - (unless (stringp docstring) - (push docstring body) - (setq docstring "No documentation.")) - (let ((origin (cond ((doom-module-from-path path)) - ((file-in-directory-p path doom-private-dir) - `(:private . ,(intern (file-name-base path)))) - ((file-in-directory-p path doom-emacs-dir) - `(:core . ,(intern (file-name-base path)))))) - (doom-file-form - `(put ',name 'doom-file ,(abbreviate-file-name path)))) - (push (cond ((not (and member-p - (or (null pred) - (eval (read pred) t)))) - (push doom-file-form forms) - (condition-case-unless-debug e - (append - (list 'defmacro name arglist - (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" - origin - docstring)) - (cl-loop for arg in arglist - if (and (symbolp arg) - (not (keywordp arg)) - (not (memq arg cl--lambda-list-keywords))) - collect (list 'ignore arg) - else if (listp arg) - collect (list 'ignore (car arg)))) - ('error - (message "Ignoring autodef %s (%s)" - name e) - nil))) - ((memq type '(defmacro cl-defmacro)) - (push doom-file-form forms) - sexp) - ((make-autoload sexp path))) - forms) - (push `(put ',name 'doom-module ',origin) forms)))))) + (let* ((sexp (sexp-at-point)) + (pred (match-string 1)) + (type (car sexp)) + (name (doom-unquote (cadr sexp))) + (origin (cond ((doom-module-from-path path)) + ((file-in-directory-p path doom-private-dir) + `(:private . ,(intern (file-name-base path)))) + ((file-in-directory-p path doom-emacs-dir) + `(:core . ,(intern (file-name-base path)))))) + (doom-file-form + `(put ',name 'doom-file ,(abbreviate-file-name path)))) + (cond ((memq type '(defun defmacro cl-defun cl-defmacro)) + (cl-destructuring-bind (type name arglist &rest body) sexp + (let ((docstring (if (stringp (car body)) + (pop body) + "No documentation."))) + (push (cond ((not (and member-p + (or (null pred) + (eval (read pred) t)))) + (push doom-file-form forms) + (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" + origin docstring)) + (condition-case-unless-debug e + (append (list 'defmacro name arglist docstring) + (cl-loop for arg in arglist + if (and (symbolp arg) + (not (keywordp arg)) + (not (memq arg cl--lambda-list-keywords))) + collect (list 'ignore arg) + else if (listp arg) + collect (list 'ignore (car arg)))) + ('error + (message "Ignoring autodef %s (%s)" + name e) + nil))) + ((memq type '(defmacro cl-defmacro)) + (push doom-file-form forms) + sexp) + ((make-autoload sexp path))) + forms) + (push `(put ',name 'doom-module ',origin) forms)))) + + ((eq type 'defalias) + (cl-destructuring-bind (type name target &optional docstring) sexp + (let ((name (doom-unquote name)) + (target (doom-unquote target))) + (unless (and member-p + (or (null pred) + (eval (read pred) t))) + (setq target #'ignore)) + (push doom-file-form forms) + (push `(put ',name 'doom-module ',origin) forms) + (push `(defalias ',name #',target ,docstring) + forms)))) + + ((and member-p + (or (null pred) + (eval (read pred) t))) + (push sexp forms))))) (if forms (concat (string-join (mapcar #'prin1-to-string (reverse forms)) "\n") "\n") @@ -543,7 +559,8 @@ modified." ;; modules, so that you will never get a void-function when you use ;; them. (save-excursion - (doom--generate-autodefs (reverse targets) enabled-targets)) + (doom--generate-autodefs (reverse targets) enabled-targets) + (print! (green "✓ Generated autodefs"))) ;; Remove byte-compile inhibiting file variables so we can byte-compile ;; the file, and autoload comments. (doom--cleanup-autoloads) From 6808c46b580c36acddaf80b7305c9b66163b2339 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 02:26:05 +0200 Subject: [PATCH 2002/4235] :boom: Change set-popup-rule! usage Now accepts a flat plist of all its former parameters, including new :parameters and :actions properties to increase your control over the fate of your windows. The old usage of set-popup-rule! is deprecated and may not work right! The :ui popup module has also seen a major refactor to improve efficiency and load times. Sorry! This is the last "big" change before 2.1! --- modules/app/regex/config.el | 8 +- modules/app/rss/config.el | 4 +- modules/app/twitter/config.el | 4 +- modules/completion/helm/config.el | 4 +- modules/completion/ivy/config.el | 2 +- modules/emacs/imenu/config.el | 3 +- modules/feature/debugger/config.el | 3 +- modules/feature/eval/config.el | 2 +- modules/feature/evil/config.el | 4 +- modules/feature/version-control/+git.el | 2 +- modules/feature/version-control/config.el | 4 +- modules/lang/clojure/config.el | 2 +- modules/lang/latex/config.el | 2 +- modules/lang/org/+babel.el | 16 +- modules/lang/org/config.el | 15 +- modules/lang/plantuml/config.el | 2 +- modules/lang/python/config.el | 4 +- modules/lang/rest/config.el | 2 +- modules/tools/ein/config.el | 8 +- modules/tools/magit/config.el | 2 +- modules/tools/password-store/config.el | 4 +- modules/tools/pdf/config.el | 6 +- modules/ui/neotree/config.el | 4 +- modules/ui/popup/autoload/popup.el | 172 ++++------------ modules/ui/popup/autoload/settings.el | 200 +++++++++++++++---- modules/ui/popup/config.el | 228 +++++++++++----------- 26 files changed, 356 insertions(+), 351 deletions(-) diff --git a/modules/app/regex/config.el b/modules/app/regex/config.el index 539297e46..f48488d01 100644 --- a/modules/app/regex/config.el +++ b/modules/app/regex/config.el @@ -47,10 +47,6 @@ https://mediatemple.net" "TODO") (set-popup-rules! - '(("^\\*doom-regex\\*$" - ((size . 4)) - ((quit))) - ("^\\*doom-regex-groups" - ((side . left) (size . 28)) - ((select) (quit))))) + '(("^\\*doom-regex\\*$" :size 4 :quit nil) + ("^\\*doom-regex-groups" :side 'left :size 28 :select nil :quit nil))) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 4710079e5..abe04731e 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -27,8 +27,8 @@ absolute paths.") shr-max-image-proportion 0.6) (set-popup-rule! "^\\*elfeed-entry" - '((size . 0.75) (side . bottom)) - '((select . t) (quit) (transient . t))) + :size 0.75 :side 'bottom + :select t :quit nil :ttl t) (make-directory elfeed-db-directory t) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index ed7075592..c3a869468 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -25,9 +25,7 @@ twittering-initial-timeline-spec-string '(":home" ":mentions" ":direct_messages")) - (set-popup-rule! "^\\*twittering-edit" - '((size . 15)) - '((transient) (quit) (select . t))) + (set-popup-rule! "^\\*twittering-edit" :size 15 :ttl nil :quit nil :select t) (defface twitter-divider '((((background dark)) (:underline (:color "#141519"))) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index a4a8a4537..19dd7b65f 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -94,9 +94,7 @@ ;; `helm-ag' (after! helm-ag (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) - (set-popup-rule! "^\\*helm-ag-edit" - '((size . 0.35)) - '((transient . 0) (quit)))) + (set-popup-rule! "^\\*helm-ag-edit" :size 0.35 :ttl 0 :quit nil)) ;; `helm-bookmark' diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index b2d697f49..3661f8f60 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -86,7 +86,7 @@ immediately runs it on the current candidate (ending the ivy session)." [remap swiper] #'counsel-grep-or-swiper) :config - (set-popup-rule! "^\\*ivy-occur" '((size . 0.35)) '((transient . 0) (quit))) + (set-popup-rule! "^\\*ivy-occur" :size 0.35 :ttl 0 :quit nil) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)" ;; Add smart-casing and compressed archive searching (-zS) to default diff --git a/modules/emacs/imenu/config.el b/modules/emacs/imenu/config.el index 37cd79361..de82a401e 100644 --- a/modules/emacs/imenu/config.el +++ b/modules/emacs/imenu/config.el @@ -8,8 +8,7 @@ (setq imenu-list-idle-update-delay 0.5) (set-popup-rule! "^\\*Ilist" - '((side . right) (size . 35)) - '((quit . current) (select) (transient . 0))) + :side 'right :size 35 :quit 'current :select nil :ttl 0) (defun +imenu|cleanup-on-popup-close () "Clean up after `imenu-list-minor-mode' when killing the list window." diff --git a/modules/feature/debugger/config.el b/modules/feature/debugger/config.el index 77d0858e2..49d3e3856 100644 --- a/modules/feature/debugger/config.el +++ b/modules/feature/debugger/config.el @@ -3,8 +3,7 @@ (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (set-popup-rule! "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" - '((size . 20))) + (set-popup-rule! "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" :size 20) ;; TODO Temporary Ex commands for the debugger ;; (def-tmp-excmd! doom:def-debug-on doom:def-debug-off diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 53545e4f0..f17bc335d 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -17,7 +17,7 @@ :config (setq quickrun-focus-p nil) - (set-popup-rule! "^\\*quickrun" '((size . 0.3)) '((transient . 0))) + (set-popup-rule! "^\\*quickrun" :size 0.3 :ttl 0) (defun +eval*quickrun-auto-close (&rest _) "Allows us to silently re-run quickrun from within the quickrun buffer." diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 2cf3fa314..3435a4fb0 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -68,8 +68,8 @@ variable for an explanation of the defaults (in comments). See (put 'evil-define-key* 'lisp-indent-function 'defun) (set-popup-rules! - '(("^\\*evil-registers" ((size . 0.3))) - ("^\\*Command Line" ((size . 8))))) + '(("^\\*evil-registers" :size 0.3) + ("^\\*Command Line" :size 8))) ;; Change the cursor color in emacs mode (defvar +evil--default-cursor-color "#ffffff") diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el index 534649369..5828a2157 100644 --- a/modules/feature/version-control/+git.el +++ b/modules/feature/version-control/+git.el @@ -20,7 +20,7 @@ (git-gutter-mode +1))) (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) :config - (set-popup-rule! "^\\*git-gutter" nil '((select))) + (set-popup-rule! "^\\*git-gutter" :select nil) ;; Update git-gutter on focus (in case I was using git externally) (add-hook 'focus-in-hook #'git-gutter:update-all-windows) diff --git a/modules/feature/version-control/config.el b/modules/feature/version-control/config.el index 353daedbd..d3d83f234 100644 --- a/modules/feature/version-control/config.el +++ b/modules/feature/version-control/config.el @@ -12,8 +12,8 @@ (after! vc-annotate (set-popup-rules! - '(("^\\vc-d" nil ((select))) ; *vc-diff* - ("^\\vc-c" nil ((select . t))))) ; *vc-change-log* + '(("^\\vc-d" :select) ; *vc-diff* + ("^\\vc-c" :select t))) ; *vc-change-log* (set-evil-initial-state! '(vc-annotate-mode vc-git-log-view-mode) 'normal)) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index f61172558..e0c3b3767 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -30,7 +30,7 @@ (figwheel-sidecar.repl-api/start-figwheel!) (figwheel-sidecar.repl-api/cljs-repl))") - (set-popup-rule! "^\\*cider-repl" nil '((quit) (select))) + (set-popup-rule! "^\\*cider-repl" :quit nil :select nil) (set-repl-handler! 'clojure-mode #'+clojure/repl) (set-eval-handler! 'clojure-mode #'cider-eval-region) (set-lookup-handlers! 'clojure-mode diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index d7e127d2a..f90a2200a 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -33,7 +33,7 @@ font-latex-fontify-sectioning 1.15) (setq-default TeX-master nil) ;; Display the output of the latex commands in a popup. - (set-popup-rule! " output\\*$" '((size . 15))) + (set-popup-rule! " output\\*$" :size 15) ;; TeX Font Styling ;; (def-package! tex-style :defer t) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 39dd2222a..315fc1b9d 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -73,17 +73,17 @@ string). Stops at the first function to return non-nil.") :config (set-popup-rules! '(("^\\*Org Src" - ((size . 100) (side . right) (slot . -1) (window-height . 0.6)) - ((quit) (select . t) (modeline))) + :side 'right :size 100 :height 0.6 :slot -1 + :quit nil :select t) ("^\\*Python" - ((slot . 0) (side . right) (size . 100)) - ((select) (quit) (transient))) + :slot 0 :side 'right :size 100 + :select nil :quit nil :ttl nil) ("\\*ob-ipython.*" - ((slot . 2) (side . right) (size . 100) (window-height . 0.2)) - ((select) (quit) (transient))) + :slot 2 :side 'right :size 100 :height 0.2 + :select nil :quit nil :transient nil) ("\\*Python:.*" - ((slot . 0) (side . right) (size . 100)) - ((select) (quit) (transient))))) + :slot 0 :side 'right :size 100 + :select nil :quit nil :transient nil))) ;; TODO Add more popup styles ;; advices for remote kernel and org-src-edit diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0c006e6fc..bce7415a9 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -140,17 +140,10 @@ unfold to point on startup." "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." (set-popup-rules! '(("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" - ((slot . -1) (vslot . -1) (size . +popup-shrink-to-fit)) - ((transient . 0))) - ("^\\*Org Agenda" - ((size . 0.35)) - ((select . t) (transient))) - ("^\\*Org Src" - ((size . 0.3)) - ((quit) (select . t))) - ("^CAPTURE.*\\.org$" - ((size . 0.2)) - ((quit) (select . t)))))) + :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) + ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) + ("^\\*Org Src" :size 0.3 :quit nil :select t) + ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t)))) (defun +org|setup-pretty-code () "Setup the default pretty symbols for" diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index a798870ad..04001c496 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -6,7 +6,7 @@ (setq plantuml-jar-path (concat doom-etc-dir "plantuml.jar") org-plantuml-jar-path plantuml-jar-path) :config - (set-popup-rule! "^\\*PLANTUML" '((size . 0.4)) '((select) (transient . 0)))) + (set-popup-rule! "^\\*PLANTUML" :size 0.4 :select nil :ttl 0)) (def-package! flycheck-plantuml diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 48ba4f077..2ae760085 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -98,7 +98,7 @@ environment variables." (add-hook 'python-mode-hook #'anaconda-mode) (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) (set-company-backend! 'python-mode '(company-anaconda)) - (set-popup-rule! "^\\*anaconda-mode" nil '((select))) + (set-popup-rule! "^\\*anaconda-mode" :select nil) (set-lookup-handlers! 'python-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references @@ -130,7 +130,7 @@ environment variables." :init (associate! nose-mode :match "/test_.+\\.py$" :modes (python-mode)) :config - (set-popup-rule! "^\\*nosetests" '((size . 0.4)) '((select))) + (set-popup-rule! "^\\*nosetests" :size 0.4 :select nil) (set-yas-minor-mode! 'nose-mode) (map! :map nose-mode-map :localleader diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 2114e2015..9b54b78c7 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -3,7 +3,7 @@ (def-package! restclient :mode ("\\.http\\'" . restclient-mode) :config - (set-popup-rule! "^\\*HTTP Response" '((size . 0.4)) '((quit . other))) + (set-popup-rule! "^\\*HTTP Response" :size 0.4 :quit 'other) (map! :mode restclient-mode :n [M-return] 'restclient-http-send-current :localleader diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index dda5acd71..0c92dcf59 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -18,12 +18,8 @@ (set-popup-rules! '(("\\*ein: .*" :ignore t) - ("\\*ein:tb .*" - ((side . bottom) (size . 0.3)) - ((quit . t) (transient) (select))) - ("\\*ein:notebooklist *" - ((side . left) (size . 50)) - ((select))))) + ("\\*ein:tb .*" :side 'bottom :size 0.3 :quit t :ttl nil :select nil) + ("\\*ein:notebooklist *" :side 'left :size 50 :select nil))) (when (featurep! :completion company) ;; Code completion with company diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index a65ed7ee0..739a346c6 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -26,7 +26,7 @@ load everything.") magit-display-buffer-function #'+magit-display-buffer-fullscreen magit-popup-display-buffer-action '((display-buffer-in-side-window))) - (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore) + (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore t) ;; Consider magit buffers real (so they can switched to) (add-hook 'magit-mode-hook #'doom|mark-buffer-as-real) ;; no mode-line in magit popups diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 27e7ca61e..abc6db2c6 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -28,9 +28,7 @@ (after! pass (set-env! "PASSWORD_STORE_DIR") (set-evil-initial-state! 'pass-mode 'emacs) - (set-popup-rule! "^\\*Password-Store" - '((side . left) (size . 0.25)) - '((quit))) + (set-popup-rule! "^\\*Password-Store" :side 'left :size 0.25 :quit nil) (define-key! pass-mode-map "j" #'pass-next-entry "k" #'pass-prev-entry diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 2d917ce2b..5b2952b64 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -34,9 +34,9 @@ (load! "+modeline") (add-hook! 'pdf-tools-enabled-hook (doom-set-modeline 'pdf-tools-modeline))) ;; Handle PDF-tools related popups better - (set-popup-rule! "^\\*Outline*" '((side . right) (size . 40)) '((select))) + (set-popup-rule! "^\\*Outline*" :side 'right :size 40 :select nil) ;; TODO: Add additional important windows that should be handled differently ;; TODO: These two next rules don't work (they should), investigate - ;; (set-popup-rule! "\\*Contents\\*" '((side . right) (size . 40)) nil) - ;; (set-popup-rule! "* annots\\*$" '((side . left) (size . 40)) '((select))) + ;; (set-popup-rule! "\\*Contents\\*" :side 'right :size 40) + ;; (set-popup-rule! "* annots\\*$" :side 'left :size 40 :select nil) ) diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index dca65e7c4..b308ee247 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -36,8 +36,8 @@ "^#.*#$")) (set-popup-rule! "^ ?\\*NeoTree" - `((side . ,neo-window-position) (size . ,neo-window-width)) - '((quit . current) (select . t))) + :side neo-window-position :size neo-window-width + :quit 'current :select t) (after! winner (cl-pushnew neo-buffer-name winner-boring-buffers)) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index ab988a67a..32a1f8457 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -83,10 +83,11 @@ and enables `+popup-buffer-mode'." ;; integer = ttl ;; nil = no timer (unless +popup--inhibit-transient - (setq ttl (+popup-parameter-fn 'transient window buffer)) + (setq ttl (+popup-parameter-fn 'ttl window buffer)) (when ttl (when (eq ttl t) - (setq ttl +popup-ttl)) + (setq ttl (or (plist-get +popup-defaults :ttl) + 0))) (cl-assert (integerp ttl) t) (if (= ttl 0) (+popup--kill-buffer buffer 0) @@ -97,23 +98,26 @@ and enables `+popup-buffer-mode'." (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." - (if (not alist) - (setq alist +popup-default-alist) - (let* ((alist (map-merge 'list +popup-default-alist alist)) - (params (map-merge 'list - +popup-default-parameters - (cdr (assq 'window-parameters alist))))) - ;; translate side => window-(width|height) - (when-let* ((size (cdr (assq 'size alist))) - (side (or (cdr (assq 'side alist)) 'bottom))) - (map-delete alist 'size) - (map-put alist (if (memq side '(left right)) + (let ((alist ; handle defaults + (cl-remove-duplicates + (append alist +popup-default-alist) + :key #'car :from-end t)) + (parameters + (cl-remove-duplicates + (append (cdr (assq 'window-parameters alist)) + +popup-default-parameters) + :key #'car :from-end t))) + ;; handle `size' + (when-let* ((size (cdr (assq 'size alist))) + (side (or (cdr (assq 'side alist)) 'bottom)) + (param (if (memq side '(left right)) 'window-width - 'window-height) - size)) - ;; - (map-put alist 'window-parameters params) - (nreverse alist)))) + 'window-height))) + (setq alist (map-delete alist 'size)) + (map-put alist param size)) + (setcdr (assq 'window-parameters alist) + (cl-remove-if #'null parameters :key #'cdr)) + (cl-remove-if #'null alist :key #'cdr))) ;; @@ -145,18 +149,21 @@ and enables `+popup-buffer-mode'." ;;;###autoload (defun +popup-buffer (buffer &optional alist) "Open BUFFER in a popup window. ALIST describes its features." - (let ((old-window (selected-window)) - (alist (+popup--normalize-alist alist)) - (window-min-height 3)) - (when-let* ((new-window (run-hook-with-args-until-success - '+popup-display-buffer-actions buffer alist))) - (+popup--init new-window alist) + (let* ((origin (selected-window)) + (window-min-height 3) + (alist (+popup--normalize-alist alist)) + (actions (or (cdr (assq 'actions alist)) + +popup-default-display-buffer-actions))) + (when-let* ((popup (cl-loop for func in actions + if (funcall func buffer alist) + return it))) + (+popup--init popup alist) (unless +popup--inhibit-select - (let ((select (+popup-parameter 'select new-window))) + (let ((select (+popup-parameter 'select popup))) (if (functionp select) - (funcall select new-window old-window) - (select-window (if select new-window old-window))))) - new-window))) + (funcall select popup origin) + (select-window (if select popup origin))))) + popup))) ;;;###autoload (defun +popup-parameter (parameter &optional window) @@ -188,70 +195,6 @@ Uses `shrink-window-if-larger-than-buffer'." (shrink-window-if-larger-than-buffer window))) -;; -;; Minor mode -;; - -;;;###autoload -(defvar +popup-mode-map (make-sparse-keymap) - "Active keymap in a session with the popup system enabled. See -`+popup-mode'.") - -;;;###autoload -(defvar +popup-buffer-mode-map - (let ((map (make-sparse-keymap))) - (when (featurep! :feature evil) - ;; for maximum escape coverage in emacs state buffers - (define-key map [escape] #'doom/escape) - (define-key map (kbd "ESC") #'doom/escape)) - map) - "Active keymap in popup windows. See `+popup-buffer-mode'.") - -;;;###autoload -(define-minor-mode +popup-mode - "Global minor mode representing Doom's popup management system." - :init-value nil - :global t - :keymap +popup-mode-map - (cond (+popup-mode - (add-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) - (add-hook 'doom-escape-hook #'+popup|close-on-escape t) - (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) - (add-hook 'after-change-major-mode-hook #'+popup|set-modeline-on-enable) - (setq +popup--old-display-buffer-alist display-buffer-alist - display-buffer-alist +popup--display-buffer-alist - window--sides-inhibit-check t) - (dolist (prop +popup-window-parameters) - (push (cons prop 'writable) window-persistent-parameters))) - (t - (remove-hook 'doom-unreal-buffer-functions #'+popup-buffer-p) - (remove-hook 'doom-escape-hook #'+popup|close-on-escape) - (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) - (remove-hook 'after-change-major-mode-hook #'+popup|set-modeline-on-enable) - (setq display-buffer-alist +popup--old-display-buffer-alist - window--sides-inhibit-check nil) - (+popup|cleanup-rules) - (dolist (prop +popup-window-parameters) - (setq window-persistent-parameters - (map-delete window-persistent-parameters prop)))))) - -;;;###autoload -(define-minor-mode +popup-buffer-mode - "Minor mode for individual popup windows. - -It is enabled when a buffer is displayed in a popup window and disabled when -that window has been changed or closed." - :init-value nil - :keymap +popup-buffer-mode-map - (when (and +popup-buffer-mode (timerp +popup--timer)) - (remove-hook 'kill-buffer-hook #'+popup|kill-buffer-hook t) - (cancel-timer +popup--timer) - (setq +popup--timer nil))) - -(put '+popup-buffer-mode 'permanent-local t) -(put '+popup-buffer-mode 'permanent-local-hook t) - - ;; ;; Hooks ;; @@ -289,6 +232,7 @@ restoring it if `+popup-buffer-mode' is disabled." ((symbolp modeline) (when-let* ((hide-mode-line-format (doom-modeline modeline))) (hide-mode-line-mode +1))))))) +(put '+popup|set-modeline-on-enable 'permanent-local-hook t) ;;;###autoload (defun +popup|unset-modeline-on-disable () @@ -416,53 +360,11 @@ the message buffer in a popup window." (let ((window (selected-window)) (buffer (current-buffer)) +popup--remember-last) - (set-window-parameter window 'transient nil) + (set-window-parameter window 'ttl nil) (+popup/close window 'force) (display-buffer-pop-up-window buffer nil))) -;; -;; Macros -;; - -;;;###autoload -(defmacro with-popup-rules! (rules &rest body) - "Evaluate BODY with popup RULES. RULES is a list of popup rules. Each rule -should match the arguments of `+popup-define' or the :popup setting." - (declare (indent defun)) - `(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist) - display-buffer-alist) - ,@(cl-loop for rule in rules collect `(set-popup-rule! ,@rule)) - (when (bound-and-true-p +popup-mode) - (setq display-buffer-alist +popup--display-buffer-alist)) - ,@body)) - -;;;###autoload -(defmacro without-popups! (&rest body) - "Run BODY with a default `display-buffer-alist', ignoring the popup rules set -with the :popup setting." - `(let ((display-buffer-alist +popup--old-display-buffer-alist)) - ,@body)) - -;;;###autoload -(defmacro save-popups! (&rest body) - "Sets aside all popups before executing the original function, usually to -prevent the popup(s) from messing up the UI (or vice versa)." - `(let* ((in-popup-p (+popup-buffer-p)) - (popups (+popup-windows)) - (+popup--inhibit-transient t) - +popup--last) - (dolist (p popups) - (+popup/close p 'force)) - (unwind-protect - (progn ,@body) - (when popups - (let ((origin (selected-window))) - (+popup/restore) - (unless in-popup-p - (select-window origin))))))) - - ;; ;; Advice ;; diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index ab5f4cecd..0ff8d28b9 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -2,69 +2,187 @@ (defvar +popup--display-buffer-alist nil) -(defsubst +popup--rule (args) - (cl-destructuring-bind (condition &optional alist parameters) args - (if (eq alist :ignore) - (list condition nil) - `(,condition (+popup-buffer) - ,@alist - (window-parameters ,@parameters))))) +;;;###autoload +(defvar +popup-defaults + (list :side 'bottom + :height 0.16 + :width 40 + :quit t + :select #'ignore + :ttl 5) + "Default setup for `set-popup-rule!' ") -(defun +popup--define (condition &optional alist parameters) - (when after-init-time - (setq +popup--display-buffer-alist - (map-delete +popup--display-buffer-alist condition))) - (push (+popup--rule (list condition alist parameters)) - +popup--display-buffer-alist)) +;;;###autoload +(defun +popup--make (predicate plist) + (cond ((not (keywordp (car plist))) + ;; FIXME deprecated popup rule support + (message "Warning: the old usage of `set-popup-rule!' is deprecated; update the rule for '%s'" + predicate) + (cl-destructuring-bind (condition &optional alist parameters) + (list predicate (car plist) (cadr plist)) + (if (eq alist :ignore) + (list condition nil) + `(,condition (+popup-buffer) + ,@alist + (window-parameters ,@parameters))))) + ((plist-get plist :ignore) + (list predicate nil)) + ((let* ((plist (append plist +popup-defaults)) + (alist + `((actions . ,(plist-get plist :actions)) + (side . ,(plist-get plist :side)) + (size . ,(plist-get plist :size)) + (window-width . ,(plist-get plist :width)) + (window-height . ,(plist-get plist :height)) + (slot . ,(plist-get plist :slot)) + (vslot . ,(plist-get plist :vslot)))) + (params + `((ttl . ,(plist-get plist :ttl)) + (quit . ,(plist-get plist :quit)) + (select . ,(plist-get plist :select)) + (modeline . ,(plist-get plist :modeline)) + (autosave . ,(plist-get plist :autosave)) + ,@(plist-get plist :parameters)))) + `(,predicate (+popup-buffer) + ,@alist + (window-parameters ,@params)))))) ;;;###autodef -(defun set-popup-rule! (condition &optional alist parameters) +(defun set-popup-rule! (predicate &rest plist) "Define a popup rule. -CONDITION can be a regexp string or a function. - -For ALIST, see `display-buffer' and `display-buffer-alist' for a list of -possible entries, which instruct the display system how to initialize the popup -window. - -ALIST also supports the `size' parameter, which will be translated to -`window-width' or `window-height' depending on `side'. - -PARAMETERS is an alist of window parameters. See `+popup-window-parameters' for -a list of custom parameters provided by the popup module. If certain -attributes/parameters are omitted, the ones from `+popup-default-alist' and -`+popup-default-parameters' will be used. - -The buffers of new windows displayed by `pop-to-buffer' and `display-buffer' -will be tested against CONDITION, which is either a) a regexp string (which is +Buffers displayed by `pop-to-buffer' and `display-buffer' (or their siblings) +will be tested against PREDICATE, which is either a) a regexp string (which is matched against the buffer's name) or b) a function that takes no arguments and returns a boolean. -See `def-popups!' for defining multiple rules in bulk." +Buffers displayed with `switch-to-buffer' and its variants will not be affected +by these rules (as they are unaffected by `display-buffer-alist', which powers +the popup management system). + +PLIST can be made up of any of the following properties: + +:actions ACTIONS + ACTIONS is a list of functions or an alist containing (FUNCTION . ALIST). See + `display-buffer''s second argument for more information on its format and what + it accepts. If omitted, `+popup-default-display-buffer-actions' is used. + +:side 'bottom|'top|'left|'right + Which side of the frame to open the popup on. This is only respected if + `+popup-display-buffer-stacked-side-window' or `display-buffer-in-side-window' + is in :actions or `+popup-default-display-buffer-actions'. + +:size/:width/:height FLOAT|INT + Determines the size of the popup. If opened at the top or bottom, the width is + irrelevant unless it is opened in an adjacent slot. Same deal with the left + and right side. + + If given a FLOAT (0 < x < 1), the number represents how much of the window + will be consumed by the popup (a percentage). + If given an INT, the number determines the size in lines (height) or units of + character width (width). + +:slot/:vslot INT + This only applies to popups with a :side. For popups opened at the top or + bottom, slot designates the horizontal positioning of a popup. If two popups + are assigned the same slot (and same vslot), the later popup will replace the + earlier one. If the later popup has a lower slot, it will open to the older + popup's left. A higher slot opens it to the old popup's right. + + On the other hand, vslot operates the same way, but controls how popups are + stacked. + + When a popup is opened on the left and right, slot determines vertical + position and vslot horizontal. + +:ttl INT|BOOL|FN + Stands for time-to-live. CDR can be t, an integer, nil or a function that + returns one of these. It represents the number of seconds before the buffer + belonging to a closed popup window is killed. + + If t, CDR will default to `+popup-ttl'. + If 0, the buffer is immediately killed. + If nil, the buffer won't be killed. + If a function, it must return one of the other possible values above. It takes + the popup buffer as its sole argument. + +:quit BOOL|FN + CDR can be t, 'other, 'current, nil, or a function that returns one of these. + This determines the behavior of the ESC/C-g keys in or outside of popup + windows. + + If t, close the popup if ESC/C-g is pressed inside or outside of popups. + If 'other, close this popup if ESC/C-g is pressed outside of any popup. This + is great for popups you just want to peek at and discard, but might also + want to poke around in, without the risk of closing it from the inside. + If 'current, close the current popup if ESC/C-g is pressed from inside of the + popup. + If nil, pressing ESC/C-g will never close this buffer. + If a function, it is checked each time ESC/C-g is pressed to determine the + fate of the popup window. This function takes one argument: the popup window + and must return one of the other possible values. + +:select BOOL|FN + CDR can be a boolean or function. The boolean determines whether to focus the + popup window after it opens (non-nil) or focus the origin window (nil). + + If a function, it takes two arguments: the popup window and the source window + (where you were before the popup was opened). It does nothing else, and + ignores its return value. + +:modeline BOOL|SYMBOL|FN + CDR can be t (show the default modeline), a symbol representing the name of a + modeline defined with `def-modeline!', nil (show no modeline) or a function + that returns one of these. The function takes one argument: the popup buffer. + +:autosave BOOL|FN + This parameter determines what to do with modified buffers in closing popup + windows. CDR can be a t, 'ignore, a function or nil. + + If t, no prompts. Just save them automatically (if they're file-visiting + buffers). + If 'ignore, no prompts, no saving. Just silently kill it. + If nil (the default), prompt the user what to do if the buffer is + file-visiting and modified. + If a function, the return value must return one of the other values. It takes + two arguments: the popup window and buffer. + +:parameters ALIST + An alist of custom window parameters. See \(info window-parameters) + +If any of these are omitted, defaults derived from `+popup-defaults' will be +used." (declare (indent defun)) - (+popup--define condition alist parameters) + (push (+popup--make predicate plist) +popup--display-buffer-alist) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist) ;;;###autodef (defun set-popup-rules! (&rest rulesets) - "Define multiple popup rules. See `def-popup!' for the specifications of each -individual rule. + "Like `set-popup-rules!', but defines multiple popup rules. Every entry in RULESETS +should be a list of lists (each sublist is a popup rule that could be passed to +`set-popup-rule!'). - (set-popup-rules! - '((\"^ \\*\" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))) - (\"^\\*\" ((slot . 1) (vslot . -1)) ((select . t)))))" - (dolist (ruleset rulesets) - (dolist (rule ruleset) - (apply #'+popup--define rule))) +Example: + + (set-popup-rules! + '((\"^ \\*\" :slot 1 :vslot -1 :size #'+popup-shrink-to-fit) + (\"^\\*\" :slot 1 :vslot -1 :select t)) + '((\"^\\*Completions\" :slot -1 :vslot -2 :ttl 0) + (\"^\\*Compil\\(?:ation\\|e-Log\\)\" :size 0.3 :ttl 0 :quit t)))" + (declare (indent 0)) + (dolist (rules rulesets) + (dolist (rule rules) + (push (+popup--make (car rule) (cdr rule)) + +popup--display-buffer-alist))) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist) ;; -;; Obsolete +;; Obsolete settings ;; ;; FIXME obsolete :popup diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 3e020c3a9..7e89c04df 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -1,151 +1,160 @@ ;;; ui/popup/config.el -*- lexical-binding: t; -*- -(defconst +popup-window-parameters - '(transient quit select modeline popup) +(defconst +popup-window-parameters '(ttl quit select modeline popup) "A list of custom parameters to be added to `window-persistent-parameters'. -Modifying this has no effect, unless done before ui/popup loads. +Modifying this has no effect, unless done before ui/popup loads.") -(transient . CDR) - CDR can be t, an integer, nil or a function that returns one of these. It - represents the number of seconds before the buffer belonging to a closed popup - window is killed. - - If t, CDR will default to `+popup-ttl'. - If 0, the buffer is immediately killed. - If nil, the buffer won't be killed. - If a function, it must return one of the other possible values above. It takes - the popup buffer as its sole argument. - -(quit . CDR) - CDR can be t, 'other, 'current, nil, or a function that returns one of these. - This determines the behavior of the ESC/C-g keys in or outside of popup - windows. - - If t, close the popup if ESC/C-g is pressed inside or outside of popups. - If 'other, close this popup if ESC/C-g is pressed outside of any popup. This - is great for popups you just want to peek at and discard, but might also - want to poke around in, without the risk of closing it from the inside. - If 'current, close the current popup if ESC/C-g is pressed from inside of the - popup. - If nil, pressing ESC/C-g will never close this buffer. - If a function, it is checked each time ESC/C-g is pressed to determine the - fate of the popup window. This function takes one argument: the popup - window and must return one of the other possible values. - -(select . CDR) - CDR can be a boolean or function. The boolean determines whether to focus the - popup window after it opens (non-nil) or focus the origin window (nil). - - If a function, it takes two arguments: the popup window and the source window - (where you were before the popup was opened). It does nothing else, and - ignores its return value. - -(modeline . CDR) - CDR can be t (show the default modeline), a symbol representing the name of a - modeline defined with `def-modeline!', nil (show no modeline) or a function - that returns one of these. The function takes one argument: the popup buffer. - -(autosave . CDR) - This parameter determines what to do with modified buffers in closing popup - windows. CDR can be a t, 'ignore, a function or nil. - - If t, no prompts. Just save them automatically (if they're file-visiting - buffers). - If 'ignore, no prompts, no saving. Just silently kill it. - If nil (the default), prompt the user what to do if the buffer is - file-visiting and modified. - If a function, the return value must return one of the other values. It takes - two arguments: the popup window and buffer. - -(popup . t) - This is for internal use, do not change this. It simply marks a window as a - popup window. - -Since I can't find this information anywhere but the Emacs manual, I'll include -a brief description of some native window parameters that Emacs uses: - -(delete-window . CDR) -(delete-other-window . CDR) -(split-window . CDR) -(other-window . CDR) - This applies to all four of the above: CDR can be t or a function. If t, using - those functions on this window will ignore all window parameters. - - If CDR is a function, it will replace the native function when used on this - window. e.g. if CDR is #'ignore (delete-window popup) will run (ignore popup) - instead of deleting the window! -(no-other-window . BOOL) - If CDR is non-nil, this window becomes invisible to `other-window' and - `pop-to-buffer'. Doom popups sets this. The default is nil.") - -(defvar +popup-display-buffer-actions +(defvar +popup-default-display-buffer-actions '(display-buffer-reuse-window +popup-display-buffer-stacked-side-window) "The functions to use to display the popup buffer.") (defvar +popup-default-alist - '((window-height . 0.16) + '((window-height . 0.16) ; remove later (reusable-frames . visible)) "The default alist for `display-buffer-alist' rules.") (defvar +popup-default-parameters - '((transient . t) - (quit . t) - (select . ignore) + '((transient . t) ; remove later + (quit . t) ; remove later + (select . ignore) ; remove later (no-other-window . t)) "The default window parameters.") -(defvar +popup-ttl 5 - "The default time-to-live for transient buffers whose popup buffers have been -deleted.") - (defvar +popup-margin-width 1 "Size of the margins to give popup windows. Set this to nil to disable margin adjustment.") +;; +;; Global modes +;; + +(defvar +popup-mode-map (make-sparse-keymap) + "Active keymap in a session with the popup system enabled. See +`+popup-mode'.") + +(defvar +popup-buffer-mode-map + (let ((map (make-sparse-keymap))) + (when (featurep! :feature evil) + ;; for maximum escape coverage in emacs state buffers + (define-key map [escape] #'doom/escape) + (define-key map (kbd "ESC") #'doom/escape)) + map) + "Active keymap in popup windows. See `+popup-buffer-mode'.") + +(define-minor-mode +popup-mode + "Global minor mode representing Doom's popup management system." + :init-value nil + :global t + :keymap +popup-mode-map + (cond (+popup-mode + (add-hook 'doom-escape-hook #'+popup|close-on-escape t) + (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) + (setq +popup--old-display-buffer-alist display-buffer-alist + display-buffer-alist +popup--display-buffer-alist + window--sides-inhibit-check t) + (dolist (prop +popup-window-parameters) + (push (cons prop 'writable) window-persistent-parameters))) + (t + (remove-hook 'doom-escape-hook #'+popup|close-on-escape) + (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) + (setq display-buffer-alist +popup--old-display-buffer-alist + window--sides-inhibit-check nil) + (+popup|cleanup-rules) + (dolist (prop +popup-window-parameters) + (setq window-persistent-parameters + (map-delete window-persistent-parameters prop)))))) + +(define-minor-mode +popup-buffer-mode + "Minor mode for individual popup windows. + +It is enabled when a buffer is displayed in a popup window and disabled when +that window has been changed or closed." + :init-value nil + :keymap +popup-buffer-mode-map + (if (not +popup-buffer-mode) + (remove-hook 'after-change-major-mode-hook #'+popup|set-modeline-on-enable t) + (add-hook 'after-change-major-mode-hook #'+popup|set-modeline-on-enable nil t) + (when (timerp +popup--timer) + (remove-hook 'kill-buffer-hook #'+popup|kill-buffer-hook t) + (cancel-timer +popup--timer) + (setq +popup--timer nil)))) + +(put '+popup-buffer-mode 'permanent-local t) +(put '+popup-buffer-mode 'permanent-local-hook t) +(put '+popup|set-modeline-on-enable 'permanent-local-hook t) + + +;; +;; Macros +;; + +(defmacro with-popup-rules! (rules &rest body) + "Evaluate BODY with popup RULES. RULES is a list of popup rules. Each rule +should match the arguments of `+popup-define' or the :popup setting." + (declare (indent defun)) + `(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist) + display-buffer-alist) + (set-popup-rules! ,@rules) + (when (bound-and-true-p +popup-mode) + (setq display-buffer-alist +popup--display-buffer-alist)) + ,@body)) + +(defmacro save-popups! (&rest body) + "Sets aside all popups before executing the original function, usually to +prevent the popup(s) from messing up the UI (or vice versa)." + `(let* ((in-popup-p (+popup-buffer-p)) + (popups (+popup-windows)) + (+popup--inhibit-transient t) + +popup--last) + (dolist (p popups) + (+popup/close p 'force)) + (unwind-protect + (progn ,@body) + (when popups + (let ((origin (selected-window))) + (+popup/restore) + (unless in-popup-p + (select-window origin))))))) + + ;; ;; Default popup rules & bootstrap ;; (set-popup-rules! (when (featurep! +all) - '(("^\\*" ((slot . 1) (vslot . -1)) ((select . t))) - ("^ \\*" ((slot . 1) (vslot . -1) (size . +popup-shrink-to-fit))))) + '(("^\\*" :slot 1 :vslot -1 :select t) + ("^ \\*" :slot 1 :vslot -1 :size +popup-shrink-to-fit))) (when (featurep! +defaults) '(("^\\*Completions" - ((slot . -1) (vslot . -2)) - ((transient . 0))) + :slot -1 :vslot -2 :ttl 0) ("^\\*Compil\\(?:ation\\|e-Log\\)" - ((size . 0.3)) - ((transient . 0) (quit . t))) + :size 0.3 :ttl 0 :quit t) ("^\\*\\(?:scratch\\|Messages\\)" - nil - ((autosave . t) (transient))) + :autosave t :ttl nil) + ("^\\*Man " + :size 0.45 :vslot -6 :ttl 0 :quit t :select t) ("^\\*doom \\(?:term\\|eshell\\)" - ((size . 0.25) (vslot . -10)) - ((select . t) (quit) (transient . 0))) + :size 0.25 :vslot -10 :select t :quit nil :ttl 0) ("^\\*doom:" - ((size . 0.35) (side . bottom)) - ((autosave . t) (select . t) (modeline . t) (quit) (transient . t))) + :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) ("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" - ((size . +popup-shrink-to-fit)) - ((transient . 0) (select . ignore))) + :size +popup-shrink-to-fit :ttl 0 :select ignore) ("^\\*Customize" - ((slot . 2) (side . right)) - ((modeline . nil) (select . t) (quit . t))) + :slot 2 :side right :select t :quit t) ("^ \\*undo-tree\\*" - ((slot . 2) (side . left) (size . 20)) - ((modeline . nil) (select . t) (quit . t))) + :slot 2 :side left :size 20 :select t :quit t) ;; `help-mode', `helpful-mode' ("^\\*[Hh]elp" - ((slot . 2) (vslot . 2) (size . 0.25)) - ((select . t))) + :slot 2 :vslot 2 :size 0.35 :select t) ;; `Info-mode' ("^\\*info\\*$" - ((slot . 2) (vslot . 2) (size . 0.45)) - ((select . t)))))) + :slot 2 :vslot 2 :size 0.45 :select t))) + '(("^\\*Backtrace" :ignore t))) + +(add-hook 'doom-init-ui-hook #'+popup-mode :append) -(add-hook 'doom-init-ui-hook #'+popup-mode) (add-hook! '+popup-buffer-mode-hook #'(+popup|adjust-fringes +popup|adjust-margins @@ -157,5 +166,4 @@ adjustment.") ;; Hacks ;; -(when (featurep! +defaults) - (load! "+hacks")) +(load! "+hacks") From 51f2ea29323e6b5bcfc6421303732ab363b9609f Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sun, 17 Jun 2018 18:57:02 -0700 Subject: [PATCH 2003/4235] tmux: string-split -> split-string --- modules/tools/tmux/autoload/tmux.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/tools/tmux/autoload/tmux.el b/modules/tools/tmux/autoload/tmux.el index 9508172a2..c3173845c 100644 --- a/modules/tools/tmux/autoload/tmux.el +++ b/modules/tools/tmux/autoload/tmux.el @@ -108,8 +108,8 @@ but do not execute them." (if session (concat "-t " (car session)) "-a"))))) - (cl-loop for line in (string-split lines "\n" t) - collect (let ((window (string-split line ";"))) + (cl-loop for line in (split-string lines "\n" t) + collect (let ((window (split-string line ";"))) (list (nth 0 window) :session-id (nth 1 window) :name (nth 3 window) @@ -126,7 +126,7 @@ but do not execute them." "-t " (car sess-or-win)) "-a"))))) - (cl-loop for line in (string-split lines "\n" t) + (cl-loop for line in (split-string lines "\n" t) collect (let ((pane (split-string line ";"))) (list (nth 0 pane) :window-id (nth 1 pane) From 1c4f785df1dc913b8b96db602c2327c68c783acd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 11:29:08 +0200 Subject: [PATCH 2004/4235] Bind C-s to *-minibuffer-history in evil-ex Thanks to #fuxialexander --- modules/config/default/+bindings.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 3edf3f22d..783e2def0 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -768,6 +768,9 @@ [M-backspace] #'doom/backward-kill-to-bol-and-indent) (define-key! evil-ex-completion-map + "\C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history) "\C-a" #'move-beginning-of-line "\C-b" #'backward-word "\C-f" #'forward-word) From 0d925cda5e1a4cb934e3afeb28a4685b9b1c1519 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 12:04:30 +0200 Subject: [PATCH 2005/4235] Load core-os sooner & in all sessions Indirectly fixes set-env! errors when using it from your init files. --- core/autoload/os.el | 8 -------- core/core-os.el | 6 ++++++ core/core.el | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 core/autoload/os.el diff --git a/core/autoload/os.el b/core/autoload/os.el deleted file mode 100644 index c77c4eeb5..000000000 --- a/core/autoload/os.el +++ /dev/null @@ -1,8 +0,0 @@ -;;; core/autoload/os.el -*- lexical-binding: t; no-byte-compile: t -*- - -;; FIXME obsolete :env -;;;###autoload -(def-setting! :env (&rest vars) - :obsolete set-env! - (when (featurep 'exec-path-from-shell) - `(exec-path-from-shell-copy-envs ,@vars))) diff --git a/core/core-os.el b/core/core-os.el index c1f57ad83..623da3bd0 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -15,6 +15,12 @@ (defmacro set-env! (&rest _vars) "Inject VARS from your shell environment into Emacs.") +;; FIXME obsolete :env +(def-setting! :env (&rest vars) + :obsolete set-env! + (when (featurep 'exec-path-from-shell) + `(exec-path-from-shell-copy-envs ,@vars))) + (cond (IS-MAC (setq mac-command-modifier 'meta mac-option-modifier 'alt diff --git a/core/core.el b/core/core.el index cf29ad423..60db26474 100644 --- a/core/core.el +++ b/core/core.el @@ -342,10 +342,10 @@ to least)." noninteractive) (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) ;; Initialize Doom core + (require 'core-os) (unless noninteractive (add-hook! 'emacs-startup-hook #'(doom|post-init doom|display-benchmark)) - (require 'core-os) (require 'core-ui) (require 'core-editor) (require 'core-projects) From 08f01edafdcca3870bb05c3f19cd81fd787e2cb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 13:38:27 +0200 Subject: [PATCH 2006/4235] Mark settings obsolete (properly) And make set! noisy about settings that don't exist anymore, when evaling it interactively. --- core/core-modules.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index b7c4b29c9..714feb350 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -377,7 +377,7 @@ omitted. eg. (featurep! +flag1)" ;; -;; Cross-module configuration (DEPRECATED) +;; FIXME Cross-module configuration (deprecated) ;; ;; I needed a way to reliably cross-configure modules without littering my @@ -406,6 +406,8 @@ Do not use this for configuring Doom core." ,(if (and (not docstring) (fboundp alias)) (documentation alias t) docstring) + ,(when alias + `(declare (obsolete ,alias "2.1.0"))) (prog1 (progn ,@forms) ,(when alias `(unless noninteractive @@ -421,7 +423,7 @@ VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." (let ((fn (intern-soft (format "doom--set%s" keyword)))) (if (and fn (fboundp fn)) (apply fn values) - (when doom-debug-mode + (when (or doom-debug-mode after-init-time) (message "No setting found for %s" keyword) nil)))) From c8aba6f552a390fd7aebbe8e2e762a3016f2e5a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 14:42:42 +0200 Subject: [PATCH 2007/4235] Open eshell in project root by default If passed the universal arg (SPC u SPC o e) or (C-u M-x +eshell/open), it will open in the current directory. --- modules/emacs/eshell/autoload/eshell.el | 45 +++++++++++++------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 0cf4c1ea3..0c85dca54 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -72,10 +72,11 @@ ;; ;;;###autoload -(defun +eshell/open (&optional command) +(defun +eshell/open (arg &optional command) "Open eshell in the current buffer." - (interactive) - (let ((buf (+eshell--buffer (eq major-mode 'eshell-mode)))) + (interactive "P") + (let* ((default-directory (if arg default-directory (doom-project-root))) + (buf (+eshell--buffer (eq major-mode 'eshell-mode)))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (switch-to-buffer buf) @@ -84,10 +85,11 @@ (+eshell-run-command command)))) ;;;###autoload -(defun +eshell/open-popup (&optional command) +(defun +eshell/open-popup (arg &optional command) "Open eshell in a popup window." - (interactive) - (let ((buf (+eshell--buffer))) + (interactive "P") + (let* ((default-directory (if arg default-directory (doom-project-root))) + (buf (+eshell--buffer))) (with-current-buffer buf (unless (eq major-mode 'eshell-mode) (eshell-mode))) (pop-to-buffer buf) @@ -96,23 +98,24 @@ (+eshell-run-command command)))) ;;;###autoload -(defun +eshell/open-workspace (&optional command) +(defun +eshell/open-workspace (arg &optional command) "Open eshell in a separate workspace. Requires the (:feature workspaces) module to be loaded." - (interactive) - (unless (featurep! :feature workspaces) - (user-error ":feature workspaces is required, but disabled")) - (unless (+workspace-get "eshell" t) - (+workspace/new "eshell")) - (if-let* ((buf (cl-find-if (lambda (buf) (eq 'eshell-mode (buffer-local-value 'major-mode buf))) - (doom-visible-windows) - :key #'window-buffer))) - (select-window (get-buffer-window buf)) - (+eshell/open)) - (when command - (+eshell-run-command command)) - (+eshell--set-window (selected-window) t) - (doom/workspace-display)) + (interactive "P") + (let ((default-directory (if arg default-directory (doom-project-root)))) + (unless (featurep! :feature workspaces) + (user-error ":feature workspaces is required, but disabled")) + (unless (+workspace-get "eshell" t) + (+workspace/new "eshell")) + (if-let* ((buf (cl-find-if (lambda (buf) (eq 'eshell-mode (buffer-local-value 'major-mode buf))) + (doom-visible-windows) + :key #'window-buffer))) + (select-window (get-buffer-window buf)) + (+eshell/open arg)) + (when command + (+eshell-run-command command)) + (+eshell--set-window (selected-window) t) + (doom/workspace-display))) (defun +eshell-run-command (command) (unless (cl-remove-if-not #'buffer-live-p +eshell-buffers) From ab07e073522e859f2a14edff18a0f0cd29bf51b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 14:47:36 +0200 Subject: [PATCH 2008/4235] Improve general error handling at startup This will hopefully reveal more information as to the cause and origin of errors at startup. It should also make doom-debug-mode more likely to produce a backtrace in non-interactive sessions. --- core/autoload/help.el | 2 +- core/core-dispatcher.el | 7 +--- core/core-modules.el | 25 +++++++---- core/core-packages.el | 91 +++++++++++++++++++---------------------- core/core-ui.el | 2 +- core/core.el | 28 +++++++++++-- 6 files changed, 87 insertions(+), 68 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index ec5aa41c3..3eae63701 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -251,5 +251,5 @@ init.el and config.el. Then runs `doom-reload-hook'." (with-demoted-errors "PRIVATE CONFIG ERROR: %s" (doom-initialize-modules 'force)) (print! (green "%d packages reloaded" (length package-alist))) - (run-hooks 'doom-reload-hook) + (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) t)))) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 06d8a1529..491d39bc7 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -770,12 +770,9 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." total-ok (- (length target-files) total-noop) total-noop)))) (error - (print! (red "\n%%s\n\n%%s\n\n%%s") - "There were breaking errors." - (error-message-string ex) + (print! (red "\n%s\n\n%%s" "There were breaking errors.") "Reverting changes...") - (quiet! (doom-clean-byte-compiled-files)) - (print! (yellow "Finished (nothing was byte-compiled)")))))))) + (signal 'doom-error (list 'byte-compile e)))))))) (defun doom-clean-byte-compiled-files () "Delete all the compiled elc files in your Emacs configuration and private diff --git a/core/core-modules.el b/core/core-modules.el index 714feb350..1e2cd6929 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -27,6 +27,10 @@ A warning will be put out if these deprecated modules are used.") ;; Bootstrap API ;; +;; Custom errors +(define-error 'doom-autoload-error "Error in your autoloads file(s)" 'doom-error) +(define-error 'doom-private-error "Error in your private config" 'doom-error) + (defun doom-initialize-modules (&optional force-p) "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy session of Dooming. Will noop if used more than once, unless FORCE-P is @@ -36,16 +40,19 @@ non-nil." ;; recurse by accident if any of them need `doom-initialize-modules'. (setq doom-init-modules-p t) (when doom-private-dir - (load (expand-file-name "init" doom-private-dir) - 'noerror 'nomessage)))) + (condition-case e + (load (expand-file-name "init" doom-private-dir) + 'noerror 'nomessage) + (error (signal 'doom-private-error (list 'init e))))))) (defun doom-initialize-autoloads (file) "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." - (condition-case-unless-debug e + (condition-case e (load (file-name-sans-extension file) 'noerror 'nomessage) ('error - (message "Autoload error: %s -> %s" - (car e) (error-message-string e))))) + (if noninteractive + (message "Autoload file warning: %s -> %s" (car e) (error-message-string e)) + (signal 'doom-autoload-error e))))) ;; @@ -289,13 +296,15 @@ to least)." `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) - (run-hooks 'doom-init-hook) + (run-hook-wrapped 'doom-init-hook #'doom-try-run-hook) (unless noninteractive (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir - (load ,(expand-file-name "config" doom-private-dir) - t (not doom-debug-mode)))))))) + (condition-case e + (load ,(expand-file-name "config" doom-private-dir) + t (not doom-debug-mode)) + (error (signal 'doom-private-error (list 'config e)))))))))) (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) diff --git a/core/core-packages.el b/core/core-packages.el index 2933791eb..780cad089 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -110,31 +110,20 @@ them." (error "Could not initialize quelpa")))) (when (or force-p (not doom-packages)) - (let ((doom-modules (doom-modules))) + (let ((doom-modules (doom-modules)) + (doom--stage 'packages) + (noninteractive t)) (setq doom-packages nil) - (cl-flet - ((_load - (file &optional noerror) - (condition-case-unless-debug ex - (load file noerror 'nomessage 'nosuffix) - ('error - (lwarn 'doom-initialize-packages :warning - "%s in %s: %s" - (car ex) - (file-relative-name file doom-emacs-dir) - (error-message-string ex)))))) - (let ((doom--stage 'packages) - (noninteractive t)) - (_load (expand-file-name "packages.el" doom-core-dir)) - ;; We load the private packages file twice to ensure disabled - ;; packages are seen ASAP, and a second time to ensure privately - ;; overridden packages are properly overwritten. - (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) - (_load private-packages t) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-path (car key) (cdr key) "packages.el") - do (let ((doom--current-module key)) (_load path t))) - (_load private-packages t))))))))) + (load (expand-file-name "packages.el" doom-core-dir) t t) + ;; We load the private packages file twice to ensure disabled + ;; packages are seen ASAP, and a second time to ensure privately + ;; overridden packages are properly overwritten. + (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) + (load private-packages t t) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-path (car key) (cdr key) "packages.el") + do (let ((doom--current-module key)) (load path t t))) + (load private-packages t t))))))) ;; @@ -202,31 +191,35 @@ Returns t if package is successfully registered, and nil if it was disabled elsewhere." (declare (indent defun)) (doom--assert-stage-p 'packages #'package!) - (let* ((old-plist (cdr (assq name doom-packages))) - (pkg-recipe (or (plist-get plist :recipe) - (and old-plist (plist-get old-plist :recipe)))) - (pkg-pin (or (plist-get plist :pin) - (and old-plist (plist-get old-plist :pin)))) - (pkg-disable (or (plist-get plist :disable) - (and old-plist (plist-get old-plist :disable))))) - (when pkg-disable - (add-to-list 'doom-disabled-packages name nil #'eq)) - (when pkg-recipe - (when (= 0 (% (length pkg-recipe) 2)) - (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) - (when pkg-pin - (setq plist (plist-put plist :pin nil)))) - (dolist (prop '(:ignore :freeze)) - (when-let* ((val (plist-get plist prop))) - (setq plist (plist-put plist prop (eval val))))) - (when (file-in-directory-p (or (bound-and-true-p byte-compile-current-file) - load-file-name) - doom-private-dir) - (setq plist (plist-put plist :private t))) - `(progn - ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist) - (not (memq ',name doom-disabled-packages))))) + (condition-case e + (let* ((old-plist (cdr (assq name doom-packages))) + (pkg-recipe (or (plist-get plist :recipe) + (and old-plist (plist-get old-plist :recipe)))) + (pkg-pin (or (plist-get plist :pin) + (and old-plist (plist-get old-plist :pin)))) + (pkg-disable (or (plist-get plist :disable) + (and old-plist (plist-get old-plist :disable))))) + (when pkg-disable + (add-to-list 'doom-disabled-packages name nil #'eq)) + (when pkg-recipe + (when (= 0 (% (length pkg-recipe) 2)) + (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) + (when pkg-pin + (setq plist (plist-put plist :pin nil)))) + (dolist (prop '(:ignore :freeze)) + (when-let* ((val (plist-get plist prop))) + (setq plist (plist-put plist prop (eval val))))) + (when (file-in-directory-p (or (bound-and-true-p byte-compile-current-file) + load-file-name) + doom-private-dir) + (setq plist (plist-put plist :private t))) + `(progn + ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) + (map-put doom-packages ',name ',plist) + (not (memq ',name doom-disabled-packages)))) + (error + (signal 'doom-private-error + (list (list 'packages name) e))))) (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple diff --git a/core/core-ui.el b/core/core-ui.el index d2d8147d2..2d8d8821d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -724,7 +724,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; Ensure ansi codes in compilation buffers are replaced (add-hook 'compilation-filter-hook #'doom|compilation-ansi-color-apply) ;; - (run-hooks 'doom-init-ui-hook)) + (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) (add-hook 'doom-post-init-hook #'doom|init-ui) diff --git a/core/core.el b/core/core.el index 60db26474..941bc0bcc 100644 --- a/core/core.el +++ b/core/core.el @@ -115,6 +115,14 @@ else (except for `window-setup-hook').") (defvar doom--stage 'init) +;; +;; Custom error types +;; + +(define-error 'doom-error "Doom Emacs error") +(define-error 'doom-hook-error "Error in a Doom startup hook" 'doom-error) + + ;; ;; Emacs core configuration ;; @@ -231,6 +239,17 @@ original value of `symbol-file'." ;; Bootstrap helpers ;; +(defun doom-try-run-hook (hook) + "Run HOOK (a hook function), but marks thrown errors to make it a little +easier to tell where the came from. + +Meant to be used with `run-hook-wrapped'." + (condition-case e + (funcall hook) + (error (signal 'doom-hook-error (list hook e)))) + ;; return nil so `run-hook-wrapped' won't short circuit + nil) + (defun doom-ensure-same-emacs-version-p () "Check if the running version of Emacs has changed and set `doom-emacs-changed-p' if it has." @@ -274,16 +293,17 @@ If RETURN-P, return the message as a string instead of displaying it." (defun doom|post-init () "Run `doom-post-init-hook'. That's all." - (run-hooks 'doom-post-init-hook)) + (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)) (defun doom|run-all-startup-hooks () "Run all startup Emacs hooks. Meant to be executed after starting Emacs with -q or -Q, for example: emacs -Q -l init.el -f doom|run-all-startup-hooks" - (run-hooks 'after-init-hook 'delayed-warnings-hook - 'emacs-startup-hook 'term-setup-hook - 'window-setup-hook)) + (mapc #'doom-try-run-hook + (list 'after-init-hook 'delayed-warnings-hook + 'emacs-startup-hook 'term-setup-hook + 'window-setup-hook))) ;; From 32954ecb69f0e3e3f50e7508cbdeb8c9cdc8e44d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 14:52:24 +0200 Subject: [PATCH 2009/4235] Move compile-time fix for disabled packages This fix prevented the byte-compiler from trying to load packages that were disabled or failed their :when/:unless/:if predicates. This commit moves it into doom-byte-compile, so the :no-require predicate doesn't have to run on every package in an interactive session, eating MY PRECIOUS cpu cycles. I do love my cpu cycles, yessiree. --- core/core-dispatcher.el | 15 +++++++++++++-- core/core-modules.el | 28 ++++++++-------------------- core/core.el | 1 + 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 491d39bc7..0ae3c0e27 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -733,8 +733,19 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (message "Couldn't find any valid targets") (message "No targets to %scompile" (if recompile-p "re" ""))) (cl-return-from 'byte-compile)) - (condition-case ex - (let ((use-package-expand-minimally t)) + (condition-case e + (let ((use-package-defaults use-package-defaults) + (use-package-expand-minimally t)) + ;; Prevent packages from being loaded at compile time if they + ;; don't meet their own predicates. + (push (list :no-require t + (lambda (_name args) + (or (when-let* ((pred (or (plist-get args :if) + (plist-get args :when)))) + (not (eval pred t))) + (when-let* ((pred (plist-get args :unless))) + (eval pred t))))) + use-package-defaults) ;; Always compile private init file (push (expand-file-name "init.el" doom-private-dir) target-files) (push (expand-file-name "init.el" doom-emacs-dir) target-files) diff --git a/core/core-modules.el b/core/core-modules.el index 1e2cd6929..e58a48db1 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -179,28 +179,16 @@ non-nil, return paths of possible modules, activated or otherwise." (autoload 'use-package "use-package-core" nil nil t) +;; Adds the :after-call custom keyword to `use-package' (and consequently, +;; `def-package!'). :after-call takes a symbol or list of symbols. These symbols +;; can be functions or hook variables. +;; +;; (use-package X :after-call find-file-hook) +;; +;; This will load X on the first invokation of `find-file-hook' (then it will +;; remove itself from the hook/function). (defvar doom--deferred-packages-alist ()) (after! use-package-core - ;; Prevent packages from being loaded at compile time if they don't meet their - ;; own predicates. - (push (list :no-require t - (lambda (_name args) - (and (bound-and-true-p byte-compile-current-file) - (or (when-let* ((pred (or (plist-get args :if) - (plist-get args :when)))) - (not (eval pred t))) - (when-let* ((pred (plist-get args :unless))) - (eval pred t)))))) - use-package-defaults) - - ;; Adds the :after-call custom keyword to `use-package' (and consequently, - ;; `def-package!'). :after-call takes a symbol or list of symbols. These - ;; symbols can be functions or hook variables. - ;; - ;; (use-package X :after-call find-file-hook) - ;; - ;; This will load X on the first invokation of `find-file-hook' (then it will - ;; remove itself from the hook/function). (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) (setq use-package-keywords (use-package-list-insert :after-call use-package-keywords :after)) diff --git a/core/core.el b/core/core.el index 941bc0bcc..10ed1d972 100644 --- a/core/core.el +++ b/core/core.el @@ -162,6 +162,7 @@ else (except for `window-setup-hook').") use-package-compute-statistics doom-debug-mode use-package-verbose doom-debug-mode use-package-minimum-reported-time (if doom-debug-mode 0 0.1) + use-package-expand-minimally (not noninteractive) ;; byte compilation byte-compile-verbose doom-debug-mode byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local) From f6c7c136346b339c1569bc0b61a72aa5ce7d586e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 14:56:24 +0200 Subject: [PATCH 2010/4235] Clean up elcs only if compiling core or everything Sometimes we only want to compile one module, without getting rid of all our other compiled files. --- core/core-dispatcher.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 0ae3c0e27..1f45166fe 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -711,7 +711,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (message "Aborting.") (cl-return-from 'byte-compile))) (unless recompile-p - (doom-clean-byte-compiled-files) + (when (or (null modules) (equal modules '(":core"))) + (doom-clean-byte-compiled-files)) (doom-reload-autoloads)) (let (doom-emacs-changed-p noninteractive) From ca2c8b5a4592f129619afbaa6810f93538dc42fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 15:02:24 +0200 Subject: [PATCH 2011/4235] Minor refactor, across the board Do you see the board? Now look at the other side. That's how far this refactor extends. Yes. --- core/autoload/debug.el | 2 +- core/autoload/help.el | 2 +- modules/feature/evil/config.el | 3 +-- modules/feature/file-templates/autoload.el | 2 +- modules/tools/magit/config.el | 8 +++++--- modules/ui/doom-modeline/config.el | 23 +++++++++++----------- modules/ui/neotree/config.el | 2 +- modules/ui/popup/autoload/popup.el | 8 -------- modules/ui/popup/config.el | 8 ++++++++ modules/ui/pretty-code/autoload.el | 2 +- 10 files changed, 31 insertions(+), 29 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index a352ffc66..4e99faffe 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -275,7 +275,7 @@ If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." init-file esup-server-port esup-depth) - "--eval=(run-hooks 'after-init-hook 'emacs-startup-hook 'window-setup-hook)"))) + "--eval=(doom|run-all-startup-hooks)"))) (when esup-run-as-batch-p (setq process-args (append process-args '("--batch")))) (setq esup-child-process (apply #'start-process process-args))) diff --git a/core/autoload/help.el b/core/autoload/help.el index 3eae63701..b3e97d69d 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -232,7 +232,7 @@ live server (if one is found) to tell it to run this function. If called from an interactive session, tries to reload autoloads files (if necessary), reinistalize doom (via `doom-initialize') and reloads your private init.el and config.el. Then runs `doom-reload-hook'." - (interactive) + (interactive "P") (require 'core-dispatcher) (cond ((and noninteractive (not (daemonp))) (require 'server) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 3435a4fb0..e8d4b1297 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -89,8 +89,7 @@ variable for an explanation of the defaults (in comments). See (after! wgrep ;; A wrapper that invokes `wgrep-mark-deletion' across lines you use ;; `evil-delete' in wgrep buffers. - (define-key! wgrep-mode-map - [remap evil-delete] #'+evil-delete)) + (define-key wgrep-mode-map [remap evil-delete] #'+evil-delete)) ;; replace native folding commands (define-key! 'global diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 43315b931..7109de471 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -27,7 +27,7 @@ these properties: ;;;###autodef (defun set-file-templates! (&rest templates) - "Like `doom--set:file-template', but register many file templates at once." + "Like `set-file-templates!', but register many file templates at once." (after! (:when (boundp '+file-templates-alist)) (setq +file-templates-alist (append (list templates) +file-templates-alist)))) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 739a346c6..84a55f4fb 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -56,7 +56,8 @@ load everything.") ;; more so. (advice-add #'magithub-settings--format-magithub.enabled :override #'+magit*hub-settings--format-magithub.enabled)) - (magithub-feature-autoinject +magit-hub-features)) + (when +magit-hub-features + (magithub-feature-autoinject +magit-hub-features))) (def-package! magit-gitflow @@ -66,8 +67,9 @@ load everything.") (def-package! evil-magit :when (featurep! :feature evil +everywhere) :after magit - :init (setq evil-magit-state 'normal - evil-magit-use-z-for-folds t) + :init + (setq evil-magit-state 'normal + evil-magit-use-z-for-folds t) :config (define-key! magit-mode-map (kbd "M-1") nil diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 85aaaaf55..4fa65dda7 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -55,17 +55,18 @@ (add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) (add-hook 'doom-after-switch-window-hook #'+doom-modeline|set-selected-window) -(if (not (boundp 'after-focus-change-function)) - (progn - (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) - (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) - (defun +doom-modeline|refresh-frame () - (setq +doom-modeline-current-window nil) - (cl-loop for frame in (frame-list) - if (eq (frame-focus-state frame) t) - return (setq +doom-modeline-current-window (frame-selected-window frame))) - (force-mode-line-update)) - (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)) +(with-no-warnings + (if (not (boundp 'after-focus-change-function)) + (progn + (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) + (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) + (defun +doom-modeline|refresh-frame () + (setq +doom-modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq +doom-modeline-current-window (frame-selected-window frame))) + (force-mode-line-update)) + (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame))) ;; diff --git a/modules/ui/neotree/config.el b/modules/ui/neotree/config.el index b308ee247..07422fdab 100644 --- a/modules/ui/neotree/config.el +++ b/modules/ui/neotree/config.el @@ -40,7 +40,7 @@ :quit 'current :select t) (after! winner - (cl-pushnew neo-buffer-name winner-boring-buffers)) + (add-to-list 'winner-boring-buffers neo-buffer-name)) ;; The cursor always sits at bol. `+neotree*fix-cursor' and ;; `+neotree*indent-cursor' change that behavior, so that the cursor is always diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 32a1f8457..b3ad9fdf2 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -1,13 +1,5 @@ ;;; ui/popup/autoload/popup.el -*- lexical-binding: t; -*- -(defvar +popup--populate-wparams (not EMACS26+)) -(defvar +popup--inhibit-transient nil) -(defvar +popup--inhibit-select nil) -(defvar +popup--old-display-buffer-alist nil) -(defvar +popup--remember-last t) -(defvar +popup--last nil) -(defvar-local +popup--timer nil) - (defun +popup--remember (windows) "Remember WINDOWS (a list of windows) for later restoration." (cl-assert (cl-every #'windowp windows) t) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 7e89c04df..966cc74f6 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -24,6 +24,14 @@ Modifying this has no effect, unless done before ui/popup loads.") "Size of the margins to give popup windows. Set this to nil to disable margin adjustment.") +(defvar +popup--populate-wparams (not EMACS26+)) +(defvar +popup--inhibit-transient nil) +(defvar +popup--inhibit-select nil) +(defvar +popup--old-display-buffer-alist nil) +(defvar +popup--remember-last t) +(defvar +popup--last nil) +(defvar-local +popup--timer nil) + ;; ;; Global modes diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 46fe9a629..82be11ea2 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -289,7 +289,7 @@ Use the :iosevka property to enable (or disable) it regardless.") (tail (cdr l))) (cond ((not (consp l)) '()) ((not (consp tail)) (list head)) - ((cons head (cons nil (+pretty-code--icon-to-char tail))))))) + ((cons head (cons glue (+pretty-code--icon-to-char tail))))))) ;;;###autodef (defun set-pretty-symbols! (modes &rest plist) From 4685eddb66f992cf9731b8cd2eaef951fd449381 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 17:14:17 +0200 Subject: [PATCH 2012/4235] Don't eat stacks in backtraces in debug mode The error handlers were a little too effective. They obscured a large chunk of the stacktrace after errors, even in debug mode. This fixes that and ensures backtraces in debug mode are more helpful. --- core/core-modules.el | 8 +++++--- core/core-packages.el | 2 +- core/core.el | 3 ++- modules/emacs/eshell/autoload/evil.el | 6 +++--- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index e58a48db1..a5f09fc3a 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -43,13 +43,14 @@ non-nil." (condition-case e (load (expand-file-name "init" doom-private-dir) 'noerror 'nomessage) - (error (signal 'doom-private-error (list 'init e))))))) + ((debug error) + (signal 'doom-private-error (list 'init e))))))) (defun doom-initialize-autoloads (file) "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." (condition-case e (load (file-name-sans-extension file) 'noerror 'nomessage) - ('error + ((debug error) (if noninteractive (message "Autoload file warning: %s -> %s" (car e) (error-message-string e)) (signal 'doom-autoload-error e))))) @@ -292,7 +293,8 @@ to least)." (condition-case e (load ,(expand-file-name "config" doom-private-dir) t (not doom-debug-mode)) - (error (signal 'doom-private-error (list 'config e)))))))))) + ((debug error) + (signal 'doom-private-error (list 'config e)))))))))) (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) diff --git a/core/core-packages.el b/core/core-packages.el index 780cad089..ba858c613 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -217,7 +217,7 @@ elsewhere." ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) (map-put doom-packages ',name ',plist) (not (memq ',name doom-disabled-packages)))) - (error + ((debug error) (signal 'doom-private-error (list (list 'packages name) e))))) diff --git a/core/core.el b/core/core.el index 10ed1d972..e485a31d5 100644 --- a/core/core.el +++ b/core/core.el @@ -247,7 +247,8 @@ easier to tell where the came from. Meant to be used with `run-hook-wrapped'." (condition-case e (funcall hook) - (error (signal 'doom-hook-error (list hook e)))) + ((debug error) + (signal 'doom-hook-error (list hook e)))) ;; return nil so `run-hook-wrapped' won't short circuit nil) diff --git a/modules/emacs/eshell/autoload/evil.el b/modules/emacs/eshell/autoload/evil.el index 608b36354..f6bc1f3d9 100644 --- a/modules/emacs/eshell/autoload/evil.el +++ b/modules/emacs/eshell/autoload/evil.el @@ -21,11 +21,11 @@ already there)." ;;;###autoload (autoload '+eshell:run "emacs/eshell/autoload/evil" nil t) (evil-define-command +eshell:run (command bang) - ;; TODO Add COMMAND support + "TODO" (interactive "") (if bang - (+eshell/open command) - (+eshell/open-popup command))) + (+eshell/open nil command) + (+eshell/open-popup nil command))) ;;;###autoload (autoload '+eshell/evil-change "emacs/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-change (beg end type register yank-handler delete-func) From f653e20407e7bd72a4f5170c157a8f4dc49eb3b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 17:30:33 +0200 Subject: [PATCH 2013/4235] Fix disabled autodefs defined with cl-lib Stubs are defined as ordinary macros (with defmacro), but if an autodef is defined with cl-defun, defmacro can't handle the clisp-style argument lists, causing wrong-number-of-arguments errors. --- core/core-dispatcher.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 1f45166fe..53ce5453f 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -457,14 +457,18 @@ even if it doesn't need reloading!" (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" origin docstring)) (condition-case-unless-debug e - (append (list 'defmacro name arglist docstring) + (append (list (pcase type + (`defun 'defmacro) + (`cl-defun `cl-defmacro)) + name arglist docstring) (cl-loop for arg in arglist if (and (symbolp arg) (not (keywordp arg)) (not (memq arg cl--lambda-list-keywords))) - collect (list 'ignore arg) + collect arg into syms else if (listp arg) - collect (list 'ignore (car arg)))) + collect (car arg) into syms + finally return (if syms `((ignore ,@syms))))) ('error (message "Ignoring autodef %s (%s)" name e) From 15921306ce9b60f2530babbcde77aac0af55fac1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 17:32:44 +0200 Subject: [PATCH 2014/4235] Optimize :tools rotate-text No need for its config.el file! --- modules/tools/rotate-text/autoload.el | 4 ++++ modules/tools/rotate-text/config.el | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 modules/tools/rotate-text/config.el diff --git a/modules/tools/rotate-text/autoload.el b/modules/tools/rotate-text/autoload.el index e7662db99..f6b933c65 100644 --- a/modules/tools/rotate-text/autoload.el +++ b/modules/tools/rotate-text/autoload.el @@ -1,5 +1,9 @@ ;;; tools/rotate-text/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(after! rotate-text + (add-to-list 'rotate-text-words '("true" "false"))) + ;;;###autodef (cl-defun set-rotate-patterns! (modes &key symbols words patterns) "Declare :symbols, :words or :patterns (all lists of strings) that diff --git a/modules/tools/rotate-text/config.el b/modules/tools/rotate-text/config.el deleted file mode 100644 index df310e3a5..000000000 --- a/modules/tools/rotate-text/config.el +++ /dev/null @@ -1,4 +0,0 @@ -;;; tools/rotate-text/config.el -*- lexical-binding: t; -*- - -(after! rotate-text - (add-to-list 'rotate-text-words '("true" "false"))) From 7f79eb45799a0b06ed0573dabd7eff856e6018d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 22:31:27 +0200 Subject: [PATCH 2015/4235] Major redesign of emacs/eshell + :sh can now be fed commands to run immediately, e.g. :sh cd %:P to start from the current project root. + Eshell will spawn a new eshell on every split. This can be controlled via `+eshell-enable-new-shell-on-split' + Eshell can be configured to kill the window when you kill the eshell process. This is disabled by default. See `+eshell-kill-window-on-exit'. Some commands ignore this, like the quit-and-close command (I alias this to "q"). + eshell-directory-name has been moved to doom-etc-dir/eshell. It will seem like eshell has forgotten all your history, but you can move ~/.eshell (or ~/.doom.d/eshell) to ~/.emacs.d/.local/etc/eshell and you'll be fine. + eshell-aliases-file has been moved to ~/.doom.d/eshell_aliases by default. + Automatic writing to eshell-aliases-file has been disabled. No shell so aggressively persists aliases. You may maintain it yourself, or use the new +eshell-aliases variable to customize eshell from Doom. + C-s now invokes a history search with ivy/helm. + C-c s and C-c v split horizontally and vertically. Inspired by tmux. + C-c x kill the current eshell and its window. Inspired by tmux.j + New set-eshell-alias! autodef for defining your own aliases. + +eshell/open-workspace has been replaced with +eshell/open-fullscreen. + Added the "cd-to-project" command. I suggest you alias it. --- modules/emacs/eshell/autoload/commands.el | 14 ++ modules/emacs/eshell/autoload/eshell.el | 287 +++++++++++----------- modules/emacs/eshell/autoload/evil.el | 29 ++- modules/emacs/eshell/autoload/prompts.el | 31 +++ modules/emacs/eshell/autoload/settings.el | 16 ++ modules/emacs/eshell/config.el | 77 ++++-- 6 files changed, 284 insertions(+), 170 deletions(-) create mode 100644 modules/emacs/eshell/autoload/commands.el create mode 100644 modules/emacs/eshell/autoload/prompts.el create mode 100644 modules/emacs/eshell/autoload/settings.el diff --git a/modules/emacs/eshell/autoload/commands.el b/modules/emacs/eshell/autoload/commands.el new file mode 100644 index 000000000..021764857 --- /dev/null +++ b/modules/emacs/eshell/autoload/commands.el @@ -0,0 +1,14 @@ +;;; emacs/eshell/autoload/commands.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun eshell/cd-to-project () + "Change to the project root of the current directory." + (let* ((default-directory (eshell/pwd)) + (project-root (doom-project-root 'nocache))) + (eshell/cd project-root))) + +;;;###autoload +(defun eshell/quit-and-close (&rest _) + "Quit the current eshell buffer and close the window it's in." + (setq-local +eshell-kill-window-on-exit t) + (throw 'eshell-terminal t)) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 0c85dca54..d6b9fbc8e 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -1,29 +1,17 @@ ;;; emacs/eshell/autoload/eshell.el -*- lexical-binding: t; -*- -;;;###autoload -(defface +eshell-prompt-pwd '((t :inherit font-lock-constant-face)) - "TODO" - :group 'eshell) - -;;;###autoload -(defface +eshell-prompt-git-branch '((t :inherit font-lock-builtin-face)) - "TODO" - :group 'eshell) - +(defvar eshell-buffer-name "*doom eshell*") (defvar +eshell-buffers (make-ring 25) "List of open eshell buffers.") -(defvar +eshell-buffer-name "*doom eshell*" - "The name to use for custom eshell buffers. This only affects `+eshell/open', -`+eshell/open-popup' and `+eshell/open-workspace'.") -(defvar +eshell-last-buffer nil - "TODO") +(defvar +eshell--last-buffer nil) +(defvar-local +eshell--wconf nil) ;; -;; Library +;; Helpers ;; (defun +eshell--add-buffer (buf) @@ -34,37 +22,55 @@ (ring-remove +eshell-buffers idx) t)) -(defun +eshell--current-git-branch () - (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") - if (string-match-p "^\*" match) - collect match)))) - (if (not (eq branch nil)) - (format " [%s]" (substring branch 2)) - ""))) +(defun +eshell--bury-buffer () + (unless (switch-to-prev-buffer nil 'bury) + (switch-to-buffer (doom-fallback-buffer)) + (when +eshell-enable-new-shell-on-split + (+eshell/open t)))) -(defun +eshell--buffer (&optional new-p) - (or (unless new-p - (cl-loop for buf in (ring-elements +eshell-buffers) - if (and (buffer-live-p buf) - (not (get-buffer-window buf))) - return buf)) - (generate-new-buffer +eshell-buffer-name))) - -(defun +eshell--set-window (window &optional flag) - (when window +(defun +eshell--setup-window (window &optional flag) + (when (window-live-p window) (set-window-parameter window 'no-other-window flag) (set-window-parameter window 'visible flag))) +(defun +eshell--unused-buffer (&optional new-p) + (or (unless new-p + (cl-loop for buf in (ring-elements +eshell-buffers) + if (and (buffer-live-p buf) + (not (get-buffer-window buf t))) + return buf)) + (generate-new-buffer eshell-buffer-name))) + ;;;###autoload -(defun +eshell-prompt () - "Generate the prompt string for eshell. Use for `eshell-prompt-function'." - (concat (if (bobp) "" "\n") - (propertize (abbreviate-file-name (shrink-path-file (eshell/pwd))) - 'face '+eshell-prompt-pwd) - (propertize (+eshell--current-git-branch) - 'face '+eshell-prompt-git-branch) - (propertize " λ" 'face (if (zerop eshell-last-command-status) 'success 'error)) - " ")) +(defun +eshell-last-buffer (&optional noerror) + "Return the last opened eshell buffer." + (let ((buffer (cl-find-if #'buffer-live-p (ring-elements +eshell-buffers)))) + (cond ((buffer-live-p buffer) buffer) + (noerror nil) + ((user-error "No live eshell buffers remaining"))))) + +;;;###autoload +(defun +eshell-buffers () + "TODO" + (ring-elements +eshell-buffers)) + +;;;###autoload +(defun +eshell-run-command (command &optional buffer) + "TODO" + (let ((buffer + (or buffer + (if (eq major-mode 'eshell-mode) + (current-buffer) + (cl-find-if #'buffer-live-p (ring-elements +eshell-buffers)))))) + (unless buffer + (user-error "No living eshell buffers available")) + (unless (buffer-live-p buffer) + (user-error "Cannot operate on a dead buffer")) + (with-current-buffer buffer + (goto-char eshell-last-output-end) + (goto-char (line-end-position)) + (insert command) + (eshell-send-input nil t)))) ;; @@ -75,57 +81,64 @@ (defun +eshell/open (arg &optional command) "Open eshell in the current buffer." (interactive "P") + (when (eq major-mode 'eshell-mode) + (user-error "Already in an eshell buffer")) (let* ((default-directory (if arg default-directory (doom-project-root))) - (buf (+eshell--buffer (eq major-mode 'eshell-mode)))) - (with-current-buffer buf - (unless (eq major-mode 'eshell-mode) (eshell-mode))) - (switch-to-buffer buf) - (+eshell--set-window (get-buffer-window buf) t) - (when command - (+eshell-run-command command)))) + (buf (+eshell--unused-buffer))) + (with-current-buffer (switch-to-buffer buf) + (eshell-mode) + (if command (+eshell-run-command command buf))) + buf)) ;;;###autoload (defun +eshell/open-popup (arg &optional command) "Open eshell in a popup window." (interactive "P") (let* ((default-directory (if arg default-directory (doom-project-root))) - (buf (+eshell--buffer))) - (with-current-buffer buf - (unless (eq major-mode 'eshell-mode) (eshell-mode))) - (pop-to-buffer buf) - (+eshell--set-window (get-buffer-window buf) t) - (when command - (+eshell-run-command command)))) + (buf (+eshell--unused-buffer))) + (with-current-buffer (pop-to-buffer buf) + (eshell-mode) + (if command (+eshell-run-command command buf))) + buf)) ;;;###autoload -(defun +eshell/open-workspace (arg &optional command) +(defun +eshell/open-fullscreen (arg &optional command) "Open eshell in a separate workspace. Requires the (:feature workspaces) module to be loaded." (interactive "P") (let ((default-directory (if arg default-directory (doom-project-root)))) - (unless (featurep! :feature workspaces) - (user-error ":feature workspaces is required, but disabled")) - (unless (+workspace-get "eshell" t) - (+workspace/new "eshell")) - (if-let* ((buf (cl-find-if (lambda (buf) (eq 'eshell-mode (buffer-local-value 'major-mode buf))) - (doom-visible-windows) - :key #'window-buffer))) - (select-window (get-buffer-window buf)) - (+eshell/open arg)) - (when command - (+eshell-run-command command)) - (+eshell--set-window (selected-window) t) - (doom/workspace-display))) + (setq +eshell--wconf (current-window-configuration)) + (delete-other-windows) + (with-current-buffer (+eshell/open arg command) + (setq-local +eshell--wconf (current-window-configuration))))) -(defun +eshell-run-command (command) - (unless (cl-remove-if-not #'buffer-live-p +eshell-buffers) - (user-error "No living eshell buffers available")) - (with-current-buffer (car +eshell-buffers) - (goto-char eshell-last-output-end) - (when (bound-and-true-p evil-mode) - (call-interactively #'evil-append-line)) - (insert command) - (eshell-send-input nil t))) + +;; +;; Keybinds +;; + +;;;###autoload +(defun +eshell/search-history () + "Search the eshell command history with helm, ivy or `eshell-list-history'." + (interactive) + (cond ((featurep! :completion ivy) + (require 'em-hist) + (let* ((ivy-completion-beg (eshell-bol)) + (ivy-completion-end (point-at-eol)) + (input (buffer-substring-no-properties + ivy-completion-beg + ivy-completion-end))) + ;; Better than `counsel-esh-history' because that doesn't + ;; pre-populate the initial input or selection. + (ivy-read "Command: " + (delete-dups + (when (> (ring-size eshell-history-ring) 0) + (ring-elements eshell-history-ring))) + :initial-input input + :action #'ivy-completion-in-region-action))) + ((featurep! :completion helm) + (helm-eshell-history)) + ((eshell-list-history)))) ;;;###autoload (defun +eshell/pcomplete () @@ -135,41 +148,6 @@ bottom. This ties pcomplete into ivy or helm, if they are enabled." (require 'pcomplete) (pcomplete-std-complete)) - -;; -;; Hooks -;; - -;;;###autoload -(defun +eshell|init () - "Keep track of eshell buffers." - (let ((buf (current-buffer))) - (dolist (buf (ring-elements +eshell-buffers)) - (unless (buffer-live-p buf) - (+eshell--remove-buffer buf))) - (+eshell--add-buffer buf) - (setq +eshell-last-buffer buf))) - -;;;###autoload -(defun +eshell|cleanup () - "Close window (or workspace) on quit." - (let ((buf (current-buffer))) - (when (+eshell--remove-buffer buf) - (+eshell--set-window (get-buffer-window buf) nil) - (cond ((and (featurep! :feature workspaces) - (string= "eshell" (+workspace-current-name))) - (+workspace/delete "eshell")) - ((one-window-p) - (unless (doom-real-buffer-p (progn (previous-buffer) (current-buffer))) - (switch-to-buffer (doom-fallback-buffer)))) - ((and (fboundp '+popup-window-p) (+popup-window-p)) - (delete-window)))))) - - -;; -;; Keybinds -;; - ;;;###autoload (defun +eshell/quit-or-delete-char (arg) "Delete a character (ahead of the cursor) or quit eshell if there's nothing to @@ -179,10 +157,6 @@ delete." (eshell-life-is-too-much) (delete-char arg))) -(defsubst +eshell--bury-buffer () - (unless (switch-to-prev-buffer nil 'bury) - (switch-to-buffer (doom-fallback-buffer)))) - ;;;###autoload (defun +eshell/split-below () "Create a new eshell window below the current one." @@ -197,13 +171,8 @@ delete." (select-window (split-window-horizontally)) (+eshell--bury-buffer)) -;; `make-ring' -;; `ring-ref' -;; `ring-empty-p' -;; `ring-remove' - ;;;###autoload -(defun +eshell/next () +(defun +eshell/switch-to-next () "Switch to the next eshell buffer." (interactive) (when (ring-empty-p +eshell-buffers) @@ -211,7 +180,7 @@ delete." (switch-to-buffer (ring-next +eshell-buffers (current-buffer)))) ;;;###autoload -(defun +eshell/previous () +(defun +eshell/switch-to-previous () "Switch to the previous eshell buffer." (interactive) (when (ring-empty-p +eshell-buffers) @@ -219,30 +188,72 @@ delete." (switch-to-buffer (ring-previous +eshell-buffers (current-buffer)))) ;;;###autoload -(defun +eshell/open-last () +(defun +eshell/switch-to-last () "Switch to the last eshell buffer that was open (and is still alive)." (interactive) - (unless (buffer-live-p +eshell-last-buffer) - (setq +eshell-last-buffer nil) + (unless (buffer-live-p +eshell--last-buffer) + (setq +eshell--last-buffer nil) (user-error "No last eshell buffer to jump to")) - (switch-to-buffer +eshell-last-buffer)) + (switch-to-buffer +eshell--last-buffer)) ;;;###autoload -(defun +eshell/switch (buffer) +(defun +eshell/switch-to (buffer) "Interactively switch to another eshell buffer." (interactive (let ((buffers (doom-buffers-in-mode 'eshell-mode (delq (current-buffer) (ring-elements +eshell-buffers))))) (if (not buffers) (user-error "No eshell buffers are available") - (list (completing-read - "Eshell buffers" - (mapcar #'buffer-name buffers) - #'get-buffer - 'require-match - nil nil - (when (eq major-mode 'eshell-mode) - (buffer-name (current-buffer)))))))) + (list + (completing-read "Eshell buffers" + (mapcar #'buffer-name buffers) + #'get-buffer + 'require-match + nil nil + (when (eq major-mode 'eshell-mode) + (buffer-name (current-buffer)))))))) (if-let* ((window (get-buffer-window buffer))) (select-window window) (switch-to-buffer buffer))) + +;;;###autoload +(defun +eshell/kill-and-close () + "Kill the current eshell buffer and close its window." + (interactive) + (unless (eq major-mode 'eshell-mode) + (user-error "Not in an eshell buffer")) + (let ((+eshell-kill-window-on-exit t)) + (kill-this-buffer))) + + +;; +;; Hooks +;; + +;;;###autoload +(defun +eshell|init () + "Initialize and track this eshell buffer in `+eshell-buffers'." + (let ((buf (current-buffer))) + (dolist (buf (ring-elements +eshell-buffers)) + (unless (buffer-live-p buf) + (+eshell--remove-buffer buf))) + (+eshell--setup-window (get-buffer-window buf)) + (+eshell--add-buffer buf) + (setq +eshell--last-buffer buf))) + +;;;###autoload +(defun +eshell|cleanup () + "Close window (or workspace) on quit." + (let ((buf (current-buffer))) + (when (+eshell--remove-buffer buf) + (+eshell--setup-window (get-buffer-window buf) nil) + (cond (+eshell--wconf + (set-window-configuration +eshell--wconf)) + ((one-window-p) + (let ((prev (save-window-excursion (previous-buffer)))) + (unless (and prev (doom-real-buffer-p prev)) + (switch-to-buffer (doom-fallback-buffer))))) + ((or (and (fboundp '+popup-window-p) (+popup-window-p)) + +eshell-kill-window-on-exit) + (delete-window)))))) + diff --git a/modules/emacs/eshell/autoload/evil.el b/modules/emacs/eshell/autoload/evil.el index f6bc1f3d9..a6fd3c911 100644 --- a/modules/emacs/eshell/autoload/evil.el +++ b/modules/emacs/eshell/autoload/evil.el @@ -1,6 +1,27 @@ ;;; emacs/eshell/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) +;;;###autoload +(defun +eshell|init-evil () + "Replace `evil-collection-eshell-next-prompt-on-insert' with +`+eshell|goto-prompt-on-insert', which ensures the point is on the prompt when +changing to insert mode." + (dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook)) + (remove-hook hook 'evil-collection-eshell-next-prompt-on-insert t) + (add-hook hook '+eshell|goto-prompt-on-insert nil t))) + +;;;###autoload (autoload '+eshell:run "emacs/eshell/autoload/evil" nil t) +(evil-define-command +eshell:run (command bang) + "TODO" + (interactive "") + (let ((buffer (+eshell-last-buffer)) + (command (+evil*resolve-vim-path command))) + (cond (buffer + (select-window (get-buffer-window buffer)) + (+eshell-run-command command buffer)) + (bang (+eshell/open nil command)) + ((+eshell/open-popup nil command))))) + ;;;###autoload (defun +eshell|goto-prompt-on-insert () "Move cursor to the prompt when switching to insert mode (if point isn't @@ -19,14 +40,6 @@ already there)." (goto-char (point-max)) (evil-append 1)) -;;;###autoload (autoload '+eshell:run "emacs/eshell/autoload/evil" nil t) -(evil-define-command +eshell:run (command bang) - "TODO" - (interactive "") - (if bang - (+eshell/open nil command) - (+eshell/open-popup nil command))) - ;;;###autoload (autoload '+eshell/evil-change "emacs/eshell/autoload/evil" nil t) (evil-define-operator +eshell/evil-change (beg end type register yank-handler delete-func) "Like `evil-change' but will not delete/copy the prompt." diff --git a/modules/emacs/eshell/autoload/prompts.el b/modules/emacs/eshell/autoload/prompts.el new file mode 100644 index 000000000..8509486ed --- /dev/null +++ b/modules/emacs/eshell/autoload/prompts.el @@ -0,0 +1,31 @@ +;;; emacs/eshell/autoload/prompts.el -*- lexical-binding: t; -*- + +;;;###autoload +(defface +eshell-prompt-pwd '((t :inherit font-lock-constant-face)) + "TODO" + :group 'eshell) + +;;;###autoload +(defface +eshell-prompt-git-branch '((t :inherit font-lock-builtin-face)) + "TODO" + :group 'eshell) + + +(defun +eshell--current-git-branch () + (let ((branch (car (cl-loop for match in (split-string (shell-command-to-string "git branch") "\n") + if (string-match-p "^\*" match) + collect match)))) + (if (not (eq branch nil)) + (format " [%s]" (substring branch 2)) + ""))) + +;;;###autoload +(defun +eshell-default-prompt () + "Generate the prompt string for eshell. Use for `eshell-prompt-function'." + (concat (if (bobp) "" "\n") + (propertize (abbreviate-file-name (shrink-path-file (eshell/pwd))) + 'face '+eshell-prompt-pwd) + (propertize (+eshell--current-git-branch) + 'face '+eshell-prompt-git-branch) + (propertize " λ" 'face (if (zerop eshell-last-command-status) 'success 'error)) + " ")) diff --git a/modules/emacs/eshell/autoload/settings.el b/modules/emacs/eshell/autoload/settings.el new file mode 100644 index 000000000..1bec69ce6 --- /dev/null +++ b/modules/emacs/eshell/autoload/settings.el @@ -0,0 +1,16 @@ +;;; emacs/eshell/autoload/settings.el -*- lexical-binding: t; -*- + +;;;###autodef +(defun set-eshell-alias! (&rest aliases) + "Define aliases for eshell." + (or (cl-evenp (length aliases)) + (signal 'wrong-number-of-arguments (list 'even (length aliases)))) + (after! eshell + (while aliases + (map-put +eshell-aliases (pop aliases) (list (pop aliases)))) + (when (boundp 'eshell-command-aliases-list) + (if +eshell--default-aliases + (setq eshell-command-aliases-list + (append +eshell--default-aliases + +eshell-aliases)) + (setq eshell-command-aliases-list +eshell-aliases))))) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index cf6457222..092f4b894 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -6,11 +6,35 @@ ;; + `+eshell/open-workspace': open in separate tab (requires :feature ;; workspaces) -(defvar eshell-directory-name - (let ((dir (expand-file-name "eshell" doom-private-dir))) - (if (file-directory-p dir) - dir - "~/.eshell"))) +(defvar eshell-directory-name (concat doom-etc-dir "eshell")) + +(defvar eshell-aliases-file + (expand-file-name "eshell_aliases" doom-private-dir) + "The path to your eshell aliases file, where you may declare alises. This is +here as an alternative to `set-eshell-alias!'.") + +;; +(defvar +eshell-enable-new-shell-on-split t + "If non-nil, spawn a new eshell session after splitting from an eshell +buffer.") + +(defvar +eshell-kill-window-on-exit nil + "If non-nil, eshell will close windows along with its eshell buffers.") + +(defvar +eshell-aliases + '(("q" "exit") ; built-in + ("z" "cd =$1") ; built-in + ("bd" "eshell-up $1") ; `eshell-up' + ("rg" "rg --color=always") + ("ag" "ag --color=always")) + "An alist of default eshell aliases, meant to emulate useful shell utilities, +like fasd and bd. Note that you may overwrite these in your +`eshell-aliases-file'. This is here to provide an alternative, elisp-centric way +to define your aliases. + +You should use `det-eshell-alias!' to change this.") + +(defvar +eshell--default-aliases nil) ;; @@ -31,7 +55,7 @@ eshell-hist-ignoredups t ;; em-prompt eshell-prompt-regexp "^.* λ " - eshell-prompt-function #'+eshell-prompt + eshell-prompt-function #'+eshell-default-prompt ;; em-glob eshell-glob-case-insensitive t eshell-error-if-no-glob t) @@ -39,6 +63,10 @@ ;; Consider eshell buffers real (add-hook 'eshell-mode-hook #'doom|mark-buffer-as-real) + ;; Keep track of open eshell buffers + (add-hook 'eshell-mode-hook #'+eshell|init) + (add-hook 'eshell-exit-hook #'+eshell|cleanup) + ;; UI enhancements (defun +eshell|replace-fringes-with-margins () "Remove eshell's fringes and give it a margin of 1." @@ -47,28 +75,25 @@ (add-hook 'eshell-mode-hook #'+eshell|replace-fringes-with-margins) (add-hook 'eshell-mode-hook #'hide-mode-line-mode) - ;; Keep track of open eshell buffers - (add-hook 'eshell-mode-hook #'+eshell|init) - (add-hook 'eshell-exit-hook #'+eshell|cleanup) - - (after! em-alias - ;; Emulates popular shell utilities - (map-put eshell-command-aliases-list "z" '("cd =$1")) - (map-put eshell-command-aliases-list "bd" '("eshell-up $1"))) + ;; Don't auto-write our aliases! Let us manage our own `eshell-aliases-file' + ;; or configure `+eshell-aliases' via elisp. + (advice-add #'eshell-write-aliases-list :override #'ignore) + ;; Visual commands require a proper terminal. Eshell can't handle that, so + ;; it delegates these commands to a term buffer. (after! em-term - ;; Visual commands require a proper terminal. Eshell can't handle that, so - ;; it delegates these commands to a term buffer. (dolist (cmd '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim" "ncmpcpp")) - (cl-pushnew cmd eshell-visual-commands))) + (add-to-list 'eshell-visual-commands cmd))) - (defun +eshell|init-evil () - "Replace `evil-collection-eshell-next-prompt-on-insert' with -`+eshell|goto-prompt-on-insert'." - (dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook)) - (remove-hook hook 'evil-collection-eshell-next-prompt-on-insert t) - (add-hook hook '+eshell|goto-prompt-on-insert nil t))) - (add-hook 'eshell-mode-hook #'+eshell|init-evil) + (defun +eshell|init-aliases () + (setq +eshell--default-aliases eshell-command-aliases-list + eshell-command-aliases-list + (append eshell-command-aliases-list + +eshell-aliases))) + (add-hook 'eshell-alias-load-hook #'+eshell|init-aliases) + + (when (featurep! :feature evil +everywhere) + (add-hook 'eshell-mode-hook #'+eshell|init-evil)) (defun +eshell|init-keymap () "Setup eshell keybindings. This must be done in a hook because eshell-mode @@ -90,6 +115,10 @@ redefines its keys every time `eshell-mode' is enabled." "\C-p" #'eshell-previous-input "\C-n" #'eshell-next-input)) (define-key! eshell-mode-map + (kbd "C-s") #'+eshell/search-history + (kbd "C-c s") #'+eshell/split-below + (kbd "C-c v") #'+eshell/split-right + (kbd "C-c x") #'+eshell/kill-and-close [remap split-window-below] #'+eshell/split-below [remap split-window-right] #'+eshell/split-right [remap doom/backward-to-bol-or-indent] #'eshell-bol From 615735a40451abce5c2dac7f3b66c00c2f82e6fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Jun 2018 23:46:14 +0200 Subject: [PATCH 2016/4235] Add exato (x/html attribute text objects for evil) Bound to x --- modules/config/default/+bindings.el | 1 + modules/feature/evil/config.el | 3 +++ modules/feature/evil/packages.el | 1 + 3 files changed, 5 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 783e2def0..241d01ede 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -182,6 +182,7 @@ ;; evil (:after evil + :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr :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 diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e8d4b1297..0a6aba2ed 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -407,6 +407,9 @@ the new algorithm is confusing, like in python or ruby." (push "<" evil-args-openers) (push ">" evil-args-closers))) +(def-package! exato + :commands (evil-outer-xml-attr evil-inner-xml-attr)) + ;; ;; Multiple cursors compatibility (for the plugins that use it) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index cafea2efc..d316e16b1 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -27,3 +27,4 @@ (package! evil-surround) (package! evil-vimish-fold) (package! evil-visualstar) +(package! exato) From 5ec74fdffb9e266333b9e9a09b6909f7c9807b34 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Mon, 18 Jun 2018 20:29:37 -0500 Subject: [PATCH 2017/4235] Add Solidity Template Add Trigger and basic file template --- modules/feature/file-templates/config.el | 4 +++- .../file-templates/templates/solidity-mode/__sol | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 modules/feature/file-templates/templates/solidity-mode/__sol diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 7edda6d9c..b8c404e1b 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -91,7 +91,9 @@ don't have a :trigger property in `+file-templates-alist'.") ;; Shell scripts ("\\.zunit$" :trigger "__zunit" :mode sh-mode) (fish-mode) - (sh-mode)) + (sh-mode) + ;; Solidity + (solidity-mode :trigger "__sol")) "An alist of file template rules. The CAR of each rule is either a major mode symbol or regexp string. The CDR is a plist. See `doom--set:file-template' for more information.") diff --git a/modules/feature/file-templates/templates/solidity-mode/__sol b/modules/feature/file-templates/templates/solidity-mode/__sol new file mode 100644 index 000000000..46facfdb9 --- /dev/null +++ b/modules/feature/file-templates/templates/solidity-mode/__sol @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# group: file templates +# contributor: Edmund Miller +# name: solidity template +# -- +pragma solidity ^0.4.22; + +contract $0 { + +} \ No newline at end of file From 2c1b0ccaf8fcc6ab81b55419e7f02e3dbd34f5d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 00:47:20 +0200 Subject: [PATCH 2018/4235] Fix doom|run-all-startup-hooks Wasn't using doom-try-run-hook correctly. --- core/core.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index e485a31d5..e0478d49d 100644 --- a/core/core.el +++ b/core/core.el @@ -302,10 +302,10 @@ If RETURN-P, return the message as a string instead of displaying it." -q or -Q, for example: emacs -Q -l init.el -f doom|run-all-startup-hooks" - (mapc #'doom-try-run-hook - (list 'after-init-hook 'delayed-warnings-hook - 'emacs-startup-hook 'term-setup-hook - 'window-setup-hook))) + (dolist (hook (list 'after-init-hook 'delayed-warnings-hook + 'emacs-startup-hook 'term-setup-hook + 'window-setup-hook)) + (run-hook-wrapped hook #'doom-try-run-hook))) ;; From 16b341e605aff19399a0670ecd0441124ced5084 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 01:09:51 +0200 Subject: [PATCH 2019/4235] Move aya-persist-snippets-dir to doom-etc-dir --- modules/feature/snippets/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index e31f33124..9a3e6dcfe 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -51,4 +51,4 @@ ;; `auto-yasnippet' -(setq aya-persist-snippets-dir (concat doom-local-dir "auto-snippets/")) +(setq aya-persist-snippets-dir (concat doom-etc-dir "auto-snippets/")) From ccce20b58156f5c1de23367887f5277daf1117ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 11:59:23 +0200 Subject: [PATCH 2020/4235] set-evil-initial-state!: fix wrong-type-arguments Caused when set-evil-initial-state! was used with a single mode (which is 99% of the time!). Indirectly fixes #696 --- modules/feature/evil/autoload/evil.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 284e7b46b..1c1c86e8f 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -3,10 +3,10 @@ ;;;###autodef (defun set-evil-initial-state! (modes state) - "Set the initialize STATE of MODE using `evil-set-initial-state'." + "Set the initialize STATE of MODES using `evil-set-initial-state'." (after! evil (if (listp modes) - (dolist (mode modes) + (dolist (mode (doom-enlist modes)) (evil-set-initial-state mode state)) (evil-set-initial-state modes state)))) From 0501ea9c2caf6a757f01a850e84d48bcbb90c3b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 12:00:40 +0200 Subject: [PATCH 2021/4235] Fix auth-source-pass & password-store autoloads They were marked as macros, but aren't macros! This may fix #696 --- modules/tools/password-store/autoload.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index b16244bc3..14b644ee8 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -32,7 +32,7 @@ ;; API ;; -;;;###autoload (autoload 'auth-source-pass-parse-entry "auth-source-pass" nil nil t) +;;;###autoload (autoload 'auth-source-pass-parse-entry "auth-source-pass") ;;;###autoload (defalias '+pass-get-entry #'auth-source-pass-parse-entry) @@ -64,8 +64,8 @@ search of your username. May prompt for your gpg passphrase." ;; Commands ;; -;;;###autoload (autoload 'password-store-list "pass" nil nil t) -;;;###autoload (autoload 'password-store--completing-read "password-store" nil nil t) +;;;###autoload (autoload 'password-store-list "password-store") +;;;###autoload (autoload 'password-store--completing-read "password-store") ;;;###autoload (defun +pass/edit-entry (entry) From 8f76ee9a8a57774ba3c8e77369c8b8b2b12db142 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 13:00:05 +0200 Subject: [PATCH 2022/4235] Refactor feature/snippets + Don't clear yas-minor-mode-map; the default keybinds can be useful, esp to non-evil users. + Moved +snippets|enable-project-modes hook to autoloads file. + Reformat yasnippet config. --- modules/feature/snippets/autoload/snippets.el | 12 +++++++++ modules/feature/snippets/config.el | 26 +++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index 5ec7a9fd2..a7a144a5c 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -66,3 +66,15 @@ buggy behavior when is pressed in an empty field." (let ((sof (marker-position (yas--field-start field)))) (when (and field (> (point) sof)) (delete-region sof (point)))))) + + +;; +;; Hooks +;; + +(defun +snippets|enable-project-modes (mode &rest _) + "Automatically enable snippet libraries for project minor modes defined with +`def-project-mode!'." + (if (symbol-value mode) + (yas-activate-extra-mode mode) + (yas-deactivate-extra-mode mode))) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 9a3e6dcfe..80276db41 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -11,13 +11,6 @@ (def-package! yasnippet :commands (yas-minor-mode-on yas-expand yas-expand-snippet yas-lookup-snippet yas-insert-snippet yas-new-snippet yas-visit-snippet-file) - :preface - (defvar yas-minor-mode-map - (let ((map (make-sparse-keymap))) - (when (featurep! :feature evil) - (define-key map [remap yas-insert-snippet] #'+snippets/expand-on-region)) - map)) - :init ;; Ensure `yas-reload-all' is called as late as possible. Other modules could ;; have additional configuration for yasnippet. For example, file-templates. @@ -31,23 +24,18 @@ yas-also-auto-indent-first-line t yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) yas-triggers-in-field t) ; Allow nested snippets - (add-to-list 'yas-snippet-dirs '+snippets-dir nil #'eq) - - (defun +snippets|enable-project-modes (mode &rest _) - "Automatically enable snippet libraries for project minor modes defined with -`def-project-mode!'." - (if (symbol-value mode) - (yas-activate-extra-mode mode) - (yas-deactivate-extra-mode mode))) + ;; Register `def-project-mode!' modes with yasnippet. This enables project + ;; specific snippet libraries (e.g. for Laravel, React or Jekyll projects). (add-hook 'doom-project-hook #'+snippets|enable-project-modes) - ;; Exit snippets on ESC from normal mode (add-hook 'doom-escape-hook #'yas-abort-snippet) - + ;; Fix an error caused by smartparens interfering with yasnippet bindings (after! smartparens - ;; fix an error caused by smartparens interfering with yasnippet bindings - (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay))) + (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay)) + ;; Better `yas-insert-snippet' for evil users + (when (featurep! :feature evil) + (define-key yas-minor-mode-map [remap yas-insert-snippet] #'+snippets/expand-on-region))) ;; `auto-yasnippet' From fa360145596d95cff79be8d84850a461d7f467a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 13:19:44 +0200 Subject: [PATCH 2023/4235] Allow set-yas-minor-mode! to accept multiple modes --- modules/feature/snippets/autoload/settings.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/feature/snippets/autoload/settings.el b/modules/feature/snippets/autoload/settings.el index f02d5f187..32386f789 100644 --- a/modules/feature/snippets/autoload/settings.el +++ b/modules/feature/snippets/autoload/settings.el @@ -1,13 +1,16 @@ ;;; feature/snippets/autoload/settings.el -*- lexical-binding: t; -*- ;;;###autodef -(defun set-yas-minor-mode! (mode) - "Register a minor MODE with yasnippet so it can have its own snippets -category, if the folder exists." - (after! yasnippet - (let ((fn (intern (format "+snippets|register-%s" mode)))) - (fset fn (lambda () (+snippets|enable-project-modes mode))) - (add-hook (intern (format "%s-hook" mode)) fn)))) +(defun set-yas-minor-mode! (modes) + "Register minor MODES (one mode symbol or a list of them) with yasnippet so it +can have its own snippets category, if the folder exists." + (let ((fn (intern (format "+snippets|register-%s" mode)))) + (fset fn (lambda () + (make-local-variable 'yas--extra-modes) + (dolist (mode (doom-enlist modes)) + (add-to-list 'yas--extra-modes mode nil #'eq)) + (yas--load-pending-jits))) + (add-hook (intern (format "%s-hook" mode)) fn))) ;;;###autoload (def-setting! :yas-minor-mode (mode) From 746d90c3304f89dd57e1f9a15e2e118497257fcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 13:20:53 +0200 Subject: [PATCH 2024/4235] make-variable-buffer-local -> make-local-variable It is more correct to use the latter. --- modules/completion/company/autoload.el | 2 +- modules/lang/latex/config.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index d9934721b..04133b1c1 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -13,7 +13,7 @@ MODES should be one major-mode symbol or a list of them." (lambda () (when (or (eq major-mode mode) (and (boundp mode) (symbol-value mode))) (require 'company) - (make-variable-buffer-local 'company-backends) + (make-local-variable 'company-backends) (dolist (backend backends) (cl-pushnew backend company-backends :test #'equal))))) (add-hook hook fn)) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index f90a2200a..e7912bc93 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -206,7 +206,7 @@ ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is ;; not something `set-company-backend!' anticipates (and shouldn't have to!) (add-hook! LaTeX-mode - (make-variable-buffer-local 'company-backends) + (make-buffer-local 'company-backends) (company-auctex-init))) From ba1488279bc857b08bf7095aad88bac575a6ec3f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 14:11:01 +0200 Subject: [PATCH 2025/4235] Fix evil-escape aborting multiedit too eagerly When evil-escape is invoked from multiedit-insert state, it erroneously quits the current multiedit session entirely. No more. This can be removed when syl20bnr/evil-escape#83 is merged. --- modules/feature/evil/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 0a6aba2ed..9bd6bba8a 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -248,6 +248,12 @@ variable for an explanation of the defaults (in comments). See (add-hook 'pre-command-hook #'evil-escape-pre-command-hook) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config + ;; TODO PR this upstream + (defun +evil*escape-func (ret) + (if (eq evil-state 'multiedit-insert) + #'evil-multiedit-state + ret)) + (advice-add #'evil-escape-func :filter-return #'+evil*escape-func) ;; no `evil-escape' in minibuffer (add-hook 'evil-escape-inhibit-functions #'minibufferp)) From e703d3ec8a3aeb5f7fd672bd7bc3c665ec311cb9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 14:18:31 +0200 Subject: [PATCH 2026/4235] Fix default workspace tab faces The inherited faces were double-quoted --- modules/feature/workspaces/autoload/workspaces.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 158cfaf1f..22de28137 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -4,12 +4,12 @@ (defvar +workspace--index 0) ;;;###autoload -(defface +workspace-tab-selected-face '((t (:inherit 'highlight))) +(defface +workspace-tab-selected-face '((t (:inherit highlight))) "The face for selected tabs displayed by `+workspace/display'" :group 'persp-mode) ;;;###autoload -(defface +workspace-tab-face '((t (:inherit 'default))) +(defface +workspace-tab-face '((t (:inherit default))) "The face for selected tabs displayed by `+workspace/display'" :group 'persp-mode) From 5f04be599f3bfb0902bf9ae994abf7595bb00283 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 14:50:27 +0200 Subject: [PATCH 2027/4235] feature/workspaces: persist indirect buffers --- modules/feature/workspaces/config.el | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 04b0d0835..a5a3235bf 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -151,5 +151,30 @@ Uses `+workspaces-main' to determine the name of the main workspace." (persp-def-buffer-save/load :mode 'magit-status-mode :tag-symbol 'def-magit-status-buffer :save-vars '(major-mode default-directory) - :after-load-function #'(lambda (b &rest _) (with-current-buffer b (magit-refresh))))) + :after-load-function (lambda (b &rest _) (with-current-buffer b (magit-refresh)))) + ;; Restore indirect buffers + (defvar +workspaces--indirect-buffers-to-restore nil) + (persp-def-buffer-save/load + :tag-symbol 'def-indirect-buffer + :predicate #'buffer-base-buffer + :save-function (lambda (buf tag vars) + (list tag (buffer-name buf) vars + (buffer-name (buffer-base-buffer)))) + :load-function (lambda (savelist &rest _rest) + (destructuring-bind + (buf-name vars base-buf-name &rest _rest) (cdr savelist) + (push (cons buf-name base-buf-name) + +workspaces--indirect-buffers-to-restore) + nil))) + (defun +workspaces|reload-indirect-buffers (&rest _) + (dolist (ibc +workspaces--indirect-buffers-to-restore) + (let* ((nbn (car ibc)) + (bbn (cdr ibc)) + (bb (get-buffer bbn))) + (when bb + (when (get-buffer nbn) + (setq nbn (generate-new-buffer-name nbn))) + (make-indirect-buffer bb nbn t)))) + (setq +workspaces--indirect-buffers-to-restore nil)) + (add-hook 'persp-after-load-state-functions #'+workspaces|reload-indirect-buffers)) From 8cb36afa21f81ffa9b86b3059b42798be681f6f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 14:52:33 +0200 Subject: [PATCH 2028/4235] Switch to last workspace after persp-load A little more intuitive than just switching to main workspace. --- 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 a5a3235bf..97d37de1e 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -111,7 +111,10 @@ Uses `+workspaces-main' to determine the name of the main workspace." (defun +workspaces|leave-nil-perspective (&rest _) (when (string= (+workspace-current-name) persp-nil-name) - (persp-frame-switch +workspaces-main))) + (+workspace-switch (or (if (+workspace-p +workspace--last) +workspace--last) + (car (+workspace-list-names)) + +workspaces-main) + 'auto-create))) (add-hook 'persp-after-load-state-functions #'+workspaces|leave-nil-perspective) ;; Modify `delete-window' to close the workspace if used on the last window From d979c46ea225fd3e68f351a41daf92b7bc9f74c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 14:53:45 +0200 Subject: [PATCH 2029/4235] Make +workspaces-load-session replace current It should not merge with the current session. --- modules/feature/workspaces/autoload/workspaces.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 22de28137..3994c5517 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -119,6 +119,7 @@ Returns t if successful, nil otherwise." (defun +workspace-load-session (&optional name) "Replace current session with the entire session named NAME. If NAME is nil, use `persp-auto-save-fname'." + (mapc #'+workspace-delete (+workspace-list-names)) (persp-load-state-from-file (expand-file-name (or name persp-auto-save-fname) persp-save-dir))) From d5adf4ccbc70be9b30d33f3cef10ffaaf92fbc4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 14:59:41 +0200 Subject: [PATCH 2030/4235] Minor refactor of feature/workspaces Improve error handling and update docstrings+comments --- .../feature/workspaces/autoload/workspaces.el | 25 +++++++++++-------- modules/feature/workspaces/config.el | 5 ++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 3994c5517..e249f60e4 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -38,7 +38,7 @@ ;;;###autoload (defun +workspace-exists-p (name) "Returns t if NAME is the name of an existing workspace." - (cl-assert (stringp name) t) + (cl-check-type name string) (member name (+workspace-list-names))) ;;;###autoload @@ -57,6 +57,7 @@ (defun +workspace-get (name &optional noerror) "Return a workspace named NAME. Unless NOERROR is non-nil, this throws an error if NAME doesn't exist." + (cl-check-type name string) (when-let* ((persp (persp-get-by-name name))) (cond ((+workspace-p persp) persp) ((not noerror) @@ -86,13 +87,12 @@ The buffer list is ordered by recency (same as `buffer-list'). PERSP can be a string (name of a workspace) or a workspace (satisfies `+workspace-p'). If nil or omitted, it defaults to the current workspace." - (unless persp - (setq persp (+workspace-current))) - (unless (+workspace-p persp) - (error "You're in the nil perspective")) - (cl-loop for buf in (buffer-list) - if (+workspace-contains-buffer-p buf persp) - collect buf)) + (let ((persp (or persp (+workspace-current)))) + (unless (+workspace-p persp) + (user-error "Not in a valid workspace (%s)" persp)) + (cl-loop for buf in (buffer-list) + if (+workspace-contains-buffer-p buf persp) + collect buf))) ;;;###autoload (defun +workspace-orphaned-buffer-list () @@ -109,7 +109,7 @@ retrieve perspectives that were explicitly saved with `+workspace-save'. Returns t if successful, nil otherwise." (when (+workspace-exists-p name) - (error "A workspace named '%s' already exists." name)) + (user-error "A workspace named '%s' already exists." name)) (persp-load-from-file-by-names (expand-file-name +workspaces-data-file persp-save-dir) *persp-hash* (list name)) @@ -353,7 +353,7 @@ end of the workspace list." (when (and (stringp index) (string-match-p "^[0-9]+$" index)) (setq index (string-to-number index))) - (condition-case ex + (condition-case-unless-debug ex (let ((names (+workspace-list-names)) (old-name (+workspace-current-name))) (cond ((numberp index) @@ -544,7 +544,10 @@ created." to it. If in the main workspace and it's empty, recycle that workspace, without renaming it. -Should be hooked to `projectile-after-switch-project-hook'." +Afterwords, runs `+workspaces-switch-project-function'. By default, this prompts +the user to open a file in the new project. + +This be hooked to `projectile-after-switch-project-hook'." (when dir (setq +workspaces--project-dir dir)) (when (and persp-mode +workspaces--project-dir) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 97d37de1e..bbc80b14d 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -26,10 +26,11 @@ new project directory.") "The basename of the file to store single workspace perspectives. Will be stored in `persp-save-dir'.") +;; If emacs is passed --restore, restore the last session on startup. This is +;; particularly useful for the `+workspace/restart-emacs-then-restore' command. (defun +workspaces-restore-last-session (&rest _) (add-hook 'doom-post-init-hook #'+workspace/load-session 'append)) -(map-put command-switch-alist '"--restore" #'+workspaces-restore-last-session) - +(map-put command-switch-alist "--restore" #'+workspaces-restore-last-session) ;; ;; Plugins From 95b227f9fecc047aa5019edff42f88387b25c43f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 15:01:25 +0200 Subject: [PATCH 2031/4235] Fix docstring references to old settings --- modules/feature/file-templates/config.el | 4 ++-- modules/feature/lookup/autoload/lookup.el | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index b8c404e1b..3251fab84 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -95,8 +95,8 @@ don't have a :trigger property in `+file-templates-alist'.") ;; Solidity (solidity-mode :trigger "__sol")) "An alist of file template rules. The CAR of each rule is either a major mode -symbol or regexp string. The CDR is a plist. See `doom--set:file-template' for -more information.") +symbol or regexp string. The CDR is a plist. See `set-file-template!' for more +information.") ;; diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index bd3b0570e..967af7577 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -185,7 +185,7 @@ Falls back to a naive ripgrep/the_silver_searcher search otherwise." Goes down a list of possible backends: -1. The :documentation spec defined with by `doom--set:lookup' +1. The :documentation spec defined with by `set-lookup-handlers!' 2. If the +docsets flag is active for :feature lookup, use `+lookup/in-docsets' 3. If the +devdocs flag is active for :feature lookup, run `+lookup/in-devdocs' 4. Fall back to an online search, with `+lookup/online'" From d6706734a2000dcb35478e61132fce1ffad2ad80 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 15:25:30 +0200 Subject: [PATCH 2032/4235] SPC q r -> restart & restore emacs And SQP q R -> restart emacs (but don't restore) --- modules/config/default/+bindings.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 241d01ede..bc1e71dda 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -701,7 +701,8 @@ :desc "Quit Emacs" :n "q" #'evil-quit-all :desc "Save and quit" :n "Q" #'evil-save-and-quit :desc "Quit (forget session)" :n "X" #'+workspace/kill-session-and-quit - :desc "Restart Doom Emacs" :n "r" #'restart-emacs) + :desc "Restart & restore Doom" :n "r" #'+workspace/restart-emacs-then-restore + :desc "Restart Doom" :n "R" #'restart-emacs) (:when (featurep! :tools upload) (:desc "remote" :prefix "r" From 2e92f8d8a89f04df4f99e145647fb5218f3aea0d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 16:42:10 +0200 Subject: [PATCH 2033/4235] Keep backup of errant autoloads files --- core/core-dispatcher.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 53ce5453f..11cf9132f 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -342,16 +342,15 @@ it exists." (defun doom--byte-compile-file (file) (let ((short-name (file-name-nondirectory file)) (byte-compile-dynamic-docstrings t)) - (condition-case-unless-debug ex + (condition-case e (when (byte-compile-file file) (load (byte-compile-dest-file file) nil t) (unless noninteractive (message "Finished compiling %s" short-name))) - ('error + ((debug error) + (copy-file file (concat file ".bk") 'overwrite) (doom-delete-autoloads-file file) - (error "Error in %s: %s -- %s" - short-name - (car ex) (error-message-string ex)))))) + (signal 'doom-autoload-error (list short-name e)))))) (defun doom-reload-autoloads (&optional file force-p) "Reloads FILE (an autoload file), if it needs reloading. From 3b528302b2b043a735d3856f417212e1925abe88 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 16:43:08 +0200 Subject: [PATCH 2034/4235] Minor refactor of core-dispatcher --- core/core-dispatcher.el | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index 11cf9132f..bb8144334 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -40,8 +40,8 @@ omitted, show all available commands, their aliases and brief descriptions." (if command (princ (doom--dispatch-format desc)) (print! (bold "%-10s\t%s\t%s" "Command:" "Alias" "Description")) - (dolist (spec (sort doom--dispatch-command-alist - (lambda (x y) (string-lessp (car x) (car y))))) + (dolist (spec (cl-sort doom--dispatch-command-alist #'string-lessp + :key #'car)) (cl-destructuring-bind (command &key desc _body) spec (let ((aliases (cl-loop for (alias . cmd) in doom--dispatch-alias-alist if (eq cmd command) @@ -71,17 +71,15 @@ bin/doom help. BODY will be run when this dispatcher is called." (declare (doc-string 3)) - (let* ((command (doom-enlist command)) - (cmd (car command)) - (aliases (cdr command))) - `(progn - ,(when aliases - `(dolist (alias ',aliases) - (map-put doom--dispatch-alias-alist alias ',cmd))) - (map-put doom--dispatch-command-alist - ',cmd (list :desc ,docstring - ;; FIXME Implicit args var; ew - :body (lambda (args) ,form)))))) + (cl-destructuring-bind (cmd &rest aliases) (doom-enlist command) + (macroexp-progn + (append + (when aliases + `((dolist (alias ',aliases) + (map-put doom--dispatch-alias-alist alias ',cmd)))) + `((map-put doom--dispatch-command-alist ',cmd + (list :desc ,docstring + :body (lambda (args) ,form)))))))) ;; @@ -214,8 +212,11 @@ recompiling any changed compiled files. This is the shotgun solution to most problems with doom." (doom-reload-doom-autoloads force-p) (unwind-protect - (progn (ignore-errors (doom-packages-autoremove doom-auto-accept)) - (ignore-errors (doom-packages-install doom-auto-accept))) + (progn + (ignore-errors + (doom-packages-autoremove doom-auto-accept)) + (ignore-errors + (doom-packages-install doom-auto-accept))) (doom-reload-package-autoloads force-p) (doom-byte-compile nil 'recompile))) @@ -361,9 +362,9 @@ even if it doesn't need reloading!" (or (null file) (stringp file) (signal 'wrong-type-argument (list 'stringp file))) - (cond ((equal file doom-autoload-file) + (cond ((file-equal-p file doom-autoload-file) (doom-reload-doom-autoloads force-p)) - ((equal file doom-package-autoload-file) + ((file-equal-p file doom-package-autoload-file) (doom-reload-package-autoloads force-p)) ((progn (doom-reload-doom-autoloads force-p) From af350aa09e9960eb67f0db8ba8b83b765af486f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 16:43:28 +0200 Subject: [PATCH 2035/4235] feature/workspaces: disable magit persisting Too buggy! --- modules/feature/workspaces/config.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index bbc80b14d..ae8942116 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -151,11 +151,6 @@ Uses `+workspaces-main' to determine the name of the main workspace." :mode 'compilation-mode :tag-symbol 'def-compilation-buffer :save-vars '(major-mode default-directory compilation-directory compilation-environment compilation-arguments)) - ;; magit-status - (persp-def-buffer-save/load - :mode 'magit-status-mode :tag-symbol 'def-magit-status-buffer - :save-vars '(major-mode default-directory) - :after-load-function (lambda (b &rest _) (with-current-buffer b (magit-refresh)))) ;; Restore indirect buffers (defvar +workspaces--indirect-buffers-to-restore nil) (persp-def-buffer-save/load From c9014487b12e9c9bf0e6286dffec92212bef879e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 16:43:51 +0200 Subject: [PATCH 2036/4235] Restore workspaces on --restore later doom-post-init-hook isn't late enough. --- modules/feature/workspaces/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index ae8942116..bc225158a 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -29,7 +29,7 @@ stored in `persp-save-dir'.") ;; If emacs is passed --restore, restore the last session on startup. This is ;; particularly useful for the `+workspace/restart-emacs-then-restore' command. (defun +workspaces-restore-last-session (&rest _) - (add-hook 'doom-post-init-hook #'+workspace/load-session 'append)) + (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) (map-put command-switch-alist "--restore" #'+workspaces-restore-last-session) ;; From 279ee3cc8c9c22f9429d7405d22782c2d1f297b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 17:16:08 +0200 Subject: [PATCH 2037/4235] Fix stringp regression during autoloads generation Mentioned in #701 --- core/core-dispatcher.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index bb8144334..f4758ab1e 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -362,13 +362,14 @@ even if it doesn't need reloading!" (or (null file) (stringp file) (signal 'wrong-type-argument (list 'stringp file))) - (cond ((file-equal-p file doom-autoload-file) - (doom-reload-doom-autoloads force-p)) - ((file-equal-p file doom-package-autoload-file) - (doom-reload-package-autoloads force-p)) - ((progn - (doom-reload-doom-autoloads force-p) - (doom-reload-package-autoloads force-p))))) + (if (stringp file) + (cond ((file-equal-p file doom-autoload-file) + (doom-reload-doom-autoloads force-p)) + ((file-equal-p file doom-package-autoload-file) + (doom-reload-package-autoloads force-p)) + ((error "Invalid autoloads file: %s" file))) + (doom-reload-doom-autoloads force-p) + (doom-reload-package-autoloads force-p))) ;; From 0fefc43d391b5a13b956aee696fa80a93e4ee8c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 17:19:11 +0200 Subject: [PATCH 2038/4235] Refactor autoloads init & error handling Also reduces byte-compiled forms in the backtrace of a doom-autoload-error. --- core/core-dispatcher.el | 10 ++++++++-- core/core-modules.el | 9 --------- core/core.el | 9 +++++++++ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index f4758ab1e..c086be793 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -345,11 +345,17 @@ it exists." (byte-compile-dynamic-docstrings t)) (condition-case e (when (byte-compile-file file) - (load (byte-compile-dest-file file) nil t) + ;; Give autoloads file a chance to report error + (load (if doom-debug-mode + file + (byte-compile-dest-file file)) + nil t) (unless noninteractive (message "Finished compiling %s" short-name))) ((debug error) - (copy-file file (concat file ".bk") 'overwrite) + (let ((backup-file (concat file ".bk"))) + (message "Copied backup to %s" backup-file) + (copy-file file backup-file 'overwrite)) (doom-delete-autoloads-file file) (signal 'doom-autoload-error (list short-name e)))))) diff --git a/core/core-modules.el b/core/core-modules.el index a5f09fc3a..7e09f8822 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -46,15 +46,6 @@ non-nil." ((debug error) (signal 'doom-private-error (list 'init e))))))) -(defun doom-initialize-autoloads (file) - "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." - (condition-case e - (load (file-name-sans-extension file) 'noerror 'nomessage) - ((debug error) - (if noninteractive - (message "Autoload file warning: %s -> %s" (car e) (error-message-string e)) - (signal 'doom-autoload-error e))))) - ;; ;; Module API diff --git a/core/core.el b/core/core.el index e0478d49d..e2a06c867 100644 --- a/core/core.el +++ b/core/core.el @@ -373,6 +373,15 @@ to least)." (require 'core-projects) (require 'core-keybinds))) +(defun doom-initialize-autoloads (file) + "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." + (condition-case e + (load (file-name-sans-extension file) 'noerror 'nomessage) + ((debug error) + (if noninteractive + (message "Autoload file warning: %s -> %s" (car e) (error-message-string e)) + (signal 'doom-autoload-error (list (file-name-nondirectory file) e)))))) + ;; ;; Bootstrap Doom From 205cc718d2e12ff8d76a446b17619e3311745fb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 17:44:24 +0200 Subject: [PATCH 2039/4235] Fix dashboard not appearing in daemon frames Because they start in the *server* buffer, instead of the *scratch* buffer. --- 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 f8b316958..57594f903 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -207,7 +207,7 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (if (eq (current-buffer) (get-buffer "*scratch*")) + (if (string-match-p "^ ?\\*\\(?:scratch\\|server\\)" (buffer-name)) (doom-fallback-buffer) (current-buffer))) From f3b42a73b376c468b0613a41e52f2b64eda492de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 19:18:27 +0200 Subject: [PATCH 2040/4235] Silence early-init.el load at startup --- init.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/init.el b/init.el index ac0ca2237..0b3b905e0 100644 --- a/init.el +++ b/init.el @@ -28,6 +28,7 @@ ;;; License: MIT (unless (boundp 'early-init-file) - (load (concat (file-name-directory load-file-name) "early-init"))) + (load (concat (file-name-directory load-file-name) "early-init") + nil t)) (require 'core (concat user-emacs-directory "core/core")) From 7a98919597849c8d44ebf45e6f030dce0f5d5e9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 20:50:16 +0200 Subject: [PATCH 2041/4235] Fix quoting in babel popup rules Reported by @fuxialexander --- modules/lang/org/+babel.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 315fc1b9d..0af4f6389 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -73,16 +73,16 @@ string). Stops at the first function to return non-nil.") :config (set-popup-rules! '(("^\\*Org Src" - :side 'right :size 100 :height 0.6 :slot -1 + :side right :size 100 :height 0.6 :slot -1 :quit nil :select t) ("^\\*Python" - :slot 0 :side 'right :size 100 + :slot 0 :side right :size 100 :select nil :quit nil :ttl nil) ("\\*ob-ipython.*" - :slot 2 :side 'right :size 100 :height 0.2 + :slot 2 :side right :size 100 :height 0.2 :select nil :quit nil :transient nil) ("\\*Python:.*" - :slot 0 :side 'right :size 100 + :slot 0 :side right :size 100 :select nil :quit nil :transient nil))) ;; TODO Add more popup styles From e069139b1c30c716db6af9cf8a649d7945c25f6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 20:51:14 +0200 Subject: [PATCH 2042/4235] Prevent kill-emacs-hook running after byte-compile Prevents harmless errors after byte-compiling, or recentf needlessly saving its cache to file. --- core/core-dispatcher.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index c086be793..ce980ad42 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -739,7 +739,9 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;; Assemble el files we want to compile; taking into account that ;; MODULES may be a list of MODULE/SUBMODULE strings from the command ;; line. - (let ((target-files (doom-files-in targets :depth 1 :match "\\.el$"))) + (let ((target-files (doom-files-in targets :depth 1 :match "\\.el$")) + (load-path load-path) + kill-emacs-hook kill-buffer-query-functions) (unless target-files (if targets (message "Couldn't find any valid targets") From adf9b7d26fef19ca87e6a60d5846c75127aa3b8a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 20:54:09 +0200 Subject: [PATCH 2043/4235] Log & error-handle in :after-call hooks A load error no longer leaves Emacs in a broken state, but will report errors. These errors can still be investigated with debug-on-error on. --- core/core-modules.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/core-modules.el b/core/core-modules.el index 7e09f8822..8ec2a7710 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -194,7 +194,11 @@ non-nil, return paths of possible modules, activated or otherwise." (use-package-concat `((fset ',fn (lambda (&rest _) - (require ',name) + (when doom-debug-mode + (message "Loading deferred package %s from %s" ',name ',fn)) + (condition-case e (require ',name) + ((debug error) + (message "Failed to load deferred package %s: %s" ',name e))) (dolist (hook (cdr (assq ',name doom--deferred-packages-alist))) (if (functionp hook) (advice-remove hook #',fn) From 600d7bcb4f530faa9d543b368698dbc2fbbd0daa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Jun 2018 20:55:44 +0200 Subject: [PATCH 2044/4235] core: minor refactor/reformat + Prefer cl-loop over cl-mapcan for performance reasons. + Remove unnecessary let form + Log doom-try-run-hook when doom-debug-mode is on. --- core/core-dispatcher.el | 6 ++++-- core/core-modules.el | 14 +++++++------- core/core.el | 2 ++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/core/core-dispatcher.el b/core/core-dispatcher.el index ce980ad42..0c67eed0a 100644 --- a/core/core-dispatcher.el +++ b/core/core-dispatcher.el @@ -57,7 +57,8 @@ omitted, show all available commands, their aliases and brief descriptions." (cl-destructuring-bind (command &key desc body) (let ((sym (intern (car args)))) (or (assq sym doom--dispatch-command-alist) - (assq (cdr (assq sym doom--dispatch-alias-alist)) doom--dispatch-command-alist) + (assq (cdr (assq sym doom--dispatch-alias-alist)) + doom--dispatch-command-alist) (error "Invalid command: %s" (car args)))) (if help (apply #'doom--dispatch-help command desc (cdr args)) @@ -71,7 +72,8 @@ bin/doom help. BODY will be run when this dispatcher is called." (declare (doc-string 3)) - (cl-destructuring-bind (cmd &rest aliases) (doom-enlist command) + (cl-destructuring-bind (cmd &rest aliases) + (doom-enlist command) (macroexp-progn (append (when aliases diff --git a/core/core-modules.el b/core/core-modules.el index 8ec2a7710..a3d6035a4 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -94,8 +94,9 @@ Example: (unless (plist-member plist :path) (plist-put plist :path (or (plist-get old-plist :path) (doom-module-locate-path category module)))))) - (let ((key (cons category module))) - (puthash key plist doom-modules))) + (puthash (cons category module) + plist + doom-modules)) (defun doom-module-path (category module &optional file) "Like `expand-file-name', but expands FILE relative to CATEGORY (keywordp) and @@ -205,11 +206,10 @@ non-nil, return paths of possible modules, activated or otherwise." (remove-hook hook #',fn))) (map-delete doom--deferred-packages-alist ',name) (fmakunbound ',fn)))) - (cl-mapcan (lambda (hook) - (if (functionp hook) - `((advice-add #',hook :before #',fn)) - `((add-hook ',hook #',fn)))) - hooks) + (cl-loop for hook in hooks + collect (if (functionp hook) + `(advice-add #',hook :before #',fn) + `(add-hook ',hook #',fn))) `((map-put doom--deferred-packages-alist ',name '(,@hooks ,@(cdr (assq name doom--deferred-packages-alist))))) diff --git a/core/core.el b/core/core.el index e2a06c867..b931ed286 100644 --- a/core/core.el +++ b/core/core.el @@ -245,6 +245,8 @@ original value of `symbol-file'." easier to tell where the came from. Meant to be used with `run-hook-wrapped'." + (when doom-debug-mode + (message "Running doom hook: %s" hook)) (condition-case e (funcall hook) ((debug error) From 84756b33a0b10a6a5aafc65daf733a470a3062f2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 01:57:57 +0200 Subject: [PATCH 2045/4235] Fix closure symbolp errors blocking stacktraces Caused because of symbol-file advice assuming SYMBOL would always be a symbol. This would prevent backtraces from happening, making debugging impossibly obtuse. This may indirectly fix #701 --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index b931ed286..3e9026600 100644 --- a/core/core.el +++ b/core/core.el @@ -228,7 +228,7 @@ with functions that require it (like modeline segments)." (defun doom*symbol-file (orig-fn symbol &optional type) "If a `doom-file' symbol property exists on SYMBOL, use that instead of the original value of `symbol-file'." - (or (get symbol 'doom-file) + (or (if (symbolp symbol) (get symbol 'doom-file)) (funcall orig-fn symbol type))) (advice-add #'symbol-file :around #'doom*symbol-file) From 151858a8dc3fe736c680a1c19a9de3ddad79d5ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 02:07:12 +0200 Subject: [PATCH 2046/4235] Redesign Doom error handling Another refactor, again to improve the locality of doom errors and make the data that accompanies them more useful in determining the origin and source of issues. Also, bin/doom is now a little more informative about how to debug errors. --- bin/doom | 17 +++++++- core/core-lib.el | 20 +++++++-- core/core-modules.el | 14 ++----- core/core-packages.el | 96 ++++++++++++++++++++++--------------------- core/core.el | 6 ++- 5 files changed, 89 insertions(+), 64 deletions(-) diff --git a/bin/doom b/bin/doom index 9ddbc2b54..01c990e4b 100755 --- a/bin/doom +++ b/bin/doom @@ -85,5 +85,18 @@ ((let ((default-directory emacs-dir)) (setq argv nil noninteractive 'doom) - (doom-dispatch args))))) - + (condition-case e (doom-dispatch args) + ((debug error) + (message "--------------------------------------------------\n") + (message "There was an unexpected error:") + (message " %s (%s)" (get (car e) 'error-message) (car e)) + (dolist (item (cdr e)) + (message " %s" item)) + (unless debug-on-error + (message + (concat "\nRun the command again with the -d (or --debug) option to enable debug\n" + "mode and, hopefully, generate a stack trace. If you decide to file a bug\n" + "report, please include it!\n\n" + "Emacs outputs to standard error, so you'll need to redirect stderr to\n" + "stdout to pipe this to a file or clipboard!\n\n" + " e.g. doom -d install 2>&1 | clipboard-program"))))))))) diff --git a/core/core-lib.el b/core/core-lib.el index ba118a2cd..6f66cdafe 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -463,10 +463,22 @@ If NOERROR is non-nil, don't throw an error if the file doesn't exist." (setq path (or (DIR!) (error "Could not detect path to look for '%s' in" filename)))) - `(load ,(if path - `(expand-file-name ,filename ,path) - filename) - ,noerror ,(not doom-debug-mode))) + (let ((file (if path `(expand-file-name ,filename ,path) filename))) + `(condition-case e + (load ,file ,noerror ,(not doom-debug-mode)) + ((debug doom-error) (signal (car e) (cdr e))) + ((debug error) + (let* ((source (file-name-sans-extension ,file)) + (err (cond ((file-in-directory-p source doom-core-dir) + (cons 'doom-error doom-core-dir)) + ((file-in-directory-p source doom-private-dir) + (cons 'doom-private-error doom-private-dir)) + ((cons 'doom-module-error doom-emacs-dir))))) + (signal (car err) + (list (file-relative-name + (concat source ".el") + (cdr err)) + e))))))) (provide 'core-lib) ;;; core-lib.el ends here diff --git a/core/core-modules.el b/core/core-modules.el index a3d6035a4..8ba8de2aa 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -27,10 +27,6 @@ A warning will be put out if these deprecated modules are used.") ;; Bootstrap API ;; -;; Custom errors -(define-error 'doom-autoload-error "Error in your autoloads file(s)" 'doom-error) -(define-error 'doom-private-error "Error in your private config" 'doom-error) - (defun doom-initialize-modules (&optional force-p) "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy session of Dooming. Will noop if used more than once, unless FORCE-P is @@ -43,8 +39,8 @@ non-nil." (condition-case e (load (expand-file-name "init" doom-private-dir) 'noerror 'nomessage) - ((debug error) - (signal 'doom-private-error (list 'init e))))))) + ((debug doom-error) (signal (car e) (cdr e))) + ((debug error) (signal 'doom-private-error (list "init.el" e))))))) ;; @@ -285,11 +281,7 @@ to least)." (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir - (condition-case e - (load ,(expand-file-name "config" doom-private-dir) - t (not doom-debug-mode)) - ((debug error) - (signal 'doom-private-error (list 'config e)))))))))) + (load! "config" doom-private-dir))))))) (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) diff --git a/core/core-packages.el b/core/core-packages.el index ba858c613..e4693ea05 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -93,13 +93,11 @@ them." ;; the current session, but if you change an packages.el file in a module, ;; there's no non-trivial way to detect that, so we give you a way to ;; reload only doom-packages (by passing 'internal as FORCE-P). - ;; `doom-packages' (unless (eq force-p 'internal) ;; `package-alist' (when (or force-p (not (bound-and-true-p package-alist))) (setq load-path (cons doom-core-dir doom-site-load-path)) (doom-ensure-packages-initialized 'force)) - ;; `quelpa-cache' (when (or force-p (not (bound-and-true-p quelpa-cache))) ;; ensure un-byte-compiled version of quelpa is loaded @@ -108,22 +106,32 @@ them." (setq quelpa-initialized-p nil) (or (quelpa-setup-p) (error "Could not initialize quelpa")))) - + ;; `doom-packages' (when (or force-p (not doom-packages)) - (let ((doom-modules (doom-modules)) - (doom--stage 'packages) - (noninteractive t)) - (setq doom-packages nil) - (load (expand-file-name "packages.el" doom-core-dir) t t) - ;; We load the private packages file twice to ensure disabled - ;; packages are seen ASAP, and a second time to ensure privately - ;; overridden packages are properly overwritten. - (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) - (load private-packages t t) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-path (car key) (cdr key) "packages.el") - do (let ((doom--current-module key)) (load path t t))) - (load private-packages t t))))))) + (cl-flet + ((_load + (lambda (file &optional noerror) + (condition-case e + (load file noerror t t) + ((debug error) + (signal 'doom-package-error + (list (or (doom-module-from-path file) + '(:private . packages)) + e))))))) + (let ((doom-modules (doom-modules)) + (doom--stage 'packages) + (noninteractive t)) + (setq doom-packages nil) + (_load (expand-file-name "packages.el" doom-core-dir)) + ;; We load the private packages file twice to ensure disabled + ;; packages are seen ASAP, and a second time to ensure privately + ;; overridden packages are properly overwritten. + (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) + (_load private-packages t) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-path (car key) (cdr key) "packages.el") + do (let ((doom--current-module key)) (_load path t))) + (_load private-packages t)))))))) ;; @@ -191,35 +199,31 @@ Returns t if package is successfully registered, and nil if it was disabled elsewhere." (declare (indent defun)) (doom--assert-stage-p 'packages #'package!) - (condition-case e - (let* ((old-plist (cdr (assq name doom-packages))) - (pkg-recipe (or (plist-get plist :recipe) - (and old-plist (plist-get old-plist :recipe)))) - (pkg-pin (or (plist-get plist :pin) - (and old-plist (plist-get old-plist :pin)))) - (pkg-disable (or (plist-get plist :disable) - (and old-plist (plist-get old-plist :disable))))) - (when pkg-disable - (add-to-list 'doom-disabled-packages name nil #'eq)) - (when pkg-recipe - (when (= 0 (% (length pkg-recipe) 2)) - (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) - (when pkg-pin - (setq plist (plist-put plist :pin nil)))) - (dolist (prop '(:ignore :freeze)) - (when-let* ((val (plist-get plist prop))) - (setq plist (plist-put plist prop (eval val))))) - (when (file-in-directory-p (or (bound-and-true-p byte-compile-current-file) - load-file-name) - doom-private-dir) - (setq plist (plist-put plist :private t))) - `(progn - ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist) - (not (memq ',name doom-disabled-packages)))) - ((debug error) - (signal 'doom-private-error - (list (list 'packages name) e))))) + (let* ((old-plist (cdr (assq name doom-packages))) + (pkg-recipe (or (plist-get plist :recipe) + (and old-plist (plist-get old-plist :recipe)))) + (pkg-pin (or (plist-get plist :pin) + (and old-plist (plist-get old-plist :pin)))) + (pkg-disable (or (plist-get plist :disable) + (and old-plist (plist-get old-plist :disable))))) + (when pkg-disable + (add-to-list 'doom-disabled-packages name nil #'eq)) + (when pkg-recipe + (when (= 0 (% (length pkg-recipe) 2)) + (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) + (when pkg-pin + (setq plist (plist-put plist :pin nil)))) + (dolist (prop '(:ignore :freeze)) + (when-let* ((val (plist-get plist prop))) + (setq plist (plist-put plist prop (eval val))))) + (when (file-in-directory-p (or (bound-and-true-p byte-compile-current-file) + load-file-name) + doom-private-dir) + (setq plist (plist-put plist :private t))) + `(progn + ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) + (map-put doom-packages ',name ',plist) + (not (memq ',name doom-disabled-packages))))) (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple diff --git a/core/core.el b/core/core.el index 3e9026600..d86fa22f1 100644 --- a/core/core.el +++ b/core/core.el @@ -119,8 +119,12 @@ else (except for `window-setup-hook').") ;; Custom error types ;; -(define-error 'doom-error "Doom Emacs error") +(define-error 'doom-error "Error in Doom Emacs core") (define-error 'doom-hook-error "Error in a Doom startup hook" 'doom-error) +(define-error 'doom-autoload-error "Error in an autoloads file" 'doom-error) +(define-error 'doom-module-error "Error in a Doom module" 'doom-error) +(define-error 'doom-private-error "Error in private config" 'doom-error) +(define-error 'doom-package-error "Error with packages" 'doom-error) ;; From 9f9b7ad792c5301dde0927a205cc5be846df53ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 02:07:20 +0200 Subject: [PATCH 2047/4235] Add EMACSDIR envvar support to bin/doom As an alternative to the -e/--emacsd options. Sometimes it is more consistent to customize bin/doom this way. e.g. EMACS=/another/bin/emacs DOOMDIR=~/someplace EMACSDIR=~/emacsd bin/doom install --- bin/doom | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index 01c990e4b..0b21a0382 100755 --- a/bin/doom +++ b/bin/doom @@ -40,7 +40,8 @@ ;; (let ((args (cdr (cdr (cdr command-line-args)))) - (emacs-dir (expand-file-name "../" (file-name-directory load-file-name)))) + (emacs-dir (or (getenv "EMACSDIR") + (expand-file-name "../" (file-name-directory load-file-name))))) ;; Parse options (while (ignore-errors (string-prefix-p "-" (car args))) (pcase (pop args) @@ -61,14 +62,15 @@ (message "DOOMDIR changed to %s" doom-private-dir)) ((or "-e" "--emacsd") (setq emacs-dir (expand-file-name (concat (pop args) "/"))) - (or (file-directory-p emacs-dir) - (error "%s does not exist" emacs-dir)) (message "Emacs directory changed to %s" emacs-dir)) ((or "-y" "--yes") (setq doom-auto-accept t) (setenv "YES" "1") (message "Auto-yes mode on")))) + (or (file-directory-p emacs-dir) + (error "%s does not exist" emacs-dir)) + ;; Bootstrap Doom (load (expand-file-name "init" emacs-dir) nil 'nomessage) From 5cb1d5d4c9960a4ea7a356f76939b7ae082109b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 02:08:34 +0200 Subject: [PATCH 2048/4235] eval-after-load -> with-eval-after-load The way Doom was using eval-after-load ensured its form were never byte-compiled or even checked by the byte-compiler, because they were treated as quoted forms (data), and thus eval'ed. Friends don't let friends use eval. --- core/core-lib.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 6f66cdafe..3ea39d001 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -232,7 +232,8 @@ compilation. This will no-op on features that have been disabled by the user." (put ',fun 'permanent-local-hook t) (add-hook 'after-load-functions #',fun))))) ((symbolp targets) - `(eval-after-load ',targets '(progn ,@body))) + `(with-eval-after-load ',targets + ,@body)) ((and (consp targets) (memq (car targets) '(:or :any))) `(progn From 27ab47cd11e66dddeb00f798d821cce1a41ba103 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 02:12:37 +0200 Subject: [PATCH 2049/4235] Improve *Backtrace* popup rule + High vslot = unlikely to be replaced by other popups. + Make it large; backtraces are important! + Don't allow ESC to close it. It must be done manually, with q or zx --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 966cc74f6..b544ac9d2 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -159,7 +159,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; `Info-mode' ("^\\*info\\*$" :slot 2 :vslot 2 :size 0.45 :select t))) - '(("^\\*Backtrace" :ignore t))) + '(("^\\*Backtrace" :vslot 99 :size 0.5 :quit nil))) (add-hook 'doom-init-ui-hook #'+popup-mode :append) From 71f0b3ba106e5872f3857b2f8997bf3cbdd7b99f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 02:23:55 +0200 Subject: [PATCH 2050/4235] Minor error handler refactor in package management Allow debugger to produce better backtraces. --- core/autoload/packages.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index c23ef0607..43ccc0d79 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -41,15 +41,14 @@ (doom--refresh-pkg-cache)) (unless (or (doom-cache-get 'last-pkg-refresh) doom--refreshed-p) - (condition-case-unless-debug ex + (condition-case e (progn (message "Refreshing package archives") - (package-refresh-contents) + (package-refresh-contents (not doom-debug-mode)) (doom-cache-set 'last-pkg-refresh t 1200)) - ('error + ((debug error) (doom--refresh-pkg-cache) - (message "Failed to refresh packages: (%s) %s" - (car ex) (error-message-string ex)))))) + (signal 'doom-error e))))) ;;;###autoload (defun doom-package-backend (name &optional noerror) @@ -340,8 +339,9 @@ example; the package name can be omitted)." (condition-case e (let (quelpa-upgrade-p) (quelpa recipe)) - ('error (doom--delete-package-files name) - (signal (car e) (cdr e)))) + ((debug error) + (doom--delete-package-files name) + (signal (car e) (cdr e)))) (package-install name)) (if (not (package-installed-p name)) (doom--delete-package-files name) @@ -366,8 +366,9 @@ package.el as appropriate." (condition-case e (let ((quelpa-upgrade-p t)) (quelpa (assq name quelpa-cache))) - ('error (doom--delete-package-files name) - (signal (car e) (cdr e))))) + ((debug error) + (doom--delete-package-files name) + (signal (car e) (cdr e))))) (`elpa (let* ((archive (cadr (assq name package-archive-contents))) (packages From 6ce30d0116c5dea4935212b35f6d76aa93aa5766 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 02:33:24 +0200 Subject: [PATCH 2051/4235] add-yas-minor-mode!: fix void-variable: mode error --- modules/feature/snippets/autoload/settings.el | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/modules/feature/snippets/autoload/settings.el b/modules/feature/snippets/autoload/settings.el index 32386f789..b9769afa2 100644 --- a/modules/feature/snippets/autoload/settings.el +++ b/modules/feature/snippets/autoload/settings.el @@ -4,13 +4,10 @@ (defun set-yas-minor-mode! (modes) "Register minor MODES (one mode symbol or a list of them) with yasnippet so it can have its own snippets category, if the folder exists." - (let ((fn (intern (format "+snippets|register-%s" mode)))) - (fset fn (lambda () - (make-local-variable 'yas--extra-modes) - (dolist (mode (doom-enlist modes)) - (add-to-list 'yas--extra-modes mode nil #'eq)) - (yas--load-pending-jits))) - (add-hook (intern (format "%s-hook" mode)) fn))) + (dolist (mode (doom-enlist modes)) + (let ((fn (intern (format "+snippets|register-%s" mode)))) + (fset fn (lambda () (yas-activate-extra-mode mode))) + (add-hook (intern (format "%s-hook" mode)) fn)))) ;;;###autoload (def-setting! :yas-minor-mode (mode) From 222702b15a8a30b1b7a9bd6f5312efeaa6aeab88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alois=20Jan=C3=AD=C4=8Dek?= Date: Wed, 20 Jun 2018 09:17:13 +0200 Subject: [PATCH 2052/4235] feature/snippets: add missing autoload cookie --- modules/feature/snippets/autoload/snippets.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index a7a144a5c..bc7e4b75f 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -72,6 +72,7 @@ buggy behavior when is pressed in an empty field." ;; Hooks ;; +;;;###autoload (defun +snippets|enable-project-modes (mode &rest _) "Automatically enable snippet libraries for project minor modes defined with `def-project-mode!'." From 4ef2ff8797f2445db7b87fbceb52489e5813bb1b Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Wed, 20 Jun 2018 18:29:04 +1000 Subject: [PATCH 2053/4235] lang/javascript: fix set-pretty-symbols! --- modules/lang/javascript/config.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index a145a24a6..959d285c5 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -2,20 +2,20 @@ (after! (:any js2-mode web-mode) (set-pretty-symbols! '(js2-mode web-mode) - '(;; Functional - :def "function" - :lambda "() =>" - :composition "compose" - ;; Types - :null "null" - :true "true" :false "false" - ;; Flow - :not "!" - :and "&&" :or "||" - :for "for" - :return "return" - ;; Other - :yield "import"))) + ;; Functional + :def "function" + :lambda "() =>" + :composition "compose" + ;; Types + :null "null" + :true "true" :false "false" + ;; Flow + :not "!" + :and "&&" :or "||" + :for "for" + :return "return" + ;; Other + :yield "import")) ;; From 60d6f706466850096cb06f65575070a02f400d00 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 11:00:20 +0200 Subject: [PATCH 2054/4235] bin/org-tangle: fix uninitialzed all-blocks et co --- bin/org-tangle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/org-tangle b/bin/org-tangle index c07d91ccf..eacb9d3fd 100755 --- a/bin/org-tangle +++ b/bin/org-tangle @@ -79,9 +79,9 @@ trees with the :notangle: tag." (advice-add #'org-babel-tangle-collect-blocks :override #'*org-babel-tangle-collect-blocks) -(defvar all-blocks) -(defvar and-tags) -(defvar or-tags) +(defvar all-blocks nil) +(defvar and-tags nil) +(defvar or-tags nil) (let (lang srcs and-tags or-tags) (pop argv) (while argv From 8e23ab0a0501cae434cd444dbb608aed1f424c83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 11:29:29 +0200 Subject: [PATCH 2055/4235] Add -h/--help usage info to bin/org-tangle --- bin/org-tangle | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/bin/org-tangle b/bin/org-tangle index eacb9d3fd..ff99e6a2f 100755 --- a/bin/org-tangle +++ b/bin/org-tangle @@ -27,6 +27,35 @@ (require 'cl-lib) (require 'ob-tangle) +(defun usage () + (with-temp-buffer + (insert (format "%s %s [OPTIONS] [TARGETS...]\n" + "Usage:" + (file-name-nondirectory load-file-name)) + "\n" + "A command line interface for tangling org-mode files. TARGETS can be\n" + "files or folders (which are searched for org files recursively).\n" + "\n" + "This is useful for literate configs that rely on command line\n" + "workflows to build it.\n" + "\n" + "Example:\n" + " org-tangle some-file.org\n" + " org-tangle literate/config/\n" + " org-tangle -p -l sh scripts.org > do_something.sh\n" + " org-tangle -p -l python -t tagA -t tagB file.org | python\n" + "\n" + "Options:\n" + " -a --all\t\tTangle all blocks by default\n" + " -l --lang LANG\tOnly tangle blocks written in LANG\n" + " -p --print\t\tPrint tangled output to stdout than to files\n" + " -t --tag TAG\n" + " --and TAG\n" + " --or TAG\n" + " Lets you tangle org blocks by tag. You may have more than one\n" + " of these options.\n") + (princ (buffer-string)))) + (defun *org-babel-tangle (orig-fn &rest args) "Don't write tangled blocks to files, print them to stdout." (cl-letf (((symbol-function 'write-region) @@ -88,11 +117,11 @@ trees with the :notangle: tag." (let ((arg (pop argv))) (pcase arg ((or "-h" "--help") - ;; TODO - (error "No help yet, sorry!")) + (usage) + (error "")) ((or "-a" "--all") (setq all-blocks t)) - ((or "--lang" "-l") + ((or "-l" "--lang") (setq lang (pop argv))) ((or "-p" "--print") (advice-add #'org-babel-tangle :around #'*org-babel-tangle)) From 1efb0a82985154e21cd4dfd8a736eb38cd341e1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 12:03:23 +0200 Subject: [PATCH 2056/4235] Rename core-dispatcher -> core-cli The file's role is easier to guess at a glance. --- core/autoload/help.el | 2 +- core/{core-dispatcher.el => core-cli.el} | 4 ++-- core/core.el | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename core/{core-dispatcher.el => core-cli.el} (99%) diff --git a/core/autoload/help.el b/core/autoload/help.el index b3e97d69d..aab7e9dcf 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -233,7 +233,7 @@ If called from an interactive session, tries to reload autoloads files (if necessary), reinistalize doom (via `doom-initialize') and reloads your private init.el and config.el. Then runs `doom-reload-hook'." (interactive "P") - (require 'core-dispatcher) + (require 'core-cli) (cond ((and noninteractive (not (daemonp))) (require 'server) (if (not (server-running-p)) diff --git a/core/core-dispatcher.el b/core/core-cli.el similarity index 99% rename from core/core-dispatcher.el rename to core/core-cli.el index 0c67eed0a..c57944a37 100644 --- a/core/core-dispatcher.el +++ b/core/core-cli.el @@ -819,5 +819,5 @@ module. This does not include your byte-compiled, third party packages.'" (abbreviate-file-name truepath))) finally do (print! (bold (green "Everything is clean"))))) -(provide 'core-dispatcher) -;;; core-dispatcher.el ends here +(provide 'core-cli) +;;; core-cli.el ends here diff --git a/core/core.el b/core/core.el index d86fa22f1..2d1adc193 100644 --- a/core/core.el +++ b/core/core.el @@ -399,7 +399,7 @@ to least)." (require 'core-lib) (require 'core-modules) (when noninteractive - (require 'core-dispatcher)) + (require 'core-cli)) (doom-initialize noninteractive) (unless noninteractive From d4ba03791f251655438ce4f5f476e0551b91432d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 12:45:03 +0200 Subject: [PATCH 2057/4235] Don't async refresh package contents The performance benefit is minor and the loss of feedback is major in case of errors. --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 43ccc0d79..21c0f8269 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -44,7 +44,7 @@ (condition-case e (progn (message "Refreshing package archives") - (package-refresh-contents (not doom-debug-mode)) + (package-refresh-contents) (doom-cache-set 'last-pkg-refresh t 1200)) ((debug error) (doom--refresh-pkg-cache) From 643c64c19f63f9355f316c44c1fc2dd57d336848 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 12:45:51 +0200 Subject: [PATCH 2058/4235] Prevent creation of ~/.emacs.d/elpa Due o package-gnupghome-dir not being set properly. --- core/core-packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-packages.el b/core/core-packages.el index e4693ea05..459f7e308 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -50,6 +50,7 @@ missing) and shouldn't be deleted.") (setq package--init-file-ensured t package-user-dir (expand-file-name "elpa" doom-packages-dir) + package-gnupghome-dir (expand-file-name "gpg" doom-packages-dir) package-enable-at-startup nil package-archives '(("gnu" . "https://elpa.gnu.org/packages/") From 3d3d04b21c6432caacc14f429e615e9c68ccd723 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 12:48:59 +0200 Subject: [PATCH 2059/4235] Move use-package config to core-modules --- core/core-modules.el | 5 +++++ core/core.el | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 8ba8de2aa..3288fa09f 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -168,6 +168,11 @@ non-nil, return paths of possible modules, activated or otherwise." (autoload 'use-package "use-package-core" nil nil t) +(setq use-package-compute-statistics doom-debug-mode + use-package-verbose doom-debug-mode + use-package-minimum-reported-time (if doom-debug-mode 0 0.1) + use-package-expand-minimally (not noninteractive)) + ;; Adds the :after-call custom keyword to `use-package' (and consequently, ;; `def-package!'). :after-call takes a symbol or list of symbols. These symbols ;; can be functions or hook variables. diff --git a/core/core.el b/core/core.el index 2d1adc193..14dabc350 100644 --- a/core/core.el +++ b/core/core.el @@ -162,11 +162,6 @@ else (except for `window-setup-hook').") create-lockfiles nil history-length 500 make-backup-files nil ; don't create backup~ files - ;; `use-package' - use-package-compute-statistics doom-debug-mode - use-package-verbose doom-debug-mode - use-package-minimum-reported-time (if doom-debug-mode 0 0.1) - use-package-expand-minimally (not noninteractive) ;; byte compilation byte-compile-verbose doom-debug-mode byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local) From 638ff6b0a2e96704b9957b95a0c7ae8658811280 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 13:31:46 +0200 Subject: [PATCH 2060/4235] Fix wrong-type-argument: sequencep from org-agenda Caused by +org|exclude-agenda-buffers-from-workspace assuming org-agenda-new-buffers would always be non-nil... then it wasn't. Reported by @ar1a --- modules/lang/org/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index bce7415a9..358728c5e 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -352,8 +352,11 @@ between the two." (IS-LINUX "xdg-open \"%s\""))))) ;; Don't clobber recentf or current workspace with agenda files (defun +org|exclude-agenda-buffers-from-workspace () - (let (persp-autokill-buffer-on-remove) - (persp-remove-buffer org-agenda-new-buffers (get-current-persp) nil))) + (when org-agenda-new-buffers + (let (persp-autokill-buffer-on-remove) + (persp-remove-buffer org-agenda-new-buffers + (get-current-persp) + nil)))) (add-hook 'org-agenda-finalize-hook #'+org|exclude-agenda-buffers-from-workspace) (defun +org*exclude-agenda-buffers-from-recentf (orig-fn &rest args) From 6fbd3407e0f72d7157675818100115c7504a441c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 14:23:17 +0200 Subject: [PATCH 2061/4235] Fix block/jsdoc comment continuation in typescript Also improves writing block comments in js2-mode and rjsx-mode. Reported by @ar1a --- modules/lang/javascript/config.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 959d285c5..52b5efe8f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -17,6 +17,11 @@ ;; Other :yield "import")) +(after! smartparens + (sp-with-modes '(js2-mode typescript-mode rjsx-mode) + (sp-local-pair "/**" "" :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET"))) + (sp-local-pair "/*" "*/" :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET"))))) + ;; ;; Major modes @@ -25,6 +30,7 @@ (def-package! js2-mode :mode "\\.js\\'" :interpreter "node" + :commands js2-line-break :config (setq js2-skip-preprocessor-directives t js2-highlight-external-variables nil @@ -38,16 +44,12 @@ js2-strict-missing-semi-warning nil) (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) - ;; Indent switch-case another step (setq-hook! 'js2-mode-hook js-switch-indent-offset js2-basic-offset) (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/repl) - (sp-with-modes '(js2-mode rjsx-mode) - (sp-local-pair "/*" "*/" :post-handlers '(("| " "SPC")))) - (map! :map js2-mode-map :localleader :n "S" #'+javascript/skewer-this-buffer)) @@ -83,6 +85,8 @@ (after! typescript-mode (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (setq-hook! 'typescript-mode-hook + comment-line-break-function #'js2-line-break) (set-electric! 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&")) (set-pretty-symbols! 'typescript-mode From 9d8679cfaa8623ddfbda007fe6e1ea40bafb49b3 Mon Sep 17 00:00:00 2001 From: Matthew Lyon Date: Wed, 20 Jun 2018 09:32:05 -0700 Subject: [PATCH 2062/4235] Fix init.example `electric` module I've been keeping my init up-to-date with the example, but the example still has `electric-indent` whereas `make` warns me it's been renamed to `electric`. This provides the correct module name in the example. --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 117863d6e..d874f4f27 100644 --- a/init.example.el +++ b/init.example.el @@ -51,7 +51,7 @@ :emacs dired ; making dired pretty [functional] ediff ; comparing files in Emacs - electric-indent ; smarter, keyword-based electric-indent + electric ; smarter, keyword-based electric-indent ;eshell ; a consistent, cross-platform shell (WIP) imenu ; an imenu sidebar and searchable code index ;term ; terminals in Emacs From d5bb770ea6fa04ab48e18461e0c03a92595fd378 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 15:37:31 +0200 Subject: [PATCH 2063/4235] Make +(helm|ivy)-file-search public and autoloaded So it can be safely used anywhere. Maybe these should be defgenerics? --- modules/completion/helm/autoload/helm.el | 31 +++++++++++++++++------- modules/completion/ivy/autoload/ivy.el | 31 +++++++++++++++++------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 5969e9425..ce8e3b9ea 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -11,7 +11,20 @@ ;; Project search ;; -(cl-defun +helm--file-search (engine &key query in all-files (recursive t)) +;;;###autoload +(cl-defun +helm-file-search (engine &key query in all-files (recursive t)) + "Conduct a file search using ENGINE, which can be any of: rg, ag, pt, and +grep. If omitted, ENGINE will default to the first one it detects, in that +order. + +:query STRING + Determines the initial input to search for. +:in PATH + Sets what directory to base the search out of. Defaults to the current + project's root. +:recursive BOOL + Whether or not to search files recursively from the base directory." + (declare (indent defun)) (require 'helm-ag) (helm-ag--init-state) (let* ((project-root (doom-project-root)) @@ -129,48 +142,48 @@ preform search from current directory." (defun +helm/rg (all-files-p &optional query directory) "TODO" (interactive "P") - (+helm--file-search 'rg :query query :in directory :all-files all-files-p)) + (+helm-file-search 'rg :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +helm/ag (all-files-p &optional query directory) "TODO" (interactive "P") - (+helm--file-search 'ag :query query :in directory :all-files all-files-p)) + (+helm-file-search 'ag :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +helm/pt (all-files-p &optional query directory) "TODO" (interactive "P") - (+helm--file-search 'pt :query query :in directory :all-files all-files-p)) + (+helm-file-search 'pt :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +helm/grep (all-files-p &optional query directory) "TODO" (interactive "P") - (+helm--file-search 'grep :query query :in directory :all-files all-files-p)) + (+helm-file-search 'grep :query query :in directory :all-files all-files-p)) ;; Relative to current directory ;;;###autoload (defun +helm/rg-from-cwd (recurse-p &optional query) "TODO" (interactive "P") - (+helm--file-search 'rg :query query :in default-directory :recursive recurse-p)) + (+helm-file-search 'rg :query query :in default-directory :recursive recurse-p)) ;;;###autoload (defun +helm/ag-from-cwd (recurse-p &optional query) "TODO" (interactive "P") - (+helm--file-search 'ag :query query :in default-directory :recursive recurse-p)) + (+helm-file-search 'ag :query query :in default-directory :recursive recurse-p)) ;;;###autoload (defun +helm/pt-from-cwd (recurse-p &optional query) "TODO" (interactive "P") - (+helm--file-search 'pt :query query :in default-directory :recursive recurse-p)) + (+helm-file-search 'pt :query query :in default-directory :recursive recurse-p)) ;;;###autoload (defun +helm/grep-from-cwd (recurse-p &optional query) "TODO" (interactive "P") - (+helm--file-search 'grep :query query :in default-directory :recursive recurse-p)) + (+helm-file-search 'grep :query query :in default-directory :recursive recurse-p)) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 187b66956..5df991833 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -202,7 +202,20 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;; File searching ;; -(cl-defun +ivy--file-search (engine &key query in all-files (recursive t)) +;;;###autoload +(cl-defun +ivy-file-search (engine &key query in all-files (recursive t)) + "Conduct a file search using ENGINE, which can be any of: rg, ag, pt, and +grep. If omitted, ENGINE will default to the first one it detects, in that +order. + +:query STRING + Determines the initial input to search for. +:in PATH + Sets what directory to base the search out of. Defaults to the current + project's root. +:recursive BOOL + Whether or not to search files recursively from the base directory." + (declare (indent defun)) (let* ((project-root (doom-project-root)) (directory (or in project-root)) (default-directory directory) @@ -286,7 +299,7 @@ If ALL-FILES-P, don't respect .gitignore files and search everything. NOTE: ripgrep doesn't support multiline searches (yet)." (interactive "P") - (+ivy--file-search 'rg :query query :in directory :all-files all-files-p)) + (+ivy-file-search 'rg :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +ivy/ag (all-files-p &optional query directory) @@ -296,7 +309,7 @@ the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive "P") - (+ivy--file-search 'ag :query query :in directory :all-files all-files-p)) + (+ivy-file-search 'ag :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +ivy/pt (all-files-p &optional query directory) @@ -306,7 +319,7 @@ the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive "P") - (+ivy--file-search 'pt :query query :in directory :all-files all-files-p)) + (+ivy-file-search 'pt :query query :in directory :all-files all-files-p)) ;;;###autoload (defun +ivy/grep (all-files-p &optional query directory) @@ -316,7 +329,7 @@ active, the last known search is used. If ALL-FILES-P, don't respect .gitignore files and search everything." (interactive "P") - (+ivy--file-search 'grep :query query :in directory :all-files all-files-p)) + (+ivy-file-search 'grep :query query :in directory :all-files all-files-p)) ;; Relative to current directory ;;;###autoload @@ -324,28 +337,28 @@ If ALL-FILES-P, don't respect .gitignore files and search everything." "Like `+ivy/rg', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (+ivy--file-search 'rg :query query :in default-directory :recursive recursive-p)) + (+ivy-file-search 'rg :query query :in default-directory :recursive recursive-p)) ;;;###autoload (defun +ivy/ag-from-cwd (recursive-p &optional query) "Like `+ivy/ag', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (+ivy--file-search 'ag :query query :in default-directory :recursive recursive-p)) + (+ivy-file-search 'ag :query query :in default-directory :recursive recursive-p)) ;;;###autoload (defun +ivy/pt-from-cwd (recursive-p &optional query) "Like `+ivy/pt', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (+ivy--file-search 'pt :query query :in default-directory :recursive recursive-p)) + (+ivy-file-search 'pt :query query :in default-directory :recursive recursive-p)) ;;;###autoload (defun +ivy/grep-from-cwd (recursive-p &optional query) "Like `+ivy/grep', but from the current directory (recursively if RECURSIVE-P is non-nil)." (interactive "P") - (+ivy--file-search 'grep :query query :in default-directory :recursive recursive-p)) + (+ivy-file-search 'grep :query query :in default-directory :recursive recursive-p)) ;; From 6d020a63054ff58e09b9c3261f9a27b9b8e3986e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 15:37:49 +0200 Subject: [PATCH 2064/4235] Change add :unset support to set-lookup-handlers! And update its documentation. --- modules/feature/lookup/autoload/lookup.el | 84 +++++++++++++---------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 967af7577..1f7bd2524 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -5,46 +5,56 @@ (defvar +lookup--last-provider nil) ;;;###autodef -(cl-defun set-lookup-handlers! (modes &key definition references documentation file xref-backend) - "Defines a jump target for major MODES. PLIST accepts the following +(defun set-lookup-handlers! (modes &rest plist) + "Defines a jump target for major MODES. + +This overwrites previously defined handlers for MODES. If used on minor modes, +they are combined with handlers defined for other minor modes or the major mode +it's activated in. + +If the CAR of PLIST is :unset, other properties are ignored and all existing +jump handlers for MODES are cleared. Otherwise, PLIST accepts the following properties: - :definition FN - Run when jumping to a symbol's definition. - Used by `+lookup/definition'. - :references FN - Run when looking for usage references of a symbol in the current project. - Used by `+lookup/references'. - :documentation FN - Run when looking up documentation for a symbol. - Used by `+lookup/documentation'. - :file FN - Run when looking up the file for a symbol/string. Typically a file path. - Used by `+lookup/file'. - :xref-backend FN - Defines an xref backend for a major-mode. With this, :definition and - :references are unnecessary. - -Using this multiple times overwrites previous properties and unsets omitted -ones." +:definition FN + Run when jumping to a symbol's definition. + Used by `+lookup/definition'. +:references FN + Run when looking for usage references of a symbol in the current project. + Used by `+lookup/references'. +:documentation FN + Run when looking up documentation for a symbol. + Used by `+lookup/documentation'. +:file FN + Run when looking up the file for a symbol/string. Typically a file path. + Used by `+lookup/file'. +:xref-backend FN + Defines an xref backend for a major-mode. If you define :definition and + :references along with :xref-backend, those will have higher precedence." (dolist (mode (doom-enlist modes)) - (let ((def-name (intern (format "+lookup|init-%s" mode)))) - (fset def-name - (lambda () - (when (or (eq major-mode mode) - (and (boundp mode) - (symbol-value mode))) - (when definition - (add-hook '+lookup-definition-functions definition nil t)) - (when references - (add-hook '+lookup-references-functions references nil t)) - (when documentation - (add-hook '+lookup-documentation-functions documentation nil t)) - (when file - (add-hook '+lookup-file-functions file nil t)) - (when xref-backend - (add-hook 'xref-backend-functions xref-backend nil t))))) - (add-hook (intern (format "%s-hook" mode)) def-name)))) + (let ((fn (intern (format "+lookup|init-%s" mode))) + (hook (intern (format "%s-hook" mode)))) + (if (eq (car plist) :unset) + (remove-hook hook fn) + (fset fn + (lambda () + (when (or (eq major-mode mode) + (and (boundp mode) + (symbol-value mode))) + (cl-destructuring-bind + (&key definition references documentation file xref-backend) + plist + (when definition + (add-hook '+lookup-definition-functions definition nil t)) + (when references + (add-hook '+lookup-references-functions references nil t)) + (when documentation + (add-hook '+lookup-documentation-functions documentation nil t)) + (when file + (add-hook '+lookup-file-functions file nil t)) + (when xref-backend + (add-hook 'xref-backend-functions xref-backend nil t)))))) + (add-hook hook fn))))) ;;;###autoload (def-setting! :lookup (modes &rest plist) From 099040c52340ad748d6d57b472e2c091f19eacd8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 15:38:14 +0200 Subject: [PATCH 2065/4235] Add helm support to +lookup defs/refs fallback Instead of hard-coding counsel+ivy support. --- modules/feature/lookup/autoload/lookup.el | 29 ++++++++++------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 1f7bd2524..5bdaf40b9 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -1,7 +1,5 @@ ;;; feature/lookup/autoload/lookup.el -*- lexical-binding: t; -*- -(defvar +lookup--rg-installed-p (executable-find "rg")) -(defvar +lookup--ag-installed-p (executable-find "ag")) (defvar +lookup--last-provider nil) ;;;###autodef @@ -99,6 +97,17 @@ properties: ('error (ignore (message "%s" e)))) return it)) +(defun +lookup--file-search (identifier) + (unless identifier + (let ((query (rxt-quote-pcre identifier))) + (ignore-errors + (cond ((featurep! :completion ivy) + (+ivy-file-search nil :query query) + t) + ((featurep! :completion helm) + (+helm-file-search nil :query query) + t)))))) + ;;;###autoload (defun +lookup-xref-definitions (identifier) "Non-interactive wrapper for `xref-find-definitions'" @@ -147,13 +156,7 @@ Falls back to dumb-jump, naive ripgrep/the_silver_searcher text search, then (dumb-jump-go)) successful)))) - ((and identifier - (featurep 'counsel) - (let ((regex (rxt-quote-pcre identifier))) - (or (and +lookup--rg-installed-p - (counsel-rg regex (doom-project-root))) - (and +lookup--ag-installed-p - (counsel-ag regex (doom-project-root))))))) + ((+lookup--file-search identifier)) ((and (featurep 'evil) evil-mode @@ -179,13 +182,7 @@ Falls back to a naive ripgrep/the_silver_searcher search otherwise." (cond ((and +lookup-references-functions (+lookup--jump-to :references identifier))) - ((and identifier - (featurep 'counsel) - (let ((regex (rxt-quote-pcre identifier))) - (or (and (executable-find "rg") - (counsel-rg regex (doom-project-root))) - (and (executable-find "ag") - (counsel-ag regex (doom-project-root))))))) + ((+lookup--file-search identifier)) (t (error "Couldn't find '%s'" identifier)))) From 65b2d5eb28341645c51b77478bb60ebb8ef52c54 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 15:39:14 +0200 Subject: [PATCH 2066/4235] Update +lookup/(definition|references) docs --- modules/feature/lookup/autoload/lookup.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 5bdaf40b9..0ff2ca58b 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -125,13 +125,14 @@ properties: ;;;###autoload (defun +lookup/definition (identifier &optional other-window) - "Jump to the definition of the symbol at point. + "Jump to the definition of IDENTIFIER (defaults to the symbol at point). + +If OTHER-WINDOW (universal argument), open the result in another window. Each function in `+lookup-definition-functions' is tried until one changes the -point or current buffer. - -Falls back to dumb-jump, naive ripgrep/the_silver_searcher text search, then -`evil-goto-definition' if evil-mode is active." +point or current buffer. Falls back to dumb-jump, naive +ripgrep/the_silver_searcher text search, then `evil-goto-definition' if +evil-mode is active." (interactive (list (+lookup--symbol-or-region) current-prefix-arg)) (cond ((null identifier) @@ -171,12 +172,11 @@ Falls back to dumb-jump, naive ripgrep/the_silver_searcher text search, then ;;;###autoload (defun +lookup/references (identifier) - "Show a list of references to the symbol at point. + "Show a list of usages of IDENTIFIER (defaults to the symbol at point) Tries each function in `+lookup-references-functions' until one changes the -point and/or current buffer. - -Falls back to a naive ripgrep/the_silver_searcher search otherwise." +point and/or current buffer. Falls back to a naive ripgrep/the_silver_searcher +search otherwise." (interactive (list (+lookup--symbol-or-region))) (cond ((and +lookup-references-functions From 17678992e255ecaf9e636759154e06aa68ec3f32 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 15:52:26 +0200 Subject: [PATCH 2067/4235] Minor, general refactor of lookup autoload library --- modules/feature/lookup/autoload/lookup.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 0ff2ca58b..d3199fed4 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -168,7 +168,7 @@ evil-mode is active." (not (and (>= pt beg) (< pt end))))))) - (t (user-error "Couldn't find '%s'" identifier)))) + ((error "Couldn't find '%s'" identifier)))) ;;;###autoload (defun +lookup/references (identifier) @@ -184,7 +184,7 @@ search otherwise." ((+lookup--file-search identifier)) - (t (error "Couldn't find '%s'" identifier)))) + ((error "Couldn't find '%s'" identifier)))) ;;;###autoload (defun +lookup/documentation (identifier) @@ -287,8 +287,7 @@ Otherwise, falls back on `find-file-at-point'." (helm-dash query)) ((featurep! :completion ivy) (counsel-dash query)) - (t - (user-error "No dash backend is installed, enable ivy or helm."))))) + ((user-error "No dash backend is installed, enable ivy or helm."))))) ;;;###autoload (defun +lookup/online (search &optional provider) @@ -306,19 +305,19 @@ for the provider." (region-end))) (read-string "Search for: " (thing-at-point 'symbol t))) (+lookup--online-provider current-prefix-arg))) - (condition-case ex + (condition-case-unless-debug e (let ((url (cdr (assoc provider +lookup-provider-url-alist)))) (unless url - (error "'%s' is an invalid search engine" provider)) + (user-error "'%s' is an invalid search engine" provider)) (when (or (functionp url) (symbolp url)) (setq url (funcall url))) (cl-assert (and (stringp url) (not (string-empty-p url)))) (when (string-empty-p search) (user-error "The search query is empty")) (funcall +lookup-open-url-fn (format url (url-encode-url search)))) - ('error + (error (map-delete +lookup--last-provider major-mode) - (message "Failed: %s" ex)))) + (signal (car e) (cdr e))))) ;;;###autoload (defun +lookup/online-select () From 50b34d2671d657eb45adced04db356dc5b7e0b39 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 16:44:35 +0200 Subject: [PATCH 2068/4235] Fix org-mode file template precedence Otherwise default .org template always takes precedence. --- modules/feature/file-templates/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 3251fab84..d28e4ae75 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -62,11 +62,11 @@ don't have a :trigger property in `+file-templates-alist'.") ;; Markdown (markdown-mode) ;; Org - ("\\.org$" :trigger "__" :mode org-mode) ("/README\\.org$" :when +file-templates-in-emacs-dirs-p :trigger "__doom-readme" :mode org-mode) + ("\\.org$" :trigger "__" :mode org-mode) ;; PHP ("\\.class\\.php$" :trigger "__.class.php" :mode php-mode) (php-mode) From 3e802c1b150ee37278b22d3d442c381a160c3e9b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 18:26:41 +0200 Subject: [PATCH 2069/4235] Fix +default/easymotion aborting evil operator Now evil operators will work with +default/easymotion when you first startup Emacs. Reported by @ar1a --- modules/config/default/autoload/evil.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index 1d35ac8bf..6b119127e 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -44,5 +44,9 @@ integration." (let ((prefix (this-command-keys))) (evil-define-key* 'motion 'global prefix nil) (evilem-default-keybindings prefix) - (set-transient-map evilem-map) - (which-key-reload-key-sequence prefix))) + (which-key-reload-key-sequence + (vconcat (where-is-internal evil-this-operator + evil-normal-state-map + t) + prefix)))) + From d7f8a9591ebb91ed547672dfab8e05517201bfcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 18:37:13 +0200 Subject: [PATCH 2070/4235] completion/ivy: replace smex with amx Faster and maintained. --- modules/completion/ivy/config.el | 10 ++++------ modules/completion/ivy/packages.el | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 3661f8f60..36b7a550a 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -121,12 +121,6 @@ immediately runs it on the current candidate (ending the ivy session)." (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) -;; Used by `counsel-M-x' -(after! smex - (setq smex-save-file (concat doom-cache-dir "/smex-items")) - (smex-initialize)) - - (def-package! ivy-hydra :commands (+ivy@coo/body ivy-dispatching-done-hydra) :init @@ -227,6 +221,10 @@ immediately runs it on the current candidate (ending the ivy session)." ivy-initial-inputs-alist nil)) +;; Used by `counsel-M-x' +(setq amx-save-file (concat doom-cache-dir "/smex-items")) + + ;; ;; Evil key fixes ;; diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index b8b76609a..ace65cf1b 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -1,10 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; completion/ivy/packages.el +(package! amx) (package! ivy) (package! counsel) (package! counsel-projectile) -(package! smex) (package! swiper) (package! ivy-hydra) (package! ivy-rich) From 898449e374e2e6f36cca0735d304eaf5d36bdb43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 19:09:05 +0200 Subject: [PATCH 2071/4235] Add completion/company tests --- .../completion/company/test/test-company.el | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/modules/completion/company/test/test-company.el b/modules/completion/company/test/test-company.el index 8d7c3d61a..9892516a7 100644 --- a/modules/completion/company/test/test-company.el +++ b/modules/completion/company/test/test-company.el @@ -1,44 +1,50 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; completion/company/test/test-company.el -(load! "../autoload") - -;; -(xdescribe "completion/company" - :var (company-backends) - +(describe "completion/company" (before-all - (provide 'company)) - (after-all - (unload-feature 'company t)) + (load! "../autoload")) (describe ":company-backend" - :var (text-mode-hook company-backends) + :var (a) (before-each (setq company-backends '(default) - text-mode-hook nil)) + text-mode-hook nil + a (get-buffer-create "x")) + (set-buffer a) + (spy-on 'require)) + (after-each + (fmakunbound '+company|init-text-mode) + (kill-buffer a)) + + (it "adds hooks and defines +company|init-MODE" + (set-company-backend! 'text-mode '(backend-1)) + (expect (fboundp '+company|init-text-mode)) + (expect text-mode-hook :to-equal '(+company|init-text-mode))) (it "adds grouped backends" (set-company-backend! 'text-mode '(backend-1)) - (with-temp-buffer - (text-mode) - (expect company-backends :to-equal '((backend-1) default)))) + (text-mode) + (expect company-backends :to-equal '((backend-1) default))) (it "adds multiple backends" (set-company-backend! 'text-mode 'backend-1 'backend-2) - (with-temp-buffer - (text-mode) - (expect company-backends :to-equal '(backend-1 backend-2 default)))) + (text-mode) + (expect company-backends :to-equal '(backend-1 backend-2 default))) (it "adds single backend" (set-company-backend! 'text-mode 'backend-1) - (with-temp-buffer - (text-mode) - (expect company-backends :to-equal '(backend-1 default)))) + (text-mode) + (expect company-backends :to-equal '(backend-1 default))) (it "overwrites past values" (set-company-backend! 'text-mode 'backend-1) (set-company-backend! 'text-mode 'backend-2) - (with-temp-buffer - (text-mode) - (expect company-backends :to-equal '(backend-2 default)))))) + (text-mode) + (expect company-backends :to-equal '(backend-2 default))) + + (it "unsets past values" + (set-company-backend! 'text-mode 'backend-1) + (set-company-backend! 'text-mode nil) + (text-mode) + (expect company-backends :to-equal '(default))))) From aa4c9744f85ab79c2b970341a4a2c9dd9c624d9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 19:41:49 +0200 Subject: [PATCH 2072/4235] Fix set-company-backends! & update docstring + It wasn't preserving insertion order of multiple backends + It failed when BACKENDS = nil (supposed to unset mode backends) + Use eq/equal as a test-fn conditionally (glorious, glorious premature optimization) --- modules/completion/company/autoload.el | 32 ++++++++++++++++++-------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 04133b1c1..f1d59abed 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -2,20 +2,34 @@ ;;;###autodef (defun set-company-backend! (modes &rest backends) - "Prepends BACKENDS to `company-backends' in major MODES. + "Prepends BACKENDS (in order) to `company-backends' in MODES. -MODES should be one major-mode symbol or a list of them." +MODES should be one symbol or a list of them, representing major or minor modes. +This will overwrite backends for MODES on consecutive uses. + +If BACKENDS is just 'nil, unset the backends for MODES. + +Examples: + + (set-company-backend! 'js2-mode 'company-tide 'company-yasnippet) + (set-company-backend! 'sh-mode + '(company-shell :with company-yasnippet)) + (set-company-backend! 'js2-mode + '(:separate company-irony-c-headers company-irony)) + (set-company-backend! 'sh-mode nil)" (dolist (mode (doom-enlist modes)) (let ((fn (intern (format "+company|init-%s" mode))) (hook (intern (format "%s-hook" mode)))) - (cond (backends + (cond ((and backends (not (eq (car backends) 'nil))) (fset fn - (lambda () (when (or (eq major-mode mode) - (and (boundp mode) (symbol-value mode))) - (require 'company) - (make-local-variable 'company-backends) - (dolist (backend backends) - (cl-pushnew backend company-backends :test #'equal))))) + (lambda () + (when (or (eq major-mode mode) + (and (boundp mode) (symbol-value mode))) + (require 'company) + (make-local-variable 'company-backends) + (dolist (backend (reverse backends)) + (cl-pushnew backend company-backends + :test (if (symbolp backend) #'eq #'equal)))))) (add-hook hook fn)) (t (fmakunbound fn) From b0f18047994af67eabfb9420f9a321ce415c8bab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Jun 2018 22:58:05 +0200 Subject: [PATCH 2073/4235] Unbind double-quote in lisp-mode Causes double-double-quoting. smartparens will handle it. --- modules/editor/parinfer/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/editor/parinfer/config.el b/modules/editor/parinfer/config.el index 2bb70e243..42c35dc73 100644 --- a/modules/editor/parinfer/config.el +++ b/modules/editor/parinfer/config.el @@ -12,6 +12,7 @@ (push 'evil parinfer-extensions)) :config (map! :map parinfer-mode-map + "\"" nil ; smartparens handles this :i "" #'parinfer-smart-tab:dwim-right-or-complete :i "" #'parinfer-smart-tab:dwim-left :localleader From c0fc9d3db0037189522033f81a6830a03b719691 Mon Sep 17 00:00:00 2001 From: Matthew Lyon Date: Wed, 20 Jun 2018 17:04:22 -0700 Subject: [PATCH 2074/4235] Look for the correct feature name for org+rest --- 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 da17aa643..496563f1f 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -26,7 +26,7 @@ (package! ob-go)) (when (featurep! :lang rust) (package! ob-rust)) - (when (featurep! :lang restclient) + (when (featurep! :lang rest) (package! ob-restclient)) (when (featurep! :lang crystal) (package! ob-crystal)) From 64f77fe0176deb2b24f53cd619541419a1c199cc Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 21 Jun 2018 12:51:17 +0200 Subject: [PATCH 2075/4235] Added Zathura as a viewer option, via the feature +zathura (n.b. Zathura with synctex is already supported in AUCTeX) --- modules/lang/latex/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index e7912bc93..527740328 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -93,6 +93,10 @@ "Skim" '("/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) (map-put TeX-view-program-selection 'output-pdf '("Skim"))) + ;; Or Zathura + (when (featureep! +zathura) + (map-put TeX-view-program-selection 'output-pdf '("Zathura"))) + ;; Or PDF-tools, but only if the module is also loaded (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) From b096214f280d9bc920331417e6347586b07a26f4 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 21 Jun 2018 17:15:20 +0200 Subject: [PATCH 2076/4235] fixed typo --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 527740328..936f1dcb5 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -94,7 +94,7 @@ (map-put TeX-view-program-selection 'output-pdf '("Skim"))) ;; Or Zathura - (when (featureep! +zathura) + (when (featurep! +zathura) (map-put TeX-view-program-selection 'output-pdf '("Zathura"))) ;; Or PDF-tools, but only if the module is also loaded From 1dd023cda131761572440b5ff48f0c4816cf628c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 10:52:51 +0200 Subject: [PATCH 2077/4235] Fix error if private config.el doesn't exist --- core/core-modules.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-modules.el b/core/core-modules.el index 3288fa09f..32c22d802 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -286,7 +286,7 @@ to least)." (let ((doom--stage 'config)) ,@(nreverse config-forms) (when doom-private-dir - (load! "config" doom-private-dir))))))) + (load! "config" doom-private-dir t))))))) (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) From d01f39d658e28ed499c25a357673ab5cb25018a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 13:05:29 +0200 Subject: [PATCH 2078/4235] Add unsetting capability to set-pretty-symbols! + Allows (set-pretty-symbols! 'some-mode nil) + Changes the semantics of +pretty-code-enabled-modes, which is now t by default (meaning enable all modes). It also supports '(not ...). --- modules/ui/pretty-code/autoload.el | 87 ++++++++++++++++-------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 82be11ea2..3a81bdc52 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -13,17 +13,10 @@ This requires the iosevka font! Use the :iosevka property to enable (or disable) it regardless.") ;;;###autoload -(defvar +pretty-code-enabled-modes - '(c++-mode-hook - c-mode-hook - elm-mode - emacs-lisp-mode - js2-mode - org-mode - python-mode - typescript-mode - web-mode) - "List of major modes in which `prettify-symbols-mode' should be enabled.") +(defvar +pretty-code-enabled-modes t + "List of major modes in which `prettify-symbols-mode' should not be enabled. +If t, enable it everywhere. If the first element is 'not, enable it in any mode +besides what is listed.") ;;;###autoload (defvar +pretty-code-symbols @@ -296,9 +289,10 @@ Use the :iosevka property to enable (or disable) it regardless.") "Associates string patterns with icons in certain major-modes. MODES is a major mode symbol or a list of them. - PLIST is a property list whose keys must match keys in -`+pretty-code-symbols', and whose values are strings representing the -text to be replaced with that symbol. + PLIST is a property list whose keys must match keys in `+pretty-code-symbols', +and whose values are strings representing the text to be replaced with that +symbol. If the car of PLIST is nil, then unset any pretty symbols previously +defined for MODES. The following properties are special: @@ -320,32 +314,43 @@ For example, the rule for emacs-lisp-mode is very simple: :lambda \"lambda\") This will replace any instances of \"lambda\" in emacs-lisp-mode with the symbol -assicated with :lambda in `+pretty-code-symbols'." +assicated with :lambda in `+pretty-code-symbols'. + +Pretty symbols can be unset for emacs-lisp-mode with: + + (set-pretty-symbols! 'emacs-lisp-mode nil)" (declare (indent 1)) (dolist (mode (doom-enlist modes)) - (let ((fn (intern (format "+pretty-code|init-%s" mode)))) - (fset fn - (lambda () - (when (and (eq major-mode mode) - (memq major-mode +pretty-code-enabled-modes)) - (unless (cadr (plist-member plist :merge)) - (setq prettify-symbols-alist nil)) - (if-let ((alist (plist-get plist :alist))) - (setq prettify-symbols-alist (append alist prettify-symbols-alist)) - (let ((plist plist) - results) - (while plist - (let ((prop (car plist)) - (sym (cadr plist))) - (when-let* ((icon (plist-get +pretty-code-symbols prop))) - (push (cons sym (+pretty-code--icon-to-char (append icon nil))) - results)) - (setq plist (cddr plist)))) - (setq prettify-symbols-alist (append results prettify-symbols-alist)))) - (when (or (cadr (plist-member plist :iosevka)) - +pretty-code-iosevka-ligatures-enabled-by-default) - (+pretty-code-setup-iosevka-ligatures)) - (when prettify-symbols-mode - (prettify-symbols-mode -1)) - (prettify-symbols-mode +1)))) - (add-hook (intern (format "%s-hook" mode)) fn)))) + (let ((hook (intern (format "%s-hook" mode))) + (fn (intern (format "+pretty-code|init-%s" mode)))) + (cond ((null (car-safe plist)) + (remove-hook hook fn) + (unintern fn)) + ((or (eq +pretty-code-enabled-modes 't) + (if (eq (car +pretty-code-enabled-modes) 'not) + (not (memq mode (cdr +pretty-code-enabled-modes))) + (memq mode +pretty-code-enabled-modes))) + (fset fn + (lambda () + (when (eq major-mode mode) + (unless (cadr (plist-member plist :merge)) + (setq prettify-symbols-alist nil)) + (if-let ((alist (plist-get plist :alist))) + (setq prettify-symbols-alist (append alist prettify-symbols-alist)) + (let ((plist plist) + results) + (while plist + (let ((prop (car plist)) + (sym (cadr plist))) + (when-let* ((icon (plist-get +pretty-code-symbols prop))) + (push (cons sym (+pretty-code--icon-to-char (append icon nil))) + results)) + (setq plist (cddr plist)))) + (setq prettify-symbols-alist (append results prettify-symbols-alist)))) + (when (or (cadr (plist-member plist :iosevka)) + +pretty-code-iosevka-ligatures-enabled-by-default) + (+pretty-code-setup-iosevka-ligatures)) + (when prettify-symbols-mode + (prettify-symbols-mode -1)) + (prettify-symbols-mode +1)))) + (add-hook hook fn)))))) From bc87ccf894e874cefc663394e1c3f03c2fc82daa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 13:28:38 +0200 Subject: [PATCH 2079/4235] Refactor set-company-backend! & revise docstring --- modules/completion/company/autoload.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index f1d59abed..bff051848 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -7,7 +7,7 @@ MODES should be one symbol or a list of them, representing major or minor modes. This will overwrite backends for MODES on consecutive uses. -If BACKENDS is just 'nil, unset the backends for MODES. +If the car of BACKENDS is nil, unset the backends for MODES. Examples: @@ -18,10 +18,12 @@ Examples: '(:separate company-irony-c-headers company-irony)) (set-company-backend! 'sh-mode nil)" (dolist (mode (doom-enlist modes)) - (let ((fn (intern (format "+company|init-%s" mode))) - (hook (intern (format "%s-hook" mode)))) - (cond ((and backends (not (eq (car backends) 'nil))) - (fset fn + (let ((hook (intern (format "%s-hook" mode))) + (fn (intern (format "+company|init-%s" mode)))) + (cond ((null (car-safe backends)) + (remove-hook hook fn) + (unintern fn)) + ((fset fn (lambda () (when (or (eq major-mode mode) (and (boundp mode) (symbol-value mode))) @@ -30,10 +32,7 @@ Examples: (dolist (backend (reverse backends)) (cl-pushnew backend company-backends :test (if (symbolp backend) #'eq #'equal)))))) - (add-hook hook fn)) - (t - (fmakunbound fn) - (remove-hook hook fn)))))) + (add-hook hook fn)))))) ;; FIXME obsolete :company-backend ;;;###autoload From 445ca59b675b30d5c11ea7ba2e6c9c75b9d8a091 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 13:29:46 +0200 Subject: [PATCH 2080/4235] Correct make-buffer-local => make-local-variable Reported by @UndeadKernel --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index e7912bc93..3d5c6c6b8 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -206,7 +206,7 @@ ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is ;; not something `set-company-backend!' anticipates (and shouldn't have to!) (add-hook! LaTeX-mode - (make-buffer-local 'company-backends) + (make-local-variable 'company-backends) (company-auctex-init))) From 8bd9b241370588510f9cdd6df00926f18c69980d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 13:41:51 +0200 Subject: [PATCH 2081/4235] Add unset capability to set-file-template! --- modules/feature/file-templates/autoload.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 7109de471..bccb93a2e 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -1,5 +1,10 @@ ;;; feature/file-templates/autoload.el -*- lexical-binding: t; -*- +(defun +file-templates--set (pred plist) + (if (null (car-safe plist)) + (setq +file-templates-alist (map-delete +file-templates-alist pred)) + (push `(,pred ,@plist) +file-templates-alist))) + ;;;###autodef (defun set-file-template! (pred &rest plist) "Register a file template. @@ -23,13 +28,14 @@ these properties: If non-nil, don't expand any template for this file and don't test any other file template rule against this buffer." (after! (:when (boundp '+file-templates-alist)) - (push `(,pred ,@plist) +file-templates-alist))) + (+file-templates--set pred plist))) ;;;###autodef (defun set-file-templates! (&rest templates) "Like `set-file-templates!', but register many file templates at once." (after! (:when (boundp '+file-templates-alist)) - (setq +file-templates-alist (append (list templates) +file-templates-alist)))) + (dolist (template templates) + (+file-templates--set (car template) (cdr template))))) ;; FIXME obsolete :file-template ;;;###autoload From ad2de8e2e51b4518a5e70ebcf232a91a4b7db222 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 13:46:55 +0200 Subject: [PATCH 2082/4235] Fix set-devdocs! not setting docsets properly Would use MODES as a key, instead of mode. --- modules/feature/lookup/autoload/devdocs.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el index 77ece1d4d..3558b4cbd 100644 --- a/modules/feature/lookup/autoload/devdocs.el +++ b/modules/feature/lookup/autoload/devdocs.el @@ -9,7 +9,7 @@ DOCSET (a string). See `devdocs-alist' for the defaults. " (after! (:when (boundp 'devdocs-alist)) (dolist (mode (doom-enlist modes)) - (map-put devdocs-alist modes docset)))) + (map-put devdocs-alist mode docset)))) ;;;###autoload (def-setting! :devdocs (modes docset) From dbc7b667cf2c580019deb8563f76a6cf4cb7cafe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 13:58:16 +0200 Subject: [PATCH 2083/4235] Simplify set-docset! & add unset capability Removed :add and :remove capabilities. Now appends the provided docset to the mode's list of docsets, if one exists. --- modules/feature/lookup/autoload/docsets.el | 43 +++++++--------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 88196c1aa..b0e5a7a2a 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -12,39 +12,22 @@ "Registers a list of DOCSETS (strings) for MODES (either one major mode symbol or a list of them). -If MODES is a minor mode, you can use :add or :remove as the first element of -DOCSETS, to instruct it to append (or remove) those from the docsets already set -by a major-mode, if any. - Used by `+lookup/in-docsets' and `+lookup/documentation'." (dolist (mode (doom-enlist modes)) - (let ((hook-sym - (intern (format "+lookup|%s-docsets--%s" - (pcase (car docsets) - (:add 'add) - (:remove 'remove) - (_ 'set)) - mode)))) - (fset hook-sym - (lambda () - (let (var-sym) - (cond ((featurep! :completion ivy) - (setq var-sym 'counsel-dash-docsets)) - ((featurep! :completion helm) - (setq var-sym 'helm-dash-docsets))) - (when var-sym - (let ((val (symbol-value var-sym))) - (pcase (car docsets) - (:add - (set var-sym (append val (cdr docsets)))) - (:remove + (let ((fn (intern (format "+lookup|init-docsets--%s" mode))) + (hook (intern (format "%s-hook" mode)))) + (cond ((null (car-safe docsets)) + (remove-hook hook fn) + (unintern fn)) + ((fset fn + (lambda () + (let ((var-sym (if (featurep! :completion ivy) + 'counsel-dash-docsets + 'helm-dash-docsets))) (set var-sym - (cl-loop with to-delete = (cdr docsets) - for docset in val - unless (member docset to-delete) - collect docset))) - (_ (set var-sym (cdr docsets))))))))) - (add-hook (intern (format "%s-hook" mode)) hook-sym)))) + (append (symbol-value var-sym) + docsets))))) + (add-hook hook fn)))))) ;;;###autoload (def-setting! :docset (modes &rest docsets) From e05d7cfee0e14dddedb0df9b808b708c5d13e9c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 15:54:36 +0200 Subject: [PATCH 2084/4235] Change flycheck initialization strategy Initialize it globally and turn it off where needed, instead of enabling it on demand. Also fixes void-function: flycheck-mode errors when :feature syntax-checker is disabled. This is experimental. Indirectly fixes #710 --- modules/feature/syntax-checker/config.el | 5 ++++- modules/lang/cc/config.el | 4 +--- modules/lang/crystal/config.el | 3 +-- modules/lang/csharp/config.el | 2 -- modules/lang/data/config.el | 2 -- modules/lang/elm/config.el | 1 - modules/lang/emacs-lisp/config.el | 16 ++++++++-------- modules/lang/go/config.el | 3 +-- modules/lang/haskell/+dante.el | 3 +-- modules/lang/haskell/+intero.el | 1 - modules/lang/java/+meghanada.el | 2 -- modules/lang/javascript/config.el | 4 ++-- modules/lang/ledger/config.el | 3 +-- modules/lang/lua/config.el | 2 -- modules/lang/nim/config.el | 3 +-- modules/lang/perl/config.el | 6 +----- modules/lang/php/config.el | 2 +- modules/lang/purescript/config.el | 3 +-- modules/lang/python/config.el | 2 +- modules/lang/ruby/config.el | 2 -- modules/lang/rust/config.el | 2 +- modules/lang/sh/config.el | 2 +- modules/lang/solidity/config.el | 1 - modules/lang/swift/config.el | 1 - 24 files changed, 26 insertions(+), 49 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index e1995dc44..21238960b 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -2,6 +2,7 @@ (def-package! flycheck :commands (flycheck-list-errors flycheck-buffer) + :after-call (after-find-file doom-before-switch-buffer) :config ;; Emacs feels snappier without checks on newline (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) @@ -13,7 +14,9 @@ (ignore-errors (flycheck-buffer)) nil)) (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) - (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer))) + (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer)) + + (global-flycheck-mode +1)) (def-package! flycheck-popup-tip diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 058564ae8..e05acbec6 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -165,9 +165,7 @@ compilation database is present in the project.") (def-package! flycheck-irony :when (featurep! :feature syntax-checker) - :config - (add-hook 'irony-mode-hook #'flycheck-mode) - (flycheck-irony-setup)) + :config (flycheck-irony-setup)) (def-package! company-irony :when (featurep! :completion company) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index d6f5c9753..c740414f6 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -14,8 +14,7 @@ (def-package! flycheck-crystal :when (featurep! :feature syntax-checker) - :after crystal-mode - :config (add-hook 'crystal-mode-hook #'flycheck-mode)) + :after crystal-mode) (def-package! inf-crystal :commands crystal-switch-to-inf) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 5acd23383..760db1493 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -10,8 +10,6 @@ (setq omnisharp-auto-complete-want-documentation nil omnisharp-cache-directory (concat doom-cache-dir "omnisharp")) :config - (add-hook 'csharp-mode-hook #'flycheck-mode) - (defun +csharp|cleanup-omnisharp-server () "Clean up the omnisharp server once you kill the last csharp-mode buffer." (unless (doom-buffers-in-mode 'csharp-mode (buffer-list)) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index a1829fdc0..9786197f2 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -31,8 +31,6 @@ (def-package! json-mode :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)\\'" :config - (when (featurep! :feature syntax-checker) - (add-hook 'json-mode-hook #'flycheck-mode)) (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))) (def-package! vimrc-mode diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 500d28d61..572d97cc0 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -21,6 +21,5 @@ (def-package! flycheck-elm :when (featurep! :feature syntax-checker) :after elm-mode - :init (add-hook 'elm-mode-hook #'flycheck-mode) :config (add-to-list 'flycheck-checkers 'elm nil #'eq)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 6c43eda49..8863099c0 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -23,7 +23,7 @@ ;; fontification rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification ;; initialization - +emacs-lisp|init-imenu +emacs-lisp|init-flycheck)) + +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) ;; (defun +emacs-lisp|extra-fontification () @@ -53,13 +53,13 @@ ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) - (defun +emacs-lisp|init-flycheck () - "Initialize flycheck-mode if not in emacs.d." - (when (and buffer-file-name - (not (cl-loop for dir in (list doom-emacs-dir doom-private-dir) - if (file-in-directory-p buffer-file-name dir) - return t))) - (flycheck-mode +1)))) + (defun +emacs-lisp|disable-flycheck-maybe () + "Disable flycheck-mode if in emacs.d." + (when (or (not buffer-file-name) + (cl-loop for dir in (list doom-emacs-dir doom-private-dir) + if (file-in-directory-p buffer-file-name dir) + return t)) + (flycheck-mode -1)))) ;; diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 62670b88a..ec26c9a38 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -16,8 +16,7 @@ (setq gofmt-command goimports)) (when (featurep! :feature syntax-checker) - (setq gofmt-show-errors nil) ; Leave it to flycheck - (add-hook 'go-mode-hook #'flycheck-mode)) + (setq gofmt-show-errors nil)) ; Leave it to flycheck (add-hook 'go-mode-hook #'go-eldoc-setup) (add-hook! go-mode diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index c388d0150..e3687fd2b 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -5,8 +5,7 @@ :after haskell-mode :hook (haskell-mode . dante-mode) :config - (add-hook 'haskell-mode-hook #'interactive-haskell-mode) - (add-hook 'dante-mode-hook #'flycheck-mode)) + (add-hook 'haskell-mode-hook #'interactive-haskell-mode)) (def-package! company-ghc diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 5eeb71046..3ddbc5ef8 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -13,7 +13,6 @@ This is necessary because `intero-mode' doesn't do its own error checks." (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config - (add-hook 'intero-mode-hook #'flycheck-mode) (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 4eaa530e1..b2905e188 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -14,8 +14,6 @@ :definition #'meghanada-jump-declaration :references #'meghanada-reference) - (add-hook 'meghanada-mode-hook #'flycheck-mode) - ;; (def-menu! +java/refactor-menu "Refactoring commands for `java-mode' buffers." diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 52b5efe8f..eda3a2268 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -43,7 +43,7 @@ js2-strict-trailing-comma-warning nil js2-strict-missing-semi-warning nil) - (add-hook! 'js2-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (add-hook 'js2-mode-hook #'rainbow-delimiters-mode) ;; Indent switch-case another step (setq-hook! 'js2-mode-hook js-switch-indent-offset js2-basic-offset) @@ -84,7 +84,7 @@ (after! typescript-mode - (add-hook! 'typescript-mode-hook #'(flycheck-mode rainbow-delimiters-mode)) + (add-hook 'typescript-mode-hook #'rainbow-delimiters-mode) (setq-hook! 'typescript-mode-hook comment-line-break-function #'js2-line-break) (set-electric! 'typescript-mode diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 0df0dbc5f..0eb2c6339 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -11,5 +11,4 @@ (def-package! flycheck-ledger :when (featurep! :feature syntax-checker) - :after ledger-mode - :config (add-hook 'ledger-mode-hook #'flycheck-mode)) + :after ledger-mode) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index b0eaf1f66..db48750f7 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,8 +1,6 @@ ;;; lang/lua/config.el -*- lexical-binding: t; -*- (after! lua-mode - (add-hook 'lua-mode-hook #'flycheck-mode) - (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) (set-repl-handler! 'lua-mode #'+lua/repl) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index c43aab0aa..728780223 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -15,6 +15,5 @@ nimsuggest isn't installed." (def-package! flycheck-nim :when (featurep! :feature syntax-checker) - :after nim-mode - :config (add-hook 'nimsuggest-mode-hook #'flycheck-mode)) + :after nim-mode) diff --git a/modules/lang/perl/config.el b/modules/lang/perl/config.el index b0b7dec3c..9a7f4ad1b 100644 --- a/modules/lang/perl/config.el +++ b/modules/lang/perl/config.el @@ -1,14 +1,10 @@ ;;; lang/perl/config.el -*- lexical-binding: t; -*- ;; There's also `perl-mode' for perl < 6, which is already set up. -(when (featurep! :feature syntax-checker) - (add-hook 'perl-mode-hook #'flycheck-mode)) - (def-package! perl6-detect) (def-package! flycheck-perl6 :when (featurep! :feature syntax-checker) - :after perl6-mode - :config (add-hook 'perl6-mode-hook #'flycheck-mode)) + :after perl6-mode) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index c8b9cecff..e435067de 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -11,7 +11,7 @@ :mode "\\.inc$" :interpreter "php" :config - (add-hook! php-mode #'(ac-php-core-eldoc-setup flycheck-mode)) + (add-hook 'php-mode-hook #'ac-php-core-eldoc-setup) ;; Disable HTML compatibility in php-mode. `web-mode' has superior support for ;; php+html. Use the .phtml diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index 579391e8e..686ec691b 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -2,8 +2,7 @@ (after! purescript-mode (add-hook! 'purescript-mode-hook - #'(flycheck-mode - purescript-indentation-mode + #'(purescript-indentation-mode rainbow-delimiters-mode))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 2ae760085..10630b08e 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -22,7 +22,7 @@ is loaded.") python-indent-guess-indent-offset-verbose nil python-shell-interpreter "python") :config - (add-hook! 'python-mode-hook #'(flycheck-mode highlight-numbers-mode)) + (add-hook 'python-mode-hook #'highlight-numbers-mode) (set-env! "PYTHONPATH" "PYENV_ROOT") (set-electric! 'python-mode :chars '(?:)) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 168cfec9f..5c5e3b713 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -22,8 +22,6 @@ ;; Don't interfere with my custom RET behavior (define-key ruby-mode-map [?\n] nil) - (add-hook 'ruby-mode-hook #'flycheck-mode) - ;; Version management with rbenv (defun +ruby|add-version-to-modeline () "Add version string to the major mode in the modeline." diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 3ebab3937..d2502c7b1 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -35,5 +35,5 @@ (def-package! flycheck-rust :when (featurep! :feature syntax-checker) :after rust-mode - :config (add-hook! 'rust-mode-hook #'(flycheck-mode flycheck-rust-setup))) + :config (add-hook 'rust-mode-hook #'flycheck-rust-setup)) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 2b4c8ad01..9e1f09dd3 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -15,7 +15,7 @@ :mode ("\\.zunit\\'" . sh-mode) :mode ("/bspwmrc\\'" . sh-mode) :config - (add-hook! sh-mode #'(flycheck-mode highlight-numbers-mode)) + (add-hook 'sh-mode-hook #'highlight-numbers-mode) (set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) (set-repl-handler! 'sh-mode #'+sh/repl) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index b7b130b8f..0795e40b8 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -11,7 +11,6 @@ (def-package! solidity-flycheck ; included with solidity-mode :when (featurep! :feature syntax-checker) :after solidity-mode - :init (add-hook 'solidity-mode-hook #'flycheck-mode) :config (setq flycheck-solidity-solc-addstd-contracts t) (when (funcall flycheck-executable-find solidity-solc-path) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index 2c9dc359c..d099d8677 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -7,7 +7,6 @@ (def-package! flycheck-swift :when (featurep! :feature syntax-checker) :after swift-mode - :init (add-hook 'swift-mode-hook #'flycheck-mode) :config (flycheck-swift-setup)) From 60779c9aed3bbe483809c9ac72fc63833788c485 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 21:14:00 +0200 Subject: [PATCH 2085/4235] feature/version-control => ui/vc-gutter, emacs/vc Reorganize vcs functionality. Moves the custom fringe bitmaps into :ui vc-gutter. --- init.example.el | 3 +- modules/config/default/+bindings.el | 4 +- modules/config/default/+evil-commands.el | 4 +- .../version-control => emacs/vc}/autoload.el | 27 +-- .../version-control => emacs/vc}/config.el | 62 +++++-- modules/emacs/vc/packages.el | 7 + modules/feature/version-control/+git.el | 78 --------- modules/feature/version-control/packages.el | 15 -- modules/ui/doom/config.el | 23 --- modules/ui/vc-gutter/config.el | 161 ++++++++++++++++++ modules/ui/vc-gutter/packages.el | 5 + 11 files changed, 237 insertions(+), 152 deletions(-) rename modules/{feature/version-control => emacs/vc}/autoload.el (72%) rename modules/{feature/version-control => emacs/vc}/config.el (61%) create mode 100644 modules/emacs/vc/packages.el delete mode 100644 modules/feature/version-control/+git.el delete mode 100644 modules/feature/version-control/packages.el create mode 100644 modules/ui/vc-gutter/config.el create mode 100644 modules/ui/vc-gutter/packages.el diff --git a/init.example.el b/init.example.el index d874f4f27..bd93a2c2f 100644 --- a/init.example.el +++ b/init.example.el @@ -13,7 +13,6 @@ spellcheck ; tasing you for misspelling mispelling (syntax-checker ; tasing you for every semicolon you forget +childframe) ; use childframes for error popups (Emacs 26+ only) - version-control ; remember, remember that commit in November workspaces ; tab emulation, persistence & separate workspaces :completion @@ -42,6 +41,7 @@ ;pretty-code ; replace bits of code with pretty symbols ;tabbar ; FIXME an (incomplete) tab bar for Emacs ;unicode ; extended unicode support for various languages + vc-gutter ; vcs diff in the fringe vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows @@ -55,6 +55,7 @@ ;eshell ; a consistent, cross-platform shell (WIP) imenu ; an imenu sidebar and searchable code index ;term ; terminals in Emacs + vc ; version-control and Emacs, sitting in a tree :tools editorconfig ; let someone else argue about tabs vs spaces diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index bc1e71dda..0f97bca81 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -597,10 +597,10 @@ :desc "Magit file delete" :n "x" #'magit-file-delete :desc "List gists" :n "G" #'+gist:list :desc "Initialize repo" :n "i" #'magit-init - :desc "Browse issues tracker" :n "I" #'+vcs/git-browse-issues + :desc "Browse issues tracker" :n "I" #'+vc/git-browse-issues :desc "Magit buffer log" :n "l" #'magit-log-buffer-file :desc "List repositories" :n "L" #'magit-list-repositories - :desc "Browse remote" :n "o" #'+vcs/git-browse + :desc "Browse remote" :n "o" #'+vc/git-browse :desc "Magit push popup" :n "p" #'magit-push-popup :desc "Magit pull popup" :n "P" #'magit-pull-popup :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 732e6070c..7e2b7391b 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -70,8 +70,8 @@ command from the current directory instead of the project root." ;; 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! "gbrowse" #'+vc/git-browse) ; show file in github/gitlab +(ex! "gissues" #'+vc/git-browse-issues) ; show github issues (ex! "git" #'magit-status) ; open magit status window (ex! "gstage" #'magit-stage) (ex! "gunstage" #'magit-unstage) diff --git a/modules/feature/version-control/autoload.el b/modules/emacs/vc/autoload.el similarity index 72% rename from modules/feature/version-control/autoload.el rename to modules/emacs/vc/autoload.el index 8f01cff67..65e007f1d 100644 --- a/modules/feature/version-control/autoload.el +++ b/modules/emacs/vc/autoload.el @@ -1,7 +1,7 @@ -;;; feature/version-control/autoload.el -*- lexical-binding: t; -*- +;;; emacs/vc/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +vcs-root () +(defun +vc-git-root-url () "Return the root git repo URL for the current file." (require 'git-link) (let* ((remote (git-link--select-remote)) @@ -13,7 +13,7 @@ (defvar git-link-open-in-browser) ;;;###autoload -(defun +vcs/git-browse () +(defun +vc/git-browse () "Open the website for the current version controlled file. Fallback to repository root." (interactive) @@ -24,19 +24,19 @@ repository root." (git-link (git-link--select-remote) beg end)))) ;;;###autoload -(defun +vcs/git-browse-issues () +(defun +vc/git-browse-issues () "Open the issues page for current repo." (interactive) - (browse-url (format "%s/issues" (+vcs-root)))) + (browse-url (format "%s/issues" (+vc-git-root-url)))) ;;;###autoload -(defun +vcs/git-browse-pulls () +(defun +vc/git-browse-pulls () "Open the pull requests page for current repo." (interactive) - (browse-url (format "%s/pulls" (+vcs-root)))) + (browse-url (format "%s/pulls" (+vc-git-root-url)))) ;;;###autoload -(defun +vcs*update-header-line (revision) +(defun +vc*update-header-line (revision) "Show revision details in the header-line, instead of the minibuffer. Sometimes I forget `git-timemachine' is enabled in a buffer. Putting revision @@ -50,14 +50,3 @@ info in the `header-line-format' is a good indication." (propertize author 'face 'git-timemachine-minibuffer-author-face) (propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) date-full date-relative)))) - -;;;###autoload -(defun +vcs|enable-smerge-mode-maybe () - "Auto-enable `smerge-mode' when merge conflict is detected." - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^<<<<<<< " nil :noerror) - (smerge-mode 1) - (when (and (featurep 'hydra) - +vcs-auto-hydra-smerge) - (+hydra-smerge/body))))) diff --git a/modules/feature/version-control/config.el b/modules/emacs/vc/config.el similarity index 61% rename from modules/feature/version-control/config.el rename to modules/emacs/vc/config.el index d3d83f234..7558f4be4 100644 --- a/modules/feature/version-control/config.el +++ b/modules/emacs/vc/config.el @@ -1,26 +1,63 @@ -;;; feature/version-control/config.el -*- lexical-binding: t; -*- +;;; emacs/vc/config.el -*- lexical-binding: t; -*- -(load! "+git") -;; TODO (load! "+hg") - -;; -(setq vc-make-backup-files nil) - -(defvar +vcs-auto-hydra-smerge t +(defvar +vc-auto-hydra-smerge t "When entering `smerge-mode' automatically open associated hydra.") +;; +;; Plugins +;; + +;; `git-timemachine' +(after! git-timemachine + ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of + ;; showing revision details in the minibuffer, show them in + ;; `header-line-format', which has better visibility. + (setq git-timemachine-show-minibuffer-details t) + (advice-add #'git-timemachine--show-minibuffer-details :override #'+vc*update-header-line) + + (after! evil + ;; Force evil to rehash keybindings for the current state + (add-hook 'git-timemachine-mode-hook #'evil-normalize-keymaps))) + + +;; `git-commit-mode' +;; see https://chris.beams.io/posts/git-commit/ +(setq git-commit-fill-column 72 + git-commit-summary-max-length 50 + git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line)) +(when (featurep! :feature evil) + (add-hook 'git-commit-mode-hook #'evil-insert-state)) + + +;; +;; `vc' +;; + +;; `vc-hooks' +(setq vc-make-backup-files nil) + +;; `vc-annotate' (after! vc-annotate (set-popup-rules! - '(("^\\vc-d" :select) ; *vc-diff* + '(("^\\vc-d" :select nil) ; *vc-diff* ("^\\vc-c" :select t))) ; *vc-change-log* (set-evil-initial-state! '(vc-annotate-mode vc-git-log-view-mode) 'normal)) -(def-package! smerge-mode - :hook (find-file . +vcs|enable-smerge-mode-maybe) - :config +;; `smerge-mode' +(defun +vcs|enable-smerge-mode-maybe () + "Auto-enable `smerge-mode' when merge conflict is detected." + (save-excursion + (goto-char (point-min)) + (when (re-search-forward "^<<<<<<< " nil :noerror) + (smerge-mode 1) + (when (and (featurep 'hydra) +vc-auto-hydra-smerge) + (+hydra-smerge/body))))) +(add-hook 'find-file-hook #'+vcs|enable-smerge-mode-maybe) + +(after! smerge-mode ; built-in (unless EMACS26+ (with-no-warnings (defalias #'smerge-keep-upper #'smerge-keep-mine) @@ -65,3 +102,4 @@ ("r" smerge-resolve) ("R" smerge-kill-current) ("q" nil :color blue))) + diff --git a/modules/emacs/vc/packages.el b/modules/emacs/vc/packages.el new file mode 100644 index 000000000..3506fa5a0 --- /dev/null +++ b/modules/emacs/vc/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; emacs/vc/packages.el + +(package! git-link) +(package! git-timemachine) +(package! gitconfig-mode) +(package! gitignore-mode) diff --git a/modules/feature/version-control/+git.el b/modules/feature/version-control/+git.el deleted file mode 100644 index 5828a2157..000000000 --- a/modules/feature/version-control/+git.el +++ /dev/null @@ -1,78 +0,0 @@ -;;; feature/version-control/+git.el -*- lexical-binding: t; -*- - -;; see https://chris.beams.io/posts/git-commit/ -(setq git-commit-fill-column 72 - git-commit-summary-max-length 50 - git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line)) - -(when (featurep! :feature evil) - (add-hook 'git-commit-mode-hook #'evil-insert-state)) - - -(def-package! git-gutter-fringe - :defer t - :init - (defun +version-control|git-gutter-maybe () - "Enable `git-gutter-mode' in non-remote buffers." - (when (and (buffer-file-name) - (not (file-remote-p (buffer-file-name)))) - (require 'git-gutter-fringe) - (git-gutter-mode +1))) - (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) - :config - (set-popup-rule! "^\\*git-gutter" :select nil) - - ;; Update git-gutter on focus (in case I was using git externally) - (add-hook 'focus-in-hook #'git-gutter:update-all-windows) - - (defun +version-control|update-git-gutter (&rest _) - "Refresh git-gutter on ESC. Return nil to prevent shadowing other -`doom-escape-hook' hooks." - (when git-gutter-mode - (ignore (git-gutter)))) - - (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t) - - ;; update git-gutter when using these commands - (advice-add #'magit-stage :after #'+version-control|update-git-gutter) - (advice-add #'magit-unstage :after #'+version-control|update-git-gutter) - (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter) - (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter) - - (defhydra +version-control@git-gutter - (:body-pre (git-gutter-mode 1) :hint nil) - " - ╭─────────────────┐ - Movement Hunk Actions Misc. │ gg: +%-4s(car (git-gutter:statistic))/ -%-3s(cdr (git-gutter:statistic)) │ - ╭──────────────────────────────────┴─────────────────╯ - ^_g_^ [_s_] stage [_R_] set start Rev - ^_k_^ [_r_] revert - ^↑ ^ [_m_] mark - ^↓ ^ [_p_] popup ╭────────────────────── - ^_j_^ │[_q_] quit - ^_G_^ │[_Q_] Quit and disable" - ("j" (progn (git-gutter:next-hunk 1) (recenter))) - ("k" (progn (git-gutter:previous-hunk 1) (recenter))) - ("g" (progn (goto-char (point-min)) (git-gutter:next-hunk 1))) - ("G" (progn (goto-char (point-min)) (git-gutter:previous-hunk 1))) - ("s" git-gutter:stage-hunk) - ("r" git-gutter:revert-hunk) - ("m" git-gutter:mark-hunk) - ("p" git-gutter:popup-hunk) - ("R" git-gutter:set-start-revision) - ("q" nil :color blue) - ("Q" (git-gutter-mode -1) :color blue))) - - -(def-package! git-timemachine - :defer t - :config - ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of - ;; showing revision details in the minibuffer, show them in - ;; `header-line-format', which has better visibility. - (setq git-timemachine-show-minibuffer-details t) - (advice-add #'git-timemachine--show-minibuffer-details :override #'+vcs*update-header-line) - - (after! evil - ;; Force evil to rehash keybindings for the current state - (add-hook 'git-timemachine-mode-hook #'evil-force-normal-state))) diff --git a/modules/feature/version-control/packages.el b/modules/feature/version-control/packages.el deleted file mode 100644 index 088ec8cd9..000000000 --- a/modules/feature/version-control/packages.el +++ /dev/null @@ -1,15 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; feature/version-control/packages.el - -;;; config.el -;; n/a - -;;; +git -(unless (featurep! -git) - (package! git-gutter-fringe) - (package! git-link) - (package! git-timemachine) - (package! gitconfig-mode) - (package! gitignore-mode)) - -;;; TODO +hg diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 6dbac3128..9f160bc02 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -81,26 +81,3 @@ ov 'display (propertize " [...] " 'face '+doom-folded-face)))) (setq hs-set-up-overlay #'+doom-set-up-overlay)) - -;; NOTE Adjust these bitmaps if you change `doom-fringe-size' -(after! flycheck - ;; because git-gutter is in the left fringe - (setq flycheck-indication-mode 'right-fringe) - ;; A non-descript, left-pointing arrow - (define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow - [16 48 112 240 112 48 16] nil nil 'center)) - -;; subtle diff indicators in the fringe -(after! git-gutter-fringe - ;; places the git gutter outside the margins. - (setq-default fringes-outside-margins t) - ;; thin fringe bitmaps - (define-fringe-bitmap 'git-gutter-fr:added [224] - nil nil '(center repeated)) - (define-fringe-bitmap 'git-gutter-fr:modified [224] - nil nil '(center repeated)) - (define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240] - nil nil 'bottom)) - -;; standardize default fringe width -(if (fboundp 'fringe-mode) (fringe-mode '4)) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el new file mode 100644 index 000000000..5c8417ead --- /dev/null +++ b/modules/ui/vc-gutter/config.el @@ -0,0 +1,161 @@ +;;; ui/vc-gutter/config.el -*- lexical-binding: t; -*- + +(defvar +vc-gutter-in-margin nil + "If non-nil, use the margin for diffs instead of the fringe.") + +(defvar +vc-gutter-in-remote-files nil + "If non-nil, enable the vc gutter in remote files (e.g. open through TRAMP).") + +(defvar +vc-gutter-diff-unsaved-buffer nil + "If non-nil, `diff-hl-flydiff-mode' will be activated. This allows on-the-fly +diffing, even for unsaved buffers.") + +(defvar +vc-gutter-default-style t + "If non-nil, enable the default look of the vc gutter. This means subtle thin +bitmaps on the left, an arrow bitmap for flycheck, and flycheck indicators moved +to the right fringe.") + + +;; +;; Plugins +;; + +(def-package! git-gutter-fringe + :defer t + :init + (defun +version-control|git-gutter-maybe () + "Enable `git-gutter-mode' in non-remote buffers." + (when (and buffer-file-name + (vc-backend buffer-file-name) + (or +vc-gutter-in-remote-files + (not (file-remote-p buffer-file-name)))) + (require 'git-gutter-fringe) + (git-gutter-mode +1))) + (add-hook! (text-mode prog-mode conf-mode after-save) + #'+version-control|git-gutter-maybe) + ;; standardize default fringe width + (if (fboundp 'fringe-mode) (fringe-mode '4)) + :config + (set-popup-rule! "^\\*git-gutter" :select nil) + + ;; Update git-gutter on focus (in case I was using git externally) + (add-hook 'focus-in-hook #'git-gutter:update-all-windows) + + (defun +version-control|update-git-gutter (&rest _) + "Refresh git-gutter on ESC. Return nil to prevent shadowing other +`doom-escape-hook' hooks." + (when git-gutter-mode + (ignore (git-gutter)))) + (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t) + + ;; update git-gutter when using these commands + (add-hook 'magit-post-refresh-hook #'+version-control|update-git-gutter) + + (defhydra +version-control@git-gutter + (:body-pre (git-gutter-mode 1) :hint nil) + " + ╭─────────────────┐ + Movement Hunk Actions Misc. │ gg: +%-4s(car (git-gutter:statistic))/ -%-3s(cdr (git-gutter:statistic)) │ + ╭──────────────────────────────────┴─────────────────╯ + ^_g_^ [_s_] stage [_R_] set start Rev + ^_k_^ [_r_] revert + ^↑ ^ [_m_] mark + ^↓ ^ [_p_] popup ╭────────────────────── + ^_j_^ │[_q_] quit + ^_G_^ │[_Q_] Quit and disable" + ("j" (progn (git-gutter:next-hunk 1) (recenter))) + ("k" (progn (git-gutter:previous-hunk 1) (recenter))) + ("g" (progn (goto-char (point-min)) (git-gutter:next-hunk 1))) + ("G" (progn (goto-char (point-min)) (git-gutter:previous-hunk 1))) + ("s" git-gutter:stage-hunk) + ("r" git-gutter:revert-hunk) + ("m" git-gutter:mark-hunk) + ("p" git-gutter:popup-hunk) + ("R" git-gutter:set-start-revision) + ("q" nil :color blue) + ("Q" (git-gutter-mode -1) :color blue)) + + ;; subtle diff indicators in the fringe + (when +vc-gutter-default-style + ;; places the git gutter outside the margins. + (setq-default fringes-outside-margins t) + ;; thin fringe bitmaps + (define-fringe-bitmap 'git-gutter-fr:added [224] + nil nil '(center repeated)) + (define-fringe-bitmap 'git-gutter-fr:modified [224] + nil nil '(center repeated)) + (define-fringe-bitmap 'git-gutter-fr:deleted [128 192 224 240] + nil nil 'bottom) + ;; let diff have left fringe, flycheck can have right fringe + (after! flycheck + (setq flycheck-indication-mode 'right-fringe) + ;; A non-descript, left-pointing arrow + (define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow + [16 48 112 240 112 48 16] nil nil 'center)))) + + +;; (def-package! diff-hl +;; :defer t +;; :init +;; (defun +vc-gutter|init () +;; "Start `diff-hl-mode' if in a file-visiting and tracked buffer." +;; (when (and buffer-file-name +;; (vc-state buffer-file-name) +;; (or +vc-gutter-in-remote-files +;; (not (file-remote-p buffer-file-name)))) +;; (diff-hl-mode +1))) +;; (add-hook! (text-mode prog-mode conf-mode after-save) +;; #'+vc-gutter|init) +;; ;; standardize fringe size +;; (if (fboundp 'fringe-mode) (fringe-mode '4)) +;; :config +;; (setq vc-git-diff-switches '("--histogram")) +;; ;; Update diffs when it makes sense too, without being too slow +;; (if (not +vc-gutter-diff-unsaved-buffer) +;; (add-hook! '(doom-escape-hook focus-in-hook) #'diff-hl-update) +;; (diff-hl-flydiff-mode +1) +;; (add-hook! '(doom-escape-hook focus-in-hook) #'diff-hl-flydiff-update) +;; (when (featurep! :feature evil) +;; (when diff-hl-flydiff-timer +;; (cancel-timer diff-hl-flydiff-timer)) +;; (add-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update))) +;; ;; Don't delete the current hunk's indicators while we're editing +;; (advice-remove #'diff-hl-overlay-modified #'ignore) +;; ;; Update diff-hl when magit refreshes +;; (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh) +;; ;; update git-gutter when using these commands +;; (advice-add #'magit-stage :after #'+version-control|update-git-gutter) +;; (advice-add #'magit-unstage :after #'+version-control|update-git-gutter) +;; (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter) +;; (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter) +;; ;; Draw me like one of your French editors +;; (setq-default fringes-outside-margins t) +;; (cond ((or +vc-gutter-in-margin (not (display-graphic-p))) +;; (diff-hl-margin-mode) +;; (setq diff-hl-margin-symbols-alist +;; '((insert . "❙") (delete . "^") (change . "❙") +;; (unknown . "❙") (ignored . "❙")))) +;; (t +;; ;; Because diff-hl is in the left fringe +;; (setq flycheck-indication-mode 'right-fringe) +;; (defun +vc-gutter|setup-fringe-bitmaps () +;; "Define thin fringe bitmaps for maximum sexiness." +;; (define-fringe-bitmap 'diff-hl-bmp-top [224] nil nil '(center repeated)) +;; (define-fringe-bitmap 'diff-hl-bmp-middle [224] nil nil '(center repeated)) +;; (define-fringe-bitmap 'diff-hl-bmp-bottom [224] nil nil '(center repeated)) +;; (define-fringe-bitmap 'diff-hl-bmp-insert [224] nil nil '(center repeated)) +;; (define-fringe-bitmap 'diff-hl-bmp-single [224] nil nil '(center repeated)) +;; (define-fringe-bitmap 'diff-hl-bmp-delete [240 224 192 128] nil nil 'top)) +;; (defun +vc-gutter-type-at-pos (type _pos) +;; "Return the bitmap for `diff-hl' to use for change at point." +;; (pcase type +;; (`unknown 'question-mark) +;; (`delete 'diff-hl-bmp-delete) +;; (`change 'diff-hl-bmp-middle) +;; (`ignored 'diff-hl-bmp-i) +;; (x (intern (format "diff-hl-bmp-%s" x))))) +;; ;; Tweak the fringe bitmaps so we get long, elegant bars +;; (setq diff-hl-fringe-bmp-function #'+vc-gutter-type-at-pos +;; diff-hl-draw-borders nil) +;; (add-hook 'diff-hl-mode-hook #'+vc-gutter|setup-fringe-bitmaps)))) + diff --git a/modules/ui/vc-gutter/packages.el b/modules/ui/vc-gutter/packages.el new file mode 100644 index 000000000..921b14a94 --- /dev/null +++ b/modules/ui/vc-gutter/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/vc-gutter/packages.el + +(package! git-gutter-fringe) +;; (package! diff-hl) From ff7823bfc93dd4162706a61a196691727f081a68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 22:17:15 +0200 Subject: [PATCH 2086/4235] Refactor module deprecation checks in doom! Also changes the structure of doom-obsolete-modules, and adds :feature version-control to it. --- core/core-modules.el | 62 ++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 32c22d802..af5b0e542 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -11,12 +11,14 @@ "A list of module root directories. Order determines priority.") (defconst doom-obsolete-modules - '(((:emacs . electric-indent) . (:emacs . electric))) + '(((:emacs electric-indent) (:emacs electric)) + ((:feature version-control) (:emacs vc) (:ui vc-gutter))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . -MODULE). E.g. +MODULES). E.g. - ((:emacs . electric-indent) . (:emacs . electric)) + ((:emacs . electric-indent) . (:emacs electric)) + ((:feature . version-control) (:emacs vc) (:ui . vc-gutter)) A warning will be put out if these deprecated modules are used.") @@ -253,31 +255,35 @@ to least)." (make-hash-table :test #'equal :size (if modules (length modules) 100) :rehash-threshold 1.0)) - category - init-forms config-forms) - (dolist (m modules) - (cond ((keywordp m) (setq category m)) - ((not category) (error "No module category specified for %s" m)) - ((let* ((module (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (when-let* ((new (assoc (cons category module) doom-obsolete-modules))) - (if-let* ((newkey (cdr new))) - (message "Warning: the %s module has been moved to %s" - (list category module) - (list (setq category (car newkey)) - (setq module (cdr newkey)))) - (message "Warning: the %s module is deprecated" key))) - (let ((path (doom-module-locate-path category module))) - (if (not path) - (message "Couldn't find the %s %s module" category module) - (let ((key (cons category module))) - (doom-module-set category module :flags flags :path path) - (push `(let ((doom--current-module ',key)) - (load! "init" ,path t)) - init-forms) - (push `(let ((doom--current-module ',key)) - (load! "config" ,path t)) - config-forms)))))))) + category init-forms config-forms) + (while modules + (let ((m (pop modules))) + (cond ((keywordp m) (setq category m)) + ((not category) (error "No module category specified for %s" m)) + ((catch 'doom-modules + (let* ((module (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) + (when-let* ((new (assoc (list category module) doom-obsolete-modules))) + (let ((newkeys (cdr new))) + (if (null newkeys) + (message "Warning: the %s module is deprecated" key) + (message "Warning: the %s module is deprecated. Use %s instead." + (list category module) newkeys) + (push category modules) + (dolist (key newkeys) + (setq modules (append key modules))) + (throw 'doom-modules t)))) + (let ((path (doom-module-locate-path category module))) + (if (not path) + (message "Couldn't find the %s %s module" category module) + (let ((key (cons category module))) + (doom-module-set category module :flags flags :path path) + (push `(let ((doom--current-module ',key)) + (load! "init" ,path t)) + init-forms) + (push `(let ((doom--current-module ',key)) + (load! "config" ,path t)) + config-forms)))))))))) `(let (file-name-handler-alist) (setq doom-modules ',doom-modules) ,@(nreverse init-forms) From be48751a45022dd9367571113580ededce91a547 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Jun 2018 23:11:05 +0200 Subject: [PATCH 2087/4235] Change unsetting with set-lookup-handlers! Instead of passing :unset, pass in nil as its second argument. --- modules/feature/lookup/autoload/lookup.el | 53 ++++++++++++----------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index d3199fed4..c092d8922 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -4,14 +4,14 @@ ;;;###autodef (defun set-lookup-handlers! (modes &rest plist) - "Defines a jump target for major MODES. + "Define a jump target for major MODES. This overwrites previously defined handlers for MODES. If used on minor modes, they are combined with handlers defined for other minor modes or the major mode it's activated in. -If the CAR of PLIST is :unset, other properties are ignored and all existing -jump handlers for MODES are cleared. Otherwise, PLIST accepts the following +If the CAR of PLIST is nil, other properties are ignored and all existing jump +handlers for MODES are cleared. Otherwise, PLIST accepts the following properties: :definition FN @@ -30,29 +30,30 @@ properties: Defines an xref backend for a major-mode. If you define :definition and :references along with :xref-backend, those will have higher precedence." (dolist (mode (doom-enlist modes)) - (let ((fn (intern (format "+lookup|init-%s" mode))) - (hook (intern (format "%s-hook" mode)))) - (if (eq (car plist) :unset) - (remove-hook hook fn) - (fset fn - (lambda () - (when (or (eq major-mode mode) - (and (boundp mode) - (symbol-value mode))) - (cl-destructuring-bind - (&key definition references documentation file xref-backend) - plist - (when definition - (add-hook '+lookup-definition-functions definition nil t)) - (when references - (add-hook '+lookup-references-functions references nil t)) - (when documentation - (add-hook '+lookup-documentation-functions documentation nil t)) - (when file - (add-hook '+lookup-file-functions file nil t)) - (when xref-backend - (add-hook 'xref-backend-functions xref-backend nil t)))))) - (add-hook hook fn))))) + (let ((hook (intern (format "%s-hook" mode))) + (fn (intern (format "+lookup|init-%s" mode)))) + (cond ((null (car plist)) + (remove-hook hook fn) + (unintern fn)) + ((fset fn + (lambda () + (when (or (eq major-mode mode) + (and (boundp mode) + (symbol-value mode))) + (cl-destructuring-bind + (&key definition references documentation file xref-backend) + plist + (when definition + (add-hook '+lookup-definition-functions definition nil t)) + (when references + (add-hook '+lookup-references-functions references nil t)) + (when documentation + (add-hook '+lookup-documentation-functions documentation nil t)) + (when file + (add-hook '+lookup-file-functions file nil t)) + (when xref-backend + (add-hook 'xref-backend-functions xref-backend nil t)))))) + (add-hook hook fn)))))) ;;;###autoload (def-setting! :lookup (modes &rest plist) From 3a3eb920871adb50fcc7e15d402e513fdc5818d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 00:32:42 +0200 Subject: [PATCH 2088/4235] Move :tools rotate-text to :editor rotate-text This change was a long time coming. --- core/core-modules.el | 3 ++- init.example.el | 2 +- modules/{tools => editor}/rotate-text/autoload.el | 2 +- modules/{tools => editor}/rotate-text/packages.el | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) rename modules/{tools => editor}/rotate-text/autoload.el (93%) rename modules/{tools => editor}/rotate-text/packages.el (76%) diff --git a/core/core-modules.el b/core/core-modules.el index af5b0e542..7a9f2e0ec 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -11,7 +11,8 @@ "A list of module root directories. Order determines priority.") (defconst doom-obsolete-modules - '(((:emacs electric-indent) (:emacs electric)) + '(((:tools rotate-text) (:editor rotate-text)) + ((:emacs electric-indent) (:emacs electric)) ((:feature version-control) (:emacs vc) (:ui vc-gutter))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . diff --git a/init.example.el b/init.example.el index bd93a2c2f..f25ee6443 100644 --- a/init.example.el +++ b/init.example.el @@ -47,6 +47,7 @@ :editor ;parinfer ; turn lisp into python, sort of + rotate-text ; cycle region at point between text candidates :emacs dired ; making dired pretty [functional] @@ -68,7 +69,6 @@ ;pdf ; pdf enhancements ;prodigy ; FIXME managing external services & code builders ;rgb ; creating color strings - rotate-text ; cycle region at point between text candidates ;tmux ; an API for interacting with tmux ;upload ; map local to remote projects via ssh/ftp ;wakatime diff --git a/modules/tools/rotate-text/autoload.el b/modules/editor/rotate-text/autoload.el similarity index 93% rename from modules/tools/rotate-text/autoload.el rename to modules/editor/rotate-text/autoload.el index f6b933c65..dc53bb9c0 100644 --- a/modules/tools/rotate-text/autoload.el +++ b/modules/editor/rotate-text/autoload.el @@ -1,4 +1,4 @@ -;;; tools/rotate-text/autoload.el -*- lexical-binding: t; -*- +;;; editor/rotate-text/autoload.el -*- lexical-binding: t; -*- ;;;###autoload (after! rotate-text diff --git a/modules/tools/rotate-text/packages.el b/modules/editor/rotate-text/packages.el similarity index 76% rename from modules/tools/rotate-text/packages.el rename to modules/editor/rotate-text/packages.el index f2c3547b7..955e531ed 100644 --- a/modules/tools/rotate-text/packages.el +++ b/modules/editor/rotate-text/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/rotate-text/packages.el +;;; editor/rotate-text/packages.el (package! rotate-text :recipe (:fetcher github :repo "debug-ito/rotate-text.el")) From 13cb219e4982db68fe69c70781fa55c2eb94c61b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:03:26 +0200 Subject: [PATCH 2089/4235] lang/common-lisp: improve evil+sly integration --- modules/feature/evil/config.el | 3 +- modules/lang/common-lisp/autoload.el | 11 +++ modules/lang/common-lisp/config.el | 106 ++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 modules/lang/common-lisp/autoload.el diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 9bd6bba8a..9b187cd2b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -13,7 +13,8 @@ helm ivy minibuffer - ruby-mode) + ruby-mode + slime) "A list of `evil-collection' modules to disable. See the definition of this variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") diff --git a/modules/lang/common-lisp/autoload.el b/modules/lang/common-lisp/autoload.el new file mode 100644 index 000000000..0423aa689 --- /dev/null +++ b/modules/lang/common-lisp/autoload.el @@ -0,0 +1,11 @@ +;;; lang/common-lisp/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +common-lisp*sly-last-sexp (command &rest args) + "In normal-state or motion-state, last sexp ends at point." + (if (and (not evil-move-beyond-eol) + (or (evil-normal-state-p) (evil-motion-state-p))) + (save-excursion + (unless (or (eobp) (eolp)) (forward-char)) + (apply command args)) + (apply command args))) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index ee4b2c74a..0660155d4 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -27,5 +27,109 @@ (add-hook 'kill-buffer-hook #'+common-lisp|cleanup-sly-maybe nil t))) ((message "WARNING: Couldn't find `inferior-lisp-program' (%s)" inferior-lisp-program)))) - (add-hook 'sly-mode-hook #'+common-lisp|init-sly)) + (add-hook 'sly-mode-hook #'+common-lisp|init-sly) + ;; evil integration + (when (featurep! :feature evil +everywhere) + (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps) + (unless evil-move-beyond-eol + (advice-add 'sly-eval-last-expression :around '+common-lisp*sly-last-sexp) + (advice-add 'sly-pprint-eval-last-expression :around '+common-lisp*sly-last-sexp) + (advice-add 'sly-eval-print-last-expression :around '+common-lisp*sly-last-sexp) + (advice-add 'sly-eval-last-expression-in-repl :around '+common-lisp*sly-last-sexp)) + (set-evil-initial-state! + '(sly-db-mode sly-inspector-mode sly-popup-buffer-mode sly-xref-mode) + 'normal) + (evil-define-key 'normal sly-parent-map + (kbd "C-t") #'sly-pop-find-definition-stack) + (evil-define-key 'normal sly-db-mode-map + (kbd "RET") 'sly-db-default-action + (kbd "C-m") 'sly-db-default-action + [return] 'sly-db-default-action + [mouse-2] 'sly-db-default-action/mouse + [follow-link] 'mouse-face + "\C-i" 'sly-db-cycle + "g?" 'describe-mode + "S" 'sly-db-show-source + "e" 'sly-db-eval-in-frame + "d" 'sly-db-pprint-eval-in-frame + "D" 'sly-db-disassemble + "i" 'sly-db-inspect-in-frame + "gj" 'sly-db-down + "gk" 'sly-db-up + (kbd "C-j") 'sly-db-down + (kbd "C-k") 'sly-db-up + "]" 'sly-db-details-down + "[" 'sly-db-details-up + (kbd "C-S-j") 'sly-db-details-down + (kbd "C-S-k") 'sly-db-details-up + "gg" 'sly-db-beginning-of-backtrace + "G" 'sly-db-end-of-backtrace + "t" 'sly-db-toggle-details + "gr" 'sly-db-restart-frame + "I" 'sly-db-invoke-restart-by-name + "R" 'sly-db-return-from-frame + "c" 'sly-db-continue + "s" 'sly-db-step + "n" 'sly-db-next + "o" 'sly-db-out + "b" 'sly-db-break-on-return + "a" 'sly-db-abort + "q" 'sly-db-quit + "A" 'sly-db-break-with-system-debugger + "B" 'sly-db-break-with-default-debugger + "P" 'sly-db-print-condition + "C" 'sly-db-inspect-condition + "g:" 'sly-interactive-eval + "0" 'sly-db-invoke-restart-0 + "1" 'sly-db-invoke-restart-1 + "2" 'sly-db-invoke-restart-2 + "3" 'sly-db-invoke-restart-3 + "4" 'sly-db-invoke-restart-4 + "5" 'sly-db-invoke-restart-5 + "6" 'sly-db-invoke-restart-6 + "7" 'sly-db-invoke-restart-7 + "8" 'sly-db-invoke-restart-8 + "9" 'sly-db-invoke-restart-9) + (evil-define-key 'normal sly-inspector-mode-map + [return] 'sly-inspector-operate-on-point + (kbd "C-m") 'sly-inspector-operate-on-point + [mouse-1] 'sly-inspector-operate-on-click + [mouse-2] 'sly-inspector-operate-on-click + [mouse-6] 'sly-inspector-pop + [mouse-7] 'sly-inspector-next + "gk" 'sly-inspector-pop + (kbd "C-k") 'sly-inspector-pop + "gj" 'sly-inspector-next + "j" 'sly-inspector-next + "k" 'sly-inspector-previous-inspectable-object + "K" 'sly-inspector-describe + "p" 'sly-inspector-pprint + "e" 'sly-inspector-eval + "h" 'sly-inspector-history + "gr" 'sly-inspector-reinspect + "gv" 'sly-inspector-toggle-verbose + "\C-i" 'sly-inspector-next-inspectable-object + [(shift tab)] 'sly-inspector-previous-inspectable-object ; Emacs translates S-TAB + [backtab] 'sly-inspector-previous-inspectable-object ; to BACKTAB on X. + "." 'sly-inspector-show-source + "gR" 'sly-inspector-fetch-all + "q" 'sly-inspector-quit) + (evil-define-key 'normal sly-mode-map + (kbd "C-t") 'sly-pop-find-definition-stack) + (evil-define-key 'normal sly-popup-buffer-mode-map + "q" 'quit-window + (kbd "C-t") 'sly-pop-find-definition-stack) + (evil-define-key 'normal sly-xref-mode-map + (kbd "RET") 'sly-goto-xref + (kbd "S-") 'sly-goto-xref + "go" 'sly-show-xref + "gj" 'sly-xref-next-line + "gk" 'sly-xref-prev-line + (kbd "C-j") 'sly-xref-next-line + (kbd "C-k") 'sly-xref-prev-line + "]" 'sly-xref-next-line + "[" 'sly-xref-prev-line + "gr" 'sly-recompile-xref + "gR" 'sly-recompile-all-xrefs + "r" 'sly-xref-retract))) From fe44d71965911280541b203687b99e8e0f654a3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:03:53 +0200 Subject: [PATCH 2090/4235] Add repl+lookup handlers and popup rule for sly --- modules/lang/common-lisp/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 0660155d4..3c4a997be 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -4,6 +4,12 @@ (after! sly (setq inferior-lisp-program "sbcl") + (set-popup-rule! "^\\*sly" :quit nil :ttl nil) + (set-repl-handler! 'sly-mode #'sly-mrepl) + (set-lookup-handlers! 'sly-mode + :definition #'sly-edit-definition + :documentation #'sly-describe-symbol) + (defun +common-lisp|cleanup-sly-maybe () "Kill processes and leftover buffers when killing the last sly buffer." (unless (cl-loop for buf in (delq (current-buffer) (buffer-list)) From 0d19b9e61c1a1daaa3581b6175dfb891316d7756 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:06:37 +0200 Subject: [PATCH 2091/4235] Refactor +file-templates--expand --- modules/feature/file-templates/autoload.el | 47 ++++++++++------------ 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index bccb93a2e..a7f5e4607 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -55,33 +55,30 @@ these properties: ;; ;;;###autoload -(defun +file-templates--expand (pred &rest plist) +(cl-defun +file-templates--expand (pred &key project mode trigger ignore) "Auto insert a yasnippet snippet into current file and enter insert mode (if evil is loaded and enabled)." - (when (and pred (not (plist-get plist :ignore))) - (let ((project (plist-get plist :project)) - (mode (plist-get plist :mode)) - (trigger (plist-get plist :trigger))) - (when (if project (doom-project-p) t) - (unless mode - (setq mode (if (symbolp pred) pred major-mode))) - (unless mode - (user-error "Couldn't determine mode for %s file template" pred)) - (unless trigger - (setq trigger +file-templates-default-trigger)) - (require 'yasnippet) - (unless yas-minor-mode - (yas-minor-mode-on)) - (when (and yas-minor-mode - (yas-expand-snippet - (yas--template-content - (cl-find trigger (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) - (overlay-get yas--active-field-overlay 'yas--field))) - (evil-initialize-state 'insert)))))) + (when (and pred (not ignore)) + (when (if project (doom-project-p) t) + (unless mode + (setq mode (if (symbolp pred) pred major-mode))) + (unless mode + (user-error "Couldn't determine mode for %s file template" pred)) + (unless trigger + (setq trigger +file-templates-default-trigger)) + (require 'yasnippet) + (unless yas-minor-mode + (yas-minor-mode-on)) + (when (and yas-minor-mode + (yas-expand-snippet + (yas--template-content + (cl-find trigger (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) + (overlay-get yas--active-field-overlay 'yas--field))) + (evil-initialize-state 'insert))))) ;;;###autoload (defun +file-templates-get-short-path () From 8c5deef5fc0a002d422d636dcee7e6530d58b088 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:10:08 +0200 Subject: [PATCH 2092/4235] Fix unintern calls (missing second argument) --- modules/completion/company/autoload.el | 2 +- modules/feature/lookup/autoload/docsets.el | 2 +- modules/feature/lookup/autoload/lookup.el | 2 +- modules/ui/pretty-code/autoload.el | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index bff051848..dfdf52b72 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -22,7 +22,7 @@ Examples: (fn (intern (format "+company|init-%s" mode)))) (cond ((null (car-safe backends)) (remove-hook hook fn) - (unintern fn)) + (unintern fn nil)) ((fset fn (lambda () (when (or (eq major-mode mode) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index b0e5a7a2a..9c2630494 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -18,7 +18,7 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (hook (intern (format "%s-hook" mode)))) (cond ((null (car-safe docsets)) (remove-hook hook fn) - (unintern fn)) + (unintern fn nil)) ((fset fn (lambda () (let ((var-sym (if (featurep! :completion ivy) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index c092d8922..e0b70029a 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -34,7 +34,7 @@ properties: (fn (intern (format "+lookup|init-%s" mode)))) (cond ((null (car plist)) (remove-hook hook fn) - (unintern fn)) + (unintern fn nil)) ((fset fn (lambda () (when (or (eq major-mode mode) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 3a81bdc52..a99278ece 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -325,7 +325,7 @@ Pretty symbols can be unset for emacs-lisp-mode with: (fn (intern (format "+pretty-code|init-%s" mode)))) (cond ((null (car-safe plist)) (remove-hook hook fn) - (unintern fn)) + (unintern fn nil)) ((or (eq +pretty-code-enabled-modes 't) (if (eq (car +pretty-code-enabled-modes) 'not) (not (memq mode (cdr +pretty-code-enabled-modes))) From 22c145105d3756d94ba2e257d36deac8696a5d24 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:24:00 +0200 Subject: [PATCH 2093/4235] Add unset capability to set-electric! --- modules/emacs/electric/autoload.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index dc22a08b0..7ecbaf3b0 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -5,18 +5,19 @@ "Declare :words (list of strings) or :chars (lists of chars) in MODES that trigger electric indentation." (declare (indent 1)) - (unless plist - (signal 'wrong-number-of-arguments - (list '(:char :words) plist))) - (cl-destructuring-bind (&key chars words) plist - (dolist (mode (doom-enlist modes)) - (let ((fn (intern (format "+electric|init-%s" mode)))) - (fset fn - (lambda () - (electric-indent-local-mode +1) - (if chars (setq electric-indent-chars chars)) - (if words (setq +electric-indent-words words)))) - (add-hook (intern (format "%s-hook" mode)) fn))))) + (dolist (mode (doom-enlist modes)) + (let ((hook (intern (format "%s-hook" mode))) + (fn (intern (format "+electric|init-%s" mode)))) + (cond ((null (car-safe plist)) + (remove-hook hook fn) + (unintern fn nil)) + ((fset fn + (lambda () + (cl-destructuring-bind (&key chars words) plist + (electric-indent-local-mode +1) + (if chars (setq electric-indent-chars chars)) + (if words (setq +electric-indent-words words))))) + (add-hook hook fn)))))) ;; FIXME obsolete :electric ;;;###autoload From 5531d7115a9096b4d79157df4398fe21bdc07bb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:30:27 +0200 Subject: [PATCH 2094/4235] Fix indentation for many autodef setters --- modules/completion/company/autoload.el | 1 + modules/editor/rotate-text/autoload.el | 2 +- modules/emacs/electric/autoload.el | 2 +- modules/feature/eval/autoload/settings.el | 1 + modules/feature/evil/autoload/evil.el | 1 + modules/feature/file-templates/autoload.el | 1 + modules/feature/lookup/autoload/docsets.el | 1 + modules/feature/lookup/autoload/lookup.el | 1 + modules/ui/pretty-code/autoload.el | 2 +- 9 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index dfdf52b72..d605ac9b5 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -17,6 +17,7 @@ Examples: (set-company-backend! 'js2-mode '(:separate company-irony-c-headers company-irony)) (set-company-backend! 'sh-mode nil)" + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) (fn (intern (format "+company|init-%s" mode)))) diff --git a/modules/editor/rotate-text/autoload.el b/modules/editor/rotate-text/autoload.el index dc53bb9c0..d5247e656 100644 --- a/modules/editor/rotate-text/autoload.el +++ b/modules/editor/rotate-text/autoload.el @@ -8,7 +8,7 @@ (cl-defun set-rotate-patterns! (modes &key symbols words patterns) "Declare :symbols, :words or :patterns (all lists of strings) that `rotate-text' will cycle through." - (declare (indent 1)) + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((fn-name (intern (format "+rotate-text|init-%s" mode)))) (fset fn-name diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 7ecbaf3b0..c75d2fe0e 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -4,7 +4,7 @@ (defun set-electric! (modes &rest plist) "Declare :words (list of strings) or :chars (lists of chars) in MODES that trigger electric indentation." - (declare (indent 1)) + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) (fn (intern (format "+electric|init-%s" mode)))) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 2925c6ee6..2849e5fab 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -42,6 +42,7 @@ function that creates and returns the REPL buffer." (quickrun-add-command MODE COMMAND :mode MODE). 4. If MODE is not a string and COMMANd is a symbol, add it to `+eval-runners', which is used by `+eval/region'." + (declare (indent defun)) (cond ((symbolp command) (push (cons mode command) +eval-runners)) ((stringp command) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 1c1c86e8f..c6ab35535 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -4,6 +4,7 @@ ;;;###autodef (defun set-evil-initial-state! (modes state) "Set the initialize STATE of MODES using `evil-set-initial-state'." + (declare (indent defun)) (after! evil (if (listp modes) (dolist (mode (doom-enlist modes)) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index a7f5e4607..be789d92d 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -27,6 +27,7 @@ these properties: :ignore BOOL If non-nil, don't expand any template for this file and don't test any other file template rule against this buffer." + (declare (indent defun)) (after! (:when (boundp '+file-templates-alist)) (+file-templates--set pred plist))) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 9c2630494..2255e1662 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -13,6 +13,7 @@ symbol or a list of them). Used by `+lookup/in-docsets' and `+lookup/documentation'." + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((fn (intern (format "+lookup|init-docsets--%s" mode))) (hook (intern (format "%s-hook" mode)))) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index e0b70029a..de9216787 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -29,6 +29,7 @@ properties: :xref-backend FN Defines an xref backend for a major-mode. If you define :definition and :references along with :xref-backend, those will have higher precedence." + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) (fn (intern (format "+lookup|init-%s" mode)))) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index a99278ece..b11795f42 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -319,7 +319,7 @@ assicated with :lambda in `+pretty-code-symbols'. Pretty symbols can be unset for emacs-lisp-mode with: (set-pretty-symbols! 'emacs-lisp-mode nil)" - (declare (indent 1)) + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) (fn (intern (format "+pretty-code|init-%s" mode)))) From 16975d0dc3e0f2911b9e5fe04baa50504a76fb72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:44:19 +0200 Subject: [PATCH 2095/4235] Slightly smaller backtrace popups --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index b544ac9d2..b5b6bccd2 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -159,7 +159,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; `Info-mode' ("^\\*info\\*$" :slot 2 :vslot 2 :size 0.45 :select t))) - '(("^\\*Backtrace" :vslot 99 :size 0.5 :quit nil))) + '(("^\\*Backtrace" :vslot 99 :size 0.4 :quit nil))) (add-hook 'doom-init-ui-hook #'+popup-mode :append) From e4cfdc7fcb843361480244fd35d5a3ef67f02641 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 01:48:04 +0200 Subject: [PATCH 2096/4235] Use :when instead of (when ...) block For loading dash docsets in feature/lookup module. Fixes 'Cannot find package' load errors during byte-compilation. --- modules/feature/lookup/config.el | 33 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 03432aecd..5f0431a4b 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -122,23 +122,24 @@ argument: the identifier at point.") ;; Dash docset integration ;; -(when (featurep! +docsets) - ;; Both packages depend on helm-dash - (def-package! helm-dash - :defer t - :init - (setq helm-dash-enable-debugging doom-debug-mode - helm-dash-browser-func #'eww) - :config - (unless (file-directory-p helm-dash-docsets-path) - (setq helm-dash-docsets-path (concat doom-etc-dir "docsets/"))) - (unless (file-directory-p helm-dash-docsets-path) - (make-directory helm-dash-docsets-path t))) +;; Both packages depend on helm-dash, for now +(def-package! helm-dash + :defer t + :when (featurep! +docsets) + :init + (setq helm-dash-enable-debugging doom-debug-mode + helm-dash-browser-func #'eww) + :config + (unless (file-directory-p helm-dash-docsets-path) + (setq helm-dash-docsets-path (concat doom-etc-dir "docsets/"))) + (unless (file-directory-p helm-dash-docsets-path) + (make-directory helm-dash-docsets-path t))) - (def-package! counsel-dash - :when (featurep! :completion ivy) - :commands counsel-dash-install-docset - :config (setq counsel-dash-min-length 2))) +(def-package! counsel-dash + :when (and (featurep! +docsets) + (featurep! :completion ivy)) + :commands counsel-dash-install-docset + :config (setq counsel-dash-min-length 2)) ;; From ab01e0167db98caee7562ca848368592718f60f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 10:24:48 +0200 Subject: [PATCH 2097/4235] Fix evil-easymotion lazyloading middleman It would fire off the wrong prefix when no operator was active (thus passing nil to where-is-internal). Reported by @ar1a --- modules/config/default/autoload/evil.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index 6b119127e..cb8453a6c 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -45,8 +45,8 @@ integration." (evil-define-key* 'motion 'global prefix nil) (evilem-default-keybindings prefix) (which-key-reload-key-sequence - (vconcat (where-is-internal evil-this-operator - evil-normal-state-map - t) + (vconcat (when evil-this-operator + (where-is-internal evil-this-operator + evil-normal-state-map + t)) prefix)))) - From 4ad9e1813589d61a0b5c315e4cb27e209b9d776d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 12:02:31 +0200 Subject: [PATCH 2098/4235] +default/easymotion => +evil/easymotion --- modules/config/default/+bindings.el | 2 +- modules/config/default/autoload/evil.el | 15 --------------- modules/feature/evil/autoload/evil.el | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 0f97bca81..901696b74 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -162,7 +162,7 @@ "M-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action)))) ;; easymotion - :m "gs" #'+default/easymotion ; lazy-load `evil-easymotion' + :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' (:after evil-easymotion :map evilem-map "a" (evilem-create #'evil-forward-arg) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index cb8453a6c..a813659a1 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -35,18 +35,3 @@ buffers." (interactive "") (doom/kill-matching-buffers pattern bang)) - -;;;###autoload -(defun +default/easymotion () - "Invoke and lazy-load `evil-easymotion' without compromising which-key -integration." - (interactive) - (let ((prefix (this-command-keys))) - (evil-define-key* 'motion 'global prefix nil) - (evilem-default-keybindings prefix) - (which-key-reload-key-sequence - (vconcat (when evil-this-operator - (where-is-internal evil-this-operator - evil-normal-state-map - t)) - prefix)))) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index c6ab35535..27c89e0f2 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -370,3 +370,18 @@ more information on modifiers." "Call `doom/escape' if `evil-force-normal-state' is called interactively." (when (called-interactively-p 'any) (call-interactively #'doom/escape))) + +;;;###autoload +(defun +evil/easymotion () + "Invoke and lazy-load `evil-easymotion' without compromising which-key +integration." + (interactive) + (let ((prefix (this-command-keys))) + (evil-define-key* 'motion 'global prefix nil) + (evilem-default-keybindings prefix) + (which-key-reload-key-sequence + (vconcat (when evil-this-operator + (where-is-internal evil-this-operator + evil-normal-state-map + t)) + prefix)))) From b5cfd3afc09c25d4ea7f7c1ebbaf51c816624d45 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 22 Jun 2018 12:07:35 +0200 Subject: [PATCH 2099/4235] minor refactor of bibtex module --- modules/lang/latex/config.el | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 265529304..d4f85fe0b 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -171,10 +171,7 @@ (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) (unless (string-empty-p +latex-bibtex-dir) (setq bibtex-completion-library-path (list +latex-bibtex-dir) - bibtex-completion-pdf-field "file" - bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir) - bibtex-completion-pdf-open-function - (lambda (fpath) (async-start-process "open-pdf" "/usr/bin/xdg-open" nil fpath)))) + bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir))) (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) @@ -194,12 +191,24 @@ (def-package! ivy-bibtex :when (featurep! :completion ivy) :commands ivy-bibtex - :config (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key)) + :config + (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key) + (unless (string-empty-p +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) + (unless (string-empty-p +latex-bibtex-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-dir) + bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)))) (def-package! helm-bibtex :when (featurep! :completion helm) - :commands helm-bibtex) + :commands helm-bibtex + :config + (unless (string-empty-p +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) + (unless (string-empty-p +latex-bibtex-dir) + (setq bibtex-completion-library-path (list +latex-bibtex-dir) + bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)))) (def-package! company-auctex From af4fd8266f3ab8a42fb8a882ae32f6355379f2c2 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 22 Jun 2018 12:22:03 +0200 Subject: [PATCH 2100/4235] removed redundant config from latex module --- modules/lang/latex/config.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index d4f85fe0b..9be62a148 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -167,11 +167,6 @@ (setq bibtex-dialect 'biblatex bibtex-align-at-equal-sign t bibtex-text-indentation 20) - (unless (string-empty-p +latex-bibtex-file) - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (string-empty-p +latex-bibtex-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-dir) - bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir))) (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) From 25bc9cfbafa4a127e97cf225729995f8fa949c8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 13:42:47 +0200 Subject: [PATCH 2101/4235] Fix +lookup/file in non-file-visiting buffers Throws a stringp error is buffer-file-name is nil. Reported by @myme --- modules/feature/lookup/autoload/lookup.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index de9216787..b69fbcce7 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -245,7 +245,7 @@ Otherwise, falls back on `find-file-at-point'." ((not (and +lookup-file-functions (+lookup--jump-to :file path))) (let ((fullpath (expand-file-name path))) - (when (file-equal-p fullpath buffer-file-name) + (when (and buffer-file-name (file-equal-p fullpath buffer-file-name)) (user-error "Already here")) (let* ((insert-default-directory t) (project-root (doom-project-root 'nocache)) From c99a02fa532a88a60a97a7c56e17b1d25520ccca Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 22 Jun 2018 13:46:56 +0200 Subject: [PATCH 2102/4235] added check for pandoc executable when +pandoc feature is enabled --- modules/lang/markdown/doctor.el | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 modules/lang/markdown/doctor.el diff --git a/modules/lang/markdown/doctor.el b/modules/lang/markdown/doctor.el new file mode 100644 index 000000000..8224429f9 --- /dev/null +++ b/modules/lang/markdown/doctor.el @@ -0,0 +1,6 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/markdown/doctor.el + +(when (featurep! +pandoc) + (unless (executable-find "pandoc") + (warn! "Couldn't find pandoc, markdown-mode may have issues")) From 5f5732b95b80550cc6df0c3ad1f36621bbfdbbe0 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 22 Jun 2018 13:47:28 +0200 Subject: [PATCH 2103/4235] added rudimentary support for markdown compilation via pandoc --- modules/lang/markdown/config.el | 10 ++++++++++ modules/lang/markdown/packages.el | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 74c8b5601..53b226708 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -3,6 +3,9 @@ (def-package! markdown-mode :mode ("/README\\(?:\\.\\(?:markdown\\|md\\)\\)?\\'" . gfm-mode) :init + (when (featurep! +pandoc) + (setq markdown-command "pandoc --from=markdown --to=html --standalone --mathjax --highlight-style=pygments")) + (setq markdown-enable-wiki-links t markdown-italic-underscore t markdown-asymmetric-header t @@ -47,3 +50,10 @@ :nv "t" #'markdown-toc-generate-toc :nv "i" #'markdown-insert-image :nv "l" #'markdown-insert-link))) + +(def-package! pandoc-mode + :when (featurep! +pandoc) + :commands + pandoc-mode + :hook + (markdown-mode . conditionally-turn-on-pandoc)) diff --git a/modules/lang/markdown/packages.el b/modules/lang/markdown/packages.el index 72eee45f7..bccae4844 100644 --- a/modules/lang/markdown/packages.el +++ b/modules/lang/markdown/packages.el @@ -4,3 +4,7 @@ (package! markdown-mode) (package! markdown-toc) +(when (featurep! +pandoc) + (package! pandoc-mode)) + + From 0bea00c1830f5e932cd0d7599cca1caa36ff990b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Jun 2018 19:17:15 +0200 Subject: [PATCH 2104/4235] Fix with-popup-rules! macro Mistreating its RULES argument, causing void-function errors. --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index b5b6bccd2..97a38f3cc 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -103,7 +103,7 @@ should match the arguments of `+popup-define' or the :popup setting." (declare (indent defun)) `(let ((+popup--display-buffer-alist +popup--old-display-buffer-alist) display-buffer-alist) - (set-popup-rules! ,@rules) + (set-popup-rules! ,rules) (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) ,@body)) From 34cd055670d59f03d9f12ca096c161c5495867a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 01:53:59 +0200 Subject: [PATCH 2105/4235] Autoload +pass/ivy --- modules/tools/password-store/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index 14b644ee8..53728c367 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -113,6 +113,7 @@ fields in `+pass-url-fields' is used to find the url field." ;; Ivy interface ;; +;;;###autoload (defun +pass/ivy (arg) "TODO" (interactive "P") From a53503eadbab00d30ca3651dabb639a406ff24b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 01:55:52 +0200 Subject: [PATCH 2106/4235] Fix +pass functions failing to locate pass entries They use `password-store-dir` to determine where password-store is, but that function isn't loaded in time for them to use it! --- modules/tools/password-store/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index 53728c367..856b984ce 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -64,6 +64,7 @@ search of your username. May prompt for your gpg passphrase." ;; Commands ;; +;;;###autoload (autoload 'password-store-dir "password-store") ;;;###autoload (autoload 'password-store-list "password-store") ;;;###autoload (autoload 'password-store--completing-read "password-store") From 162001146308443268647c2caaeff9dd88ff815e Mon Sep 17 00:00:00 2001 From: Mark Redeman Date: Sat, 23 Jun 2018 02:31:55 +0200 Subject: [PATCH 2107/4235] Add: keybinding to open irc --- modules/config/default/+bindings.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 901696b74..a3a7a4143 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -667,6 +667,9 @@ :desc "Eshell" :n "e" #'+eshell/open :desc "Eshell in popup" :n "E" #'+eshell/open-popup + (:when (featurep! :app irc) + :desc "IRC" :n "I" #'=irc) + (:when (featurep! :collab floobits) :desc "floobits" :prefix "f" :n "c" #'floobits-clear-highlights From 7a6407eb92302f95e9cb2bc0cef035fc4b390d68 Mon Sep 17 00:00:00 2001 From: Mark Redeman Date: Sat, 23 Jun 2018 14:44:40 +0200 Subject: [PATCH 2108/4235] Add: reasonable default keybindings for circe The =+irc/send-message= function was added so that we can send private messages using =SPC m m= or =M-x= with =+irc/send-message=. --- modules/app/irc/autoload/irc.el | 6 ++++++ modules/app/irc/config.el | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/app/irc/autoload/irc.el b/modules/app/irc/autoload/irc.el index 1e1f01210..a630fb61d 100644 --- a/modules/app/irc/autoload/irc.el +++ b/modules/app/irc/autoload/irc.el @@ -36,6 +36,12 @@ workspace for it." (and (+irc-setup-wconf inhibit-workspace) (call-interactively #'circe))) +;;;###autoload +(defun +irc/send-message (who what) + "Send WHO a message containing WHAT." + (interactive "sWho: \nsWhat: ") + (circe-command-MSG who what)) + ;;;###autoload (defun +irc/quit () "Kill current circe session and workgroup." diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index a32ecf355..f6d9b982e 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -125,7 +125,23 @@ playback.") (after! solaire-mode ;; distinguish chat/channel buffers from server buffers. - (add-hook 'circe-chat-mode-hook #'solaire-mode))) + (add-hook 'circe-chat-mode-hook #'solaire-mode)) + + (map! + (:localleader + (:map circe-mode-map + :desc "Next active buffer" :n "a" #'tracking-next-buffer + :desc "Join channel" :n "j" #'circe-command-JOIN + :desc "Send private message" :n "m" #'+irc/send-message + :desc "Part current channel" :n "p" #'circe-command-PART + :desc "Quit irc" :n "Q" #'+irc/quit + :desc "Reconnect" :n "R" #'circe-reconnect + + (:when (featurep! :completion ivy) + :desc "Jump to channel" :n "c" #'+irc/ivy-jump-to-channel)) + + (:map circe-channel-mode-map + :desc "Show names" :n "n" #'circe-command-NAMES))) (def-package! circe-color-nicks From e8834710c2c9c4fa803a1b5f4d6bccf3345463e5 Mon Sep 17 00:00:00 2001 From: Mark Redeman Date: Sat, 23 Jun 2018 15:28:27 +0200 Subject: [PATCH 2109/4235] Docs: improve irc documentation Explain how `+pass-user-fields` works and show a basic example for configuring a pass entry to be used by circe. Show how to connect to IRC and show a list of commands that can be used in circe buffers. --- modules/app/irc/README.org | 40 ++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/modules/app/irc/README.org b/modules/app/irc/README.org index caf043a6d..b06d136fc 100644 --- a/modules/app/irc/README.org +++ b/modules/app/irc/README.org @@ -3,10 +3,12 @@ This module turns adds an IRC client to Emacs ([[https://github.com/jorgenschaefer/circe][~circe~)]] with native notifications ([[https://github.com/eqyiel/circe-notifications][circe-notifications]]). * Table of Contents :TOC: -- [[#dependencies][Dependencies]] -- [[#configure][Configure]] - - [[#pass-the-unix-password-manager][Pass: the unix password manager]] - - [[#emacs-auth-source-api][Emacs' auth-source API]] +- [[Dependencies][Dependencies]] +- [[Configure][Configure]] + - [[Pass: the unix password manager][Pass: the unix password manager]] + - [[Emacs' auth-source API][Emacs' auth-source API]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] * Dependencies This module has no dependencies, besides =gnutls-cli= or =openssl= for secure connections. @@ -52,6 +54,15 @@ But wait, there's more! This stores your password in a public variable which cou And you're good to go! +Note that =+pass-get-user= tries to find your username by looking for the fields +listed in =+pass-user-fields= (by default =login=, =user==, =username== and =email=)=). +An example configuration looks like + +#+BEGIN_SRC txt :tangle no +mysecretpassword +username: myusername +#+END_SRC + ** Emacs' auth-source API ~auth-source~ is built into Emacs. As suggested [[https://github.com/jorgenschaefer/circe/wiki/Configuration#safer-password-management][in the circe wiki]], you can store (and retrieve) encrypted passwords with it. @@ -78,3 +89,24 @@ And you're good to go! :channels ("#emacs"))) #+END_SRC +* Appendix +** Commands +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 | description | +|---------+-----------+-------------------------------------------| +| ~=irc~ | =SPC o I= | Connect to IRC and all configured servers | + +When in a circe buffer these keybindings will be available. + +| command | key | description | +|------------------------+-----------+----------------------------------------------| +| ~tracking-next-buffer~ | =SPC m a= | Switch to the next active buffer | +| ~circe-command-JOIN~ | =SPC m j= | Join a channel | +| ~+irc/send-message~ | =SPC m m= | Send a private message | +| ~circe-command-NAMES~ | =SPC m n= | List the names of the current channel | +| ~circe-command-PART~ | =SPC m p= | Part the current channel | +| ~+irc/quit~ | =SPC m Q= | Kill the current circe session and workgroup | +| ~circe-reconnect~ | =SPC m R= | Reconnect the current server | From 7627b04f1828ab0f16c7ed6281482f37d6e6c960 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sat, 23 Jun 2018 15:59:03 +0200 Subject: [PATCH 2110/4235] Refactored dante feature. --- modules/lang/haskell/+dante.el | 15 +++------------ modules/lang/haskell/doctor.el | 5 ++--- modules/lang/haskell/packages.el | 4 +--- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index e3687fd2b..2eb5645f5 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,17 +2,8 @@ ;;;###if (featurep! +dante) (def-package! dante - :after haskell-mode :hook (haskell-mode . dante-mode) :config - (add-hook 'haskell-mode-hook #'interactive-haskell-mode)) - - -(def-package! company-ghc - :when (featurep! :completion company) - :after haskell-mode - :init - (add-hook 'haskell-mode-hook #'ghc-comp-init) - :config - (setq company-ghc-show-info 'oneline) - (set-company-backend! 'haskell-mode #'company-ghc)) + (when (featurep! :feature syntax-checker) + (add-hook! 'dante-mode-hook + (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))))) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index f803ea3d2..b62d40aa1 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -4,9 +4,8 @@ (when (featurep! +dante) (unless (executable-find "cabal") (warn! "Couldn't find cabal, haskell-mode may have issues")) - - (unless (executable-find "ghc-mod") - (warn! "Couldn't find ghc-mod on PATH. Code completion will not work"))) + (unless (executable-find "hlint") + (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode/"))) (when (featurep! +intero) (unless (executable-find "stack") diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index 2b637c3f8..541ed0bcd 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -5,9 +5,7 @@ ;; (cond ((featurep! +dante) - (package! dante) - (when (featurep! :completion company) - (package! company-ghc))) + (package! dante)) (t (package! intero) (package! hindent))) From 61cdac230f66231844119d385458bf1588c34e1c Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Sat, 23 Jun 2018 16:25:58 +0200 Subject: [PATCH 2111/4235] ui/vc emacs/vc: unify hydra design this design will also break less based on the fonts --- modules/emacs/vc/config.el | 10 +++++----- modules/ui/vc-gutter/config.el | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 7558f4be4..5100cbea4 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -72,15 +72,15 @@ ;; no merge conflicts remain. :post (smerge-auto-leave)) " - ╭────────┐ - Movement Keep Diff Other │ smerge │ - ╭─────────────────────────────────────────────────┴────────╯ + [smerge] + Movement Keep Diff Other + ╭─────────────────────────────────────────────────────────╯ ^_g_^ [_b_] base [_<_] upper/base [_C_] Combine ^_C-k_^ [_u_] upper [_=_] upper/lower [_r_] resolve ^_k_ ↑^ [_l_] lower [_>_] base/lower [_R_] remove ^_j_ ↓^ [_a_] all [_H_] hightlight - ^_C-j_^ [_RET_] current [_E_] ediff ╭────────── - ^_G_^ │ [_q_] quit" + ^_C-j_^ [_RET_] current [_E_] ediff ╭────────── + ^_G_^ │ [_q_] quit" ("g" (progn (goto-char (point-min)) (smerge-next))) ("G" (progn (goto-char (point-max)) (smerge-prev))) ("C-j" smerge-next) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index 5c8417ead..e13239d43 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -54,15 +54,15 @@ to the right fringe.") (defhydra +version-control@git-gutter (:body-pre (git-gutter-mode 1) :hint nil) " - ╭─────────────────┐ - Movement Hunk Actions Misc. │ gg: +%-4s(car (git-gutter:statistic))/ -%-3s(cdr (git-gutter:statistic)) │ - ╭──────────────────────────────────┴─────────────────╯ + [git gutter] + Movement Hunk Actions Misc. +%-4s(car (git-gutter:statistic))/ -%-4s(cdr (git-gutter:statistic)) + ╭──────────────────────────────────┴────────────────╯ ^_g_^ [_s_] stage [_R_] set start Rev ^_k_^ [_r_] revert ^↑ ^ [_m_] mark - ^↓ ^ [_p_] popup ╭────────────────────── - ^_j_^ │[_q_] quit - ^_G_^ │[_Q_] Quit and disable" + ^↓ ^ [_p_] popup ╭───────────────────── + ^_j_^ │[_q_] quit + ^_G_^ │[_Q_] Quit and disable" ("j" (progn (git-gutter:next-hunk 1) (recenter))) ("k" (progn (git-gutter:previous-hunk 1) (recenter))) ("g" (progn (goto-char (point-min)) (git-gutter:next-hunk 1))) From 258961979344c1acedac76d90532d631b5d3b8c5 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sat, 23 Jun 2018 17:51:22 +0200 Subject: [PATCH 2112/4235] simplified hook --- modules/lang/haskell/+dante.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 2eb5645f5..2acc87ecc 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,7 +2,7 @@ ;;;###if (featurep! +dante) (def-package! dante - :hook (haskell-mode . dante-mode) + :hook haskell-mode :config (when (featurep! :feature syntax-checker) (add-hook! 'dante-mode-hook From 7b0d57a74502e144cff52e9d2ae62fb38b961832 Mon Sep 17 00:00:00 2001 From: Benjamin Andresen Date: Sat, 23 Jun 2018 18:44:50 +0200 Subject: [PATCH 2113/4235] Cut: lang/clojure: unneeded + subjective parts str => clojure.string is already defined in `cljr-magic-require-namespaces' re-frame + reagent is subjective (for personal configuration) fighweel aspect is now handled upstream by giving a prompt see: `cider-cljs-repl-types' --- modules/lang/clojure/config.el | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index e0c3b3767..5f33f3f96 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -5,14 +5,7 @@ (def-package! clj-refactor - :after clojure-mode - :config - ;; setup some extra namespace auto completion for great awesome - (dolist (ns '(("re-frame" . "re-frame.core") - ("reagent" . "reagent.core") - ("str" . "clojure.string"))) - (map-put cljr-magic-require-namespaces (car ns) (cdr ns)))) - + :after clojure-mode) (def-package! cider ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider @@ -23,13 +16,7 @@ (setq nrepl-hide-special-buffers t cider-stacktrace-default-filters '(tooling dup) cider-prompt-save-file-on-load nil - cider-repl-use-clojure-font-lock t - ;; Setup cider for clojurescript / figwheel dev. - cider-cljs-lein-repl - "(do (require 'figwheel-sidecar.repl-api) - (figwheel-sidecar.repl-api/start-figwheel!) - (figwheel-sidecar.repl-api/cljs-repl))") - + cider-repl-use-clojure-font-lock t) (set-popup-rule! "^\\*cider-repl" :quit nil :select nil) (set-repl-handler! 'clojure-mode #'+clojure/repl) (set-eval-handler! 'clojure-mode #'cider-eval-region) From f6dc6ac74e6361751e7111e3e7124b40b83eba87 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 16:48:58 +0200 Subject: [PATCH 2114/4235] Refactor out map.el usage After some profiling, it turns out map-put and map-delete are 5-7x slower (more on Emacs 25) than delq, setf/alist-get and add-to-list for small lists (under 250 items), which is exactly how I've been using them. The only caveat is alist-get's signature is different on Emacs 25, thus a polyfill is necessary in core-lib. --- core/autoload/cache.el | 17 +++--- core/autoload/packages.el | 17 +++--- core/core-cli.el | 8 +-- core/core-lib.el | 21 ++++++-- core/core-modules.el | 24 +++++---- core/core-packages.el | 4 +- core/core-ui.el | 16 +++--- modules/app/email/+gmail.el | 23 +++++---- modules/completion/helm/config.el | 2 +- modules/completion/ivy/config.el | 24 ++++----- modules/emacs/eshell/autoload/settings.el | 3 +- modules/feature/evil/config.el | 15 +++--- modules/feature/file-templates/autoload.el | 4 +- modules/feature/lookup/autoload/devdocs.el | 2 +- modules/feature/lookup/autoload/lookup.el | 6 ++- modules/feature/workspaces/config.el | 7 ++- modules/lang/assembly/autoload.el | 2 +- modules/lang/cc/config.el | 60 +++++++++++----------- modules/lang/csharp/config.el | 3 +- modules/lang/data/config.el | 8 +-- modules/lang/erlang/config.el | 2 +- modules/lang/ess/config.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/latex/config.el | 23 ++++----- modules/lang/org/+babel.el | 2 +- modules/lang/org/config.el | 2 +- modules/lang/sh/config.el | 6 +-- modules/tools/editorconfig/config.el | 14 ++--- modules/ui/popup/config.el | 4 +- 29 files changed, 177 insertions(+), 146 deletions(-) diff --git a/core/autoload/cache.el b/core/autoload/cache.el index 1093bf9ce..bf1c46bd5 100644 --- a/core/autoload/cache.el +++ b/core/autoload/cache.el @@ -12,7 +12,7 @@ ;; Like persistent-soft, caches assume a 2-tier structure, where all caches are ;; namespaced by location. -(defvar doom-cache-alists () +(defvar doom-cache-alists '(t) "An alist of alists, containing lists of variables for the doom cache library to persist across Emacs sessions.") @@ -24,7 +24,7 @@ name under `pcache-directory' (by default a subdirectory under (defun doom|save-persistent-cache () "Hook to run when an Emacs session is killed. Saves all persisted variables listed in `doom-cache-alists' to files." - (dolist (alist doom-cache-alists) + (dolist (alist (butlast doom-cache-alists 1)) (cl-loop with key = (car alist) for var in (cdr alist) if (symbol-value var) @@ -54,8 +54,8 @@ Warning: this is incompatible with buffer-local variables." (dolist (var variables) (when (doom-cache-exists var location) (set var (doom-cache-get var location)))) - (map-put doom-cache-alists location - (append variables (cdr (assq location doom-cache-alists))))) + (setf (alist-get location doom-cache-alists) + (append variables (cdr (assq location doom-cache-alists))))) ;;;###autoload (defun doom-cache-desist (location &optional variables) @@ -63,10 +63,11 @@ Warning: this is incompatible with buffer-local variables." `doom-cache-alists', thus preventing them from being saved between sessions. Does not affect the actual variables themselves or their values." (if variables - (map-put doom-cache-alists location - (cl-set-difference (cdr (assq location doom-cache-alists)) - variables)) - (map-delete doom-cache-alists location))) + (setf (alist-get location doom-cache-alists) + (cl-set-difference (cdr (assq location doom-cache-alists)) + variables)) + (delq (assq location doom-cache-alists) + doom-cache-alists))) ;;;###autoload (defun doom-cache-get (key &optional location) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 21c0f8269..8e4c868b7 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -345,7 +345,7 @@ example; the package name can be omitted)." (package-install name)) (if (not (package-installed-p name)) (doom--delete-package-files name) - (map-put doom-packages name plist) + (setf (alist-get name alist) plist) name))) ;;;###autoload @@ -388,9 +388,10 @@ package.el as appropriate." (unless (package-installed-p name) (user-error "%s isn't installed" name)) (let ((inhibit-message (not doom-debug-mode)) + (spec (assq name quelpa-cache)) quelpa-p) - (when (assq name quelpa-cache) - (setq quelpa-cache (map-delete quelpa-cache name)) + (when spec + (setq quelpa-cache (delq spec quelpa-cache)) (quelpa-save-cache) (setq quelpa-p t)) (package-delete (cadr (assq name package-alist)) force-p) @@ -439,11 +440,11 @@ calls." "Update `quelpa-cache' upon a successful `package-delete'." (doom-initialize-packages) (let ((name (package-desc-name desc))) - (when (and (not (package-installed-p name)) - (assq name quelpa-cache)) - (setq quelpa-cache (map-delete quelpa-cache name)) - (quelpa-save-cache) - (doom--delete-package-files name)))) + (unless (package-installed-p name) + (when-let* ((spec (assq name quelpa-cache))) + (setq quelpa-cache (delq spec quelpa-cache)) + (quelpa-save-cache) + (doom--delete-package-files name))))) ;; diff --git a/core/core-cli.el b/core/core-cli.el index c57944a37..d1d59dbe2 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -78,10 +78,10 @@ BODY will be run when this dispatcher is called." (append (when aliases `((dolist (alias ',aliases) - (map-put doom--dispatch-alias-alist alias ',cmd)))) - `((map-put doom--dispatch-command-alist ',cmd - (list :desc ,docstring - :body (lambda (args) ,form)))))))) + (setf (alist-get alias doom--dispatch-alias-alist) ',cmd)))) + `((setf (alist-get ',cmd doom--dispatch-command-alist) + (list :desc ,docstring + :body (lambda (args) ,form)))))))) ;; diff --git a/core/core-lib.el b/core/core-lib.el index 3ea39d001..35e09fa9b 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -3,7 +3,6 @@ ;; Built in packages we use a lot of (require 'subr-x) (require 'cl-lib) -(require 'map) (eval-and-compile (unless EMACS26+ @@ -11,7 +10,23 @@ ;; if-let and when-let are deprecated in Emacs 26+ in favor of their ;; if-let* variants, so we alias them for 25 users. (defalias 'if-let* #'if-let) - (defalias 'when-let* #'when-let)))) + (defalias 'when-let* #'when-let) + + ;; `alist-get' doesn't have its 5th argument before Emacs 26 + (defun doom*alist-get (key alist &optional default remove testfn) + "Return the value associated with KEY in ALIST. +If KEY is not found in ALIST, return DEFAULT. +Use TESTFN to lookup in the alist if non-nil. Otherwise, use `assq'. + +This is a generalized variable suitable for use with `setf'. +When using it to set a value, optional argument REMOVE non-nil +means to remove KEY from ALIST if the new value is `eql' to DEFAULT." + (ignore remove) ;;Silence byte-compiler. + (let ((x (if (not testfn) + (assq key alist) + (assoc key alist testfn)))) + (if x (cdr x) default))) + (advice-add #'alist-get :override #'doom*alist-get)))) ;; @@ -402,7 +417,7 @@ The available conditions are: collect `(add-hook ',hook #',hook-name)) `((add-hook 'after-change-major-mode-hook #',hook-name)))))) (match - `(map-put doom-auto-minor-mode-alist ,match ',mode)) + `(add-to-list 'doom-auto-minor-mode-alist '(,match . ,mode))) ((user-error "Invalid `associate!' rules for mode [%s] (:modes %s :match %s :files %s :when %s)" mode modes match files when))))) diff --git a/core/core-modules.el b/core/core-modules.el index 7a9f2e0ec..c320b0216 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -35,8 +35,6 @@ A warning will be put out if these deprecated modules are used.") session of Dooming. Will noop if used more than once, unless FORCE-P is non-nil." (when (or force-p (not doom-init-modules-p)) - ;; Set `doom-init-modules-p' early, so `doom-pre-init-hook' won't infinitely - ;; recurse by accident if any of them need `doom-initialize-modules'. (setq doom-init-modules-p t) (when doom-private-dir (condition-case e @@ -184,7 +182,7 @@ non-nil, return paths of possible modules, activated or otherwise." ;; ;; This will load X on the first invokation of `find-file-hook' (then it will ;; remove itself from the hook/function). -(defvar doom--deferred-packages-alist ()) +(defvar doom--deferred-packages-alist '(t)) (after! use-package-core (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) (setq use-package-keywords @@ -208,15 +206,19 @@ non-nil, return paths of possible modules, activated or otherwise." (if (functionp hook) (advice-remove hook #',fn) (remove-hook hook #',fn))) - (map-delete doom--deferred-packages-alist ',name) + (delq (assq ',name doom--deferred-packages-alist) + doom--deferred-packages-alist) (fmakunbound ',fn)))) - (cl-loop for hook in hooks - collect (if (functionp hook) - `(advice-add #',hook :before #',fn) - `(add-hook ',hook #',fn))) - `((map-put doom--deferred-packages-alist - ',name - '(,@hooks ,@(cdr (assq name doom--deferred-packages-alist))))) + (let (forms) + (dolist (hook hooks forms) + (push (if (functionp hook) + `(advice-add #',hook :before #',fn) + `(add-hook ',hook #',fn)) + forms))) + `((unless (assq ',name doom--deferred-packages-alist) + (push '(,name) doom--deferred-packages-alist)) + (nconc (assq ',name doom--deferred-packages-alist) + '(,@hooks))) (use-package-process-keywords name rest state)))))) diff --git a/core/core-packages.el b/core/core-packages.el index 459f7e308..e256729cb 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -222,8 +222,8 @@ elsewhere." doom-private-dir) (setq plist (plist-put plist :private t))) `(progn - ,(if pkg-pin `(map-put package-pinned-packages ',name ,pkg-pin)) - (map-put doom-packages ',name ',plist) + ,(if pkg-pin `(setf (alist-get ',name package-pinned-packages) ,pkg-pin)) + (setf (alist-get ',name doom-packages) ',plist) (not (memq ',name doom-disabled-packages))))) (defmacro packages! (&rest packages) diff --git a/core/core-ui.el b/core/core-ui.el index 2d8d8821d..5da96c06e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -67,7 +67,9 @@ Also see `doom-before-switch-buffer-hook'.") enable-recursive-minibuffers nil frame-inhibit-implied-resize t ;; remove continuation arrow on right fringe - fringe-indicator-alist (map-delete fringe-indicator-alist 'continuation) + fringe-indicator-alist + (delq (assq 'continuation fringe-indicator-alist) + fringe-indicator-alist) highlight-nonselected-windows nil image-animate-loop t indicate-buffer-boundaries nil @@ -126,13 +128,13 @@ Also see `doom-before-switch-buffer-hook'.") (format "%s modeline segment" name)))) (cond ((and (symbolp (car body)) (not (cdr body))) - (map-put doom--modeline-var-alist name (car body)) - `(map-put doom--modeline-var-alist ',name ',(car body))) + (add-to-list 'doom--modeline-var-alist (cons name (car body))) + `(add-to-list 'doom--modeline-var-alist (cons ',name ',(car body)))) (t - (map-put doom--modeline-fn-alist name sym) + (add-to-list 'doom--modeline-fn-alist (cons name sym)) `(progn (fset ',sym (lambda () ,docstring ,@body)) - (map-put doom--modeline-fn-alist ',name ',sym) + (add-to-list 'doom--modeline-fn-alist (cons ',name ',sym)) ,(unless (bound-and-true-p byte-compile-current-file) `(let (byte-compile-warnings) (byte-compile #',sym)))))))) @@ -549,7 +551,7 @@ frame's window-system, the theme will be reloaded.") (custom-set-faces (when (fontp doom-font) (let ((xlfd (font-xlfd-name doom-font))) - (map-put default-frame-alist 'font xlfd) + (add-to-list 'default-frame-alist (cons 'font xlfd)) `(fixed-pitch ((t (:font ,xlfd)))))) (when (fontp doom-variable-pitch-font) `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font)))))) @@ -712,7 +714,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. - (map-put default-frame-alist 'buffer-predicate #'doom-buffer-frame-predicate) + (add-to-list 'default-frame-alist (cons 'buffer-predicate #'doom-buffer-frame-predicate)) ;; Switch to `doom-fallback-buffer' if on last real buffer (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) ;; Don't kill the fallback buffer diff --git a/modules/app/email/+gmail.el b/modules/app/email/+gmail.el index 9d647b206..3f44d8cd7 100644 --- a/modules/app/email/+gmail.el +++ b/modules/app/email/+gmail.el @@ -12,17 +12,18 @@ (defun +email--mark-seen (docid msg target) (mu4e~proc-move docid (mu4e~mark-check-target target) "+S-u-N")) - (map-delete mu4e-marks 'delete) - (map-put mu4e-marks 'trash - (list :char '("d" . "▼") - :prompt "dtrash" - :dyn-target (lambda (_target msg) (mu4e-get-trash-folder msg)) - :action #'+email--mark-seen)) - ;; Refile will be my "archive" function. - (map-put mu4e-marks 'refile - (list :char '("r" . "▶") :prompt "refile" - :show-target (lambda (_target) "archive") - :action #'+email--mark-seen)) + (delq (assq 'delete mu4e-marks) mu4e-marks) + (setf (alist-get 'trash mu4e-marks) + (list :char '("d" . "▼") + :prompt "dtrash" + :dyn-target (lambda (_target msg) (mu4e-get-trash-folder msg)) + :action #'+email--mark-seen) + ;; Refile will be my "archive" function. + (alist-get 'refile mu4e-marks) + (list :char '("d" . "▼") + :prompt "dtrash" + :dyn-target (lambda (_target msg) (mu4e-get-trash-folder msg)) + :action #'+email--mark-seen)) ;; This hook correctly modifies gmail flags on emails when they are marked. ;; Without it, refiling (archiving), trashing, and flagging (starring) email diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 19dd7b65f..e4a36f758 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -28,7 +28,7 @@ :config (helm-mode +1) ;; helm is too heavy for find-file-at-point - (map-put helm-completing-read-handlers-alist 'find-file-at-point nil)) + (add-to-list 'helm-completing-read-handlers-alist (cons #'find-file-at-point nil))) (def-package! helm diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 36b7a550a..b837fc80d 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -191,21 +191,21 @@ immediately runs it on the current candidate (ending the ivy session)." (internal-border-width . 10))) ;; ... let's do it manually - (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left - 'ivy-posframe-display-at-frame-center - 'ivy-posframe-display-at-point - 'ivy-posframe-display-at-frame-bottom-window-center - 'ivy-posframe-display - 'ivy-posframe-display-at-window-bottom-left - 'ivy-posframe-display-at-window-center - '+ivy-display-at-frame-center-near-bottom)) - (map-put ivy-display-functions-props fn '(:cleanup ivy-posframe-cleanup))) - - (map-put ivy-display-functions-alist 't '+ivy-display-at-frame-center-near-bottom) + (unless (assq 'ivy-posframe-display-at-frame-bottom-left ivy-display-functions-props) + (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left + 'ivy-posframe-display-at-frame-center + 'ivy-posframe-display-at-point + 'ivy-posframe-display-at-frame-bottom-window-center + 'ivy-posframe-display + 'ivy-posframe-display-at-window-bottom-left + 'ivy-posframe-display-at-window-center + '+ivy-display-at-frame-center-near-bottom)) + (push (cons fn '(:cleanup ivy-posframe-cleanup)) ivy-display-functions-props)) + (push '(t . +ivy-display-at-frame-center-near-bottom) ivy-display-functions-props)) ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) - (map-put ivy-display-functions-alist fn nil))) + (setf (alist-get fn ivy-display-functions-alist) nil))) (def-package! flx diff --git a/modules/emacs/eshell/autoload/settings.el b/modules/emacs/eshell/autoload/settings.el index 1bec69ce6..5b1ad3b2f 100644 --- a/modules/emacs/eshell/autoload/settings.el +++ b/modules/emacs/eshell/autoload/settings.el @@ -7,7 +7,8 @@ (signal 'wrong-number-of-arguments (list 'even (length aliases)))) (after! eshell (while aliases - (map-put +eshell-aliases (pop aliases) (list (pop aliases)))) + (setf (alist-get (pop aliases) +eshell-aliases nil nil #'equal) + (pop aliases))) (when (boundp 'eshell-command-aliases-list) (if +eshell--default-aliases (setq eshell-command-aliases-list diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 9b187cd2b..e0dba46f5 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -231,12 +231,12 @@ variable for an explanation of the defaults (in comments). See (cons (format "(%s " (or (read-string "(") "")) ")")) ;; Add escaped-sequence support to embrace - (map-put (default-value 'embrace--pairs-list) - ?\\ (make-embrace-pair-struct - :key ?\\ - :read-function #'+evil--embrace-escaped - :left-regexp "\\[[{(]" - :right-regexp "\\[]})]"))) + (setf (alist-get ?\\ (default-value 'embrace--pairs-list)) + (make-embrace-pair-struct + :key ?\\ + :read-function #'+evil--embrace-escaped + :left-regexp "\\[[{(]" + :right-regexp "\\[]})]"))) (def-package! evil-escape @@ -332,8 +332,7 @@ the new algorithm is confusing, like in python or ruby." ;; Add custom commands to whitelisted commands (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol doom/backward-kill-to-bol-and-indent)) - (map-put evil-mc-custom-known-commands - fn '((:default . evil-mc-execute-default-call)))) + (add-to-list 'evil-mc-custom-known-commands `(,fn (:default . evil-mc-execute-default-call)))) ;; Activate evil-mc cursors upon switching to insert mode (defun +evil-mc|resume-cursors () (setq evil-mc-frozen nil)) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index be789d92d..ce4976584 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -2,7 +2,9 @@ (defun +file-templates--set (pred plist) (if (null (car-safe plist)) - (setq +file-templates-alist (map-delete +file-templates-alist pred)) + (setq +file-templates-alist + (delq (assoc pred +file-templates-alist) + +file-templates-alist)) (push `(,pred ,@plist) +file-templates-alist))) ;;;###autodef diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el index 3558b4cbd..6a046c648 100644 --- a/modules/feature/lookup/autoload/devdocs.el +++ b/modules/feature/lookup/autoload/devdocs.el @@ -9,7 +9,7 @@ DOCSET (a string). See `devdocs-alist' for the defaults. " (after! (:when (boundp 'devdocs-alist)) (dolist (mode (doom-enlist modes)) - (map-put devdocs-alist mode docset)))) + (setf (alist-get mode devdocs-alist) docset)))) ;;;###autoload (def-setting! :devdocs (modes docset) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index b69fbcce7..da7216698 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -72,7 +72,7 @@ properties: "Search on: " (mapcar #'car +lookup-provider-url-alist) nil t))) - (map-put +lookup--last-provider key provider) + (setf (alist-get +lookup--last-provider key) provider) provider)))) (defun +lookup--symbol-or-region (&optional initial) @@ -318,7 +318,9 @@ for the provider." (user-error "The search query is empty")) (funcall +lookup-open-url-fn (format url (url-encode-url search)))) (error - (map-delete +lookup--last-provider major-mode) + (setq +lookup--last-provider + (delq (assq major-mode +lookup--last-provider) + +lookup--last-provider)) (signal (car e) (cdr e))))) ;;;###autoload diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index bc225158a..cc3e1e227 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -30,7 +30,8 @@ stored in `persp-save-dir'.") ;; particularly useful for the `+workspace/restart-emacs-then-restore' command. (defun +workspaces-restore-last-session (&rest _) (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) -(map-put command-switch-alist "--restore" #'+workspaces-restore-last-session) +(add-to-list 'command-switch-alist (cons "--restore" #'+workspaces-restore-last-session)) + ;; ;; Plugins @@ -41,7 +42,9 @@ stored in `persp-save-dir'.") :init (defun +workspaces|init () ;; Remove default buffer predicate so persp-mode can put in its own - (setq default-frame-alist (map-delete default-frame-alist 'buffer-predicate)) + (setq default-frame-alist + (delq (assq 'buffer-predicate default-frame-alist) + default-frame-alist)) (add-hook 'after-make-frame-functions #'+workspaces|init-frame) (require 'persp-mode) (unless (daemonp) diff --git a/modules/lang/assembly/autoload.el b/modules/lang/assembly/autoload.el index 38b582a66..29e8ded24 100644 --- a/modules/lang/assembly/autoload.el +++ b/modules/lang/assembly/autoload.el @@ -1,4 +1,4 @@ ;;; lang/assembly/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(map-put auto-mode-alist "\\.hax\\'" 'haxor-mode) +(add-to-list 'auto-mode-alist '("\\.hax\\'" . haxor-mode)) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index e05acbec6..6c5d6d7d9 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -83,35 +83,37 @@ compilation database is present in the project.") +cc|fontify-constants)) ;; Custom style, based off of linux - (map-put c-style-alist "doom" - `((c-basic-offset . ,tab-width) - (c-comment-only-line-offset . 0) - (c-hanging-braces-alist (brace-list-open) - (brace-entry-open) - (substatement-open after) - (block-close . c-snug-do-while) - (arglist-cont-nonempty)) - (c-cleanup-list brace-else-brace) - (c-offsets-alist - (statement-block-intro . +) - (knr-argdecl-intro . 0) - (substatement-open . 0) - (substatement-label . 0) - (statement-cont . +) - (case-label . +) - ;; align args with open brace OR don't indent at all (if open - ;; brace is at eolp and close brace is after arg with no trailing - ;; comma) - (arglist-intro . +) - (arglist-close +cc-lineup-arglist-close 0) - ;; don't over-indent lambda blocks - (inline-open . 0) - (inlambda . 0) - ;; indent access keywords +1 level, and properties beneath them - ;; another level - (access-label . -) - (inclass +cc-c++-lineup-inclass +) - (label . 0)))) + (unless (assoc "doom" c-style-alist) + (push '("doom" + (c-basic-offset . ,tab-width) + (c-comment-only-line-offset . 0) + (c-hanging-braces-alist (brace-list-open) + (brace-entry-open) + (substatement-open after) + (block-close . c-snug-do-while) + (arglist-cont-nonempty)) + (c-cleanup-list brace-else-brace) + (c-offsets-alist + (statement-block-intro . +) + (knr-argdecl-intro . 0) + (substatement-open . 0) + (substatement-label . 0) + (statement-cont . +) + (case-label . +) + ;; align args with open brace OR don't indent at all (if open + ;; brace is at eolp and close brace is after arg with no trailing + ;; comma) + (arglist-intro . +) + (arglist-close +cc-lineup-arglist-close 0) + ;; don't over-indent lambda blocks + (inline-open . 0) + (inlambda . 0) + ;; indent access keywords +1 level, and properties beneath them + ;; another level + (access-label . -) + (inclass +cc-c++-lineup-inclass +) + (label . 0))) + c-style-alist)) ;;; Keybindings ;; Disable electric keys because it interferes with smartparens and custom diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 760db1493..f8927b350 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,6 +1,7 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- -(map-put auto-mode-alist '"\\.shader$" 'dshader-mode) ; unity shaders +;; unity shaders +(add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) (def-package! omnisharp diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 9786197f2..cc3e79889 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -1,10 +1,10 @@ ;;; lang/data/config.el -*- lexical-binding: t; -*- ;; Built in plugins -(dolist (spec '(("/sxhkdrc\\'" . conf-mode) - ("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) - ("\\.plist\\'" . nxml-mode))) - (map-put auto-mode-alist (car spec) (cdr spec))) +(unless after-init-time + (push '("/sxhkdrc\\'" . conf-mode) auto-mode-alist) + (push '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) auto-mode-alist) + (push '("\\.plist\\'" . nxml-mode) auto-mode-alist)) (after! nxml-mode (set-company-backend! 'nxml-mode '(company-nxml company-yasnippet))) diff --git a/modules/lang/erlang/config.el b/modules/lang/erlang/config.el index 933c455f4..1f4a062b8 100644 --- a/modules/lang/erlang/config.el +++ b/modules/lang/erlang/config.el @@ -5,7 +5,7 @@ "/rebar\\.config\\(?:\\.script\\)?$" ;; erlang configs "/\\(?:app\\|sys\\)\\.config$")) - (map-put auto-mode-alist regexp 'erlang-mode)) + (add-to-list 'auto-mode-alist (cons regexp 'erlang-mode))) (def-package! flycheck-rebar3 diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index f3e78ccc1..f3ee2b564 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -31,7 +31,7 @@ ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) :init (unless (featurep! :lang julia) - (map-put auto-mode-alist "\\.jl\'" 'ess-julia-mode)) + (add-to-list 'auto-mode-alist '("\\.jl\\'" . ess-julia-mode))) :config (add-hook 'ess-mode-hook #'doom|enable-line-numbers) (setq ess-offset-continued 'straight diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index eda3a2268..1ea7896d5 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -66,7 +66,7 @@ magic-mode-regexp-match-limit t) (progn (goto-char (match-beginning 1)) (not (sp-point-in-string-or-comment))))) - (map-put magic-mode-alist #'+javascript-jsx-file-p 'rjsx-mode) + (add-to-list 'magic-mode-alist '(+javascript-jsx-file-p . rjsx-mode)) :config (set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (add-hook! 'rjsx-mode-hook diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 265529304..6030884dc 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -75,33 +75,30 @@ (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") ;; Set a custom item indentation (dolist (env '("itemize" "enumerate" "description")) - (map-put LaTeX-indent-environment-list - env '(+latex/LaTeX-indent-item))) + (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item))) ;; ;; Use Okular if the user says so. (when (featurep! +okular) ;; Configure Okular as viewer. Including a bug fix ;; (https://bugs.kde.org/show_bug.cgi?id=373855) - (map-put TeX-view-program-list - "Okular" '(("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) - (map-put TeX-view-program-list 'output-pdf '("Okular"))) + (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) + (add-to-list 'TeX-view-program-selection '(output-pdf "Okular"))) ;; Or Skim (when (featurep! +skim) - (map-put TeX-view-program-list - "Skim" '("/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) - (map-put TeX-view-program-selection 'output-pdf '("Skim"))) + (add-to-list 'TeX-view-program-list '("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) + (add-to-list 'TeX-view-program-selection 'output-pdf '("Skim"))) ;; Or Zathura (when (featurep! +zathura) - (map-put TeX-view-program-selection 'output-pdf '("Zathura"))) + (add-to-list 'TeX-view-program-selection '(output-pdf "Zathura"))) ;; Or PDF-tools, but only if the module is also loaded (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) - (map-put TeX-view-program-list "PDF Tools" '("TeX-pdf-tools-sync-view")) - (map-put TeX-view-program-selection 'output-pdf '("PDF Tools")) + (add-to-list 'TeX-view-program-list ("PDF Tools" "TeX-pdf-tools-sync-view")) + (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) ;; Enable auto reverting the PDF document with PDF Tools (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) @@ -124,8 +121,8 @@ :init (setq latex-preview-pane-multifile-mode 'auctex) :config - (map-put TeX-view-program-list "preview-pane" '(latex-preview-pane-mode)) - (map-put TeX-view-program-selection 'output-pdf '("preview-pane")) + (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) + (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane")) (define-key! doc-view-mode-map (kbd "ESC") #'delete-window "q" #'delete-window diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 0af4f6389..ab151c4bd 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -36,7 +36,7 @@ string). Stops at the first function to return non-nil.") (or (cdr (assq lang +org-babel-mode-alist)) lang))) nil t))) - (map-put org-babel-load-languages lang t)) + (add-to-list 'org-babel-load-languages (cons lang t))) t))) (advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 358728c5e..da6baa883 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -341,7 +341,7 @@ between the two." (defun +org|setup-hacks () "Getting org to behave." ;; Don't open separate windows - (map-put org-link-frame-setup 'file #'find-file) + (setf (alist-get 'file org-link-frame-setup) #'find-file) ;; Let OS decide what to do with files when opened (setq org-file-apps `(("pdf" . default) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 9e1f09dd3..2c1d7e748 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -22,9 +22,9 @@ (setq sh-indent-after-continuation 'always) ;; recognize function names with dashes in them - (map-put sh-imenu-generic-expression - 'sh '((nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) - (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1))) + (add-to-list 'sh-imenu-generic-expression + '(sh (nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) + (nil "^\\s-*\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*()" 1))) ;; `sh-set-shell' is chatty about setting up indentation rules (advice-add #'sh-set-shell :around #'doom*shut-up) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 318ff7dc2..82d4966f0 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -21,11 +21,12 @@ :after-call (doom-before-switch-buffer after-find-file) :config ;; Register missing indent variables - (setq editorconfig-indentation-alist - (append '((mips-mode mips-tab-width) - (haxor-mode haxor-tab-width) - (nasm-mode nasm-basic-offset)) - editorconfig-indentation-alist)) + (unless (assq 'mips-mode editorconfig-indentation-alist) + (setq editorconfig-indentation-alist + (append '((mips-mode mips-tab-width) + (haxor-mode haxor-tab-width) + (nasm-mode nasm-basic-offset)) + editorconfig-indentation-alist))) (defun doom*editorconfig-smart-detection (orig-fn &rest args) "Retrieve the properties for the current file. If it doesn't have an @@ -51,7 +52,8 @@ extension, try to guess one." ;; editorconfig to ignore indentation there. I prefer dynamic indentation ;; support built into Emacs. (dolist (mode '(emacs-lisp-mode lisp-mode)) - (map-delete editorconfig-indentation-alist mode)) + (delq (assq mode editorconfig-indentation-alist) + editorconfig-indentation-alist)) ;; (editorconfig-mode +1)) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 97a38f3cc..b07ebe2b6 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -70,8 +70,8 @@ adjustment.") window--sides-inhibit-check nil) (+popup|cleanup-rules) (dolist (prop +popup-window-parameters) - (setq window-persistent-parameters - (map-delete window-persistent-parameters prop)))))) + (delq (assq prop window-persistent-parameters) + window-persistent-parameters))))) (define-minor-mode +popup-buffer-mode "Minor mode for individual popup windows. From fbf7834d93d72d1e68b946b4ee8fe91c18f104ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 19:28:34 +0200 Subject: [PATCH 2115/4235] Don't delete workspace if visible in another frame This leaves persp-mode in a semi-broken state. --- modules/feature/workspaces/autoload/workspaces.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index e249f60e4..410789703 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -291,7 +291,9 @@ workspace to delete." current-name)))) (condition-case-unless-debug ex (let ((workspaces (+workspace-list-names))) - (cond ((> (length workspaces) 1) + (cond ((delq (selected-frame) (persp-frames-with-persp (get-frame-persp))) + (user-error "Can't close workspace, it's visible in another frame")) + ((> (length workspaces) 1) (+workspace-delete name) (+workspace-switch (if (+workspace-exists-p +workspace--last) From 16d3f75f1d89bb58233ed4d3aabb54a18f332032 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 19:29:29 +0200 Subject: [PATCH 2116/4235] Minor refactor of use-package-handler/:after-call + Duplicate hooks aren't a problem + letbind `fn` only when we need it --- core/core-modules.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index c320b0216..eabea6b74 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -190,10 +190,9 @@ non-nil, return paths of possible modules, activated or otherwise." (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) (defun use-package-handler/:after-call (name _keyword hooks rest state) - (let ((fn (intern (format "doom|transient-hook--load-%s" name))) - (hooks (delete-dups hooks))) - (if (plist-get state :demand) - (use-package-process-keywords name rest state) + (if (plist-get state :demand) + (use-package-process-keywords name rest state) + (let ((fn (intern (format "doom|transient-hook--load-%s" name)))) (use-package-concat `((fset ',fn (lambda (&rest _) From 863fa16bcc4b34aa3e04dfb67fc7be7a5a791841 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 19:59:17 +0200 Subject: [PATCH 2117/4235] Refactor +workspace/new: use persp-copy Instead of manually adding buffers to new workspace. --- .../feature/workspaces/autoload/workspaces.el | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 410789703..0b2adabaa 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -332,18 +332,16 @@ workspace, otherwise the new workspace is blank." (interactive "iP") (unless name (setq name (format "#%s" (+workspace--generate-id)))) - (condition-case-unless-debug ex - (if (+workspace-exists-p name) - (error "%s already exists" name) - (+workspace-switch name t) - (if clone-p - (let ((persp (+workspace-get name))) - (dolist (window (window-list)) - (persp-add-buffer (window-buffer window) persp nil))) - (delete-other-windows-internal) - (switch-to-buffer (doom-fallback-buffer))) - (+workspace/display)) - ('error (+workspace-error (cadr ex) t)))) + (condition-case e + (cond ((+workspace-exists-p name) + (error "%s already exists" name)) + (clone-p (persp-copy name t)) + (t + (+workspace-switch name t) + (persp-delete-other-windows) + (switch-to-buffer (doom-fallback-buffer)) + (+workspace/display))) + ((debug error) (+workspace-error (cadr e) t)))) ;;;###autoload (defun +workspace/switch-to (index) From 031deb7beb0f8095d4af5872c56002ddeaf721df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 20:00:03 +0200 Subject: [PATCH 2118/4235] Fix C-k keybind in pass-mode --- modules/tools/password-store/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index abc6db2c6..bf982a1d2 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -34,7 +34,7 @@ "k" #'pass-prev-entry "d" #'pass-kill "\C-j" #'pass-next-directory - "\C-k" #'pass-next-directory)) + "\C-k" #'pass-prev-directory)) ;; Is built into Emacs 26+ From 81428f5bcfde6675e7f1952a04cf74202bc3c626 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 20:02:56 +0200 Subject: [PATCH 2119/4235] Fix dante-mode hook #718 --- modules/lang/haskell/+dante.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 2acc87ecc..2eb5645f5 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,7 +2,7 @@ ;;;###if (featurep! +dante) (def-package! dante - :hook haskell-mode + :hook (haskell-mode . dante-mode) :config (when (featurep! :feature syntax-checker) (add-hook! 'dante-mode-hook From adf143a8537a1f1bc36ff1f7a73c3ba2edea8d0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 20:11:43 +0200 Subject: [PATCH 2120/4235] Fix void-variable error when installing packages Caused by a haphazardly refactor in f6dc6ac7. --- core/autoload/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 8e4c868b7..2eb01150d 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -345,7 +345,7 @@ example; the package name can be omitted)." (package-install name)) (if (not (package-installed-p name)) (doom--delete-package-files name) - (setf (alist-get name alist) plist) + (setf (alist-get name doom-packages) plist) name))) ;;;###autoload From a0ffc38117f0106bb9a6e278a4d93618b09e83f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 20:29:54 +0200 Subject: [PATCH 2121/4235] Fix listp errors in eshell when using aliases --- modules/emacs/eshell/autoload/settings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/emacs/eshell/autoload/settings.el b/modules/emacs/eshell/autoload/settings.el index 5b1ad3b2f..39a838517 100644 --- a/modules/emacs/eshell/autoload/settings.el +++ b/modules/emacs/eshell/autoload/settings.el @@ -8,7 +8,7 @@ (after! eshell (while aliases (setf (alist-get (pop aliases) +eshell-aliases nil nil #'equal) - (pop aliases))) + (list (pop aliases)))) (when (boundp 'eshell-command-aliases-list) (if +eshell--default-aliases (setq eshell-command-aliases-list From d78f7024015860827979aeebf984f8ee5ffae529 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 22:17:15 +0200 Subject: [PATCH 2122/4235] Update feature/workspaces tests --- .../workspaces/test/test-workspaces.el | 76 +++++++++---------- 1 file changed, 34 insertions(+), 42 deletions(-) diff --git a/modules/feature/workspaces/test/test-workspaces.el b/modules/feature/workspaces/test/test-workspaces.el index 7d7d1f6a9..c04cc7a56 100644 --- a/modules/feature/workspaces/test/test-workspaces.el +++ b/modules/feature/workspaces/test/test-workspaces.el @@ -5,48 +5,49 @@ :var (persp-auto-resume-time persp-auto-save-opt persp-switch-to-added-buffer + persp-autokill-persp-when-removed-last-buffer + persp-autokill-buffer-on-remove in1 in2 out1 out2 persp1 persp1-name persp2 persp2-name - doom-before-switch-buffer-hook - doom-after-switch-buffer-hook) + wconf) (before-all + (delete-other-windows) (require! :feature workspaces) (require 'persp-mode)) - (after-all - (unload-feature 'persp-mode t)) (before-each - (setq persp-auto-resume-time -1 + (switch-to-buffer "*scratch*") + (setq wconf (current-window-configuration) + persp-auto-resume-time -1 persp-auto-save-opt 0 persp-switch-to-added-buffer nil - in1 (get-buffer-create "a") - in2 (get-buffer-create "b") - out1 (get-buffer-create "c") - out2 (get-buffer-create "d")) + persp-autokill-persp-when-removed-last-buffer nil + persp-autokill-buffer-on-remove nil + in1 (get-buffer-create "in1") + in2 (get-buffer-create "in2") + out1 (get-buffer-create "out1") + out2 (get-buffer-create "out2")) (doom-set-buffer-real in1 t) (doom-set-buffer-real out1 t) (let (noninteractive) - (persp-mode +1)) - (let (persp-before-switch-functions persp-activated-functions) - (setq persp1-name +workspaces-main - persp1 (persp-add-new persp1-name) - persp2-name "test" - persp2 (persp-add-new persp2-name)) - (persp-frame-switch +workspaces-main)) - (delete-other-windows) - (switch-to-buffer in1) - (persp-add-buffer (list in1 in2)) - (spy-on 'persp-add-buffer :and-call-through) - (doom|init-custom-hooks)) + (persp-mode +1) + (let (persp-before-switch-functions persp-activated-functions) + (setq persp1-name +workspaces-main + persp1 (persp-add-new persp1-name) + persp2-name "test" + persp2 (persp-add-new persp2-name)) + (persp-switch persp1-name) + (persp-add-buffer (list in1 in2) persp1)))) (after-each - (doom|init-custom-hooks 'disable) (let (kill-buffer-query-functions kill-buffer-hook) - (mapc #'kill-buffer (list in1 in2 out1 out2))) - (let (noninteractive) - (mapc #'persp-kill (cdr (persp-names))) - (persp-mode -1))) + (let (noninteractive ignore-window-parameters) + (dolist (persp (persp-names)) + (ignore-errors (persp-kill persp))) + (persp-mode -1)) + (set-window-configuration wconf) + (mapc #'kill-buffer (list in1 in2 out1 out2)))) ;; (describe "switch" @@ -80,7 +81,7 @@ (expect (+workspace-contains-buffer-p out1) :to-be nil)) (it "automatically adds interactively opened buffers" (expect (+workspace-contains-buffer-p out1) :to-be nil) - (switch-to-buffer out1) + (with-current-buffer out1 (+workspaces|auto-add-buffer)) (expect (+workspace-contains-buffer-p out1))) (xit "returns a list of orphaned buffers" (expect (+workspace-orphaned-buffer-list) :to-contain out2))) @@ -107,20 +108,6 @@ (expect (+workspace-list-names) :not :to-contain persp2-name))) (describe "command" - (describe "new" - (it "creates a new, blank workspace" - (quiet! (+workspace/new "X")) - (expect (one-window-p)) - (expect (current-buffer) :to-be (doom-fallback-buffer))) - (it "clones a workspace" - (quiet! (+workspace/new "X" t)) - (expect (current-buffer) :to-be in1))) - - (describe "rename" - (it "renames the current workspace" - (quiet! (+workspace/rename "X")) - (expect (+workspace-current-name) :to-equal "X"))) - (describe "close-window-or-workspace" (before-each (+workspace-switch persp2-name) @@ -132,4 +119,9 @@ (it "kills workspace on last window" (quiet! (+workspace/close-window-or-workspace) (+workspace/close-window-or-workspace)) - (expect (+workspace-current-name) :to-equal persp1-name))))) + (expect (+workspace-current-name) :to-equal persp1-name))) + + (describe "rename" + (it "renames the current workspace" + (quiet! (+workspace/rename "X")) + (expect (+workspace-current-name) :to-equal "X"))))) From f11bd617cd7204ca4e5e2152d0a2bb84d6a7ca76 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 22:17:56 +0200 Subject: [PATCH 2123/4235] Add ui/popup tests (wip) --- modules/ui/popup/test/test-popup.el | 212 ++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 modules/ui/popup/test/test-popup.el diff --git a/modules/ui/popup/test/test-popup.el b/modules/ui/popup/test/test-popup.el new file mode 100644 index 000000000..332a2fded --- /dev/null +++ b/modules/ui/popup/test/test-popup.el @@ -0,0 +1,212 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/popup/test/test-popup.el + +(describe "ui/popup" + :var (display-buffer-alist + +popup-default-display-buffer-actions + +popup--display-buffer-alist + +popup-defaults + wconf) + + (before-all + (require! :ui popup) + (delete-other-windows) + (switch-to-buffer "*scratch*") + (setq wconf (current-window-configuration)) + (+popup-mode +1)) + (after-all + (+popup-mode -1)) + + (before-each + (setq display-buffer-alist nil + +popup--display-buffer-alist nil + +popup-default-display-buffer-actions '(+popup-display-buffer-stacked-side-window) + +popup-defaults '(:side bottom :select ignore :ttl nil :slot 1 :vslot 1))) + (after-each + (set-window-configuration wconf)) + + (describe "set-popup-rule!" + (it "sets popup rules" + (set-popup-rule! "does-not-exist" :size 10) + (let ((rule (cdr (assoc "does-not-exist" display-buffer-alist)))) + (expect rule :to-contain '(+popup-buffer)) + (expect rule :to-contain '(size . 10)))) + (it "shadows old rules" + (set-popup-rule! "a" :size 10) + (set-popup-rule! "a" :size 20) + (expect (cdr (assoc "a" display-buffer-alist)) + :to-contain '(size . 20))) + (it "resolves to defaults" + (let ((+popup-defaults '(:size 5))) + (set-popup-rule! "a") + (expect (cdr (assoc "a" display-buffer-alist)) + :to-contain '(size . 5))))) + + (describe "popup rules" + :var (origin a b c d e f g) + (before-all (setq origin (current-buffer))) + (before-each + (dolist (name '(a b c d e f g)) + (set name (get-buffer-create (symbol-name name))))) + (after-each + (let (kill-buffer-query-functions kill-buffer-hook) + (dolist (x (list a b c d e f g)) + (ignore-errors (delete-window (get-buffer-window x))) + (kill-buffer x)))) + + (describe "slot positioning" + (before-each + (set-popup-rules! + '(("a" :slot 1 :vslot 1) + ("b" :slot 2 :vslot 1) + ("c" :slot 1 :vslot 2) + ("d" :slot 2 :vslot 2) + ("e" :slot 1 :vslot 3) + ("f" :slot 1 :vslot 3) + ("g")))) + + (it "replaces popups with the same slots" + (mapc #'display-buffer (list e f)) + (expect (length (+popup-windows)) :to-be 1)) + + (it "replaces popups among multiple that have the same slots" + (let ((first (display-buffer a)) + (second (display-buffer b)) + (third (display-buffer e)) + (fourth (display-buffer f))) + (expect (+popup-windows) :to-have-same-items-as + (list first second fourth)))) + + (describe ":slot" + (it "opens left of others if lower" + (let ((first (display-buffer b)) + (second (display-buffer a))) + (expect (length (+popup-windows)) :to-be 2) + (expect (window-in-direction 'left first t) + :to-equal second))) + (it "opens right of others if higher" + (let ((first (display-buffer a)) + (second (display-buffer b))) + (expect (length (+popup-windows)) :to-be 2) + (expect (window-in-direction 'right first t) + :to-equal second))) + (it "obeys default :slot" + (let ((window (display-buffer g))) + (expect (window-parameter window 'window-slot) :to-be 1) + (expect (window-parameter window 'window-vslot) :to-be 1)))) + + (describe ":vslot" + ;; TODO Implement this, somehow + (xit "opens lower :vslot popups above others" + (let ((first (display-buffer c)) + (second (display-buffer a))) + (expect (length (+popup-windows)) :to-be 2) + (expect (window-in-direction 'above first t) + :to-equal second))) + (it "opens higher :vslot popups below others" + (let ((first (display-buffer c)) + (second (display-buffer e))) + (expect (length (+popup-windows)) :to-be 2) + (expect (window-in-direction 'below first t) + :to-equal second))))) + + (describe ":select" + (it "selects the popup if non-nil" + (set-popup-rule! "^a$" :select t) + (display-buffer a) + (expect (current-buffer) :to-equal a)) + (it "selects the originating window if nil" + (set-popup-rule! "^a$" :select nil) + (display-buffer a) + (expect (current-buffer) :to-equal origin)) + (it "fall back to base selection if passed #'ignore" + (spy-on 'ignore) + (set-popup-rule! "^a$" :select #'ignore) + (save-window-excursion + (display-buffer a) + (expect (current-buffer) :to-equal origin)) + (save-window-excursion + (pop-to-buffer a) + (expect (current-buffer) :to-equal a)) + (expect 'ignore :to-have-been-called-times 2))) + + (describe ":modeline" + (it "disables the mode-line if nil" + (set-popup-rule! "a" :modeline nil :select t) + (display-buffer a) + (expect mode-line-format :to-be nil)) + (it "uses the default mode-line if t" + (set-popup-rule! "a" :modeline t :select t) + (display-buffer a) + (expect mode-line-format :to-equal (default-value 'mode-line-format))) + (it "uses a predefined mode-line if passed a symbol" + (def-modeline! test-popup-modeline ("x") ()) + (set-popup-rule! "a" :modeline 'test-popup-modeline :select t) + (display-buffer a) + (expect mode-line-format :to-equal (doom-modeline 'test-popup-modeline))) + (it "runs the handler if passed a function" + (set-popup-rule! "a" :modeline (lambda () (setq mode-line-format '("x"))) :select t) + (display-buffer a) + (expect mode-line-format :to-equal '("x")))) + + ;; TODO + (xdescribe ":autosave") + + (describe ":quit" + (it "will close from anywhere if :quit = t" + (set-popup-rule! "a" :quit t) + (save-window-excursion + (display-buffer a) + (call-interactively #'+popup/close-all) + (expect (get-buffer-window a) :to-be nil)) + (save-window-excursion + (pop-to-buffer a) + (call-interactively #'+popup/close) + (expect (get-buffer-window a) :to-be nil))) + (it "will only close from outside if :quit = 'other" + (set-popup-rule! "a" :quit 'other) + (save-window-excursion + (display-buffer a) + (call-interactively #'+popup/close-all) + (expect (get-buffer-window a) :to-be nil)) + (save-window-excursion + (pop-to-buffer a) + (call-interactively #'+popup/close) + (expect (get-buffer-window a)))) + (it "will only close from inside if :quit = 'current" + (set-popup-rule! "a" :quit 'current) + (save-window-excursion + (display-buffer a) + (call-interactively #'+popup/close-all) + (expect (get-buffer-window a))) + (save-window-excursion + (pop-to-buffer a) + (call-interactively #'+popup/close) + (expect (get-buffer-window a) :to-be nil))) + (it "never close a if :quit = nil" + (set-popup-rule! "a" :quit nil) + (save-window-excursion + (display-buffer a) + (call-interactively #'+popup/close-all) + (expect (get-buffer-window a))) + (save-window-excursion + (pop-to-buffer a) + (call-interactively #'+popup/close) + (expect (get-buffer-window a))))) + + ;; TODO + (xdescribe ":ttl") + (xdescribe ":size") + (xdescribe ":width") + (xdescribe ":height") + (xdescribe ":side") + (xdescribe ":actions")) + + ;; TODO + (xdescribe "predicate functions" + (describe "buffer-p") + (describe "window-p")) + + ;; TODO + (xdescribe "save-popups!") + (xdescribe "with-popup-rules!")) From 618358413bdbb2d056fc0de08b686bb6daf143f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 22:18:44 +0200 Subject: [PATCH 2124/4235] Major refactor of ui/popup + Make it pass tests + Changes the behavior and arguments of functions passed to :autosave, :ttl, and :modeline. + Updated the documentation of set-popup-rule! to reflect these changes + Phase out map.el usage as per f6dc6ac7 --- modules/ui/popup/autoload/popup.el | 148 +++++++++++++------------- modules/ui/popup/autoload/settings.el | 131 ++++++++++++----------- 2 files changed, 147 insertions(+), 132 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index b3ad9fdf2..06f91e670 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -33,6 +33,7 @@ the buffer is visible, then set another timer and try again later." default window parameters for popup windows, clears leftover transient timers and enables `+popup-buffer-mode'." (with-selected-window window + (setq alist (delq (assq 'actions alist) alist)) (when (and alist +popup--populate-wparams) ;; Emacs 26+ will automatically map the window-parameters alist entry to ;; the popup window, so we need this for Emacs 25.x users @@ -58,58 +59,61 @@ and enables `+popup-buffer-mode'." `transient' window parameter (see `+popup-window-parameters'). + And finally deletes the window!" (let ((buffer (window-buffer window)) - (inhibit-quit t) - ttl) - (when (and (buffer-file-name buffer) - (buffer-modified-p buffer) - (or (+popup-parameter-fn 'autosave window buffer) - (y-or-n-p "Popup buffer is modified. Save it?"))) - (with-current-buffer buffer (save-buffer))) - (set-buffer-modified-p nil) + (inhibit-quit t)) + (and (buffer-file-name buffer) + (buffer-modified-p buffer) + (let ((autosave (+popup-parameter 'autosave window))) + (cond ((eq autosave 't)) + ((null autosave) + (y-or-n-p "Popup buffer is modified. Save it?")) + ((functionp autosave) + (funcall autosave buffer)))) + (with-current-buffer buffer (save-buffer))) (let ((ignore-window-parameters t)) (delete-window window)) (unless (window-live-p window) (with-current-buffer buffer + (set-buffer-modified-p nil) (+popup-buffer-mode -1) - ;; t = default - ;; integer = ttl - ;; nil = no timer (unless +popup--inhibit-transient - (setq ttl (+popup-parameter-fn 'ttl window buffer)) - (when ttl - (when (eq ttl t) - (setq ttl (or (plist-get +popup-defaults :ttl) - 0))) - (cl-assert (integerp ttl) t) - (if (= ttl 0) - (+popup--kill-buffer buffer 0) - (add-hook 'kill-buffer-hook #'+popup|kill-buffer-hook nil t) - (setq +popup--timer - (run-at-time ttl nil #'+popup--kill-buffer - buffer ttl))))))))) + (let ((ttl (+popup-parameter 'ttl window))) + (when (eq ttl 't) + (setq ttl (plist-get +popup-defaults :ttl))) + (cond ((null ttl)) + ((functionp ttl) + (funcall ttl buffer)) + ((not (integerp ttl)) + (signal 'wrong-type-argument (list 'integerp ttl))) + ((= ttl 0) + (+popup--kill-buffer buffer 0)) + ((add-hook 'kill-buffer-hook #'+popup|kill-buffer-hook nil t)) + ((setq +popup--timer + (run-at-time ttl nil #'+popup--kill-buffer + buffer ttl)))))))))) (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." - (let ((alist ; handle defaults - (cl-remove-duplicates - (append alist +popup-default-alist) - :key #'car :from-end t)) - (parameters - (cl-remove-duplicates - (append (cdr (assq 'window-parameters alist)) - +popup-default-parameters) - :key #'car :from-end t))) - ;; handle `size' - (when-let* ((size (cdr (assq 'size alist))) - (side (or (cdr (assq 'side alist)) 'bottom)) - (param (if (memq side '(left right)) - 'window-width - 'window-height))) - (setq alist (map-delete alist 'size)) - (map-put alist param size)) - (setcdr (assq 'window-parameters alist) - (cl-remove-if #'null parameters :key #'cdr)) - (cl-remove-if #'null alist :key #'cdr))) + (when alist + (let ((alist ; handle defaults + (cl-remove-duplicates + (append alist +popup-default-alist) + :key #'car :from-end t)) + (parameters + (cl-remove-duplicates + (append (cdr (assq 'window-parameters alist)) + +popup-default-parameters) + :key #'car :from-end t))) + ;; handle `size' + (when-let* ((size (cdr (assq 'size alist))) + (side (or (cdr (assq 'side alist)) 'bottom)) + (param (if (memq side '(left right)) + 'window-width + 'window-height))) + (setq list (assq-delete-all 'size alist)) + (setcdr (assq param alist) size)) + (setcdr (assq 'window-parameters alist) + parameters) + alist))) ;; @@ -120,23 +124,21 @@ and enables `+popup-buffer-mode'." (defun +popup-buffer-p (&optional buffer) "Return non-nil if BUFFER is a popup buffer. Defaults to the current buffer." (when +popup-mode - (unless buffer - (setq buffer (current-buffer))) - (cl-assert (bufferp buffer) t) - (and (buffer-live-p buffer) - (buffer-local-value '+popup-buffer-mode buffer) - buffer))) + (let ((buffer (or buffer (current-buffer)))) + (and (bufferp buffer) + (buffer-live-p buffer) + (buffer-local-value '+popup-buffer-mode buffer) + buffer)))) ;;;###autoload (defun +popup-window-p (&optional window) "Return non-nil if WINDOW is a popup window. Defaults to the current window." (when +popup-mode - (unless window - (setq window (selected-window))) - (cl-assert (windowp window) t) - (and (window-live-p window) - (window-parameter window 'popup) - window))) + (let ((window (or window (selected-window)))) + (and (windowp window) + (window-live-p window) + (window-parameter window 'popup) + window)))) ;;;###autoload (defun +popup-buffer (buffer &optional alist) @@ -216,11 +218,14 @@ restoring it if `+popup-buffer-mode' is disabled." + If a function, it takes the current buffer as its argument and must return one of the above values." (when (bound-and-true-p +popup-buffer-mode) - (let ((modeline (+popup-parameter-fn 'modeline nil (current-buffer)))) + (let ((modeline (+popup-parameter 'modeline))) (cond ((eq modeline 't)) ((or (eq modeline 'nil) (null modeline)) + ;; TODO use `mode-line-format' window parameter instead (emacs 26+) (hide-mode-line-mode +1)) + ((functionp modeline) + (funcall modeline)) ((symbolp modeline) (when-let* ((hide-mode-line-format (doom-modeline modeline))) (hide-mode-line-mode +1))))))) @@ -246,9 +251,9 @@ restoring it if `+popup-buffer-mode' is disabled." (defun +popup|cleanup-rules () "Cleans up any duplicate popup rules." (interactive) - (cl-delete-duplicates - +popup--display-buffer-alist - :key #'car :test #'equal :from-end t) + (setq +popup--display-buffer-alist + (cl-delete-duplicates +popup--display-buffer-alist + :key #'car :test #'equal :from-end t)) (when +popup-mode (setq display-buffer-alist +popup--display-buffer-alist))) @@ -291,16 +296,15 @@ This will do nothing if the popup's `quit' window parameter is either nil or (interactive (list (selected-window) current-prefix-arg)) - (unless window - (setq window (selected-window))) - (when (and (+popup-window-p window) - (or force-p - (memq (+popup-parameter-fn 'quit window window) - '(t current)))) - (when +popup--remember-last - (+popup--remember (list window))) - (delete-window window) - t)) + (let ((window (or window (selected-window)))) + (when (and (+popup-window-p window) + (or force-p + (memq (+popup-parameter-fn 'quit window window) + '(t current)))) + (when +popup--remember-last + (+popup--remember (list window))) + (delete-window window) + t))) ;;;###autoload (defun +popup/close-all (&optional force-p) @@ -426,7 +430,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (lambda (_side) (frame-root-window (selected-frame))))) (when-let* ((window (window--make-major-side-window buffer side slot alist))) (set-window-parameter window 'window-vslot vslot) - (map-put window-persistent-parameters 'window-vslot 'writable) + (add-to-list 'window-persistent-parameters '(window-vslot . writable)) window))) (t ;; Scan windows on SIDE. @@ -570,11 +574,11 @@ and may be called only if no window on SIDE exists yet." ;; Initialize `window-side' parameter of new window to SIDE and ;; make that parameter persistent. (set-window-parameter window 'window-side side) - (map-put window-persistent-parameters 'window-side 'writable) + (add-to-list 'window-persistent-parameters '(window-side . writable)) ;; Install `window-slot' parameter of new window and make that ;; parameter persistent. (set-window-parameter window 'window-slot slot) - (map-put window-persistent-parameters 'window-slot 'writable) + (add-to-list 'window-persistent-parameters '(window-slot . writable)) ;; Auto-adjust height/width of new window unless a size has been ;; explicitly requested. (unless (if left-or-right diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 0ff8d28b9..9f98b53c9 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -10,11 +10,11 @@ :quit t :select #'ignore :ttl 5) - "Default setup for `set-popup-rule!' ") + "Default properties for popup rules defined with `set-popup-rule!'.") ;;;###autoload (defun +popup--make (predicate plist) - (cond ((not (keywordp (car plist))) + (cond ((and plist (not (keywordp (car plist)))) ;; FIXME deprecated popup rule support (message "Warning: the old usage of `set-popup-rule!' is deprecated; update the rule for '%s'" predicate) @@ -51,14 +51,13 @@ (defun set-popup-rule! (predicate &rest plist) "Define a popup rule. -Buffers displayed by `pop-to-buffer' and `display-buffer' (or their siblings) -will be tested against PREDICATE, which is either a) a regexp string (which is -matched against the buffer's name) or b) a function that takes no arguments and -returns a boolean. +These rules affect buffers displayed with `pop-to-buffer' and `display-buffer' +(or their siblings). Buffers displayed with `switch-to-buffer' (and its +variants) will not be affected by these rules (as they are unaffected by +`display-buffer-alist', which powers the popup management system). -Buffers displayed with `switch-to-buffer' and its variants will not be affected -by these rules (as they are unaffected by `display-buffer-alist', which powers -the popup management system). +PREDICATE can be either a) a regexp string (matched against the buffer's name) +or b) a function that takes no arguments and returns a boolean. PLIST can be made up of any of the following properties: @@ -72,83 +71,93 @@ PLIST can be made up of any of the following properties: `+popup-display-buffer-stacked-side-window' or `display-buffer-in-side-window' is in :actions or `+popup-default-display-buffer-actions'. -:size/:width/:height FLOAT|INT - Determines the size of the popup. If opened at the top or bottom, the width is - irrelevant unless it is opened in an adjacent slot. Same deal with the left - and right side. +:size/:width/:height FLOAT|INT|FN + Determines the size of the popup. If more tha one of these size properties are + given :size always takes precedence, and is mapped with window-width or + window-height depending on what :side the popup is opened. Setting a height + for a popup that opens on the left or right is harmless, but comes into play + if two popups occupy the same :vslot. - If given a FLOAT (0 < x < 1), the number represents how much of the window - will be consumed by the popup (a percentage). - If given an INT, the number determines the size in lines (height) or units of + If a FLOAT (0 < x < 1), the number represents how much of the window will be + consumed by the popup (a percentage). + If an INT, the number determines the size in lines (height) or units of character width (width). + If a function, it takes one argument: the popup window, and can do whatever it + wants with it, typically resize it, like `+popup-shrink-to-fit'. :slot/:vslot INT - This only applies to popups with a :side. For popups opened at the top or - bottom, slot designates the horizontal positioning of a popup. If two popups - are assigned the same slot (and same vslot), the later popup will replace the - earlier one. If the later popup has a lower slot, it will open to the older - popup's left. A higher slot opens it to the old popup's right. + (This only applies to popups with a :side and only if :actions is blank or + contains the `+popup-display-buffer-stacked-side-window' action) These control + how multiple popups are laid out. INT can be any integer, positive and + negative. - On the other hand, vslot operates the same way, but controls how popups are - stacked. + :slot controls lateral positioning (e.g. the horizontal positioning for + top/bottom popups, or vertical positioning for left/right popups). + :vslot controls popup stacking (from the edge of the frame toward the center). - When a popup is opened on the left and right, slot determines vertical - position and vslot horizontal. + Let's assume popup A and B are opened with :side 'bottom, in that order. + If they possess the same :slot and :vslot, popup B will replace popup A. + If popup B has a higher :slot, it will open to the right of popup A. + If popup B has a lower :slot, it will open to the left of popup A. + If popup B has a higher :vslot, it will open above popup A. + If popup B has a lower :vslot, it will open below popup A. :ttl INT|BOOL|FN - Stands for time-to-live. CDR can be t, an integer, nil or a function that - returns one of these. It represents the number of seconds before the buffer - belonging to a closed popup window is killed. + Stands for time-to-live. It can be t, an integer, nil or a function. This + controls how (and if) the popup system will clean up after the popup. - If t, CDR will default to `+popup-ttl'. + If any non-zero integer, wait that many seconds before killing the buffer (and + any associated processes). If 0, the buffer is immediately killed. - If nil, the buffer won't be killed. - If a function, it must return one of the other possible values above. It takes - the popup buffer as its sole argument. + If nil, the buffer won't be killed and is left to its own devices. + If t, resort to the default :ttl in `+popup-defaults'. If none exists, this is + the same as nil. + If a function, it takes one argument: the target popup buffer. The popup + system does nothing else and ignores the function's return value. -:quit BOOL|FN - CDR can be t, 'other, 'current, nil, or a function that returns one of these. - This determines the behavior of the ESC/C-g keys in or outside of popup - windows. +:quit FN|BOOL|'other|'current + Can be t, 'other, 'current, nil, or a function. This determines the behavior + of the ESC/C-g keys in or outside of popup windows. - If t, close the popup if ESC/C-g is pressed inside or outside of popups. + If t, close the popup if ESC/C-g is pressed anywhere. If 'other, close this popup if ESC/C-g is pressed outside of any popup. This - is great for popups you just want to peek at and discard, but might also - want to poke around in, without the risk of closing it from the inside. + is great for popups you may press ESC/C-g a lot in. If 'current, close the current popup if ESC/C-g is pressed from inside of the - popup. - If nil, pressing ESC/C-g will never close this buffer. - If a function, it is checked each time ESC/C-g is pressed to determine the - fate of the popup window. This function takes one argument: the popup window - and must return one of the other possible values. + popup. This makes it harder to accidentally close a popup until you really + want to. + If nil, pressing ESC/C-g will never close this popup. + If a function, it takes one argument: the to-be-closed popup window, and is + run when ESC/C-g is pressed while that popup is open. It must return one of + the other values to determine the fate of the popup. :select BOOL|FN - CDR can be a boolean or function. The boolean determines whether to focus the + Can be a boolean or function. The boolean determines whether to focus the popup window after it opens (non-nil) or focus the origin window (nil). - If a function, it takes two arguments: the popup window and the source window - (where you were before the popup was opened). It does nothing else, and - ignores its return value. + If a function, it takes two arguments: the popup window and originating window + (where you were before the popup opened). The popup system does nothing else + and ignores the function's return value. :modeline BOOL|SYMBOL|FN - CDR can be t (show the default modeline), a symbol representing the name of a + Can be t (show the default modeline), a symbol representing the name of a modeline defined with `def-modeline!', nil (show no modeline) or a function - that returns one of these. The function takes one argument: the popup buffer. + that returns a modeline format. The function takes no arguments and is run in + the context of the popup buffer. :autosave BOOL|FN - This parameter determines what to do with modified buffers in closing popup - windows. CDR can be a t, 'ignore, a function or nil. + This parameter determines what to do with modified buffers when closing popup + windows. It accepts t, 'ignore, a function or nil. If t, no prompts. Just save them automatically (if they're file-visiting - buffers). - If 'ignore, no prompts, no saving. Just silently kill it. + buffers). Same as 'ignore for non-file-visiting buffers. If nil (the default), prompt the user what to do if the buffer is file-visiting and modified. - If a function, the return value must return one of the other values. It takes - two arguments: the popup window and buffer. + If 'ignore, no prompts, no saving. Just silently kill it. + If a function, it is run with one argument: the popup buffer, and must return + non-nil to save or nil to do nothing (but no prompts). :parameters ALIST - An alist of custom window parameters. See \(info window-parameters) + An alist of custom window parameters. See `(elisp)Window Parameters'. If any of these are omitted, defaults derived from `+popup-defaults' will be used." @@ -160,9 +169,11 @@ used." ;;;###autodef (defun set-popup-rules! (&rest rulesets) - "Like `set-popup-rules!', but defines multiple popup rules. Every entry in RULESETS -should be a list of lists (each sublist is a popup rule that could be passed to -`set-popup-rule!'). + "Defines multiple popup rules. + +Every entry in RULESETS should be a list of alists where the CAR is the +predicate and CDR is a plist. See `set-popup-rule!' for details on the predicate +and plist. Example: From 4c4a35ae86c2259ea32abacc8210b53f9ddbc59d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 22:22:42 +0200 Subject: [PATCH 2125/4235] Minor reformatting It's no big deal. Really. --- core/core-modules.el | 3 ++- modules/lang/crystal/config.el | 6 +++--- modules/lang/javascript/config.el | 6 +----- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index eabea6b74..66b2385f2 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -7,7 +7,8 @@ "A hash table of enabled modules. Set by `doom-initialize-modules'.") (defvar doom-modules-dirs - (list (expand-file-name "modules/" doom-private-dir) doom-modules-dir) + (list (expand-file-name "modules/" doom-private-dir) + doom-modules-dir) "A list of module root directories. Order determines priority.") (defconst doom-obsolete-modules diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index c740414f6..c1e219f45 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -7,9 +7,9 @@ :definition #'crystal-def-jump :references #'crystal-tool-imp) (set-eval-handler! 'crystal-mode - '((:command . "crystal") - (:exec . "%c %s") - (:description . "Run Crystal script")))) + '((:command . "crystal") + (:exec . "%c %s") + (:description . "Run Crystal script")))) (def-package! flycheck-crystal diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 1ea7896d5..7966f72df 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -76,7 +76,7 @@ ;; `rjsx-electric-gt' relies on js2's parser to tell it when the cursor is in ;; a self-closing tag, so that it can insert a matching ending tag at point. ;; However, the parser doesn't run immediately, so a fast typist can outrun - ;; it, causing issues, so force it to parse. + ;; it, causing tags to stay unclosed, so force it to parse. (defun +javascript|reparse (n) ;; if n != 1, rjsx-electric-gt calls rjsx-maybe-reparse itself (if (= n 1) (rjsx-maybe-reparse))) @@ -134,23 +134,19 @@ :config (setq tide-completion-detailed t tide-always-show-documentation t) - ;; code completion (after! company ;; tide affects the global `company-backends', undo this so doom can handle ;; it buffer-locally (setq-default company-backends (delq 'company-tide (default-value 'company-backends)))) (set-company-backend! 'tide-mode 'company-tide) - ;; navigation (set-lookup-handlers! 'tide-mode :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) - ;; resolve to `doom-project-root' if `tide-project-root' fails (advice-add #'tide-project-root :override #'+javascript*tide-project-root) - ;; cleanup tsserver when no tide buffers are left (add-hook! 'tide-mode-hook (add-hook 'kill-buffer-hook #'+javascript|cleanup-tide-processes nil t)) From e4b23d78daa3a470d71e21e3471fb0c1cc05a421 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 22:23:35 +0200 Subject: [PATCH 2126/4235] Refactor require! Defer its compile-time segments to run-time, which would cause many issues in conditions wrapped around it. In any case, avoid using require!, it was a poor choice to implement it and should only be used for unit tests. --- core/core-modules.el | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 66b2385f2..b19a58c12 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -332,23 +332,21 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (defmacro require! (category module &rest plist) "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." - (let ((doom-modules (copy-hash-table doom-modules))) - (apply #'doom-module-set category module - (mapcar #'eval plist)) - (let ((module-path (doom-module-locate-path category module))) - (if (directory-name-p module-path) - `(condition-case-unless-debug ex - (let ((doom--current-module ',(cons category module))) - (load! "init" ,module-path :noerror) - (let ((doom--stage 'config)) - (load! "config" ,module-path :noerror))) - ('error - (lwarn 'doom-modules :error - "%s in '%s %s' -> %s" - (car ex) ,category ',module - (error-message-string ex)))) - (warn 'doom-modules :warning "Couldn't find module '%s %s'" - category module))))) + `(let ((module-path (doom-module-locate-path ,category ',module))) + (doom-module-set ,category ',module ,@plist) + (if (directory-name-p module-path) + (condition-case-unless-debug ex + (let ((doom--current-module ',(cons category module))) + (load! "init" module-path :noerror) + (let ((doom--stage 'config)) + (load! "config" module-path :noerror))) + ('error + (lwarn 'doom-modules :error + "%s in '%s %s' -> %s" + (car ex) ,category ',module + (error-message-string ex)))) + (warn 'doom-modules :warning "Couldn't find module '%s %s'" + ,category ',module)))) (defmacro featurep! (module &optional submodule flag) "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if From fcbf2212676f5fe32e4b65bc7fedc62c9d07137a Mon Sep 17 00:00:00 2001 From: Marcelo dos Santos Date: Sat, 23 Jun 2018 18:14:01 -0300 Subject: [PATCH 2127/4235] Add new symbols. --- modules/ui/pretty-code/autoload.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index b11795f42..0ed207d93 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -28,6 +28,7 @@ besides what is listed.") :lambda "λ" :def "ƒ" :composition "∘" + :map "↦" ;; Types :null "∅" :true "𝕋" @@ -48,7 +49,8 @@ besides what is listed.") :yield "⟻" ;; Other :tuple "⨂" - :pipe "") + :pipe "" + :dot "•") "Options plist for `pretty-code-get-pairs'.") (defvar +pretty-code--iosevka-ligeratures-enabled nil) From a52267fee555396f2faf1b2c362db34c9ad41dcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 23:21:02 +0200 Subject: [PATCH 2128/4235] Disable smartparens pair & tag navigation Fixes quirky backspace and autoskipping behavior with html tags or closing delimtiers unpredictably. These might be more useful to non-evil users, but more testing is required. Indirectly fixes #712 --- core/core-editor.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 2a2c5d569..b61a249ce 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -150,7 +150,14 @@ fundamental-mode) for performance sake." sp-show-pair-delay 0.1 sp-max-pair-length 3) - ;; smartparens conflicts with evil-mode's replace state + ;; Slim down on smartparens' opinionated behavior + (setq sp-navigate-skip-match nil) + (after! (:or smartparens-crystal smartparens-ruby) + (setq sp-navigate-skip-match nil)) + (after! smartparens-html + (setq sp-navigate-consider-sgml-tags nil)) + + ;; smartparenss conflicts with evil-mode's replace state (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) From f112a2a83f96bc7f887fa47f884aea3ae95ba901 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 23 Jun 2018 23:23:23 +0200 Subject: [PATCH 2129/4235] Add :ui popup to init.test.el --- init.test.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.test.el b/init.test.el index 83dfa6ac2..1d150befc 100644 --- a/init.test.el +++ b/init.test.el @@ -7,6 +7,7 @@ company :ui doom-dashboard + popup :tools password-store :lang From a8c31db7be5845805956f3bdf26c52c0e828045e Mon Sep 17 00:00:00 2001 From: Mark Redeman Date: Sat, 23 Jun 2018 23:04:03 +0200 Subject: [PATCH 2130/4235] Remove the `SPC o I` keybinding to open IRC --- modules/app/irc/README.org | 12 ++++++------ modules/app/irc/config.el | 2 +- modules/config/default/+bindings.el | 3 --- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/modules/app/irc/README.org b/modules/app/irc/README.org index b06d136fc..865b11c31 100644 --- a/modules/app/irc/README.org +++ b/modules/app/irc/README.org @@ -91,13 +91,13 @@ username: myusername * Appendix ** Commands -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 | description | -|---------+-----------+-------------------------------------------| -| ~=irc~ | =SPC o I= | Connect to IRC and all configured servers | +To connect to IRC you can invoke the ~=irc~ function using =M-x= or your own +custom keybinding. + +| command | description | +|---------+-------------------------------------------| +| ~=irc~ | Connect to IRC and all configured servers | When in a circe buffer these keybindings will be available. diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index f6d9b982e..a75e37bed 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -141,7 +141,7 @@ playback.") :desc "Jump to channel" :n "c" #'+irc/ivy-jump-to-channel)) (:map circe-channel-mode-map - :desc "Show names" :n "n" #'circe-command-NAMES))) + :desc "Show names" :n "n" #'circe-command-NAMES)))) (def-package! circe-color-nicks diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a3a7a4143..901696b74 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -667,9 +667,6 @@ :desc "Eshell" :n "e" #'+eshell/open :desc "Eshell in popup" :n "E" #'+eshell/open-popup - (:when (featurep! :app irc) - :desc "IRC" :n "I" #'=irc) - (:when (featurep! :collab floobits) :desc "floobits" :prefix "f" :n "c" #'floobits-clear-highlights From 69fc80d7cfbf87071277ae2c463b892e29e66c65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 10:34:16 +0200 Subject: [PATCH 2131/4235] Revert "Fix evil-escape aborting multiedit too eagerly" This reverts commit ba1488279bc857b08bf7095aad88bac575a6ec3f. This hack is no longer necessary now that syl20bnr/evil-escape#83 was merged upstream. --- modules/feature/evil/config.el | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e0dba46f5..f5d6ebb66 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -249,12 +249,6 @@ variable for an explanation of the defaults (in comments). See (add-hook 'pre-command-hook #'evil-escape-pre-command-hook) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config - ;; TODO PR this upstream - (defun +evil*escape-func (ret) - (if (eq evil-state 'multiedit-insert) - #'evil-multiedit-state - ret)) - (advice-add #'evil-escape-func :filter-return #'+evil*escape-func) ;; no `evil-escape' in minibuffer (add-hook 'evil-escape-inhibit-functions #'minibufferp)) From c69b4ab5eeaf30be3ccf73d07329c76cb2abacee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 10:35:36 +0200 Subject: [PATCH 2132/4235] Use C-n/C-p in macrostep instead of n/p n/p overrides evil's jump-to-next/previous-search. --- modules/lang/emacs-lisp/config.el | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 8863099c0..91de77125 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -74,21 +74,21 @@ ;; `macrostep' (map! :after macrostep :map macrostep-keymap - :n "RET" #'macrostep-expand - :n "e" #'macrostep-expand - :n "u" #'macrostep-collapse - :n "c" #'macrostep-collapse + :n "RET" #'macrostep-expand + :n "e" #'macrostep-expand + :n "u" #'macrostep-collapse + :n "c" #'macrostep-collapse - :n "TAB" #'macrostep-next-macro - :n "n" #'macrostep-next-macro - :n "J" #'macrostep-next-macro + :n [tab] #'macrostep-next-macro + :n "C-n" #'macrostep-next-macro + :n "J" #'macrostep-next-macro - :n "S-TAB" #'macrostep-prev-macro - :n "K" #'macrostep-prev-macro - :n "p" #'macrostep-prev-macro + :n [backtab] #'macrostep-prev-macro + :n "K" #'macrostep-prev-macro + :n "C-p" #'macrostep-prev-macro - :n "q" #'macrostep-collapse-all - :n "C" #'macrostep-collapse-all) + :n "q" #'macrostep-collapse-all + :n "C" #'macrostep-collapse-all) (after! evil ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't From be44b1ae8afe473fe3ce48d1d6c2e9824457dd78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 12:08:55 +0200 Subject: [PATCH 2133/4235] Fix package!'s :disable being read unconditionally Because the package was added to doom-disabled-packages at macro expansion time, rather than at run time. This meant that, even if you did: (when nil (package! x :disable t)) x would still be disabled. Reported by @ar1a --- core/core-packages.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e256729cb..cf4fc37fe 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -207,8 +207,6 @@ elsewhere." (and old-plist (plist-get old-plist :pin)))) (pkg-disable (or (plist-get plist :disable) (and old-plist (plist-get old-plist :disable))))) - (when pkg-disable - (add-to-list 'doom-disabled-packages name nil #'eq)) (when pkg-recipe (when (= 0 (% (length pkg-recipe) 2)) (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) @@ -222,6 +220,7 @@ elsewhere." doom-private-dir) (setq plist (plist-put plist :private t))) `(progn + ,(if pkg-disable `(add-to-list 'doom-disabled-packages ',name nil #'eq)) ,(if pkg-pin `(setf (alist-get ',name package-pinned-packages) ,pkg-pin)) (setf (alist-get ',name doom-packages) ',plist) (not (memq ',name doom-disabled-packages))))) From 6e3afb02497cb41f66fa36a9681b92574d1c8094 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 14:44:09 +0200 Subject: [PATCH 2134/4235] Improve wakatime module; add +wakatime/setup + +wakatime/setup prompts for API key, after asking if you want to open a browser to the wakatime api-key page. + wakatime-api-key is saved to a cache file in doom-cache-dir. + Fixed wakatime not starting on the first buffer when passing a file to Emacs directly. Suggested by @freddian --- modules/tools/wakatime/autoload.el | 37 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 3babe8bb5..05e415899 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -1,17 +1,44 @@ ;;; tools/wakatime/autoload.el -*- lexical-binding: t; -*- +(defvar +wakatime-api-file (concat doom-cache-dir "wakatime.el") + "Where the wakatime api key is cached.") + ;;;###autoload (add-hook 'doom-after-switch-buffer-hook #'+wakatime|autostart) ;;;###autoload -(defalias '+wakatime/start '+wakatime|autostart) +(advice-add 'after-find-file :before #'wakatime|autostart) ;;;###autoload -(defun +wakatime|autostart () +(defun +wakatime/setup () + "Setup Wakatime in Emacs and start `global-wakatime-mode'. + +This will prompt you for your api key. You only need to run this when your api +changes." + (interactive) + (when (y-or-n-p "No API key is registered. Open a browser on the wakatime api key page?") + (browse-url "https://wakatime.com/settings/api-key")) + (let ((api-key (read-string "Enter your wakatime API key: "))) + (unless api-key + (user-error "No api key was received.")) + (setq wakatime-api-key api-key) + (with-temp-file +wakatime-api-file + (princ `(setq wakatime-api-key ,api-key) + (current-buffer))) + (require 'wakatime-mode) + (global-wakatime-mode +1))) + +;;;###autoload +(defun +wakatime|autostart (&rest _) "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." (interactive) - (if (boundp 'wakatime-api-key) + (when (and (not (bound-and-true-p wakatime-api-key)) + (file-exists-p +wakatime-api-file)) + (load +wakatime-api-file nil t)) + (if (bound-and-true-p wakatime-api-key) (global-wakatime-mode +1) - (message "No `wakatime-api-key' set! wakaktime-mode will stay disabled.")) - (remove-hook 'doom-after-switch-buffer-hook #'+wakatime-init)) + (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so (only necessary once).")) + ;; + (remove-hook 'doom-after-switch-buffer-hook #'+wakatime|autostart) + (advice-remove 'after-find-file #'wakatime|autostart)) From c9ac30889c9a3e0249432f2a156fe1f228ccab1d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 14:48:27 +0200 Subject: [PATCH 2135/4235] Allow debugger to handle byte-compile errors --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index d1d59dbe2..0321c6687 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -796,7 +796,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (if recompile-p "Recompiled" "Compiled") total-ok (- (length target-files) total-noop) total-noop)))) - (error + ((debug error) (print! (red "\n%s\n\n%%s" "There were breaking errors.") "Reverting changes...") (signal 'doom-error (list 'byte-compile e)))))))) From c78c6495f15b90353307c6c0084ad8501f9e2060 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 14:52:57 +0200 Subject: [PATCH 2136/4235] Apply /* and /** pairs to more modes Including js, ts, rjsx, rust, all C modes, php, and all css modes (scss, less, and stylus). Requested by @ar1a --- core/core-editor.el | 8 ++++++++ modules/lang/cc/config.el | 3 --- modules/lang/javascript/config.el | 5 ----- modules/lang/web/+css.el | 4 ---- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b61a249ce..80f7b7507 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -172,6 +172,14 @@ fundamental-mode) for performance sake." (sp-local-pair '(xml-mode nxml-mode php-mode) "" :post-handlers '(("| " "SPC"))) + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode + c-mode c++-mode objc-mode java-mode php-mode + css-mode scss-mode less-css-mode stylus-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") ("\n* ||\n*/[i][d-2]" "*"))) + (smartparens-global-mode +1)) ;; Branching undo diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 6c5d6d7d9..9f7479434 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -135,9 +135,6 @@ compilation database is present in the project.") :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p) :post-handlers '(("| " "SPC")))) (sp-with-modes '(c-mode c++-mode objc-mode java-mode) - (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))) - ;; Doxygen blocks - (sp-local-pair "/**" "*/" :post-handlers '(("||\n[i]" "RET") ("||\n[i]" "SPC"))) (sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC"))))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 7966f72df..0caa4a554 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -17,11 +17,6 @@ ;; Other :yield "import")) -(after! smartparens - (sp-with-modes '(js2-mode typescript-mode rjsx-mode) - (sp-local-pair "/**" "" :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET"))) - (sp-local-pair "/*" "*/" :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET"))))) - ;; ;; Major modes diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 171775876..48f26a858 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -3,10 +3,6 @@ ;; An improved newline+continue comment function (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) -(after! smartparens - (sp-with-modes '(css-mode scss-mode less-css-mode stylus-mode) - (sp-local-pair "/*" "*/" :post-handlers '(("||\n[i]" "RET") ("| " "SPC"))))) - (map! :map* (css-mode-map scss-mode-map less-css-mode-map) :localleader :n "rb" #'+css/toggle-inline-or-block) From 88ee423806ced794449373660bad1f4288774554 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 15:08:00 +0200 Subject: [PATCH 2137/4235] Refactor & optimize smartparens config Also, apply comments to more html modes. --- core/core-editor.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 80f7b7507..9b0ea39ff 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -148,14 +148,14 @@ fundamental-mode) for performance sake." sp-show-pair-from-inside t sp-cancel-autoskip-on-backward-movement nil sp-show-pair-delay 0.1 - sp-max-pair-length 3) + sp-max-pair-length 4 + sp-max-prefix-length 50) ;; Slim down on smartparens' opinionated behavior - (setq sp-navigate-skip-match nil) - (after! (:or smartparens-crystal smartparens-ruby) - (setq sp-navigate-skip-match nil)) - (after! smartparens-html - (setq sp-navigate-consider-sgml-tags nil)) + (defun doom|disable-smartparens-navigate-skip-match () + (setq sp-navigate-skip-match nil + sp-navigate-consider-sgml-tags nil)) + (add-hook 'after-change-major-mode-hook #'doom|disable-smartparens-navigate-skip-match) ;; smartparenss conflicts with evil-mode's replace state (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) @@ -167,10 +167,10 @@ fundamental-mode) for performance sake." (when (memq this-command '(eval-expression evil-ex)) (smartparens-mode))) (add-hook 'minibuffer-setup-hook #'doom|init-smartparens-in-eval-expression) - (sp-local-pair 'minibuffer-inactive-mode "'" nil :actions nil) - (sp-local-pair '(xml-mode nxml-mode php-mode) "" - :post-handlers '(("| " "SPC"))) + + (sp-local-pair sp--html-modes "" + :actions '(insert) :post-handlers '(("| " "SPC"))) (sp-local-pair '(js2-mode typescript-mode rjsx-mode rust-mode From 0ee42c1df061b47bef3f884165df385bca42e6bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 15:09:49 +0200 Subject: [PATCH 2138/4235] Improve smartparens+web-mode compatibility + Enables web-mode's autopairing functionality + Prevents duplicate >'s after web-mode autopairing. + Leave longer-than-3-character pairs to smartparens (there was only ) + Remove autopairer. Leave that to snippets (web-mode doesn't support prefixes longer than 3 letters, and is too much of a performance drain to have smartparens support it, so I added a "php" snippet that expands to ). + Tags now auto-close when you finish typing the opening tag. (web-mode-auto-close-style = 2) --- modules/lang/web/+html.el | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index c25b2b4d6..5c8af811e 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -16,7 +16,25 @@ :mode "templates/.+\\.php$" :config (setq web-mode-enable-html-entities-fontification t - web-mode-enable-auto-quoting nil) + web-mode-auto-close-style 2) + + (after! smartparens + ;; let smartparens handle these + (setq web-mode-enable-auto-quoting nil + web-mode-enable-auto-pairing t) + ;; Remove web-mode auto pairs that end with >, because smartparens autopairs + ;; them, causing duplicates. Also remove truncated autopairs, like . + (dolist (alist web-mode-engines-auto-pairs) + (setcdr alist (delq nil + (mapcar (lambda (pair) + (unless (string-match-p "^[a-z-]" (cdr pair)) + (cons (car pair) + (if (equal (substring (cdr pair) -1) ">") + (substring (cdr pair) 0 -1) + (cdr pair))))) + (cdr alist))))) + (setf (alist-get nil web-mode-engines-auto-pairs) nil)) (map! :map web-mode-map (:localleader From 3284356fc2986ecbd651fb06b012b4db43f4b926 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 15:12:46 +0200 Subject: [PATCH 2139/4235] Move git-commit style settings to hook +vc|enforce-git-commit-conventions Also, use fill-column instead of git-commit-fill-column, which magit has deprecated. --- modules/emacs/vc/config.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 5100cbea4..5d57213ef 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -22,10 +22,12 @@ ;; `git-commit-mode' -;; see https://chris.beams.io/posts/git-commit/ -(setq git-commit-fill-column 72 - git-commit-summary-max-length 50 - git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line)) +(defun +vc|enforce-git-commit-conventions () + "See https://chris.beams.io/posts/git-commit/" + (setq fill-column 72 + git-commit-summary-max-length 50 + git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line))) +(add-hook 'git-commit-mode-hook #'+vc|enforce-git-commit-conventions) (when (featurep! :feature evil) (add-hook 'git-commit-mode-hook #'evil-insert-state)) From 6c8df7c6bb8d916e65a787f501204329739d3609 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 15:16:17 +0200 Subject: [PATCH 2140/4235] bin/org-capture: reformat & improve daemon cleanup Ensures the temporary daemon is killed after org-capture is finished. --- bin/org-capture | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/bin/org-capture b/bin/org-capture index 507b02faa..ac70e247a 100755 --- a/bin/org-capture +++ b/bin/org-capture @@ -10,34 +10,33 @@ set -e cleanup() { - emacsclient --eval '(kill-emacs)' + emacsclient --eval '(let (kill-emacs-hook) (kill-emacs))' } # If emacs isn't running, we start a temporary daemon, solely for this window. -daemon= -if ! pgrep emacs >/dev/null; then - emacs --daemon - trap cleanup EXIT INT TERM - daemon=1 +if ! emacsclient -e nil; then + emacs --daemon + trap cleanup EXIT INT TERM + daemon=1 fi # org-capture key mapped to argument flags keys=$(emacsclient -e "(+org-capture-available-keys)" | cut -d '"' -f2) while getopts $keys opt; do - key="\"$opt\"" - break + key="\"$opt\"" + break done shift $((OPTIND-1)) [ -t 0 ] && str="$*" || str=$(cat) if [[ $daemon ]]; then - emacsclient -a "" \ - -c -F '((name . "org-capture") (width . 70) (height . 25) (transient . t))' \ - -e "(+org-capture/open-frame \"$str\" ${key:-nil})" + emacsclient -a "" \ + -c -F '((name . "org-capture") (width . 70) (height . 25) (transient . t))' \ + -e "(+org-capture/open-frame \"$str\" ${key:-nil} t)" else - # Non-daemon servers flicker a lot if frames are created from terminal, so - # we do it internally instead. - emacsclient -a "" \ - -e "(+org-capture/open-frame \"$str\" ${key:-nil})" + # Non-daemon servers flicker a lot if frames are created from terminal, so we + # do it internally instead. + emacsclient -a "" \ + -e "(+org-capture/open-frame \"$str\" ${key:-nil})" fi From 14dfc9fad917778e85c79767e00e29d357886042 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 17:13:23 +0200 Subject: [PATCH 2141/4235] Add FIXMEs to def-setting!'s They will be removed on the 2.1.1 release. --- modules/app/email/autoload/email.el | 1 + modules/feature/lookup/autoload/devdocs.el | 1 + modules/feature/lookup/autoload/docsets.el | 1 + modules/feature/lookup/autoload/lookup.el | 1 + modules/feature/snippets/autoload/settings.el | 1 + modules/tools/ein/autoload.el | 1 + modules/tools/prodigy/autoload.el | 1 + 7 files changed, 7 insertions(+) diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index 232adfdad..7b2f017bc 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -40,6 +40,7 @@ default/fallback account." (setq-default mu4e-context-current context)) context))) +;; FIXME obsolete :email ;;;###autoload (def-setting! :email (label letvars &optional default-p) :obsolete set-email-account! diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el index 6a046c648..5baf61cf4 100644 --- a/modules/feature/lookup/autoload/devdocs.el +++ b/modules/feature/lookup/autoload/devdocs.el @@ -11,6 +11,7 @@ See `devdocs-alist' for the defaults. " (dolist (mode (doom-enlist modes)) (setf (alist-get mode devdocs-alist) docset)))) +;; FIXME obsolete :devdocs ;;;###autoload (def-setting! :devdocs (modes docset) "Map major MODES (one major-mode symbol or a list of them) to a devdocs diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 2255e1662..20996146c 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -30,6 +30,7 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." docsets))))) (add-hook hook fn)))))) +;; FIXME obsolete :docset ;;;###autoload (def-setting! :docset (modes &rest docsets) "Registers a list of DOCSETS (strings) for MODES (either one major mode diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index da7216698..6cbcf3735 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -56,6 +56,7 @@ properties: (add-hook 'xref-backend-functions xref-backend nil t)))))) (add-hook hook fn)))))) +;; FIXME obsolete :lookup ;;;###autoload (def-setting! :lookup (modes &rest plist) :obsolete set-lookup-handlers! diff --git a/modules/feature/snippets/autoload/settings.el b/modules/feature/snippets/autoload/settings.el index b9769afa2..adb9f36da 100644 --- a/modules/feature/snippets/autoload/settings.el +++ b/modules/feature/snippets/autoload/settings.el @@ -9,6 +9,7 @@ can have its own snippets category, if the folder exists." (fset fn (lambda () (yas-activate-extra-mode mode))) (add-hook (intern (format "%s-hook" mode)) fn)))) +;; FIXME obsolete :yas-minor-mode ;;;###autoload (def-setting! :yas-minor-mode (mode) :obsolete set-yas-minor-mode! diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index 303deb947..6a65fcf19 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -1,5 +1,6 @@ ;;; tools/ein/autoload.el -*- lexical-binding: t; -*- +;; FIXME obsolete :ein-notebook-dir ;;;###autoload (def-setting! :ein-notebook-dir (dir) "Set the default directory from where to open Jupyter notebooks." diff --git a/modules/tools/prodigy/autoload.el b/modules/tools/prodigy/autoload.el index 6f27d40df..01d255136 100644 --- a/modules/tools/prodigy/autoload.el +++ b/modules/tools/prodigy/autoload.el @@ -1,5 +1,6 @@ ;;; tools/prodigy/autoload.el -*- lexical-binding: t; -*- +;; FIXME obsolete :service ;;;###autoload (def-setting! :service (&rest plist) "TODO" From d874f628bb0ba0d15469a16728105deee88ae14c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 19:45:24 +0200 Subject: [PATCH 2142/4235] Prefix non-existent module message with Warning: Because it's a warning, not an error, and life goes on. --- core/core-modules.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-modules.el b/core/core-modules.el index b19a58c12..e3d496770 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -278,7 +278,7 @@ to least)." (throw 'doom-modules t)))) (let ((path (doom-module-locate-path category module))) (if (not path) - (message "Couldn't find the %s %s module" category module) + (message "Warning: couldn't find the %s %s module" category module) (let ((key (cons category module))) (doom-module-set category module :flags flags :path path) (push `(let ((doom--current-module ',key)) From e91af200031bee8075749684b2eab260c31be83f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 19:54:50 +0200 Subject: [PATCH 2143/4235] Optimize core-lib & pure module functions And confer module membership check to run-time, rather than compile time. --- core/core-lib.el | 28 ++++++++++++++++------------ core/core-modules.el | 13 +++++++++---- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 35e09fa9b..792aa8932 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -51,6 +51,7 @@ Returns (file-exists-p \"/an/absolute/path\")))) This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." + (declare (pure t) (side-effect-free t)) (cond ((stringp spec) `(file-exists-p ,(if (file-name-absolute-p spec) @@ -72,6 +73,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (t spec))) (defun doom--resolve-hook-forms (hooks) + (declare (pure t) (side-effect-free t)) (cl-loop with quoted-p = (eq (car-safe hooks) 'quote) for hook in (doom-enlist (doom-unquote hooks)) if (eq (car-safe hook) 'quote) @@ -97,24 +99,26 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (defun doom-unquote (exp) "Return EXP unquoted." + (declare (pure t) (side-effect-free t)) (while (memq (car-safe exp) '(quote function)) (setq exp (cadr exp))) exp) (defun doom-enlist (exp) "Return EXP wrapped in a list, or as-is if already a list." + (declare (pure t) (side-effect-free t)) (if (listp exp) exp (list exp))) (defun doom-keyword-intern (str) "Converts STR (a string) into a keyword (`keywordp')." - (or (stringp str) - (signal 'wrong-type-argument (list 'stringp str))) + (declare (pure t) (side-effect-free t)) + (cl-check-type str string) (intern (concat ":" str))) (defun doom-keyword-name (keyword) "Returns the string name of KEYWORD (`keywordp') minus the leading colon." - (or (keywordp keyword) - (signal 'wrong-type-argument (list 'keywordp keyword))) + (declare (pure t) (side-effect-free t)) + (cl-check-type :test keyword) (substring (symbol-name keyword) 1)) (cl-defun doom-files-in @@ -199,17 +203,17 @@ MATCH is a string regexp. Only entries that match it will be included." ;; Macros ;; -(defmacro FILE! () +(defun FILE! () "Return the emacs lisp file this macro is called from." - `(cond ((bound-and-true-p byte-compile-current-file)) - ((stringp (car-safe current-load-list)) (car current-load-list)) - (load-file-name) - (buffer-file-name))) + (cond ((bound-and-true-p byte-compile-current-file)) + (load-file-name) + (buffer-file-name) + ((stringp (car-safe current-load-list)) (car current-load-list)))) -(defmacro DIR! () +(defun DIR! () "Returns the directory of the emacs lisp file this macro is called from." - `(let ((file (FILE!))) - (and file (file-name-directory file)))) + (let ((file (FILE!))) + (and file (file-name-directory file)))) (defmacro λ! (&rest body) "A shortcut for inline interactive lambdas." diff --git a/core/core-modules.el b/core/core-modules.el index e3d496770..14d388334 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -51,12 +51,14 @@ non-nil." (defun doom-module-p (category module) "Returns t if CATEGORY MODULE is enabled (ie. present in `doom-modules')." + (declare (pure t) (side-effect-free t)) (and (hash-table-p doom-modules) (gethash (cons category module) doom-modules) t)) (defun doom-module-get (category module &optional property) "Returns the plist for CATEGORY MODULE. Gets PROPERTY, specifically, if set." + (declare (pure t) (side-effect-free t)) (when-let* ((plist (gethash (cons category module) doom-modules))) (if property (plist-get plist property) @@ -102,7 +104,8 @@ MODULE (symbol). If the category isn't enabled this will always return nil. For finding disabled modules use `doom-module-locate-path'." - (let ((path (doom-module-get category module :path))) + (let ((path (doom-module-get category module :path)) + file-name-handler-alist) (if file (expand-file-name file path) path))) @@ -119,7 +122,8 @@ This doesn't require modules to be enabled. For enabled modules us (setq category (substring (symbol-name category) 1))) (when (and module (symbolp module)) (setq module (symbol-name module))) - (cl-loop for default-directory in doom-modules-dirs + (cl-loop with file-name-handler-alist = nil + for default-directory in doom-modules-dirs for path = (concat category "/" module "/" file) if (file-exists-p path) return (expand-file-name path))) @@ -139,6 +143,7 @@ This doesn't require modules to be enabled. For enabled modules us (defun doom-module-load-path (&optional all-p) "Return a list of absolute file paths to activated modules. If ALL-P is non-nil, return paths of possible modules, activated or otherwise." + (declare (pure t) (side-effect-free t)) (append (if all-p (doom-files-in doom-modules-dirs :type 'dirs @@ -370,8 +375,8 @@ omitted. eg. (featurep! +flag1)" module (car module-pair) submodule (cdr module-pair)))) (if flag - (and (memq flag (doom-module-get module submodule :flags)) t) - (doom-module-p module submodule))) + `(and (memq ',flag (doom-module-get ,module ',submodule :flags)) t) + `(doom-module-p ,module ',submodule))) ;; From 2ad1280e4e2f1e5aa4c36d01e72db2d044a07dbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 19:56:40 +0200 Subject: [PATCH 2144/4235] Add set-irc-server! autodef & move :irc setting --- modules/app/irc/autoload/settings.el | 16 ++++++++++++++++ modules/app/irc/config.el | 5 ----- 2 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 modules/app/irc/autoload/settings.el diff --git a/modules/app/irc/autoload/settings.el b/modules/app/irc/autoload/settings.el new file mode 100644 index 000000000..424a731cd --- /dev/null +++ b/modules/app/irc/autoload/settings.el @@ -0,0 +1,16 @@ +;;; app/irc/autoload/settings.el -*- lexical-binding: t; -*- + +;;;###autodef +(defun set-irc-server! (server letvars) + "Registers an irc SERVER for circe. + +See `circe-network-options' for details." + (after! circe + (push (cons server letvars) circe-network-options))) + +;; FIXME obsolete :irc +;;;###autoload +(def-setting! :irc (server letvars) + :obsolete set-irc-server! + `(after! circe + (push (cons ,server ,letvars) circe-network-options))) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index a75e37bed..3adb8557f 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -36,11 +36,6 @@ See `circe-notifications-watch-strings'.") Useful for ZNC users who want to avoid the deluge of notifications during buffer playback.") -(def-setting! :irc (server letvars) - "Registers an irc server for circe." - `(after! circe - (push (cons ,server ,letvars) circe-network-options))) - (defvar +irc--defer-timer nil) (defsubst +irc--pad (left right) From e99ae5382ca35d4eec49ad0525f8f63468ad5390 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 19:58:25 +0200 Subject: [PATCH 2145/4235] Refactor package! macro And have :ignore and :freeze be evaluated during package management, rather than during macro expansion/compile time. Also gives doom-package-prop a third, boolean argument. If non-nil, `eval' the return value. --- core/autoload/packages.el | 15 +++++++------ core/core-packages.el | 45 ++++++++++++++++++--------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 2eb01150d..804ed62c4 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -88,11 +88,12 @@ list of the package." (list name old-version new-version))))) ;;;###autoload -(defun doom-package-prop (name prop) +(defun doom-package-prop (name prop &optional eval) "Return PROPerty in NAME's plist." (cl-check-type name symbol) (cl-check-type prop keyword) - (plist-get (cdr (assq name doom-packages)) prop)) + (let ((value (plist-get (cdr (assq name doom-packages)) prop))) + (if eval (eval value) value))) ;;;###autoload (defun doom-package-different-backend-p (name) @@ -164,9 +165,9 @@ files." if (and (or (not backend) (eq (doom-package-backend sym t) backend)) (or (eq ignored 'any) - (if ignored - (plist-get plist :ignore) - (not (plist-get plist :ignore)))) + (let* ((form (plist-get plist :ignore)) + (value (eval form))) + (if ignored value (not value)))) (or (eq disabled 'any) (if disabled (plist-get plist :disable) @@ -236,9 +237,9 @@ Used by `doom-packages-update'." (let (quelpa-pkgs elpa-pkgs) ;; Separate quelpa from elpa packages (dolist (pkg (mapcar #'car package-alist)) - (when (and (or (not (doom-package-prop pkg :freeze)) + (when (and (or (not (doom-package-prop pkg :freeze 'eval)) include-frozen-p) - (not (doom-package-prop pkg :ignore)) + (not (doom-package-prop pkg :ignore 'eval)) (not (doom-package-different-backend-p pkg))) (push pkg (if (eq (doom-package-backend pkg) 'quelpa) diff --git a/core/core-packages.el b/core/core-packages.el index cf4fc37fe..762277b02 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -171,7 +171,7 @@ them." ;; Module package macros ;; -(defmacro package! (name &rest plist) +(cl-defmacro package! (name &rest plist &key recipe pin disable _ignore _freeze) "Declares a package and how to install it (if applicable). This macro is declarative and does not load nor install packages. It is used to @@ -200,30 +200,27 @@ Returns t if package is successfully registered, and nil if it was disabled elsewhere." (declare (indent defun)) (doom--assert-stage-p 'packages #'package!) - (let* ((old-plist (cdr (assq name doom-packages))) - (pkg-recipe (or (plist-get plist :recipe) - (and old-plist (plist-get old-plist :recipe)))) - (pkg-pin (or (plist-get plist :pin) - (and old-plist (plist-get old-plist :pin)))) - (pkg-disable (or (plist-get plist :disable) - (and old-plist (plist-get old-plist :disable))))) - (when pkg-recipe - (when (= 0 (% (length pkg-recipe) 2)) - (setq plist (plist-put plist :recipe (cons name pkg-recipe)))) - (when pkg-pin - (setq plist (plist-put plist :pin nil)))) - (dolist (prop '(:ignore :freeze)) - (when-let* ((val (plist-get plist prop))) - (setq plist (plist-put plist prop (eval val))))) - (when (file-in-directory-p (or (bound-and-true-p byte-compile-current-file) - load-file-name) - doom-private-dir) + (let ((plist (append plist (cdr (assq name doom-packages))))) + (when recipe + (when (cl-evenp (length recipe)) + (setq plist (plist-put plist :recipe (cons name recipe)))) + (setq pin nil + plist (plist-put plist :pin nil))) + (when (file-in-directory-p (FILE!) doom-private-dir) (setq plist (plist-put plist :private t))) - `(progn - ,(if pkg-disable `(add-to-list 'doom-disabled-packages ',name nil #'eq)) - ,(if pkg-pin `(setf (alist-get ',name package-pinned-packages) ,pkg-pin)) - (setf (alist-get ',name doom-packages) ',plist) - (not (memq ',name doom-disabled-packages))))) + (let (newplist) + (while plist + (unless (null (cadr plist)) + (push (cadr plist) newplist) + (push (car plist) newplist)) + (pop plist) + (pop plist)) + (setq plist newplist)) + (macroexp-progn + (append (if disable `((add-to-list 'doom-disabled-packages ',name nil #'eq))) + (if pin `((setf (alist-get ',name package-pinned-packages) ,pin))) + `((setf (alist-get ',name doom-packages) ',plist) + (not (memq ',name doom-disabled-packages))))))) (defmacro packages! (&rest packages) "A convenience macro like `package!', but allows you to declare multiple From ecdde3f3775938d7d6c70bdaec32fc2a9e7c482d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 19:59:35 +0200 Subject: [PATCH 2146/4235] Fix void-variable: use-package-defaults error In case use-package hasn't been loaded by this point (if the config has been fulled byte-compiled). --- core/core-cli.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-cli.el b/core/core-cli.el index 0321c6687..73aa8241d 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -750,6 +750,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (message "No targets to %scompile" (if recompile-p "re" ""))) (cl-return-from 'byte-compile)) (condition-case e + (require 'use-package) (let ((use-package-defaults use-package-defaults) (use-package-expand-minimally t)) ;; Prevent packages from being loaded at compile time if they From 335bef85fdc01ac6000d084f1516744206a7eb53 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 20:00:04 +0200 Subject: [PATCH 2147/4235] Remove unused memoize library --- core/autoload/memoize.el | 31 ------------------------------- 1 file changed, 31 deletions(-) delete mode 100644 core/autoload/memoize.el diff --git a/core/autoload/memoize.el b/core/autoload/memoize.el deleted file mode 100644 index 8d82c3d77..000000000 --- a/core/autoload/memoize.el +++ /dev/null @@ -1,31 +0,0 @@ -;;; core/autoload/memoize.el -*- lexical-binding: t; -*- - -;;;###autoload -(defvar doom-memoized-table (make-hash-table :test 'equal :size 10) - "A lookup table containing memoized functions. The keys are argument lists, -and the value is the function's return value.") - -;;;###autoload -(defun doom-memoize (name) - "Memoizes an existing function. NAME is a symbol." - (let ((func (symbol-function name))) - (put name 'function-documentation - (concat (documentation func) " (memoized)")) - (fset name - `(lambda (&rest args) - (let ((key (cons ',name args))) - (or (gethash key doom-memoized-table) - (puthash key (apply ',func args) - doom-memoized-table))))))) - -;;;###autoload -(defmacro def-memoized! (name arglist &rest body) - "Create a memoize'd function. NAME, ARGLIST, DOCSTRING and BODY -have the same meaning as in `defun'." - (declare (indent defun) (doc-string 3)) - `(,(if (bound-and-true-p byte-compile-current-file) - 'with-no-warnings - 'progn) - (defun ,name ,arglist ,@body) - (doom-memoize ',name))) - From f784ed3cbdc16b80876b85da0fe97e548929863e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 20:00:31 +0200 Subject: [PATCH 2148/4235] Update set-docset! documentation And remove redundant documentation for obsolete :docset. --- modules/feature/lookup/autoload/docsets.el | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 20996146c..6293b6f29 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -9,9 +9,13 @@ ;;;###autodef (defun set-docset! (modes &rest docsets) - "Registers a list of DOCSETS (strings) for MODES (either one major mode + "Registers a list of DOCSETS (strings) for MODES (either one major/minor mode symbol or a list of them). +If MODES is a minor mode, you can use :add or :remove as the first element of +DOCSETS, to instruct it to append (or remove) those from the docsets already set +by a major-mode, if any. + Used by `+lookup/in-docsets' and `+lookup/documentation'." (declare (indent defun)) (dolist (mode (doom-enlist modes)) @@ -33,14 +37,6 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." ;; FIXME obsolete :docset ;;;###autoload (def-setting! :docset (modes &rest docsets) - "Registers a list of DOCSETS (strings) for MODES (either one major mode -symbol or a list of them). - -If MODES is a minor mode, you can use :add or :remove as the first element of -DOCSETS, to instruct it to append (or remove) those from the docsets already set -by a major-mode, if any. - -Used by `+lookup/in-docsets' and `+lookup/documentation'." :obsolete set-docset! `(set-docset! ,modes ,@docsets)) From aa70213f870fef940e435140475f3e3dd0f4e7c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 20:03:17 +0200 Subject: [PATCH 2149/4235] Fix "Keyword argument :when not one of" error Occurs when expanding file templates with a :when clause. +file-templates--expand wasn't anticipating it; throwing that error. --- modules/feature/file-templates/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index ce4976584..731edb9bb 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -58,7 +58,7 @@ these properties: ;; ;;;###autoload -(cl-defun +file-templates--expand (pred &key project mode trigger ignore) +(cl-defun +file-templates--expand (pred &key project mode trigger ignore _when) "Auto insert a yasnippet snippet into current file and enter insert mode (if evil is loaded and enabled)." (when (and pred (not ignore)) From 196638bf47f968c6f5a4f9ecc72eed6251446560 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 20:11:57 +0200 Subject: [PATCH 2150/4235] Improve handling for arbitrary package errors e.g. if the package doesn't exist, it shouldn't simply die. --- core/autoload/packages.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 804ed62c4..13c03d121 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -14,15 +14,17 @@ table)))) (defmacro doom--condition-case! (&rest body) - `(condition-case-unless-debug ex + `(condition-case-unless-debug e (progn ,@body) ('user-error - (print! (bold (red " NOTICE: %s" ex)))) + (print! (bold (red " NOTICE: %s" e)))) ('file-error - (print! (bold (red " FILE ERROR: %s" (error-message-string ex)))) + (print! (bold (red " FILE ERROR: %s" (error-message-string e)))) (print! " Trying again...") (quiet! (doom-refresh-packages-maybe t)) - ,@body))) + ,@body) + ('error + (print! (bold (red " FATAL ERROR: %s\n Run again with the -d flag for details" e)))))) (defun doom--refresh-pkg-cache () "Clear the cache for `doom-refresh-packages-maybe'." From 30f1f8ab0cdbde69b8dbdbdd47c808538c40a487 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 22:33:30 +0200 Subject: [PATCH 2151/4235] tools/wakatime: fix lazy loader Also the cause of errors during package management, because after-find-file was being advised too early. Reported by @freddian --- modules/tools/wakatime/autoload.el | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 05e415899..9441be9d0 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -4,10 +4,7 @@ "Where the wakatime api key is cached.") ;;;###autoload -(add-hook 'doom-after-switch-buffer-hook #'+wakatime|autostart) - -;;;###autoload -(advice-add 'after-find-file :before #'wakatime|autostart) +(add-hook 'doom-post-init-hook #'+wakatime|delayed-autostart) ;;;###autoload (defun +wakatime/setup () @@ -40,5 +37,13 @@ warning)." (global-wakatime-mode +1) (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so (only necessary once).")) ;; - (remove-hook 'doom-after-switch-buffer-hook #'+wakatime|autostart) + (remove-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) (advice-remove 'after-find-file #'wakatime|autostart)) + +;;;###autoload +(defun +wakatime|delayed-autostart (&rest _) + "Lazily initialize `wakatime-mode' until the next time you switch buffers or +open a file." + (add-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) + ;; this is necessary in case the user opens emacs with file arguments + (advice-add 'after-find-file :before #'wakatime|autostart)) From 0f90972ba9e7192acc4df6562c01177f5102c37e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 22:36:27 +0200 Subject: [PATCH 2152/4235] tools/wakatime: fix typo in hook name --- modules/tools/wakatime/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 9441be9d0..6fa68bb7e 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -38,7 +38,7 @@ warning)." (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so (only necessary once).")) ;; (remove-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) - (advice-remove 'after-find-file #'wakatime|autostart)) + (advice-remove 'after-find-file #'+wakatime|autostart)) ;;;###autoload (defun +wakatime|delayed-autostart (&rest _) @@ -46,4 +46,4 @@ warning)." open a file." (add-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) ;; this is necessary in case the user opens emacs with file arguments - (advice-add 'after-find-file :before #'wakatime|autostart)) + (advice-add 'after-find-file :before #'+wakatime|autostart)) From 094735867ca7d6e061e135b712d29f07f9fed262 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 22:39:22 +0200 Subject: [PATCH 2153/4235] Fix byte-compiler Because I did a silly. So silly. --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 73aa8241d..92059f919 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -749,8 +749,8 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (message "Couldn't find any valid targets") (message "No targets to %scompile" (if recompile-p "re" ""))) (cl-return-from 'byte-compile)) + (require 'use-package) (condition-case e - (require 'use-package) (let ((use-package-defaults use-package-defaults) (use-package-expand-minimally t)) ;; Prevent packages from being loaded at compile time if they From 9ca73ee30eb404110e8dfbbea1a06ee7171a8ff6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 23:01:04 +0200 Subject: [PATCH 2154/4235] Fix wakatime api key void-variable errors Because the api-key was saved to the elisp cache without quotes, the key was read like a variable symbol. This is why we can't have nice things. Reported by @freddian --- modules/tools/wakatime/autoload.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 6fa68bb7e..ef616b038 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -20,7 +20,7 @@ changes." (user-error "No api key was received.")) (setq wakatime-api-key api-key) (with-temp-file +wakatime-api-file - (princ `(setq wakatime-api-key ,api-key) + (prin1 `(setq wakatime-api-key ,wakatime-api-key) (current-buffer))) (require 'wakatime-mode) (global-wakatime-mode +1))) @@ -30,9 +30,8 @@ changes." "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." (interactive) - (when (and (not (bound-and-true-p wakatime-api-key)) - (file-exists-p +wakatime-api-file)) - (load +wakatime-api-file nil t)) + (unless (bound-and-true-p wakatime-api-key) + (ignore-errors (load +wakatime-api-file t t))) (if (bound-and-true-p wakatime-api-key) (global-wakatime-mode +1) (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so (only necessary once).")) From 3e2b19b5bf8c1c4b32918c4f6afeed982ab6dd12 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 23:03:17 +0200 Subject: [PATCH 2155/4235] Improve feedback from wakatime-mode setup/init --- modules/tools/wakatime/autoload.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index ef616b038..1e630398a 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -23,7 +23,8 @@ changes." (prin1 `(setq wakatime-api-key ,wakatime-api-key) (current-buffer))) (require 'wakatime-mode) - (global-wakatime-mode +1))) + (global-wakatime-mode +1) + (message "Wakatime enabled. You're good to go!"))) ;;;###autoload (defun +wakatime|autostart (&rest _) @@ -34,7 +35,7 @@ warning)." (ignore-errors (load +wakatime-api-file t t))) (if (bound-and-true-p wakatime-api-key) (global-wakatime-mode +1) - (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so (only necessary once).")) + (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so.")) ;; (remove-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) (advice-remove 'after-find-file #'+wakatime|autostart)) From c8de34fb55d8739df3dde0dad5a7114b1034a63e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Jun 2018 23:22:25 +0200 Subject: [PATCH 2156/4235] Add +wakatime-hide-filenames option When enabled, wakatime will obfuscate filenames, hiding file information from your activity. --- modules/tools/wakatime/autoload.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 1e630398a..d030e85fe 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -3,6 +3,9 @@ (defvar +wakatime-api-file (concat doom-cache-dir "wakatime.el") "Where the wakatime api key is cached.") +(defvar +wakatime-hide-filenames nil + "If non-nil, obfuscate files and only show what projects you're working on.") + ;;;###autoload (add-hook 'doom-post-init-hook #'+wakatime|delayed-autostart) @@ -47,3 +50,9 @@ open a file." (add-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) ;; this is necessary in case the user opens emacs with file arguments (advice-add 'after-find-file :before #'+wakatime|autostart)) + +(defun +wakatime*append-hide-filenames-option (ret) + "Enables filename obfuscation in wakatime if `+wakatime-hide-filenames' is +non-nil." + (concat ret (if +wakatime-hide-filenames " --hide-filenames"))) +(advice-add #'wakatime-client-command :filter-return #'+wakatime*append-hide-filenames-option ) From 6a15db7e00f0107eab9f4e18758f0eaa70314a66 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Mon, 25 Jun 2018 14:15:00 +0800 Subject: [PATCH 2157/4235] fix disable ivy fuzzy in swiper and counsel-grep --- modules/completion/ivy/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index b837fc80d..13d5f6f34 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -216,7 +216,8 @@ immediately runs it on the current candidate (ending the ivy session)." '((counsel-ag . ivy--regex-plus) (counsel-rg . ivy--regex-plus) (counsel-pt . ivy--regex-plus) - (counsel-grep-or-swiper . ivy--regex-plus) + (counsel-grep . ivy--regex-plus) + (swiper . ivy--regex-plus) (t . ivy--regex-fuzzy)) ivy-initial-inputs-alist nil)) From 595d9e593c1b3d96ecbd892745402996692b619c Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Mon, 25 Jun 2018 17:41:52 +0530 Subject: [PATCH 2158/4235] doctor: Fix error with markdown --- modules/lang/markdown/doctor.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/markdown/doctor.el b/modules/lang/markdown/doctor.el index 8224429f9..353453365 100644 --- a/modules/lang/markdown/doctor.el +++ b/modules/lang/markdown/doctor.el @@ -3,4 +3,4 @@ (when (featurep! +pandoc) (unless (executable-find "pandoc") - (warn! "Couldn't find pandoc, markdown-mode may have issues")) + (warn! "Couldn't find pandoc, markdown-mode may have issues"))) From 106062da0df76e3b0157eb435261689f08da724c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 14:48:30 +0200 Subject: [PATCH 2159/4235] Fix ivy posframe The display function was being set on ivy-display-functions-props. The correct variable for it is ivy-display-functions-alist. Reported by randoom in discord. --- modules/completion/ivy/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index b837fc80d..eff326086 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -200,8 +200,9 @@ immediately runs it on the current candidate (ending the ivy session)." 'ivy-posframe-display-at-window-bottom-left 'ivy-posframe-display-at-window-center '+ivy-display-at-frame-center-near-bottom)) - (push (cons fn '(:cleanup ivy-posframe-cleanup)) ivy-display-functions-props)) - (push '(t . +ivy-display-at-frame-center-near-bottom) ivy-display-functions-props)) + (push (cons fn '(:cleanup ivy-posframe-cleanup)) ivy-display-functions-props))) + ;; default to posframe display function + (setf (alist-get t ivy-display-functions-alist) #'+ivy-display-at-frame-center-near-bottom) ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) From a1d02749e513e350229e99d0800469dfe1d31ce8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 15:39:38 +0200 Subject: [PATCH 2160/4235] Rethink how evil-collection is (lazy) loaded This fixes a keybinding precedence issue that prevented users from customizing evil-collection's keybinds, because evil-collection would always run last, *after* user customizations. This precedence problem occurs because evil-collection was lazy loaded haphazardly. This isn't the most elegant solution, but I can live with it. --- modules/feature/evil/config.el | 225 ++++++++++++++++++++++++++++----- 1 file changed, 190 insertions(+), 35 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f5d6ebb66..1c1bfd00b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -3,39 +3,6 @@ ;; I'm a vimmer at heart. Its modal philosophy suits me better, and this module ;; strives to make Emacs a much better vim than vim was. -(defvar +evil-collection-disabled-list - '(kotlin-mode ; doesn't do anything useful - simple - ;; we'll do these ourselves - anaconda-mode - company - dired - helm - ivy - minibuffer - ruby-mode - slime) - "A list of `evil-collection' modules to disable. See the definition of this -variable for an explanation of the defaults (in comments). See -`evil-collection-mode-list' for a list of available options.") - - -(def-package! evil-collection - :when (featurep! +everywhere) - :defer 1 - :after-call post-command-hook - :preface - ;; must be set before evil/evil-collection is loaded - (setq evil-want-integration nil - evil-collection-company-use-tng nil) - :config - (dolist (sym +evil-collection-disabled-list) - (setq evil-collection-mode-list - (funcall (if (symbolp sym) #'delq #'delete) - sym evil-collection-mode-list))) - (evil-collection-init)) - - (def-package! evil :init (setq evil-want-C-u-scroll t @@ -60,7 +27,9 @@ variable for an explanation of the defaults (in comments). See evil-normal-state-cursor 'box evil-emacs-state-cursor '(box +evil-emacs-cursor) evil-insert-state-cursor 'bar - evil-visual-state-cursor 'hollow) + evil-visual-state-cursor 'hollow + ;; must be set before evil/evil-collection is loaded + evil-want-integration (not (featurep! +everywhere))) :config (add-hook 'doom-post-init-hook #'evil-mode) @@ -169,7 +138,193 @@ variable for an explanation of the defaults (in comments). See (evil-set-command-properties '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t)) + '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t) + + ;; `evil-collection' + ;; *Truly* lazy-load evil-collection's modules, and do ourselves, here, + ;; instead of lazy-loading evil-collection.el so we can ensure `after!' blocks + ;; in private configs happen after evil-collection has finished. + ;; + ;; Also so we can be very selective about what modules it loads. + (when (featurep! +everywhere) + (after! eldoc + (eldoc-add-command-completions "evil-window-")) + + (after! comint + (evil-define-key* 'normal comint-mode-map + (kbd "C-d") #'evil-scroll-down + (kbd "C-n") #'comint-next-input + (kbd "C-p") #'comint-previous-input + (kbd "gj") #'comint-next-input + (kbd "gk") #'comint-previous-input + (kbd "]") #'comint-next-input + (kbd "[") #'comint-previous-input) + (evil-define-key* 'insert comint-mode-map + (kbd "") #'comint-previous-input + (kbd "") #'comint-next-input)) + + (after! cus-edit + (evil-set-initial-state 'Custom-mode 'normal) + (evil-define-key* 'motion custom-mode-map + (kbd "") 'widget-forward + (kbd "S-") 'widget-backward + (kbd "") 'widget-backward + (kbd "]") 'widget-forward + (kbd "[") 'widget-backward + (kbd "C-n") 'widget-forward + (kbd "C-p") 'widget-backward + "gj" 'widget-forward + "gk" 'widget-backward) + (evil-define-key* 'normal custom-mode-map + (kbd "") 'Custom-newline + (kbd "C-o") 'Custom-goto-parent + "^" 'Custom-goto-parent + "<" 'Custom-goto-parent + ;; quit + "q" 'Custom-buffer-done + "ZQ" 'evil-quit + "ZZ" 'Custom-buffer-done)) + + (after! help + (evil-set-initial-state 'help-mode 'normal) + (evil-define-key* 'normal help-mode-map + ;; motion + (kbd "SPC") 'scroll-up-command + (kbd "S-SPC") 'scroll-down-command + (kbd "C-f") 'scroll-up-command + (kbd "C-b") 'scroll-down-command + (kbd "") 'forward-button + (kbd "") 'backward-button + (kbd "C-o") 'help-go-back + (kbd "C-i") 'help-go-forward + ;; TODO: Enable more help-go-* bindings? + ;; "gj" 'help-go-forward + ;; "gk" 'help-go-back + ;; "\C-j" 'help-go-forward + ;; "\C-k" 'help-go-back + ;; The following bindings don't do what they are supposed to. "go" should + ;; open in the same window and "gO" should open in a different one. + "go" 'push-button + "gO" 'push-button + "g?" 'describe-mode + "gr" 'revert-buffer + "<" 'help-go-back + ">" 'help-go-forward + "r" 'help-follow + ;; quit + "q" 'quit-window + "ZQ" 'evil-quit + "ZZ" 'quit-window)) + + (add-transient-hook! 'image-mode (evil-collection-init 'image)) + (add-transient-hook! 'emacs-lisp-mode (evil-collection-init 'elisp-mode)) + + (defvar evil-collection-mode-list + '(ace-jump-mode + ag + alchemist + ;; anaconda-mode + arc-mode + avy + bookmark + (buff-menu "buff-menu") + calc + calendar + cider + cmake-mode + ;; comint + ;; company + compile + ;; custom + cus-theme + daemons + debbugs + debug + diff-mode + ;; dired + doc-view + edebug + ediff + ;; eldoc + ;; elfeed + ;; elisp-mode + elisp-refs + emms + epa + ;; ert + eshell + eval-sexp-fu + etags-select + eww + flycheck + ;; free-keys + geiser + ggtags + git-timemachine + go-mode + ;; help + guix + ;; helm + ibuffer + ;; image + image+ + indium + info + ;; ivy + js2-mode + log-view + lsp-ui-imenu + lua-mode + ;; kotlin-mode + macrostep + man + magit + mu4e + mu4e-conversation + neotree + notmuch + nov + ;; occur is in replace.el which was built-in before Emacs 26. + (occur ,(if EMACS26+ 'replace "replace")) + outline + p4 + ;; (package-menu package) + paren + pass + (pdf pdf-view) + popup + proced + prodigy + profiler + python + quickrun + racer + realgud + reftex + rjsx-mode + robe + ;; ruby-mode + rtags + ;; simple + ;; slime + (term term ansi-term multi-term) + tide + transmission + typescript-mode + vc-annotate + vdiff + view + vlf + which-key + wdired + wgrep + woman + xref + (ztree ztree-diff))) + + (dolist (req evil-collection-mode-list) + (with-eval-after-load (car (doom-enlist req)) + (evil-collection-init (list req)))))) ;; From de0869c9760b94d40f0674beb14595b7259fa5db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 15:43:23 +0200 Subject: [PATCH 2161/4235] Ensure elisp-mode code is lazy loaded This prevents the unnecessary eager-loading of many autodefs (and evil-collection-elisp-mode), since the elisp-mode package is always available at startup. --- modules/lang/emacs-lisp/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 91de77125..a39f2da66 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,8 +1,8 @@ ;;; lang/emacs-lisp/config.el -*- lexical-binding: t; -*- -(def-package! elisp-mode ; built-in - :mode ("/Cask$" . emacs-lisp-mode) - :config +(add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) + +(defun +emacs-lisp|init () (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) @@ -61,6 +61,8 @@ return t)) (flycheck-mode -1)))) +(add-transient-hook! 'emacs-lisp-mode (+emacs-lisp|init)) + ;; ;; Plugins From afa1fe3fc55bbb604550a0f98cac85c8dac6b4ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 15:45:24 +0200 Subject: [PATCH 2162/4235] Phase out meta keybinds in helm+evil integration We want to generally avoid meta. M-RET is an exception, and is commonly used as an "alternate open" key. --- modules/completion/helm/config.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index e4a36f758..27e17e721 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -179,11 +179,11 @@ (map! (:after helm :map helm-map - :ni "M-[" #'helm-previous-source - :ni "M-]" #'helm-next-source - :ni "M-l" #'helm-execute-persistent-action - :ni "M-j" #'helm-next-line - :ni "M-k" #'helm-previous-line + :ni "C-S-p" #'helm-previous-source + :ni "C-S-n" #'helm-next-source + :ni "C-l" #'helm-execute-persistent-action + :ni "C-j" #'helm-next-line + :ni "C-k" #'helm-previous-line :ni "C-f" #'helm-next-page :ni "C-b" #'helm-previous-page :n [tab] #'helm-select-action ; TODO: Ivy has "ga". @@ -206,7 +206,7 @@ :map (helm-find-files-map helm-read-file-map) :n "go" #'helm-ff-run-switch-other-window :n "/" #'helm-ff-run-find-sh-command - :ni "S-" #'helm-ff-run-switch-other-window + :ni "M-" #'helm-ff-run-switch-other-window :ni "M-h" #'helm-find-files-up-one-level :n "=" #'helm-ff-run-ediff-file :n "%" #'helm-ff-run-query-replace-regexp @@ -219,16 +219,16 @@ :map helm-buffer-map :n "go" #'helm-buffer-switch-other-window :n "gO" #'display-buffer - :ni "S-" #'helm-buffer-switch-other-window - :ni "M-" #'display-buffer + :ni "M-" #'helm-buffer-switch-other-window + :ni "" #'display-buffer :n "=" #'helm-buffer-run-ediff :n "%" #'helm-buffer-run-query-replace-regexp :n "D" #'helm-buffer-run-kill-persistent) ; Ivy has "D". (:after helm-regexp :map helm-moccur-map :n "go" #'helm-moccur-run-goto-line-ow - :ni "S-" #'helm-moccur-run-goto-line-ow) + :ni "M-" #'helm-moccur-run-goto-line-ow) (:after helm-grep :map helm-grep-map :n "go" #'helm-grep-run-other-window-action - :ni "S-" #'helm-grep-run-other-window-action))) + :ni "M-" #'helm-grep-run-other-window-action))) From b3fa3cda28b688e3cfc363da24e57872c2f0ac3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 15:46:31 +0200 Subject: [PATCH 2163/4235] Lazy load which-key GOTTA GO FAST --- core/core-keybinds.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 578c9f4a7..6c721ebcb 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -46,18 +46,21 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; (def-package! which-key - :config + :defer 1 + :after-call pre-command-hook + :init (setq which-key-sort-order #'which-key-prefix-then-key-order which-key-sort-uppercase-first nil which-key-add-column-padding 1 which-key-max-display-columns nil which-key-min-display-lines 6 which-key-side-window-slot -10) + :config ;; embolden local bindings (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) (setq-hook! 'which-key-init-buffer-hook line-spacing 3) - (add-hook 'doom-post-init-hook #'which-key-mode)) + (which-key-mode +1)) (def-package! hydra @@ -117,10 +120,11 @@ If any hook returns non-nil, all hooks after it are ignored.") KEYS should be a string in kbd format. DESC should be a string describing what KEY does. MODES should be a list of major mode symbols." - (if modes - (dolist (mode modes) - (which-key-add-major-mode-key-based-replacements mode key desc)) - (which-key-add-key-based-replacements key desc))) + (after! which-key + (if modes + (dolist (mode modes) + (which-key-add-major-mode-key-based-replacements mode key desc)) + (which-key-add-key-based-replacements key desc)))) (defun doom--keyword-to-states (keyword) From 1d7782aea3691714d0f5d71f26e745176b83b4dc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 15:47:29 +0200 Subject: [PATCH 2164/4235] Ensure paren isn't loaded at startup post-command-hook would trigger too soon, for some reason. --- 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 5da96c06e..63c280a9d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -310,7 +310,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; highlight matching delimiters (def-package! paren - :after-call post-command-hook + :after-call (after-find-file doom-before-switch-buffer-hook) :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t From 8a4f15b01c0951b8d3efe54848843346ba241aae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 15:54:38 +0200 Subject: [PATCH 2165/4235] Refactor smartparens default rules Move them to config/default, but move single-lang-specific ones to their respective modules. --- core/core-editor.el | 18 ++++-------------- modules/config/default/config.el | 16 ++++++++++++---- modules/lang/elixir/config.el | 3 +++ modules/lang/latex/config.el | 3 +++ modules/lang/lua/config.el | 3 +++ 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 9b0ea39ff..abd3a6e81 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -157,10 +157,7 @@ fundamental-mode) for performance sake." sp-navigate-consider-sgml-tags nil)) (add-hook 'after-change-major-mode-hook #'doom|disable-smartparens-navigate-skip-match) - ;; smartparenss conflicts with evil-mode's replace state - (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) - (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) - + ;; autopairing in `eval-expression' and `evil-ex' (defun doom|init-smartparens-in-eval-expression () "Enable `smartparens-mode' in the minibuffer, during `eval-expression' or `evil-ex'." @@ -169,16 +166,9 @@ fundamental-mode) for performance sake." (add-hook 'minibuffer-setup-hook #'doom|init-smartparens-in-eval-expression) (sp-local-pair 'minibuffer-inactive-mode "'" nil :actions nil) - (sp-local-pair sp--html-modes "" - :actions '(insert) :post-handlers '(("| " "SPC"))) - - (sp-local-pair - '(js2-mode typescript-mode rjsx-mode rust-mode - c-mode c++-mode objc-mode java-mode php-mode - css-mode scss-mode less-css-mode stylus-mode) - "/*" "*/" - :actions '(insert) - :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") ("\n* ||\n*/[i][d-2]" "*"))) + ;; smartparenss conflicts with evil-mode's replace state + (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) + (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) (smartparens-global-mode +1)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 272ad49d7..d6822a1fc 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -44,10 +44,6 @@ (sp-local-pair 'ruby-mode "{" "}" :pre-handlers '(:rem sp-ruby-prehandler) :post-handlers '(:rem sp-ruby-posthandler)) - ;; sp's default rules for these modes are obnoxious, so disable them - (provide 'smartparens-elixir) - (provide 'smartparens-latex) - (provide 'smartparens-lua) ;; Expand {|} => { | } ;; Expand {|} => { @@ -63,6 +59,18 @@ (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) "[" nil :post-handlers '(:rem ("| " "SPC"))) + ;; Reasonable default pairs for comments + (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) + "" :actions '(insert) :post-handlers '(("| " "SPC"))) + + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode + c-mode c++-mode objc-mode java-mode php-mode + css-mode scss-mode less-css-mode stylus-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") ("\n* ||\n*/[i][d-2]" "*"))) + ;; Highjacks backspace to: ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) ;; b) delete space-indented `tab-width' steps at a time diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index eb0f7e857..f367ddf29 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -2,6 +2,9 @@ (def-package! elixir-mode :defer t + :init + ;; disable default smartparens config + (provide 'smartparens-elixir) :config ;; ...and only complete the basics (after! smartparens diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 6030884dc..9dd2e534d 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -14,6 +14,9 @@ ;; Plugins ;; +;; sp's default rules are obnoxious, so disable them +(provide 'smartparens-latex) + (after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index db48750f7..9774638b2 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -1,5 +1,8 @@ ;;; lang/lua/config.el -*- lexical-binding: t; -*- +;; sp's default rules are obnoxious, so disable them +(provide 'smartparens-lua) + (after! lua-mode (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) From 8fcc12ed08543713bf654cb37f76c85d1b08c46e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 19:28:09 +0200 Subject: [PATCH 2166/4235] Add +popup-display-buffer-fullframe Adds support for the saved-wconf window parameter. If a popup possesses a window configuration in this parameter, it will be restored when the popup (or its popup buffer) is killed. --- modules/ui/popup/autoload/popup.el | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 06f91e670..417a5cba2 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -70,7 +70,9 @@ and enables `+popup-buffer-mode'." (funcall autosave buffer)))) (with-current-buffer buffer (save-buffer))) (let ((ignore-window-parameters t)) - (delete-window window)) + (if-let* ((wconf (window-parameter window 'saved-wconf))) + (set-window-configuration wconf) + (delete-window window))) (unless (window-live-p window) (with-current-buffer buffer (set-buffer-modified-p nil) @@ -376,6 +378,19 @@ the message buffer in a popup window." prevent the popup(s) from messing up the UI (or vice versa)." (save-popups! (apply orig-fn args))) +;;;###autoload +(defun +popup-display-buffer-fullframe (buffer alist) + "Displays the buffer fullscreen." + (let ((wconf (current-window-configuration))) + (when-let (window (or (display-buffer-reuse-window buffer alist) + (display-buffer-same-window buffer alist) + (display-buffer-pop-up-window buffer alist) + (display-buffer-use-some-window buffer alist))) + (set-window-parameter window 'saved-wconf wconf) + (add-to-list 'window-persistent-parameters '(saved-wconf . t)) + (delete-other-windows window) + window))) + ;;;###autoload (defun +popup-display-buffer-stacked-side-window (buffer alist) "A `display-buffer' action that serves as an alternative to From 0dc0ccc63e7e7d866da3c770824dee48783a4cda Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 19:35:59 +0200 Subject: [PATCH 2167/4235] Refactor +popup*org-pop-to-buffer Simplify pop-to-buffer call. --- modules/ui/popup/+hacks.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 1314d5f6d..b8c4fb0cc 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -234,10 +234,7 @@ instead of switch-to-buffer-*." (defun +popup*org-pop-to-buffer (orig-fn buf &optional norecord) "Use `pop-to-buffer' instead of `switch-to-buffer' to open buffer.'" (if +popup-mode - (pop-to-buffer - (cond ((stringp buf) (get-buffer-create buf)) - ((bufferp buf) buf) - (t (error "Invalid buffer %s" buf)))) + (pop-to-buffer buf nil norecord) (funcall orig-fn buf norecord))) (advice-add #'org-switch-to-buffer-other-window :around #'+popup*org-pop-to-buffer) From cba5270a7c9149cb0e9e1a25eb44d95eebbb8053 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 19:37:25 +0200 Subject: [PATCH 2168/4235] Fix sp-elixir-skip-def-p void-function error #712 --- modules/lang/elixir/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index f367ddf29..8f0fae3e3 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -12,7 +12,6 @@ (sp-local-pair "do" "end" :when '(("RET" "")) :unless '(sp-in-comment-p sp-in-string-p) - :skip-match 'sp-elixir-skip-def-p :post-handlers '("||\n[i]")) (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) From 24fbf1bf0cc58d38773b87e832ed865f71668fb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Jun 2018 19:38:32 +0200 Subject: [PATCH 2169/4235] Complain if wakatime binary can't be found --- modules/tools/wakatime/autoload.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index d030e85fe..269b8e259 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -26,6 +26,10 @@ changes." (prin1 `(setq wakatime-api-key ,wakatime-api-key) (current-buffer))) (require 'wakatime-mode) + (unless (or (and wakatime-cli-path (file-executable-p wakatime-cli-path)) + (not (equal (wakatime-find-binary "wakatime") "wakatime"))) + (user-error "Couldn't find wakatime executable (%s)" + (or wakatime-cli-path "wakatime"))) (global-wakatime-mode +1) (message "Wakatime enabled. You're good to go!"))) From ff6e4437a2f9b9c2ca2e4ca36b47325c4d2d2721 Mon Sep 17 00:00:00 2001 From: Alex Reinisch Date: Mon, 25 Jun 2018 15:56:50 -0500 Subject: [PATCH 2170/4235] Fix handler calls to reference lisp-mode. `set-repl-handler!` helps with opening a repl when a particular mode is active in a buffer. We want to be able to open a `sly-mrepl` whenever we are in a lisp buffer, so we should have the repl handler look for `'lisp-mode` to define opening a sly repl. I assume the lookup handlers should be making sure we are in a lisp buffer (similar reasoning to the repl-handler). --- modules/lang/common-lisp/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 3c4a997be..de7d84dc4 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -5,8 +5,8 @@ (setq inferior-lisp-program "sbcl") (set-popup-rule! "^\\*sly" :quit nil :ttl nil) - (set-repl-handler! 'sly-mode #'sly-mrepl) - (set-lookup-handlers! 'sly-mode + (set-repl-handler! 'lisp-mode #'sly-mrepl) + (set-lookup-handlers! 'lisp-mode :definition #'sly-edit-definition :documentation #'sly-describe-symbol) From 14a6d7710c0c910e931ca4c6bfe970d6b969e9ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:16:01 +0200 Subject: [PATCH 2171/4235] Prevent recursive require errors with evil-org Caused when evil-org-set-key-theme is called too early (somehow). Also makes evil-org-key-theme customizable, so it doesn't override a user's changes to it. Reported by @majorgreys --- modules/lang/org/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index da6baa883..894cc623e 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -25,7 +25,7 @@ :when (featurep! :feature evil +everywhere) :hook (org-mode . evil-org-mode) :init - (setq evil-org-key-theme '(navigation insert textobjects)) + (defvar evil-org-key-theme '(navigation insert textobjects)) (add-hook 'org-load-hook #'+org|setup-evil) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config @@ -266,8 +266,10 @@ between the two." [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) -(defun +org|setup-evil (&rest _) - (require 'evil-org) +(defun +org|setup-evil (&rest args) + ;; In case this hook is used in an advice on `evil-org-set-key-theme', this + ;; prevents recursive requires. + (unless args (require 'evil-org)) ;; By default, TAB cycles the visibility of all children under the current ;; tree between three states. I want to toggle the tree between two states, ;; without affecting its children. From 3134df8f4310922e5a8522dac5bc10800dc9b616 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:32:05 +0200 Subject: [PATCH 2172/4235] Refactor smerge-mode config Remove +vcs|enable-smerge-mode-maybe, as this is already automatically enabled when current file is has merge conflicts. Moved +hydra-smerge to autoloads file, and add it to smerge-mode-hook. --- modules/emacs/vc/autoload.el | 39 +++++++++++++++++++++++++ modules/emacs/vc/config.el | 55 ++++-------------------------------- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/modules/emacs/vc/autoload.el b/modules/emacs/vc/autoload.el index 65e007f1d..f9e50568f 100644 --- a/modules/emacs/vc/autoload.el +++ b/modules/emacs/vc/autoload.el @@ -50,3 +50,42 @@ info in the `header-line-format' is a good indication." (propertize author 'face 'git-timemachine-minibuffer-author-face) (propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) date-full date-relative)))) + +;;;###autoload (autoload '+hydra-smerge/body "emacs/vc/autoload" nil nil) +(defhydra +hydra-smerge (:hint nil + :pre (if (not smerge-mode) (smerge-mode 1)) + ;; Disable `smerge-mode' when quitting hydra if + ;; no merge conflicts remain. + :post (smerge-auto-leave)) + " + [smerge] + Movement Keep Diff Other + ╭─────────────────────────────────────────────────────────╯ + ^_g_^ [_b_] base [_<_] upper/base [_C_] Combine + ^_C-k_^ [_u_] upper [_=_] upper/lower [_r_] resolve + ^_k_ ↑^ [_l_] lower [_>_] base/lower [_R_] remove + ^_j_ ↓^ [_a_] all [_H_] hightlight + ^_C-j_^ [_RET_] current [_E_] ediff ╭────────── + ^_G_^ │ [_q_] quit +" + ("g" (progn (goto-char (point-min)) (smerge-next))) + ("G" (progn (goto-char (point-max)) (smerge-prev))) + ("C-j" smerge-next) + ("C-k" smerge-prev) + ("j" next-line) + ("k" previous-line) + ("b" smerge-keep-base) + ("u" smerge-keep-upper) + ("l" smerge-keep-lower) + ("a" smerge-keep-all) + ("RET" smerge-keep-current) + ("\C-m" smerge-keep-current) + ("<" smerge-diff-base-upper) + ("=" smerge-diff-upper-lower) + (">" smerge-diff-base-lower) + ("H" smerge-refine) + ("E" smerge-ediff) + ("C" smerge-combine-with-next) + ("r" smerge-resolve) + ("R" smerge-kill-current) + ("q" nil :color blue)) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 5d57213ef..77325ce17 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -33,13 +33,13 @@ ;; -;; `vc' +;; `vc' (built-in) ;; ;; `vc-hooks' (setq vc-make-backup-files nil) -;; `vc-annotate' +;; `vc-annotate' (built-in) (after! vc-annotate (set-popup-rules! '(("^\\vc-d" :select nil) ; *vc-diff* @@ -48,18 +48,8 @@ '(vc-annotate-mode vc-git-log-view-mode) 'normal)) -;; `smerge-mode' -(defun +vcs|enable-smerge-mode-maybe () - "Auto-enable `smerge-mode' when merge conflict is detected." - (save-excursion - (goto-char (point-min)) - (when (re-search-forward "^<<<<<<< " nil :noerror) - (smerge-mode 1) - (when (and (featurep 'hydra) +vc-auto-hydra-smerge) - (+hydra-smerge/body))))) -(add-hook 'find-file-hook #'+vcs|enable-smerge-mode-maybe) - -(after! smerge-mode ; built-in +;; `smerge-mode' (built-in) +(after! smerge-mode (unless EMACS26+ (with-no-warnings (defalias #'smerge-keep-upper #'smerge-keep-mine) @@ -68,40 +58,5 @@ (defalias #'smerge-diff-upper-lower #'smerge-diff-mine-other) (defalias #'smerge-diff-base-lower #'smerge-diff-base-other))) - (defhydra +hydra-smerge (:hint nil - :pre (smerge-mode 1) - ;; Disable `smerge-mode' when quitting hydra if - ;; no merge conflicts remain. - :post (smerge-auto-leave)) - " - [smerge] - Movement Keep Diff Other - ╭─────────────────────────────────────────────────────────╯ - ^_g_^ [_b_] base [_<_] upper/base [_C_] Combine - ^_C-k_^ [_u_] upper [_=_] upper/lower [_r_] resolve - ^_k_ ↑^ [_l_] lower [_>_] base/lower [_R_] remove - ^_j_ ↓^ [_a_] all [_H_] hightlight - ^_C-j_^ [_RET_] current [_E_] ediff ╭────────── - ^_G_^ │ [_q_] quit" - ("g" (progn (goto-char (point-min)) (smerge-next))) - ("G" (progn (goto-char (point-max)) (smerge-prev))) - ("C-j" smerge-next) - ("C-k" smerge-prev) - ("j" next-line) - ("k" previous-line) - ("b" smerge-keep-base) - ("u" smerge-keep-upper) - ("l" smerge-keep-lower) - ("a" smerge-keep-all) - ("RET" smerge-keep-current) - ("\C-m" smerge-keep-current) - ("<" smerge-diff-base-upper) - ("=" smerge-diff-upper-lower) - (">" smerge-diff-base-lower) - ("H" smerge-refine) - ("E" smerge-ediff) - ("C" smerge-combine-with-next) - ("r" smerge-resolve) - ("R" smerge-kill-current) - ("q" nil :color blue))) + (add-hook 'smerge-mode-hook #'+hydra-smerge/body)) From 017ba8d79c8eab111326a636e42c3dc88230dbef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:42:35 +0200 Subject: [PATCH 2173/4235] Autoload defhydras & use new naming convention Phasing out the +module@name convention for plain old +module-name-hydra, which is more compatible with elisp reflection tools like describe-function and such. Also, Emacs starts up faster now. Tee hee. --- core/autoload/hydras.el | 47 +++++++++++++++++++++ core/core-keybinds.el | 50 +---------------------- modules/completion/ivy/autoload/hydras.el | 43 +++++++++++++++++++ modules/completion/ivy/config.el | 45 +------------------- modules/tools/ein/autoload.el | 45 +++++++++++++++++++- modules/tools/ein/config.el | 47 +-------------------- modules/tools/rgb/autoload.el | 13 ++++++ modules/tools/rgb/config.el | 19 --------- modules/ui/vc-gutter/autoload.el | 26 ++++++++++++ modules/ui/vc-gutter/config.el | 24 ----------- 10 files changed, 178 insertions(+), 181 deletions(-) create mode 100644 core/autoload/hydras.el create mode 100644 modules/completion/ivy/autoload/hydras.el create mode 100644 modules/tools/rgb/autoload.el delete mode 100644 modules/tools/rgb/config.el create mode 100644 modules/ui/vc-gutter/autoload.el diff --git a/core/autoload/hydras.el b/core/autoload/hydras.el new file mode 100644 index 000000000..450d5a95b --- /dev/null +++ b/core/autoload/hydras.el @@ -0,0 +1,47 @@ +;;; core/autoload/hydras.el -*- lexical-binding: t; -*- + +;;;###autoload (autoload 'doom-text-zoom-hydra/body "core/autoload/hydras" nil nil) +(defhydra doom-text-zoom-hydra (:hint t :color red) + " + Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset +" + ("j" text-scale-increase "in") + ("k" text-scale-decrease "out") + ("0" (text-scale-set 0) "reset")) + +;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil nil) +(defhydra doom-window-nav-hydra (:hint nil) + " + Split: _v_ert _s_:horz + Delete: _c_lose _o_nly + Switch Window: _h_:left _j_:down _k_:up _l_:right + Buffers: _p_revious _n_ext _b_:select _f_ind-file + Resize: _H_:splitter left _J_:splitter down _K_:splitter up _L_:splitter right + Move: _a_:up _z_:down _i_menu +" + ("z" scroll-up-line) + ("a" scroll-down-line) + ("i" idomenu) + + ("h" windmove-left) + ("j" windmove-down) + ("k" windmove-up) + ("l" windmove-right) + + ("p" previous-buffer) + ("n" next-buffer) + ("b" switch-to-buffer) + ("f" find-file) + + ("s" split-window-below) + ("v" split-window-right) + + ("c" delete-window) + ("o" delete-other-windows) + + ("H" hydra-move-splitter-left) + ("J" hydra-move-splitter-down) + ("K" hydra-move-splitter-up) + ("L" hydra-move-splitter-right) + + ("q" nil)) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 6c721ebcb..1c4aaef25 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -63,54 +63,8 @@ If any hook returns non-nil, all hooks after it are ignored.") (which-key-mode +1)) -(def-package! hydra - :defer t - :config - (setq lv-use-seperator t) - - (defhydra doom@text-zoom (:hint t :color red) - " - Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset -" - ("j" text-scale-increase "in") - ("k" text-scale-decrease "out") - ("0" (text-scale-set 0) "reset")) - - (defhydra doom@window-nav (:hint nil) - " - Split: _v_ert _s_:horz - Delete: _c_lose _o_nly - Switch Window: _h_:left _j_:down _k_:up _l_:right - Buffers: _p_revious _n_ext _b_:select _f_ind-file - Resize: _H_:splitter left _J_:splitter down _K_:splitter up _L_:splitter right - Move: _a_:up _z_:down _i_menu -" - ("z" scroll-up-line) - ("a" scroll-down-line) - ("i" idomenu) - - ("h" windmove-left) - ("j" windmove-down) - ("k" windmove-up) - ("l" windmove-right) - - ("p" previous-buffer) - ("n" next-buffer) - ("b" switch-to-buffer) - ("f" find-file) - - ("s" split-window-below) - ("v" split-window-right) - - ("c" delete-window) - ("o" delete-other-windows) - - ("H" hydra-move-splitter-left) - ("J" hydra-move-splitter-down) - ("K" hydra-move-splitter-up) - ("L" hydra-move-splitter-right) - - ("q" nil))) +;; `hydra' +(setq lv-use-seperator t) ;; diff --git a/modules/completion/ivy/autoload/hydras.el b/modules/completion/ivy/autoload/hydras.el new file mode 100644 index 000000000..36c1ff9c9 --- /dev/null +++ b/modules/completion/ivy/autoload/hydras.el @@ -0,0 +1,43 @@ +;;; completion/ivy/autoload/hydras.el -*- lexical-binding: t; -*- + +;;;###autoload (autoload '+ivy-coo-hydra/body "completion/ivy/autoload/hydras" nil nil) +(defhydra +ivy-coo-hydra (:hint nil :color pink) + " + Move ^^^^^^^^^^ | Call ^^^^ | Cancel^^ | Options^^ | Action _w_/_s_/_a_: %s(ivy-action-name) +----------^^^^^^^^^^-+--------------^^^^-+-------^^-+--------^^-+--------------------------------- + _g_ ^ ^ _k_ ^ ^ _u_ | _f_orward _o_ccur | _i_nsert | _c_alling: %-7s(if ivy-calling \"on\" \"off\") _C_ase-fold: %-10`ivy-case-fold-search + ^↨^ _h_ ^+^ _l_ ^↕^ | _RET_ done ^^ | _q_uit | _m_atcher: %-7s(ivy--matcher-desc) _t_runcate: %-11`truncate-lines + _G_ ^ ^ _j_ ^ ^ _d_ | _TAB_ alt-done ^^ | ^ ^ | _<_/_>_: shrink/grow +" + ;; arrows + ("j" ivy-next-line) + ("k" ivy-previous-line) + ("l" ivy-alt-done) + ("h" ivy-backward-delete-char) + ("g" ivy-beginning-of-buffer) + ("G" ivy-end-of-buffer) + ("d" ivy-scroll-up-command) + ("u" ivy-scroll-down-command) + ("e" ivy-scroll-down-command) + ;; actions + ("q" keyboard-escape-quit :exit t) + ("C-g" keyboard-escape-quit :exit t) + ("" keyboard-escape-quit :exit t) + ("C-o" nil) + ("i" nil) + ("TAB" ivy-alt-done :exit nil) + ("C-j" ivy-alt-done :exit nil) + ("RET" ivy-done :exit t) + ("C-m" ivy-done :exit t) + ("C-SPC" ivy-call-and-recenter :exit nil) + ("f" ivy-call) + ("c" ivy-toggle-calling) + ("m" ivy-toggle-fuzzy) + (">" ivy-minibuffer-grow) + ("<" ivy-minibuffer-shrink) + ("w" ivy-prev-action) + ("s" ivy-next-action) + ("a" ivy-read-action) + ("t" (setq truncate-lines (not truncate-lines))) + ("C" ivy-toggle-case-fold) + ("o" ivy-occur :exit t)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 4a93ca110..e16ea7ed9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -126,49 +126,8 @@ immediately runs it on the current candidate (ending the ivy session)." :init (after! ivy (define-key! ivy-minibuffer-map - "\C-o" #'+ivy@coo/body - (kbd "M-o") #'ivy-dispatching-done-hydra)) - :config - (defhydra +ivy@coo (:hint nil :color pink) - " - Move ^^^^^^^^^^ | Call ^^^^ | Cancel^^ | Options^^ | Action _w_/_s_/_a_: %s(ivy-action-name) -----------^^^^^^^^^^-+--------------^^^^-+-------^^-+--------^^-+--------------------------------- - _g_ ^ ^ _k_ ^ ^ _u_ | _f_orward _o_ccur | _i_nsert | _c_alling: %-7s(if ivy-calling \"on\" \"off\") _C_ase-fold: %-10`ivy-case-fold-search - ^↨^ _h_ ^+^ _l_ ^↕^ | _RET_ done ^^ | _q_uit | _m_atcher: %-7s(ivy--matcher-desc) _t_runcate: %-11`truncate-lines - _G_ ^ ^ _j_ ^ ^ _d_ | _TAB_ alt-done ^^ | ^ ^ | _<_/_>_: shrink/grow -" - ;; arrows - ("j" ivy-next-line) - ("k" ivy-previous-line) - ("l" ivy-alt-done) - ("h" ivy-backward-delete-char) - ("g" ivy-beginning-of-buffer) - ("G" ivy-end-of-buffer) - ("d" ivy-scroll-up-command) - ("u" ivy-scroll-down-command) - ("e" ivy-scroll-down-command) - ;; actions - ("q" keyboard-escape-quit :exit t) - ("C-g" keyboard-escape-quit :exit t) - ("" keyboard-escape-quit :exit t) - ("C-o" nil) - ("i" nil) - ("TAB" ivy-alt-done :exit nil) - ("C-j" ivy-alt-done :exit nil) - ("RET" ivy-done :exit t) - ("C-m" ivy-done :exit t) - ("C-SPC" ivy-call-and-recenter :exit nil) - ("f" ivy-call) - ("c" ivy-toggle-calling) - ("m" ivy-toggle-fuzzy) - (">" ivy-minibuffer-grow) - ("<" ivy-minibuffer-shrink) - ("w" ivy-prev-action) - ("s" ivy-next-action) - ("a" ivy-read-action) - ("t" (setq truncate-lines (not truncate-lines))) - ("C" ivy-toggle-case-fold) - ("o" ivy-occur :exit t))) + "\C-o" #'+ivy-coo-hydra/body + (kbd "M-o") #'ivy-dispatching-done-hydra))) (def-package! wgrep diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index 6a65fcf19..3796e2a22 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -34,4 +34,47 @@ (goto-char (1+ res)) (widget-button-press (point))))) - +;;;###autoload (autoload '+ein-hydra/body "tools/ein/autoload" nil nil) +(defhydra +ein-hydra (:hint t :color red) + " + Operations on Cells^^^^^^ Other + ----------------------------^^^^^^ ----------------------------------^^^^ + [_k_/_j_]^^ select prev/next [_t_]^^ toggle output + [_K_/_J_]^^ move up/down [_C-l_/_C-S-l_] clear/clear all output + [_C-k_/_C-j_]^^ merge above/below [_C-o_]^^ open console + [_O_/_o_]^^ insert above/below [_C-s_/_C-r_] save/rename notebook + [_y_/_p_/_d_] copy/paste [_x_]^^ close notebook + [_u_]^^^^ change type [_q_]^^ quit + [_RET_]^^^^ execute +" + ("q" nil :exit t) + ("h" ein:notebook-worksheet-open-prev-or-last) + ("j" ein:worksheet-goto-next-input) + ("k" ein:worksheet-goto-prev-input) + ("l" ein:notebook-worksheet-open-next-or-first) + ("H" ein:notebook-worksheet-move-prev) + ("J" ein:worksheet-move-cell-down) + ("K" ein:worksheet-move-cell-up) + ("L" ein:notebook-worksheet-move-next) + ("t" ein:worksheet-toggle-output) + ("d" ein:worksheet-kill-cell) + ("R" ein:worksheet-rename-sheet) + ("y" ein:worksheet-copy-cell) + ("p" ein:worksheet-yank-cell) + ("o" ein:worksheet-insert-cell-below) + ("O" ein:worksheet-insert-cell-above) + ("u" ein:worksheet-change-cell-type) + ("RET" ein:worksheet-execute-cell-and-goto-next) + ;; Output + ("C-l" ein:worksheet-clear-output) + ("C-S-l" ein:worksheet-clear-all-output) + ;;Console + ("C-o" ein:console-open :exit t) + ;; Merge and split cells + ("C-k" ein:worksheet-merge-cell) + ("C-j" spacemacs/ein:worksheet-merge-cell-next) + ("s" ein:worksheet-split-cell-at-point) + ;; Notebook + ("C-s" ein:notebook-save-notebook-command) + ("C-r" ein:notebook-rename-command) + ("x" ein:notebook-close :exit t)) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 0c92dcf59..97126600d 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -40,49 +40,4 @@ ;; Ace-link on notebook list buffers (after! ein-notebooklist - (define-key ein:notebooklist-mode-map "o" #'+ein/ace-link-ein)) - - ;; add hydra - (defhydra +ein/hydra (:hint t :color red) - " - Operations on Cells^^^^^^ Other - ----------------------------^^^^^^ ----------------------------------^^^^ - [_k_/_j_]^^ select prev/next [_t_]^^ toggle output - [_K_/_J_]^^ move up/down [_C-l_/_C-S-l_] clear/clear all output - [_C-k_/_C-j_]^^ merge above/below [_C-o_]^^ open console - [_O_/_o_]^^ insert above/below [_C-s_/_C-r_] save/rename notebook - [_y_/_p_/_d_] copy/paste [_x_]^^ close notebook - [_u_]^^^^ change type [_q_]^^ quit - [_RET_]^^^^ execute -" - ("q" nil :exit t) - ("h" ein:notebook-worksheet-open-prev-or-last) - ("j" ein:worksheet-goto-next-input) - ("k" ein:worksheet-goto-prev-input) - ("l" ein:notebook-worksheet-open-next-or-first) - ("H" ein:notebook-worksheet-move-prev) - ("J" ein:worksheet-move-cell-down) - ("K" ein:worksheet-move-cell-up) - ("L" ein:notebook-worksheet-move-next) - ("t" ein:worksheet-toggle-output) - ("d" ein:worksheet-kill-cell) - ("R" ein:worksheet-rename-sheet) - ("y" ein:worksheet-copy-cell) - ("p" ein:worksheet-yank-cell) - ("o" ein:worksheet-insert-cell-below) - ("O" ein:worksheet-insert-cell-above) - ("u" ein:worksheet-change-cell-type) - ("RET" ein:worksheet-execute-cell-and-goto-next) - ;; Output - ("C-l" ein:worksheet-clear-output) - ("C-S-l" ein:worksheet-clear-all-output) - ;;Console - ("C-o" ein:console-open :exit t) - ;; Merge and split cells - ("C-k" ein:worksheet-merge-cell) - ("C-j" spacemacs/ein:worksheet-merge-cell-next) - ("s" ein:worksheet-split-cell-at-point) - ;; Notebook - ("C-s" ein:notebook-save-notebook-command) - ("C-r" ein:notebook-rename-command) - ("x" ein:notebook-close :exit t))) + (define-key ein:notebooklist-mode-map "o" #'+ein/ace-link-ein))) diff --git a/modules/tools/rgb/autoload.el b/modules/tools/rgb/autoload.el new file mode 100644 index 000000000..96647de20 --- /dev/null +++ b/modules/tools/rgb/autoload.el @@ -0,0 +1,13 @@ +;;; tools/rgb/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload (autoload '+rgb-kurecolor-hydra/body "tools/rgb/autoload" nil nil) +(defhydra +rgb-kurecolor-hydra (:color pink :hint nil) + " +Inc/Dec _w_/_W_ brightness _d_/_D_ saturation _e_/_E_ hue " + ("w" kurecolor-decrease-brightness-by-step) + ("W" kurecolor-increase-brightness-by-step) + ("d" kurecolor-decrease-saturation-by-step) + ("D" kurecolor-increase-saturation-by-step) + ("e" kurecolor-decrease-hue-by-step) + ("E" kurecolor-increase-hue-by-step) + ("q" nil "cancel" :color blue)) diff --git a/modules/tools/rgb/config.el b/modules/tools/rgb/config.el deleted file mode 100644 index 08a93d06a..000000000 --- a/modules/tools/rgb/config.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; tools/rgb/config.el -*- lexical-binding: t; -*- - -;; -;; Plugins -;; - -(def-package! kurecolor - :after rainbow-mode - :config - (defhydra +rgb@kurecolor (:color pink :hint nil) - " -Inc/Dec _w_/_W_ brightness _d_/_D_ saturation _e_/_E_ hue " - ("w" kurecolor-decrease-brightness-by-step) - ("W" kurecolor-increase-brightness-by-step) - ("d" kurecolor-decrease-saturation-by-step) - ("D" kurecolor-increase-saturation-by-step) - ("e" kurecolor-decrease-hue-by-step) - ("E" kurecolor-increase-hue-by-step) - ("q" nil "cancel" :color blue))) diff --git a/modules/ui/vc-gutter/autoload.el b/modules/ui/vc-gutter/autoload.el new file mode 100644 index 000000000..def6ed45b --- /dev/null +++ b/modules/ui/vc-gutter/autoload.el @@ -0,0 +1,26 @@ +;;; ui/vc-gutter/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload (autoload '+vc-gutter-hydra/body "ui/vc-gutter/autoload" nil nil) +(defhydra +vc-gutter-hydra + (:body-pre (git-gutter-mode 1) :hint nil) + " + [git gutter] + Movement Hunk Actions Misc. +%-4s(car (git-gutter:statistic))/ -%-4s(cdr (git-gutter:statistic)) + ╭──────────────────────────────────┴────────────────╯ + ^_g_^ [_s_] stage [_R_] set start Rev + ^_k_^ [_r_] revert + ^↑ ^ [_m_] mark + ^↓ ^ [_p_] popup ╭───────────────────── + ^_j_^ │[_q_] quit + ^_G_^ │[_Q_] Quit and disable" + ("j" (progn (git-gutter:next-hunk 1) (recenter))) + ("k" (progn (git-gutter:previous-hunk 1) (recenter))) + ("g" (progn (goto-char (point-min)) (git-gutter:next-hunk 1))) + ("G" (progn (goto-char (point-min)) (git-gutter:previous-hunk 1))) + ("s" git-gutter:stage-hunk) + ("r" git-gutter:revert-hunk) + ("m" git-gutter:mark-hunk) + ("p" git-gutter:popup-hunk) + ("R" git-gutter:set-start-revision) + ("q" nil :color blue) + ("Q" (git-gutter-mode -1) :color blue)) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index e13239d43..ee90b7a15 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -51,30 +51,6 @@ to the right fringe.") ;; update git-gutter when using these commands (add-hook 'magit-post-refresh-hook #'+version-control|update-git-gutter) - (defhydra +version-control@git-gutter - (:body-pre (git-gutter-mode 1) :hint nil) - " - [git gutter] - Movement Hunk Actions Misc. +%-4s(car (git-gutter:statistic))/ -%-4s(cdr (git-gutter:statistic)) - ╭──────────────────────────────────┴────────────────╯ - ^_g_^ [_s_] stage [_R_] set start Rev - ^_k_^ [_r_] revert - ^↑ ^ [_m_] mark - ^↓ ^ [_p_] popup ╭───────────────────── - ^_j_^ │[_q_] quit - ^_G_^ │[_Q_] Quit and disable" - ("j" (progn (git-gutter:next-hunk 1) (recenter))) - ("k" (progn (git-gutter:previous-hunk 1) (recenter))) - ("g" (progn (goto-char (point-min)) (git-gutter:next-hunk 1))) - ("G" (progn (goto-char (point-min)) (git-gutter:previous-hunk 1))) - ("s" git-gutter:stage-hunk) - ("r" git-gutter:revert-hunk) - ("m" git-gutter:mark-hunk) - ("p" git-gutter:popup-hunk) - ("R" git-gutter:set-start-revision) - ("q" nil :color blue) - ("Q" (git-gutter-mode -1) :color blue)) - ;; subtle diff indicators in the fringe (when +vc-gutter-default-style ;; places the git gutter outside the margins. From d9e58e36e9f89b7c2e17ec625f81e0cefe55067f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:46:15 +0200 Subject: [PATCH 2174/4235] Merge evil-org-agenda init with evil-org --- modules/lang/org/config.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 894cc623e..5089a24f9 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -30,12 +30,10 @@ (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config ;; in case it is called later - (advice-add #'evil-org-set-key-theme :after #'+org|setup-evil)) - -(def-package! evil-org-agenda - :when (featurep! :feature evil +everywhere) - :after org-agenda - :config (evil-org-agenda-set-keys)) + (advice-add #'evil-org-set-key-theme :after #'+org|setup-evil) + (def-package! evil-org-agenda + :after org-agenda + :config (evil-org-agenda-set-keys))) ;; From 6310236f51034062c76f4fcb29fd5244638c7f6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:46:34 +0200 Subject: [PATCH 2175/4235] Appease the holy byte-compiler --- modules/feature/workspaces/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index cc3e1e227..a168b57e0 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -29,7 +29,7 @@ stored in `persp-save-dir'.") ;; If emacs is passed --restore, restore the last session on startup. This is ;; particularly useful for the `+workspace/restart-emacs-then-restore' command. (defun +workspaces-restore-last-session (&rest _) - (add-hook 'emacs-startup-hook #'+workspace/load-session 'append)) + (add-hook 'emacs-startup-hook #'+workspace/load-session :append)) (add-to-list 'command-switch-alist (cons "--restore" #'+workspaces-restore-last-session)) @@ -163,8 +163,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." (list tag (buffer-name buf) vars (buffer-name (buffer-base-buffer)))) :load-function (lambda (savelist &rest _rest) - (destructuring-bind - (buf-name vars base-buf-name &rest _rest) (cdr savelist) + (destructuring-bind (buf-name _vars base-buf-name &rest _) + (cdr savelist) (push (cons buf-name base-buf-name) +workspaces--indirect-buffers-to-restore) nil))) From 77eee38c414d7a2c98d0e33a184c512291859e0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:46:47 +0200 Subject: [PATCH 2176/4235] Make deprecated :repl setting DRY --- modules/feature/eval/autoload/settings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 2849e5fab..443678f7d 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -18,7 +18,7 @@ function that creates and returns the REPL buffer." ;;;###autoload (def-setting! :repl (mode command) :obsolete set-repl-handler! - `(push (cons ,mode ,command) +eval-repls)) + `(set-repl-handler! ,mode ,command)) ;; From af41e1735590597545f83c290bd706523cef8884 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 01:47:32 +0200 Subject: [PATCH 2177/4235] Minor reformatting & docstring tweak --- core/autoload/editor.el | 5 ++--- modules/completion/ivy/config.el | 9 +++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 2457981e0..e6f2fd041 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -186,8 +186,7 @@ possible, or just one char if that's not possible." (save-excursion (insert-char ?\s (- ocol (current-column)) nil)))) ;; - ((and (= n 1) - (bound-and-true-p smartparens-mode)) + ((and (= n 1) (bound-and-true-p smartparens-mode)) (cond ((and (memq (char-before) (list ?\ ?\t)) (save-excursion (and (> (- (skip-chars-backward " \t" (line-beginning-position))) 0) @@ -213,7 +212,7 @@ possible, or just one char if that's not possible." ((run-hook-with-args-until-success 'doom-delete-backward-functions)) ((doom/backward-delete-whitespace-to-column))))))) ;; Otherwise, do simple deletion. - (t (delete-char (- n) killflag)))) + ((delete-char (- n) killflag)))) ;;;###autoload (defun doom/retab (arg &optional beg end) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e16ea7ed9..e6f51fba9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -145,11 +145,12 @@ immediately runs it on the current candidate (ending the ivy session)." (advice-add #'ivy-posframe-setup :override #'ignore) :config (setq ivy-fixed-height-minibuffer nil - ivy-posframe-parameters `((min-width . 90) - (min-height . ,ivy-height) - (internal-border-width . 10))) + ivy-posframe-parameters + `((min-width . 90) + (min-height . ,ivy-height) + (internal-border-width . 10))) - ;; ... let's do it manually + ;; ... let's do it manually instead (unless (assq 'ivy-posframe-display-at-frame-bottom-left ivy-display-functions-props) (dolist (fn (list 'ivy-posframe-display-at-frame-bottom-left 'ivy-posframe-display-at-frame-center From e88f413d4a568bb4496bc314186620cb43c307c3 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 26 Jun 2018 02:49:01 +0200 Subject: [PATCH 2178/4235] factored out setting --- modules/lang/latex/config.el | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 52bba4314..871ed8372 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -186,19 +186,15 @@ (def-package! ivy-bibtex :when (featurep! :completion ivy) :commands ivy-bibtex - :config - (setq ivy-bibtex-default-action 'ivy-bibtex-insert-key) - (unless (string-empty-p +latex-bibtex-file) - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (string-empty-p +latex-bibtex-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-dir) - bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)))) + ) (def-package! helm-bibtex :when (featurep! :completion helm) :commands helm-bibtex - :config + ) + +(after! bibtex-completion (unless (string-empty-p +latex-bibtex-file) (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) (unless (string-empty-p +latex-bibtex-dir) From 778f9dea5c11004ade0ab9e0c79d9ebecabf2123 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alois=20Jan=C3=AD=C4=8Dek?= Date: Tue, 26 Jun 2018 13:25:23 +0200 Subject: [PATCH 2179/4235] feature/evil: correct feature reference Both help-mode and help-mode-map are defined in file help-mode.el which provides 'help-mode --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 1c1bfd00b..62ed2bbca 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -185,7 +185,7 @@ "ZQ" 'evil-quit "ZZ" 'Custom-buffer-done)) - (after! help + (after! help-mode (evil-set-initial-state 'help-mode 'normal) (evil-define-key* 'normal help-mode-map ;; motion From f17bf0a039ad8b634e337f69b850803789059842 Mon Sep 17 00:00:00 2001 From: Jonas Walther Date: Tue, 26 Jun 2018 17:05:54 +0200 Subject: [PATCH 2180/4235] why isn't this a thing already :thinking: --- modules/emacs/eshell/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 092f4b894..96490c875 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -26,7 +26,8 @@ buffer.") ("z" "cd =$1") ; built-in ("bd" "eshell-up $1") ; `eshell-up' ("rg" "rg --color=always") - ("ag" "ag --color=always")) + ("ag" "ag --color=always") + ("ll" "ls -lah")) "An alist of default eshell aliases, meant to emulate useful shell utilities, like fasd and bd. Note that you may overwrite these in your `eshell-aliases-file'. This is here to provide an alternative, elisp-centric way From e6a89e4bf98be9ea13a9ae6e0568815773891599 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 13:14:24 +0200 Subject: [PATCH 2181/4235] app/rss: fix keymapp error & refactor keybinds --- modules/app/rss/config.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index abe04731e..1318a4d33 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -39,23 +39,24 @@ absolute paths.") ;; Enhance readability of a post (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) + (add-hook! '(elfeed-show-mode-hook elfeed-search-mode-hook) + (add-hook 'kill-buffer-hook #'+rss/quit nil t)) - (define-key! (elfeed-search-mode-map elfeed-show-mode-map) - [remap kill-this-buffer] #'+rss/quit - [remap kill-buffer] #'+rss/quit) - (define-key! elfeed-show-mode-map - [remap next-buffer] #'+rss/next - [remap previous-buffer] #'+rss/previous) - (when (featurep 'evil) - (evil-define-key* 'normal elfeed-search-mode-map + ;; Keybindings + (after! elfeed-show + (define-key! elfeed-show-mode-map + [remap next-buffer] #'+rss/next + [remap previous-buffer] #'+rss/previous)) + (when (featurep 'evil +everywhere) + (evil-define-key 'normal elfeed-search-mode-map "q" #'+rss/quit "r" #'elfeed-update "s" #'elfeed-search-live-filter (kbd "RET") #'elfeed-search-show-entry (kbd "M-RET") #'elfeed-search-browse-url) - (evil-define-key* 'normal elfeed-show-mode-map + (evil-define-key 'normal elfeed-show-mode-map "q" #'elfeed-kill-buffer) - (evil-define-key* 'motion elfeed-show-mode-map + (evil-define-key 'motion elfeed-show-mode-map "j" #'evil-next-visual-line "k" #'evil-previous-visual-line))) From 80ddf2122b4d6bb032d4044467f858018f768526 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 13:29:52 +0200 Subject: [PATCH 2182/4235] Fix doom-initialize-packages messing up load-path This fixes issues with the doctor not being able to find certain packages (like evil-collection), and an issue where using the package management API (which calls doom-initialize-packages) breaks the current session by breaking the load-path. --- core/core-packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index 762277b02..72d430971 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -97,8 +97,8 @@ them." (unless (eq force-p 'internal) ;; `package-alist' (when (or force-p (not (bound-and-true-p package-alist))) - (setq load-path (cons doom-core-dir doom-site-load-path)) - (doom-ensure-packages-initialized 'force)) + (doom-ensure-packages-initialized 'force) + (setq load-path (cl-remove-if-not #'file-directory-p load-path))) ;; `quelpa-cache' (when (or force-p (not (bound-and-true-p quelpa-cache))) ;; ensure un-byte-compiled version of quelpa is loaded From ac1b1995b55737dab4e662700ba21bf261ee99af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 16:18:44 +0200 Subject: [PATCH 2183/4235] Conditionally bind persp-switch-to-buffer In the case :feature workspaces is disabled. --- modules/config/default/+bindings.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 901696b74..8e6e20c2c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -466,6 +466,12 @@ ;; ;; +(if (featurep! :feature workspaces) + (map! :leader :desc "Switch buffer" :n "," #'switch-to-buffer) + (map! :leader :desc "Switch workspace buffer" + :n "," #'persp-switch-to-buffer + :n "<" #'switch-to-buffer)) + (map! :leader :desc "Ex command" :nv ";" #'evil-ex :desc "M-x" :nv ":" #'execute-extended-command @@ -474,8 +480,6 @@ ;; 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 "~" #'+popup/toggle :desc "Eval expression" :n "`" #'eval-expression From ca1b9ac1bd832bc1d6ac4a1b9700a07cec1da0d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 17:14:29 +0200 Subject: [PATCH 2184/4235] doom refresh: always force autoload regeneration --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 92059f919..23ee4b2c9 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -179,7 +179,7 @@ respectively.") (dispatcher! (version v) (doom/version) "Reports the version of Doom and Emacs.") -(dispatcher! (refresh re) (doom-refresh) +(dispatcher! (refresh re) (doom-refresh 'force) "Refresh Doom. Same as autoremove+install+autoloads. This is the equivalent of running autoremove, install, autoloads, then From 71922937ff7596b0ec0a6ae3dfdc8d18b2282961 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 17:55:20 +0200 Subject: [PATCH 2185/4235] tools/wakatime: add +wakatime-home variable And fix 'wakatime-mode isn't setup' message referencing +wakatime/start instead of +wakatime/setup. --- modules/tools/wakatime/autoload.el | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 269b8e259..67cc3e928 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -1,5 +1,8 @@ ;;; tools/wakatime/autoload.el -*- lexical-binding: t; -*- +(defvar +wakatime-home (concat doom-cache-dir "wakatime/") + "Path to the directory where wakatime files are stored.") + (defvar +wakatime-api-file (concat doom-cache-dir "wakatime.el") "Where the wakatime api key is cached.") @@ -40,9 +43,12 @@ warning)." (interactive) (unless (bound-and-true-p wakatime-api-key) (ignore-errors (load +wakatime-api-file t t))) - (if (bound-and-true-p wakatime-api-key) - (global-wakatime-mode +1) - (message "wakatime-mode isn't set up. Run `M-x +wakatime/start' to do so.")) + (if (not (bound-and-true-p wakatime-api-key)) + (message "wakatime-mode isn't set up. Run `M-x +wakatime/setup' to do so.") + (when +wakatime-home + (unless (file-directory-p +wakatime-home) + (make-directory +wakatime-home t))) + (global-wakatime-mode +1)) ;; (remove-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) (advice-remove 'after-find-file #'+wakatime|autostart)) @@ -55,8 +61,11 @@ open a file." ;; this is necessary in case the user opens emacs with file arguments (advice-add 'after-find-file :before #'+wakatime|autostart)) -(defun +wakatime*append-hide-filenames-option (ret) - "Enables filename obfuscation in wakatime if `+wakatime-hide-filenames' is -non-nil." - (concat ret (if +wakatime-hide-filenames " --hide-filenames"))) -(advice-add #'wakatime-client-command :filter-return #'+wakatime*append-hide-filenames-option ) +(defun +wakatime*append-options (ret) + "Modifies the wakatime command string so that `+wakatime-hide-filenames' and +`+wakatime-home' are respected." + (concat (when +wakatime-home + (format "WAKATIME_HOME=%s " (shell-quote-argument +wakatime-home))) + ret + (if +wakatime-hide-filenames " --hide-filenames"))) +(advice-add #'wakatime-client-command :filter-return #'+wakatime*append-options) From 705de920d7fa0aefe74bf05dd230e20071d95317 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:01:47 +0200 Subject: [PATCH 2186/4235] tools/wakatime: +wakatime-api-file => custom.el Use customize system to store user settings instead of reinventing the wheel. --- modules/tools/wakatime/autoload.el | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 67cc3e928..aeded0490 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -3,9 +3,6 @@ (defvar +wakatime-home (concat doom-cache-dir "wakatime/") "Path to the directory where wakatime files are stored.") -(defvar +wakatime-api-file (concat doom-cache-dir "wakatime.el") - "Where the wakatime api key is cached.") - (defvar +wakatime-hide-filenames nil "If non-nil, obfuscate files and only show what projects you're working on.") @@ -24,11 +21,10 @@ changes." (let ((api-key (read-string "Enter your wakatime API key: "))) (unless api-key (user-error "No api key was received.")) - (setq wakatime-api-key api-key) - (with-temp-file +wakatime-api-file - (prin1 `(setq wakatime-api-key ,wakatime-api-key) - (current-buffer))) (require 'wakatime-mode) + (setq wakatime-api-key api-key) + (customize-set-variable 'wakatime-api-key api-key) + (customize-save-customized) (unless (or (and wakatime-cli-path (file-executable-p wakatime-cli-path)) (not (equal (wakatime-find-binary "wakatime") "wakatime"))) (user-error "Couldn't find wakatime executable (%s)" @@ -41,8 +37,6 @@ changes." "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." (interactive) - (unless (bound-and-true-p wakatime-api-key) - (ignore-errors (load +wakatime-api-file t t))) (if (not (bound-and-true-p wakatime-api-key)) (message "wakatime-mode isn't set up. Run `M-x +wakatime/setup' to do so.") (when +wakatime-home From 5966e9aa9ce1efafa0387226ca5bb875bce92e97 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:05:35 +0200 Subject: [PATCH 2187/4235] Restore +evil-collection-disabled-list Without this variable, the user can't easily prevent certain evil-collection modules from loading without some provide voodoo. --- modules/feature/evil/config.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 62ed2bbca..badb5d907 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -3,6 +3,11 @@ ;; I'm a vimmer at heart. Its modal philosophy suits me better, and this module ;; strives to make Emacs a much better vim than vim was. +(defvar +evil-collection-disabled-list () + "A list of `evil-collection' modules to ignore. See the definition of this +variable for an explanation of the defaults (in comments). See +`evil-collection-mode-list' for a list of available options.") + (def-package! evil :init (setq evil-want-C-u-scroll t @@ -323,8 +328,10 @@ (ztree ztree-diff))) (dolist (req evil-collection-mode-list) - (with-eval-after-load (car (doom-enlist req)) - (evil-collection-init (list req)))))) + (let ((feature (car (doom-enlist req)))) + (with-eval-after-load feature + (unless (memq feature +evil-collection-disabled-list) + (evil-collection-init (list req)))))))) ;; From 8f3f31bac81b02a4499b8bc752e78f999465bee9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:07:05 +0200 Subject: [PATCH 2188/4235] Fix hardcoded language-tool path on MacOS Reported by @jwintz --- modules/app/write/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index dc7206216..cda5bc559 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -29,12 +29,14 @@ :init (setq langtool-default-language "en-US") :config - (unless langtool-language-tool-jar - (setq langtool-language-tool-jar - (cond (IS-MAC - "/usr/local/Cellar/languagetool/4.0/libexec/languagetool-commandline.jar") - (IS-LINUX - "/usr/share/java/languagetool/languagetool-commandline.jar"))))) + (defvar langtool-language-tool-jar + (cond (IS-MAC + (locate-file "libexec/languagetool-commandline.jar" + (doom-files-in "/usr/local/Cellar/languagetool" + :type 'dirs + :depth 1))) + (IS-LINUX + "/usr/share/java/languagetool/languagetool-commandline.jar")))) (def-package! wordnut From 79e155a2a8b8d620fb8fec155901580bd3be0fa6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:08:16 +0200 Subject: [PATCH 2189/4235] doom-files-in: match full path with :match Instead of just the filename. --- core/core-lib.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 792aa8932..8e1a35fcd 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -167,7 +167,7 @@ MATCH is a string regexp. Only entries that match it will be included." (let ((fullpath (expand-file-name file path))) (cond ((file-directory-p fullpath) (when (and (memq type '(t dirs)) - (string-match-p match file) + (string-match-p match fullpath) (not (and filter (funcall filter fullpath))) (not (and (file-symlink-p fullpath) (not follow-symlinks))) @@ -185,7 +185,7 @@ MATCH is a string regexp. Only entries that match it will be included." :relative-to ,relative-to) rest)))))) ((and (memq type '(t files)) - (string-match-p match file) + (string-match-p match fullpath) (not (and filter (funcall filter fullpath))) (<= mindepth 0)) (push (if relative-to From 81753150a776e36f529dd9490bde192d2c9cbd0c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:09:51 +0200 Subject: [PATCH 2190/4235] doctor: don't regard disabled/ignored packages And refactor error handling. --- bin/doom-doctor | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 995edc243..d1befbdf1 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -282,7 +282,7 @@ (require 'core-packages) (doom-initialize-packages) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) - ('error + (error (warn! "Attempt to load DOOM: failed\n %s\n" (or (cdr-safe ex) (car ex))) (setq doom-modules nil))) @@ -293,22 +293,25 @@ (advice-add #'require :around #'doom*shut-up) (maphash (lambda (key plist) - (condition-case ex - (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) - (packages-file (doom-module-path (car key) (cdr key) "packages.el")) - doom-packages) - (when (or (file-exists-p doctor-file) - (file-exists-p packages-file)) - (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key)))) - (doom--stage 'packages)) - (when (load packages-file t t) - (dolist (package (cl-remove-if #'package-installed-p doom-packages :key #'car)) - (unless (package-built-in-p (car package)) - (error! "%s is not installed" (car package))))) - (let ((doom--stage 'doctor)) - (load doctor-file t t))))) - ('error - (error! "(%s %s) Syntax error: %s" (car key) (cdr key) ex)))) + (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) + (condition-case ex + (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) + (packages-file (doom-module-path (car key) (cdr key) "packages.el")) + doom-packages) + (when (or (file-exists-p doctor-file) + (file-exists-p packages-file)) + (let ((doom--stage 'packages)) + (when (load packages-file t t) + (cl-loop for (name . plist) in doom-packages + unless (or (doom-package-prop name :disable) + (doom-package-prop name :ignore t) + (package-built-in-p name) + (package-installed-p name)) + do (error! "%s is not installed" (car package)))) + (let ((doom--stage 'doctor)) + (load doctor-file t t))))) + (file-missing (error! "%s" (error-message-string ex))) + (error (error! "Syntax error: %s" ex))))) doom-modules))) ;; From 7d59b9c5a582f86d2f8a79f0b57e417c28e99f14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:33:25 +0200 Subject: [PATCH 2191/4235] Use abbreviated, extension-less paths for autodefs Decreases the size of doom-autoload-file, improves its portability and fixes byte-compilation support for autodefs. --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 23ee4b2c9..7cc6bcd5a 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -485,7 +485,7 @@ even if it doesn't need reloading!" ((memq type '(defmacro cl-defmacro)) (push doom-file-form forms) sexp) - ((make-autoload sexp path))) + ((make-autoload sexp (abbreviate-file-name (file-name-sans-extension path))))) forms) (push `(put ',name 'doom-module ',origin) forms)))) From fe235c341db0bec93512dcc83a8d57c3070e49fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 18:43:27 +0200 Subject: [PATCH 2192/4235] Refactor evil-collection-init code Make it possible to disable image-mode and elisp-mode evil-collection modules. --- modules/feature/evil/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index badb5d907..f32ff1142 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -221,8 +221,12 @@ variable for an explanation of the defaults (in comments). See "ZQ" 'evil-quit "ZZ" 'quit-window)) - (add-transient-hook! 'image-mode (evil-collection-init 'image)) - (add-transient-hook! 'emacs-lisp-mode (evil-collection-init 'elisp-mode)) + (defun +evil-collection-init (module) + (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) + (evil-collection-init (list module)))) + + (add-transient-hook! 'image-mode (+evil-collection-init 'image)) + (add-transient-hook! 'emacs-lisp-mode (+evil-collection-init 'elisp-mode)) (defvar evil-collection-mode-list '(ace-jump-mode @@ -328,10 +332,8 @@ variable for an explanation of the defaults (in comments). See (ztree ztree-diff))) (dolist (req evil-collection-mode-list) - (let ((feature (car (doom-enlist req)))) - (with-eval-after-load feature - (unless (memq feature +evil-collection-disabled-list) - (evil-collection-init (list req)))))))) + (with-eval-after-load (car (doom-enlist req)) + (+evil-collection-init (list req)))))) ;; From 7408bd170dbdc3d3d0146583268843777183a266 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Jun 2018 19:03:19 +0200 Subject: [PATCH 2193/4235] Fix void-function errors on doom recompile Due to autoloads files not being loaded at all in this one startup route. Reported by @ar1a & @AloisJanicek --- core/core-cli.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 7cc6bcd5a..457800380 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -723,15 +723,16 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "Byte-compile anyway?"))) (message "Aborting.") (cl-return-from 'byte-compile))) - (unless recompile-p - (when (or (null modules) (equal modules '(":core"))) - (doom-clean-byte-compiled-files)) - (doom-reload-autoloads)) + (and (not recompile-p) + (or (null modules) (equal modules '(":core"))) + (doom-clean-byte-compiled-files)) (let (doom-emacs-changed-p noninteractive) - ;; But first we must be sure that Doom and your private config have - ;; been fully loaded. Which usually aren't so in an noninteractive - ;; session. + ;; But first we must be sure that Doom and your private config have been + ;; fully loaded. Which usually aren't so in an noninteractive session. + (unless (and (doom-initialize-autoloads doom-autoload-file) + (doom-initialize-autoloads doom-package-autoload-file)) + (doom-reload-autoloads)) (doom-initialize) (doom-initialize-modules 'force)) ;; If no targets were supplied, then we use your module list. From bc124fae114336f1474cddec6118be9834aca831 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 26 Jun 2018 19:14:31 +0200 Subject: [PATCH 2194/4235] removed hindent hook --- modules/lang/haskell/+intero.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 3ddbc5ef8..5dc501743 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -14,7 +14,3 @@ This is necessary because `intero-mode' doesn't do its own error checks." (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) - - -(def-package! hindent - :hook (haskell-mode . hindent-mode)) From bec2ad48596992ef46ee79c7a7cf288d640d808e Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 26 Jun 2018 19:15:07 +0200 Subject: [PATCH 2195/4235] factored hindent out as a seperate feature. --- modules/lang/haskell/+hindent.el | 6 ++++++ modules/lang/haskell/config.el | 2 ++ modules/lang/haskell/packages.el | 7 ++++--- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 modules/lang/haskell/+hindent.el diff --git a/modules/lang/haskell/+hindent.el b/modules/lang/haskell/+hindent.el new file mode 100644 index 000000000..c5b751e01 --- /dev/null +++ b/modules/lang/haskell/+hindent.el @@ -0,0 +1,6 @@ +;;; +hindent.el --- description -*- lexical-binding: t; -*- +;;;###if (featurep! +hindent) + +(def-package! hindent + :hook (haskell-mode . hindent-mode)) + diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 7da71bb97..9d7e4b025 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -3,6 +3,8 @@ (cond ((featurep! +intero) (load! "+intero")) ((featurep! +dante) (load! "+dante"))) +(when (featurep! +hindent) (load! "+hindent")) + ;; ;; Common plugins diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index 541ed0bcd..dd3cb634d 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -6,7 +6,8 @@ ;; (cond ((featurep! +dante) (package! dante)) - (t - (package! intero) - (package! hindent))) + (t (package! intero))) + +(when (featurep! +hindent) + (package! hindent)) From e727e2041ff9b1657f5e74057da4622c0fa1f932 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 26 Jun 2018 19:15:35 +0200 Subject: [PATCH 2196/4235] Added doc check for hindent executable --- modules/lang/haskell/doctor.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index b62d40aa1..6840470fa 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -3,11 +3,15 @@ (when (featurep! +dante) (unless (executable-find "cabal") - (warn! "Couldn't find cabal, haskell-mode may have issues")) + (warn! "Couldn't find cabal, haskell-mode may have issues.")) (unless (executable-find "hlint") - (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode/"))) + (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode."))) (when (featurep! +intero) (unless (executable-find "stack") - (warn! "Couldn't find stack. Intero will not work"))) + (warn! "Couldn't find stack. Intero will not work."))) + +(when (featurep! +hindent) + (unless (executable-find "hindent") + (warn! "Couldn't find hindent. hindent-mode won't work."))) From 19400598b44faf27f877f348184640d61841b19e Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 26 Jun 2018 19:34:36 +0200 Subject: [PATCH 2197/4235] got rid of hindent as a seperate feature --- modules/lang/haskell/+hindent.el | 6 ------ modules/lang/haskell/config.el | 6 +++--- modules/lang/haskell/doctor.el | 5 ++--- modules/lang/haskell/packages.el | 3 +-- 4 files changed, 6 insertions(+), 14 deletions(-) delete mode 100644 modules/lang/haskell/+hindent.el diff --git a/modules/lang/haskell/+hindent.el b/modules/lang/haskell/+hindent.el deleted file mode 100644 index c5b751e01..000000000 --- a/modules/lang/haskell/+hindent.el +++ /dev/null @@ -1,6 +0,0 @@ -;;; +hindent.el --- description -*- lexical-binding: t; -*- -;;;###if (featurep! +hindent) - -(def-package! hindent - :hook (haskell-mode . hindent-mode)) - diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 9d7e4b025..9b44c7531 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -3,13 +3,13 @@ (cond ((featurep! +intero) (load! "+intero")) ((featurep! +dante) (load! "+dante"))) -(when (featurep! +hindent) (load! "+hindent")) - - ;; ;; Common plugins ;; +(def-package! hindent + :hook (haskell-mode . hindent-mode)) + (after! haskell-mode (set-repl-handler! 'haskell-mode #'switch-to-haskell) (add-to-list 'completion-ignored-extensions ".hi")) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index 6840470fa..91ac803ee 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -11,7 +11,6 @@ (unless (executable-find "stack") (warn! "Couldn't find stack. Intero will not work."))) -(when (featurep! +hindent) - (unless (executable-find "hindent") - (warn! "Couldn't find hindent. hindent-mode won't work."))) +(unless (executable-find "hindent") + (warn! "Couldn't find hindent. hindent-mode won't work.")) diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index dd3cb634d..f70614cb8 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -8,6 +8,5 @@ (package! dante)) (t (package! intero))) -(when (featurep! +hindent) - (package! hindent)) +(package! hindent) From f915f8c864610e6432484e03b1a6855cd128fa95 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 02:52:06 +0200 Subject: [PATCH 2198/4235] Fix wakatime-api-key not persisting across sessions Caused because customize'd variables aren't set until they're defined, so we have to load wakatime-mode first. --- modules/tools/wakatime/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index aeded0490..37eb972f1 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -22,7 +22,6 @@ changes." (unless api-key (user-error "No api key was received.")) (require 'wakatime-mode) - (setq wakatime-api-key api-key) (customize-set-variable 'wakatime-api-key api-key) (customize-save-customized) (unless (or (and wakatime-cli-path (file-executable-p wakatime-cli-path)) @@ -37,7 +36,8 @@ changes." "Initialize wakatime (if `wakatime-api-key' is set, otherwise no-op with a warning)." (interactive) - (if (not (bound-and-true-p wakatime-api-key)) + (require 'wakatime-mode) + (if (not wakatime-api-key) (message "wakatime-mode isn't set up. Run `M-x +wakatime/setup' to do so.") (when +wakatime-home (unless (file-directory-p +wakatime-home) From 75457f63fee20e9ea1cd442d34e8f1712fb199c1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 02:53:18 +0200 Subject: [PATCH 2199/4235] lang/org: refactor & disable evil-org-set-key-theme + It's too much trouble supporting the evil-org-set-key-theme workflow. Perhaps I'll make it complain when you do. + Don't add +org|setup-ui to doom-load-theme-hook, it's unnecsesary. + Use faces in org-priority-faces rather than colors. --- modules/lang/org/config.el | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 5089a24f9..4b382a96c 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -29,8 +29,8 @@ (add-hook 'org-load-hook #'+org|setup-evil) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config - ;; in case it is called later - (advice-add #'evil-org-set-key-theme :after #'+org|setup-evil) + ;; only support the `evil-org-key-theme' workflow + (advice-add #'evil-org-set-key-theme :override #'ignore) (def-package! evil-org-agenda :after org-agenda :config (evil-org-agenda-set-keys))) @@ -174,9 +174,9 @@ unfold to point on startup." org-pretty-entities nil org-pretty-entities-include-sub-superscripts t org-priority-faces - `((?a . ,(face-foreground 'error)) - (?b . ,(face-foreground 'warning)) - (?c . ,(face-foreground 'success))) + '((?a . error) + (?b . warning) + (?c . success)) org-startup-folded t org-startup-indented t org-startup-with-inline-images nil @@ -192,8 +192,8 @@ unfold to point on startup." org-preview-latex-image-directory (concat doom-cache-dir "org-latex/") org-format-latex-options (plist-put org-format-latex-options :scale 1.5)) - ;; Previews are usually rendered with light backgrounds, so ensure their - ;; background (and foreground) match the current theme. + ;; Previews are usually rendered with light backgrounds, so ensure their + ;; background (and foreground) match the current theme. (defun +org|update-latex-faces () (setq-default org-format-latex-options @@ -241,10 +241,7 @@ unfold to point on startup." (def-org-file-link! "org" org-directory) (def-org-file-link! "doom" doom-emacs-dir) (def-org-file-link! "doom-docs" doom-docs-dir) - (def-org-file-link! "doom-modules" doom-modules-dir) - - ;; Update UI when theme is changed - (add-hook 'doom-load-theme-hook #'+org|setup-ui)) + (def-org-file-link! "doom-modules" doom-modules-dir)) (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies From 69143b20f8e070569393d1f2c12a323b2390545a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 02:57:02 +0200 Subject: [PATCH 2200/4235] feature/evil: remove macroexpand Snuck into a commit --- modules/feature/evil/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f32ff1142..7703b3498 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -128,9 +128,8 @@ variable for an explanation of the defaults (in comments). See ;; Other commands can make use of this (evil-define-interactive-code "" :ex-arg buffer-match (list (if (evil-ex-p) evil-ex-argument))) - (macroexpand ' - (evil-define-interactive-code "" - :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument)))) + (evil-define-interactive-code "" + :ex-arg global-match (list (if (evil-ex-p) evil-ex-argument))) ;; By default :g[lobal] doesn't highlight matches in the current buffer. I've ;; got to write my own argument type and interactive code to get it to do so. From 123df290a6646a31618ad6696896c2c76f4b0270 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 03:05:47 +0200 Subject: [PATCH 2201/4235] Rewrite evil +everywhere & evil-collection init Fixes a couple issues with certain evil-collection modules not loading and removes some redundant config for 'replace. --- modules/feature/evil/+everywhere.el | 227 ++++++++++++++++++++++++++++ modules/feature/evil/config.el | 188 +---------------------- 2 files changed, 228 insertions(+), 187 deletions(-) create mode 100644 modules/feature/evil/+everywhere.el diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el new file mode 100644 index 000000000..1d273272e --- /dev/null +++ b/modules/feature/evil/+everywhere.el @@ -0,0 +1,227 @@ +;;; feature/evil/+everywhere.el -*- lexical-binding: t; -*- + +;; Here we *truly* lazy-load evil-collection's modules by ensuring its modules +;; do not load at startup (some of them, like buff-menu, help or elisp-mode are +;; loaded immediately, causing evil-collection to be pulled in). +;; +;; We load evil-collection ourselves for three reasons: +;; +;; 1. To truly lazy load it. Some of its modules, like the elisp-mode and +;; buff-menu ones are loaded immediately, because Emacs loads them +;; immediately. +;; 2. This ensures a predictable load order, versus lazy loading using :defer or +;; :after-call. This means users can use (after! org ...) and be sure that +;; their changes will override evil-collection's. +;; 3. I don't completely agree with all of evil-collection's design choices. +;; Sometimes, I disagree with entire modules. Other times it's just a couple +;; keybinds. I'd rather do all this integration work internally, rather than +;; delegate it to another package that I cannot control or predict. +;; 4. Adds `+evil-collection-disabled-list', to make it easier for users to +;; disable modules. + +(defvar +evil-collection-disabled-list () + "A list of `evil-collection' modules to ignore. See the definition of this +variable for an explanation of the defaults (in comments). See +`evil-collection-mode-list' for a list of available options.") + +(defvar evil-collection-mode-list + `(ace-jump-mode + ag + alchemist + ;; anaconda-mode + arc-mode + avy + bookmark + ;; (buff-menu "buff-menu") + calc + calendar + cider + cmake-mode + ;; comint + ;; company + compile + ;; custom + cus-theme + daemons + debbugs + debug + diff-mode + ;; dired + doc-view + edebug + ediff + ;; eldoc + ;; elfeed + ;; elisp-mode + elisp-refs + emms + epa + ;; ert + eshell + eval-sexp-fu + etags-select + eww + flycheck + ;; free-keys + geiser + ggtags + git-timemachine + go-mode + ;; help + guix + ;; helm + ibuffer + ;; image + image+ + indium + info + ;; ivy + js2-mode + log-view + lsp-ui-imenu + lua-mode + ;; kotlin-mode + macrostep + man + magit + mu4e + mu4e-conversation + neotree + notmuch + nov + ;; occur is in replace.el which was built-in before Emacs 26. + ;; (occur ,(if EMACS26+ 'replace "replace")) + outline + p4 + ;; (package-menu package) + paren + pass + (pdf pdf-view) + popup + proced + prodigy + profiler + python + quickrun + racer + realgud + reftex + rjsx-mode + robe + ;; ruby-mode + rtags + ;; simple + ;; slime + (term term ansi-term multi-term) + tide + transmission + typescript-mode + vc-annotate + vdiff + view + vlf + which-key + wdired + wgrep + woman + xref + (ztree ztree-diff))) + +(defun +evil-collection-init (module) + (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) + (when doom-debug-mode + (message "Loaded evil-collection-%s" (or (car-safe module) module))) + (evil-collection-init (list module)))) + + +;; +;; Bootstrap +;; + +(after! eldoc + (eldoc-add-command-completions "evil-window-")) + +(after! comint + (evil-define-key* 'normal comint-mode-map + (kbd "C-d") #'evil-scroll-down + (kbd "C-n") #'comint-next-input + (kbd "C-p") #'comint-previous-input + (kbd "gj") #'comint-next-input + (kbd "gk") #'comint-previous-input + (kbd "]") #'comint-next-input + (kbd "[") #'comint-previous-input) + (evil-define-key* 'insert comint-mode-map + (kbd "") #'comint-previous-input + (kbd "") #'comint-next-input)) + +(after! cus-edit + (evil-set-initial-state 'Custom-mode 'normal) + (evil-define-key* 'motion custom-mode-map + (kbd "") #'widget-forward + (kbd "S-") #'widget-backward + (kbd "") #'widget-backward + (kbd "]") #'widget-forward + (kbd "[") #'widget-backward + (kbd "C-n") #'widget-forward + (kbd "C-p") #'widget-backward + "gj" #'widget-forward + "gk" #'widget-backward) + (evil-define-key* 'normal custom-mode-map + (kbd "") #'Custom-newline + (kbd "C-o") #'Custom-goto-parent + "^" #'Custom-goto-parent + "<" #'Custom-goto-parent + ;; quit + "q" #'Custom-buffer-done + "ZQ" #'evil-quit + "ZZ" #'Custom-buffer-done)) + +(after! help-mode + (evil-set-initial-state 'help-mode 'normal) + (evil-define-key* 'normal help-mode-map + ;; motion + (kbd "SPC") #'scroll-up-command + (kbd "S-SPC") #'scroll-down-command + (kbd "C-f") #'scroll-up-command + (kbd "C-b") #'scroll-down-command + (kbd "") #'forward-button + (kbd "") #'backward-button + (kbd "C-o") #'help-go-back + (kbd "C-i") #'help-go-forward + ;; TODO: Enable more help-go-* bindings? + ;; "gj" #'help-go-forward + ;; "gk" #'help-go-back + ;; "\C-j" #'help-go-forward + ;; "\C-k" #'help-go-back + ;; The following bindings don't do what they are supposed to. "go" should + ;; open in the same window and "gO" should open in a different one. + "go" #'push-button + "gO" #'push-button + "g?" #'describe-mode + "gr" #'revert-buffer + "<" #'help-go-back + ">" #'help-go-forward + "r" #'help-follow + ;; quit + "q" #'quit-window + "ZQ" #'evil-quit + "ZZ" #'quit-window)) + +;; These modes belong to packages that Emacs always loads at startup, causing +;; evil-collection to load immediately. By tacking it on to the modes +;; themselves, rather than the package being loaded, we manage to truly lazy +;; load evil-collection. +(add-transient-hook! 'Buffer-menu-mode + (+evil-collection-init '(buff-menu "buff-menu"))) +(add-transient-hook! 'image-mode + (+evil-collection-init 'image)) +(add-transient-hook! 'emacs-lisp-mode + (+evil-collection-init 'elisp-mode)) +(add-transient-hook! 'occur-mode + (+evil-collection-init (if EMACS26+ 'replace "replace"))) + +;; Let 'er rip! +(dolist (mode evil-collection-mode-list) + (dolist (req (or (cdr-safe mode) (list mode))) + (with-eval-after-load req + (+evil-collection-init (list mode))))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 7703b3498..b53c047b8 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -145,194 +145,8 @@ variable for an explanation of the defaults (in comments). See '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t) ;; `evil-collection' - ;; *Truly* lazy-load evil-collection's modules, and do ourselves, here, - ;; instead of lazy-loading evil-collection.el so we can ensure `after!' blocks - ;; in private configs happen after evil-collection has finished. - ;; - ;; Also so we can be very selective about what modules it loads. (when (featurep! +everywhere) - (after! eldoc - (eldoc-add-command-completions "evil-window-")) - - (after! comint - (evil-define-key* 'normal comint-mode-map - (kbd "C-d") #'evil-scroll-down - (kbd "C-n") #'comint-next-input - (kbd "C-p") #'comint-previous-input - (kbd "gj") #'comint-next-input - (kbd "gk") #'comint-previous-input - (kbd "]") #'comint-next-input - (kbd "[") #'comint-previous-input) - (evil-define-key* 'insert comint-mode-map - (kbd "") #'comint-previous-input - (kbd "") #'comint-next-input)) - - (after! cus-edit - (evil-set-initial-state 'Custom-mode 'normal) - (evil-define-key* 'motion custom-mode-map - (kbd "") 'widget-forward - (kbd "S-") 'widget-backward - (kbd "") 'widget-backward - (kbd "]") 'widget-forward - (kbd "[") 'widget-backward - (kbd "C-n") 'widget-forward - (kbd "C-p") 'widget-backward - "gj" 'widget-forward - "gk" 'widget-backward) - (evil-define-key* 'normal custom-mode-map - (kbd "") 'Custom-newline - (kbd "C-o") 'Custom-goto-parent - "^" 'Custom-goto-parent - "<" 'Custom-goto-parent - ;; quit - "q" 'Custom-buffer-done - "ZQ" 'evil-quit - "ZZ" 'Custom-buffer-done)) - - (after! help-mode - (evil-set-initial-state 'help-mode 'normal) - (evil-define-key* 'normal help-mode-map - ;; motion - (kbd "SPC") 'scroll-up-command - (kbd "S-SPC") 'scroll-down-command - (kbd "C-f") 'scroll-up-command - (kbd "C-b") 'scroll-down-command - (kbd "") 'forward-button - (kbd "") 'backward-button - (kbd "C-o") 'help-go-back - (kbd "C-i") 'help-go-forward - ;; TODO: Enable more help-go-* bindings? - ;; "gj" 'help-go-forward - ;; "gk" 'help-go-back - ;; "\C-j" 'help-go-forward - ;; "\C-k" 'help-go-back - ;; The following bindings don't do what they are supposed to. "go" should - ;; open in the same window and "gO" should open in a different one. - "go" 'push-button - "gO" 'push-button - "g?" 'describe-mode - "gr" 'revert-buffer - "<" 'help-go-back - ">" 'help-go-forward - "r" 'help-follow - ;; quit - "q" 'quit-window - "ZQ" 'evil-quit - "ZZ" 'quit-window)) - - (defun +evil-collection-init (module) - (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) - (evil-collection-init (list module)))) - - (add-transient-hook! 'image-mode (+evil-collection-init 'image)) - (add-transient-hook! 'emacs-lisp-mode (+evil-collection-init 'elisp-mode)) - - (defvar evil-collection-mode-list - '(ace-jump-mode - ag - alchemist - ;; anaconda-mode - arc-mode - avy - bookmark - (buff-menu "buff-menu") - calc - calendar - cider - cmake-mode - ;; comint - ;; company - compile - ;; custom - cus-theme - daemons - debbugs - debug - diff-mode - ;; dired - doc-view - edebug - ediff - ;; eldoc - ;; elfeed - ;; elisp-mode - elisp-refs - emms - epa - ;; ert - eshell - eval-sexp-fu - etags-select - eww - flycheck - ;; free-keys - geiser - ggtags - git-timemachine - go-mode - ;; help - guix - ;; helm - ibuffer - ;; image - image+ - indium - info - ;; ivy - js2-mode - log-view - lsp-ui-imenu - lua-mode - ;; kotlin-mode - macrostep - man - magit - mu4e - mu4e-conversation - neotree - notmuch - nov - ;; occur is in replace.el which was built-in before Emacs 26. - (occur ,(if EMACS26+ 'replace "replace")) - outline - p4 - ;; (package-menu package) - paren - pass - (pdf pdf-view) - popup - proced - prodigy - profiler - python - quickrun - racer - realgud - reftex - rjsx-mode - robe - ;; ruby-mode - rtags - ;; simple - ;; slime - (term term ansi-term multi-term) - tide - transmission - typescript-mode - vc-annotate - vdiff - view - vlf - which-key - wdired - wgrep - woman - xref - (ztree ztree-diff))) - - (dolist (req evil-collection-mode-list) - (with-eval-after-load (car (doom-enlist req)) - (+evil-collection-init (list req)))))) + (load! "+everywhere"))) ;; From 8b9d4a94bbe9db38eb2783c73ef9c7edca0cf91a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 03:09:06 +0200 Subject: [PATCH 2202/4235] Define evil-want-* options as defvars To make it easier for users to customize. --- modules/feature/evil/config.el | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index b53c047b8..5540bad77 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -3,17 +3,15 @@ ;; I'm a vimmer at heart. Its modal philosophy suits me better, and this module ;; strives to make Emacs a much better vim than vim was. -(defvar +evil-collection-disabled-list () - "A list of `evil-collection' modules to ignore. See the definition of this -variable for an explanation of the defaults (in comments). See -`evil-collection-mode-list' for a list of available options.") +;; Set these defaults before `evil'; use `defvar' so they can be changed prior +;; to loading. +(defvar evil-want-C-u-scroll t) +(defvar evil-want-C-w-scroll t) +(defvar evil-want-Y-yank-to-eol t) (def-package! evil :init - (setq evil-want-C-u-scroll t - evil-want-C-w-delete t - evil-want-Y-yank-to-eol t - evil-want-visual-char-semi-exclusive t + (setq evil-want-visual-char-semi-exclusive t evil-magic t evil-echo-state t evil-indent-convert-tabs t From ca5ff92192ff14e09e3d37ea784cddf1128481b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 12:02:21 +0200 Subject: [PATCH 2203/4235] Fix void-variable: package errors in doom doctor Reported by @zaiste --- bin/doom-doctor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index d1befbdf1..eca264076 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -307,7 +307,7 @@ (doom-package-prop name :ignore t) (package-built-in-p name) (package-installed-p name)) - do (error! "%s is not installed" (car package)))) + do (error! "%s is not installed" name))) (let ((doom--stage 'doctor)) (load doctor-file t t))))) (file-missing (error! "%s" (error-message-string ex))) From d55c7896f12a9493cc3f3460b1f14feac26a2eec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 18:48:01 +0200 Subject: [PATCH 2204/4235] Fix lazy loading of elisp-mode config elisp-mode is loaded at startup, so the usual methods won't work. Instead, we tie a transient advice to the emacs-lisp-mode function, *however*, this function is commonly called by various packages to parse elisp code! So we have to make sure the emacs lisp module only initializes the first time it is used interactively. --- modules/lang/emacs-lisp/config.el | 118 ++++++++++++++++-------------- 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index a39f2da66..224b53944 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -2,66 +2,72 @@ (add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) -(defun +emacs-lisp|init () - (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) - (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) - (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) - (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") - (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") - (set-rotate-patterns! 'emacs-lisp-mode - :symbols '(("t" "nil") - ("let" "let*") - ("when" "unless") - ("append" "prepend") - ("advice-add" "advice-remove") - ("add-hook" "remove-hook") - ("add-hook!" "remove-hook!"))) +(add-hook! 'emacs-lisp-mode-hook + #'(;; 3rd-party functionality + auto-compile-on-save-mode doom|enable-delete-trailing-whitespace + ;; fontification + rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification + ;; initialization + +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) - (add-hook! 'emacs-lisp-mode-hook - #'(;; 3rd-party functionality - auto-compile-on-save-mode doom|enable-delete-trailing-whitespace - ;; fontification - rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification - ;; initialization - +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) +(defun +emacs-lisp|init (&rest _) + ;; Some plugins will run `emacs-lisp-mode' with `emacs-lisp-mode-hook' set to + ;; nil (cough yasnippet cough) or its mode hooks delayed. This prematurely + ;; fires this function. Most of these setters affect emacs-lisp-mode-hook, so + ;; they'd be swallowed up if it's letbound to nil, causing a half-initialized + ;; elisp-mode in some sessions. + (when (and emacs-lisp-mode-hook (not delay-mode-hooks)) + (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) + (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) + (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) + (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") + (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") + (set-rotate-patterns! 'emacs-lisp-mode + :symbols '(("t" "nil") + ("let" "let*") + ("when" "unless") + ("append" "prepend") + ("advice-add" "advice-remove") + ("add-hook" "remove-hook") + ("add-hook!" "remove-hook!"))) + ;; + (advice-remove #'emacs-lisp-mode #'+emacs-lisp|init))) +(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init) - ;; - (defun +emacs-lisp|extra-fontification () - "Display lambda as a smybol and fontify doom module functions." - (font-lock-add-keywords - nil `(;; Highlight custom Doom cookies - ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; Highlight doom/module functions - ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) +(defun +emacs-lisp|extra-fontification () + "Display lambda as a smybol and fontify doom module functions." + (font-lock-add-keywords + nil `(;; Highlight custom Doom cookies + ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) + ;; Highlight doom/module functions + ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) - (defun +emacs-lisp|init-imenu () - "Improve imenu support with better expression regexps and Doom-specific forms." - (setq imenu-generic-expression - '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) - ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) - ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) - ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) - ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) - ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") - ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) - ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) - ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) - ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) - ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) - ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) - ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) +(defun +emacs-lisp|init-imenu () + "Improve imenu support with better expression regexps and Doom-specific forms." + (setq imenu-generic-expression + '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) + ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) + ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) + ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) + ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) + ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") + ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) + ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) + ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) + ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) + ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) + ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) + ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) - (defun +emacs-lisp|disable-flycheck-maybe () - "Disable flycheck-mode if in emacs.d." - (when (or (not buffer-file-name) - (cl-loop for dir in (list doom-emacs-dir doom-private-dir) - if (file-in-directory-p buffer-file-name dir) - return t)) - (flycheck-mode -1)))) - -(add-transient-hook! 'emacs-lisp-mode (+emacs-lisp|init)) +(defun +emacs-lisp|disable-flycheck-maybe () + "Disable flycheck-mode if in emacs.d." + (when (or (not buffer-file-name) + (cl-loop for dir in (list doom-emacs-dir doom-private-dir) + if (file-in-directory-p buffer-file-name dir) + return t)) + (flycheck-mode -1))) ;; From 26f514001e802ece0c2321c2e5a9958eff51dc6b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 18:51:32 +0200 Subject: [PATCH 2205/4235] Autoload git-gutter:{revert-hook,stage-hunk} In case they're used before git-gutter has loaded; they should be allowed to error themselves. --- modules/ui/vc-gutter/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index ee90b7a15..f8d47ec68 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -21,7 +21,7 @@ to the right fringe.") ;; (def-package! git-gutter-fringe - :defer t + :commands (git-gutter:revert-hunk git-gutter:stage-hunk) :init (defun +version-control|git-gutter-maybe () "Enable `git-gutter-mode' in non-remote buffers." From 5ae25318a4f04fff8a957931e6b75e6a884fa041 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 18:53:05 +0200 Subject: [PATCH 2206/4235] Remove fmakunbound from add-transient-hook! unintern is enough. --- core/core-lib.el | 1 - 1 file changed, 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 8e1a35fcd..d7078d8ef 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -300,7 +300,6 @@ HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." ,@forms (cond ((functionp ,hook) (advice-remove ,hook #',fn)) ((symbolp ,hook) (remove-hook ,hook #',fn))) - (fmakunbound ',fn) (unintern ',fn nil))) (cond ((functionp ,hook) (advice-add ,hook ,(if append :after :before) #',fn)) From 5a63f9cb30ffbf81e9cfc24e2086d0dbb83cdbf9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 19:12:56 +0200 Subject: [PATCH 2207/4235] Fix some evil-collection modules not loading Because evil-collection-init was enclosed in one list too many. --- modules/feature/evil/+everywhere.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 1d273272e..3dcb2e30b 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -224,4 +224,4 @@ variable for an explanation of the defaults (in comments). See (dolist (mode evil-collection-mode-list) (dolist (req (or (cdr-safe mode) (list mode))) (with-eval-after-load req - (+evil-collection-init (list mode))))) + (+evil-collection-init mode)))) From 029824b6c1f33bea72e7555eda2c05efcf9bba2a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 19:13:54 +0200 Subject: [PATCH 2208/4235] Update company-box icons Inspired by @fuxialexander's config --- modules/completion/company/config.el | 35 ++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index a15e9c523..093c88070 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -34,13 +34,40 @@ :hook (company-mode . company-box-mode) :config (setq company-box-backends-colors nil + company-box-max-candidates 50 + company-box-icons-yasnippet (all-the-icons-material "short_text" :face 'all-the-icons-green) + company-box-icons-unknown (all-the-icons-material "find_in_page" :face 'all-the-icons-purple) company-box-icons-elisp - (list (all-the-icons-material "functions" :face 'all-the-icons-purple) + (list (all-the-icons-material "functions" :face 'all-the-icons-red) (all-the-icons-material "check_circle" :face 'all-the-icons-blue) - (all-the-icons-material "stars" :face 'all-the-icons-yellow) + (all-the-icons-material "stars" :face 'all-the-icons-orange) (all-the-icons-material "format_paint" :face 'all-the-icons-pink)) - company-box-icons-unknown (all-the-icons-material "find_in_page" :face 'all-the-icons-silver) - company-box-icons-yasnippet (all-the-icons-material "short_text" :face 'all-the-icons-green))) + company-box-icons-lsp + '((1 . (all-the-icons-material "text_fields" :face 'all-the-icons-green)) ; text + (2 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; method + (3 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; function + (4 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; constructor + (5 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; field + (6 . (all-the-icons-material "adjust" :face 'all-the-icons-blue)) ; variable + (7 . (all-the-icons-material "class" :face 'all-the-icons-red)) ; class + (8 . (all-the-icons-material "settings_input_component" :face 'all-the-icons-red)) ; interface + (9 . (all-the-icons-material "view_module" :face 'all-the-icons-red)) ; module + (10 . (all-the-icons-material "settings" :face 'all-the-icons-red)) ; property + (11 . (all-the-icons-material "straighten" :face 'all-the-icons-red)) ; unit + (12 . (all-the-icons-material "filter_1" :face 'all-the-icons-red)) ; value + (13 . (all-the-icons-material "plus_one" :face 'all-the-icons-red)) ; enum + (14 . (all-the-icons-material "filter_center_focus" :face 'all-the-icons-red)) ; keyword + (15 . (all-the-icons-material "short_text" :face 'all-the-icons-red)) ; snippet + (16 . (all-the-icons-material "color_lens" :face 'all-the-icons-red)) ; color + (17 . (all-the-icons-material "insert_drive_file" :face 'all-the-icons-red)) ; file + (18 . (all-the-icons-material "collections_bookmark" :face 'all-the-icons-red)) ; reference + (19 . (all-the-icons-material "folder" :face 'all-the-icons-red)) ; folder + (20 . (all-the-icons-material "people" :face 'all-the-icons-red)) ; enumMember + (21 . (all-the-icons-material "pause_circle_filled" :face 'all-the-icons-red)) ; constant + (22 . (all-the-icons-material "streetview" :face 'all-the-icons-red)) ; struct + (23 . (all-the-icons-material "event" :face 'all-the-icons-red)) ; event + (24 . (all-the-icons-material "control_point" :face 'all-the-icons-red)) ; operator + (25 . (all-the-icons-material "class" :face 'all-the-icons-red))))) (def-package! company-dict From 5bcec25529edb57631d0c8df8e7c4e4998f0e896 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 19:23:27 +0200 Subject: [PATCH 2209/4235] Fix +eshell/open-fullscreen reusing eshell buffers It should spawn a new one, no matter what. Also fixes wconf restoration on quit. --- modules/emacs/eshell/autoload/eshell.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index d6b9fbc8e..0902a974e 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -7,7 +7,6 @@ (defvar +eshell--last-buffer nil) -(defvar-local +eshell--wconf nil) ;; @@ -106,11 +105,14 @@ "Open eshell in a separate workspace. Requires the (:feature workspaces) module to be loaded." (interactive "P") - (let ((default-directory (if arg default-directory (doom-project-root)))) - (setq +eshell--wconf (current-window-configuration)) + (let ((default-directory (if arg default-directory (doom-project-root))) + (buf (+eshell--unused-buffer 'new))) + (set-frame-parameter nil 'saved-wconf (current-window-configuration)) (delete-other-windows) - (with-current-buffer (+eshell/open arg command) - (setq-local +eshell--wconf (current-window-configuration))))) + (with-current-buffer (switch-to-buffer buf) + (eshell-mode) + (if command (+eshell-run-command command buf))) + buf)) ;; @@ -247,8 +249,10 @@ delete." (let ((buf (current-buffer))) (when (+eshell--remove-buffer buf) (+eshell--setup-window (get-buffer-window buf) nil) - (cond (+eshell--wconf - (set-window-configuration +eshell--wconf)) + (cond ((and (one-window-p) + (window-configuration-p (frame-parameter nil 'saved-wconf))) + (set-window-configuration (frame-parameter nil 'saved-wconf)) + (set-frame-parameter nil 'saved-wconf nil)) ((one-window-p) (let ((prev (save-window-excursion (previous-buffer)))) (unless (and prev (doom-real-buffer-p prev)) From dceb9bea09c413c6a12729f6ddc8f6f445d0b0c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 19:34:48 +0200 Subject: [PATCH 2210/4235] Fix +eshell-enable-new-shell-on-split Also enables this implicitly after opening eshell with +eshell/open-fullscreen. --- modules/emacs/eshell/autoload/eshell.el | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 0902a974e..b0ac1c5c0 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -23,9 +23,9 @@ (defun +eshell--bury-buffer () (unless (switch-to-prev-buffer nil 'bury) - (switch-to-buffer (doom-fallback-buffer)) - (when +eshell-enable-new-shell-on-split - (+eshell/open t)))) + (switch-to-buffer (doom-fallback-buffer))) + (when +eshell-enable-new-shell-on-split + (+eshell/open t))) (defun +eshell--setup-window (window &optional flag) (when (window-live-p window) @@ -163,15 +163,22 @@ delete." (defun +eshell/split-below () "Create a new eshell window below the current one." (interactive) - (select-window (split-window-vertically)) - (+eshell--bury-buffer)) + (let ((ignore-window-parameters t) + (+eshell-enable-new-shell-on-split + (or +eshell-enable-new-shell-on-split (frame-parameter nil 'saved-wconf)))) + (select-window (split-window-vertically)) + (+eshell--bury-buffer))) ;;;###autoload (defun +eshell/split-right () "Create a new eshell window to the right of the current one." (interactive) - (select-window (split-window-horizontally)) - (+eshell--bury-buffer)) + (let* ((ignore-window-parameters t) + (window-state (window-state-get)) + (+eshell-enable-new-shell-on-split + (or +eshell-enable-new-shell-on-split (frame-parameter nil 'saved-wconf)))) + (select-window (split-window-horizontally)) + (+eshell--bury-buffer))) ;;;###autoload (defun +eshell/switch-to-next () From 4f40fef59265d86ee25d458be9c478035b3cd9b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 19:35:22 +0200 Subject: [PATCH 2211/4235] Refuse to enable intero-mode if intero is absent Rather than checking for stack. --- modules/lang/haskell/+intero.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 5dc501743..1be965665 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -8,9 +8,9 @@ "Initializes `intero-mode' in haskell-mode, unless stack isn't installed. This is necessary because `intero-mode' doesn't do its own error checks." (when (derived-mode-p 'haskell-mode) - (if (executable-find "stack") + (if (executable-find "intero") (intero-mode +1) - (message "Couldn't find stack. Refusing to enable intero-mode.")))) + (message "Couldn't find intero. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) From 24ac13a804f7ed6c53bde2196b8f0f840cc8d75e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 19:35:41 +0200 Subject: [PATCH 2212/4235] Remove periods from haskell doctor warnings It is an Emacs convention not to end errors in punctuation (unless they're multi-line). --- modules/lang/haskell/doctor.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index 91ac803ee..df465bc7b 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -3,14 +3,14 @@ (when (featurep! +dante) (unless (executable-find "cabal") - (warn! "Couldn't find cabal, haskell-mode may have issues.")) + (warn! "Couldn't find cabal, haskell-mode may have issues")) (unless (executable-find "hlint") - (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode."))) + (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode"))) (when (featurep! +intero) (unless (executable-find "stack") - (warn! "Couldn't find stack. Intero will not work."))) + (warn! "Couldn't find stack. Intero will not work"))) (unless (executable-find "hindent") - (warn! "Couldn't find hindent. hindent-mode won't work.")) + (warn! "Couldn't find hindent. hindent-mode won't work")) From 4a213e07f80d136b2ab3d8fc024b4cd57976b3d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 20:31:56 +0200 Subject: [PATCH 2213/4235] Fix void-function ivy--matcher-desc When invoking +ivy-coo-hydra/body Reported by @fuxialexander --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e6f51fba9..b57eab9f0 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -122,7 +122,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-hydra - :commands (+ivy@coo/body ivy-dispatching-done-hydra) + :commands (ivy-dispatching-done-hydra ivy--matcher-desc) :init (after! ivy (define-key! ivy-minibuffer-map From e9ccc09fe4b47cf241e5ca8e4a1a3f3ac94fbd49 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 20:35:49 +0200 Subject: [PATCH 2214/4235] Fix featurep! check in app/rss Reported by @sarg --- 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 1318a4d33..1f39c1f7a 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -47,7 +47,7 @@ absolute paths.") (define-key! elfeed-show-mode-map [remap next-buffer] #'+rss/next [remap previous-buffer] #'+rss/previous)) - (when (featurep 'evil +everywhere) + (when (featurep! :feature evil +everywhere) (evil-define-key 'normal elfeed-search-mode-map "q" #'+rss/quit "r" #'elfeed-update From 5a7c8803d9ec1806524b1b9ac942935e41c8128b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 21:29:28 +0200 Subject: [PATCH 2215/4235] Remove :when support from after!; add defer-until! New macro does what the :when keyword did for after!. --- core/core-lib.el | 33 ++++++++++++---------- modules/feature/file-templates/autoload.el | 4 +-- modules/feature/lookup/autoload/devdocs.el | 2 +- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index d7078d8ef..44d2914b1 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -222,6 +222,23 @@ MATCH is a string regexp. Only entries that match it will be included." (defalias 'lambda! 'λ!) +(defmacro defer-until! (condition &rest body) + "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to +serve as a predicated alternative to `after!'." + (declare (indent defun) (debug t)) + `(if ,(cadr targets) + (progn ,@body) + ,(let ((fun (gensym "doom|delay-form-"))) + `(progn + (fset ',fun (lambda (&rest args) + (when ,(or (car (cdr-safe targets)) t) + (remove-hook 'after-load-functions #',fun) + (unintern ',fun nil) + (ignore args) + ,@body))) + (put ',fun 'permanent-local-hook t) + (add-hook 'after-load-functions #',fun))))) + (defmacro after! (targets &rest body) "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation. This will no-op on features that have been disabled by the user." @@ -229,7 +246,6 @@ compilation. This will no-op on features that have been disabled by the user." (unless (and (symbolp targets) (memq targets (bound-and-true-p doom-disabled-packages))) (list (if (or (not (bound-and-true-p byte-compile-current-file)) - (eq (car-safe targets) :when) (dolist (next (doom-enlist targets)) (unless (keywordp next) (if (symbolp next) @@ -237,20 +253,7 @@ compilation. This will no-op on features that have been disabled by the user." (load next :no-message :no-error))))) #'progn #'with-no-warnings) - (cond ((eq (car-safe targets) :when) - `(if ,(cadr targets) - (progn ,@body) - ,(let ((fun (gensym "doom|delay-form-"))) - `(progn - (fset ',fun (lambda (&rest args) - (when ,(or (car (cdr-safe targets)) t) - (remove-hook 'after-load-functions #',fun) - (unintern ',fun nil) - (ignore args) - ,@body))) - (put ',fun 'permanent-local-hook t) - (add-hook 'after-load-functions #',fun))))) - ((symbolp targets) + (cond ((symbolp targets) `(with-eval-after-load ',targets ,@body)) ((and (consp targets) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 731edb9bb..acd8b0ca2 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -30,13 +30,13 @@ these properties: If non-nil, don't expand any template for this file and don't test any other file template rule against this buffer." (declare (indent defun)) - (after! (:when (boundp '+file-templates-alist)) + (defer-until! (boundp '+file-templates-alist) (+file-templates--set pred plist))) ;;;###autodef (defun set-file-templates! (&rest templates) "Like `set-file-templates!', but register many file templates at once." - (after! (:when (boundp '+file-templates-alist)) + (defer-until! (boundp '+file-templates-alist) (dolist (template templates) (+file-templates--set (car template) (cdr template))))) diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el index 5baf61cf4..5625c81e9 100644 --- a/modules/feature/lookup/autoload/devdocs.el +++ b/modules/feature/lookup/autoload/devdocs.el @@ -7,7 +7,7 @@ DOCSET (a string). See `devdocs-alist' for the defaults. " - (after! (:when (boundp 'devdocs-alist)) + (defer-until! (boundp 'devdocs-alist) (dolist (mode (doom-enlist modes)) (setf (alist-get mode devdocs-alist) docset)))) From 07d37f97fb9aa9af34a72c54f73fddcf031cb6ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 22:46:49 +0200 Subject: [PATCH 2216/4235] Refactor after! macro KISS --- core/core-lib.el | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 44d2914b1..76933d046 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -253,21 +253,18 @@ compilation. This will no-op on features that have been disabled by the user." (load next :no-message :no-error))))) #'progn #'with-no-warnings) - (cond ((symbolp targets) - `(with-eval-after-load ',targets - ,@body)) - ((and (consp targets) - (memq (car targets) '(:or :any))) - `(progn - ,@(cl-loop for next in (cdr targets) - collect `(after! ,next ,@body)))) - ((and (consp targets) - (memq (car targets) '(:and :all))) - (dolist (next (cdr targets)) - (setq body `((after! ,next ,@body)))) - (car body)) - ((listp targets) - `(after! (:all ,@targets) ,@body)))))) + (if (symbolp targets) + `(with-eval-after-load ',targets ,@body) + (pcase (car-safe targets) + ((or :or :any) + (macroexp-progn + (cl-loop for next in (cdr targets) + collect `(after! ,next ,@body)))) + ((or :and :all) + (dolist (next (cdr targets)) + (setq body `((after! ,next ,@body)))) + (car body)) + (_ `(after! (:and ,@targets) ,@body))))))) (defmacro quiet! (&rest forms) "Run FORMS without making any output." From 3742a671a610f11795a54fc2015d458a15b79683 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 22:52:46 +0200 Subject: [PATCH 2217/4235] Rethink lazy-loading of elisp-mode --- modules/lang/emacs-lisp/config.el | 139 +++++++++++++++++------------- 1 file changed, 77 insertions(+), 62 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 224b53944..f32b0eff5 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,73 +1,88 @@ ;;; lang/emacs-lisp/config.el -*- lexical-binding: t; -*- +;; `elisp-mode' is always loaded at startup, so to lazy load its config we need +;; to be creative. So we configure it the first tiem `emacs-lisp-mode' is run. +(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init) +;; And we remove `elisp-mode' so later invokations of (after! elisp-mode ...) +;; work as expected. +(delq 'elisp-mode features) + +(defun +emacs-lisp|init (&rest _) + ;; Some plugins (like yasnippet) will run `emacs-lisp-mode' early, prematurely + ;; triggering this function in a non-ideal environment (`emacs-lisp-mode-hook' + ;; is let-bound to nil). This breaks a lot of Doom setters, because they try + ;; to add hooks to `emacs-lisp-mode-hook'! + ;; + ;; This means, in some sessions, elisp-mode is never configured properly, so + ;; we have to make extra sure `emacs-lisp-mode' was executed interactively. + (when (and emacs-lisp-mode-hook (not delay-mode-hooks)) + (provide 'elisp-mode) + (advice-remove #'emacs-lisp-mode #'+emacs-lisp|init))) + + +;; +;; Config +;; + (add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) -(add-hook! 'emacs-lisp-mode-hook - #'(;; 3rd-party functionality - auto-compile-on-save-mode doom|enable-delete-trailing-whitespace - ;; fontification - rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification - ;; initialization - +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) +(after! elisp-mode + (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) + (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) + (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) + (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") + (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") + (set-rotate-patterns! 'emacs-lisp-mode + :symbols '(("t" "nil") + ("let" "let*") + ("when" "unless") + ("append" "prepend") + ("advice-add" "advice-remove") + ("add-hook" "remove-hook") + ("add-hook!" "remove-hook!"))) -(defun +emacs-lisp|init (&rest _) - ;; Some plugins will run `emacs-lisp-mode' with `emacs-lisp-mode-hook' set to - ;; nil (cough yasnippet cough) or its mode hooks delayed. This prematurely - ;; fires this function. Most of these setters affect emacs-lisp-mode-hook, so - ;; they'd be swallowed up if it's letbound to nil, causing a half-initialized - ;; elisp-mode in some sessions. - (when (and emacs-lisp-mode-hook (not delay-mode-hooks)) - (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) - (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) - (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) - (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") - (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") - (set-rotate-patterns! 'emacs-lisp-mode - :symbols '(("t" "nil") - ("let" "let*") - ("when" "unless") - ("append" "prepend") - ("advice-add" "advice-remove") - ("add-hook" "remove-hook") - ("add-hook!" "remove-hook!"))) - ;; - (advice-remove #'emacs-lisp-mode #'+emacs-lisp|init))) -(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init) + (add-hook! 'emacs-lisp-mode-hook + #'(;; 3rd-party functionality + auto-compile-on-save-mode doom|enable-delete-trailing-whitespace + ;; fontification + rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification + ;; initialization + +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) -(defun +emacs-lisp|extra-fontification () - "Display lambda as a smybol and fontify doom module functions." - (font-lock-add-keywords - nil `(;; Highlight custom Doom cookies - ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; Highlight doom/module functions - ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) + (defun +emacs-lisp|extra-fontification () + "Display lambda as a smybol and fontify doom module functions." + (font-lock-add-keywords + nil `(;; Highlight custom Doom cookies + ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) + ;; Highlight doom/module functions + ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) -(defun +emacs-lisp|init-imenu () - "Improve imenu support with better expression regexps and Doom-specific forms." - (setq imenu-generic-expression - '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) - ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) - ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) - ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) - ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) - ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") - ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) - ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) - ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) - ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) - ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) - ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) - ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) + (defun +emacs-lisp|init-imenu () + "Improve imenu support with better expression regexps and Doom-specific forms." + (setq imenu-generic-expression + '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) + ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) + ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) + ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) + ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) + ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") + ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) + ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) + ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) + ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) + ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) + ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) + ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) -(defun +emacs-lisp|disable-flycheck-maybe () - "Disable flycheck-mode if in emacs.d." - (when (or (not buffer-file-name) - (cl-loop for dir in (list doom-emacs-dir doom-private-dir) - if (file-in-directory-p buffer-file-name dir) - return t)) - (flycheck-mode -1))) + (defun +emacs-lisp|disable-flycheck-maybe () + "Disable flycheck-mode if in emacs.d." + (when (or (not buffer-file-name) + (cl-loop for dir in (list doom-emacs-dir doom-private-dir) + if (file-in-directory-p buffer-file-name dir) + return t)) + (flycheck-mode -1)))) ;; From f6478ab068156787d2f55b7903cb5fdd0e9353a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 22:54:09 +0200 Subject: [PATCH 2218/4235] Refactor out map! usage in lang/emacs-lisp Slowly phasing out map! for internal use. --- modules/lang/emacs-lisp/config.el | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index f32b0eff5..72fc3fc16 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -95,28 +95,28 @@ ;; `macrostep' -(map! :after macrostep - :map macrostep-keymap - :n "RET" #'macrostep-expand - :n "e" #'macrostep-expand - :n "u" #'macrostep-collapse - :n "c" #'macrostep-collapse +(when (featurep! :feature evil) + (after! macrostep + (evil-define-key* 'normal macrostep-keymap + (kbd "RET") #'macrostep-expand + "e" #'macrostep-expand + "u" #'macrostep-collapse + "c" #'macrostep-collapse - :n [tab] #'macrostep-next-macro - :n "C-n" #'macrostep-next-macro - :n "J" #'macrostep-next-macro + [tab] #'macrostep-next-macro + "\C-n" #'macrostep-next-macro + "J" #'macrostep-next-macro - :n [backtab] #'macrostep-prev-macro - :n "K" #'macrostep-prev-macro - :n "C-p" #'macrostep-prev-macro + [backtab] #'macrostep-prev-macro + "K" #'macrostep-prev-macro + "C-p" #'macrostep-prev-macro - :n "q" #'macrostep-collapse-all - :n "C" #'macrostep-collapse-all) + "q" #'macrostep-collapse-all + "C" #'macrostep-collapse-all) -(after! evil - ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't - ;; apply for the very first invocation - (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps)) + ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't + ;; apply for the very first invocation + (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps))) (def-package! flycheck-cask From 0f0f5f6584c3367467f8f7eafd041a16f91d2b2a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Jun 2018 23:17:17 +0200 Subject: [PATCH 2219/4235] Optimize featurep! macro If we can use doom--current-module and evaluate membership at compile-time, we same a little time, but a fair bit more if we byte-compile. --- core/core-modules.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 14d388334..00e2a9550 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -367,16 +367,17 @@ Module FLAGs are set in your config's `doom!' block, typically in When this macro is used from inside a module, MODULE and SUBMODULE can be omitted. eg. (featurep! +flag1)" (unless submodule - (let* ((path (FILE!)) - (module-pair (doom-module-from-path path))) + (let ((module-pair + (or doom--current-module + (doom-module-from-path (FILE!))))) (unless module-pair (error "featurep! couldn't detect what module its in! (in %s)" path)) (setq flag module module (car module-pair) submodule (cdr module-pair)))) (if flag - `(and (memq ',flag (doom-module-get ,module ',submodule :flags)) t) - `(doom-module-p ,module ',submodule))) + (and (memq flag (doom-module-get module submodule :flags)) t) + (doom-module-p module submodule))) ;; From 4eda07e576797f5e8ee3cc746225c36ec91a54dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 00:31:36 +0200 Subject: [PATCH 2220/4235] Don't replace scratch buffer with other popups --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index b07ebe2b6..3f7e8382b 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -146,7 +146,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." ("^\\*doom \\(?:term\\|eshell\\)" :size 0.25 :vslot -10 :select t :quit nil :ttl 0) ("^\\*doom:" - :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) + :vslot -20 :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) ("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" :size +popup-shrink-to-fit :ttl 0 :select ignore) ("^\\*Customize" From 08beff91dae5fe72cbf03fb421758158d8f5ad64 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 11:42:59 +0200 Subject: [PATCH 2221/4235] Bind RET/C-j instead of remapping newline RET -> newline-and-indent C-j -> newline This is basically the opposite of the Emacs default. --- modules/config/default/+bindings.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 8e6e20c2c..670c267f5 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -9,12 +9,15 @@ ;; (map! [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag - [remap newline] #'newline-and-indent ;; Ensure there are no conflicts :nmvo doom-leader-key nil :nmvo doom-localleader-key nil + ;; Swap RET/C-j in insert mode + :i [remap newline] #'newline-and-indent + :i "C-j" #'+default/newline + ;; --- Global keybindings --------------------------- ;; Make M-x available everywhere :gnvime "M-x" #'execute-extended-command From e76e4a1f75bd9726a83c982a5731d69937e1d188 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 12:31:37 +0200 Subject: [PATCH 2222/4235] Fix void-variable errors from defer-until! macro --- core/core-lib.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 76933d046..09f897c86 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -226,12 +226,12 @@ MATCH is a string regexp. Only entries that match it will be included." "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to serve as a predicated alternative to `after!'." (declare (indent defun) (debug t)) - `(if ,(cadr targets) + `(if ,condition (progn ,@body) ,(let ((fun (gensym "doom|delay-form-"))) `(progn (fset ',fun (lambda (&rest args) - (when ,(or (car (cdr-safe targets)) t) + (when ,(or condition t) (remove-hook 'after-load-functions #',fun) (unintern ',fun nil) (ignore args) From b0f59ff5bd1e9818acc90d90047db95a6f4178d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 12:59:29 +0200 Subject: [PATCH 2223/4235] lang/cc: fix wrong-type-argument: stringp error Caused by -stdlib flag being a sub-list in +cc-default-compiler-options, when it should be nil or a string. --- 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 9f7479434..f87e9d344 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -13,7 +13,7 @@ database.") ;; NOTE beware: you'll get abi-inconsistencies when passing ;; std-objects to libraries linked with libstdc++ (e.g. if you ;; use boost which wasn't compiled with libc++) - (list "-stdlib=libc++")))) + "-stdlib=libc++"))) (objc-mode . nil)) "A list of default compiler options for the C family. These are ignored if a compilation database is present in the project.") From f7a4b639e76cbd54f41bd9fe3b5506459d9adddd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 14:25:03 +0200 Subject: [PATCH 2224/4235] Fix read-only errors when reopening eshell buffers Caused because eshell would try to insert the banner into the eshell prompt. --- modules/emacs/eshell/autoload/eshell.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index b0ac1c5c0..def80ad7b 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -85,7 +85,9 @@ (let* ((default-directory (if arg default-directory (doom-project-root))) (buf (+eshell--unused-buffer))) (with-current-buffer (switch-to-buffer buf) - (eshell-mode) + (if (eq major-mode 'eshell-mode) + (run-hooks 'eshell-mode-hook) + (eshell-mode)) (if command (+eshell-run-command command buf))) buf)) @@ -96,7 +98,9 @@ (let* ((default-directory (if arg default-directory (doom-project-root))) (buf (+eshell--unused-buffer))) (with-current-buffer (pop-to-buffer buf) - (eshell-mode) + (if (eq major-mode 'eshell-mode) + (run-hooks 'eshell-mode-hook) + (eshell-mode)) (if command (+eshell-run-command command buf))) buf)) From 6c0c6ee47bea61d6979a7bb0c1fcb4c7694ee187 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 14:25:51 +0200 Subject: [PATCH 2225/4235] Fix infinite recursion when quitting elfeed +rss/quit kills the buffer, triggering its kill-buffer-hook, which calls +rss/quit, triggering its kill-buffer-hook, which calls +rss/quit, triggering its kill-buffer-hook, which calls +rss/quit, triggering its kill-buffer-hook, which calls +rss/quit, triggering its kill-buffer-hook, which calls +rss/quit, triggering its kill-buffer-hook, which calls +rss/quit, triggering its kill-buffer-hook, which calls +rss/quit, which summons Cthulhu... --- 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 1f39c1f7a..a9407dc54 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -49,7 +49,7 @@ absolute paths.") [remap previous-buffer] #'+rss/previous)) (when (featurep! :feature evil +everywhere) (evil-define-key 'normal elfeed-search-mode-map - "q" #'+rss/quit + "q" #'kill-this-buffer "r" #'elfeed-update "s" #'elfeed-search-live-filter (kbd "RET") #'elfeed-search-show-entry From 50991232e6e1ca67b98a4c43fc5dd3870417e312 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 14:44:47 +0200 Subject: [PATCH 2226/4235] sp-escape-quotes-after-insert = nil Smartparens isn't smart enough to escape quotes in many situations (like single quotes in c/c++). --- core/core-editor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index abd3a6e81..79f0485c7 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -149,7 +149,8 @@ fundamental-mode) for performance sake." sp-cancel-autoskip-on-backward-movement nil sp-show-pair-delay 0.1 sp-max-pair-length 4 - sp-max-prefix-length 50) + sp-max-prefix-length 50 + sp-escape-quotes-after-insert nil) ; not smart enough ;; Slim down on smartparens' opinionated behavior (defun doom|disable-smartparens-navigate-skip-match () From dc8c01f17fd94efd59a90ff3a40c8eac838b0aa9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 14:46:33 +0200 Subject: [PATCH 2227/4235] Add +default/newline alias Forgot to add it in 08beff91 --- modules/config/default/autoload/default.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index c49518f0e..87e3277cd 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -77,3 +77,6 @@ If ARG (universal argument), runs `compile' from the current directory." (if (executable-find "man") #'man #'woman))) + +;;;###autoload +(defalias '+default/newline #'newline) From 7bb9adc6bdca11fdab42ba448464d598d840805b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 14:47:14 +0200 Subject: [PATCH 2228/4235] Only clean up after eshell window if visible Killing buried eshell windows shouldn't delete windows or restore any wconfs. --- modules/emacs/eshell/autoload/eshell.el | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index def80ad7b..d2415a6d6 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -259,16 +259,17 @@ delete." "Close window (or workspace) on quit." (let ((buf (current-buffer))) (when (+eshell--remove-buffer buf) - (+eshell--setup-window (get-buffer-window buf) nil) - (cond ((and (one-window-p) - (window-configuration-p (frame-parameter nil 'saved-wconf))) - (set-window-configuration (frame-parameter nil 'saved-wconf)) - (set-frame-parameter nil 'saved-wconf nil)) - ((one-window-p) - (let ((prev (save-window-excursion (previous-buffer)))) - (unless (and prev (doom-real-buffer-p prev)) - (switch-to-buffer (doom-fallback-buffer))))) - ((or (and (fboundp '+popup-window-p) (+popup-window-p)) - +eshell-kill-window-on-exit) - (delete-window)))))) + (when-let* ((win (get-buffer-window buf))) + (+eshell--setup-window win nil) + (cond ((and (one-window-p t) + (window-configuration-p (frame-parameter nil 'saved-wconf))) + (set-window-configuration (frame-parameter nil 'saved-wconf)) + (set-frame-parameter win 'saved-wconf nil)) + ((one-window-p) + (let ((prev (save-window-excursion (previous-buffer)))) + (unless (and prev (doom-real-buffer-p prev)) + (switch-to-buffer (doom-fallback-buffer))))) + ((or (and (fboundp '+popup-window-p) (+popup-window-p)) + +eshell-kill-window-on-exit) + (delete-window win))))))) From 05bdb1e12ce65c563b8389775443f7a9d6c109c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 16:58:28 +0200 Subject: [PATCH 2229/4235] eshell-input-filter = eshell-input-filter-initial-space Don't record a command in history if prefixed with whitespace. --- modules/emacs/eshell/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 96490c875..aa88bdc59 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -54,6 +54,8 @@ You should use `det-eshell-alias!' to change this.") eshell-buffer-shorthand t eshell-kill-processes-on-exit t eshell-hist-ignoredups t + ;; don't record command in history if prefixed with whitespace + eshell-input-filter #'eshell-input-filter-initial-space ;; em-prompt eshell-prompt-regexp "^.* λ " eshell-prompt-function #'+eshell-default-prompt From ca9da4c272acbc14af42ef026eab9e4d0b388e07 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 18:03:45 +0200 Subject: [PATCH 2230/4235] Fix eshell popup splits not closing on exit Fixes "Attempt to delete main window of frame" errors, and ensrues an eshell buffer is selected, if you were in a popup. --- modules/emacs/eshell/autoload/eshell.el | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index d2415a6d6..a9bffec72 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -21,11 +21,12 @@ (ring-remove +eshell-buffers idx) t)) -(defun +eshell--bury-buffer () +(defun +eshell--bury-buffer (&optional dedicated-p) (unless (switch-to-prev-buffer nil 'bury) (switch-to-buffer (doom-fallback-buffer))) (when +eshell-enable-new-shell-on-split - (+eshell/open t))) + (when-let* ((win (get-buffer-window (+eshell/open t)))) + (set-window-dedicated-p win dedicated-p)))) (defun +eshell--setup-window (window &optional flag) (when (window-live-p window) @@ -168,21 +169,23 @@ delete." "Create a new eshell window below the current one." (interactive) (let ((ignore-window-parameters t) + (dedicated-p (window-dedicated-p)) (+eshell-enable-new-shell-on-split (or +eshell-enable-new-shell-on-split (frame-parameter nil 'saved-wconf)))) (select-window (split-window-vertically)) - (+eshell--bury-buffer))) + (+eshell--bury-buffer dedicated-p))) ;;;###autoload (defun +eshell/split-right () "Create a new eshell window to the right of the current one." (interactive) (let* ((ignore-window-parameters t) + (dedicated-p (window-dedicated-p)) (window-state (window-state-get)) (+eshell-enable-new-shell-on-split (or +eshell-enable-new-shell-on-split (frame-parameter nil 'saved-wconf)))) (select-window (split-window-horizontally)) - (+eshell--bury-buffer))) + (+eshell--bury-buffer dedicated-p))) ;;;###autoload (defun +eshell/switch-to-next () @@ -269,7 +272,15 @@ delete." (let ((prev (save-window-excursion (previous-buffer)))) (unless (and prev (doom-real-buffer-p prev)) (switch-to-buffer (doom-fallback-buffer))))) - ((or (and (fboundp '+popup-window-p) (+popup-window-p)) + ((or (window-dedicated-p win) +eshell-kill-window-on-exit) - (delete-window win))))))) + (let ((ignore-window-parameters t) + (popup-p (window-dedicated-p win))) + (delete-window win) + (when popup-p + (cl-loop for win in (window-list) + for buf = (window-buffer win) + for mode = (buffer-local-value 'major-mode buf) + if (eq mode 'eshell-mode) + return (select-window win)))))))))) From 88ba758ae3d4ce30ae3c6bcf11b959ed90f3be16 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 18:31:46 +0200 Subject: [PATCH 2231/4235] Add eshell-z plugin And replace z alias with it. --- modules/emacs/eshell/config.el | 8 +++++++- modules/emacs/eshell/packages.el | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index aa88bdc59..5e2c9d066 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -23,7 +23,7 @@ buffer.") (defvar +eshell-aliases '(("q" "exit") ; built-in - ("z" "cd =$1") ; built-in + ("z" "eshell-z $1") ; `eshell-z' ("bd" "eshell-up $1") ; `eshell-up' ("rg" "rg --color=always") ("ag" "ag --color=always") @@ -137,3 +137,9 @@ redefines its keys every time `eshell-mode' is enabled." (def-package! shrink-path :commands shrink-path-file) + + +(after! eshell-z + ;; Use zsh's db if it exists, otherwise, store it in `doom-cache-dir' + (unless (file-exists-p eshell-z-freq-dir-hash-table-file-name) + (setq eshell-z-freq-dir-hash-table-file-name (expand-file-name "z" eshell-directory-name)))) diff --git a/modules/emacs/eshell/packages.el b/modules/emacs/eshell/packages.el index fcaed73f5..e7f060578 100644 --- a/modules/emacs/eshell/packages.el +++ b/modules/emacs/eshell/packages.el @@ -2,4 +2,5 @@ ;;; emacs/eshell/packages.el (package! eshell-up) +(package! eshell-z) (package! shrink-path) From 1a0251c1cfcf654c4d527e09e63ba7875ef2565a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 18:34:02 +0200 Subject: [PATCH 2232/4235] Move eshell config files into doom-private-dir Introduce new +eshell-config-dir variable, where you can store your eshell aliases and rc files. --- modules/emacs/eshell/config.el | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 5e2c9d066..d3933f7b2 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -3,17 +3,14 @@ ;; see: ;; + `+eshell/open': open in current buffer ;; + `+eshell/open-popup': open in a popup -;; + `+eshell/open-workspace': open in separate tab (requires :feature -;; workspaces) +;; + `+eshell/open-fullscreen': open eshell fullscreen (will restore window +;; config when quitting the last eshell buffer) -(defvar eshell-directory-name (concat doom-etc-dir "eshell")) +(defvar +eshell-config-dir + (expand-file-name "eshell/" doom-private-dir) + "Where to store eshell configuration files, as opposed to +`eshell-directory-name', which is where Doom will store temporary/data files.") -(defvar eshell-aliases-file - (expand-file-name "eshell_aliases" doom-private-dir) - "The path to your eshell aliases file, where you may declare alises. This is -here as an alternative to `set-eshell-alias!'.") - -;; (defvar +eshell-enable-new-shell-on-split t "If non-nil, spawn a new eshell session after splitting from an eshell buffer.") @@ -35,6 +32,15 @@ to define your aliases. You should use `det-eshell-alias!' to change this.") +;; +(defvar eshell-directory-name (concat doom-etc-dir "eshell")) + +;; These files are exceptions, because they may contain configuration +(defvar eshell-aliases-file (concat +eshell-config-dir "alias")) +(defvar eshell-rc-script (concat +eshell-config-dir "profile")) +(defvar eshell-login-script (concat +eshell-config-dir "login")) + + (defvar +eshell--default-aliases nil) From 9157d3b3a648acfd1e40fa9313688eb86aeba8c1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 18:46:51 +0200 Subject: [PATCH 2233/4235] eshell: alias clear to clear-scrollback This is more in line with how clear behaves in shells. --- modules/emacs/eshell/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index d3933f7b2..01853ed87 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -24,7 +24,8 @@ buffer.") ("bd" "eshell-up $1") ; `eshell-up' ("rg" "rg --color=always") ("ag" "ag --color=always") - ("ll" "ls -lah")) + ("ll" "ls -lah") + ("clear" "clear-scrollback")) ; more sensible than default "An alist of default eshell aliases, meant to emulate useful shell utilities, like fasd and bd. Note that you may overwrite these in your `eshell-aliases-file'. This is here to provide an alternative, elisp-centric way From 40c8d7bd0e2936bb141cf24f0cfe68589da88442 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 19:23:31 +0200 Subject: [PATCH 2234/4235] Fix eshell-z --- modules/emacs/eshell/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 01853ed87..22e2d9928 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -20,7 +20,6 @@ buffer.") (defvar +eshell-aliases '(("q" "exit") ; built-in - ("z" "eshell-z $1") ; `eshell-z' ("bd" "eshell-up $1") ; `eshell-up' ("rg" "rg --color=always") ("ag" "ag --color=always") @@ -146,7 +145,10 @@ redefines its keys every time `eshell-mode' is enabled." :commands shrink-path-file) -(after! eshell-z +(def-package! eshell-z + :after eshell + :config ;; Use zsh's db if it exists, otherwise, store it in `doom-cache-dir' (unless (file-exists-p eshell-z-freq-dir-hash-table-file-name) - (setq eshell-z-freq-dir-hash-table-file-name (expand-file-name "z" eshell-directory-name)))) + (setq eshell-z-freq-dir-hash-table-file-name + (expand-file-name "z" eshell-directory-name)))) From 55104b9f89b13c0d862bad147c96a64d96a92cd5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 19:29:26 +0200 Subject: [PATCH 2235/4235] Fix "home/~" PWD in eshell prompt --- modules/emacs/eshell/autoload/prompts.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/emacs/eshell/autoload/prompts.el b/modules/emacs/eshell/autoload/prompts.el index 8509486ed..1507350ac 100644 --- a/modules/emacs/eshell/autoload/prompts.el +++ b/modules/emacs/eshell/autoload/prompts.el @@ -23,8 +23,11 @@ (defun +eshell-default-prompt () "Generate the prompt string for eshell. Use for `eshell-prompt-function'." (concat (if (bobp) "" "\n") - (propertize (abbreviate-file-name (shrink-path-file (eshell/pwd))) - 'face '+eshell-prompt-pwd) + (let ((pwd (eshell/pwd))) + (propertize (if (equal pwd "~") + pwd + (abbreviate-file-name (shrink-path-file pwd))) + 'face '+eshell-prompt-pwd)) (propertize (+eshell--current-git-branch) 'face '+eshell-prompt-git-branch) (propertize " λ" 'face (if (zerop eshell-last-command-status) 'success 'error)) From 2dac739ce730d15ab0c32aa68c94da22d87d1971 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 20:14:17 +0200 Subject: [PATCH 2236/4235] Require project root in dashboard buffer #733 Require default-directory to be in a valid project for project commands to work. This will prevent hangs when accidentally invoking projectile-find-file from $HOME. --- 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 57594f903..1fb7e2247 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -63,6 +63,7 @@ Possible values: buffer-read-only t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) + (setq-local projectile-require-project-root t) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) From 5d28a4f100a5d0bbde482a15e98a4ad1bfbb4868 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 20:42:41 +0200 Subject: [PATCH 2237/4235] Fix invalid-function: PDF Tools error in latex Due to a forgotten quote on a list form. Reported by @xarthurx --- modules/lang/latex/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 871ed8372..642ceac8b 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -99,8 +99,8 @@ ;; Or PDF-tools, but only if the module is also loaded (when (and (featurep! :tools pdf) - (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-list ("PDF Tools" "TeX-pdf-tools-sync-view")) + (featurep! +pdf-tools)) + (add-to-list 'TeX-view-program-list '("PDF Tools" "TeX-pdf-tools-sync-view")) (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) ;; Enable auto reverting the PDF document with PDF Tools (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) From 875821a95abc5aa62ec7a5f693ee30f141eb5dc9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 22:40:44 +0200 Subject: [PATCH 2238/4235] Remove evil-ediff from :feature evil It's in evi-collection-ediff now. --- modules/feature/evil/packages.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index d316e16b1..20ee93058 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -13,7 +13,6 @@ (package! evil-commentary) (package! evil-collection) (package! evil-easymotion) -(package! evil-ediff) (package! evil-embrace) (package! evil-escape) (package! evil-exchange) From 888bd970938b934b8fca60982251b06f7dae1de3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Jun 2018 22:41:23 +0200 Subject: [PATCH 2239/4235] Fix evil-collection-neotree throwing void-function Because it is using the neotree-make-executor macro without requiring `neotree` at compile time. Also, remove the helm fix because they no longer use the `with-helm-buffer` macro. --- modules/feature/evil/packages.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index 20ee93058..1e04024de 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -1,17 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/evil/packages.el -;; `evil-collection' uses the `with-helm-buffer' macro, but this requires helm -;; be loaded before it is byte-compiled during installation. To ensure this, we -;; declare helm before evil-collection. -(when (featurep! :completion helm) - (depends-on! :completion helm)) - -;; (package! evil) (package! evil-args) (package! evil-commentary) -(package! evil-collection) (package! evil-easymotion) (package! evil-embrace) (package! evil-escape) @@ -27,3 +19,13 @@ (package! evil-vimish-fold) (package! evil-visualstar) (package! exato) + + +;; +(when (featurep! +everywhere) + ;; `evil-collection-neotree' uses the `neotree-make-executor' macro, but this + ;; requires neotree be available during byte-compilation (while installing). + (when (featurep! :ui neotree) + (depends-on! :ui neotree)) + + (package! evil-collection)) From a4121f33c02430de073b11fc8596c8cd2d35b9d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 00:56:04 +0200 Subject: [PATCH 2240/4235] Revert "Require project root in dashboard buffer #733" This reverts commit 2dac739ce730d15ab0c32aa68c94da22d87d1971. Causes breaking "Not in project" errors at startup in certain daemon workflows. --- modules/ui/doom-dashboard/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 1fb7e2247..57594f903 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -63,7 +63,6 @@ Possible values: buffer-read-only t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) - (setq-local projectile-require-project-root t) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) From 5a78b8db0cd64b4a2b1252cd938c9eedf7c73713 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 01:22:06 +0200 Subject: [PATCH 2241/4235] Enable smartparens-mode in eshell So we can have some o'dat autopairing goodness in our shell. --- modules/emacs/eshell/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 22e2d9928..b6a9df343 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -76,6 +76,9 @@ You should use `det-eshell-alias!' to change this.") (add-hook 'eshell-mode-hook #'+eshell|init) (add-hook 'eshell-exit-hook #'+eshell|cleanup) + ;; Enable autopairing in eshell + (add-hook 'eshell-mode-hook #'smartparens-mode) + ;; UI enhancements (defun +eshell|replace-fringes-with-margins () "Remove eshell's fringes and give it a margin of 1." From 2e29455cb42f7caba8d64d2b66c482c1ea2acd13 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 01:51:49 +0200 Subject: [PATCH 2242/4235] Disable company-mode in eshell-mode It appears to be incompatible with pcomplete, causing random errors and whitespace insertion at odd times. --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 093c88070..0b5ceea0e 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -11,7 +11,7 @@ company-tooltip-align-annotations t company-require-match 'never company-global-modes - '(not comint-mode erc-mode message-mode help-mode gud-mode) + '(not comint-mode erc-mode message-mode help-mode gud-mode eshell-mode) company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) From f987c121d4d34528220d4e04fb3bb68fc1a597af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 01:55:21 +0200 Subject: [PATCH 2243/4235] Make indent detection more ubiquitous #727 And have it change tab-width as well. This should work as soon as my PR into dtrt-indent is pulled into MELPA. --- core/core-editor.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 79f0485c7..52469e18e 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -199,12 +199,14 @@ fundamental-mode) for performance sake." (defun doom|detect-indentation () (unless (or doom-inhibit-indent-detection buffer-read-only + (memq major-mode '(fundamental-mode org-mode)) (not (derived-mode-p 'prog-mode 'text-mode 'conf-mode))) + (require 'dtrt-indent) (dtrt-indent-mode +1))) - (add-hook! (prog-mode text-mode conf-mode) - #'doom|detect-indentation) + (add-hook 'after-change-major-mode-hook #'doom|detect-indentation) :config - (setq dtrt-indent-verbosity (if doom-debug-mode 2 0))) + (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) + (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width))) (def-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) From 04ee1c23fdcca643cbaaa15574551cbe54d006a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 02:35:33 +0200 Subject: [PATCH 2244/4235] Don't set margins in left/right popups --- modules/ui/popup/autoload/popup.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 417a5cba2..8fb42f5a6 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -207,8 +207,9 @@ disabled." "Creates padding for the popup window determined by `+popup-margin-width', restoring it if `+popup-buffer-mode' is disabled." (when +popup-margin-width - (let ((m (if (bound-and-true-p +popup-buffer-mode) +popup-margin-width))) - (set-window-margins nil m m)))) + (unless (memq (window-parameter nil 'window-side) '(left right)) + (let ((m (if (bound-and-true-p +popup-buffer-mode) +popup-margin-width))) + (set-window-margins nil m m))))) ;;;###autoload (defun +popup|set-modeline-on-enable () From b583af198dfb8f63c011c3fa22865ec50210f668 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 13:57:00 +0200 Subject: [PATCH 2245/4235] Pop up elfeed-show buffers below current Instead of in a frame popup. You no longer are required to run elfeed in fullscreen. --- 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 a9407dc54..ffb1d2774 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -27,7 +27,7 @@ absolute paths.") shr-max-image-proportion 0.6) (set-popup-rule! "^\\*elfeed-entry" - :size 0.75 :side 'bottom + :size 0.75 :actions '(display-buffer-below-selected) :select t :quit nil :ttl t) (make-directory elfeed-db-directory t) From 1a923441ff7b67410572e8f390b1f32f4e7a66be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 13:59:07 +0200 Subject: [PATCH 2246/4235] Fix infinite-recursion when killing elfeed buffers --- modules/app/rss/autoload.el | 2 +- modules/app/rss/config.el | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index ce89ef798..c96a5fbda 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -11,7 +11,7 @@ "TODO" (interactive) (elfeed-db-compact) - (doom-kill-matching-buffers "^\\*elfeed") + (doom-kill-matching-buffers "^\\*elfeed" (delq (current-buffer) (buffer-list))) (dolist (file +rss-elfeed-files) (when-let* ((buf (get-file-buffer (expand-file-name file org-directory)))) (kill-buffer buf)))) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index ffb1d2774..898d14ef3 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -39,7 +39,7 @@ absolute paths.") ;; Enhance readability of a post (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) - (add-hook! '(elfeed-show-mode-hook elfeed-search-mode-hook) + (add-hook! 'elfeed-search-mode-hook (add-hook 'kill-buffer-hook #'+rss/quit nil t)) ;; Keybindings @@ -49,10 +49,9 @@ absolute paths.") [remap previous-buffer] #'+rss/previous)) (when (featurep! :feature evil +everywhere) (evil-define-key 'normal elfeed-search-mode-map - "q" #'kill-this-buffer - "r" #'elfeed-update - "s" #'elfeed-search-live-filter - (kbd "RET") #'elfeed-search-show-entry + "q" #'elfeed-kill-buffer + "r" #'elfeed-update + (kbd "RET") #'elfeed-search-show-entry (kbd "M-RET") #'elfeed-search-browse-url) (evil-define-key 'normal elfeed-show-mode-map "q" #'elfeed-kill-buffer) From db0ad48e4d1d5e37abe162b12c0f8d9fa51033b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 13:59:14 +0200 Subject: [PATCH 2247/4235] Enable evil-collection-elfeed --- modules/app/rss/config.el | 10 ++-------- modules/feature/evil/+everywhere.el | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 898d14ef3..36aaa821a 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -50,14 +50,8 @@ absolute paths.") (when (featurep! :feature evil +everywhere) (evil-define-key 'normal elfeed-search-mode-map "q" #'elfeed-kill-buffer - "r" #'elfeed-update - (kbd "RET") #'elfeed-search-show-entry - (kbd "M-RET") #'elfeed-search-browse-url) - (evil-define-key 'normal elfeed-show-mode-map - "q" #'elfeed-kill-buffer) - (evil-define-key 'motion elfeed-show-mode-map - "j" #'evil-next-visual-line - "k" #'evil-previous-visual-line))) + "r" #'elfeed-search-update--force + (kbd "M-RET") #'elfeed-search-browse-url))) (def-package! elfeed-org diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 3dcb2e30b..3076afde7 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -51,7 +51,7 @@ variable for an explanation of the defaults (in comments). See edebug ediff ;; eldoc - ;; elfeed + elfeed ;; elisp-mode elisp-refs emms From ba674c8744b3ce21c15e603d5b28ad55fa4c2fa0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 14:07:29 +0200 Subject: [PATCH 2248/4235] Slice images in rss entries for easier scrolling Can be disabled with +rss-enable-sliced-images. --- modules/app/rss/config.el | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 36aaa821a..17334cd61 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -11,6 +11,10 @@ absolute paths.") (defvar +rss-split-direction 'below "What direction to pop up the entry buffer in elfeed.") +(defvar +rss-enable-sliced-images t + "Automatically slice images shown in elfeed-show-mode buffers, making them +easier to scroll through.") + ;; ;; Packages @@ -42,6 +46,25 @@ absolute paths.") (add-hook! 'elfeed-search-mode-hook (add-hook 'kill-buffer-hook #'+rss/quit nil t)) + ;; Large images are annoying to scroll through, because scrolling follows the + ;; cursor, so we force shr to insert images in slices. + (when +rss-enable-sliced-images + (defun +rss-put-image (spec alt &optional flags) + (cl-letf (((symbol-function #'insert-image) + (lambda (image &optional alt _area _slice) + (let ((height (cdr (image-size image t)))) + (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))))) + (shr-put-image spec alt flags))) + (defun +rss-render-image-tag (dom &optional url) + (let ((start (point))) + (shr-tag-img dom url) + ;; And remove underlines in case images are links, otherwise we get an + ;; underline beneath every slice. + (put-text-property start (point) 'face '(:underline nil)))) + (setq-hook! 'elfeed-show-mode-hook + shr-put-image-function #'+rss-put-image + shr-external-rendering-functions '((img . +rss-render-image-tag)))) + ;; Keybindings (after! elfeed-show (define-key! elfeed-show-mode-map From f52008873e57990d733500ad317d1c8bd135eacb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 15:08:06 +0200 Subject: [PATCH 2249/4235] Refactor app/rss & improve kill-buffer process --- modules/app/rss/autoload.el | 78 +++++++++++++++++++++++++++---------- modules/app/rss/config.el | 18 ++------- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index c96a5fbda..f83756e58 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -6,26 +6,6 @@ (interactive) (call-interactively #'elfeed)) -;;;###autoload -(defun +rss/quit () - "TODO" - (interactive) - (elfeed-db-compact) - (doom-kill-matching-buffers "^\\*elfeed" (delq (current-buffer) (buffer-list))) - (dolist (file +rss-elfeed-files) - (when-let* ((buf (get-file-buffer (expand-file-name file org-directory)))) - (kill-buffer buf)))) - -;;;###autoload -(defun +rss|elfeed-wrap () - "Enhances an elfeed entry's readability by wrapping it to a width of -`fill-column' and centering it with `visual-fill-column-mode'." - (let ((inhibit-read-only t) - (inhibit-modification-hooks t)) - (setq-local truncate-lines nil) - (setq-local shr-width 85) - (set-buffer-modified-p nil))) - ;;;###autoload (defun +rss/delete-pane () "Delete the *elfeed-entry* split pane." @@ -63,6 +43,46 @@ (forward-line -1) (call-interactively '+rss/open))) + +;; +;; Hooks +;; + +;;;###autoload +(defun +rss|elfeed-wrap () + "Enhances an elfeed entry's readability by wrapping it to a width of +`fill-column' and centering it with `visual-fill-column-mode'." + (let ((inhibit-read-only t) + (inhibit-modification-hooks t)) + (setq-local truncate-lines nil) + (setq-local shr-width 85) + (set-buffer-modified-p nil))) + +;;;###autoload +(defun +rss|cleanup () + "Clean up after an elfeed session. Kills all elfeed and elfeed-org files." + (interactive) + (elfeed-db-compact) + (let ((buf (previous-buffer))) + (when (or (null buf) (not (doom-real-buffer-p buf))) + (switch-to-buffer (doom-fallback-buffer)))) + (let ((search-buffers (doom-buffers-in-mode 'elfeed-search-mode)) + (show-buffers (doom-buffers-in-mode 'elfeed-show-mode)) + kill-buffer-query-functions) + (dolist (file +rss-elfeed-files) + (when-let* ((buf (get-file-buffer (expand-file-name file org-directory)))) + (kill-buffer buf))) + (dolist (b search-buffers) + (with-current-buffer b + (remove-hook 'kill-buffer-hook #'+rss|cleanup :local) + (kill-buffer b))) + (mapc #'kill-buffer show-buffers))) + + +;; +;; Functions +;; + ;;;###autoload (defun +rss-dead-feeds (&optional years) "Return a list of feeds that haven't posted anything in YEARS." @@ -77,3 +97,21 @@ (cl-loop for url in (elfeed-feed-list) unless (gethash url living-feeds) collect url))) + +;;;###autoload +(defun +rss-put-sliced-image (spec alt &optional flags) + "TODO" + (cl-letf (((symbol-function #'insert-image) + (lambda (image &optional alt _area _slice) + (let ((height (cdr (image-size image t)))) + (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))))) + (shr-put-image spec alt flags))) + +;;;###autoload +(defun +rss-render-image-tag-without-underline (dom &optional url) + "TODO" + (let ((start (point))) + (shr-tag-img dom url) + ;; And remove underlines in case images are links, otherwise we get an + ;; underline beneath every slice. + (put-text-property start (point) 'face '(:underline nil)))) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 17334cd61..256ef0c05 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -44,26 +44,14 @@ easier to scroll through.") ;; Enhance readability of a post (add-hook 'elfeed-show-mode-hook #'+rss|elfeed-wrap) (add-hook! 'elfeed-search-mode-hook - (add-hook 'kill-buffer-hook #'+rss/quit nil t)) + (add-hook 'kill-buffer-hook #'+rss|cleanup nil t)) ;; Large images are annoying to scroll through, because scrolling follows the ;; cursor, so we force shr to insert images in slices. (when +rss-enable-sliced-images - (defun +rss-put-image (spec alt &optional flags) - (cl-letf (((symbol-function #'insert-image) - (lambda (image &optional alt _area _slice) - (let ((height (cdr (image-size image t)))) - (insert-sliced-image image alt nil (max 1 (/ height 20.0)) 1))))) - (shr-put-image spec alt flags))) - (defun +rss-render-image-tag (dom &optional url) - (let ((start (point))) - (shr-tag-img dom url) - ;; And remove underlines in case images are links, otherwise we get an - ;; underline beneath every slice. - (put-text-property start (point) 'face '(:underline nil)))) (setq-hook! 'elfeed-show-mode-hook - shr-put-image-function #'+rss-put-image - shr-external-rendering-functions '((img . +rss-render-image-tag)))) + shr-put-image-function #'+rss-put-sliced-image + shr-external-rendering-functions '((img . +rss-render-image-tag-without-underline)))) ;; Keybindings (after! elfeed-show From 5931d89d9dc7cf5631fdb511b2f82a2ba6f089fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 16:49:41 +0200 Subject: [PATCH 2250/4235] Fix oversized *Org Links* popup in org-mode At some point, org changed how soon it popped up this window, so +popup-shrink-to-fit would run before there was any content in the buffer, causing it to take up way too much space. --- modules/lang/org/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 4b382a96c..aaff9f2fc 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -137,7 +137,8 @@ unfold to point on startup." (defun +org|setup-popups-rules () "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." (set-popup-rules! - '(("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" + '(("^\\*Org Links" :slot -1 :vslot -1 :size 2 :ttl 0) + ("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) ("^\\*Org Src" :size 0.3 :quit nil :select t) From 9b2100dfe7620fdd2c63ccedc8fdaba40edd6343 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 22:21:03 +0200 Subject: [PATCH 2251/4235] Fix input-decode-map binds in emacsclient frames --- modules/config/default/+bindings.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 670c267f5..ed4c8d346 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -748,12 +748,13 @@ ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). -(if window-system - (define-key! input-decode-map - [S-iso-lefttab] [backtab] ;; Fix MacOS shift+tab - (kbd "ESC") [escape]) - ;; Fix TAB in terminal +;; Fix MacOS shift+tab +(when IS-MAC + (define-key input-decode-map [S-iso-lefttab] [backtab])) + +(defun +default|setup-input-decode-map () (define-key input-decode-map (kbd "TAB") [tab])) +(add-hook 'tty-setup-hook #'+default|setup-input-decode-map) (after! tabulated-list (define-key tabulated-list-mode-map "q" #'quit-window)) From 2ffad42466d4727f3bf1b598050fbdd675eef1ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Jun 2018 22:23:44 +0200 Subject: [PATCH 2252/4235] Prevent persp-mode throwing an error on kill-emacs This would otherwise stop Emacs from quitting. --- modules/feature/workspaces/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index a168b57e0..5f5e9f005 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -144,6 +144,12 @@ Uses `+workspaces-main' to determine the name of the main workspace." counsel-projectile-switch-project-action #'+workspaces|switch-to-project) (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) + ;; In some scenarios, persp-mode throws error an error when Emacs tries to + ;; die, preventing its death. + (defun +workspaces*ignore-errors-on-kill-emacs (orig-fn) + (ignore-errors (funcall orig-fn))) + (advice-add #'persp-kill-emacs-h :around #'+workspaces*ignore-errors-on-kill-emacs) + ;; ;; eshell (persp-def-buffer-save/load From 70230b089258a59991b4eeb39abbd06d2be5fda2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 01:53:40 +0200 Subject: [PATCH 2253/4235] Add doom-unreal-buffer-p predicate function --- core/autoload/buffers.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 6b7a36e61..cc390b6a9 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -116,6 +116,13 @@ If BUFFER-OR-NAME is omitted or nil, the current buffer is tested." (run-hook-with-args-until-success 'doom-real-buffer-functions buf) (not (run-hook-with-args-until-success 'doom-unreal-buffer-functions buf)))))) +;;;###autoload +(defun doom-unreal-buffer-p (buffer-or-name) + "Return t if BUFFER-OR-NAME is an 'unreal' buffer. + +See `doom-real-buffer-p' for details on what that means." + (not (doom-real-buffer-p buffer-or-name))) + ;;;###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). From 537cc9e1ed663c387fa87a0699f55aae4d5de64b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 01:55:07 +0200 Subject: [PATCH 2254/4235] Rewrite doom-real-buffer-p; require first arg Because of how widely used this function is, I'd rather it be as explicit as possible to avoid bugs and to make it faster. --- core/autoload/buffers.el | 7 +++++-- modules/feature/workspaces/autoload/workspaces.el | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index cc390b6a9..f1050c72a 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -93,7 +93,7 @@ If no project is active, return all buffers." (cl-remove-if-not #'doom-real-buffer-p (or buffer-list (doom-buffer-list)))) ;;;###autoload -(defun doom-real-buffer-p (&optional buffer-or-name) +(defun doom-real-buffer-p (buffer-or-name) "Returns t if BUFFER-OR-NAME is a 'real' buffer. A real buffer is a useful buffer; a first class citizen in Doom. Real ones @@ -110,7 +110,10 @@ The exact criteria for a real buffer is: non-nil. 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 (bufferp buffer-or-name) + (stringp buffer-or-name) + (signal 'wrong-type-argument (list '(bufferp stringp) buffer-or-name))) + (when-let* ((buf (get-buffer buffer-or-name))) (and (not (doom-temp-buffer-p buf)) (or (buffer-local-value 'doom-real-buffer-p buf) (run-hook-with-args-until-success 'doom-real-buffer-functions buf) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 0b2adabaa..85f45306c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -524,7 +524,7 @@ created." (if (not (persp-frame-list-without-daemon)) (+workspace-switch +workspaces-main t) (+workspace-switch (format "#%s" (+workspace--generate-id)) t) - (unless (doom-real-buffer-p) + (unless (doom-real-buffer-p (current-buffer)) (switch-to-buffer (doom-fallback-buffer))) (set-frame-parameter frame 'workspace (+workspace-current-name)) ;; ensure every buffer has a buffer-predicate From 83ba527afd791a278ca5e0b80783a875084b21aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 00:57:41 +0200 Subject: [PATCH 2255/4235] Refactor auto-add-buffer functionality Use built-in mechanism for auto-adding buffers to current workspace, rather than reinvent the wheel. --- modules/feature/workspaces/autoload/workspaces.el | 11 ----------- modules/feature/workspaces/config.el | 15 +++++++-------- .../feature/workspaces/test/test-workspaces.el | 4 ---- 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 85f45306c..9308c738c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -484,17 +484,6 @@ the next." ;; Hooks ;; -;;;###autoload -(defun +workspaces|auto-add-buffer () - "Auto-associate buffers with perspectives upon opening them. - -Allows a perspective-specific buffer list via `+workspaces-buffer-list'." - (when (and persp-mode - (not persp-temporarily-display-buffer) - (doom-real-buffer-p)) - (persp-add-buffer (current-buffer) (get-current-persp) nil) - (force-mode-line-update t))) - ;;;###autoload (defun +workspaces|delete-associated-workspace (&optional frame) "Delete workspace associated with current frame. diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 5f5e9f005..d751fc4d6 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -93,6 +93,12 @@ Uses `+workspaces-main' to determine the name of the main workspace." persp-auto-resume-time -1 ; Don't auto-load on startup persp-auto-save-opt (if noninteractive 0 1)) ; auto-save on kill + ;; Ensure buffers we've opened/switched to are auto-added to the current + ;; perspective + (setq persp-add-buffer-on-find-file t + persp-add-buffer-on-after-change-major-mode t) + (add-hook 'persp-add-buffer-on-after-change-major-mode-filter-functions #'doom-unreal-buffer-p) + ;; bootstrap (defun +workspaces|init-persp-mode () (cond (persp-mode @@ -100,17 +106,10 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; 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) - - ;; Ensure buffers we've opened/switched to are auto-added to the - ;; current perspective - (add-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) - ;; Remap `buffer-list' to current workspace's buffers in ;; `doom-buffer-list' (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) - (t - (remove-hook 'doom-after-switch-buffer-hook #'+workspaces|auto-add-buffer) - (advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) + ((advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) (defun +workspaces|leave-nil-perspective (&rest _) diff --git a/modules/feature/workspaces/test/test-workspaces.el b/modules/feature/workspaces/test/test-workspaces.el index c04cc7a56..4e50901da 100644 --- a/modules/feature/workspaces/test/test-workspaces.el +++ b/modules/feature/workspaces/test/test-workspaces.el @@ -79,10 +79,6 @@ (expect (+workspace-contains-buffer-p in1))) (it "returns nil for buffers outside of current workspace" (expect (+workspace-contains-buffer-p out1) :to-be nil)) - (it "automatically adds interactively opened buffers" - (expect (+workspace-contains-buffer-p out1) :to-be nil) - (with-current-buffer out1 (+workspaces|auto-add-buffer)) - (expect (+workspace-contains-buffer-p out1))) (xit "returns a list of orphaned buffers" (expect (+workspace-orphaned-buffer-list) :to-contain out2))) From d402c6ef44f9786741412aeab580631ef4c9e67d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:11:15 +0200 Subject: [PATCH 2256/4235] Seriously, don't show $ glyphs on long lines Seriously, dude. Seriously. --- core/core-ui.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index 63c280a9d..276866ce3 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -102,6 +102,9 @@ Also see `doom-before-switch-buffer-hook'.") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no +;; Seriously, don't show glyphs on long-lines +(set-display-table-slot standard-display-table 0 ?\ ) + ;; ;; Shims From e9c97d7ad02f98691decc4bf428a3861bcbf96d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:12:09 +0200 Subject: [PATCH 2257/4235] Prevent eshell from switching to existing eshell Prevent duplicate eshell buffers as a result of quitting a second eshell buffer. --- modules/emacs/eshell/autoload/eshell.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index a9bffec72..3afc40464 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -24,6 +24,8 @@ (defun +eshell--bury-buffer (&optional dedicated-p) (unless (switch-to-prev-buffer nil 'bury) (switch-to-buffer (doom-fallback-buffer))) + (when (eq major-mode 'eshell-mode) + (switch-to-buffer (doom-fallback-buffer))) (when +eshell-enable-new-shell-on-split (when-let* ((win (get-buffer-window (+eshell/open t)))) (set-window-dedicated-p win dedicated-p)))) From 2dbdbc245c4831c30c2cebad2a150a263afdc6f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:21:02 +0200 Subject: [PATCH 2258/4235] eshell: ignore errors thrown by pcomplete --- modules/emacs/eshell/autoload/eshell.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 3afc40464..da1044cf5 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -155,7 +155,7 @@ module to be loaded." bottom. This ties pcomplete into ivy or helm, if they are enabled." (interactive) (require 'pcomplete) - (pcomplete-std-complete)) + (ignore-errors (pcomplete-std-complete))) ;;;###autoload (defun +eshell/quit-or-delete-char (arg) From 91c4448ed208ab20b863903c527042ac9bf2f5e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:21:57 +0200 Subject: [PATCH 2259/4235] Refactor +workspaces|associate-frame No need to set current frame on first frame. --- modules/feature/workspaces/autoload/workspaces.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 9308c738c..2fc263912 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -509,9 +509,9 @@ created." (defun +workspaces|associate-frame (frame &optional _new-frame-p) "Create a blank, new perspective and associate it with FRAME." (when persp-mode - (with-selected-frame frame - (if (not (persp-frame-list-without-daemon)) - (+workspace-switch +workspaces-main t) + (if (not (persp-frame-list-without-daemon)) + (+workspace-switch +workspaces-main t) + (with-selected-frame frame (+workspace-switch (format "#%s" (+workspace--generate-id)) t) (unless (doom-real-buffer-p (current-buffer)) (switch-to-buffer (doom-fallback-buffer))) From 0603f7bb5dd5efa0a2c4b38a66b671e1bab8ac1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:46:09 +0200 Subject: [PATCH 2260/4235] Remove duplicate hscroll-margin setting --- core/core-editor.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 52469e18e..4b9d98dc0 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -29,11 +29,10 @@ successfully sets indent_style/indent_size.") sentence-end-double-space nil word-wrap t ;; Scrolling - hscroll-margin 1 + hscroll-margin 2 hscroll-step 1 scroll-conservatively 1001 scroll-margin 0 - hscroll-margin 2 scroll-preserve-screen-position t ;; Whitespace (see `editorconfig') indent-tabs-mode nil From bf5c8351e436bbc04795454dba6de51171f5a687 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:49:52 +0200 Subject: [PATCH 2261/4235] Fix jumpiness from progress bars in eshell/term Due to hscroll-margin ping-ponging the cursor. --- core/core-editor.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index 4b9d98dc0..3085e878d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -44,6 +44,9 @@ successfully sets indent_style/indent_size.") truncate-lines t truncate-partial-width-windows 50) +;; Remove hscroll-margin in shells, otherwise it causes jumpiness +(setq-hook! '(eshell-mode-hook term-mode-hook) hscroll-margin 0) + (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 From 15f2e2146855b61ec8c57b29af4928fcfec34be4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:52:57 +0200 Subject: [PATCH 2262/4235] On second thought... Causes char-table-p errors in some cases. Setting hscroll-margin = 0 in dashboard accomplishes the same thing, by preventing truncation glyphs from ever appearing anyway. --- core/core-ui.el | 3 --- modules/ui/doom-dashboard/config.el | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 276866ce3..63c280a9d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -102,9 +102,6 @@ Also see `doom-before-switch-buffer-hook'.") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no -;; Seriously, don't show glyphs on long-lines -(set-display-table-slot standard-display-table 0 ?\ ) - ;; ;; Shims diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 57594f903..f613309f8 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -63,6 +63,7 @@ Possible values: buffer-read-only t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) + (setq-local hscroll-margin 0) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) From 66e62e8b6e294081d266869c3775e8fb939cb884 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:53:35 +0200 Subject: [PATCH 2263/4235] destructuring-bind => cl-destructuring-bind --- modules/feature/workspaces/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index d751fc4d6..5c06728a3 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -168,7 +168,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (list tag (buffer-name buf) vars (buffer-name (buffer-base-buffer)))) :load-function (lambda (savelist &rest _rest) - (destructuring-bind (buf-name _vars base-buf-name &rest _) + (cl-destructuring-bind (buf-name _vars base-buf-name &rest _) (cdr savelist) (push (cons buf-name base-buf-name) +workspaces--indirect-buffers-to-restore) From 1457ec3d1550b56a5b7eca531976d63349de158f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:55:45 +0200 Subject: [PATCH 2264/4235] Fix non-prefix key C error when loading macrostep Due to malformed key spec. --- modules/lang/emacs-lisp/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 72fc3fc16..3a14c8f09 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -109,7 +109,7 @@ [backtab] #'macrostep-prev-macro "K" #'macrostep-prev-macro - "C-p" #'macrostep-prev-macro + "\C-p" #'macrostep-prev-macro "q" #'macrostep-collapse-all "C" #'macrostep-collapse-all) From 091a0a5f045be407c1041572eba878fae70d7707 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 02:56:40 +0200 Subject: [PATCH 2265/4235] Remove unused window-state letvar --- modules/emacs/eshell/autoload/eshell.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index da1044cf5..afae0ae15 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -183,7 +183,6 @@ delete." (interactive) (let* ((ignore-window-parameters t) (dedicated-p (window-dedicated-p)) - (window-state (window-state-get)) (+eshell-enable-new-shell-on-split (or +eshell-enable-new-shell-on-split (frame-parameter nil 'saved-wconf)))) (select-window (split-window-horizontally)) From 156d717042104294c1891a3bced9f45755925922 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 11:48:44 +0200 Subject: [PATCH 2266/4235] Restore zz in magit buffers --- modules/tools/magit/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 84a55f4fb..8cf846593 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -76,6 +76,8 @@ load everything.") (kbd "M-2") nil (kbd "M-3") nil (kbd "M-4") nil) + (evil-define-key* '(normal visual) magit-mode-map + "zz" #'evil-scroll-line-to-center) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (setcar (assoc (car key) evil-magit-rebase-commands-w-descriptions) From 6014a416b3e19b025694c7a7f32f3ac82db38834 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 13:19:08 +0200 Subject: [PATCH 2267/4235] Fix read-only errors in magit rebase buffers Magit would refuse to abort/commit rebases due to delete-trailing-whitespace in write-file-functions, placed there by editorconfig. --- modules/tools/editorconfig/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 82d4966f0..ab0892ed4 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -55,5 +55,12 @@ extension, try to guess one." (delq (assq mode editorconfig-indentation-alist) editorconfig-indentation-alist)) + (defun +editorconfig|disable-trim-whitespace-in-read-only-buffers (props) + "`delete-trailing-whitespace' can cause disruptive read-only errors. Prevent +it from being added to read-only buffers." + (when (and buffer-read-only (gethash 'trim_trailing_whitespace props)) + (remove-hook 'write-file-functions #'delete-trailing-whitespace :local))) + (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-trim-whitespace-in-read-only-buffers) + ;; (editorconfig-mode +1)) From 5e9f74c269706fd840e76523555ed648a12bdab1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 13:20:24 +0200 Subject: [PATCH 2268/4235] Add l and f default aliases to eshell For ls -lh and find-file, respectively. --- modules/emacs/eshell/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index b6a9df343..a82e0328b 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -20,9 +20,11 @@ buffer.") (defvar +eshell-aliases '(("q" "exit") ; built-in + ("f" "find-file $1") ("bd" "eshell-up $1") ; `eshell-up' ("rg" "rg --color=always") ("ag" "ag --color=always") + ("l" "ls -lh") ("ll" "ls -lah") ("clear" "clear-scrollback")) ; more sensible than default "An alist of default eshell aliases, meant to emulate useful shell utilities, From 2e0d6a7c3d5045ba7aebe1b4c02f5f313af4b705 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 17:41:20 +0200 Subject: [PATCH 2269/4235] Fix workspace switch-buffer keybinds --- modules/config/default/+bindings.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ed4c8d346..840b4e755 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -469,12 +469,6 @@ ;; ;; -(if (featurep! :feature workspaces) - (map! :leader :desc "Switch buffer" :n "," #'switch-to-buffer) - (map! :leader :desc "Switch workspace buffer" - :n "," #'persp-switch-to-buffer - :n "<" #'switch-to-buffer)) - (map! :leader :desc "Ex command" :nv ";" #'evil-ex :desc "M-x" :nv ":" #'execute-extended-command @@ -489,6 +483,12 @@ :desc "Blink cursor line" :n "DEL" #'+nav-flash/blink-cursor :desc "Jump to bookmark" :n "RET" #'bookmark-jump + (:when (featurep! :feature workspaces) + :desc "Switch workspace buffer" :n "," #'persp-switch-to-buffer + :desc "Switch buffer" :n "<" #'switch-to-buffer) + (:unless (featurep! :feature workspaces) + :desc "Switch buffer" :n "," #'switch-to-buffer) + ;; C-u is used by evil :desc "Universal argument" :n "u" #'universal-argument :desc "window" :n "w" evil-window-map From 64d4cf773dbd10b4505d081841cf97d1b6738b2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 17:41:39 +0200 Subject: [PATCH 2270/4235] Fix oversized *Org Links* popup --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index aaff9f2fc..92bf7c104 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -138,7 +138,7 @@ unfold to point on startup." "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." (set-popup-rules! '(("^\\*Org Links" :slot -1 :vslot -1 :size 2 :ttl 0) - ("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Links\\|Export Dispatcher\\|Select\\)\\)" + ("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Export Dispatcher\\|Select\\)\\)" :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) ("^\\*Org Src" :size 0.3 :quit nil :select t) From eebe852de4b3fc03c235a3dad81f889081e57079 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 23:16:48 +0200 Subject: [PATCH 2271/4235] Fix workspace cleaning up visible popups On :cleanup or doom/cleanup-session --- modules/feature/workspaces/autoload/workspaces.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 2fc263912..3766f02c5 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -501,7 +501,8 @@ created." "Kill leftover buffers that are unassociated with any perspective." (when persp-mode (cl-loop for buf in (buffer-list) - unless (persp--buffer-in-persps buf) + unless (or (persp--buffer-in-persps buf) + (get-buffer-window buf)) if (kill-buffer buf) sum 1))) From 866c97bcb20d9f715bf7bb9e17257339043cb674 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Jun 2018 23:27:06 +0200 Subject: [PATCH 2272/4235] emacs/imenu: remove cleanup-on-popup-close hack This hack is no longer necessary now that imenu-list-smart-toggle exists. And set :quit nil for the Ilist popup rule (since it can be toggled externally). --- modules/emacs/imenu/config.el | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/modules/emacs/imenu/config.el b/modules/emacs/imenu/config.el index de82a401e..88fed1090 100644 --- a/modules/emacs/imenu/config.el +++ b/modules/emacs/imenu/config.el @@ -8,14 +8,4 @@ (setq imenu-list-idle-update-delay 0.5) (set-popup-rule! "^\\*Ilist" - :side 'right :size 35 :quit 'current :select nil :ttl 0) - - (defun +imenu|cleanup-on-popup-close () - "Clean up after `imenu-list-minor-mode' when killing the list window." - (unless +popup-buffer-mode - (when imenu-list--displayed-buffer - (with-current-buffer imenu-list--displayed-buffer - (imenu-list-minor-mode -1))) - (when (equal (buffer-name) imenu-list-buffer-name) - (kill-buffer (get-buffer imenu-list-buffer-name))))) - (add-hook '+popup-buffer-mode-hook #'+imenu|cleanup-on-popup-close)) + :side 'right :size 35 :quit nil :select nil :ttl 0)) From cddde09b79d09135e0cf6dcb5bd979d88d0a3a61 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 1 Jul 2018 00:57:27 +0200 Subject: [PATCH 2273/4235] Fix popup system not cleaning up buffers with ttl Because of extra parentheses causing essential logic from running. I am a silly goose. --- modules/ui/popup/autoload/popup.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 8fb42f5a6..c70c49b1e 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -88,8 +88,8 @@ and enables `+popup-buffer-mode'." (signal 'wrong-type-argument (list 'integerp ttl))) ((= ttl 0) (+popup--kill-buffer buffer 0)) - ((add-hook 'kill-buffer-hook #'+popup|kill-buffer-hook nil t)) - ((setq +popup--timer + ((add-hook 'kill-buffer-hook #'+popup|kill-buffer-hook nil t) + (setq +popup--timer (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))))))))) From dd71f54e5ee4a45a59825fad5219308d3e78afe9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 1 Jul 2018 01:10:51 +0200 Subject: [PATCH 2274/4235] Fix reuse of same repl buffer across projects --- modules/feature/eval/autoload/repl.el | 46 +++++++++++++++------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 65cb3a63d..437e73a4e 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -1,32 +1,36 @@ ;;; feature/eval/autoload/repl.el -*- lexical-binding: t; -*- -(defvar +eval-repl-buffer nil +(defvar +eval-repl-buffers-alist () "The buffer of the last open repl.") (define-minor-mode +eval-repl-mode "A minor mode for REPL buffers.") (defun +eval--ensure-in-repl-buffer (&optional command same-window-p) - (cond ((eq (current-buffer) +eval-repl-buffer)) - ((and +eval-repl-buffer - (buffer-live-p +eval-repl-buffer)) - (when-let* ((win (get-buffer-window +eval-repl-buffer))) - (select-window win))) - (command - (let ((repl-buffer (save-window-excursion (call-interactively command)))) - (unless (bufferp repl-buffer) - (error "REPL command didn't return a buffer")) - (with-current-buffer repl-buffer (+eval-repl-mode +1)) - (setq +eval-repl-buffer repl-buffer)))) - (unless (eq (current-buffer) +eval-repl-buffer) - (funcall (if same-window-p #'switch-to-buffer #'pop-to-buffer) - +eval-repl-buffer)) - (with-current-buffer +eval-repl-buffer - (goto-char (if (and (derived-mode-p 'comint-mode) - (cdr comint-last-prompt)) - (cdr comint-last-prompt) - (point-max))) - t)) + (setq +eval-repl-buffers-alist + (cl-remove-if-not #'buffer-live-p +eval-repl-buffers-alist + :key #'cdr)) + (let* ((project-root (doom-project-root 'nocache)) + (key (cons major-mode project-root)) + (buffer (cdr (assoc key +eval-repl-buffers-alist)))) + (unless (and (bufferp buffer) + (eq buffer (current-buffer))) + (funcall (if same-window-p #'switch-to-buffer #'pop-to-buffer) + (if (buffer-live-p buffer) + buffer + (setq buffer (save-window-excursion (call-interactively command))) + (unless (bufferp buffer) + (error "REPL command didn't return a buffer")) + (with-current-buffer buffer (+eval-repl-mode +1)) + (setf (alist-get key +eval-repl-buffers-alist nil nil #'equal) + buffer) + buffer))) + (with-current-buffer buffer + (goto-char (if (and (derived-mode-p 'comint-mode) + (cdr comint-last-prompt)) + (cdr comint-last-prompt) + (point-max))) + buffer))) ;;;###autoload (defun +eval/open-repl (&optional same-window-p) From 4213899b01d41487a188ca9f5b30f01c9bd861d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 1 Jul 2018 01:16:37 +0200 Subject: [PATCH 2275/4235] Refactor out -pcase in +treemacs/toggle --- modules/ui/treemacs/autoload.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index ba5814106..cae1d8a17 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -10,13 +10,13 @@ project to add." (interactive) (require 'treemacs) - (-pcase (treemacs--current-visibility) - ['visible (delete-window (treemacs--is-visible?))] - ['exists (treemacs-select-window)] - ['none + (pcase (treemacs--current-visibility) + (`visible (delete-window (treemacs--is-visible?))) + (`exists (treemacs-select-window)) + (`none (let ((project-root (doom-project-root 'nocache))) (when project-root (unless (treemacs--find-project-for-path project-root) (treemacs-add-project-at (treemacs--canonical-path project-root) (doom-project-name 'nocache)))) - (treemacs--init project-root))])) + (treemacs--init project-root))))) From 637131a264ea2cf4784a33fbcc6584e6374a6bab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 1 Jul 2018 01:19:30 +0200 Subject: [PATCH 2276/4235] eshell: remove margins & wrap lines Margins cause many full-line progress bars to become jumpy; scrolling to follow the cursor at eol (just beyond the edge of the window). It's better to not use margins at all. Also, this change removes the $ truncation glyphs and enables visual-line-mode to wrap long text. --- modules/emacs/eshell/config.el | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index a82e0328b..24e557f19 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -82,11 +82,15 @@ You should use `det-eshell-alias!' to change this.") (add-hook 'eshell-mode-hook #'smartparens-mode) ;; UI enhancements - (defun +eshell|replace-fringes-with-margins () - "Remove eshell's fringes and give it a margin of 1." - (set-window-fringes nil 0 0) - (set-window-margins nil 1 1)) - (add-hook 'eshell-mode-hook #'+eshell|replace-fringes-with-margins) + (defun +eshell|remove-fringes () + (set-window-fringes nil 0 0)) + (add-hook 'eshell-mode-hook #'+eshell|remove-fringes) + + (defun +eshell|enable-text-wrapping () + (visual-line-mode +1) + (set-display-table-slot standard-display-table 0 ?\ )) + (add-hook 'eshell-mode-hook #'+eshell|enable-text-wrapping) + (add-hook 'eshell-mode-hook #'hide-mode-line-mode) ;; Don't auto-write our aliases! Let us manage our own `eshell-aliases-file' From 1ce3bedbbbc7e68446ed7209f8ece5bf45bc5ab1 Mon Sep 17 00:00:00 2001 From: Wang Hao Date: Mon, 2 Jul 2018 11:05:10 +0800 Subject: [PATCH 2277/4235] fix wrong argument order in usage of `alist-get` --- modules/feature/lookup/autoload/lookup.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 6cbcf3735..e65dcc018 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -73,7 +73,7 @@ properties: "Search on: " (mapcar #'car +lookup-provider-url-alist) nil t))) - (setf (alist-get +lookup--last-provider key) provider) + (setf (alist-get key +lookup--last-provider) provider) provider)))) (defun +lookup--symbol-or-region (&optional initial) From 81ffed520bab69f6a28448aaaa3b6f64eed51cae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Jul 2018 23:29:53 +0200 Subject: [PATCH 2278/4235] Rename doom-before-switch-*-hook hooks + doom-before-switch-buffer-hook => doom-exit-buffer-hook + doom-before-switch-window-hook => doom-exit-window-hook + doom-after-switch-buffer-hook => doom-enter-buffer-hook + doom-after-switch-window-hook => doom-enter-window-hook Shorter, easier-to-type names that better describe their intended purpose. The old names are still usable, but deprecated. --- core/core-editor.el | 4 ++-- core/core-ui.el | 22 +++++++++++++--------- core/test/test-core-ui.el | 20 ++++++++++---------- modules/tools/wakatime/autoload.el | 4 ++-- modules/ui/doom-dashboard/config.el | 2 +- modules/ui/nav-flash/config.el | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 3085e878d..33e9a9112 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -140,7 +140,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :after-call (doom-before-switch-buffer-hook after-find-file) + :after-call (doom-exit-buffer-hook after-find-file) :commands (sp-pair sp-local-pair sp-with-modes) :config (require 'smartparens-config) @@ -177,7 +177,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :after-call (doom-before-switch-buffer-hook after-find-file) + :after-call (doom-exit-buffer-hook after-find-file) :config ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! diff --git a/core/core-ui.el b/core/core-ui.el index 63c280a9d..b6572cf1f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -34,11 +34,11 @@ with `doom/reload-theme').") (defvar doom-before-switch-window-hook nil "Hook run before `switch-window' or `switch-frame' are called. See -`doom-after-switch-window-hook'.") +`doom-enter-window-hook'.") (defvar doom-after-switch-window-hook nil "Hook run after `switch-window' or `switch-frame' are called. See -`doom-before-switch-window-hook'.") +`doom-exit-window-hook'.") (defvar doom-before-switch-buffer-hook nil "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are @@ -50,8 +50,12 @@ Also see `doom-after-switch-buffer-hook'.") "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are called. The buffer to be switched to is current when these hooks run. -Also see `doom-before-switch-buffer-hook'.") +Also see `doom-exit-buffer-hook'.") +(define-obsolete-variable-alias 'doom-after-switch-buffer-hook 'doom-enter-buffer-hook "2.1.0") +(define-obsolete-variable-alias 'doom-before-switch-buffer-hook 'doom-exit-buffer-hook "2.1.0") +(define-obsolete-variable-alias 'doom-after-switch-window-hook 'doom-enter-window-hook "2.1.0") +(define-obsolete-variable-alias 'doom-before-switch-window-hook 'doom-exit-window-hook "2.1.0") (setq-default ansi-color-for-comint-mode t @@ -304,13 +308,13 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; undo/redo changes to Emacs' window layout (def-package! winner - :after-call doom-before-switch-window-hook + :after-call doom-exit-window-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) ;; highlight matching delimiters (def-package! paren - :after-call (after-find-file doom-before-switch-buffer-hook) + :after-call (after-find-file doom-exit-buffer-hook) :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t @@ -375,19 +379,19 @@ from the default." (window-minibuffer-p window)) (funcall orig-fn window norecord) (let ((doom-inhibit-switch-window-hooks t)) - (run-hooks 'doom-before-switch-window-hook) + (run-hooks 'doom-exit-window-hook) (prog1 (funcall orig-fn window norecord) (with-selected-window window - (run-hooks 'doom-after-switch-window-hook)))))) + (run-hooks 'doom-enter-window-hook)))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) (if (or doom-inhibit-switch-buffer-hooks (eq (get-buffer buffer-or-name) (current-buffer))) (apply orig-fn buffer-or-name args) (let ((doom-inhibit-switch-buffer-hooks t)) - (run-hooks 'doom-before-switch-buffer-hook) + (run-hooks 'doom-exit-buffer-hook) (prog1 (apply orig-fn buffer-or-name args) (with-current-buffer buffer-or-name - (run-hooks 'doom-after-switch-buffer-hook)))))) + (run-hooks 'doom-enter-buffer-hook)))))) (defun doom|init-custom-hooks (&optional disable) (dolist (spec '((select-window . doom*switch-window-hooks) diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el index d347392f9..c9471f0bb 100644 --- a/core/test/test-core-ui.el +++ b/core/test/test-core-ui.el @@ -76,14 +76,14 @@ (describe "switch-buffer" - :var (doom-before-switch-buffer-hook - doom-after-switch-buffer-hook) + :var (doom-exit-buffer-hook + doom-enter-buffer-hook) (before-each - (setq doom-before-switch-buffer-hook '(before-hook) - doom-after-switch-buffer-hook '(after-hook))) + (setq doom-exit-buffer-hook '(before-hook) + doom-enter-buffer-hook '(after-hook))) (after-each - (setq doom-before-switch-buffer-hook nil - doom-after-switch-buffer-hook nil)) + (setq doom-exit-buffer-hook nil + doom-enter-buffer-hook nil)) (it "should trigger when switching buffers" (switch-to-buffer b) @@ -101,8 +101,8 @@ (describe "switch-window" - :var (doom-before-switch-window-hook - doom-after-switch-window-hook + :var (doom-exit-window-hook + doom-enter-window-hook x y) (before-each (delete-other-windows) @@ -113,8 +113,8 @@ (select-window x) (spy-calls-reset 'before-hook) (spy-calls-reset 'after-hook) - (setq doom-before-switch-window-hook '(before-hook) - doom-after-switch-window-hook '(after-hook))) + (setq doom-exit-window-hook '(before-hook) + doom-enter-window-hook '(after-hook))) (it "should trigger when switching windows" (select-window y) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 37eb972f1..4e9a81da7 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -44,14 +44,14 @@ warning)." (make-directory +wakatime-home t))) (global-wakatime-mode +1)) ;; - (remove-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) + (remove-hook 'doom-exit-buffer-hook #'+wakatime|autostart) (advice-remove 'after-find-file #'+wakatime|autostart)) ;;;###autoload (defun +wakatime|delayed-autostart (&rest _) "Lazily initialize `wakatime-mode' until the next time you switch buffers or open a file." - (add-hook 'doom-before-switch-buffer-hook #'+wakatime|autostart) + (add-hook 'doom-exit-buffer-hook #'+wakatime|autostart) ;; this is necessary in case the user opens emacs with file arguments (advice-add 'after-find-file :before #'+wakatime|autostart)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index f613309f8..9020c0dc7 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -129,7 +129,7 @@ Possible values: (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) (add-hook 'window-size-change-functions #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) - (add-hook 'doom-after-switch-buffer-hook #'+doom-dashboard|reload-on-kill) + (add-hook 'doom-enter-buffer-hook #'+doom-dashboard|reload-on-kill) (unless (daemonp) (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) ;; `persp-mode' integration: update `default-directory' when switching diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index 3ab42ec28..3adf6ed9f 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -6,7 +6,7 @@ ;; NOTE In :feature lookup `recenter' is hooked to a bunch of jumping ;; commands, which will trigger nav-flash. (add-hook! - '(doom-after-switch-window-hook + '(doom-enter-window-hook imenu-after-jump-hook evil-jumps-post-jump-hook counsel-grep-post-action-hook dumb-jump-after-jump-hook) #'+nav-flash/blink-cursor) From 9756a0a18c223d0e32f30bfeca3d6a608668bcea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Jul 2018 23:31:32 +0200 Subject: [PATCH 2279/4235] Remove doom-themes-common reloading No longer necessary with upcoming doom-themes update. --- modules/ui/doom/config.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 9f160bc02..f950b58ca 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -28,10 +28,6 @@ (unless doom-theme (setq doom-theme 'doom-one)) :config - ;; Reload common faces when reloading doom-themes live - (defun +doom*reload-common (&rest _) (load "doom-themes-common.el" nil t)) - (advice-add #'doom/reload-theme :before #'+doom*reload-common) - ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) From 1530cdbdb6d7371cbf82b603da2b23d0586306c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 2 Jul 2018 23:32:11 +0200 Subject: [PATCH 2280/4235] Fix vanilla sandbox creating too many temp files On every execution. --- core/autoload/debug.el | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 4e99faffe..5a096b816 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -128,23 +128,22 @@ branch and commit." (defun doom--run-vanilla-sandbox () "TODO" (interactive) - (when (equal (buffer-name) "*doom:vanilla-sandbox*") - (let ((file (make-temp-file "doom-eval-"))) - (write-file file) - (require 'pp) - (require 'restart-emacs) - (restart-emacs--launch-other-emacs - (list "-Q" - "--eval" - (prin1-to-string - `(setq user-emacs-directory ,doom-emacs-dir - package--init-file-ensured t - package-user-dir ,package-user-dir - package-archives ',package-archives - debug-on-error t)) - "-f" "package-initialize" - "-l" file - "--eval" (prin1-to-string `(delete-file ,file))))))) + (let ((contents (buffer-string)) + (file (make-temp-file "/tmp/doom-eval-"))) + (with-temp-file file (insert contents)) + (require 'pp) + (require 'restart-emacs) + (restart-emacs--launch-other-emacs + (list "-Q" + "--eval" + (prin1-to-string + `(setq user-emacs-directory ,doom-emacs-dir + package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives + debug-on-error t)) + "-f" "package-initialize" + "--eval" (prin1-to-string `(unwind-protect (load ,file) (delete-file ,file))))))) ;;;###autoload (defun doom/open-vanilla-sandbox () From 9648aa409332beb51af07000d8c9ec25838ffdd0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 00:53:06 +0200 Subject: [PATCH 2281/4235] Defer server reloading of autoloads Occasionally, bin/doom commands hang when generating autoloads. It blocks endlessly after sending a message to an active Emacs server, but never receives a proper reply. This commit makes it less likely that this hanging will leave Doom in a broken state (and also informs the user it is safe to abort the process). --- core/core-cli.el | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 457800380..65a818ca9 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -337,10 +337,22 @@ it exists." (when (funcall fn doom-auto-accept) (doom-reload-package-autoloads))) -(defun doom--server-load (file) - (require 'server) - (when (server-running-p) - (server-eval-at server-name `(load-file ,(byte-compile-dest-file file))))) +(defun doom--server-reload-autoloads () + (message "Reloading your current Emacs session\n") + (message "If this hangs, it is safe to abort the process here") + (server-eval-at + server-name + `(dolist (file '(,doom-autoload-file ,doom-package-autoload-file)) + (load-file (byte-compile-dest-file file))))) + +(defun doom--server-load (&rest files) + (if (and noninteractive (not (daemonp))) + (progn + (require 'server) + (when (server-running-p) + (add-hook 'kill-emacs-hook #'doom--server-reload-autoloads))) + (dolist (file files) + (load-file (byte-compile-dest-file file))))) (defun doom--byte-compile-file (file) (let ((short-name (file-name-nondirectory file)) From 24686948c246bdb8295f724e77f246af49e20b94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 00:57:12 +0200 Subject: [PATCH 2282/4235] ui/fci: fix invalid-face: line-number error #738 The line-number face was introduced in Emacs 26 and will cause this error in earlier versions. --- modules/ui/fci/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index 5283cb4cf..705001078 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -1,7 +1,9 @@ ;;; ui/fci/config.el -*- lexical-binding: t; -*- (defvar +fci-rule-color-function - (lambda () (face-foreground 'line-number)) + (if EMACS26+ + (lambda () (face-foreground 'line-number)) + (lambda () (face-foreground 'font-lock-comment-face))) "Color used to draw the fill-column rule. Accepts a color string or a function that returns a color. From 2764bc6ed5f3498741a4bfd6574debb139fd4c66 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 02:13:53 +0200 Subject: [PATCH 2283/4235] Remove many conflicting emacs-state keybinds #734 The impact many of these keybinds would have on Emacs state weren't thought through and end up rebinding important keys. --- modules/config/default/+bindings.el | 63 ++++++++++++++--------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 840b4e755..8517eb412 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -25,50 +25,49 @@ ;; A little sandbox to run code in :gnvime "M-;" #'eval-expression - :gnvime "M-:" #'doom/open-scratch-buffer ;; Text-scaling - :ne "M-+" (λ! (text-scale-set 0)) - :ne "M-=" #'text-scale-increase - :ne "M--" #'text-scale-decrease + :n "M-+" (λ! (text-scale-set 0)) + :n "M-=" #'text-scale-increase + :n "M--" #'text-scale-decrease ;; Simple window/frame navigation/manipulation - :ne "C-`" #'+popup/toggle - :ne "C-~" #'+popup/raise - :ne "M-t" #'+workspace/new - :ne "M-T" #'+workspace/display - :ne "M-w" #'delete-window - :ne "M-W" #'delete-frame - :ne "C-M-f" #'toggle-frame-fullscreen - :ne "M-n" #'evil-buffer-new - :ne "M-N" #'make-frame - :ne "M-1" (λ! (+workspace/switch-to 0)) - :ne "M-2" (λ! (+workspace/switch-to 1)) - :ne "M-3" (λ! (+workspace/switch-to 2)) - :ne "M-4" (λ! (+workspace/switch-to 3)) - :ne "M-5" (λ! (+workspace/switch-to 4)) - :ne "M-6" (λ! (+workspace/switch-to 5)) - :ne "M-7" (λ! (+workspace/switch-to 6)) - :ne "M-8" (λ! (+workspace/switch-to 7)) - :ne "M-9" (λ! (+workspace/switch-to 8)) - :ne "M-0" #'+workspace/switch-to-last + :n "C-`" #'+popup/toggle + :n "C-~" #'+popup/raise + :n "M-t" #'+workspace/new + :n "M-T" #'+workspace/display + :n "M-w" #'delete-window + :n "M-W" #'delete-frame + :n "C-M-f" #'toggle-frame-fullscreen + :n "M-n" #'evil-buffer-new + :n "M-N" #'make-frame + :n "M-1" (λ! (+workspace/switch-to 0)) + :n "M-2" (λ! (+workspace/switch-to 1)) + :n "M-3" (λ! (+workspace/switch-to 2)) + :n "M-4" (λ! (+workspace/switch-to 3)) + :n "M-5" (λ! (+workspace/switch-to 4)) + :n "M-6" (λ! (+workspace/switch-to 5)) + :n "M-7" (λ! (+workspace/switch-to 6)) + :n "M-8" (λ! (+workspace/switch-to 7)) + :n "M-9" (λ! (+workspace/switch-to 8)) + :n "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" #'+default/compile - :ne "M-a" #'mark-whole-buffer - :ne "M-c" #'evil-yank - :ne "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) + :n "M-r" #'+eval/buffer + :n "M-R" #'+eval/region-and-replace + :n "M-b" #'+default/compile + :n "M-a" #'mark-whole-buffer + :n "M-c" #'evil-yank + :n "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) (:when (featurep! :completion helm) - :ne "M-f" #'helm-swoop) + :n "M-f" #'helm-swoop) (:when (featurep! :completion ivy) - :ne "M-f" #'swiper) + :n "M-f" #'swiper) :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 + :gnvimr "M-v" #'clipboard-yank ;; Easier window navigation :en "C-h" #'evil-window-left :en "C-j" #'evil-window-down From 65d2b0133338a3ae9a5854612ea4076569a8d699 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 02:30:56 +0200 Subject: [PATCH 2284/4235] Revert "Refuse to enable intero-mode if intero is absent" This reverts commit 4f40fef59265d86ee25d458be9c478035b3cd9b4. This was short sighted. The intero check doesn't find per-project built instances of intero. --- modules/lang/haskell/+intero.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 1be965665..5dc501743 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -8,9 +8,9 @@ "Initializes `intero-mode' in haskell-mode, unless stack isn't installed. This is necessary because `intero-mode' doesn't do its own error checks." (when (derived-mode-p 'haskell-mode) - (if (executable-find "intero") + (if (executable-find "stack") (intero-mode +1) - (message "Couldn't find intero. Refusing to enable intero-mode.")))) + (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) From b42dd5c1db00ec26149c4857844f917deac65145 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 03:38:18 +0200 Subject: [PATCH 2285/4235] Minor refactor of doom|init-fonts Prefer native functions over macros, and conform to new convention of naming condition-case error variables "e". No, not the meme. --- core/core-ui.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index b6572cf1f..24ad30a3d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -551,7 +551,7 @@ frame's window-system, the theme will be reloaded.") (defun doom|init-fonts () "Initialize fonts." - (condition-case-unless-debug ex + (condition-case e (custom-set-faces (when (fontp doom-font) (let ((xlfd (font-xlfd-name doom-font))) @@ -564,14 +564,14 @@ frame's window-system, the theme will be reloaded.") (setq use-default-font-for-symbols nil) (set-fontset-font t 'unicode doom-unicode-font nil) nil)) - ('error - (if (string-prefix-p "Font not available: " (error-message-string ex)) + ((debug error) + (if (string-prefix-p "Font not available: " (error-message-string e)) (lwarn 'doom-ui :warning "Could not find the '%s' font on your system, falling back to system font" - (font-get (caddr ex) :family)) + (font-get (caddr e) :family)) (lwarn 'doom-ui :error "Unexpected error while initializing fonts: %s" - (error-message-string ex)))))) + (error-message-string e)))))) (defun doom|init-theme () "Set the theme and load the font, in that order." From bcd930abb7024a352d3dd2dab67870bfbb957b35 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 03:39:29 +0200 Subject: [PATCH 2286/4235] Reformat haskell packages.el --- modules/lang/haskell/packages.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index f70614cb8..5c822bd9c 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -2,11 +2,9 @@ ;;; lang/haskell/packages.el (package! haskell-mode) - -;; -(cond ((featurep! +dante) - (package! dante)) - (t (package! intero))) - (package! hindent) +(cond ((featurep! +dante) + (package! dante)) + ((package! intero))) + From f39d49c9546a75ca393e5b919bd7828a54d6768e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 12:29:27 +0200 Subject: [PATCH 2287/4235] Conditionally enable custom neotree icon theme If :ui neotree is disabled, disable the icon theme. --- modules/ui/doom/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index f950b58ca..3e5c9ce33 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -32,10 +32,11 @@ (add-hook 'doom-load-theme-hook #'doom-themes-org-config) ;; more Atom-esque file icons for neotree - (add-hook 'doom-load-theme-hook #'doom-themes-neotree-config) - (setq doom-neotree-enable-variable-pitch t - doom-neotree-file-icons 'simple - doom-neotree-line-spacing 2)) + (when (featurep! :ui neotree) + (add-hook 'doom-load-theme-hook #'doom-themes-neotree-config) + (setq doom-neotree-enable-variable-pitch t + doom-neotree-file-icons 'simple + doom-neotree-line-spacing 2))) (def-package! solaire-mode From d0eaa0af1e4adf706cbc5cc8299097cbadea0f10 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 20:00:37 +0200 Subject: [PATCH 2288/4235] Redesign dashboard widgets --- modules/ui/doom-dashboard/config.el | 150 ++++++++++++++++++++-------- 1 file changed, 110 insertions(+), 40 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 9020c0dc7..9c78f03b7 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -3,9 +3,11 @@ (defvar +doom-dashboard-name "*doom*" "The name to use for the dashboard buffer.") -(defvar +doom-dashboard-functions '(doom-dashboard-widget-banner - doom-dashboard-widget-shortmenu - doom-dashboard-widget-loaded) +(defvar +doom-dashboard-functions + '(doom-dashboard-widget-banner + doom-dashboard-widget-shortmenu + doom-dashboard-widget-loaded + doom-dashboard-widget-footer) "List of widget functions to run in the dashboard buffer to construct the dashboard. These functions take no arguments and the dashboard buffer is current while they run.") @@ -29,6 +31,64 @@ Possible values: a STRING a fixed path nil `default-directory' will never change") +(defvar +doom-dashboard-menu-sections + '(("Reload last session" + :icon (all-the-icons-octicon "history" :face 'font-lock-keyword-face) + :when (and (bound-and-true-p persp-mode) + (file-exists-p (expand-file-name persp-auto-save-fname + persp-save-dir))) + :key "SPC TAB r" + :face '(:inherit (font-lock-keyword-face bold)) + :action (+workspace/load-session)) + ("See agenda for this week" + :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) + :when (fboundp 'org-agenda-list) + :key "SPC o a" + :action (call-interactively #'org-agenda-list)) + ("Recently opened files" + :icon (all-the-icons-octicon "file-text" :face 'font-lock-keyword-face) + :key "SPC f r" + :action + (call-interactively (or (command-remapping #'recentf-open-files) + #'recentf-open-files))) + ("Open project" + :icon (all-the-icons-octicon "briefcase" :face 'font-lock-keyword-face) + :key "SPC p p" + :action + (call-interactively (or (command-remapping #'projectile-switch-project) + #'projectile-switch-project))) + ("Jump to bookmark" + :icon (all-the-icons-octicon "bookmark" :face 'font-lock-keyword-face) + :key "SPC RET" + :action + (call-interactively (or (command-remapping #'bookmark-jump) + #'bookmark-jump))) + ("Open private configuration" + :icon (all-the-icons-octicon "tools" :face 'font-lock-keyword-face) + :when (file-directory-p doom-private-dir) + :key "SPC f p" + :action (doom-project-find-file doom-private-dir)) + ("Open user manual" + :icon (all-the-icons-octicon "book" :face 'font-lock-keyword-face) + :key "SPC h D" + :action (doom/open-manual))) + "An alist of menu buttons used by `doom-dashboard-widget-shortmenu'. Each +element is a cons cell (LABEL . PLIST). LABEL is a string to display after the +icon and before the key string. + +PLIST can have the following properties: + + :icon FORM + Uses the return value of FORM as an icon (can be literal string). + :key STRING + The keybind displayed next to the button. + :when FORM + If FORM returns nil, don't display this button. + :face FACE + Displays the icon and text with FACE (a face symbol). + :action FORM + Run FORM when the button is pushed.") + ;; (defvar +doom-dashboard--last-cwd nil) (defvar +doom-dashboard--width 80) @@ -64,6 +124,7 @@ Possible values: (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) (setq-local hscroll-margin 0) + (setq-local tab-width 2) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) @@ -314,45 +375,54 @@ controlled by `+doom-dashboard-pwd-policy'." +doom-dashboard--width (doom|display-benchmark 'return)) 'face 'font-lock-comment-face) - "\n\n")) + "\n")) (defun doom-dashboard-widget-shortmenu () (let ((all-the-icons-scale-factor 1.45) (all-the-icons-default-adjust -0.02)) (insert "\n") - (mapc (lambda (btn) - (when btn - (cl-destructuring-bind (label icon fn) btn - (insert - (with-temp-buffer - (insert-text-button - (concat (all-the-icons-octicon icon :face 'font-lock-keyword-face) - (propertize (concat " " label) 'face 'font-lock-keyword-face)) - 'action `(lambda (_) ,fn) - 'follow-link t) - (+doom-dashboard--center (- +doom-dashboard--width 2) (buffer-string))) - "\n\n")))) - `(("Homepage" "mark-github" - (browse-url "https://github.com/hlissner/doom-emacs")) - ,(when (and (bound-and-true-p persp-mode) - (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) - '("Reload last session" "history" - (+workspace/load-session))) - ,(when (fboundp 'org-agenda-list) - '("See agenda for this week" "calendar" - (call-interactively #'org-agenda-list))) - ("Recently opened files" "file-text" - (call-interactively (or (command-remapping #'recentf-open-files) - #'recentf-open-files))) - ("Open project" "briefcase" - (call-interactively (or (command-remapping #'projectile-switch-project) - #'projectile-switch-project))) - ("Jump to bookmark" "bookmark" - (call-interactively (or (command-remapping #'bookmark-jump) - #'bookmark-jump))) - ,(when (file-directory-p doom-private-dir) - '("Open private configuration" "tools" - (doom-project-find-file doom-private-dir))) - ("Edit my modules list" "settings" - (progn (make-directory doom-private-dir t) - (find-file (expand-file-name "init.el" doom-private-dir)))))))) + (dolist (section +doom-dashboard-menu-sections) + (cl-destructuring-bind (label &key icon action when key face) section + (when (or (null when) (eval when t)) + (insert + (+doom-dashboard--center + (- +doom-dashboard--width 1) + (let ((icon (if (stringp icon) icon (eval icon t)))) + (format (format "%s%%s%%-10s" (if icon "%3s\t" "%3s")) + (or icon "") + (with-temp-buffer + (insert-text-button + (propertize label 'face (or face 'font-lock-keyword-face)) + 'action `(lambda (_) ,action) + 'follow-link t + 'help-echo label) + (format "%-37s" (buffer-string))) + ;; Lookup command keys dynamically + (cond ((null key) "") + ((stringp key) + (propertize key 'face 'font-lock-constant-face)) + ((listp key) + (eval key t)))))) + (if (display-graphic-p) + "\n\n" + "\n"))))))) + +(defun doom-dashboard-widget-footer () + (insert + "\n" + (+doom-dashboard--center + (- +doom-dashboard--width 2) + (with-temp-buffer + ;; TODO Publish the site! + ;; (insert-text-button (propertize "doomemacs.org" 'face 'font-lock-keyword-face) + ;; 'action (lambda (_) (browse-url "http://github.com/hlissner/doom-emacs")) + ;; 'follow-link t + ;; 'help-echo "Open home page") + ;; (insert (propertize " x " 'face 'font-lock-comment-face)) + (insert-text-button (or (all-the-icons-octicon "octoface" :face 'all-the-icons-green :height 1.3 :v-adjust -0.15) + (propertize "github" 'face 'font-lock-keyword-face)) + 'action (lambda (_) (browse-url "https://github.com/hlissner/doom-emacs")) + 'follow-link t + 'help-echo "Open github page") + (buffer-string))) + "\n")) From 1d4a41833ef7d4541940419d83b53b7bbfc179a7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 20:05:27 +0200 Subject: [PATCH 2289/4235] Don't wrap forward/backward-button keys --- modules/ui/doom-dashboard/autoload.el | 12 ++++++++++++ modules/ui/doom-dashboard/config.el | 2 ++ 2 files changed, 14 insertions(+) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index 26c0e4a0d..b003edbf1 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -6,3 +6,15 @@ (interactive (list (selected-frame))) (with-selected-frame frame (switch-to-buffer (+doom-dashboard-initial-buffer)))) + +;;;###autoload +(defun +doom-dashboard/forward-button (n) + "Like `forward-button', but don't wrap." + (interactive "p") + (forward-button n nil)) + +;;;###autoload +(defun +doom-dashboard/backward-button (n) + "Like `backward-button', but don't wrap." + (interactive "p") + (backward-button n nil)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 9c78f03b7..7025cb4a8 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -131,6 +131,8 @@ PLIST can have the following properties: (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) (define-key! +doom-dashboard-mode-map + [remap forward-button] #'+doom-dashboard/forward-button + [remap backward-button] #'+doom-dashboard/backward-button "n" #'forward-button "p" #'backward-button "\C-n" #'forward-button From a0b7ccb74b4a71b66b509fbe1b3d21b27957180e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 3 Jul 2018 20:05:49 +0200 Subject: [PATCH 2290/4235] emacs/eshell: restore margins They were disabled because of shell width issues, but removing the margin didn't change the situation! --- modules/emacs/eshell/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 24e557f19..21178be71 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -83,7 +83,8 @@ You should use `det-eshell-alias!' to change this.") ;; UI enhancements (defun +eshell|remove-fringes () - (set-window-fringes nil 0 0)) + (set-window-fringes nil 0 0) + (set-window-margins nil 1 nil)) (add-hook 'eshell-mode-hook #'+eshell|remove-fringes) (defun +eshell|enable-text-wrapping () From 38414a636f109f95ad6e8e7b7a67a85fd1cb424c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 13:16:11 +0200 Subject: [PATCH 2291/4235] Fix evil-org's o/O in nested plain lists Thanks by @fuxialexander --- modules/lang/org/autoload/org.el | 11 +++++++++++ modules/lang/org/config.el | 8 ++++++++ 2 files changed, 19 insertions(+) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 7a27bdeb1..9021a29f3 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -427,3 +427,14 @@ with `org-cycle')." "Auto-align table under cursor and re-calculate formulas." (when (eq major-mode 'org-mode) (+org|realign-table-maybe))) + +;;;###autoload +(defun +org*evil-org-open-below (orig-fn count) + "Fix o/O creating new list items in the middle of nested plain lists. Only has +an effect when `evil-org-special-o/O' has `item' in it (not the default)." + (cl-letf (((symbol-function 'end-of-visible-line) + (lambda () + (org-end-of-item) + (backward-char 1) + (evil-append nil)))) + (funcall orig-fn count))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 92bf7c104..7c018deeb 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -255,6 +255,10 @@ between the two." (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) ;; Tell `doom/delete-backward-char' to respect org tables (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char) + ;; Don't split current tree on M-RET + (setq org-M-RET-may-split-line nil + ;; insert new headings after current subtree rather than inside it + org-insert-heading-respect-content t) ;; Custom keybinds (define-key! org-mode-map (kbd "C-c C-S-l") #'+org/remove-link @@ -272,6 +276,10 @@ between the two." (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold t) ;; Fix newline-and-indent behavior in src blocks (advice-add #'org-return-indent :after #'+org*return-indent-in-src-blocks) + ;; Fix o/O creating new list items in the middle of nested plain lists. Only + ;; has an effect when `evil-org-special-o/O' has `item' in it (not the + ;; default). + (advice-add #'evil-org-open-below :around #'+org*evil-org-open-below) ;; Undo `evil-collection-outline' (evil-define-key* 'normal outline-mode-map "^" nil From e8945b214234564ecd9fce9a317c0892c4d570d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 13:26:43 +0200 Subject: [PATCH 2292/4235] No evil-org-special-o/O in plain lists by default evil-org changes the behavior of o/O to create new headlines, plain list items or table rows. I disable its new behavior in plain lists only. This was done because: 1. It isn't uncommon to want o/O's default behavior in plain list bodies of text. Unlike tables, where a new line in the middle of a table doesn't make much sense. 2. M-RET/S-M-RET exists. --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 7c018deeb..aaec78329 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -26,6 +26,7 @@ :hook (org-mode . evil-org-mode) :init (defvar evil-org-key-theme '(navigation insert textobjects)) + (defvar evil-org-special-o/O '(table-row)) (add-hook 'org-load-hook #'+org|setup-evil) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config From 00e23db0b025857d5c20b21d8fa1fb4cc68aa67b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 13:40:44 +0200 Subject: [PATCH 2293/4235] Fix workspace restore/load workspace keybinds As well as keybind on dashboard. --- modules/config/default/+bindings.el | 4 ++-- modules/ui/doom-dashboard/config.el | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 8517eb412..4be557b55 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -530,15 +530,15 @@ :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 "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 "Rename workspace" :n "r" #'+workspace/rename + :desc "Restore last session" :n "R" (λ! (+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)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 7025cb4a8..06c6659fa 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -37,7 +37,7 @@ Possible values: :when (and (bound-and-true-p persp-mode) (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) - :key "SPC TAB r" + :key "SPC TAB R" :face '(:inherit (font-lock-keyword-face bold)) :action (+workspace/load-session)) ("See agenda for this week" From 99ab08afe8da3029e2dd87a1f35d5a26c6d96fd9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 14:09:56 +0200 Subject: [PATCH 2294/4235] Add SPC o a keybind (org-agenda-list) --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4be557b55..dd482673f 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -660,6 +660,7 @@ :desc "Org capture" :n "x" #'org-capture) (:desc "open" :prefix "o" + :desc "Org agenda" :n "a" #'org-agenda-list :desc "Default browser" :n "b" #'browse-url-of-file :desc "Debugger" :n "d" #'+debug/open :desc "REPL" :n "r" #'+eval/open-repl From c9ffa063e7ed9bae10f7cd6cc463a7639731923b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 14:19:22 +0200 Subject: [PATCH 2295/4235] Fix +org/insert-item in nested plain lists Would prepend new list items in the middle of plain lists, rather than before them. --- modules/lang/org/autoload/org.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 9021a29f3..9fca302b7 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -169,7 +169,7 @@ wrong places)." (org-end-of-line))) (insert "\n" (make-string pad 32) (or marker "")))) (`above - (goto-char (line-beginning-position)) + (org-beginning-of-item) (if (and marker (string-match-p "[0-9]+[).]" marker)) (org-insert-item) (insert (make-string pad 32) (or marker "")) From e37e6fc25c576fce2aae536149099234fe091f9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 15:33:15 +0200 Subject: [PATCH 2296/4235] Fix invalid face: quote errors in dashboard --- 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 06c6659fa..6b4de96ee 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -38,7 +38,7 @@ Possible values: (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) :key "SPC TAB R" - :face '(:inherit (font-lock-keyword-face bold)) + :face (:inherit (font-lock-keyword-face bold)) :action (+workspace/load-session)) ("See agenda for this week" :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) From ee4060ab80bbc8ef49157d3959d9648abfc926c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 16:19:30 +0200 Subject: [PATCH 2297/4235] Add image banner display logic to dashboard But disabled by default (until the logo is ready). --- modules/ui/doom-dashboard/config.el | 70 ++++++++++++++++++----------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 6b4de96ee..3062e58a3 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -92,7 +92,7 @@ PLIST can have the following properties: ;; (defvar +doom-dashboard--last-cwd nil) (defvar +doom-dashboard--width 80) -(defvar +doom-dashboard--height 0) +(defvar +doom-dashboard--hoffset 2) (defvar +doom-dashboard--old-fringe-indicator fringe-indicator-alist) (defvar +doom-dashboard--pwd-alist ()) @@ -240,9 +240,10 @@ whose dimensions may not be fully initialized by the time this is run." (point))) (insert (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) - (truncate (/ (count-lines (point-min) (point-max)) - 2)) - 2)) ?\n) + (truncate (/ (+ (count-lines (point-min) (point-max)) + +doom-dashboard--hoffset) + 2)))) + ?\n) "\n"))))))) (defun +doom-dashboard|detect-project (&rest _) @@ -345,29 +346,44 @@ controlled by `+doom-dashboard-pwd-policy'." ;; (defun doom-dashboard-widget-banner () - (mapc (lambda (line) - (insert (propertize (+doom-dashboard--center +doom-dashboard--width line) - 'face 'font-lock-comment-face) " ") - (insert "\n")) - '("================= =============== =============== ======== ========" - "\\\\ . . . . . . .\\\\ //. . . . . . .\\\\ //. . . . . . .\\\\ \\\\. . .\\\\// . . //" - "||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\\/ . . .||" - "|| . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||" - "||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||" - "|| . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\\ . . . . ||" - "||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\\_ . .|. .||" - "|| . _|| || || || || ||_ . || || . _|| || || || |\\ `-_/| . ||" - "||_-' || .|/ || || \\|. || `-_|| ||_-' || .|/ || || | \\ / |-_.||" - "|| ||_-' || || `-_|| || || ||_-' || || | \\ / | `||" - "|| `' || || `' || || `' || || | \\ / | ||" - "|| .===' `===. .==='.`===. .===' /==. | \\/ | ||" - "|| .==' \\_|-_ `===. .===' _|_ `===. .===' _-|/ `== \\/ | ||" - "|| .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \\/ | ||" - "|| .==' _-' '-__\\._-' '-_./__-' `' |. /| | ||" - "||.==' _-' `' | /==.||" - "==' _-' E M A C S \\/ `==" - "\\ _-' `-_ /" - " `'' ``'"))) + (let ((point (point))) + (mapc (lambda (line) + (insert (propertize (+doom-dashboard--center +doom-dashboard--width line) + 'face 'font-lock-comment-face) " ") + (insert "\n")) + '("================= =============== =============== ======== ========" + "\\\\ . . . . . . .\\\\ //. . . . . . .\\\\ //. . . . . . .\\\\ \\\\. . .\\\\// . . //" + "||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\\/ . . .||" + "|| . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||" + "||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||" + "|| . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\\ . . . . ||" + "||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\\_ . .|. .||" + "|| . _|| || || || || ||_ . || || . _|| || || || |\\ `-_/| . ||" + "||_-' || .|/ || || \\|. || `-_|| ||_-' || .|/ || || | \\ / |-_.||" + "|| ||_-' || || `-_|| || || ||_-' || || | \\ / | `||" + "|| `' || || `' || || `' || || | \\ / | ||" + "|| .===' `===. .==='.`===. .===' /==. | \\/ | ||" + "|| .==' \\_|-_ `===. .===' _|_ `===. .===' _-|/ `== \\/ | ||" + "|| .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \\/ | ||" + "|| .==' _-' '-__\\._-' '-_./__-' `' |. /| | ||" + "||.==' _-' `' | /==.||" + "==' _-' E M A C S \\/ `==" + "\\ _-' `-_ /" + " `'' ``'")) + ;; TODO Add Doom logo + ;; (when (display-graphic-p) + ;; (let* ((image (create-image "~/title.png" 'png nil)) + ;; (size (image-size image)) + ;; (margin (+ 1 (/ (- +doom-dashboard--width (car size)) 2)))) + ;; (setq +doom-dashboard--hoffset (cdr size)) + ;; (add-text-properties + ;; point (point) `(display ,image rear-nonsticky (display))) + ;; (when (> margin 0) + ;; (save-excursion + ;; (goto-char point) + ;; (insert (make-string (truncate margin) ? ))))) + ;; (insert "\n\n\n")) + )) (defun doom-dashboard-widget-loaded () (insert From f5e8c72bb6d6aa5dcab9fbe58e5021816114991c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 17:41:00 +0200 Subject: [PATCH 2298/4235] Add experimental modeline (disabled by default) This mode-line may have bugs and its implementation details are certain to change (it doesn't follow naming conventions, for instance). It also doesn't have all the features of the old modeline (yet). However, it is easily twice as fast as the original, and a little more flexible, what with the `mode-line-format-left' and `mode-line-format-right' variables. It also exposes a more powerful API for defining modelines and modeline segments (and switching between them). It is disabled by default and must be activated with the +new module flag on the ui/doom-modeline module. --- modules/ui/doom-modeline/+new.el | 472 ++++++++++++++++++++ modules/ui/doom-modeline/+old.el | 674 +++++++++++++++++++++++++++++ modules/ui/doom-modeline/config.el | 655 +--------------------------- 3 files changed, 1149 insertions(+), 652 deletions(-) create mode 100644 modules/ui/doom-modeline/+new.el create mode 100644 modules/ui/doom-modeline/+old.el diff --git a/modules/ui/doom-modeline/+new.el b/modules/ui/doom-modeline/+new.el new file mode 100644 index 000000000..2b66134d4 --- /dev/null +++ b/modules/ui/doom-modeline/+new.el @@ -0,0 +1,472 @@ +;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- +;;;###if (featurep! +new) + +;; This mode-line is experimental, may have bugs and is likely to change. It +;; also doesn't have all the features of the old modeline (yet). +;; +;; However, it is at least twice as fast as the original modeline, and a little +;; more flexible, what with `mode-line-format-left' and +;; `mode-line-format-right'. It also exposes a more powerful API for defining +;; modelines and modeline segments that make use of variable watchers and hooks +;; to update them. + +;;;; Benchmarks +;; (benchmark-run 1000 (format-mode-line mode-line-format)) +;; Old system: ~0.198 +;; New system: ~0.056 + +(defvar +doom-modeline-height 25 + "How tall the mode-line should be (only respected in GUI emacs).") + +(defvar +doom-modeline-buffer-name-function + #'doom-modeline--file-path + "TODO") + +(defvar anzu--state nil) +(defvar evil-mode nil) +(defvar evil-state nil) +(defvar evil-visual-selection nil) +(defvar iedit-mode nil) +(defvar all-the-icons-scale-factor) +(defvar all-the-icons-default-adjust) + +(defvar-local mode-line-format-left ()) +(defvar-local mode-line-format-right ()) +(put 'mode-line-format-left 'risky-local-variable t) +(put 'mode-line-format-right 'risky-local-variable t) + + +;; +;; Plugins +;; + +(def-package! anzu + :after-call isearch-mode + :config + (setq anzu-cons-mode-line-p nil + anzu-minimum-input-length 1 + anzu-search-threshold 250) + (global-anzu-mode +1) + + (defun +doom-modeline*fix-anzu-count (positions here) + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) + + ;; Avoid anzu conflicts across buffers + (mapc #'make-variable-buffer-local + '(anzu--total-matched anzu--current-position anzu--state + anzu--cached-count anzu--cached-positions anzu--last-command + anzu--last-isearch-string anzu--overflow-p)) + ;; Ensure anzu state is cleared when searches & iedit are done + (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) + (add-hook 'doom-escape-hook #'anzu--reset-status t) + (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) + + +(def-package! evil-anzu + :when (featurep! :feature evil) + :after-call (evil-ex-start-search evil-ex-start-word-search)) + + +;; +;; Helpers +;; + +;; Keep `+doom-modeline-current-window' up-to-date +(defvar +doom-modeline-current-window (frame-selected-window)) +(defun +doom-modeline|set-selected-window (&rest _) + "Sets `+doom-modeline-current-window' appropriately" + (when-let* ((win (frame-selected-window))) + (unless (minibuffer-window-active-p win) + (setq +doom-modeline-current-window win) + (force-mode-line-update)))) + +(defun +doom-modeline|unset-selected-window () + (setq +doom-modeline-current-window nil) + (force-mode-line-update)) + +(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) +(add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) +(if (not (boundp 'after-focus-change-function)) + (progn + (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) + (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) + (defun +doom-modeline|refresh-frame () + (setq +doom-modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq +doom-modeline-current-window (frame-selected-window frame))) + (force-mode-line-update t)) + (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)) + +(defsubst active () + (eq (selected-window) +doom-modeline-current-window)) + +;; xpm generator +(defun doom-modeline--make-xpm (width height &optional color) + "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." + (propertize + " " 'display + (let ((data (make-list height (make-list width 1))) + (color (or color "None"))) + (ignore-errors + (create-image + (concat + (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," + (length (car data)) + (length data) + color + color) + (apply #'concat + (cl-loop with idx = 0 + with len = (length data) + for dl in data + do (cl-incf idx) + collect + (concat "\"" + (cl-loop for d in dl + if (= d 0) collect (string-to-char " ") + else collect (string-to-char ".")) + (if (eq idx len) "\"};" "\",\n"))))) + 'xpm t :ascent 'center))))) + +(defun doom-modeline--file-path (&optional path) + (let ((buffer-file-name (or path buffer-file-name)) + (root (doom-project-root)) + (active (active))) + (cond ((null root) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file))) + ((or (null buffer-file-name) + (directory-name-p buffer-file-name)) + (propertize (abbreviate-file-name (or buffer-file-name default-directory)) + 'face (if active 'doom-modeline-buffer-path))) + ((let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) + (true-filename (file-truename buffer-file-name)) + (relative-dirs (file-relative-name (file-name-directory true-filename) + (concat root "../"))) + (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (if (equal "./" relative-dirs) (setq relative-dirs "")) + (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) + (propertize (file-name-nondirectory true-filename) + 'face (if file-faces `(:inherit ,file-faces))))))))) + + +;; +;; Macros +;; + +(cl-defmacro def-modeline-segment! (name &rest rest &key init faces hooks vars &allow-other-keys) + "TODO" + (let ((body rest)) + (while (keywordp (car body)) + (setq body (cddr body))) + (setq rest body)) + (unless EMACS26+ + (setq vars nil)) + (let ((docstring (if (stringp (car rest)) (pop rest))) + (realvar (if (and rest faces) (intern (format "doom-modeline--var-%s" name)) name))) + (macroexp-progn + (append (when rest + (if (or hooks vars) + (let ((setterfn (intern (format "doom-modeline--set-%s" name))) + (varsetterfn (intern (format "doom-modeline--setvar-%s" name)))) + (append `((fset ',setterfn + (lambda (&rest _) + (when (or (memq ',name mode-line-format-left) + (memq ',name mode-line-format-right)) + (setq-local ,realvar (progn ,@rest)))))) + (mapcar (lambda (hook) `(add-hook ',hook #',setterfn)) + hooks) + (when vars + `((fset ',varsetterfn + (lambda (sym val op where) + (and (eq op 'set) where + (with-current-buffer where + (set sym val) + (,setterfn))))) + ,@(mapcar (lambda (var) `(add-variable-watcher ',var #',varsetterfn)) + vars))))) + (setq init `(quote (:eval ,@rest))) + nil)) + (if (eq realvar name) + `((defvar-local ,name ,init ,docstring)) + `((defvar-local ,realvar nil) + (defvar-local ,name + '(:eval (cond ((active) ,realvar) (,realvar (substring-no-properties ,realvar)))) + ,docstring))) + `((put ',name 'risky-local-variable t)))))) + +;; +(defvar doom-mode-line-alist nil) + +(defun def-modeline! (name left &optional right) + (setf (alist-get name doom-mode-line-alist) (list left right))) + +(defun set-modeline! (name &optional default) + (let ((modeline (cdr (assq name doom-mode-line-alist)))) + (if default + (setq-default mode-line-format-left `("" ,@(car modeline)) + mode-line-format-right `("" ,@(cadr modeline))) + (setq mode-line-format-left `("" ,@(car modeline)) + mode-line-format-right `("" ,@(cadr modeline)))) + (force-mode-line-update))) + + +;; +;; Bars +;; + +(defvar mode-line-bar-active nil "TODO") +(defvar mode-line-bar-inactive nil "TODO") +(defun doom-modeline|setup-bars () + (setq mode-line-bar-active + (doom-modeline--make-xpm 3 +doom-modeline-height (face-background 'doom-modeline-bar)) + mode-line-bar-inactive + (doom-modeline--make-xpm 3 +doom-modeline-height))) +(add-hook 'doom-load-modeline-hook #'doom-modeline|setup-bars) + +(defun doom-modeline|setup-bars-after-change (_sym val op _where) + (when (eq op 'set) + (let ((+doom-modeline-height val)) + (doom-modeline|setup-bars)))) +(add-variable-watcher '+doom-modeline-height #'doom-modeline|setup-bars-after-change) + +(def-modeline-segment! +mode-line-bar + (if (active) mode-line-bar-active mode-line-bar-inactive)) + + +;; +;; Segments +;; + +(defun +doom-modeline|update-on-change () + (doom-modeline--set-+mode-line-buffer-id) + (remove-hook 'post-command-hook #'+doom-modeline|update-on-change t)) +(defun +doom-modeline|start-update-on-change () + (add-hook 'post-command-hook #'+doom-modeline|update-on-change nil t)) +(add-hook 'first-change-hook #'+doom-modeline|start-update-on-change) + +(advice-add #'undo :after #'doom-modeline--set-+mode-line-buffer-id) +(advice-add #'undo-tree-undo :after #'doom-modeline--set-+mode-line-buffer-id) + +(def-modeline-segment! +mode-line-buffer-id + :hooks (find-file-hook after-change-functions read-only-mode-hook after-save-hook after-revert-hook) + :faces t + (concat (cond (buffer-read-only + (concat (all-the-icons-octicon + "lock" + :face 'doom-modeline-warning + :v-adjust -0.05) + " ")) + ((buffer-modified-p) + (concat (all-the-icons-faicon + "floppy-o" + :face 'doom-modeline-buffer-modified + :v-adjust -0.0575) + " ")) + ((and buffer-file-name (not (file-exists-p buffer-file-name))) + (concat (all-the-icons-octicon + "circle-slash" + :face 'doom-modeline-urgent + :v-adjust -0.05) + " "))) + (if buffer-file-name + (funcall +doom-modeline-buffer-name-function buffer-file-name) + "%b"))) + +(def-modeline-segment! +mode-line-buffer-directory + (let ((face (if (active) 'doom-modeline-buffer-path))) + (concat (if (display-graphic-p) " ") + (all-the-icons-octicon + "file-directory" + :face face + :v-adjust -0.05 + :height 1.25) + (propertize (concat " " (abbreviate-file-name default-directory)) + 'face face)))) + +(def-modeline-segment! +mode-line-vcs + :vars (vc-mode) + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend))) + (let ((face 'mode-line-inactive) + (active (active)) + (all-the-icons-default-adjust -0.1)) + (concat " " + (cond ((memq state '(edited added)) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05)) + ((eq state 'needs-merge) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon "git-merge" :face face)) + ((eq state 'needs-update) + (if active (setq face 'doom-modeline-warning)) + (all-the-icons-octicon "arrow-down" :face face)) + ((memq state '(removed conflict unregistered)) + (if active (setq face 'doom-modeline-urgent)) + (all-the-icons-octicon "alert" :face face)) + (t + (if active (setq face 'font-lock-doc-face)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05))) + " " + (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) + 'face (if active face)) + " "))))) + +(def-modeline-segment! +mode-line-encoding + :hooks (after-save-hook find-file-hook) + :vars (buffer-file-coding-system) + (concat (pcase (coding-system-eol-type buffer-file-coding-system) + (0 "LF ") + (1 "CRLF ") + (2 "CR ")) + (let ((sys (coding-system-plist buffer-file-coding-system))) + (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) + "UTF-8" + (upcase (symbol-name (plist-get sys :name))))) + " ")) + +(def-modeline-segment! +mode-line-major-mode + :vars (mode-name) + :faces t + (propertize (format-mode-line mode-name) 'face 'font-lock-keyword-face)) + + +(defun +doom-modeline--macro-recording () + "Display current Emacs or evil macro being recorded." + (when (and (active) (or defining-kbd-macro executing-kbd-macro)) + (let ((sep (propertize " " 'face 'doom-modeline-panel))) + (concat sep + (propertize (if (bound-and-true-p evil-this-macro) + (char-to-string evil-this-macro) + "Macro") + 'face 'doom-modeline-panel) + sep + (all-the-icons-octicon "triangle-right" + :face 'doom-modeline-panel + :v-adjust -0.05) + sep)))) + +(defsubst +doom-modeline--anzu () + "Show the match index and total number thereof. Requires `anzu', also +`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." + (when (and anzu--state (not iedit-mode)) + (propertize + (let ((here anzu--current-position) + (total anzu--total-matched)) + (cond ((eq anzu--state 'replace-query) + (format " %d replace " total)) + ((eq anzu--state 'replace) + (format " %d/%d " here total)) + (anzu--overflow-p + (format " %s+ " total)) + (t + (format " %s/%d " here total)))) + 'face (if (active) 'doom-modeline-panel)))) + +(defsubst +doom-modeline--evil-substitute () + "Show number of matches for evil-ex substitutions and highlights in real time." + (when (and evil-mode + (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) + (assq 'evil-ex-global-match evil-ex-active-highlights-alist) + (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) + (propertize + (let ((range (if evil-ex-range + (cons (car evil-ex-range) (cadr evil-ex-range)) + (cons (line-beginning-position) (line-end-position)))) + (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) + (if pattern + (format " %s matches " (how-many pattern (car range) (cdr range))) + " - ")) + 'face (if (active) 'doom-modeline-panel)))) + +(defun doom-themes--overlay-sort (a b) + (< (overlay-start a) (overlay-start b))) + +(defsubst +doom-modeline--iedit () + "Show the number of iedit regions matches + what match you're on." + (when (and iedit-mode iedit-occurrences-overlays) + (propertize + (let ((this-oc (or (let ((inhibit-message t)) + (iedit-find-current-occurrence-overlay)) + (progn (iedit-prev-occurrence) + (iedit-find-current-occurrence-overlay)))) + (length (length iedit-occurrences-overlays))) + (format " %s/%d " + (if this-oc + (- length + (length (memq this-oc (sort (append iedit-occurrences-overlays nil) + #'doom-themes--overlay-sort))) + -1) + "-") + length)) + 'face (if (active) 'doom-modeline-panel)))) + +(def-modeline-segment! +mode-line-matches + "Displays: 1. the currently recording macro, 2. A current/total for the +current search term (with anzu), 3. The number of substitutions being conducted +with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." + (let ((meta (concat (+doom-modeline--macro-recording) + (+doom-modeline--anzu) + (+doom-modeline--evil-substitute) + (+doom-modeline--iedit) + " "))) + (or (and (not (equal meta " ")) meta) + (if buffer-file-name " %I ")))) + +(def-modeline! :main + '(+mode-line-bar +mode-line-matches " " +mode-line-buffer-id " %2l:%c %p ") + '(+mode-line-encoding +mode-line-major-mode +mode-line-vcs)) + +(def-modeline! :project + '(+mode-line-bar +mode-line-buffer-directory) + '(+mode-line-major-mode)) + + +;; +;; +;; + +(def-modeline-segment! mode-line-rest + (let ((rhs-str (format-mode-line mode-line-format-right))) + (list (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(1+ (string-width rhs-str)))))) + rhs-str))) + +(setq-default mode-line-format '("" mode-line-format-left mode-line-rest)) + + +;; +(set-modeline! :main t) + +(add-hook! '+doom-dashboard-mode-hook (set-modeline! :project)) + + +;; +(defun doom-modeline-init () (run-hooks 'doom-load-modeline-hook)) +(add-hook 'doom-load-theme-hook #'doom-modeline-init) + +;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) +(defvar +doom-modeline-remap-face-cookie nil) +(defun +doom-modeline|focus () + (when +doom-modeline-remap-face-cookie + (require 'face-remap) + (face-remap-remove-relative +doom-modeline-remap-face-cookie))) +(defun +doom-modeline|unfocus () + (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) +(add-hook 'focus-in-hook #'+doom-modeline|focus) +(add-hook 'focus-out-hook #'+doom-modeline|unfocus) diff --git a/modules/ui/doom-modeline/+old.el b/modules/ui/doom-modeline/+old.el new file mode 100644 index 000000000..650128b78 --- /dev/null +++ b/modules/ui/doom-modeline/+old.el @@ -0,0 +1,674 @@ +;;;###if (not (featurep! +new)) + +;; anzu and evil-anzu expose current/total state that can be displayed in the +;; mode-line. +(def-package! anzu + :after-call isearch-mode + :config + (setq anzu-cons-mode-line-p nil + anzu-minimum-input-length 1 + anzu-search-threshold 250) + (global-anzu-mode +1) + + (defun +doom-modeline*fix-anzu-count (positions here) + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) + + ;; Avoid anzu conflicts across buffers + (mapc #'make-variable-buffer-local + '(anzu--total-matched anzu--current-position anzu--state + anzu--cached-count anzu--cached-positions anzu--last-command + anzu--last-isearch-string anzu--overflow-p)) + ;; Ensure anzu state is cleared when searches & iedit are done + (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) + (add-hook 'doom-escape-hook #'anzu--reset-status t) + (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) + + +(def-package! evil-anzu + :when (featurep! :feature evil) + :after-call (evil-ex-start-search evil-ex-start-word-search)) + + +;; fish-style modeline +(def-package! shrink-path + :commands (shrink-path-prompt shrink-path-file-mixed)) + + +;; Keep `+doom-modeline-current-window' up-to-date +(defvar +doom-modeline-current-window (frame-selected-window)) +(defun +doom-modeline|set-selected-window (&rest _) + "Sets `+doom-modeline-current-window' appropriately" + (when-let* ((win (frame-selected-window))) + (unless (minibuffer-window-active-p win) + (setq +doom-modeline-current-window win) + (force-mode-line-update)))) + +(defun +doom-modeline|unset-selected-window () + (setq +doom-modeline-current-window nil) + (force-mode-line-update)) + +(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) +(add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) +(with-no-warnings + (cond ((boundp 'after-focus-change-function) + (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) + (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) + ((defun +doom-modeline|refresh-frame () + (setq +doom-modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq +doom-modeline-current-window (frame-selected-window frame))) + (force-mode-line-update)) + (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)))) + + +;; +;; Variables +;; + +(defvar +doom-modeline-height 29 + "How tall the mode-line should be (only respected in GUI emacs).") + +(defvar +doom-modeline-bar-width 3 + "How wide the mode-line bar should be (only respected in GUI emacs).") + +(defvar +doom-modeline-buffer-file-name-style 'truncate-upto-project + "Determines the style used by `+doom-modeline-buffer-file-name'. + +Given ~/Projects/FOSS/emacs/lisp/comint.el +truncate-upto-project => ~/P/F/emacs/lisp/comint.el +truncate-upto-root => ~/P/F/e/lisp/comint.el +truncate-all => ~/P/F/e/l/comint.el +relative-from-project => emacs/lisp/comint.el +relative-to-project => lisp/comint.el +file-name => comint.el") + +;; externs +(defvar anzu--state nil) +(defvar evil-mode nil) +(defvar evil-state nil) +(defvar evil-visual-selection nil) +(defvar iedit-mode nil) +(defvar all-the-icons-scale-factor) +(defvar all-the-icons-default-adjust) + + +;; +;; Modeline helpers +;; + +(defsubst active () + (eq (selected-window) +doom-modeline-current-window)) + +(defun +doom-modeline--make-xpm (face width height) + "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." + (propertize + " " 'display + (let ((data (make-list height (make-list width 1))) + (color (or (face-background face nil t) "None"))) + (ignore-errors + (create-image + (concat + (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," + (length (car data)) + (length data) + color + color) + (apply #'concat + (cl-loop with idx = 0 + with len = (length data) + for dl in data + do (cl-incf idx) + collect + (concat "\"" + (cl-loop for d in dl + if (= d 0) collect (string-to-char " ") + else collect (string-to-char ".")) + (if (eq idx len) "\"};" "\",\n"))))) + 'xpm t :ascent 'center))))) + +(defun +doom-modeline-buffer-file-name () + "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." + (let ((buffer-file-name (or buffer-file-name "")) + (buffer-file-truename (or buffer-file-truename ""))) + (propertize + (pcase +doom-modeline-buffer-file-name-style + (`truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) + (`truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) + (`truncate-all (+doom-modeline--buffer-file-name-truncate t)) + (`relative-to-project (+doom-modeline--buffer-file-name-relative)) + (`relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) + (`file-name (propertize (file-name-nondirectory buffer-file-name) + 'face + (let ((face (or (and (buffer-modified-p) + 'doom-modeline-buffer-modified) + (and (active) + 'doom-modeline-buffer-file)))) + (when face `(:inherit ,face)))))) + 'help-echo buffer-file-truename))) + +(defun +doom-modeline--buffer-file-name-truncate (&optional truncate-tail) + "Propertized `buffer-file-name' that truncates every dir along path. +If TRUNCATE-TAIL is t also truncate the parent directory of the file." + (let ((dirs (shrink-path-prompt (file-name-directory buffer-file-truename))) + (active (active))) + (if (null dirs) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) + (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) + (let ((dirname (car dirs)) + (basename (cdr dirs)) + (dir-faces (or modified-faces (if active 'doom-modeline-project-root-dir))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (concat (propertize (concat dirname + (if truncate-tail (substring basename 0 1) basename) + "/") + 'face (if dir-faces `(:inherit ,dir-faces))) + (propertize (file-name-nondirectory buffer-file-name) + 'face (if file-faces `(:inherit ,file-faces))))))))) + +(defun +doom-modeline--buffer-file-name-relative (&optional include-project) + "Propertized `buffer-file-name' showing directories relative to project's root only." + (let ((root (doom-project-root)) + (active (active))) + (if (null root) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) + (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) + (true-filename (file-truename buffer-file-name)) + (relative-dirs (file-relative-name (file-name-directory true-filename) + (if include-project (concat root "../") root))) + (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (if (equal "./" relative-dirs) (setq relative-dirs "")) + (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) + (propertize (file-name-nondirectory true-filename) + 'face (if file-faces `(:inherit ,file-faces)))))))) + +(defun +doom-modeline--buffer-file-name (truncate-project-root-parent) + "Propertized `buffer-file-name'. +If TRUNCATE-PROJECT-ROOT-PARENT is t space will be saved by truncating it down +fish-shell style. + +Example: +~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" + (let* ((project-root (doom-project-root)) + (file-name-split (shrink-path-file-mixed project-root + (file-name-directory buffer-file-name) + buffer-file-name)) + (active (active))) + (if (null file-name-split) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) + (pcase-let ((`(,root-path-parent ,project ,relative-path ,filename) file-name-split)) + (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) + (let ((sp-faces (or modified-faces (if active 'font-lock-comment-face))) + (project-faces (or modified-faces (if active 'font-lock-string-face))) + (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (let ((sp-props `(,@(if sp-faces `(:inherit ,sp-faces)) ,@(if active '(:weight bold)))) + (project-props `(,@(if project-faces `(:inherit ,project-faces)) ,@(if active '(:weight bold)))) + (relative-props `(,@(if relative-faces `(:inherit ,relative-faces)))) + (file-props `(,@(if file-faces `(:inherit ,file-faces))))) + (concat (propertize (if truncate-project-root-parent + root-path-parent + (abbreviate-file-name project-root)) + 'face sp-props) + (propertize (concat project "/") 'face project-props) + (if relative-path (propertize relative-path 'face relative-props)) + (propertize filename 'face file-props))))))))) + + +;; +;; buffer information +;; + +(def-modeline-segment! buffer-default-directory + "Displays `default-directory'. This is for special buffers like the scratch +buffer where knowing the current project directory is important." + (let ((face (if (active) 'doom-modeline-buffer-path))) + (concat (if (display-graphic-p) " ") + (all-the-icons-octicon + "file-directory" + :face face + :v-adjust -0.05 + :height 1.25) + (propertize (concat " " (abbreviate-file-name default-directory)) + 'face face)))) + +(def-modeline-segment! buffer-info + "Combined information about the current buffer, including the current working +directory, the file name, and its state (modified, read-only or non-existent)." + (concat (cond (buffer-read-only + (concat (all-the-icons-octicon + "lock" + :face 'doom-modeline-warning + :v-adjust -0.05) + " ")) + ((buffer-modified-p) + (concat (all-the-icons-faicon + "floppy-o" + :face 'doom-modeline-buffer-modified + :v-adjust -0.0575) + " ")) + ((and buffer-file-name + (not (file-exists-p buffer-file-name))) + (concat (all-the-icons-octicon + "circle-slash" + :face 'doom-modeline-urgent + :v-adjust -0.05) + " ")) + ((buffer-narrowed-p) + (concat (all-the-icons-octicon + "fold" + :face 'doom-modeline-warning + :v-adjust -0.05) + " "))) + (if buffer-file-name + (+doom-modeline-buffer-file-name) + "%b"))) + +(def-modeline-segment! buffer-info-simple + "Display only the current buffer's name, but with fontification." + (propertize + "%b" + 'face (cond ((and buffer-file-name (buffer-modified-p)) + 'doom-modeline-buffer-modified) + ((active) 'doom-modeline-buffer-file)))) + +;; (defvar +doom-modeline--encoding nil) +;; (def-modeline-segment! buffer-encoding +;; "TODO" +;; +doom-modeline--encoding) + +;; (add-variable-watcher +;; 'buffer-file-coding-system +;; (lambda (_sym val op _where) +;; (when (eq op 'set) +;; (setq +doom-modeline--encoding +;; (concat (pcase (coding-system-eol-type val) +;; (0 "LF ") +;; (1 "CRLF ") +;; (2 "CR ")) +;; (let ((sys (coding-system-plist val))) +;; (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) +;; "UTF-8" +;; (upcase (symbol-name (plist-get sys :name))))) +;; " "))))) + +(def-modeline-segment! buffer-encoding + "Displays the encoding and eol style of the buffer the same way Atom does." + (concat (pcase (coding-system-eol-type buffer-file-coding-system) + (0 "LF ") + (1 "CRLF ") + (2 "CR ")) + (let ((sys (coding-system-plist buffer-file-coding-system))) + (cond ((memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) + "UTF-8") + (t (upcase (symbol-name (plist-get sys :name)))))) + " ")) + + +;; +;; major-mode +;; + +(def-modeline-segment! major-mode + "The major mode, including process, environment and text-scale info." + (propertize + (concat (format-mode-line mode-name) + (when (stringp mode-line-process) + mode-line-process) + (and (boundp 'text-scale-mode-amount) + (/= text-scale-mode-amount 0) + (format " (%+d)" text-scale-mode-amount))) + 'face (if (active) 'doom-modeline-buffer-major-mode))) + + +;; +;; vcs +;; + +(defvar-local +doom-modeline--vcs nil) +(defun +doom-modeline--update-vcs () + (setq +doom-modeline--vcs + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend))) + (let ((face 'mode-line-inactive) + (active (active)) + (all-the-icons-default-adjust -0.1)) + (concat " " + (cond ((memq state '(edited added)) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05)) + ((eq state 'needs-merge) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon "git-merge" :face face)) + ((eq state 'needs-update) + (if active (setq face 'doom-modeline-warning)) + (all-the-icons-octicon "arrow-down" :face face)) + ((memq state '(removed conflict unregistered)) + (if active (setq face 'doom-modeline-urgent)) + (all-the-icons-octicon "alert" :face face)) + (t + (if active (setq face 'font-lock-doc-face)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05))) + " " + (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) + 'face (if active face)) + " ")))))) +(add-hook 'after-save-hook #'+doom-modeline--update-vcs) +(add-hook 'find-file-hook #'+doom-modeline--update-vcs t) + +(def-modeline-segment! vcs + "Displays the current branch, colored based on its state." + +doom-modeline--vcs) + + +;; +;; flycheck +;; + +(defvar +doom-modeline-vspc + (propertize " " 'face 'variable-pitch) + "TODO") + +(defun +doom-ml-icon (icon &optional text face voffset) + "Displays an octicon ICON with FACE, followed by TEXT. Uses +`all-the-icons-octicon' to fetch the icon." + (concat (if vc-mode " " " ") + (when icon + (concat + (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) + (if text +doom-modeline-vspc))) + (if text (propertize text 'face face)) + (if vc-mode " " " "))) + +(defvar-local +doom-modeline--flycheck nil) +(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) +(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) + +(defun +doom-modeline|update-flycheck-segment (&optional status) + (setq +doom-modeline--flycheck + (pcase status + ('finished (if flycheck-current-errors + (let-alist (flycheck-count-errors flycheck-current-errors) + (let ((sum (+ (or .error 0) (or .warning 0)))) + (+doom-ml-icon "do_not_disturb_alt" + (number-to-string sum) + (if .error 'doom-modeline-urgent 'doom-modeline-warning) + -0.25))) + (+doom-ml-icon "check" nil 'doom-modeline-info))) + ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) + ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) + ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) + ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) + +(def-modeline-segment! flycheck + "Displays color-coded flycheck error status in the current buffer with pretty +icons." + +doom-modeline--flycheck) + + +;; +;; selection-info +;; + +(defsubst doom-column (pos) + (save-excursion (goto-char pos) + (current-column))) + +(defvar-local +doom-modeline-enable-word-count nil + "If non-nil, a word count will be added to the selection-info modeline +segment.") + +(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) +(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) + +(def-modeline-segment! selection-info + "Information about the current selection, such as how many characters and +lines are selected, or the NxM dimensions of a block selection." + (when (and mark-active (active)) + (cl-destructuring-bind (beg . end) + (if (eq evil-state 'visual) + (cons evil-visual-beginning evil-visual-end) + (cons (region-beginning) (region-end))) + (propertize + (let ((lines (count-lines beg (min end (point-max))))) + (concat (cond ((or (bound-and-true-p rectangle-mark-mode) + (eq 'block evil-visual-selection)) + (let ((cols (abs (- (doom-column end) + (doom-column beg))))) + (format "%dx%dB" lines cols))) + ((eq evil-visual-selection 'line) + (format "%dL" lines)) + ((> lines 1) + (format "%dC %dL" (- end beg) lines)) + ((format "%dC" (- end beg)))) + (when +doom-modeline-enable-word-count + (format " %dW" (count-words beg end))))) + 'face 'doom-modeline-highlight)))) + + +;; +;; matches (anzu, evil-substitute, iedit, macro) +;; + +(defun +doom-modeline--macro-recording () + "Display current Emacs or evil macro being recorded." + (when (and (active) (or defining-kbd-macro executing-kbd-macro)) + (let ((sep (propertize " " 'face 'doom-modeline-panel))) + (concat sep + (propertize (if (bound-and-true-p evil-this-macro) + (char-to-string evil-this-macro) + "Macro") + 'face 'doom-modeline-panel) + sep + (all-the-icons-octicon "triangle-right" + :face 'doom-modeline-panel + :v-adjust -0.05) + sep)))) + +(defsubst +doom-modeline--anzu () + "Show the match index and total number thereof. Requires `anzu', also +`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." + (when (and anzu--state (not iedit-mode)) + (propertize + (let ((here anzu--current-position) + (total anzu--total-matched)) + (cond ((eq anzu--state 'replace-query) + (format " %d replace " total)) + ((eq anzu--state 'replace) + (format " %d/%d " here total)) + (anzu--overflow-p + (format " %s+ " total)) + (t + (format " %s/%d " here total)))) + 'face (if (active) 'doom-modeline-panel)))) + +(defsubst +doom-modeline--evil-substitute () + "Show number of matches for evil-ex substitutions and highlights in real time." + (when (and evil-mode + (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) + (assq 'evil-ex-global-match evil-ex-active-highlights-alist) + (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) + (propertize + (let ((range (if evil-ex-range + (cons (car evil-ex-range) (cadr evil-ex-range)) + (cons (line-beginning-position) (line-end-position)))) + (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) + (if pattern + (format " %s matches " (how-many pattern (car range) (cdr range))) + " - ")) + 'face (if (active) 'doom-modeline-panel)))) + +(defun doom-themes--overlay-sort (a b) + (< (overlay-start a) (overlay-start b))) + +(defsubst +doom-modeline--iedit () + "Show the number of iedit regions matches + what match you're on." + (when (and iedit-mode iedit-occurrences-overlays) + (propertize + (let ((this-oc (or (let ((inhibit-message t)) + (iedit-find-current-occurrence-overlay)) + (progn (iedit-prev-occurrence) + (iedit-find-current-occurrence-overlay)))) + (length (length iedit-occurrences-overlays))) + (format " %s/%d " + (if this-oc + (- length + (length (memq this-oc (sort (append iedit-occurrences-overlays nil) + #'doom-themes--overlay-sort))) + -1) + "-") + length)) + 'face (if (active) 'doom-modeline-panel)))) + +(def-modeline-segment! matches + "Displays: 1. the currently recording macro, 2. A current/total for the +current search term (with anzu), 3. The number of substitutions being conducted +with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." + (let ((meta (concat (+doom-modeline--macro-recording) + (+doom-modeline--anzu) + (+doom-modeline--evil-substitute) + (+doom-modeline--iedit)))) + (or (and (not (equal meta "")) meta) + (if buffer-file-name " %I ")))) + + +;; +;; media-info +;; + +(def-modeline-segment! media-info + "Metadata regarding the current file, such as dimensions for images." + ;; TODO Include other information + (cond ((eq major-mode 'image-mode) + (cl-destructuring-bind (width . height) + (image-size (image-get-display-property) :pixels) + (format " %dx%d " width height))))) + + +;; +;; bar +;; + +(defvar +doom-modeline--bar-active nil) +(defvar +doom-modeline--bar-inactive nil) +(def-modeline-segment! bar + "The bar regulates the height of the mode-line in GUI Emacs. +Returns \"\" to not break --no-window-system." + (if window-system + (if (active) + +doom-modeline--bar-active + +doom-modeline--bar-inactive) + "")) + +(when EMACS26+ + (add-variable-watcher + '+doom-modeline-height + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (+doom-modeline|refresh-bars +doom-modeline-bar-width val)))) + + (add-variable-watcher + '+doom-modeline-bar-width + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (+doom-modeline|refresh-bars val +doom-modeline-height)))) + + (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font)) + + +;; +;; Mode lines +;; + +(def-modeline! main + (bar matches " " buffer-info " %l:%c %p " selection-info) + (buffer-encoding major-mode vcs flycheck)) + +(def-modeline! minimal + (bar matches " " buffer-info) + (media-info major-mode)) + +(def-modeline! special + (bar matches " " buffer-info-simple " %l:%c %p " selection-info) + (buffer-encoding major-mode flycheck)) + +(def-modeline! project + (bar buffer-default-directory) + (major-mode)) + +(def-modeline! media + (bar " %b ") + (media-info major-mode)) + + +;; +;; Hooks +;; + +(defun +doom-modeline|refresh-bars (&optional width height) + (setq +doom-modeline--bar-active + (+doom-modeline--make-xpm 'doom-modeline-bar + (or width +doom-modeline-bar-width) + (or height +doom-modeline-height)) + +doom-modeline--bar-inactive + (+doom-modeline--make-xpm 'doom-modeline-inactive-bar + (or width +doom-modeline-bar-width) + (or height +doom-modeline-height)))) + +(defun +doom-modeline|init () + ;; Create bars + (+doom-modeline|refresh-bars) + (unless after-init-time + ;; These buffers are already created and don't get modelines. For the love + ;; of Emacs, someone give the man a modeline! + (dolist (bname '("*scratch*" "*Messages*")) + (with-current-buffer bname + (doom-set-modeline 'main))))) + +(defun +doom-modeline|set-special-modeline () + (doom-set-modeline 'special)) + +(defun +doom-modeline|set-media-modeline () + (doom-set-modeline 'media)) + +(defun +doom-modeline|set-project-modeline () + (doom-set-modeline 'project)) + + +;; +;; Bootstrap +;; + +(doom-set-modeline 'main t) ; set default modeline + +(add-hook 'doom-load-theme-hook #'+doom-modeline|init) +(add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) +(add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) + +(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) +(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) + +;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) +(defvar +doom-modeline-remap-face-cookie nil) +(defun +doom-modeline|focus () + (when +doom-modeline-remap-face-cookie + (require 'face-remap) + (face-remap-remove-relative +doom-modeline-remap-face-cookie))) +(defun +doom-modeline|unfocus () + (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) + +(add-hook 'focus-in-hook #'+doom-modeline|focus) +(add-hook 'focus-out-hook #'+doom-modeline|unfocus) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 4fa65dda7..6d4053a97 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -1,105 +1,5 @@ ;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- -;; anzu and evil-anzu expose current/total state that can be displayed in the -;; mode-line. - -(def-package! anzu - :after-call isearch-mode - :config - (setq anzu-cons-mode-line-p nil - anzu-minimum-input-length 1 - anzu-search-threshold 250) - (global-anzu-mode +1) - - (defun +doom-modeline*fix-anzu-count (positions here) - (cl-loop for (start . end) in positions - collect t into before - when (and (>= here start) (<= here end)) - return (length before) - finally return 0)) - (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) - - ;; Avoid anzu conflicts across buffers - (mapc #'make-variable-buffer-local - '(anzu--total-matched anzu--current-position anzu--state - anzu--cached-count anzu--cached-positions anzu--last-command - anzu--last-isearch-string anzu--overflow-p)) - ;; Ensure anzu state is cleared when searches & iedit are done - (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook 'doom-escape-hook #'anzu--reset-status t) - (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) - - -(def-package! evil-anzu - :when (featurep! :feature evil) - :after-call (evil-ex-start-search evil-ex-start-word-search)) - - -;; fish-style modeline -(def-package! shrink-path - :commands (shrink-path-prompt shrink-path-file-mixed)) - - -;; Keep `+doom-modeline-current-window' up-to-date -(defvar +doom-modeline-current-window (frame-selected-window)) -(defun +doom-modeline|set-selected-window (&rest _) - "Sets `+doom-modeline-current-window' appropriately" - (when-let* ((win (frame-selected-window))) - (unless (minibuffer-window-active-p win) - (setq +doom-modeline-current-window win) - (force-mode-line-update)))) - -(defun +doom-modeline|unset-selected-window () - (setq +doom-modeline-current-window nil) - (force-mode-line-update)) - -(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) -(add-hook 'doom-after-switch-window-hook #'+doom-modeline|set-selected-window) -(with-no-warnings - (if (not (boundp 'after-focus-change-function)) - (progn - (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) - (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) - (defun +doom-modeline|refresh-frame () - (setq +doom-modeline-current-window nil) - (cl-loop for frame in (frame-list) - if (eq (frame-focus-state frame) t) - return (setq +doom-modeline-current-window (frame-selected-window frame))) - (force-mode-line-update)) - (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame))) - - -;; -;; Variables -;; - -(defvar +doom-modeline-height 29 - "How tall the mode-line should be (only respected in GUI emacs).") - -(defvar +doom-modeline-bar-width 3 - "How wide the mode-line bar should be (only respected in GUI emacs).") - -(defvar +doom-modeline-buffer-file-name-style 'truncate-upto-project - "Determines the style used by `+doom-modeline-buffer-file-name'. - -Given ~/Projects/FOSS/emacs/lisp/comint.el -truncate-upto-project => ~/P/F/emacs/lisp/comint.el -truncate-upto-root => ~/P/F/e/lisp/comint.el -truncate-all => ~/P/F/e/l/comint.el -relative-from-project => emacs/lisp/comint.el -relative-to-project => lisp/comint.el -file-name => comint.el") - -;; externs -(defvar anzu--state nil) -(defvar evil-mode nil) -(defvar evil-state nil) -(defvar evil-visual-selection nil) -(defvar iedit-mode nil) -(defvar all-the-icons-scale-factor) -(defvar all-the-icons-default-adjust) - - ;; ;; Custom faces ;; @@ -170,556 +70,7 @@ active." ;; -;; Modeline helpers -;; +(if (featurep! +new) + (load! "+new") + (load! "+old")) -(defsubst active () - (eq (selected-window) +doom-modeline-current-window)) - -(defun +doom-modeline--make-xpm (face width height) - "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." - (propertize - " " 'display - (let ((data (make-list height (make-list width 1))) - (color (or (face-background face nil t) "None"))) - (ignore-errors - (create-image - (concat - (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," - (length (car data)) - (length data) - color - color) - (apply #'concat - (cl-loop with idx = 0 - with len = (length data) - for dl in data - do (cl-incf idx) - collect - (concat "\"" - (cl-loop for d in dl - if (= d 0) collect (string-to-char " ") - else collect (string-to-char ".")) - (if (eq idx len) "\"};" "\",\n"))))) - 'xpm t :ascent 'center))))) - -(defun +doom-modeline-buffer-file-name () - "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." - (let ((buffer-file-name (or buffer-file-name "")) - (buffer-file-truename (or buffer-file-truename ""))) - (propertize - (pcase +doom-modeline-buffer-file-name-style - (`truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) - (`truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) - (`truncate-all (+doom-modeline--buffer-file-name-truncate t)) - (`relative-to-project (+doom-modeline--buffer-file-name-relative)) - (`relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) - (`file-name (propertize (file-name-nondirectory buffer-file-name) - 'face - (let ((face (or (and (buffer-modified-p) - 'doom-modeline-buffer-modified) - (and (active) - 'doom-modeline-buffer-file)))) - (when face `(:inherit ,face)))))) - 'help-echo buffer-file-truename))) - -(defun +doom-modeline--buffer-file-name-truncate (&optional truncate-tail) - "Propertized `buffer-file-name' that truncates every dir along path. -If TRUNCATE-TAIL is t also truncate the parent directory of the file." - (let ((dirs (shrink-path-prompt (file-name-directory buffer-file-truename))) - (active (active))) - (if (null dirs) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) - (let ((dirname (car dirs)) - (basename (cdr dirs)) - (dir-faces (or modified-faces (if active 'doom-modeline-project-root-dir))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (concat (propertize (concat dirname - (if truncate-tail (substring basename 0 1) basename) - "/") - 'face (if dir-faces `(:inherit ,dir-faces))) - (propertize (file-name-nondirectory buffer-file-name) - 'face (if file-faces `(:inherit ,file-faces))))))))) - -(defun +doom-modeline--buffer-file-name-relative (&optional include-project) - "Propertized `buffer-file-name' showing directories relative to project's root only." - (let ((root (doom-project-root)) - (active (active))) - (if (null root) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (true-filename (file-truename buffer-file-name)) - (relative-dirs (file-relative-name (file-name-directory true-filename) - (if include-project (concat root "../") root))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory true-filename) - 'face (if file-faces `(:inherit ,file-faces)))))))) - -(defun +doom-modeline--buffer-file-name (truncate-project-root-parent) - "Propertized `buffer-file-name'. -If TRUNCATE-PROJECT-ROOT-PARENT is t space will be saved by truncating it down -fish-shell style. - -Example: -~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" - (let* ((project-root (doom-project-root)) - (file-name-split (shrink-path-file-mixed project-root - (file-name-directory buffer-file-name) - buffer-file-name)) - (active (active))) - (if (null file-name-split) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (pcase-let ((`(,root-path-parent ,project ,relative-path ,filename) file-name-split)) - (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) - (let ((sp-faces (or modified-faces (if active 'font-lock-comment-face))) - (project-faces (or modified-faces (if active 'font-lock-string-face))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (let ((sp-props `(,@(if sp-faces `(:inherit ,sp-faces)) ,@(if active '(:weight bold)))) - (project-props `(,@(if project-faces `(:inherit ,project-faces)) ,@(if active '(:weight bold)))) - (relative-props `(,@(if relative-faces `(:inherit ,relative-faces)))) - (file-props `(,@(if file-faces `(:inherit ,file-faces))))) - (concat (propertize (if truncate-project-root-parent - root-path-parent - (abbreviate-file-name project-root)) - 'face sp-props) - (propertize (concat project "/") 'face project-props) - (if relative-path (propertize relative-path 'face relative-props)) - (propertize filename 'face file-props))))))))) - - -;; -;; buffer information -;; - -(def-modeline-segment! buffer-default-directory - "Displays `default-directory'. This is for special buffers like the scratch -buffer where knowing the current project directory is important." - (let ((face (if (active) 'doom-modeline-buffer-path))) - (concat (if (display-graphic-p) " ") - (all-the-icons-octicon - "file-directory" - :face face - :v-adjust -0.05 - :height 1.25) - (propertize (concat " " (abbreviate-file-name default-directory)) - 'face face)))) - -(def-modeline-segment! buffer-info - "Combined information about the current buffer, including the current working -directory, the file name, and its state (modified, read-only or non-existent)." - (concat (cond (buffer-read-only - (concat (all-the-icons-octicon - "lock" - :face 'doom-modeline-warning - :v-adjust -0.05) - " ")) - ((buffer-modified-p) - (concat (all-the-icons-faicon - "floppy-o" - :face 'doom-modeline-buffer-modified - :v-adjust -0.0575) - " ")) - ((and buffer-file-name - (not (file-exists-p buffer-file-name))) - (concat (all-the-icons-octicon - "circle-slash" - :face 'doom-modeline-urgent - :v-adjust -0.05) - " ")) - ((buffer-narrowed-p) - (concat (all-the-icons-octicon - "fold" - :face 'doom-modeline-warning - :v-adjust -0.05) - " "))) - (if buffer-file-name - (+doom-modeline-buffer-file-name) - "%b"))) - -(def-modeline-segment! buffer-info-simple - "Display only the current buffer's name, but with fontification." - (propertize - "%b" - 'face (cond ((and buffer-file-name (buffer-modified-p)) - 'doom-modeline-buffer-modified) - ((active) 'doom-modeline-buffer-file)))) - -(def-modeline-segment! buffer-encoding - "Displays the encoding and eol style of the buffer the same way Atom does." - (concat (pcase (coding-system-eol-type buffer-file-coding-system) - (0 "LF ") - (1 "CRLF ") - (2 "CR ")) - (let ((sys (coding-system-plist buffer-file-coding-system))) - (cond ((memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) - "UTF-8") - (t (upcase (symbol-name (plist-get sys :name)))))) - " ")) - - -;; -;; major-mode -;; - -(def-modeline-segment! major-mode - "The major mode, including process, environment and text-scale info." - (propertize - (concat (format-mode-line mode-name) - (when (stringp mode-line-process) - mode-line-process) - (and (boundp 'text-scale-mode-amount) - (/= text-scale-mode-amount 0) - (format " (%+d)" text-scale-mode-amount))) - 'face (if (active) 'doom-modeline-buffer-major-mode))) - - -;; -;; vcs -;; - -(defvar-local +doom-modeline--vcs nil) -(defun +doom-modeline--update-vcs () - (setq +doom-modeline--vcs - (when (and vc-mode buffer-file-name) - (let* ((backend (vc-backend buffer-file-name)) - (state (vc-state buffer-file-name backend))) - (let ((face 'mode-line-inactive) - (active (active)) - (all-the-icons-default-adjust -0.1)) - (concat " " - (cond ((memq state '(edited added)) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05)) - ((eq state 'needs-merge) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon "git-merge" :face face)) - ((eq state 'needs-update) - (if active (setq face 'doom-modeline-warning)) - (all-the-icons-octicon "arrow-down" :face face)) - ((memq state '(removed conflict unregistered)) - (if active (setq face 'doom-modeline-urgent)) - (all-the-icons-octicon "alert" :face face)) - (t - (if active (setq face 'font-lock-doc-face)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05))) - " " - (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face)) - " ")))))) -(add-hook 'after-save-hook #'+doom-modeline--update-vcs) -(add-hook 'find-file-hook #'+doom-modeline--update-vcs t) - -(def-modeline-segment! vcs - "Displays the current branch, colored based on its state." - +doom-modeline--vcs) - - -;; -;; flycheck -;; - -(defvar +doom-modeline-vspc - (propertize " " 'face 'variable-pitch) - "TODO") - -(defun +doom-ml-icon (icon &optional text face voffset) - "Displays an octicon ICON with FACE, followed by TEXT. Uses -`all-the-icons-octicon' to fetch the icon." - (concat (if vc-mode " " " ") - (when icon - (concat - (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) - (if text +doom-modeline-vspc))) - (if text (propertize text 'face face)) - (if vc-mode " " " "))) - -(defvar-local +doom-modeline--flycheck nil) -(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) -(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) - -(defun +doom-modeline|update-flycheck-segment (&optional status) - (setq +doom-modeline--flycheck - (pcase status - ('finished (if flycheck-current-errors - (let-alist (flycheck-count-errors flycheck-current-errors) - (let ((sum (+ (or .error 0) (or .warning 0)))) - (+doom-ml-icon "do_not_disturb_alt" - (number-to-string sum) - (if .error 'doom-modeline-urgent 'doom-modeline-warning) - -0.25))) - (+doom-ml-icon "check" nil 'doom-modeline-info))) - ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) - ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) - ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) - ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) - -(def-modeline-segment! flycheck - "Displays color-coded flycheck error status in the current buffer with pretty -icons." - +doom-modeline--flycheck) - - -;; -;; selection-info -;; - -(defsubst doom-column (pos) - (save-excursion (goto-char pos) - (current-column))) - -(defvar-local +doom-modeline-enable-word-count nil - "If non-nil, a word count will be added to the selection-info modeline -segment.") - -(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) -(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) - -(def-modeline-segment! selection-info - "Information about the current selection, such as how many characters and -lines are selected, or the NxM dimensions of a block selection." - (when (and mark-active (active)) - (cl-destructuring-bind (beg . end) - (if (eq evil-state 'visual) - (cons evil-visual-beginning evil-visual-end) - (cons (region-beginning) (region-end))) - (propertize - (let ((lines (count-lines beg (min end (point-max))))) - (concat (cond ((or (bound-and-true-p rectangle-mark-mode) - (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column end) - (doom-column beg))))) - (format "%dx%dB" lines cols))) - ((eq evil-visual-selection 'line) - (format "%dL" lines)) - ((> lines 1) - (format "%dC %dL" (- end beg) lines)) - ((format "%dC" (- end beg)))) - (when +doom-modeline-enable-word-count - (format " %dW" (count-words beg end))))) - 'face 'doom-modeline-highlight)))) - - -;; -;; matches (anzu, evil-substitute, iedit, macro) -;; - -(defun +doom-modeline--macro-recording () - "Display current Emacs or evil macro being recorded." - (when (and (active) (or defining-kbd-macro executing-kbd-macro)) - (let ((sep (propertize " " 'face 'doom-modeline-panel))) - (concat sep - (propertize (if (bound-and-true-p evil-this-macro) - (char-to-string evil-this-macro) - "Macro") - 'face 'doom-modeline-panel) - sep - (all-the-icons-octicon "triangle-right" - :face 'doom-modeline-panel - :v-adjust -0.05) - sep)))) - -(defsubst +doom-modeline--anzu () - "Show the match index and total number thereof. Requires `anzu', also -`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." - (when (and anzu--state (not iedit-mode)) - (propertize - (let ((here anzu--current-position) - (total anzu--total-matched)) - (cond ((eq anzu--state 'replace-query) - (format " %d replace " total)) - ((eq anzu--state 'replace) - (format " %d/%d " here total)) - (anzu--overflow-p - (format " %s+ " total)) - (t - (format " %s/%d " here total)))) - 'face (if (active) 'doom-modeline-panel)))) - -(defsubst +doom-modeline--evil-substitute () - "Show number of matches for evil-ex substitutions and highlights in real time." - (when (and evil-mode - (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) - (assq 'evil-ex-global-match evil-ex-active-highlights-alist) - (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) - (propertize - (let ((range (if evil-ex-range - (cons (car evil-ex-range) (cadr evil-ex-range)) - (cons (line-beginning-position) (line-end-position)))) - (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) - (if pattern - (format " %s matches " (how-many pattern (car range) (cdr range))) - " - ")) - 'face (if (active) 'doom-modeline-panel)))) - -(defun doom-themes--overlay-sort (a b) - (< (overlay-start a) (overlay-start b))) - -(defsubst +doom-modeline--iedit () - "Show the number of iedit regions matches + what match you're on." - (when (and iedit-mode iedit-occurrences-overlays) - (propertize - (let ((this-oc (or (let ((inhibit-message t)) - (iedit-find-current-occurrence-overlay)) - (progn (iedit-prev-occurrence) - (iedit-find-current-occurrence-overlay)))) - (length (length iedit-occurrences-overlays))) - (format " %s/%d " - (if this-oc - (- length - (length (memq this-oc (sort (append iedit-occurrences-overlays nil) - #'doom-themes--overlay-sort))) - -1) - "-") - length)) - 'face (if (active) 'doom-modeline-panel)))) - -(def-modeline-segment! matches - "Displays: 1. the currently recording macro, 2. A current/total for the -current search term (with anzu), 3. The number of substitutions being conducted -with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." - (let ((meta (concat (+doom-modeline--macro-recording) - (+doom-modeline--anzu) - (+doom-modeline--evil-substitute) - (+doom-modeline--iedit)))) - (or (and (not (equal meta "")) meta) - (if buffer-file-name " %I ")))) - - -;; -;; media-info -;; - -(def-modeline-segment! media-info - "Metadata regarding the current file, such as dimensions for images." - ;; TODO Include other information - (cond ((eq major-mode 'image-mode) - (cl-destructuring-bind (width . height) - (image-size (image-get-display-property) :pixels) - (format " %dx%d " width height))))) - - -;; -;; bar -;; - -(defvar +doom-modeline--bar-active nil) -(defvar +doom-modeline--bar-inactive nil) -(def-modeline-segment! bar - "The bar regulates the height of the mode-line in GUI Emacs. -Returns \"\" to not break --no-window-system." - (if window-system - (if (active) - +doom-modeline--bar-active - +doom-modeline--bar-inactive) - "")) - -(when EMACS26+ - (add-variable-watcher - '+doom-modeline-height - (lambda (_sym val op _where) - (when (and (eq op 'set) (integerp val)) - (+doom-modeline|refresh-bars +doom-modeline-bar-width val)))) - - (add-variable-watcher - '+doom-modeline-bar-width - (lambda (_sym val op _where) - (when (and (eq op 'set) (integerp val)) - (+doom-modeline|refresh-bars val +doom-modeline-height)))) - - (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font)) - - -;; -;; Mode lines -;; - -(def-modeline! main - (bar matches " " buffer-info " %l:%c %p " selection-info) - (buffer-encoding major-mode vcs flycheck)) - -(def-modeline! minimal - (bar matches " " buffer-info) - (media-info major-mode)) - -(def-modeline! special - (bar matches " " buffer-info-simple " %l:%c %p " selection-info) - (buffer-encoding major-mode flycheck)) - -(def-modeline! project - (bar buffer-default-directory) - (major-mode)) - -(def-modeline! media - (bar " %b ") - (media-info major-mode)) - - -;; -;; Hooks -;; - -(defun +doom-modeline|refresh-bars (&optional width height) - (setq +doom-modeline--bar-active - (+doom-modeline--make-xpm 'doom-modeline-bar - (or width +doom-modeline-bar-width) - (or height +doom-modeline-height)) - +doom-modeline--bar-inactive - (+doom-modeline--make-xpm 'doom-modeline-inactive-bar - (or width +doom-modeline-bar-width) - (or height +doom-modeline-height)))) - -(defun +doom-modeline|init () - ;; Create bars - (+doom-modeline|refresh-bars) - (unless after-init-time - ;; These buffers are already created and don't get modelines. For the love - ;; of Emacs, someone give the man a modeline! - (dolist (bname '("*scratch*" "*Messages*")) - (with-current-buffer bname - (doom-set-modeline 'main))))) - -(defun +doom-modeline|set-special-modeline () - (doom-set-modeline 'special)) - -(defun +doom-modeline|set-media-modeline () - (doom-set-modeline 'media)) - -(defun +doom-modeline|set-project-modeline () - (doom-set-modeline 'project)) - - -;; -;; Bootstrap -;; - -(doom-set-modeline 'main t) ; set default modeline - -(add-hook 'doom-load-theme-hook #'+doom-modeline|init) -(add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) -(add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) - -(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) -(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) - -;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) -(defvar +doom-modeline-remap-face-cookie nil) -(defun +doom-modeline|focus () - (when +doom-modeline-remap-face-cookie - (require 'face-remap) - (face-remap-remove-relative +doom-modeline-remap-face-cookie))) -(defun +doom-modeline|unfocus () - (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) - -(add-hook 'focus-in-hook #'+doom-modeline|focus) -(add-hook 'focus-out-hook #'+doom-modeline|unfocus) From a906b82788ee0bd234b1c313e56d5282d71d344a Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Wed, 4 Jul 2018 23:59:18 +0800 Subject: [PATCH 2299/4235] add action for `counsel-find-file` --- modules/completion/ivy/autoload/ivy.el | 16 ++++++++++++++++ modules/completion/ivy/config.el | 15 +++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 5df991833..d8b02bc14 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -198,6 +198,22 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (selected-window)))))) +;;;###autoload +(defun +ivy/reloading (cmd) + (lambda (x) + (funcall cmd x) + (ivy--reset-state ivy-last))) + +;;;###autoload +(defun +ivy/given-file (cmd prompt) + (lambda (source) + (let ((target + (let ((enable-recursive-minibuffers t)) + (read-file-name + (format "%s %s to:" prompt source))))) + (funcall cmd source target 1)))) + + ;; ;; File searching ;; diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index b57eab9f0..8a8e5f8fc 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -98,6 +98,21 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Dim recentf entries that are not in the current project. (ivy-set-display-transformer #'counsel-recentf #'+ivy-recentf-transformer) + ;; Configure `counsel-find-file' + (ivy-add-actions + 'counsel-find-file + `(("c" ,(+ivy/given-file #'copy-file "Copy file") "copy file") + ("d" ,(+ivy/reloading #'+ivy/confirm-delete-file) "delete") + ("r" (lambda (path) (rename-file path (read-string "New name: "))) "Rename") + ("m" ,(+ivy/reloading (+ivy/given-file #'rename-file "Move")) "move") + ("f" find-file-other-window "other window") + ("p" (lambda (path) (with-ivy-window (insert (file-relative-name path default-directory)))) "Insert relative path") + ("P" (lambda (path) (with-ivy-window (insert path))) "Insert absolute path") + ("l" (lambda (path) "Insert org-link with relative path" + (with-ivy-window (insert (format "[[./%s]]" (file-relative-name path default-directory))))) "Insert org-link (rel. path)") + ("L" (lambda (path) "Insert org-link with absolute path" + (with-ivy-window (insert (format "[[%s]]" path)))) "Insert org-link (abs. path)"))) + ;; Configure `counsel-rg', `counsel-ag' & `counsel-pt' (dolist (cmd '(counsel-ag counsel-rg counsel-pt)) (ivy-add-actions From 8f74ce982d88432c07452a053445daf90b587f18 Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Wed, 4 Jul 2018 23:59:36 +0800 Subject: [PATCH 2300/4235] add action for counsel-projectile-switch-project --- modules/feature/workspaces/config.el | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 5c06728a3..8875de6ab 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -140,7 +140,27 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; per-project workspaces, but reuse current workspace if empty (setq projectile-switch-project-action #'+workspaces|set-project-action - counsel-projectile-switch-project-action #'+workspaces|switch-to-project) + counsel-projectile-switch-project-action + '(1 ("o" +workspaces|switch-to-project "open project in new workspace") + ("O" counsel-projectile-switch-project-action "jump to a project buffer or file") + ("f" counsel-projectile-switch-project-action-find-file "jump to a project file") + ("d" counsel-projectile-switch-project-action-find-dir "jump to a project directory") + ("b" counsel-projectile-switch-project-action-switch-to-buffer "jump to a project buffer") + ("m" counsel-projectile-switch-project-action-find-file-manually "find file manually from project root") + ("w" counsel-projectile-switch-project-action-save-all-buffers "save all project buffers") + ("k" counsel-projectile-switch-project-action-kill-buffers "kill all project buffers") + ("r" counsel-projectile-switch-project-action-remove-known-project "remove project from known projects") + ("c" counsel-projectile-switch-project-action-compile "run project compilation command") + ("C" counsel-projectile-switch-project-action-configure "run project configure command") + ("e" counsel-projectile-switch-project-action-edit-dir-locals "edit project dir-locals") + ("v" counsel-projectile-switch-project-action-vc "open project in vc-dir / magit / monky") + ("s" (lambda (project) (let ((projectile-switch-project-action (lambda () (call-interactively #'+ivy/project-search)))) + (counsel-projectile-switch-project-by-name project))) "search project") + ("xs" counsel-projectile-switch-project-action-run-shell "invoke shell from project root") + ("xe" counsel-projectile-switch-project-action-run-eshell "invoke eshell from project root") + ("xt" counsel-projectile-switch-project-action-run-term "invoke term from project root") + ("X" counsel-projectile-switch-project-action-org-capture "org-capture into project"))) + (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) ;; In some scenarios, persp-mode throws error an error when Emacs tries to From 0df9bae16b6a5b65bd90f365510c8b6c825c4cae Mon Sep 17 00:00:00 2001 From: fuxialexander Date: Thu, 5 Jul 2018 00:38:41 +0800 Subject: [PATCH 2301/4235] don't override original actions --- modules/completion/ivy/config.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 8a8e5f8fc..eb49c9022 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -101,17 +101,21 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Configure `counsel-find-file' (ivy-add-actions 'counsel-find-file - `(("c" ,(+ivy/given-file #'copy-file "Copy file") "copy file") + `(("b" counsel-find-file-cd-bookmark-action "cd bookmark") + ("s" counsel-find-file-as-root "open as root") + ("m" counsel-find-file-mkdir-action "mkdir") + ("c" ,(+ivy/given-file #'copy-file "Copy file") "copy file") ("d" ,(+ivy/reloading #'+ivy/confirm-delete-file) "delete") - ("r" (lambda (path) (rename-file path (read-string "New name: "))) "Rename") - ("m" ,(+ivy/reloading (+ivy/given-file #'rename-file "Move")) "move") + ("r" (lambda (path) (rename-file path (read-string "New name: "))) "rename") + ("R" ,(+ivy/reloading (+ivy/given-file #'rename-file "Move")) "move") ("f" find-file-other-window "other window") - ("p" (lambda (path) (with-ivy-window (insert (file-relative-name path default-directory)))) "Insert relative path") - ("P" (lambda (path) (with-ivy-window (insert path))) "Insert absolute path") + ("F" find-file-other-frame "other frame") + ("p" (lambda (path) (with-ivy-window (insert (file-relative-name path default-directory)))) "insert relative path") + ("P" (lambda (path) (with-ivy-window (insert path))) "insert absolute path") ("l" (lambda (path) "Insert org-link with relative path" - (with-ivy-window (insert (format "[[./%s]]" (file-relative-name path default-directory))))) "Insert org-link (rel. path)") + (with-ivy-window (insert (format "[[./%s]]" (file-relative-name path default-directory))))) "insert org-link (rel. path)") ("L" (lambda (path) "Insert org-link with absolute path" - (with-ivy-window (insert (format "[[%s]]" path)))) "Insert org-link (abs. path)"))) + (with-ivy-window (insert (format "[[%s]]" path)))) "insert org-link (abs. path)"))) ;; Configure `counsel-rg', `counsel-ag' & `counsel-pt' (dolist (cmd '(counsel-ag counsel-rg counsel-pt)) From 7eb3ae62d7a13f2ecd4781dc6635cc612abcb188 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 21:08:23 +0200 Subject: [PATCH 2302/4235] Conditionally install os packages #741 Fixes an issue where exec-shell-from-path could not be installed on Linux or Windows. Doom used :ignore because, at the time, it supported a workflow where your Emacs config was shared over dropbox or rslsync across multiple computers. This workflow is no longer supported (it was very buggy!), so this is no longer necessary. :ignore should also be reserved for private use and not used internally. --- core/packages.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/packages.el b/core/packages.el index d640bcb90..4a15d5710 100644 --- a/core/packages.el +++ b/core/packages.el @@ -2,8 +2,9 @@ ;;; core/packages.el ;; core-os.el -(package! exec-path-from-shell :ignore (not IS-MAC)) -(package! osx-clipboard :ignore (not IS-MAC)) +(when IS-MAC + (package! exec-path-from-shell) + (package! osx-clipboard)) ;; core-ui.el (package! all-the-icons) From daa05eb7f2e18beacfa9d2187858aff3913e58b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 21:23:56 +0200 Subject: [PATCH 2303/4235] Fix regexp for realgud popup rule Causing invalid-regexp errors. --- modules/feature/debugger/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/debugger/config.el b/modules/feature/debugger/config.el index 49d3e3856..7cfb631a0 100644 --- a/modules/feature/debugger/config.el +++ b/modules/feature/debugger/config.el @@ -3,7 +3,7 @@ (def-package! realgud :commands (realgud:gdb realgud:trepanjs realgud:bashdb realgud:zshdb) :config - (set-popup-rule! "^\\*\\(?trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" :size 20) + (set-popup-rule! "^\\*\\(?:trepanjs:\\(?:g\\|zsh\\|bash\\)db\\)" :size 20) ;; TODO Temporary Ex commands for the debugger ;; (def-tmp-excmd! doom:def-debug-on doom:def-debug-off From 57020cdfdb029dab8c3f4a1d877ffb13e177dbfd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 21:26:20 +0200 Subject: [PATCH 2304/4235] Fix void-variable after-focus-change-function error The condition was the wrong way around. --- modules/ui/doom-modeline/+old.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-modeline/+old.el b/modules/ui/doom-modeline/+old.el index 650128b78..bf73a0863 100644 --- a/modules/ui/doom-modeline/+old.el +++ b/modules/ui/doom-modeline/+old.el @@ -55,7 +55,7 @@ (add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) (add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) (with-no-warnings - (cond ((boundp 'after-focus-change-function) + (cond ((not (boundp 'after-focus-change-function)) (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) ((defun +doom-modeline|refresh-frame () From a406b2d0c8480675026cd39ab32cf973b717258d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 21:42:33 +0200 Subject: [PATCH 2305/4235] Ignore errors if display-buffer ALIST is malformed The gud.el library uses display-buffer incorrectly, by passing a list of functions as its second argument, instead of as a nested list. CORRECT: (display-buffer buffer '((display-buffer-reuse-window display-buffer-in-previous-window display-buffer-same-window display-buffer-pop-up-window))) INCORRECT (how gud does it): (display-buffer buffer '(display-buffer-reuse-window display-buffer-in-previous-window display-buffer-same-window display-buffer-pop-up-window)) This causes "wrong-type-argument: listp display-buffer-in-previous-window" error. However, it appears Emacs handles malformed alists by just ignoring them, so Doom will do the same. Reported by @maskray --- modules/ui/popup/autoload/popup.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index c70c49b1e..224056ff6 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -99,12 +99,12 @@ and enables `+popup-buffer-mode'." (let ((alist ; handle defaults (cl-remove-duplicates (append alist +popup-default-alist) - :key #'car :from-end t)) + :key #'car-safe :from-end t)) (parameters (cl-remove-duplicates (append (cdr (assq 'window-parameters alist)) +popup-default-parameters) - :key #'car :from-end t))) + :key #'car-safe :from-end t))) ;; handle `size' (when-let* ((size (cdr (assq 'size alist))) (side (or (cdr (assq 'side alist)) 'bottom)) From 0b1cb1bb487f20214ab340c6be2ba4640252baf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:05:49 +0200 Subject: [PATCH 2306/4235] Look up command binds dynamically in dashboard Keys are no longer hard coded. cc @UndeadKernel --- modules/ui/doom-dashboard/config.el | 55 ++++++++++++++--------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 3062e58a3..16a484a40 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -37,41 +37,28 @@ Possible values: :when (and (bound-and-true-p persp-mode) (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) - :key "SPC TAB R" :face (:inherit (font-lock-keyword-face bold)) - :action (+workspace/load-session)) + :action +workspace/load-session) ("See agenda for this week" :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) :when (fboundp 'org-agenda-list) - :key "SPC o a" - :action (call-interactively #'org-agenda-list)) + :action org-agenda-list) ("Recently opened files" :icon (all-the-icons-octicon "file-text" :face 'font-lock-keyword-face) - :key "SPC f r" - :action - (call-interactively (or (command-remapping #'recentf-open-files) - #'recentf-open-files))) + :action recentf-open-files) ("Open project" :icon (all-the-icons-octicon "briefcase" :face 'font-lock-keyword-face) - :key "SPC p p" - :action - (call-interactively (or (command-remapping #'projectile-switch-project) - #'projectile-switch-project))) + :action projectile-switch-project) ("Jump to bookmark" :icon (all-the-icons-octicon "bookmark" :face 'font-lock-keyword-face) - :key "SPC RET" - :action - (call-interactively (or (command-remapping #'bookmark-jump) - #'bookmark-jump))) + :action bookmark-jump) ("Open private configuration" :icon (all-the-icons-octicon "tools" :face 'font-lock-keyword-face) :when (file-directory-p doom-private-dir) - :key "SPC f p" - :action (doom-project-find-file doom-private-dir)) + :action +default/browse-config) ("Open user manual" :icon (all-the-icons-octicon "book" :face 'font-lock-keyword-face) - :key "SPC h D" - :action (doom/open-manual))) + :action doom/open-manual)) "An alist of menu buttons used by `doom-dashboard-widget-shortmenu'. Each element is a cons cell (LABEL . PLIST). LABEL is a string to display after the icon and before the key string. @@ -400,8 +387,10 @@ controlled by `+doom-dashboard-pwd-policy'." (all-the-icons-default-adjust -0.02)) (insert "\n") (dolist (section +doom-dashboard-menu-sections) - (cl-destructuring-bind (label &key icon action when key face) section - (when (or (null when) (eval when t)) + (cl-destructuring-bind (label &key icon action when face) section + (when (and (fboundp action) + (or (null when) + (eval when t))) (insert (+doom-dashboard--center (- +doom-dashboard--width 1) @@ -411,16 +400,26 @@ controlled by `+doom-dashboard-pwd-policy'." (with-temp-buffer (insert-text-button (propertize label 'face (or face 'font-lock-keyword-face)) - 'action `(lambda (_) ,action) + 'action + `(lambda (_) + (call-interactively (or (command-remapping #',action) + #',action))) 'follow-link t 'help-echo label) (format "%-37s" (buffer-string))) ;; Lookup command keys dynamically - (cond ((null key) "") - ((stringp key) - (propertize key 'face 'font-lock-constant-face)) - ((listp key) - (eval key t)))))) + (or (let ((maps (list global-map))) + (when (bound-and-true-p evil-normal-state-map) + (push evil-motion-state-map maps) + (push evil-normal-state-map maps)) + (when-let* ((key (where-is-internal action maps t))) + (propertize (with-temp-buffer + (save-excursion (insert (key-description key))) + (while (re-search-forward "<\\([^>]+\\)>" nil t) + (replace-match (upcase (substring (match-string 1) 0 3)))) + (buffer-string)) + 'face 'font-lock-constant-face))) + "")))) (if (display-graphic-p) "\n\n" "\n"))))))) From c55d6dad17aca3e6d3e31d79c5d6fabe32d2be06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:06:47 +0200 Subject: [PATCH 2307/4235] Reduce coupling with buffers library and dashboard --- modules/ui/doom-dashboard/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 16a484a40..2f421d780 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -260,12 +260,12 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." (if (string-match-p "^ ?\\*\\(?:scratch\\|server\\)" (buffer-name)) - (doom-fallback-buffer) + (get-buffer-create +doom-dashboard-name) (current-buffer))) (defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." - (eq buffer (doom-fallback-buffer))) + (eq (buffer-name buffer) +doom-dashboard-name)) (defun +doom-dashboard-update-pwd (&optional pwd) "Update `default-directory' in the Doom dashboard buffer. What it is set to is From 57bad58deaed146d25b5c88b42bec3bcfd9646a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:09:07 +0200 Subject: [PATCH 2308/4235] Fix SPC h D keybind (wrong command name) --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index dd482673f..3181eaad3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -624,7 +624,7 @@ :desc "Open Bug Report" :n "b" #'doom/open-bug-report :desc "Describe char" :n "c" #'describe-char :desc "Describe DOOM module" :n "d" #'doom/describe-module - :desc "Open Doom manual" :n "D" #'doom//open-manual + :desc "Open Doom manual" :n "D" #'doom/open-manual :desc "Open vanilla sandbox" :n "E" #'doom/open-vanilla-sandbox :desc "Describe function" :n "f" #'describe-function :desc "Describe face" :n "F" #'describe-face From ebd4d19fa48aaa9c4f2353ebb9abac0d7370780d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:14:12 +0200 Subject: [PATCH 2309/4235] Fix +doom-dashboard-p --- 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 2f421d780..60304273d 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -265,7 +265,7 @@ project (which may be different across perspective)." (defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." - (eq (buffer-name buffer) +doom-dashboard-name)) + (eq buffer (get-buffer +doom-dashboard-name))) (defun +doom-dashboard-update-pwd (&optional pwd) "Update `default-directory' in the Doom dashboard buffer. What it is set to is From f949df5646cc0c5c449171613674b3c42f8f4b98 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:14:31 +0200 Subject: [PATCH 2310/4235] Reformat ui/doom-dashboard tests --- modules/ui/doom-dashboard/test/test-doom-dashboard.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/test/test-doom-dashboard.el b/modules/ui/doom-dashboard/test/test-doom-dashboard.el index 558b96328..4c482158b 100644 --- a/modules/ui/doom-dashboard/test/test-doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/test-doom-dashboard.el @@ -1,18 +1,17 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/doom-dashboard/test/test-doom-dashboard.el -(require! :ui doom-dashboard) - (describe "ui/doom-dashboard" :var (default-directory projectile-enable-caching) (before-all + (require! :ui doom-dashboard) (require 'projectile) (setq projectile-enable-caching nil)) (after-all (unload-feature 'projectile t)) (before-each (projectile-mode +1)) - (after-each (projectile-mode +1)) + (after-each (projectile-mode -1)) (describe "get-pwd" :var (+doom-dashboard--last-cwd) From 030e80d20269d68e98318507462828225eb541e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:52:29 +0200 Subject: [PATCH 2311/4235] Refactor lang/org/+export + Changed org-export-directory to +org-export-dir (conform to naming convention). It turns out org-export-directory never existed in org. + Make org-export-backends addition (for ox-pandoc) idempotent. + Fix redundant forward slash in org-publish-timestamp-directory. + Resolve export directory later, giving the user a larger window to change +org-export-dir. --- modules/lang/org/+export.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index 975977cb0..f67592b6e 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -7,10 +7,14 @@ ;; `default-directory'. This is because all my org files are usually in one ;; place, and I want to be able to refer back to old exports if needed. +(defvar +org-export-dir ".export/" + "Where to store exported files relative to `org-directory'. Can be an absolute +path too.") + (def-package! ox-pandoc :defer t :config - (push 'pandoc org-export-backends) + (add-to-list 'org-export-backends 'pandoc nil #'eq) (setq org-pandoc-options '((standalone . t) (mathjax . t)))) @@ -18,22 +22,23 @@ ;; (defun +org|init-export () (setq org-export-backends '(ascii html latex md) - org-publish-timestamp-directory (concat doom-cache-dir "/org-timestamps/")) + org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/")) (when (executable-find "pandoc") (require 'ox-pandoc)) - ;; Export to a central location by default or if target isn't in `org-directory'. - (setq org-export-directory (expand-file-name ".export" org-directory)) - (unless (file-directory-p org-export-directory) - (make-directory org-export-directory t)) - + ;; Export to a central location by default or if target isn't in + ;; `org-directory'. (defun +org*export-output-file-name (args) "Return a centralized export location unless one is provided or the current file isn't in `org-directory'." (when (and (not (nth 2 args)) buffer-file-name - (file-in-directory-p (file-truename buffer-file-name) (file-truename org-directory))) - (setq args (append args (list org-export-directory)))) + (file-in-directory-p buffer-file-name org-directory)) + (cl-destructuring-bind (extension &optional subtreep pubdir) args + (let ((dir (expand-file-name +org-export-dir org-directory))) + (unless (file-directory-p dir) + (make-directory dir t)) + (setq args (list extension subtreep dir))))) args) (advice-add #'org-export-output-file-name :filter-args #'+org*export-output-file-name)) From ad5470ce3f140d1bda7f1538d48b66657dc859c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 4 Jul 2018 23:56:51 +0200 Subject: [PATCH 2312/4235] Make org-export-directory an obsolete alias Slow down to give people time to transition. --- modules/lang/org/+export.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index f67592b6e..5eb36d1d8 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -10,6 +10,7 @@ (defvar +org-export-dir ".export/" "Where to store exported files relative to `org-directory'. Can be an absolute path too.") +(define-obsolete-variable-alias 'org-export-directory '+org-export-dir "2.1.0") (def-package! ox-pandoc :defer t From 1fa4c65c3a789c88a466cc8932f8a6fbc778f72d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 01:32:04 +0200 Subject: [PATCH 2313/4235] ui/doom-dashboard: minor refactor --- modules/ui/doom-dashboard/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 60304273d..f918d21d5 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -399,11 +399,12 @@ controlled by `+doom-dashboard-pwd-policy'." (or icon "") (with-temp-buffer (insert-text-button - (propertize label 'face (or face 'font-lock-keyword-face)) + label 'action `(lambda (_) (call-interactively (or (command-remapping #',action) #',action))) + 'face (or face 'font-lock-keyword-face) 'follow-link t 'help-echo label) (format "%-37s" (buffer-string))) @@ -432,7 +433,7 @@ controlled by `+doom-dashboard-pwd-policy'." (with-temp-buffer ;; TODO Publish the site! ;; (insert-text-button (propertize "doomemacs.org" 'face 'font-lock-keyword-face) - ;; 'action (lambda (_) (browse-url "http://github.com/hlissner/doom-emacs")) + ;; 'action (lambda (_) (browse-url "http://doomemacs.org")) ;; 'follow-link t ;; 'help-echo "Open home page") ;; (insert (propertize " x " 'face 'font-lock-comment-face)) From 8b8c7c7411af19e9458c950ba4de94fa61c81459 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 01:32:38 +0200 Subject: [PATCH 2314/4235] doom-doctor: use ~ instead of HOME envvar --- bin/doom-doctor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index eca264076..ccd83c284 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -155,9 +155,9 @@ ;; all-the-icons fonts (let ((font-dest (pcase system-type ('gnu/linux (concat (or (getenv "XDG_DATA_HOME") - (concat (getenv "HOME") "/.local/share")) + "~/.local/share") "/fonts/")) - ('darwin (concat (getenv "HOME") "/Library/Fonts/"))))) + ('darwin "~/Library/Fonts/")))) (when (and font-dest (require 'all-the-icons nil t)) (dolist (font all-the-icons-font-names) (if (file-exists-p (expand-file-name font font-dest)) From 3a1ba5381ed2df2cf7592745a2ee37ea4528eccd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 12:36:32 +0200 Subject: [PATCH 2315/4235] Use +default/find-in-config instead on dashboard Instead of browse-config. --- 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 f918d21d5..bff563dfd 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -55,7 +55,7 @@ Possible values: ("Open private configuration" :icon (all-the-icons-octicon "tools" :face 'font-lock-keyword-face) :when (file-directory-p doom-private-dir) - :action +default/browse-config) + :action +default/find-in-config) ("Open user manual" :icon (all-the-icons-octicon "book" :face 'font-lock-keyword-face) :action doom/open-manual)) From b67745a9b6254fcd998f62ff333fe902001f43b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 12:37:05 +0200 Subject: [PATCH 2316/4235] Don't show "Open user manual" button ...unless the manual exists (it will soon)! --- 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 bff563dfd..38acc6c54 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -58,6 +58,7 @@ Possible values: :action +default/find-in-config) ("Open user manual" :icon (all-the-icons-octicon "book" :face 'font-lock-keyword-face) + :when (file-exists-p (expand-file-name "index.org" doom-docs-dir)) :action doom/open-manual)) "An alist of menu buttons used by `doom-dashboard-widget-shortmenu'. Each element is a cons cell (LABEL . PLIST). LABEL is a string to display after the From 4ebbf8f056e5b06a4967e51096411ee69618bd40 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 13:44:34 +0200 Subject: [PATCH 2317/4235] Fix variable height org-level-N faces in eldoc It only uses the face's :foreground, which should be enough, but it prevents the minibuffer from being resized when eldoc displays breadcrumbs in org-mode. --- modules/lang/org/config.el | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index aaec78329..026c76496 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -349,6 +349,20 @@ between the two." "Getting org to behave." ;; Don't open separate windows (setf (alist-get 'file org-link-frame-setup) #'find-file) + ;; Fix variable height org-level-N faces in the eldoc string + (defun +org*fix-font-size-variation-in-eldoc (orig-fn) + (cl-letf (((symbol-function 'org-format-outline-path) + (lambda (path &optional _width _prefix separator) + (string-join + (cl-loop with i = -1 + for seg in (delq nil path) + for face = (nth (% (cl-incf i) org-n-level-faces) org-level-faces) + for spec = (face-all-attributes face) + collect (propertize (replace-regexp-in-string "[ \t]+\\'" "" seg) + 'face (if face `(:foreground ,(face-foreground face))))) + separator)))) + (funcall orig-fn))) + (advice-add #'org-eldoc-get-breadcrumb :around #'+org*fix-font-size-variation-in-eldoc) ;; Let OS decide what to do with files when opened (setq org-file-apps `(("pdf" . default) From 2d30d996c32b25a89bd329a8a9e34e2f58637206 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 14:05:09 +0200 Subject: [PATCH 2318/4235] Refactor counsel-find-file actions Conform them to naming conventions & only autoload the functions that aren't used immediately. --- modules/completion/ivy/autoload/ivy.el | 16 ++-------------- modules/completion/ivy/config.el | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index d8b02bc14..5a79dd0f5 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -197,21 +197,9 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (run-hooks 'counsel-grep-post-action-hook) (selected-window)))))) - ;;;###autoload -(defun +ivy/reloading (cmd) - (lambda (x) - (funcall cmd x) - (ivy--reset-state ivy-last))) - -;;;###autoload -(defun +ivy/given-file (cmd prompt) - (lambda (source) - (let ((target - (let ((enable-recursive-minibuffers t)) - (read-file-name - (format "%s %s to:" prompt source))))) - (funcall cmd source target 1)))) +(defun +ivy-confirm-delete-file (x) + (dired-delete-file x 'confirm-each-subdirectory)) ;; diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index eb49c9022..2a54a4cdd 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -98,16 +98,28 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Dim recentf entries that are not in the current project. (ivy-set-display-transformer #'counsel-recentf #'+ivy-recentf-transformer) + ;; Factories + (defun +ivy-action-reloading (cmd) + (lambda (x) + (funcall cmd x) + (ivy--reset-state ivy-last))) + + (defun +ivy-action-given-file (cmd prompt) + (lambda (source) + (let* ((enable-recursive-minibuffers t) + (target (read-file-name (format "%s %s to:" prompt source)))) + (funcall cmd source target 1)))) + ;; Configure `counsel-find-file' (ivy-add-actions 'counsel-find-file `(("b" counsel-find-file-cd-bookmark-action "cd bookmark") ("s" counsel-find-file-as-root "open as root") ("m" counsel-find-file-mkdir-action "mkdir") - ("c" ,(+ivy/given-file #'copy-file "Copy file") "copy file") - ("d" ,(+ivy/reloading #'+ivy/confirm-delete-file) "delete") + ("c" ,(+ivy-action-given-file #'copy-file "Copy file") "copy file") + ("d" ,(+ivy-action-reloading #'+ivy-confirm-delete-file) "delete") ("r" (lambda (path) (rename-file path (read-string "New name: "))) "rename") - ("R" ,(+ivy/reloading (+ivy/given-file #'rename-file "Move")) "move") + ("R" ,(+ivy-action-reloading (+ivy-action-given-file #'rename-file "Move")) "move") ("f" find-file-other-window "other window") ("F" find-file-other-frame "other frame") ("p" (lambda (path) (with-ivy-window (insert (file-relative-name path default-directory)))) "insert relative path") From c38d32466397977d0182ba3404575fe3ccea0e1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 14:33:48 +0200 Subject: [PATCH 2319/4235] Make banner customizable Add banner-file and banner-dir variables. If banner-file is nil, use ASCII banner. --- modules/ui/doom-dashboard/config.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 38acc6c54..cf687773b 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -12,6 +12,14 @@ dashboard. These functions take no arguments and the dashboard buffer is current while they run.") +;; (defvar +doom-dashboard-banner-file "e.png" +;; "The path to the image file to be used in on the dashboard. The path is +;; relative to modules/ui/doom-dashboard/banners/. If nil, always use the ASCII +;; banner.") + +;; (defvar +doom-dashboard-banner-dir (concat (DIR!) "banners/") +;; "Where to look for `+doom-dashboard-banner-file'.") + (defvar +doom-dashboard-inhibit-refresh nil "If non-nil, the doom buffer won't be refreshed.") @@ -359,18 +367,20 @@ controlled by `+doom-dashboard-pwd-policy'." "\\ _-' `-_ /" " `'' ``'")) ;; TODO Add Doom logo - ;; (when (display-graphic-p) - ;; (let* ((image (create-image "~/title.png" 'png nil)) + ;; (when (and +doom-dashboard-banner-file (display-graphic-p)) + ;; (let* ((image (create-image (expand-file-name +doom-dashboard-banner-file + ;; +doom-dashboard-banner-dir) + ;; 'png nil)) ;; (size (image-size image)) ;; (margin (+ 1 (/ (- +doom-dashboard--width (car size)) 2)))) - ;; (setq +doom-dashboard--hoffset (cdr size)) + ;; (setq +doom-dashboard--hoffset (- (cdr size) 2)) ;; (add-text-properties ;; point (point) `(display ,image rear-nonsticky (display))) ;; (when (> margin 0) ;; (save-excursion ;; (goto-char point) ;; (insert (make-string (truncate margin) ? ))))) - ;; (insert "\n\n\n")) + ;; (insert "\n\n\n\n")) )) (defun doom-dashboard-widget-loaded () From 8c688da5860da935134b739b08909fbe7e83f3cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 17:09:40 +0200 Subject: [PATCH 2320/4235] Add Cask generated folders to gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 9e9f3ed2c..2d7dc7455 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,11 @@ var/ modules/private/ .yas-compiled-snippets.el +# folders created by Cask +.cask/ +cask/ +elpa/ + # emacs tempfiles that shouldn't be there .mc-lists.el .org-id-locations From dfed54c7ad35f5e2be9a6f50d45093af55d1cef9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 21:40:34 +0200 Subject: [PATCH 2321/4235] Shrink oversized company-box icons This would cause lines in company-box frames to be too large, making the last candidate seem cut off by the frame edge. --- modules/completion/company/config.el | 62 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 0b5ceea0e..104305c5b 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -35,39 +35,39 @@ :config (setq company-box-backends-colors nil company-box-max-candidates 50 - company-box-icons-yasnippet (all-the-icons-material "short_text" :face 'all-the-icons-green) - company-box-icons-unknown (all-the-icons-material "find_in_page" :face 'all-the-icons-purple) + company-box-icons-yasnippet (all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-green) + company-box-icons-unknown (all-the-icons-material "find_in_page" :height 0.8 :face 'all-the-icons-purple) company-box-icons-elisp - (list (all-the-icons-material "functions" :face 'all-the-icons-red) - (all-the-icons-material "check_circle" :face 'all-the-icons-blue) - (all-the-icons-material "stars" :face 'all-the-icons-orange) - (all-the-icons-material "format_paint" :face 'all-the-icons-pink)) + (list (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red) + (all-the-icons-material "check_circle" :height 0.8 :face 'all-the-icons-blue) + (all-the-icons-material "stars" :height 0.8 :face 'all-the-icons-orange) + (all-the-icons-material "format_paint" :height 0.8 :face 'all-the-icons-pink)) company-box-icons-lsp - '((1 . (all-the-icons-material "text_fields" :face 'all-the-icons-green)) ; text - (2 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; method - (3 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; function - (4 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; constructor - (5 . (all-the-icons-material "functions" :face 'all-the-icons-red)) ; field - (6 . (all-the-icons-material "adjust" :face 'all-the-icons-blue)) ; variable - (7 . (all-the-icons-material "class" :face 'all-the-icons-red)) ; class - (8 . (all-the-icons-material "settings_input_component" :face 'all-the-icons-red)) ; interface - (9 . (all-the-icons-material "view_module" :face 'all-the-icons-red)) ; module - (10 . (all-the-icons-material "settings" :face 'all-the-icons-red)) ; property - (11 . (all-the-icons-material "straighten" :face 'all-the-icons-red)) ; unit - (12 . (all-the-icons-material "filter_1" :face 'all-the-icons-red)) ; value - (13 . (all-the-icons-material "plus_one" :face 'all-the-icons-red)) ; enum - (14 . (all-the-icons-material "filter_center_focus" :face 'all-the-icons-red)) ; keyword - (15 . (all-the-icons-material "short_text" :face 'all-the-icons-red)) ; snippet - (16 . (all-the-icons-material "color_lens" :face 'all-the-icons-red)) ; color - (17 . (all-the-icons-material "insert_drive_file" :face 'all-the-icons-red)) ; file - (18 . (all-the-icons-material "collections_bookmark" :face 'all-the-icons-red)) ; reference - (19 . (all-the-icons-material "folder" :face 'all-the-icons-red)) ; folder - (20 . (all-the-icons-material "people" :face 'all-the-icons-red)) ; enumMember - (21 . (all-the-icons-material "pause_circle_filled" :face 'all-the-icons-red)) ; constant - (22 . (all-the-icons-material "streetview" :face 'all-the-icons-red)) ; struct - (23 . (all-the-icons-material "event" :face 'all-the-icons-red)) ; event - (24 . (all-the-icons-material "control_point" :face 'all-the-icons-red)) ; operator - (25 . (all-the-icons-material "class" :face 'all-the-icons-red))))) + '((1 . (all-the-icons-material "text_fields" :height 0.8 :face 'all-the-icons-green)) ; text + (2 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; method + (3 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; function + (4 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; constructor + (5 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; field + (6 . (all-the-icons-material "adjust" :height 0.8 :face 'all-the-icons-blue)) ; variable + (7 . (all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)) ; class + (8 . (all-the-icons-material "settings_input_component" :height 0.8 :face 'all-the-icons-red)) ; interface + (9 . (all-the-icons-material "view_module" :height 0.8 :face 'all-the-icons-red)) ; module + (10 . (all-the-icons-material "settings" :height 0.8 :face 'all-the-icons-red)) ; property + (11 . (all-the-icons-material "straighten" :height 0.8 :face 'all-the-icons-red)) ; unit + (12 . (all-the-icons-material "filter_1" :height 0.8 :face 'all-the-icons-red)) ; value + (13 . (all-the-icons-material "plus_one" :height 0.8 :face 'all-the-icons-red)) ; enum + (14 . (all-the-icons-material "filter_center_focus" :height 0.8 :face 'all-the-icons-red)) ; keyword + (15 . (all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-red)) ; snippet + (16 . (all-the-icons-material "color_lens" :height 0.8 :face 'all-the-icons-red)) ; color + (17 . (all-the-icons-material "insert_drive_file" :height 0.8 :face 'all-the-icons-red)) ; file + (18 . (all-the-icons-material "collections_bookmark" :height 0.8 :face 'all-the-icons-red)) ; reference + (19 . (all-the-icons-material "folder" :height 0.8 :face 'all-the-icons-red)) ; folder + (20 . (all-the-icons-material "people" :height 0.8 :face 'all-the-icons-red)) ; enumMember + (21 . (all-the-icons-material "pause_circle_filled" :height 0.8 :face 'all-the-icons-red)) ; constant + (22 . (all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) ; struct + (23 . (all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) ; event + (24 . (all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) ; operator + (25 . (all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red))))) (def-package! company-dict From 80a3c9bf621aae93148126decde0319cef48532c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 5 Jul 2018 21:45:44 +0200 Subject: [PATCH 2322/4235] Fix company-box not showing lone candidates Revert this once sebastiencz/company-box#40 is merged. --- modules/completion/company/config.el | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 104305c5b..0e3bc00c1 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -67,7 +67,19 @@ (22 . (all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) ; struct (23 . (all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) ; event (24 . (all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) ; operator - (25 . (all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red))))) + (25 . (all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)))) + + ;; Until sebastiencs/company-box#40 is merged + (defun +company*box-frontend-even-if-single (command) + (cond ((eq command 'hide) + (company-box-hide)) + ((equal company-candidates-length 0) + (company-box-hide)) + ((eq command 'update) + (company-box-show)) + ((eq command 'post-command) + (company-box--post-command)))) + (advice-add #'company-box-frontend :override #'+company*box-frontend-even-if-single)) (def-package! company-dict From 15f66f4b52cb04bde1e00dfec0066a0fb175fd62 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 01:06:13 +0200 Subject: [PATCH 2323/4235] Add doom|disable-show-paren-mode hook For disabling show-paren-mode buffer-locally. --- core/core-ui.el | 3 +++ modules/lang/org/config.el | 11 ++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 24ad30a3d..66b4ec46b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -316,6 +316,9 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (def-package! paren :after-call (after-find-file doom-exit-buffer-hook) :config + (defun doom|disable-show-paren-mode () + "Turn off `show-paren-mode' buffer-locally." + (set (make-local-variable 'show-paren-mode) nil)) (setq show-paren-delay 0.1 show-paren-highlight-openparen t show-paren-when-point-inside-paren t) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 026c76496..a5690b240 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -56,12 +56,14 @@ org-indent-mode ; margin-based indentation toc-org-enable ; auto-table of contents auto-fill-mode ; line wrapping + ;; `show-paren-mode' causes flickering with indentation margins made by + ;; `org-indent-mode', so we simply turn off show-paren-mode altogether." + doom|disable-show-paren-mode +org|enable-auto-reformat-tables +org|enable-auto-update-cookies +org|smartparens-compatibility-config - +org|unfold-to-2nd-level-or-point - +org|show-paren-mode-compatibility)) + +org|unfold-to-2nd-level-or-point)) ;; @@ -113,11 +115,6 @@ unfold to point on startup." (add-hook 'evil-insert-state-exit-hook #'+org|update-cookies nil t)) (add-hook 'before-save-hook #'+org|update-cookies nil t)) -(defun +org|show-paren-mode-compatibility () - "`show-paren-mode' causes flickering with indentation margins made by -`org-indent-mode', so we simply turn off show-paren-mode altogether." - (set (make-local-variable 'show-paren-mode) nil)) - ;; ;; `org-load' hooks From a7cba67fd67164861cab7535387fc60b061fa955 Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Thu, 5 Jul 2018 19:37:06 -0700 Subject: [PATCH 2324/4235] Support for multiple ligature'd fonts Refactors the ligature configuration to support more than just Iosevka (uses Fira Code as the second font). --- modules/ui/pretty-code/+fira.el | 131 +++++++ modules/ui/pretty-code/+iosevka.el | 231 +++++++++++++ modules/ui/pretty-code/autoload.el | 358 -------------------- modules/ui/pretty-code/autoload/autoload.el | 27 ++ modules/ui/pretty-code/autoload/settings.el | 67 ++++ modules/ui/pretty-code/config.el | 11 + 6 files changed, 467 insertions(+), 358 deletions(-) create mode 100644 modules/ui/pretty-code/+fira.el create mode 100644 modules/ui/pretty-code/+iosevka.el delete mode 100644 modules/ui/pretty-code/autoload.el create mode 100644 modules/ui/pretty-code/autoload/autoload.el create mode 100644 modules/ui/pretty-code/autoload/settings.el create mode 100644 modules/ui/pretty-code/config.el diff --git a/modules/ui/pretty-code/+fira.el b/modules/ui/pretty-code/+fira.el new file mode 100644 index 000000000..a62b9a83c --- /dev/null +++ b/modules/ui/pretty-code/+fira.el @@ -0,0 +1,131 @@ +;;; ui/pretty-code/+fira.el -*- lexical-binding: t; -*- + +(defun +pretty-code--correct-symbol-bounds (ligature-alist) + "Prepend non-breaking spaces to a ligature. + +This way `compose-region' (called by `prettify-symbols-mode') will use the +correct width of the symbols instead of the width measured by `char-width'." + (let ((len (length (car ligature-alist))) + (acc (list (cdr ligature-alist)))) + (while (> len 1) + (setq acc (cons #X00a0 (cons '(Br . Bl) acc)) + len (1- len))) + (cons (car ligature-alist) acc))) + +(defconst +pretty-code-fira-code-font-ligatures + (mapcar #'+pretty-code--correct-symbol-bounds + '(("www" . #Xe100) + ("**" . #Xe101) + ("***" . #Xe102) + ("**/" . #Xe103) + ("*>" . #Xe104) + ("*/" . #Xe105) + ("\\\\" . #Xe106) + ("\\\\\\" . #Xe107) + ("{-" . #Xe108) + ("[]" . #Xe109) + ("::" . #Xe10a) + (":::" . #Xe10b) + (":=" . #Xe10c) + ("!!" . #Xe10d) + ("!=" . #Xe10e) + ("!==" . #Xe10f) + ("-}" . #Xe110) + ("--" . #Xe111) + ("---" . #Xe112) + ("-->" . #Xe113) + ("->" . #Xe114) + ("->>" . #Xe115) + ("-<" . #Xe116) + ("-<<" . #Xe117) + ("-~" . #Xe118) + ("#{" . #Xe119) + ("#[" . #Xe11a) + ("##" . #Xe11b) + ("###" . #Xe11c) + ("####" . #Xe11d) + ("#(" . #Xe11e) + ("#?" . #Xe11f) + ("#_" . #Xe120) + ("#_(" . #Xe121) + (".-" . #Xe122) + (".=" . #Xe123) + (".." . #Xe124) + ("..<" . #Xe125) + ("..." . #Xe126) + ("?=" . #Xe127) + ("??" . #Xe128) + (";;" . #Xe129) + ("/*" . #Xe12a) + ("/**" . #Xe12b) + ("/=" . #Xe12c) + ("/==" . #Xe12d) + ("/>" . #Xe12e) + ("//" . #Xe12f) + ("///" . #Xe130) + ("&&" . #Xe131) + ("||" . #Xe132) + ("||=" . #Xe133) + ("|=" . #Xe134) + ("|>" . #Xe135) + ("^=" . #Xe136) + ("$>" . #Xe137) + ("++" . #Xe138) + ("+++" . #Xe139) + ("+>" . #Xe13a) + ("=:=" . #Xe13b) + ("==" . #Xe13c) + ("===" . #Xe13d) + ("==>" . #Xe13e) + ("=>" . #Xe13f) + ("=>>" . #Xe140) + ("<=" . #Xe141) + ("=<<" . #Xe142) + ("=/=" . #Xe143) + (">-" . #Xe144) + (">=" . #Xe145) + (">=>" . #Xe146) + (">>" . #Xe147) + (">>-" . #Xe148) + (">>=" . #Xe149) + (">>>" . #Xe14a) + ("<*" . #Xe14b) + ("<*>" . #Xe14c) + ("<|" . #Xe14d) + ("<|>" . #Xe14e) + ("<$" . #Xe14f) + ("<$>" . #Xe150) + ("" . #Xe101) + ("<--->" . #Xe102) + ("<---->" . #Xe103) + ("<----->" . #Xe104) + ;; Double-ended equals arrows + ("<=>" . #Xe105) + ("<==>" . #Xe106) + ("<===>" . #Xe107) + ("<====>" . #Xe108) + ("<=====>" . #Xe109) + ;; Double-ended asterisk operators + ("<**>" . #Xe10a) + ("<***>" . #Xe10b) + ("<****>" . #Xe10c) + ("<*****>" . #Xe10d) + ;; HTML comments + ("" . #Xe152) + ("-->-" . #Xe153) + ("-->--" . #Xe154) + ("-->>" . #Xe155) + ("-->>-" . #Xe156) + ("-->>--" . #Xe157) + ("-->>>" . #Xe158) + ("-->>>-" . #Xe159) + ("-->>>--" . #Xe15a) + (">-" . #Xe15b) + (">--" . #Xe15c) + (">>-" . #Xe15d) + (">>--" . #Xe15e) + (">>>-" . #Xe15f) + (">>>--" . #Xe160) + ("=>" . #Xe161) + ("=>=" . #Xe162) + ("=>==" . #Xe163) + ("=>>" . #Xe164) + ("=>>=" . #Xe165) + ("=>>==" . #Xe166) + ("=>>>" . #Xe167) + ("=>>>=" . #Xe168) + ("=>>>==" . #Xe169) + ("==>" . #Xe16a) + ("==>=" . #Xe16b) + ("==>==" . #Xe16c) + ("==>>" . #Xe16d) + ("==>>=" . #Xe16e) + ("==>>==" . #Xe16f) + ("==>>>" . #Xe170) + ("==>>>=" . #Xe171) + ("==>>>==" . #Xe172) + (">=" . #Xe173) + (">==" . #Xe174) + (">>=" . #Xe175) + (">>==" . #Xe176) + (">>>=" . #Xe177) + (">>>==" . #Xe178) + ("<-" . #Xe179) + ("-<-" . #Xe17a) + ("--<-" . #Xe17b) + ("<<-" . #Xe17c) + ("-<<-" . #Xe17d) + ("--<<-" . #Xe17e) + ("<<<-" . #Xe17f) + ("-<<<-" . #Xe180) + ("--<<<-" . #Xe181) + ("<--" . #Xe182) + ("-<--" . #Xe183) + ("--<--" . #Xe184) + ("<<--" . #Xe185) + ("-<<--" . #Xe186) + ("--<<--" . #Xe187) + ("<<<--" . #Xe188) + ("-<<<--" . #Xe189) + ("--<<<--" . #Xe18a) + ("-<" . #Xe18b) + ("--<" . #Xe18c) + ("-<<" . #Xe18d) + ("--<<" . #Xe18e) + ("-<<<" . #Xe18f) + ("--<<<" . #Xe190) + ("<=" . #Xe191) + ("=<=" . #Xe192) + ("==<=" . #Xe193) + ("<<=" . #Xe194) + ("=<<=" . #Xe195) + ("==<<=" . #Xe196) + ("<<<=" . #Xe197) + ("=<<<=" . #Xe198) + ("==<<<=" . #Xe199) + ("<==" . #Xe19a) + ("=<==" . #Xe19b) + ("==<==" . #Xe19c) + ("<<==" . #Xe19d) + ("=<<==" . #Xe19e) + ("==<<==" . #Xe19f) + ("<<<==" . #Xe1a0) + ("=<<<==" . #Xe1a1) + ("==<<<==" . #Xe1a2) + ("=<" . #Xe1a3) + ("==<" . #Xe1a4) + ("=<<" . #Xe1a5) + ("==<<" . #Xe1a6) + ("=<<<" . #Xe1a7) + ("==<<<" . #Xe1a8) + ;; Monadic operators + (">=>" . #Xe1a9) + (">->" . #Xe1aa) + (">-->" . #Xe1ab) + (">==>" . #Xe1ac) + ("<=<" . #Xe1ad) + ("<-<" . #Xe1ae) + ("<--<" . #Xe1af) + ("<==<" . #Xe1b0) + ;; Composition operators + (">>" . #Xe1b1) + (">>>" . #Xe1b2) + ("<<" . #Xe1b3) + ("<<<" . #Xe1b4) + ;; Lens operators + (":+" . #Xe1b5) + (":-" . #Xe1b6) + (":=" . #Xe1b7) + ("+:" . #Xe1b8) + ("-:" . #Xe1b9) + ("=:" . #Xe1ba) + ("=^" . #Xe1bb) + ("=+" . #Xe1bc) + ("=-" . #Xe1bd) + ("=*" . #Xe1be) + ("=/" . #Xe1bf) + ("=%" . #Xe1c0) + ("^=" . #Xe1c1) + ("+=" . #Xe1c2) + ("-=" . #Xe1c3) + ("*=" . #Xe1c4) + ("/=" . #Xe1c5) + ("%=" . #Xe1c6) + ;; Logical + ("/\\" . #Xe1c7) + ("\\/" . #Xe1c8) + ;; Semigroup/monoid operators + ("<>" . #Xe1c9) + ("<+" . #Xe1ca) + ("<+>" . #Xe1cb) + ("+>" . #Xe1cc)) + "Defines the character mappings for ligatures for Iosevka.") + +(defun +pretty-code|setup-iosevka-ligatures () + (set-fontset-font t '(#Xe100 . #Xe16f) "Iosevka") + (setq-default prettify-symbols-alist + (append prettify-symbols-alist + +pretty-code-iosevka-font-ligatures))) + +(add-hook! 'doom-init-ui-hook #'+pretty-code|setup-iosevka-ligatures) + + diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el deleted file mode 100644 index 0ed207d93..000000000 --- a/modules/ui/pretty-code/autoload.el +++ /dev/null @@ -1,358 +0,0 @@ -;;; ui/pretty-code/autoload.el -*- lexical-binding: t; -*- - -;; When you get to the right edge, it goes back to how it normally prints -(setq prettify-symbols-unprettify-at-point 'right-edge) - -;;;###autoload -(defvar +pretty-code-iosevka-ligatures-enabled-by-default nil - "If non-nil, iosevka ligeratures are enabled by default in modes -`set-pretty-symbols!' has been used on. - -This requires the iosevka font! - -Use the :iosevka property to enable (or disable) it regardless.") - -;;;###autoload -(defvar +pretty-code-enabled-modes t - "List of major modes in which `prettify-symbols-mode' should not be enabled. -If t, enable it everywhere. If the first element is 'not, enable it in any mode -besides what is listed.") - -;;;###autoload -(defvar +pretty-code-symbols - '(;; org - :name "»" - :src_block "»" - :src_block_end " " - ;; Functional - :lambda "λ" - :def "ƒ" - :composition "∘" - :map "↦" - ;; Types - :null "∅" - :true "𝕋" - :false "𝔽" - :int "ℤ" - :float "ℝ" - :str "𝕊" - :bool "𝔹" - ;; Flow - :not "¬" - :in "∈" - :not-in "∉" - :and "∧" - :or "∨" - :for "∀" - :some "∃" - :return "⟼" - :yield "⟻" - ;; Other - :tuple "⨂" - :pipe "" - :dot "•") - "Options plist for `pretty-code-get-pairs'.") - -(defvar +pretty-code--iosevka-ligeratures-enabled nil) -(defun +pretty-code-setup-iosevka-ligatures () - (unless +pretty-code--iosevka-ligeratures-enabled - (set-fontset-font t '(#xe100 . #xe16f) "Iosevka")) - (setq prettify-symbols-alist - (append prettify-symbols-alist - '(;; Double-ended hyphen arrows - ("<->" . #Xe100) - ("<-->" . #Xe101) - ("<--->" . #Xe102) - ("<---->" . #Xe103) - ("<----->" . #Xe104) - ;; Double-ended equals arrows - ("<=>" . #Xe105) - ("<==>" . #Xe106) - ("<===>" . #Xe107) - ("<====>" . #Xe108) - ("<=====>" . #Xe109) - ;; Double-ended asterisk operators - ("<**>" . #Xe10a) - ("<***>" . #Xe10b) - ("<****>" . #Xe10c) - ("<*****>" . #Xe10d) - ;; HTML comments - ("" . #Xe152) - ("-->-" . #Xe153) - ("-->--" . #Xe154) - ("-->>" . #Xe155) - ("-->>-" . #Xe156) - ("-->>--" . #Xe157) - ("-->>>" . #Xe158) - ("-->>>-" . #Xe159) - ("-->>>--" . #Xe15a) - (">-" . #Xe15b) - (">--" . #Xe15c) - (">>-" . #Xe15d) - (">>--" . #Xe15e) - (">>>-" . #Xe15f) - (">>>--" . #Xe160) - ("=>" . #Xe161) - ("=>=" . #Xe162) - ("=>==" . #Xe163) - ("=>>" . #Xe164) - ("=>>=" . #Xe165) - ("=>>==" . #Xe166) - ("=>>>" . #Xe167) - ("=>>>=" . #Xe168) - ("=>>>==" . #Xe169) - ("==>" . #Xe16a) - ("==>=" . #Xe16b) - ("==>==" . #Xe16c) - ("==>>" . #Xe16d) - ("==>>=" . #Xe16e) - ("==>>==" . #Xe16f) - ("==>>>" . #Xe170) - ("==>>>=" . #Xe171) - ("==>>>==" . #Xe172) - (">=" . #Xe173) - (">==" . #Xe174) - (">>=" . #Xe175) - (">>==" . #Xe176) - (">>>=" . #Xe177) - (">>>==" . #Xe178) - ("<-" . #Xe179) - ("-<-" . #Xe17a) - ("--<-" . #Xe17b) - ("<<-" . #Xe17c) - ("-<<-" . #Xe17d) - ("--<<-" . #Xe17e) - ("<<<-" . #Xe17f) - ("-<<<-" . #Xe180) - ("--<<<-" . #Xe181) - ("<--" . #Xe182) - ("-<--" . #Xe183) - ("--<--" . #Xe184) - ("<<--" . #Xe185) - ("-<<--" . #Xe186) - ("--<<--" . #Xe187) - ("<<<--" . #Xe188) - ("-<<<--" . #Xe189) - ("--<<<--" . #Xe18a) - ("-<" . #Xe18b) - ("--<" . #Xe18c) - ("-<<" . #Xe18d) - ("--<<" . #Xe18e) - ("-<<<" . #Xe18f) - ("--<<<" . #Xe190) - ("<=" . #Xe191) - ("=<=" . #Xe192) - ("==<=" . #Xe193) - ("<<=" . #Xe194) - ("=<<=" . #Xe195) - ("==<<=" . #Xe196) - ("<<<=" . #Xe197) - ("=<<<=" . #Xe198) - ("==<<<=" . #Xe199) - ("<==" . #Xe19a) - ("=<==" . #Xe19b) - ("==<==" . #Xe19c) - ("<<==" . #Xe19d) - ("=<<==" . #Xe19e) - ("==<<==" . #Xe19f) - ("<<<==" . #Xe1a0) - ("=<<<==" . #Xe1a1) - ("==<<<==" . #Xe1a2) - ("=<" . #Xe1a3) - ("==<" . #Xe1a4) - ("=<<" . #Xe1a5) - ("==<<" . #Xe1a6) - ("=<<<" . #Xe1a7) - ("==<<<" . #Xe1a8) - ;; Monadic operators - (">=>" . #Xe1a9) - (">->" . #Xe1aa) - (">-->" . #Xe1ab) - (">==>" . #Xe1ac) - ("<=<" . #Xe1ad) - ("<-<" . #Xe1ae) - ("<--<" . #Xe1af) - ("<==<" . #Xe1b0) - ;; Composition operators - (">>" . #Xe1b1) - (">>>" . #Xe1b2) - ("<<" . #Xe1b3) - ("<<<" . #Xe1b4) - ;; Lens operators - (":+" . #Xe1b5) - (":-" . #Xe1b6) - (":=" . #Xe1b7) - ("+:" . #Xe1b8) - ("-:" . #Xe1b9) - ("=:" . #Xe1ba) - ("=^" . #Xe1bb) - ("=+" . #Xe1bc) - ("=-" . #Xe1bd) - ("=*" . #Xe1be) - ("=/" . #Xe1bf) - ("=%" . #Xe1c0) - ("^=" . #Xe1c1) - ("+=" . #Xe1c2) - ("-=" . #Xe1c3) - ("*=" . #Xe1c4) - ("/=" . #Xe1c5) - ("%=" . #Xe1c6) - ;; Logical - ("/\\" . #Xe1c7) - ("\\/" . #Xe1c8) - ;; Semigroup/monoid operators - ("<>" . #Xe1c9) - ("<+" . #Xe1ca) - ("<+>" . #Xe1cb) - ("+>" . #Xe1cc))))) - -(defun +pretty-code--icon-to-char (l) - "Borrowed from `prettify-utils'." - (let ((glue '(Br . Bl)) - (head (car l)) - (tail (cdr l))) - (cond ((not (consp l)) '()) - ((not (consp tail)) (list head)) - ((cons head (cons glue (+pretty-code--icon-to-char tail))))))) - -;;;###autodef -(defun set-pretty-symbols! (modes &rest plist) - "Associates string patterns with icons in certain major-modes. - - MODES is a major mode symbol or a list of them. - PLIST is a property list whose keys must match keys in `+pretty-code-symbols', -and whose values are strings representing the text to be replaced with that -symbol. If the car of PLIST is nil, then unset any pretty symbols previously -defined for MODES. - -The following properties are special: - - :iosevka BOOL - Enables (or disables) iosevka ligeratures for MODES. See the definition of - `+pretty-code-setup-iosevka-ligatures' for more info. - `+pretty-code-iosevka-ligatures-enabled-by-default' determines the default - setting. - :alist ALIST - Appends ALIST to `prettify-symbols-alist' literally, without mapping text to - `+pretty-code-symbols'. - :merge BOOL - If non-nil, merge with previously defined `prettify-symbols-alist', - otherwise overwrite it. - -For example, the rule for emacs-lisp-mode is very simple: - - (set-pretty-symbols! 'emacs-lisp-mode - :lambda \"lambda\") - -This will replace any instances of \"lambda\" in emacs-lisp-mode with the symbol -assicated with :lambda in `+pretty-code-symbols'. - -Pretty symbols can be unset for emacs-lisp-mode with: - - (set-pretty-symbols! 'emacs-lisp-mode nil)" - (declare (indent defun)) - (dolist (mode (doom-enlist modes)) - (let ((hook (intern (format "%s-hook" mode))) - (fn (intern (format "+pretty-code|init-%s" mode)))) - (cond ((null (car-safe plist)) - (remove-hook hook fn) - (unintern fn nil)) - ((or (eq +pretty-code-enabled-modes 't) - (if (eq (car +pretty-code-enabled-modes) 'not) - (not (memq mode (cdr +pretty-code-enabled-modes))) - (memq mode +pretty-code-enabled-modes))) - (fset fn - (lambda () - (when (eq major-mode mode) - (unless (cadr (plist-member plist :merge)) - (setq prettify-symbols-alist nil)) - (if-let ((alist (plist-get plist :alist))) - (setq prettify-symbols-alist (append alist prettify-symbols-alist)) - (let ((plist plist) - results) - (while plist - (let ((prop (car plist)) - (sym (cadr plist))) - (when-let* ((icon (plist-get +pretty-code-symbols prop))) - (push (cons sym (+pretty-code--icon-to-char (append icon nil))) - results)) - (setq plist (cddr plist)))) - (setq prettify-symbols-alist (append results prettify-symbols-alist)))) - (when (or (cadr (plist-member plist :iosevka)) - +pretty-code-iosevka-ligatures-enabled-by-default) - (+pretty-code-setup-iosevka-ligatures)) - (when prettify-symbols-mode - (prettify-symbols-mode -1)) - (prettify-symbols-mode +1)))) - (add-hook hook fn)))))) diff --git a/modules/ui/pretty-code/autoload/autoload.el b/modules/ui/pretty-code/autoload/autoload.el new file mode 100644 index 000000000..5e63825c1 --- /dev/null +++ b/modules/ui/pretty-code/autoload/autoload.el @@ -0,0 +1,27 @@ +;;; ui/pretty-code/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defvar +pretty-code-enabled-modes t + "List of major modes in which `prettify-symbols-mode' should be enabled. +If t, enable it everywhere. If the first element is 'not, enable it in any mode +besides what is listed.") + + +;;;###autoload +(defun +pretty-code|init-pretty-symbols () + "Enabled `prettify-symbols-mode'. + +If the current major mode is disabled in `+pretty-code-enabled-modes', this +function does nothing. Otherwise, it sets the value of +`prettify-code-symbols-alist' according to `+pretty-code-symbols-alist' for the +current major mode." + (when (or (eq +pretty-code-enabled-modes 't) + (if (eq (car +pretty-code-enabled-modes 'not)) + (not (memq major-mode (cdr +pretty-code-enabled-modes))) + (memq major-mode +pretty-code-enabled-modes))) + (setq prettify-symbols-alist + (append (alist-get major-mode +pretty-code-symbols-alist) + (default-value 'prettify-symbols-alist))) + (when prettify-symbols-mode + (prettify-symbols-mode -1)) + (prettify-symbols-mode +1))) diff --git a/modules/ui/pretty-code/autoload/settings.el b/modules/ui/pretty-code/autoload/settings.el new file mode 100644 index 000000000..4c0ade8f3 --- /dev/null +++ b/modules/ui/pretty-code/autoload/settings.el @@ -0,0 +1,67 @@ +;;; ui/pretty-code/settings.el -*- lexical-binding: t; -*- + +;;;###autoload +(defvar +pretty-code-symbols + '(;; org + :name "»" + :src_block "»" + :src_block_end " " + ;; Functional + :lambda "λ" + :def "ƒ" + :composition "∘" + :map "↦" + ;; Types + :null "∅" + :true "𝕋" + :false "𝔽" + :int "ℤ" + :float "ℝ" + :str "𝕊" + :bool "𝔹" + ;; Flow + :not "¬" + :in "∈" + :not-in "∉" + :and "∧" + :or "∨" + :for "∀" + :some "∃" + :return "⟼" + :yield "⟻" + ;; Other + :tuple "⨂" + :pipe "" ;; FIXME: find a non-private char + :dot "•") + "Options plist for `set-pretty-symbols!'. + +This should not contain any symbols from the Unicode Private Area! There is no +universal way of getting the correct symbol as that area varies from font to +font.") + +;;;###autoload +(defvar +pretty-code-symbols-alist nil + "An alist containing a mapping of major modes to its value for +`prettify-symbols-alist'.") + + +;;;###autoload +(defun set-pretty-symbols! (modes &rest rest) + (dolist (mode (doom-enlist modes)) + (if (null (car-safe rest)) + (setq var nil) + (let (results merge key alist) + (while rest + (setq key (pop rest)) + (pcase key + (:merge (setq merge t)) + (:alist (setq results (append (pop rest) results))) + (_ + (unless (plist-member +pretty-code-symbols key) + (user-error "Invalid keyword in set-pretty-symbols!: %s" key)) + (let* ((sym (pop rest)) + (char (plist-get +pretty-code-symbols key))) + (push (cons sym char) results))))) + (unless merge + (assq-delete-all mode +pretty-code-symbols-alist)) + (push (cons mode results) +pretty-code-symbols-alist))))) diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el new file mode 100644 index 000000000..4bea61304 --- /dev/null +++ b/modules/ui/pretty-code/config.el @@ -0,0 +1,11 @@ +;;; ui/pretty-code/config.el -*- lexical-binding: t; -*- + +(cond ((featurep! +fira) + (load! "+fira")) + ((featurep! +iosevka) + (load! "+iosevka"))) + +;; When you get to the right edge, it goes back to how it normally prints +(setq prettify-symbols-unprettify-at-point 'right-edge) + +(add-hook! 'after-change-major-mode-hook #'+pretty-code|init-pretty-symbols) From fff95477635835d79443311eeedc48954c47fd35 Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Thu, 5 Jul 2018 22:09:29 -0700 Subject: [PATCH 2325/4235] Fix major mode symbols --- 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 f87e9d344..cef9238af 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -60,7 +60,7 @@ compilation database is present in the project.") :config (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) - (set-pretty-symbols! '(c-mode-hook c++-mode-hook) + (set-pretty-symbols! '(c-mode c++-mode) ;; Functional ;; :def "void " ;; Types From eb79760c666f768584219d4a161c66bc72bcfa03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 12:17:29 +0200 Subject: [PATCH 2326/4235] ivy-rich-switch-buffer-pad => ivy-rich-pad To match upstream changes. Reported by @sarg --- modules/completion/ivy/autoload/ivy.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 5a79dd0f5..88651a03c 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -9,7 +9,7 @@ (defun +ivy*rich-switch-buffer-buffer-name (str) (propertize - (ivy-rich-switch-buffer-pad str ivy-rich-switch-buffer-name-max-length) + (ivy-rich-pad str ivy-rich-switch-buffer-name-max-length) 'face (cond ((string-match-p "^ *\\*" str) 'font-lock-comment-face) ((and buffer-file-truename From 64867cbed4edf619782a932a0e4f14fe2678582f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 12:48:41 +0200 Subject: [PATCH 2327/4235] Don't lazy load doom|disable-show-paren-mode In case it is used early (e.g. by org-mode). --- 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 66b4ec46b..865a6accf 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -315,10 +315,11 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; highlight matching delimiters (def-package! paren :after-call (after-find-file doom-exit-buffer-hook) - :config + :init (defun doom|disable-show-paren-mode () "Turn off `show-paren-mode' buffer-locally." (set (make-local-variable 'show-paren-mode) nil)) + :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t show-paren-when-point-inside-paren t) From 3443cd870ada37aff115d0462a52d100bfa03ac2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 13:39:42 +0200 Subject: [PATCH 2328/4235] Disable magit-auto-revert-mode Because we already use global-auto-revert-mode, but because it's lazy loaded, the magit-autorevert package may not notice, and will enable magit-auto-revert-mode anyway. --- modules/tools/magit/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 8cf846593..a1631d1f8 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -16,6 +16,8 @@ load everything.") (def-package! magit :commands magit-file-delete + :init + (setq magit-auto-revert-mode nil) ; we already use `global-auto-revert-mode' :config (setq magit-completing-read-function (if (featurep! :completion ivy) From 0b7faa468cf22be0a76ba193860825ab0c8e5cba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 14:57:40 +0200 Subject: [PATCH 2329/4235] Fix which-key sharing windows with other popups Which-key is now lazy-loaded, so the modified which-key-popup-type gets overwritten. --- modules/ui/popup/+hacks.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index b8c4fb0cc..6aa30cded 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -281,16 +281,17 @@ instead of switch-to-buffer-*." ;; `which-key' -(setq which-key-popup-type 'custom - which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) - which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window - which-key-custom-show-popup-function - (lambda (act-popup-dim) - (cl-letf (((symbol-function 'display-buffer-in-side-window) - (lambda (buffer alist) - (+popup-display-buffer-stacked-side-window - buffer (append '((vslot . -9999)) alist))))) - (which-key--show-buffer-side-window act-popup-dim)))) +(after! which-key + (setq which-key-popup-type 'custom + which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) + which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window + which-key-custom-show-popup-function + (lambda (act-popup-dim) + (cl-letf (((symbol-function 'display-buffer-in-side-window) + (lambda (buffer alist) + (+popup-display-buffer-stacked-side-window + buffer (append '((vslot . -9999)) alist))))) + (which-key--show-buffer-side-window act-popup-dim))))) ;; `windmove' From 3f553b0a7140b43141ea476e719ba831e92480e8 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Fri, 6 Jul 2018 23:31:57 +1000 Subject: [PATCH 2330/4235] lang/ruby: Initial work on porting to enh-ruby --- modules/lang/ruby/config.el | 91 ++++++++++++++++++++--------------- modules/lang/ruby/packages.el | 6 ++- 2 files changed, 58 insertions(+), 39 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 5c5e3b713..cd18264e3 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -6,21 +6,36 @@ (defvar-local +ruby-current-version nil "The currently active ruby version.") +(defvar +ruby-ask-for-server t + "Ask for a server whenever you open a ruby buffer. -;; -;; Plugins -;; +This will only ask once if you say yes, but if you say no and keep opening +buffers, itll ask every time.") -(def-package! ruby-mode - :mode "\\.\\(?:pry\\|irb\\)rc\\'" +;; FIXME: Add these +;; does anyone actually use these? +;; (map! :map ruby-mode-map +;; :localleader +;; :prefix "r" +;; :nv "b" #'ruby-toggle-block +;; :nv "ec" #'ruby-refactor-extract-constant +;; :nv "el" #'ruby-refactor-extract-to-let +;; :nv "em" #'ruby-refactor-extract-to-method +;; :nv "ev" #'ruby-refactor-extract-local-variable +;; :nv "ad" #'ruby-refactor-add-parameter +;; :nv "cc" #'ruby-refactor-convert-post-conditional)) +(def-package! enh-ruby-mode + :mode "\\.rb$" + :mode "\\.rake$" + :mode "\\.gemspec$" + :mode "\\.\\(pry\\|irb\\)rc$" + :mode "/\\(Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file$" :config - (set-company-backend! 'ruby-mode 'company-dabbrev-code) - (set-electric! 'ruby-mode :words '("else" "end" "elseif")) (set-env! "RBENV_ROOT") - (set-repl-handler! 'ruby-mode #'inf-ruby) ; `inf-ruby' - (setq ruby-deep-indent-paren t) - ;; Don't interfere with my custom RET behavior - (define-key ruby-mode-map [?\n] nil) + (add-hook 'enh-ruby-mode-hook #'flycheck-mode) + (set-electric! 'enh-ruby-ode :words '("else" "end" "elsif")) + (setq sp-max-pair-length 6) ;; so class and module work + (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' ;; Version management with rbenv (defun +ruby|add-version-to-modeline () @@ -29,7 +44,7 @@ (if +ruby-current-version (format "Ruby %s" +ruby-current-version) "Ruby"))) - (add-hook 'ruby-mode-hook #'+ruby|add-version-to-modeline) + (add-hook 'enh-ruby-mode-hook #'+ruby|add-version-to-modeline) (if (not (executable-find "rbenv")) (setq +ruby-current-version (string-trim (shell-command-to-string "ruby --version 2>&1 | cut -d' ' -f2"))) @@ -43,36 +58,41 @@ environment variables." +ruby-current-version version-str) (when (member version-str +ruby-rbenv-versions) (setenv "RBENV_VERSION" version-str)))) - (add-hook 'ruby-mode-hook #'+ruby|detect-rbenv-version)) + (add-hook 'enh-ruby-mode-hook #'+ruby|detect-rbenv-version))) - (map! :map ruby-mode-map - :localleader - :prefix "r" - :nv "b" #'ruby-toggle-block - :nv "ec" #'ruby-refactor-extract-constant - :nv "el" #'ruby-refactor-extract-to-let - :nv "em" #'ruby-refactor-extract-to-method - :nv "ev" #'ruby-refactor-extract-local-variable - :nv "ad" #'ruby-refactor-add-parameter - :nv "cc" #'ruby-refactor-convert-post-conditional)) +(def-package! yard-mode :hook enh-ruby-mode) +(def-package! rbenv + :after enh-ruby-mode + :config + (global-rbenv-mode)) -(def-package! ruby-refactor - :commands - (ruby-refactor-extract-to-method ruby-refactor-extract-local-variable - ruby-refactor-extract-constant ruby-refactor-add-parameter - ruby-refactor-extract-to-let ruby-refactor-convert-post-conditional)) +(def-package! rubocop + :after enh-ruby-mode + :hook (enh-ruby-mode . rubocop-mode)) +(def-package! robe + :after enh-ruby-mode + :hook (enh-ruby-mode . robe-mode) + :init + (set-company-backend! 'enh-ruby-mode 'company-robe) + ;; robe-start erros if you hit no. + ;; FIXME: Once hit no, itll ask every time you open a new buffer. This is + ;; defined behaviour but not what we want! + (when +ruby-ask-for-server + (add-hook! 'enh-ruby-mode-hook (ignore-errors (call-interactively #'robe-start))))) -;; Highlight doc comments -(def-package! yard-mode :hook ruby-mode) - +;; FIXME: needed?? +(after! smartparens-ruby + (sp-local-pair 'enh-ruby-mode "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler))) (def-package! rspec-mode :mode ("/\\.rspec\\'" . text-mode) :init (associate! rspec-mode :match "/\\.rspec$") - (associate! rspec-mode :modes (ruby-mode yaml-mode) :files ("spec/")) + (associate! rspec-mode :modes (enh-ruby-mode yaml-mode) :files ("spec/")) (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") @@ -89,7 +109,7 @@ environment variables." ;; so remove it anyway! (advice-remove 'compilation-buffer-name 'rspec-compilation-buffer-name-wrapper) :config - (remove-hook 'ruby-mode-hook #'rspec-enable-appropriate-mode) + (remove-hook 'enh-ruby-mode-hook #'rspec-enable-appropriate-mode) (map! :map (rspec-mode-map rspec-verifiable-mode-map) :localleader :prefix "t" @@ -104,11 +124,6 @@ environment variables." :after inf-ruby :config (set-company-backend! 'inf-ruby-mode 'company-inf-ruby)) - -;; `rake' -(setq rake-completion-system 'default) - - ;; ;; Evil integration ;; diff --git a/modules/lang/ruby/packages.el b/modules/lang/ruby/packages.el index 5328f19fa..661a8d1b8 100644 --- a/modules/lang/ruby/packages.el +++ b/modules/lang/ruby/packages.el @@ -3,12 +3,16 @@ ;; requires ruby ruby-lint +(package! enh-ruby-mode) +(package! rbenv) +(package! rubocop) (package! inf-ruby) (package! rspec-mode) -(package! ruby-refactor) (package! yard-mode) (package! rake) +(package! robe) (when (featurep! :completion company) (package! company-inf-ruby)) + From 633b5b764d40d8438b24308e085abe6be7ee6cc2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 15:28:55 +0200 Subject: [PATCH 2331/4235] Apply smartparens {} fix to enh-ruby-mode too Fixes: {|} => { | } in enh-ruby-mode buffers too Reported by @ar1a --- modules/config/default/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index d6822a1fc..98531f432 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -41,7 +41,7 @@ (sp-pair "\"" nil :unless unless-list)) ;; Major-mode specific fixes - (sp-local-pair 'ruby-mode "{" "}" + (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" :pre-handlers '(:rem sp-ruby-prehandler) :post-handlers '(:rem sp-ruby-posthandler)) From 29ae7f935fe055aa8734864e9e361adc4895b6dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 15:33:25 +0200 Subject: [PATCH 2332/4235] Add eshell/mkdir-and-cd command I'd recommend aliasing this to mkdircd or take. --- modules/emacs/eshell/autoload/commands.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/emacs/eshell/autoload/commands.el b/modules/emacs/eshell/autoload/commands.el index 021764857..c1124c4cb 100644 --- a/modules/emacs/eshell/autoload/commands.el +++ b/modules/emacs/eshell/autoload/commands.el @@ -12,3 +12,9 @@ "Quit the current eshell buffer and close the window it's in." (setq-local +eshell-kill-window-on-exit t) (throw 'eshell-terminal t)) + +;;;###autoload +(defun eshell/mkdir-and-cd (dir) + "Create a directory then cd into it." + (make-directory dir t) + (eshell/cd dir)) From 6b1265ae5ac4676917aa44560704789c57ebb64a Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Fri, 6 Jul 2018 23:40:54 +1000 Subject: [PATCH 2333/4235] lang/ruby: bit more refactoring --- modules/lang/ruby/config.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index cd18264e3..441e01132 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -12,7 +12,7 @@ This will only ask once if you say yes, but if you say no and keep opening buffers, itll ask every time.") -;; FIXME: Add these +;; FIXME: Add these? ;; does anyone actually use these? ;; (map! :map ruby-mode-map ;; :localleader @@ -37,6 +37,11 @@ buffers, itll ask every time.") (setq sp-max-pair-length 6) ;; so class and module work (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' + ;; FIXME: needed?? + (after! smartparens-ruby + (sp-local-pair 'enh-ruby-mode "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler))) ;; Version management with rbenv (defun +ruby|add-version-to-modeline () "Add version string to the major mode in the modeline." @@ -64,29 +69,26 @@ environment variables." (def-package! rbenv :after enh-ruby-mode + :when (executable-find "rbenv") :config (global-rbenv-mode)) (def-package! rubocop - :after enh-ruby-mode :hook (enh-ruby-mode . rubocop-mode)) +;; FIXME: Clean up all processes from this/inf-ruby when all the ruby buffers +;; are closed (def-package! robe - :after enh-ruby-mode :hook (enh-ruby-mode . robe-mode) :init - (set-company-backend! 'enh-ruby-mode 'company-robe) ;; robe-start erros if you hit no. ;; FIXME: Once hit no, itll ask every time you open a new buffer. This is ;; defined behaviour but not what we want! (when +ruby-ask-for-server - (add-hook! 'enh-ruby-mode-hook (ignore-errors (call-interactively #'robe-start))))) + (add-hook! 'enh-ruby-mode-hook (ignore-errors (call-interactively #'robe-start)))) + :config + (set-company-backend! 'robe-mode 'company-robe)) -;; FIXME: needed?? -(after! smartparens-ruby - (sp-local-pair 'enh-ruby-mode "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler))) (def-package! rspec-mode :mode ("/\\.rspec\\'" . text-mode) @@ -118,7 +120,6 @@ environment variables." :n "s" #'rspec-verify-single :n "v" #'rspec-verify)) - (def-package! company-inf-ruby :when (featurep! :completion company) :after inf-ruby From 12b32d6208db9d000f1af2564d7d13c5497d9bce Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Fri, 6 Jul 2018 23:46:23 +1000 Subject: [PATCH 2334/4235] lang/ruby: Add rubocop binds --- modules/lang/ruby/config.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 441e01132..44167d42d 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -74,7 +74,14 @@ environment variables." (global-rbenv-mode)) (def-package! rubocop - :hook (enh-ruby-mode . rubocop-mode)) + :hook (enh-ruby-mode . rubocop-mode) + :config + (map! :map rubocop-mode + :localleader + :nv "f" #'rubocop-check-current-file + :nv "F" #'rubocop-autocorrect-current-file + :nv "p" #'rubocop-check-project + :nv "P" #'rubocop-autocorrect-project)) ;; FIXME: Clean up all processes from this/inf-ruby when all the ruby buffers ;; are closed From 811290368c442f153c3a984d42fdab65e4531540 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Fri, 6 Jul 2018 23:54:25 +1000 Subject: [PATCH 2335/4235] lang/ruby: what's 'this' lol --- modules/lang/ruby/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 44167d42d..6fabd60c7 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -9,7 +9,7 @@ (defvar +ruby-ask-for-server t "Ask for a server whenever you open a ruby buffer. -This will only ask once if you say yes, but if you say no and keep opening +Robe will only ask once if you say yes, but if you say no and keep opening buffers, itll ask every time.") ;; FIXME: Add these? From 372f02b6c00211ec51a523f07913e0775fa2975d Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Fri, 6 Jul 2018 23:55:51 +1000 Subject: [PATCH 2336/4235] lang/ruby: fix type (enh-ruby-ode) --- modules/lang/ruby/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 6fabd60c7..dd519630f 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -33,7 +33,7 @@ buffers, itll ask every time.") :config (set-env! "RBENV_ROOT") (add-hook 'enh-ruby-mode-hook #'flycheck-mode) - (set-electric! 'enh-ruby-ode :words '("else" "end" "elsif")) + (set-electric! 'enh-ruby-mode :words '("else" "end" "elsif")) (setq sp-max-pair-length 6) ;; so class and module work (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' From 2a125000ae2d0be7bc0512fa0684019c1685c912 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 19:59:16 +0200 Subject: [PATCH 2337/4235] Fix & document set-pretty-symbols! --- modules/ui/pretty-code/autoload/settings.el | 42 ++++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/modules/ui/pretty-code/autoload/settings.el b/modules/ui/pretty-code/autoload/settings.el index 4c0ade8f3..38793fb7a 100644 --- a/modules/ui/pretty-code/autoload/settings.el +++ b/modules/ui/pretty-code/autoload/settings.el @@ -40,21 +40,50 @@ universal way of getting the correct symbol as that area varies from font to font.") ;;;###autoload -(defvar +pretty-code-symbols-alist nil +(defvar +pretty-code-symbols-alist '((t)) "An alist containing a mapping of major modes to its value for `prettify-symbols-alist'.") - -;;;###autoload +;;;###autodef (defun set-pretty-symbols! (modes &rest rest) + "Associates string patterns with icons in certain major-modes. + + MODES is a major mode symbol or a list of them. + PLIST is a property list whose keys must match keys in `+pretty-code-symbols', +and whose values are strings representing the text to be replaced with that +symbol. If the car of PLIST is nil, then unset any pretty symbols previously +defined for MODES. + +The following properties are special: + + :alist ALIST + Appends ALIST to `prettify-symbols-alist' literally, without mapping text to + `+pretty-code-symbols'. + :merge BOOL + If non-nil, merge with previously defined `prettify-symbols-alist', + otherwise overwrite it. + +For example, the rule for emacs-lisp-mode is very simple: + + (set-pretty-symbols! 'emacs-lisp-mode + :lambda \"lambda\") + +This will replace any instances of \"lambda\" in emacs-lisp-mode with the symbol +assicated with :lambda in `+pretty-code-symbols'. + +Pretty symbols can be unset for emacs-lisp-mode with: + + (set-pretty-symbols! 'emacs-lisp-mode nil)" + (declare (indent defun)) (dolist (mode (doom-enlist modes)) (if (null (car-safe rest)) - (setq var nil) + (delq (assq mode +pretty-code-symbols-alist) + +pretty-code-symbols-alist) (let (results merge key alist) (while rest (setq key (pop rest)) (pcase key - (:merge (setq merge t)) + (:merge (setq merge (pop rest))) (:alist (setq results (append (pop rest) results))) (_ (unless (plist-member +pretty-code-symbols key) @@ -63,5 +92,6 @@ font.") (char (plist-get +pretty-code-symbols key))) (push (cons sym char) results))))) (unless merge - (assq-delete-all mode +pretty-code-symbols-alist)) + (delq (assq mode +pretty-code-symbols-alist) + +pretty-code-symbols-alist)) (push (cons mode results) +pretty-code-symbols-alist))))) From fc87a7290470613dda7f9529f74d90c1f0eee6a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 20:18:04 +0200 Subject: [PATCH 2338/4235] ui/pretty-code: general refactor & fix premature ) --- modules/ui/pretty-code/+fira.el | 241 +++++++++--------- modules/ui/pretty-code/+iosevka.el | 10 +- .../{autoload/settings.el => autoload.el} | 0 modules/ui/pretty-code/autoload/autoload.el | 27 -- modules/ui/pretty-code/config.el | 26 +- 5 files changed, 153 insertions(+), 151 deletions(-) rename modules/ui/pretty-code/{autoload/settings.el => autoload.el} (100%) delete mode 100644 modules/ui/pretty-code/autoload/autoload.el diff --git a/modules/ui/pretty-code/+fira.el b/modules/ui/pretty-code/+fira.el index a62b9a83c..276f8bffd 100644 --- a/modules/ui/pretty-code/+fira.el +++ b/modules/ui/pretty-code/+fira.el @@ -1,131 +1,134 @@ ;;; ui/pretty-code/+fira.el -*- lexical-binding: t; -*- +(defvar +pretty-code-fira-code-font-name "Fira Code Symbol" + "Name of the fira code ligature font.") + +(defvar +pretty-code-fira-code-font-ligatures + '(("www" . #Xe100) + ("**" . #Xe101) + ("***" . #Xe102) + ("**/" . #Xe103) + ("*>" . #Xe104) + ("*/" . #Xe105) + ("\\\\" . #Xe106) + ("\\\\\\" . #Xe107) + ("{-" . #Xe108) + ("[]" . #Xe109) + ("::" . #Xe10a) + (":::" . #Xe10b) + (":=" . #Xe10c) + ("!!" . #Xe10d) + ("!=" . #Xe10e) + ("!==" . #Xe10f) + ("-}" . #Xe110) + ("--" . #Xe111) + ("---" . #Xe112) + ("-->" . #Xe113) + ("->" . #Xe114) + ("->>" . #Xe115) + ("-<" . #Xe116) + ("-<<" . #Xe117) + ("-~" . #Xe118) + ("#{" . #Xe119) + ("#[" . #Xe11a) + ("##" . #Xe11b) + ("###" . #Xe11c) + ("####" . #Xe11d) + ("#(" . #Xe11e) + ("#?" . #Xe11f) + ("#_" . #Xe120) + ("#_(" . #Xe121) + (".-" . #Xe122) + (".=" . #Xe123) + (".." . #Xe124) + ("..<" . #Xe125) + ("..." . #Xe126) + ("?=" . #Xe127) + ("??" . #Xe128) + (";;" . #Xe129) + ("/*" . #Xe12a) + ("/**" . #Xe12b) + ("/=" . #Xe12c) + ("/==" . #Xe12d) + ("/>" . #Xe12e) + ("//" . #Xe12f) + ("///" . #Xe130) + ("&&" . #Xe131) + ("||" . #Xe132) + ("||=" . #Xe133) + ("|=" . #Xe134) + ("|>" . #Xe135) + ("^=" . #Xe136) + ("$>" . #Xe137) + ("++" . #Xe138) + ("+++" . #Xe139) + ("+>" . #Xe13a) + ("=:=" . #Xe13b) + ("==" . #Xe13c) + ("===" . #Xe13d) + ("==>" . #Xe13e) + ("=>" . #Xe13f) + ("=>>" . #Xe140) + ("<=" . #Xe141) + ("=<<" . #Xe142) + ("=/=" . #Xe143) + (">-" . #Xe144) + (">=" . #Xe145) + (">=>" . #Xe146) + (">>" . #Xe147) + (">>-" . #Xe148) + (">>=" . #Xe149) + (">>>" . #Xe14a) + ("<*" . #Xe14b) + ("<*>" . #Xe14c) + ("<|" . #Xe14d) + ("<|>" . #Xe14e) + ("<$" . #Xe14f) + ("<$>" . #Xe150) + ("" . #Xe113) - ("->" . #Xe114) - ("->>" . #Xe115) - ("-<" . #Xe116) - ("-<<" . #Xe117) - ("-~" . #Xe118) - ("#{" . #Xe119) - ("#[" . #Xe11a) - ("##" . #Xe11b) - ("###" . #Xe11c) - ("####" . #Xe11d) - ("#(" . #Xe11e) - ("#?" . #Xe11f) - ("#_" . #Xe120) - ("#_(" . #Xe121) - (".-" . #Xe122) - (".=" . #Xe123) - (".." . #Xe124) - ("..<" . #Xe125) - ("..." . #Xe126) - ("?=" . #Xe127) - ("??" . #Xe128) - (";;" . #Xe129) - ("/*" . #Xe12a) - ("/**" . #Xe12b) - ("/=" . #Xe12c) - ("/==" . #Xe12d) - ("/>" . #Xe12e) - ("//" . #Xe12f) - ("///" . #Xe130) - ("&&" . #Xe131) - ("||" . #Xe132) - ("||=" . #Xe133) - ("|=" . #Xe134) - ("|>" . #Xe135) - ("^=" . #Xe136) - ("$>" . #Xe137) - ("++" . #Xe138) - ("+++" . #Xe139) - ("+>" . #Xe13a) - ("=:=" . #Xe13b) - ("==" . #Xe13c) - ("===" . #Xe13d) - ("==>" . #Xe13e) - ("=>" . #Xe13f) - ("=>>" . #Xe140) - ("<=" . #Xe141) - ("=<<" . #Xe142) - ("=/=" . #Xe143) - (">-" . #Xe144) - (">=" . #Xe145) - (">=>" . #Xe146) - (">>" . #Xe147) - (">>-" . #Xe148) - (">>=" . #Xe149) - (">>>" . #Xe14a) - ("<*" . #Xe14b) - ("<*>" . #Xe14c) - ("<|" . #Xe14d) - ("<|>" . #Xe14e) - ("<$" . #Xe14f) - ("<$>" . #Xe150) - ("" . #Xe101) @@ -221,11 +224,10 @@ "Defines the character mappings for ligatures for Iosevka.") (defun +pretty-code|setup-iosevka-ligatures () - (set-fontset-font t '(#Xe100 . #Xe16f) "Iosevka") + (set-fontset-font t '(#Xe100 . #Xe16f) +pretty-code-iosevka-font-name) (setq-default prettify-symbols-alist (append prettify-symbols-alist +pretty-code-iosevka-font-ligatures))) -(add-hook! 'doom-init-ui-hook #'+pretty-code|setup-iosevka-ligatures) - +(add-hook 'doom-init-ui-hook #'+pretty-code|setup-iosevka-ligatures) diff --git a/modules/ui/pretty-code/autoload/settings.el b/modules/ui/pretty-code/autoload.el similarity index 100% rename from modules/ui/pretty-code/autoload/settings.el rename to modules/ui/pretty-code/autoload.el diff --git a/modules/ui/pretty-code/autoload/autoload.el b/modules/ui/pretty-code/autoload/autoload.el deleted file mode 100644 index 5e63825c1..000000000 --- a/modules/ui/pretty-code/autoload/autoload.el +++ /dev/null @@ -1,27 +0,0 @@ -;;; ui/pretty-code/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defvar +pretty-code-enabled-modes t - "List of major modes in which `prettify-symbols-mode' should be enabled. -If t, enable it everywhere. If the first element is 'not, enable it in any mode -besides what is listed.") - - -;;;###autoload -(defun +pretty-code|init-pretty-symbols () - "Enabled `prettify-symbols-mode'. - -If the current major mode is disabled in `+pretty-code-enabled-modes', this -function does nothing. Otherwise, it sets the value of -`prettify-code-symbols-alist' according to `+pretty-code-symbols-alist' for the -current major mode." - (when (or (eq +pretty-code-enabled-modes 't) - (if (eq (car +pretty-code-enabled-modes 'not)) - (not (memq major-mode (cdr +pretty-code-enabled-modes))) - (memq major-mode +pretty-code-enabled-modes))) - (setq prettify-symbols-alist - (append (alist-get major-mode +pretty-code-symbols-alist) - (default-value 'prettify-symbols-alist))) - (when prettify-symbols-mode - (prettify-symbols-mode -1)) - (prettify-symbols-mode +1))) diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index 4bea61304..10738bd6e 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -5,7 +5,31 @@ ((featurep! +iosevka) (load! "+iosevka"))) +(defvar +pretty-code-enabled-modes t + "List of major modes in which `prettify-symbols-mode' should be enabled. +If t, enable it everywhere. If the first element is 'not, enable it in any mode +besides what is listed.") + ;; When you get to the right edge, it goes back to how it normally prints (setq prettify-symbols-unprettify-at-point 'right-edge) -(add-hook! 'after-change-major-mode-hook #'+pretty-code|init-pretty-symbols) +(defun +pretty-code|init-pretty-symbols () + "Enabled `prettify-symbols-mode'. + +If the current major mode is disabled in `+pretty-code-enabled-modes', this +function does nothing. Otherwise, it sets the value of +`prettify-code-symbols-alist' according to `+pretty-code-symbols-alist' for the +current major mode." + (unless (eq major-mode 'fundamental-mode) + (when (or (eq +pretty-code-enabled-modes 't) + (if (eq (car +pretty-code-enabled-modes 'not)) + (not (memq major-mode (cdr +pretty-code-enabled-modes))) + (memq major-mode +pretty-code-enabled-modes))) + (setq prettify-symbols-alist + (append (alist-get major-mode +pretty-code-symbols-alist) + (default-value 'prettify-symbols-alist))) + (when prettify-symbols-mode + (prettify-symbols-mode -1)) + (prettify-symbols-mode +1)))) + +(add-hook 'after-change-major-mode-hook #'+pretty-code|init-pretty-symbols) From 2fa8599364ededb83df6893abc4b87f660504604 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 20:42:51 +0200 Subject: [PATCH 2339/4235] ui/pretty-code: fix wrong-number-of-args: eq error And minor refactor --- modules/ui/pretty-code/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index 10738bd6e..e0eb89e0d 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -21,12 +21,12 @@ function does nothing. Otherwise, it sets the value of `prettify-code-symbols-alist' according to `+pretty-code-symbols-alist' for the current major mode." (unless (eq major-mode 'fundamental-mode) - (when (or (eq +pretty-code-enabled-modes 't) - (if (eq (car +pretty-code-enabled-modes 'not)) + (when (or (eq +pretty-code-enabled-modes t) + (if (eq (car +pretty-code-enabled-modes) 'not) (not (memq major-mode (cdr +pretty-code-enabled-modes))) (memq major-mode +pretty-code-enabled-modes))) (setq prettify-symbols-alist - (append (alist-get major-mode +pretty-code-symbols-alist) + (append (cdr (assq major-mode +pretty-code-symbols-alist)) (default-value 'prettify-symbols-alist))) (when prettify-symbols-mode (prettify-symbols-mode -1)) From f5f87ee0a3f8f5b29122ebb2b50551ed4c5240c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 22:38:01 +0200 Subject: [PATCH 2340/4235] Refactor lang/ruby & remove +ruby-ask-for-server To conform to conventions and remove redundancies (like activating flycheck-mode, which is global now). Also, should now silently create a robe server. --- modules/lang/ruby/config.el | 78 ++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 45 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index dd519630f..0757982ff 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -6,42 +6,25 @@ (defvar-local +ruby-current-version nil "The currently active ruby version.") -(defvar +ruby-ask-for-server t - "Ask for a server whenever you open a ruby buffer. -Robe will only ask once if you say yes, but if you say no and keep opening -buffers, itll ask every time.") +;; +;; Plugins +;; -;; FIXME: Add these? -;; does anyone actually use these? -;; (map! :map ruby-mode-map -;; :localleader -;; :prefix "r" -;; :nv "b" #'ruby-toggle-block -;; :nv "ec" #'ruby-refactor-extract-constant -;; :nv "el" #'ruby-refactor-extract-to-let -;; :nv "em" #'ruby-refactor-extract-to-method -;; :nv "ev" #'ruby-refactor-extract-local-variable -;; :nv "ad" #'ruby-refactor-add-parameter -;; :nv "cc" #'ruby-refactor-convert-post-conditional)) (def-package! enh-ruby-mode - :mode "\\.rb$" - :mode "\\.rake$" - :mode "\\.gemspec$" - :mode "\\.\\(pry\\|irb\\)rc$" - :mode "/\\(Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file$" + :mode "\\.rb\\'" + :mode "\\.rake\\'" + :mode "\\.gemspec\\'" + :mode "\\.\\(?:pry\\|irb\\)rc\\'" + :mode "/\\(?:Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file\\'" :config (set-env! "RBENV_ROOT") - (add-hook 'enh-ruby-mode-hook #'flycheck-mode) (set-electric! 'enh-ruby-mode :words '("else" "end" "elsif")) - (setq sp-max-pair-length 6) ;; so class and module work (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' - ;; FIXME: needed?? - (after! smartparens-ruby - (sp-local-pair 'enh-ruby-mode "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler))) + ;; so class and module pairs work + (setq-hook! 'enh-ruby-mode-hook sp-max-pair-length 6) + ;; Version management with rbenv (defun +ruby|add-version-to-modeline () "Add version string to the major mode in the modeline." @@ -65,34 +48,40 @@ environment variables." (setenv "RBENV_VERSION" version-str)))) (add-hook 'enh-ruby-mode-hook #'+ruby|detect-rbenv-version))) + (def-package! yard-mode :hook enh-ruby-mode) + (def-package! rbenv :after enh-ruby-mode - :when (executable-find "rbenv") :config - (global-rbenv-mode)) + (when (executable-find "rbenv") + (global-rbenv-mode +1))) + (def-package! rubocop :hook (enh-ruby-mode . rubocop-mode) :config - (map! :map rubocop-mode + (map! :map rubocop-mode-map :localleader :nv "f" #'rubocop-check-current-file :nv "F" #'rubocop-autocorrect-current-file :nv "p" #'rubocop-check-project :nv "P" #'rubocop-autocorrect-project)) + ;; FIXME: Clean up all processes from this/inf-ruby when all the ruby buffers ;; are closed (def-package! robe :hook (enh-ruby-mode . robe-mode) :init - ;; robe-start erros if you hit no. - ;; FIXME: Once hit no, itll ask every time you open a new buffer. This is - ;; defined behaviour but not what we want! - (when +ruby-ask-for-server - (add-hook! 'enh-ruby-mode-hook (ignore-errors (call-interactively #'robe-start)))) + ;; robe-start errors if you hit no. + (defun +ruby|init-robe () + (when (executable-find "ruby") + (cl-letf (((symbol-function #'yes-or-no-p) + (lambda (&rest _) t))) + (ignore-errors (robe-start))))) + (add-hook 'enh-ruby-mode-hook #'+ruby|init-robe) :config (set-company-backend! 'robe-mode 'company-robe)) @@ -116,7 +105,7 @@ environment variables." ;; (even for things unrelated to ruby/rspec). Even if the function were ;; autoloaded, it seems silly to add this advice before rspec-mode is loaded, ;; so remove it anyway! - (advice-remove 'compilation-buffer-name 'rspec-compilation-buffer-name-wrapper) + (advice-remove 'compilation-buffer-name #'rspec-compilation-buffer-name-wrapper) :config (remove-hook 'enh-ruby-mode-hook #'rspec-enable-appropriate-mode) (map! :map (rspec-mode-map rspec-verifiable-mode-map) @@ -125,17 +114,16 @@ environment variables." :n "r" #'rspec-rerun :n "a" #'rspec-verify-all :n "s" #'rspec-verify-single - :n "v" #'rspec-verify)) + :n "v" #'rspec-verify) + + ;; Evil integration + (when (featurep! :feature evil +everywhere) + (add-hook! '(rspec-mode-hook rspec-verifiable-mode-hook) + #'evil-normalize-keymaps))) + (def-package! company-inf-ruby :when (featurep! :completion company) :after inf-ruby :config (set-company-backend! 'inf-ruby-mode 'company-inf-ruby)) -;; -;; Evil integration -;; - -(when (featurep! :feature evil +everywhere) - (add-hook! '(rspec-mode-hook rspec-verifiable-mode-hook) - #'evil-normalize-keymaps)) From 00d6e7b9caa7c5538caf45e8ef48720fa5779e77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 23:11:26 +0200 Subject: [PATCH 2341/4235] Cleanup robe processes killing last ruby buffer Experimental? --- modules/lang/ruby/autoload.el | 15 +++++++++++++++ modules/lang/ruby/config.el | 7 ++++--- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 modules/lang/ruby/autoload.el diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el new file mode 100644 index 000000000..8f9519283 --- /dev/null +++ b/modules/lang/ruby/autoload.el @@ -0,0 +1,15 @@ +;;; lang/ruby/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +ruby|cleanup-robe-servers () + "Clean up dangling inf robe processes if there are no more `enh-ruby-mode' +buffers open." + ;; FIXME This should wait X seconds before cleaning up + (unless (or (not robe-mode) (doom-buffers-in-mode 'enh-ruby-mode)) + (let (inf-buffer kill-buffer-query-functions) + (while (setq inf-buffer (robe-inf-buffer)) + (let ((process (get-buffer-process inf-buffer)) + confirm-kill-processes) + (when (processp process) + (kill-process (get-buffer-process inf-buffer)) + (kill-buffer inf-buffer))))))) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0757982ff..0f6ade8b8 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -78,9 +78,10 @@ environment variables." ;; robe-start errors if you hit no. (defun +ruby|init-robe () (when (executable-find "ruby") - (cl-letf (((symbol-function #'yes-or-no-p) - (lambda (&rest _) t))) - (ignore-errors (robe-start))))) + (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_) t))) + (ignore-errors (robe-start)) + (when (robe-running-p) + (add-hook 'kill-buffer-hook #'+ruby|cleanup-robe-servers nil t))))) (add-hook 'enh-ruby-mode-hook #'+ruby|init-robe) :config (set-company-backend! 'robe-mode 'company-robe)) From 0a577f3a0e5752f409acaef342dac6ea95204573 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 23:56:50 +0200 Subject: [PATCH 2342/4235] lang/python: fix pyenv version detection #736 --- modules/lang/python/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 10630b08e..69521d61a 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -67,14 +67,14 @@ is loaded.") (add-hook 'python-mode-hook #'+python|add-version-to-modeline) (if (not (executable-find "pyenv")) - (setq +python-current-version (string-trim (shell-command-to-string "python --version 2>&1 | cut -d' ' -f2"))) + (setq-default +python-current-version (string-trim (shell-command-to-string "python --version 2>&1 | cut -d' ' -f2"))) (setq +python-pyenv-root (string-trim (shell-command-to-string "pyenv root")) +python-pyenv-versions (split-string (shell-command-to-string "pyenv versions --bare") "\n" t)) (defun +python|detect-pyenv-version () "Detect the pyenv version for the current project and set the relevant environment variables." - (when-let* ((version-str (shell-command-to-string "python --version 2>&1 | cut -d' ' -f2"))) + (when-let* ((version-str (shell-command-to-string "PYENV_VERSION= python --version 2>&1 | cut -d' ' -f2"))) (setq version-str (string-trim version-str) +python-current-version version-str) (let ((pyenv-current-path (concat +python-pyenv-root "/versions/" version-str))) From a0b09643556505aae9de8d5704dd213fef4a2484 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 6 Jul 2018 23:58:11 +0200 Subject: [PATCH 2343/4235] lang/ruby: fix rbenv version detection --- modules/lang/ruby/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0f6ade8b8..ce093f8b4 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -35,13 +35,13 @@ (add-hook 'enh-ruby-mode-hook #'+ruby|add-version-to-modeline) (if (not (executable-find "rbenv")) - (setq +ruby-current-version (string-trim (shell-command-to-string "ruby --version 2>&1 | cut -d' ' -f2"))) + (setq-default +ruby-current-version (string-trim (shell-command-to-string "ruby --version 2>&1 | cut -d' ' -f2"))) (setq +ruby-rbenv-versions (split-string (shell-command-to-string "rbenv versions --bare") "\n" t)) (defun +ruby|detect-rbenv-version () "Detect the rbenv version for the current project and set the relevant environment variables." - (when-let* ((version-str (shell-command-to-string "ruby --version 2>&1 | cut -d' ' -f2"))) + (when-let* ((version-str (shell-command-to-string "RBENV_VERSION= ruby --version 2>&1 | cut -d' ' -f2"))) (setq version-str (string-trim version-str) +ruby-current-version version-str) (when (member version-str +ruby-rbenv-versions) From cf55049a17f1556c5b0fb1b0d9278b48e8531612 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 7 Jul 2018 00:32:45 +0200 Subject: [PATCH 2344/4235] Disable sp-ruby-*-handler handlers correctly Reported by @ar1a --- modules/config/default/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 98531f432..dc7df3979 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -42,8 +42,8 @@ ;; Major-mode specific fixes (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" - :pre-handlers '(:rem sp-ruby-prehandler) - :post-handlers '(:rem sp-ruby-posthandler)) + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) ;; Expand {|} => { | } ;; Expand {|} => { From 1a068f82f1b0a74f541d78aeecf3c5fd97eddfce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 7 Jul 2018 11:41:24 +0200 Subject: [PATCH 2345/4235] Add +workspace/load-last-session And fix the load last session button on dashboard. --- modules/config/default/+bindings.el | 4 ++-- modules/feature/workspaces/autoload/workspaces.el | 6 ++++++ modules/ui/doom-dashboard/config.el | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 3181eaad3..f455055f9 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -530,7 +530,7 @@ :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 "Load a past 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 @@ -538,7 +538,7 @@ :desc "Delete session" :n "X" #'+workspace/kill-session :desc "Delete this workspace" :n "d" #'+workspace/delete :desc "Rename workspace" :n "r" #'+workspace/rename - :desc "Restore last session" :n "R" (λ! (+workspace/load-session)) + :desc "Restore last session" :n "R" #'+workspace/load-last-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)) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 3766f02c5..0c9cb9512 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -248,6 +248,12 @@ session." (+workspace-message (format "'%s' workspace loaded" name) 'success)) '(error (+workspace-error (cadr ex) t)))) +;;;###autoload +(defun +workspace/load-last-session () + "Restore last session and switch to it." + (interactive) + (+workspace/load-session)) + ;;;###autoload (defun +workspace/save-session (&optional name) "Save the current session. If called with C-u, prompt you for the name to save diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index cf687773b..4dad0c44c 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -46,7 +46,7 @@ Possible values: (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) :face (:inherit (font-lock-keyword-face bold)) - :action +workspace/load-session) + :action +workspace/load-last-session) ("See agenda for this week" :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) :when (fboundp 'org-agenda-list) From 10daa435f7c396db8348619aee8233ce3e99d3e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 7 Jul 2018 11:44:47 +0200 Subject: [PATCH 2346/4235] Document :ignore property in set-popup-rule! --- modules/ui/popup/autoload/settings.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 9f98b53c9..3d9d82f65 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -61,6 +61,11 @@ or b) a function that takes no arguments and returns a boolean. PLIST can be made up of any of the following properties: +:ignore BOOL + If BOOL is non-nil, popups matching PREDICATE will not be handled by the popup + system. Use this for buffers that have their own window management system like + magit or helm. + :actions ACTIONS ACTIONS is a list of functions or an alist containing (FUNCTION . ALIST). See `display-buffer''s second argument for more information on its format and what From ee9174861328739fbfa866162bef748c160ab076 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 7 Jul 2018 13:14:50 +0200 Subject: [PATCH 2347/4235] Document doom-cleanup-hook --- core/autoload/buffers.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index f1050c72a..f05ba64ae 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -34,6 +34,11 @@ See `doom-real-buffer-p' for more information.") "The name of the buffer to fall back to if no other buffers exist (will create it if it doesn't exist).") +;;;###autoload +(defvar doom-cleanup-hook () + "A list of hooks run when `doom/cleanup-session' is run, meant to clean up +leftover buffers and processes.") + ;; ;; Functions From 04c66829ebaf9f60186bc22cc5a2f671e4233339 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 8 Jul 2018 13:43:18 +0200 Subject: [PATCH 2348/4235] Don't init prettify-symbols-mode in special modes Or eshell, term and comint modes. --- modules/ui/pretty-code/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index e0eb89e0d..6b474e6a6 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -14,13 +14,15 @@ besides what is listed.") (setq prettify-symbols-unprettify-at-point 'right-edge) (defun +pretty-code|init-pretty-symbols () - "Enabled `prettify-symbols-mode'. + "Enable `prettify-symbols-mode'. -If the current major mode is disabled in `+pretty-code-enabled-modes', this -function does nothing. Otherwise, it sets the value of -`prettify-code-symbols-alist' according to `+pretty-code-symbols-alist' for the -current major mode." - (unless (eq major-mode 'fundamental-mode) +If in fundamental-mode, or a mode derived from special, comint, eshell or term +modes, this function does nothing. + +Otherwise it builds `prettify-code-symbols-alist' according to +`+pretty-code-symbols-alist' for the current major-mode." + (unless (or (eq major-mode 'fundamental-mode) + (derived-mode-p 'special-mode 'comint-mode 'eshell-mode 'term-mode)) (when (or (eq +pretty-code-enabled-modes t) (if (eq (car +pretty-code-enabled-modes) 'not) (not (memq major-mode (cdr +pretty-code-enabled-modes))) From 1b98422291260535b4cdf4cc4e04c92593dfcc9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 15:29:38 +0200 Subject: [PATCH 2349/4235] $* -> %* in bin/doom.cmd --- bin/doom.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom.cmd b/bin/doom.cmd index 2eeb0f2fe..810f3fb06 100644 --- a/bin/doom.cmd +++ b/bin/doom.cmd @@ -5,9 +5,9 @@ PUSHD "%~dp0" >NUL IF %1=="run" ( SHIFT - emacs -Q $* -l init.el -f "doom|run-all-startup-hooks" + emacs -Q %* -l init.el -f "doom|run-all-startup-hooks" ) ELSE ( - emacs --quick --script ./doom -- $* + emacs --quick --script ./doom -- %* ) POPD >NUL From 4941e327f4a297ab5b9718825009540d1bca10f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 15:33:31 +0200 Subject: [PATCH 2350/4235] General refactor for readability + Removes redundant/unhelpful comments + Renames functions, hooks and variables to be self-documenting + Use add-to-list to ensure idempotency (and is more performant) --- core/core-cli.el | 6 ++-- core/core-lib.el | 23 ++++++++------- core/core-ui.el | 3 +- core/core.el | 20 +++++++------ modules/feature/snippets/config.el | 9 ++++-- modules/feature/workspaces/config.el | 43 ++++++++++++---------------- modules/lang/org/+attach.el | 18 +++++------- modules/lang/org/+babel.el | 7 ++--- modules/lang/org/autoload/org.el | 8 +++--- modules/lang/org/config.el | 41 +++++++++++++------------- modules/tools/magit/config.el | 6 ++-- 11 files changed, 89 insertions(+), 95 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 65a818ca9..0b5e21931 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -592,8 +592,7 @@ modified." (print! (green "✓ Clean up autoloads"))) ;; Byte compile it to give the file a chance to reveal errors. (doom--byte-compile-file doom-autoload-file) - (when (and noninteractive (not (daemonp))) - (doom--server-load doom-autoload-file)) + (doom--server-load doom-autoload-file) t))) @@ -668,8 +667,7 @@ This should be run whenever your `doom!' block or update your packages." (doom--cleanup-package-autoloads) (print! (green "✓ Removed load-path/auto-mode-alist entries")))) (doom--byte-compile-file doom-package-autoload-file) - (when (and noninteractive (not (daemonp))) - (doom--server-load doom-package-autoload-file)) + (doom--server-load doom-package-autoload-file) t)) diff --git a/core/core-lib.el b/core/core-lib.el index 09f897c86..d87a170f7 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -282,13 +282,14 @@ compilation. This will no-op on features that have been disabled by the user." (save-silently t)) ,@forms)))) -(defmacro add-transient-hook! (hook &rest forms) - "Attaches transient forms to a HOOK. +(defmacro add-transient-hook! (hook-or-function &rest forms) + "Attaches a self-removing function to HOOK-OR-FUNCTION. -This means FORMS will be evaluated once when that function/hook is first -invoked, then never again. +FORMS are evaluated once when that function/hook is first invoked, then never +again. -HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." +HOOK-OR-FUNCTION can be a quoted hook or a sharp-quoted function (which will be +advised)." (declare (indent 1)) (let ((append (if (eq (car forms) :after) (pop forms))) (fn (if (symbolp (car forms)) @@ -298,14 +299,14 @@ HOOK can be a quoted hook or a sharp-quoted function (which will be advised)." (fset ',fn (lambda (&rest _) ,@forms - (cond ((functionp ,hook) (advice-remove ,hook #',fn)) - ((symbolp ,hook) (remove-hook ,hook #',fn))) + (cond ((functionp ,hook-or-function) (advice-remove ,hook-or-function #',fn)) + ((symbolp ,hook-or-function) (remove-hook ,hook-or-function #',fn))) (unintern ',fn nil))) - (cond ((functionp ,hook) - (advice-add ,hook ,(if append :after :before) #',fn)) - ((symbolp ,hook) + (cond ((functionp ,hook-or-function) + (advice-add ,hook-or-function ,(if append :after :before) #',fn)) + ((symbolp ,hook-or-function) (put ',fn 'permanent-local-hook t) - (add-hook ,hook #',fn ,append)))))) + (add-hook ,hook-or-function #',fn ,append)))))) (defmacro add-hook! (&rest args) "A convenience macro for `add-hook'. Takes, in order: diff --git a/core/core-ui.el b/core/core-ui.el index 865a6accf..c67888738 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -287,8 +287,7 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (1- (line-end-position))) ((or (eobp) (save-excursion (forward-line) (eobp))) (line-end-position)) - (t - (line-beginning-position 2))))) + ((line-beginning-position 2))))) (setq hl-line-range-function #'doom--line-range)) (after! evil diff --git a/core/core.el b/core/core.el index 14dabc350..83a882928 100644 --- a/core/core.el +++ b/core/core.el @@ -341,30 +341,31 @@ Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." (when (or force-p (not doom-init-p)) - ;; Set this to prevent infinite recursive calls to `doom-initialize' - (setq doom-init-p t) + (setq doom-init-p t) ; Prevent infinite recursion + ;; `doom-autoload-file' tells Emacs where to load all its autoloaded ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. (when (or force-p (not (doom-initialize-autoloads doom-autoload-file))) (doom-ensure-core-directories) (doom-ensure-same-emacs-version-p) - ;; Ensure packages are set up and initialized + (require 'core-packages) (doom-ensure-packages-initialized force-p) (doom-ensure-core-packages) - ;; Regenerate `doom-autoload-file', which tells Doom where to find all its - ;; module autoloaded functions. + (unless (or force-p noninteractive) (user-error "Your doom autoloads are missing! Run `bin/doom refresh' to regenerate them"))) - ;; Loads `doom-package-autoload-file', which caches `load-path', - ;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and + + ;; Loads `doom-package-autoload-file', which loads a concatenated package + ;; autoloads file and caches `load-path', `auto-mode-alist', + ;; `Info-directory-list', `doom-disabled-packages' and ;; `package-activated-list'. A big reduction in startup time. (unless (or force-p (doom-initialize-autoloads doom-package-autoload-file) noninteractive) (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) - ;; Initialize Doom core + (require 'core-os) (unless noninteractive (add-hook! 'emacs-startup-hook @@ -375,7 +376,8 @@ to least)." (require 'core-keybinds))) (defun doom-initialize-autoloads (file) - "Tries to load FILE (an autoloads file). Return t on success, nil otherwise." + "Tries to load FILE (an autoloads file). Return t on success, throws an error +in interactive sessions, nil otherwise (but logs a warning)." (condition-case e (load (file-name-sans-extension file) 'noerror 'nomessage) ((debug error) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 80276db41..bbc3a4eeb 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -24,17 +24,22 @@ yas-also-auto-indent-first-line t yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) yas-triggers-in-field t) ; Allow nested snippets + (add-to-list 'yas-snippet-dirs '+snippets-dir nil #'eq) + ;; Register `def-project-mode!' modes with yasnippet. This enables project ;; specific snippet libraries (e.g. for Laravel, React or Jekyll projects). (add-hook 'doom-project-hook #'+snippets|enable-project-modes) + ;; Exit snippets on ESC from normal mode (add-hook 'doom-escape-hook #'yas-abort-snippet) - ;; Fix an error caused by smartparens interfering with yasnippet bindings + (after! smartparens + ;; tell smartparens overlays not to interfere with yasnippet keybinds (advice-add #'yas-expand :before #'sp-remove-active-pair-overlay)) - ;; Better `yas-insert-snippet' for evil users + (when (featurep! :feature evil) + ;; evil visual-mode integration for `yas-insert-snippet' (define-key yas-minor-mode-map [remap yas-insert-snippet] #'+snippets/expand-on-region))) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 8875de6ab..76ff118e9 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -13,8 +13,7 @@ ;; NOTE persp-mode requires `workgroups' for file persistence in Emacs 24.4. (defvar +workspaces-main "main" - "The name of the primary and initial workspace, which cannot be deleted or -renamed.") + "The name of the primary and initial workspace, which cannot be deleted.") (defvar +workspaces-switch-project-function #'doom-project-find-file "The function to run after `projectile-switch-project' or @@ -27,7 +26,7 @@ new project directory.") stored in `persp-save-dir'.") ;; If emacs is passed --restore, restore the last session on startup. This is -;; particularly useful for the `+workspace/restart-emacs-then-restore' command. +;; used by the `+workspace/restart-emacs-then-restore' command. (defun +workspaces-restore-last-session (&rest _) (add-hook 'emacs-startup-hook #'+workspace/load-session :append)) (add-to-list 'command-switch-alist (cons "--restore" #'+workspaces-restore-last-session)) @@ -51,7 +50,7 @@ stored in `persp-save-dir'.") (+workspaces|init-frame (selected-frame)))) (defun +workspaces|init-frame (frame) - "Make sure a main workspace exists and is switched to, if FRAME isn't in any + "Ensure a main workspace exists and is switched to, if FRAME isn't in any workspace. Also ensures that the *Warnings* buffer will be visible in main. Uses `+workspaces-main' to determine the name of the main workspace." @@ -60,10 +59,10 @@ Uses `+workspaces-main' to determine the name of the main workspace." (unless noninteractive (let (persp-before-switch-functions persp-activated-functions) (with-selected-frame frame - ;; The default perspective persp-mode makes (defined by - ;; `persp-nil-name') is special and doesn't actually represent a real - ;; persp object, so buffers can't really be assigned to it, among - ;; other quirks. We create a *real* main workspace to fill this role. + ;; The default perspective persp-mode creates (`persp-nil-name') is + ;; special and doesn't represent a real persp object, so buffers can't + ;; really be assigned to it, among other quirks. We create a *real* + ;; main workspace to fill this role. (unless (persp-get-by-name +workspaces-main) (persp-add-new +workspaces-main)) ;; Switch to it if we aren't auto-loading the last session @@ -73,9 +72,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." ;; We want to know where we are in every new daemon frame (when (daemonp) (run-at-time 0.1 nil #'+workspace/display)) - ;; The warnings buffer gets swallowed by creating - ;; `+workspaces-main', so we display it manually, if it exists (fix - ;; #319). + ;; Fix #319: the warnings buffer gets swallowed by creating + ;; `+workspaces-main', so we display it manually, if it exists. (when-let* ((warnings (get-buffer "*Warnings*"))) (save-excursion (display-buffer-in-side-window @@ -93,21 +91,22 @@ Uses `+workspaces-main' to determine the name of the main workspace." persp-auto-resume-time -1 ; Don't auto-load on startup persp-auto-save-opt (if noninteractive 0 1)) ; auto-save on kill + (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) + + (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) + ;; Ensure buffers we've opened/switched to are auto-added to the current ;; perspective (setq persp-add-buffer-on-find-file t persp-add-buffer-on-after-change-major-mode t) (add-hook 'persp-add-buffer-on-after-change-major-mode-filter-functions #'doom-unreal-buffer-p) - ;; bootstrap (defun +workspaces|init-persp-mode () (cond (persp-mode - ;; Ensure `persp-kill-buffer-query-function' is last in - ;; kill-buffer-query-functions + ;; `persp-kill-buffer-query-function' must be last (remove-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function) (add-hook 'kill-buffer-query-functions 'persp-kill-buffer-query-function t) - ;; Remap `buffer-list' to current workspace's buffers in - ;; `doom-buffer-list' + ;; Restrict buffer list to workspace (advice-add #'doom-buffer-list :override #'+workspace-buffer-list)) ((advice-remove #'doom-buffer-list #'+workspace-buffer-list)))) (add-hook 'persp-mode-hook #'+workspaces|init-persp-mode) @@ -120,22 +119,16 @@ Uses `+workspaces-main' to determine the name of the main workspace." 'auto-create))) (add-hook 'persp-after-load-state-functions #'+workspaces|leave-nil-perspective) - ;; Modify `delete-window' to close the workspace if used on the last window + ;; Delete the current workspace if closing the last open window (define-key! persp-mode-map - [remap restart-emacs] #'+workspace/restart-emacs-then-restore [remap delete-window] #'+workspace/close-window-or-workspace [remap evil-delete-window] #'+workspace/close-window-or-workspace) - ;; only auto-save when real buffers are present - (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) - ;; On `doom/cleanup-session', delete buffers associated with no perspectives - (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) ;; per-frame workspaces (setq persp-init-frame-behaviour t persp-init-new-frame-behaviour-override nil persp-interactive-init-frame-behaviour-override #'+workspaces|associate-frame persp-emacsclient-init-frame-behaviour-override #'+workspaces|associate-frame) - ;; delete frame associated with workspace, if it exists (add-hook 'delete-frame-functions #'+workspaces|delete-associated-workspace) ;; per-project workspaces, but reuse current workspace if empty @@ -163,8 +156,8 @@ Uses `+workspaces-main' to determine the name of the main workspace." (add-hook 'projectile-after-switch-project-hook #'+workspaces|switch-to-project) - ;; In some scenarios, persp-mode throws error an error when Emacs tries to - ;; die, preventing its death. + ;; In some scenarios, persp-mode throws error when Emacs tries to die, + ;; preventing its death and trapping us in Emacs. (defun +workspaces*ignore-errors-on-kill-emacs (orig-fn) (ignore-errors (funcall orig-fn))) (advice-add #'persp-kill-emacs-h :around #'+workspaces*ignore-errors-on-kill-emacs) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index ac9160886..09ed06832 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -31,11 +31,9 @@ (def-package! org-download :commands (org-download-dnd org-download-dnd-base64) :init - ;; Add these myself, so that org-download is lazy-loaded... - (setq dnd-protocol-alist - `(("^\\(https?\\|ftp\\|file\\|nfs\\):" . +org-attach-download-dnd) - ("^data:" . org-download-dnd-base64) - ,@dnd-protocol-alist)) + ;; Add these manually so that org-download is lazy-loaded... + (add-to-list 'dnd-protocol-alist '("^\\(https?\\|ftp\\|file\\|nfs\\):" . +org-attach-download-dnd)) + (add-to-list 'dnd-protocol-alist '("^data:" . org-download-dnd-base64)) (advice-add #'org-download-enable :override #'ignore) :config @@ -78,8 +76,7 @@ (setq org-attach-directory (expand-file-name +org-attach-dir org-directory)) ;; A shorter link to attachments - (push (cons "attach" (abbreviate-file-name org-attach-directory)) - org-link-abbrev-alist) + (add-to-list 'org-link-abbrev-alist (cons "attach" (abbreviate-file-name org-attach-directory))) (org-link-set-parameters "attach" @@ -93,10 +90,9 @@ 'error))) (after! projectile - (push (car (last (split-string +org-attach-dir "/" t))) - projectile-globally-ignored-directories)) + (add-to-list 'projectile-globally-ignored-directories + (car (last (split-string +org-attach-dir "/" t))))) (after! recentf - (push (format "%s.+$" (regexp-quote org-attach-directory)) - recentf-exclude))) + (add-to-list 'recentf-exclude (format "%s.+$" (regexp-quote org-attach-directory))))) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index ab151c4bd..0d4ec79ca 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -40,12 +40,11 @@ string). Stops at the first function to return non-nil.") t))) (advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library) - ;; I prefer C-c C-c for confirming over the default C-c ' + ;; I prefer C-c C-c over C-c ' (define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) - ;; In a recent update, `org-babel-get-header' was removed from org-mode, which - ;; is something a fair number of babel plugins use. So until those plugins - ;; update, this polyfill will do: + ;; `org-babel-get-header' was removed from org in 9.0. Quite a few babel + ;; plugins use it, so until those plugins update, this polyfill will do: (defun org-babel-get-header (params key &optional others) (cl-loop with fn = (if others #'not #'identity) for p in params diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 9fca302b7..343e341b4 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -268,7 +268,7 @@ wrong places)." (org-toggle-checkbox '(4))) ;;;###autoload -(defalias #'+org/toggle-fold #'+org|toggle-only-current-fold) +(defalias #'+org/toggle-fold #'+org|cycle-only-current-subtree) ;;;###autoload (defun +org/open-fold () @@ -319,7 +319,7 @@ another level of headings on each invocation." ;; ;;;###autoload -(defun +org|delete-backward-char () +(defun +org|delete-backward-char-and-realign-table-maybe () "TODO" (when (eq major-mode 'org-mode) (org-check-before-invisible-edit 'delete-backward) @@ -388,7 +388,7 @@ another level of headings on each invocation." t)) ;;;###autoload -(defun +org|toggle-only-current-fold (&optional arg) +(defun +org|cycle-only-current-subtree (&optional arg) "Toggle the local fold at the point (as opposed to cycling through all levels with `org-cycle')." (interactive "P") @@ -416,7 +416,7 @@ with `org-cycle')." ;; ;;;###autoload -(defun +org*return-indent-in-src-blocks () +(defun +org*fix-newline-and-indent-in-src-blocks () "Try to mimic `newline-and-indent' with correct indentation in src blocks." (when (org-in-src-block-p t) (org-babel-do-in-edit-buffer diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a5690b240..1cada2d6e 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -30,7 +30,7 @@ (add-hook 'org-load-hook #'+org|setup-evil) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config - ;; only support the `evil-org-key-theme' workflow + ;; change `evil-org-key-theme' instead (advice-add #'evil-org-set-key-theme :override #'ignore) (def-package! evil-org-agenda :after org-agenda @@ -44,7 +44,7 @@ (add-hook! 'org-load-hook #'(org-crypt-use-before-save-magic +org|setup-ui - +org|setup-popups-rules + +org|setup-popup-rules +org|setup-agenda +org|setup-keybinds +org|setup-hacks @@ -132,7 +132,7 @@ unfold to point on startup." org-agenda-start-on-weekday nil org-agenda-start-day "-3d")) -(defun +org|setup-popups-rules () +(defun +org|setup-popup-rules () "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." (set-popup-rules! '(("^\\*Org Links" :slot -1 :vslot -1 :size 2 :ttl 0) @@ -193,7 +193,7 @@ unfold to point on startup." ;; Previews are usually rendered with light backgrounds, so ensure their ;; background (and foreground) match the current theme. - (defun +org|update-latex-faces () + (defun +org|update-latex-preview-background-color () (setq-default org-format-latex-options (plist-put org-format-latex-options @@ -201,7 +201,7 @@ unfold to point on startup." (face-attribute (or (cadr (assq 'default face-remapping-alist)) 'default) :background nil t)))) - (add-hook 'doom-load-theme-hook #'+org|update-latex-faces) + (add-hook 'doom-load-theme-hook #'+org|update-latex-preview-background-color) ;; Custom links (setq org-link-abbrev-alist @@ -246,18 +246,18 @@ unfold to point on startup." "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies between the two." (add-hook 'doom-escape-hook #'+org|remove-occur-highlights) + ;; C-a & C-e act like `doom/backward-to-bol-or-indent' and ;; `doom/forward-to-last-non-comment-or-eol', but with more org awareness. (setq org-special-ctrl-a/e t) - ;; Try indenting normally or expanding snippets on TAB - (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) - ;; Tell `doom/delete-backward-char' to respect org tables - (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char) - ;; Don't split current tree on M-RET + (setq org-M-RET-may-split-line nil ;; insert new headings after current subtree rather than inside it org-insert-heading-respect-content t) - ;; Custom keybinds + + (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) + (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char-and-realign-table-maybe) + (define-key! org-mode-map (kbd "C-c C-S-l") #'+org/remove-link (kbd "C-c C-i") #'org-toggle-inline-images @@ -268,20 +268,20 @@ between the two." ;; In case this hook is used in an advice on `evil-org-set-key-theme', this ;; prevents recursive requires. (unless args (require 'evil-org)) - ;; By default, TAB cycles the visibility of all children under the current - ;; tree between three states. I want to toggle the tree between two states, - ;; without affecting its children. - (add-hook 'org-tab-first-hook #'+org|toggle-only-current-fold t) - ;; Fix newline-and-indent behavior in src blocks - (advice-add #'org-return-indent :after #'+org*return-indent-in-src-blocks) + + (add-hook 'org-tab-first-hook #'+org|cycle-only-current-subtree t) + (advice-add #'org-return-indent :after #'+org*fix-newline-and-indent-in-src-blocks) + ;; Fix o/O creating new list items in the middle of nested plain lists. Only ;; has an effect when `evil-org-special-o/O' has `item' in it (not the ;; default). (advice-add #'evil-org-open-below :around #'+org*evil-org-open-below) - ;; Undo `evil-collection-outline' + + ;; Undo keybinds in `evil-collection-outline' (evil-define-key* 'normal outline-mode-map "^" nil [backtab] nil + "\M-j" nil "\M-k" nil "\C-j" nil "\C-k" nil "]" nil "[" nil) (evil-define-key* 'insert evil-org-mode-map @@ -346,6 +346,7 @@ between the two." "Getting org to behave." ;; Don't open separate windows (setf (alist-get 'file org-link-frame-setup) #'find-file) + ;; Fix variable height org-level-N faces in the eldoc string (defun +org*fix-font-size-variation-in-eldoc (orig-fn) (cl-letf (((symbol-function 'org-format-outline-path) @@ -360,7 +361,7 @@ between the two." separator)))) (funcall orig-fn))) (advice-add #'org-eldoc-get-breadcrumb :around #'+org*fix-font-size-variation-in-eldoc) - ;; Let OS decide what to do with files when opened + (setq org-file-apps `(("pdf" . default) ("\\.x?html?\\'" . default) @@ -368,7 +369,7 @@ between the two." (directory . emacs) (t . ,(cond (IS-MAC "open -R \"%s\"") (IS-LINUX "xdg-open \"%s\""))))) - ;; Don't clobber recentf or current workspace with agenda files + (defun +org|exclude-agenda-buffers-from-workspace () (when org-agenda-new-buffers (let (persp-autokill-buffer-on-remove) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index a1631d1f8..86e895cfa 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -29,12 +29,12 @@ load everything.") magit-popup-display-buffer-action '((display-buffer-in-side-window))) (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore t) - ;; Consider magit buffers real (so they can switched to) + ;; so magit buffers can be switched to (add-hook 'magit-mode-hook #'doom|mark-buffer-as-real) - ;; no mode-line in magit popups + ;; modeline isn't helpful in magit (add-hook! '(magit-mode-hook magit-popup-mode-hook) #'hide-mode-line-mode) - ;; Clean up after magit by properly killing buffers + ;; properly kill leftover magit buffers on quit (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) From 6829f6fca263bc69c8115015e14a49b99e982aaf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 20:38:10 +0200 Subject: [PATCH 2351/4235] Fix consecutive invokations of SPC u #747 --- modules/config/default/+bindings.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index f455055f9..11f281c5f 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -748,6 +748,10 @@ ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). +;; Make SPC u SPC u possible (#747) +(define-key universal-argument-map + (kbd (concat doom-leader-key " u")) #'universal-argument-more) + ;; Fix MacOS shift+tab (when IS-MAC (define-key input-decode-map [S-iso-lefttab] [backtab])) From b8179ca236e4d8e1d03ea746b7c21af33ba5b0c1 Mon Sep 17 00:00:00 2001 From: Aidan Gilmore Date: Sat, 7 Jul 2018 17:55:26 -0400 Subject: [PATCH 2352/4235] ui/pretty-code: Added support for PragmataPro font --- modules/ui/pretty-code/+fira.el | 12 -- modules/ui/pretty-code/+pragmata-pro.el | 207 ++++++++++++++++++++++++ modules/ui/pretty-code/autoload.el | 13 ++ modules/ui/pretty-code/config.el | 4 +- 4 files changed, 223 insertions(+), 13 deletions(-) create mode 100644 modules/ui/pretty-code/+pragmata-pro.el diff --git a/modules/ui/pretty-code/+fira.el b/modules/ui/pretty-code/+fira.el index 276f8bffd..24b2982af 100644 --- a/modules/ui/pretty-code/+fira.el +++ b/modules/ui/pretty-code/+fira.el @@ -112,18 +112,6 @@ ("~~>" . #Xe169) ("%%" . #Xe16a))) -(defun +pretty-code--correct-symbol-bounds (ligature-alist) - "Prepend non-breaking spaces to a ligature. - -This way `compose-region' (called by `prettify-symbols-mode') will use the -correct width of the symbols instead of the width measured by `char-width'." - (let ((len (length (car ligature-alist))) - (acc (list (cdr ligature-alist)))) - (while (> len 1) - (setq acc (cons #X00a0 (cons '(Br . Bl) acc)) - len (1- len))) - (cons (car ligature-alist) acc))) - (defun +pretty-code|setup-fira-ligatures () (set-fontset-font t '(#Xe100 . #Xe16f) +pretty-code-fira-code-font-name) (setq-default prettify-symbols-alist diff --git a/modules/ui/pretty-code/+pragmata-pro.el b/modules/ui/pretty-code/+pragmata-pro.el new file mode 100644 index 000000000..eafa4cedd --- /dev/null +++ b/modules/ui/pretty-code/+pragmata-pro.el @@ -0,0 +1,207 @@ +;;; ui/pretty-code/+pragmata-pro.el -*- lexical-binding: t; -*- + +(defvar +pretty-code-pragmata-pro-font-name "PragmataPro" + "Name of the Pragmata Pro ligature font.") + +(defvar +pretty-code-pragmata-pro-font-ligatures + '(("!!" . #XE900) + ("!=" . #XE901) + ("!==" . #XE902) + ("!!!" . #XE903) + ("!≡" . #XE904) + ("!≡≡" . #XE905) + ("!>" . #XE906) + ("!=<" . #XE907) + ("#(" . #XE920) + ("#_" . #XE921) + ("#{" . #XE922) + ("#?" . #XE923) + ("#>" . #XE924) + ("##" . #XE925) + ("#_(" . #XE926) + ("%=" . #XE930) + ("%>" . #XE931) + ("%>%" . #XE932) + ("%<%" . #XE933) + ("&%" . #XE940) + ("&&" . #XE941) + ("&*" . #XE942) + ("&+" . #XE943) + ("&-" . #XE944) + ("&/" . #XE945) + ("&=" . #XE946) + ("&&&" . #XE947) + ("&>" . #XE948) + ("$>" . #XE955) + ("***" . #XE960) + ("*=" . #XE961) + ("*/" . #XE962) + ("*>" . #XE963) + ("++" . #XE970) + ("+++" . #XE971) + ("+=" . #XE972) + ("+>" . #XE973) + ("++=" . #XE974) + ("--" . #XE980) + ("-<" . #XE981) + ("-<<" . #XE982) + ("-=" . #XE983) + ("->" . #XE984) + ("->>" . #XE985) + ("---" . #XE986) + ("-->" . #XE987) + ("-+-" . #XE988) + ("-\\/" . #XE989) + ("-|>" . #XE98A) + ("-<|" . #XE98B) + (".." . #XE990) + ("..." . #XE991) + ("..<" . #XE992) + (".>" . #XE993) + (".~" . #XE994) + (".=" . #XE995) + ("/*" . #XE9A0) + ("//" . #XE9A1) + ("/>" . #XE9A2) + ("/=" . #XE9A3) + ("/==" . #XE9A4) + ("///" . #XE9A5) + ("/**" . #XE9A6) + (":::" . #XE9AF) + ("::" . #XE9B0) + (":=" . #XE9B1) + (":≡" . #XE9B2) + (":>" . #XE9B3) + (":=>" . #XE9B4) + (":(" . #XE9B5) + (":-(" . #XE9B6) + (":)" . #XE9B7) + (":-)" . #XE9B8) + (":/" . #XE9B9) + (":\\" . #XE9BA) + (":3" . #XE9BB) + (":D" . #XE9BC) + (":P" . #XE9BD) + (":>:" . #XE9BE) + (":<:" . #XE9BF) + ("<$>" . #XE9C0) + ("<*" . #XE9C1) + ("<*>" . #XE9C2) + ("<+>" . #XE9C3) + ("<-" . #XE9C4) + ("<<" . #XE9C5) + ("<<<" . #XE9C6) + ("<<=" . #XE9C7) + ("<=" . #XE9C8) + ("<=>" . #XE9C9) + ("<>" . #XE9CA) + ("<|>" . #XE9CB) + ("<<-" . #XE9CC) + ("<|" . #XE9CD) + ("<=<" . #XE9CE) + ("<~" . #XE9CF) + ("<~~" . #XE9D0) + ("<<~" . #XE9D1) + ("<$" . #XE9D2) + ("<+" . #XE9D3) + ("" . #XE9D4) + ("<@>" . #XE9D5) + ("<#>" . #XE9D6) + ("<%>" . #XE9D7) + ("<^>" . #XE9D8) + ("<&>" . #XE9D9) + ("" . #XE9DA) + ("<.>" . #XE9DB) + ("" . #XE9DC) + ("<\\>" . #XE9DD) + ("<\">" . #XE9DE) + ("<:>" . #XE9DF) + ("<~>" . #XE9E0) + ("<**>" . #XE9E1) + ("<<^" . #XE9E2) + ("" . #XE9EF) + ("" . #XEA66) + ("|=>" . #XEA67) + ("|==>" . #XEA68) + ("|>-" . #XEA69) + ("|<<" . #XEA6A) + ("||>" . #XEA6B) + ("|>>" . #XEA6C) + ("~=" . #XEA70) + ("~>" . #XEA71) + ("~~>" . #XEA72) + ("~>>" . #XEA73) + ("[[" . #XEA80) + ("]]" . #XEA81) + ("\">" . #XEA90)) + "Defines the character mappings for ligatures for Pragmata Pro.") + +(defun +pretty-code|setup-pragmata-pro-ligatures () + (setq-default prettify-symbols-alist + (append prettify-symbols-alist + (mapcar #'+pretty-code--correct-symbol-bounds + +pretty-code-pragmata-pro-font-ligatures)))) + +(add-hook 'doom-init-ui-hook #'+pretty-code|setup-pragmata-pro-ligatures) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 38793fb7a..bd7a0a3e0 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -44,6 +44,19 @@ font.") "An alist containing a mapping of major modes to its value for `prettify-symbols-alist'.") +;;;###autodef +(defun +pretty-code--correct-symbol-bounds (ligature-alist) + "Prepend non-breaking spaces to a ligature. + +This way `compose-region' (called by `prettify-symbols-mode') will use the +correct width of the symbols instead of the width measured by `char-width'." + (let ((len (length (car ligature-alist))) + (acc (list (cdr ligature-alist)))) + (while (> len 1) + (setq acc (cons #X00a0 (cons '(Br . Bl) acc)) + len (1- len))) + (cons (car ligature-alist) acc))) + ;;;###autodef (defun set-pretty-symbols! (modes &rest rest) "Associates string patterns with icons in certain major-modes. diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index e0eb89e0d..7f9ccf51c 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -3,7 +3,9 @@ (cond ((featurep! +fira) (load! "+fira")) ((featurep! +iosevka) - (load! "+iosevka"))) + (load! "+iosevka")) + ((featurep! +pragmata-pro) + (load! "+pragmata-pro"))) (defvar +pretty-code-enabled-modes t "List of major modes in which `prettify-symbols-mode' should be enabled. From 29c2632cab2c575916121fda0273b872ad392204 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 21:50:19 +0200 Subject: [PATCH 2353/4235] Fix infinite recursion in smerge-mode #745 Also renames +hydra-smerge -> +vc-smerge-hydra, and no longer auto-enables the hydra on smerge-mode (must find a better way). --- modules/emacs/vc/autoload.el | 12 ++++++------ modules/emacs/vc/config.el | 4 +--- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/emacs/vc/autoload.el b/modules/emacs/vc/autoload.el index f9e50568f..7460edcba 100644 --- a/modules/emacs/vc/autoload.el +++ b/modules/emacs/vc/autoload.el @@ -51,12 +51,12 @@ info in the `header-line-format' is a good indication." (propertize sha-or-subject 'face 'git-timemachine-minibuffer-detail-face) date-full date-relative)))) -;;;###autoload (autoload '+hydra-smerge/body "emacs/vc/autoload" nil nil) -(defhydra +hydra-smerge (:hint nil - :pre (if (not smerge-mode) (smerge-mode 1)) - ;; Disable `smerge-mode' when quitting hydra if - ;; no merge conflicts remain. - :post (smerge-auto-leave)) +;;;###autoload (autoload '+vc-smerge-hydra/body "emacs/vc/autoload" nil t) +(defhydra +vc-smerge-hydra (:hint nil + :pre (if (not smerge-mode) (smerge-mode 1)) + ;; Disable `smerge-mode' when quitting hydra if + ;; no merge conflicts remain. + :post (smerge-auto-leave)) " [smerge] Movement Keep Diff Other diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 77325ce17..81e11a600 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -56,7 +56,5 @@ (defalias #'smerge-keep-lower #'smerge-keep-other) (defalias #'smerge-diff-base-upper #'smerge-diff-base-mine) (defalias #'smerge-diff-upper-lower #'smerge-diff-mine-other) - (defalias #'smerge-diff-base-lower #'smerge-diff-base-other))) - - (add-hook 'smerge-mode-hook #'+hydra-smerge/body)) + (defalias #'smerge-diff-base-lower #'smerge-diff-base-other)))) From c760bf7205d3889a9ff73b15e05521f23e273362 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 21:53:06 +0200 Subject: [PATCH 2354/4235] Open file links to /docs/ in emacs --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 1cada2d6e..dec91e19b 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -365,6 +365,7 @@ between the two." (setq org-file-apps `(("pdf" . default) ("\\.x?html?\\'" . default) + ("/docs/" . emacs) (auto-mode . emacs) (directory . emacs) (t . ,(cond (IS-MAC "open -R \"%s\"") From 34de826ac4dfa6126f56bb3d87043c4d19fbab9c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 21:53:50 +0200 Subject: [PATCH 2355/4235] +workspace-contains-buffer-p -> persp-contain-buffer-p Wrapper is unnecessary. Also remove unnecessary type checking. --- modules/feature/workspaces/autoload/workspaces.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 0c9cb9512..45d722491 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -38,13 +38,11 @@ ;;;###autoload (defun +workspace-exists-p (name) "Returns t if NAME is the name of an existing workspace." - (cl-check-type name string) (member name (+workspace-list-names))) ;;;###autoload -(defun +workspace-contains-buffer-p (buffer &optional workspace) - "Return non-nil if BUFFER is in WORKSPACE (defaults to current workspace)." - (persp-contain-buffer-p buffer (or workspace (+workspace-current)) nil)) +(defalias #'+workspace-contains-buffer-p #'persp-contain-buffer-p + "Return non-nil if BUFFER is in WORKSPACE (defaults to current workspace).") ;; --- Getters ---------------------------- From e816a1ecaca8fdb0e058532985d3f51831c3d389 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 9 Jul 2018 23:34:37 +0200 Subject: [PATCH 2356/4235] Load exec-path-from-shell in daemon sessions On MacOS, the daemon is unlikely to run with the correct environment if launched through launchctl or brew services, so it makes sense to use exec-path-from-shell there too. May address #736 --- core/core-os.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 623da3bd0..32ed7124a 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -35,11 +35,11 @@ ;; Don't open files from the workspace in a new frame ns-pop-up-frames nil) - (if (not (display-graphic-p)) - (add-hook 'doom-post-init-hook #'osx-clipboard-mode) - ;; A known problem with GUI Emacs on MacOS: it runs in an isolated - ;; environment, so envvars will be wrong. That includes the PATH Emacs - ;; picks up. `exec-path-from-shell' fixes this. + (when (or (daemonp) (display-graphic-p)) + ;; A known problem with GUI Emacs on MacOS (or daemons started via + ;; launchctl or brew services): it runs in an isolated + ;; environment, so envvars will be wrong. That includes the PATH + ;; Emacs picks up. `exec-path-from-shell' fixes this. (when (require 'exec-path-from-shell nil t) (defun set-env! (&rest vars) "Inject VARS from your shell environment into Emacs." @@ -47,7 +47,11 @@ (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments) exec-path-from-shell-debug doom-debug-mode) - (exec-path-from-shell-initialize)))) + (exec-path-from-shell-initialize))) + + ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) + (when (or (daemonp) (not (display-graphic-p))) + (add-hook 'doom-post-init-hook #'osx-clipboard-mode))) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! From 04b7b5f1efccfb6586ec02c292312415a2d19da0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 14:20:21 +0200 Subject: [PATCH 2357/4235] Add gs/, gs? & gs evil-easymotion binds Adds evil-search and avy-goto-char-timer interfaces to evil-easymotion. --- modules/config/default/+bindings.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 11f281c5f..4ce3fb274 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -180,7 +180,14 @@ :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) :bind ((evil-snipe-scope 'buffer) (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight)))) + (evil-snipe-enable-incremental-highlight))) + " " #'avy-goto-char-timer + "/" (evilem-create #'evil-ex-search-next + :pre-hook (save-excursion (call-interactively #'evil-ex-search-forward)) + :bind ((evil-search-wrap))) + "?" (evilem-create #'evil-ex-search-previous + :pre-hook (save-excursion (call-interactively #'evil-ex-search-backward)) + :bind ((evil-search-wrap)))) ;; evil (:after evil From 93917fd8a2ba66852a3f953bbec27fc1aecd529d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 14:21:02 +0200 Subject: [PATCH 2358/4235] Fix gsn/gsN & gs*/gs# evil-easymotion binds --- modules/config/default/+bindings.el | 2 -- modules/feature/evil/config.el | 13 ++++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 4ce3fb274..ae8eb983a 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -169,8 +169,6 @@ :map evilem-map "a" (evilem-create #'evil-forward-arg) "A" (evilem-create #'evil-backward-arg) - "n" (evilem-create #'evil-ex-search-next) - "N" (evilem-create #'evil-ex-search-previous) "s" (evilem-create #'evil-snipe-repeat :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) :bind ((evil-snipe-scope 'buffer) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 5540bad77..e1892d7a8 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -157,7 +157,18 @@ (def-package! evil-easymotion - :commands (evilem-create evilem-default-keybindings)) + :commands (evilem-create evilem-default-keybindings) + :config + ;; Use evil-search backend, instead of isearch + (evilem-make-motion evilem-motion-search-next #'evil-ex-search-next + :bind ((evil-ex-search-highlight-all nil))) + (evilem-make-motion evilem-motion-search-previous #'evil-ex-search-previous + :bind ((evil-ex-search-highlight-all nil))) + + (evilem-make-motion evilem-motion-search-word-forward #'evil-ex-search-word-forward + :bind ((evil-ex-search-highlight-all nil))) + (evilem-make-motion evilem-motion-search-word-backward #'evil-ex-search-word-backward + :bind ((evil-ex-search-highlight-all nil)))) (def-package! evil-embrace From 933e52b88640fc8daf7eb7ee4044f372638d7b25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 14:21:45 +0200 Subject: [PATCH 2359/4235] Don't enable evil-visualstar-mode Redundant with our manual */# keybinds. --- modules/feature/evil/config.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e1892d7a8..be2a48ecf 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -368,16 +368,13 @@ the new algorithm is confusing, like in python or ruby." ;; matter what mode you're in. I want to be able to visually select a region and ;; search for other occurrences of it. (def-package! evil-visualstar - :commands (global-evil-visualstar-mode - evil-visualstar/begin-search + :commands (evil-visualstar/begin-search evil-visualstar/begin-search-forward evil-visualstar/begin-search-backward) :init (evil-define-key* 'visual 'global "*" #'evil-visualstar/begin-search-forward - "#" #'evil-visualstar/begin-search-backward) - :config - (global-evil-visualstar-mode 1)) + "#" #'evil-visualstar/begin-search-backward)) ;; From 616c48bd6239b8366541d4f4bb620342ca5e61c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 14:22:53 +0200 Subject: [PATCH 2360/4235] Remove read-only monkey patch for magit/git-rebase It was fixed upstream. --- modules/tools/editorconfig/config.el | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index ab0892ed4..82d4966f0 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -55,12 +55,5 @@ extension, try to guess one." (delq (assq mode editorconfig-indentation-alist) editorconfig-indentation-alist)) - (defun +editorconfig|disable-trim-whitespace-in-read-only-buffers (props) - "`delete-trailing-whitespace' can cause disruptive read-only errors. Prevent -it from being added to read-only buffers." - (when (and buffer-read-only (gethash 'trim_trailing_whitespace props)) - (remove-hook 'write-file-functions #'delete-trailing-whitespace :local))) - (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-trim-whitespace-in-read-only-buffers) - ;; (editorconfig-mode +1)) From 043dc4e8752463203551092b94831981bed39dda Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 17:46:31 +0200 Subject: [PATCH 2361/4235] Update dashboard on +doom-dashboard/open --- modules/ui/doom-dashboard/autoload.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index b003edbf1..63a55b153 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -5,7 +5,8 @@ "Switch to the dashboard in the current window, of the current FRAME." (interactive (list (selected-frame))) (with-selected-frame frame - (switch-to-buffer (+doom-dashboard-initial-buffer)))) + (switch-to-buffer (+doom-dashboard-initial-buffer)) + (+doom-dashboard-reload t))) ;;;###autoload (defun +doom-dashboard/forward-button (n) From f898469374ff22f1e907ef88f4580b326a400b7f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 21:47:47 +0200 Subject: [PATCH 2362/4235] Fix avy-goto-char-timer keybind (gs) --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ae8eb983a..b9e5b959a 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -179,7 +179,7 @@ :bind ((evil-snipe-scope 'buffer) (evil-snipe-enable-highlight) (evil-snipe-enable-incremental-highlight))) - " " #'avy-goto-char-timer + "SPC" #'avy-goto-char-timer "/" (evilem-create #'evil-ex-search-next :pre-hook (save-excursion (call-interactively #'evil-ex-search-forward)) :bind ((evil-search-wrap))) From 0cd32b5f1d0dc832ea49a9d510983b99a73c4816 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 21:48:32 +0200 Subject: [PATCH 2363/4235] Add selection info segment to new modeline --- modules/ui/doom-modeline/+new.el | 36 +++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-modeline/+new.el b/modules/ui/doom-modeline/+new.el index 2b66134d4..95d0429c2 100644 --- a/modules/ui/doom-modeline/+new.el +++ b/modules/ui/doom-modeline/+new.el @@ -426,8 +426,42 @@ with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." (or (and (not (equal meta " ")) meta) (if buffer-file-name " %I ")))) +;; +(defsubst doom-column (pos) + (save-excursion (goto-char pos) + (current-column))) + +(defvar-local +doom-modeline-enable-word-count nil + "If non-nil, a word count will be added to the selection-info modeline +segment.") + +(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) +(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) + +(def-modeline-segment! +mode-line-selection-info + (when mark-active + (cl-destructuring-bind (beg . end) + (if (eq evil-state 'visual) + (cons evil-visual-beginning evil-visual-end) + (cons (region-beginning) (region-end))) + (propertize + (let ((lines (count-lines beg (min end (point-max))))) + (concat (cond ((or (bound-and-true-p rectangle-mark-mode) + (eq 'block evil-visual-selection)) + (let ((cols (abs (- (doom-column end) + (doom-column beg))))) + (format "%dx%dB" lines cols))) + ((eq evil-visual-selection 'line) + (format "%dL" lines)) + ((> lines 1) + (format "%dC %dL" (- end beg) lines)) + ((format "%dC" (- end beg)))) + (when +doom-modeline-enable-word-count + (format " %dW" (count-words beg end))))) + 'face 'doom-modeline-highlight)))) + (def-modeline! :main - '(+mode-line-bar +mode-line-matches " " +mode-line-buffer-id " %2l:%c %p ") + '(+mode-line-bar +mode-line-matches " " +mode-line-buffer-id " %2l:%c %p " +mode-line-selection-info) '(+mode-line-encoding +mode-line-major-mode +mode-line-vcs)) (def-modeline! :project From ba4d72713a89ec17b4bf38e950069cfff58f7725 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 21:48:52 +0200 Subject: [PATCH 2364/4235] Don't set mode-line if format doesn't exist --- modules/ui/doom-modeline/+new.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/ui/doom-modeline/+new.el b/modules/ui/doom-modeline/+new.el index 95d0429c2..2471e1755 100644 --- a/modules/ui/doom-modeline/+new.el +++ b/modules/ui/doom-modeline/+new.el @@ -209,12 +209,13 @@ (defun set-modeline! (name &optional default) (let ((modeline (cdr (assq name doom-mode-line-alist)))) - (if default - (setq-default mode-line-format-left `("" ,@(car modeline)) - mode-line-format-right `("" ,@(cadr modeline))) - (setq mode-line-format-left `("" ,@(car modeline)) - mode-line-format-right `("" ,@(cadr modeline)))) - (force-mode-line-update))) + (when modeline + (if default + (setq-default mode-line-format-left `("" ,@(car modeline)) + mode-line-format-right `("" ,@(cadr modeline))) + (setq mode-line-format-left `("" ,@(car modeline)) + mode-line-format-right `("" ,@(cadr modeline)))) + (force-mode-line-update)))) ;; From 35b76ee49b1afc837c42244e88da1bd4eb1e1c1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 23:05:01 +0200 Subject: [PATCH 2365/4235] Enable minimalistic icon theme for treemacs Still experimental. --- modules/ui/doom/config.el | 7 +++++-- modules/ui/treemacs/config.el | 3 +-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 3e5c9ce33..88fcc09ae 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -31,12 +31,15 @@ ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) - ;; more Atom-esque file icons for neotree + ;; more Atom-esque file icons for neotree/treemacs (when (featurep! :ui neotree) (add-hook 'doom-load-theme-hook #'doom-themes-neotree-config) (setq doom-neotree-enable-variable-pitch t doom-neotree-file-icons 'simple - doom-neotree-line-spacing 2))) + doom-neotree-line-spacing 2)) + (when (featurep! :ui treemacs) + (add-hook 'doom-load-theme-hook #'doom-themes-treemacs-config) + (setq doom-treemacs-enable-variable-pitch t))) (def-package! solaire-mode diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 8b17a8893..acf842e2e 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -1,7 +1,6 @@ ;;; ui/treemacs/config.el -*- lexical-binding: t; -*- -(setq treemacs-no-png-images t - treemacs-follow-after-init t +(setq treemacs-follow-after-init t treemacs-width 35 treemacs-position 'left treemacs-is-never-other-window t From b5c57ab6e4eae92682c5a8bc2af1017fbc6f87f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 23:05:39 +0200 Subject: [PATCH 2366/4235] Don't trigger nav-flash in special windows --- modules/ui/nav-flash/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/nav-flash/autoload.el b/modules/ui/nav-flash/autoload.el index 97d42091b..04eaf8691 100644 --- a/modules/ui/nav-flash/autoload.el +++ b/modules/ui/nav-flash/autoload.el @@ -17,6 +17,7 @@ "Blink current line using `nav-flash'." (interactive) (unless (or (minibufferp) + (derived-mode-p 'special-mode) (memq this-command '(mouse-set-point evil-mouse-drag-region))) (nav-flash-show) ;; only show in the current window From e4778f992352c034c189b98e595d0cabcb272739 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 23:06:26 +0200 Subject: [PATCH 2367/4235] Disable treemacs-follow-mode by default This has proven intrusive, especially when you have files from different projects open and you switch between them rapidly. Enabling treemacs-follow-mode is left up to the user. Otherwise, the SPC o P keybind and treemacs-find-file command can this manually and on-demand. Also remove hide-mode-line-mode from treemacs because it's redundant with the doom-themes treemacs icon theme. --- modules/ui/treemacs/config.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index acf842e2e..0662c5b16 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -28,12 +28,9 @@ There are 2 possible values: (defvar treemacs-collapse-dirs (if (executable-find "python3") 3 0)) - (treemacs-follow-mode t) (treemacs-filewatch-mode t) (when (memq +treemacs-use-git-mode '(simple extended)) - (treemacs-git-mode +treemacs-use-git-mode)) - - (add-hook 'treemacs-mode-hook #'hide-mode-line-mode)) + (treemacs-git-mode +treemacs-use-git-mode))) (def-package! treemacs-evil From 867eaebd9dc34fd69aeb17a1e0514346bac631cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 10 Jul 2018 23:11:40 +0200 Subject: [PATCH 2368/4235] Remove FIXME in lang/ruby (it's been fixed!) --- modules/lang/ruby/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index ce093f8b4..c72ce6fb5 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -70,8 +70,6 @@ environment variables." :nv "P" #'rubocop-autocorrect-project)) -;; FIXME: Clean up all processes from this/inf-ruby when all the ruby buffers -;; are closed (def-package! robe :hook (enh-ruby-mode . robe-mode) :init From a1b4616236c38e52e6602406376ae2ea7ab16bd5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 11 Jul 2018 00:02:48 +0200 Subject: [PATCH 2369/4235] emacs/eshell: minor refactor --- modules/emacs/eshell/autoload/eshell.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index afae0ae15..921a4a9eb 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -14,7 +14,7 @@ ;; (defun +eshell--add-buffer (buf) - (ring-remove+insert+extend +eshell-buffers buf)) + (ring-remove+insert+extend +eshell-buffers buf 'grow)) (defun +eshell--remove-buffer (buf) (when-let* ((idx (ring-member +eshell-buffers buf))) @@ -37,7 +37,7 @@ (defun +eshell--unused-buffer (&optional new-p) (or (unless new-p - (cl-loop for buf in (ring-elements +eshell-buffers) + (cl-loop for buf in (+eshell-buffers) if (and (buffer-live-p buf) (not (get-buffer-window buf t))) return buf)) @@ -46,8 +46,8 @@ ;;;###autoload (defun +eshell-last-buffer (&optional noerror) "Return the last opened eshell buffer." - (let ((buffer (cl-find-if #'buffer-live-p (ring-elements +eshell-buffers)))) - (cond ((buffer-live-p buffer) buffer) + (let ((buffer (cl-find-if #'buffer-live-p (+eshell-buffers)))) + (cond (buffer) (noerror nil) ((user-error "No live eshell buffers remaining"))))) @@ -63,7 +63,7 @@ (or buffer (if (eq major-mode 'eshell-mode) (current-buffer) - (cl-find-if #'buffer-live-p (ring-elements +eshell-buffers)))))) + (cl-find-if #'buffer-live-p (+eshell-buffers)))))) (unless buffer (user-error "No living eshell buffers available")) (unless (buffer-live-p buffer) @@ -218,7 +218,7 @@ delete." "Interactively switch to another eshell buffer." (interactive (let ((buffers (doom-buffers-in-mode - 'eshell-mode (delq (current-buffer) (ring-elements +eshell-buffers))))) + 'eshell-mode (delq (current-buffer) (+eshell-buffers))))) (if (not buffers) (user-error "No eshell buffers are available") (list @@ -250,13 +250,13 @@ delete." ;;;###autoload (defun +eshell|init () "Initialize and track this eshell buffer in `+eshell-buffers'." - (let ((buf (current-buffer))) - (dolist (buf (ring-elements +eshell-buffers)) + (let ((current-buffer (current-buffer))) + (dolist (buf (+eshell-buffers)) (unless (buffer-live-p buf) (+eshell--remove-buffer buf))) - (+eshell--setup-window (get-buffer-window buf)) - (+eshell--add-buffer buf) - (setq +eshell--last-buffer buf))) + (+eshell--setup-window (get-buffer-window current-buffer)) + (+eshell--add-buffer current-buffer) + (setq +eshell--last-buffer current-buffer))) ;;;###autoload (defun +eshell|cleanup () From e2442e7d80c16e0d80e90cd62cbca1d2c10b2e14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 11 Jul 2018 00:04:24 +0200 Subject: [PATCH 2370/4235] Fix per-workspace eshell buffers --- modules/emacs/eshell/autoload/eshell.el | 13 +++++++++++++ modules/emacs/eshell/config.el | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 921a4a9eb..45acac222 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -75,6 +75,19 @@ (eshell-send-input nil t)))) +;; +;; Persp-mode integration +;; + +(defun +eshell|switch-workspace () + (setq +eshell-buffers + (or (persp-parameter 'eshell-buffers) + (make-ring 25)))) + +(defun +eshell|save-workspace () + (set-persp-parameter 'eshell-buffers +eshell-buffers)) + + ;; ;; Commands ;; diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 21178be71..eaaabf92b 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -81,6 +81,11 @@ You should use `det-eshell-alias!' to change this.") ;; Enable autopairing in eshell (add-hook 'eshell-mode-hook #'smartparens-mode) + ;; Persp-mode/workspaces integration + (when (featurep! :feature workspaces) + (add-hook 'persp-activated-functions #'+eshell|switch-workspace) + (add-hook 'persp-before-switch-functions #'+eshell|save-workspace)) + ;; UI enhancements (defun +eshell|remove-fringes () (set-window-fringes nil 0 0) From f540c6c40ab9b12f9e5269351666ac2de53f837a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 11 Jul 2018 01:09:14 +0200 Subject: [PATCH 2371/4235] Disable neotree, enable treemacs (by default) --- init.example.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.example.el b/init.example.el index f25ee6443..5141f6371 100644 --- a/init.example.el +++ b/init.example.el @@ -33,8 +33,8 @@ ;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags nav-flash ; blink the current line after jumping - neotree ; a project drawer, like NERDTree for vim - ;treemacs ; a project drawer, like neotree but cooler + ;neotree ; a project drawer, like NERDTree for vim + treemacs ; a project drawer, like neotree but cooler (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules From 1880fb8a7d6c1be81bb3d66b8781af41d60c0522 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 11 Jul 2018 12:42:33 +0200 Subject: [PATCH 2372/4235] Fix eshell+persp-mode integration Would cause a non-descript wrong-number-of-arguments error when trying to switch workspaces. --- modules/emacs/eshell/autoload/eshell.el | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 45acac222..0069dcc61 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -75,19 +75,6 @@ (eshell-send-input nil t)))) -;; -;; Persp-mode integration -;; - -(defun +eshell|switch-workspace () - (setq +eshell-buffers - (or (persp-parameter 'eshell-buffers) - (make-ring 25)))) - -(defun +eshell|save-workspace () - (set-persp-parameter 'eshell-buffers +eshell-buffers)) - - ;; ;; Commands ;; @@ -298,3 +285,14 @@ delete." if (eq mode 'eshell-mode) return (select-window win)))))))))) +;;;###autoload +(defun +eshell|switch-workspace (type) + (when (eq type 'frame) + (setq +eshell-buffers + (or (persp-parameter 'eshell-buffers) + (make-ring 25))))) + +;;;###autoload +(defun +eshell|save-workspace (_workspace target) + (when (framep target) + (set-persp-parameter 'eshell-buffers +eshell-buffers))) From 287460cb050c94010f4d8ded0fbfecf479c1772a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 11 Jul 2018 12:44:04 +0200 Subject: [PATCH 2373/4235] Add SPC o p/P keybind for treemacs/neotree + SPC o p invokes treemacs/neotree + SPC o P finds the current file in the treemacs/neotree pane --- modules/config/default/+bindings.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index b9e5b959a..ec627fb9b 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -671,8 +671,12 @@ :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl :desc "Dired" :n "-" #'dired-jump - :desc "Neotree" :n "n" #'+neotree/open - :desc "Neotree: find file" :n "N" #'+neotree/find-this-file + (:when (featurep! :ui neotree) + :desc "Project sidebar" :n "p" #'+neotree/open + :desc "Find file in project sidebar" :n "P" #'+neotree/find-this-file) + (:when (featurep! :ui treemacs) + :desc "Project sidebar" :n "p" #'+treemacs/toggle + :desc "Find file in project sidebar" :n "P" #'treemacs-find-file) :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle :desc "Terminal" :n "t" #'+term/open :desc "Terminal in popup" :n "T" #'+term/open-popup-in-project From 1fc43dacfcf42da0bb43c1cee98d854544d6b2da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 11 Jul 2018 13:02:00 +0200 Subject: [PATCH 2374/4235] lang/ruby: don't pop up console on startup This shouldn't compromise the features that robe provides (like code completion), it only hides the REPL. --- modules/lang/ruby/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index c72ce6fb5..5c668a533 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -77,7 +77,8 @@ environment variables." (defun +ruby|init-robe () (when (executable-find "ruby") (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_) t))) - (ignore-errors (robe-start)) + (save-window-excursion + (ignore-errors (robe-start))) (when (robe-running-p) (add-hook 'kill-buffer-hook #'+ruby|cleanup-robe-servers nil t))))) (add-hook 'enh-ruby-mode-hook #'+ruby|init-robe) From 763dba72cdf2641cb751794b9b1a7063e2caa44e Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Wed, 11 Jul 2018 19:06:49 +0530 Subject: [PATCH 2375/4235] org: Update +export to generate revealjs stuff --- modules/lang/org/+export.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index 5eb36d1d8..0ab06eabc 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -18,7 +18,8 @@ path too.") (add-to-list 'org-export-backends 'pandoc nil #'eq) (setq org-pandoc-options '((standalone . t) - (mathjax . t)))) + (mathjax . t) + (variable . "revealjs-url=https://cdn.jsdelivr.net/npm/reveal.js@3/")))) ;; (defun +org|init-export () From 03cb076fd6a100f53474667d3320571fc06b8cec Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Wed, 11 Jul 2018 19:15:24 +0530 Subject: [PATCH 2376/4235] org: Update revealJS url This grabs all minor versions upto 4.xx --- modules/lang/org/+present.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index 3a26c6f36..99b3f5d49 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -13,7 +13,7 @@ (def-package! ox-reveal :defer t :config - (setq org-reveal-root "http://cdn.jsdelivr.net/reveal.js/3.0.0/" + (setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js@3/" org-reveal-mathjax t)) From 0c6329825349e5552e50fccc57acae9e2a8404c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 16:43:37 +0200 Subject: [PATCH 2377/4235] No prettify-symbols-mode in special modes Fixes issues with magit popups losing their color. --- modules/ui/pretty-code/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/config.el b/modules/ui/pretty-code/config.el index 73428d474..4583f0863 100644 --- a/modules/ui/pretty-code/config.el +++ b/modules/ui/pretty-code/config.el @@ -24,7 +24,8 @@ modes, this function does nothing. Otherwise it builds `prettify-code-symbols-alist' according to `+pretty-code-symbols-alist' for the current major-mode." (unless (or (eq major-mode 'fundamental-mode) - (derived-mode-p 'special-mode 'comint-mode 'eshell-mode 'term-mode)) + (eq (get major-mode 'mode-class) 'special) + (derived-mode-p 'comint-mode 'eshell-mode 'term-mode)) (when (or (eq +pretty-code-enabled-modes t) (if (eq (car +pretty-code-enabled-modes) 'not) (not (memq major-mode (cdr +pretty-code-enabled-modes))) From 9f50ca01a0c2938b7f59ba201f1f8aa155bfc334 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 16:45:57 +0200 Subject: [PATCH 2378/4235] Rename amx-save-file: smex-items -> amx-items --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 2a54a4cdd..2c91a1340 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -215,7 +215,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Used by `counsel-M-x' -(setq amx-save-file (concat doom-cache-dir "/smex-items")) +(setq amx-save-file (concat doom-cache-dir "amx-items")) ;; From e8827048b87d1f2587b1363601b692629e28c863 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 16:59:24 +0200 Subject: [PATCH 2379/4235] sp already sets up latex-specific features --- modules/lang/latex/config.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 642ceac8b..3bc7858e0 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -14,9 +14,6 @@ ;; Plugins ;; -;; sp's default rules are obnoxious, so disable them -(provide 'smartparens-latex) - (after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") From 0dc2feec466be3279c86f1a25529c8985e6dfbfe Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 17:07:34 +0200 Subject: [PATCH 2380/4235] Remove redundant package! declaration --- modules/lang/latex/packages.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/latex/packages.el b/modules/lang/latex/packages.el index 9939c2366..71cb34f57 100644 --- a/modules/lang/latex/packages.el +++ b/modules/lang/latex/packages.el @@ -2,7 +2,6 @@ ;;; lang/latex/packages.el (package! auctex) -(package! flyspell) (package! adaptive-wrap) ;; Optional module features: From 00af6e66a719fd5c41e29a0009e38c2f4ec5424d Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 18:32:23 +0200 Subject: [PATCH 2381/4235] Auctex already supports pdf tools --- modules/lang/latex/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 3bc7858e0..9eafb0de0 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -97,7 +97,6 @@ ;; Or PDF-tools, but only if the module is also loaded (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-list '("PDF Tools" "TeX-pdf-tools-sync-view")) (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) ;; Enable auto reverting the PDF document with PDF Tools (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) From 968fb60bcee898d9023adc4a9b6c555c54748df8 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 18:34:13 +0200 Subject: [PATCH 2382/4235] This is the default in auctex anyway --- modules/lang/latex/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 9eafb0de0..2e4321c64 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -64,7 +64,6 @@ (add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode TeX-source-correlate-mode - TeX-global-PDF-mode TeX-PDF-mode visual-line-mode)) ;; Enable rainbow mode after applying styles to the buffer From 0edd4015392264202cde793a416136659e02e4ee Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 18:35:26 +0200 Subject: [PATCH 2383/4235] This is redundant given global pdf mode --- modules/lang/latex/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 2e4321c64..7db547e92 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -64,7 +64,6 @@ (add-hook! 'LaTeX-mode-hook #'(LaTeX-math-mode TeX-source-correlate-mode - TeX-PDF-mode visual-line-mode)) ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) From b06fe0dde2f61ac76794e4403cbf96725de602f8 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 18:44:18 +0200 Subject: [PATCH 2384/4235] Made company-auctex more concise --- modules/lang/latex/config.el | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 7db547e92..be9f8041a 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -198,15 +198,8 @@ (def-package! company-auctex :when (featurep! :completion company) - :commands (company-auctex-init) - :init - ;; We can't use the `set-company-backend!' because Auctex reports its - ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is - ;; not something `set-company-backend!' anticipates (and shouldn't have to!) - (add-hook! LaTeX-mode - (make-local-variable 'company-backends) - (company-auctex-init))) - + :hook (LaTeX-mode . ((make-local-variable 'company-backends) + (company-auctex-init)))) ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap From c93c595ba31f9ed7a6b17ee38b7552a9149520ee Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 18:46:54 +0200 Subject: [PATCH 2385/4235] reformat --- modules/lang/latex/config.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index be9f8041a..6953b6e3b 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -179,14 +179,12 @@ (def-package! ivy-bibtex :when (featurep! :completion ivy) - :commands ivy-bibtex - ) + :commands ivy-bibtex) (def-package! helm-bibtex :when (featurep! :completion helm) - :commands helm-bibtex - ) + :commands helm-bibtex) (after! bibtex-completion (unless (string-empty-p +latex-bibtex-file) From 76d90e752f09af0b51b23d29e4e8ee5097f5565e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 18:47:36 +0200 Subject: [PATCH 2386/4235] Update git-gutter on magit stage/unstage file Old magit-post-refresh-hook wasn't working (no guarantee the correct buffer was current). --- modules/ui/vc-gutter/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index f8d47ec68..df77e025d 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -48,8 +48,9 @@ to the right fringe.") (ignore (git-gutter)))) (add-hook 'doom-escape-hook #'+version-control|update-git-gutter t) - ;; update git-gutter when using these commands - (add-hook 'magit-post-refresh-hook #'+version-control|update-git-gutter) + ;; update git-gutter when using magit commands + (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter) + (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter) ;; subtle diff indicators in the fringe (when +vc-gutter-default-style From eddac868248509831c37dbbb2fcdff5f9dc2c61c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 18:49:13 +0200 Subject: [PATCH 2387/4235] tools/magit: add magit-todos package --- modules/tools/magit/config.el | 13 +++++++++++++ modules/tools/magit/packages.el | 1 + 2 files changed, 14 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 86e895cfa..e583208e6 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -41,6 +41,19 @@ load everything.") (def-package! magit-blame :after git-timemachine) +(def-package! magit-todos + :after magit + :config + (setq magit-todos-require-colon nil) + ;; `magit-todos-mode' defines keybinds on activation, so it's better to just + ;; do this manually: + (magit-add-section-hook 'magit-status-sections-hook + #'magit-todos--insert-todos + 'magit-insert-staged-changes + 'append) + (define-key magit-todos-section-map "j" nil)) + + (def-package! magithub :after magit :preface diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 51682daa9..38bcc3d37 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -4,5 +4,6 @@ (when (package! magit) (package! magit-gitflow) (package! magithub) + (package! magit-todos) (when (featurep! :feature evil +everywhere) (package! evil-magit))) From e5125fbb26062d18e40ed11ef03316deaf0971b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 19:03:15 +0200 Subject: [PATCH 2388/4235] Remove unused +vc-auto-hydra-smerge variable --- modules/emacs/vc/config.el | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 81e11a600..6a8f81b68 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -1,13 +1,5 @@ ;;; emacs/vc/config.el -*- lexical-binding: t; -*- -(defvar +vc-auto-hydra-smerge t - "When entering `smerge-mode' automatically open associated hydra.") - - -;; -;; Plugins -;; - ;; `git-timemachine' (after! git-timemachine ;; Sometimes I forget `git-timemachine' is enabled in a buffer, so instead of From 54c7936a776cc8e745546ec588ecf82f4896ae30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 19:51:21 +0200 Subject: [PATCH 2389/4235] Don't reload autoloads remotely Communicating with the Emacs server isn't reliable and has a tendency to hang, so we no longer do that. Instead, we inform the user to reload it themselves. --- core/core-cli.el | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 0b5e21931..d6eb85cb2 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -337,20 +337,16 @@ it exists." (when (funcall fn doom-auto-accept) (doom-reload-package-autoloads))) -(defun doom--server-reload-autoloads () - (message "Reloading your current Emacs session\n") - (message "If this hangs, it is safe to abort the process here") - (server-eval-at - server-name - `(dolist (file '(,doom-autoload-file ,doom-package-autoload-file)) - (load-file (byte-compile-dest-file file))))) +(defun doom--warn-refresh-session () + (message "Detected a running Emacs session.\n") + (message "Use `M-x doom/reload' for changes to take effect.")) -(defun doom--server-load (&rest files) +(defun doom--do-load (&rest files) (if (and noninteractive (not (daemonp))) (progn (require 'server) (when (server-running-p) - (add-hook 'kill-emacs-hook #'doom--server-reload-autoloads))) + (add-hook 'kill-emacs-hook #'doom--warn-refresh-session))) (dolist (file files) (load-file (byte-compile-dest-file file))))) @@ -592,7 +588,7 @@ modified." (print! (green "✓ Clean up autoloads"))) ;; Byte compile it to give the file a chance to reveal errors. (doom--byte-compile-file doom-autoload-file) - (doom--server-load doom-autoload-file) + (doom--do-load doom-autoload-file) t))) @@ -667,7 +663,7 @@ This should be run whenever your `doom!' block or update your packages." (doom--cleanup-package-autoloads) (print! (green "✓ Removed load-path/auto-mode-alist entries")))) (doom--byte-compile-file doom-package-autoload-file) - (doom--server-load doom-package-autoload-file) + (doom--do-load doom-package-autoload-file) t)) From 9eccdd5c1b614ff1c115d14bf6ad0449d03eccec Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 12 Jul 2018 19:52:54 +0200 Subject: [PATCH 2390/4235] fixed broken hook --- modules/lang/latex/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 6953b6e3b..37fa4d3f3 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -196,8 +196,11 @@ (def-package! company-auctex :when (featurep! :completion company) - :hook (LaTeX-mode . ((make-local-variable 'company-backends) - (company-auctex-init)))) + :after latex + :config + (add-hook! LaTeX-mode + (make-local-variable 'company-backends) + (company-auctex-init))) ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap From e7b252f4427bb49e52bc54e422a84d5979664f92 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 20:38:17 +0200 Subject: [PATCH 2391/4235] TAB should respect org-cycle-open-archived-trees And shouldn't cycle visibility of archived trees by default. --- modules/lang/org/autoload/org.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 343e341b4..4859fb687 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -395,13 +395,15 @@ with `org-cycle')." (unless (eq this-command 'org-shifttab) (save-excursion (org-beginning-of-line) - (when (org-at-heading-p) - (when (or (not arg) - (outline-invisible-p (line-end-position))) - (outline-toggle-children) - (unless (outline-invisible-p (line-end-position)) - (org-cycle-hide-drawers 'subtree)) - t))))) + (when (and (org-at-heading-p) + (or org-cycle-open-archived-trees + (not (member org-archive-tag (org-get-tags)))) + (or (not arg) + (outline-invisible-p (line-end-position)))) + (outline-toggle-children) + (unless (outline-invisible-p (line-end-position)) + (org-cycle-hide-drawers 'subtree)) + t)))) ;;;###autoload (defun +org|remove-occur-highlights () From 8b25abc11cb15b4168028f609750b08e0be83af4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 12 Jul 2018 20:43:04 +0200 Subject: [PATCH 2392/4235] large-file-warning-threshold = 30mb Staves off filesize warnings for large files (like pdfs and media files), while doom|check-large-file handles text files. --- core/core-editor.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-editor.el b/core/core-editor.el index 33e9a9112..28ae577a0 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -17,6 +17,7 @@ indentation settings or not. This should be set by editorconfig if it successfully sets indent_style/indent_size.") (setq-default + large-file-warning-threshold 30000000 vc-follow-symlinks t ;; Save clipboard contents into kill-ring before replacing them save-interprogram-paste-before-kill t From 31143f9f9e9bd46a411fd9032ecce52a62f8d8b5 Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Thu, 12 Jul 2018 15:13:19 -0700 Subject: [PATCH 2393/4235] Fix a couple errors in doom.cmd - Properly stringize the optional first argument - Use correct path to init.el (relative to script directory) --- bin/doom.cmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/doom.cmd b/bin/doom.cmd index 810f3fb06..000e811c7 100644 --- a/bin/doom.cmd +++ b/bin/doom.cmd @@ -3,12 +3,12 @@ @ECHO OFF PUSHD "%~dp0" >NUL -IF %1=="run" ( +IF "%1"=="run" ( SHIFT - emacs -Q %* -l init.el -f "doom|run-all-startup-hooks" + emacs -Q %* -l ..\init.el -f "doom|run-all-startup-hooks" ) ELSE ( - emacs --quick --script ./doom -- %* + emacs --quick --script .\doom -- %* ) POPD >NUL -ECHO ON +ECHO ON \ No newline at end of file From a0604e3febb453742a9e34ed1e72f104e3066846 Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Thu, 12 Jul 2018 15:45:37 -0700 Subject: [PATCH 2394/4235] Tweak the command used for the "run" argument - Using "start" will allow the batch script to return immediately, rather than waiting for the command to finish. - Using "runemacs" (instead of plain "emacs") will hide the console window that is displayed while Emacs is running --- bin/doom.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom.cmd b/bin/doom.cmd index 000e811c7..7d9e6179b 100644 --- a/bin/doom.cmd +++ b/bin/doom.cmd @@ -5,10 +5,10 @@ PUSHD "%~dp0" >NUL IF "%1"=="run" ( SHIFT - emacs -Q %* -l ..\init.el -f "doom|run-all-startup-hooks" + start runemacs -Q %* -l ..\init.el -f "doom|run-all-startup-hooks" ) ELSE ( emacs --quick --script .\doom -- %* ) POPD >NUL -ECHO ON \ No newline at end of file +ECHO ON From 58b723bc54e4729b70fa2e2eafff6fec276acf10 Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Thu, 12 Jul 2018 16:32:07 -0700 Subject: [PATCH 2395/4235] Load early-init.el if early-init-file is not bound *and* true For Emacs 27, the symbol is still bound when using -Q, which means it won't be loaded from bin/doom. --- init.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.el b/init.el index 0b3b905e0..07e42f0a2 100644 --- a/init.el +++ b/init.el @@ -27,7 +27,7 @@ ;; ;;; License: MIT -(unless (boundp 'early-init-file) +(unless (bound-and-true-p early-init-file) (load (concat (file-name-directory load-file-name) "early-init") nil t)) From 821d1937b80e2cca76789b1822280c7ab7737e00 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 13 Jul 2018 10:07:02 +0200 Subject: [PATCH 2396/4235] Revert sp change. --- modules/lang/latex/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 37fa4d3f3..c5d0479b4 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -14,6 +14,9 @@ ;; Plugins ;; +;; sp's default rules are obnoxious, so disable them +(provide 'smartparens-latex) + (after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") From a64a2e88482414e5d01811015bca020c144f2f91 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 13 Jul 2018 10:14:10 +0200 Subject: [PATCH 2397/4235] Added company reftex support. --- modules/lang/latex/config.el | 5 +++++ modules/lang/latex/packages.el | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index c5d0479b4..c96c7fcbf 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -205,6 +205,11 @@ (make-local-variable 'company-backends) (company-auctex-init))) +(def-package! company-reftex + :after reftex + :config + (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) + ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap :hook (LaTeX-mode . adaptive-wrap-prefix-mode) diff --git a/modules/lang/latex/packages.el b/modules/lang/latex/packages.el index 71cb34f57..42900a7a5 100644 --- a/modules/lang/latex/packages.el +++ b/modules/lang/latex/packages.el @@ -15,7 +15,8 @@ ;; Features according to other user selected options (when (featurep! :completion company) - (package! company-auctex)) + (package! company-auctex) + (package! company-reftex)) (when (featurep! :completion ivy) (package! ivy-bibtex)) (when (featurep! :completion helm) From 95848ea5f69b22aac5e9f0f2ced241068f4518e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Jul 2018 12:43:28 +0200 Subject: [PATCH 2398/4235] Disable :todo for helm users There is no +helm/tasks or +helm:todo. Reported by @ar1a --- modules/config/default/+evil-commands.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 7e2b7391b..d23605e05 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -111,7 +111,8 @@ command from the current directory instead of the project root." (ex! "grep" #'+helm:grep) (ex! "grepc[wd]" #'+helm:grep-from-cwd) (ex! "sw[oop]" #'+helm:swoop) - (ex! "todo" #'+helm:todo))) + ;; (ex! "todo" #'+helm:todo) TODO implement `+helm:todo' + )) ;; Project tools (ex! "mak[e]" #'doom:make) (ex! "debug" #'+debug/run) From 574c62f85bd2d0da610cc7b711e0a80bce29e791 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Jul 2018 12:45:35 +0200 Subject: [PATCH 2399/4235] :cap => org-capture +org-capture/dwim doesn't exist. Reported by @ar1a --- modules/config/default/+evil-commands.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index d23605e05..662d2718f 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -136,5 +136,5 @@ command from the current directory instead of the project root." (ex! "tabs" #'+workspace/display) (ex! "tabsave" #'+workspace:save) ;; Org-mode -(ex! "cap" #'+org-capture/dwim) +(ex! "cap" #'org-capture) From 8a4e61f0b2d13aa342bf87f14872facdb335ec8f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 13 Jul 2018 12:51:11 +0200 Subject: [PATCH 2400/4235] company-reftex takes over citation completion --- modules/lang/latex/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index c96c7fcbf..dddff976d 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -196,14 +196,14 @@ (setq bibtex-completion-library-path (list +latex-bibtex-dir) bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)))) - (def-package! company-auctex :when (featurep! :completion company) :after latex :config (add-hook! LaTeX-mode (make-local-variable 'company-backends) - (company-auctex-init))) + (add-to-list 'company-backends + '(company-auctex-macros company-auctex-symbols company-auctex-environments)))) (def-package! company-reftex :after reftex From 6e52e2d07c55425eaaff3d0a6156cf0ffcaef58e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Jul 2018 12:58:58 +0200 Subject: [PATCH 2401/4235] Refactor +evil:mc + Improve error handling when no PATTERN is given (reported by @ar1a) + Report correct number of resulting cursors + Handle edge case where only one cursor is created + Report edge case where no cursors are created --- modules/feature/evil/autoload/evil-mc.el | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/modules/feature/evil/autoload/evil-mc.el b/modules/feature/evil/autoload/evil-mc.el index 5e76a5d8e..af1b58de7 100644 --- a/modules/feature/evil/autoload/evil-mc.el +++ b/modules/feature/evil/autoload/evil-mc.el @@ -50,16 +50,24 @@ cursor at the final match. If BANG, then treat PATTERN as literal." :move-point nil :evil-mc t (interactive "") + (unless (and (stringp pattern) + (not (string-empty-p pattern))) + (user-error "A regexp pattern is required")) (require 'evil-mc) - (setq evil-mc-pattern (cons (evil-mc-make-pattern (if bang (regexp-quote pattern) pattern) nil) - (list beg end type))) + (setq evil-mc-pattern + (cons (evil-mc-make-pattern (if bang (regexp-quote pattern) pattern) + nil) + (list beg end type))) (save-excursion (evil-with-restriction beg end - (evil-mc-make-cursors-for-all) - (evil-mc-print-cursors-info "Created"))) + (evil-mc-make-cursors-for-all))) (evil-exit-visual-state) (evil-mc-goto-cursor (if (= (evil-visual-direction) 1) (evil-mc-find-last-cursor) (evil-mc-find-first-cursor)) - nil)) + nil) + (evil-mc-undo-cursor-at-pos (point)) + (if (evil-mc-has-cursors-p) + (evil-mc-print-cursors-info "Created") + (evil-mc-message "No cursors were created"))) From 7ed9c5196fb8a10ba87f301f3ae974b4c317e0f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Jul 2018 13:00:42 +0200 Subject: [PATCH 2402/4235] Add doom/copy-backtrace command --- core/autoload/debug.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 5a096b816..0e531594c 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -120,6 +120,19 @@ branch and commit." (or (vc-git-working-revision doom-core-dir) "n/a"))) +;;;###autoload +(defun doom/copy-backtrace () + "Copy the contents of the *Backtrace* window to clipboard." + (interactive) + (if-let* ((buf (get-buffer "*Backtrace*"))) + (with-current-buffer buf + (kill-new + (string-trim + (buffer-substring-no-properties + (point-min) + (min (point-max) 1000))))) + (user-error "No backtrace buffer detected"))) + ;; ;; Vanilla sandbox From b60c83f6d118b0ecbad89463ee666e6c76836c2b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Jul 2018 13:29:43 +0200 Subject: [PATCH 2403/4235] Add gz to evil-collection-key-blacklist --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ec627fb9b..ab7db32b3 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -838,5 +838,5 @@ ;; Evil-collection fixes (setq evil-collection-key-blacklist - (list "C-j" "C-k" "gd" "gf" "K" "[" "]" + (list "C-j" "C-k" "gd" "gf" "K" "[" "]" "gz" doom-leader-key doom-localleader-key)) From babb7821a0021d35c5d665dec182ea276dcf1225 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 13 Jul 2018 18:01:22 +0200 Subject: [PATCH 2404/4235] Improved math completion via company-math --- modules/lang/latex/config.el | 13 +++++++++---- modules/lang/latex/packages.el | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index dddff976d..5cc9083a1 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -200,10 +200,15 @@ :when (featurep! :completion company) :after latex :config - (add-hook! LaTeX-mode - (make-local-variable 'company-backends) - (add-to-list 'company-backends - '(company-auctex-macros company-auctex-symbols company-auctex-environments)))) + (def-package! company-math + :defer t + :init + (add-hook! LaTeX-mode + (setq-local company-backends + (append '((company-math-symbols-latex + company-auctex-macros + company-auctex-environments)) + company-backends))))) (def-package! company-reftex :after reftex diff --git a/modules/lang/latex/packages.el b/modules/lang/latex/packages.el index 42900a7a5..ade453d7e 100644 --- a/modules/lang/latex/packages.el +++ b/modules/lang/latex/packages.el @@ -16,7 +16,8 @@ (when (featurep! :completion company) (package! company-auctex) - (package! company-reftex)) + (package! company-reftex) + (package! company-math)) (when (featurep! :completion ivy) (package! ivy-bibtex)) (when (featurep! :completion helm) From 6ba4982bfb8ea136316dbe9929422173d635508a Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 13 Jul 2018 18:45:59 +0200 Subject: [PATCH 2405/4235] LaTeX-math-mode is redundant with completion --- modules/lang/latex/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 5cc9083a1..40089ecaf 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -65,8 +65,7 @@ 'local)) ;; Adding useful things for latex (add-hook! 'LaTeX-mode-hook - #'(LaTeX-math-mode - TeX-source-correlate-mode + #'(TeX-source-correlate-mode visual-line-mode)) ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) From 00322883d7cd5101b514d8254fee02211f1325e3 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 13 Jul 2018 18:50:10 +0200 Subject: [PATCH 2406/4235] Company-reftex should be conditional on company --- modules/lang/latex/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 40089ecaf..0b169fc21 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -165,7 +165,6 @@ bibtex-text-indentation 20) (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) - (def-package! auctex-latexmk :when (featurep! +latexmk) :after-call (latex-mode-hook LaTeX-mode-hook) @@ -178,12 +177,10 @@ ;; Add latexmk as a TeX target (auctex-latexmk-setup)) - (def-package! ivy-bibtex :when (featurep! :completion ivy) :commands ivy-bibtex) - (def-package! helm-bibtex :when (featurep! :completion helm) :commands helm-bibtex) @@ -210,6 +207,7 @@ company-backends))))) (def-package! company-reftex + :when (featurep! :completion company) :after reftex :config (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) From 3db462ba54b0598de0af1bf6048c4b15767f65d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 13 Jul 2018 23:35:52 +0200 Subject: [PATCH 2407/4235] Add regexp support to :mc ex command --- modules/feature/evil/autoload/evil-mc.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/evil-mc.el b/modules/feature/evil/autoload/evil-mc.el index af1b58de7..c874a7b48 100644 --- a/modules/feature/evil/autoload/evil-mc.el +++ b/modules/feature/evil/autoload/evil-mc.el @@ -55,8 +55,8 @@ cursor at the final match. If BANG, then treat PATTERN as literal." (user-error "A regexp pattern is required")) (require 'evil-mc) (setq evil-mc-pattern - (cons (evil-mc-make-pattern (if bang (regexp-quote pattern) pattern) - nil) + (cons (evil-ex-make-search-pattern + (if bang (regexp-quote pattern) pattern)) (list beg end type))) (save-excursion (evil-with-restriction beg end From bb6e9b0a4f800e2c9465a63e83e18e1ad5155f81 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 02:56:46 +0200 Subject: [PATCH 2408/4235] Remove counsel-more-chars removal hacks Fixes wrong-number-of-args error caused by new counsel-more-chars implementation upstream. These hacks removed the hard-coded minimum input length requirement for counsel-ag and its ilk. The recent counsel update made those requirements customizable through counsel-more-chars-alist. --- modules/completion/ivy/autoload/ivy.el | 44 ++------------------------ 1 file changed, 2 insertions(+), 42 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 88651a03c..84cf3c1f0 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -248,10 +248,8 @@ order. (t (file-relative-name directory project-root)))))) (require 'counsel) - (cl-letf (((symbol-function 'counsel-ag-function) - (symbol-function '+ivy*counsel-ag-function)) - ((symbol-function 'counsel-git-grep-function) - (symbol-function '+ivy*counsel-git-grep-function))) + (let ((counsel-more-chars-alist + (if query '((t . 1)) counsel-more-chars-alist))) (pcase engine ('grep (let ((args (if recursive " -R")) @@ -363,41 +361,3 @@ non-nil)." non-nil)." (interactive "P") (+ivy-file-search 'grep :query query :in default-directory :recursive recursive-p)) - - -;; -;; Advice -;; - -;;;###autoload -(defun +ivy*counsel-ag-function (string) - "Advice to get rid of the character limit from `counsel-ag-function'. - -NOTE This may need to be updated frequently, to meet changes upstream (in -counsel-rg)." - (if (< (length string) 1) ; <-- modified the character limit - (counsel-more-chars 1) ; <-- - (let ((default-directory (ivy-state-directory ivy-last)) - (regex (counsel-unquote-regex-parens - (setq ivy--old-re - (ivy--regex string))))) - (counsel--async-command (format counsel-ag-command - (shell-quote-argument regex))) - nil))) - -;;;###autoload -(defun +ivy*counsel-git-grep-function (string) - "Advice to get rid of the character limit from `counsel-git-grep-function'. - -NOTE This may need to be updated frequently, to meet changes upstream (in -counsel-git-grep)." - (if (and (> counsel--git-grep-count counsel--git-grep-count-threshold) - (< (length string) 1)) ; <-- modified the character limit - (counsel-more-chars 1) ; <-- - (let* ((default-directory (ivy-state-directory ivy-last)) - (cmd (format counsel-git-grep-cmd - (setq ivy--old-re (ivy--regex string t))))) - (if (<= counsel--git-grep-count counsel--git-grep-count-threshold) - (split-string (shell-command-to-string cmd) "\n" t) - (counsel--gg-candidates (ivy--regex string)) - nil)))) From 4323886b1bf10bb2ccedd4c0ce8846a740b53681 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 04:08:17 +0200 Subject: [PATCH 2409/4235] Use ivy fallback display function for swiper et co As they don't work well with ivy-posframe. --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 2c91a1340..409df5fca 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -197,7 +197,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) - (setf (alist-get fn ivy-display-functions-alist) nil))) + (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) (def-package! flx From 92b8222529a2da7ebe6f9dc7f5075763759a1fa0 Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Fri, 13 Jul 2018 15:51:22 -0700 Subject: [PATCH 2410/4235] %* doesn't behave as expected %* is unaffected by SHIFT, so using it results in Emacs loading a buffer named "run" on startup. In order to preserve running all supported commands directly with the bin/doom script, change the magic string in doom.cmd to one that is unused ("runemacs") --- bin/doom.cmd | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/doom.cmd b/bin/doom.cmd index 7d9e6179b..8097a37bd 100644 --- a/bin/doom.cmd +++ b/bin/doom.cmd @@ -3,9 +3,8 @@ @ECHO OFF PUSHD "%~dp0" >NUL -IF "%1"=="run" ( - SHIFT - start runemacs -Q %* -l ..\init.el -f "doom|run-all-startup-hooks" +IF "%1"=="runemacs" ( + start runemacs --quick --no-splash -l ..\init.el -f "doom|run-all-startup-hooks" ) ELSE ( emacs --quick --script .\doom -- %* ) From b7eeaa4525065eb38eb3cbac91f96605276eb43d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 19:33:47 +0200 Subject: [PATCH 2411/4235] Improve docstring for doom/copy-backtrace --- core/autoload/debug.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 0e531594c..82154d74f 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -122,7 +122,8 @@ branch and commit." ;;;###autoload (defun doom/copy-backtrace () - "Copy the contents of the *Backtrace* window to clipboard." + "Copy the first 1000 bytes from the *Backtrace* window into your clipboard for +easy pasting into a bug report or discord." (interactive) (if-let* ((buf (get-buffer "*Backtrace*"))) (with-current-buffer buf From 71dd7ff0f489eb6f2f9acd271d817287f0b68ab7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 19:38:29 +0200 Subject: [PATCH 2412/4235] Helpfully removes this totally helpful comment How helpful! --- modules/emacs/term/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index 6be92ed5b..c70417601 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -8,5 +8,4 @@ (after! term (set-env! "SHELL") - ;; Consider term buffers real (add-hook 'term-mode-hook #'doom|mark-buffer-as-real)) From 8406f1e6a49edef8e73e10c4acd67cbb60e5c016 Mon Sep 17 00:00:00 2001 From: xeijin Date: Sat, 14 Jul 2018 19:21:16 +0100 Subject: [PATCH 2413/4235] Double quote doom binary location This allows 'make quickstart' to work on Windows when using GNU make (appreciate Windows isn't officially supported) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a233df3cf..ca088d921 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -DOOM = bin/doom +DOOM = "bin/doom" MODULES = $(patsubst modules/%/, %, $(sort $(dir $(wildcard modules/*/ modules/*/*/)))) all: From 6efd9d4573237c31579b20c3b2138a1a9c7f568d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 20:18:02 +0200 Subject: [PATCH 2414/4235] Allow set-repl-handler! to accept multiple modes As first argument. --- modules/feature/eval/autoload/settings.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 443678f7d..c8505b6ec 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -9,10 +9,11 @@ `+eval/open-repl' and filled with the `:repl' setting.") ;;;###autodef -(defun set-repl-handler! (mode command) - "Define a REPL for a mode. MODE is a major mode symbol and COMMAND is a -function that creates and returns the REPL buffer." - (push (cons mode command) +eval-repls)) +(defun set-repl-handler! (modes command) + "Define a REPL for MODES. MODES is either a single major mode symbol or a list +of them. COMMAND is a function that creates and returns the REPL buffer." + (dolist (mode (doom-enlist modes)) + (setf (alist mode +eval-repls) command))) ;; FIXME obsolete :repl ;;;###autoload From e97fd7558c6d06ab07efe7e79d1d1a5751a13de0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 21:33:13 +0200 Subject: [PATCH 2415/4235] Allow file template :trigger to be a function --- modules/feature/file-templates/autoload.el | 38 +++++++++++++--------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index acd8b0ca2..b92d410c6 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -18,9 +18,13 @@ these properties: Provides a secondary predicate. This function takes no arguments and is executed from within the target buffer. If it returns nil, this rule will be skipped over. - :trigger - The yasnippet trigger keyword used to trigger the target snippet. If - omitted, `+file-templates-default-trigger' is used. + :trigger STRING|FUNCTION + If a string, this is the yasnippet trigger keyword used to trigger the + target snippet. + If a function, this function will be run in the context of the buffer to + insert a file template into. It is given no arguments and must insert text + into the current buffer manually. + If omitted, `+file-templates-default-trigger' is used. :mode SYMBOL What mode to get the yasnippet snippet from. If omitted, either PRED (if it's a major-mode symbol) or the mode of the buffer is used. @@ -69,19 +73,21 @@ evil is loaded and enabled)." (user-error "Couldn't determine mode for %s file template" pred)) (unless trigger (setq trigger +file-templates-default-trigger)) - (require 'yasnippet) - (unless yas-minor-mode - (yas-minor-mode-on)) - (when (and yas-minor-mode - (yas-expand-snippet - (yas--template-content - (cl-find trigger (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) - (overlay-get yas--active-field-overlay 'yas--field))) - (evil-initialize-state 'insert))))) + (if (functionp trigger) + (funcall trigger) + (require 'yasnippet) + (unless yas-minor-mode + (yas-minor-mode-on)) + (when (and yas-minor-mode + (yas-expand-snippet + (yas--template-content + (cl-find trigger (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) + (overlay-get yas--active-field-overlay 'yas--field))) + (evil-initialize-state 'insert)))))) ;;;###autoload (defun +file-templates-get-short-path () From a76c08093079824f6b8a596391e9ac389964df3f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 21:43:12 +0200 Subject: [PATCH 2416/4235] lang/haskell: improve REPL support #752 --- modules/lang/haskell/autoload.el | 15 +++++++++++++++ modules/lang/haskell/config.el | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 modules/lang/haskell/autoload.el diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el new file mode 100644 index 000000000..92cc42afe --- /dev/null +++ b/modules/lang/haskell/autoload.el @@ -0,0 +1,15 @@ +;;; lang/haskell/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +haskell-repl-buffer () + "Returns the appropriate Haskell REPL buffer." + (if (featurep! +intero) + (intero-repl-buffer arg) + (haskell-session-interactive-buffer (haskell-session)))) + +;;;###autoload +(defun +haskell/repl (&optional arg) + "Opens a Haskell REPL." + (interactive "P") + (display-buffer (+haskell-repl-buffer))) + diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 9b44c7531..56ccf58fd 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,6 +11,6 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode - (set-repl-handler! 'haskell-mode #'switch-to-haskell) + (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) (add-to-list 'completion-ignored-extensions ".hi")) From 80c4abc8bfdd1d3180b22bcc2b9776184575d206 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 21:43:47 +0200 Subject: [PATCH 2417/4235] Enable haskell-interactive-mode in haskell-mode #752 --- modules/lang/haskell/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 56ccf58fd..5147081e4 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,6 +11,7 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode + (add-hook 'haskell-mode-hook #'haskell-interactive-mode) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) (add-to-list 'completion-ignored-extensions ".hi")) From e4db3f00205ff0331108352bb189ea4b3865e049 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 21:44:06 +0200 Subject: [PATCH 2418/4235] Insert module file template in haskell files #752 Use file-template module instead of hook so it only gets triggered in a valid project. --- modules/lang/haskell/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 5147081e4..a03d99a3b 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -12,6 +12,7 @@ (after! haskell-mode (add-hook 'haskell-mode-hook #'haskell-interactive-mode) + (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) (add-to-list 'completion-ignored-extensions ".hi")) From 4448f2d920b9e44781fe0e5d9ea255ddbf074bca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 14 Jul 2018 22:29:52 +0200 Subject: [PATCH 2419/4235] Remove redundant .cask/ entry in gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2d7dc7455..78fdd0789 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .local/ -.cask/ var/ modules/private/ .yas-compiled-snippets.el From b38cbcd060bf94acd30601949d1b00c7f2d40d0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 15 Jul 2018 00:59:38 +0200 Subject: [PATCH 2420/4235] Fix void-function (setf alist) error --- modules/feature/eval/autoload/settings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index c8505b6ec..0f9dd1dfb 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -13,7 +13,7 @@ "Define a REPL for MODES. MODES is either a single major mode symbol or a list of them. COMMAND is a function that creates and returns the REPL buffer." (dolist (mode (doom-enlist modes)) - (setf (alist mode +eval-repls) command))) + (setf (alist-get mode +eval-repls) command))) ;; FIXME obsolete :repl ;;;###autoload From b21ccd104b4ac3c1c3803e2a2a1d7464ebf7fcf9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 15 Jul 2018 01:01:56 +0200 Subject: [PATCH 2421/4235] lang/swift: defer set-repl-handler! call --- modules/lang/swift/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index d099d8677..6925ab766 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -1,7 +1,7 @@ ;;; lang/swift/config.el -*- lexical-binding: t; -*- -;; `swift-mode' -(set-repl-handler! 'swift-mode #'run-swift) +(after! swift-mode + (set-repl-handler! 'swift-mode #'run-swift)) (def-package! flycheck-swift From 69c8ef4141ba3ead9765aedc87d3dbd1c81a32e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 15 Jul 2018 20:44:11 +0200 Subject: [PATCH 2422/4235] Fix void-function haskell-interactive-mode --- modules/lang/haskell/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index a03d99a3b..3c2159f6c 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,7 +11,7 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode - (add-hook 'haskell-mode-hook #'haskell-interactive-mode) + (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) (add-to-list 'completion-ignored-extensions ".hi")) From c31bb6a7448ee6ffcad11a1ae993c571b9cd0d28 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 15 Jul 2018 20:44:47 +0200 Subject: [PATCH 2423/4235] Add haskell-mode-jump-to-def-or-tag lookup handler --- modules/lang/haskell/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 3c2159f6c..dd5b6d1b4 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -12,6 +12,7 @@ (after! haskell-mode (add-hook 'haskell-mode-hook #'interactive-haskell-mode) + (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) (add-to-list 'completion-ignored-extensions ".hi")) From f8581c3206e3530c4c472ecdbf26ea15ce6a5dac Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 12:28:41 +0200 Subject: [PATCH 2424/4235] Added hlint support for intero users --- modules/lang/haskell/+intero.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 5dc501743..a99308af9 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -13,4 +13,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config - (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) + (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) + (when (featurep! :feature syntax-checker) + (add-hook! 'intero-mode + (flycheck-add-next-checker 'intero '(warning . haskell-hlint))))) From ab6e18d61b69e33b89cad7550b96eaedbd4f05da Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 12:50:20 +0200 Subject: [PATCH 2425/4235] Checks for hlint for dante/intero users --- modules/lang/haskell/doctor.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index df465bc7b..e9e776b0b 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -3,9 +3,7 @@ (when (featurep! +dante) (unless (executable-find "cabal") - (warn! "Couldn't find cabal, haskell-mode may have issues")) - (unless (executable-find "hlint") - (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode"))) + (warn! "Couldn't find cabal, haskell-mode may have issues"))) (when (featurep! +intero) (unless (executable-find "stack") @@ -14,3 +12,8 @@ (unless (executable-find "hindent") (warn! "Couldn't find hindent. hindent-mode won't work")) +(when (or (featurep! +dante) (featurep! +intero)) + (unless (executable-find "hlint") + (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode"))) + + From 53df5178a3e79e84fec3dc7f942ce2e1ff4ca18a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 16 Jul 2018 14:06:08 +0200 Subject: [PATCH 2426/4235] Fix wrong-type-argument: commandp error when opening some REPLs --- modules/feature/eval/autoload/repl.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 437e73a4e..dcd8df1a1 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -18,7 +18,11 @@ (funcall (if same-window-p #'switch-to-buffer #'pop-to-buffer) (if (buffer-live-p buffer) buffer - (setq buffer (save-window-excursion (call-interactively command))) + (setq buffer + (save-window-excursion + (if (commandp command) + (call-interactively command) + (funcall command)))) (unless (bufferp buffer) (error "REPL command didn't return a buffer")) (with-current-buffer buffer (+eval-repl-mode +1)) From 39419dee17d81fb326aa392cb493839e3d2cb14a Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 15:49:11 +0200 Subject: [PATCH 2427/4235] Added company backend for nixos-options --- modules/lang/nix/config.el | 7 +++++++ modules/lang/nix/packages.el | 3 +++ 2 files changed, 10 insertions(+) create mode 100644 modules/lang/nix/config.el diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el new file mode 100644 index 000000000..fc69d6727 --- /dev/null +++ b/modules/lang/nix/config.el @@ -0,0 +1,7 @@ +;;; config.el --- description -*- lexical-binding: t; -*- + +(def-package! company-nixos-options + :when (featurep! :completion company) + :after nix-mode + :config + (set-company-backend! 'nix-mode 'company-nixos-options)) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index 7cbed49e6..0049acfcb 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -2,3 +2,6 @@ ;;; lang/nix/packages.el (package! nix-mode) + +(when (featurep! :completion company) + (package! company-nixos-options)) From d3c24e51f18cdfc5497a3ca46885344f582c3a82 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 17:09:28 +0200 Subject: [PATCH 2428/4235] Add support for nix-update --- modules/lang/nix/config.el | 4 ++++ modules/lang/nix/packages.el | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index fc69d6727..060a04e38 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -5,3 +5,7 @@ :after nix-mode :config (set-company-backend! 'nix-mode 'company-nixos-options)) + +(def-package! nix-update + :after nix-mode + :commands (nix-update-fetch)) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index 0049acfcb..6cd491c8b 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -2,6 +2,7 @@ ;;; lang/nix/packages.el (package! nix-mode) +(package! nix-update :recipe (:fetcher github :repo "jwiegley/nix-update-el")) (when (featurep! :completion company) (package! company-nixos-options)) From bdbe942fb9b039bb3e29af556d898d8f7dea88e3 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 17:10:18 +0200 Subject: [PATCH 2429/4235] Make available nix-repl-show --- modules/lang/nix/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index 060a04e38..3cb5d4078 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -9,3 +9,7 @@ (def-package! nix-update :after nix-mode :commands (nix-update-fetch)) + +(def-package! nix-repl + :after nix-mode + :commands (nix-repl-show)) From 1dac12c9c0a79d300db950502c1b6fbf8eb1039d Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 17:10:57 +0200 Subject: [PATCH 2430/4235] Add bindings for nix-mode --- modules/lang/nix/config.el | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index 3cb5d4078..4af40dc4c 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -13,3 +13,14 @@ (def-package! nix-repl :after nix-mode :commands (nix-repl-show)) + +(def-package! nix-mode + :config + (map! :map nix-mode-map + :localleader + :n "f" #'nix-update-fetch + :n "p" #'nix-format-buffer + :n "r" #'nix-repl-show + :n "s" #'nix-shell + :n "b" #'nix-build + :n "u" #'nix-unpack)) From 8ed5ea56d92db6b20e3b4918b1e29132921ef4f1 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 17:13:53 +0200 Subject: [PATCH 2431/4235] Added doctor check for nixfmt --- modules/lang/nix/doctor.el | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 modules/lang/nix/doctor.el diff --git a/modules/lang/nix/doctor.el b/modules/lang/nix/doctor.el new file mode 100644 index 000000000..440ef31b0 --- /dev/null +++ b/modules/lang/nix/doctor.el @@ -0,0 +1,6 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/nix/doctor.el + +(unless (executable-find "nixfmt") + (warn! "Couldn't find nixfmt. nix-format-buffer won't work")) + From 6b236929857c7dd2c9536fb091b410963fd4c4a5 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 16 Jul 2018 17:15:05 +0200 Subject: [PATCH 2432/4235] Whoops! this is available on melpa after all --- modules/lang/nix/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index 6cd491c8b..2ffe1aab7 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -2,7 +2,7 @@ ;;; lang/nix/packages.el (package! nix-mode) -(package! nix-update :recipe (:fetcher github :repo "jwiegley/nix-update-el")) +(package! nix-update) (when (featurep! :completion company) (package! company-nixos-options)) From bc5621adb678ee1a40b7c1abede650e4928e2d8a Mon Sep 17 00:00:00 2001 From: Josh Seba Date: Mon, 16 Jul 2018 16:35:05 -0700 Subject: [PATCH 2433/4235] Add ability to pass additional args to 'doom run' --- bin/doom.cmd | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/bin/doom.cmd b/bin/doom.cmd index 8097a37bd..132691e4b 100644 --- a/bin/doom.cmd +++ b/bin/doom.cmd @@ -1,10 +1,22 @@ :: Forward the ./doom script to Emacs @ECHO OFF +SETLOCAL ENABLEDELAYEDEXPANSION + PUSHD "%~dp0" >NUL -IF "%1"=="runemacs" ( - start runemacs --quick --no-splash -l ..\init.el -f "doom|run-all-startup-hooks" +SET args= +SET command=%1 + +:LOOP +SHIFT /1 +IF NOT [%1]==[] ( + SET args=%args% %1 + GOTO :LOOP +) + +IF [%command%]==[run] ( + start runemacs -Q %args% -l ..\init.el -f "doom|run-all-startup-hooks" ) ELSE ( emacs --quick --script .\doom -- %* ) From ef4d5827a1c710af01619f6c5ca4915dd8af017d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 16 Jul 2018 18:12:50 +0200 Subject: [PATCH 2434/4235] Fix gss/gsS (evil-snipe + evil-easymotion) --- modules/config/default/+bindings.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ab7db32b3..631d091b6 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -170,12 +170,14 @@ "a" (evilem-create #'evil-forward-arg) "A" (evilem-create #'evil-backward-arg) "s" (evilem-create #'evil-snipe-repeat + :name 'evil-easymotion-snipe-forward :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) :bind ((evil-snipe-scope 'buffer) (evil-snipe-enable-highlight) (evil-snipe-enable-incremental-highlight))) - "S" (evilem-create #'evil-snipe-repeat-reverse - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + "S" (evilem-create #'evil-snipe-repeat + :name 'evil-easymotion-snipe-backward + :pre-hook (save-excursion (call-interactively #'evil-snipe-S)) :bind ((evil-snipe-scope 'buffer) (evil-snipe-enable-highlight) (evil-snipe-enable-incremental-highlight))) From 0a4cdf8202de2e7c7e03d9c6d60872730d0ced2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 02:27:39 +0200 Subject: [PATCH 2435/4235] Make haskell-hlint setup DRY --- modules/lang/haskell/+dante.el | 6 +----- modules/lang/haskell/+intero.el | 5 +---- modules/lang/haskell/config.el | 8 +++++++- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 2eb5645f5..51a9e3be4 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,8 +2,4 @@ ;;;###if (featurep! +dante) (def-package! dante - :hook (haskell-mode . dante-mode) - :config - (when (featurep! :feature syntax-checker) - (add-hook! 'dante-mode-hook - (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))))) + :hook (haskell-mode . dante-mode)) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index a99308af9..5dc501743 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -13,7 +13,4 @@ This is necessary because `intero-mode' doesn't do its own error checks." (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config - (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) - (when (featurep! :feature syntax-checker) - (add-hook! 'intero-mode - (flycheck-add-next-checker 'intero '(warning . haskell-hlint))))) + (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index dd5b6d1b4..3facd2086 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -15,5 +15,11 @@ (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) - (add-to-list 'completion-ignored-extensions ".hi")) + (add-to-list 'completion-ignored-extensions ".hi") + + (when (featurep! :feature syntax-checker) + (after! flycheck + (dolist (checker (delq nil (list (if (featurep! +intero) 'intero) + (if (featurep! +dante) 'haskell-dante)))) + (flycheck-add-next-checker checker '(warning . haskell-hlint)))))) From 48af60bb38362a7955607e08f8e5c09ad84944fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 03:20:58 +0200 Subject: [PATCH 2436/4235] Remove redundant :mode from c-mode file template --- modules/feature/file-templates/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index d28e4ae75..e42059c43 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -37,7 +37,7 @@ don't have a :trigger property in `+file-templates-alist'.") ("\\.c\\(?:c\\|pp\\)$" :trigger "__cpp" :mode c++-mode) ("\\.h\\(?:h\\|pp\\|xx\\)$" :trigger "__hpp" :mode c++-mode) ("\\.h$" :trigger "__h" :mode c-mode) - (c-mode :trigger "__c" :mode c-mode) + (c-mode :trigger "__c") ;; go ("/main\\.go$" :trigger "__main.go" :mode go-mode :project t) (go-mode :trigger "__.go") From 0aa351842cd3498b8fcd8b1a7448932f8c825fc9 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 17 Jul 2018 09:56:52 +0200 Subject: [PATCH 2437/4235] clean-up + add helm-nixos-options --- modules/lang/nix/config.el | 25 ++++++++++++++----------- modules/lang/nix/packages.el | 4 ++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index 4af40dc4c..48c02ed82 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -1,21 +1,16 @@ ;;; config.el --- description -*- lexical-binding: t; -*- -(def-package! company-nixos-options - :when (featurep! :completion company) - :after nix-mode - :config - (set-company-backend! 'nix-mode 'company-nixos-options)) - (def-package! nix-update - :after nix-mode :commands (nix-update-fetch)) (def-package! nix-repl - :after nix-mode :commands (nix-repl-show)) -(def-package! nix-mode - :config +(def-package! helm-nixos-options + :when (featurep! :completion helm) + :commands (helm-nixos-options)) + +(after! nix-mode (map! :map nix-mode-map :localleader :n "f" #'nix-update-fetch @@ -23,4 +18,12 @@ :n "r" #'nix-repl-show :n "s" #'nix-shell :n "b" #'nix-build - :n "u" #'nix-unpack)) + :n "u" #'nix-unpack) + + (when (featurep! :completion helm) + (map! :map nix-mode-map + :localleader + :n "o" #'helm-nixos-options)) + + (when (featurep! :completion company) + (set-company-backend! 'nix-mode 'company-nixos-options))) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index 2ffe1aab7..47ebff527 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -2,7 +2,11 @@ ;;; lang/nix/packages.el (package! nix-mode) + (package! nix-update) (when (featurep! :completion company) (package! company-nixos-options)) + +(when (featurep! :completion helm) + (package! helm-nixos-options)) From bd5d305e06408413b567171732d1f1d09b90a796 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 17 Jul 2018 10:03:17 +0200 Subject: [PATCH 2438/4235] Added doc check for nix package manager --- modules/lang/nix/doctor.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/nix/doctor.el b/modules/lang/nix/doctor.el index 440ef31b0..93f4de0c3 100644 --- a/modules/lang/nix/doctor.el +++ b/modules/lang/nix/doctor.el @@ -1,6 +1,9 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; lang/nix/doctor.el -(unless (executable-find "nixfmt") - (warn! "Couldn't find nixfmt. nix-format-buffer won't work")) +(unless (executable-find "nix") + (warn! "Couldn't find the nix package manager. nix-mode won't work.")) + +(unless (executable-find "nixfmt") + (warn! "Couldn't find nixfmt. nix-format-buffer won't work.")) From 7a81f46b39d02e412750ad8ef8d987f4ec4e00c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 13:23:33 +0200 Subject: [PATCH 2439/4235] Refactor lang/nix + Move set-company-backend! out of conditional (it is an autodef, meaning it will simply no-op if the company module is disabled) + Removed helm-nixos-options config, because `helm-nixos-options` is already autoloaded by the package + Simplify map! usage + Move nix-mode to the top, as it is the focal package of this module --- modules/lang/nix/config.el | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index 48c02ed82..b03095541 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -1,16 +1,8 @@ -;;; config.el --- description -*- lexical-binding: t; -*- - -(def-package! nix-update - :commands (nix-update-fetch)) - -(def-package! nix-repl - :commands (nix-repl-show)) - -(def-package! helm-nixos-options - :when (featurep! :completion helm) - :commands (helm-nixos-options)) +;;; lang/nix/config.el -*- lexical-binding: t; -*- (after! nix-mode + (set-company-backend! 'nix-mode 'company-nixos-options) + (map! :map nix-mode-map :localleader :n "f" #'nix-update-fetch @@ -18,12 +10,12 @@ :n "r" #'nix-repl-show :n "s" #'nix-shell :n "b" #'nix-build - :n "u" #'nix-unpack) + :n "u" #'nix-unpack + (:when (featurep! :completion helm) + :n "o" #'helm-nixos-options))) - (when (featurep! :completion helm) - (map! :map nix-mode-map - :localleader - :n "o" #'helm-nixos-options)) +(def-package! nix-update + :commands (nix-update-fetch)) - (when (featurep! :completion company) - (set-company-backend! 'nix-mode 'company-nixos-options))) +(def-package! nix-repl + :commands (nix-repl-show)) From c33de42dce6546400700b6bd50e619cba0d3b4b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 13:59:17 +0200 Subject: [PATCH 2440/4235] Don't use uname in doom/info on windows --- core/autoload/debug.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 82154d74f..47f571ca3 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -40,10 +40,12 @@ ready to be pasted in a bug report on github." ,doom-core-dir ,doom-private-dir) :type 'files :match "\\.elc$")) - (with-temp-buffer - (unless (zerop (call-process "uname" nil t nil "-a")) - (insert (format "%s" system-type))) - (string-trim (buffer-string))) + (if IS-WINDOWS + "n/a" + (with-temp-buffer + (unless (zerop (call-process "uname" nil t nil "-a")) + (insert (format "%s" system-type))) + (string-trim (buffer-string)))) (or (cl-loop with cat = nil for key being the hash-keys of (doom-modules) if (or (not cat) (not (eq cat (car key)))) From 6d0b27477460604f1b9015887af190cb16240a60 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 15:00:54 +0200 Subject: [PATCH 2441/4235] Simplify magit-todos-mode startup --- modules/tools/magit/config.el | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index e583208e6..bc86f6a95 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -42,15 +42,9 @@ load everything.") (def-package! magit-todos - :after magit + :hook (magit-mode . magit-todos-mode) :config (setq magit-todos-require-colon nil) - ;; `magit-todos-mode' defines keybinds on activation, so it's better to just - ;; do this manually: - (magit-add-section-hook 'magit-status-sections-hook - #'magit-todos--insert-todos - 'magit-insert-staged-changes - 'append) (define-key magit-todos-section-map "j" nil)) From bb1171b64be037fcbf2e23298b9168ce5002cde4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 20:57:32 +0200 Subject: [PATCH 2442/4235] lang/python/autoload.el -> autoload/python.el --- modules/lang/python/{autoload.el => autoload/python.el} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename modules/lang/python/{autoload.el => autoload/python.el} (65%) diff --git a/modules/lang/python/autoload.el b/modules/lang/python/autoload/python.el similarity index 65% rename from modules/lang/python/autoload.el rename to modules/lang/python/autoload/python.el index 122ef045a..c6ae3b17c 100644 --- a/modules/lang/python/autoload.el +++ b/modules/lang/python/autoload/python.el @@ -1,4 +1,4 @@ -;;; lang/python/autoload.el -*- lexical-binding: t; -*- +;;; lang/python/autoload/python.el -*- lexical-binding: t; -*- ;;;###autoload (defun +python/repl () From e8d4b74c29a9298ea8106c080f8ad34f3156c659 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 22:06:16 +0200 Subject: [PATCH 2443/4235] lang/python: refactor conda integration Removes the +python-conda-home variable and guesses conda-anaconda-home at startup. --- modules/lang/python/+conda.el | 38 ++++++++++++++++++--------- modules/lang/python/autoload/conda.el | 31 ++++++++++++---------- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/modules/lang/python/+conda.el b/modules/lang/python/+conda.el index 78f373b8a..50d5486f0 100644 --- a/modules/lang/python/+conda.el +++ b/modules/lang/python/+conda.el @@ -1,21 +1,33 @@ ;;; lang/python/+conda.el -*- lexical-binding: t; -*- ;;;###if (featurep! +conda) -;; This file add conda support to doom-emacs. To get started, try `M-x' -;; `+python/set-conda-home' and then `M-x' `conda-env-activate'. +;; Adds conda support to Doom Emacs. `conda-anaconda-home' should be the path to +;; your anaconda installation, and will be guessed from the following: +;; +;; + ~/.anaconda3 +;; + ~/.anaconda +;; + ~/usr/bin/anaconda3 +;; +;; If none of these work, you'll need to set `conda-anaconda-home' yourself. +;; +;; Once set, run M-x `conda-env-activate' to switch between environments OR turn +;; on `conda-env-autoactivate-mode' if you want it done automatically. (def-package! conda :when (featurep! +conda) - :after (python) - :init - (defvar +python-conda-home '("~/.anaconda3" "/usr/bin/anaconda3" "~/.anaconda") - "A list of host pattern and corresponding anaconda home.") + :after python :config - (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap) - (conda-env-autoactivate-mode -1) - ;; (add-hook 'python-mode-hook #'conda-env-activate-for-buffer) + (unless (cl-loop for dir in (list conda-anaconda-home "/usr/bin/anaconda3" "~/.anaconda") + if (file-directory-p dir) + return (setq conda-anaconda-home dir + conda-env-home-directory dir)) + (message "Cannot find Anaconda installation")) + + ;; integration with term/eshell (conda-env-initialize-interactive-shells) - (conda-env-initialize-eshell) - ;; Version management with conda - (add-hook 'conda-postactivate-hook #'+python|add-conda-env-to-modeline) - (add-hook 'conda-postdeactivate-hook #'+python|add-conda-env-to-modeline)) + (after! eshell (conda-env-initialize-eshell)) + + (add-hook! '(conda-postactivate-hook conda-postdeactivate-hook) + #'+python|add-conda-env-to-modeline) + + (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) diff --git a/modules/lang/python/autoload/conda.el b/modules/lang/python/autoload/conda.el index 62778c27d..1d0a25f96 100644 --- a/modules/lang/python/autoload/conda.el +++ b/modules/lang/python/autoload/conda.el @@ -3,25 +3,28 @@ ;;;###autoload (defun +python/set-conda-home () - "Set the CONDA HOME. -Usually it's `~/.anaconda3' on local machine, but you can also set it to a -remote directory using TRAMP syntax such as `/ssh:host:/usr/bin/anaconda3'. In -that way you can use the remote conda environment as well as the corresponding -remote python executable and packages." + "Set `conda-anaconda-home' (ANACONDA_HOME). + +Usually it's `~/.anaconda3' on local machine, but it can be set to a remote +directory using TRAMP syntax, e.g. `/ssh:host:/usr/bin/anaconda3'. This way, you +can use a remote conda environment, including the corresponding remote python +executable and packages." (interactive) - (ivy-read "Set conda home:" +python-conda-home - :history +python/set-conda-home--history - :action (lambda (cand) (setq conda-anaconda-home cand)))) + (require 'conda) + (when-let* ((home (read-directory-name "Set conda home: " "~" nil nil conda-anaconda-home))) + (setq conda-anaconda-home home) + (message "Successfully changed conda home to: %s" (abbreviate-file-name home)))) ;;;###autoload (defun +python|add-conda-env-to-modeline () - "Add conda environment string to the major mode in the modeline." - (setq mode-name - (if conda-env-current-name - (format "Py:conda:%s" conda-env-current-name) - "Python"))) + "Add conda environment string to the major mode modeline segment." + (setq mode-name + (if conda-env-current-name + (format "Py:conda:%s" conda-env-current-name) + "Python"))) + ;;;###autoload -(defun +python*anaconda-mode-bootstrap (&optional callback) +(defun +python*anaconda-mode-bootstrap-in-remote-environments (&optional callback) "Advice to set up the anaconda-mode even in remote environment. Original doc: Run `anaconda-mode' server. From f981b9886e55ee04b58de3a19a4955ec72def9b5 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 17 Jul 2018 23:43:08 +0200 Subject: [PATCH 2444/4235] Add haskell keybindings --- modules/lang/haskell/config.el | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 3facd2086..581c03f84 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -17,6 +17,26 @@ (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) (add-to-list 'completion-ignored-extensions ".hi") + (map! :map haskell-mode-map + :localleader + :n "p" #'hindent-reformat-buffer + :v "p" #'hindent-reformat-region + (:when (featurep! +intero) + :desc "type" :n "t" #'intero-type-at + :desc "info" :n "i" #'intero-info + :desc "load" :n "l" #'intero-repl-load + :desc "eval line" :n "e" #'intero-repl-eval-region + :desc "eval region" :v "e" #'intero-repl-eval-region + :desc "apply suggestions" :n "a" #'intero-apply-suggestions) + (:when (featurep! +dante) + :n "n" "b" #'haskell-process-cabal-build + :desc "goto cabal file" :n "c" #'haskell-cabal-visit-file + :desc "type" :n "t" #'dante-type-at + :desc "info" :n "i" #'dante-info + :desc "load" :n "l" #'haskell-process-load-or-reload + :desc "eval command block >>>" :n "e" #'dante-eval-block + :desc "repair at point" :n "a" #'attrap-attrap) + (when (featurep! :feature syntax-checker) (after! flycheck (dolist (checker (delq nil (list (if (featurep! +intero) 'intero) From c233b84520bfc37f6a47d064b35eb20a179cf718 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 17 Jul 2018 23:43:27 +0200 Subject: [PATCH 2445/4235] Add attrap-attrap --- modules/lang/haskell/+dante.el | 13 +++++++++++++ modules/lang/haskell/packages.el | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 51a9e3be4..510bd7373 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,4 +2,17 @@ ;;;###if (featurep! +dante) (def-package! dante + :init + (setq dante-load-flags '(;; defaults: + "+c" + "-Wwarn=missing-home-modules" + "-fno-diagnostics-show-caret" + ;; neccessary to make attrap-attrap useful: + "-Wall" + ;; necessary to make company completion useful: + "-fdefer-typed-holes" + "-fdefer-type-errors")) :hook (haskell-mode . dante-mode)) + +(def-package! attrap + :commands (attrap-attrap)) diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index 5c822bd9c..c5a0e418a 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -5,6 +5,7 @@ (package! hindent) (cond ((featurep! +dante) - (package! dante)) + (package! dante) + (package! attrap)) ((package! intero))) From 2968374081bd75b20224b1f49c189bde2eee8c4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 17 Jul 2018 23:47:57 +0200 Subject: [PATCH 2446/4235] lang/haskell: fix haskell-hlint checker Causing "not a valid syntax checker" errors because it haskell-hlint was defined too soon. --- modules/lang/haskell/+dante.el | 5 ++++- modules/lang/haskell/+intero.el | 4 +++- modules/lang/haskell/config.el | 8 +------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 51a9e3be4..5c7dd96f6 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,4 +2,7 @@ ;;;###if (featurep! +dante) (def-package! dante - :hook (haskell-mode . dante-mode)) + :hook (haskell-mode . dante-mode) + :config + (when (featurep! :feature syntax-checker) + (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint)))) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 5dc501743..87d9ab65c 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -13,4 +13,6 @@ This is necessary because `intero-mode' doesn't do its own error checks." (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config - (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition)) + (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) + (when (featurep! :feature syntax-checker) + (flycheck-add-next-checker 'intero '(warning . haskell-hlint)))) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 3facd2086..dd5b6d1b4 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -15,11 +15,5 @@ (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) - (add-to-list 'completion-ignored-extensions ".hi") - - (when (featurep! :feature syntax-checker) - (after! flycheck - (dolist (checker (delq nil (list (if (featurep! +intero) 'intero) - (if (featurep! +dante) 'haskell-dante)))) - (flycheck-add-next-checker checker '(warning . haskell-hlint)))))) + (add-to-list 'completion-ignored-extensions ".hi")) From 1f9fcd5c10fc2c697ef592ef1f3bc98dcef2d573 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 08:50:55 +0200 Subject: [PATCH 2447/4235] Lazily load bindings properly --- modules/lang/haskell/config.el | 47 +++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 3068602db..74cdc15cb 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -10,31 +10,38 @@ (def-package! hindent :hook (haskell-mode . hindent-mode)) +(after! haskell-mode + (map! :map haskell-mode-map + :localleader + :n "p" #'hindent-reformat-buffer + :v "p" #'hindent-reformat-region)) + +(after! intero-mode + (map! :map intero-mode-map + :localleader + :n "t" #'intero-type-at + :n "i" #'intero-info + :n "l" #'intero-repl-load + :n "e" #'intero-repl-eval-region + :v "e" #'intero-repl-eval-region + :n "a" #'intero-apply-suggestions)) + +(after! dante-mode + (map! :map dante-mode-map + :localleader + :n "n" "b" #'haskell-process-cabal-build + :n "c" #'haskell-cabal-visit-file + :n "t" #'dante-type-at + :n "i" #'dante-info + :n "l" #'haskell-process-load-or-reload + :n "e" #'dante-eval-block + :n "a" #'attrap-attrap)) + (after! haskell-mode (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) - (map! :map haskell-mode-map - :localleader - :n "p" #'hindent-reformat-buffer - :v "p" #'hindent-reformat-region - (:when (featurep! +intero) - :desc "type" :n "t" #'intero-type-at - :desc "info" :n "i" #'intero-info - :desc "load" :n "l" #'intero-repl-load - :desc "eval line" :n "e" #'intero-repl-eval-region - :desc "eval region" :v "e" #'intero-repl-eval-region - :desc "apply suggestions" :n "a" #'intero-apply-suggestions) - (:when (featurep! +dante) - :n "n" "b" #'haskell-process-cabal-build - :desc "goto cabal file" :n "c" #'haskell-cabal-visit-file - :desc "type" :n "t" #'dante-type-at - :desc "info" :n "i" #'dante-info - :desc "load" :n "l" #'haskell-process-load-or-reload - :desc "eval command block >>>" :n "e" #'dante-eval-block - :desc "repair at point" :n "a" #'attrap-attrap)) - (add-to-list 'completion-ignored-extensions ".hi")) From 6334af8a84a90738291865e43c73b0f32b009c3a Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 08:59:07 +0200 Subject: [PATCH 2448/4235] Fix typo --- modules/lang/haskell/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 74cdc15cb..9044a466a 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -29,7 +29,7 @@ (after! dante-mode (map! :map dante-mode-map :localleader - :n "n" "b" #'haskell-process-cabal-build + :n "b" #'haskell-process-cabal-build :n "c" #'haskell-cabal-visit-file :n "t" #'dante-type-at :n "i" #'dante-info From b0a754391a8102f86d474f9de6fd9ef0d687804b Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 09:11:48 +0200 Subject: [PATCH 2449/4235] Added `stack build` support for intero users --- modules/lang/haskell/+intero.el | 1 + modules/lang/haskell/config.el | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 87d9ab65c..4838759ce 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -13,6 +13,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (message "Couldn't find stack. Refusing to enable intero-mode.")))) (add-hook 'haskell-mode-hook #'+haskell|init-intero) :config + (setq haskell-compile-cabal-build-command "stack build --fast") (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'intero '(warning . haskell-hlint)))) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 9044a466a..7cde919c7 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -13,6 +13,9 @@ (after! haskell-mode (map! :map haskell-mode-map :localleader + ;; this is set to use cabal for dante users and stack for intero users: + :n "b" #'haskell-process-cabal-build + :n "c" #'haskell-cabal-visit-file :n "p" #'hindent-reformat-buffer :v "p" #'hindent-reformat-region)) @@ -29,8 +32,6 @@ (after! dante-mode (map! :map dante-mode-map :localleader - :n "b" #'haskell-process-cabal-build - :n "c" #'haskell-cabal-visit-file :n "t" #'dante-type-at :n "i" #'dante-info :n "l" #'haskell-process-load-or-reload From ed4f7301bad0d0bdc6d37ef6de3c6f004e11dca0 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 09:16:23 +0200 Subject: [PATCH 2450/4235] Removed bibtex dir variable --- modules/lang/latex/config.el | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 0b169fc21..212101c28 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -3,9 +3,6 @@ (defvar +latex-bibtex-file "" "File AUCTeX (specifically RefTeX) uses to search for citations.") -(defvar +latex-bibtex-dir "" - "Where bibtex files are kept.") - (defvar +latex-indent-level-item-continuation 4 "Custom indentation level for items in enumeration-type environments") @@ -187,10 +184,7 @@ (after! bibtex-completion (unless (string-empty-p +latex-bibtex-file) - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)))) - (unless (string-empty-p +latex-bibtex-dir) - (setq bibtex-completion-library-path (list +latex-bibtex-dir) - bibtex-completion-notes-path (expand-file-name "notes.org" +latex-bibtex-dir)))) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) (def-package! company-auctex :when (featurep! :completion company) From a09799d73dfebb42f26273170627fa9829cdf68f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 09:35:32 +0200 Subject: [PATCH 2451/4235] Skim already configured upstream --- modules/lang/latex/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 212101c28..c50c9a15c 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -6,7 +6,6 @@ (defvar +latex-indent-level-item-continuation 4 "Custom indentation level for items in enumeration-type environments") - ;; ;; Plugins ;; @@ -84,7 +83,6 @@ ;; Or Skim (when (featurep! +skim) - (add-to-list 'TeX-view-program-list '("Skim" "/Applications/Skim.app/Contents/SharedSupport/displayline -b -g %n %o %b")) (add-to-list 'TeX-view-program-selection 'output-pdf '("Skim"))) ;; Or Zathura From a5f3c03c35fe13204fe0c9131b118871da1c1a0c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 11:10:55 +0200 Subject: [PATCH 2452/4235] Added warning back in --- modules/lang/latex/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index c50c9a15c..51714f8dc 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -190,6 +190,9 @@ :config (def-package! company-math :defer t + ;; We can't use the `set-company-backend!' because Auctex reports its + ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is + ;; not something `set-company-backend!' anticipates (and shouldn't have to!) :init (add-hook! LaTeX-mode (setq-local company-backends From 944a7dbb4e20bada0711e378f6e8c12b97280e17 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 11:41:12 +0200 Subject: [PATCH 2453/4235] This no longer applies. --- modules/lang/latex/config.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 51714f8dc..44fca3063 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -97,9 +97,6 @@ (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) -;; The preview package is currently broken with the latest AUCTeX version -;; ("11.90.2.2017-07-25) ... and Ghostscript 9.22. It's now fixed in AUCTeX -;; master, so we just have to wait. (def-package! preview :hook (LaTeX-mode . LaTeX-preview-setup) :config From af7450cd0e5c09eb381f5b6a8ee48c85ba907ecb Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:10:58 +0200 Subject: [PATCH 2454/4235] Move latexmk setup into seperate file --- modules/lang/latex/+latexmk.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 modules/lang/latex/+latexmk.el diff --git a/modules/lang/latex/+latexmk.el b/modules/lang/latex/+latexmk.el new file mode 100644 index 000000000..760236453 --- /dev/null +++ b/modules/lang/latex/+latexmk.el @@ -0,0 +1,13 @@ +;;; lang/latex/+latexmk.el -*- lexical-binding: t; -*- +;;;###if (featurep! +latexmk) + +(def-package! auctex-latexmk + :after-call (latex-mode-hook LaTeX-mode-hook) + :init + ;; Pass the -pdf flag when TeX-PDF-mode is active + (setq auctex-latexmk-inherit-TeX-PDF-mode t) + ;; Set LatexMk as the default + (setq-hook! LaTeX-mode TeX-command-default "LatexMk") + :config + ;; Add latexmk as a TeX target + (auctex-latexmk-setup)) From b6c3d5309f83b5c7d3d7e9898d2b1b4049f2e451 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:11:20 +0200 Subject: [PATCH 2455/4235] Move preview-pane setup into seperate file --- modules/lang/latex/+preview-pane.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 modules/lang/latex/+preview-pane.el diff --git a/modules/lang/latex/+preview-pane.el b/modules/lang/latex/+preview-pane.el new file mode 100644 index 000000000..b4bfb342b --- /dev/null +++ b/modules/lang/latex/+preview-pane.el @@ -0,0 +1,16 @@ +;;; lang/latex/+preview-pane.el -*- lexical-binding: t; -*- +;;;###if (featurep! +preview-pane) + +(def-package! latex-preview-pane + :when (featurep! +preview-pane) + :hook ((latex-mode LaTeX-mode) . latex-preview-pane-enable) + :commands latex-preview-pane-mode + :init + (setq latex-preview-pane-multifile-mode 'auctex) + :config + (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) + (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane")) + (define-key! doc-view-mode-map + (kbd "ESC") #'delete-window + "q" #'delete-window + "k" (λ! (quit-window) (delete-window)))) From dc40fa36d3205d2c463661b8c808fae4daaf873c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:11:53 +0200 Subject: [PATCH 2456/4235] Move referencing setup into different file --- modules/lang/latex/+ref.el | 60 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 modules/lang/latex/+ref.el diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el new file mode 100644 index 000000000..ce47b7f9d --- /dev/null +++ b/modules/lang/latex/+ref.el @@ -0,0 +1,60 @@ +;;; lang/latex/+ref.el -*- lexical-binding: t; -*- + +(defvar +latex-bibtex-file "" + "File AUCTeX (specifically RefTeX) uses to search for citations.") + +(def-package! reftex + :hook ((latex-mode LaTeX-mode) . turn-on-reftex) + :init + (setq reftex-plug-into-AUCTeX t + reftex-toc-split-windows-fraction 0.3) + :config + ;; Get ReTeX working with biblatex + ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 + (setq reftex-cite-format + '((?t . "\\textcite[]{%l}") + (?a . "\\autocite[]{%l}") + (?c . "\\cite[]{%l}") + (?s . "\\smartcite[]{%l}") + (?f . "\\footcite[]{%l}") + (?n . "\\nocite{%l}") + (?b . "\\blockcquote[]{%l}{}"))) + (unless (string-empty-p +latex-bibtex-file) + (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) + (map! :map reftex-mode-map + :localleader :n ";" 'reftex-toc) + (add-hook! 'reftex-toc-mode-hook + (reftex-toc-rescan) + (map! :local + :e "j" #'next-line + :e "k" #'previous-line + :e "q" #'kill-buffer-and-window + :e "ESC" #'kill-buffer-and-window))) + +(def-package! company-reftex + :when (featurep! :completion company) + :after reftex + :config + (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) + +(def-package! bibtex + :defer t + :config + (setq bibtex-dialect 'biblatex + bibtex-align-at-equal-sign t + bibtex-text-indentation 20) + (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) + +(def-package! ivy-bibtex + :when (featurep! :completion ivy) + :commands ivy-bibtex) + +(def-package! helm-bibtex + :when (featurep! :completion helm) + :commands helm-bibtex) + +(after! bibtex-completion + (unless (string-empty-p +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) + + From 39e03f4cf1671dca0c80aedfdfd160cc8e44be2f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:12:04 +0200 Subject: [PATCH 2457/4235] Move viewer setup into different file --- modules/lang/latex/+viewers.el | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 modules/lang/latex/+viewers.el diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el new file mode 100644 index 000000000..1e102767a --- /dev/null +++ b/modules/lang/latex/+viewers.el @@ -0,0 +1,22 @@ +;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- + +(when (featurep! +okular) + ;; Configure Okular as viewer. Including a bug fix + ;; (https://bugs.kde.org/show_bug.cgi?id=373855) + (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) + (add-to-list 'TeX-view-program-selection '(output-pdf "Okular"))) + +;; Or Skim +(when (featurep! +skim) + (add-to-list 'TeX-view-program-selection 'output-pdf '("Skim"))) + +;; Or Zathura +(when (featurep! +zathura) + (add-to-list 'TeX-view-program-selection '(output-pdf "Zathura"))) + +;; Or PDF-tools, but only if the module is also loaded +(when (and (featurep! :tools pdf) + (featurep! +pdf-tools)) + (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) + ;; Enable auto reverting the PDF document with PDF Tools + (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)) From 5f14efbc203a40763ec4adb298fc022e1cb41865 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:12:15 +0200 Subject: [PATCH 2458/4235] Spring-cleaning --- modules/lang/latex/config.el | 129 ++++------------------------------- 1 file changed, 12 insertions(+), 117 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 44fca3063..7f65f3c5b 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -1,15 +1,8 @@ ;;; lang/latex/config.el -*- lexical-binding: t; -*- -(defvar +latex-bibtex-file "" - "File AUCTeX (specifically RefTeX) uses to search for citations.") - (defvar +latex-indent-level-item-continuation 4 "Custom indentation level for items in enumeration-type environments") -;; -;; Plugins -;; - ;; sp's default rules are obnoxious, so disable them (provide 'smartparens-latex) @@ -33,14 +26,9 @@ (setq-default TeX-master nil) ;; Display the output of the latex commands in a popup. (set-popup-rule! " output\\*$" :size 15) - - ;; TeX Font Styling - ;; (def-package! tex-style :defer t) - ;; TeX Folding (add-hook 'TeX-mode-hook #'TeX-fold-mode)) - (after! latex (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. '(LaTeX-section-heading @@ -73,28 +61,8 @@ (dolist (env '("itemize" "enumerate" "description")) (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item))) - ;; - ;; Use Okular if the user says so. - (when (featurep! +okular) - ;; Configure Okular as viewer. Including a bug fix - ;; (https://bugs.kde.org/show_bug.cgi?id=373855) - (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) - (add-to-list 'TeX-view-program-selection '(output-pdf "Okular"))) - - ;; Or Skim - (when (featurep! +skim) - (add-to-list 'TeX-view-program-selection 'output-pdf '("Skim"))) - - ;; Or Zathura - (when (featurep! +zathura) - (add-to-list 'TeX-view-program-selection '(output-pdf "Zathura"))) - - ;; Or PDF-tools, but only if the module is also loaded - (when (and (featurep! :tools pdf) - (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) - ;; Enable auto reverting the PDF document with PDF Tools - (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer))) + ;; Set-up viewers + (load! "+viewers")) (def-package! preview @@ -104,83 +72,6 @@ preview-scale-function (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) - -(def-package! latex-preview-pane - :when (featurep! +preview-pane) - :hook ((latex-mode LaTeX-mode) . latex-preview-pane-enable) - :commands latex-preview-pane-mode - :init - (setq latex-preview-pane-multifile-mode 'auctex) - :config - (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) - (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane")) - (define-key! doc-view-mode-map - (kbd "ESC") #'delete-window - "q" #'delete-window - "k" (λ! (quit-window) (delete-window)))) - - -(def-package! reftex - :hook ((latex-mode LaTeX-mode) . turn-on-reftex) - :init - (setq reftex-plug-into-AUCTeX t - reftex-toc-split-windows-fraction 0.3) - :config - ;; Get ReTeX working with biblatex - ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 - (setq reftex-cite-format - '((?t . "\\textcite[]{%l}") - (?a . "\\autocite[]{%l}") - (?c . "\\cite[]{%l}") - (?s . "\\smartcite[]{%l}") - (?f . "\\footcite[]{%l}") - (?n . "\\nocite{%l}") - (?b . "\\blockcquote[]{%l}{}"))) - (unless (string-empty-p +latex-bibtex-file) - (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) - (map! :map reftex-mode-map - :localleader :n ";" 'reftex-toc) - (add-hook! 'reftex-toc-mode-hook - (reftex-toc-rescan) - (map! :local - :e "j" #'next-line - :e "k" #'previous-line - :e "q" #'kill-buffer-and-window - :e "ESC" #'kill-buffer-and-window))) - - -(def-package! bibtex - :defer t - :config - (setq bibtex-dialect 'biblatex - bibtex-align-at-equal-sign t - bibtex-text-indentation 20) - (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) - -(def-package! auctex-latexmk - :when (featurep! +latexmk) - :after-call (latex-mode-hook LaTeX-mode-hook) - :init - ;; Pass the -pdf flag when TeX-PDF-mode is active - (setq auctex-latexmk-inherit-TeX-PDF-mode t) - ;; Set LatexMk as the default - (setq-hook! LaTeX-mode TeX-command-default "LatexMk") - :config - ;; Add latexmk as a TeX target - (auctex-latexmk-setup)) - -(def-package! ivy-bibtex - :when (featurep! :completion ivy) - :commands ivy-bibtex) - -(def-package! helm-bibtex - :when (featurep! :completion helm) - :commands helm-bibtex) - -(after! bibtex-completion - (unless (string-empty-p +latex-bibtex-file) - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) - (def-package! company-auctex :when (featurep! :completion company) :after latex @@ -198,13 +89,17 @@ company-auctex-environments)) company-backends))))) -(def-package! company-reftex - :when (featurep! :completion company) - :after reftex - :config - (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) - ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap :hook (LaTeX-mode . adaptive-wrap-prefix-mode) :init (setq-default adaptive-wrap-extra-indent 0)) + +;; referencing + bibtex setup +(load! "+ref") + +;; +;; Sub-modules +;; + +(if (featurep! +latexmk) (load! "+latexmk")) +(if (featurep! +preview-pane) (load! "+preview-pane")) From 9fc5d9472eb906e8b6a92632b853a4aeba94bede Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:15:55 +0200 Subject: [PATCH 2459/4235] Viewers should be loaded after tex --- modules/lang/latex/config.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 7f65f3c5b..c82f555e9 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -9,6 +9,8 @@ (after! tex ;; Set some varibles to fontify common LaTeX commands. (load! "+fontification") +;; Set-up viewers + (load! "+viewers") (setq TeX-parse-self t ; Enable parse on load. TeX-save-query nil ; just save, don't ask @@ -59,10 +61,7 @@ (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") ;; Set a custom item indentation (dolist (env '("itemize" "enumerate" "description")) - (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item))) - - ;; Set-up viewers - (load! "+viewers")) + (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item)))) (def-package! preview From 3120636a2393b61f6321b6be066c95f59fe057db Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 12:22:22 +0200 Subject: [PATCH 2460/4235] This is (probably) no longer necessary --- modules/lang/latex/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index c82f555e9..78d9ade38 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -41,8 +41,6 @@ LaTeX-fill-break-at-separators nil LaTeX-item-indent 0) ; item indentation. - (define-key LaTeX-mode-map "\C-j" nil) - ;; Do not prompt for Master files, this allows auto-insert to add templates to ;; .tex files (add-hook! '(LaTeX-mode-hook TeX-mode-hook) From 96bcff1c0289d6982bf053caa08fc70142ed06a1 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 13:37:49 +0200 Subject: [PATCH 2461/4235] Simplify latexmk setup --- modules/lang/latex/+latexmk.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/latex/+latexmk.el b/modules/lang/latex/+latexmk.el index 760236453..ded53f27f 100644 --- a/modules/lang/latex/+latexmk.el +++ b/modules/lang/latex/+latexmk.el @@ -2,7 +2,8 @@ ;;;###if (featurep! +latexmk) (def-package! auctex-latexmk - :after-call (latex-mode-hook LaTeX-mode-hook) + :defer t + :after latex :init ;; Pass the -pdf flag when TeX-PDF-mode is active (setq auctex-latexmk-inherit-TeX-PDF-mode t) From fae43bea518c96213c9e04cc7c9d809feffcd84c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 13:38:02 +0200 Subject: [PATCH 2462/4235] Large refactor using def-package! --- modules/lang/latex/config.el | 82 ++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 78d9ade38..69d691168 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -3,35 +3,58 @@ (defvar +latex-indent-level-item-continuation 4 "Custom indentation level for items in enumeration-type environments") +(defvar +latex-bibtex-file "" + "File AUCTeX (specifically RefTeX) uses to search for citations.") + +;; +;; Plugins +;; + ;; sp's default rules are obnoxious, so disable them (provide 'smartparens-latex) -(after! tex - ;; Set some varibles to fontify common LaTeX commands. +(def-package! tex + :mode ("\\.tex\\'" . TeX-latex-mode) + :hook (TeX-mode . visual-line-mode) + :config + ;; fontify common latex commands (load! "+fontification") -;; Set-up viewers + ;; select viewer (load! "+viewers") - - (setq TeX-parse-self t ; Enable parse on load. - TeX-save-query nil ; just save, don't ask - TeX-auto-save t ; Enable parse on save. - ;; Use hidden directories for AUCTeX files. + (setq TeX-parse-self t ;; parse on load + TeX-auto-save t ;; parse on save + ;; use hidden dirs for auctex files TeX-auto-local ".auctex-auto" TeX-style-local ".auctex-style" - ;; When correlating sources to rendered PDFs, don't start the emacs - ;; server - TeX-source-correlate-start-server nil TeX-source-correlate-mode t TeX-source-correlate-method 'synctex - ;; Fonts for section, subsection, etc - font-latex-fontify-sectioning 1.15) + ;; don't start the emacs server when correlating sources + TeX-source-correlate-start-server nil + ;; automatically insert braces after sub/superscript in math mode + TeX-electric-sub-and-superscript t) + ;; prompt for master (setq-default TeX-master nil) - ;; Display the output of the latex commands in a popup. + ;; set-up chktex + (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") + ;; display output of latex commands in popup (set-popup-rule! " output\\*$" :size 15) - ;; TeX Folding - (add-hook 'TeX-mode-hook #'TeX-fold-mode)) + ;; Do not prompt for Master files, this allows auto-insert to add templates to + ;; .tex files + (add-hook! 'TeX-mode-hook (remove-hook 'find-file-hook + (cl-find-if #'byte-code-function-p find-file-hook) + 'local)) + ;; Enable rainbow mode after applying styles to the buffer + (add-hook! 'TeX-update-style-hook #'rainbow-delimiters-mode) + (when (featurep! :feature spellcheck) + (add-hook 'TeX-mode-hook #'flyspell-mode :append))) -(after! latex +; Fold TeX macros +(def-package! tex-fold + :hook (TeX-mode . TeX-fold-mode)) + +(def-package! latex + :defer t + :config (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. '(LaTeX-section-heading LaTeX-section-title @@ -39,36 +62,21 @@ LaTeX-section-section LaTeX-section-label) LaTeX-fill-break-at-separators nil - LaTeX-item-indent 0) ; item indentation. - - ;; Do not prompt for Master files, this allows auto-insert to add templates to - ;; .tex files - (add-hook! '(LaTeX-mode-hook TeX-mode-hook) - (remove-hook 'find-file-hook - (cl-find-if #'byte-code-function-p find-file-hook) - 'local)) - ;; Adding useful things for latex - (add-hook! 'LaTeX-mode-hook - #'(TeX-source-correlate-mode - visual-line-mode)) - ;; Enable rainbow mode after applying styles to the buffer - (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) - (when (featurep! :feature spellcheck) - (add-hook 'LaTeX-mode-hook #'flyspell-mode :append)) - ;; Use chktex to search for errors in a latex file. - (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") - ;; Set a custom item indentation + LaTeX-item-indent 0) + ;; Set custom item indentation (dolist (env '("itemize" "enumerate" "description")) (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item)))) - +;; set-up preview package (def-package! preview + :defer t :hook (LaTeX-mode . LaTeX-preview-setup) :config (setq-default preview-scale 1.4 preview-scale-function (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) +;; set-up company-auctex, but with company-math supplying the math symbols backend (def-package! company-auctex :when (featurep! :completion company) :after latex From e7465018fcd6fd11c095df0a835ae4fa4c101271 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 13:38:48 +0200 Subject: [PATCH 2463/4235] This shouldn't be tied to pdf-tools --- modules/lang/latex/+viewers.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index 1e102767a..2f0519a0e 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,5 +1,8 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- +;; Update PDF buffers after successful LaTeX runs +(add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer) + (when (featurep! +okular) ;; Configure Okular as viewer. Including a bug fix ;; (https://bugs.kde.org/show_bug.cgi?id=373855) @@ -17,6 +20,4 @@ ;; Or PDF-tools, but only if the module is also loaded (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) - ;; Enable auto reverting the PDF document with PDF Tools - (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)) + (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools"))) From 6e67e5b3e4c8adbb15c36039b8f7550ed843b53b Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 13:39:15 +0200 Subject: [PATCH 2464/4235] simplify reftex declaration --- modules/lang/latex/+ref.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index ce47b7f9d..8c4b552be 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -1,13 +1,8 @@ ;;; lang/latex/+ref.el -*- lexical-binding: t; -*- -(defvar +latex-bibtex-file "" - "File AUCTeX (specifically RefTeX) uses to search for citations.") - (def-package! reftex - :hook ((latex-mode LaTeX-mode) . turn-on-reftex) - :init - (setq reftex-plug-into-AUCTeX t - reftex-toc-split-windows-fraction 0.3) + :defer t + :hook (LaTeX-mode . reftex-mode) :config ;; Get ReTeX working with biblatex ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 @@ -18,7 +13,9 @@ (?s . "\\smartcite[]{%l}") (?f . "\\footcite[]{%l}") (?n . "\\nocite{%l}") - (?b . "\\blockcquote[]{%l}{}"))) + (?b . "\\blockcquote[]{%l}{}")) + reftex-plug-into-AUCTeX t + reftex-toc-split-windows-fraction 0.3) (unless (string-empty-p +latex-bibtex-file) (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (map! :map reftex-mode-map @@ -31,14 +28,15 @@ :e "q" #'kill-buffer-and-window :e "ESC" #'kill-buffer-and-window))) +;; set up completion for citations and references (def-package! company-reftex :when (featurep! :completion company) :after reftex :config (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) +;; set up mode for bib files (def-package! bibtex - :defer t :config (setq bibtex-dialect 'biblatex bibtex-align-at-equal-sign t From 0aa15c162251d5382f39f5176cd00eba5e0cb9b0 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 13:39:30 +0200 Subject: [PATCH 2465/4235] simplify hook --- modules/lang/latex/+preview-pane.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/+preview-pane.el b/modules/lang/latex/+preview-pane.el index b4bfb342b..734c6494e 100644 --- a/modules/lang/latex/+preview-pane.el +++ b/modules/lang/latex/+preview-pane.el @@ -3,7 +3,7 @@ (def-package! latex-preview-pane :when (featurep! +preview-pane) - :hook ((latex-mode LaTeX-mode) . latex-preview-pane-enable) + :hook (LaTeX-mode . latex-preview-pane-enable) :commands latex-preview-pane-mode :init (setq latex-preview-pane-multifile-mode 'auctex) From 9174b6c0e44c9e591bf2ea92dea159ef42bd40bd Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 14:03:31 +0200 Subject: [PATCH 2466/4235] Stop chktex from producing garbage --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 69d691168..f967e77c5 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -35,7 +35,7 @@ ;; prompt for master (setq-default TeX-master nil) ;; set-up chktex - (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 %s") + (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 -H %s") ;; display output of latex commands in popup (set-popup-rule! " output\\*$" :size 15) ;; Do not prompt for Master files, this allows auto-insert to add templates to From 581536396f9d3a5623fcd27bd226d612c6a1c7b6 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 14:04:23 +0200 Subject: [PATCH 2467/4235] Tell emacs how to parse tex files --- modules/lang/latex/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index f967e77c5..783c7731e 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -36,6 +36,9 @@ (setq-default TeX-master nil) ;; set-up chktex (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 -H %s") + ;; tell emacs how to parse tex files + (add-hook! 'tex-mode-hook + (lambda () (setq ispell-parser 'tex))) ;; display output of latex commands in popup (set-popup-rule! " output\\*$" :size 15) ;; Do not prompt for Master files, this allows auto-insert to add templates to From c5fd541773161b2ced23d3e3f0e97d285759b2c6 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 15:31:35 +0200 Subject: [PATCH 2468/4235] Implement @hlissner's suggestions --- modules/lang/latex/+latexmk.el | 1 - modules/lang/latex/+ref.el | 4 +--- modules/lang/latex/config.el | 11 ++++------- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/modules/lang/latex/+latexmk.el b/modules/lang/latex/+latexmk.el index ded53f27f..3e6c52d7a 100644 --- a/modules/lang/latex/+latexmk.el +++ b/modules/lang/latex/+latexmk.el @@ -2,7 +2,6 @@ ;;;###if (featurep! +latexmk) (def-package! auctex-latexmk - :defer t :after latex :init ;; Pass the -pdf flag when TeX-PDF-mode is active diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 8c4b552be..7c7d53a6c 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -1,7 +1,6 @@ ;;; lang/latex/+ref.el -*- lexical-binding: t; -*- (def-package! reftex - :defer t :hook (LaTeX-mode . reftex-mode) :config ;; Get ReTeX working with biblatex @@ -36,8 +35,7 @@ (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) ;; set up mode for bib files -(def-package! bibtex - :config +(after! bibtex (setq bibtex-dialect 'biblatex bibtex-align-at-equal-sign t bibtex-text-indentation 20) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 783c7731e..478c8b974 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -37,8 +37,7 @@ ;; set-up chktex (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 -H %s") ;; tell emacs how to parse tex files - (add-hook! 'tex-mode-hook - (lambda () (setq ispell-parser 'tex))) + (add-hook! 'tex-mode-hook (setq ispell-parser 'tex)) ;; display output of latex commands in popup (set-popup-rule! " output\\*$" :size 15) ;; Do not prompt for Master files, this allows auto-insert to add templates to @@ -47,7 +46,8 @@ (cl-find-if #'byte-code-function-p find-file-hook) 'local)) ;; Enable rainbow mode after applying styles to the buffer - (add-hook! 'TeX-update-style-hook #'rainbow-delimiters-mode) + (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) + (add-hook 'TeX-mode-hook #'visual-line-mode) (when (featurep! :feature spellcheck) (add-hook 'TeX-mode-hook #'flyspell-mode :append))) @@ -55,9 +55,7 @@ (def-package! tex-fold :hook (TeX-mode . TeX-fold-mode)) -(def-package! latex - :defer t - :config +(after! latex (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. '(LaTeX-section-heading LaTeX-section-title @@ -72,7 +70,6 @@ ;; set-up preview package (def-package! preview - :defer t :hook (LaTeX-mode . LaTeX-preview-setup) :config (setq-default preview-scale 1.4 From 03e7d1a66ca6a08ba52c1a837256ab0fd7ef48db Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 15:38:32 +0200 Subject: [PATCH 2469/4235] Sort entries and add `parencite` Co-authored by: @UndeadKernel --- modules/lang/latex/+ref.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 7c7d53a6c..048b9048c 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -6,13 +6,14 @@ ;; Get ReTeX working with biblatex ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 (setq reftex-cite-format - '((?t . "\\textcite[]{%l}") - (?a . "\\autocite[]{%l}") + '((?a . "\\autocite[]{%l}") + (?b . "\\blockcquote[]{%l}{}") (?c . "\\cite[]{%l}") - (?s . "\\smartcite[]{%l}") (?f . "\\footcite[]{%l}") (?n . "\\nocite{%l}") - (?b . "\\blockcquote[]{%l}{}")) + (?p . "\\parencite[]{%l}") + (?s . "\\smartcite[]{%l}") + (?t . "\\textcite[]{%l}")) reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) (unless (string-empty-p +latex-bibtex-file) From 6b58c8d4512c811e65458ff88e141117c8f4949b Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 16:22:47 +0200 Subject: [PATCH 2470/4235] De-tangle company-auctex and company-math Co-authored-by: Henrik Lissner --- modules/lang/latex/config.el | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 478c8b974..031dca7e4 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -76,23 +76,28 @@ preview-scale-function (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) -;; set-up company-auctex, but with company-math supplying the math symbols backend +(defvar +latex--company-backends nil) + (def-package! company-auctex :when (featurep! :completion company) - :after latex - :config - (def-package! company-math - :defer t - ;; We can't use the `set-company-backend!' because Auctex reports its - ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is - ;; not something `set-company-backend!' anticipates (and shouldn't have to!) - :init - (add-hook! LaTeX-mode - (setq-local company-backends - (append '((company-math-symbols-latex - company-auctex-macros - company-auctex-environments)) - company-backends))))) + :defer t + :init + (add-to-list '+latex--company-backends 'company-auctex-environments nil #'eq) + (add-to-list '+latex--company-backends 'company-auctex-macros nil #'eq)) + +(def-package! company-math + :when (featurep! :completion company) + :defer t + :init + (add-to-list '+latex--company-backends 'company-math-symbols-latex nil #'eq)) + +(when +latex--company-backends + ;; We can't use the `set-company-backend!' because Auctex reports its + ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is + ;; not something `set-company-backend!' anticipates (and shouldn't have to!) + (add-hook! 'LaTeX-mode-hook + (add-to-list (make-local-variable 'company-backends) + +latex--company-backends))) ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap From c1381d7747637ecf2ad9c3c8157db95027545b03 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 16:58:26 +0200 Subject: [PATCH 2471/4235] Defer company-reftex --- modules/lang/latex/+ref.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 048b9048c..02f5e6904 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -31,8 +31,8 @@ ;; set up completion for citations and references (def-package! company-reftex :when (featurep! :completion company) - :after reftex - :config + :defer t + :init (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) ;; set up mode for bib files From f497d1bf0d2e57a6661aea8075ecadb3a4fcd729 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 16:59:15 +0200 Subject: [PATCH 2472/4235] Fix regression --- modules/lang/latex/+viewers.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index 2f0519a0e..a4522be30 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,7 +1,6 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- ;; Update PDF buffers after successful LaTeX runs -(add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer) (when (featurep! +okular) ;; Configure Okular as viewer. Including a bug fix @@ -20,4 +19,5 @@ ;; Or PDF-tools, but only if the module is also loaded (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools"))) + (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) + (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)) From c502fe6328ec3940c13879db4abff2cb079eae14 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 17:20:52 +0200 Subject: [PATCH 2473/4235] Added +unicode-math flag --- modules/lang/latex/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 031dca7e4..052422ebf 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -89,13 +89,18 @@ :when (featurep! :completion company) :defer t :init - (add-to-list '+latex--company-backends 'company-math-symbols-latex nil #'eq)) + (if (featurep! +unicode-math) + (add-to-list '+latex--company-backends 'company-math-symbols-unicode nil #'eq) + (add-to-list '+latex--company-backends 'company-math-symbols-latex nil #'eq))) (when +latex--company-backends ;; We can't use the `set-company-backend!' because Auctex reports its ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is ;; not something `set-company-backend!' anticipates (and shouldn't have to!) (add-hook! 'LaTeX-mode-hook + (when (featurep! +unicode-math) + (setq-local company-math-allow-unicode-symbols-in-faces (quote (tex-math font-latex-math-face))) + (setq-local company-math-disallow-unicode-symbols-in-faces nil)) (add-to-list (make-local-variable 'company-backends) +latex--company-backends))) From 55dd23899e6963d3529e7df6aa1143817c8a3394 Mon Sep 17 00:00:00 2001 From: Brett Mandler Date: Wed, 18 Jul 2018 10:24:14 -0400 Subject: [PATCH 2474/4235] Added fish config --- modules/lang/fish/config.el | 9 +++++++++ modules/lang/fish/packages.el | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 modules/lang/fish/config.el create mode 100644 modules/lang/fish/packages.el diff --git a/modules/lang/fish/config.el b/modules/lang/fish/config.el new file mode 100644 index 000000000..cb2d6b425 --- /dev/null +++ b/modules/lang/fish/config.el @@ -0,0 +1,9 @@ +;;; lang/fish/config.el -*- lexical-binding: t; -*- + +(def-package! fish-mode + :mode "\\.fish$" + :interpreter "fish" + :config + (add-hook! fish-mode + (add-hook 'before-save-hook #'fish_indent-before-save))) + diff --git a/modules/lang/fish/packages.el b/modules/lang/fish/packages.el new file mode 100644 index 000000000..50c37611d --- /dev/null +++ b/modules/lang/fish/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/fish/packages.el + +(package! fish-mode) From eeb10ae6cdc32b9f67a6fab10350d372ff506c6f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 18 Jul 2018 17:25:27 +0200 Subject: [PATCH 2475/4235] Put comment in right place --- modules/lang/latex/+viewers.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index a4522be30..46a4a1b2c 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,7 +1,5 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- -;; Update PDF buffers after successful LaTeX runs - (when (featurep! +okular) ;; Configure Okular as viewer. Including a bug fix ;; (https://bugs.kde.org/show_bug.cgi?id=373855) @@ -20,4 +18,5 @@ (when (and (featurep! :tools pdf) (featurep! +pdf-tools)) (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) + ;; Update PDF buffers after successful LaTeX runs (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)) From 8bdc0f72b82cd81c75a8c0b0dfbedcef302ff341 Mon Sep 17 00:00:00 2001 From: Brett Mandler Date: Wed, 18 Jul 2018 11:29:26 -0400 Subject: [PATCH 2476/4235] Added fish to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 5141f6371..f2f1140ef 100644 --- a/init.example.el +++ b/init.example.el @@ -86,6 +86,7 @@ ;elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses ;ess ; emacs speaks statistics + ;fish ; finally, a decent shell ;go ; the hipster dialect ;(haskell +intero) ; a language that's lazier than I am ;hy ; readability of scheme w/ speed of python From 8ff5543d3bb6bdea36228d00f755460810f98c85 Mon Sep 17 00:00:00 2001 From: Brett Mandler Date: Wed, 18 Jul 2018 15:56:55 -0400 Subject: [PATCH 2477/4235] Moved lang/fish into lang/sh +fish --- init.example.el | 3 +-- modules/lang/fish/config.el | 9 --------- modules/lang/fish/packages.el | 4 ---- modules/lang/sh/config.el | 6 ++++++ modules/lang/sh/packages.el | 3 +++ 5 files changed, 10 insertions(+), 15 deletions(-) delete mode 100644 modules/lang/fish/config.el delete mode 100644 modules/lang/fish/packages.el diff --git a/init.example.el b/init.example.el index f2f1140ef..469ba9f5d 100644 --- a/init.example.el +++ b/init.example.el @@ -86,7 +86,6 @@ ;elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses ;ess ; emacs speaks statistics - ;fish ; finally, a decent shell ;go ; the hipster dialect ;(haskell +intero) ; a language that's lazier than I am ;hy ; readability of scheme w/ speed of python @@ -116,7 +115,7 @@ ;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} ;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() ;scala ; java, but good - sh ; she sells (ba|z)sh shells on the C xor + (sh +fish) ; she sells (ba|z)sh shells on the C xor ;solidity ; do you need a blockchain? No. ;swift ; who asked for emoji variables? ;web ; the tubes diff --git a/modules/lang/fish/config.el b/modules/lang/fish/config.el deleted file mode 100644 index cb2d6b425..000000000 --- a/modules/lang/fish/config.el +++ /dev/null @@ -1,9 +0,0 @@ -;;; lang/fish/config.el -*- lexical-binding: t; -*- - -(def-package! fish-mode - :mode "\\.fish$" - :interpreter "fish" - :config - (add-hook! fish-mode - (add-hook 'before-save-hook #'fish_indent-before-save))) - diff --git a/modules/lang/fish/packages.el b/modules/lang/fish/packages.el deleted file mode 100644 index 50c37611d..000000000 --- a/modules/lang/fish/packages.el +++ /dev/null @@ -1,4 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; lang/fish/packages.el - -(package! fish-mode) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 2c1d7e748..e739f2f00 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -62,3 +62,9 @@ (set-company-backend! 'sh-mode '(company-shell company-files)) (setq company-shell-delete-duplicates t)) +(def-package! fish-mode + :when (featurep! +fish) + :defer t + :config + (add-hook! fish-mode + (add-hook 'before-save-hook #'fish_indent-before-save))) diff --git a/modules/lang/sh/packages.el b/modules/lang/sh/packages.el index 11f456485..d3e3ad9e1 100644 --- a/modules/lang/sh/packages.el +++ b/modules/lang/sh/packages.el @@ -6,3 +6,6 @@ (when (featurep! :completion company) (package! company-shell)) + +(when (featurep! +fish) + (package! fish-mode)) From f6f74efdee2a7bc27357537ff60ff5776c0ee8d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Jul 2018 19:27:13 +0200 Subject: [PATCH 2478/4235] Refactor lang/php --- modules/lang/php/config.el | 42 +++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index e435067de..6e0136d73 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -1,5 +1,7 @@ ;;; lang/php/config.el -*- lexical-binding: t; -*- +(defvar +php--company-backends nil) + ;; (def-package! hack-mode ;; :mode "\\.hh$" ;; :config @@ -7,12 +9,9 @@ (def-package! php-mode - :mode "\\.php[s345]?$" - :mode "\\.inc$" + :mode "\\.inc\\'" :interpreter "php" :config - (add-hook 'php-mode-hook #'ac-php-core-eldoc-setup) - ;; Disable HTML compatibility in php-mode. `web-mode' has superior support for ;; php+html. Use the .phtml (setq php-template-compatibility nil) @@ -22,10 +21,10 @@ ;; ac-php provides custom autocompletion, php-extras provides autocompletion ;; for built-in libraries - (set-company-backend! 'php-mode '(company-ac-php-backend php-extras-company)) + (when +php--company-backends + (set-company-backend! 'php-mode +php--company-backends)) - ;; default is 10; this optimizes `smartparens' performance, but limits sp - ;; pairs to 6 characters. + ;; Use the smallest `sp-max-pair-length' for optimum `smartparens' performance (setq-hook! 'php-mode-hook sp-max-pair-length 6) (sp-with-modes '(php-mode) @@ -49,11 +48,16 @@ :n "s" #'phpunit-current-test))) +(def-package! php-refactor-mode + :hook php-mode) + + (def-package! php-extras :after php-mode :init ;; company will set up itself (advice-add #'php-extras-company-setup :override #'ignore) + (add-to-list '+php--company-backends 'php-extras-company nil #'eq) :config (setq php-extras-eldoc-functions-file (concat doom-etc-dir "php-extras-eldoc-functions")) @@ -62,29 +66,21 @@ (unless (file-exists-p (concat php-extras-eldoc-functions-file ".el")) (message "Generating PHP eldoc files...") (require 'async) - (async-start `(lambda () - ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") - (require 'php-extras-gen-eldoc) - (php-extras-generate-eldoc-1 t)) + (async-start (lambda () + ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") + (require 'php-extras-gen-eldoc) + (php-extras-generate-eldoc-1 t)) (lambda (_) (load (concat php-extras-eldoc-functions-file ".el")) (message "PHP eldoc updated!"))))) -(def-package! php-refactor-mode - :hook php-mode) - - -(def-package! phpunit - :commands (phpunit-current-test phpunit-current-class phpunit-current-project)) - - -(def-package! php-boris :commands php-boris) - - (def-package! company-php :when (featurep! :completion company) - :commands (company-ac-php-backend ac-php-remake-tags ac-php-remake-tags-all ac-php-core-eldoc-setup) + :commands (ac-php-remake-tags ac-php-remake-tags-all) + :hook (php-mode . ac-php-core-eldoc-setup) + :init + (add-to-list '+php--company-backends 'company-ac-php-backend nil #'eq) :config (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) From 95d6c6664dc7978edf7b1cf5944f55b3ed44ba95 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 18 Jul 2018 19:58:33 +0200 Subject: [PATCH 2479/4235] lang/php: simplify rules for smartparens --- modules/lang/php/config.el | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 6e0136d73..ea01efcb4 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -28,12 +28,8 @@ (setq-hook! 'php-mode-hook sp-max-pair-length 6) (sp-with-modes '(php-mode) - (sp-local-pair "/* " "*/" :post-handlers '(("||\n[i] " "RET") ("| " "SPC"))) - (sp-local-pair "") - (sp-local-pair "") - (sp-local-pair "") - (sp-local-pair "" :when '(("RET")) :post-handlers '("||\n[i]")) - (sp-local-pair "" :when '(("RET")) :post-handlers '("||\n[i]"))) + (sp-local-pair "" :post-handlers '(("| " "SPC" "=") ("||\n[i]" "RET") ("[d2]" "p"))) + (sp-local-pair "" :post-handlers '(("| " "SPC") ("||\n[i]" "RET")))) (map! :map php-mode-map :localleader From ce12aaa4bbb5f9124e48ec1c8e6bb4affc547189 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 03:38:01 +0200 Subject: [PATCH 2480/4235] lang/cc: use def-package! for demangle-mode This way, if demangle-mode is disabled, so is its hook. --- 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 cef9238af..ae33e0b37 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -190,7 +190,8 @@ compilation database is present in the project.") ;; `demangle-mode' -(add-hook 'llvm-mode-hook #'demangle-mode) +(def-package! demangle-mode + :hook llvm-mode) ;; `glsl-mode' From 8756837036571b9f7a9f11d692e7dfab13d76c9b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 03:38:52 +0200 Subject: [PATCH 2481/4235] ui/treemacs: disable treemacs-follow-mode Can be disruptive if you've got many windows with buffers across different projects. Also, SPC o P is available to "jump to current file" in the treemacs window. --- modules/ui/treemacs/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 0662c5b16..9f596546d 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -28,6 +28,7 @@ There are 2 possible values: (defvar treemacs-collapse-dirs (if (executable-find "python3") 3 0)) + (treemacs-follow-mode -1) (treemacs-filewatch-mode t) (when (memq +treemacs-use-git-mode '(simple extended)) (treemacs-git-mode +treemacs-use-git-mode))) From d6461d495beba60485d6ddc1a667dcde658948a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 03:40:31 +0200 Subject: [PATCH 2482/4235] General & minor reformatting+refactor --- init.example.el | 2 +- modules/emacs/vc/config.el | 2 +- modules/lang/common-lisp/config.el | 9 ++++----- modules/lang/markdown/config.el | 6 ++---- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/init.example.el b/init.example.el index 469ba9f5d..caaa7cc52 100644 --- a/init.example.el +++ b/init.example.el @@ -76,9 +76,9 @@ :lang ;assembly ; assembly for fun or debugging ;(cc +irony +rtags); C/C++/Obj-C madness + ;clojure ; java with a lisp ;common-lisp ; if you've seen one lisp, you've seen them all ;crystal ; ruby at the speed of c - ;clojure ; java with a lisp ;csharp ; unity, .NET, and mono shenanigans data ; config/data formats ;erlang ; an elegant language for a more civilized age diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 6a8f81b68..d44fd95d0 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -34,7 +34,7 @@ ;; `vc-annotate' (built-in) (after! vc-annotate (set-popup-rules! - '(("^\\vc-d" :select nil) ; *vc-diff* + '(("^\\vc-d" :select nil) ; *vc-diff* ("^\\vc-c" :select t))) ; *vc-change-log* (set-evil-initial-state! '(vc-annotate-mode vc-git-log-view-mode) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index de7d84dc4..c3b84a961 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -1,6 +1,5 @@ ;;; lang/common-lisp/config.el -*- lexical-binding: t; -*- -;; `slime' (after! sly (setq inferior-lisp-program "sbcl") @@ -39,10 +38,10 @@ (when (featurep! :feature evil +everywhere) (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps) (unless evil-move-beyond-eol - (advice-add 'sly-eval-last-expression :around '+common-lisp*sly-last-sexp) - (advice-add 'sly-pprint-eval-last-expression :around '+common-lisp*sly-last-sexp) - (advice-add 'sly-eval-print-last-expression :around '+common-lisp*sly-last-sexp) - (advice-add 'sly-eval-last-expression-in-repl :around '+common-lisp*sly-last-sexp)) + (advice-add #'sly-eval-last-expression :around #'+common-lisp*sly-last-sexp) + (advice-add #'sly-pprint-eval-last-expression :around #'+common-lisp*sly-last-sexp) + (advice-add #'sly-eval-print-last-expression :around #'+common-lisp*sly-last-sexp) + (advice-add #'sly-eval-last-expression-in-repl :around #'+common-lisp*sly-last-sexp)) (set-evil-initial-state! '(sly-db-mode sly-inspector-mode sly-popup-buffer-mode sly-xref-mode) 'normal) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 53b226708..089786093 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -53,7 +53,5 @@ (def-package! pandoc-mode :when (featurep! +pandoc) - :commands - pandoc-mode - :hook - (markdown-mode . conditionally-turn-on-pandoc)) + :commands pandoc-mode + :hook (markdown-mode . conditionally-turn-on-pandoc)) From dc68d7aad8cf8452df5f48a9a6b7efd77ebb33b4 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 11:02:26 +0200 Subject: [PATCH 2483/4235] Moved intero map --- modules/lang/haskell/+intero.el | 10 +++++++++- modules/lang/haskell/config.el | 10 ---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 4838759ce..b92a20c2a 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -16,4 +16,12 @@ This is necessary because `intero-mode' doesn't do its own error checks." (setq haskell-compile-cabal-build-command "stack build --fast") (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) (when (featurep! :feature syntax-checker) - (flycheck-add-next-checker 'intero '(warning . haskell-hlint)))) + (flycheck-add-next-checker 'intero '(warning . haskell-hlint))) + + (map! :map intero-mode-map + :localleader + :n "t" #'intero-type-at + :n "i" #'intero-info + :n "l" #'intero-repl-load + :nv "e" #'intero-repl-eval-region + :n "a" #'intero-apply-suggestions)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 7cde919c7..8eb910dd2 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -19,16 +19,6 @@ :n "p" #'hindent-reformat-buffer :v "p" #'hindent-reformat-region)) -(after! intero-mode - (map! :map intero-mode-map - :localleader - :n "t" #'intero-type-at - :n "i" #'intero-info - :n "l" #'intero-repl-load - :n "e" #'intero-repl-eval-region - :v "e" #'intero-repl-eval-region - :n "a" #'intero-apply-suggestions)) - (after! dante-mode (map! :map dante-mode-map :localleader From 406e8f31f6d86c4f33fd6ed16dcddd56c7a9e718 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 11:03:16 +0200 Subject: [PATCH 2484/4235] Move dante mode map --- modules/lang/haskell/+dante.el | 10 +++++++++- modules/lang/haskell/config.el | 9 --------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index ee876fc80..5a7a06b28 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -18,4 +18,12 @@ :hook (haskell-mode . dante-mode) :config (when (featurep! :feature syntax-checker) - (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint)))) + (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))) + + (map! :map dante-mode-map + :localleader + :n "t" #'dante-type-at + :n "i" #'dante-info + :n "l" #'haskell-process-load-or-reload + :n "e" #'dante-eval-block + :n "a" #'attrap-attrap)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 8eb910dd2..9aba2d82c 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -19,15 +19,6 @@ :n "p" #'hindent-reformat-buffer :v "p" #'hindent-reformat-region)) -(after! dante-mode - (map! :map dante-mode-map - :localleader - :n "t" #'dante-type-at - :n "i" #'dante-info - :n "l" #'haskell-process-load-or-reload - :n "e" #'dante-eval-block - :n "a" #'attrap-attrap)) - (after! haskell-mode (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) From 9d4c9c33066bc4f50d3b0913699bed52ca4569b0 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 11:04:17 +0200 Subject: [PATCH 2485/4235] Move haskell-mode bindings --- modules/lang/haskell/config.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 9aba2d82c..968299eaf 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,6 +11,13 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode + (add-hook 'haskell-mode-hook #'interactive-haskell-mode) + (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) + (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) + (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) + + (add-to-list 'completion-ignored-extensions ".hi") + (map! :map haskell-mode-map :localleader ;; this is set to use cabal for dante users and stack for intero users: @@ -19,11 +26,3 @@ :n "p" #'hindent-reformat-buffer :v "p" #'hindent-reformat-region)) -(after! haskell-mode - (add-hook 'haskell-mode-hook #'interactive-haskell-mode) - (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) - (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) - (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) - - (add-to-list 'completion-ignored-extensions ".hi")) - From c51b088c6e1725aeccc3006d3b002ec63c93c536 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 11:04:48 +0200 Subject: [PATCH 2486/4235] Remove attrap def-package --- modules/lang/haskell/+dante.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 5a7a06b28..c6919c8db 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -1,9 +1,6 @@ ;;; lang/haskell/+dante.el -*- lexical-binding: t; -*- ;;;###if (featurep! +dante) -(def-package! attrap - :commands (attrap-attrap)) - (def-package! dante :init (setq dante-load-flags '(;; defaults: From 96ecadf9e6522aa76ff32ea185801083ac3e4467 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 11:05:31 +0200 Subject: [PATCH 2487/4235] Re-order blocks --- modules/lang/haskell/+dante.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index c6919c8db..dcc4b7e97 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,6 +2,7 @@ ;;;###if (featurep! +dante) (def-package! dante + :hook (haskell-mode . dante-mode) :init (setq dante-load-flags '(;; defaults: "+c" @@ -12,7 +13,6 @@ ;; necessary to make company completion useful: "-fdefer-typed-holes" "-fdefer-type-errors")) - :hook (haskell-mode . dante-mode) :config (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))) From e9207b09bb859b79c4a26adb4d1bf0da7afdebaa Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 11:36:34 +0200 Subject: [PATCH 2488/4235] Add support for the dhall configuration language --- modules/lang/data/config.el | 3 +++ modules/lang/data/packages.el | 1 + 2 files changed, 4 insertions(+) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index cc3e79889..3fc401815 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -25,6 +25,9 @@ :desc "Kill fields" :nvm "k" #'csv-kill-fields :desc "Transpose fields" :nvm "t" #'csv-transpose)) +(def-package! dhall-mode + :mode "\\.dhall\\'") + (def-package! graphql-mode :mode "\\.gql\\'") diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el index a34a56266..cb211419f 100644 --- a/modules/lang/data/packages.el +++ b/modules/lang/data/packages.el @@ -8,3 +8,4 @@ (package! vimrc-mode) (package! yaml-mode) (package! csv-mode) +(package! dhall-mode) From 037f872a023e2ad8b3b9197c795366205dc51ce1 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 12:10:41 +0200 Subject: [PATCH 2489/4235] Fix final regression (hopefully!) --- modules/lang/latex/config.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 052422ebf..0801e3adb 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -93,16 +93,19 @@ (add-to-list '+latex--company-backends 'company-math-symbols-unicode nil #'eq) (add-to-list '+latex--company-backends 'company-math-symbols-latex nil #'eq))) +(if (featurep! +unicode-math) +(defun math-setup () + (setq-local company-math-allow-unicode-symbols-in-faces (quote (tex-math font-latex-math-face))) + (setq-local company-math-disallow-unicode-symbols-in-faces nil) + (add-to-list (make-local-variable 'company-backends) +latex--company-backends)) +(defun math-setup () + (add-to-list (make-local-variable 'company-backends) +latex--company-backends))) + (when +latex--company-backends ;; We can't use the `set-company-backend!' because Auctex reports its ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is ;; not something `set-company-backend!' anticipates (and shouldn't have to!) - (add-hook! 'LaTeX-mode-hook - (when (featurep! +unicode-math) - (setq-local company-math-allow-unicode-symbols-in-faces (quote (tex-math font-latex-math-face))) - (setq-local company-math-disallow-unicode-symbols-in-faces nil)) - (add-to-list (make-local-variable 'company-backends) - +latex--company-backends))) + (add-hook! 'LaTeX-mode-hook 'math-setup)) ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap From 6b971e91b1ea415a2acc255e885a9c6e1878230d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 15:25:45 +0200 Subject: [PATCH 2490/4235] Remove dhall def-package block dhall registers `\\.dhall\\'` in auto-mode-alist in its autoloads file, so this block is unnecessary. --- modules/lang/data/config.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 3fc401815..cc3e79889 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -25,9 +25,6 @@ :desc "Kill fields" :nvm "k" #'csv-kill-fields :desc "Transpose fields" :nvm "t" #'csv-transpose)) -(def-package! dhall-mode - :mode "\\.dhall\\'") - (def-package! graphql-mode :mode "\\.gql\\'") From 5d361534ce97085113fab6794f9e693794020704 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 15:43:30 +0200 Subject: [PATCH 2491/4235] Move set-company-backend! into reftex config Since the company-reftex config doesn't do anything else, and set-company-backend! is an autodef function, it will no-op if :completion company isn't enabled. --- modules/lang/latex/+ref.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 02f5e6904..6235fec06 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -3,6 +3,8 @@ (def-package! reftex :hook (LaTeX-mode . reftex-mode) :config + ;; set up completion for citations and references + (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations) ;; Get ReTeX working with biblatex ;; http://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992 (setq reftex-cite-format @@ -28,13 +30,6 @@ :e "q" #'kill-buffer-and-window :e "ESC" #'kill-buffer-and-window))) -;; set up completion for citations and references -(def-package! company-reftex - :when (featurep! :completion company) - :defer t - :init - (set-company-backend! 'reftex-mode 'company-reftex-labels 'company-reftex-citations)) - ;; set up mode for bib files (after! bibtex (setq bibtex-dialect 'biblatex From 66679d2f7b27038d85de131d0b23fe88e9ec0552 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 15:44:23 +0200 Subject: [PATCH 2492/4235] Remove (ivy|helm)-bibtex def-package's ivy-bibtex and helm-bibtex are autoloaded by their respective packages' autoloads files, so their def-package! blocks are unnecessary. --- modules/lang/latex/+ref.el | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 6235fec06..52ec92937 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -37,14 +37,6 @@ bibtex-text-indentation 20) (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) -(def-package! ivy-bibtex - :when (featurep! :completion ivy) - :commands ivy-bibtex) - -(def-package! helm-bibtex - :when (featurep! :completion helm) - :commands helm-bibtex) - (after! bibtex-completion (unless (string-empty-p +latex-bibtex-file) (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) From 3a5af1d59191b422c0ee679bd5b575c562603979 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 16:34:13 +0200 Subject: [PATCH 2493/4235] Added subword mode hook. --- modules/lang/haskell/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 968299eaf..37cd31d57 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,6 +11,7 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode + (add-hook 'haskell-mode-hook 'subword-mode) (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) From 864e15f19de4e316de5799dd7fba18c30181493c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 16:37:22 +0200 Subject: [PATCH 2494/4235] Add support for folding haskell code blocks --- modules/lang/haskell/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 37cd31d57..c8b6a95d4 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,7 +11,8 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode - (add-hook 'haskell-mode-hook 'subword-mode) + (add-hook 'haskell-mode-hook 'subword-mode) ;; improves text navigation with camelCase: + (add-hook 'haskell-mode-hook 'haskell-collapse-mode) ;; support collapsing haskell code blocks. (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) @@ -25,5 +26,7 @@ :n "b" #'haskell-process-cabal-build :n "c" #'haskell-cabal-visit-file :n "p" #'hindent-reformat-buffer - :v "p" #'hindent-reformat-region)) + :v "p" #'hindent-reformat-region + :n "h" #'haskell-hide-toggle + :n "H" #'haskell-hide-toggle-all)) From b0af6bcbef8333060612d623bc9fad6f81e2cfba Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 17:00:01 +0200 Subject: [PATCH 2495/4235] Add some useful haskell-mode options --- modules/lang/haskell/config.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index c8b6a95d4..83e3bbbea 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,8 +11,11 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode + (setq haskell-process-suggest-remove-import-lines t ;; warnings for redundant imports etc. + haskell-process-auto-import-loaded-modules t ;; auto import modules + haskell-process-show-overlays nil) ;;flycheck makes this unnecessary (add-hook 'haskell-mode-hook 'subword-mode) ;; improves text navigation with camelCase: - (add-hook 'haskell-mode-hook 'haskell-collapse-mode) ;; support collapsing haskell code blocks. + (add-hook 'haskell-mode-hook #'haskell-collapse-mode) ;; support collapsing haskell code blocks. (add-hook 'haskell-mode-hook #'interactive-haskell-mode) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) @@ -27,6 +30,6 @@ :n "c" #'haskell-cabal-visit-file :n "p" #'hindent-reformat-buffer :v "p" #'hindent-reformat-region - :n "h" #'haskell-hide-toggle - :n "H" #'haskell-hide-toggle-all)) + :v "h" #'haskell-hide-toggle + :nv "H" #'haskell-hide-toggle-all)) From 4980c66e154abb7d0a947b2e823564e45a6bbc51 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 17:09:19 +0200 Subject: [PATCH 2496/4235] Disable overlays conditionally if flycheck is loaded --- modules/lang/haskell/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 83e3bbbea..8454129f7 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -12,8 +12,9 @@ (after! haskell-mode (setq haskell-process-suggest-remove-import-lines t ;; warnings for redundant imports etc. - haskell-process-auto-import-loaded-modules t ;; auto import modules - haskell-process-show-overlays nil) ;;flycheck makes this unnecessary + haskell-process-auto-import-loaded-modules t) ;; auto import modules + (when! (featurep! :feature syntax-checker) + (setq haskell-process-show-overlays nil)) ;;flycheck makes this unnecessary (add-hook 'haskell-mode-hook 'subword-mode) ;; improves text navigation with camelCase: (add-hook 'haskell-mode-hook #'haskell-collapse-mode) ;; support collapsing haskell code blocks. (add-hook 'haskell-mode-hook #'interactive-haskell-mode) From 82fee0161114443de4a1159aa411300bfbb8ac4b Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 19 Jul 2018 17:13:56 +0200 Subject: [PATCH 2497/4235] fix typo --- modules/lang/haskell/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 8454129f7..a0dc5b99d 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -13,8 +13,8 @@ (after! haskell-mode (setq haskell-process-suggest-remove-import-lines t ;; warnings for redundant imports etc. haskell-process-auto-import-loaded-modules t) ;; auto import modules - (when! (featurep! :feature syntax-checker) - (setq haskell-process-show-overlays nil)) ;;flycheck makes this unnecessary + (when (featurep! :feature syntax-checker) + (setq haskell-process-show-overlays nil)) ;;flycheck makes this unnecessary (add-hook 'haskell-mode-hook 'subword-mode) ;; improves text navigation with camelCase: (add-hook 'haskell-mode-hook #'haskell-collapse-mode) ;; support collapsing haskell code blocks. (add-hook 'haskell-mode-hook #'interactive-haskell-mode) From ce9f7f9bde314682700d666645cc087b3118d648 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 19:03:05 +0200 Subject: [PATCH 2498/4235] lang/haskell: minor reformatting & refactor Conform to conventions, use `add-hook!` for multiple hooks, use single semi-colon for eol comments, remove comments redundant with code, and use sharp-quote to indicate function symbol. --- modules/lang/haskell/config.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index a0dc5b99d..5b0231441 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -11,13 +11,14 @@ :hook (haskell-mode . hindent-mode)) (after! haskell-mode - (setq haskell-process-suggest-remove-import-lines t ;; warnings for redundant imports etc. - haskell-process-auto-import-loaded-modules t) ;; auto import modules + (setq haskell-process-suggest-remove-import-lines t ; warnings for redundant imports etc + haskell-process-auto-import-loaded-modules t) (when (featurep! :feature syntax-checker) - (setq haskell-process-show-overlays nil)) ;;flycheck makes this unnecessary - (add-hook 'haskell-mode-hook 'subword-mode) ;; improves text navigation with camelCase: - (add-hook 'haskell-mode-hook #'haskell-collapse-mode) ;; support collapsing haskell code blocks. - (add-hook 'haskell-mode-hook #'interactive-haskell-mode) + (setq haskell-process-show-overlays nil)) ; flycheck makes this unnecessary + (add-hook! 'haskell-mode-hook + #'(subword-mode ; improves text navigation with camelCase + haskell-collapse-mode ; support folding haskell code blocks + interactive-haskell-mode)) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) From e5afab1e17727a0efdfc25931046744f549b3cca Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 20 Jul 2018 12:29:44 +0200 Subject: [PATCH 2499/4235] math highlighting and org-mode compat --- modules/lang/markdown/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 089786093..7be9cf9b8 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -12,7 +12,9 @@ markdown-make-gfm-checkboxes-buttons t markdown-gfm-additional-languages '("sh") markdown-fontify-code-blocks-natively t - markdown-hide-urls nil) ; trigger with `markdown-toggle-url-hiding' + markdown-hide-urls nil ; trigger with `markdown-toggle-url-hiding' + markdown-enable-math ; syntax highlighting for latex fragments + markdown-gfm-uppercase-checkbox t ) ; compatibility with org-mode :config (defun +markdown|set-fill-column-and-line-spacing () From 75278663cced23e2e33e6c18329148fa5bdb62da Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 20 Jul 2018 13:48:02 +0200 Subject: [PATCH 2500/4235] header scaling --- modules/lang/markdown/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 7be9cf9b8..8ab8751a9 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -14,7 +14,8 @@ markdown-fontify-code-blocks-natively t markdown-hide-urls nil ; trigger with `markdown-toggle-url-hiding' markdown-enable-math ; syntax highlighting for latex fragments - markdown-gfm-uppercase-checkbox t ) ; compatibility with org-mode + markdown-gfm-uppercase-checkbox t ; for compat with org-mode + markdown-header-scaling t) ; fontify section headers :config (defun +markdown|set-fill-column-and-line-spacing () From ccd6ceab8610a9174f27a0601cebcf6c08d575e9 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 20 Jul 2018 13:54:23 +0200 Subject: [PATCH 2501/4235] fix typo --- modules/lang/markdown/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 8ab8751a9..2f03b8005 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -13,7 +13,7 @@ markdown-gfm-additional-languages '("sh") markdown-fontify-code-blocks-natively t markdown-hide-urls nil ; trigger with `markdown-toggle-url-hiding' - markdown-enable-math ; syntax highlighting for latex fragments + markdown-enable-math t; syntax highlighting for latex fragments markdown-gfm-uppercase-checkbox t ; for compat with org-mode markdown-header-scaling t) ; fontify section headers From 8b00a208cf7d9f2d2ab36174abccf18971919f27 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 20 Jul 2018 13:56:04 +0200 Subject: [PATCH 2502/4235] typo --- modules/lang/markdown/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 2f03b8005..b4ae34c63 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -13,7 +13,7 @@ markdown-gfm-additional-languages '("sh") markdown-fontify-code-blocks-natively t markdown-hide-urls nil ; trigger with `markdown-toggle-url-hiding' - markdown-enable-math t; syntax highlighting for latex fragments + markdown-enable-math t ; syntax highlighting for latex fragments markdown-gfm-uppercase-checkbox t ; for compat with org-mode markdown-header-scaling t) ; fontify section headers From faf59ff2a9a0daf4fe8d875099711e1326f0d8c8 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 20 Jul 2018 14:23:17 +0200 Subject: [PATCH 2503/4235] undo header scaling --- modules/lang/markdown/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index b4ae34c63..11d4d3c03 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -14,8 +14,7 @@ markdown-fontify-code-blocks-natively t markdown-hide-urls nil ; trigger with `markdown-toggle-url-hiding' markdown-enable-math t ; syntax highlighting for latex fragments - markdown-gfm-uppercase-checkbox t ; for compat with org-mode - markdown-header-scaling t) ; fontify section headers + markdown-gfm-uppercase-checkbox t) ; for compat with org-mode :config (defun +markdown|set-fill-column-and-line-spacing () From 41cf970c75a20d7e227d632157019102c0774262 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 19 Jul 2018 14:40:30 +0200 Subject: [PATCH 2504/4235] Autosave org capture popups Prevents unsaved confirmation prompts when the org-capture popup is closed. --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index dec91e19b..c57956e79 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -140,7 +140,7 @@ unfold to point on startup." :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) ("^\\*Org Src" :size 0.3 :quit nil :select t) - ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t)))) + ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t :autosave t)))) (defun +org|setup-pretty-code () "Setup the default pretty symbols for" From 7f284e98b633eed15830e08ca71da28c3aa65667 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Jul 2018 01:20:05 +0200 Subject: [PATCH 2505/4235] Fix helm-M-x help popup not properly closing On successive TAB presses on a command --- modules/ui/popup/+hacks.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 6aa30cded..b8d1a4333 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -170,7 +170,16 @@ the command buffer." ;; `helm' (after! helm (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window)) - (set-popup-rule! "^\\*helm" :ignore t)) + (set-popup-rule! "^\\*helm" :ignore t) + + ;; Fix left-over popup window when closing persistent help for `helm-M-x' + (defun +popup*helm-elisp--persistent-help (candidate fun &optional name) + (let (win) + (when (and (helm-attr 'help-running-p) + (string= candidate (helm-attr 'help-current-symbol)) + (setq win (get-buffer-window (get-buffer (help-buffer))))) + (delete-window win)))) + (advice-add #'helm-elisp--persistent-help :before #'+popup*helm-elisp--persistent-help)) ;; `helm-ag' From 28e21352ec0d083c13ffe5484f41c3d2d10d29ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Jul 2018 01:20:59 +0200 Subject: [PATCH 2506/4235] Have popup manager handle treemacs windows Other windows would be resized slightly incorrectly because treemacs opens as a fixed split, rather than a side window. This change forces it to be a side window, which resolves the problem _and_ restores the functionality of balance-windows, which is disabled when a fixed split is present. --- modules/ui/popup/+hacks.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index b8d1a4333..8f43afd73 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -282,6 +282,14 @@ instead of switch-to-buffer-*." (set-popup-rule! "\\(^\\*Contents\\|'s annots\\*$\\)" :ignore t)) +;; `treemacs' +(after! treemacs + (set-popup-rule! "^ \\*Treemacs" :side 'left :size treemacs-width :quit nil) + (defun +popup*set-popup (&rest _) + (+popup--init (selected-window))) + (advice-add #'treemacs--setup-buffer :after #'+popup*set-popup)) + + ;; `wgrep' (progn ;; close the popup after you're done with a wgrep buffer From ec4922074007775414ff22b9a7cb6225f54db11f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Jul 2018 01:29:38 +0200 Subject: [PATCH 2507/4235] emacs/dired: add-hook -> :hook --- modules/emacs/dired/config.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 31679b398..1b878c206 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -42,11 +42,9 @@ (def-package! dired-k - :after dired + :hook (dired-initial-position . dired-k) + :hook (dired-after-readin . dired-k-no-revert) :config - (add-hook 'dired-initial-position-hook #'dired-k) - (add-hook 'dired-after-readin-hook #'dired-k-no-revert) - (defun +dired*interrupt-process (orig-fn &rest args) "Fixes dired-k killing git processes too abruptly, leaving behind disruptive .git/index.lock files." From 399194e8683b47448285a82c394b8e7f86a15cb3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 21 Jul 2018 14:00:02 +0200 Subject: [PATCH 2508/4235] Autoload +popup--init Fixes #766 --- modules/ui/popup/autoload/popup.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 224056ff6..f6ac1da82 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -28,6 +28,7 @@ the buffer is visible, then set another timer and try again later." (let (kill-buffer-hook kill-buffer-query-functions) (kill-buffer buffer)))))))))) +;;;###autoload (defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the default window parameters for popup windows, clears leftover transient timers From 6b06cd32ac25703c8ca848c140fff3a0cba9f912 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 22 Jul 2018 17:38:24 +0200 Subject: [PATCH 2509/4235] Add :autosave t :ttl nil to Org src popups Suggested by @fuxialexander --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c57956e79..bee1bd342 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -139,7 +139,7 @@ unfold to point on startup." ("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Export Dispatcher\\|Select\\)\\)" :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) - ("^\\*Org Src" :size 0.3 :quit nil :select t) + ("^\\*Org Src" :size 0.3 :quit nil :select t :autosave t :ttl nil) ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t :autosave t)))) (defun +org|setup-pretty-code () From e865526c75c307b8a2cf48fcf7a018364b8660e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 23 Jul 2018 00:06:47 +0200 Subject: [PATCH 2510/4235] Add +(helm|ivy)-project-search-engines variables This allows you to control what search engines for project-search commands (bound to SPC / p) to try, and in what order. If you didn't want to use ripgrep, for instance, remove 'rg from these variables, or move it to the end of the list. --- modules/completion/helm/autoload/helm.el | 17 +++++++++-------- modules/completion/helm/config.el | 10 ++++++++++ modules/completion/ivy/autoload/ivy.el | 17 +++++++++-------- modules/completion/ivy/config.el | 10 ++++++++++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index ce8e3b9ea..533e21eb8 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -33,9 +33,9 @@ order. (helm-ag--default-directory directory) (helm-ag--default-target (list directory)) (engine (or engine - (and (executable-find "rg") 'rg) - (and (executable-find "ag") 'ag) - (and (executable-find "pt") 'pt) + (cl-loop for tool in +ivy-project-search-engines + if (executable-find (symbol-name tool)) + return tool) (and (or (executable-find "grep") (executable-find "git")) 'grep) @@ -131,11 +131,12 @@ list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), preform search from current directory." (interactive "P") (call-interactively - (cond ((executable-find "rg") (if arg #'+helm/rg-from-cwd #'+helm/rg)) - ((executable-find "ag") (if arg #'+helm/ag-from-cwd #'+helm/ag)) - ((executable-find "pt") (if arg #'+helm/pt-from-cwd #'+helm/pt)) - (arg #'+helm/grep-from-cwd) - (#'+helm/grep)))) + (or (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines) + if (executable-find (symbol-name tool)) + return (intern (format "+helm/%s%s" tool (if arg "-from-cwd" "")))) + (if arg + #'+helm/grep-from-cwd + #'+helm/grep)))) ;; Relative to project root ;;;###autoload diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 27e17e721..9a1a0faea 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -3,6 +3,16 @@ (defvar +helm-global-prompt "››› " "The helm text prompt prefix string is globally replaced with this string.") +(defvar +helm-project-search-engines '(rg ag pt) + "What search tools for `+helm/project-search' (and `+helm-file-search' when no +ENGINE is specified) to try, and in what order. + +To disable a particular tool, remove it from this list. To prioritize a tool +over others, move it to the front of the list. Later duplicates in this list are +silently ignored. + +If you want to already use git-grep or grep, set this to nil.") + ;; ;; Packages diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 84cf3c1f0..094f8400c 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -224,9 +224,9 @@ order. (directory (or in project-root)) (default-directory directory) (engine (or engine - (and (executable-find "rg") 'rg) - (and (executable-find "ag") 'ag) - (and (executable-find "pt") 'pt) + (cl-loop for tool in +ivy-project-search-engines + if (executable-find (symbol-name tool)) + return tool) (and (or (executable-find "grep") (executable-find "git")) 'grep) @@ -285,11 +285,12 @@ list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), preform search from current directory." (interactive "P") (call-interactively - (cond ((executable-find "rg") (if arg #'+ivy/rg-from-cwd #'+ivy/rg)) - ((executable-find "ag") (if arg #'+ivy/ag-from-cwd #'+ivy/ag)) - ((executable-find "pt") (if arg #'+ivy/pt-from-cwd #'+ivy/pt)) - (arg #'+ivy/grep-from-cwd) - (#'+ivy/grep)))) + (or (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines) + if (executable-find (symbol-name tool)) + return (intern (format "+ivy/%s%s" tool (if arg "-from-cwd" "")))) + (if arg + #'+ivy/grep-from-cwd + #'+ivy/grep)))) ;;;###autoload (defun +ivy/rg (all-files-p &optional query directory) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 409df5fca..c68bed7ef 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -9,6 +9,16 @@ "An alist of tags for `+ivy/tasks' to include in its search, whose CDR is the face to render it with.") +(defvar +ivy-project-search-engines '(rg ag pt) + "What search tools for `+ivy/project-search' (and `+ivy-file-search' when no +ENGINE is specified) to try, and in what order. + +To disable a particular tool, remove it from this list. To prioritize a tool +over others, move it to the front of the list. Later duplicates in this list are +silently ignored. + +If you want to already use git-grep or grep, set this to nil.") + (defmacro +ivy-do-action! (action) "Returns an interactive lambda that sets the current ivy action and immediately runs it on the current candidate (ending the ivy session)." From 9a23492888f09d1414431b465916ed23cc2a9ffa Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 23 Jul 2018 15:47:40 +0200 Subject: [PATCH 2511/4235] Removed unicode-math setup --- modules/lang/latex/config.el | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 0801e3adb..0109a2cb8 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -89,23 +89,13 @@ :when (featurep! :completion company) :defer t :init - (if (featurep! +unicode-math) - (add-to-list '+latex--company-backends 'company-math-symbols-unicode nil #'eq) - (add-to-list '+latex--company-backends 'company-math-symbols-latex nil #'eq))) - -(if (featurep! +unicode-math) -(defun math-setup () - (setq-local company-math-allow-unicode-symbols-in-faces (quote (tex-math font-latex-math-face))) - (setq-local company-math-disallow-unicode-symbols-in-faces nil) - (add-to-list (make-local-variable 'company-backends) +latex--company-backends)) -(defun math-setup () - (add-to-list (make-local-variable 'company-backends) +latex--company-backends))) + (add-to-list '+latex--company-backends '+latex-symbols-company-backend nil #'eq)) (when +latex--company-backends ;; We can't use the `set-company-backend!' because Auctex reports its ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is ;; not something `set-company-backend!' anticipates (and shouldn't have to!) - (add-hook! 'LaTeX-mode-hook 'math-setup)) + (add-hook! 'LaTeX-mode-hook (add-to-list (make-local-variable 'company-backends) +latex--company-backends))) ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap From a8d41a93c00266e3e3bef3cde170691fb79eb53e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 24 Jul 2018 14:07:13 +0200 Subject: [PATCH 2512/4235] Fix helm project search commands Used ivy variable in helm commands, causing a void-variable error. Reported by @ar1a --- modules/completion/helm/autoload/helm.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 533e21eb8..401d1dd6e 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -33,7 +33,7 @@ order. (helm-ag--default-directory directory) (helm-ag--default-target (list directory)) (engine (or engine - (cl-loop for tool in +ivy-project-search-engines + (cl-loop for tool in +helm-project-search-engines if (executable-find (symbol-name tool)) return tool) (and (or (executable-find "grep") @@ -131,7 +131,7 @@ list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), preform search from current directory." (interactive "P") (call-interactively - (or (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines) + (or (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines) if (executable-find (symbol-name tool)) return (intern (format "+helm/%s%s" tool (if arg "-from-cwd" "")))) (if arg From 277915b28c6b483f66d5c9bada8c57504920eb84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 24 Jul 2018 14:18:44 +0200 Subject: [PATCH 2513/4235] Fix order of +(helm|ivy)-project-search-engines --- modules/completion/helm/autoload/helm.el | 2 +- modules/completion/ivy/autoload/ivy.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 401d1dd6e..0c1ec29b5 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -131,7 +131,7 @@ list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), preform search from current directory." (interactive "P") (call-interactively - (or (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines) + (or (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines :from-end t) if (executable-find (symbol-name tool)) return (intern (format "+helm/%s%s" tool (if arg "-from-cwd" "")))) (if arg diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 094f8400c..51c715dfc 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -285,7 +285,7 @@ list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), preform search from current directory." (interactive "P") (call-interactively - (or (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines) + (or (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines :from-end t) if (executable-find (symbol-name tool)) return (intern (format "+ivy/%s%s" tool (if arg "-from-cwd" "")))) (if arg From ebd3b0223ed340855a489d81da070536e369735f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 24 Jul 2018 20:01:42 +0200 Subject: [PATCH 2514/4235] Fix followed org links not recentering correctly Links like `file:test.cpp::45` would open file.cpp, but end up somewhere else than line 45. Same with links like `file:test.cpp::int main()`. --- modules/lang/org/autoload/org.el | 6 ++---- modules/lang/org/config.el | 6 ++++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 4859fb687..c4a22eec9 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -60,8 +60,7 @@ If on a: - link: follow it - otherwise, refresh all inline images in current tree." (interactive) - (let* ((scroll-pt (window-start)) - (context (org-element-context)) + (let* ((context (org-element-context)) (type (org-element-type context))) ;; skip over unimportant contexts (while (and context (memq type '(verbatim code bold italic underline strike-through subscript superscript))) @@ -127,8 +126,7 @@ If on a: (+org/refresh-inline-images) (org-open-at-point)))) - (_ (+org/refresh-inline-images))) - (set-window-start nil scroll-pt))) + (_ (+org/refresh-inline-images))))) ;;;###autoload (defun +org/insert-item (direction) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index bee1bd342..d9b884fe1 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -347,6 +347,12 @@ between the two." ;; Don't open separate windows (setf (alist-get 'file org-link-frame-setup) #'find-file) + (defun +org|delayed-recenter () + "`recenter', but after a tiny delay. Necessary to prevent certain race +conditions where a window's buffer hasn't changed at the time this hook is run." + (run-at-time 0.1 nil #'recenter)) + (add-hook 'org-follow-link-hook #'+org|delayed-recenter) + ;; Fix variable height org-level-N faces in the eldoc string (defun +org*fix-font-size-variation-in-eldoc (orig-fn) (cl-letf (((symbol-function 'org-format-outline-path) From f58f3c3604b9478a6c3cfbcbbdf9021e48517bae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 24 Jul 2018 20:04:03 +0200 Subject: [PATCH 2515/4235] ui/nav-flash: refactor + Add +nav-flash-exclude-commands to control where +nav-flash-blink-cursor-maybe should not trigger nav-flash. + Rename API to conform to Doom naming conventions + +nav-flash-blink-cursor + +nav-flash-blink-cursor-maybe + +nav-flash|delayed-blink-cursor + +nav-flash|blink-cursor + +nav-flash|blink-cursor-maybe + +nav-flash*blink-cursor --- modules/ui/nav-flash/autoload.el | 48 +++++++++++++++++++++----------- modules/ui/nav-flash/config.el | 18 ++++++++---- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/modules/ui/nav-flash/autoload.el b/modules/ui/nav-flash/autoload.el index 04eaf8691..1e8f2a03d 100644 --- a/modules/ui/nav-flash/autoload.el +++ b/modules/ui/nav-flash/autoload.el @@ -1,24 +1,40 @@ ;;; ui/nav-flash/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +nav-flash*blink-cursor-maybe (orig-fn &rest args) - "Blink current line if the window has moved." - (if (or (not (window-start)) - (derived-mode-p 'term-mode)) - (apply orig-fn args) - (let* ((win-beg (window-start)) - (point (save-excursion (goto-char win-beg) (point-marker)))) - (apply orig-fn args) - (unless (equal point (save-excursion (goto-char win-beg) (point-marker))) - (+nav-flash/blink-cursor))))) +(defun +nav-flash-blink-cursor (&rest _) + "Blinks the current line in the current window, to make it clear where the +cursor has landed (typically after a large motion, like switching windows or +jumping to another part of the file)." + (unless (minibufferp) + (nav-flash-show) + ;; only show in the current window + (overlay-put compilation-highlight-overlay 'window (selected-window)))) + +;;;###autoload +(defun +nav-flash-blink-cursor-maybe (&rest _) + "Like `+nav-flash-blink-cursor', but no-ops if in special-mode or term-mode, +or triggered from one of `+nav-flash-exclude-commands'." + (unless (or (derived-mode-p 'special-mode 'term-mode) + (memq this-command +nav-flash-exclude-commands)) + (+nav-flash-blink-cursor))) + +;;;###autoload +(defun +nav-flash|delayed-blink-cursor (&rest _) + "Like `+nav-flash-blink-cursor', but links after a tiny pause, in case it +isn't clear at run-time if the point will be in the correct window/buffer (like +for `org-follow-link-hook')." + (run-at-time 0.1 nil #'+nav-flash|blink-cursor)) + +;;;###autoload +(defalias '+nav-flash|blink-cursor #'+nav-flash-blink-cursor) +;;;###autoload +(defalias '+nav-flash|blink-cursor-maybe #'+nav-flash-blink-cursor-maybe) + +;;;###autoload +(defalias '+nav-flash*blink-cursor #'+nav-flash-blink-cursor-maybe) ;;;###autoload (defun +nav-flash/blink-cursor (&rest _) "Blink current line using `nav-flash'." (interactive) - (unless (or (minibufferp) - (derived-mode-p 'special-mode) - (memq this-command '(mouse-set-point evil-mouse-drag-region))) - (nav-flash-show) - ;; only show in the current window - (overlay-put compilation-highlight-overlay 'window (selected-window)))) + (+nav-flash-blink-cursor-maybe)) diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index 3adf6ed9f..d59b7e2be 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -1,5 +1,10 @@ ;;; ui/nav-flash/config.el -*- lexical-binding: t; -*- +(defvar +nav-flash-exclude-commands + '(mouse-set-point evil-mouse-drag-region + +org/dwim-at-point org-find-file org-find-file-at-mouse) + "A list of commands that should not trigger nav-flash.") + (def-package! nav-flash :defer t :init @@ -9,13 +14,16 @@ '(doom-enter-window-hook imenu-after-jump-hook evil-jumps-post-jump-hook counsel-grep-post-action-hook dumb-jump-after-jump-hook) - #'+nav-flash/blink-cursor) + #'+nav-flash|blink-cursor-maybe) + + ;; `org' + (add-hook 'org-follow-link-hook #'+nav-flash|delayed-blink-cursor) ;; `saveplace' - (advice-add #'save-place-find-file-hook :after #'+nav-flash/blink-cursor) + (advice-add #'save-place-find-file-hook :after #'+nav-flash*blink-cursor) ;; `evil' - (advice-add #'evil-window-top :after #'+nav-flash/blink-cursor) - (advice-add #'evil-window-middle :after #'+nav-flash/blink-cursor) - (advice-add #'evil-window-bottom :after #'+nav-flash/blink-cursor)) + (advice-add #'evil-window-top :after #'+nav-flash*blink-cursor) + (advice-add #'evil-window-middle :after #'+nav-flash*blink-cursor) + (advice-add #'evil-window-bottom :after #'+nav-flash*blink-cursor)) From a07126f611d697c154ded75ae4915f9ae0c630c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 24 Jul 2018 20:08:11 +0200 Subject: [PATCH 2516/4235] Revise code comments in smartparens config --- core/core-editor.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 28ae577a0..b6e92e3a6 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -139,7 +139,8 @@ fundamental-mode) for performance sake." ;; Core Plugins ;; -;; Auto-close delimiters and blocks as you type +;; Auto-close delimiters and blocks as you type. It's more powerful than that, +;; but that is all Doom uses it for. (def-package! smartparens :after-call (doom-exit-buffer-hook after-find-file) :commands (sp-pair sp-local-pair sp-with-modes) @@ -155,7 +156,9 @@ fundamental-mode) for performance sake." sp-max-prefix-length 50 sp-escape-quotes-after-insert nil) ; not smart enough - ;; Slim down on smartparens' opinionated behavior + ;; Smartparens' navigation feature is neat, but does not justify how expensive + ;; it is. It's also less useful for evil users. This may need to be + ;; reactivated for non-evil users though. Needs more testing! (defun doom|disable-smartparens-navigate-skip-match () (setq sp-navigate-skip-match nil sp-navigate-consider-sgml-tags nil)) @@ -170,7 +173,7 @@ fundamental-mode) for performance sake." (add-hook 'minibuffer-setup-hook #'doom|init-smartparens-in-eval-expression) (sp-local-pair 'minibuffer-inactive-mode "'" nil :actions nil) - ;; smartparenss conflicts with evil-mode's replace state + ;; smartparens breaks evil-mode's replace state (add-hook 'evil-replace-state-entry-hook #'turn-off-smartparens-mode) (add-hook 'evil-replace-state-exit-hook #'turn-on-smartparens-mode) @@ -215,6 +218,7 @@ fundamental-mode) for performance sake." :commands (er/contract-region er/mark-symbol er/mark-word) :config (defun doom*quit-expand-region () + "Properly abort an expand-region region." (when (memq last-command '(er/expand-region er/contract-region)) (er/contract-region 0))) (advice-add #'evil-escape :before #'doom*quit-expand-region) From 90d09e6f931e51fd516d5f6ad8990c2bc555c310 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 29 Jul 2018 12:19:56 +1000 Subject: [PATCH 2517/4235] Highlight-numbers on every prog-mode --- core/core-ui.el | 1 + modules/lang/cc/config.el | 3 +-- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/python/config.el | 2 -- modules/lang/sh/config.el | 1 - modules/lang/web/+css.el | 1 - 6 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index c67888738..2fcc7af02 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -736,6 +736,7 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) (add-hook 'doom-post-init-hook #'doom|init-ui) +(add-hook 'prog-mode-hook #'highlight-numbers-mode) (provide 'core-ui) ;;; core-ui.el ends here diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index ae33e0b37..7c492a6be 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -79,8 +79,7 @@ compilation database is present in the project.") ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) (add-hook! '(c-mode-hook c++-mode-hook) - #'(highlight-numbers-mode - +cc|fontify-constants)) + #'(+cc|fontify-constants)) ;; Custom style, based off of linux (unless (assoc "doom" c-style-alist) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 3a14c8f09..44213cafe 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -45,7 +45,7 @@ #'(;; 3rd-party functionality auto-compile-on-save-mode doom|enable-delete-trailing-whitespace ;; fontification - rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification + rainbow-delimiters-mode highlight-quoted-mode +emacs-lisp|extra-fontification ;; initialization +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 69521d61a..8a123d636 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -22,8 +22,6 @@ is loaded.") python-indent-guess-indent-offset-verbose nil python-shell-interpreter "python") :config - (add-hook 'python-mode-hook #'highlight-numbers-mode) - (set-env! "PYTHONPATH" "PYENV_ROOT") (set-electric! 'python-mode :chars '(?:)) (set-repl-handler! 'python-mode #'+python/repl) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index e739f2f00..0ae3712d6 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -15,7 +15,6 @@ :mode ("\\.zunit\\'" . sh-mode) :mode ("/bspwmrc\\'" . sh-mode) :config - (add-hook 'sh-mode-hook #'highlight-numbers-mode) (set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) (set-repl-handler! 'sh-mode #'+sh/repl) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 48f26a858..2ddacc41e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -17,7 +17,6 @@ (add-hook! (css-mode sass-mode stylus-mode) #'(yas-minor-mode-on flycheck-mode - highlight-numbers-mode rainbow-mode)) From d8cd4bdf0350c6d0e11bf7153b9dbf038f72ce2e Mon Sep 17 00:00:00 2001 From: Marcelo dos Santos Date: Sun, 29 Jul 2018 10:50:17 -0300 Subject: [PATCH 2518/4235] Add Racket lang --- modules/lang/racket/autoload.el | 12 ++++ modules/lang/racket/config.el | 103 ++++++++++++++++++++++++++++++++ modules/lang/racket/doctor.el | 11 ++++ modules/lang/racket/packages.el | 8 +++ 4 files changed, 134 insertions(+) create mode 100644 modules/lang/racket/autoload.el create mode 100644 modules/lang/racket/config.el create mode 100644 modules/lang/racket/doctor.el create mode 100644 modules/lang/racket/packages.el diff --git a/modules/lang/racket/autoload.el b/modules/lang/racket/autoload.el new file mode 100644 index 000000000..c1d071aa3 --- /dev/null +++ b/modules/lang/racket/autoload.el @@ -0,0 +1,12 @@ +;;; lang/racket/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +racket/repl () + "Open the Racket REPL." + (interactive) + (pop-to-buffer + (or (get-buffer "*Racket REPL*") + (progn (racket-run-and-switch-to-repl) + (let ((buf (get-buffer "*Racket REPL*"))) + (bury-buffer buf) + buf))))) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el new file mode 100644 index 000000000..f62a69597 --- /dev/null +++ b/modules/lang/racket/config.el @@ -0,0 +1,103 @@ +;;; lang/racket/config.el -*- lexical-binding: t; -*- + +(def-package! racket-mode + :mode "\\.rkt$" + :interpreter "racket" + :init + (add-hook 'racket-repl-mode-hook 'racket-unicode-input-method-enable) + :config + (set-popup-rule! "*Racket REPL*" + :size 10 + :select t + :modeline nil + :quit t + :transient 3) + (set-repl-handler! 'racket-mode #'+racket/repl) + (set-eval-handler! 'racket-mode "racket") + (set-company-backend! 'racket-mode '(company-abbrev + company-dabbrev-code + company-dabbrev + company-files)) + (set-lookup-handlers! 'racket-mode + :definition #'racket-describe + :documentation #'racket-doc) + (set-docset! 'racket-mode "Racket") + (set-pretty-symbols! 'racket-mode + :lambda "lambda" + :map "map" + :dot ".") + (set-rotate-patterns! 'racket-mode + :symbols '(("#true" "#false"))) + + (add-hook! racket-mode + #'(;; Internals + racket-unicode-input-method-enable + ;; 3rd-party functionality + doom|enable-delete-trailing-whitespace + ;; fontification + rainbow-delimiters-mode + highlight-quoted-mode + highlight-numbers-mode + ;; initialization + flycheck-mode)) + + (setq-hook! racket-mode + racket-smart-open-bracket-enable t + company-frontends '(company-pseudo-tooltip-unless-just-one-frontend + company-preview-if-just-one-frontend + company-preview-common-frontend)) + + (map! :map racket-mode-map + :localleader + :n "c" #'racket-run + :n "z" #'racket-repl + :n "C" #'racket-run-and-switch-to-repl + :n "x" #'racket-racket + :n "t" #'racket-test + :n "l" #'racket-logger + :n "o" #'racket-profile + (:desc "eval" :prefix "s" + :n "d" #'racket-send-definition + :n "l" #'racket-send-last-sexp + :n "r" #'racket-send-region) + (:desc "macro expand" :prefix "e" + :n "d" #'racket-expand-definition + :n "l" #'racket-expand-last-sexp + :n "r" #'racket-expand-region + :n "a" #'racket-expand-again) + :n "r" #'racket-open-require-path + :n "TAB" #'indent-for-tab-command + :n "u" #'racket-backward-up-list + :n "[" #'racket-smart-open-bracket + :n ")" #'racket-insert-closing + :n "]" #'racket-insert-closing + :n "}" #'racket-insert-closing + :n "p" #'racket-cycle-paren-shapes + :n "y" #'racket-insert-lambda + :n "d" #'racket-doc + :n "." #'racket-describe + :n "M-." #'racket-visit-definition + :n "C-." #'racket-visit-module + :n "," #'racket-unvisit + :n "f" #'racket-fold-all-tests + :n "F" #'racket-unfold-all-tests + :n "a" #'racket-align + :n "A" #'racket-unalign + :nv ";" #'comment-dwim + :nv "\\" #'indent-region)) + + +;; +;; Plugins +;; + +(def-package! highlight-quoted + :commands highlight-quoted-mode) + +(after! org + (org-babel-do-load-languages + 'org-babel-load-languages + (append org-babel-load-languages + '((racket . t) + ;; (scribble . t) + )))) diff --git a/modules/lang/racket/doctor.el b/modules/lang/racket/doctor.el new file mode 100644 index 000000000..cabeb0d55 --- /dev/null +++ b/modules/lang/racket/doctor.el @@ -0,0 +1,11 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/racket/doctor.el + +(unless (executable-find "drracket") + (warn! "Could not find drracket executable; code-completion and syntax checking will not work.")) + +(unless (executable-find "racket") + (warn! "Could not find racket executable; REPL will not work.")) + +(unless (executable-find "raco") + (warn! "Could not find raco executable; commands for install packages and build libraries will not work.")) diff --git a/modules/lang/racket/packages.el b/modules/lang/racket/packages.el new file mode 100644 index 000000000..e29892a04 --- /dev/null +++ b/modules/lang/racket/packages.el @@ -0,0 +1,8 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/racket/packages.el + +(package! racket-mode) +(package! ob-racket + :recipe (:fetcher github + :repo "DEADB17/ob-racket" + :files ("*"))) From 4f3ce4d06d8106e9ce2ec44da54f618f3e56275a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 16:51:06 +0200 Subject: [PATCH 2519/4235] Move highlight-numbers-mode config Into plugins section in core-ui --- core/core-ui.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 2fcc7af02..b9d55663f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -234,6 +234,10 @@ DEFAULT is non-nil, set the default mode-line for all buffers." (add-hook 'completion-list-mode-hook #'hide-mode-line-mode) (add-hook 'Man-mode-hook #'hide-mode-line-mode) +;; `highlight-numbers-mode' -- better number literal fontification in code +(setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+.*\\_>") +(add-hook 'prog-mode-hook #'highlight-numbers-mode) + ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially ;; in parentheses-drunk languages like Lisp. (def-package! rainbow-delimiters @@ -736,7 +740,6 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) (add-hook 'doom-post-init-hook #'doom|init-ui) -(add-hook 'prog-mode-hook #'highlight-numbers-mode) (provide 'core-ui) ;;; core-ui.el ends here From 238e37a1714b71c30b386e0e5a7f978fab46fc93 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 17:22:01 +0200 Subject: [PATCH 2520/4235] lang/racket: refactor and cleanup + Removed highlight-quoted block because `highlight-quoted-mode` is already autoloaded by the package + Removed org-babel-do-load-languages because lang/org/+babel already has a built-in autoloader for ob-* packages. + Removed flycheck-mode from racket-mode hook because it is enabled globally in :feature syntax-checker + Removed highlight-numbers-mode from racket-mode-hook because it is enabled on prog-mode-hook in core-ui (as of #770) + Fix racket popup rule regexp + Remove popup rules that were redundant with the defaults + Remove racket-mode-specific company-frontends value, looks like personal preference, otherwise should be set in a separate hook function that is easily recognized and disabled, if the user desires. + Remove :interpreter and :mode properties because they are already registered by the racket-mode package. + Move racket-unicode-input-method-enable into :hook property (to defer the config) --- modules/lang/racket/config.el | 47 ++++++----------------------------- 1 file changed, 7 insertions(+), 40 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index f62a69597..7367fa8f8 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -1,17 +1,9 @@ ;;; lang/racket/config.el -*- lexical-binding: t; -*- (def-package! racket-mode - :mode "\\.rkt$" - :interpreter "racket" - :init - (add-hook 'racket-repl-mode-hook 'racket-unicode-input-method-enable) + :hook ((racket-mode racket-repl-mode) . racket-unicode-input-method-enable) :config - (set-popup-rule! "*Racket REPL*" - :size 10 - :select t - :modeline nil - :quit t - :transient 3) + (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) (set-eval-handler! 'racket-mode "racket") (set-company-backend! 'racket-mode '(company-abbrev @@ -19,7 +11,7 @@ company-dabbrev company-files)) (set-lookup-handlers! 'racket-mode - :definition #'racket-describe + :definition #'racket-describe :documentation #'racket-doc) (set-docset! 'racket-mode "Racket") (set-pretty-symbols! 'racket-mode @@ -28,24 +20,15 @@ :dot ".") (set-rotate-patterns! 'racket-mode :symbols '(("#true" "#false"))) - + (add-hook! racket-mode - #'(;; Internals - racket-unicode-input-method-enable - ;; 3rd-party functionality + #'(;; 3rd-party functionality doom|enable-delete-trailing-whitespace ;; fontification rainbow-delimiters-mode - highlight-quoted-mode - highlight-numbers-mode - ;; initialization - flycheck-mode)) + highlight-quoted-mode)) - (setq-hook! racket-mode - racket-smart-open-bracket-enable t - company-frontends '(company-pseudo-tooltip-unless-just-one-frontend - company-preview-if-just-one-frontend - company-preview-common-frontend)) + (setq-hook! racket-mode racket-smart-open-bracket-enable t) (map! :map racket-mode-map :localleader @@ -85,19 +68,3 @@ :n "A" #'racket-unalign :nv ";" #'comment-dwim :nv "\\" #'indent-region)) - - -;; -;; Plugins -;; - -(def-package! highlight-quoted - :commands highlight-quoted-mode) - -(after! org - (org-babel-do-load-languages - 'org-babel-load-languages - (append org-babel-load-languages - '((racket . t) - ;; (scribble . t) - )))) From 960bde480d0f9f3301f3c3bd545b1e653073c236 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 17:29:27 +0200 Subject: [PATCH 2521/4235] Install ob-racket conditionally I'll move this to lang/org/packages.el later (not easy to do from the github text editor). --- modules/lang/racket/packages.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/lang/racket/packages.el b/modules/lang/racket/packages.el index e29892a04..6e58afbb1 100644 --- a/modules/lang/racket/packages.el +++ b/modules/lang/racket/packages.el @@ -2,7 +2,6 @@ ;;; lang/racket/packages.el (package! racket-mode) -(package! ob-racket - :recipe (:fetcher github - :repo "DEADB17/ob-racket" - :files ("*"))) + +(when (featurep! :lang org +babel) + (package! ob-racket :recipe (:fetcher github :repo "DEADB17/ob-racket"))) From 9abafcf74aa4c685144ff98120b9a9196edef893 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 14:41:13 +0200 Subject: [PATCH 2522/4235] Rename def-modeline! -> def-modeline-format! As to differentiate it from the old def-modeline! macro. This only affects users of the +new modeline. --- modules/ui/doom-modeline/+new.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-modeline/+new.el b/modules/ui/doom-modeline/+new.el index 2471e1755..d54824b38 100644 --- a/modules/ui/doom-modeline/+new.el +++ b/modules/ui/doom-modeline/+new.el @@ -204,7 +204,7 @@ ;; (defvar doom-mode-line-alist nil) -(defun def-modeline! (name left &optional right) +(defun def-modeline-format! (name left &optional right) (setf (alist-get name doom-mode-line-alist) (list left right))) (defun set-modeline! (name &optional default) @@ -461,11 +461,11 @@ segment.") (format " %dW" (count-words beg end))))) 'face 'doom-modeline-highlight)))) -(def-modeline! :main +(def-modeline-format! :main '(+mode-line-bar +mode-line-matches " " +mode-line-buffer-id " %2l:%c %p " +mode-line-selection-info) '(+mode-line-encoding +mode-line-major-mode +mode-line-vcs)) -(def-modeline! :project +(def-modeline-format! :project '(+mode-line-bar +mode-line-buffer-directory) '(+mode-line-major-mode)) From df233eb1a9ed52af7da3d7e0607ae45491107224 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 15:37:24 +0200 Subject: [PATCH 2523/4235] lang/pdf: fix compatibility with +new modeline --- modules/tools/pdf/+modeline.el | 19 +++++++++++++++---- modules/tools/pdf/config.el | 3 +-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/tools/pdf/+modeline.el b/modules/tools/pdf/+modeline.el index e88d3f440..2ca275663 100644 --- a/modules/tools/pdf/+modeline.el +++ b/modules/tools/pdf/+modeline.el @@ -2,8 +2,19 @@ (def-modeline-segment! +pdf-pages "Current and total page indicator for PDF documents." - (format " P %d/%d" (pdf-view-current-page) (pdf-cache-number-of-pages))) + (format "P %d/%d" (pdf-view-current-page) (pdf-cache-number-of-pages))) -(def-modeline! pdf-tools-modeline - (bar matches " " buffer-info +pdf-pages) - (major-mode vcs)) +(if (featurep! :ui doom-modeline +new) + (def-modeline-format! '+pdf + '(+mode-line-bar " " +mode-line-buffer-id " " +pdf-pages) + '(+mode-line-major-mode +mode-line-vcs)) + (def-modeline! '+pdf + '(bar matches " " buffer-info +pdf-pages) + '(major-mode vcs))) + +(defun +pdf|init-modeline () + (funcall (if (featurep! :ui doom-modeline +new) + #'set-modeline! + #'doom-set-modeline) + '+pdf)) +(add-hook 'pdf-tools-enabled-hook #'+pdf|init-modeline) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 5b2952b64..8ea1b0139 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -31,8 +31,7 @@ (add-hook! 'pdf-view-mode-hook (cua-mode 0)) ;; Custom modeline that removes useless info and adds page numbers (when (featurep! :ui doom-modeline) - (load! "+modeline") - (add-hook! 'pdf-tools-enabled-hook (doom-set-modeline 'pdf-tools-modeline))) + (load! "+modeline")) ;; Handle PDF-tools related popups better (set-popup-rule! "^\\*Outline*" :side 'right :size 40 :select nil) ;; TODO: Add additional important windows that should be handled differently From 593666933d6e6a3eb4188c1f2ba1bdf6e3e5a0ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 15:47:18 +0200 Subject: [PATCH 2524/4235] Convert old def-modeline! from macro to function This makes it easier to use dynamically, and ensures that doom--prepare-modeline-segemnts isn't run prematurely (at macro expansion time). --- core/core-ui.el | 49 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index b9d55663f..ce86060a6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -143,57 +143,54 @@ Also see `doom-exit-buffer-hook'.") `(let (byte-compile-warnings) (byte-compile #',sym)))))))) -(defsubst doom--prepare-modeline-segments (segments) +(defun doom--prepare-modeline-segments (segments) (let (forms it) (dolist (seg segments) (cond ((stringp seg) (push seg forms)) ((symbolp seg) (cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) - (push (list it) forms)) + (push (list :eval (list it)) forms)) ((setq it (cdr (assq seg doom--modeline-var-alist))) (push it forms)) ((error "%s is not a defined segment" seg)))) ((error "%s is not a valid segment" seg)))) (nreverse forms))) -(defmacro def-modeline! (name lhs &optional rhs) +(defun def-modeline! (name lhs &optional rhs) "Defines a modeline format and byte-compiles it. NAME is a symbol to identify it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of modeline segments defined with `def-modeline-segment!'. Example: - (def-modeline! minimal - (bar matches \" \" buffer-info) - (media-info major-mode)) + (def-modeline! 'minimal + '(bar matches \" \" buffer-info) + '(media-info major-mode)) (doom-set-modeline 'minimal t)" (let ((sym (intern (format "doom-modeline-format--%s" name))) (lhs-forms (doom--prepare-modeline-segments lhs)) (rhs-forms (doom--prepare-modeline-segments rhs))) - `(progn - (fset ',sym - (lambda () - ,(concat "Modeline:\n" - (format " %s\n %s" - (prin1-to-string lhs) - (prin1-to-string rhs))) - (let ((lhs (list ,@lhs-forms)) - (rhs (list ,@rhs-forms))) - (let ((rhs-str (format-mode-line rhs))) - (list lhs - (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(+ 1 (string-width rhs-str)))))) - rhs-str))))) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))) + (defalias sym + (lambda () + (let ((rhs-str (format-mode-line rhs-forms))) + (list lhs-forms + (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(+ 1 (string-width rhs-str)))))) + rhs-str))) + (concat "Modeline:\n" + (format " %s\n %s" + (prin1-to-string lhs) + (prin1-to-string rhs)))) + (unless (bound-and-true-p byte-compile-current-file) + (let (byte-compile-warnings) + (byte-compile sym))))) (defun doom-modeline (key) "Returns a mode-line configuration associated with KEY (a symbol). Throws an error if it doesn't exist." - (let ((fn (intern (format "doom-modeline-format--%s" key)))) + (let ((fn (intern-soft (format "doom-modeline-format--%s" key)))) (when (functionp fn) `(:eval (,fn))))) From 22a2d1de600de31fd1a889a55b87ac223bfbe15b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 18:27:21 +0200 Subject: [PATCH 2525/4235] app/twitter: add support for +new modeline --- modules/app/twitter/config.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index c3a869468..c9f12cdf6 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -40,16 +40,20 @@ (after! solaire-mode (add-hook 'twittering-mode-hook #'solaire-mode)) - ;; Custom modeline for twitter buffers - (def-modeline! twitter - (bar matches " %b " selection-info) - ()) - + ;; Custom header-line for twitter buffers (defun +twitter|switch-mode-and-header-line () - (setq header-line-format (or (doom-modeline 'twitter) mode-line-format) + (setq header-line-format mode-line-format mode-line-format nil)) (add-hook 'twittering-mode-hook #'+twitter|switch-mode-and-header-line) + (cond ((featurep! :ui doom-modeline +new) + (setq-hook! 'twittering-mode-hook mode-line-format-right nil)) + ((featurep! :ui doom-modeline) + (def-modeline! 'twitter + '(bar matches " %b " selection-info) + '()) + (add-hook! 'twittering-mode-hook (doom-set-modeline 'twitter)))) + (define-key! twittering-mode-map "q" #'+twitter/quit "Q" #'+twitter/quit-all From 46c49cf55a0e98b8ec1c3824d32185c35c834080 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 18:27:38 +0200 Subject: [PATCH 2526/4235] app/twitter: fix missing epa--decode-coding-string In latest Emacs 27, this alias is missing. --- modules/app/twitter/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/app/twitter/config.el b/modules/app/twitter/config.el index c9f12cdf6..bf6680ecd 100644 --- a/modules/app/twitter/config.el +++ b/modules/app/twitter/config.el @@ -54,6 +54,10 @@ '()) (add-hook! 'twittering-mode-hook (doom-set-modeline 'twitter)))) + ;; `epa--decode-coding-string' isn't defined in later versions of Emacs 27 + (unless (fboundp 'epa--decode-coding-string) + (defalias 'epa--decode-coding-string #'decode-coding-string)) + (define-key! twittering-mode-map "q" #'+twitter/quit "Q" #'+twitter/quit-all From c75b2a36ab5ef6954d4a3493db4efe30152bde86 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 18:28:33 +0200 Subject: [PATCH 2527/4235] Don't reload theme at startup if already enabled --- 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 ce86060a6..c842b9dab 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -579,7 +579,7 @@ frame's window-system, the theme will be reloaded.") (defun doom|init-theme () "Set the theme and load the font, in that order." - (when doom-theme + (when (and doom-theme (not (memq doom-theme custom-enabled-themes))) (load-theme doom-theme t))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and From 44bf6861a6d04c34e35f4303323d07cbb6b569ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 25 Jul 2018 18:29:04 +0200 Subject: [PATCH 2528/4235] Fix overeager theme reloading when creating frames --- core/core-ui.el | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index c842b9dab..25f62a337 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -589,19 +589,28 @@ frame's window-system, the theme will be reloaded.") ;; ;; There will still be issues with simultaneous gui and terminal (emacsclient) ;; frames, however. There's always `doom/reload-theme' if you need it! -(defun doom|init-theme-in-frame (frame) +(defun doom|reload-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." (when (and (framep frame) (not (eq doom-last-window-system (framep-on-display frame)))) (with-selected-frame frame (doom|init-theme)) - (setq doom-last-window-system (display-graphic-p frame)))) + (setq doom-last-window-system (framep-on-display frame)))) + +(defun doom|reload-theme-maybe (_frame) + "Reloads the theme after closing the last frame of a type." + (unless (cl-loop for fr in (frame-list) + if (eq doom-last-window-system (framep-on-display fr)) + return t) + (setq doom-last-window-system nil) + (doom|reload-theme-in-frame (selected-frame)))) ;; fonts (add-hook 'doom-init-ui-hook #'doom|init-fonts) ;; themes -(add-hook 'after-make-frame-functions #'doom|init-theme-in-frame) (add-hook 'doom-init-ui-hook #'doom|init-theme) +(add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) +(add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) ;; From 5aef36951db2b0fa31ec256fb34f708ac0f6b2c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 26 Jul 2018 14:48:21 +0200 Subject: [PATCH 2529/4235] Goto file keybind in helm-ag-edit buffers --- modules/completion/helm/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 9a1a0faea..52fc093b1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -103,6 +103,7 @@ If you want to already use git-grep or grep, set this to nil.") ;; `helm-ag' (after! helm-ag + (map! :map helm-ag-edit-map :n "RET" #'compile-goto-error) (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) (set-popup-rule! "^\\*helm-ag-edit" :size 0.35 :ttl 0 :quit nil)) From f0f2c92b8d308b33319a34af9cbb5e396b068ad2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 27 Jul 2018 01:31:53 +0200 Subject: [PATCH 2530/4235] lang/php: prioritize phpctags in PATH And fail more gracefully if phpctags isn't installed --- modules/lang/php/autoload.el | 9 +++++++++ modules/lang/php/config.el | 11 +++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/lang/php/autoload.el b/modules/lang/php/autoload.el index 53ce77a57..b5a6f9fb4 100644 --- a/modules/lang/php/autoload.el +++ b/modules/lang/php/autoload.el @@ -13,3 +13,12 @@ ignore the cache." (require 'json) (json-read-file package-file)))) (puthash project-root data +php-composer-conf)))))) + +;;;###autoload +(defun +php|init-ac-php-core-eldoc () + "Initialize eldoc support for `php-mode' with `ac-php-core'. Fails gracefully +if phpctags isn't installed." + (require 'company-php) + (if (file-exists-p ac-php-ctags-executable) + (ac-php-core-eldoc-setup) + (message "phpctags is missing; eldoc support is disabled"))) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index ea01efcb4..22d5788c9 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -74,10 +74,17 @@ (def-package! company-php :when (featurep! :completion company) :commands (ac-php-remake-tags ac-php-remake-tags-all) - :hook (php-mode . ac-php-core-eldoc-setup) :init (add-to-list '+php--company-backends 'company-ac-php-backend nil #'eq) - :config (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) + (add-hook 'php-mode-hook #'+php|init-ac-php-core-eldoc) + :config + (setq ac-php-tags-path (concat doom-cache-dir "ac-php/")) + ;; prioritize phpctags in PATH + (when (file-in-directory-p ac-php-ctags-executable ac-php-root-directory) + (setq ac-php-ctags-executable + (or (executable-find "phpctags") + (if (file-exists-p ac-php-ctags-executable) + ac-php-ctags-executable))))) ;; From 2e25989dc5fb6e6050039b04a4a3ed0717d7e636 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 01:04:49 +0200 Subject: [PATCH 2531/4235] undo-tree-enable-undo-in-region = nil Try to save off the elusive and annoying "unrecognized entry in undo list undo-tree-canary" error produced by undo-tree. --- core/core-editor.el | 6 ++++-- modules/config/default/+bindings.el | 4 ---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b6e92e3a6..b6f4a9961 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -183,9 +183,11 @@ fundamental-mode) for performance sake." (def-package! undo-tree :after-call (doom-exit-buffer-hook after-find-file) :config - ;; persistent undo history is known to cause undo history corruption, which - ;; can be very destructive! So disable it! + ;; persistent undo history and undo-in-region is known to cause undo history + ;; corruption, which can be very destructive! Disabling it deters the error, + ;; but does not fix it entirely! (setq undo-tree-auto-save-history nil + undo-tree-enable-undo-in-region nil undo-tree-history-directory-alist (list (cons "." (concat doom-cache-dir "undo-tree-hist/")))) (global-undo-tree-mode +1)) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 631d091b6..6b544743f 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -425,10 +425,6 @@ (:map swiper-map [backtab] #'+ivy/wgrep-occur)) - ;; 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 From 05d9a83ff787965310e62514e3a3721e183e8f11 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 01:30:23 +0200 Subject: [PATCH 2532/4235] Unpropertize kill-ring in savehist data This speeds up startup marginally. --- core/core-editor.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index b6f4a9961..f78e9993e 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -93,7 +93,13 @@ fundamental-mode) for performance sake." savehist-save-minibuffer-history t savehist-autosave-interval nil ; save on kill only savehist-additional-variables '(kill-ring search-ring regexp-search-ring)) - (savehist-mode +1)) + (savehist-mode +1) + + (defun doom|unpropertize-kill-ring () + "Remove text properties from `kill-ring' in the interest of shrinking the +savehist file." + (setq kill-ring (mapcar #'substring-no-properties kill-ring))) + (add-hook 'kill-emacs-hook #'doom|unpropertize-kill-ring)) ;; persistent point location in buffers (def-package! saveplace From a2ffbe4ede4cdcf96714847a6ba81719b35db7a1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 01:35:47 +0200 Subject: [PATCH 2533/4235] Add new emacs/hideshow module Brings better default code folding support to various languages, like yaml, ruby, matlab, haml and vimrc. Hideshow is still quite unsophisticated and will need the help of another package for complete code folding functionality. Perhaps origami or vimish fold. The code-folding functional in the feature/evil module will soon be replaced by that. --- core/core-ui.el | 3 -- init.example.el | 1 + modules/emacs/hideshow/autoload.el | 64 ++++++++++++++++++++++++++++++ modules/emacs/hideshow/config.el | 28 +++++++++++++ 4 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 modules/emacs/hideshow/autoload.el create mode 100644 modules/emacs/hideshow/config.el diff --git a/core/core-ui.el b/core/core-ui.el index 25f62a337..9220d362a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -257,9 +257,6 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; Built-in packages ;; -;; `hideshow' -(setq hs-hide-comments-when-hiding-all nil) - ;; show typed keystrokes in minibuffer (defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) (defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) diff --git a/init.example.el b/init.example.el index caaa7cc52..30d307f36 100644 --- a/init.example.el +++ b/init.example.el @@ -54,6 +54,7 @@ ediff ; comparing files in Emacs electric ; smarter, keyword-based electric-indent ;eshell ; a consistent, cross-platform shell (WIP) + hideshow ; basic code-folding support imenu ; an imenu sidebar and searchable code index ;term ; terminals in Emacs vc ; version-control and Emacs, sitting in a tree diff --git a/modules/emacs/hideshow/autoload.el b/modules/emacs/hideshow/autoload.el new file mode 100644 index 000000000..a4f74f83c --- /dev/null +++ b/modules/emacs/hideshow/autoload.el @@ -0,0 +1,64 @@ +;;; emacs/hideshow/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +hideshow-haml-forward-sexp (arg) + (haml-forward-sexp) + (move-beginning-of-line 1)) + +;;;###autoload +(defun +hideshow-forward-block-by-indent (arg) + (let ((start (current-indentation))) + (forward-line) + (unless (= start (current-indentation)) + (let ((range (+hideshow-indent-range))) + (goto-char (cadr range)) + (end-of-line))))) + + +;; +;; Indentation detection +;; + +(defun +hideshow--empty-line-p () + (string= "" (string-trim (thing-at-point 'line)))) + +(defun +hideshow--geq-or-empty-p () + (or (+hideshow--empty-line-p) (>= (current-indentation) base))) + +(defun +hideshow--g-or-empty-p () + (or (+hideshow--empty-line-p) (> (current-indentation) base))) + +(defun +hideshow--seek (start direction before skip predicate) + "Seeks forward (if direction is 1) or backward (if direction is -1) from start, until predicate +fails. If before is nil, it will return the first line where predicate fails, otherwise it returns +the last line where predicate holds." + (save-excursion + (goto-char start) + (goto-char (point-at-bol)) + (let ((bnd (if (> 0 direction) + (point-min) + (point-max))) + (pt (point))) + (when skip (forward-line direction)) + (cl-loop while (and (/= (point) bnd) (funcall predicate)) + do (progn + (when before (setq pt (point-at-bol))) + (forward-line direction) + (unless before (setq pt (point-at-bol))))) + pt))) + +(defun +hideshow-indent-range (&optional point) + "Return the point at the begin and end of the text block with the same (or +greater) indentation. If `point' is supplied and non-nil it will return the +begin and end of the block surrounding point." + (save-excursion + (when point + (goto-char point)) + (let ((base (current-indentation)) + (begin (point)) + (end (point))) + (setq begin (+hideshow--seek begin -1 t nil #'+hideshow--geq-or-empty-p) + begin (+hideshow--seek begin 1 nil nil #'+hideshow--g-or-empty-p) + end (+hideshow--seek end 1 t nil #'+hideshow--geq-or-empty-p) + end (+hideshow--seek end -1 nil nil #'+hideshow--empty-line-p)) + (list begin end base)))) diff --git a/modules/emacs/hideshow/config.el b/modules/emacs/hideshow/config.el new file mode 100644 index 000000000..d1674574a --- /dev/null +++ b/modules/emacs/hideshow/config.el @@ -0,0 +1,28 @@ +;;; emacs/hideshow/config.el -*- lexical-binding: t; -*- + +(after! hideshow ; built-in + (setq hs-hide-comments-when-hiding-all nil) + + (unless (assq 't hs-special-modes-alist) + (setq hs-special-modes-alist + (append + '((vimrc-mode "{{{" "}}}" "\"") + (yaml-mode "\\s-*\\_<\\(?:[^:]+\\)\\_>" + "" + "#" + +hideshow-forward-block-by-indent nil) + (haml-mode "[#.%]" "\n" "/" +hideshow-haml-forward-sexp nil) + (ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]" + "end\\|[]}]" + "#\\|=begin" + ruby-forward-sexp) + (enh-ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]" + "end\\|[]}]" + "#\\|=begin" + enh-ruby-forward-sexp nil) + (matlab-mode "if\\|switch\\|case\\|otherwise\\|while\\|for\\|try\\|catch" + "end" + nil (lambda (arg) (matlab-forward-sexp)))) + hs-special-modes-alist + '((t)))))) + From e3dc3a63764f34be0b86d428225146f7e6ef56eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 01:37:32 +0200 Subject: [PATCH 2534/4235] Shut up magit-todos-mode complaining about jT I unbound it, stop complaining about it! --- modules/tools/magit/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index bc86f6a95..c8ca9b48c 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -45,7 +45,8 @@ load everything.") :hook (magit-mode . magit-todos-mode) :config (setq magit-todos-require-colon nil) - (define-key magit-todos-section-map "j" nil)) + (define-key magit-todos-section-map "j" nil) + (advice-add #'magit-todos-mode :around #'doom*shut-up)) (def-package! magithub From f3a3465c047cdd1a68415cbb6e44ddd1e2cdc590 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 02:32:44 +0200 Subject: [PATCH 2535/4235] history-length = 250 Reduce from 500 to slim savehist data files and general Emacs memory footprint. --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 83a882928..beef6d8ee 100644 --- a/core/core.el +++ b/core/core.el @@ -160,7 +160,7 @@ else (except for `window-setup-hook').") ;; History & backup settings (save nothing, that's what git is for) auto-save-default nil create-lockfiles nil - history-length 500 + history-length 250 make-backup-files nil ; don't create backup~ files ;; byte compilation byte-compile-verbose doom-debug-mode From c87c2bd5a66685d8d24d9a3ddf24e2e89123a085 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 12:33:27 +0200 Subject: [PATCH 2536/4235] Remove redundant magit-completing-read-function --- modules/completion/ivy/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index c68bed7ef..8e71b9e10 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -57,8 +57,8 @@ immediately runs it on the current candidate (ending the ivy session)." ;; enable ability to select prompt (alternative to `ivy-immediate-done') ivy-use-selectable-prompt t) - (after! magit (setq magit-completing-read-function #'ivy-completing-read)) - (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) + (after! yasnippet + (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) (define-key! 'global [remap switch-to-buffer] #'ivy-switch-buffer From d094162d3103e0b1dcf28056443ce79275cb56e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 12:56:52 +0200 Subject: [PATCH 2537/4235] Refactor how git-timemachine loads magit-blame Loading magit-blame immediately after git-timemachine is premature, only one command uses magit-blame (git-timemachine-blame), so we defer it until that command is called (also, it makes more sense to be in the emacs/vc module, than tools/magit). --- modules/emacs/vc/config.el | 5 ++++- modules/tools/magit/config.el | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index d44fd95d0..7024a8f55 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -10,7 +10,10 @@ (after! evil ;; Force evil to rehash keybindings for the current state - (add-hook 'git-timemachine-mode-hook #'evil-normalize-keymaps))) + (add-hook 'git-timemachine-mode-hook #'evil-normalize-keymaps)) + + (when (featurep! :tools magit) + (add-transient-hook! #'git-timemachine-blame (require 'magit-blame)))) ;; `git-commit-mode' diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index c8ca9b48c..c5b113381 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -38,9 +38,6 @@ load everything.") (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) -(def-package! magit-blame :after git-timemachine) - - (def-package! magit-todos :hook (magit-mode . magit-todos-mode) :config From 143fdd17e11bf9b12d0dce532e1acd5be4898851 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 28 Jul 2018 13:05:47 +0200 Subject: [PATCH 2538/4235] Use insert mode only if git commit is empty --- modules/emacs/vc/config.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 7024a8f55..84b13d253 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -23,8 +23,14 @@ git-commit-summary-max-length 50 git-commit-style-convention-checks '(overlong-summary-line non-empty-second-line))) (add-hook 'git-commit-mode-hook #'+vc|enforce-git-commit-conventions) -(when (featurep! :feature evil) - (add-hook 'git-commit-mode-hook #'evil-insert-state)) + +(defun +vc|start-in-insert-state-maybe () + "Start git-commit-mode in insert state if in a blank commit message, +otherwise in default state." + (when (and (bound-and-true-p evil-mode) + (bobp) (eolp)) + (evil-insert-state))) +(add-hook 'git-commit-setup-hook #'+vc|start-in-insert-state-maybe) ;; From 770463aff2547fc91d3747d5512cd0a254373ab0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:25:43 +0200 Subject: [PATCH 2539/4235] Don't copy macro autodefs into autoloads verbatim This makes it necessary to reload the autoloads anytime a macro is modified at all. --- core/core-cli.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index d6eb85cb2..6c0666317 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -490,9 +490,6 @@ even if it doesn't need reloading!" (message "Ignoring autodef %s (%s)" name e) nil))) - ((memq type '(defmacro cl-defmacro)) - (push doom-file-form forms) - sexp) ((make-autoload sexp (abbreviate-file-name (file-name-sans-extension path))))) forms) (push `(put ',name 'doom-module ',origin) forms)))) From ea175180ef4e0b32c3483e7e4c3f608059d535ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:26:35 +0200 Subject: [PATCH 2540/4235] Fix incorrect load-file-name in autodef conditions Causing errors where featurep! calls in ;;;###autodef cookie conditions couldn't resolve the correct module from load-file-name. --- core/core-cli.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 6c0666317..13cf7cfe6 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -469,7 +469,8 @@ even if it doesn't need reloading!" "No documentation."))) (push (cond ((not (and member-p (or (null pred) - (eval (read pred) t)))) + (let ((load-file-name path)) + (eval (read pred) t))))) (push doom-file-form forms) (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" origin docstring)) @@ -500,7 +501,8 @@ even if it doesn't need reloading!" (target (doom-unquote target))) (unless (and member-p (or (null pred) - (eval (read pred) t))) + (let ((load-file-name path)) + (eval (read pred) t)))) (setq target #'ignore)) (push doom-file-form forms) (push `(put ',name 'doom-module ',origin) forms) From 6cfbeaa4f6fc69194056abe45411928261b86ca6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:29:26 +0200 Subject: [PATCH 2541/4235] Fix (cl-)?defmacro autodefs They were formly inserted with (cl-)?defmacro replaced with nil, otherwise. --- core/core-cli.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 13cf7cfe6..d846db0bd 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -477,7 +477,8 @@ even if it doesn't need reloading!" (condition-case-unless-debug e (append (list (pcase type (`defun 'defmacro) - (`cl-defun `cl-defmacro)) + (`cl-defun `cl-defmacro) + (_ type)) name arglist docstring) (cl-loop for arg in arglist if (and (symbolp arg) From db8ed4aac67d71f87eb0c2e76722e3e702475ce0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:46:18 +0200 Subject: [PATCH 2542/4235] lang/php: add +hack support --- core/core-modules.el | 28 ++++++++++++++-------------- modules/lang/php/config.el | 11 +++++------ modules/lang/php/packages.el | 5 ++--- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 00e2a9550..e54a256ad 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -25,6 +25,7 @@ MODULES). E.g. A warning will be put out if these deprecated modules are used.") (defvar doom--current-module nil) +(defvar doom--current-flags nil) ;; @@ -286,10 +287,12 @@ to least)." (message "Warning: couldn't find the %s %s module" category module) (let ((key (cons category module))) (doom-module-set category module :flags flags :path path) - (push `(let ((doom--current-module ',key)) + (push `(let ((doom--current-module ',key) + (doom--current-flags ',flags)) (load! "init" ,path t)) init-forms) - (push `(let ((doom--current-module ',key)) + (push `(let ((doom--current-module ',key) + (doom--current-flags ',flags)) (load! "config" ,path t)) config-forms)))))))))) `(let (file-name-handler-alist) @@ -366,18 +369,15 @@ Module FLAGs are set in your config's `doom!' block, typically in When this macro is used from inside a module, MODULE and SUBMODULE can be omitted. eg. (featurep! +flag1)" - (unless submodule - (let ((module-pair - (or doom--current-module - (doom-module-from-path (FILE!))))) - (unless module-pair - (error "featurep! couldn't detect what module its in! (in %s)" path)) - (setq flag module - module (car module-pair) - submodule (cdr module-pair)))) - (if flag - (and (memq flag (doom-module-get module submodule :flags)) t) - (doom-module-p module submodule))) + (and (cond (submodule (doom-module-p module submodule)) + (doom--current-flags (memq module doom--current-flags)) + ((let ((module-pair + (or doom--current-module + (doom-module-from-path (FILE!))))) + (unless module-pair + (error "featurep! couldn't detect what module its in! (in %s)" (FILE!))) + (memq module (doom-module-get (car module-pair) (cdr module-pair) :flags))))) + t)) ;; diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 22d5788c9..eeb9867e4 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -2,12 +2,6 @@ (defvar +php--company-backends nil) -;; (def-package! hack-mode -;; :mode "\\.hh$" -;; :config -;; (set-company-backend! 'hack-mode '(company-capf))) - - (def-package! php-mode :mode "\\.inc\\'" :interpreter "php" @@ -44,6 +38,11 @@ :n "s" #'phpunit-current-test))) +(def-package! hack-mode + :when (featurep! +hack) + :mode "\\.hh$") + + (def-package! php-refactor-mode :hook php-mode) diff --git a/modules/lang/php/packages.el b/modules/lang/php/packages.el index 5db18500f..553413d80 100644 --- a/modules/lang/php/packages.el +++ b/modules/lang/php/packages.el @@ -10,7 +10,6 @@ (when (featurep! :completion company) (package! company-php)) -;; (package! hack-mode -;; :recipe -;; (:fetcher url :url "https://raw.githubusercontent.com/facebook/hhvm/master/hphp/hack/editor-plugins/emacs/hack-mode.el")) +(when (featurep! +hack) + (package! hack-mode :recipe (:fetcher github :repo "hhvm/hack-mode"))) From 088480047cc7c8a49bf2ed1f0acd0a28dfda7be3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:50:16 +0200 Subject: [PATCH 2543/4235] Polish & move new modeline into :ui modeline Removes modeline library out of core-ui and contains them in :ui doom-modeline and :ui modeline. :ui modeline will eventually replace :ui doom-modeline, but is still considered experimental. This update provides makes it much more stable and closer to being feature complete. --- core/core-ui.el | 88 --- init.example.el | 1 + modules/ui/doom-modeline/+new.el | 507 --------------- modules/ui/doom-modeline/+old.el | 674 -------------------- modules/ui/doom-modeline/config.el | 768 ++++++++++++++++++++++- modules/ui/modeline/README.org | 0 modules/ui/modeline/autoload/modeline.el | 19 + modules/ui/modeline/autoload/settings.el | 92 +++ modules/ui/modeline/config.el | 532 ++++++++++++++++ modules/ui/modeline/packages.el | 20 + 10 files changed, 1429 insertions(+), 1272 deletions(-) delete mode 100644 modules/ui/doom-modeline/+new.el delete mode 100644 modules/ui/doom-modeline/+old.el create mode 100644 modules/ui/modeline/README.org create mode 100644 modules/ui/modeline/autoload/modeline.el create mode 100644 modules/ui/modeline/autoload/settings.el create mode 100644 modules/ui/modeline/config.el create mode 100644 modules/ui/modeline/packages.el diff --git a/core/core-ui.el b/core/core-ui.el index 9220d362a..7a1933a3d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -116,94 +116,6 @@ Also see `doom-exit-buffer-hook'.") (defun define-fringe-bitmap (&rest _))) -;; -;; Modeline library -;; - -(defvar doom--modeline-fn-alist ()) -(defvar doom--modeline-var-alist ()) - -(defmacro def-modeline-segment! (name &rest body) - "Defines a modeline segment and byte compiles it." - (declare (indent defun) (doc-string 2)) - (let ((sym (intern (format "doom-modeline-segment--%s" name))) - (docstring (if (stringp (car body)) - (pop body) - (format "%s modeline segment" name)))) - (cond ((and (symbolp (car body)) - (not (cdr body))) - (add-to-list 'doom--modeline-var-alist (cons name (car body))) - `(add-to-list 'doom--modeline-var-alist (cons ',name ',(car body)))) - (t - (add-to-list 'doom--modeline-fn-alist (cons name sym)) - `(progn - (fset ',sym (lambda () ,docstring ,@body)) - (add-to-list 'doom--modeline-fn-alist (cons ',name ',sym)) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))))) - -(defun doom--prepare-modeline-segments (segments) - (let (forms it) - (dolist (seg segments) - (cond ((stringp seg) - (push seg forms)) - ((symbolp seg) - (cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) - (push (list :eval (list it)) forms)) - ((setq it (cdr (assq seg doom--modeline-var-alist))) - (push it forms)) - ((error "%s is not a defined segment" seg)))) - ((error "%s is not a valid segment" seg)))) - (nreverse forms))) - -(defun def-modeline! (name lhs &optional rhs) - "Defines a modeline format and byte-compiles it. NAME is a symbol to identify -it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of -modeline segments defined with `def-modeline-segment!'. - -Example: - (def-modeline! 'minimal - '(bar matches \" \" buffer-info) - '(media-info major-mode)) - (doom-set-modeline 'minimal t)" - (let ((sym (intern (format "doom-modeline-format--%s" name))) - (lhs-forms (doom--prepare-modeline-segments lhs)) - (rhs-forms (doom--prepare-modeline-segments rhs))) - (defalias sym - (lambda () - (let ((rhs-str (format-mode-line rhs-forms))) - (list lhs-forms - (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(+ 1 (string-width rhs-str)))))) - rhs-str))) - (concat "Modeline:\n" - (format " %s\n %s" - (prin1-to-string lhs) - (prin1-to-string rhs)))) - (unless (bound-and-true-p byte-compile-current-file) - (let (byte-compile-warnings) - (byte-compile sym))))) - -(defun doom-modeline (key) - "Returns a mode-line configuration associated with KEY (a symbol). Throws an -error if it doesn't exist." - (let ((fn (intern-soft (format "doom-modeline-format--%s" key)))) - (when (functionp fn) - `(:eval (,fn))))) - -(defun doom-set-modeline (key &optional default) - "Set the modeline format. Does nothing if the modeline KEY doesn't exist. If -DEFAULT is non-nil, set the default mode-line for all buffers." - (when-let* ((modeline (doom-modeline key))) - (setf (if default - (default-value 'mode-line-format) - (buffer-local-value 'mode-line-format (current-buffer))) - (list "%e" modeline)))) - - ;; ;; Plugins ;; diff --git a/init.example.el b/init.example.el index 30d307f36..6fb8bfeba 100644 --- a/init.example.el +++ b/init.example.el @@ -32,6 +32,7 @@ evil-goggles ; display visual hints when editing in evil ;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags + ;modeline ; snazzy, Atom-inspired modeline, plus API nav-flash ; blink the current line after jumping ;neotree ; a project drawer, like NERDTree for vim treemacs ; a project drawer, like neotree but cooler diff --git a/modules/ui/doom-modeline/+new.el b/modules/ui/doom-modeline/+new.el deleted file mode 100644 index d54824b38..000000000 --- a/modules/ui/doom-modeline/+new.el +++ /dev/null @@ -1,507 +0,0 @@ -;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- -;;;###if (featurep! +new) - -;; This mode-line is experimental, may have bugs and is likely to change. It -;; also doesn't have all the features of the old modeline (yet). -;; -;; However, it is at least twice as fast as the original modeline, and a little -;; more flexible, what with `mode-line-format-left' and -;; `mode-line-format-right'. It also exposes a more powerful API for defining -;; modelines and modeline segments that make use of variable watchers and hooks -;; to update them. - -;;;; Benchmarks -;; (benchmark-run 1000 (format-mode-line mode-line-format)) -;; Old system: ~0.198 -;; New system: ~0.056 - -(defvar +doom-modeline-height 25 - "How tall the mode-line should be (only respected in GUI emacs).") - -(defvar +doom-modeline-buffer-name-function - #'doom-modeline--file-path - "TODO") - -(defvar anzu--state nil) -(defvar evil-mode nil) -(defvar evil-state nil) -(defvar evil-visual-selection nil) -(defvar iedit-mode nil) -(defvar all-the-icons-scale-factor) -(defvar all-the-icons-default-adjust) - -(defvar-local mode-line-format-left ()) -(defvar-local mode-line-format-right ()) -(put 'mode-line-format-left 'risky-local-variable t) -(put 'mode-line-format-right 'risky-local-variable t) - - -;; -;; Plugins -;; - -(def-package! anzu - :after-call isearch-mode - :config - (setq anzu-cons-mode-line-p nil - anzu-minimum-input-length 1 - anzu-search-threshold 250) - (global-anzu-mode +1) - - (defun +doom-modeline*fix-anzu-count (positions here) - (cl-loop for (start . end) in positions - collect t into before - when (and (>= here start) (<= here end)) - return (length before) - finally return 0)) - (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) - - ;; Avoid anzu conflicts across buffers - (mapc #'make-variable-buffer-local - '(anzu--total-matched anzu--current-position anzu--state - anzu--cached-count anzu--cached-positions anzu--last-command - anzu--last-isearch-string anzu--overflow-p)) - ;; Ensure anzu state is cleared when searches & iedit are done - (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook 'doom-escape-hook #'anzu--reset-status t) - (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) - - -(def-package! evil-anzu - :when (featurep! :feature evil) - :after-call (evil-ex-start-search evil-ex-start-word-search)) - - -;; -;; Helpers -;; - -;; Keep `+doom-modeline-current-window' up-to-date -(defvar +doom-modeline-current-window (frame-selected-window)) -(defun +doom-modeline|set-selected-window (&rest _) - "Sets `+doom-modeline-current-window' appropriately" - (when-let* ((win (frame-selected-window))) - (unless (minibuffer-window-active-p win) - (setq +doom-modeline-current-window win) - (force-mode-line-update)))) - -(defun +doom-modeline|unset-selected-window () - (setq +doom-modeline-current-window nil) - (force-mode-line-update)) - -(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) -(add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) -(if (not (boundp 'after-focus-change-function)) - (progn - (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) - (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) - (defun +doom-modeline|refresh-frame () - (setq +doom-modeline-current-window nil) - (cl-loop for frame in (frame-list) - if (eq (frame-focus-state frame) t) - return (setq +doom-modeline-current-window (frame-selected-window frame))) - (force-mode-line-update t)) - (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)) - -(defsubst active () - (eq (selected-window) +doom-modeline-current-window)) - -;; xpm generator -(defun doom-modeline--make-xpm (width height &optional color) - "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." - (propertize - " " 'display - (let ((data (make-list height (make-list width 1))) - (color (or color "None"))) - (ignore-errors - (create-image - (concat - (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," - (length (car data)) - (length data) - color - color) - (apply #'concat - (cl-loop with idx = 0 - with len = (length data) - for dl in data - do (cl-incf idx) - collect - (concat "\"" - (cl-loop for d in dl - if (= d 0) collect (string-to-char " ") - else collect (string-to-char ".")) - (if (eq idx len) "\"};" "\",\n"))))) - 'xpm t :ascent 'center))))) - -(defun doom-modeline--file-path (&optional path) - (let ((buffer-file-name (or path buffer-file-name)) - (root (doom-project-root)) - (active (active))) - (cond ((null root) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file))) - ((or (null buffer-file-name) - (directory-name-p buffer-file-name)) - (propertize (abbreviate-file-name (or buffer-file-name default-directory)) - 'face (if active 'doom-modeline-buffer-path))) - ((let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (true-filename (file-truename buffer-file-name)) - (relative-dirs (file-relative-name (file-name-directory true-filename) - (concat root "../"))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory true-filename) - 'face (if file-faces `(:inherit ,file-faces))))))))) - - -;; -;; Macros -;; - -(cl-defmacro def-modeline-segment! (name &rest rest &key init faces hooks vars &allow-other-keys) - "TODO" - (let ((body rest)) - (while (keywordp (car body)) - (setq body (cddr body))) - (setq rest body)) - (unless EMACS26+ - (setq vars nil)) - (let ((docstring (if (stringp (car rest)) (pop rest))) - (realvar (if (and rest faces) (intern (format "doom-modeline--var-%s" name)) name))) - (macroexp-progn - (append (when rest - (if (or hooks vars) - (let ((setterfn (intern (format "doom-modeline--set-%s" name))) - (varsetterfn (intern (format "doom-modeline--setvar-%s" name)))) - (append `((fset ',setterfn - (lambda (&rest _) - (when (or (memq ',name mode-line-format-left) - (memq ',name mode-line-format-right)) - (setq-local ,realvar (progn ,@rest)))))) - (mapcar (lambda (hook) `(add-hook ',hook #',setterfn)) - hooks) - (when vars - `((fset ',varsetterfn - (lambda (sym val op where) - (and (eq op 'set) where - (with-current-buffer where - (set sym val) - (,setterfn))))) - ,@(mapcar (lambda (var) `(add-variable-watcher ',var #',varsetterfn)) - vars))))) - (setq init `(quote (:eval ,@rest))) - nil)) - (if (eq realvar name) - `((defvar-local ,name ,init ,docstring)) - `((defvar-local ,realvar nil) - (defvar-local ,name - '(:eval (cond ((active) ,realvar) (,realvar (substring-no-properties ,realvar)))) - ,docstring))) - `((put ',name 'risky-local-variable t)))))) - -;; -(defvar doom-mode-line-alist nil) - -(defun def-modeline-format! (name left &optional right) - (setf (alist-get name doom-mode-line-alist) (list left right))) - -(defun set-modeline! (name &optional default) - (let ((modeline (cdr (assq name doom-mode-line-alist)))) - (when modeline - (if default - (setq-default mode-line-format-left `("" ,@(car modeline)) - mode-line-format-right `("" ,@(cadr modeline))) - (setq mode-line-format-left `("" ,@(car modeline)) - mode-line-format-right `("" ,@(cadr modeline)))) - (force-mode-line-update)))) - - -;; -;; Bars -;; - -(defvar mode-line-bar-active nil "TODO") -(defvar mode-line-bar-inactive nil "TODO") -(defun doom-modeline|setup-bars () - (setq mode-line-bar-active - (doom-modeline--make-xpm 3 +doom-modeline-height (face-background 'doom-modeline-bar)) - mode-line-bar-inactive - (doom-modeline--make-xpm 3 +doom-modeline-height))) -(add-hook 'doom-load-modeline-hook #'doom-modeline|setup-bars) - -(defun doom-modeline|setup-bars-after-change (_sym val op _where) - (when (eq op 'set) - (let ((+doom-modeline-height val)) - (doom-modeline|setup-bars)))) -(add-variable-watcher '+doom-modeline-height #'doom-modeline|setup-bars-after-change) - -(def-modeline-segment! +mode-line-bar - (if (active) mode-line-bar-active mode-line-bar-inactive)) - - -;; -;; Segments -;; - -(defun +doom-modeline|update-on-change () - (doom-modeline--set-+mode-line-buffer-id) - (remove-hook 'post-command-hook #'+doom-modeline|update-on-change t)) -(defun +doom-modeline|start-update-on-change () - (add-hook 'post-command-hook #'+doom-modeline|update-on-change nil t)) -(add-hook 'first-change-hook #'+doom-modeline|start-update-on-change) - -(advice-add #'undo :after #'doom-modeline--set-+mode-line-buffer-id) -(advice-add #'undo-tree-undo :after #'doom-modeline--set-+mode-line-buffer-id) - -(def-modeline-segment! +mode-line-buffer-id - :hooks (find-file-hook after-change-functions read-only-mode-hook after-save-hook after-revert-hook) - :faces t - (concat (cond (buffer-read-only - (concat (all-the-icons-octicon - "lock" - :face 'doom-modeline-warning - :v-adjust -0.05) - " ")) - ((buffer-modified-p) - (concat (all-the-icons-faicon - "floppy-o" - :face 'doom-modeline-buffer-modified - :v-adjust -0.0575) - " ")) - ((and buffer-file-name (not (file-exists-p buffer-file-name))) - (concat (all-the-icons-octicon - "circle-slash" - :face 'doom-modeline-urgent - :v-adjust -0.05) - " "))) - (if buffer-file-name - (funcall +doom-modeline-buffer-name-function buffer-file-name) - "%b"))) - -(def-modeline-segment! +mode-line-buffer-directory - (let ((face (if (active) 'doom-modeline-buffer-path))) - (concat (if (display-graphic-p) " ") - (all-the-icons-octicon - "file-directory" - :face face - :v-adjust -0.05 - :height 1.25) - (propertize (concat " " (abbreviate-file-name default-directory)) - 'face face)))) - -(def-modeline-segment! +mode-line-vcs - :vars (vc-mode) - (when (and vc-mode buffer-file-name) - (let* ((backend (vc-backend buffer-file-name)) - (state (vc-state buffer-file-name backend))) - (let ((face 'mode-line-inactive) - (active (active)) - (all-the-icons-default-adjust -0.1)) - (concat " " - (cond ((memq state '(edited added)) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05)) - ((eq state 'needs-merge) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon "git-merge" :face face)) - ((eq state 'needs-update) - (if active (setq face 'doom-modeline-warning)) - (all-the-icons-octicon "arrow-down" :face face)) - ((memq state '(removed conflict unregistered)) - (if active (setq face 'doom-modeline-urgent)) - (all-the-icons-octicon "alert" :face face)) - (t - (if active (setq face 'font-lock-doc-face)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05))) - " " - (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face)) - " "))))) - -(def-modeline-segment! +mode-line-encoding - :hooks (after-save-hook find-file-hook) - :vars (buffer-file-coding-system) - (concat (pcase (coding-system-eol-type buffer-file-coding-system) - (0 "LF ") - (1 "CRLF ") - (2 "CR ")) - (let ((sys (coding-system-plist buffer-file-coding-system))) - (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) - "UTF-8" - (upcase (symbol-name (plist-get sys :name))))) - " ")) - -(def-modeline-segment! +mode-line-major-mode - :vars (mode-name) - :faces t - (propertize (format-mode-line mode-name) 'face 'font-lock-keyword-face)) - - -(defun +doom-modeline--macro-recording () - "Display current Emacs or evil macro being recorded." - (when (and (active) (or defining-kbd-macro executing-kbd-macro)) - (let ((sep (propertize " " 'face 'doom-modeline-panel))) - (concat sep - (propertize (if (bound-and-true-p evil-this-macro) - (char-to-string evil-this-macro) - "Macro") - 'face 'doom-modeline-panel) - sep - (all-the-icons-octicon "triangle-right" - :face 'doom-modeline-panel - :v-adjust -0.05) - sep)))) - -(defsubst +doom-modeline--anzu () - "Show the match index and total number thereof. Requires `anzu', also -`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." - (when (and anzu--state (not iedit-mode)) - (propertize - (let ((here anzu--current-position) - (total anzu--total-matched)) - (cond ((eq anzu--state 'replace-query) - (format " %d replace " total)) - ((eq anzu--state 'replace) - (format " %d/%d " here total)) - (anzu--overflow-p - (format " %s+ " total)) - (t - (format " %s/%d " here total)))) - 'face (if (active) 'doom-modeline-panel)))) - -(defsubst +doom-modeline--evil-substitute () - "Show number of matches for evil-ex substitutions and highlights in real time." - (when (and evil-mode - (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) - (assq 'evil-ex-global-match evil-ex-active-highlights-alist) - (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) - (propertize - (let ((range (if evil-ex-range - (cons (car evil-ex-range) (cadr evil-ex-range)) - (cons (line-beginning-position) (line-end-position)))) - (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) - (if pattern - (format " %s matches " (how-many pattern (car range) (cdr range))) - " - ")) - 'face (if (active) 'doom-modeline-panel)))) - -(defun doom-themes--overlay-sort (a b) - (< (overlay-start a) (overlay-start b))) - -(defsubst +doom-modeline--iedit () - "Show the number of iedit regions matches + what match you're on." - (when (and iedit-mode iedit-occurrences-overlays) - (propertize - (let ((this-oc (or (let ((inhibit-message t)) - (iedit-find-current-occurrence-overlay)) - (progn (iedit-prev-occurrence) - (iedit-find-current-occurrence-overlay)))) - (length (length iedit-occurrences-overlays))) - (format " %s/%d " - (if this-oc - (- length - (length (memq this-oc (sort (append iedit-occurrences-overlays nil) - #'doom-themes--overlay-sort))) - -1) - "-") - length)) - 'face (if (active) 'doom-modeline-panel)))) - -(def-modeline-segment! +mode-line-matches - "Displays: 1. the currently recording macro, 2. A current/total for the -current search term (with anzu), 3. The number of substitutions being conducted -with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." - (let ((meta (concat (+doom-modeline--macro-recording) - (+doom-modeline--anzu) - (+doom-modeline--evil-substitute) - (+doom-modeline--iedit) - " "))) - (or (and (not (equal meta " ")) meta) - (if buffer-file-name " %I ")))) - -;; -(defsubst doom-column (pos) - (save-excursion (goto-char pos) - (current-column))) - -(defvar-local +doom-modeline-enable-word-count nil - "If non-nil, a word count will be added to the selection-info modeline -segment.") - -(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) -(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) - -(def-modeline-segment! +mode-line-selection-info - (when mark-active - (cl-destructuring-bind (beg . end) - (if (eq evil-state 'visual) - (cons evil-visual-beginning evil-visual-end) - (cons (region-beginning) (region-end))) - (propertize - (let ((lines (count-lines beg (min end (point-max))))) - (concat (cond ((or (bound-and-true-p rectangle-mark-mode) - (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column end) - (doom-column beg))))) - (format "%dx%dB" lines cols))) - ((eq evil-visual-selection 'line) - (format "%dL" lines)) - ((> lines 1) - (format "%dC %dL" (- end beg) lines)) - ((format "%dC" (- end beg)))) - (when +doom-modeline-enable-word-count - (format " %dW" (count-words beg end))))) - 'face 'doom-modeline-highlight)))) - -(def-modeline-format! :main - '(+mode-line-bar +mode-line-matches " " +mode-line-buffer-id " %2l:%c %p " +mode-line-selection-info) - '(+mode-line-encoding +mode-line-major-mode +mode-line-vcs)) - -(def-modeline-format! :project - '(+mode-line-bar +mode-line-buffer-directory) - '(+mode-line-major-mode)) - - -;; -;; -;; - -(def-modeline-segment! mode-line-rest - (let ((rhs-str (format-mode-line mode-line-format-right))) - (list (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(1+ (string-width rhs-str)))))) - rhs-str))) - -(setq-default mode-line-format '("" mode-line-format-left mode-line-rest)) - - -;; -(set-modeline! :main t) - -(add-hook! '+doom-dashboard-mode-hook (set-modeline! :project)) - - -;; -(defun doom-modeline-init () (run-hooks 'doom-load-modeline-hook)) -(add-hook 'doom-load-theme-hook #'doom-modeline-init) - -;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) -(defvar +doom-modeline-remap-face-cookie nil) -(defun +doom-modeline|focus () - (when +doom-modeline-remap-face-cookie - (require 'face-remap) - (face-remap-remove-relative +doom-modeline-remap-face-cookie))) -(defun +doom-modeline|unfocus () - (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) -(add-hook 'focus-in-hook #'+doom-modeline|focus) -(add-hook 'focus-out-hook #'+doom-modeline|unfocus) diff --git a/modules/ui/doom-modeline/+old.el b/modules/ui/doom-modeline/+old.el deleted file mode 100644 index bf73a0863..000000000 --- a/modules/ui/doom-modeline/+old.el +++ /dev/null @@ -1,674 +0,0 @@ -;;;###if (not (featurep! +new)) - -;; anzu and evil-anzu expose current/total state that can be displayed in the -;; mode-line. -(def-package! anzu - :after-call isearch-mode - :config - (setq anzu-cons-mode-line-p nil - anzu-minimum-input-length 1 - anzu-search-threshold 250) - (global-anzu-mode +1) - - (defun +doom-modeline*fix-anzu-count (positions here) - (cl-loop for (start . end) in positions - collect t into before - when (and (>= here start) (<= here end)) - return (length before) - finally return 0)) - (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) - - ;; Avoid anzu conflicts across buffers - (mapc #'make-variable-buffer-local - '(anzu--total-matched anzu--current-position anzu--state - anzu--cached-count anzu--cached-positions anzu--last-command - anzu--last-isearch-string anzu--overflow-p)) - ;; Ensure anzu state is cleared when searches & iedit are done - (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook 'doom-escape-hook #'anzu--reset-status t) - (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) - - -(def-package! evil-anzu - :when (featurep! :feature evil) - :after-call (evil-ex-start-search evil-ex-start-word-search)) - - -;; fish-style modeline -(def-package! shrink-path - :commands (shrink-path-prompt shrink-path-file-mixed)) - - -;; Keep `+doom-modeline-current-window' up-to-date -(defvar +doom-modeline-current-window (frame-selected-window)) -(defun +doom-modeline|set-selected-window (&rest _) - "Sets `+doom-modeline-current-window' appropriately" - (when-let* ((win (frame-selected-window))) - (unless (minibuffer-window-active-p win) - (setq +doom-modeline-current-window win) - (force-mode-line-update)))) - -(defun +doom-modeline|unset-selected-window () - (setq +doom-modeline-current-window nil) - (force-mode-line-update)) - -(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) -(add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) -(with-no-warnings - (cond ((not (boundp 'after-focus-change-function)) - (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) - (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) - ((defun +doom-modeline|refresh-frame () - (setq +doom-modeline-current-window nil) - (cl-loop for frame in (frame-list) - if (eq (frame-focus-state frame) t) - return (setq +doom-modeline-current-window (frame-selected-window frame))) - (force-mode-line-update)) - (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)))) - - -;; -;; Variables -;; - -(defvar +doom-modeline-height 29 - "How tall the mode-line should be (only respected in GUI emacs).") - -(defvar +doom-modeline-bar-width 3 - "How wide the mode-line bar should be (only respected in GUI emacs).") - -(defvar +doom-modeline-buffer-file-name-style 'truncate-upto-project - "Determines the style used by `+doom-modeline-buffer-file-name'. - -Given ~/Projects/FOSS/emacs/lisp/comint.el -truncate-upto-project => ~/P/F/emacs/lisp/comint.el -truncate-upto-root => ~/P/F/e/lisp/comint.el -truncate-all => ~/P/F/e/l/comint.el -relative-from-project => emacs/lisp/comint.el -relative-to-project => lisp/comint.el -file-name => comint.el") - -;; externs -(defvar anzu--state nil) -(defvar evil-mode nil) -(defvar evil-state nil) -(defvar evil-visual-selection nil) -(defvar iedit-mode nil) -(defvar all-the-icons-scale-factor) -(defvar all-the-icons-default-adjust) - - -;; -;; Modeline helpers -;; - -(defsubst active () - (eq (selected-window) +doom-modeline-current-window)) - -(defun +doom-modeline--make-xpm (face width height) - "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." - (propertize - " " 'display - (let ((data (make-list height (make-list width 1))) - (color (or (face-background face nil t) "None"))) - (ignore-errors - (create-image - (concat - (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," - (length (car data)) - (length data) - color - color) - (apply #'concat - (cl-loop with idx = 0 - with len = (length data) - for dl in data - do (cl-incf idx) - collect - (concat "\"" - (cl-loop for d in dl - if (= d 0) collect (string-to-char " ") - else collect (string-to-char ".")) - (if (eq idx len) "\"};" "\",\n"))))) - 'xpm t :ascent 'center))))) - -(defun +doom-modeline-buffer-file-name () - "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." - (let ((buffer-file-name (or buffer-file-name "")) - (buffer-file-truename (or buffer-file-truename ""))) - (propertize - (pcase +doom-modeline-buffer-file-name-style - (`truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) - (`truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) - (`truncate-all (+doom-modeline--buffer-file-name-truncate t)) - (`relative-to-project (+doom-modeline--buffer-file-name-relative)) - (`relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) - (`file-name (propertize (file-name-nondirectory buffer-file-name) - 'face - (let ((face (or (and (buffer-modified-p) - 'doom-modeline-buffer-modified) - (and (active) - 'doom-modeline-buffer-file)))) - (when face `(:inherit ,face)))))) - 'help-echo buffer-file-truename))) - -(defun +doom-modeline--buffer-file-name-truncate (&optional truncate-tail) - "Propertized `buffer-file-name' that truncates every dir along path. -If TRUNCATE-TAIL is t also truncate the parent directory of the file." - (let ((dirs (shrink-path-prompt (file-name-directory buffer-file-truename))) - (active (active))) - (if (null dirs) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) - (let ((dirname (car dirs)) - (basename (cdr dirs)) - (dir-faces (or modified-faces (if active 'doom-modeline-project-root-dir))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (concat (propertize (concat dirname - (if truncate-tail (substring basename 0 1) basename) - "/") - 'face (if dir-faces `(:inherit ,dir-faces))) - (propertize (file-name-nondirectory buffer-file-name) - 'face (if file-faces `(:inherit ,file-faces))))))))) - -(defun +doom-modeline--buffer-file-name-relative (&optional include-project) - "Propertized `buffer-file-name' showing directories relative to project's root only." - (let ((root (doom-project-root)) - (active (active))) - (if (null root) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (true-filename (file-truename buffer-file-name)) - (relative-dirs (file-relative-name (file-name-directory true-filename) - (if include-project (concat root "../") root))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory true-filename) - 'face (if file-faces `(:inherit ,file-faces)))))))) - -(defun +doom-modeline--buffer-file-name (truncate-project-root-parent) - "Propertized `buffer-file-name'. -If TRUNCATE-PROJECT-ROOT-PARENT is t space will be saved by truncating it down -fish-shell style. - -Example: -~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" - (let* ((project-root (doom-project-root)) - (file-name-split (shrink-path-file-mixed project-root - (file-name-directory buffer-file-name) - buffer-file-name)) - (active (active))) - (if (null file-name-split) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (pcase-let ((`(,root-path-parent ,project ,relative-path ,filename) file-name-split)) - (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) - (let ((sp-faces (or modified-faces (if active 'font-lock-comment-face))) - (project-faces (or modified-faces (if active 'font-lock-string-face))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (let ((sp-props `(,@(if sp-faces `(:inherit ,sp-faces)) ,@(if active '(:weight bold)))) - (project-props `(,@(if project-faces `(:inherit ,project-faces)) ,@(if active '(:weight bold)))) - (relative-props `(,@(if relative-faces `(:inherit ,relative-faces)))) - (file-props `(,@(if file-faces `(:inherit ,file-faces))))) - (concat (propertize (if truncate-project-root-parent - root-path-parent - (abbreviate-file-name project-root)) - 'face sp-props) - (propertize (concat project "/") 'face project-props) - (if relative-path (propertize relative-path 'face relative-props)) - (propertize filename 'face file-props))))))))) - - -;; -;; buffer information -;; - -(def-modeline-segment! buffer-default-directory - "Displays `default-directory'. This is for special buffers like the scratch -buffer where knowing the current project directory is important." - (let ((face (if (active) 'doom-modeline-buffer-path))) - (concat (if (display-graphic-p) " ") - (all-the-icons-octicon - "file-directory" - :face face - :v-adjust -0.05 - :height 1.25) - (propertize (concat " " (abbreviate-file-name default-directory)) - 'face face)))) - -(def-modeline-segment! buffer-info - "Combined information about the current buffer, including the current working -directory, the file name, and its state (modified, read-only or non-existent)." - (concat (cond (buffer-read-only - (concat (all-the-icons-octicon - "lock" - :face 'doom-modeline-warning - :v-adjust -0.05) - " ")) - ((buffer-modified-p) - (concat (all-the-icons-faicon - "floppy-o" - :face 'doom-modeline-buffer-modified - :v-adjust -0.0575) - " ")) - ((and buffer-file-name - (not (file-exists-p buffer-file-name))) - (concat (all-the-icons-octicon - "circle-slash" - :face 'doom-modeline-urgent - :v-adjust -0.05) - " ")) - ((buffer-narrowed-p) - (concat (all-the-icons-octicon - "fold" - :face 'doom-modeline-warning - :v-adjust -0.05) - " "))) - (if buffer-file-name - (+doom-modeline-buffer-file-name) - "%b"))) - -(def-modeline-segment! buffer-info-simple - "Display only the current buffer's name, but with fontification." - (propertize - "%b" - 'face (cond ((and buffer-file-name (buffer-modified-p)) - 'doom-modeline-buffer-modified) - ((active) 'doom-modeline-buffer-file)))) - -;; (defvar +doom-modeline--encoding nil) -;; (def-modeline-segment! buffer-encoding -;; "TODO" -;; +doom-modeline--encoding) - -;; (add-variable-watcher -;; 'buffer-file-coding-system -;; (lambda (_sym val op _where) -;; (when (eq op 'set) -;; (setq +doom-modeline--encoding -;; (concat (pcase (coding-system-eol-type val) -;; (0 "LF ") -;; (1 "CRLF ") -;; (2 "CR ")) -;; (let ((sys (coding-system-plist val))) -;; (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) -;; "UTF-8" -;; (upcase (symbol-name (plist-get sys :name))))) -;; " "))))) - -(def-modeline-segment! buffer-encoding - "Displays the encoding and eol style of the buffer the same way Atom does." - (concat (pcase (coding-system-eol-type buffer-file-coding-system) - (0 "LF ") - (1 "CRLF ") - (2 "CR ")) - (let ((sys (coding-system-plist buffer-file-coding-system))) - (cond ((memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) - "UTF-8") - (t (upcase (symbol-name (plist-get sys :name)))))) - " ")) - - -;; -;; major-mode -;; - -(def-modeline-segment! major-mode - "The major mode, including process, environment and text-scale info." - (propertize - (concat (format-mode-line mode-name) - (when (stringp mode-line-process) - mode-line-process) - (and (boundp 'text-scale-mode-amount) - (/= text-scale-mode-amount 0) - (format " (%+d)" text-scale-mode-amount))) - 'face (if (active) 'doom-modeline-buffer-major-mode))) - - -;; -;; vcs -;; - -(defvar-local +doom-modeline--vcs nil) -(defun +doom-modeline--update-vcs () - (setq +doom-modeline--vcs - (when (and vc-mode buffer-file-name) - (let* ((backend (vc-backend buffer-file-name)) - (state (vc-state buffer-file-name backend))) - (let ((face 'mode-line-inactive) - (active (active)) - (all-the-icons-default-adjust -0.1)) - (concat " " - (cond ((memq state '(edited added)) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05)) - ((eq state 'needs-merge) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon "git-merge" :face face)) - ((eq state 'needs-update) - (if active (setq face 'doom-modeline-warning)) - (all-the-icons-octicon "arrow-down" :face face)) - ((memq state '(removed conflict unregistered)) - (if active (setq face 'doom-modeline-urgent)) - (all-the-icons-octicon "alert" :face face)) - (t - (if active (setq face 'font-lock-doc-face)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05))) - " " - (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face)) - " ")))))) -(add-hook 'after-save-hook #'+doom-modeline--update-vcs) -(add-hook 'find-file-hook #'+doom-modeline--update-vcs t) - -(def-modeline-segment! vcs - "Displays the current branch, colored based on its state." - +doom-modeline--vcs) - - -;; -;; flycheck -;; - -(defvar +doom-modeline-vspc - (propertize " " 'face 'variable-pitch) - "TODO") - -(defun +doom-ml-icon (icon &optional text face voffset) - "Displays an octicon ICON with FACE, followed by TEXT. Uses -`all-the-icons-octicon' to fetch the icon." - (concat (if vc-mode " " " ") - (when icon - (concat - (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) - (if text +doom-modeline-vspc))) - (if text (propertize text 'face face)) - (if vc-mode " " " "))) - -(defvar-local +doom-modeline--flycheck nil) -(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) -(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) - -(defun +doom-modeline|update-flycheck-segment (&optional status) - (setq +doom-modeline--flycheck - (pcase status - ('finished (if flycheck-current-errors - (let-alist (flycheck-count-errors flycheck-current-errors) - (let ((sum (+ (or .error 0) (or .warning 0)))) - (+doom-ml-icon "do_not_disturb_alt" - (number-to-string sum) - (if .error 'doom-modeline-urgent 'doom-modeline-warning) - -0.25))) - (+doom-ml-icon "check" nil 'doom-modeline-info))) - ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) - ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) - ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) - ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) - -(def-modeline-segment! flycheck - "Displays color-coded flycheck error status in the current buffer with pretty -icons." - +doom-modeline--flycheck) - - -;; -;; selection-info -;; - -(defsubst doom-column (pos) - (save-excursion (goto-char pos) - (current-column))) - -(defvar-local +doom-modeline-enable-word-count nil - "If non-nil, a word count will be added to the selection-info modeline -segment.") - -(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) -(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) - -(def-modeline-segment! selection-info - "Information about the current selection, such as how many characters and -lines are selected, or the NxM dimensions of a block selection." - (when (and mark-active (active)) - (cl-destructuring-bind (beg . end) - (if (eq evil-state 'visual) - (cons evil-visual-beginning evil-visual-end) - (cons (region-beginning) (region-end))) - (propertize - (let ((lines (count-lines beg (min end (point-max))))) - (concat (cond ((or (bound-and-true-p rectangle-mark-mode) - (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column end) - (doom-column beg))))) - (format "%dx%dB" lines cols))) - ((eq evil-visual-selection 'line) - (format "%dL" lines)) - ((> lines 1) - (format "%dC %dL" (- end beg) lines)) - ((format "%dC" (- end beg)))) - (when +doom-modeline-enable-word-count - (format " %dW" (count-words beg end))))) - 'face 'doom-modeline-highlight)))) - - -;; -;; matches (anzu, evil-substitute, iedit, macro) -;; - -(defun +doom-modeline--macro-recording () - "Display current Emacs or evil macro being recorded." - (when (and (active) (or defining-kbd-macro executing-kbd-macro)) - (let ((sep (propertize " " 'face 'doom-modeline-panel))) - (concat sep - (propertize (if (bound-and-true-p evil-this-macro) - (char-to-string evil-this-macro) - "Macro") - 'face 'doom-modeline-panel) - sep - (all-the-icons-octicon "triangle-right" - :face 'doom-modeline-panel - :v-adjust -0.05) - sep)))) - -(defsubst +doom-modeline--anzu () - "Show the match index and total number thereof. Requires `anzu', also -`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." - (when (and anzu--state (not iedit-mode)) - (propertize - (let ((here anzu--current-position) - (total anzu--total-matched)) - (cond ((eq anzu--state 'replace-query) - (format " %d replace " total)) - ((eq anzu--state 'replace) - (format " %d/%d " here total)) - (anzu--overflow-p - (format " %s+ " total)) - (t - (format " %s/%d " here total)))) - 'face (if (active) 'doom-modeline-panel)))) - -(defsubst +doom-modeline--evil-substitute () - "Show number of matches for evil-ex substitutions and highlights in real time." - (when (and evil-mode - (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) - (assq 'evil-ex-global-match evil-ex-active-highlights-alist) - (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) - (propertize - (let ((range (if evil-ex-range - (cons (car evil-ex-range) (cadr evil-ex-range)) - (cons (line-beginning-position) (line-end-position)))) - (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) - (if pattern - (format " %s matches " (how-many pattern (car range) (cdr range))) - " - ")) - 'face (if (active) 'doom-modeline-panel)))) - -(defun doom-themes--overlay-sort (a b) - (< (overlay-start a) (overlay-start b))) - -(defsubst +doom-modeline--iedit () - "Show the number of iedit regions matches + what match you're on." - (when (and iedit-mode iedit-occurrences-overlays) - (propertize - (let ((this-oc (or (let ((inhibit-message t)) - (iedit-find-current-occurrence-overlay)) - (progn (iedit-prev-occurrence) - (iedit-find-current-occurrence-overlay)))) - (length (length iedit-occurrences-overlays))) - (format " %s/%d " - (if this-oc - (- length - (length (memq this-oc (sort (append iedit-occurrences-overlays nil) - #'doom-themes--overlay-sort))) - -1) - "-") - length)) - 'face (if (active) 'doom-modeline-panel)))) - -(def-modeline-segment! matches - "Displays: 1. the currently recording macro, 2. A current/total for the -current search term (with anzu), 3. The number of substitutions being conducted -with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." - (let ((meta (concat (+doom-modeline--macro-recording) - (+doom-modeline--anzu) - (+doom-modeline--evil-substitute) - (+doom-modeline--iedit)))) - (or (and (not (equal meta "")) meta) - (if buffer-file-name " %I ")))) - - -;; -;; media-info -;; - -(def-modeline-segment! media-info - "Metadata regarding the current file, such as dimensions for images." - ;; TODO Include other information - (cond ((eq major-mode 'image-mode) - (cl-destructuring-bind (width . height) - (image-size (image-get-display-property) :pixels) - (format " %dx%d " width height))))) - - -;; -;; bar -;; - -(defvar +doom-modeline--bar-active nil) -(defvar +doom-modeline--bar-inactive nil) -(def-modeline-segment! bar - "The bar regulates the height of the mode-line in GUI Emacs. -Returns \"\" to not break --no-window-system." - (if window-system - (if (active) - +doom-modeline--bar-active - +doom-modeline--bar-inactive) - "")) - -(when EMACS26+ - (add-variable-watcher - '+doom-modeline-height - (lambda (_sym val op _where) - (when (and (eq op 'set) (integerp val)) - (+doom-modeline|refresh-bars +doom-modeline-bar-width val)))) - - (add-variable-watcher - '+doom-modeline-bar-width - (lambda (_sym val op _where) - (when (and (eq op 'set) (integerp val)) - (+doom-modeline|refresh-bars val +doom-modeline-height)))) - - (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font)) - - -;; -;; Mode lines -;; - -(def-modeline! main - (bar matches " " buffer-info " %l:%c %p " selection-info) - (buffer-encoding major-mode vcs flycheck)) - -(def-modeline! minimal - (bar matches " " buffer-info) - (media-info major-mode)) - -(def-modeline! special - (bar matches " " buffer-info-simple " %l:%c %p " selection-info) - (buffer-encoding major-mode flycheck)) - -(def-modeline! project - (bar buffer-default-directory) - (major-mode)) - -(def-modeline! media - (bar " %b ") - (media-info major-mode)) - - -;; -;; Hooks -;; - -(defun +doom-modeline|refresh-bars (&optional width height) - (setq +doom-modeline--bar-active - (+doom-modeline--make-xpm 'doom-modeline-bar - (or width +doom-modeline-bar-width) - (or height +doom-modeline-height)) - +doom-modeline--bar-inactive - (+doom-modeline--make-xpm 'doom-modeline-inactive-bar - (or width +doom-modeline-bar-width) - (or height +doom-modeline-height)))) - -(defun +doom-modeline|init () - ;; Create bars - (+doom-modeline|refresh-bars) - (unless after-init-time - ;; These buffers are already created and don't get modelines. For the love - ;; of Emacs, someone give the man a modeline! - (dolist (bname '("*scratch*" "*Messages*")) - (with-current-buffer bname - (doom-set-modeline 'main))))) - -(defun +doom-modeline|set-special-modeline () - (doom-set-modeline 'special)) - -(defun +doom-modeline|set-media-modeline () - (doom-set-modeline 'media)) - -(defun +doom-modeline|set-project-modeline () - (doom-set-modeline 'project)) - - -;; -;; Bootstrap -;; - -(doom-set-modeline 'main t) ; set default modeline - -(add-hook 'doom-load-theme-hook #'+doom-modeline|init) -(add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) -(add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) - -(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) -(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) - -;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) -(defvar +doom-modeline-remap-face-cookie nil) -(defun +doom-modeline|focus () - (when +doom-modeline-remap-face-cookie - (require 'face-remap) - (face-remap-remove-relative +doom-modeline-remap-face-cookie))) -(defun +doom-modeline|unfocus () - (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) - -(add-hook 'focus-in-hook #'+doom-modeline|focus) -(add-hook 'focus-out-hook #'+doom-modeline|unfocus) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 6d4053a97..b91676caf 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -1,5 +1,95 @@ ;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- + + +;; +;; Modeline library +;; + +(defvar doom--modeline-fn-alist ()) +(defvar doom--modeline-var-alist ()) + +(defmacro def-modeline-segment! (name &rest body) + "Defines a modeline segment and byte compiles it." + (declare (indent defun) (doc-string 2)) + (let ((sym (intern (format "doom-modeline-segment--%s" name))) + (docstring (if (stringp (car body)) + (pop body) + (format "%s modeline segment" name)))) + (cond ((and (symbolp (car body)) + (not (cdr body))) + (add-to-list 'doom--modeline-var-alist (cons name (car body))) + `(add-to-list 'doom--modeline-var-alist (cons ',name ',(car body)))) + (t + (add-to-list 'doom--modeline-fn-alist (cons name sym)) + `(progn + (fset ',sym (lambda () ,docstring ,@body)) + (add-to-list 'doom--modeline-fn-alist (cons ',name ',sym)) + ,(unless (bound-and-true-p byte-compile-current-file) + `(let (byte-compile-warnings) + (byte-compile #',sym)))))))) + +(defun doom--prepare-modeline-segments (segments) + (let (forms it) + (dolist (seg segments) + (cond ((stringp seg) + (push seg forms)) + ((symbolp seg) + (cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) + (push (list :eval (list it)) forms)) + ((setq it (cdr (assq seg doom--modeline-var-alist))) + (push it forms)) + ((error "%s is not a defined segment" seg)))) + ((error "%s is not a valid segment" seg)))) + (nreverse forms))) + +(defun def-modeline! (name lhs &optional rhs) + "Defines a modeline format and byte-compiles it. NAME is a symbol to identify +it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of +modeline segments defined with `def-modeline-segment!'. + +Example: + (def-modeline! 'minimal + '(bar matches \" \" buffer-info) + '(media-info major-mode)) + (doom-set-modeline 'minimal t)" + (let ((sym (intern (format "doom-modeline-format--%s" name))) + (lhs-forms (doom--prepare-modeline-segments lhs)) + (rhs-forms (doom--prepare-modeline-segments rhs))) + (defalias sym + (lambda () + (let ((rhs-str (format-mode-line rhs-forms))) + (list lhs-forms + (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(+ 1 (string-width rhs-str)))))) + rhs-str))) + (concat "Modeline:\n" + (format " %s\n %s" + (prin1-to-string lhs) + (prin1-to-string rhs)))) + (unless (bound-and-true-p byte-compile-current-file) + (let (byte-compile-warnings) + (byte-compile sym))))) + +(defun doom-modeline (key) + "Returns a mode-line configuration associated with KEY (a symbol). Throws an +error if it doesn't exist." + (let ((fn (intern-soft (format "doom-modeline-format--%s" key)))) + (when (functionp fn) + `(:eval (,fn))))) + +(defun doom-set-modeline (key &optional default) + "Set the modeline format. Does nothing if the modeline KEY doesn't exist. If +DEFAULT is non-nil, set the default mode-line for all buffers." + (when-let* ((modeline (doom-modeline key))) + (setf (if default + (default-value 'mode-line-format) + (buffer-local-value 'mode-line-format (current-buffer))) + (list "%e" modeline)))) + + ;; ;; Custom faces ;; @@ -70,7 +160,679 @@ active." ;; -(if (featurep! +new) - (load! "+new") - (load! "+old")) +;; Plugins +;; +;; anzu and evil-anzu expose current/total state that can be displayed in the +;; mode-line. +(def-package! anzu + :after-call isearch-mode + :config + (setq anzu-cons-mode-line-p nil + anzu-minimum-input-length 1 + anzu-search-threshold 250) + (global-anzu-mode +1) + + (defun +doom-modeline*fix-anzu-count (positions here) + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) + + ;; Avoid anzu conflicts across buffers + (mapc #'make-variable-buffer-local + '(anzu--total-matched anzu--current-position anzu--state + anzu--cached-count anzu--cached-positions anzu--last-command + anzu--last-isearch-string anzu--overflow-p)) + ;; Ensure anzu state is cleared when searches & iedit are done + (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) + (add-hook 'doom-escape-hook #'anzu--reset-status t) + (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) + + +(def-package! evil-anzu + :when (featurep! :feature evil) + :after-call (evil-ex-start-search evil-ex-start-word-search)) + + +;; fish-style modeline +(def-package! shrink-path + :commands (shrink-path-prompt shrink-path-file-mixed)) + + +;; Keep `+doom-modeline-current-window' up-to-date +(defvar +doom-modeline-current-window (frame-selected-window)) +(defun +doom-modeline|set-selected-window (&rest _) + "Sets `+doom-modeline-current-window' appropriately" + (when-let* ((win (frame-selected-window))) + (unless (minibuffer-window-active-p win) + (setq +doom-modeline-current-window win) + (force-mode-line-update)))) + +(defun +doom-modeline|unset-selected-window () + (setq +doom-modeline-current-window nil) + (force-mode-line-update)) + +(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) +(add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) +(with-no-warnings + (cond ((not (boundp 'after-focus-change-function)) + (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) + (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) + ((defun +doom-modeline|refresh-frame () + (setq +doom-modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq +doom-modeline-current-window (frame-selected-window frame))) + (force-mode-line-update)) + (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)))) + + +;; +;; Variables +;; + +(defvar +doom-modeline-height 23 + "How tall the mode-line should be (only respected in GUI emacs).") + +(defvar +doom-modeline-bar-width 3 + "How wide the mode-line bar should be (only respected in GUI emacs).") + +(defvar +doom-modeline-buffer-file-name-style 'truncate-upto-project + "Determines the style used by `+doom-modeline-buffer-file-name'. + +Given ~/Projects/FOSS/emacs/lisp/comint.el +truncate-upto-project => ~/P/F/emacs/lisp/comint.el +truncate-upto-root => ~/P/F/e/lisp/comint.el +truncate-all => ~/P/F/e/l/comint.el +relative-from-project => emacs/lisp/comint.el +relative-to-project => lisp/comint.el +file-name => comint.el") + +;; externs +(defvar anzu--state nil) +(defvar evil-mode nil) +(defvar evil-state nil) +(defvar evil-visual-selection nil) +(defvar iedit-mode nil) +(defvar all-the-icons-scale-factor) +(defvar all-the-icons-default-adjust) + + +;; +;; Modeline helpers +;; + +(defsubst active () + (eq (selected-window) +doom-modeline-current-window)) + +(defun +doom-modeline--make-xpm (face width height) + "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." + (propertize + " " 'display + (let ((data (make-list height (make-list width 1))) + (color (or (face-background face nil t) "None"))) + (ignore-errors + (create-image + (concat + (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," + (length (car data)) + (length data) + color + color) + (apply #'concat + (cl-loop with idx = 0 + with len = (length data) + for dl in data + do (cl-incf idx) + collect + (concat "\"" + (cl-loop for d in dl + if (= d 0) collect (string-to-char " ") + else collect (string-to-char ".")) + (if (eq idx len) "\"};" "\",\n"))))) + 'xpm t :ascent 'center))))) + +(defun +doom-modeline-buffer-file-name () + "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." + (let ((buffer-file-name (or buffer-file-name "")) + (buffer-file-truename (or buffer-file-truename ""))) + (propertize + (pcase +doom-modeline-buffer-file-name-style + (`truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) + (`truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) + (`truncate-all (+doom-modeline--buffer-file-name-truncate t)) + (`relative-to-project (+doom-modeline--buffer-file-name-relative)) + (`relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) + (`file-name (propertize (file-name-nondirectory buffer-file-name) + 'face + (let ((face (or (and (buffer-modified-p) + 'doom-modeline-buffer-modified) + (and (active) + 'doom-modeline-buffer-file)))) + (when face `(:inherit ,face)))))) + 'help-echo buffer-file-truename))) + +(defun +doom-modeline--buffer-file-name-truncate (&optional truncate-tail) + "Propertized `buffer-file-name' that truncates every dir along path. +If TRUNCATE-TAIL is t also truncate the parent directory of the file." + (let ((dirs (shrink-path-prompt (file-name-directory buffer-file-truename))) + (active (active))) + (if (null dirs) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) + (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) + (let ((dirname (car dirs)) + (basename (cdr dirs)) + (dir-faces (or modified-faces (if active 'doom-modeline-project-root-dir))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (concat (propertize (concat dirname + (if truncate-tail (substring basename 0 1) basename) + "/") + 'face (if dir-faces `(:inherit ,dir-faces))) + (propertize (file-name-nondirectory buffer-file-name) + 'face (if file-faces `(:inherit ,file-faces))))))))) + +(defun +doom-modeline--buffer-file-name-relative (&optional include-project) + "Propertized `buffer-file-name' showing directories relative to project's root only." + (let ((root (doom-project-root)) + (active (active))) + (if (null root) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) + (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) + (true-filename (file-truename buffer-file-name)) + (relative-dirs (file-relative-name (file-name-directory true-filename) + (if include-project (concat root "../") root))) + (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (if (equal "./" relative-dirs) (setq relative-dirs "")) + (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) + (propertize (file-name-nondirectory true-filename) + 'face (if file-faces `(:inherit ,file-faces)))))))) + +(defun +doom-modeline--buffer-file-name (truncate-project-root-parent) + "Propertized `buffer-file-name'. +If TRUNCATE-PROJECT-ROOT-PARENT is t space will be saved by truncating it down +fish-shell style. + +Example: +~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" + (let* ((project-root (doom-project-root)) + (file-name-split (shrink-path-file-mixed project-root + (file-name-directory buffer-file-name) + buffer-file-name)) + (active (active))) + (if (null file-name-split) + (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) + (pcase-let ((`(,root-path-parent ,project ,relative-path ,filename) file-name-split)) + (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) + (let ((sp-faces (or modified-faces (if active 'font-lock-comment-face))) + (project-faces (or modified-faces (if active 'font-lock-string-face))) + (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) + (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) + (let ((sp-props `(,@(if sp-faces `(:inherit ,sp-faces)) ,@(if active '(:weight bold)))) + (project-props `(,@(if project-faces `(:inherit ,project-faces)) ,@(if active '(:weight bold)))) + (relative-props `(,@(if relative-faces `(:inherit ,relative-faces)))) + (file-props `(,@(if file-faces `(:inherit ,file-faces))))) + (concat (propertize (if truncate-project-root-parent + root-path-parent + (abbreviate-file-name project-root)) + 'face sp-props) + (propertize (concat project "/") 'face project-props) + (if relative-path (propertize relative-path 'face relative-props)) + (propertize filename 'face file-props))))))))) + + +;; +;; buffer information +;; + +(def-modeline-segment! buffer-default-directory + "Displays `default-directory'. This is for special buffers like the scratch +buffer where knowing the current project directory is important." + (let ((face (if (active) 'doom-modeline-buffer-path))) + (concat (if (display-graphic-p) " ") + (all-the-icons-octicon + "file-directory" + :face face + :v-adjust -0.05 + :height 1.25) + (propertize (concat " " (abbreviate-file-name default-directory)) + 'face face)))) + +(def-modeline-segment! buffer-info + "Combined information about the current buffer, including the current working +directory, the file name, and its state (modified, read-only or non-existent)." + (concat (cond (buffer-read-only + (concat (all-the-icons-octicon + "lock" + :face 'doom-modeline-warning + :v-adjust -0.05) + " ")) + ((buffer-modified-p) + (concat (all-the-icons-faicon + "floppy-o" + :face 'doom-modeline-buffer-modified + :v-adjust -0.0575) + " ")) + ((and buffer-file-name + (not (file-exists-p buffer-file-name))) + (concat (all-the-icons-octicon + "circle-slash" + :face 'doom-modeline-urgent + :v-adjust -0.05) + " ")) + ((buffer-narrowed-p) + (concat (all-the-icons-octicon + "fold" + :face 'doom-modeline-warning + :v-adjust -0.05) + " "))) + (if buffer-file-name + (+doom-modeline-buffer-file-name) + "%b"))) + +(def-modeline-segment! buffer-info-simple + "Display only the current buffer's name, but with fontification." + (propertize + "%b" + 'face (cond ((and buffer-file-name (buffer-modified-p)) + 'doom-modeline-buffer-modified) + ((active) 'doom-modeline-buffer-file)))) + +;; (defvar +doom-modeline--encoding nil) +;; (def-modeline-segment! buffer-encoding +;; "TODO" +;; +doom-modeline--encoding) + +;; (add-variable-watcher +;; 'buffer-file-coding-system +;; (lambda (_sym val op _where) +;; (when (eq op 'set) +;; (setq +doom-modeline--encoding +;; (concat (pcase (coding-system-eol-type val) +;; (0 "LF ") +;; (1 "CRLF ") +;; (2 "CR ")) +;; (let ((sys (coding-system-plist val))) +;; (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) +;; "UTF-8" +;; (upcase (symbol-name (plist-get sys :name))))) +;; " "))))) + +(def-modeline-segment! buffer-encoding + "Displays the encoding and eol style of the buffer the same way Atom does." + (concat (pcase (coding-system-eol-type buffer-file-coding-system) + (0 "LF ") + (1 "CRLF ") + (2 "CR ")) + (let ((sys (coding-system-plist buffer-file-coding-system))) + (cond ((memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) + "UTF-8") + (t (upcase (symbol-name (plist-get sys :name)))))) + " ")) + + +;; +;; major-mode +;; + +(def-modeline-segment! major-mode + "The major mode, including process, environment and text-scale info." + (propertize + (concat (format-mode-line mode-name) + (when (stringp mode-line-process) + mode-line-process) + (and (boundp 'text-scale-mode-amount) + (/= text-scale-mode-amount 0) + (format " (%+d)" text-scale-mode-amount))) + 'face (if (active) 'doom-modeline-buffer-major-mode))) + + +;; +;; vcs +;; + +(defvar-local +doom-modeline--vcs nil) +(defun +doom-modeline--update-vcs () + (setq +doom-modeline--vcs + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend))) + (let ((face 'mode-line-inactive) + (active (active)) + (all-the-icons-default-adjust -0.1)) + (concat " " + (cond ((memq state '(edited added)) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05)) + ((eq state 'needs-merge) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon "git-merge" :face face)) + ((eq state 'needs-update) + (if active (setq face 'doom-modeline-warning)) + (all-the-icons-octicon "arrow-down" :face face)) + ((memq state '(removed conflict unregistered)) + (if active (setq face 'doom-modeline-urgent)) + (all-the-icons-octicon "alert" :face face)) + (t + (if active (setq face 'font-lock-doc-face)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05))) + " " + (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) + 'face (if active face)) + " ")))))) +(add-hook 'after-revert-hook #'+doom-modeline--update-vcs) +(add-hook 'after-save-hook #'+doom-modeline--update-vcs) +(add-hook 'find-file-hook #'+doom-modeline--update-vcs t) + +(def-modeline-segment! vcs + "Displays the current branch, colored based on its state." + +doom-modeline--vcs) + + +;; +;; flycheck +;; + +(defvar +doom-modeline-vspc + (propertize " " 'face 'variable-pitch) + "TODO") + +(defun +doom-ml-icon (icon &optional text face voffset) + "Displays an octicon ICON with FACE, followed by TEXT. Uses +`all-the-icons-octicon' to fetch the icon." + (concat (if vc-mode " " " ") + (when icon + (concat + (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) + (if text +doom-modeline-vspc))) + (if text (propertize text 'face face)) + (if vc-mode " " " "))) + +(defvar-local +doom-modeline--flycheck nil) +(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) +(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) + +(defun +doom-modeline|update-flycheck-segment (&optional status) + (setq +doom-modeline--flycheck + (pcase status + ('finished (if flycheck-current-errors + (let-alist (flycheck-count-errors flycheck-current-errors) + (let ((sum (+ (or .error 0) (or .warning 0)))) + (+doom-ml-icon "do_not_disturb_alt" + (number-to-string sum) + (if .error 'doom-modeline-urgent 'doom-modeline-warning) + -0.25))) + (+doom-ml-icon "check" nil 'doom-modeline-info))) + ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) + ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) + ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) + ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) + +(def-modeline-segment! flycheck + "Displays color-coded flycheck error status in the current buffer with pretty +icons." + +doom-modeline--flycheck) + + +;; +;; selection-info +;; + +(defsubst doom-column (pos) + (save-excursion (goto-char pos) + (current-column))) + +(defvar-local +doom-modeline-enable-word-count nil + "If non-nil, a word count will be added to the selection-info modeline +segment.") + +(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) +(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) + +(def-modeline-segment! selection-info + "Information about the current selection, such as how many characters and +lines are selected, or the NxM dimensions of a block selection." + (when (and mark-active (active)) + (cl-destructuring-bind (beg . end) + (if (eq evil-state 'visual) + (cons evil-visual-beginning evil-visual-end) + (cons (region-beginning) (region-end))) + (propertize + (let ((lines (count-lines beg (min end (point-max))))) + (concat (cond ((or (bound-and-true-p rectangle-mark-mode) + (eq 'block evil-visual-selection)) + (let ((cols (abs (- (doom-column end) + (doom-column beg))))) + (format "%dx%dB" lines cols))) + ((eq evil-visual-selection 'line) + (format "%dL" lines)) + ((> lines 1) + (format "%dC %dL" (- end beg) lines)) + ((format "%dC" (- end beg)))) + (when +doom-modeline-enable-word-count + (format " %dW" (count-words beg end))))) + 'face 'doom-modeline-highlight)))) + + +;; +;; matches (anzu, evil-substitute, iedit, macro) +;; + +(defun +doom-modeline--macro-recording () + "Display current Emacs or evil macro being recorded." + (when (and (active) (or defining-kbd-macro executing-kbd-macro)) + (let ((sep (propertize " " 'face 'doom-modeline-panel))) + (concat sep + (propertize (if (bound-and-true-p evil-this-macro) + (char-to-string evil-this-macro) + "Macro") + 'face 'doom-modeline-panel) + sep + (all-the-icons-octicon "triangle-right" + :face 'doom-modeline-panel + :v-adjust -0.05) + sep)))) + +(defsubst +doom-modeline--anzu () + "Show the match index and total number thereof. Requires `anzu', also +`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." + (when (and anzu--state (not iedit-mode)) + (propertize + (let ((here anzu--current-position) + (total anzu--total-matched)) + (cond ((eq anzu--state 'replace-query) + (format " %d replace " total)) + ((eq anzu--state 'replace) + (format " %d/%d " here total)) + (anzu--overflow-p + (format " %s+ " total)) + (t + (format " %s/%d " here total)))) + 'face (if (active) 'doom-modeline-panel)))) + +(defsubst +doom-modeline--evil-substitute () + "Show number of matches for evil-ex substitutions and highlights in real time." + (when (and evil-mode + (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) + (assq 'evil-ex-global-match evil-ex-active-highlights-alist) + (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) + (propertize + (let ((range (if evil-ex-range + (cons (car evil-ex-range) (cadr evil-ex-range)) + (cons (line-beginning-position) (line-end-position)))) + (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) + (if pattern + (format " %s matches " (how-many pattern (car range) (cdr range))) + " - ")) + 'face (if (active) 'doom-modeline-panel)))) + +(defun doom-themes--overlay-sort (a b) + (< (overlay-start a) (overlay-start b))) + +(defsubst +doom-modeline--iedit () + "Show the number of iedit regions matches + what match you're on." + (when (and iedit-mode iedit-occurrences-overlays) + (propertize + (let ((this-oc (or (let ((inhibit-message t)) + (iedit-find-current-occurrence-overlay)) + (progn (iedit-prev-occurrence) + (iedit-find-current-occurrence-overlay)))) + (length (length iedit-occurrences-overlays))) + (format " %s/%d " + (if this-oc + (- length + (length (memq this-oc (sort (append iedit-occurrences-overlays nil) + #'doom-themes--overlay-sort))) + -1) + "-") + length)) + 'face (if (active) 'doom-modeline-panel)))) + +(def-modeline-segment! matches + "Displays: 1. the currently recording macro, 2. A current/total for the +current search term (with anzu), 3. The number of substitutions being conducted +with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." + (let ((meta (concat (+doom-modeline--macro-recording) + (+doom-modeline--anzu) + (+doom-modeline--evil-substitute) + (+doom-modeline--iedit)))) + (or (and (not (equal meta "")) meta) + (if buffer-file-name " %I ")))) + + +;; +;; media-info +;; + +(def-modeline-segment! media-info + "Metadata regarding the current file, such as dimensions for images." + ;; TODO Include other information + (cond ((eq major-mode 'image-mode) + (cl-destructuring-bind (width . height) + (image-size (image-get-display-property) :pixels) + (format " %dx%d " width height))))) + + +;; +;; bar +;; + +(defvar +doom-modeline--bar-active nil) +(defvar +doom-modeline--bar-inactive nil) +(def-modeline-segment! bar + "The bar regulates the height of the mode-line in GUI Emacs. +Returns \"\" to not break --no-window-system." + (if window-system + (if (active) + +doom-modeline--bar-active + +doom-modeline--bar-inactive) + "")) + +(when EMACS26+ + (add-variable-watcher + '+doom-modeline-height + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (+doom-modeline|refresh-bars +doom-modeline-bar-width val)))) + + (add-variable-watcher + '+doom-modeline-bar-width + (lambda (_sym val op _where) + (when (and (eq op 'set) (integerp val)) + (+doom-modeline|refresh-bars val +doom-modeline-height)))) + + (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font)) + + +;; +;; Mode lines +;; + +(def-modeline! 'main + '(bar matches " " buffer-info " %l:%c %p " selection-info) + '(buffer-encoding major-mode vcs flycheck)) + +(def-modeline! 'minimal + '(bar matches " " buffer-info) + '(media-info major-mode)) + +(def-modeline! 'special + '(bar matches " " buffer-info-simple " %l:%c %p " selection-info) + '(buffer-encoding major-mode flycheck)) + +(def-modeline! 'project + '(bar buffer-default-directory) + '(major-mode)) + +(def-modeline! 'media + '(bar " %b ") + '(media-info major-mode)) + + +;; +;; Hooks +;; + +(defun +doom-modeline|refresh-bars (&optional width height) + (setq +doom-modeline--bar-active + (+doom-modeline--make-xpm 'doom-modeline-bar + (or width +doom-modeline-bar-width) + (or height +doom-modeline-height)) + +doom-modeline--bar-inactive + (+doom-modeline--make-xpm 'doom-modeline-inactive-bar + (or width +doom-modeline-bar-width) + (or height +doom-modeline-height)))) + +(defun +doom-modeline|init () + ;; Create bars + (+doom-modeline|refresh-bars) + (unless after-init-time + ;; These buffers are already created and don't get modelines. For the love + ;; of Emacs, someone give the man a modeline! + (dolist (bname '("*scratch*" "*Messages*")) + (with-current-buffer bname + (doom-set-modeline 'main))))) + +(defun +doom-modeline|set-special-modeline () + (doom-set-modeline 'special)) + +(defun +doom-modeline|set-media-modeline () + (doom-set-modeline 'media)) + +(defun +doom-modeline|set-project-modeline () + (doom-set-modeline 'project)) + + +;; +;; Bootstrap +;; + +(doom-set-modeline 'main t) ; set default modeline + +(add-hook 'doom-load-theme-hook #'+doom-modeline|init) +(add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) +(add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) + +(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) +(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) + +;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) +(defvar +doom-modeline-remap-face-cookie nil) +(defun +doom-modeline|focus () + (when +doom-modeline-remap-face-cookie + (require 'face-remap) + (face-remap-remove-relative +doom-modeline-remap-face-cookie))) +(defun +doom-modeline|unfocus () + (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) + +(add-hook 'focus-in-hook #'+doom-modeline|focus) +(add-hook 'focus-out-hook #'+doom-modeline|unfocus) diff --git a/modules/ui/modeline/README.org b/modules/ui/modeline/README.org new file mode 100644 index 000000000..e69de29bb diff --git a/modules/ui/modeline/autoload/modeline.el b/modules/ui/modeline/autoload/modeline.el new file mode 100644 index 000000000..ef9d21a59 --- /dev/null +++ b/modules/ui/modeline/autoload/modeline.el @@ -0,0 +1,19 @@ +;;; ui/modeline/autoload/modeline.el -*- lexical-binding: t; -*- + +;; (defvar +modeline--old-bar-height nil) +;; ;;;###autoload +;; (defun +modeline|resize-for-big-font () +;; "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was +;; made to be added to `doom-big-font-mode-hook'." +;; (unless +modeline--old-bar-height +;; (setq +modeline--old-bar-height +doom-modeline-height)) +;; (let ((default-height +modeline--old-bar-height)) +;; (if doom-big-font-mode +;; (let* ((font-size (font-get doom-font :size)) +;; (big-size (font-get doom-big-font :size)) +;; (ratio (/ (float big-size) font-size))) +;; (setq +doom-modeline-height (ceiling (* default-height ratio 0.75)))) +;; (setq +doom-modeline-height default-height)) +;; ;; already has a variable watcher in Emacs 26+ +;; (unless EMACS26+ (+doom-modeline|refresh-bars)))) + diff --git a/modules/ui/modeline/autoload/settings.el b/modules/ui/modeline/autoload/settings.el new file mode 100644 index 000000000..2a27d6764 --- /dev/null +++ b/modules/ui/modeline/autoload/settings.el @@ -0,0 +1,92 @@ +;;; ui/modeline/autoload/settings.el -*- lexical-binding: t; -*- + +(defvar +modeline--alist nil) + +;;;###autodef +(defun def-modeline-format! (name left &optional right) + "Define a preset modeline format by name. + +NAME is a symbol. The convention is to use keywords for global formats, like +:main or :project, but to use regular symbols for buffer-local formats, like +'twitter and 'pdf. + +LEFT and RIGHT are lists that assume the same structure as `mode-line-format', +and make up the mode-line in two parts, separated by variable-width space, to +keep them left and right aligned respectively." + (setf (alist-get name +modeline--alist) (list left right))) + +;;;###autodef +(defmacro def-modeline-segment! (name &rest rest) + "TODO" + (declare (doc-string 2)) + (let ((docstring (if (and (stringp (car rest)) (cdr rest)) (pop rest))) + body) + (macroexp-progn + (if (not (keywordp (car rest))) + `((defvar-local ,name nil ,docstring) + (setq-default + ,name + ,(if (or (stringp (car rest)) + (memq (car (car-safe rest)) '(:eval :propertize))) + (car rest) + `(quote (:eval ,(macroexp-progn rest))))) + (put ',name 'risky-local-variable t)) + ;; isolate body + (setq body rest) + (while (keywordp (car body)) + (setq body (cddr body))) + ;; + (cl-destructuring-bind (&key init faces on-hooks on-set activate deactivate &allow-other-keys) + rest + (let ((realvar (if (and body faces) + (intern (format "+modeline--var-%s" name)) + name))) + (append (when body + (if (or on-hooks on-set) + (let ((setterfn (intern (format "+modeline--set-%s" name))) + (varsetterfn (intern (format "+modeline--setvar-%s" name)))) + (append `((fset ',setterfn + (lambda (&rest _) + (when (or (memq ',name +modeline-format-left) + (memq ',name +modeline-format-right)) + (setq-local ,realvar ,(macroexp-progn body))))) + (byte-compile ',setterfn)) + (mapcar (lambda (hook) `(add-hook ',hook #',setterfn)) + on-hooks) + (when on-set + `((fset ',varsetterfn + (lambda (sym val op where) + (and (eq op 'set) where + (with-current-buffer where + (set sym val) + (,setterfn))))) + ,@(mapcar (lambda (var) `(add-variable-watcher ',var #',varsetterfn)) + on-set))))) + (setq init `(quote (:eval ,(macroexp-progn body)))) + nil)) + (if (eq realvar name) + `((defvar-local ,name nil ,docstring) + (setq-default ,name ,init)) + `((defvar-local ,realvar nil) + (defvar-local ,name nil ,docstring) + (setq-default + ,name '(:eval (cond ((active) ,realvar) + (,realvar (substring-no-properties ,realvar))))))) + `((put ',name 'risky-local-variable t))))))))) + +;;;###autodef +(defun set-modeline! (name &optional default) + "Replace the current buffer's modeline with a preset mode-line format defined +with `def-modeline-format!'. + +If DEFAULT is non-nil, make it the default mode-line for all buffers." + (cl-check-type name symbol) + (let ((modeline (cdr (assq name +modeline--alist)))) + (unless modeline + (error "The %s modeline format does not exist" name)) + (if default + (setq-default +modeline-format-left `("" ,@(car modeline)) + +modeline-format-right `("" ,@(cadr modeline))) + (setq +modeline-format-left `("" ,@(car modeline)) + +modeline-format-right `("" ,@(cadr modeline)))) + (force-mode-line-update))) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el new file mode 100644 index 000000000..ca5f82011 --- /dev/null +++ b/modules/ui/modeline/config.el @@ -0,0 +1,532 @@ +;;; ui/modeline/config.el -*- lexical-binding: t; -*- + +;; This mode-line is experimental, may have bugs and is likely to change. It +;; also doesn't have all the features of the old modeline (yet). +;; +;; However, it is at least twice as fast as the original modeline, and a little +;; more flexible, what with `+modeline-format-left' and +;; `+modeline-format-right'. It also exposes a more powerful API for defining +;; modelines and modeline segments that make use of variable watchers and hooks +;; to update them. + +;;;; Benchmarks +;; (benchmark-run 1000 (format-mode-line mode-line-format)) +;; Old system: ~0.198 +;; New system: ~0.056 + +(defvar +modeline-height 21 + "How tall the mode-line should be (only respected in GUI emacs).") + +(defvar +modeline-buffer-path-function #'+modeline-file-path + "The function that returns the buffer name display for file-visiting +buffers.") + +;; +(defvar-local +modeline-format-left () "TODO") +(defvar-local +modeline-format-right () "TODO") +(put '+modeline-format-left 'risky-local-variable t) +(put '+modeline-format-right 'risky-local-variable t) +;; Convenience aliases +(defvaralias 'mode-line-format-left '+modeline-format-left) +(defvaralias 'mode-line-format-right '+modeline-format-right) + +;; externs +(defvar anzu--state nil) +(defvar evil-mode nil) +(defvar evil-state nil) +(defvar evil-visual-selection nil) +(defvar iedit-mode nil) +(defvar all-the-icons-scale-factor) +(defvar all-the-icons-default-adjust) + + +;; +;; Custom faces +;; + +(defgroup +modeline nil + "TODO" + :group 'faces) + +(defface doom-modeline-buffer-path + '((t (:inherit (mode-line-emphasis bold)))) + "Face used for the dirname part of the buffer path." + :group '+modeline) + +(defface doom-modeline-buffer-file + '((t (:inherit (mode-line-buffer-id bold)))) + "Face used for the filename part of the mode-line buffer path." + :group '+modeline) + +(defface doom-modeline-buffer-modified '((t (:inherit (error bold) :background nil))) + "Face used for the 'unsaved' symbol in the mode-line." + :group '+modeline) + +(defface doom-modeline-buffer-major-mode '((t (:inherit (mode-line-emphasis bold)))) + "Face used for the major-mode segment in the mode-line." + :group '+modeline) + +(defface doom-modeline-highlight '((t (:inherit mode-line-emphasis))) + "Face for bright segments of the mode-line." + :group '+modeline) + +(defface doom-modeline-panel '((t (:inherit mode-line-highlight))) + "Face for 'X out of Y' segments, such as `+modeline--anzu', +`+modeline--evil-substitute' and `iedit'" + :group '+modeline) + +(defface doom-modeline-info `((t (:inherit (success bold)))) + "Face for info-level messages in the modeline. Used by `*vc'." + :group '+modeline) + +(defface doom-modeline-warning `((t (:inherit (warning bold)))) + "Face for warnings in the modeline. Used by `*flycheck'" + :group '+modeline) + +(defface doom-modeline-urgent `((t (:inherit (error bold)))) + "Face for errors in the modeline. Used by `*flycheck'" + :group '+modeline) + +(defface doom-modeline-bar '((t (:inherit highlight))) + "The face used for the left-most bar on the mode-line of an active window." + :group '+modeline) + + +;; +;; Plugins +;; + +(def-package! anzu + :after-call isearch-mode + :config + (setq anzu-cons-mode-line-p nil + anzu-minimum-input-length 1 + anzu-search-threshold 250) + (global-anzu-mode +1) + + (defun +modeline*fix-anzu-count (positions here) + (cl-loop for (start . end) in positions + collect t into before + when (and (>= here start) (<= here end)) + return (length before) + finally return 0)) + (advice-add #'anzu--where-is-here :override #'+modeline*fix-anzu-count) + + ;; Avoid anzu conflicts across buffers + (mapc #'make-variable-buffer-local + '(anzu--total-matched anzu--current-position anzu--state + anzu--cached-count anzu--cached-positions anzu--last-command + anzu--last-isearch-string anzu--overflow-p)) + ;; Ensure anzu state is cleared when searches & iedit are done + (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) + (add-hook 'doom-escape-hook #'anzu--reset-status t) + (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) + + +(def-package! evil-anzu + :when (featurep! :feature evil) + :after-call (evil-ex-start-search evil-ex-start-word-search)) + + +;; +;; Hacks +;; + +;; Keep `+modeline-current-window' up-to-date +(defvar +modeline-current-window (frame-selected-window)) + +(defun +modeline|set-selected-window (&rest _) + "Sets `+modeline-current-window' appropriately" + (when-let* ((win (frame-selected-window))) + (unless (minibuffer-window-active-p win) + (setq +modeline-current-window win) + (force-mode-line-update)))) + +(defun +modeline|unset-selected-window () + (setq +modeline-current-window nil) + (force-mode-line-update)) + +(add-hook 'window-configuration-change-hook #'+modeline|set-selected-window) +(add-hook 'doom-enter-window-hook #'+modeline|set-selected-window) +(if (not (boundp 'after-focus-change-function)) + (progn + (add-hook 'focus-in-hook #'+modeline|set-selected-window) + (add-hook 'focus-out-hook #'+modeline|unset-selected-window)) + (defun +modeline|refresh-frame () + (setq +modeline-current-window nil) + (cl-loop for frame in (frame-list) + if (eq (frame-focus-state frame) t) + return (setq +modeline-current-window (frame-selected-window frame))) + (force-mode-line-update t)) + (add-function :after after-focus-change-function #'+modeline|refresh-frame)) + +(defsubst active () + (eq (selected-window) +modeline-current-window)) + +;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) +(defvar +modeline-remap-face-cookie nil) + +(defun +modeline|focus () + (when +modeline-remap-face-cookie + (require 'face-remap) + (face-remap-remove-relative +modeline-remap-face-cookie))) +(add-hook 'focus-in-hook #'+modeline|focus) + +(defun +modeline|unfocus () + (setq +modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) +(add-hook 'focus-out-hook #'+modeline|unfocus) + + +;; +;; Helpers +;; + +(defun +modeline--make-xpm (width height &optional color) + "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." + (propertize + " " 'display + (let ((data (make-list height (make-list width 1))) + (color (or color "None"))) + (ignore-errors + (create-image + (concat + (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," + (length (car data)) (length data) color color) + (cl-loop with idx = 0 + with len = (length data) + for dl in data + do (cl-incf idx) + concat "\"" + concat (cl-loop for d in dl + if (= d 0) collect (string-to-char " ") + else collect (string-to-char ".")) + concat (if (eq idx len) "\"};" "\",\n"))) + 'xpm t :ascent 'center))))) + +(defun +modeline-file-path (&optional path) + (let ((buffer-file-name (or path buffer-file-name)) + (root (doom-project-root))) + (cond ((null root) + (propertize "%b" 'face 'doom-modeline-buffer-file)) + ((or (null buffer-file-name) + (directory-name-p buffer-file-name)) + (propertize (abbreviate-file-name (or buffer-file-name default-directory)) + 'face 'doom-modeline-buffer-path)) + ((let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) + (true-filename (file-truename buffer-file-name)) + (relative-dirs (file-relative-name (file-name-directory true-filename) + (concat root "../"))) + (relative-faces (or modified-faces 'doom-modeline-buffer-path)) + (file-faces (or modified-faces 'doom-modeline-buffer-file))) + (if (equal "./" relative-dirs) (setq relative-dirs "")) + (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) + (propertize (file-name-nondirectory true-filename) + 'face (if file-faces `(:inherit ,file-faces))))))))) + +;; TODO Add shrink-path alternatives + + +;; +;; Bars +;; + +(defvar +modeline-bar-active nil "TODO") +(defvar +modeline-bar-inactive nil "TODO") +(defun +modeline|setup-bars () + (setq +modeline-bar-active + (+modeline--make-xpm 3 +modeline-height (face-background 'doom-modeline-bar)) + +modeline-bar-inactive + (+modeline--make-xpm 3 +modeline-height))) +(add-hook 'doom-load-theme-hook #'+modeline|setup-bars) + +(defun +modeline|setup-bars-after-change (_sym val op _where) + (when (eq op 'set) + (let ((+modeline-height val)) + (+modeline|setup-bars)))) +(add-variable-watcher '+modeline-height #'+modeline|setup-bars-after-change) + +(def-modeline-segment! +modeline-bar + (if (active) +modeline-bar-active +modeline-bar-inactive)) + + +;; +;; Segments +;; + +(defun +modeline|update-on-change () + (+modeline--set-+modeline-buffer-state) + (remove-hook 'post-command-hook #'+modeline|update-on-change t)) +(defun +modeline|start-update-on-change () + (add-hook 'post-command-hook #'+modeline|update-on-change nil t)) +(add-hook 'first-change-hook #'+modeline|start-update-on-change) + +(advice-add #'undo :after #'+modeline--set-+modeline-buffer-state) +(advice-add #'undo-tree-undo :after #'+modeline--set-+modeline-buffer-state) + +(def-modeline-segment! +modeline-buffer-state + :on-hooks (find-file-hook + read-only-mode-hook + after-change-functions + after-save-hook + after-revert-hook) + (let ((icon (cond (buffer-read-only + (all-the-icons-octicon + "lock" + :face 'doom-modeline-warning + :v-adjust -0.05)) + ((buffer-modified-p) + (all-the-icons-faicon + "floppy-o" + :face 'doom-modeline-buffer-modified + :v-adjust -0.05)) + ((and buffer-file-name (not (file-exists-p buffer-file-name))) + (all-the-icons-octicon + "circle-slash" + :face 'doom-modeline-urgent + :v-adjust -0.05))))) + (if icon (concat icon " ")))) + +(def-modeline-segment! +modeline-buffer-id + :on-hooks (find-file-hook after-save-hook after-revert-hook) + :faces t + (if buffer-file-name + (funcall +modeline-buffer-path-function buffer-file-name) + "%b")) + +(def-modeline-segment! +modeline-buffer-directory + (let ((face (if (active) 'doom-modeline-buffer-path))) + (concat (if (display-graphic-p) " ") + (all-the-icons-octicon + "file-directory" + :face face + :v-adjust -0.1 + :height 1.25) + " " + (propertize (abbreviate-file-name default-directory) + 'face face)))) + +(def-modeline-segment! +modeline-vcs + :on-set (vc-mode) + (when (and vc-mode buffer-file-name) + (let* ((backend (vc-backend buffer-file-name)) + (state (vc-state buffer-file-name backend))) + (let ((face 'mode-line-inactive) + (active (active)) + (all-the-icons-default-adjust -0.1)) + (concat " " + (cond ((memq state '(edited added)) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05)) + ((eq state 'needs-merge) + (if active (setq face 'doom-modeline-info)) + (all-the-icons-octicon "git-merge" :face face)) + ((eq state 'needs-update) + (if active (setq face 'doom-modeline-warning)) + (all-the-icons-octicon "arrow-down" :face face)) + ((memq state '(removed conflict unregistered)) + (if active (setq face 'doom-modeline-urgent)) + (all-the-icons-octicon "alert" :face face)) + (t + (if active (setq face 'font-lock-doc-face)) + (all-the-icons-octicon + "git-compare" + :face face + :v-adjust -0.05))) + " " + (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) + 'face (if active face)) + " "))))) + +(def-modeline-segment! +modeline-encoding + :on-hooks (after-revert-hook after-save-hook find-file-hook) + :on-set (buffer-file-coding-system) + (concat (pcase (coding-system-eol-type buffer-file-coding-system) + (0 "LF ") + (1 "CRLF ") + (2 "CR ")) + (let ((sys (coding-system-plist buffer-file-coding-system))) + (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) + "UTF-8" + (upcase (symbol-name (plist-get sys :name))))) + " ")) + +(def-modeline-segment! +modeline-major-mode + :on-set (mode-name) + :faces t + (propertize (format-mode-line mode-name) + 'face 'doom-modeline-buffer-major-mode)) + +(defun +modeline--macro-recording () + "Display current Emacs or evil macro being recorded." + (when (and (active) (or defining-kbd-macro executing-kbd-macro)) + (let ((sep (propertize " " 'face 'doom-modeline-panel))) + (concat sep + (propertize (if (bound-and-true-p evil-this-macro) + (char-to-string evil-this-macro) + "Macro") + 'face 'doom-modeline-panel) + sep + (all-the-icons-octicon "triangle-right" + :face 'doom-modeline-panel + :v-adjust -0.05) + sep)))) + +(defsubst +modeline--anzu () + "Show the match index and total number thereof. Requires `anzu', also +`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." + (when (and anzu--state (not iedit-mode)) + (propertize + (let ((here anzu--current-position) + (total anzu--total-matched)) + (cond ((eq anzu--state 'replace-query) + (format " %d replace " total)) + ((eq anzu--state 'replace) + (format " %d/%d " here total)) + (anzu--overflow-p + (format " %s+ " total)) + ((format " %s/%d " here total)))) + 'face (if (active) 'doom-modeline-panel)))) + +(defsubst +modeline--evil-substitute () + "Show number of matches for evil-ex substitutions and highlights in real time." + (when (and evil-mode + (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) + (assq 'evil-ex-global-match evil-ex-active-highlights-alist) + (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) + (propertize + (let ((range (if evil-ex-range + (cons (car evil-ex-range) (cadr evil-ex-range)) + (cons (line-beginning-position) (line-end-position)))) + (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) + (if pattern + (format " %s matches " (how-many pattern (car range) (cdr range))) + " - ")) + 'face (if (active) 'doom-modeline-panel)))) + +(defun doom-themes--overlay-sort (a b) + (< (overlay-start a) (overlay-start b))) + +(defsubst +modeline--iedit () + "Show the number of iedit regions matches + what match you're on." + (when (and iedit-mode iedit-occurrences-overlays) + (propertize + (let ((this-oc (or (let ((inhibit-message t)) + (iedit-find-current-occurrence-overlay)) + (progn (iedit-prev-occurrence) + (iedit-find-current-occurrence-overlay)))) + (length (length iedit-occurrences-overlays))) + (format " %s/%d " + (if this-oc + (- length + (length (memq this-oc (sort (append iedit-occurrences-overlays nil) + #'doom-themes--overlay-sort))) + -1) + "-") + length)) + 'face (if (active) 'doom-modeline-panel)))) + +(def-modeline-segment! +modeline-matches + "Displays: 1. the currently recording macro, 2. A current/total for the +current search term (with anzu), 3. The number of substitutions being conducted +with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." + (let ((meta (concat (+modeline--macro-recording) + (+modeline--anzu) + (+modeline--evil-substitute) + (+modeline--iedit) + " "))) + (or (and (not (equal meta " ")) meta) + (if buffer-file-name " %I ")))) + +;; +(defsubst doom-column (pos) + (save-excursion (goto-char pos) + (current-column))) + +(defvar-local +modeline-enable-word-count nil + "If non-nil, a word count will be added to the selection-info modeline +segment.") + +(defun +modeline|enable-word-count () + (setq +modeline-enable-word-count t)) +(add-hook 'text-mode-hook #'+modeline|enable-word-count) + +(def-modeline-segment! +modeline-selection-info + (let ((beg (or evil-visual-beginning (region-beginning))) + (end (or evil-visual-end (region-end)))) + (propertize + (let ((lines (count-lines beg (min end (point-max))))) + (concat (cond ((or (bound-and-true-p rectangle-mark-mode) + (eq 'block evil-visual-selection)) + (let ((cols (abs (- (doom-column end) + (doom-column beg))))) + (format "%dx%dB" lines cols))) + ((eq evil-visual-selection 'line) + (format "%dL" lines)) + ((> lines 1) + (format "%dC %dL" (- end beg) lines)) + ((format "%dC" (- end beg)))) + (when +modeline-enable-word-count + (format " %dW" (count-words beg end))))) + 'face 'doom-modeline-highlight))) + +(defun +modeline|enable-selection-info () + (add-to-list '+modeline-format-left '+modeline-selection-info t #'eq)) +(defun +modeline|disable-selection-info () + (setq +modeline-format-left (delq '+modeline-selection-info +modeline-format-left))) +(cond ((featurep 'evil) + (add-hook 'evil-visual-state-entry-hook #'+modeline|enable-selection-info) + (add-hook 'evil-visual-state-exit-hook #'+modeline|disable-selection-info)) + ((add-hook 'activate-mark-hook #'+modeline|enable-selection-info) + (add-hook 'deactivate-mark-hook #'+modeline|disable-selection-info))) + + +;; +;; Preset modeline formats +;; + +(def-modeline-format! :main + '(+modeline-matches " " + +modeline-buffer-state + +modeline-buffer-id + " %2l:%c %p ") + '(+modeline-encoding + +modeline-major-mode + +modeline-vcs)) + +(def-modeline-format! :minimal + '(+modeline-matches " " + +modeline-buffer-state + +modeline-buffer-id) + '(+modeline-major-mode)) + +(def-modeline-format! :special + '(+modeline-matches +modeline-buffer-state " %b " +modeline-buffer-position) + '(+modeline-encoding +modeline-major-mode)) + +(def-modeline-format! :project + '(+modeline-buffer-directory) + '(+modeline-major-mode)) + + +;; +;; +;; + +(def-modeline-segment! +modeline--rest + (let ((rhs-str (format-mode-line +modeline-format-right))) + (list (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(1+ (string-width rhs-str)))))) + rhs-str))) + +(setq-default mode-line-format '("" +modeline-bar +modeline-format-left +modeline--rest)) + + +;; +(set-modeline! :main t) +(add-hook! '+doom-dashboard-mode-hook (set-modeline! :project)) +(add-hook! 'doom-scratch-buffer-hook (set-modeline! :special)) diff --git a/modules/ui/modeline/packages.el b/modules/ui/modeline/packages.el new file mode 100644 index 000000000..e82f1e343 --- /dev/null +++ b/modules/ui/modeline/packages.el @@ -0,0 +1,20 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/modeline/packages.el + +;;; These are the invisible dependencies +;; Required +;;(require 'evil) +;;(require 'projectile) +;;(require 'all-the-icons) + +;; Optional +;;(require 'flycheck) +;;(require 'iedit) +;;(require 'evil-multiedit) + +(package! anzu) + +(when (featurep! :feature evil) + (package! evil-anzu)) + +;; TODO (package! shrink-path) From 35e5a47e9f8a6eddf62b7fadfec0f90f364db251 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:54:19 +0200 Subject: [PATCH 2544/4235] Rewrote indentation detection More robust and easier to customize. --- core/core-editor.el | 37 ++++++++++++++++++------------- modules/emacs/eshell/config.el | 2 ++ modules/emacs/term/config.el | 3 ++- modules/lang/emacs-lisp/config.el | 3 +++ modules/lang/org/config.el | 3 +++ 5 files changed, 31 insertions(+), 17 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index f78e9993e..a60e0322e 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -16,6 +16,10 @@ modes are active and the buffer is read-only.") indentation settings or not. This should be set by editorconfig if it successfully sets indent_style/indent_size.") +(defvar doom-detect-indentation-excluded-modes '(fundamental-mode) + "A list of major modes in which indentation should be automatically +detected.") + (setq-default large-file-warning-threshold 30000000 vc-follow-symlinks t @@ -185,6 +189,23 @@ savehist file." (smartparens-global-mode +1)) +;; Automatic detection of indent settings +(def-package! dtrt-indent + :unless noninteractive + :defer t + :init + (defun doom|detect-indentation () + (unless (or (not after-init-time) + doom-inhibit-indent-detection + (member (substring (buffer-name) 0 1) '(" " "*")) + (memq major-mode doom-detect-indentation-excluded-modes)) + (dtrt-indent-mode +1))) + (add-hook! '(change-major-mode-after-body-hook read-only-mode-hook) + #'doom|detect-indentation) + :config + (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) + (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width))) + ;; Branching undo (def-package! undo-tree :after-call (doom-exit-buffer-hook after-find-file) @@ -206,22 +227,6 @@ savehist file." (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode t) -(def-package! dtrt-indent - :unless noninteractive - :defer t - :init - (defun doom|detect-indentation () - (unless (or doom-inhibit-indent-detection - buffer-read-only - (memq major-mode '(fundamental-mode org-mode)) - (not (derived-mode-p 'prog-mode 'text-mode 'conf-mode))) - (require 'dtrt-indent) - (dtrt-indent-mode +1))) - (add-hook 'after-change-major-mode-hook #'doom|detect-indentation) - :config - (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) - (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width))) - (def-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) :config diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index eaaabf92b..60c3ccd8c 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -71,6 +71,8 @@ You should use `det-eshell-alias!' to change this.") eshell-glob-case-insensitive t eshell-error-if-no-glob t) + (add-to-list 'doom-detect-indentation-excluded-modes 'eshell-mode nil #'eq) + ;; Consider eshell buffers real (add-hook 'eshell-mode-hook #'doom|mark-buffer-as-real) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index c70417601..bc1f88337 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -8,4 +8,5 @@ (after! term (set-env! "SHELL") - (add-hook 'term-mode-hook #'doom|mark-buffer-as-real)) + (add-hook 'term-mode-hook #'doom|mark-buffer-as-real) + (add-to-list 'doom-detect-indentation-excluded-modes 'term-mode nil #'eq)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 44213cafe..2f2a3b441 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -41,6 +41,9 @@ ("add-hook" "remove-hook") ("add-hook!" "remove-hook!"))) + ;; variable-width indentation is superior in elisp + (add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) + (add-hook! 'emacs-lisp-mode-hook #'(;; 3rd-party functionality auto-compile-on-save-mode doom|enable-delete-trailing-whitespace diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index d9b884fe1..f11ac9f46 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -191,6 +191,9 @@ unfold to point on startup." org-preview-latex-image-directory (concat doom-cache-dir "org-latex/") org-format-latex-options (plist-put org-format-latex-options :scale 1.5)) + ;; Don't do automatic indent detection in org files + (add-to-list 'doom-detect-indentation-excluded-modes 'org-mode nil #'eq) + ;; Previews are usually rendered with light backgrounds, so ensure their ;; background (and foreground) match the current theme. (defun +org|update-latex-preview-background-color () From 2f7f8f0868b391b3b2f7fcbfd2c4d7bfe7f0f865 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 02:55:45 +0200 Subject: [PATCH 2545/4235] +ivy/tasks: emit better error if project has no tasks --- modules/completion/ivy/autoload/ivy.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 51c715dfc..01b59253b 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -147,8 +147,10 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (if arg (concat "in: " (file-relative-name buffer-file-name)) "project")) - (+ivy--tasks-candidates - (+ivy--tasks (if arg buffer-file-name (doom-project-root)))) + (let ((tasks (+ivy--tasks (if arg buffer-file-name (doom-project-root))))) + (unless tasks + (user-error "No tasks in your project! Good job!")) + (+ivy--tasks-candidates tasks)) :action #'+ivy--tasks-open-action :caller '+ivy/tasks)) From 884173112c1617b3958c980908752aac32711dfe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 17:54:17 +0200 Subject: [PATCH 2546/4235] Add :lang racket to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 6fb8bfeba..15ee9d59a 100644 --- a/init.example.el +++ b/init.example.el @@ -113,6 +113,7 @@ ;purescript ; javascript, but functional ;python ; beautiful is better than ugly ;qt ; the 'cutest' gui framework ever + ;racket ; a DSL for DSLs ;rest ; Emacs as a REST client ;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} ;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() From 66056e7a5d6af8a69e0ddb6ad9819abee1b43096 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 17:56:29 +0200 Subject: [PATCH 2547/4235] Move ob-racket to lang/org & cleanup + Remove redundant ob-crystal block + Move ob-ipython into separate section + Move ob-racket from lang/racket --- modules/lang/org/packages.el | 9 +++++---- modules/lang/racket/packages.el | 3 --- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 496563f1f..cd3eda6e0 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -18,6 +18,9 @@ (package! ob-sql-mode) (package! ob-translate) + (when (featurep! +ipython) + (package! ob-ipython)) + (when (featurep! :lang nim) (package! ob-nim)) (when (featurep! :lang crystal) @@ -28,10 +31,8 @@ (package! ob-rust)) (when (featurep! :lang rest) (package! ob-restclient)) - (when (featurep! :lang crystal) - (package! ob-crystal)) - (when (featurep! +ipython) - (package! ob-ipython))) + (when (featurep! :lang racket) + (package! ob-racket :recipe (:fetcher github :repo "DEADB17/ob-racket")))) (when (featurep! +export) (package! ox-pandoc) diff --git a/modules/lang/racket/packages.el b/modules/lang/racket/packages.el index 6e58afbb1..bfab32f65 100644 --- a/modules/lang/racket/packages.el +++ b/modules/lang/racket/packages.el @@ -2,6 +2,3 @@ ;;; lang/racket/packages.el (package! racket-mode) - -(when (featurep! :lang org +babel) - (package! ob-racket :recipe (:fetcher github :repo "DEADB17/ob-racket"))) From a4a0441ec9d5f41ee55a6a3ff811f24d78d50ebc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 17:58:15 +0200 Subject: [PATCH 2548/4235] Rewrite comments for forced deferral of elisp-mode Made clearer and more succinct. --- modules/lang/emacs-lisp/config.el | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 2f2a3b441..3be19de8c 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,21 +1,19 @@ ;;; lang/emacs-lisp/config.el -*- lexical-binding: t; -*- -;; `elisp-mode' is always loaded at startup, so to lazy load its config we need -;; to be creative. So we configure it the first tiem `emacs-lisp-mode' is run. -(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init) -;; And we remove `elisp-mode' so later invokations of (after! elisp-mode ...) -;; work as expected. +;; `elisp-mode' is loaded at startup. In order to lazy load its config we need +;; to pretend it isn't loaded (delq 'elisp-mode features) +;; ...until the first time `emacs-lisp-mode' runs +(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init) (defun +emacs-lisp|init (&rest _) - ;; Some plugins (like yasnippet) will run `emacs-lisp-mode' early, prematurely - ;; triggering this function in a non-ideal environment (`emacs-lisp-mode-hook' - ;; is let-bound to nil). This breaks a lot of Doom setters, because they try - ;; to add hooks to `emacs-lisp-mode-hook'! - ;; - ;; This means, in some sessions, elisp-mode is never configured properly, so - ;; we have to make extra sure `emacs-lisp-mode' was executed interactively. + ;; Some plugins (like yasnippet) run `emacs-lisp-mode' early, to parse some + ;; elisp. This would prematurely trigger this function. In these cases, + ;; `emacs-lisp-mode-hook' is let-bound to nil or its hooks are delayed, so if + ;; we see either, keep pretending elisp-mode isn't loaded. (when (and emacs-lisp-mode-hook (not delay-mode-hooks)) + ;; Otherwise, announce to the world elisp-mode has been loaded, so `after!' + ;; handlers can respond and configure elisp-mode as expected. (provide 'elisp-mode) (advice-remove #'emacs-lisp-mode #'+emacs-lisp|init))) From 923093b263ff84939630e88f41738b1439735e23 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 17:59:37 +0200 Subject: [PATCH 2549/4235] Don't set buffer-read-only in +doom-dashboard-mode This is already set by the parent mode, special-mode. --- modules/ui/doom-dashboard/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 4dad0c44c..4c0399d14 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -115,8 +115,7 @@ PLIST can have the following properties: :syntax-table nil :abbrev-table nil "Major mode for the DOOM dashboard buffer." - (setq truncate-lines t - buffer-read-only t) + (setq truncate-lines t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) (setq-local hscroll-margin 0) From 53b246ef8ccae8f033d0e0c446bbb04252e21274 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 18:16:22 +0200 Subject: [PATCH 2550/4235] Remove racket-mode eval handler The quickrun package already defines it. --- modules/lang/racket/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 7367fa8f8..d10299c72 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -5,7 +5,6 @@ :config (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) - (set-eval-handler! 'racket-mode "racket") (set-company-backend! 'racket-mode '(company-abbrev company-dabbrev-code company-dabbrev From 253660095f4066906924458a9e3711fb6eca4e50 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 18:18:04 +0200 Subject: [PATCH 2551/4235] lang/racket: minor reformatting --- modules/lang/racket/config.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index d10299c72..dba338765 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -5,12 +5,10 @@ :config (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) - (set-company-backend! 'racket-mode '(company-abbrev - company-dabbrev-code - company-dabbrev - company-files)) + (set-company-backend! 'racket-mode + '(company-abbrev company-dabbrev-code company-dabbrev company-files)) (set-lookup-handlers! 'racket-mode - :definition #'racket-describe + :definition #'racket-describe :documentation #'racket-doc) (set-docset! 'racket-mode "Racket") (set-pretty-symbols! 'racket-mode @@ -19,7 +17,7 @@ :dot ".") (set-rotate-patterns! 'racket-mode :symbols '(("#true" "#false"))) - + (add-hook! racket-mode #'(;; 3rd-party functionality doom|enable-delete-trailing-whitespace From a3942b5e0b7167bbf0f12138b7fd931f9c29a9ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 18:23:49 +0200 Subject: [PATCH 2552/4235] Don't set lisp-mode's docset to Emacs Lisp lisp-mode is for clisp. --- modules/lang/emacs-lisp/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 3be19de8c..1e8ffb883 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -28,7 +28,7 @@ (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) - (set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") + (set-docset! 'emacs-lisp-mode "Emacs Lisp") (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") (set-rotate-patterns! 'emacs-lisp-mode :symbols '(("t" "nil") From 5f8f38f02a73d5c311798c0d98236e6625f7213c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 18:24:14 +0200 Subject: [PATCH 2553/4235] lang/emacs-lisp: highlight stdlib functions & vars TODO: Make more customizable --- modules/lang/emacs-lisp/+symbols.el | 788 ++++++++++++++++++++++++++++ modules/lang/emacs-lisp/config.el | 24 +- 2 files changed, 804 insertions(+), 8 deletions(-) create mode 100644 modules/lang/emacs-lisp/+symbols.el diff --git a/modules/lang/emacs-lisp/+symbols.el b/modules/lang/emacs-lisp/+symbols.el new file mode 100644 index 000000000..9ec39578e --- /dev/null +++ b/modules/lang/emacs-lisp/+symbols.el @@ -0,0 +1,788 @@ +;;; lang/emacs-lisp/+symbols.el -*- lexical-binding: t; -*- + +;; shamelessly borrowed these lists from `xah-elisp-mode': +;; TODO derive these dynamically + +(defvar +emacs-lisp-function-list + '("mouse-on-link-p" "macrop" "run-hooks" "run-hook-with-args" + "run-hook-with-args-until-failure" "run-hook-with-args-until-success" + "define-fringe-bitmap" "destroy-fringe-bitmap" "set-fringe-bitmap-face" + "file-name-directory" "file-name-nondirectory" "file-name-sans-versions" + "file-name-extension" "file-name-sans-extension" "file-name-base" + "buffer-file-name" "get-file-buffer" "find-buffer-visiting" "make-xwidget" + "xwidgetp" "xwidget-plist" "set-xwidget-plist" "xwidget-buffer" + "get-buffer-xwidgets" "xwidget-webkit-goto-uri" + "xwidget-webkit-execute-script" "xwidget-webkit-execute-script-rv" + "xwidget-webkit-get-title" "xwidget-resize" "xwidget-size-request" + "xwidget-info" "set-xwidget-query-on-exit-flag" "xwidget-query-on-exit-flag" + "split-window" "window-total-height" "window-total-width" + "window-total-size" "window-pixel-height" "window-pixel-width" + "window-full-height-p" "window-full-width-p" "window-body-height" + "window-body-width" "window-body-size" "window-mode-line-height" + "window-header-line-height" "window-max-chars-per-line" "window-min-size" + "window-edges" "window-body-edges" "window-at" "coordinates-in-window-p" + "window-pixel-edges" "window-body-pixel-edges" "window-absolute-pixel-edges" + "window-absolute-body-pixel-edges" "window-absolute-pixel-position" + "buffer-modified-p" "set-buffer-modified-p" "restore-buffer-modified-p" + "buffer-modified-tick" "buffer-chars-modified-tick" "decode-time" + "encode-time" "marker-position" "marker-buffer" + "create-fontset-from-fontset-spec" "set-fontset-font" "char-displayable-p" + "custom-add-frequent-value" "custom-reevaluate-setting" "custom-variable-p" + "custom-theme-set-variables" "custom-theme-set-faces" "custom-theme-p" + "add-to-list" "add-to-ordered-list" "sin" "cos" "tan" "asin" "acos" "atan" + "exp" "log" "expt" "sqrt" "get-char-code-property" + "char-code-property-description" "put-char-code-property" + "prepare-change-group" "activate-change-group" "accept-change-group" + "cancel-change-group" "active-minibuffer-window" "minibuffer-window" + "set-minibuffer-window" "window-minibuffer-p" "minibuffer-window-active-p" + "define-category" "category-docstring" "get-unused-category" + "category-table" "category-table-p" "standard-category-table" + "copy-category-table" "set-category-table" "make-category-table" + "make-category-set" "char-category-set" "category-set-mnemonics" + "modify-category-entry" "memory-limit" "memory-use-counts" "memory-info" + "smie-rule-bolp" "smie-rule-hanging-p" "smie-rule-next-p" "smie-rule-prev-p" + "smie-rule-parent-p" "smie-rule-sibling-p" "smie-rule-parent" + "smie-rule-separator" "lookup-key" "local-key-binding" "global-key-binding" + "minor-mode-key-binding" "user-ptrp" "gui-get-selection" "point" "point-min" + "point-max" "buffer-end" "buffer-size" "foo" "add-to-history" "car" "cdr" + "car-safe" "cdr-safe" "nth" "nthcdr" "last" "safe-length" "caar" "cadr" + "cdar" "cddr" "butlast" "nbutlast" "macroexpand" "macroexpand-all" + "string-to-syntax" "syntax-after" "syntax-class" "make-finalizer" "unsafep" + "set-buffer-multibyte" "string-as-unibyte" "string-as-multibyte" + "tabulated-list-init-header" "tabulated-list-print" "ffloor" "fceiling" + "ftruncate" "fround" "assoc" "rassoc" "assq" "alist-get" "rassq" + "assoc-default" "copy-alist" "assq-delete-all" "rassq-delete-all" + "make-serial-process" "serial-process-configure" "make-temp-file" + "make-temp-name" "current-time-zone" "key-description" + "single-key-description" "text-char-description" "vectorp" "vector" + "make-vector" "vconcat" "create-file-buffer" "after-find-file" + "buffer-live-p" "transpose-regions" "number-to-string" "string-to-number" + "char-to-string" "string-to-char" "makunbound" "boundp" "consp" "atom" + "listp" "nlistp" "null" "buffer-base-buffer" "charsetp" + "charset-priority-list" "set-charset-priority" "char-charset" + "charset-plist" "put-charset-property" "get-charset-property" "decode-char" + "encode-char" "map-charset-chars" "x-list-fonts" "x-family-fonts" + "momentary-string-display" "frame-char-height" "frame-char-width" + "abbrev-symbol" "abbrev-expansion" "abbrev-insert" "setcdr" + "fill-context-prefix" "position-bytes" "byte-to-position" + "bufferpos-to-filepos" "filepos-to-bufferpos" "multibyte-string-p" + "string-bytes" "unibyte-string" "split-window-sensibly" "same-window-p" + "get-text-property" "get-char-property" "get-pos-property" + "get-char-property-and-overlay" "text-properties-at" "color-defined-p" + "defined-colors" "color-supported-p" "color-gray-p" "color-values" + "scroll-bar-event-ratio" "scroll-bar-scale" "get-register" "set-register" + "register-read-with-preview" "button-start" "button-end" "button-get" + "button-put" "button-activate" "button-label" "button-type" + "button-has-type-p" "button-at" "button-type-put" "button-type-get" + "button-type-subtype-p" "buffer-list" "other-buffer" "last-buffer" + "current-frame-configuration" "set-frame-configuration" "funcall" "apply" + "apply-partially" "identity" "ignore" "file-name-as-directory" + "directory-name-p" "directory-file-name" "abbreviate-file-name" + "delete-and-extract-region" "map-y-or-n-p" "message" "message-or-box" + "message-box" "display-message-or-buffer" "current-message" "ding" "beep" + "x-popup-dialog" "network-interface-list" "network-interface-info" + "format-network-address" "floatp" "integerp" "numberp" "natnump" "zerop" + "imagemagick-types" "completion-table-dynamic" "completion-table-with-cache" + "mouse-position" "set-mouse-position" "mouse-pixel-position" + "set-mouse-pixel-position" "mouse-absolute-pixel-position" + "set-mouse-absolute-pixel-position" "frame-pointer-visible-p" + "tool-bar-add-item" "tool-bar-add-item-from-menu" + "tool-bar-local-item-from-menu" "send-string-to-terminal" + "insert-and-inherit" "insert-before-markers-and-inherit" "completing-read" + "minibuffer-prompt" "minibuffer-prompt-end" "minibuffer-prompt-width" + "minibuffer-contents" "minibuffer-contents-no-properties" "windowp" + "window-live-p" "window-valid-p" "selected-window" "selected-window-group" + "window-resizable" "window-resize" "adjust-window-trailing-edge" + "edebug-trace" "frame-live-p" "window-frame" "window-list" + "frame-root-window" "window-parent" "window-top-child" "window-left-child" + "window-child" "window-combined-p" "window-next-sibling" + "window-prev-sibling" "frame-first-window" "window-in-direction" + "window-tree" "tty-top-frame" "font-family-list" "bitmap-spec-p" + "region-beginning" "region-end" "use-region-p" "default-value" + "default-boundp" "set-default" "put-text-property" "add-text-properties" + "remove-text-properties" "remove-list-of-text-properties" + "set-text-properties" "add-face-text-property" "propertize" "not" "error" + "signal" "user-error" "set-marker" "move-marker" "frame-current-scroll-bars" + "frame-scroll-bar-width" "frame-scroll-bar-height" "set-window-scroll-bars" + "window-scroll-bars" "window-current-scroll-bars" "window-scroll-bar-width" + "window-scroll-bar-height" "window-hscroll" "set-window-hscroll" + "create-image" "find-image" "image-load-path-for-library" "make-byte-code" + "field-beginning" "field-end" "field-string" "field-string-no-properties" + "delete-field" "constrain-to-field" "insert-for-yank" + "insert-buffer-substring-as-yank" "get-internal-run-time" "eq" "equal" + "equal-including-properties" "define-package" "print" "princ" "prin1" + "terpri" "write-char" "pp" "set-process-sentinel" "process-sentinel" + "waiting-for-user-input-p" "make-char-table" "char-table-p" + "char-table-subtype" "char-table-parent" "set-char-table-parent" + "char-table-extra-slot" "set-char-table-extra-slot" "char-table-range" + "set-char-table-range" "map-char-table" "string-match" "string-match-p" + "looking-at" "looking-back" "looking-at-p" "make-syntax-table" + "copy-syntax-table" "char-syntax" "set-syntax-table" "syntax-table" + "face-remap-add-relative" "face-remap-remove-relative" "face-remap-set-base" + "face-remap-reset-base" "keymap-parent" "set-keymap-parent" + "make-composed-keymap" "define-key" "substitute-key-definition" + "suppress-keymap" "plist-get" "plist-put" "lax-plist-get" "lax-plist-put" + "plist-member" "libxml-parse-html-region" "shr-insert-document" + "libxml-parse-xml-region" "recenter-window-group" "called-interactively-p" + "keywordp" "compare-buffer-substrings" "notifications-notify" + "notifications-close-notification" "notifications-get-capabilities" + "notifications-get-server-information" "sequencep" "length" "elt" + "copy-sequence" "reverse" "nreverse" "sort" "seq-elt" "seq-length" "seqp" + "seq-drop" "seq-take" "seq-take-while" "seq-drop-while" "seq-do" "seq-map" + "seq-mapn" "seq-filter" "seq-remove" "seq-reduce" "seq-some" "seq-find" + "seq-every-p" "seq-empty-p" "seq-count" "seq-sort" "seq-contains" + "seq-position" "seq-uniq" "seq-subseq" "seq-concatenate" "seq-mapcat" + "seq-partition" "seq-intersection" "seq-difference" "seq-group-by" + "seq-into" "seq-min" "seq-max" "stringp" "string-or-null-p" + "char-or-string-p" "ewoc-create" "ewoc-buffer" "ewoc-get-hf" "ewoc-set-hf" + "ewoc-enter-first" "ewoc-enter-last" "ewoc-enter-before" "ewoc-enter-after" + "ewoc-prev" "ewoc-next" "ewoc-nth" "ewoc-data" "ewoc-set-data" "ewoc-locate" + "ewoc-location" "ewoc-goto-prev" "ewoc-goto-next" "ewoc-goto-node" + "ewoc-refresh" "ewoc-invalidate" "ewoc-delete" "ewoc-filter" "ewoc-collect" + "ewoc-map" "indirect-function" "set-network-process-option" "face-spec-set" + "substitute-command-keys" "make-progress-reporter" + "progress-reporter-update" "progress-reporter-force-update" + "progress-reporter-done" "current-buffer" "set-buffer" "minibufferp" + "minibuffer-selected-window" "minibuffer-message" "this-command-keys" + "this-command-keys-vector" "clear-this-command-keys" "markerp" + "integer-or-marker-p" "number-or-marker-p" "make-translation-table" + "make-translation-table-from-vector" "make-translation-table-from-alist" + "sit-for" "sleep-for" "read-from-minibuffer" "read-string" "read-regexp" + "read-no-blanks-input" "frame-visible-p" "make-process" "make-pipe-process" + "start-process" "start-file-process" "start-process-shell-command" + "start-file-process-shell-command" "find-file-name-handler" + "file-local-copy" "file-remote-p" "unhandled-file-name-directory" + "match-data" "set-match-data" "overlay-get" "overlay-put" + "overlay-properties" "file-name-absolute-p" "file-relative-name" + "hack-dir-local-variables" "hack-dir-local-variables-non-file-buffer" + "dir-locals-set-class-variables" "dir-locals-set-directory-class" + "make-button" "insert-button" "make-text-button" "insert-text-button" + "insert-image" "insert-sliced-image" "put-image" "remove-images" + "image-size" "insert-file-contents" "insert-file-contents-literally" + "format" "format-message" "run-mode-hooks" "cl-call-next-method" + "cl-next-method-p" "char-equal" "string-equal" "string-collate-equalp" + "string-prefix-p" "string-suffix-p" "string-lessp" "string-greaterp" + "string-collate-lessp" "compare-strings" "assoc-string" + "display-popup-menus-p" "display-graphic-p" "display-mouse-p" + "display-color-p" "display-grayscale-p" "display-supports-face-attributes-p" + "display-selections-p" "display-images-p" "display-screens" + "display-pixel-height" "display-pixel-width" "display-mm-height" + "display-mm-width" "display-backing-store" "display-save-under" + "display-planes" "display-visual-class" "display-color-cells" + "x-server-version" "x-server-vendor" "define-prefix-command" "insert" + "insert-before-markers" "insert-buffer-substring" + "insert-buffer-substring-no-properties" "replace-match" + "match-substitute-replacement" "set-input-mode" "current-input-mode" + "tty-color-define" "tty-color-clear" "tty-color-alist" + "tty-color-approximate" "tty-color-translate" "call-process" "process-file" + "call-process-region" "call-process-shell-command" + "process-file-shell-command" "shell-command-to-string" "process-lines" + "current-kill" "kill-new" "kill-append" "symbol-function" "fboundp" + "fmakunbound" "fset" "hack-local-variables" "safe-local-variable-p" + "risky-local-variable-p" "keymapp" "select-safe-coding-system" + "read-coding-system" "read-non-nil-coding-system" "current-time-string" + "current-time" "float-time" "seconds-to-time" "set-default-file-modes" + "default-file-modes" "read-file-modes" "file-modes-symbolic-to-number" + "set-file-times" "set-file-extended-attributes" "set-file-selinux-context" + "set-file-acl" "current-left-margin" "current-fill-column" + "delete-to-left-margin" "indent-to-left-margin" "sort-subr" + "backup-file-name-p" "make-backup-file-name" "find-backup-file-name" + "file-newest-backup" "locate-user-emacs-file" "convert-standard-filename" + "add-hook" "remove-hook" "error-message-string" "window-point" + "set-window-point" "quit-restore-window" "x-parse-geometry" "process-list" + "get-process" "process-command" "process-contact" "process-id" + "process-name" "process-status" "process-live-p" "process-type" + "process-exit-status" "process-tty-name" "process-coding-system" + "set-process-coding-system" "process-get" "process-put" "process-plist" + "set-process-plist" "keyboard-translate" "execute-kbd-macro" "date-to-time" + "format-time-string" "format-seconds" "make-ring" "ring-p" "ring-size" + "ring-length" "ring-elements" "ring-copy" "ring-empty-p" "ring-ref" + "ring-insert" "ring-remove" "ring-insert-at-beginning" + "set-window-combination-limit" "window-combination-limit" "regexp-quote" + "regexp-opt" "regexp-opt-depth" "regexp-opt-charset" "provide" "require" + "featurep" "backup-buffer" "event-modifiers" "event-basic-type" + "mouse-movement-p" "event-convert-list" "read-key-sequence" + "read-key-sequence-vector" "file-truename" "file-chase-links" "file-equal-p" + "file-in-directory-p" "eval" "frame-parameter" "frame-parameters" + "modify-frame-parameters" "set-frame-parameter" + "modify-all-frames-parameters" "process-datagram-address" + "set-process-datagram-address" "current-window-configuration" + "set-window-configuration" "window-configuration-p" + "compare-window-configurations" "window-configuration-frame" + "window-state-get" "window-state-put" "charset-after" "find-charset-region" + "find-charset-string" "abbrev-table-put" "abbrev-table-get" + "coding-system-list" "coding-system-p" "check-coding-system" + "coding-system-eol-type" "coding-system-change-eol-conversion" + "coding-system-change-text-conversion" "find-coding-systems-region" + "find-coding-systems-string" "find-coding-systems-for-charsets" + "check-coding-systems-region" "detect-coding-region" "detect-coding-string" + "coding-system-charset-list" "iter-next" "iter-close" "locate-file" + "executable-find" "symbol-name" "make-symbol" "intern" "intern-soft" + "mapatoms" "unintern" "current-column" "special-variable-p" + "accessible-keymaps" "map-keymap" "where-is-internal" "window-display-table" + "set-window-display-table" "redisplay" "force-window-update" "window-start" + "window-group-start" "window-end" "window-group-end" "set-window-start" + "set-window-group-start" "pos-visible-in-window-p" + "pos-visible-in-window-group-p" "window-line-height" "fringe-bitmaps-at-pos" + "buffer-name" "get-buffer" "generate-new-buffer-name" "jit-lock-register" + "jit-lock-unregister" "file-notify-add-watch" "file-notify-rm-watch" + "file-notify-valid-p" "local-variable-p" "local-variable-if-set-p" + "buffer-local-value" "buffer-local-variables" "kill-all-local-variables" + "eventp" "skip-chars-forward" "skip-chars-backward" "window-parameter" + "window-parameters" "set-window-parameter" "recent-keys" + "terminal-parameters" "terminal-parameter" "set-terminal-parameter" "memq" + "delq" "remq" "memql" "member" "delete" "remove" "member-ignore-case" + "delete-dups" "parse-partial-sexp" "get-buffer-create" "generate-new-buffer" + "current-global-map" "current-local-map" "current-minor-mode-maps" + "use-global-map" "use-local-map" "set-transient-map" "accept-process-output" + "skip-syntax-forward" "skip-syntax-backward" "backward-prefix-chars" + "vertical-motion" "count-screen-lines" "move-to-window-group-line" + "compute-motion" "file-exists-p" "file-readable-p" "file-executable-p" + "file-writable-p" "file-accessible-directory-p" "access-file" + "file-ownership-preserved-p" "file-modes" "open-network-stream" + "undo-boundary" "undo-auto-amalgamate" "primitive-undo" + "keyboard-coding-system" "terminal-coding-system" "symbolp" "booleanp" + "functionp" "subrp" "byte-code-function-p" "subr-arity" "char-width" + "string-width" "truncate-string-to-width" "window-text-pixel-size" + "documentation-property" "documentation" "face-documentation" + "Snarf-documentation" "match-string" "match-string-no-properties" + "match-beginning" "match-end" "coding-system-priority-list" + "set-coding-system-priority" "x-popup-menu" "-" "mod" "symbol-file" + "command-line" "get-load-suffixes" "defalias" "define-button-type" + "custom-set-variables" "custom-set-faces" "interactive-form" + "encode-coding-string" "decode-coding-string" + "decode-coding-inserted-region" "make-hash-table" "secure-hash" + "frame-geometry" "frame-edges" "buffer-narrowed-p" "locale-info" + "keymap-prompt" "set-window-margins" "window-margins" "try-completion" + "all-completions" "test-completion" "completion-boundaries" + "add-to-invisibility-spec" "remove-from-invisibility-spec" "invisible-p" + "char-after" "char-before" "following-char" "preceding-char" "bobp" "eobp" + "bolp" "eolp" "coding-system-get" "coding-system-aliases" "defvaralias" + "make-obsolete-variable" "indirect-variable" "read-file-name" + "read-directory-name" "read-shell-command" "select-window" + "frame-selected-window" "set-frame-selected-window" "window-use-time" + "make-glyph-code" "glyph-char" "glyph-face" "command-remapping" + "help-buffer" "help-setup-xref" "downcase" "upcase" "capitalize" + "upcase-initials" "redraw-frame" "characterp" "max-char" "get-byte" "float" + "truncate" "floor" "ceiling" "round" "window-vscroll" "set-window-vscroll" + "selected-frame" "select-frame-set-input-focus" "redirect-frame-focus" + "image-multi-frame-p" "image-current-frame" "image-show-frame" + "image-animate" "image-animate-timer" "replace-regexp-in-string" + "perform-replace" "current-idle-time" "subst-char-in-region" + "derived-mode-p" "dom-node" "face-attribute" "face-attribute-relative-p" + "face-all-attributes" "merge-face-attribute" "set-face-attribute" + "set-face-bold" "set-face-italic" "set-face-underline" + "set-face-inverse-video" "face-font" "face-foreground" "face-background" + "face-stipple" "face-bold-p" "face-italic-p" "face-underline-p" + "face-inverse-video-p" "file-name-all-completions" "file-name-completion" + "make-string" "string" "substring" "substring-no-properties" "concat" + "split-string" "window-buffer" "set-window-buffer" "get-buffer-window" + "get-buffer-window-list" "process-query-on-exit-flag" + "set-process-query-on-exit-flag" "process-send-string" "process-send-region" + "process-send-eof" "process-running-child-p" "frame-position" + "set-frame-position" "frame-pixel-height" "frame-pixel-width" + "frame-text-height" "frame-text-width" "frame-height" "frame-width" + "set-frame-size" "set-frame-height" "set-frame-width" "recursion-depth" + "buffer-substring" "buffer-substring-no-properties" "buffer-string" + "filter-buffer-substring" "current-word" "thing-at-point" "bufferp" "random" + "processp" "case-table-p" "set-standard-case-table" "standard-case-table" + "current-case-table" "set-case-table" "set-case-syntax-pair" + "set-case-syntax-delims" "set-case-syntax" "window-prev-buffers" + "set-window-prev-buffers" "window-next-buffers" "set-window-next-buffers" + "read-passwd" "bindat-unpack" "bindat-get-field" "bindat-length" + "bindat-pack" "bindat-ip-to-string" "frame-list" "visible-frame-list" + "next-frame" "previous-frame" "face-list" "face-id" "face-equal" + "face-differs-from-default-p" "file-symlink-p" "file-directory-p" + "file-regular-p" "find-file-noselect" "event-click-count" "fontp" "font-at" + "font-spec" "font-put" "find-font" "list-fonts" "font-get" + "font-face-attributes" "font-xlfd-name" "font-info" "query-font" + "default-font-width" "default-font-height" "window-font-width" + "window-font-height" "kbd" "terminal-name" "terminal-list" + "get-device-terminal" "delete-terminal" "x-display-list" "x-open-connection" + "x-close-connection" "display-monitor-attributes-list" + "frame-monitor-attributes" "read-event" "read-char" "read-char-exclusive" + "read-key" "read-char-choice" "backtrace-debug" "backtrace-frame" + "directory-files" "directory-files-recursively" + "directory-files-and-attributes" "file-expand-wildcards" "insert-directory" + "scan-lists" "scan-sexps" "forward-comment" "tq-create" "tq-enqueue" + "tq-close" "set-window-fringes" "window-fringes" "commandp" + "call-interactively" "funcall-interactively" "command-execute" + "make-bool-vector" "bool-vector" "bool-vector-p" "bool-vector-exclusive-or" + "bool-vector-union" "bool-vector-intersection" "bool-vector-set-difference" + "bool-vector-not" "bool-vector-subsetp" "bool-vector-count-consecutive" + "bool-vector-count-population" "current-active-maps" "key-binding" + "byte-compile" "batch-byte-compile" "tooltip-mode" "tooltip-event-buffer" + "gap-position" "gap-size" "fetch-bytecode" "define-key-after" + "set-process-filter" "process-filter" "read-minibuffer" "eval-minibuffer" + "edit-and-eval-command" "verify-visited-file-modtime" + "clear-visited-file-modtime" "visited-file-modtime" + "set-visited-file-modtime" "ask-user-about-supersession-threat" + "string-to-multibyte" "string-to-unibyte" "byte-to-string" + "multibyte-char-to-unibyte" "unibyte-char-to-multibyte" "syntax-ppss" + "syntax-ppss-flush-cache" "smie-config-local" "read" "read-from-string" + "set-binary-mode" "event-start" "event-end" "posnp" "posn-window" + "posn-area" "posn-point" "posn-x-y" "posn-col-row" "posn-actual-col-row" + "posn-string" "posn-image" "posn-object" "posn-object-x-y" + "posn-object-width-height" "posn-timestamp" "posn-at-point" "posn-at-x-y" + "image-flush" "clear-image-cache" "sentence-end" "system-name" + "parse-colon-path" "load-average" "emacs-pid" "y-or-n-p" + "y-or-n-p-with-timeout" "yes-or-no-p" "hash-table-p" "copy-hash-table" + "hash-table-count" "hash-table-test" "hash-table-weakness" + "hash-table-rehash-size" "hash-table-rehash-threshold" "hash-table-size" + "custom-initialize-delay" "dump-emacs" "define-error" "set-auto-mode" + "set-buffer-major-mode" "next-window" "previous-window" "walk-windows" + "one-window-p" "get-lru-window" "get-mru-window" "get-largest-window" + "get-window-with-predicate" "list-system-processes" "process-attributes" + "define-abbrev" "find-auto-coding" "set-auto-coding" + "find-operation-coding-system" "listify-key-sequence" "input-pending-p" + "discard-input" "messages-buffer" "set" "auto-save-file-name-p" + "make-auto-save-file-name" "recent-auto-save-p" "set-buffer-auto-saved" + "delete-auto-save-file-if-necessary" "rename-auto-save-file" "abbrev-put" + "abbrev-get" "forward-word-strictly" "backward-word-strictly" "advice-add" + "advice-remove" "advice-member-p" "advice-mapc" "store-substring" + "clear-string" "user-login-name" "user-real-login-name" "user-full-name" + "user-real-uid" "user-uid" "group-gid" "group-real-gid" "system-users" + "system-groups" "play-sound" "overlays-at" "overlays-in" + "next-overlay-change" "previous-overlay-change" "next-property-change" + "previous-property-change" "next-single-property-change" + "previous-single-property-change" "next-char-property-change" + "previous-char-property-change" "next-single-char-property-change" + "previous-single-char-property-change" "text-property-any" + "text-property-not-all" "symbol-value" "make-abbrev-table" "abbrev-table-p" + "clear-abbrev-table" "copy-abbrev-table" "define-abbrev-table" + "insert-abbrev-table-description" "advice-function-member-p" + "advice-function-mapc" "advice-eval-interactive-spec" + "display-buffer-same-window" "display-buffer-reuse-window" + "display-buffer-pop-up-frame" "display-buffer-use-some-frame" + "display-buffer-pop-up-window" "display-buffer-below-selected" + "display-buffer-in-previous-window" "display-buffer-at-bottom" + "display-buffer-use-some-window" "display-buffer-no-window" "isnan" "frexp" + "ldexp" "copysign" "logb" "file-newer-than-file-p" "file-attributes" + "file-nlinks" "barf-if-buffer-read-only" "file-acl" "file-selinux-context" + "file-extended-attributes" "zlib-available-p" "zlib-decompress-region" + "window-preserve-size" "window-preserved-size" "load" "arrayp" "aref" "aset" + "fillarray" "delete-process" "image-mask-p" "interrupt-process" + "kill-process" "quit-process" "stop-process" "continue-process" + "minibuffer-depth" "gethash" "puthash" "remhash" "clrhash" "maphash" + "read-quoted-char" "eql" "max" "min" "abs" "framep" "frame-terminal" + "terminal-live-p" "image-type-available-p" "mapcar" "mapc" "mapconcat" + "purecopy" "current-bidi-paragraph-direction" "move-point-visually" + "bidi-string-mark-left-to-right" "bidi-find-overridden-directionality" + "buffer-substring-with-bidi-context" "special-form-p" "type-of" + "syntax-ppss-toplevel-pos" "shell-quote-argument" "split-string-and-unquote" + "combine-and-quote-strings" "posix-looking-at" "posix-string-match" + "smie-setup" "define-hash-table-test" "sxhash" "window-system" "setcar" + "read-buffer" "read-command" "read-variable" "force-mode-line-update" + "file-locked-p" "lock-buffer" "unlock-buffer" "ask-user-about-lock" + "make-display-table" "display-table-slot" "set-display-table-slot" + "describe-display-table" "get" "put" "symbol-plist" "setplist" + "function-get" "function-put" "process-buffer" "process-mark" + "set-process-buffer" "get-buffer-process" "set-process-window-size" + "current-indentation" "read-input-method-name" "make-obsolete" + "set-advertised-calling-convention" "suspend-tty" "resume-tty" + "controlling-tty-p" "overlayp" "make-overlay" "overlay-start" "overlay-end" + "overlay-buffer" "delete-overlay" "move-overlay" "remove-overlays" + "copy-overlay" "overlay-recenter" "nconc" "expand-file-name" + "substitute-in-file-name" "prefix-numeric-value" "lsh" "ash" "logand" + "logior" "logxor" "lognot" "display-warning" "lwarn" "warn" "next-button" + "previous-button" "font-lock-add-keywords" "font-lock-remove-keywords" + "current-justification" "display-completion-list" "make-sparse-keymap" + "make-keymap" "copy-keymap" "window-right-divider-width" + "window-bottom-divider-width" "autoload" "autoloadp" "autoload-do-load" + "syntax-table-p" "standard-syntax-table" "throw" "facep" "x-get-resource" + "set-marker-insertion-type" "marker-insertion-type" "format-mode-line" + "quietly-read-abbrev-file" "window-dedicated-p" "set-window-dedicated-p" + "cancel-timer" "make-network-process" "time-less-p" "time-subtract" + "time-add" "time-to-days" "time-to-day-in-year" "date-leap-year-p" + "buffer-swap-text" "mark" "mark-marker" "set-mark" "push-mark" "pop-mark" + "deactivate-mark" "handle-shift-selection" "cons" "list" "make-list" + "append" "copy-tree" "number-sequence" "line-beginning-position" + "line-end-position" "count-lines" "line-number-at-pos" + "completion-in-region" "make-marker" "point-marker" "point-min-marker" + "point-max-marker" "copy-marker") + "List of elisp functions, those in elisp doc marked as function. (basically, +all functions that's not command, macro, special forms.)") + +(defvar +emacs-lisp-variable-list + '("buffer-file-name" "buffer-file-truename" "buffer-file-number" + "list-buffers-directory" "yank-undo-function" "header-line-format" + "custom-known-themes" "float-e" "float-pi" "unicode-category-table" + "char-script-table" "char-width-table" "printable-chars" "post-gc-hook" + "memory-full" "gcs-done" "gc-elapsed" "module-file-suffix" + "history-add-new-input" "minibuffer-history" "query-replace-history" + "file-name-history" "buffer-name-history" "regexp-history" + "extended-command-history" "shell-command-history" "read-expression-history" + "face-name-history" "beginning-of-defun-function" "end-of-defun-function" + "multibyte-syntax-as-symbol" "comment-end-can-be-escaped" + "tabulated-list-format" "tabulated-list-entries" + "tabulated-list-revert-hook" "tabulated-list-printer" + "tabulated-list-sort-key" "font-lock-keywords" + "font-lock-keywords-case-fold-search" "unload-feature-special-hooks" + "kill-buffer-query-functions" "kill-buffer-hook" "buffer-save-without-query" + "load-path" "desktop-save-buffer" "desktop-buffer-mode-handlers" + "charset-list" "temp-buffer-setup-hook" "temp-buffer-show-hook" + "abbrev-start-location" "abbrev-start-location-buffer" "last-abbrev" + "last-abbrev-location" "last-abbrev-text" "abbrev-expand-function" + "process-adaptive-read-buffering" "glyphless-char-display" + "debug-on-message" "enable-multibyte-characters" "char-property-alias-alist" + "default-text-properties" "wrap-prefix" "line-prefix" "register-alist" + "cursor-type" "before-make-frame-hook" "after-make-frame-functions" + "frame-inherited-parameters" "buffer-list-update-hook" + "overlay-arrow-string" "overlay-arrow-position" + "overlay-arrow-variable-list" "inhibit-message" "before-init-hook" + "after-init-hook" "emacs-startup-hook" "window-setup-hook" "user-init-file" + "user-emacs-directory" "image-format-suffixes" "mouse-position-function" + "tool-bar-map" "auto-resize-tool-bars" "auto-raise-tool-bar-buttons" + "tool-bar-button-margin" "tool-bar-button-relief" "tool-bar-border" + "text-property-default-nonsticky" "completing-read-function" + "frame-title-format" "icon-title-format" "multiple-frames" + "blink-paren-function" "menu-bar-final-items" "menu-bar-update-hook" + "vertical-scroll-bar" "horizontal-scroll-bar" "scroll-bar-width" + "scroll-bar-height" "cons-cells-consed" "floats-consed" + "vector-cells-consed" "symbols-consed" "string-chars-consed" + "misc-objects-consed" "intervals-consed" "strings-consed" "tty-setup-hook" + "fontification-functions" "search-spaces-regexp" "face-remapping-alist" + "other-window-scroll-buffer" "system-key-alist" "x-alt-keysym" + "x-meta-keysym" "x-hyper-keysym" "x-super-keysym" "standard-output" + "print-quoted" "print-escape-newlines" "print-escape-nonascii" + "print-escape-multibyte" "print-length" "print-level" "print-circle" + "print-gensym" "print-continuous-numbering" "print-number-table" + "float-output-format" "after-load-functions" "text-quoting-style" + "minibuffer-setup-hook" "minibuffer-exit-hook" "minibuffer-help-form" + "minibuffer-scroll-window" "last-command" "real-last-command" + "last-repeatable-command" "this-command" "this-original-command" + "last-nonmenu-event" "last-command-event" "last-event-frame" + "disable-point-adjustment" "global-disable-point-adjustment" + "standard-translation-table-for-decode" + "standard-translation-table-for-encode" "translation-table-for-input" + "minibuffer-allow-text-properties" "minibuffer-local-map" + "minibuffer-local-ns-map" "process-connection-type" + "inhibit-file-name-handlers" "inhibit-file-name-operation" + "dir-locals-class-alist" "dir-locals-directory-cache" + "enable-dir-local-variables" "max-image-size" "minor-mode-list" + "change-major-mode-after-body-hook" "after-change-major-mode-hook" + "noninteractive" "emacs-build-time" "emacs-version" "emacs-major-version" + "emacs-minor-version" "font-lock-keywords-only" "font-lock-syntax-table" + "font-lock-syntactic-face-function" "process-file-side-effects" + "interprogram-paste-function" "interprogram-cut-function" + "inhibit-local-variables-regexps" "file-local-variables-alist" + "before-hack-local-variables-hook" "hack-local-variables-hook" + "ignored-local-variables" "window-point-insertion-type" "font-lock-defaults" + "overwrite-mode" "extra-keyboard-modifiers" "keyboard-translate-table" + "executing-kbd-macro" "defining-kbd-macro" "last-kbd-macro" + "kbd-macro-termination-hook" "emacs-save-session-functions" + "write-region-annotate-functions" "write-region-post-annotation-function" + "after-insert-file-functions" "features" "buffer-backed-up" + "backup-enable-predicate" "backup-inhibited" "num-input-keys" "values" + "buffer-file-coding-system" "save-buffer-coding-system" + "last-coding-system-used" "file-name-coding-system" + "inhibit-null-byte-detection" "inhibit-iso-escape-detection" + "exec-directory" "obarray" "lexical-binding" "buffer-display-table" + "standard-display-table" "pre-redisplay-function" "pre-redisplay-functions" + "x-pointer-shape" "x-sensitive-text-pointer-shape" + "font-lock-mark-block-function" "font-lock-extra-managed-props" + "font-lock-fontify-buffer-function" "font-lock-unfontify-buffer-function" + "font-lock-fontify-region-function" "font-lock-unfontify-region-function" + "font-lock-flush-function" "font-lock-ensure-function" + "change-major-mode-hook" "window-persistent-parameters" + "ignore-window-parameters" "quit-flag" "inhibit-quit" "most-positive-fixnum" + "most-negative-fixnum" "global-map" "minor-mode-map-alist" + "minor-mode-overriding-map-alist" "overriding-local-map" + "overriding-terminal-local-map" "overriding-local-map-menu-flag" + "special-event-map" "emulation-mode-map-alists" "kill-ring" + "kill-ring-yank-pointer" "display-buffer-overriding-action" + "buffer-undo-list" "undo-auto-current-boundary-timer" "undo-in-progress" + "pre-command-hook" "post-command-hook" "imenu-generic-expression" + "imenu-case-fold-search" "imenu-syntax-alist" + "imenu-prev-index-position-function" "imenu-extract-index-name-function" + "imenu-create-index-function" "doc-directory" "coding-system-for-read" + "coding-system-for-write" "selective-display" "electric-future-map" + "load-history" "command-line-processed" "command-switch-alist" + "command-line-args" "command-line-args-left" "command-line-functions" + "load-suffixes" "load-file-rep-suffixes" "inhibit-point-motion-hooks" + "show-help-function" "command-history" "face-font-rescale-alist" + "locale-coding-system" "system-messages-locale" "system-time-locale" + "menu-prompt-more-char" "left-margin-width" "right-margin-width" + "completion-ignore-case" "completion-regexp-list" "buffer-invisibility-spec" + "global-abbrev-table" "local-abbrev-table" "abbrev-minor-mode-table-alist" + "fundamental-mode-abbrev-table" "text-mode-abbrev-table" + "lisp-mode-abbrev-table" "revert-buffer-in-progress-p" + "revert-buffer-function" "revert-buffer-insert-file-contents-function" + "before-revert-hook" "after-revert-hook" "buffer-stale-function" + "input-method-function" "read-file-name-function" + "minibuffer-local-shell-command-map" "glyph-table" "help-map" "help-form" + "prefix-help-command" "data-directory" "byte-boolean-vars" + "auto-window-vscroll" "focus-in-hook" "focus-out-hook" "query-replace-map" + "multi-query-replace-map" "replace-search-function" + "replace-re-search-function" "warning-levels" "warning-prefix-function" + "warning-series" "warning-fill-prefix" "warning-type-format" + "split-string-default-separators" "before-change-functions" + "after-change-functions" "first-change-hook" "inhibit-modification-hooks" + "buffer-display-count" "buffer-display-time" "command-error-function" + "filter-buffer-substring-function" "filter-buffer-substring-functions" + "buffer-substring-filters" "ascii-case-table" "disabled-command-function" + "format-alist" "buffer-file-format" "buffer-auto-save-file-format" + "find-file-not-found-functions" "find-file-literally" + "delete-terminal-functions" "num-nonmacro-input-events" "debugger" + "debug-on-next-call" "command-debug-status" "insert-directory-program" + "font-lock-extend-after-change-region-function" "cursor-in-echo-area" + "echo-area-clear-hook" "message-truncate-lines" "fringes-outside-margins" + "left-fringe-width" "right-fringe-width" "tooltip-frame-parameters" + "tooltip-functions" "byte-compile-dynamic" "standard-input" "read-circle" + "image-cache-eviction-delay" "system-configuration" "system-type" + "process-environment" "initial-environment" "path-separator" + "invocation-name" "invocation-directory" "installation-directory" + "tty-erase-char" "buffer-access-fontify-functions" + "buffer-access-fontified-property" "input-decode-map" + "local-function-key-map" "key-translation-map" "interpreter-mode-alist" + "magic-mode-alist" "magic-fallback-mode-alist" "auto-mode-alist" + "process-coding-system-alist" "network-coding-system-alist" + "default-process-coding-system" "unread-command-events" "last-input-event" + "buffer-auto-save-file-name" "auto-save-hook" "buffer-saved-size" + "auto-save-list-file-name" "inhibit-field-text-motion" + "find-word-boundary-function-table" "default-minibuffer-frame" + "init-file-user" "play-sound-functions" + "customize-package-emacs-version-alist" "delayed-warnings-list" + "delayed-warnings-hook" "fringe-cursor-alist" "indent-region-function" + "fringe-indicator-alist" "dynamic-library-alist" "kill-emacs-hook" + "kill-emacs-query-functions" "abbrev-table-name-list" "buffer-read-only" + "inhibit-read-only" "window-size-fixed" "load-in-progress" "load-file-name" + "load-read-function" "image-types" "pure-bytes-used" "purify-flag" + "bidi-display-reordering" "bidi-paragraph-direction" "write-file-functions" + "write-contents-functions" "window-scroll-functions" + "window-size-change-functions" "window-configuration-change-hook" + "window-system" "initial-window-system" "font-lock-multiline" + "completion-styles-alist" "completion-extra-properties" + "current-input-method" "input-method-alist" "suspend-hook" + "suspend-resume-hook" "default-directory" "current-prefix-arg" "prefix-arg" + "last-prefix-arg" "fill-paragraph-function" + "fill-forward-paragraph-function" "use-hard-newlines" + "minibuffer-completion-table" "minibuffer-completion-predicate" + "minibuffer-completion-confirm" "minibuffer-confirm-exit-commands" + "minibuffer-local-completion-map" "minibuffer-local-must-match-map" + "minibuffer-local-filename-completion-map" "auto-fill-function" + "normal-auto-fill-function" "auto-fill-chars" "generate-autoload-cookie" + "generated-autoload-file" "x-resource-class" "x-resource-name" + "inhibit-x-resources" "indent-line-function" "abbrevs-changed" + "mode-line-mule-info" "mode-line-modified" "mode-line-frame-identification" + "mode-line-buffer-identification" "mode-line-position" "vc-mode" + "mode-line-modes" "mode-line-remote" "mode-line-client" "mode-name" + "mode-line-process" "mode-line-front-space" "mode-line-end-spaces" + "mode-line-misc-info" "minor-mode-alist" "global-mode-string" + "deactivate-mark" "mark-active" "activate-mark-hook" "deactivate-mark-hook" + "mark-ring" "parse-sexp-lookup-properties" "syntax-propertize-function" + "syntax-propertize-extend-region-functions" "completion-at-point-functions") + "TODO") + +(defvar +emacs-lisp-option-list + '("switch-to-buffer-in-dedicated-window" + "switch-to-buffer-preserve-window-point" "transient-mark-mode" + "mark-even-if-inactive" "mark-ring-max" "timer-max-repeats" + "abbrev-file-name" "save-abbrevs" "custom-unlispify-remove-prefixes" + "tab-always-indent" "completion-auto-help" "fill-individual-varying-indent" + "default-justification" "sentence-end-double-space" + "sentence-end-without-period" "sentence-end-without-space" "debug-on-quit" + "default-input-method" "indent-tabs-mode" + "window-adjust-process-window-size-function" "create-lockfiles" + "completion-styles" "completion-category-overrides" "read-buffer-function" + "read-buffer-completion-ignore-case" "before-save-hook" "after-save-hook" + "file-precious-flag" "require-final-newline" "warning-minimum-level" + "warning-minimum-log-level" "warning-suppress-types" + "warning-suppress-log-types" "inhibit-startup-screen" + "initial-buffer-choice" "inhibit-startup-echo-area-message" + "initial-scratch-message" "enable-recursive-minibuffers" + "delete-exited-processes" "initial-frame-alist" "minibuffer-frame-alist" + "default-frame-alist" "indicate-empty-lines" "indicate-buffer-boundaries" + "overflow-newline-into-fringe" "backup-by-copying" + "backup-by-copying-when-linked" "backup-by-copying-when-mismatch" + "backup-by-copying-when-privileged-mismatch" "case-fold-search" + "case-replace" "user-mail-address" "words-include-escapes" "version-control" + "kept-new-versions" "kept-old-versions" "delete-old-versions" + "dired-kept-versions" "auto-save-visited-file-name" "auto-save-interval" + "auto-save-timeout" "auto-save-default" "delete-auto-save-files" + "auto-save-list-file-prefix" "message-log-max" "auto-coding-regexp-alist" + "file-coding-system-alist" "auto-coding-alist" "auto-coding-functions" + "only-global-abbrevs" "package-archives" "package-archive-upload-base" + "initial-major-mode" "major-mode" "mail-host-address" "page-delimiter" + "paragraph-separate" "paragraph-start" "sentence-end" "smie-config" + "edebug-eval-macro-args" "echo-keystrokes" "double-click-fuzz" + "double-click-time" "find-file-wildcards" "find-file-hook" + "switch-to-visible-buffer" "frame-resize-pixelwise" + "completion-ignored-extensions" "focus-follows-mouse" "no-redraw-on-reenter" + "help-char" "help-event-list" "three-step-help" + "read-file-name-completion-ignore-case" "insert-default-directory" + "revert-without-query" "face-font-family-alternatives" + "face-font-selection-order" "face-font-registry-alternatives" + "scalable-fonts-allowed" "load-prefer-newer" "selective-display-ellipses" + "inhibit-eol-conversion" "display-buffer-alist" "display-buffer-base-action" + "kill-ring-max" "void-text-area-pointer" "exec-suffixes" "exec-path" + "max-lisp-eval-depth" "edebug-sit-for-seconds" "make-backup-files" + "backup-directory-alist" "make-backup-file-name-function" + "edebug-setup-hook" "edebug-all-defs" "edebug-all-forms" + "edebug-save-windows" "edebug-save-displayed-buffer-points" + "edebug-initial-mode" "edebug-trace" "edebug-test-coverage" + "edebug-continue-kbd-macro" "edebug-unwrap-results" "edebug-on-error" + "edebug-on-quit" "edebug-global-break-condition" "window-combination-limit" + "window-combination-resize" "edebug-print-length" "edebug-print-level" + "edebug-print-circle" "frame-auto-hide-function" "sort-fold-case" + "sort-numeric-base" "fill-prefix" "fill-column" "left-margin" + "fill-nobreak-predicate" "enable-local-variables" + "safe-local-variable-values" "enable-local-eval" "safe-local-eval-forms" + "frame-inhibit-implied-resize" "display-mm-dimensions-alist" + "remote-file-name-inhibit-cache" "read-regexp-defaults-function" + "max-mini-window-height" "mode-line-format" "eval-expression-print-length" + "eval-expression-print-level" "scroll-margin" "scroll-conservatively" + "scroll-down-aggressively" "scroll-up-aggressively" "scroll-step" + "scroll-preserve-screen-position" "next-screen-context-lines" + "scroll-error-top-bottom" "recenter-redisplay" "recenter-positions" + "byte-compile-dynamic-docstrings" "yank-handled-properties" + "yank-excluded-properties" "max-specpdl-size" "term-file-prefix" + "term-file-aliases" "image-load-path" "scroll-bar-mode" + "horizontal-scroll-bar-mode" "blink-matching-paren" + "blink-matching-paren-distance" "blink-matching-delay" + "underline-minimum-offset" "x-bitmap-file-path" "minibuffer-auto-raise" + "window-resize-pixelwise" "fit-window-to-buffer-horizontally" + "fit-frame-to-buffer" "fit-frame-to-buffer-margins" + "fit-frame-to-buffer-sizes" "baud-rate" "imagemagick-enabled-types" + "imagemagick-types-inhibit" "visible-bell" "ring-bell-function" + "site-run-file" "inhibit-default-init" + "backward-delete-char-untabify-method" "cursor-in-non-selected-windows" + "x-stretch-cursor" "blink-cursor-alist" "truncate-lines" + "truncate-partial-width-windows" "kill-read-only-ok" "pop-up-windows" + "split-window-preferred-function" "split-height-threshold" + "split-width-threshold" "even-window-sizes" "pop-up-frames" + "pop-up-frame-function" "pop-up-frame-alist" "same-window-buffer-names" + "same-window-regexps" "debug-on-error" "debug-ignored-errors" + "eval-expression-debug-on-error" "debug-on-signal" "debug-on-event" + "adaptive-fill-mode" "adaptive-fill-regexp" + "adaptive-fill-first-line-regexp" "adaptive-fill-function" + "glyphless-char-display-control" "abbrev-all-caps" + "temp-buffer-show-function" "temp-buffer-resize-mode" + "temp-buffer-max-height" "temp-buffer-max-width" "tab-stop-list" + "buffer-offer-save" "temporary-file-directory" + "small-temporary-file-directory" "undo-limit" "undo-strong-limit" + "undo-outer-limit" "undo-ask-before-discard" "parse-sexp-ignore-comments" + "ctl-arrow" "tab-width" "defun-prompt-regexp" + "open-paren-in-column-0-is-defun-start" "history-length" + "history-delete-duplicates" "selection-coding-system" "meta-prefix-char" + "garbage-collection-messages" "gc-cons-threshold" "gc-cons-percentage" + "resize-mini-windows" "max-mini-window-height" "window-min-height" + "window-min-width" "split-window-keep-point") + "TODO") + +(defvar +emacs-lisp-command-list + '("debug-on-entry" "cancel-debug-on-entry" "beginning-of-line" "end-of-line" + "forward-line" "count-words" "switch-to-buffer" "switch-to-buffer-other-window" + "switch-to-buffer-other-frame" "pop-to-buffer" "indent-relative" + "indent-relative-maybe" "run-at-time" "write-abbrev-file" + "indent-for-tab-command" "indent-according-to-mode" "newline-and-indent" + "reindent-then-newline-and-indent" "minibuffer-complete-word" + "minibuffer-complete" "minibuffer-complete-and-exit" + "minibuffer-completion-help" "fill-paragraph" "fill-region" + "fill-individual-paragraphs" "fill-region-as-paragraph" "justify-current-line" + "push-button" "forward-button" "backward-button" "append-to-file" "write-region" + "universal-argument" "digit-argument" "negative-argument" "suspend-emacs" + "suspend-frame" "set-input-method" "indent-to" "describe-current-display-table" + "read-color" "smie-close-block" "smie-down-list" "posix-search-forward" + "posix-search-backward" "save-buffer" "save-some-buffers" "write-file" + "signal-process" "exit-minibuffer" "self-insert-and-exit" + "previous-history-element" "next-history-element" + "previous-matching-history-element" "next-matching-history-element" + "previous-complete-history-element" "next-complete-history-element" "load-file" + "load-library" "read-only-mode" "kill-emacs" "indent-region" "indent-rigidly" + "indent-code-rigidly" "play-sound-file" "forward-word" "backward-word" + "auto-save-mode" "do-auto-save" "package-upload-file" "package-upload-buffer" + "other-window" "edebug-display-freq-count" "normal-mode" "fundamental-mode" + "getenv" "setenv" "smie-config-guess" "smie-config-save" + "smie-config-show-indent" "smie-config-set-indent" "search-forward" + "search-backward" "word-search-forward" "word-search-forward-lax" + "word-search-backward" "word-search-backward-lax" "base64-encode-region" + "base64-decode-region" "compile-defun" "byte-compile-file" + "byte-recompile-directory" "execute-extended-command" "backtrace" + "make-frame-on-display" "find-file" "find-file-literally" + "find-file-other-window" "find-file-read-only" "format-write-file" + "format-find-file" "format-insert-file" "enable-command" "disable-command" + "switch-to-prev-buffer" "switch-to-next-buffer" "describe-buffer-case-table" + "recursive-edit" "exit-recursive-edit" "abort-recursive-edit" "top-level" + "replace-buffer-in-windows" "goto-char" "forward-char" "backward-char" + "set-face-foreground" "set-face-background" "set-face-stipple" "set-face-font" + "invert-face" "translate-region" "run-with-idle-timer" "delete-window" + "delete-other-windows" "delete-windows-on" "describe-mode" "select-frame" + "handle-switch-frame" "redraw-display" "apropos" "strong>help-command" + "describe-prefix-bindings" "Helper-describe-bindings" "Helper-help" + "revert-buffer" "narrow-to-region" "narrow-to-page" "widen" "disassemble" + "encode-coding-region" "decode-coding-region" "imenu-add-to-menubar" + "set-keyboard-coding-system" "set-terminal-coding-system" "move-to-window-line" + "display-buffer" "keyboard-quit" "open-dribble-file" "make-local-variable" + "make-variable-buffer-local" "kill-local-variable" "rename-buffer" + "describe-bindings" "move-to-column" "eval-region" "eval-buffer" + "edebug-set-initial-mode" "package-initialize" "insert-buffer" + "self-insert-command" "newline" "list-processes" "quit-window" + "sort-regexp-fields" "sort-lines" "sort-paragraphs" "sort-pages" "sort-fields" + "sort-numeric-fields" "sort-columns" "set-left-margin" "set-right-margin" + "move-to-left-margin" "add-name-to-file" "rename-file" "copy-file" + "make-symbolic-link" "delete-file" "set-file-modes" "insert-char" + "emacs-version" "iconify-frame" "make-frame-visible" "make-frame-invisible" + "minibuffer-inactive-mode" "scroll-up" "scroll-down" "scroll-up-command" + "scroll-down-command" "scroll-other-window" "recenter" "recenter-top-bottom" + "modify-syntax-entry" "describe-syntax" "re-search-forward" "re-search-backward" + "emacs-uptime" "emacs-init-time" "delete-horizontal-space" "delete-indentation" + "fixup-whitespace" "just-one-space" "delete-blank-lines" + "delete-trailing-whitespace" "debug" "scroll-left" "scroll-right" + "blink-matching-open" "global-set-key" "global-unset-key" "local-set-key" + "local-unset-key" "raise-frame" "lower-frame" "delete-frame" + "fit-window-to-buffer" "fit-frame-to-buffer" + "shrink-window-if-larger-than-buffer" "balance-windows" "balance-windows-area" + "maximize-window" "minimize-window" "delete-minibuffer-contents" + "open-termscript" "erase-buffer" "delete-region" "delete-char" + "delete-backward-char" "backward-delete-char-untabify" "capitalize-region" + "downcase-region" "upcase-region" "capitalize-word" "downcase-word" + "upcase-word" "bury-buffer" "unbury-buffer" "make-frame" "view-register" + "insert-register" "kill-region" "copy-region-as-kill" "expand-abbrev" + "abbrev-prefix-mark" "set-frame-font" "list-charset-chars" + "make-indirect-buffer" "clone-indirect-buffer" "make-directory" "copy-directory" + "delete-directory" "locate-library" "list-load-path-shadows" "tab-to-tab-stop" + "kill-buffer" "back-to-indentation" "backward-to-indentation" + "forward-to-indentation" "unload-feature" "read-kbd-macro" "serial-term" + "buffer-enable-undo" "buffer-disable-undo" "text-mode" "prog-mode" + "special-mode" "beginning-of-buffer" "end-of-buffer" "forward-list" + "backward-list" "up-list" "backward-up-list" "down-list" "forward-sexp" + "backward-sexp" "beginning-of-defun" "end-of-defun" "gui-set-selection" + "undefined" "garbage-collect" "describe-categories" "load-theme" "enable-theme" + "disable-theme" "not-modified" "yank" "yank-pop" "split-window-right" + "split-window-below" "set-visited-file-name") + "List of elisp commands.") + +;; (defvar +emacs-lisp-macro-list +;; '("defcustom" "deftheme" "provide-theme" "push" "save-match-data" "pop" +;; "defsubst" "define-alternatives" "with-output-to-temp-buffer" +;; "with-temp-buffer-window" "with-current-buffer-window" +;; "with-displayed-buffer-window" "pcase" "pcase-defmacro" "with-temp-message" +;; "declare-function" "edebug-tracing" "defimage" "setf" +;; "with-output-to-string" "with-syntax-table" "seq-doseq" "seq-let" +;; "with-eval-after-load" "defface" "dotimes-with-progress-reporter" +;; "with-current-buffer" "with-temp-buffer" "delay-mode-hooks" "cl-defgeneric" +;; "cl-defmethod" "gv-define-simple-setter" "gv-define-setter" "defmacro" +;; "with-file-modes" "condition-case-unless-debug" "ignore-errors" +;; "with-demoted-errors" "easy-menu-define" "save-window-excursion" +;; "iter-defun" "iter-lambda" "iter-yield" "iter-yield-from" "iter-do" +;; "setq-local" "defvar-local" "define-generic-mode" "with-local-quit" "dolist" +;; "dotimes" "save-mark-and-excursion" "with-coding-priority" "defun" +;; "define-inline" "inline-quote" "inline-letevals" "inline-const-p" +;; "inline-const-val" "inline-error" "define-minor-mode" +;; "define-globalized-minor-mode" "lazy-completion-table" +;; "define-obsolete-variable-alias" "save-selected-window" +;; "with-selected-window" "declare" "with-help-window" "make-help-screen" +;; "define-derived-mode" "when" "unless" "combine-after-change-calls" +;; "with-case-table" "define-obsolete-face-alias" "noreturn" "def-edebug-spec" +;; "while-no-input" "define-advice" "add-function" "remove-function" "lambda" +;; "define-obsolete-function-alias" "with-temp-file" "defgroup" "with-timeout") +;; "List of elisp macros.") + +;; (defvar +emacs-lisp-special-form-list +;; '("catch" "function" "setq" "eval-and-compile" "eval-when-compile" "defvar" +;; "defconst" "if" "cond" "track-mouse" "save-restriction" "with-no-warnings" +;; "interactive" "save-excursion" "while" "condition-case" "quote" +;; "save-current-buffer" "let" "let*" "and" "or" "setq-default" +;; "unwind-protect" "count-loop" "progn" "prog1" "prog2") +;; "List of elisp special forms.") diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 1e8ffb883..41c2dff66 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -46,17 +46,25 @@ #'(;; 3rd-party functionality auto-compile-on-save-mode doom|enable-delete-trailing-whitespace ;; fontification - rainbow-delimiters-mode highlight-quoted-mode +emacs-lisp|extra-fontification + rainbow-delimiters-mode highlight-quoted-mode ;; initialization +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) - (defun +emacs-lisp|extra-fontification () - "Display lambda as a smybol and fontify doom module functions." - (font-lock-add-keywords - nil `(;; Highlight custom Doom cookies - ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; Highlight doom/module functions - ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face))))) + ;; Improve elisp fontification + (load! "+symbols") + (font-lock-add-keywords + 'emacs-lisp-mode + `(;; Highlight custom Doom cookies + ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) + ;; Highlight doom/module functions + ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 'font-lock-keyword-face)) + ;; Highlight symbols in standard library + ;; (,(regexp-opt +emacs-lisp-macro-list 'symbols) . font-lock-builtin-face) + (,(regexp-opt +emacs-lisp-function-list 'symbols) . font-lock-function-name-face) + (,(regexp-opt +emacs-lisp-command-list 'symbols) . font-lock-function-name-face) + ;; (,(regexp-opt +emacs-lisp-special-form-list 'symbols) . font-lock-keyword-face) + (,(regexp-opt +emacs-lisp-variable-list 'symbols) . font-lock-variable-name-face) + (,(regexp-opt +emacs-lisp-option-list 'symbols) . font-lock-variable-name-face))) (defun +emacs-lisp|init-imenu () "Improve imenu support with better expression regexps and Doom-specific forms." From cb7e471c905dc7914442a640699e5c3538ce132c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 18:26:20 +0200 Subject: [PATCH 2554/4235] General reformatting & comment revision/cleanup --- core/core-editor.el | 2 ++ core/core-ui.el | 10 ++-------- modules/emacs/vc/config.el | 2 +- modules/tools/magit/config.el | 3 ++- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index a60e0322e..56aad80d3 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -224,6 +224,7 @@ savehist file." ;; Autoloaded Plugins ;; +;; `command-log-mode' (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode t) @@ -237,6 +238,7 @@ savehist file." (advice-add #'evil-escape :before #'doom*quit-expand-region) (advice-add #'doom/escape :before #'doom*quit-expand-region)) +;; A better *help* buffer (def-package! helpful :defer t :init diff --git a/core/core-ui.el b/core/core-ui.el index 7a1933a3d..8d5f6edf8 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -106,13 +106,8 @@ Also see `doom-exit-buffer-hook'.") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no - -;; -;; Shims -;; - +;; doesn't exist in terminal Emacs; define it to prevent errors (unless (fboundp 'define-fringe-bitmap) - ;; doesn't exist in terminal Emacs; define it to prevent errors (defun define-fringe-bitmap (&rest _))) @@ -234,7 +229,6 @@ Also see `doom-exit-buffer-hook'.") show-paren-when-point-inside-paren t) (show-paren-mode +1)) -;;; More reliable inter-window border ;; The native border "consumes" a pixel of the fringe on righter-most splits, ;; `window-divider' does not. Available since Emacs 25.1. (setq-default window-divider-default-places t @@ -247,7 +241,7 @@ Also see `doom-exit-buffer-hook'.") (remove-hook 'kill-buffer-query-functions #'server-kill-buffer-query-function)) (add-hook 'server-visit-hook #'server-remove-kill-buffer-hook) -;; `whitespace-mode' +;; `whitespace-mode' (built-in) (setq whitespace-line-column nil whitespace-style '(face indentation tabs tab-mark spaces space-mark newline newline-mark diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 84b13d253..1150909a2 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -9,7 +9,7 @@ (advice-add #'git-timemachine--show-minibuffer-details :override #'+vc*update-header-line) (after! evil - ;; Force evil to rehash keybindings for the current state + ;; rehash evil keybindings so they are recognized (add-hook 'git-timemachine-mode-hook #'evil-normalize-keymaps)) (when (featurep! :tools magit) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index c5b113381..747938673 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -7,7 +7,8 @@ be set before `magithub' (and `magit') is loaded.") (defvar +magit-hub-features '(pull-request-merge commit-browse completion) "What features to initialize when `magithub' is loaded. Set this to `t' to -load everything.") +load everything. See `magithub-feature-list' to see what features are +available.") ;; From 1205db0f7304388e8af268be90847a40ced261db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 18:36:12 +0200 Subject: [PATCH 2555/4235] Decouple :modeline popup rule from modeline API The :modeline property still takes: t => default modeline nil => no modeline (the default) But now also accepts: function => uses its return value as the mode-line-format anything non-nil => used directly as the mode-line-format This is to decouple the popup API from the modeline API. You can still use them compositionally: (set-popup-rule "abc" :modeline (lambda () (set-modeline! :project))) --- modules/ui/popup/autoload/popup.el | 23 ++++++++++++----------- modules/ui/popup/autoload/settings.el | 10 +++++----- modules/ui/popup/test/test-popup.el | 5 ++--- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index f6ac1da82..6b1b11a55 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -215,23 +215,24 @@ restoring it if `+popup-buffer-mode' is disabled." ;;;###autoload (defun +popup|set-modeline-on-enable () "Don't show modeline in popup windows without a `modeline' window-parameter. +Possible values for this parameter are: -+ If one exists and it's a symbol, use `doom-modeline' to grab the format. -+ If non-nil, show the mode-line as normal. -+ If nil (or omitted), then hide the modeline entirely (the default). -+ If a function, it takes the current buffer as its argument and must return one - of the above values." + t show the mode-line as normal + nil hide the modeline entirely (the default) + a function `mode-line-format' is set to its return value + +Any non-nil value besides the above will be used as the raw value for +`mode-line-format'." (when (bound-and-true-p +popup-buffer-mode) (let ((modeline (+popup-parameter 'modeline))) (cond ((eq modeline 't)) - ((or (eq modeline 'nil) - (null modeline)) + ((null modeline) ;; TODO use `mode-line-format' window parameter instead (emacs 26+) (hide-mode-line-mode +1)) - ((functionp modeline) - (funcall modeline)) - ((symbolp modeline) - (when-let* ((hide-mode-line-format (doom-modeline modeline))) + ((let ((hide-mode-line-format + (if (functionp modeline) + (funcall modeline) + modeline))) (hide-mode-line-mode +1))))))) (put '+popup|set-modeline-on-enable 'permanent-local-hook t) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 3d9d82f65..e700e5445 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -143,11 +143,11 @@ PLIST can be made up of any of the following properties: (where you were before the popup opened). The popup system does nothing else and ignores the function's return value. -:modeline BOOL|SYMBOL|FN - Can be t (show the default modeline), a symbol representing the name of a - modeline defined with `def-modeline!', nil (show no modeline) or a function - that returns a modeline format. The function takes no arguments and is run in - the context of the popup buffer. +:modeline BOOL|FN|LIST + Can be t (show the default modeline), nil (show no modeline), a function that + returns a modeline format or a valid value for `mode-line-format' to be used + verbatim. The function takes no arguments and is run in the context of the + popup buffer. :autosave BOOL|FN This parameter determines what to do with modified buffers when closing popup diff --git a/modules/ui/popup/test/test-popup.el b/modules/ui/popup/test/test-popup.el index 332a2fded..0f666affe 100644 --- a/modules/ui/popup/test/test-popup.el +++ b/modules/ui/popup/test/test-popup.el @@ -140,10 +140,9 @@ (display-buffer a) (expect mode-line-format :to-equal (default-value 'mode-line-format))) (it "uses a predefined mode-line if passed a symbol" - (def-modeline! test-popup-modeline ("x") ()) - (set-popup-rule! "a" :modeline 'test-popup-modeline :select t) + (set-popup-rule! "a" :modeline '("x") :select t) (display-buffer a) - (expect mode-line-format :to-equal (doom-modeline 'test-popup-modeline))) + (expect mode-line-format :to-equal '("x"))) (it "runs the handler if passed a function" (set-popup-rule! "a" :modeline (lambda () (setq mode-line-format '("x"))) :select t) (display-buffer a) From 55870458e63cf973b85ae2479d25b96ab66cbd10 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 19:14:50 +0200 Subject: [PATCH 2556/4235] Byte-compile mode-line segment :eval forms Byte-compiled function calls are ~10% faster than evalling quoted forms. --- modules/ui/modeline/autoload/settings.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/ui/modeline/autoload/settings.el b/modules/ui/modeline/autoload/settings.el index 2a27d6764..6adb01b46 100644 --- a/modules/ui/modeline/autoload/settings.el +++ b/modules/ui/modeline/autoload/settings.el @@ -23,14 +23,15 @@ keep them left and right aligned respectively." body) (macroexp-progn (if (not (keywordp (car rest))) - `((defvar-local ,name nil ,docstring) - (setq-default - ,name - ,(if (or (stringp (car rest)) - (memq (car (car-safe rest)) '(:eval :propertize))) - (car rest) - `(quote (:eval ,(macroexp-progn rest))))) - (put ',name 'risky-local-variable t)) + (append `((defvar-local ,name nil ,docstring) + (put ',name 'risky-local-variable t)) + (if (or (stringp (car rest)) + (memq (car (car-safe rest)) '(:eval :propertize))) + `((setq-default ,name ,(car rest))) + (let ((fn (intern (format "+modeline--%s" name)))) + `((fset ',fn (lambda () ,@rest)) + (byte-compile ',fn) + (setq-default ,name (quote (:eval (,fn)))))))) ;; isolate body (setq body rest) (while (keywordp (car body)) From c24a3671b1085601908189d22f525b6ab951d7c3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 19:19:08 +0200 Subject: [PATCH 2557/4235] lang/racket: setq racket-smart-open-bracket-enable Instead of doing so in a hook (which is harder to customize). Addresses #772 --- modules/lang/racket/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index dba338765..3d0d9c4a8 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -18,6 +18,8 @@ (set-rotate-patterns! 'racket-mode :symbols '(("#true" "#false"))) + (setq racket-smart-open-bracket-enable t) + (add-hook! racket-mode #'(;; 3rd-party functionality doom|enable-delete-trailing-whitespace @@ -25,8 +27,6 @@ rainbow-delimiters-mode highlight-quoted-mode)) - (setq-hook! racket-mode racket-smart-open-bracket-enable t) - (map! :map racket-mode-map :localleader :n "c" #'racket-run From b33b5ed624f8c1c6f1313acca182e4f0c03bf713 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 19:29:05 +0200 Subject: [PATCH 2558/4235] Cleanup recentf list on kill-emacs --- core/core-editor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 56aad80d3..faa66ea9f 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -124,7 +124,7 @@ savehist file." :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") - recentf-auto-cleanup 120 + recentf-auto-cleanup 'never recentf-max-menu-items 0 recentf-max-saved-items 300 recentf-filename-handlers '(file-truename) @@ -134,6 +134,7 @@ savehist file." "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) (lambda (file) (file-in-directory-p file doom-local-dir)))) + (add-hook 'kill-emacs-hook #'recentf-cleanup) (quiet! (recentf-mode +1))) (def-package! server From fe3a73c118e3dbf2e66c4909ba9ae81f18b7b14c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 19:29:37 +0200 Subject: [PATCH 2559/4235] Rebind RET rather than remapping newline The remapping was global, preventing its use in insert mode anywhere. Binding to RET is less destructive. --- modules/config/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 6b544743f..099fb50dd 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -15,8 +15,8 @@ :nmvo doom-localleader-key nil ;; Swap RET/C-j in insert mode - :i [remap newline] #'newline-and-indent - :i "C-j" #'+default/newline + :gi "RET" #'newline-and-indent + :i "C-j" #'+default/newline ;; --- Global keybindings --------------------------- ;; Make M-x available everywhere From 248e9a487f743ed2fb7d3451ce688686adf82150 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 20:59:49 +0200 Subject: [PATCH 2560/4235] Stop php-extras altering global company-backends --- modules/lang/php/config.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index eeb9867e4..464561c36 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -49,10 +49,8 @@ (def-package! php-extras :after php-mode - :init - ;; company will set up itself - (advice-add #'php-extras-company-setup :override #'ignore) - (add-to-list '+php--company-backends 'php-extras-company nil #'eq) + :preface (advice-add #'php-extras-company-setup :override #'ignore) + :init (add-to-list '+php--company-backends 'php-extras-company nil #'eq) :config (setq php-extras-eldoc-functions-file (concat doom-etc-dir "php-extras-eldoc-functions")) From 22aeaec399d925f394a18a45fa33a44b81cdc52f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 21:31:58 +0200 Subject: [PATCH 2561/4235] Refactor how company-backends are set and stored Company backends are now built from an alist (+company-backend-alist), which can be manipulated through set-company-backend!. Backends can now be set to all children of a parent mode (text-mode, prog-mode, etc), like so: (set-company-backend! :derived 'text-mode 'company-dabbrev) or only for an exact major-mode: (set-company-backend! 'markdown-mode 'company-dabbrev-code) Backends cascade. So combining the two examples above will cause company-backends in a markdown-buffer (which is derived from text-mode) to be (company-dabbrev-code company-dabbrev). --- modules/completion/company/autoload.el | 76 ++++++++++++++----- modules/completion/company/config.el | 3 +- .../completion/company/test/test-company.el | 76 ++++++++++++------- 3 files changed, 107 insertions(+), 48 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index d605ac9b5..ae6fd349b 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -1,5 +1,13 @@ ;;; completion/company/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defvar +company-backend-alist + '((text-mode :derived (company-dabbrev company-yasnippet)) + (prog-mode :derived (:separate company-capf company-yasnippet)) + (conf-mode :derived company-capf company-dabbrev-code company-yasnippet)) + "An alist matching modes to company backends. The backends for any mode is +built from this.") + ;;;###autodef (defun set-company-backend! (modes &rest backends) "Prepends BACKENDS (in order) to `company-backends' in MODES. @@ -16,24 +24,24 @@ Examples: '(company-shell :with company-yasnippet)) (set-company-backend! 'js2-mode '(:separate company-irony-c-headers company-irony)) - (set-company-backend! 'sh-mode nil)" + (set-company-backend! 'sh-mode nil) + +To have BACKENDS apply to any mode that is a parent of MODES, set MODES to +:derived, e.g. + + (set-company-backend! :derived 'text-mode 'company-dabbrev 'company-yasnippet)" (declare (indent defun)) - (dolist (mode (doom-enlist modes)) - (let ((hook (intern (format "%s-hook" mode))) - (fn (intern (format "+company|init-%s" mode)))) - (cond ((null (car-safe backends)) - (remove-hook hook fn) - (unintern fn nil)) - ((fset fn - (lambda () - (when (or (eq major-mode mode) - (and (boundp mode) (symbol-value mode))) - (require 'company) - (make-local-variable 'company-backends) - (dolist (backend (reverse backends)) - (cl-pushnew backend company-backends - :test (if (symbolp backend) #'eq #'equal)))))) - (add-hook hook fn)))))) + (let ((type :exact)) + (when (eq modes :derived) + (setq type :derived + modes (pop backends))) + (dolist (mode (doom-enlist modes)) + (if (null (car backends)) + (setq +company-backend-alist + (delq (assq mode +company-backend-alist) + +company-backend-alist)) + (setf (alist-get mode +company-backend-alist) + (cons type backends)))))) ;; FIXME obsolete :company-backend ;;;###autoload @@ -41,6 +49,40 @@ Examples: :obsolete set-company-backend! `(set-company-backend! ,modes ,@backends)) + +;; +;; Library +;; + +(defun +company--backends () + (or (cl-loop for (mode . rest) in +company-backend-alist + for type = (car rest) + for backends = (cdr rest) + if (or (and (eq type :derived) (derived-mode-p mode)) ; parent modes + (and (eq type :exact) (eq major-mode mode)) ; major modes + (and (boundp mode) (symbol-value mode))) ; minor modes + nconc backends) + (default-value 'company-backends))) + + +;; +;; Hooks +;; + +;;;###autoload +(defun +company|init-backends () + "Set `company-backends' for the current buffer." + (unless (eq major-mode 'fundamental-mode) + (set (make-local-variable 'company-backends) (+company--backends))) + (add-hook 'after-change-major-mode-hook #'+company|init-backends nil 'local)) + +(put '+company|init-backends 'permanent-local-hook t) + + +;; +;; Commands +;; + ;;;###autoload (defun +company/toggle-auto-completion () "Toggle as-you-type code completion." diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 0e3bc00c1..b43d136b0 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -15,10 +15,9 @@ company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) - company-backends - '((:separate company-capf company-yasnippet)) company-transformers '(company-sort-by-occurrence)) :config + (add-hook 'company-mode-hook #'+company|init-backends) (global-company-mode +1)) diff --git a/modules/completion/company/test/test-company.el b/modules/completion/company/test/test-company.el index 9892516a7..a523479be 100644 --- a/modules/completion/company/test/test-company.el +++ b/modules/completion/company/test/test-company.el @@ -6,45 +6,63 @@ (load! "../autoload")) (describe ":company-backend" - :var (a) + :var (a +company-backend-alist backends) (before-each - (setq company-backends '(default) - text-mode-hook nil + (setq-default company-backends '(t)) + (setq +company-backend-alist nil a (get-buffer-create "x")) + (fset 'backends + (lambda (mode) + (let ((major-mode mode)) + (+company--backends)))) (set-buffer a) (spy-on 'require)) (after-each - (fmakunbound '+company|init-text-mode) (kill-buffer a)) - (it "adds hooks and defines +company|init-MODE" - (set-company-backend! 'text-mode '(backend-1)) - (expect (fboundp '+company|init-text-mode)) - (expect text-mode-hook :to-equal '(+company|init-text-mode))) + ;; + (it "sets backends for a major mode" + (set-company-backend! 'text-mode 'a) + (expect (backends 'text-mode) :to-equal '(a))) - (it "adds grouped backends" - (set-company-backend! 'text-mode '(backend-1)) - (text-mode) - (expect company-backends :to-equal '((backend-1) default))) + (it "sets backends for a derived-mode" + (set-company-backend! :derived 'prog-mode 'a) + (expect (backends 'prog-mode) :to-equal '(a)) + (expect (backends 'emacs-lisp-mode) :to-equal '(a))) - (it "adds multiple backends" - (set-company-backend! 'text-mode 'backend-1 'backend-2) - (text-mode) - (expect company-backends :to-equal '(backend-1 backend-2 default))) + (it "sets multiple backends for exact major modes" + (set-company-backend! '(text-mode emacs-lisp-mode) 'a 'b) + (expect (backends 'text-mode) :to-equal (backends 'emacs-lisp-mode))) - (it "adds single backend" - (set-company-backend! 'text-mode 'backend-1) - (text-mode) - (expect company-backends :to-equal '(backend-1 default))) + (it "sets cumulative backends" + (set-company-backend! :derived 'prog-mode 'a) + (set-company-backend! 'emacs-lisp-mode 'b) + (expect (backends 'emacs-lisp-mode) :to-equal '(b a))) - (it "overwrites past values" - (set-company-backend! 'text-mode 'backend-1) - (set-company-backend! 'text-mode 'backend-2) - (text-mode) - (expect company-backends :to-equal '(backend-2 default))) + (it "overwrites past backends" + (set-company-backend! 'text-mode 'old 'backends) + (set-company-backend! 'text-mode 'new 'backends) + (expect (backends 'text-mode) :to-equal '(new backends))) - (it "unsets past values" - (set-company-backend! 'text-mode 'backend-1) + (it "unsets past backends" + (set-company-backend! 'text-mode 'old) (set-company-backend! 'text-mode nil) - (text-mode) - (expect company-backends :to-equal '(default))))) + (expect (backends 'text-mode) :to-equal (default-value 'company-backends))) + + (it "unsets past parent backends" + (set-company-backend! :derived 'prog-mode 'old) + (set-company-backend! 'emacs-lisp-mode 'child) + (set-company-backend! :derived 'prog-mode nil) + (expect (backends 'emacs-lisp-mode) :to-equal '(child))) + + (it "overwrites past cumulative backends" + (set-company-backend! :derived 'prog-mode 'base) + (set-company-backend! 'emacs-lisp-mode 'old) + (set-company-backend! 'emacs-lisp-mode 'new) + (expect (backends 'emacs-lisp-mode) :to-equal '(new base))) + + (it "overwrites past parent backends" + (set-company-backend! :derived 'prog-mode 'base) + (set-company-backend! 'emacs-lisp-mode 'child) + (set-company-backend! :derived 'prog-mode 'new) + (expect (backends 'emacs-lisp-mode) :to-equal '(child new))))) From 9f4b6869b66a136e7e49e17558b22e0ba3205bd9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 21:40:30 +0200 Subject: [PATCH 2562/4235] lang/php: remove redundant :interpreter Already defined in php-mode's autoloads. --- modules/lang/php/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 464561c36..47bd19712 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -4,7 +4,6 @@ (def-package! php-mode :mode "\\.inc\\'" - :interpreter "php" :config ;; Disable HTML compatibility in php-mode. `web-mode' has superior support for ;; php+html. Use the .phtml From c96c2aa7fbe96658293894372ccd88d2c9aa5749 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 29 Jul 2018 21:57:56 +0200 Subject: [PATCH 2563/4235] Add +latex-symbols-compand-backend delegate #754 If +latex-enable-unicode-math is non-nil, company-math-symbols-unicode will be used instead of company-math-symbols-latex. --- modules/lang/latex/autoload.el | 9 ++++++++- modules/lang/latex/config.el | 25 ++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/modules/lang/latex/autoload.el b/modules/lang/latex/autoload.el index 6e95a3ff6..de168cdba 100644 --- a/modules/lang/latex/autoload.el +++ b/modules/lang/latex/autoload.el @@ -40,4 +40,11 @@ (t (+ contin indent)))))) - +;;;###autoload +(defun +latex-symbols-company-backend (command &optional arg &rest _ignored) + "A wrapper backend for `company-mode' that either uses +`company-math-symbols-unicode' or `company-math-symbols-latex'. If +`+latex-enable-unicode-math' is non-nil use the former, otherwise the latter." + (if +latex-enable-unicode-math + (company-math-symbols-unicode command arg) + (company-math-symbols-latex command arg))) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 0109a2cb8..febc15a08 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -6,6 +6,15 @@ (defvar +latex-bibtex-file "" "File AUCTeX (specifically RefTeX) uses to search for citations.") +(defvar +latex-enable-unicode-math nil + "If non-nil, use `company-math-symbols-unicode' backend in LaTeX-mode, +enabling unicode symbols in math regions. This requires the unicode-math latex +package to be installed.") + +;; +(defvar +latex--company-backends nil) + + ;; ;; Plugins ;; @@ -64,6 +73,8 @@ LaTeX-section-label) LaTeX-fill-break-at-separators nil LaTeX-item-indent 0) + (when +latex--company-backends + (set-company-backend! 'latex-mode +latex--company-backends)) ;; Set custom item indentation (dolist (env '("itemize" "enumerate" "description")) (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item)))) @@ -76,26 +87,18 @@ preview-scale-function (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) -(defvar +latex--company-backends nil) - (def-package! company-auctex :when (featurep! :completion company) :defer t :init - (add-to-list '+latex--company-backends 'company-auctex-environments nil #'eq) - (add-to-list '+latex--company-backends 'company-auctex-macros nil #'eq)) + (add-to-list '+latex--company-backends #'company-auctex-environments nil #'eq) + (add-to-list '+latex--company-backends #'company-auctex-macros nil #'eq)) (def-package! company-math :when (featurep! :completion company) :defer t :init - (add-to-list '+latex--company-backends '+latex-symbols-company-backend nil #'eq)) - -(when +latex--company-backends - ;; We can't use the `set-company-backend!' because Auctex reports its - ;; major-mode as `latex-mode', but uses LaTeX-mode-hook for its mode, which is - ;; not something `set-company-backend!' anticipates (and shouldn't have to!) - (add-hook! 'LaTeX-mode-hook (add-to-list (make-local-variable 'company-backends) +latex--company-backends))) + (add-to-list '+latex--company-backends #'+latex-symbols-company-backend nil #'eq)) ;; Nicely indent lines that have wrapped when visual line mode is activated (def-package! adaptive-wrap From 2e6c362df94e67e2ef169622a37bdae822a62237 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 01:05:56 +0200 Subject: [PATCH 2564/4235] lang/latex: replace viewer flags with variable The +zathura, +skim, +okular and +pdf-tools module flags have been removed in favor of +latex-viewers, which takes a list of symbols. Its order determines the priority. The first viewer found on your system is used. If none of these viewers are found, it will fall back to latex-preview-pane. --- modules/lang/latex/+preview-pane.el | 16 --------- modules/lang/latex/+viewers.el | 55 ++++++++++++++++++++--------- modules/lang/latex/config.el | 7 ++++ 3 files changed, 45 insertions(+), 33 deletions(-) delete mode 100644 modules/lang/latex/+preview-pane.el diff --git a/modules/lang/latex/+preview-pane.el b/modules/lang/latex/+preview-pane.el deleted file mode 100644 index 734c6494e..000000000 --- a/modules/lang/latex/+preview-pane.el +++ /dev/null @@ -1,16 +0,0 @@ -;;; lang/latex/+preview-pane.el -*- lexical-binding: t; -*- -;;;###if (featurep! +preview-pane) - -(def-package! latex-preview-pane - :when (featurep! +preview-pane) - :hook (LaTeX-mode . latex-preview-pane-enable) - :commands latex-preview-pane-mode - :init - (setq latex-preview-pane-multifile-mode 'auctex) - :config - (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) - (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane")) - (define-key! doc-view-mode-map - (kbd "ESC") #'delete-window - "q" #'delete-window - "k" (λ! (quit-window) (delete-window)))) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index 46a4a1b2c..b38574796 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,22 +1,43 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- -(when (featurep! +okular) - ;; Configure Okular as viewer. Including a bug fix - ;; (https://bugs.kde.org/show_bug.cgi?id=373855) - (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) - (add-to-list 'TeX-view-program-selection '(output-pdf "Okular"))) +(cl-block nil + (dolist (viewer (reverse +latex-viewers)) + (if (pcase viewer + (`skim + (when (and IS-MAC + (file-exists-p! (or "/Applications/Skim.app" + "~/Applications/Skim.app"))) + (add-to-list 'TeX-view-program-selection '(output-pdf "Skim")))) -;; Or Skim -(when (featurep! +skim) - (add-to-list 'TeX-view-program-selection 'output-pdf '("Skim"))) + (`okular + (when (executable-find "okular") + ;; Configure Okular as viewer. Including a bug fix + ;; (https://bugs.kde.org/show_bug.cgi?id=373855) + (add-to-list 'TeX-view-program-list '("Okular" ("okular --unique file:%o" (mode-io-correlate "#src:%n%a")))) + (add-to-list 'TeX-view-program-selection '(output-pdf "Okular")))) -;; Or Zathura -(when (featurep! +zathura) - (add-to-list 'TeX-view-program-selection '(output-pdf "Zathura"))) + (`zathura + (when (executable-find "zathura") + (add-to-list 'TeX-view-program-selection '(output-pdf "Zathura")))) + + (`pdf-tools + (when (featurep! :tools pdf) + (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) + ;; Update PDF buffers after successful LaTeX runs + (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)))) + + (cl-return t))) + + ;; fall back to latex-preview-pane + (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) + (add-to-list 'TeX-view-program-selection '(output-pdf "preview-pane"))) + + +(after! latex-preview-pane + (setq latex-preview-pane-multifile-mode 'auctex) + + (define-key! doc-view-mode-map + (kbd "ESC") #'delete-window + "q" #'delete-window + "k" (λ! (quit-window) (delete-window)))) -;; Or PDF-tools, but only if the module is also loaded -(when (and (featurep! :tools pdf) - (featurep! +pdf-tools)) - (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) - ;; Update PDF buffers after successful LaTeX runs - (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index febc15a08..e8e02cf0a 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -11,6 +11,13 @@ enabling unicode symbols in math regions. This requires the unicode-math latex package to be installed.") +(defconst +latex-viewers `(skim zathura okular pdf-tools) + "A list of enabled latex viewers to use, in this order. If they don't exist, +they will be ignored. Recognized viewers are skim, zathura, okular and +pdf-tools. + +If no viewers are found, `latex-preview-pane' is used.") + ;; (defvar +latex--company-backends nil) From 14f4e4384a8aa776ba3251134c0d63e3c91adc8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 02:38:42 +0200 Subject: [PATCH 2565/4235] lang/latex: general refactor --- modules/lang/latex/+fontification.el | 9 ++-- modules/lang/latex/+latexmk.el | 13 ------ modules/lang/latex/+ref.el | 6 +-- modules/lang/latex/config.el | 63 ++++++++++++++++------------ 4 files changed, 42 insertions(+), 49 deletions(-) delete mode 100644 modules/lang/latex/+latexmk.el diff --git a/modules/lang/latex/+fontification.el b/modules/lang/latex/+fontification.el index 627931543..dfa92377d 100644 --- a/modules/lang/latex/+fontification.el +++ b/modules/lang/latex/+fontification.el @@ -2,8 +2,7 @@ ;; Fontification taken from https://tex.stackexchange.com/a/86119/81279 (setq font-latex-match-reference-keywords - '( - ;; biblatex + '(;; biblatex ("printbibliography" "[{") ("addbibresource" "[{") ;; Standard commands @@ -64,8 +63,7 @@ ("labelcref" "{"))) (setq font-latex-match-textual-keywords - '( - ;; biblatex brackets + '(;; biblatex brackets ("parentext" "{") ("brackettext" "{") ("hybridblockquote" "[{") @@ -78,8 +76,7 @@ ("subcaption" "[{"))) (setq font-latex-match-variable-keywords - '( - ;; amsmath + '(;; amsmath ("numberwithin" "{") ;; enumitem ("setlist" "[{") diff --git a/modules/lang/latex/+latexmk.el b/modules/lang/latex/+latexmk.el deleted file mode 100644 index 3e6c52d7a..000000000 --- a/modules/lang/latex/+latexmk.el +++ /dev/null @@ -1,13 +0,0 @@ -;;; lang/latex/+latexmk.el -*- lexical-binding: t; -*- -;;;###if (featurep! +latexmk) - -(def-package! auctex-latexmk - :after latex - :init - ;; Pass the -pdf flag when TeX-PDF-mode is active - (setq auctex-latexmk-inherit-TeX-PDF-mode t) - ;; Set LatexMk as the default - (setq-hook! LaTeX-mode TeX-command-default "LatexMk") - :config - ;; Add latexmk as a TeX target - (auctex-latexmk-setup)) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 52ec92937..a94e75daf 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -18,7 +18,7 @@ (?t . "\\textcite[]{%l}")) reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) - (unless (string-empty-p +latex-bibtex-file) + (unless +latex-bibtex-file (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (map! :map reftex-mode-map :localleader :n ";" 'reftex-toc) @@ -38,7 +38,5 @@ (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) (after! bibtex-completion - (unless (string-empty-p +latex-bibtex-file) + (unless +latex-bibtex-file (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) - - diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index e8e02cf0a..6a92b8c1d 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -3,7 +3,7 @@ (defvar +latex-indent-level-item-continuation 4 "Custom indentation level for items in enumeration-type environments") -(defvar +latex-bibtex-file "" +(defvar +latex-bibtex-file nil "File AUCTeX (specifically RefTeX) uses to search for citations.") (defvar +latex-enable-unicode-math nil @@ -33,10 +33,6 @@ If no viewers are found, `latex-preview-pane' is used.") :mode ("\\.tex\\'" . TeX-latex-mode) :hook (TeX-mode . visual-line-mode) :config - ;; fontify common latex commands - (load! "+fontification") - ;; select viewer - (load! "+viewers") (setq TeX-parse-self t ;; parse on load TeX-auto-save t ;; parse on save ;; use hidden dirs for auctex files @@ -48,28 +44,34 @@ If no viewers are found, `latex-preview-pane' is used.") TeX-source-correlate-start-server nil ;; automatically insert braces after sub/superscript in math mode TeX-electric-sub-and-superscript t) + ;; fontify common latex commands + (load! "+fontification") + ;; select viewer + (load! "+viewers") ;; prompt for master (setq-default TeX-master nil) ;; set-up chktex (setcar (cdr (assoc "Check" TeX-command-list)) "chktex -v6 -H %s") ;; tell emacs how to parse tex files - (add-hook! 'tex-mode-hook (setq ispell-parser 'tex)) + (setq-hook! 'TeX-mode-hook ispell-parser 'tex) + ;; Enable word wrapping + (add-hook 'TeX-mode-hook #'visual-line-mode) + ;; Fold TeX macros + (add-hook 'TeX-mode-hook #'TeX-fold-mode) ;; display output of latex commands in popup (set-popup-rule! " output\\*$" :size 15) ;; Do not prompt for Master files, this allows auto-insert to add templates to ;; .tex files - (add-hook! 'TeX-mode-hook (remove-hook 'find-file-hook - (cl-find-if #'byte-code-function-p find-file-hook) - 'local)) + (add-hook! 'TeX-mode-hook + ;; Necessary because it is added as an anonymous, byte-compiled function + (remove-hook 'find-file-hook + (cl-find-if #'byte-code-function-p find-file-hook) + 'local)) ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) - (add-hook 'TeX-mode-hook #'visual-line-mode) (when (featurep! :feature spellcheck) (add-hook 'TeX-mode-hook #'flyspell-mode :append))) -; Fold TeX macros -(def-package! tex-fold - :hook (TeX-mode . TeX-fold-mode)) (after! latex (setq LaTeX-section-hook ; Add the toc entry to the sectioning hooks. @@ -86,7 +88,7 @@ If no viewers are found, `latex-preview-pane' is used.") (dolist (env '("itemize" "enumerate" "description")) (add-to-list 'LaTeX-indent-environment-list `(,env +latex/LaTeX-indent-item)))) -;; set-up preview package + (def-package! preview :hook (LaTeX-mode . LaTeX-preview-setup) :config @@ -94,6 +96,26 @@ If no viewers are found, `latex-preview-pane' is used.") preview-scale-function (lambda () (* (/ 10.0 (preview-document-pt)) preview-scale)))) + +;; Nicely indent lines that have wrapped when visual line mode is activated +(def-package! adaptive-wrap + :hook (LaTeX-mode . adaptive-wrap-prefix-mode) + :init (setq-default adaptive-wrap-extra-indent 0)) + + +(def-package! auctex-latexmk + :when (featurep! +latexmk) + :after latex + :init + ;; Pass the -pdf flag when TeX-PDF-mode is active + (setq auctex-latexmk-inherit-TeX-PDF-mode t) + ;; Set LatexMk as the default + (setq-hook! LaTeX-mode TeX-command-default "LatexMk") + :config + ;; Add latexmk as a TeX target + (auctex-latexmk-setup)) + + (def-package! company-auctex :when (featurep! :completion company) :defer t @@ -107,17 +129,6 @@ If no viewers are found, `latex-preview-pane' is used.") :init (add-to-list '+latex--company-backends #'+latex-symbols-company-backend nil #'eq)) -;; Nicely indent lines that have wrapped when visual line mode is activated -(def-package! adaptive-wrap - :hook (LaTeX-mode . adaptive-wrap-prefix-mode) - :init (setq-default adaptive-wrap-extra-indent 0)) -;; referencing + bibtex setup +;; bibtex + reftex (load! "+ref") - -;; -;; Sub-modules -;; - -(if (featurep! +latexmk) (load! "+latexmk")) -(if (featurep! +preview-pane) (load! "+preview-pane")) From fb233bd37d2d544d9209156dd8816f5b3b47c366 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 02:53:17 +0200 Subject: [PATCH 2566/4235] completion/helm: fix evil keybinds in helm Evil-mode was disabled in the minibuffer due to odd behavior, causing all helm's evilified keybinds to be inaccessible. --- modules/completion/helm/config.el | 58 ++++++++----------------------- 1 file changed, 15 insertions(+), 43 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 52fc093b1..0b126187a 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -190,56 +190,28 @@ If you want to already use git-grep or grep, set this to nil.") (map! (:after helm :map helm-map - :ni "C-S-p" #'helm-previous-source - :ni "C-S-n" #'helm-next-source - :ni "C-l" #'helm-execute-persistent-action - :ni "C-j" #'helm-next-line - :ni "C-k" #'helm-previous-line - :ni "C-f" #'helm-next-page - :ni "C-b" #'helm-previous-page - :n [tab] #'helm-select-action ; TODO: Ivy has "ga". - :n "[" #'helm-previous-source - :n "]" #'helm-next-source - :n "gk" #'helm-previous-source - :n "gj" #'helm-next-source - :n "(" #'helm-prev-visible-mark - :n ")" #'helm-next-visible-mark - :n "j" #'helm-next-line - :n "k" #'helm-previous-line - :n "gg" #'helm-beginning-of-buffer - :n "G" #'helm-end-of-buffer - :n "/" #'helm-quit-and-find-file - :n "gr" #'helm-refresh - :n "yp" #'helm-yank-selection - :n "yP" #'helm-copy-to-buffer - :n "yy" #'helm-kill-selection-and-quit) + "C-S-p" #'helm-previous-source + "C-S-n" #'helm-next-source + "C-l" #'helm-execute-persistent-action + "C-j" #'helm-next-line + "C-k" #'helm-previous-line + "C-f" #'helm-next-page + "C-u" #'helm-previous-page + [tab] #'helm-select-action) (:after helm-files :map (helm-find-files-map helm-read-file-map) - :n "go" #'helm-ff-run-switch-other-window - :n "/" #'helm-ff-run-find-sh-command - :ni "M-" #'helm-ff-run-switch-other-window - :ni "M-h" #'helm-find-files-up-one-level - :n "=" #'helm-ff-run-ediff-file - :n "%" #'helm-ff-run-query-replace-regexp - :n "D" #'helm-ff-run-delete-file) ; Ivy has "D". + [M-return] #'helm-ff-run-switch-other-window + "M-h" #'helm-find-files-up-one-level) (:after helm-locate :map helm-generic-files-map - :n "go" #'helm-ff-run-switch-other-window - :ni "S-" #'helm-ff-run-switch-other-window) + "S-" #'helm-ff-run-switch-other-window) (:after helm-buffers :map helm-buffer-map - :n "go" #'helm-buffer-switch-other-window - :n "gO" #'display-buffer - :ni "M-" #'helm-buffer-switch-other-window - :ni "" #'display-buffer - :n "=" #'helm-buffer-run-ediff - :n "%" #'helm-buffer-run-query-replace-regexp - :n "D" #'helm-buffer-run-kill-persistent) ; Ivy has "D". + [M-return] #'helm-buffer-switch-other-window + [return] #'display-buffer) (:after helm-regexp :map helm-moccur-map - :n "go" #'helm-moccur-run-goto-line-ow - :ni "M-" #'helm-moccur-run-goto-line-ow) + [M-return] #'helm-moccur-run-goto-line-ow) (:after helm-grep :map helm-grep-map - :n "go" #'helm-grep-run-other-window-action - :ni "M-" #'helm-grep-run-other-window-action))) + [M-return] #'helm-grep-run-other-window-action))) From 16e9957c1afa645ca1c22a70196d17a04a749abe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 03:48:27 +0200 Subject: [PATCH 2567/4235] Don't install/track org from ELPA Prevents duplicate installs of org. --- modules/lang/org/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index cd3eda6e0..b92f94e20 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -3,6 +3,7 @@ ;; Installs a cutting-edge version of org-mode (package! org-plus-contrib) +(package! org :ignore t) ; ignore org from ELPA (package! org-bullets :recipe (:fetcher github :repo "Kaligule/org-bullets")) (package! toc-org) From 7b881c771a2d985fe983c1a7c737b71cf909fcf0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 03:49:37 +0200 Subject: [PATCH 2568/4235] doom-files-in: fix default :match to ignore dotfiles --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index d87a170f7..4406c3627 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -133,7 +133,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (relative-to (unless full default-directory)) (depth 99999) (mindepth 0) - (match "^[^.]")) + (match "/[^.]")) "Returns a list of files/directories in PATH-OR-PATHS (one string path or a list of them). From 824abaf2e6b5468b73111d169f4a8bae6222cb6f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 03:53:52 +0200 Subject: [PATCH 2569/4235] lang/org: alphabetize babel plugins --- modules/lang/org/packages.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index b92f94e20..2bb2260fa 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -22,18 +22,18 @@ (when (featurep! +ipython) (package! ob-ipython)) - (when (featurep! :lang nim) - (package! ob-nim)) (when (featurep! :lang crystal) (package! ob-crystal)) (when (featurep! :lang go) (package! ob-go)) - (when (featurep! :lang rust) - (package! ob-rust)) + (when (featurep! :lang nim) + (package! ob-nim)) + (when (featurep! :lang racket) + (package! ob-racket :recipe (:fetcher github :repo "DEADB17/ob-racket"))) (when (featurep! :lang rest) (package! ob-restclient)) - (when (featurep! :lang racket) - (package! ob-racket :recipe (:fetcher github :repo "DEADB17/ob-racket")))) + (when (featurep! :lang rust) + (package! ob-rust))) (when (featurep! +export) (package! ox-pandoc) From c935f3e4dad01f7688b2aee45fec6b02508177f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 04:04:13 +0200 Subject: [PATCH 2570/4235] lang/org: fix backtab not outdenting items/headers --- modules/lang/org/autoload/org.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index c4a22eec9..11f7ec9f1 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -348,10 +348,15 @@ another level of headings on each invocation." (not (eq evil-state 'insert))) nil) ((org-at-item-p) - (org-indent-item-tree) + (if (eq this-command 'org-shifttab) + (org-outdent-item-tree) + (org-indent-item-tree)) t) ((org-at-heading-p) - (ignore-errors (org-demote)) + (ignore-errors + (if (eq this-command 'org-shifttab) + (org-promote) + (org-demote))) t) ((org-in-src-block-p t) (org-babel-do-in-edit-buffer From cbc59f9333d2f282374ee7d99cb5834b5624aafa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 12:10:11 +0200 Subject: [PATCH 2571/4235] Appease the byte-compiler --- modules/emacs/hideshow/autoload.el | 4 ++-- modules/lang/haskell/autoload.el | 4 ++-- modules/lang/latex/+ref.el | 4 ++-- modules/lang/org/+export.el | 2 +- modules/ui/modeline/autoload/settings.el | 2 +- modules/ui/modeline/config.el | 6 +++--- modules/ui/popup/+hacks.el | 2 +- modules/ui/popup/autoload/popup.el | 1 + modules/ui/pretty-code/autoload.el | 2 +- 9 files changed, 14 insertions(+), 13 deletions(-) diff --git a/modules/emacs/hideshow/autoload.el b/modules/emacs/hideshow/autoload.el index a4f74f83c..3f23e0c4f 100644 --- a/modules/emacs/hideshow/autoload.el +++ b/modules/emacs/hideshow/autoload.el @@ -2,11 +2,11 @@ ;;;###autoload (defun +hideshow-haml-forward-sexp (arg) - (haml-forward-sexp) + (haml-forward-sexp arg) (move-beginning-of-line 1)) ;;;###autoload -(defun +hideshow-forward-block-by-indent (arg) +(defun +hideshow-forward-block-by-indent (_arg) (let ((start (current-indentation))) (forward-line) (unless (= start (current-indentation)) diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el index 92cc42afe..9b66e1ae5 100644 --- a/modules/lang/haskell/autoload.el +++ b/modules/lang/haskell/autoload.el @@ -1,7 +1,7 @@ ;;; lang/haskell/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +haskell-repl-buffer () +(defun +haskell-repl-buffer (arg) "Returns the appropriate Haskell REPL buffer." (if (featurep! +intero) (intero-repl-buffer arg) @@ -11,5 +11,5 @@ (defun +haskell/repl (&optional arg) "Opens a Haskell REPL." (interactive "P") - (display-buffer (+haskell-repl-buffer))) + (display-buffer (+haskell-repl-buffer arg))) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index a94e75daf..83460ca8f 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -18,7 +18,7 @@ (?t . "\\textcite[]{%l}")) reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) - (unless +latex-bibtex-file + (when +latex-bibtex-file (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (map! :map reftex-mode-map :localleader :n ";" 'reftex-toc) @@ -38,5 +38,5 @@ (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) (after! bibtex-completion - (unless +latex-bibtex-file + (when +latex-bibtex-file (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index 0ab06eabc..2386bb463 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -37,7 +37,7 @@ file isn't in `org-directory'." (when (and (not (nth 2 args)) buffer-file-name (file-in-directory-p buffer-file-name org-directory)) - (cl-destructuring-bind (extension &optional subtreep pubdir) args + (cl-destructuring-bind (extension &optional subtreep _pubdir) args (let ((dir (expand-file-name +org-export-dir org-directory))) (unless (file-directory-p dir) (make-directory dir t)) diff --git a/modules/ui/modeline/autoload/settings.el b/modules/ui/modeline/autoload/settings.el index 6adb01b46..26aa59a77 100644 --- a/modules/ui/modeline/autoload/settings.el +++ b/modules/ui/modeline/autoload/settings.el @@ -37,7 +37,7 @@ keep them left and right aligned respectively." (while (keywordp (car body)) (setq body (cddr body))) ;; - (cl-destructuring-bind (&key init faces on-hooks on-set activate deactivate &allow-other-keys) + (cl-destructuring-bind (&key init faces on-hooks on-set &allow-other-keys) rest (let ((realvar (if (and body faces) (intern (format "+modeline--var-%s" name)) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ca5f82011..ec8d57120 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -21,14 +21,14 @@ "The function that returns the buffer name display for file-visiting buffers.") +;; Convenience aliases +(defvaralias 'mode-line-format-left '+modeline-format-left) +(defvaralias 'mode-line-format-right '+modeline-format-right) ;; (defvar-local +modeline-format-left () "TODO") (defvar-local +modeline-format-right () "TODO") (put '+modeline-format-left 'risky-local-variable t) (put '+modeline-format-right 'risky-local-variable t) -;; Convenience aliases -(defvaralias 'mode-line-format-left '+modeline-format-left) -(defvaralias 'mode-line-format-right '+modeline-format-right) ;; externs (defvar anzu--state nil) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 8f43afd73..1c3266159 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -173,7 +173,7 @@ the command buffer." (set-popup-rule! "^\\*helm" :ignore t) ;; Fix left-over popup window when closing persistent help for `helm-M-x' - (defun +popup*helm-elisp--persistent-help (candidate fun &optional name) + (defun +popup*helm-elisp--persistent-help (candidate _fun &optional _name) (let (win) (when (and (helm-attr 'help-running-p) (string= candidate (helm-attr 'help-current-symbol)) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 6b1b11a55..0a72f937a 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -212,6 +212,7 @@ restoring it if `+popup-buffer-mode' is disabled." (let ((m (if (bound-and-true-p +popup-buffer-mode) +popup-margin-width))) (set-window-margins nil m m))))) +(defvar hide-mode-line-format) ;;;###autoload (defun +popup|set-modeline-on-enable () "Don't show modeline in popup windows without a `modeline' window-parameter. diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index bd7a0a3e0..0a336f482 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -92,7 +92,7 @@ Pretty symbols can be unset for emacs-lisp-mode with: (if (null (car-safe rest)) (delq (assq mode +pretty-code-symbols-alist) +pretty-code-symbols-alist) - (let (results merge key alist) + (let (results merge key) (while rest (setq key (pop rest)) (pcase key From e94f1f39f40475185ae0010b54dcd603b84fd6e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 12:21:43 +0200 Subject: [PATCH 2572/4235] Enable evil-collection-(deadgrep|imenu-list) --- modules/feature/evil/+everywhere.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 3076afde7..dba3126ec 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -43,6 +43,7 @@ variable for an explanation of the defaults (in comments). See ;; custom cus-theme daemons + deadgrep debbugs debug diff-mode @@ -73,6 +74,7 @@ variable for an explanation of the defaults (in comments). See ibuffer ;; image image+ + imenu-list indium info ;; ivy From 533cb13a02738b19602554ddeceb3a296c199c65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 12:54:59 +0200 Subject: [PATCH 2573/4235] Append default backends to buffer-local backends --- modules/completion/company/autoload.el | 18 +++++++------ modules/completion/company/config.el | 1 + .../completion/company/test/test-company.el | 27 ++++++++++++------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index ae6fd349b..4981c64d3 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -55,14 +55,16 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; (defun +company--backends () - (or (cl-loop for (mode . rest) in +company-backend-alist - for type = (car rest) - for backends = (cdr rest) - if (or (and (eq type :derived) (derived-mode-p mode)) ; parent modes - (and (eq type :exact) (eq major-mode mode)) ; major modes - (and (boundp mode) (symbol-value mode))) ; minor modes - nconc backends) - (default-value 'company-backends))) + (append (cl-loop for (mode . rest) in +company-backend-alist + for type = (car rest) + for backends = (cdr rest) + if (or (and (eq type :derived) (derived-mode-p mode)) ; parent modes + (and (eq type :exact) + (or (eq major-mode mode) ; major modes + (and (boundp mode) + (symbol-value mode))))) ; minor modes + nconc backends) + (default-value 'company-backends))) ;; diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index b43d136b0..f019ff89a 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -12,6 +12,7 @@ company-require-match 'never company-global-modes '(not comint-mode erc-mode message-mode help-mode gud-mode eshell-mode) + company-backends '(company-dabbrev) company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) diff --git a/modules/completion/company/test/test-company.el b/modules/completion/company/test/test-company.el index a523479be..ed69404b0 100644 --- a/modules/completion/company/test/test-company.el +++ b/modules/completion/company/test/test-company.el @@ -23,26 +23,33 @@ ;; (it "sets backends for a major mode" (set-company-backend! 'text-mode 'a) - (expect (backends 'text-mode) :to-equal '(a))) + (expect (backends 'text-mode) :to-equal '(a t))) (it "sets backends for a derived-mode" (set-company-backend! :derived 'prog-mode 'a) - (expect (backends 'prog-mode) :to-equal '(a)) - (expect (backends 'emacs-lisp-mode) :to-equal '(a))) + (expect (backends 'prog-mode) :to-equal '(a t)) + (expect (backends 'emacs-lisp-mode) :to-equal '(a t))) (it "sets multiple backends for exact major modes" (set-company-backend! '(text-mode emacs-lisp-mode) 'a 'b) (expect (backends 'text-mode) :to-equal (backends 'emacs-lisp-mode))) (it "sets cumulative backends" - (set-company-backend! :derived 'prog-mode 'a) - (set-company-backend! 'emacs-lisp-mode 'b) - (expect (backends 'emacs-lisp-mode) :to-equal '(b a))) + (set-company-backend! :derived 'prog-mode '(a b c)) + (set-company-backend! 'emacs-lisp-mode 'd 'e) + (expect (backends 'emacs-lisp-mode) :to-equal '(d e (a b c) t))) + + (it "sets cumulative backends with a minor mode" + (set-company-backend! :derived 'prog-mode '(a b c)) + (set-company-backend! 'emacs-lisp-mode 'd 'e) + (set-company-backend! 'some-minor-mode 'x 'y) + (setq-local some-minor-mode t) + (expect (backends 'emacs-lisp-mode) :to-equal '(x y d e (a b c) t))) (it "overwrites past backends" (set-company-backend! 'text-mode 'old 'backends) (set-company-backend! 'text-mode 'new 'backends) - (expect (backends 'text-mode) :to-equal '(new backends))) + (expect (backends 'text-mode) :to-equal '(new backends t))) (it "unsets past backends" (set-company-backend! 'text-mode 'old) @@ -53,16 +60,16 @@ (set-company-backend! :derived 'prog-mode 'old) (set-company-backend! 'emacs-lisp-mode 'child) (set-company-backend! :derived 'prog-mode nil) - (expect (backends 'emacs-lisp-mode) :to-equal '(child))) + (expect (backends 'emacs-lisp-mode) :to-equal '(child t))) (it "overwrites past cumulative backends" (set-company-backend! :derived 'prog-mode 'base) (set-company-backend! 'emacs-lisp-mode 'old) (set-company-backend! 'emacs-lisp-mode 'new) - (expect (backends 'emacs-lisp-mode) :to-equal '(new base))) + (expect (backends 'emacs-lisp-mode) :to-equal '(new base t))) (it "overwrites past parent backends" (set-company-backend! :derived 'prog-mode 'base) (set-company-backend! 'emacs-lisp-mode 'child) (set-company-backend! :derived 'prog-mode 'new) - (expect (backends 'emacs-lisp-mode) :to-equal '(child new))))) + (expect (backends 'emacs-lisp-mode) :to-equal '(child new t))))) From b2b8d5d26061831e1902aa2aacf2a139f201120c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 13:05:02 +0200 Subject: [PATCH 2574/4235] Fix company-backends circular-list error in latex --- modules/completion/company/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 4981c64d3..669ddd51f 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -63,7 +63,7 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to (or (eq major-mode mode) ; major modes (and (boundp mode) (symbol-value mode))))) ; minor modes - nconc backends) + append backends) (default-value 'company-backends))) From 71e71b9b83919123fe01d5ebbf00d4ef36dc5250 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 13:08:52 +0200 Subject: [PATCH 2575/4235] Revert fe3a73c1: remap newline instead of binding RET --- modules/config/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 099fb50dd..6b544743f 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -15,8 +15,8 @@ :nmvo doom-localleader-key nil ;; Swap RET/C-j in insert mode - :gi "RET" #'newline-and-indent - :i "C-j" #'+default/newline + :i [remap newline] #'newline-and-indent + :i "C-j" #'+default/newline ;; --- Global keybindings --------------------------- ;; Make M-x available everywhere From 78d14b0439c89366209127284186693b17c48ec9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 13:19:15 +0200 Subject: [PATCH 2576/4235] Add after-delete-frame-functions to elisp variables --- modules/lang/emacs-lisp/+symbols.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/emacs-lisp/+symbols.el b/modules/lang/emacs-lisp/+symbols.el index 9ec39578e..912bde316 100644 --- a/modules/lang/emacs-lisp/+symbols.el +++ b/modules/lang/emacs-lisp/+symbols.el @@ -427,8 +427,8 @@ all functions that's not command, macro, special forms.)") "debug-on-message" "enable-multibyte-characters" "char-property-alias-alist" "default-text-properties" "wrap-prefix" "line-prefix" "register-alist" "cursor-type" "before-make-frame-hook" "after-make-frame-functions" - "frame-inherited-parameters" "buffer-list-update-hook" - "overlay-arrow-string" "overlay-arrow-position" + "after-delete-frame-functions" "frame-inherited-parameters" + "buffer-list-update-hook" "overlay-arrow-string" "overlay-arrow-position" "overlay-arrow-variable-list" "inhibit-message" "before-init-hook" "after-init-hook" "emacs-startup-hook" "window-setup-hook" "user-init-file" "user-emacs-directory" "image-format-suffixes" "mouse-position-function" From c2d5b647904ed47c6246d77b9367b54549fe75e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 13:53:36 +0200 Subject: [PATCH 2577/4235] Fix broken frame creation/deletion (+ emacsclient) Caused by a void-function error due to an incorrectly named function. --- core/core-ui.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 8d5f6edf8..3229c7f07 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -492,19 +492,17 @@ frame's window-system, the theme will be reloaded.") ;; ;; There will still be issues with simultaneous gui and terminal (emacsclient) ;; frames, however. There's always `doom/reload-theme' if you need it! -(defun doom|reload-theme-in-frame (frame) +(defun doom|reload-theme-in-frame-maybe (frame) "Reloads the theme in new daemon or tty frames." (when (and (framep frame) (not (eq doom-last-window-system (framep-on-display frame)))) (with-selected-frame frame - (doom|init-theme)) + (load-theme doom-theme t)) (setq doom-last-window-system (framep-on-display frame)))) (defun doom|reload-theme-maybe (_frame) "Reloads the theme after closing the last frame of a type." - (unless (cl-loop for fr in (frame-list) - if (eq doom-last-window-system (framep-on-display fr)) - return t) + (unless (cl-find doom-last-window-system (frame-list) :key #'framep-on-display) (setq doom-last-window-system nil) (doom|reload-theme-in-frame (selected-frame)))) From 1211c2c7f75ab561f6375dbc9eede82451d923e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:00:35 +0200 Subject: [PATCH 2578/4235] Fix incorrectly rendered icons in modeline #773 And possibly fix bytecomp warnings about unused lexical variables. --- modules/ui/doom-modeline/config.el | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index b91676caf..6f0bff15f 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -1,7 +1,5 @@ ;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- - - ;; ;; Modeline library ;; @@ -36,7 +34,7 @@ (push seg forms)) ((symbolp seg) (cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) - (push (list :eval (list it)) forms)) + (push (list it) forms)) ((setq it (cdr (assq seg doom--modeline-var-alist))) (push it forms)) ((error "%s is not a defined segment" seg)))) @@ -58,20 +56,21 @@ Example: (rhs-forms (doom--prepare-modeline-segments rhs))) (defalias sym (lambda () - (let ((rhs-str (format-mode-line rhs-forms))) - (list lhs-forms - (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(+ 1 (string-width rhs-str)))))) - rhs-str))) + (let ((lhs (eval `(list ,@lhs-forms) t)) + (rhs (eval `(list ,@rhs-forms) t))) + (let ((rhs-str (format-mode-line rhs))) + (list lhs + (propertize + " " 'display + `((space :align-to (- (+ right right-fringe right-margin) + ,(+ 1 (string-width rhs-str)))))) + rhs-str)))) (concat "Modeline:\n" (format " %s\n %s" (prin1-to-string lhs) (prin1-to-string rhs)))) - (unless (bound-and-true-p byte-compile-current-file) - (let (byte-compile-warnings) - (byte-compile sym))))) + (let (byte-compile-warnings) + (byte-compile sym)))) (defun doom-modeline (key) "Returns a mode-line configuration associated with KEY (a symbol). Throws an @@ -265,7 +264,7 @@ file-name => comint.el") ;; Modeline helpers ;; -(defsubst active () +(defun active () (eq (selected-window) +doom-modeline-current-window)) (defun +doom-modeline--make-xpm (face width height) From a820bbd46838170777eb518fff17ef374628cd9b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:02:06 +0200 Subject: [PATCH 2579/4235] lang/common-lisp: fix sly version mismatch prompts Caused by the perfect storm of Emacs, Doom and Sly decision choices, this prevents the mismatched sly version prompts each time you start up sly/lisp-mode. --- modules/lang/common-lisp/config.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index c3b84a961..eac1e33c2 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -34,6 +34,16 @@ inferior-lisp-program)))) (add-hook 'sly-mode-hook #'+common-lisp|init-sly) + (defun +common-lisp*refresh-sly-version (version conn) + "Update `sly-protocol-version', which will likely be incorrect or nil due to +an issue where `load-file-name' is incorrect. Because Doom's packages are +installed through an external script (bin/doom), `load-file-name' is set to +bin/doom while packages at compile-time (not a runtime though)." + (unless sly-protocol-version + (setq sly-protocol-version (sly-version nil (locate-library "sly.el")))) + (advice-remove #'sly-check-version #'+common-lisp*refresh-sly-version)) + (advice-add #'sly-check-version :before #'+common-lisp*refresh-sly-version) + ;; evil integration (when (featurep! :feature evil +everywhere) (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps) From b846a40af4438d6ff1f9847bef23845735ce902c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:03:34 +0200 Subject: [PATCH 2580/4235] Remove unused letvar, spec --- modules/lang/org/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index f11ac9f46..eefa0f93d 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -364,7 +364,6 @@ conditions where a window's buffer hasn't changed at the time this hook is run." (cl-loop with i = -1 for seg in (delq nil path) for face = (nth (% (cl-incf i) org-n-level-faces) org-level-faces) - for spec = (face-all-attributes face) collect (propertize (replace-regexp-in-string "[ \t]+\\'" "" seg) 'face (if face `(:foreground ,(face-foreground face))))) separator)))) From 45e1b371e6e7bd21d07ef0ef4db3f7138ec1e986 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:04:27 +0200 Subject: [PATCH 2581/4235] Add after-load-alist to elisp variables --- modules/lang/emacs-lisp/+symbols.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/lang/emacs-lisp/+symbols.el b/modules/lang/emacs-lisp/+symbols.el index 912bde316..583379f33 100644 --- a/modules/lang/emacs-lisp/+symbols.el +++ b/modules/lang/emacs-lisp/+symbols.el @@ -447,13 +447,13 @@ all functions that's not command, macro, special forms.)") "print-quoted" "print-escape-newlines" "print-escape-nonascii" "print-escape-multibyte" "print-length" "print-level" "print-circle" "print-gensym" "print-continuous-numbering" "print-number-table" - "float-output-format" "after-load-functions" "text-quoting-style" - "minibuffer-setup-hook" "minibuffer-exit-hook" "minibuffer-help-form" - "minibuffer-scroll-window" "last-command" "real-last-command" - "last-repeatable-command" "this-command" "this-original-command" - "last-nonmenu-event" "last-command-event" "last-event-frame" - "disable-point-adjustment" "global-disable-point-adjustment" - "standard-translation-table-for-decode" + "float-output-format" "after-load-alist" "after-load-functions" + "text-quoting-style" "minibuffer-setup-hook" "minibuffer-exit-hook" + "minibuffer-help-form" "minibuffer-scroll-window" "last-command" + "real-last-command" "last-repeatable-command" "this-command" + "this-original-command" "last-nonmenu-event" "last-command-event" + "last-event-frame" "disable-point-adjustment" + "global-disable-point-adjustment" "standard-translation-table-for-decode" "standard-translation-table-for-encode" "translation-table-for-input" "minibuffer-allow-text-properties" "minibuffer-local-map" "minibuffer-local-ns-map" "process-connection-type" From 59f869bf5e93ed76d46c77e6793765d8bef42147 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:06:43 +0200 Subject: [PATCH 2582/4235] ui/modeline: update comments & benchmarks --- modules/ui/modeline/config.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ec8d57120..49e0f7566 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -1,18 +1,17 @@ ;;; ui/modeline/config.el -*- lexical-binding: t; -*- -;; This mode-line is experimental, may have bugs and is likely to change. It -;; also doesn't have all the features of the old modeline (yet). +;; This mode-line is experimental, Emacs 26+ only, may have buggy and is likely +;; to change. It also isn't feature complete, compared to :ui doom-modeline, but +;; it will eventually replace it. ;; -;; However, it is at least twice as fast as the original modeline, and a little -;; more flexible, what with `+modeline-format-left' and -;; `+modeline-format-right'. It also exposes a more powerful API for defining -;; modelines and modeline segments that make use of variable watchers and hooks -;; to update them. +;; However, it is at least ten times faster than the original modeline, and more +;; flexible, what with `+modeline-format-left', `+modeline-format-right', and a +;; more powerful API for defining modelines and modeline segments. ;;;; Benchmarks ;; (benchmark-run 1000 (format-mode-line mode-line-format)) -;; Old system: ~0.198 -;; New system: ~0.056 +;; Old system: ~0.563 - 0.604 +;; New system: ~0.036 - 0.061 (defvar +modeline-height 21 "How tall the mode-line should be (only respected in GUI emacs).") From 70e0280db39b1ee8f2f4184b21c03260210392f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:39:15 +0200 Subject: [PATCH 2583/4235] Don't byte-compile modeline format functions Fixes unused lexical arg warnings when starting up. --- modules/ui/doom-modeline/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 6f0bff15f..81c5cd9cb 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -68,9 +68,7 @@ Example: (concat "Modeline:\n" (format " %s\n %s" (prin1-to-string lhs) - (prin1-to-string rhs)))) - (let (byte-compile-warnings) - (byte-compile sym)))) + (prin1-to-string rhs)))))) (defun doom-modeline (key) "Returns a mode-line configuration associated with KEY (a symbol). Throws an From 9570670eb18507b2b3e996c35b00a2aa7bf2d6df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 30 Jul 2018 23:53:05 +0200 Subject: [PATCH 2584/4235] featurep!: refactor & fix three-arg usecase Now (featurep! :category module +flag) will work properly check for +flag rather than just returning t if :category module were enabled. Also update variables to match category-module nomenclature. --- core/core-modules.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index e54a256ad..f955bed42 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -356,9 +356,9 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (warn 'doom-modules :warning "Couldn't find module '%s %s'" ,category ',module)))) -(defmacro featurep! (module &optional submodule flag) - "Returns t if MODULE SUBMODULE is enabled. If FLAG is provided, returns t if -MODULE SUBMODULE has FLAG enabled. +(defmacro featurep! (category &optional module flag) + "Returns t if CATEGORY MODULE is enabled. If FLAG is provided, returns t if +CATEGORY MODULE has FLAG enabled. (featurep! :config default) @@ -367,16 +367,17 @@ Module FLAGs are set in your config's `doom!' block, typically in :config (default +flag1 -flag2) -When this macro is used from inside a module, MODULE and SUBMODULE can be +When this macro is used from inside a module, CATEGORY and MODULE can be omitted. eg. (featurep! +flag1)" - (and (cond (submodule (doom-module-p module submodule)) - (doom--current-flags (memq module doom--current-flags)) + (and (cond (flag (memq flag (doom-module-get category module :flags))) + (module (doom-module-p category module)) + (doom--current-flags (memq category doom--current-flags)) ((let ((module-pair (or doom--current-module (doom-module-from-path (FILE!))))) (unless module-pair (error "featurep! couldn't detect what module its in! (in %s)" (FILE!))) - (memq module (doom-module-get (car module-pair) (cdr module-pair) :flags))))) + (memq category (doom-module-get (car module-pair) (cdr module-pair) :flags))))) t)) From 9f074a1aa3f781974db9f5f9b8beb00d9313ac91 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 03:48:45 +0200 Subject: [PATCH 2585/4235] Add option to enable extra elisp fontification --- modules/lang/emacs-lisp/config.el | 35 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 41c2dff66..67af58f9d 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,5 +1,14 @@ ;;; lang/emacs-lisp/config.el -*- lexical-binding: t; -*- +(defvar +emacs-lisp-enable-extra-fontification t + "If non-nil, fontify built-in functions and variables especially (symbols +defined by Emacs, not Doom or packages). This can help make typos stand out.") + + +;; +;; elisp-mode deferral hack +;; + ;; `elisp-mode' is loaded at startup. In order to lazy load its config we need ;; to pretend it isn't loaded (delq 'elisp-mode features) @@ -50,21 +59,23 @@ ;; initialization +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) - ;; Improve elisp fontification - (load! "+symbols") + ;; Special fontification for doom (font-lock-add-keywords 'emacs-lisp-mode - `(;; Highlight custom Doom cookies + `(;; custom Doom cookies ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; Highlight doom/module functions - ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 'font-lock-keyword-face)) - ;; Highlight symbols in standard library - ;; (,(regexp-opt +emacs-lisp-macro-list 'symbols) . font-lock-builtin-face) - (,(regexp-opt +emacs-lisp-function-list 'symbols) . font-lock-function-name-face) - (,(regexp-opt +emacs-lisp-command-list 'symbols) . font-lock-function-name-face) - ;; (,(regexp-opt +emacs-lisp-special-form-list 'symbols) . font-lock-keyword-face) - (,(regexp-opt +emacs-lisp-variable-list 'symbols) . font-lock-variable-name-face) - (,(regexp-opt +emacs-lisp-option-list 'symbols) . font-lock-variable-name-face))) + ;; doom/module functions + ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 'font-lock-keyword-face)))) + + ;; Highlight symbols in standard library + (when +emacs-lisp-enable-extra-fontification + (load! "+symbols") + (font-lock-add-keywords + 'emacs-lisp-mode + `((,(concat "\\(?:(\\|#'\\)" (regexp-opt +emacs-lisp-function-list t) "\\_>") (1 'font-lock-function-name-face)) + (,(concat "\\(?:(\\|#'\\)" (regexp-opt +emacs-lisp-command-list t) "\\_>") (1 'font-lock-function-name-face)) + (,(regexp-opt +emacs-lisp-variable-list 'symbols) . font-lock-variable-name-face) + (,(regexp-opt +emacs-lisp-option-list 'symbols) . font-lock-variable-name-face)))) (defun +emacs-lisp|init-imenu () "Improve imenu support with better expression regexps and Doom-specific forms." From 85af18a04d6fb30d3ddc0f1beab957ae73989fa1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 03:53:14 +0200 Subject: [PATCH 2586/4235] lang/emacs-lisp/+symbols: reformat & update Removed some special forms (provide, require, and defalias) --- modules/lang/emacs-lisp/+symbols.el | 3186 ++++++++++++++++++++------- 1 file changed, 2415 insertions(+), 771 deletions(-) diff --git a/modules/lang/emacs-lisp/+symbols.el b/modules/lang/emacs-lisp/+symbols.el index 583379f33..28b688393 100644 --- a/modules/lang/emacs-lisp/+symbols.el +++ b/modules/lang/emacs-lisp/+symbols.el @@ -4,785 +4,2429 @@ ;; TODO derive these dynamically (defvar +emacs-lisp-function-list - '("mouse-on-link-p" "macrop" "run-hooks" "run-hook-with-args" - "run-hook-with-args-until-failure" "run-hook-with-args-until-success" - "define-fringe-bitmap" "destroy-fringe-bitmap" "set-fringe-bitmap-face" - "file-name-directory" "file-name-nondirectory" "file-name-sans-versions" - "file-name-extension" "file-name-sans-extension" "file-name-base" - "buffer-file-name" "get-file-buffer" "find-buffer-visiting" "make-xwidget" - "xwidgetp" "xwidget-plist" "set-xwidget-plist" "xwidget-buffer" - "get-buffer-xwidgets" "xwidget-webkit-goto-uri" - "xwidget-webkit-execute-script" "xwidget-webkit-execute-script-rv" - "xwidget-webkit-get-title" "xwidget-resize" "xwidget-size-request" - "xwidget-info" "set-xwidget-query-on-exit-flag" "xwidget-query-on-exit-flag" - "split-window" "window-total-height" "window-total-width" - "window-total-size" "window-pixel-height" "window-pixel-width" - "window-full-height-p" "window-full-width-p" "window-body-height" - "window-body-width" "window-body-size" "window-mode-line-height" - "window-header-line-height" "window-max-chars-per-line" "window-min-size" - "window-edges" "window-body-edges" "window-at" "coordinates-in-window-p" - "window-pixel-edges" "window-body-pixel-edges" "window-absolute-pixel-edges" - "window-absolute-body-pixel-edges" "window-absolute-pixel-position" - "buffer-modified-p" "set-buffer-modified-p" "restore-buffer-modified-p" - "buffer-modified-tick" "buffer-chars-modified-tick" "decode-time" - "encode-time" "marker-position" "marker-buffer" - "create-fontset-from-fontset-spec" "set-fontset-font" "char-displayable-p" - "custom-add-frequent-value" "custom-reevaluate-setting" "custom-variable-p" - "custom-theme-set-variables" "custom-theme-set-faces" "custom-theme-p" - "add-to-list" "add-to-ordered-list" "sin" "cos" "tan" "asin" "acos" "atan" - "exp" "log" "expt" "sqrt" "get-char-code-property" - "char-code-property-description" "put-char-code-property" - "prepare-change-group" "activate-change-group" "accept-change-group" - "cancel-change-group" "active-minibuffer-window" "minibuffer-window" - "set-minibuffer-window" "window-minibuffer-p" "minibuffer-window-active-p" - "define-category" "category-docstring" "get-unused-category" - "category-table" "category-table-p" "standard-category-table" - "copy-category-table" "set-category-table" "make-category-table" - "make-category-set" "char-category-set" "category-set-mnemonics" - "modify-category-entry" "memory-limit" "memory-use-counts" "memory-info" - "smie-rule-bolp" "smie-rule-hanging-p" "smie-rule-next-p" "smie-rule-prev-p" - "smie-rule-parent-p" "smie-rule-sibling-p" "smie-rule-parent" - "smie-rule-separator" "lookup-key" "local-key-binding" "global-key-binding" - "minor-mode-key-binding" "user-ptrp" "gui-get-selection" "point" "point-min" - "point-max" "buffer-end" "buffer-size" "foo" "add-to-history" "car" "cdr" - "car-safe" "cdr-safe" "nth" "nthcdr" "last" "safe-length" "caar" "cadr" - "cdar" "cddr" "butlast" "nbutlast" "macroexpand" "macroexpand-all" - "string-to-syntax" "syntax-after" "syntax-class" "make-finalizer" "unsafep" - "set-buffer-multibyte" "string-as-unibyte" "string-as-multibyte" - "tabulated-list-init-header" "tabulated-list-print" "ffloor" "fceiling" - "ftruncate" "fround" "assoc" "rassoc" "assq" "alist-get" "rassq" - "assoc-default" "copy-alist" "assq-delete-all" "rassq-delete-all" - "make-serial-process" "serial-process-configure" "make-temp-file" - "make-temp-name" "current-time-zone" "key-description" - "single-key-description" "text-char-description" "vectorp" "vector" - "make-vector" "vconcat" "create-file-buffer" "after-find-file" - "buffer-live-p" "transpose-regions" "number-to-string" "string-to-number" - "char-to-string" "string-to-char" "makunbound" "boundp" "consp" "atom" - "listp" "nlistp" "null" "buffer-base-buffer" "charsetp" - "charset-priority-list" "set-charset-priority" "char-charset" - "charset-plist" "put-charset-property" "get-charset-property" "decode-char" - "encode-char" "map-charset-chars" "x-list-fonts" "x-family-fonts" - "momentary-string-display" "frame-char-height" "frame-char-width" - "abbrev-symbol" "abbrev-expansion" "abbrev-insert" "setcdr" - "fill-context-prefix" "position-bytes" "byte-to-position" - "bufferpos-to-filepos" "filepos-to-bufferpos" "multibyte-string-p" - "string-bytes" "unibyte-string" "split-window-sensibly" "same-window-p" - "get-text-property" "get-char-property" "get-pos-property" - "get-char-property-and-overlay" "text-properties-at" "color-defined-p" - "defined-colors" "color-supported-p" "color-gray-p" "color-values" - "scroll-bar-event-ratio" "scroll-bar-scale" "get-register" "set-register" - "register-read-with-preview" "button-start" "button-end" "button-get" - "button-put" "button-activate" "button-label" "button-type" - "button-has-type-p" "button-at" "button-type-put" "button-type-get" - "button-type-subtype-p" "buffer-list" "other-buffer" "last-buffer" - "current-frame-configuration" "set-frame-configuration" "funcall" "apply" - "apply-partially" "identity" "ignore" "file-name-as-directory" - "directory-name-p" "directory-file-name" "abbreviate-file-name" - "delete-and-extract-region" "map-y-or-n-p" "message" "message-or-box" - "message-box" "display-message-or-buffer" "current-message" "ding" "beep" - "x-popup-dialog" "network-interface-list" "network-interface-info" - "format-network-address" "floatp" "integerp" "numberp" "natnump" "zerop" - "imagemagick-types" "completion-table-dynamic" "completion-table-with-cache" - "mouse-position" "set-mouse-position" "mouse-pixel-position" - "set-mouse-pixel-position" "mouse-absolute-pixel-position" - "set-mouse-absolute-pixel-position" "frame-pointer-visible-p" - "tool-bar-add-item" "tool-bar-add-item-from-menu" - "tool-bar-local-item-from-menu" "send-string-to-terminal" - "insert-and-inherit" "insert-before-markers-and-inherit" "completing-read" - "minibuffer-prompt" "minibuffer-prompt-end" "minibuffer-prompt-width" - "minibuffer-contents" "minibuffer-contents-no-properties" "windowp" - "window-live-p" "window-valid-p" "selected-window" "selected-window-group" - "window-resizable" "window-resize" "adjust-window-trailing-edge" - "edebug-trace" "frame-live-p" "window-frame" "window-list" - "frame-root-window" "window-parent" "window-top-child" "window-left-child" - "window-child" "window-combined-p" "window-next-sibling" - "window-prev-sibling" "frame-first-window" "window-in-direction" - "window-tree" "tty-top-frame" "font-family-list" "bitmap-spec-p" - "region-beginning" "region-end" "use-region-p" "default-value" - "default-boundp" "set-default" "put-text-property" "add-text-properties" - "remove-text-properties" "remove-list-of-text-properties" - "set-text-properties" "add-face-text-property" "propertize" "not" "error" - "signal" "user-error" "set-marker" "move-marker" "frame-current-scroll-bars" - "frame-scroll-bar-width" "frame-scroll-bar-height" "set-window-scroll-bars" - "window-scroll-bars" "window-current-scroll-bars" "window-scroll-bar-width" - "window-scroll-bar-height" "window-hscroll" "set-window-hscroll" - "create-image" "find-image" "image-load-path-for-library" "make-byte-code" - "field-beginning" "field-end" "field-string" "field-string-no-properties" - "delete-field" "constrain-to-field" "insert-for-yank" - "insert-buffer-substring-as-yank" "get-internal-run-time" "eq" "equal" - "equal-including-properties" "define-package" "print" "princ" "prin1" - "terpri" "write-char" "pp" "set-process-sentinel" "process-sentinel" - "waiting-for-user-input-p" "make-char-table" "char-table-p" - "char-table-subtype" "char-table-parent" "set-char-table-parent" - "char-table-extra-slot" "set-char-table-extra-slot" "char-table-range" - "set-char-table-range" "map-char-table" "string-match" "string-match-p" - "looking-at" "looking-back" "looking-at-p" "make-syntax-table" - "copy-syntax-table" "char-syntax" "set-syntax-table" "syntax-table" - "face-remap-add-relative" "face-remap-remove-relative" "face-remap-set-base" - "face-remap-reset-base" "keymap-parent" "set-keymap-parent" - "make-composed-keymap" "define-key" "substitute-key-definition" - "suppress-keymap" "plist-get" "plist-put" "lax-plist-get" "lax-plist-put" - "plist-member" "libxml-parse-html-region" "shr-insert-document" - "libxml-parse-xml-region" "recenter-window-group" "called-interactively-p" - "keywordp" "compare-buffer-substrings" "notifications-notify" - "notifications-close-notification" "notifications-get-capabilities" - "notifications-get-server-information" "sequencep" "length" "elt" - "copy-sequence" "reverse" "nreverse" "sort" "seq-elt" "seq-length" "seqp" - "seq-drop" "seq-take" "seq-take-while" "seq-drop-while" "seq-do" "seq-map" - "seq-mapn" "seq-filter" "seq-remove" "seq-reduce" "seq-some" "seq-find" - "seq-every-p" "seq-empty-p" "seq-count" "seq-sort" "seq-contains" - "seq-position" "seq-uniq" "seq-subseq" "seq-concatenate" "seq-mapcat" - "seq-partition" "seq-intersection" "seq-difference" "seq-group-by" - "seq-into" "seq-min" "seq-max" "stringp" "string-or-null-p" - "char-or-string-p" "ewoc-create" "ewoc-buffer" "ewoc-get-hf" "ewoc-set-hf" - "ewoc-enter-first" "ewoc-enter-last" "ewoc-enter-before" "ewoc-enter-after" - "ewoc-prev" "ewoc-next" "ewoc-nth" "ewoc-data" "ewoc-set-data" "ewoc-locate" - "ewoc-location" "ewoc-goto-prev" "ewoc-goto-next" "ewoc-goto-node" - "ewoc-refresh" "ewoc-invalidate" "ewoc-delete" "ewoc-filter" "ewoc-collect" - "ewoc-map" "indirect-function" "set-network-process-option" "face-spec-set" - "substitute-command-keys" "make-progress-reporter" - "progress-reporter-update" "progress-reporter-force-update" - "progress-reporter-done" "current-buffer" "set-buffer" "minibufferp" - "minibuffer-selected-window" "minibuffer-message" "this-command-keys" - "this-command-keys-vector" "clear-this-command-keys" "markerp" - "integer-or-marker-p" "number-or-marker-p" "make-translation-table" - "make-translation-table-from-vector" "make-translation-table-from-alist" - "sit-for" "sleep-for" "read-from-minibuffer" "read-string" "read-regexp" - "read-no-blanks-input" "frame-visible-p" "make-process" "make-pipe-process" - "start-process" "start-file-process" "start-process-shell-command" - "start-file-process-shell-command" "find-file-name-handler" - "file-local-copy" "file-remote-p" "unhandled-file-name-directory" - "match-data" "set-match-data" "overlay-get" "overlay-put" - "overlay-properties" "file-name-absolute-p" "file-relative-name" - "hack-dir-local-variables" "hack-dir-local-variables-non-file-buffer" - "dir-locals-set-class-variables" "dir-locals-set-directory-class" - "make-button" "insert-button" "make-text-button" "insert-text-button" - "insert-image" "insert-sliced-image" "put-image" "remove-images" - "image-size" "insert-file-contents" "insert-file-contents-literally" - "format" "format-message" "run-mode-hooks" "cl-call-next-method" - "cl-next-method-p" "char-equal" "string-equal" "string-collate-equalp" - "string-prefix-p" "string-suffix-p" "string-lessp" "string-greaterp" - "string-collate-lessp" "compare-strings" "assoc-string" - "display-popup-menus-p" "display-graphic-p" "display-mouse-p" - "display-color-p" "display-grayscale-p" "display-supports-face-attributes-p" - "display-selections-p" "display-images-p" "display-screens" - "display-pixel-height" "display-pixel-width" "display-mm-height" - "display-mm-width" "display-backing-store" "display-save-under" - "display-planes" "display-visual-class" "display-color-cells" - "x-server-version" "x-server-vendor" "define-prefix-command" "insert" - "insert-before-markers" "insert-buffer-substring" - "insert-buffer-substring-no-properties" "replace-match" - "match-substitute-replacement" "set-input-mode" "current-input-mode" - "tty-color-define" "tty-color-clear" "tty-color-alist" - "tty-color-approximate" "tty-color-translate" "call-process" "process-file" - "call-process-region" "call-process-shell-command" - "process-file-shell-command" "shell-command-to-string" "process-lines" - "current-kill" "kill-new" "kill-append" "symbol-function" "fboundp" - "fmakunbound" "fset" "hack-local-variables" "safe-local-variable-p" - "risky-local-variable-p" "keymapp" "select-safe-coding-system" - "read-coding-system" "read-non-nil-coding-system" "current-time-string" - "current-time" "float-time" "seconds-to-time" "set-default-file-modes" - "default-file-modes" "read-file-modes" "file-modes-symbolic-to-number" - "set-file-times" "set-file-extended-attributes" "set-file-selinux-context" - "set-file-acl" "current-left-margin" "current-fill-column" - "delete-to-left-margin" "indent-to-left-margin" "sort-subr" - "backup-file-name-p" "make-backup-file-name" "find-backup-file-name" - "file-newest-backup" "locate-user-emacs-file" "convert-standard-filename" - "add-hook" "remove-hook" "error-message-string" "window-point" - "set-window-point" "quit-restore-window" "x-parse-geometry" "process-list" - "get-process" "process-command" "process-contact" "process-id" - "process-name" "process-status" "process-live-p" "process-type" - "process-exit-status" "process-tty-name" "process-coding-system" - "set-process-coding-system" "process-get" "process-put" "process-plist" - "set-process-plist" "keyboard-translate" "execute-kbd-macro" "date-to-time" - "format-time-string" "format-seconds" "make-ring" "ring-p" "ring-size" - "ring-length" "ring-elements" "ring-copy" "ring-empty-p" "ring-ref" - "ring-insert" "ring-remove" "ring-insert-at-beginning" - "set-window-combination-limit" "window-combination-limit" "regexp-quote" - "regexp-opt" "regexp-opt-depth" "regexp-opt-charset" "provide" "require" - "featurep" "backup-buffer" "event-modifiers" "event-basic-type" - "mouse-movement-p" "event-convert-list" "read-key-sequence" - "read-key-sequence-vector" "file-truename" "file-chase-links" "file-equal-p" - "file-in-directory-p" "eval" "frame-parameter" "frame-parameters" - "modify-frame-parameters" "set-frame-parameter" - "modify-all-frames-parameters" "process-datagram-address" - "set-process-datagram-address" "current-window-configuration" - "set-window-configuration" "window-configuration-p" - "compare-window-configurations" "window-configuration-frame" - "window-state-get" "window-state-put" "charset-after" "find-charset-region" - "find-charset-string" "abbrev-table-put" "abbrev-table-get" - "coding-system-list" "coding-system-p" "check-coding-system" - "coding-system-eol-type" "coding-system-change-eol-conversion" - "coding-system-change-text-conversion" "find-coding-systems-region" - "find-coding-systems-string" "find-coding-systems-for-charsets" - "check-coding-systems-region" "detect-coding-region" "detect-coding-string" - "coding-system-charset-list" "iter-next" "iter-close" "locate-file" - "executable-find" "symbol-name" "make-symbol" "intern" "intern-soft" - "mapatoms" "unintern" "current-column" "special-variable-p" - "accessible-keymaps" "map-keymap" "where-is-internal" "window-display-table" - "set-window-display-table" "redisplay" "force-window-update" "window-start" - "window-group-start" "window-end" "window-group-end" "set-window-start" - "set-window-group-start" "pos-visible-in-window-p" - "pos-visible-in-window-group-p" "window-line-height" "fringe-bitmaps-at-pos" - "buffer-name" "get-buffer" "generate-new-buffer-name" "jit-lock-register" - "jit-lock-unregister" "file-notify-add-watch" "file-notify-rm-watch" - "file-notify-valid-p" "local-variable-p" "local-variable-if-set-p" - "buffer-local-value" "buffer-local-variables" "kill-all-local-variables" - "eventp" "skip-chars-forward" "skip-chars-backward" "window-parameter" - "window-parameters" "set-window-parameter" "recent-keys" - "terminal-parameters" "terminal-parameter" "set-terminal-parameter" "memq" - "delq" "remq" "memql" "member" "delete" "remove" "member-ignore-case" - "delete-dups" "parse-partial-sexp" "get-buffer-create" "generate-new-buffer" - "current-global-map" "current-local-map" "current-minor-mode-maps" - "use-global-map" "use-local-map" "set-transient-map" "accept-process-output" - "skip-syntax-forward" "skip-syntax-backward" "backward-prefix-chars" - "vertical-motion" "count-screen-lines" "move-to-window-group-line" - "compute-motion" "file-exists-p" "file-readable-p" "file-executable-p" - "file-writable-p" "file-accessible-directory-p" "access-file" - "file-ownership-preserved-p" "file-modes" "open-network-stream" - "undo-boundary" "undo-auto-amalgamate" "primitive-undo" - "keyboard-coding-system" "terminal-coding-system" "symbolp" "booleanp" - "functionp" "subrp" "byte-code-function-p" "subr-arity" "char-width" - "string-width" "truncate-string-to-width" "window-text-pixel-size" - "documentation-property" "documentation" "face-documentation" - "Snarf-documentation" "match-string" "match-string-no-properties" - "match-beginning" "match-end" "coding-system-priority-list" - "set-coding-system-priority" "x-popup-menu" "-" "mod" "symbol-file" - "command-line" "get-load-suffixes" "defalias" "define-button-type" - "custom-set-variables" "custom-set-faces" "interactive-form" - "encode-coding-string" "decode-coding-string" - "decode-coding-inserted-region" "make-hash-table" "secure-hash" - "frame-geometry" "frame-edges" "buffer-narrowed-p" "locale-info" - "keymap-prompt" "set-window-margins" "window-margins" "try-completion" - "all-completions" "test-completion" "completion-boundaries" - "add-to-invisibility-spec" "remove-from-invisibility-spec" "invisible-p" - "char-after" "char-before" "following-char" "preceding-char" "bobp" "eobp" - "bolp" "eolp" "coding-system-get" "coding-system-aliases" "defvaralias" - "make-obsolete-variable" "indirect-variable" "read-file-name" - "read-directory-name" "read-shell-command" "select-window" - "frame-selected-window" "set-frame-selected-window" "window-use-time" - "make-glyph-code" "glyph-char" "glyph-face" "command-remapping" - "help-buffer" "help-setup-xref" "downcase" "upcase" "capitalize" - "upcase-initials" "redraw-frame" "characterp" "max-char" "get-byte" "float" - "truncate" "floor" "ceiling" "round" "window-vscroll" "set-window-vscroll" - "selected-frame" "select-frame-set-input-focus" "redirect-frame-focus" - "image-multi-frame-p" "image-current-frame" "image-show-frame" - "image-animate" "image-animate-timer" "replace-regexp-in-string" - "perform-replace" "current-idle-time" "subst-char-in-region" - "derived-mode-p" "dom-node" "face-attribute" "face-attribute-relative-p" - "face-all-attributes" "merge-face-attribute" "set-face-attribute" - "set-face-bold" "set-face-italic" "set-face-underline" - "set-face-inverse-video" "face-font" "face-foreground" "face-background" - "face-stipple" "face-bold-p" "face-italic-p" "face-underline-p" - "face-inverse-video-p" "file-name-all-completions" "file-name-completion" - "make-string" "string" "substring" "substring-no-properties" "concat" - "split-string" "window-buffer" "set-window-buffer" "get-buffer-window" - "get-buffer-window-list" "process-query-on-exit-flag" - "set-process-query-on-exit-flag" "process-send-string" "process-send-region" - "process-send-eof" "process-running-child-p" "frame-position" - "set-frame-position" "frame-pixel-height" "frame-pixel-width" - "frame-text-height" "frame-text-width" "frame-height" "frame-width" - "set-frame-size" "set-frame-height" "set-frame-width" "recursion-depth" - "buffer-substring" "buffer-substring-no-properties" "buffer-string" - "filter-buffer-substring" "current-word" "thing-at-point" "bufferp" "random" - "processp" "case-table-p" "set-standard-case-table" "standard-case-table" - "current-case-table" "set-case-table" "set-case-syntax-pair" - "set-case-syntax-delims" "set-case-syntax" "window-prev-buffers" - "set-window-prev-buffers" "window-next-buffers" "set-window-next-buffers" - "read-passwd" "bindat-unpack" "bindat-get-field" "bindat-length" - "bindat-pack" "bindat-ip-to-string" "frame-list" "visible-frame-list" - "next-frame" "previous-frame" "face-list" "face-id" "face-equal" - "face-differs-from-default-p" "file-symlink-p" "file-directory-p" - "file-regular-p" "find-file-noselect" "event-click-count" "fontp" "font-at" - "font-spec" "font-put" "find-font" "list-fonts" "font-get" - "font-face-attributes" "font-xlfd-name" "font-info" "query-font" - "default-font-width" "default-font-height" "window-font-width" - "window-font-height" "kbd" "terminal-name" "terminal-list" - "get-device-terminal" "delete-terminal" "x-display-list" "x-open-connection" - "x-close-connection" "display-monitor-attributes-list" - "frame-monitor-attributes" "read-event" "read-char" "read-char-exclusive" - "read-key" "read-char-choice" "backtrace-debug" "backtrace-frame" - "directory-files" "directory-files-recursively" - "directory-files-and-attributes" "file-expand-wildcards" "insert-directory" - "scan-lists" "scan-sexps" "forward-comment" "tq-create" "tq-enqueue" - "tq-close" "set-window-fringes" "window-fringes" "commandp" - "call-interactively" "funcall-interactively" "command-execute" - "make-bool-vector" "bool-vector" "bool-vector-p" "bool-vector-exclusive-or" - "bool-vector-union" "bool-vector-intersection" "bool-vector-set-difference" - "bool-vector-not" "bool-vector-subsetp" "bool-vector-count-consecutive" - "bool-vector-count-population" "current-active-maps" "key-binding" - "byte-compile" "batch-byte-compile" "tooltip-mode" "tooltip-event-buffer" - "gap-position" "gap-size" "fetch-bytecode" "define-key-after" - "set-process-filter" "process-filter" "read-minibuffer" "eval-minibuffer" - "edit-and-eval-command" "verify-visited-file-modtime" - "clear-visited-file-modtime" "visited-file-modtime" - "set-visited-file-modtime" "ask-user-about-supersession-threat" - "string-to-multibyte" "string-to-unibyte" "byte-to-string" - "multibyte-char-to-unibyte" "unibyte-char-to-multibyte" "syntax-ppss" - "syntax-ppss-flush-cache" "smie-config-local" "read" "read-from-string" - "set-binary-mode" "event-start" "event-end" "posnp" "posn-window" - "posn-area" "posn-point" "posn-x-y" "posn-col-row" "posn-actual-col-row" - "posn-string" "posn-image" "posn-object" "posn-object-x-y" - "posn-object-width-height" "posn-timestamp" "posn-at-point" "posn-at-x-y" - "image-flush" "clear-image-cache" "sentence-end" "system-name" - "parse-colon-path" "load-average" "emacs-pid" "y-or-n-p" - "y-or-n-p-with-timeout" "yes-or-no-p" "hash-table-p" "copy-hash-table" - "hash-table-count" "hash-table-test" "hash-table-weakness" - "hash-table-rehash-size" "hash-table-rehash-threshold" "hash-table-size" - "custom-initialize-delay" "dump-emacs" "define-error" "set-auto-mode" - "set-buffer-major-mode" "next-window" "previous-window" "walk-windows" - "one-window-p" "get-lru-window" "get-mru-window" "get-largest-window" - "get-window-with-predicate" "list-system-processes" "process-attributes" - "define-abbrev" "find-auto-coding" "set-auto-coding" - "find-operation-coding-system" "listify-key-sequence" "input-pending-p" - "discard-input" "messages-buffer" "set" "auto-save-file-name-p" - "make-auto-save-file-name" "recent-auto-save-p" "set-buffer-auto-saved" - "delete-auto-save-file-if-necessary" "rename-auto-save-file" "abbrev-put" - "abbrev-get" "forward-word-strictly" "backward-word-strictly" "advice-add" - "advice-remove" "advice-member-p" "advice-mapc" "store-substring" - "clear-string" "user-login-name" "user-real-login-name" "user-full-name" - "user-real-uid" "user-uid" "group-gid" "group-real-gid" "system-users" - "system-groups" "play-sound" "overlays-at" "overlays-in" - "next-overlay-change" "previous-overlay-change" "next-property-change" - "previous-property-change" "next-single-property-change" - "previous-single-property-change" "next-char-property-change" - "previous-char-property-change" "next-single-char-property-change" - "previous-single-char-property-change" "text-property-any" - "text-property-not-all" "symbol-value" "make-abbrev-table" "abbrev-table-p" - "clear-abbrev-table" "copy-abbrev-table" "define-abbrev-table" - "insert-abbrev-table-description" "advice-function-member-p" - "advice-function-mapc" "advice-eval-interactive-spec" - "display-buffer-same-window" "display-buffer-reuse-window" - "display-buffer-pop-up-frame" "display-buffer-use-some-frame" - "display-buffer-pop-up-window" "display-buffer-below-selected" - "display-buffer-in-previous-window" "display-buffer-at-bottom" - "display-buffer-use-some-window" "display-buffer-no-window" "isnan" "frexp" - "ldexp" "copysign" "logb" "file-newer-than-file-p" "file-attributes" - "file-nlinks" "barf-if-buffer-read-only" "file-acl" "file-selinux-context" - "file-extended-attributes" "zlib-available-p" "zlib-decompress-region" - "window-preserve-size" "window-preserved-size" "load" "arrayp" "aref" "aset" - "fillarray" "delete-process" "image-mask-p" "interrupt-process" - "kill-process" "quit-process" "stop-process" "continue-process" - "minibuffer-depth" "gethash" "puthash" "remhash" "clrhash" "maphash" - "read-quoted-char" "eql" "max" "min" "abs" "framep" "frame-terminal" - "terminal-live-p" "image-type-available-p" "mapcar" "mapc" "mapconcat" - "purecopy" "current-bidi-paragraph-direction" "move-point-visually" - "bidi-string-mark-left-to-right" "bidi-find-overridden-directionality" - "buffer-substring-with-bidi-context" "special-form-p" "type-of" - "syntax-ppss-toplevel-pos" "shell-quote-argument" "split-string-and-unquote" - "combine-and-quote-strings" "posix-looking-at" "posix-string-match" - "smie-setup" "define-hash-table-test" "sxhash" "window-system" "setcar" - "read-buffer" "read-command" "read-variable" "force-mode-line-update" - "file-locked-p" "lock-buffer" "unlock-buffer" "ask-user-about-lock" - "make-display-table" "display-table-slot" "set-display-table-slot" - "describe-display-table" "get" "put" "symbol-plist" "setplist" - "function-get" "function-put" "process-buffer" "process-mark" - "set-process-buffer" "get-buffer-process" "set-process-window-size" - "current-indentation" "read-input-method-name" "make-obsolete" - "set-advertised-calling-convention" "suspend-tty" "resume-tty" - "controlling-tty-p" "overlayp" "make-overlay" "overlay-start" "overlay-end" - "overlay-buffer" "delete-overlay" "move-overlay" "remove-overlays" - "copy-overlay" "overlay-recenter" "nconc" "expand-file-name" - "substitute-in-file-name" "prefix-numeric-value" "lsh" "ash" "logand" - "logior" "logxor" "lognot" "display-warning" "lwarn" "warn" "next-button" - "previous-button" "font-lock-add-keywords" "font-lock-remove-keywords" - "current-justification" "display-completion-list" "make-sparse-keymap" - "make-keymap" "copy-keymap" "window-right-divider-width" - "window-bottom-divider-width" "autoload" "autoloadp" "autoload-do-load" - "syntax-table-p" "standard-syntax-table" "throw" "facep" "x-get-resource" - "set-marker-insertion-type" "marker-insertion-type" "format-mode-line" - "quietly-read-abbrev-file" "window-dedicated-p" "set-window-dedicated-p" - "cancel-timer" "make-network-process" "time-less-p" "time-subtract" - "time-add" "time-to-days" "time-to-day-in-year" "date-leap-year-p" - "buffer-swap-text" "mark" "mark-marker" "set-mark" "push-mark" "pop-mark" - "deactivate-mark" "handle-shift-selection" "cons" "list" "make-list" - "append" "copy-tree" "number-sequence" "line-beginning-position" - "line-end-position" "count-lines" "line-number-at-pos" - "completion-in-region" "make-marker" "point-marker" "point-min-marker" - "point-max-marker" "copy-marker") + '("mouse-on-link-p" + "macrop" + "run-hooks" + "run-hook-with-args" + "run-hook-with-args-until-failure" + "run-hook-with-args-until-success" + "define-fringe-bitmap" + "destroy-fringe-bitmap" + "set-fringe-bitmap-face" + "file-name-directory" + "file-name-nondirectory" + "file-name-sans-versions" + "file-name-extension" + "file-name-sans-extension" + "file-name-base" + "buffer-file-name" + "get-file-buffer" + "find-buffer-visiting" + "make-xwidget" + "xwidgetp" + "xwidget-plist" + "set-xwidget-plist" + "xwidget-buffer" + "get-buffer-xwidgets" + "xwidget-webkit-goto-uri" + "xwidget-webkit-execute-script" + "xwidget-webkit-execute-script-rv" + "xwidget-webkit-get-title" + "xwidget-resize" + "xwidget-size-request" + "xwidget-info" + "set-xwidget-query-on-exit-flag" + "xwidget-query-on-exit-flag" + "split-window" + "window-total-height" + "window-total-width" + "window-total-size" + "window-pixel-height" + "window-pixel-width" + "window-full-height-p" + "window-full-width-p" + "window-body-height" + "window-body-width" + "window-body-size" + "window-mode-line-height" + "window-header-line-height" + "window-max-chars-per-line" + "window-min-size" + "window-edges" + "window-body-edges" + "window-at" + "coordinates-in-window-p" + "window-pixel-edges" + "window-body-pixel-edges" + "window-absolute-pixel-edges" + "window-absolute-body-pixel-edges" + "window-absolute-pixel-position" + "buffer-modified-p" + "set-buffer-modified-p" + "restore-buffer-modified-p" + "buffer-modified-tick" + "buffer-chars-modified-tick" + "decode-time" + "encode-time" + "marker-position" + "marker-buffer" + "create-fontset-from-fontset-spec" + "set-fontset-font" + "char-displayable-p" + "custom-add-frequent-value" + "custom-reevaluate-setting" + "custom-variable-p" + "custom-theme-set-variables" + "custom-theme-set-faces" + "custom-theme-p" + "add-to-list" + "add-to-ordered-list" + "sin" + "cos" + "tan" + "asin" + "acos" + "atan" + "exp" + "log" + "expt" + "sqrt" + "get-char-code-property" + "char-code-property-description" + "put-char-code-property" + "prepare-change-group" + "activate-change-group" + "accept-change-group" + "cancel-change-group" + "active-minibuffer-window" + "minibuffer-window" + "set-minibuffer-window" + "window-minibuffer-p" + "minibuffer-window-active-p" + "define-category" + "category-docstring" + "get-unused-category" + "category-table" + "category-table-p" + "standard-category-table" + "copy-category-table" + "set-category-table" + "make-category-table" + "make-category-set" + "char-category-set" + "category-set-mnemonics" + "modify-category-entry" + "memory-limit" + "memory-use-counts" + "memory-info" + "smie-rule-bolp" + "smie-rule-hanging-p" + "smie-rule-next-p" + "smie-rule-prev-p" + "smie-rule-parent-p" + "smie-rule-sibling-p" + "smie-rule-parent" + "smie-rule-separator" + "lookup-key" + "local-key-binding" + "global-key-binding" + "minor-mode-key-binding" + "user-ptrp" + "gui-get-selection" + "point" + "point-min" + "point-max" + "buffer-end" + "buffer-size" + "foo" + "add-to-history" + "car" + "cdr" + "car-safe" + "cdr-safe" + "nth" + "nthcdr" + "last" + "safe-length" + "caar" + "cadr" + "cdar" + "cddr" + "butlast" + "nbutlast" + "macroexpand" + "macroexpand-all" + "string-to-syntax" + "syntax-after" + "syntax-class" + "make-finalizer" + "unsafep" + "set-buffer-multibyte" + "string-as-unibyte" + "string-as-multibyte" + "tabulated-list-init-header" + "tabulated-list-print" + "ffloor" + "fceiling" + "ftruncate" + "fround" + "assoc" + "rassoc" + "assq" + "alist-get" + "rassq" + "assoc-default" + "copy-alist" + "assq-delete-all" + "rassq-delete-all" + "make-serial-process" + "serial-process-configure" + "make-temp-file" + "make-temp-name" + "current-time-zone" + "key-description" + "single-key-description" + "text-char-description" + "vectorp" + "vector" + "make-vector" + "vconcat" + "create-file-buffer" + "after-find-file" + "buffer-live-p" + "transpose-regions" + "number-to-string" + "string-to-number" + "char-to-string" + "string-to-char" + "makunbound" + "boundp" + "consp" + "atom" + "listp" + "nlistp" + "null" + "buffer-base-buffer" + "charsetp" + "charset-priority-list" + "set-charset-priority" + "char-charset" + "charset-plist" + "put-charset-property" + "get-charset-property" + "decode-char" + "encode-char" + "map-charset-chars" + "x-list-fonts" + "x-family-fonts" + "momentary-string-display" + "frame-char-height" + "frame-char-width" + "abbrev-symbol" + "abbrev-expansion" + "abbrev-insert" + "setcdr" + "fill-context-prefix" + "position-bytes" + "byte-to-position" + "bufferpos-to-filepos" + "filepos-to-bufferpos" + "multibyte-string-p" + "string-bytes" + "unibyte-string" + "split-window-sensibly" + "same-window-p" + "get-text-property" + "get-char-property" + "get-pos-property" + "get-char-property-and-overlay" + "text-properties-at" + "color-defined-p" + "defined-colors" + "color-supported-p" + "color-gray-p" + "color-values" + "scroll-bar-event-ratio" + "scroll-bar-scale" + "get-register" + "set-register" + "register-read-with-preview" + "button-start" + "button-end" + "button-get" + "button-put" + "button-activate" + "button-label" + "button-type" + "button-has-type-p" + "button-at" + "button-type-put" + "button-type-get" + "button-type-subtype-p" + "buffer-list" + "other-buffer" + "last-buffer" + "current-frame-configuration" + "set-frame-configuration" + "funcall" + "apply" + "apply-partially" + "identity" + "ignore" + "file-name-as-directory" + "directory-name-p" + "directory-file-name" + "abbreviate-file-name" + "delete-and-extract-region" + "map-y-or-n-p" + "message" + "message-or-box" + "message-box" + "display-message-or-buffer" + "current-message" + "ding" + "beep" + "x-popup-dialog" + "network-interface-list" + "network-interface-info" + "format-network-address" + "floatp" + "integerp" + "numberp" + "natnump" + "zerop" + "imagemagick-types" + "completion-table-dynamic" + "completion-table-with-cache" + "mouse-position" + "set-mouse-position" + "mouse-pixel-position" + "set-mouse-pixel-position" + "mouse-absolute-pixel-position" + "set-mouse-absolute-pixel-position" + "frame-pointer-visible-p" + "tool-bar-add-item" + "tool-bar-add-item-from-menu" + "tool-bar-local-item-from-menu" + "send-string-to-terminal" + "insert-and-inherit" + "insert-before-markers-and-inherit" + "completing-read" + "minibuffer-prompt" + "minibuffer-prompt-end" + "minibuffer-prompt-width" + "minibuffer-contents" + "minibuffer-contents-no-properties" + "windowp" + "window-live-p" + "window-valid-p" + "selected-window" + "selected-window-group" + "window-resizable" + "window-resize" + "adjust-window-trailing-edge" + "edebug-trace" + "frame-live-p" + "window-frame" + "window-list" + "frame-root-window" + "window-parent" + "window-top-child" + "window-left-child" + "window-child" + "window-combined-p" + "window-next-sibling" + "window-prev-sibling" + "frame-first-window" + "window-in-direction" + "window-tree" + "tty-top-frame" + "font-family-list" + "bitmap-spec-p" + "region-beginning" + "region-end" + "use-region-p" + "default-value" + "default-boundp" + "set-default" + "put-text-property" + "add-text-properties" + "remove-text-properties" + "remove-list-of-text-properties" + "set-text-properties" + "add-face-text-property" + "propertize" + "not" + "error" + "signal" + "user-error" + "set-marker" + "move-marker" + "frame-current-scroll-bars" + "frame-scroll-bar-width" + "frame-scroll-bar-height" + "set-window-scroll-bars" + "window-scroll-bars" + "window-current-scroll-bars" + "window-scroll-bar-width" + "window-scroll-bar-height" + "window-hscroll" + "set-window-hscroll" + "create-image" + "find-image" + "image-load-path-for-library" + "make-byte-code" + "field-beginning" + "field-end" + "field-string" + "field-string-no-properties" + "delete-field" + "constrain-to-field" + "insert-for-yank" + "insert-buffer-substring-as-yank" + "get-internal-run-time" + "eq" + "equal" + "equal-including-properties" + "define-package" + "print" + "princ" + "prin1" + "terpri" + "write-char" + "pp" + "set-process-sentinel" + "process-sentinel" + "waiting-for-user-input-p" + "make-char-table" + "char-table-p" + "char-table-subtype" + "char-table-parent" + "set-char-table-parent" + "char-table-extra-slot" + "set-char-table-extra-slot" + "char-table-range" + "set-char-table-range" + "map-char-table" + "string-match" + "string-match-p" + "looking-at" + "looking-back" + "looking-at-p" + "make-syntax-table" + "copy-syntax-table" + "char-syntax" + "set-syntax-table" + "syntax-table" + "face-remap-add-relative" + "face-remap-remove-relative" + "face-remap-set-base" + "face-remap-reset-base" + "keymap-parent" + "set-keymap-parent" + "make-composed-keymap" + "define-key" + "substitute-key-definition" + "suppress-keymap" + "plist-get" + "plist-put" + "lax-plist-get" + "lax-plist-put" + "plist-member" + "libxml-parse-html-region" + "shr-insert-document" + "libxml-parse-xml-region" + "recenter-window-group" + "called-interactively-p" + "keywordp" + "compare-buffer-substrings" + "notifications-notify" + "notifications-close-notification" + "notifications-get-capabilities" + "notifications-get-server-information" + "sequencep" + "length" + "elt" + "copy-sequence" + "reverse" + "nreverse" + "sort" + "seq-elt" + "seq-length" + "seqp" + "seq-drop" + "seq-take" + "seq-take-while" + "seq-drop-while" + "seq-do" + "seq-map" + "seq-mapn" + "seq-filter" + "seq-remove" + "seq-reduce" + "seq-some" + "seq-find" + "seq-every-p" + "seq-empty-p" + "seq-count" + "seq-sort" + "seq-contains" + "seq-position" + "seq-uniq" + "seq-subseq" + "seq-concatenate" + "seq-mapcat" + "seq-partition" + "seq-intersection" + "seq-difference" + "seq-group-by" + "seq-into" + "seq-min" + "seq-max" + "stringp" + "string-or-null-p" + "char-or-string-p" + "ewoc-create" + "ewoc-buffer" + "ewoc-get-hf" + "ewoc-set-hf" + "ewoc-enter-first" + "ewoc-enter-last" + "ewoc-enter-before" + "ewoc-enter-after" + "ewoc-prev" + "ewoc-next" + "ewoc-nth" + "ewoc-data" + "ewoc-set-data" + "ewoc-locate" + "ewoc-location" + "ewoc-goto-prev" + "ewoc-goto-next" + "ewoc-goto-node" + "ewoc-refresh" + "ewoc-invalidate" + "ewoc-delete" + "ewoc-filter" + "ewoc-collect" + "ewoc-map" + "indirect-function" + "set-network-process-option" + "face-spec-set" + "substitute-command-keys" + "make-progress-reporter" + "progress-reporter-update" + "progress-reporter-force-update" + "progress-reporter-done" + "current-buffer" + "set-buffer" + "minibufferp" + "minibuffer-selected-window" + "minibuffer-message" + "this-command-keys" + "this-command-keys-vector" + "clear-this-command-keys" + "markerp" + "integer-or-marker-p" + "number-or-marker-p" + "make-translation-table" + "make-translation-table-from-vector" + "make-translation-table-from-alist" + "sit-for" + "sleep-for" + "read-from-minibuffer" + "read-string" + "read-regexp" + "read-no-blanks-input" + "frame-visible-p" + "make-process" + "make-pipe-process" + "start-process" + "start-file-process" + "start-process-shell-command" + "start-file-process-shell-command" + "find-file-name-handler" + "file-local-copy" + "file-remote-p" + "unhandled-file-name-directory" + "match-data" + "set-match-data" + "overlay-get" + "overlay-put" + "overlay-properties" + "file-name-absolute-p" + "file-relative-name" + "hack-dir-local-variables" + "hack-dir-local-variables-non-file-buffer" + "dir-locals-set-class-variables" + "dir-locals-set-directory-class" + "make-button" + "insert-button" + "make-text-button" + "insert-text-button" + "insert-image" + "insert-sliced-image" + "put-image" + "remove-images" + "image-size" + "insert-file-contents" + "insert-file-contents-literally" + "format" + "format-message" + "run-mode-hooks" + "cl-call-next-method" + "cl-next-method-p" + "char-equal" + "string-equal" + "string-collate-equalp" + "string-prefix-p" + "string-suffix-p" + "string-lessp" + "string-greaterp" + "string-collate-lessp" + "compare-strings" + "assoc-string" + "display-popup-menus-p" + "display-graphic-p" + "display-mouse-p" + "display-color-p" + "display-grayscale-p" + "display-supports-face-attributes-p" + "display-selections-p" + "display-images-p" + "display-screens" + "display-pixel-height" + "display-pixel-width" + "display-mm-height" + "display-mm-width" + "display-backing-store" + "display-save-under" + "display-planes" + "display-visual-class" + "display-color-cells" + "x-server-version" + "x-server-vendor" + "define-prefix-command" + "insert" + "insert-before-markers" + "insert-buffer-substring" + "insert-buffer-substring-no-properties" + "replace-match" + "match-substitute-replacement" + "set-input-mode" + "current-input-mode" + "tty-color-define" + "tty-color-clear" + "tty-color-alist" + "tty-color-approximate" + "tty-color-translate" + "call-process" + "process-file" + "call-process-region" + "call-process-shell-command" + "process-file-shell-command" + "shell-command-to-string" + "process-lines" + "current-kill" + "kill-new" + "kill-append" + "symbol-function" + "fboundp" + "fmakunbound" + "fset" + "hack-local-variables" + "safe-local-variable-p" + "risky-local-variable-p" + "keymapp" + "select-safe-coding-system" + "read-coding-system" + "read-non-nil-coding-system" + "current-time-string" + "current-time" + "float-time" + "seconds-to-time" + "set-default-file-modes" + "default-file-modes" + "read-file-modes" + "file-modes-symbolic-to-number" + "set-file-times" + "set-file-extended-attributes" + "set-file-selinux-context" + "set-file-acl" + "current-left-margin" + "current-fill-column" + "delete-to-left-margin" + "indent-to-left-margin" + "sort-subr" + "backup-file-name-p" + "make-backup-file-name" + "find-backup-file-name" + "file-newest-backup" + "locate-user-emacs-file" + "convert-standard-filename" + "add-hook" + "remove-hook" + "error-message-string" + "window-point" + "set-window-point" + "quit-restore-window" + "x-parse-geometry" + "process-list" + "get-process" + "process-command" + "process-contact" + "process-id" + "process-name" + "process-status" + "process-live-p" + "process-type" + "process-exit-status" + "process-tty-name" + "process-coding-system" + "set-process-coding-system" + "process-get" + "process-put" + "process-plist" + "set-process-plist" + "keyboard-translate" + "execute-kbd-macro" + "date-to-time" + "format-time-string" + "format-seconds" + "make-ring" + "ring-p" + "ring-size" + "ring-length" + "ring-elements" + "ring-copy" + "ring-empty-p" + "ring-ref" + "ring-insert" + "ring-remove" + "ring-insert-at-beginning" + "set-window-combination-limit" + "window-combination-limit" + "regexp-quote" + "regexp-opt" + "regexp-opt-depth" + "regexp-opt-charset" + "backup-buffer" + "event-modifiers" + "event-basic-type" + "mouse-movement-p" + "event-convert-list" + "read-key-sequence" + "read-key-sequence-vector" + "file-truename" + "file-chase-links" + "file-equal-p" + "file-in-directory-p" + "eval" + "frame-parameter" + "frame-parameters" + "modify-frame-parameters" + "set-frame-parameter" + "modify-all-frames-parameters" + "process-datagram-address" + "set-process-datagram-address" + "current-window-configuration" + "set-window-configuration" + "window-configuration-p" + "compare-window-configurations" + "window-configuration-frame" + "window-state-get" + "window-state-put" + "charset-after" + "find-charset-region" + "find-charset-string" + "abbrev-table-put" + "abbrev-table-get" + "coding-system-list" + "coding-system-p" + "check-coding-system" + "coding-system-eol-type" + "coding-system-change-eol-conversion" + "coding-system-change-text-conversion" + "find-coding-systems-region" + "find-coding-systems-string" + "find-coding-systems-for-charsets" + "check-coding-systems-region" + "detect-coding-region" + "detect-coding-string" + "coding-system-charset-list" + "iter-next" + "iter-close" + "locate-file" + "executable-find" + "symbol-name" + "make-symbol" + "intern" + "intern-soft" + "mapatoms" + "unintern" + "current-column" + "special-variable-p" + "accessible-keymaps" + "map-keymap" + "where-is-internal" + "window-display-table" + "set-window-display-table" + "redisplay" + "force-window-update" + "window-start" + "window-group-start" + "window-end" + "window-group-end" + "set-window-start" + "set-window-group-start" + "pos-visible-in-window-p" + "pos-visible-in-window-group-p" + "window-line-height" + "fringe-bitmaps-at-pos" + "buffer-name" + "get-buffer" + "generate-new-buffer-name" + "jit-lock-register" + "jit-lock-unregister" + "file-notify-add-watch" + "file-notify-rm-watch" + "file-notify-valid-p" + "local-variable-p" + "local-variable-if-set-p" + "buffer-local-value" + "buffer-local-variables" + "kill-all-local-variables" + "eventp" + "skip-chars-forward" + "skip-chars-backward" + "window-parameter" + "window-parameters" + "set-window-parameter" + "recent-keys" + "terminal-parameters" + "terminal-parameter" + "set-terminal-parameter" + "memq" + "delq" + "remq" + "memql" + "member" + "delete" + "remove" + "member-ignore-case" + "delete-dups" + "parse-partial-sexp" + "get-buffer-create" + "generate-new-buffer" + "current-global-map" + "current-local-map" + "current-minor-mode-maps" + "use-global-map" + "use-local-map" + "set-transient-map" + "accept-process-output" + "skip-syntax-forward" + "skip-syntax-backward" + "backward-prefix-chars" + "vertical-motion" + "count-screen-lines" + "move-to-window-group-line" + "compute-motion" + "file-exists-p" + "file-readable-p" + "file-executable-p" + "file-writable-p" + "file-accessible-directory-p" + "access-file" + "file-ownership-preserved-p" + "file-modes" + "open-network-stream" + "undo-boundary" + "undo-auto-amalgamate" + "primitive-undo" + "keyboard-coding-system" + "terminal-coding-system" + "symbolp" + "booleanp" + "functionp" + "subrp" + "byte-code-function-p" + "subr-arity" + "char-width" + "string-width" + "truncate-string-to-width" + "window-text-pixel-size" + "documentation-property" + "documentation" + "face-documentation" + "Snarf-documentation" + "match-string" + "match-string-no-properties" + "match-beginning" + "match-end" + "coding-system-priority-list" + "set-coding-system-priority" + "x-popup-menu" + "-" + "mod" + "symbol-file" + "command-line" + "get-load-suffixes" "define-button-type" + "custom-set-variables" + "custom-set-faces" + "interactive-form" + "encode-coding-string" + "decode-coding-string" + "decode-coding-inserted-region" + "make-hash-table" + "secure-hash" + "frame-geometry" + "frame-edges" + "buffer-narrowed-p" + "locale-info" + "keymap-prompt" + "set-window-margins" + "window-margins" + "try-completion" + "all-completions" + "test-completion" + "completion-boundaries" + "add-to-invisibility-spec" + "remove-from-invisibility-spec" + "invisible-p" + "char-after" + "char-before" + "following-char" + "preceding-char" + "bobp" + "eobp" + "bolp" + "eolp" + "coding-system-get" + "coding-system-aliases" + "defvaralias" + "make-obsolete-variable" + "indirect-variable" + "read-file-name" + "read-directory-name" + "read-shell-command" + "select-window" + "frame-selected-window" + "set-frame-selected-window" + "window-use-time" + "make-glyph-code" + "glyph-char" + "glyph-face" + "command-remapping" + "help-buffer" + "help-setup-xref" + "downcase" + "upcase" + "capitalize" + "upcase-initials" + "redraw-frame" + "characterp" + "max-char" + "get-byte" + "float" + "truncate" + "floor" + "ceiling" + "round" + "window-vscroll" + "set-window-vscroll" + "selected-frame" + "select-frame-set-input-focus" + "redirect-frame-focus" + "image-multi-frame-p" + "image-current-frame" + "image-show-frame" + "image-animate" + "image-animate-timer" + "replace-regexp-in-string" + "perform-replace" + "current-idle-time" + "subst-char-in-region" + "derived-mode-p" + "dom-node" + "face-attribute" + "face-attribute-relative-p" + "face-all-attributes" + "merge-face-attribute" + "set-face-attribute" + "set-face-bold" + "set-face-italic" + "set-face-underline" + "set-face-inverse-video" + "face-font" + "face-foreground" + "face-background" + "face-stipple" + "face-bold-p" + "face-italic-p" + "face-underline-p" + "face-inverse-video-p" + "file-name-all-completions" + "file-name-completion" + "make-string" + "string" + "substring" + "substring-no-properties" + "concat" + "split-string" + "window-buffer" + "set-window-buffer" + "get-buffer-window" + "get-buffer-window-list" + "process-query-on-exit-flag" + "set-process-query-on-exit-flag" + "process-send-string" + "process-send-region" + "process-send-eof" + "process-running-child-p" + "frame-position" + "set-frame-position" + "frame-pixel-height" + "frame-pixel-width" + "frame-text-height" + "frame-text-width" + "frame-height" + "frame-width" + "set-frame-size" + "set-frame-height" + "set-frame-width" + "recursion-depth" + "buffer-substring" + "buffer-substring-no-properties" + "buffer-string" + "filter-buffer-substring" + "current-word" + "thing-at-point" + "bufferp" + "random" + "processp" + "case-table-p" + "set-standard-case-table" + "standard-case-table" + "current-case-table" + "set-case-table" + "set-case-syntax-pair" + "set-case-syntax-delims" + "set-case-syntax" + "window-prev-buffers" + "set-window-prev-buffers" + "window-next-buffers" + "set-window-next-buffers" + "read-passwd" + "bindat-unpack" + "bindat-get-field" + "bindat-length" + "bindat-pack" + "bindat-ip-to-string" + "frame-list" + "visible-frame-list" + "next-frame" + "previous-frame" + "face-list" + "face-id" + "face-equal" + "face-differs-from-default-p" + "file-symlink-p" + "file-directory-p" + "file-regular-p" + "find-file-noselect" + "event-click-count" + "fontp" + "font-at" + "font-spec" + "font-put" + "find-font" + "list-fonts" + "font-get" + "font-face-attributes" + "font-xlfd-name" + "font-info" + "query-font" + "default-font-width" + "default-font-height" + "window-font-width" + "window-font-height" + "kbd" + "terminal-name" + "terminal-list" + "get-device-terminal" + "delete-terminal" + "x-display-list" + "x-open-connection" + "x-close-connection" + "display-monitor-attributes-list" + "frame-monitor-attributes" + "read-event" + "read-char" + "read-char-exclusive" + "read-key" + "read-char-choice" + "backtrace-debug" + "backtrace-frame" + "directory-files" + "directory-files-recursively" + "directory-files-and-attributes" + "file-expand-wildcards" + "insert-directory" + "scan-lists" + "scan-sexps" + "forward-comment" + "tq-create" + "tq-enqueue" + "tq-close" + "set-window-fringes" + "window-fringes" + "commandp" + "call-interactively" + "funcall-interactively" + "command-execute" + "make-bool-vector" + "bool-vector" + "bool-vector-p" + "bool-vector-exclusive-or" + "bool-vector-union" + "bool-vector-intersection" + "bool-vector-set-difference" + "bool-vector-not" + "bool-vector-subsetp" + "bool-vector-count-consecutive" + "bool-vector-count-population" + "current-active-maps" + "key-binding" + "byte-compile" + "batch-byte-compile" + "tooltip-mode" + "tooltip-event-buffer" + "gap-position" + "gap-size" + "fetch-bytecode" + "define-key-after" + "set-process-filter" + "process-filter" + "read-minibuffer" + "eval-minibuffer" + "edit-and-eval-command" + "verify-visited-file-modtime" + "clear-visited-file-modtime" + "visited-file-modtime" + "set-visited-file-modtime" + "ask-user-about-supersession-threat" + "string-to-multibyte" + "string-to-unibyte" + "byte-to-string" + "multibyte-char-to-unibyte" + "unibyte-char-to-multibyte" + "syntax-ppss" + "syntax-ppss-flush-cache" + "smie-config-local" + "read" + "read-from-string" + "set-binary-mode" + "event-start" + "event-end" + "posnp" + "posn-window" + "posn-area" + "posn-point" + "posn-x-y" + "posn-col-row" + "posn-actual-col-row" + "posn-string" + "posn-image" + "posn-object" + "posn-object-x-y" + "posn-object-width-height" + "posn-timestamp" + "posn-at-point" + "posn-at-x-y" + "image-flush" + "clear-image-cache" + "sentence-end" + "system-name" + "parse-colon-path" + "load-average" + "emacs-pid" + "y-or-n-p" + "y-or-n-p-with-timeout" + "yes-or-no-p" + "hash-table-p" + "copy-hash-table" + "hash-table-count" + "hash-table-test" + "hash-table-weakness" + "hash-table-rehash-size" + "hash-table-rehash-threshold" + "hash-table-size" + "custom-initialize-delay" + "dump-emacs" + "define-error" + "set-auto-mode" + "set-buffer-major-mode" + "next-window" + "previous-window" + "walk-windows" + "one-window-p" + "get-lru-window" + "get-mru-window" + "get-largest-window" + "get-window-with-predicate" + "list-system-processes" + "process-attributes" + "define-abbrev" + "find-auto-coding" + "set-auto-coding" + "find-operation-coding-system" + "listify-key-sequence" + "input-pending-p" + "discard-input" + "messages-buffer" + "set" + "auto-save-file-name-p" + "make-auto-save-file-name" + "recent-auto-save-p" + "set-buffer-auto-saved" + "delete-auto-save-file-if-necessary" + "rename-auto-save-file" + "abbrev-put" + "abbrev-get" + "forward-word-strictly" + "backward-word-strictly" + "advice-add" + "advice-remove" + "advice-member-p" + "advice-mapc" + "store-substring" + "clear-string" + "user-login-name" + "user-real-login-name" + "user-full-name" + "user-real-uid" + "user-uid" + "group-gid" + "group-real-gid" + "system-users" + "system-groups" + "play-sound" + "overlays-at" + "overlays-in" + "next-overlay-change" + "previous-overlay-change" + "next-property-change" + "previous-property-change" + "next-single-property-change" + "previous-single-property-change" + "next-char-property-change" + "previous-char-property-change" + "next-single-char-property-change" + "previous-single-char-property-change" + "text-property-any" + "text-property-not-all" + "symbol-value" + "make-abbrev-table" + "abbrev-table-p" + "clear-abbrev-table" + "copy-abbrev-table" + "define-abbrev-table" + "insert-abbrev-table-description" + "advice-function-member-p" + "advice-function-mapc" + "advice-eval-interactive-spec" + "display-buffer-same-window" + "display-buffer-reuse-window" + "display-buffer-pop-up-frame" + "display-buffer-use-some-frame" + "display-buffer-pop-up-window" + "display-buffer-below-selected" + "display-buffer-in-previous-window" + "display-buffer-at-bottom" + "display-buffer-use-some-window" + "display-buffer-no-window" + "isnan" + "frexp" + "ldexp" + "copysign" + "logb" + "file-newer-than-file-p" + "file-attributes" + "file-nlinks" + "barf-if-buffer-read-only" + "file-acl" + "file-selinux-context" + "file-extended-attributes" + "zlib-available-p" + "zlib-decompress-region" + "window-preserve-size" + "window-preserved-size" + "load" + "arrayp" + "aref" + "aset" + "fillarray" + "delete-process" + "image-mask-p" + "interrupt-process" + "kill-process" + "quit-process" + "stop-process" + "continue-process" + "minibuffer-depth" + "gethash" + "puthash" + "remhash" + "clrhash" + "maphash" + "read-quoted-char" + "eql" + "max" + "min" + "abs" + "framep" + "frame-terminal" + "terminal-live-p" + "image-type-available-p" + "mapcar" + "mapc" + "mapconcat" + "purecopy" + "current-bidi-paragraph-direction" + "move-point-visually" + "bidi-string-mark-left-to-right" + "bidi-find-overridden-directionality" + "buffer-substring-with-bidi-context" + "special-form-p" + "type-of" + "syntax-ppss-toplevel-pos" + "shell-quote-argument" + "split-string-and-unquote" + "combine-and-quote-strings" + "posix-looking-at" + "posix-string-match" + "smie-setup" + "define-hash-table-test" + "sxhash" + "window-system" + "setcar" + "read-buffer" + "read-command" + "read-variable" + "force-mode-line-update" + "file-locked-p" + "lock-buffer" + "unlock-buffer" + "ask-user-about-lock" + "make-display-table" + "display-table-slot" + "set-display-table-slot" + "describe-display-table" + "get" + "put" + "symbol-plist" + "setplist" + "function-get" + "function-put" + "process-buffer" + "process-mark" + "set-process-buffer" + "get-buffer-process" + "set-process-window-size" + "current-indentation" + "read-input-method-name" + "make-obsolete" + "set-advertised-calling-convention" + "suspend-tty" + "resume-tty" + "controlling-tty-p" + "overlayp" + "make-overlay" + "overlay-start" + "overlay-end" + "overlay-buffer" + "delete-overlay" + "move-overlay" + "remove-overlays" + "copy-overlay" + "overlay-recenter" + "nconc" + "expand-file-name" + "substitute-in-file-name" + "prefix-numeric-value" + "lsh" + "ash" + "logand" + "logior" + "logxor" + "lognot" + "display-warning" + "lwarn" + "warn" + "next-button" + "previous-button" + "font-lock-add-keywords" + "font-lock-remove-keywords" + "current-justification" + "display-completion-list" + "make-sparse-keymap" + "make-keymap" + "copy-keymap" + "window-right-divider-width" + "window-bottom-divider-width" + "autoload" + "autoloadp" + "autoload-do-load" + "syntax-table-p" + "standard-syntax-table" + "throw" + "facep" + "x-get-resource" + "set-marker-insertion-type" + "marker-insertion-type" + "format-mode-line" + "quietly-read-abbrev-file" + "window-dedicated-p" + "set-window-dedicated-p" + "cancel-timer" + "make-network-process" + "time-less-p" + "time-subtract" + "time-add" + "time-to-days" + "time-to-day-in-year" + "date-leap-year-p" + "buffer-swap-text" + "mark" + "mark-marker" + "set-mark" + "push-mark" + "pop-mark" + "deactivate-mark" + "handle-shift-selection" + "cons" + "list" + "make-list" + "append" + "copy-tree" + "number-sequence" + "line-beginning-position" + "line-end-position" + "count-lines" + "line-number-at-pos" + "completion-in-region" + "make-marker" + "point-marker" + "point-min-marker" + "point-max-marker" + "copy-marker") "List of elisp functions, those in elisp doc marked as function. (basically, all functions that's not command, macro, special forms.)") (defvar +emacs-lisp-variable-list - '("buffer-file-name" "buffer-file-truename" "buffer-file-number" - "list-buffers-directory" "yank-undo-function" "header-line-format" - "custom-known-themes" "float-e" "float-pi" "unicode-category-table" - "char-script-table" "char-width-table" "printable-chars" "post-gc-hook" - "memory-full" "gcs-done" "gc-elapsed" "module-file-suffix" - "history-add-new-input" "minibuffer-history" "query-replace-history" - "file-name-history" "buffer-name-history" "regexp-history" - "extended-command-history" "shell-command-history" "read-expression-history" - "face-name-history" "beginning-of-defun-function" "end-of-defun-function" - "multibyte-syntax-as-symbol" "comment-end-can-be-escaped" - "tabulated-list-format" "tabulated-list-entries" - "tabulated-list-revert-hook" "tabulated-list-printer" - "tabulated-list-sort-key" "font-lock-keywords" - "font-lock-keywords-case-fold-search" "unload-feature-special-hooks" - "kill-buffer-query-functions" "kill-buffer-hook" "buffer-save-without-query" - "load-path" "desktop-save-buffer" "desktop-buffer-mode-handlers" - "charset-list" "temp-buffer-setup-hook" "temp-buffer-show-hook" - "abbrev-start-location" "abbrev-start-location-buffer" "last-abbrev" - "last-abbrev-location" "last-abbrev-text" "abbrev-expand-function" - "process-adaptive-read-buffering" "glyphless-char-display" - "debug-on-message" "enable-multibyte-characters" "char-property-alias-alist" - "default-text-properties" "wrap-prefix" "line-prefix" "register-alist" - "cursor-type" "before-make-frame-hook" "after-make-frame-functions" - "after-delete-frame-functions" "frame-inherited-parameters" - "buffer-list-update-hook" "overlay-arrow-string" "overlay-arrow-position" - "overlay-arrow-variable-list" "inhibit-message" "before-init-hook" - "after-init-hook" "emacs-startup-hook" "window-setup-hook" "user-init-file" - "user-emacs-directory" "image-format-suffixes" "mouse-position-function" - "tool-bar-map" "auto-resize-tool-bars" "auto-raise-tool-bar-buttons" - "tool-bar-button-margin" "tool-bar-button-relief" "tool-bar-border" - "text-property-default-nonsticky" "completing-read-function" - "frame-title-format" "icon-title-format" "multiple-frames" - "blink-paren-function" "menu-bar-final-items" "menu-bar-update-hook" - "vertical-scroll-bar" "horizontal-scroll-bar" "scroll-bar-width" - "scroll-bar-height" "cons-cells-consed" "floats-consed" - "vector-cells-consed" "symbols-consed" "string-chars-consed" - "misc-objects-consed" "intervals-consed" "strings-consed" "tty-setup-hook" - "fontification-functions" "search-spaces-regexp" "face-remapping-alist" - "other-window-scroll-buffer" "system-key-alist" "x-alt-keysym" - "x-meta-keysym" "x-hyper-keysym" "x-super-keysym" "standard-output" - "print-quoted" "print-escape-newlines" "print-escape-nonascii" - "print-escape-multibyte" "print-length" "print-level" "print-circle" - "print-gensym" "print-continuous-numbering" "print-number-table" - "float-output-format" "after-load-alist" "after-load-functions" - "text-quoting-style" "minibuffer-setup-hook" "minibuffer-exit-hook" - "minibuffer-help-form" "minibuffer-scroll-window" "last-command" - "real-last-command" "last-repeatable-command" "this-command" - "this-original-command" "last-nonmenu-event" "last-command-event" - "last-event-frame" "disable-point-adjustment" - "global-disable-point-adjustment" "standard-translation-table-for-decode" - "standard-translation-table-for-encode" "translation-table-for-input" - "minibuffer-allow-text-properties" "minibuffer-local-map" - "minibuffer-local-ns-map" "process-connection-type" - "inhibit-file-name-handlers" "inhibit-file-name-operation" - "dir-locals-class-alist" "dir-locals-directory-cache" - "enable-dir-local-variables" "max-image-size" "minor-mode-list" - "change-major-mode-after-body-hook" "after-change-major-mode-hook" - "noninteractive" "emacs-build-time" "emacs-version" "emacs-major-version" - "emacs-minor-version" "font-lock-keywords-only" "font-lock-syntax-table" - "font-lock-syntactic-face-function" "process-file-side-effects" - "interprogram-paste-function" "interprogram-cut-function" - "inhibit-local-variables-regexps" "file-local-variables-alist" - "before-hack-local-variables-hook" "hack-local-variables-hook" - "ignored-local-variables" "window-point-insertion-type" "font-lock-defaults" - "overwrite-mode" "extra-keyboard-modifiers" "keyboard-translate-table" - "executing-kbd-macro" "defining-kbd-macro" "last-kbd-macro" - "kbd-macro-termination-hook" "emacs-save-session-functions" - "write-region-annotate-functions" "write-region-post-annotation-function" - "after-insert-file-functions" "features" "buffer-backed-up" - "backup-enable-predicate" "backup-inhibited" "num-input-keys" "values" - "buffer-file-coding-system" "save-buffer-coding-system" - "last-coding-system-used" "file-name-coding-system" - "inhibit-null-byte-detection" "inhibit-iso-escape-detection" - "exec-directory" "obarray" "lexical-binding" "buffer-display-table" - "standard-display-table" "pre-redisplay-function" "pre-redisplay-functions" - "x-pointer-shape" "x-sensitive-text-pointer-shape" - "font-lock-mark-block-function" "font-lock-extra-managed-props" - "font-lock-fontify-buffer-function" "font-lock-unfontify-buffer-function" - "font-lock-fontify-region-function" "font-lock-unfontify-region-function" - "font-lock-flush-function" "font-lock-ensure-function" - "change-major-mode-hook" "window-persistent-parameters" - "ignore-window-parameters" "quit-flag" "inhibit-quit" "most-positive-fixnum" - "most-negative-fixnum" "global-map" "minor-mode-map-alist" - "minor-mode-overriding-map-alist" "overriding-local-map" - "overriding-terminal-local-map" "overriding-local-map-menu-flag" - "special-event-map" "emulation-mode-map-alists" "kill-ring" - "kill-ring-yank-pointer" "display-buffer-overriding-action" - "buffer-undo-list" "undo-auto-current-boundary-timer" "undo-in-progress" - "pre-command-hook" "post-command-hook" "imenu-generic-expression" - "imenu-case-fold-search" "imenu-syntax-alist" - "imenu-prev-index-position-function" "imenu-extract-index-name-function" - "imenu-create-index-function" "doc-directory" "coding-system-for-read" - "coding-system-for-write" "selective-display" "electric-future-map" - "load-history" "command-line-processed" "command-switch-alist" - "command-line-args" "command-line-args-left" "command-line-functions" - "load-suffixes" "load-file-rep-suffixes" "inhibit-point-motion-hooks" - "show-help-function" "command-history" "face-font-rescale-alist" - "locale-coding-system" "system-messages-locale" "system-time-locale" - "menu-prompt-more-char" "left-margin-width" "right-margin-width" - "completion-ignore-case" "completion-regexp-list" "buffer-invisibility-spec" - "global-abbrev-table" "local-abbrev-table" "abbrev-minor-mode-table-alist" - "fundamental-mode-abbrev-table" "text-mode-abbrev-table" - "lisp-mode-abbrev-table" "revert-buffer-in-progress-p" - "revert-buffer-function" "revert-buffer-insert-file-contents-function" - "before-revert-hook" "after-revert-hook" "buffer-stale-function" - "input-method-function" "read-file-name-function" - "minibuffer-local-shell-command-map" "glyph-table" "help-map" "help-form" - "prefix-help-command" "data-directory" "byte-boolean-vars" - "auto-window-vscroll" "focus-in-hook" "focus-out-hook" "query-replace-map" - "multi-query-replace-map" "replace-search-function" - "replace-re-search-function" "warning-levels" "warning-prefix-function" - "warning-series" "warning-fill-prefix" "warning-type-format" - "split-string-default-separators" "before-change-functions" - "after-change-functions" "first-change-hook" "inhibit-modification-hooks" - "buffer-display-count" "buffer-display-time" "command-error-function" - "filter-buffer-substring-function" "filter-buffer-substring-functions" - "buffer-substring-filters" "ascii-case-table" "disabled-command-function" - "format-alist" "buffer-file-format" "buffer-auto-save-file-format" - "find-file-not-found-functions" "find-file-literally" - "delete-terminal-functions" "num-nonmacro-input-events" "debugger" - "debug-on-next-call" "command-debug-status" "insert-directory-program" - "font-lock-extend-after-change-region-function" "cursor-in-echo-area" - "echo-area-clear-hook" "message-truncate-lines" "fringes-outside-margins" - "left-fringe-width" "right-fringe-width" "tooltip-frame-parameters" - "tooltip-functions" "byte-compile-dynamic" "standard-input" "read-circle" - "image-cache-eviction-delay" "system-configuration" "system-type" - "process-environment" "initial-environment" "path-separator" - "invocation-name" "invocation-directory" "installation-directory" - "tty-erase-char" "buffer-access-fontify-functions" - "buffer-access-fontified-property" "input-decode-map" - "local-function-key-map" "key-translation-map" "interpreter-mode-alist" - "magic-mode-alist" "magic-fallback-mode-alist" "auto-mode-alist" - "process-coding-system-alist" "network-coding-system-alist" - "default-process-coding-system" "unread-command-events" "last-input-event" - "buffer-auto-save-file-name" "auto-save-hook" "buffer-saved-size" - "auto-save-list-file-name" "inhibit-field-text-motion" - "find-word-boundary-function-table" "default-minibuffer-frame" - "init-file-user" "play-sound-functions" - "customize-package-emacs-version-alist" "delayed-warnings-list" - "delayed-warnings-hook" "fringe-cursor-alist" "indent-region-function" - "fringe-indicator-alist" "dynamic-library-alist" "kill-emacs-hook" - "kill-emacs-query-functions" "abbrev-table-name-list" "buffer-read-only" - "inhibit-read-only" "window-size-fixed" "load-in-progress" "load-file-name" - "load-read-function" "image-types" "pure-bytes-used" "purify-flag" - "bidi-display-reordering" "bidi-paragraph-direction" "write-file-functions" - "write-contents-functions" "window-scroll-functions" - "window-size-change-functions" "window-configuration-change-hook" - "window-system" "initial-window-system" "font-lock-multiline" - "completion-styles-alist" "completion-extra-properties" - "current-input-method" "input-method-alist" "suspend-hook" - "suspend-resume-hook" "default-directory" "current-prefix-arg" "prefix-arg" - "last-prefix-arg" "fill-paragraph-function" - "fill-forward-paragraph-function" "use-hard-newlines" - "minibuffer-completion-table" "minibuffer-completion-predicate" - "minibuffer-completion-confirm" "minibuffer-confirm-exit-commands" - "minibuffer-local-completion-map" "minibuffer-local-must-match-map" - "minibuffer-local-filename-completion-map" "auto-fill-function" - "normal-auto-fill-function" "auto-fill-chars" "generate-autoload-cookie" - "generated-autoload-file" "x-resource-class" "x-resource-name" - "inhibit-x-resources" "indent-line-function" "abbrevs-changed" - "mode-line-mule-info" "mode-line-modified" "mode-line-frame-identification" - "mode-line-buffer-identification" "mode-line-position" "vc-mode" - "mode-line-modes" "mode-line-remote" "mode-line-client" "mode-name" - "mode-line-process" "mode-line-front-space" "mode-line-end-spaces" - "mode-line-misc-info" "minor-mode-alist" "global-mode-string" - "deactivate-mark" "mark-active" "activate-mark-hook" "deactivate-mark-hook" - "mark-ring" "parse-sexp-lookup-properties" "syntax-propertize-function" - "syntax-propertize-extend-region-functions" "completion-at-point-functions") + '("abbrev-expand-function" + "abbrev-minor-mode-table-alist" + "abbrev-start-location" + "abbrev-start-location-buffer" + "abbrev-table-name-list" + "abbrevs-changed" + "activate-mark-hook" + "after-change-functions" + "after-change-major-mode-hook" + "after-delete-frame-functions" + "after-init-hook" + "after-insert-file-functions" + "after-load-alist" + "after-load-functions" + "after-make-frame-functions" + "after-revert-hook" + "ascii-case-table" + "auto-fill-chars" + "auto-fill-function" + "auto-mode-alist" + "auto-raise-tool-bar-buttons" + "auto-resize-tool-bars" + "auto-save-hook" + "auto-save-list-file-name" + "auto-window-vscroll" + "backup-enable-predicate" + "backup-inhibited" + "before-change-functions" + "before-hack-local-variables-hook" + "before-init-hook" + "before-make-frame-hook" + "before-revert-hook" + "beginning-of-defun-function" + "bidi-display-reordering" + "bidi-paragraph-direction" + "blink-paren-function" + "buffer-access-fontified-property" + "buffer-access-fontify-functions" + "buffer-auto-save-file-format" + "buffer-auto-save-file-name" + "buffer-backed-up" + "buffer-display-count" + "buffer-display-table" + "buffer-display-time" + "buffer-file-coding-system" + "buffer-file-format" + "buffer-file-name" + "buffer-file-number" + "buffer-file-truename" + "buffer-invisibility-spec" + "buffer-list-update-hook" + "buffer-name-history" + "buffer-read-only" + "buffer-save-without-query" + "buffer-saved-size" + "buffer-stale-function" + "buffer-substring-filters" + "buffer-undo-list" + "byte-boolean-vars" + "byte-compile-dynamic" + "change-major-mode-after-body-hook" + "change-major-mode-hook" + "char-property-alias-alist" + "char-script-table" + "char-width-table" + "charset-list" + "coding-system-for-read" + "coding-system-for-write" + "command-debug-status" + "command-error-function" + "command-history" + "command-line-args" + "command-line-args-left" + "command-line-functions" + "command-line-processed" + "command-switch-alist" + "comment-end-can-be-escaped" + "completing-read-function" + "completion-at-point-functions" + "completion-extra-properties" + "completion-ignore-case" + "completion-regexp-list" + "completion-styles-alist" + "cons-cells-consed" + "current-input-method" + "current-prefix-arg" + "cursor-in-echo-area" + "cursor-type" + "custom-known-themes" + "customize-package-emacs-version-alist" + "data-directory" + "deactivate-mark" + "deactivate-mark-hook" + "debug-on-message" + "debug-on-next-call" + "debugger" + "default-directory" + "default-minibuffer-frame" + "default-process-coding-system" + "default-text-properties" + "defining-kbd-macro" + "delayed-warnings-hook" + "delayed-warnings-list" + "delete-terminal-functions" + "desktop-buffer-mode-handlers" + "desktop-save-buffer" + "dir-locals-class-alist" + "dir-locals-directory-cache" + "disable-point-adjustment" + "disabled-command-function" + "display-buffer-overriding-action" + "doc-directory" + "dynamic-library-alist" + "echo-area-clear-hook" + "electric-future-map" + "emacs-build-time" + "emacs-major-version" + "emacs-minor-version" + "emacs-save-session-functions" + "emacs-startup-hook" + "emacs-version" + "emulation-mode-map-alists" + "enable-dir-local-variables" + "enable-multibyte-characters" + "end-of-defun-function" + "exec-directory" + "executing-kbd-macro" + "extended-command-history" + "extra-keyboard-modifiers" + "face-font-rescale-alist" + "face-name-history" + "face-remapping-alist" + "features" + "file-local-variables-alist" + "file-name-coding-system" + "file-name-history" + "fill-forward-paragraph-function" + "fill-paragraph-function" + "filter-buffer-substring-function" + "filter-buffer-substring-functions" + "find-file-literally" + "find-file-not-found-functions" + "find-word-boundary-function-table" + "first-change-hook" + "float-e" + "float-output-format" + "float-pi" + "floats-consed" + "focus-in-hook" + "focus-out-hook" + "font-lock-defaults" + "font-lock-ensure-function" + "font-lock-extend-after-change-region-function" + "font-lock-extra-managed-props" + "font-lock-flush-function" + "font-lock-fontify-buffer-function" + "font-lock-fontify-region-function" + "font-lock-keywords" + "font-lock-keywords-case-fold-search" + "font-lock-keywords-only" + "font-lock-mark-block-function" + "font-lock-multiline" + "font-lock-syntactic-face-function" + "font-lock-syntax-table" + "font-lock-unfontify-buffer-function" + "font-lock-unfontify-region-function" + "fontification-functions" + "format-alist" + "frame-inherited-parameters" + "frame-title-format" + "fringe-cursor-alist" + "fringe-indicator-alist" + "fringes-outside-margins" + "fundamental-mode-abbrev-table" + "gc-elapsed" + "gcs-done" + "generate-autoload-cookie" + "generated-autoload-file" + "global-abbrev-table" + "global-disable-point-adjustment" + "global-map" + "global-mode-string" + "glyph-table" + "glyphless-char-display" + "hack-local-variables-hook" + "header-line-format" + "help-form" + "help-map" + "history-add-new-input" + "horizontal-scroll-bar" + "icon-title-format" + "ignore-window-parameters" + "ignored-local-variables" + "image-cache-eviction-delay" + "image-format-suffixes" + "image-types" + "imenu-case-fold-search" + "imenu-create-index-function" + "imenu-extract-index-name-function" + "imenu-generic-expression" + "imenu-prev-index-position-function" + "imenu-syntax-alist" + "indent-line-function" + "indent-region-function" + "inhibit-field-text-motion" + "inhibit-file-name-handlers" + "inhibit-file-name-operation" + "inhibit-iso-escape-detection" + "inhibit-local-variables-regexps" + "inhibit-message" + "inhibit-modification-hooks" + "inhibit-null-byte-detection" + "inhibit-point-motion-hooks" + "inhibit-quit" + "inhibit-read-only" + "inhibit-x-resources" + "init-file-user" + "initial-environment" + "initial-window-system" + "input-decode-map" + "input-method-alist" + "input-method-function" + "insert-directory-program" + "installation-directory" + "interpreter-mode-alist" + "interprogram-cut-function" + "interprogram-paste-function" + "intervals-consed" + "invocation-directory" + "invocation-name" + "kbd-macro-termination-hook" + "key-translation-map" + "keyboard-translate-table" + "kill-buffer-hook" + "kill-buffer-query-functions" + "kill-emacs-hook" + "kill-emacs-query-functions" + "kill-ring" + "kill-ring-yank-pointer" + "last-abbrev" + "last-abbrev-location" + "last-abbrev-text" + "last-coding-system-used" + "last-command" + "last-command-event" + "last-event-frame" + "last-input-event" + "last-kbd-macro" + "last-nonmenu-event" + "last-prefix-arg" + "last-repeatable-command" + "left-fringe-width" + "left-margin-width" + "lexical-binding" + "line-prefix" + "lisp-mode-abbrev-table" + "list-buffers-directory" + "load-file-name" + "load-file-rep-suffixes" + "load-history" + "load-in-progress" + "load-path" + "load-read-function" + "load-suffixes" + "local-abbrev-table" + "local-function-key-map" + "locale-coding-system" + "magic-fallback-mode-alist" + "magic-mode-alist" + "mark-active" + "mark-ring" + "max-image-size" + "memory-full" + "menu-bar-final-items" + "menu-bar-update-hook" + "menu-prompt-more-char" + "message-truncate-lines" + "minibuffer-allow-text-properties" + "minibuffer-completion-confirm" + "minibuffer-completion-predicate" + "minibuffer-completion-table" + "minibuffer-confirm-exit-commands" + "minibuffer-exit-hook" + "minibuffer-help-form" + "minibuffer-history" + "minibuffer-local-completion-map" + "minibuffer-local-filename-completion-map" + "minibuffer-local-map" + "minibuffer-local-must-match-map" + "minibuffer-local-ns-map" + "minibuffer-local-shell-command-map" + "minibuffer-scroll-window" + "minibuffer-setup-hook" + "minor-mode-alist" + "minor-mode-list" + "minor-mode-map-alist" + "minor-mode-overriding-map-alist" + "misc-objects-consed" + "mode-line-buffer-identification" + "mode-line-client" + "mode-line-end-spaces" + "mode-line-frame-identification" + "mode-line-front-space" + "mode-line-misc-info" + "mode-line-modes" + "mode-line-modified" + "mode-line-mule-info" + "mode-line-position" + "mode-line-process" + "mode-line-remote" + "mode-name" + "module-file-suffix" + "most-negative-fixnum" + "most-positive-fixnum" + "mouse-position-function" + "multi-query-replace-map" + "multibyte-syntax-as-symbol" + "multiple-frames" + "network-coding-system-alist" + "noninteractive" + "normal-auto-fill-function" + "num-input-keys" + "num-nonmacro-input-events" + "obarray" + "other-window-scroll-buffer" + "overlay-arrow-position" + "overlay-arrow-string" + "overlay-arrow-variable-list" + "overriding-local-map" + "overriding-local-map-menu-flag" + "overriding-terminal-local-map" + "overwrite-mode" + "parse-sexp-lookup-properties" + "path-separator" + "play-sound-functions" + "post-command-hook" + "post-gc-hook" + "pre-command-hook" + "pre-redisplay-function" + "pre-redisplay-functions" + "prefix-arg" + "prefix-help-command" + "print-circle" + "print-continuous-numbering" + "print-escape-multibyte" + "print-escape-newlines" + "print-escape-nonascii" + "print-gensym" + "print-length" + "print-level" + "print-number-table" + "print-quoted" + "printable-chars" + "process-adaptive-read-buffering" + "process-coding-system-alist" + "process-connection-type" + "process-environment" + "process-file-side-effects" + "pure-bytes-used" + "purify-flag" + "query-replace-history" + "query-replace-map" + "quit-flag" + "read-circle" + "read-expression-history" + "read-file-name-function" + "real-last-command" + "regexp-history" + "register-alist" + "replace-re-search-function" + "replace-search-function" + "revert-buffer-function" + "revert-buffer-in-progress-p" + "revert-buffer-insert-file-contents-function" + "right-fringe-width" + "right-margin-width" + "save-buffer-coding-system" + "scroll-bar-height" + "scroll-bar-width" + "search-spaces-regexp" + "selective-display" + "shell-command-history" + "show-help-function" + "special-event-map" + "split-string-default-separators" + "standard-display-table" + "standard-input" + "standard-output" + "standard-translation-table-for-decode" + "standard-translation-table-for-encode" + "string-chars-consed" + "strings-consed" + "suspend-hook" + "suspend-resume-hook" + "symbols-consed" + "syntax-propertize-extend-region-functions" + "syntax-propertize-function" + "system-configuration" + "system-key-alist" + "system-messages-locale" + "system-time-locale" + "system-type" + "tabulated-list-entries" + "tabulated-list-format" + "tabulated-list-printer" + "tabulated-list-revert-hook" + "tabulated-list-sort-key" + "temp-buffer-setup-hook" + "temp-buffer-show-hook" + "text-mode-abbrev-table" + "text-property-default-nonsticky" + "text-quoting-style" + "this-command" + "this-original-command" + "tool-bar-border" + "tool-bar-button-margin" + "tool-bar-button-relief" + "tool-bar-map" + "tooltip-frame-parameters" + "tooltip-functions" + "translation-table-for-input" + "tty-erase-char" + "tty-setup-hook" + "undo-auto-current-boundary-timer" + "undo-in-progress" + "unicode-category-table" + "unload-feature-special-hooks" + "unread-command-events" + "use-hard-newlines" + "user-emacs-directory" + "user-init-file" + "values" + "vc-mode" + "vector-cells-consed" + "vertical-scroll-bar" + "warning-fill-prefix" + "warning-levels" + "warning-prefix-function" + "warning-series" + "warning-type-format" + "window-configuration-change-hook" + "window-persistent-parameters" + "window-point-insertion-type" + "window-scroll-functions" + "window-setup-hook" + "window-size-change-functions" + "window-size-fixed" + "window-system" + "wrap-prefix" + "write-contents-functions" + "write-file-functions" + "write-region-annotate-functions" + "write-region-post-annotation-function" + "x-alt-keysym" + "x-hyper-keysym" + "x-meta-keysym" + "x-pointer-shape" + "x-resource-class" + "x-resource-name" + "x-sensitive-text-pointer-shape" + "x-super-keysym" + "yank-undo-function") "TODO") (defvar +emacs-lisp-option-list - '("switch-to-buffer-in-dedicated-window" - "switch-to-buffer-preserve-window-point" "transient-mark-mode" - "mark-even-if-inactive" "mark-ring-max" "timer-max-repeats" - "abbrev-file-name" "save-abbrevs" "custom-unlispify-remove-prefixes" - "tab-always-indent" "completion-auto-help" "fill-individual-varying-indent" - "default-justification" "sentence-end-double-space" - "sentence-end-without-period" "sentence-end-without-space" "debug-on-quit" - "default-input-method" "indent-tabs-mode" - "window-adjust-process-window-size-function" "create-lockfiles" - "completion-styles" "completion-category-overrides" "read-buffer-function" - "read-buffer-completion-ignore-case" "before-save-hook" "after-save-hook" - "file-precious-flag" "require-final-newline" "warning-minimum-level" - "warning-minimum-log-level" "warning-suppress-types" - "warning-suppress-log-types" "inhibit-startup-screen" - "initial-buffer-choice" "inhibit-startup-echo-area-message" - "initial-scratch-message" "enable-recursive-minibuffers" - "delete-exited-processes" "initial-frame-alist" "minibuffer-frame-alist" - "default-frame-alist" "indicate-empty-lines" "indicate-buffer-boundaries" - "overflow-newline-into-fringe" "backup-by-copying" - "backup-by-copying-when-linked" "backup-by-copying-when-mismatch" - "backup-by-copying-when-privileged-mismatch" "case-fold-search" - "case-replace" "user-mail-address" "words-include-escapes" "version-control" - "kept-new-versions" "kept-old-versions" "delete-old-versions" - "dired-kept-versions" "auto-save-visited-file-name" "auto-save-interval" - "auto-save-timeout" "auto-save-default" "delete-auto-save-files" - "auto-save-list-file-prefix" "message-log-max" "auto-coding-regexp-alist" - "file-coding-system-alist" "auto-coding-alist" "auto-coding-functions" - "only-global-abbrevs" "package-archives" "package-archive-upload-base" - "initial-major-mode" "major-mode" "mail-host-address" "page-delimiter" - "paragraph-separate" "paragraph-start" "sentence-end" "smie-config" - "edebug-eval-macro-args" "echo-keystrokes" "double-click-fuzz" - "double-click-time" "find-file-wildcards" "find-file-hook" - "switch-to-visible-buffer" "frame-resize-pixelwise" - "completion-ignored-extensions" "focus-follows-mouse" "no-redraw-on-reenter" - "help-char" "help-event-list" "three-step-help" - "read-file-name-completion-ignore-case" "insert-default-directory" - "revert-without-query" "face-font-family-alternatives" - "face-font-selection-order" "face-font-registry-alternatives" - "scalable-fonts-allowed" "load-prefer-newer" "selective-display-ellipses" - "inhibit-eol-conversion" "display-buffer-alist" "display-buffer-base-action" - "kill-ring-max" "void-text-area-pointer" "exec-suffixes" "exec-path" - "max-lisp-eval-depth" "edebug-sit-for-seconds" "make-backup-files" - "backup-directory-alist" "make-backup-file-name-function" - "edebug-setup-hook" "edebug-all-defs" "edebug-all-forms" - "edebug-save-windows" "edebug-save-displayed-buffer-points" - "edebug-initial-mode" "edebug-trace" "edebug-test-coverage" - "edebug-continue-kbd-macro" "edebug-unwrap-results" "edebug-on-error" - "edebug-on-quit" "edebug-global-break-condition" "window-combination-limit" - "window-combination-resize" "edebug-print-length" "edebug-print-level" - "edebug-print-circle" "frame-auto-hide-function" "sort-fold-case" - "sort-numeric-base" "fill-prefix" "fill-column" "left-margin" - "fill-nobreak-predicate" "enable-local-variables" - "safe-local-variable-values" "enable-local-eval" "safe-local-eval-forms" - "frame-inhibit-implied-resize" "display-mm-dimensions-alist" - "remote-file-name-inhibit-cache" "read-regexp-defaults-function" - "max-mini-window-height" "mode-line-format" "eval-expression-print-length" - "eval-expression-print-level" "scroll-margin" "scroll-conservatively" - "scroll-down-aggressively" "scroll-up-aggressively" "scroll-step" - "scroll-preserve-screen-position" "next-screen-context-lines" - "scroll-error-top-bottom" "recenter-redisplay" "recenter-positions" - "byte-compile-dynamic-docstrings" "yank-handled-properties" - "yank-excluded-properties" "max-specpdl-size" "term-file-prefix" - "term-file-aliases" "image-load-path" "scroll-bar-mode" - "horizontal-scroll-bar-mode" "blink-matching-paren" - "blink-matching-paren-distance" "blink-matching-delay" - "underline-minimum-offset" "x-bitmap-file-path" "minibuffer-auto-raise" - "window-resize-pixelwise" "fit-window-to-buffer-horizontally" - "fit-frame-to-buffer" "fit-frame-to-buffer-margins" - "fit-frame-to-buffer-sizes" "baud-rate" "imagemagick-enabled-types" - "imagemagick-types-inhibit" "visible-bell" "ring-bell-function" - "site-run-file" "inhibit-default-init" - "backward-delete-char-untabify-method" "cursor-in-non-selected-windows" - "x-stretch-cursor" "blink-cursor-alist" "truncate-lines" - "truncate-partial-width-windows" "kill-read-only-ok" "pop-up-windows" - "split-window-preferred-function" "split-height-threshold" - "split-width-threshold" "even-window-sizes" "pop-up-frames" - "pop-up-frame-function" "pop-up-frame-alist" "same-window-buffer-names" - "same-window-regexps" "debug-on-error" "debug-ignored-errors" - "eval-expression-debug-on-error" "debug-on-signal" "debug-on-event" - "adaptive-fill-mode" "adaptive-fill-regexp" - "adaptive-fill-first-line-regexp" "adaptive-fill-function" - "glyphless-char-display-control" "abbrev-all-caps" - "temp-buffer-show-function" "temp-buffer-resize-mode" - "temp-buffer-max-height" "temp-buffer-max-width" "tab-stop-list" - "buffer-offer-save" "temporary-file-directory" - "small-temporary-file-directory" "undo-limit" "undo-strong-limit" - "undo-outer-limit" "undo-ask-before-discard" "parse-sexp-ignore-comments" - "ctl-arrow" "tab-width" "defun-prompt-regexp" - "open-paren-in-column-0-is-defun-start" "history-length" - "history-delete-duplicates" "selection-coding-system" "meta-prefix-char" - "garbage-collection-messages" "gc-cons-threshold" "gc-cons-percentage" - "resize-mini-windows" "max-mini-window-height" "window-min-height" - "window-min-width" "split-window-keep-point") + '("abbrev-all-caps" + "abbrev-file-name" + "adaptive-fill-first-line-regexp" + "adaptive-fill-function" + "adaptive-fill-mode" + "adaptive-fill-regexp" + "after-save-hook" + "auto-coding-alist" + "auto-coding-functions" + "auto-coding-regexp-alist" + "auto-save-default" + "auto-save-interval" + "auto-save-list-file-prefix" + "auto-save-timeout" + "auto-save-visited-file-name" + "backup-by-copying" + "backup-by-copying-when-linked" + "backup-by-copying-when-mismatch" + "backup-by-copying-when-privileged-mismatch" + "backup-directory-alist" + "backward-delete-char-untabify-method" + "baud-rate" + "before-save-hook" + "blink-cursor-alist" + "blink-matching-delay" + "blink-matching-paren" + "blink-matching-paren-distance" + "buffer-offer-save" + "byte-compile-dynamic-docstrings" + "case-fold-search" + "case-replace" + "completion-auto-help" + "completion-category-overrides" + "completion-ignored-extensions" + "completion-styles" + "create-lockfiles" + "ctl-arrow" + "cursor-in-non-selected-windows" + "custom-unlispify-remove-prefixes" + "debug-ignored-errors" + "debug-on-error" + "debug-on-event" + "debug-on-quit" + "debug-on-signal" + "default-frame-alist" + "default-input-method" + "default-justification" + "defun-prompt-regexp" + "delete-auto-save-files" + "delete-exited-processes" + "delete-old-versions" + "dired-kept-versions" + "display-buffer-alist" + "display-buffer-base-action" + "display-mm-dimensions-alist" + "double-click-fuzz" + "double-click-time" + "echo-keystrokes" + "edebug-all-defs" + "edebug-all-forms" + "edebug-continue-kbd-macro" + "edebug-eval-macro-args" + "edebug-global-break-condition" + "edebug-initial-mode" + "edebug-on-error" + "edebug-on-quit" + "edebug-print-circle" + "edebug-print-length" + "edebug-print-level" + "edebug-save-displayed-buffer-points" + "edebug-save-windows" + "edebug-setup-hook" + "edebug-sit-for-seconds" + "edebug-test-coverage" + "edebug-trace" + "edebug-unwrap-results" + "enable-local-eval" + "enable-local-variables" + "enable-recursive-minibuffers" + "eval-expression-debug-on-error" + "eval-expression-print-length" + "eval-expression-print-level" + "even-window-sizes" + "exec-path" + "exec-suffixes" + "face-font-family-alternatives" + "face-font-registry-alternatives" + "face-font-selection-order" + "file-coding-system-alist" + "file-precious-flag" + "fill-column" + "fill-individual-varying-indent" + "fill-nobreak-predicate" + "fill-prefix" + "find-file-hook" + "find-file-wildcards" + "fit-frame-to-buffer" + "fit-frame-to-buffer-margins" + "fit-frame-to-buffer-sizes" + "fit-window-to-buffer-horizontally" + "focus-follows-mouse" + "frame-auto-hide-function" + "frame-inhibit-implied-resize" + "frame-resize-pixelwise" + "garbage-collection-messages" + "gc-cons-percentage" + "gc-cons-threshold" + "glyphless-char-display-control" + "help-char" + "help-event-list" + "history-delete-duplicates" + "history-length" + "horizontal-scroll-bar-mode" + "image-load-path" + "imagemagick-enabled-types" + "imagemagick-types-inhibit" + "indent-tabs-mode" + "indicate-buffer-boundaries" + "indicate-empty-lines" + "inhibit-default-init" + "inhibit-eol-conversion" + "inhibit-startup-echo-area-message" + "inhibit-startup-screen" + "initial-buffer-choice" + "initial-frame-alist" + "initial-major-mode" + "initial-scratch-message" + "insert-default-directory" + "kept-new-versions" + "kept-old-versions" + "kill-read-only-ok" + "kill-ring-max" + "left-margin" + "load-prefer-newer" + "mail-host-address" + "major-mode" + "make-backup-file-name-function" + "make-backup-files" + "mark-even-if-inactive" + "mark-ring-max" + "max-lisp-eval-depth" + "max-mini-window-height" + "max-mini-window-height" + "max-specpdl-size" + "message-log-max" + "meta-prefix-char" + "minibuffer-auto-raise" + "minibuffer-frame-alist" + "mode-line-format" + "next-screen-context-lines" + "no-redraw-on-reenter" + "only-global-abbrevs" + "open-paren-in-column-0-is-defun-start" + "overflow-newline-into-fringe" + "package-archive-upload-base" + "package-archives" + "page-delimiter" + "paragraph-separate" + "paragraph-start" + "parse-sexp-ignore-comments" + "pop-up-frame-alist" + "pop-up-frame-function" + "pop-up-frames" + "pop-up-windows" + "read-buffer-completion-ignore-case" + "read-buffer-function" + "read-file-name-completion-ignore-case" + "read-regexp-defaults-function" + "recenter-positions" + "recenter-redisplay" + "remote-file-name-inhibit-cache" + "require-final-newline" + "resize-mini-windows" + "revert-without-query" + "ring-bell-function" + "safe-local-eval-forms" + "safe-local-variable-values" + "same-window-buffer-names" + "same-window-regexps" + "save-abbrevs" + "scalable-fonts-allowed" + "scroll-bar-mode" + "scroll-conservatively" + "scroll-down-aggressively" + "scroll-error-top-bottom" + "scroll-margin" + "scroll-preserve-screen-position" + "scroll-step" + "scroll-up-aggressively" + "selection-coding-system" + "selective-display-ellipses" + "sentence-end" + "sentence-end-double-space" + "sentence-end-without-period" + "sentence-end-without-space" + "site-run-file" + "small-temporary-file-directory" + "smie-config" + "sort-fold-case" + "sort-numeric-base" + "split-height-threshold" + "split-width-threshold" + "split-window-keep-point" + "split-window-preferred-function" + "switch-to-buffer-in-dedicated-window" + "switch-to-buffer-preserve-window-point" + "switch-to-visible-buffer" + "tab-always-indent" + "tab-stop-list" + "tab-width" + "temp-buffer-max-height" + "temp-buffer-max-width" + "temp-buffer-resize-mode" + "temp-buffer-show-function" + "temporary-file-directory" + "term-file-aliases" + "term-file-prefix" + "three-step-help" + "timer-max-repeats" + "transient-mark-mode" + "truncate-lines" + "truncate-partial-width-windows" + "underline-minimum-offset" + "undo-ask-before-discard" + "undo-limit" + "undo-outer-limit" + "undo-strong-limit" + "user-mail-address" + "version-control" + "visible-bell" + "void-text-area-pointer" + "warning-minimum-level" + "warning-minimum-log-level" + "warning-suppress-log-types" + "warning-suppress-types" + "window-adjust-process-window-size-function" + "window-combination-limit" + "window-combination-resize" + "window-min-height" + "window-min-width" + "window-resize-pixelwise" + "words-include-escapes" + "x-bitmap-file-path" + "x-stretch-cursor" + "yank-excluded-properties" + "yank-handled-properties") "TODO") (defvar +emacs-lisp-command-list - '("debug-on-entry" "cancel-debug-on-entry" "beginning-of-line" "end-of-line" - "forward-line" "count-words" "switch-to-buffer" "switch-to-buffer-other-window" - "switch-to-buffer-other-frame" "pop-to-buffer" "indent-relative" - "indent-relative-maybe" "run-at-time" "write-abbrev-file" - "indent-for-tab-command" "indent-according-to-mode" "newline-and-indent" - "reindent-then-newline-and-indent" "minibuffer-complete-word" - "minibuffer-complete" "minibuffer-complete-and-exit" - "minibuffer-completion-help" "fill-paragraph" "fill-region" - "fill-individual-paragraphs" "fill-region-as-paragraph" "justify-current-line" - "push-button" "forward-button" "backward-button" "append-to-file" "write-region" - "universal-argument" "digit-argument" "negative-argument" "suspend-emacs" - "suspend-frame" "set-input-method" "indent-to" "describe-current-display-table" - "read-color" "smie-close-block" "smie-down-list" "posix-search-forward" - "posix-search-backward" "save-buffer" "save-some-buffers" "write-file" - "signal-process" "exit-minibuffer" "self-insert-and-exit" - "previous-history-element" "next-history-element" - "previous-matching-history-element" "next-matching-history-element" - "previous-complete-history-element" "next-complete-history-element" "load-file" - "load-library" "read-only-mode" "kill-emacs" "indent-region" "indent-rigidly" - "indent-code-rigidly" "play-sound-file" "forward-word" "backward-word" - "auto-save-mode" "do-auto-save" "package-upload-file" "package-upload-buffer" - "other-window" "edebug-display-freq-count" "normal-mode" "fundamental-mode" - "getenv" "setenv" "smie-config-guess" "smie-config-save" - "smie-config-show-indent" "smie-config-set-indent" "search-forward" - "search-backward" "word-search-forward" "word-search-forward-lax" - "word-search-backward" "word-search-backward-lax" "base64-encode-region" - "base64-decode-region" "compile-defun" "byte-compile-file" - "byte-recompile-directory" "execute-extended-command" "backtrace" - "make-frame-on-display" "find-file" "find-file-literally" - "find-file-other-window" "find-file-read-only" "format-write-file" - "format-find-file" "format-insert-file" "enable-command" "disable-command" - "switch-to-prev-buffer" "switch-to-next-buffer" "describe-buffer-case-table" - "recursive-edit" "exit-recursive-edit" "abort-recursive-edit" "top-level" - "replace-buffer-in-windows" "goto-char" "forward-char" "backward-char" - "set-face-foreground" "set-face-background" "set-face-stipple" "set-face-font" - "invert-face" "translate-region" "run-with-idle-timer" "delete-window" - "delete-other-windows" "delete-windows-on" "describe-mode" "select-frame" - "handle-switch-frame" "redraw-display" "apropos" "strong>help-command" - "describe-prefix-bindings" "Helper-describe-bindings" "Helper-help" - "revert-buffer" "narrow-to-region" "narrow-to-page" "widen" "disassemble" - "encode-coding-region" "decode-coding-region" "imenu-add-to-menubar" - "set-keyboard-coding-system" "set-terminal-coding-system" "move-to-window-line" - "display-buffer" "keyboard-quit" "open-dribble-file" "make-local-variable" - "make-variable-buffer-local" "kill-local-variable" "rename-buffer" - "describe-bindings" "move-to-column" "eval-region" "eval-buffer" - "edebug-set-initial-mode" "package-initialize" "insert-buffer" - "self-insert-command" "newline" "list-processes" "quit-window" - "sort-regexp-fields" "sort-lines" "sort-paragraphs" "sort-pages" "sort-fields" - "sort-numeric-fields" "sort-columns" "set-left-margin" "set-right-margin" - "move-to-left-margin" "add-name-to-file" "rename-file" "copy-file" - "make-symbolic-link" "delete-file" "set-file-modes" "insert-char" - "emacs-version" "iconify-frame" "make-frame-visible" "make-frame-invisible" - "minibuffer-inactive-mode" "scroll-up" "scroll-down" "scroll-up-command" - "scroll-down-command" "scroll-other-window" "recenter" "recenter-top-bottom" - "modify-syntax-entry" "describe-syntax" "re-search-forward" "re-search-backward" - "emacs-uptime" "emacs-init-time" "delete-horizontal-space" "delete-indentation" - "fixup-whitespace" "just-one-space" "delete-blank-lines" - "delete-trailing-whitespace" "debug" "scroll-left" "scroll-right" - "blink-matching-open" "global-set-key" "global-unset-key" "local-set-key" - "local-unset-key" "raise-frame" "lower-frame" "delete-frame" - "fit-window-to-buffer" "fit-frame-to-buffer" - "shrink-window-if-larger-than-buffer" "balance-windows" "balance-windows-area" - "maximize-window" "minimize-window" "delete-minibuffer-contents" - "open-termscript" "erase-buffer" "delete-region" "delete-char" - "delete-backward-char" "backward-delete-char-untabify" "capitalize-region" - "downcase-region" "upcase-region" "capitalize-word" "downcase-word" - "upcase-word" "bury-buffer" "unbury-buffer" "make-frame" "view-register" - "insert-register" "kill-region" "copy-region-as-kill" "expand-abbrev" - "abbrev-prefix-mark" "set-frame-font" "list-charset-chars" - "make-indirect-buffer" "clone-indirect-buffer" "make-directory" "copy-directory" - "delete-directory" "locate-library" "list-load-path-shadows" "tab-to-tab-stop" - "kill-buffer" "back-to-indentation" "backward-to-indentation" - "forward-to-indentation" "unload-feature" "read-kbd-macro" "serial-term" - "buffer-enable-undo" "buffer-disable-undo" "text-mode" "prog-mode" - "special-mode" "beginning-of-buffer" "end-of-buffer" "forward-list" - "backward-list" "up-list" "backward-up-list" "down-list" "forward-sexp" - "backward-sexp" "beginning-of-defun" "end-of-defun" "gui-set-selection" - "undefined" "garbage-collect" "describe-categories" "load-theme" "enable-theme" - "disable-theme" "not-modified" "yank" "yank-pop" "split-window-right" - "split-window-below" "set-visited-file-name") + '("abbrev-prefix-mark" + "abort-recursive-edit" + "add-name-to-file" + "append-to-file" + "apropos" + "auto-save-mode" + "back-to-indentation" + "backtrace" + "backward-button" + "backward-char" + "backward-delete-char-untabify" + "backward-list" + "backward-sexp" + "backward-to-indentation" + "backward-up-list" + "backward-word" + "balance-windows" + "balance-windows-area" + "base64-decode-region" + "base64-encode-region" + "beginning-of-buffer" + "beginning-of-defun" + "beginning-of-line" "end-of-line" + "blink-matching-open" + "buffer-disable-undo" + "buffer-enable-undo" + "bury-buffer" + "byte-compile-file" + "byte-recompile-directory" + "cancel-debug-on-entry" + "capitalize-region" + "capitalize-word" + "clone-indirect-buffer" + "compile-defun" + "conf-mode" + "copy-directory" + "copy-file" + "copy-region-as-kill" + "count-words" + "debug" + "debug-on-entry" + "decode-coding-region" + "delete-backward-char" + "delete-blank-lines" + "delete-char" + "delete-directory" + "delete-file" + "delete-frame" + "delete-horizontal-space" + "delete-indentation" + "delete-minibuffer-contents" + "delete-other-windows" + "delete-region" + "delete-trailing-whitespace" + "delete-window" + "delete-windows-on" + "describe-bindings" + "describe-buffer-case-table" + "describe-categories" + "describe-current-display-table" + "describe-mode" + "describe-prefix-bindings" + "describe-syntax" + "digit-argument" + "disable-command" + "disable-theme" + "disassemble" + "display-buffer" + "do-auto-save" + "down-list" + "downcase-region" + "downcase-word" + "edebug-display-freq-count" + "edebug-set-initial-mode" + "emacs-init-time" + "emacs-uptime" + "emacs-version" + "enable-command" + "enable-theme" + "encode-coding-region" + "end-of-buffer" + "end-of-defun" + "erase-buffer" + "eval-buffer" + "eval-region" + "execute-extended-command" + "exit-minibuffer" + "exit-recursive-edit" + "expand-abbrev" + "fill-individual-paragraphs" + "fill-paragraph" + "fill-region" + "fill-region-as-paragraph" + "find-file" + "find-file-literally" + "find-file-other-window" + "find-file-read-only" + "fit-frame-to-buffer" + "fit-window-to-buffer" + "fixup-whitespace" + "format-find-file" + "format-insert-file" + "format-write-file" + "forward-button" + "forward-char" + "forward-line" + "forward-list" + "forward-sexp" + "forward-to-indentation" + "forward-word" + "fundamental-mode" + "garbage-collect" + "getenv" + "global-set-key" + "global-unset-key" + "goto-char" + "gui-set-selection" + "handle-switch-frame" + "Helper-describe-bindings" + "Helper-help" + "iconify-frame" + "imenu-add-to-menubar" + "indent-according-to-mode" + "indent-code-rigidly" + "indent-for-tab-command" + "indent-region" + "indent-relative" + "indent-relative-maybe" + "indent-rigidly" + "indent-to" + "insert-buffer" + "insert-char" + "insert-register" + "invert-face" + "just-one-space" + "justify-current-line" + "keyboard-quit" + "kill-buffer" + "kill-emacs" + "kill-local-variable" + "kill-region" + "list-charset-chars" + "list-load-path-shadows" + "list-processes" + "load-file" + "load-library" + "load-theme" + "local-set-key" + "local-unset-key" + "locate-library" + "lower-frame" + "make-directory" + "make-frame" + "make-frame-invisible" + "make-frame-on-display" + "make-frame-visible" + "make-indirect-buffer" + "make-local-variable" + "make-symbolic-link" + "make-variable-buffer-local" + "maximize-window" + "minibuffer-complete" + "minibuffer-complete-and-exit" + "minibuffer-complete-word" + "minibuffer-completion-help" + "minibuffer-inactive-mode" + "minimize-window" + "modify-syntax-entry" + "move-to-column" + "move-to-left-margin" + "move-to-window-line" + "narrow-to-page" + "narrow-to-region" + "negative-argument" + "newline" + "newline-and-indent" + "next-complete-history-element" + "next-history-element" + "next-matching-history-element" + "normal-mode" + "not-modified" + "open-dribble-file" + "open-termscript" + "other-window" + "package-initialize" + "package-upload-buffer" + "package-upload-file" + "play-sound-file" + "pop-to-buffer" + "posix-search-backward" + "posix-search-forward" + "previous-complete-history-element" + "previous-history-element" + "previous-matching-history-element" + "prog-mode" + "push-button" + "quit-window" + "raise-frame" + "re-search-backward" + "re-search-forward" + "read-color" + "read-kbd-macro" + "read-only-mode" + "recenter" + "recenter-top-bottom" + "recursive-edit" + "redraw-display" + "reindent-then-newline-and-indent" + "rename-buffer" + "rename-file" + "replace-buffer-in-windows" + "revert-buffer" + "run-at-time" + "run-with-idle-timer" + "save-buffer" + "save-some-buffers" + "scroll-down" + "scroll-down-command" + "scroll-left" + "scroll-other-window" + "scroll-right" + "scroll-up" + "scroll-up-command" + "search-backward" + "search-forward" + "select-frame" + "self-insert-and-exit" + "self-insert-command" + "serial-term" + "set-face-background" + "set-face-font" + "set-face-foreground" + "set-face-stipple" + "set-file-modes" + "set-frame-font" + "set-input-method" + "set-keyboard-coding-system" + "set-left-margin" + "set-right-margin" + "set-terminal-coding-system" + "set-visited-file-name" + "setenv" + "shrink-window-if-larger-than-buffer" + "signal-process" + "smie-close-block" + "smie-config-guess" + "smie-config-save" + "smie-config-set-indent" + "smie-config-show-indent" + "smie-down-list" + "sort-columns" + "sort-fields" + "sort-lines" + "sort-numeric-fields" + "sort-pages" + "sort-paragraphs" + "sort-regexp-fields" + "special-mode" + "split-window-below" + "split-window-right" + "strong>help-command" + "suspend-emacs" + "suspend-frame" + "switch-to-buffer" + "switch-to-buffer-other-frame" + "switch-to-buffer-other-window" + "switch-to-next-buffer" + "switch-to-prev-buffer" + "tab-to-tab-stop" + "text-mode" + "top-level" + "translate-region" + "unbury-buffer" + "undefined" + "universal-argument" + "unload-feature" + "up-list" + "upcase-region" + "upcase-word" + "view-register" + "widen" + "word-search-backward" + "word-search-backward-lax" + "word-search-forward" + "word-search-forward-lax" + "write-abbrev-file" + "write-file" + "write-region" + "yank" + "yank-pop") "List of elisp commands.") - -;; (defvar +emacs-lisp-macro-list -;; '("defcustom" "deftheme" "provide-theme" "push" "save-match-data" "pop" -;; "defsubst" "define-alternatives" "with-output-to-temp-buffer" -;; "with-temp-buffer-window" "with-current-buffer-window" -;; "with-displayed-buffer-window" "pcase" "pcase-defmacro" "with-temp-message" -;; "declare-function" "edebug-tracing" "defimage" "setf" -;; "with-output-to-string" "with-syntax-table" "seq-doseq" "seq-let" -;; "with-eval-after-load" "defface" "dotimes-with-progress-reporter" -;; "with-current-buffer" "with-temp-buffer" "delay-mode-hooks" "cl-defgeneric" -;; "cl-defmethod" "gv-define-simple-setter" "gv-define-setter" "defmacro" -;; "with-file-modes" "condition-case-unless-debug" "ignore-errors" -;; "with-demoted-errors" "easy-menu-define" "save-window-excursion" -;; "iter-defun" "iter-lambda" "iter-yield" "iter-yield-from" "iter-do" -;; "setq-local" "defvar-local" "define-generic-mode" "with-local-quit" "dolist" -;; "dotimes" "save-mark-and-excursion" "with-coding-priority" "defun" -;; "define-inline" "inline-quote" "inline-letevals" "inline-const-p" -;; "inline-const-val" "inline-error" "define-minor-mode" -;; "define-globalized-minor-mode" "lazy-completion-table" -;; "define-obsolete-variable-alias" "save-selected-window" -;; "with-selected-window" "declare" "with-help-window" "make-help-screen" -;; "define-derived-mode" "when" "unless" "combine-after-change-calls" -;; "with-case-table" "define-obsolete-face-alias" "noreturn" "def-edebug-spec" -;; "while-no-input" "define-advice" "add-function" "remove-function" "lambda" -;; "define-obsolete-function-alias" "with-temp-file" "defgroup" "with-timeout") -;; "List of elisp macros.") - -;; (defvar +emacs-lisp-special-form-list -;; '("catch" "function" "setq" "eval-and-compile" "eval-when-compile" "defvar" -;; "defconst" "if" "cond" "track-mouse" "save-restriction" "with-no-warnings" -;; "interactive" "save-excursion" "while" "condition-case" "quote" -;; "save-current-buffer" "let" "let*" "and" "or" "setq-default" -;; "unwind-protect" "count-loop" "progn" "prog1" "prog2") -;; "List of elisp special forms.") From 560d16d65177142ce6087d90387be1111d81a92a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 14:02:34 +0200 Subject: [PATCH 2587/4235] lang/python: add support for more env managers + Rewritten +conda support + Adds +pyenv and +pyvenv flags with support. + New +ipython flag to enable ipython REPL support + Added pipenv support. This is the new default, instead of pyenv, and isn't hidden behind a module flag because it is officially endorsed by python. Addresses #736 --- modules/lang/python/+conda.el | 33 ------- modules/lang/python/autoload/conda.el | 8 +- modules/lang/python/autoload/python.el | 22 +++++ modules/lang/python/config.el | 122 +++++++++++++++---------- modules/lang/python/packages.el | 15 ++- 5 files changed, 112 insertions(+), 88 deletions(-) delete mode 100644 modules/lang/python/+conda.el diff --git a/modules/lang/python/+conda.el b/modules/lang/python/+conda.el deleted file mode 100644 index 50d5486f0..000000000 --- a/modules/lang/python/+conda.el +++ /dev/null @@ -1,33 +0,0 @@ -;;; lang/python/+conda.el -*- lexical-binding: t; -*- -;;;###if (featurep! +conda) - -;; Adds conda support to Doom Emacs. `conda-anaconda-home' should be the path to -;; your anaconda installation, and will be guessed from the following: -;; -;; + ~/.anaconda3 -;; + ~/.anaconda -;; + ~/usr/bin/anaconda3 -;; -;; If none of these work, you'll need to set `conda-anaconda-home' yourself. -;; -;; Once set, run M-x `conda-env-activate' to switch between environments OR turn -;; on `conda-env-autoactivate-mode' if you want it done automatically. - -(def-package! conda - :when (featurep! +conda) - :after python - :config - (unless (cl-loop for dir in (list conda-anaconda-home "/usr/bin/anaconda3" "~/.anaconda") - if (file-directory-p dir) - return (setq conda-anaconda-home dir - conda-env-home-directory dir)) - (message "Cannot find Anaconda installation")) - - ;; integration with term/eshell - (conda-env-initialize-interactive-shells) - (after! eshell (conda-env-initialize-eshell)) - - (add-hook! '(conda-postactivate-hook conda-postdeactivate-hook) - #'+python|add-conda-env-to-modeline) - - (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) diff --git a/modules/lang/python/autoload/conda.el b/modules/lang/python/autoload/conda.el index 1d0a25f96..3449b6b15 100644 --- a/modules/lang/python/autoload/conda.el +++ b/modules/lang/python/autoload/conda.el @@ -16,12 +16,10 @@ executable and packages." (message "Successfully changed conda home to: %s" (abbreviate-file-name home)))) ;;;###autoload -(defun +python|add-conda-env-to-modeline () +(defun +python-conda-env () "Add conda environment string to the major mode modeline segment." - (setq mode-name - (if conda-env-current-name - (format "Py:conda:%s" conda-env-current-name) - "Python"))) + (when conda-env-current-name + (format "conda:%s" conda-env-current-name))) ;;;###autoload (defun +python*anaconda-mode-bootstrap-in-remote-environments (&optional callback) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index c6ae3b17c..4f4030763 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -5,3 +5,25 @@ "Open the Python REPL." (interactive) (process-buffer (run-python nil t t))) + +;;;###autoload +(defun +python-version () + "Return the currently installed version of python on your system or active in +the current pipenv. + +This is not necessarily aware of env management tools like virtualenv, pyenv or +pipenv, unless those tools have modified the PATH that Emacs picked up when you +started it." + (let* ((command (if (pipenv-project-p) + "pipenv run python --version" + "python --version")) + (bin (car (split-string command " ")))) + (unless (executable-find bin) + (user-error "Couldn't find %s executable in PATH" bin)) + (with-temp-buffer + (let ((p (apply #'call-process bin nil (current-buffer) nil + (cdr (split-string command " " t)))) + (output (string-trim (buffer-string)))) + (unless (zerop p) + (user-error "'%s' failed: %s" command output)) + (nth 1 (split-string output " " t)))))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 8a123d636..65f05def7 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,14 +1,9 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- -(defvar +python-pyenv-root nil - "The path to pyenv's root directory. This is automatically set when `python' -is loaded.") - -(defvar +python-pyenv-versions nil - "Available versions of python in pyenv.") - -(defvar-local +python-current-version nil - "The currently active pyenv version.") +(defvar +python-mode-name-functions '(+python-version) + "A list of functions to retrieve a version or environment string from. The +first to return non-nil will have its result appended to the python-mode +`mode-name' and displayed in the mode-line.") ;; @@ -22,7 +17,7 @@ is loaded.") python-indent-guess-indent-offset-verbose nil python-shell-interpreter "python") :config - (set-env! "PYTHONPATH" "PYENV_ROOT") + (set-env! "PYTHONPATH" "PYENV") (set-electric! 'python-mode :chars '(?:)) (set-repl-handler! 'python-mode #'+python/repl) @@ -44,7 +39,11 @@ is loaded.") :for "for" :return "return" :yield "yield") - (when (executable-find "ipython") + (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens + (sp-with-modes 'python-mode + (sp-local-pair "'" nil :unless '(sp-point-before-word-p sp-point-after-word-p sp-point-before-same-p))) + + (when (featurep! +ipython) (setq python-shell-interpreter "ipython" python-shell-interpreter-args "-i --simple-prompt --no-color-info" python-shell-prompt-regexp "In \\[[0-9]+\\]: " @@ -55,45 +54,21 @@ is loaded.") python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) - ;; Version management with pyenv (defun +python|add-version-to-modeline () "Add version string to the major mode in the modeline." (setq mode-name - (if +python-current-version - (format "Python %s" +python-current-version) + (if-let* ((result (run-hook-with-args-until-success '+python-mode-name-functions))) + (format "Python %s" result) "Python"))) - (add-hook 'python-mode-hook #'+python|add-version-to-modeline) - - (if (not (executable-find "pyenv")) - (setq-default +python-current-version (string-trim (shell-command-to-string "python --version 2>&1 | cut -d' ' -f2"))) - (setq +python-pyenv-root (string-trim (shell-command-to-string "pyenv root")) - +python-pyenv-versions (split-string (shell-command-to-string "pyenv versions --bare") "\n" t)) - - (defun +python|detect-pyenv-version () - "Detect the pyenv version for the current project and set the relevant -environment variables." - (when-let* ((version-str (shell-command-to-string "PYENV_VERSION= python --version 2>&1 | cut -d' ' -f2"))) - (setq version-str (string-trim version-str) - +python-current-version version-str) - (let ((pyenv-current-path (concat +python-pyenv-root "/versions/" version-str))) - (when (file-directory-p pyenv-current-path) - (setq pythonic-environment pyenv-current-path))) - (when (member version-str +python-pyenv-versions) - (setenv "PYENV_VERSION" version-str)))) - (add-hook 'python-mode-hook #'+python|detect-pyenv-version)) - - (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens - (sp-with-modes 'python-mode - (sp-local-pair "'" nil :unless '(sp-point-before-word-p sp-point-after-word-p sp-point-before-same-p)))) + (add-hook 'python-mode-hook #'+python|add-version-to-modeline)) (def-package! anaconda-mode - :after python + :hook python-mode :init (setq anaconda-mode-installation-directory (concat doom-etc-dir "anaconda/") anaconda-mode-eldoc-as-single-line t) :config - (add-hook 'python-mode-hook #'anaconda-mode) (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) (set-company-backend! 'python-mode '(company-anaconda)) (set-popup-rule! "^\\*anaconda-mode" :select nil) @@ -111,6 +86,8 @@ environment variables." (add-hook! 'python-mode-hook (add-hook 'kill-buffer-hook #'+python|auto-kill-anaconda-processes nil t)) + (when (featurep 'evil) + (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps)) (map! :map anaconda-mode-map :localleader :prefix "f" @@ -123,13 +100,14 @@ environment variables." (def-package! nose :commands nose-mode - :preface - (defvar nose-mode-map (make-sparse-keymap)) - :init - (associate! nose-mode :match "/test_.+\\.py$" :modes (python-mode)) + :preface (defvar nose-mode-map (make-sparse-keymap)) + :init (associate! nose-mode :match "/test_.+\\.py$" :modes (python-mode)) :config (set-popup-rule! "^\\*nosetests" :size 0.4 :select nil) (set-yas-minor-mode! 'nose-mode) + (when (featurep 'evil) + (add-hook 'nose-mode-hook #'evil-normalize-keymaps)) + (map! :map nose-mode-map :localleader :prefix "t" @@ -143,9 +121,59 @@ environment variables." ;; -;; Evil integration +;; Environment management ;; -(when (featurep! :feature evil +everywhere) - (add-hook! '(anaconda-mode-hook nose-mode-hook) - #'evil-normalize-keymaps)) +(def-package! pipenv + :commands pipenv-project-p + :hook (python-mode . pipenv-mode)) + + +(def-package! pyenv-mode + :when (featurep! +pyenv) + :after python + :config + (pyenv-mode +1) + (add-to-list '+python-mode-name-functions #'pyenv-mode-version nil #'eq)) + + +(def-package! pyvenv + :when (featurep! +pyvenv) + :after python + :config + (defun +python-current-pyvenv () pyvenv-virtual-env-name) + (add-to-list '+python-mode-name-functions #'+python-current-pyvenv nil #'eq)) + + +(def-package! conda + :when (featurep! +conda) + :after python + :config + ;; Adds conda support to Doom Emacs. `conda-anaconda-home' should be the path + ;; to your anaconda installation, and will be guessed from the following: + ;; + ;; + ~/.anaconda3 + ;; + ~/.anaconda + ;; + ~/.miniconda + ;; + ~/usr/bin/anaconda3 + ;; + ;; If none of these work, you'll need to set `conda-anaconda-home' yourself. + ;; + ;; Once set, run M-x `conda-env-activate' to switch between environments OR + ;; turn on `conda-env-autoactivate-mode' if you want it done automatically. + (unless (cl-loop for dir in (list conda-anaconda-home + "~/.anaconda" + "~/.miniconda" + "/usr/bin/anaconda3") + if (file-directory-p dir) + return (setq conda-anaconda-home dir + conda-env-home-directory dir)) + (message "Cannot find Anaconda installation")) + + ;; integration with term/eshell + (conda-env-initialize-interactive-shells) + (after! eshell (conda-env-initialize-eshell)) + + (add-to-list '+python-mode-name-functions #'+python-conda-env nil #'eq) + + (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index 0b67053d2..24e5b85af 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -1,12 +1,21 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/python/packages.el -;; requires: python jedi setuptools +;; requires: python setuptools (package! nose) (package! pip-requirements) + +;; Environmet management +(package! pipenv) +(when (featurep! +pyenv) + (package! pyenv-mode)) +(when (featurep! +pyvenv) + (package! pyvenv-mode)) +(when (featurep! +conda) + (package! conda)) + +;; Programming environment (when (package! anaconda-mode) (when (featurep! :completion company) (package! company-anaconda))) -(when (featurep! +conda) - (package! conda)) From 3948255445bc4445f5688b4b305a06feac31d4ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 14:22:38 +0200 Subject: [PATCH 2588/4235] lang/ruby: rewrite rbenv support; add rvm support --- modules/lang/ruby/autoload.el | 17 +++++++++++ modules/lang/ruby/config.el | 56 ++++++++++++++++------------------- modules/lang/ruby/packages.el | 6 ++-- 3 files changed, 46 insertions(+), 33 deletions(-) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index 8f9519283..980fdd2ce 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -13,3 +13,20 @@ buffers open." (when (processp process) (kill-process (get-buffer-process inf-buffer)) (kill-buffer inf-buffer))))))) + +;;;###autoload +(defun +ruby-version () + "Return the currently installed version of ruby on your system (the first +ruby executable found in your PATH). + +This is not necessarily aware of env management tools like virtualenv, pyenv or +pipenv, unless those tools have modified the PATH that Emacs picked up when you +started it." + (unless (executable-find "ruby") + (user-error "Couldn't find ruby executable in PATH")) + (with-temp-buffer + (let ((p (call-process "ruby" nil (current-buffer) nil "--version")) + (output (string-trim (buffer-string)))) + (unless (zerop p) + (user-error "ruby --version failed: %s" output)) + (nth 1 (split-string output " " t))))) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 5c668a533..d787ffaf0 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -1,10 +1,9 @@ ;;; lang/ruby/config.el -*- lexical-binding: t; -*- -(defvar +ruby-rbenv-versions nil - "Available versions of ruby in rbenv.") - -(defvar-local +ruby-current-version nil - "The currently active ruby version.") +(defvar +ruby-mode-name-functions '(+ruby-version) + "A list of functions to retrieve a version or environment string from. The +first to return non-nil will have its result appended to the ruby-mode +`mode-name' and displayed in the mode-line.") ;; @@ -18,47 +17,24 @@ :mode "\\.\\(?:pry\\|irb\\)rc\\'" :mode "/\\(?:Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file\\'" :config - (set-env! "RBENV_ROOT") (set-electric! 'enh-ruby-mode :words '("else" "end" "elsif")) (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' ;; so class and module pairs work (setq-hook! 'enh-ruby-mode-hook sp-max-pair-length 6) - ;; Version management with rbenv (defun +ruby|add-version-to-modeline () "Add version string to the major mode in the modeline." (setq mode-name - (if +ruby-current-version - (format "Ruby %s" +ruby-current-version) + (if-let* ((result (run-hook-with-args-until-success '+ruby-mode-name-functions))) + (format "Ruby %s" result) "Ruby"))) - (add-hook 'enh-ruby-mode-hook #'+ruby|add-version-to-modeline) - - (if (not (executable-find "rbenv")) - (setq-default +ruby-current-version (string-trim (shell-command-to-string "ruby --version 2>&1 | cut -d' ' -f2"))) - (setq +ruby-rbenv-versions (split-string (shell-command-to-string "rbenv versions --bare") "\n" t)) - - (defun +ruby|detect-rbenv-version () - "Detect the rbenv version for the current project and set the relevant -environment variables." - (when-let* ((version-str (shell-command-to-string "RBENV_VERSION= ruby --version 2>&1 | cut -d' ' -f2"))) - (setq version-str (string-trim version-str) - +ruby-current-version version-str) - (when (member version-str +ruby-rbenv-versions) - (setenv "RBENV_VERSION" version-str)))) - (add-hook 'enh-ruby-mode-hook #'+ruby|detect-rbenv-version))) + (add-hook 'enh-ruby-mode-hook #'+ruby|add-version-to-modeline)) (def-package! yard-mode :hook enh-ruby-mode) -(def-package! rbenv - :after enh-ruby-mode - :config - (when (executable-find "rbenv") - (global-rbenv-mode +1))) - - (def-package! rubocop :hook (enh-ruby-mode . rubocop-mode) :config @@ -127,3 +103,21 @@ environment variables." :after inf-ruby :config (set-company-backend! 'inf-ruby-mode 'company-inf-ruby)) + +;; +;; Version managers +;; + +(def-package! rbenv + :when (featurep! +rbenv) + :after enh-ruby-mode + :config + (set-env! "RBENV_ROOT") + (when (executable-find "rbenv") + (global-rbenv-mode +1))) + + +(def-package! rvm + :when (featurep! +rvm) + :after enh-ruby-mode) + diff --git a/modules/lang/ruby/packages.el b/modules/lang/ruby/packages.el index 661a8d1b8..5bcef5610 100644 --- a/modules/lang/ruby/packages.el +++ b/modules/lang/ruby/packages.el @@ -4,7 +4,6 @@ ;; requires ruby ruby-lint (package! enh-ruby-mode) -(package! rbenv) (package! rubocop) (package! inf-ruby) (package! rspec-mode) @@ -15,4 +14,7 @@ (when (featurep! :completion company) (package! company-inf-ruby)) - +(when (featurep! +rbenv) + (package! rbenv)) +(when (featurep! +rvm) + (package! rvm)) From 74b700f9a7a19a61798ff6d25d2e9869af91c984 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 16:33:16 +0200 Subject: [PATCH 2589/4235] Add copy-to-clipboard support to :gbr & +vc/git-browse --- modules/config/default/+evil-commands.el | 2 +- modules/emacs/vc/autoload/evil.el | 8 ++++++++ .../emacs/vc/{autoload.el => autoload/vc.el} | 17 ++++++++++------- 3 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 modules/emacs/vc/autoload/evil.el rename modules/emacs/vc/{autoload.el => autoload/vc.el} (91%) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 662d2718f..cce6952ac 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -70,7 +70,7 @@ command from the current directory instead of the project root." ;; GIT (ex! "gist" #'+gist:send) ; send current buffer/region to gist (ex! "gistl" #'+gist:list) ; list gists by user -(ex! "gbrowse" #'+vc/git-browse) ; show file in github/gitlab +(ex! "gbrowse" #'+vc:git-browse) ; show file in github/gitlab (ex! "gissues" #'+vc/git-browse-issues) ; show github issues (ex! "git" #'magit-status) ; open magit status window (ex! "gstage" #'magit-stage) diff --git a/modules/emacs/vc/autoload/evil.el b/modules/emacs/vc/autoload/evil.el new file mode 100644 index 000000000..15bcc1b1e --- /dev/null +++ b/modules/emacs/vc/autoload/evil.el @@ -0,0 +1,8 @@ +;;; emacs/vc/autoload/evil.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) + +;;;###autoload (autoload '+vc:git-browse "emacs/vc/autoload/evil" nil t) +(evil-define-command +vc:git-browse (bang) + "Ex interface to `+vc/git-browse'." + (interactive "") + (+vc/git-browse bang)) diff --git a/modules/emacs/vc/autoload.el b/modules/emacs/vc/autoload/vc.el similarity index 91% rename from modules/emacs/vc/autoload.el rename to modules/emacs/vc/autoload/vc.el index 7460edcba..8994a7dad 100644 --- a/modules/emacs/vc/autoload.el +++ b/modules/emacs/vc/autoload/vc.el @@ -1,4 +1,4 @@ -;;; emacs/vc/autoload.el -*- lexical-binding: t; -*- +;;; emacs/vc/autoload/vc.el -*- lexical-binding: t; -*- ;;;###autoload (defun +vc-git-root-url () @@ -13,21 +13,24 @@ (defvar git-link-open-in-browser) ;;;###autoload -(defun +vc/git-browse () +(defun +vc/git-browse (arg) "Open the website for the current version controlled file. Fallback to repository root." - (interactive) + (interactive "P") (require 'git-link) (cl-destructuring-bind (beg end) (if buffer-file-name (git-link--get-region)) - (let ((git-link-open-in-browser t)) + (let ((git-link-open-in-browser (not arg))) (git-link (git-link--select-remote) beg end)))) ;;;###autoload -(defun +vc/git-browse-issues () +(defun +vc/git-browse-issues (arg) "Open the issues page for current repo." - (interactive) - (browse-url (format "%s/issues" (+vc-git-root-url)))) + (interactive "P") + (let ((url (format "%s/issues" (+vc-git-root-url)))) + (if arg + (message "%s" (kill-new url)) + (browse-url url)))) ;;;###autoload (defun +vc/git-browse-pulls () From b62e40b10b843f61b74508b242319d19c89c0fa1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 16:54:38 +0200 Subject: [PATCH 2590/4235] ui/modeline: add +modeline-width option --- modules/ui/modeline/config.el | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 49e0f7566..9b53dfeac 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -13,6 +13,9 @@ ;; Old system: ~0.563 - 0.604 ;; New system: ~0.036 - 0.061 +(defvar +modeline-width 3 + "How wide the mode-line bar should be (only respected in GUI emacs).") + (defvar +modeline-height 21 "How tall the mode-line should be (only respected in GUI emacs).") @@ -233,15 +236,16 @@ buffers.") (defvar +modeline-bar-inactive nil "TODO") (defun +modeline|setup-bars () (setq +modeline-bar-active - (+modeline--make-xpm 3 +modeline-height (face-background 'doom-modeline-bar)) + (+modeline--make-xpm +modeline-width +modeline-height (face-background 'doom-modeline-bar)) +modeline-bar-inactive - (+modeline--make-xpm 3 +modeline-height))) + (+modeline--make-xpm +modeline-width +modeline-height))) (add-hook 'doom-load-theme-hook #'+modeline|setup-bars) -(defun +modeline|setup-bars-after-change (_sym val op _where) +(defun +modeline|setup-bars-after-change (sym val op _where) (when (eq op 'set) - (let ((+modeline-height val)) - (+modeline|setup-bars)))) + (set sym val) + (+modeline|setup-bars))) +(add-variable-watcher '+modeline-width #'+modeline|setup-bars-after-change) (add-variable-watcher '+modeline-height #'+modeline|setup-bars-after-change) (def-modeline-segment! +modeline-bar From b3f2a8cd5468178c7f2eac21d3e786d4413de65f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 18:40:11 +0200 Subject: [PATCH 2591/4235] ui/modeline: minor refactor Add +modeline-segment-active-p predicate function. --- modules/ui/modeline/autoload/settings.el | 17 ++++++++++++++--- modules/ui/modeline/config.el | 13 ++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/modules/ui/modeline/autoload/settings.el b/modules/ui/modeline/autoload/settings.el index 26aa59a77..f4891edba 100644 --- a/modules/ui/modeline/autoload/settings.el +++ b/modules/ui/modeline/autoload/settings.el @@ -2,6 +2,18 @@ (defvar +modeline--alist nil) +(defun +modeline--segment-active-p (segment xs) + (cond ((null xs) nil) + ((listp xs) + (or (+modeline--segment-active-p segment (car xs)) + (+modeline--segment-active-p segment (cdr xs)))) + ((eq xs segment)))) + +;;;###autoload +(defun +modeline-segment-active-p (segment) + (or (+modeline--segment-active-p segment +modeline-format-left) + (+modeline--segment-active-p segment +modeline-format-right))) + ;;;###autodef (defun def-modeline-format! (name left &optional right) "Define a preset modeline format by name. @@ -48,8 +60,7 @@ keep them left and right aligned respectively." (varsetterfn (intern (format "+modeline--setvar-%s" name)))) (append `((fset ',setterfn (lambda (&rest _) - (when (or (memq ',name +modeline-format-left) - (memq ',name +modeline-format-right)) + (when (+modeline-segment-active-p ',name) (setq-local ,realvar ,(macroexp-progn body))))) (byte-compile ',setterfn)) (mapcar (lambda (hook) `(add-hook ',hook #',setterfn)) @@ -61,7 +72,7 @@ keep them left and right aligned respectively." (with-current-buffer where (set sym val) (,setterfn))))) - ,@(mapcar (lambda (var) `(add-variable-watcher ',var #',varsetterfn)) + ,@(mapcan (lambda (var) `((add-variable-watcher ',var #',varsetterfn))) on-set))))) (setq init `(quote (:eval ,(macroexp-progn body)))) nil)) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 9b53dfeac..90b6dd29a 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -316,8 +316,7 @@ buffers.") (let ((face 'mode-line-inactive) (active (active)) (all-the-icons-default-adjust -0.1)) - (concat " " - (cond ((memq state '(edited added)) + (concat (cond ((memq state '(edited added)) (if active (setq face 'doom-modeline-info)) (all-the-icons-octicon "git-compare" @@ -340,8 +339,7 @@ buffers.") :v-adjust -0.05))) " " (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face)) - " "))))) + 'face (if active face))))))) (def-modeline-segment! +modeline-encoding :on-hooks (after-revert-hook after-save-hook find-file-hook) @@ -495,9 +493,10 @@ segment.") +modeline-buffer-state +modeline-buffer-id " %2l:%c %p ") - '(+modeline-encoding - +modeline-major-mode - +modeline-vcs)) + `(+modeline-encoding + +modeline-major-mode " " + mode-line-misc-info + (+modeline-vcs (" " +modeline-vcs " ")))) (def-modeline-format! :minimal '(+modeline-matches " " From fb3d3852110c557ceb02cd6da4cbaed0ecaaa986 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 18:40:54 +0200 Subject: [PATCH 2592/4235] ui/modeline: add flycheck segment --- modules/ui/modeline/config.el | 42 ++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 90b6dd29a..20e6a73e5 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -483,6 +483,45 @@ segment.") ((add-hook 'activate-mark-hook #'+modeline|enable-selection-info) (add-hook 'deactivate-mark-hook #'+modeline|disable-selection-info))) +;; flycheck +(defvar +modeline--vspc (propertize " " 'face 'variable-pitch)) + +(defun +doom-ml-icon (icon &optional text face voffset) + "Displays an octicon ICON with FACE, followed by TEXT. Uses +`all-the-icons-octicon' to fetch the icon." + (concat (when icon + (concat + (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) + (if text +modeline--vspc))) + (if text (propertize text 'face face)))) + +(defun +modeline-flycheck-status (status) + (pcase status + (`finished (if flycheck-current-errors + (let-alist (flycheck-count-errors flycheck-current-errors) + (let ((sum (+ (or .error 0) (or .warning 0)))) + (+doom-ml-icon "do_not_disturb_alt" + (number-to-string sum) + (if .error 'doom-modeline-urgent 'doom-modeline-warning) + -0.25))) + (+doom-ml-icon "check" nil 'doom-modeline-info))) + (`running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) + (`no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) + (`errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) + (`interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face)))) + +(defun +doom-modeline|update-flycheck-segment (&optional status) + (setq +modeline-flycheck + (when-let* ((status-str (+modeline-flycheck-status status))) + (concat +modeline--vspc status-str)))) +(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) +(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) + +(def-modeline-segment! +modeline-flycheck + "Displays color-coded flycheck error status in the current buffer with pretty +icons." + :init nil) + ;; ;; Preset modeline formats @@ -496,7 +535,8 @@ segment.") `(+modeline-encoding +modeline-major-mode " " mode-line-misc-info - (+modeline-vcs (" " +modeline-vcs " ")))) + (+modeline-vcs (" " +modeline-vcs " ")) + +modeline-flycheck)) (def-modeline-format! :minimal '(+modeline-matches " " From a7bef8ec88bf36941fccc840e16947b0bc27052c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 18:41:34 +0200 Subject: [PATCH 2593/4235] app/write: refactor Removed autoloads that are already defined by packages. --- modules/app/write/autoload.el | 2 +- modules/app/write/config.el | 25 +++++-------------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/modules/app/write/autoload.el b/modules/app/write/autoload.el index bda944dda..935302a45 100644 --- a/modules/app/write/autoload.el +++ b/modules/app/write/autoload.el @@ -19,6 +19,6 @@ (defun +write|init-org-mode () "Initializes `org-mode' specific settings for `+write-mode'." (when (eq major-mode 'org-mode) - (let ((arg (if +write-mode +1 -1))) + (let ((arg (if +write-mode +1 -1))) (+org-pretty-mode arg) (org-indent-mode (if +write-mode -1 +1))))) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index cda5bc559..84ffe0d35 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -23,11 +23,9 @@ :when (featurep! +langtool) :commands (langtool-check langtool-check-done - langtool-switch-default-language langtool-show-message-at-point langtool-correct-buffer) - :init - (setq langtool-default-language "en-US") + :init (setq langtool-default-language "en-US") :config (defvar langtool-language-tool-jar (cond (IS-MAC @@ -39,25 +37,12 @@ "/usr/share/java/languagetool/languagetool-commandline.jar")))) -(def-package! wordnut - :when (featurep! +wordnut) - :commands (wordnut-search - wordnut-lookup-current-word)) +;; `synosaurus' +(setq synosaurus-choose-method 'default) -(def-package! synosaurus - :commands (synosaurus-mode - synosaurus-lookup - synosaurus-choose-and-replace) - :config - (setq synosaurus-choose-method 'default)) - -(def-package! synosaurus-wordnet - :commands synosaurus-backend-wordnet) - - -(def-package! mixed-pitch - :config +;; `mixed-pitch' +(after! mixed-pitch (setq mixed-pitch-fixed-pitch-faces (append mixed-pitch-fixed-pitch-faces '(org-todo-keyword-todo From 0a746bdf1efcfe0e5d08b4a1fceef0d27bf68739 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 19:11:10 +0200 Subject: [PATCH 2594/4235] app/write: fixed-pitch for org-todo & line numbers --- modules/app/write/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 84ffe0d35..59ed02762 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -51,6 +51,9 @@ org-todo-keyword-wait org-todo-keyword-kill org-todo-keyword-outd + org-todo + line-number + line-number-current-line org-special-keyword org-date org-property-value From 9079fdd9eca4051fc5a039a650b0dbe21110c0ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 19:11:41 +0200 Subject: [PATCH 2595/4235] app/write: fix +write-mode not disabling other modes --- modules/app/write/config.el | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 59ed02762..2f85f1eb3 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -6,12 +6,23 @@ (defvar +write-line-spacing nil "What to set `line-spacing' in `+write-mode'.") +(defun +write|init-line-numbers () + (if +write-mode + (doom|enable-line-numbers) + (doom|disable-line-numbers))) + +(defun +write|init-mixed-pitch () + (mixed-pitch-mode (if +write-mode +1 -1))) + +(defun +write|init-visual-fill-column () + (visual-fill-column-mode (if +write-mode +1 -1))) + (add-hook! '+write-mode-hook #'(flyspell-mode - visual-fill-column-mode visual-line-mode - mixed-pitch-mode - doom|enable-line-numbers + +write|init-mixed-pitch + +write|init-visual-fill-column + +write|init-line-numbers +write|init-org-mode)) From 26cc2a4f8ab381006365cc5a7ef5c63a30ffe9c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 19:12:40 +0200 Subject: [PATCH 2596/4235] app/write: don't tamper with org-indent-mode --- modules/app/write/autoload.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/app/write/autoload.el b/modules/app/write/autoload.el index 935302a45..46ebe462b 100644 --- a/modules/app/write/autoload.el +++ b/modules/app/write/autoload.el @@ -19,6 +19,4 @@ (defun +write|init-org-mode () "Initializes `org-mode' specific settings for `+write-mode'." (when (eq major-mode 'org-mode) - (let ((arg (if +write-mode +1 -1))) - (+org-pretty-mode arg) - (org-indent-mode (if +write-mode -1 +1))))) + (+org-pretty-mode (if +write-mode +1 -1)))) From d9a52e1094e2be2f7e672941caad9abef293fbdf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 19:20:58 +0200 Subject: [PATCH 2597/4235] Fix company/lookup settings in anaconda-mode Applying them to python-mode means it would happen too late. --- modules/lang/python/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 65f05def7..6aadb41b9 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -70,12 +70,12 @@ first to return non-nil will have its result appended to the python-mode anaconda-mode-eldoc-as-single-line t) :config (add-hook 'anaconda-mode-hook #'anaconda-eldoc-mode) - (set-company-backend! 'python-mode '(company-anaconda)) - (set-popup-rule! "^\\*anaconda-mode" :select nil) - (set-lookup-handlers! 'python-mode + (set-company-backend! 'anaconda-mode '(company-anaconda)) + (set-lookup-handlers! 'anaconda-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) + (set-popup-rule! "^\\*anaconda-mode" :select nil) (defun +python|auto-kill-anaconda-processes () "Kill anaconda processes if this buffer is the last python buffer." From 8d486b755ebfef2b7b4a6eac5cc56dfee401bb5a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 19:33:27 +0200 Subject: [PATCH 2598/4235] Add app/notmuch module (WIP) --- modules/app/notmuch/autoload.el | 183 ++++++++++++++++++++++++++++++++ modules/app/notmuch/config.el | 68 ++++++++++++ modules/app/notmuch/packages.el | 9 ++ 3 files changed, 260 insertions(+) create mode 100644 modules/app/notmuch/autoload.el create mode 100644 modules/app/notmuch/config.el create mode 100644 modules/app/notmuch/packages.el diff --git a/modules/app/notmuch/autoload.el b/modules/app/notmuch/autoload.el new file mode 100644 index 000000000..afccecd52 --- /dev/null +++ b/modules/app/notmuch/autoload.el @@ -0,0 +1,183 @@ +;;; app/notmuch/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun =notmuch () + "Activate (or switch to) `notmuch' in its workspace." + (interactive) + (unless (featurep! :feature workspaces) + (user-error ":feature workspaces is required, but disabled")) + (condition-case-unless-debug e + (progn + (+workspace-switch "*MAIL*" t) + (if-let* ((buf (cl-find-if (lambda (it) (string-match-p "^\\*notmuch" (buffer-name (window-buffer it)))) + (doom-visible-windows)))) + (select-window (get-buffer-window buf)) + (notmuch-search "tag:inbox")) + (+workspace/display)) + ('error + (+notmuch/quit) + (signal (car e) (cdr e))))) + + +;; +;; Commands +;; + +;;;###autoload +(defun +notmuch/quit () + (interactive) + ;; (+popup/close (get-buffer-window "*notmuch-hello*")) + (doom-kill-matching-buffers "^\\*notmuch") + (+workspace/delete "*MAIL*")) + +;;;###autoload +(defun +notmuch/update () + (interactive) + (start-process-shell-command + "notmuch update" nil + "cd ~/.mail/account.gmail && /usr/local/bin/gmi push && /usr/local/bin/gmi pull && /usr/local/bin/notmuch new && /usr/local/bin/afew -a -t")) + +;;;###autoload +(defun +notmuch/search-delete () + (interactive) + (notmuch-search-add-tag (list "+trash" "-inbox" "-unread")) + (notmuch-tree-next-message)) + +;;;###autoload +(defun +notmuch/tree-delete () + (interactive) + (notmuch-tree-add-tag (list "+trash" "-inbox" "-unread")) + (notmuch-tree-next-message)) + +;;;###autoload +(defun +notmuch/search-spam () + (interactive) + (notmuch-search-add-tag (list "+spam" "-inbox" "-unread")) + (notmuch-search-next-thread)) + +;;;###autoload +(defun +notmuch/tree-spam () + (interactive) + (notmuch-tree-add-tag (list "+spam" "-inbox" "-unread")) + (notmuch-tree-next-message)) + +;;;###autoload +(defun +notmuch/open-message-with-mail-app-notmuch-tree () + (interactive) + (let* ((msg-path (car (plist-get (notmuch-tree-get-message-properties) :filename))) + (temp (make-temp-file "notmuch-message-" nil ".eml"))) + (shell-command-to-string (format "cp '%s' '%s'" msg-path temp)) + (start-process-shell-command "email" nil (format "xdg-open '%s'" temp)))) + +;;;###autoload +(defun +notmuch/open-message-with-mail-app-notmuch-show () + (interactive) + (let* ((msg-path (car (plist-get (notmuch-show-get-message-properties) :filename))) + (temp (make-temp-file "notmuch-message-" nil ".eml"))) + (shell-command-to-string (format "cp '%s' '%s'" msg-path temp)) + (start-process-shell-command "email" nil (format "xdg-open '%s'" temp)))) + + +;; +;; Advice +;; + +;;;###autoload +(defun +notmuch*dont-confirm-on-kill-process (orig-fn &rest args) + "Don't prompt for confirmation when killing notmuch sentinel." + (let (confirm-kill-processes) + (apply orig-fn args))) + +;; (defun +notmuch*hello-insert-searches (title query-list &rest options) +;; (widget-insert (propertize title 'face 'org-agenda-structure)) +;; (if (and notmuch-hello-first-run (plist-get options :initially-hidden)) +;; (add-to-list 'notmuch-hello-hidden-sections title)) +;; (let ((is-hidden (member title notmuch-hello-hidden-sections)) +;; (widget-push-button-prefix "") +;; (widget-push-button-suffix "") +;; (start (point))) +;; (if is-hidden +;; (widget-create 'push-button +;; :notify `(lambda (widget &rest ignore) +;; (setq notmuch-hello-hidden-sections +;; (delete ,title notmuch-hello-hidden-sections)) +;; (notmuch-hello-update)) +;; (propertize " +" 'face 'org-agenda-structure)) +;; (widget-create 'push-button +;; :notify `(lambda (widget &rest ignore) +;; (add-to-list 'notmuch-hello-hidden-sections +;; ,title) +;; (notmuch-hello-update)) +;; " -")) +;; (widget-insert "\n") +;; (when (not is-hidden) +;; (let ((searches (apply 'notmuch-hello-query-counts query-list options))) +;; (when (or (not (plist-get options :hide-if-empty)) +;; searches) +;; (widget-insert "\n") +;; (notmuch-hello-insert-buttons searches) +;; (indent-rigidly start (point) notmuch-hello-indent)))))) + +;; (defun +notmuch*hello-insert-saved-searches () +;; "Insert the saved-searches section." +;; (let ((searches (notmuch-hello-query-counts +;; (if notmuch-saved-search-sort-function +;; (funcall notmuch-saved-search-sort-function +;; notmuch-saved-searches) +;; notmuch-saved-searches) +;; :show-empty-searches notmuch-show-empty-saved-searches))) +;; (when searches +;; (widget-insert (propertize "Notmuch" 'face 'org-agenda-date-today)) +;; (widget-insert "\n\n") +;; (widget-insert (propertize "Saved searches" 'face 'org-agenda-structure)) +;; (widget-insert "\n\n") +;; (let ((start (point))) +;; (notmuch-hello-insert-buttons searches) +;; (indent-rigidly start (point) notmuch-hello-indent))))) + +;; (defun +notmuch*hello-insert-buttons (searches) +;; (let* ((widest (notmuch-hello-longest-label searches)) +;; (tags-and-width (notmuch-hello-tags-per-line widest)) +;; (tags-per-line (car tags-and-width)) +;; (column-width (cdr tags-and-width)) +;; (column-indent 0) +;; (count 0) +;; (reordered-list (notmuch-hello-reflect searches tags-per-line)) +;; ;; Hack the display of the buttons used. +;; (widget-push-button-prefix "") +;; (widget-push-button-suffix "")) +;; ;; dme: It feels as though there should be a better way to +;; ;; implement this loop than using an incrementing counter. +;; (mapc (lambda (elem) +;; ;; (not elem) indicates an empty slot in the matrix. +;; (when elem +;; (if (> column-indent 0) +;; (widget-insert (make-string column-indent ? ))) +;; (let* ((name (plist-get elem :name)) +;; (query (plist-get elem :query)) +;; (oldest-first (case (plist-get elem :sort-order) +;; (newest-first nil) +;; (oldest-first t) +;; (otherwise notmuch-search-oldest-first))) +;; (search-type (eq (plist-get elem :search-type) 'tree)) +;; (msg-count (plist-get elem :count))) +;; (widget-insert (format "\n%5s " +;; (notmuch-hello-nice-number msg-count))) +;; (widget-create 'push-button +;; :notify #'notmuch-hello-widget-search +;; :notmuch-search-terms query +;; :notmuch-search-oldest-first oldest-first +;; :notmuch-search-type search-type +;; name) +;; (setq column-indent +;; (1+ (max 0 (- column-width (length name))))))) +;; (setq count (1+ count)) +;; (when (eq (% count tags-per-line) 0) +;; (setq column-indent 0) +;; (widget-insert "\n"))) +;; reordered-list) + +;; ;; If the last line was not full (and hence did not include a +;; ;; carriage return), insert one now. +;; (unless (eq (% count tags-per-line) 0) +;; (widget-insert "\n")))) diff --git a/modules/app/notmuch/config.el b/modules/app/notmuch/config.el new file mode 100644 index 000000000..f415211e7 --- /dev/null +++ b/modules/app/notmuch/config.el @@ -0,0 +1,68 @@ +;;; app/notmuch/config.el -*- lexical-binding: t; -*- + +;; FIXME This module is a WIP! + +(after! notmuch + (set-company-backend! 'notmuch-message-mode + '(notmuch-company (company-ispell :with company-yasnippet))) + + (set-popup-rule! "^\\*notmuch-hello" :side 'left :size 30 :ttl 0) + + (setq notmuch-fcc-dirs nil + notmuch-show-logo nil + notmuch-message-headers-visible nil + message-kill-buffer-on-exit t + message-send-mail-function 'message-send-mail-with-sendmail + notmuch-search-oldest-first nil + send-mail-function 'sendmail-send-it + ;; sendmail-program "/usr/local/bin/msmtp" + notmuch-search-result-format + '(("date" . "%12s ") + ("count" . "%-7s ") + ("authors" . "%-30s ") + ("subject" . "%-72s ") + ("tags" . "(%s)")) + notmuch-tag-formats + '(("unread" (propertize tag 'face 'notmuch-tag-unread))) + notmuch-hello-sections + '(notmuch-hello-insert-saved-searches + notmuch-hello-insert-alltags) + notmuch-saved-searches + '((:name "inbox" :query "tag:inbox not tag:trash" :key "i") + (:name "flagged" :query "tag:flagged" :key "f") + (:name "sent" :query "tag:sent" :key "s") + (:name "drafts" :query "tag:draft" :key "d")) + notmuch-archive-tags '("-inbox" "-unread")) + + ;; (setq-hook! 'notmuch-show-mode-hook line-spacing 0) + + (add-to-list 'doom-real-buffer-functions #'notmuch-interesting-buffer nil #'eq) + + (advice-add #'notmuch-start-notmuch-sentinel :around #'+notmuch*dont-confirm-on-kill-process) + + ;; Visual enhancements + (defun +notmuch|center-window () + (setq-local visual-fill-column-width 90) + (visual-fill-column-mode)) + (add-hook 'notmuch-show-mode-hook #'+notmuch|center-window) + + ;; modeline doesn't have much use in these modes + (add-hook! (notmuch-show-mode notmuch-tree-mode notmuch-search-mode) + #'hide-mode-line-mode)) + + +(def-package! org-mime + :after (org notmuch) + :config (setq org-mime-library 'mml)) + + +(def-package! counsel-notmuch + :when (featurep! :completion ivy) + :commands counsel-notmuch + :after notmuch) + +(def-package! helm-notmuch + :when (featurep! :completion helm) + :commands helm-notmuch + :after notmuch) + diff --git a/modules/app/notmuch/packages.el b/modules/app/notmuch/packages.el new file mode 100644 index 000000000..7caea8546 --- /dev/null +++ b/modules/app/notmuch/packages.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; -*- +;;; app/notmuch/packages.el + +(package! notmuch) +(package! org-mime) +(when (featurep! :completion ivy) + (package! counsel-notmuch)) +(when (featurep! :completion helm) + (package! helm-notmuch)) From 43dcaa185352c4ada59c8d3213effc5efdf8db6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 19:35:30 +0200 Subject: [PATCH 2599/4235] Demote evil-collection errors --- modules/feature/evil/+everywhere.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index dba3126ec..1b0e5e26d 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -133,7 +133,8 @@ variable for an explanation of the defaults (in comments). See (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) (when doom-debug-mode (message "Loaded evil-collection-%s" (or (car-safe module) module))) - (evil-collection-init (list module)))) + (with-demoted-errors "evil-collection error: %s" + (evil-collection-init (list module))))) ;; From b4c8584f64d83ec8aa9d0bb87e8d0c942ec25bd9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 23:07:22 +0200 Subject: [PATCH 2600/4235] lang/python: rewrite version mode-line segment --- modules/lang/python/config.el | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 6aadb41b9..d84109942 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,6 +1,6 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- -(defvar +python-mode-name-functions '(+python-version) +(defvar +python-version-functions '(+python-version) "A list of functions to retrieve a version or environment string from. The first to return non-nil will have its result appended to the python-mode `mode-name' and displayed in the mode-line.") @@ -54,10 +54,15 @@ first to return non-nil will have its result appended to the python-mode python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) + ;; Python version in modeline + (defun +python|update-version (&rest _) + (setq +python-version (run-hook-with-args-until-success '+python-version-functions))) + (defalias '+python*update-version #'+python|update-version) + (defun +python|add-version-to-modeline () "Add version string to the major mode in the modeline." (setq mode-name - (if-let* ((result (run-hook-with-args-until-success '+python-mode-name-functions))) + (if-let* ((result (+python|update-version))) (format "Python %s" result) "Python"))) (add-hook 'python-mode-hook #'+python|add-version-to-modeline)) @@ -134,7 +139,9 @@ first to return non-nil will have its result appended to the python-mode :after python :config (pyenv-mode +1) - (add-to-list '+python-mode-name-functions #'pyenv-mode-version nil #'eq)) + (advice-add #'pyenv-mode-set :after #'+python*update-version) + (advice-add #'pyenv-mode-unset :after #'+python*update-version) + (add-to-list '+python-version-functions #'pyenv-mode-version nil #'eq)) (def-package! pyvenv @@ -142,25 +149,26 @@ first to return non-nil will have its result appended to the python-mode :after python :config (defun +python-current-pyvenv () pyvenv-virtual-env-name) - (add-to-list '+python-mode-name-functions #'+python-current-pyvenv nil #'eq)) + (add-hook 'pyvenv-post-activate-hooks #'+python|update-version) + (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version) + (add-to-list '+python-version-functions #'+python-current-pyvenv nil #'eq)) (def-package! conda :when (featurep! +conda) :after python :config - ;; Adds conda support to Doom Emacs. `conda-anaconda-home' should be the path - ;; to your anaconda installation, and will be guessed from the following: + ;; The location of your anaconda home will be guessed from the following: ;; + ;; + ANACONDA_HOME ;; + ~/.anaconda3 ;; + ~/.anaconda ;; + ~/.miniconda ;; + ~/usr/bin/anaconda3 ;; - ;; If none of these work, you'll need to set `conda-anaconda-home' yourself. - ;; - ;; Once set, run M-x `conda-env-activate' to switch between environments OR - ;; turn on `conda-env-autoactivate-mode' if you want it done automatically. + ;; If none of these work for you, you must set `conda-anaconda-home' + ;; explicitly. Once set, run M-x `conda-env-activate' to switch between + ;; environments (unless (cl-loop for dir in (list conda-anaconda-home "~/.anaconda" "~/.miniconda" @@ -174,6 +182,8 @@ first to return non-nil will have its result appended to the python-mode (conda-env-initialize-interactive-shells) (after! eshell (conda-env-initialize-eshell)) - (add-to-list '+python-mode-name-functions #'+python-conda-env nil #'eq) + (add-hook 'conda-postactivate-hook #'+python|update-version) + (add-hook 'conda-postdeactivate-hook #'+python|update-version) + (add-to-list '+python-version-functions #'+python-conda-env nil #'eq) (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) From 991199ee7808e7f9a9f214610551be8c38bbf236 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 23:16:18 +0200 Subject: [PATCH 2601/4235] Fix PYENV -> PYENV_ROOT envvar typo --- modules/lang/python/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index d84109942..cf7a9ac48 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -17,7 +17,7 @@ first to return non-nil will have its result appended to the python-mode python-indent-guess-indent-offset-verbose nil python-shell-interpreter "python") :config - (set-env! "PYTHONPATH" "PYENV") + (set-env! "PYTHONPATH" "PYENV_ROOT") (set-electric! 'python-mode :chars '(?:)) (set-repl-handler! 'python-mode #'+python/repl) From 9cf5907c48aa457ff6e569d5d22d619c619ecba4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 31 Jul 2018 23:21:13 +0200 Subject: [PATCH 2602/4235] lang/python: update modeline on version change --- modules/lang/python/config.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index cf7a9ac48..a4af06021 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -56,13 +56,16 @@ first to return non-nil will have its result appended to the python-mode ;; Python version in modeline (defun +python|update-version (&rest _) - (setq +python-version (run-hook-with-args-until-success '+python-version-functions))) + (setq +python-version (run-hook-with-args-until-success '+python-version-functions)) + (dolist (buffer (doom-buffers-in-mode 'python-mode (buffer-list))) + (with-current-buffer buffer + (+python|add-version-to-modeline +python-version)))) (defalias '+python*update-version #'+python|update-version) - (defun +python|add-version-to-modeline () + (defun +python|add-version-to-modeline (&optional version) "Add version string to the major mode in the modeline." (setq mode-name - (if-let* ((result (+python|update-version))) + (if-let* ((result (or version (+python|update-version)))) (format "Python %s" result) "Python"))) (add-hook 'python-mode-hook #'+python|add-version-to-modeline)) From 90d0f334f8eceb4462ca7fa7951878652fbfe108 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 01:13:49 +0200 Subject: [PATCH 2603/4235] lang/python: rewrite mode-line indicator (again) --- modules/lang/python/config.el | 46 ++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index a4af06021..6afd6d4a4 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,9 +1,11 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- -(defvar +python-version-functions '(+python-version) - "A list of functions to retrieve a version or environment string from. The -first to return non-nil will have its result appended to the python-mode -`mode-name' and displayed in the mode-line.") +(defvar +python-mode-line-indicator + '("Python" (+python-version (" " +python-version))) + "Format for the python version/env indicator in the mode-line.") + +(defvar-local +python-version nil + "The python version in the current buffer.") ;; @@ -54,21 +56,22 @@ first to return non-nil will have its result appended to the python-mode python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) - ;; Python version in modeline - (defun +python|update-version (&rest _) - (setq +python-version (run-hook-with-args-until-success '+python-version-functions)) - (dolist (buffer (doom-buffers-in-mode 'python-mode (buffer-list))) - (with-current-buffer buffer - (+python|add-version-to-modeline +python-version)))) - (defalias '+python*update-version #'+python|update-version) + ;; TODO Remove condition once :ui modeline replaces :ui doom-modeline + (when (featurep! :ui modeline) + (def-modeline-segment! +python-major-mode + (propertize (format-mode-line +python-mode-line-indicator) + 'face (if (active) 'doom-modeline-buffer-major-mode))) - (defun +python|add-version-to-modeline (&optional version) - "Add version string to the major mode in the modeline." - (setq mode-name - (if-let* ((result (or version (+python|update-version)))) - (format "Python %s" result) - "Python"))) - (add-hook 'python-mode-hook #'+python|add-version-to-modeline)) + (defun +python|add-version-to-modeline () + "Add python/pipenv version string to the major mode in the modeline." + (when-let* ((target (memq '+modeline-major-mode mode-line-format-right))) + (setcar target '+python-major-mode))) + (add-hook 'python-mode-hook #'+python|add-version-to-modeline) + + (defun +python|update-version (&rest _) + (setq +python-version (+python-version))) + (+python|update-version) + (add-hook 'python-mode-hook #'+python|update-version))) (def-package! anaconda-mode @@ -142,8 +145,9 @@ first to return non-nil will have its result appended to the python-mode :after python :config (pyenv-mode +1) - (advice-add #'pyenv-mode-set :after #'+python*update-version) - (advice-add #'pyenv-mode-unset :after #'+python*update-version) + (advice-add #'pyenv-mode-set :after #'+python|update-version) + (advice-add #'pyenv-mode-unset :after #'+python|update-version) + (add-to-list '+python-mode-line-indicator '(:eval (if (pyenv-mode-version) (concat " pyenv:%s" (pyenv-mode-version)))) 'append) (add-to-list '+python-version-functions #'pyenv-mode-version nil #'eq)) @@ -154,6 +158,7 @@ first to return non-nil will have its result appended to the python-mode (defun +python-current-pyvenv () pyvenv-virtual-env-name) (add-hook 'pyvenv-post-activate-hooks #'+python|update-version) (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version) + (add-to-list '+python-mode-line-indicator '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) 'append) (add-to-list '+python-version-functions #'+python-current-pyvenv nil #'eq)) @@ -188,5 +193,6 @@ first to return non-nil will have its result appended to the python-mode (add-hook 'conda-postactivate-hook #'+python|update-version) (add-hook 'conda-postdeactivate-hook #'+python|update-version) (add-to-list '+python-version-functions #'+python-conda-env nil #'eq) + (add-to-list '+python-mode-line-indicator '(conda-env-current-name (" conda:" conda-env-current-name)) 'append) (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) From 8272d8e98f223ab1b392d4760f68e70892b2ec0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 01:14:36 +0200 Subject: [PATCH 2604/4235] ui/modeline: rpad +modeline-flycheck --- modules/ui/modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 20e6a73e5..7ad96885e 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -513,7 +513,7 @@ segment.") (defun +doom-modeline|update-flycheck-segment (&optional status) (setq +modeline-flycheck (when-let* ((status-str (+modeline-flycheck-status status))) - (concat +modeline--vspc status-str)))) + (concat +modeline--vspc status-str +modeline--vspc)))) (add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) (add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) From 65f0dcef5412b3ddc7c8b0da47fe43d93f6c6e59 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 01:31:12 +0200 Subject: [PATCH 2605/4235] lang/python: remove references to removed variable --- modules/lang/python/config.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 6afd6d4a4..5e73e999a 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -147,8 +147,7 @@ (pyenv-mode +1) (advice-add #'pyenv-mode-set :after #'+python|update-version) (advice-add #'pyenv-mode-unset :after #'+python|update-version) - (add-to-list '+python-mode-line-indicator '(:eval (if (pyenv-mode-version) (concat " pyenv:%s" (pyenv-mode-version)))) 'append) - (add-to-list '+python-version-functions #'pyenv-mode-version nil #'eq)) + (add-to-list '+python-mode-line-indicator '(:eval (if (pyenv-mode-version) (concat " pyenv:%s" (pyenv-mode-version)))) 'append)) (def-package! pyvenv @@ -158,8 +157,7 @@ (defun +python-current-pyvenv () pyvenv-virtual-env-name) (add-hook 'pyvenv-post-activate-hooks #'+python|update-version) (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version) - (add-to-list '+python-mode-line-indicator '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) 'append) - (add-to-list '+python-version-functions #'+python-current-pyvenv nil #'eq)) + (add-to-list '+python-mode-line-indicator '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) 'append)) (def-package! conda @@ -192,7 +190,6 @@ (add-hook 'conda-postactivate-hook #'+python|update-version) (add-hook 'conda-postdeactivate-hook #'+python|update-version) - (add-to-list '+python-version-functions #'+python-conda-env nil #'eq) (add-to-list '+python-mode-line-indicator '(conda-env-current-name (" conda:" conda-env-current-name)) 'append) (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) From 0cdb73667049a2384efb110adba60b690d6832fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 01:47:32 +0200 Subject: [PATCH 2606/4235] Default modeline segments to :init Fixes buffer-id in non-file-visiting buffers. --- modules/ui/modeline/autoload/settings.el | 2 +- modules/ui/modeline/config.el | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/modeline/autoload/settings.el b/modules/ui/modeline/autoload/settings.el index f4891edba..3e0441aae 100644 --- a/modules/ui/modeline/autoload/settings.el +++ b/modules/ui/modeline/autoload/settings.el @@ -79,7 +79,7 @@ keep them left and right aligned respectively." (if (eq realvar name) `((defvar-local ,name nil ,docstring) (setq-default ,name ,init)) - `((defvar-local ,realvar nil) + `((defvar-local ,realvar ,init) (defvar-local ,name nil ,docstring) (setq-default ,name '(:eval (cond ((active) ,realvar) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 7ad96885e..984e620c4 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -291,6 +291,7 @@ buffers.") (def-modeline-segment! +modeline-buffer-id :on-hooks (find-file-hook after-save-hook after-revert-hook) + :init "%b" :faces t (if buffer-file-name (funcall +modeline-buffer-path-function buffer-file-name) From 4a14df9254f7956cdb5e6eabb78608ba2d19666d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 01:48:22 +0200 Subject: [PATCH 2607/4235] Add mode-line-process to :main & :special formats --- modules/ui/modeline/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 984e620c4..ce06d5cd7 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -536,7 +536,8 @@ icons." `(+modeline-encoding +modeline-major-mode " " mode-line-misc-info - (+modeline-vcs (" " +modeline-vcs " ")) + (vc-mode (" " +modeline-vcs " ")) + mode-line-process +modeline-flycheck)) (def-modeline-format! :minimal @@ -547,7 +548,7 @@ icons." (def-modeline-format! :special '(+modeline-matches +modeline-buffer-state " %b " +modeline-buffer-position) - '(+modeline-encoding +modeline-major-mode)) + '(+modeline-encoding +modeline-major-mode mode-line-process)) (def-modeline-format! :project '(+modeline-buffer-directory) From b1aa478528791de0709d0d987915215d5b45d8f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 02:08:21 +0200 Subject: [PATCH 2608/4235] map!: clear doom--defer So deferred keybinds don't persist across nested map! forms. --- core/core-keybinds.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 1c4aaef25..eff1ab08e 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -189,9 +189,9 @@ Example (:unless (push `(if (not ,(pop rest)) ,(macroexpand `(map! ,@rest))) forms) (setq rest '())) (:after (push `(after! ,(pop rest) ,(macroexpand `(map! ,@rest))) forms) (setq rest '())) (:desc (setq desc (pop rest))) - (:map* (setq doom--defer t) (push :map rest)) - (:map - (setq doom--keymaps (doom-enlist (pop rest)))) + ((or :map :map*) + (setq doom--keymaps (doom-enlist (pop rest)) + doom--defer (eq key :map*))) (:mode (setq modes (doom-enlist (pop rest))) (unless doom--keymaps From e79111ff549dc4ca4584561b0570fde0cd61d5a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 15:01:27 +0200 Subject: [PATCH 2609/4235] Eval +modeline-major-mode live It's a small segment. We can afford it being a little more greedy. --- modules/ui/modeline/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ce06d5cd7..d35af6025 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -356,10 +356,8 @@ buffers.") " ")) (def-modeline-segment! +modeline-major-mode - :on-set (mode-name) - :faces t (propertize (format-mode-line mode-name) - 'face 'doom-modeline-buffer-major-mode)) + 'face (if (active) 'doom-modeline-buffer-major-mode))) (defun +modeline--macro-recording () "Display current Emacs or evil macro being recorded." From ad68f26477771e1d1ad74d449fda45b3a6958650 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 15:16:04 +0200 Subject: [PATCH 2610/4235] Fix python mode-line persisting into other modes And more polish for the python mode-line indicator. --- modules/lang/python/config.el | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 5e73e999a..15f00a221 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -56,22 +56,15 @@ python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) - ;; TODO Remove condition once :ui modeline replaces :ui doom-modeline - (when (featurep! :ui modeline) - (def-modeline-segment! +python-major-mode - (propertize (format-mode-line +python-mode-line-indicator) - 'face (if (active) 'doom-modeline-buffer-major-mode))) + ;; Add python/pipenv version string to the major mode in the modeline + (defun +python|adjust-mode-line () + (setq mode-name +python-mode-line-indicator)) + (add-hook 'python-mode-hook #'+python|adjust-mode-line) - (defun +python|add-version-to-modeline () - "Add python/pipenv version string to the major mode in the modeline." - (when-let* ((target (memq '+modeline-major-mode mode-line-format-right))) - (setcar target '+python-major-mode))) - (add-hook 'python-mode-hook #'+python|add-version-to-modeline) - - (defun +python|update-version (&rest _) - (setq +python-version (+python-version))) - (+python|update-version) - (add-hook 'python-mode-hook #'+python|update-version))) + (defun +python|update-version (&rest _) + (setq +python-version (+python-version))) + (+python|update-version) + (add-hook 'python-mode-hook #'+python|update-version)) (def-package! anaconda-mode @@ -147,7 +140,9 @@ (pyenv-mode +1) (advice-add #'pyenv-mode-set :after #'+python|update-version) (advice-add #'pyenv-mode-unset :after #'+python|update-version) - (add-to-list '+python-mode-line-indicator '(:eval (if (pyenv-mode-version) (concat " pyenv:%s" (pyenv-mode-version)))) 'append)) + (add-to-list '+python-mode-line-indicator + '(:eval (if (pyenv-mode-version) (concat " pyenv:" (pyenv-mode-version)))) + 'append)) (def-package! pyvenv @@ -190,6 +185,9 @@ (add-hook 'conda-postactivate-hook #'+python|update-version) (add-hook 'conda-postdeactivate-hook #'+python|update-version) - (add-to-list '+python-mode-line-indicator '(conda-env-current-name (" conda:" conda-env-current-name)) 'append) + (add-to-list '+python-mode-line-indicator + '(conda-env-current-name + (" conda:" conda-env-current-name)) + 'append) (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) From 06aa16bbfba2cea7fb8008af5748f2f21f297fb7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 15:18:07 +0200 Subject: [PATCH 2611/4235] lang/ruby: keep mode-line indicator up-to-date --- modules/lang/ruby/config.el | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index d787ffaf0..ccb7689bf 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -1,9 +1,11 @@ ;;; lang/ruby/config.el -*- lexical-binding: t; -*- -(defvar +ruby-mode-name-functions '(+ruby-version) - "A list of functions to retrieve a version or environment string from. The -first to return non-nil will have its result appended to the ruby-mode -`mode-name' and displayed in the mode-line.") +(defvar +ruby-mode-line-indicator + '("Ruby" (+ruby-version (" " +ruby-version))) + "Format for the ruby version/env indicator in the mode-line.") + +(defvar-local +ruby-version nil + "The ruby version in the current buffer.") ;; @@ -23,13 +25,15 @@ first to return non-nil will have its result appended to the ruby-mode ;; so class and module pairs work (setq-hook! 'enh-ruby-mode-hook sp-max-pair-length 6) - (defun +ruby|add-version-to-modeline () - "Add version string to the major mode in the modeline." - (setq mode-name - (if-let* ((result (run-hook-with-args-until-success '+ruby-mode-name-functions))) - (format "Ruby %s" result) - "Ruby"))) - (add-hook 'enh-ruby-mode-hook #'+ruby|add-version-to-modeline)) + ;; Add ruby version string to the major mode in the modeline + (defun +ruby|adjust-mode-line () + (setq mode-name +ruby-mode-line-indicator)) + (add-hook 'enh-ruby-mode-hook #'+ruby|adjust-mode-line) + + (defun +ruby|update-version (&rest _) + (setq +ruby-version (+ruby-version))) + (+ruby|update-version) + (add-hook 'enh-ruby-mode-hook #'+ruby|update-version)) (def-package! yard-mode :hook enh-ruby-mode) From 8bbff852f7bc258d7cbf7b99e8d1ddd797c624b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 18:15:11 +0200 Subject: [PATCH 2612/4235] lang/php: fix stringp error & phpctags path Also provide a way to silence phpctags warnings on starting php-mode (set ac-php-ctags-executable to nil). --- modules/lang/php/autoload.el | 10 ++++++---- modules/lang/php/config.el | 15 ++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/lang/php/autoload.el b/modules/lang/php/autoload.el index b5a6f9fb4..93b68eb43 100644 --- a/modules/lang/php/autoload.el +++ b/modules/lang/php/autoload.el @@ -18,7 +18,9 @@ ignore the cache." (defun +php|init-ac-php-core-eldoc () "Initialize eldoc support for `php-mode' with `ac-php-core'. Fails gracefully if phpctags isn't installed." - (require 'company-php) - (if (file-exists-p ac-php-ctags-executable) - (ac-php-core-eldoc-setup) - (message "phpctags is missing; eldoc support is disabled"))) + (require 'ac-php-core) + (cond ((not ac-php-ctags-executable)) + ((not (file-exists-p ac-php-ctags-executable)) + (message "Could not find phpctags executable, eldoc support is disabled") + (message "To disable these warnings, set ac-php-ctags-executable to nil")) + ((ac-php-core-eldoc-setup)))) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 47bd19712..6609f877d 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -73,14 +73,15 @@ :init (add-to-list '+php--company-backends 'company-ac-php-backend nil #'eq) (add-hook 'php-mode-hook #'+php|init-ac-php-core-eldoc) - :config (setq ac-php-tags-path (concat doom-cache-dir "ac-php/")) - ;; prioritize phpctags in PATH - (when (file-in-directory-p ac-php-ctags-executable ac-php-root-directory) - (setq ac-php-ctags-executable - (or (executable-find "phpctags") - (if (file-exists-p ac-php-ctags-executable) - ac-php-ctags-executable))))) + ;; loaded by `company-php' + (after! ac-php-core + (when (equal ac-php-ctags-executable + (concat ac-php-root-directory "phpctags")) + ;; prioritize phpctags in PATH + (setq ac-php-ctags-executable + (or (executable-find "phpctags") + ac-php-ctags-executable))))) ;; From a876d87f5e0f0a315fa5dd4a17a3d447666369ba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 19:25:06 +0200 Subject: [PATCH 2613/4235] emmet-mode: bind to TAB & enable in reason-mode TAB now either indents, expands the snippet at point, or expands the emmet expression at point. Also it now falls back to emmet-expand-line if yasnippet won't load. --- modules/lang/web/autoload/html.el | 15 +++++++++++++++ modules/lang/web/config.el | 11 ++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/modules/lang/web/autoload/html.el b/modules/lang/web/autoload/html.el index 4afdb1cb6..cd9093fb5 100644 --- a/modules/lang/web/autoload/html.el +++ b/modules/lang/web/autoload/html.el @@ -105,3 +105,18 @@ function @ http://ergoemacs.org/emacs/elisp_replace_html_entities_command.html" "Decode HTML entities in region." (interactive "r") (+web--entities-region beg end t)) + +;;;###autoload +(defun +web/indent-or-yas-or-emmet-expand () + "Invoke `indent-for-tab-command' if at or before text bol, `yas-expand' if on +a snippet, or `emmet-expand-yas'/`emmet-expand-line', depending on whether +`yas-minor-mode' is enabled or not." + (interactive) + (call-interactively + (cond ((<= (current-column) (current-indentation)) + #'indent-for-tab-command) + ((bound-and-true-p yas-minor-mode) + (if (yas--templates-for-key-at-point) + #'yas-expand + #'emmet-expand-yas)) + (#'emmet-expand-line)))) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index a539e3185..e6aebcfa5 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -16,14 +16,15 @@ (def-package! emmet-mode :commands emmet-mode :preface (defvar emmet-mode-keymap (make-sparse-keymap)) - :hook (css-mode web-mode html-mode haml-mode nxml-mode rjsx-mode) + :hook (css-mode web-mode html-mode haml-mode nxml-mode rjsx-mode reason-mode) :config + (when (require 'yasnippet nil t) + (add-hook 'emmet-mode-hook #'yas-minor-mode-on)) (setq emmet-move-cursor-between-quotes t) - (add-hook! 'rjsx-mode-hook - (setq-local emmet-expand-jsx-className? t)) + (setq-hook! 'rjsx-mode-hook emmet-expand-jsx-className? t) (map! :map emmet-mode-keymap - :v "M-e" #'emmet-wrap-with-markup - :i "M-e" #'emmet-expand-yas + :v [tab] #'emmet-wrap-with-markup + :i [tab] #'+web/indent-or-yas-or-emmet-expand :i "M-E" #'emmet-expand-line)) From b7bbf4d7ed51296029dc299321e58e036ea6005d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 19:26:20 +0200 Subject: [PATCH 2614/4235] Add git-commit-mode to yas-extra-modes Fixes snippets in git-commit-mode. --- modules/emacs/vc/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 1150909a2..427b4403d 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -17,6 +17,9 @@ ;; `git-commit-mode' +(after! git-commit-mode + (set-yas-minor-mode! 'git-commit-mode)) + (defun +vc|enforce-git-commit-conventions () "See https://chris.beams.io/posts/git-commit/" (setq fill-column 72 From a3124f00d5af91f2ebce11ea12cafbcd4096b970 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 19:26:48 +0200 Subject: [PATCH 2615/4235] Remove redundant projectile-indexing-method setter --- core/core-projects.el | 1 - 1 file changed, 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 38d3f69e3..bfad45883 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -6,7 +6,6 @@ :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) - projectile-indexing-method (if IS-WINDOWS 'native 'alien) projectile-known-projects-file (concat doom-cache-dir "projectile.projects") projectile-require-project-root nil projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") From e0532349927abbce0fd4d8a68f276b4a9f9af175 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 22:29:51 +0200 Subject: [PATCH 2616/4235] lang/python: fix anaconda ignoring conda envs --- modules/lang/python/autoload/conda.el | 21 --------------------- modules/lang/python/config.el | 4 +--- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/modules/lang/python/autoload/conda.el b/modules/lang/python/autoload/conda.el index 3449b6b15..c20b8fd8e 100644 --- a/modules/lang/python/autoload/conda.el +++ b/modules/lang/python/autoload/conda.el @@ -21,24 +21,3 @@ executable and packages." (when conda-env-current-name (format "conda:%s" conda-env-current-name))) -;;;###autoload -(defun +python*anaconda-mode-bootstrap-in-remote-environments (&optional callback) - "Advice to set up the anaconda-mode even in remote environment. -Original doc: -Run `anaconda-mode' server. -CALLBACK function will be called when `anaconda-mode-port' will -be bound." - (setq anaconda-mode-process - (start-pythonic :process anaconda-mode-process-name - :buffer anaconda-mode-process-buffer - :cwd (anaconda-mode-server-directory) - :filter (lambda (process output) (anaconda-mode-bootstrap-filter process output)) - :sentinel 'anaconda-mode-bootstrap-sentinel - :query-on-exit nil - :args (list "-c" - anaconda-mode-server-command - (if (pythonic-remote-p) - "0.0.0.0" "127.0.0.1") - (or (pythonic-file-name pythonic-environment) "")))) - (process-put anaconda-mode-process 'server-directory (anaconda-mode-server-directory))) - diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 15f00a221..9f4fa43f8 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -188,6 +188,4 @@ (add-to-list '+python-mode-line-indicator '(conda-env-current-name (" conda:" conda-env-current-name)) - 'append) - - (advice-add 'anaconda-mode-bootstrap :override #'+python*anaconda-mode-bootstrap-in-remote-environments)) + 'append)) From 7ffa3c8d8da826635737fbeda829b4fd93d8b53c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 22:30:30 +0200 Subject: [PATCH 2617/4235] lang/python: register ANACONDA_HOME envvar --- modules/lang/python/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 9f4fa43f8..c1535849f 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -19,7 +19,7 @@ python-indent-guess-indent-offset-verbose nil python-shell-interpreter "python") :config - (set-env! "PYTHONPATH" "PYENV_ROOT") + (set-env! "PYTHONPATH" "PYENV_ROOT" "ANACONDA_HOME") (set-electric! 'python-mode :chars '(?:)) (set-repl-handler! 'python-mode #'+python/repl) From 9b11f8e76df84b6aff197827f07642bd12008f67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 22:32:29 +0200 Subject: [PATCH 2618/4235] lang/python: remove +python-conda-env (unused) --- modules/lang/python/autoload/conda.el | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/lang/python/autoload/conda.el b/modules/lang/python/autoload/conda.el index c20b8fd8e..f0b78b5c2 100644 --- a/modules/lang/python/autoload/conda.el +++ b/modules/lang/python/autoload/conda.el @@ -15,9 +15,3 @@ executable and packages." (setq conda-anaconda-home home) (message "Successfully changed conda home to: %s" (abbreviate-file-name home)))) -;;;###autoload -(defun +python-conda-env () - "Add conda environment string to the major mode modeline segment." - (when conda-env-current-name - (format "conda:%s" conda-env-current-name))) - From 036337afa1beefcfa41b679ffed20e064df58b9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 1 Aug 2018 22:35:10 +0200 Subject: [PATCH 2619/4235] Populate LC_CTYPE, LC_ALL & LANG by default --- core/core-os.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-os.el b/core/core-os.el index 32ed7124a..9e1178496 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -46,7 +46,9 @@ (exec-path-from-shell-copy-envs vars)) (setq exec-path-from-shell-check-startup-files nil exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments) - exec-path-from-shell-debug doom-debug-mode) + exec-path-from-shell-debug doom-debug-mode + exec-path-from-shell-variables + (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) (exec-path-from-shell-initialize))) ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) From a18541851ecd013cb7a71a90d80f8892a1733e7c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 00:13:00 +0200 Subject: [PATCH 2620/4235] lang/python/doctor: check pyenv, conda & ipython --- modules/lang/python/doctor.el | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/modules/lang/python/doctor.el b/modules/lang/python/doctor.el index 89aeb9e68..9dc7c4e12 100644 --- a/modules/lang/python/doctor.el +++ b/modules/lang/python/doctor.el @@ -3,6 +3,16 @@ (unless (executable-find "python") (warn! "Python isn't installed.")) -(when (executable-find "pyenv") - (unless (split-string (shell-command-to-string "pyenv versions --bare") "\n" t) - (warn! "No versions of python are available via pyenv, did you forget to install one?"))) +(when (featurep! +pyenv) + (if (not (executable-find "pyenv")) + (warn! "Couldn't find pyenv in your PATH") + (unless (split-string (shell-command-to-string "pyenv versions --bare") "\n" t) + (warn! "No versions of python are available via pyenv, did you forget to install one?")))) + +(when (featurep! +conda) + (unless (executable-find "conda") + (warn! "Couldn't find conda in your PATH"))) + +(when (featurep! +ipython) + (unless (executable-find "ipython") + (warn! "Couldn't find ipython in your PATH"))) From 59bc7653d5bbdbdb9eaa17b09c3c0ccbd0db90b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 00:29:26 +0200 Subject: [PATCH 2621/4235] completion/ivy: remove flx #774 flx is much too slow with large lists of candidates (i.e. counsel-projectile-find-file). --- modules/completion/ivy/config.el | 24 ++++++++++-------------- modules/completion/ivy/packages.el | 3 --- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 8e71b9e10..9369efcfc 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -57,6 +57,16 @@ immediately runs it on the current candidate (ending the ivy session)." ;; enable ability to select prompt (alternative to `ivy-immediate-done') ivy-use-selectable-prompt t) + (when (featurep! +fuzzy) + (setq ivy-re-builders-alist + '((counsel-ag . ivy--regex-plus) + (counsel-rg . ivy--regex-plus) + (counsel-pt . ivy--regex-plus) + (counsel-grep . ivy--regex-plus) + (swiper . ivy--regex-plus) + (t . ivy--regex-fuzzy)) + ivy-initial-inputs-alist nil)) + (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) @@ -210,20 +220,6 @@ immediately runs it on the current candidate (ending the ivy session)." (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) -(def-package! flx - :when (featurep! +fuzzy) - :defer t ; is loaded by ivy - :init - (setq ivy-re-builders-alist - '((counsel-ag . ivy--regex-plus) - (counsel-rg . ivy--regex-plus) - (counsel-pt . ivy--regex-plus) - (counsel-grep . ivy--regex-plus) - (swiper . ivy--regex-plus) - (t . ivy--regex-fuzzy)) - ivy-initial-inputs-alist nil)) - - ;; Used by `counsel-M-x' (setq amx-save-file (concat doom-cache-dir "amx-items")) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index ace65cf1b..888368ce1 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -10,8 +10,5 @@ (package! ivy-rich) (package! wgrep) -(when (featurep! +fuzzy) - (package! flx)) - (when (and EMACS26+ (featurep! +childframe)) (package! ivy-posframe)) From baf400b736b6ce887876fad459c459a3c97b096a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 01:51:50 +0200 Subject: [PATCH 2622/4235] completion/ivy: add ivy-prescient #774 Better fuzzy support versus flx; hopefully faster. Also brings frecency sorting to ivy commands. --- modules/completion/ivy/config.el | 13 +++++++++++++ modules/completion/ivy/packages.el | 1 + 2 files changed, 14 insertions(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 9369efcfc..c85c7e8d2 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -220,6 +220,19 @@ immediately runs it on the current candidate (ending the ivy session)." (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) +(def-package! ivy-prescient + :after ivy + :init + (if (featurep! +fuzzy) + (setq prescient-filter-method 'fuzzy) + (setq prescient-filter-method 'regexp + ivy-prescient-retain-classic-highlighting t)) + :config + (setq prescient-save-file (concat doom-cache-dir "presclient-save.el")) + (prescient-persist-mode +1) + (ivy-prescient-mode +1)) + + ;; Used by `counsel-M-x' (setq amx-save-file (concat doom-cache-dir "amx-items")) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 888368ce1..53c383744 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -9,6 +9,7 @@ (package! ivy-hydra) (package! ivy-rich) (package! wgrep) +(package! ivy-prescient) (when (and EMACS26+ (featurep! +childframe)) (package! ivy-posframe)) From d2ecd877395e3f2c413feccfe775b2af006801a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 03:31:20 +0200 Subject: [PATCH 2623/4235] Fix ivy completion when treemacs is open Caused by incorrectly initialized treemacs popup hack. --- modules/ui/popup/+hacks.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 1c3266159..499d3d84a 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -284,10 +284,12 @@ instead of switch-to-buffer-*." ;; `treemacs' (after! treemacs - (set-popup-rule! "^ \\*Treemacs" :side 'left :size treemacs-width :quit nil) + (set-popup-rule! "^ \\*Treemacs" :side 'left :size treemacs-width :quit nil :ttl 0) (defun +popup*set-popup (&rest _) - (+popup--init (selected-window))) - (advice-add #'treemacs--setup-buffer :after #'+popup*set-popup)) + "Create and setup a buffer for treemacs in the right position and size." + (pop-to-buffer (treemacs--get-framelocal-buffer)) + (treemacs--forget-last-highlight)) + (advice-add #'treemacs--setup-buffer :override #'+popup*set-popup)) ;; `wgrep' From cfebed96db75fc9f681c9839fd6c738fbd09c2f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 03:47:29 +0200 Subject: [PATCH 2624/4235] lang/cc: cull unnecessary def-package! blocks rtags loads these packages for us, so long as rtags-display-result-backend is properly set. --- modules/lang/cc/config.el | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 7c492a6be..24a1871a5 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -220,6 +220,10 @@ compilation database is present in the project.") (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil rtags-completions-enabled nil + rtags-display-result-backend + (cond ((featurep! :completion ivy) 'ivy) + ((featurep! :completion helm) 'helm) + ('default)) ;; 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 @@ -238,12 +242,4 @@ compilation database is present in the project.") (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) - (add-hook 'rtags-after-find-file-hook #'recenter) - - (def-package! ivy-rtags - :when (featurep! :completion ivy) - :config (setq rtags-display-result-backend 'ivy)) - - (def-package! helm-rtags - :when (featurep! :completion helm) - :config (setq rtags-display-result-backend 'helm))) + (add-hook 'rtags-after-find-file-hook #'recenter)) From 4731f82766f3cf9d8bd6735f6f30694d97e8a4d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 03:50:51 +0200 Subject: [PATCH 2625/4235] ui/modeline: disable no-checker flycheck indicator --- modules/ui/modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index d35af6025..e512de144 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -505,7 +505,7 @@ segment.") -0.25))) (+doom-ml-icon "check" nil 'doom-modeline-info))) (`running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) - (`no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) + ;; (`no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) (`errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) (`interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face)))) From 0b8f3e29d50cb152f4daa5d6ce3edac94752b3a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 03:51:15 +0200 Subject: [PATCH 2626/4235] Remove rg/pt ivy-re-builders-alist entries Both counsel-(rg|pt) identify themselves as counsel-ag, so these extra entries are necessary. --- modules/completion/ivy/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index c85c7e8d2..94a275a78 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -60,8 +60,6 @@ immediately runs it on the current candidate (ending the ivy session)." (when (featurep! +fuzzy) (setq ivy-re-builders-alist '((counsel-ag . ivy--regex-plus) - (counsel-rg . ivy--regex-plus) - (counsel-pt . ivy--regex-plus) (counsel-grep . ivy--regex-plus) (swiper . ivy--regex-plus) (t . ivy--regex-fuzzy)) From 6d1512c2e2ccc914769e74c21bb65cafa9d883b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 13:53:53 +0200 Subject: [PATCH 2627/4235] Refactor doom/reload + Remove non-interactive use-case (no more relying on the server; too unstable). + Ensure autoloads are properly reloaded (and thus, the load-path is properly repopulated). + Provide feedback when it's finished --- core/autoload/help.el | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index aab7e9dcf..d41dc7662 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -234,22 +234,11 @@ necessary), reinistalize doom (via `doom-initialize') and reloads your private init.el and config.el. Then runs `doom-reload-hook'." (interactive "P") (require 'core-cli) - (cond ((and noninteractive (not (daemonp))) - (require 'server) - (if (not (server-running-p)) - (doom-reload-autoloads force-p) - (print! "Reloading active Emacs session...") - (print! - (bold "%%s") - (if (server-eval-at server-name '(doom/reload)) - (green "Done!") - (red "There were issues!"))))) - ((progn - (require 'core-packages) - (doom-reload-autoloads force-p) - (doom-initialize 'force) - (with-demoted-errors "PRIVATE CONFIG ERROR: %s" - (doom-initialize-modules 'force)) - (print! (green "%d packages reloaded" (length package-alist))) - (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) - t)))) + (doom-reload-autoloads force-p) + (setq load-path doom-site-load-path) + (let (doom-init-p) + (doom-initialize)) + (with-demoted-errors "PRIVATE CONFIG ERROR: %s" + (doom-initialize-modules 'force)) + (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) + (message "Finished!")) From cf4ea445a180ac69d1ed4a0f95bbe9355a72aba1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 15:48:32 +0200 Subject: [PATCH 2628/4235] lang/latex: don't reverse +latex-viewers This incorrectly reversed the priority ordering of +latex-viewers. This is an artifact from a rejected approach at short-circuiting +latex-viewer, which was replaced with cl-block->cl-return. Reported by @UndeadKernel --- modules/lang/latex/+viewers.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index b38574796..c2bf46baa 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,7 +1,7 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- (cl-block nil - (dolist (viewer (reverse +latex-viewers)) + (dolist (viewer +latex-viewers) (if (pcase viewer (`skim (when (and IS-MAC From 14816ef1739d899b88bb7baa70751bbbc1681d30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 16:12:53 +0200 Subject: [PATCH 2629/4235] lang/latex: fix detection for other viewers Incorrect use of cl-block/cl-return meant latex-preview-pane would always be used as the default pdf viewer. Reported by @UndeadKernel --- modules/lang/latex/+viewers.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index c2bf46baa..0fdcac95f 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,6 +1,6 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- -(cl-block nil +(cl-block 'viewer (dolist (viewer +latex-viewers) (if (pcase viewer (`skim @@ -26,7 +26,7 @@ ;; Update PDF buffers after successful LaTeX runs (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)))) - (cl-return t))) + (cl-return-from 'viewer))) ;; fall back to latex-preview-pane (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) From 128eb611e0da5aff490610de8eb856c9735a32bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 16:15:10 +0200 Subject: [PATCH 2630/4235] lang/latex: remove +preview-pane flag Reported by @UndeadKernel --- modules/lang/latex/packages.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/lang/latex/packages.el b/modules/lang/latex/packages.el index ade453d7e..b181f5785 100644 --- a/modules/lang/latex/packages.el +++ b/modules/lang/latex/packages.el @@ -3,15 +3,13 @@ (package! auctex) (package! adaptive-wrap) +(package! latex-preview-pane) ;; Optional module features: (when (featurep! +latexmk) (package! auctex-latexmk)) -(when (featurep! +preview-pane) - (package! latex-preview-pane)) - ;; Features according to other user selected options (when (featurep! :completion company) From 7c4a353228c7295a1dd003178619d16ca965df51 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 16:32:39 +0200 Subject: [PATCH 2631/4235] lang/latex: remove redundant visual-line-mode hook --- modules/lang/latex/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 6a92b8c1d..cf106d6f4 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -31,7 +31,6 @@ If no viewers are found, `latex-preview-pane' is used.") (def-package! tex :mode ("\\.tex\\'" . TeX-latex-mode) - :hook (TeX-mode . visual-line-mode) :config (setq TeX-parse-self t ;; parse on load TeX-auto-save t ;; parse on save From 5f1618e7a15fa83c1b6f9a08fea6ac549e3e88d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 16:40:47 +0200 Subject: [PATCH 2632/4235] feature/spellcheck: minor reformatting --- modules/feature/spellcheck/config.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index ceee1c467..bf04c03f3 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -8,16 +8,14 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") ;; `ispell' -(setq ispell-dictionary "english") +(setq ispell-dictionary "english" + ispell-list-command "--list" + ispell-extr-args '("--dont-tex-check-comments")) (def-package! flyspell ; built-in :defer t - :init - (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) + :init (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) :config - (setq ispell-list-command "--list" - ispell-extr-args '("--dont-tex-check-comments")) - (defun +spellcheck|immediately () "Spellcheck the buffer when `flyspell-mode' is enabled." (when (and flyspell-mode +spellcheck-immediately) From 2ee177d588723420ea8c7db6962813634ff6784e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 16:41:19 +0200 Subject: [PATCH 2633/4235] Don't invoke debugger on "Aborted" messages --- core/autoload/packages.el | 6 +++--- core/core-cli.el | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 13c03d121..d6b5624e7 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -483,7 +483,7 @@ calls." (cl-sort (cl-copy-list packages) #'string-lessp :key #'car) "\n"))))) - (error "Aborted!")) + (user-error "Aborted!")) ((let (success) (doom-refresh-packages-maybe doom-debug-mode) @@ -540,7 +540,7 @@ calls." (package-version-join (cl-caddr pkg)))) packages "\n")))))) - (error "Aborted!")) + (user-error "Aborted!")) ((let (success) (dolist (pkg packages) @@ -583,7 +583,7 @@ calls." (upcase (symbol-name backend)))))) (sort (cl-copy-list packages) #'string-lessp) "\n"))))) - (error "Aborted!")) + (user-error "Aborted!")) ((let (success) (dolist (pkg packages) diff --git a/core/core-cli.el b/core/core-cli.el index d846db0bd..029bec2e2 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -258,7 +258,7 @@ problems with doom." current-rev rev) ;; TODO Display newsletter diff (unless (or doom-auto-accept (y-or-n-p "Proceed?")) - (error "Aborted")) + (user-error "Aborted")) (message "Removing byte-compiled files from your config (if any)") (doom-clean-byte-compiled-files) (unless (zerop (process-file "git" nil buf nil "reset" "--hard" From 5772ace0fff7528c84173d78403a60c4dd6a631c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 16:46:04 +0200 Subject: [PATCH 2634/4235] Update +spellcheck-immediately docstring It won't work on LaTeX-mode-hook because flyspell-mode is added to TeX-mode-hook, which runs before the former. --- modules/feature/spellcheck/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index bf04c03f3..dce736c5f 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -5,7 +5,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: - (setq-hook! 'LaTeX-mode-hook +spellcheck-immediately nil)") + (setq-hook! 'TeX-mode-hook +spellcheck-immediately nil)") ;; `ispell' (setq ispell-dictionary "english" From f16597ec72f70024ab733492892393d825bcba4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 17:06:30 +0200 Subject: [PATCH 2635/4235] Set gamegrid-user-score-file-directory THIS IS IMPORTANT GUYS --- core/core.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index beef6d8ee..9f296cdac 100644 --- a/core/core.el +++ b/core/core.el @@ -186,7 +186,8 @@ else (except for `window-setup-hook').") tramp-backup-directory-alist backup-directory-alist tramp-persistency-file-name (concat doom-cache-dir "tramp-persistency.el") url-cache-directory (concat doom-cache-dir "url/") - url-configuration-directory (concat doom-etc-dir "url/")) + url-configuration-directory (concat doom-etc-dir "url/") + gamegrid-user-score-file-directory (concat doom-etc-dir "games/")) (defvar doom-auto-minor-mode-alist '() "Alist mapping filename patterns to corresponding minor mode functions, like From 639349d0edb97143b7493024da3be412a68beea1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 2 Aug 2018 21:44:09 +0200 Subject: [PATCH 2636/4235] feature/spellcheck: add hunspell/aspell support --- modules/feature/spellcheck/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index dce736c5f..496f512b1 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -12,6 +12,13 @@ Since spellchecking can be slow in some buffers, this can be disabled with: ispell-list-command "--list" ispell-extr-args '("--dont-tex-check-comments")) +(after! ispell + (cond ((executable-find "hunspell") + (setq ispell-program-name "hunspell")) + ((executable-find "aspell") + (add-to-list 'ispell-extra-args "--sug-mode=ultra")))) + + (def-package! flyspell ; built-in :defer t :init (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) From 80eb1dc449c169c172a5ff2b4de543481c7057bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 02:46:48 +0200 Subject: [PATCH 2637/4235] Fix file-exists-p! with nested forms Due to the eval not picking up lexical bindings. --- core/core-lib.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 4406c3627..c64bd6133 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -57,19 +57,18 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." ,(if (file-name-absolute-p spec) spec `(expand-file-name ,spec ,directory)))) - ((symbolp spec) - `(file-exists-p ,(if (and directory - (or (not (stringp directory)) - (file-name-absolute-p directory))) - `(expand-file-name ,spec ,directory) - spec))) ((and (listp spec) (memq (car spec) '(or and))) `(,(car spec) ,@(cl-loop for i in (cdr spec) collect (doom--resolve-path-forms i directory)))) - ((listp spec) - (doom--resolve-path-forms (eval spec t) directory)) + ((or (symbolp spec) + (listp spec)) + `(file-exists-p ,(if (and directory + (or (not (stringp directory)) + (file-name-absolute-p directory))) + `(expand-file-name ,spec ,directory) + spec))) (t spec))) (defun doom--resolve-hook-forms (hooks) From 31c8c0c03398ae5409aff7ebf5c902fca63da4c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 03:41:31 +0200 Subject: [PATCH 2638/4235] lang/cc: rewrite C/C++/OBJC header file detection --- modules/lang/cc/autoload.el | 39 +++++++++++++++++++++++++++++++++++++ modules/lang/cc/config.el | 34 ++++++++------------------------ 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 9b8a18ef1..000f7eb70 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -66,6 +66,45 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." (memq (char-before) (list ?, ?\( ?\;)))) (c-lineup-arglist langlem))) +(defun +cc--re-search-for (regexp) + (save-excursion + (save-restriction + (save-match-data + (widen) + (goto-char (point-min)) + (re-search-forward regexp magic-mode-regexp-match-limit t))))) + +;;;###autoload +(defun +cc-c-c++-objc-mode (&optional file) + "Sets either `c-mode', `objc-mode' or `c++-mode', whichever is appropriate." + (let ((base (file-name-sans-extension buffer-file-name)) + file) + (cond ((file-exists-p! (or (concat base ".cpp") + (concat base ".cc"))) + (c++-mode)) + ((or (file-exists-p! (or (concat base ".m") + (concat base ".mm"))) + (+cc--re-search-for + (concat "^[ \t\r]*\\(?:" + "@\\(?:class\\|interface\\|property\\|end\\)\\_>" + "\\|#import +" + "\\|[-+] ([a-zA-Z0-9_]+)" + "\\)"))) + (objc-mode)) + ((fboundp 'c-or-c++-mode) ; introduced in Emacs 26.1 + (c-or-c++-mode)) + ((+cc--re-search-for ; TODO Remove this along with Emacs 25 support + (let ((id "[a-zA-Z0-9_]+") (ws "[ \t\r]+") (ws-maybe "[ \t\r]*")) + (concat "^" ws-maybe "\\(?:" + "using" ws "\\(?:namespace" ws "std;\\|std::\\)" + "\\|" "namespace" "\\(:?" ws id "\\)?" ws-maybe "{" + "\\|" "class" ws id ws-maybe "[:{\n]" + "\\|" "template" ws-maybe "<.*>" + "\\|" "#include" ws-maybe "<\\(?:string\\|iostream\\|map\\)>" + "\\)"))) + (c++-mode)) + ((c-mode))))) + ;; ;; Hooks diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 24a1871a5..9ebedc341 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -26,37 +26,19 @@ compilation database is present in the project.") (def-package! cc-mode :commands (c-mode c++-mode objc-mode java-mode) :mode ("\\.mm\\'" . objc-mode) - :preface - ;; The plusses in c++-mode can be annoying to search for ivy/helm (which reads - ;; queries as regexps), so wee add these for convenience. - (defalias 'cpp-mode 'c++-mode) - (defvaralias 'cpp-mode-map 'c++-mode-map) - - (defun +cc-c++-header-file-p () - (and buffer-file-name - (equal (file-name-extension buffer-file-name) "h") - (or (file-exists-p (expand-file-name - (concat (file-name-sans-extension buffer-file-name) - ".cpp"))) - (when-let* ((file (car-safe (projectile-get-other-files - buffer-file-name - (projectile-current-project-files))))) - (equal (file-name-extension file) "cpp"))))) - - (defun +cc-objc-header-file-p () - (and buffer-file-name - (equal (file-name-extension buffer-file-name) "h") - (re-search-forward "@\\" magic-mode-regexp-match-limit t))) - - (unless (assq '+cc-c++-header-file-p magic-mode-alist) - (push '(+cc-c++-header-file-p . c++-mode) magic-mode-alist) - (push '(+cc-objc-header-file-p . objc-mode) magic-mode-alist)) - :init (setq-default c-basic-offset tab-width c-backspace-function #'delete-backward-char c-default-style "doom") + ;; The plusses in c++-mode can be annoying to search for ivy/helm (which reads + ;; queries as regexps), so we add these for convenience. + (defalias 'cpp-mode 'c++-mode) + (defvaralias 'cpp-mode-map 'c++-mode-map) + + ;; Activate `c-mode', `c++-mode' or `objc-mode' depending on heuristics + (add-to-list 'auto-mode-alist '("\\.h\\'" . +cc-c-c++-objc-mode)) + :config (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) From 36730677369b214ec47b2f6852e65f252751fff2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 16:10:20 +0200 Subject: [PATCH 2639/4235] Fix projectile-find-file locking up Emacs This occurs when invoking it from the root of massive file trees, like $HOME or certain non-project folders. It's better that it defer to a different command altogether (counsel-find-file) if invoked from $HOME, and counsel-file-jump from anywhere else, which offers approximately what we want, but at a fraction of the performance cost in those cases. --- modules/completion/ivy/autoload/ivy.el | 18 ++++++++++++++++++ modules/completion/ivy/config.el | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 01b59253b..5d666cdac 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -208,6 +208,24 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;; File searching ;; +;;;###autoload +(defun +ivy/projectile-find-file () + "A more sensible `projectile-find-file', which will revert to +`counsel-find-file' if invoked from $HOME (usually not what you want), or +`counsel-file-jump' if invoked from a non-project. + +Both are much faster than letting `projectile-find-file' index massive file +trees." + (interactive) + (call-interactively + (cond ((or (file-equal-p default-directory "~") + (when-let* ((proot (doom-project-root 'nocache))) + (file-equal-p proot "~"))) + #'counsel-find-file) + ((doom-project-p 'nocache) + #'projectile-find-file) + (#'counsel-file-jump)))) + ;;;###autoload (cl-defun +ivy-file-search (engine &key query in all-files (recursive t)) "Conduct a file search using ENGINE, which can be any of: rg, ag, pt, and diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 94a275a78..aedfd1bd3 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -159,7 +159,7 @@ immediately runs it on the current candidate (ending the ivy session)." counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init (define-key! 'global - [remap projectile-find-file] #'counsel-projectile-find-file + [remap projectile-find-file] #'+ivy/projectile-find-file [remap projectile-find-dir] #'counsel-projectile-find-dir [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer [remap projectile-grep] #'counsel-projectile-grep From ab4052b8dcc74839e045429c429cf23443f756e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 16:12:27 +0200 Subject: [PATCH 2640/4235] Refactor completion/ivy & optimize projectile-find-file counsel-projectile-find-file fontifies visited files and sorts the resulting file list from projectile-find-file, adding considerable overhead. Then, ivy-prescient performs a frecency sort and filter, adding more overhead. Altogether, this makes projectile-find-file unusable for larger projects when fuzzy search is on (and in some extreme cases, when it's off). This change disables both features specifically for projectile-find-file. Fixes #774, hopefully --- modules/completion/ivy/config.el | 71 +++++++++++++++++--------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index aedfd1bd3..78a3d25b8 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -65,6 +65,9 @@ immediately runs it on the current candidate (ending the ivy session)." (t . ivy--regex-fuzzy)) ivy-initial-inputs-alist nil)) + ;; make projectile-find-file faster + (add-to-list 'ivy-sort-functions-alist '(projectile-find-file)) + (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) @@ -73,16 +76,20 @@ immediately runs it on the current candidate (ending the ivy session)." [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer [remap imenu-anywhere] #'ivy-imenu-anywhere) - (ivy-mode +1)) + (ivy-mode +1) + ;; Show more buffer information in switch-buffer commands + (after! ivy-rich + (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer + counsel-projectile-switch-to-buffer)) + (ivy-set-display-transformer cmd '+ivy-buffer-transformer))) -;; Show more buffer information in switch-buffer commands -(def-package! ivy-rich - :after ivy - :config - (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer - counsel-projectile-switch-to-buffer)) - (ivy-set-display-transformer cmd '+ivy-buffer-transformer))) + (def-package! ivy-hydra + :commands (ivy-dispatching-done-hydra ivy--matcher-desc) + :init + (define-key! ivy-minibuffer-map + "\C-o" #'+ivy-coo-hydra/body + (kbd "M-o") #'ivy-dispatching-done-hydra))) (def-package! counsel @@ -147,11 +154,9 @@ immediately runs it on the current candidate (ending the ivy session)." ("L" (lambda (path) "Insert org-link with absolute path" (with-ivy-window (insert (format "[[%s]]" path)))) "insert org-link (abs. path)"))) - ;; Configure `counsel-rg', `counsel-ag' & `counsel-pt' - (dolist (cmd '(counsel-ag counsel-rg counsel-pt)) - (ivy-add-actions - cmd - '(("O" +ivy-git-grep-other-window-action "open in other window"))))) + (ivy-add-actions + 'counsel-ag ; also applies to `counsel-rg' & `counsel-pt' + '(("O" +ivy-git-grep-other-window-action "open in other window")))) (def-package! counsel-projectile @@ -166,17 +171,30 @@ immediately runs it on the current candidate (ending the ivy session)." [remap projectile-ag] #'counsel-projectile-ag [remap projectile-switch-project] #'counsel-projectile-switch-project) :config - ;; Highlight entries that have been visited + ;; Highlight entries that have been visited; opposite of default (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) -(def-package! ivy-hydra - :commands (ivy-dispatching-done-hydra ivy--matcher-desc) +(def-package! ivy-prescient + :after ivy :init - (after! ivy - (define-key! ivy-minibuffer-map - "\C-o" #'+ivy-coo-hydra/body - (kbd "M-o") #'ivy-dispatching-done-hydra))) + (if (featurep! +fuzzy) + (setq prescient-filter-method 'fuzzy) + (setq prescient-filter-method 'regexp + ivy-prescient-retain-classic-highlighting t)) + :config + (setq prescient-save-file (concat doom-cache-dir "presclient-save.el")) + + ;; `ivy-prescient' is too slow for fuzzy projectile-find-file and + ;; counsel-file-jump, so ensure they're ignored + (when (featurep! +fuzzy) + (add-to-list 'ivy-re-builders-alist '(counsel-file-jump . +ivy--regex-fuzzy)) + (add-to-list 'ivy-re-builders-alist '(projectile-find-file . +ivy--regex-fuzzy))) + (add-to-list 'ivy-prescient-excluded-commands 'counsel-find-jump nil #'eq) + (add-to-list 'ivy-prescient-excluded-commands 'projectile-find-file nil #'eq) + + (prescient-persist-mode +1) + (ivy-prescient-mode +1)) (def-package! wgrep @@ -218,19 +236,6 @@ immediately runs it on the current candidate (ending the ivy session)." (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) -(def-package! ivy-prescient - :after ivy - :init - (if (featurep! +fuzzy) - (setq prescient-filter-method 'fuzzy) - (setq prescient-filter-method 'regexp - ivy-prescient-retain-classic-highlighting t)) - :config - (setq prescient-save-file (concat doom-cache-dir "presclient-save.el")) - (prescient-persist-mode +1) - (ivy-prescient-mode +1)) - - ;; Used by `counsel-M-x' (setq amx-save-file (concat doom-cache-dir "amx-items")) From ea0f46b181611b6973673df486c5de2f591d17dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 16:16:01 +0200 Subject: [PATCH 2641/4235] Add 2nd arg to doom-initialize to load core libs This restores the correct value of noninteractive while core libs are loading, so packages like recentf can avoid initializing when running emacs non interactively (thus polluting output or possibly causing errors). --- core/core-editor.el | 5 +++-- core/core-tests.el | 9 ++++----- core/core.el | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index faa66ea9f..b39230c5b 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -134,8 +134,9 @@ savehist file." "^/var/folders/.+$" ;; ignore private DOOM temp files (but not all of them) (lambda (file) (file-in-directory-p file doom-local-dir)))) - (add-hook 'kill-emacs-hook #'recentf-cleanup) - (quiet! (recentf-mode +1))) + (unless noninteractive + (add-hook 'kill-emacs-hook #'recentf-cleanup) + (quiet! (recentf-mode +1)))) (def-package! server :when (display-graphic-p) diff --git a/core/core-tests.el b/core/core-tests.el index 10db96efe..daf9b0f42 100644 --- a/core/core-tests.el +++ b/core/core-tests.el @@ -6,11 +6,10 @@ command line args following a double dash (each arg should be in the 'module/submodule' format). If neither is available, run all tests in all enabled modules." - (let (noninteractive) - ;; Core libraries aren't fully loaded in a noninteractive session, so we - ;; reload it with `noninteractive' set to nil to force them to. - (quiet! (doom-reload-autoloads)) - (doom-initialize t)) + ;; Core libraries aren't fully loaded in a noninteractive session, so we + ;; reload it with `noninteractive' set to nil to force them to. + (quiet! (doom-reload-autoloads)) + (doom-initialize t t) (let ((target-paths ;; Convert targets into a list of string paths, pointing to the root ;; directory of modules diff --git a/core/core.el b/core/core.el index 9f296cdac..7585e11b2 100644 --- a/core/core.el +++ b/core/core.el @@ -314,7 +314,7 @@ If RETURN-P, return the message as a string instead of displaying it." ;; Bootstrap functions ;; -(defun doom-initialize (&optional force-p) +(defun doom-initialize (&optional force-p force-load-core-p) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). The bootstrap process involves making sure 1) the essential directories exist, @@ -368,7 +368,7 @@ to least)." (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) (require 'core-os) - (unless noninteractive + (when (or force-load-core-p (not noninteractive)) (add-hook! 'emacs-startup-hook #'(doom|post-init doom|display-benchmark)) (require 'core-ui) From 50a82e72f61d46a5a8d1aefa9b748cb814cfc63a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 16:17:32 +0200 Subject: [PATCH 2642/4235] ui/doom: enable solaire-mode in doom-tomorrow-night --- modules/ui/doom/config.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 88fcc09ae..35ca8b43f 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -6,13 +6,14 @@ (doom-molokai . t) (doom-nord . t) (doom-nord-light . t) - (doom-nova . nil) + (doom-nova) (doom-one . t) (doom-one-light . t) (doom-opera . t) - (doom-solarized-light . nil) - (doom-spacegrey . nil) - (doom-vibrant . nil)) + (doom-solarized-light) + (doom-spacegrey) + (doom-vibrant) + (doom-tomorrow-night)) "An alist of themes that support `solaire-mode'. If CDR is t, then use `solaire-mode-swap-bg'.") @@ -23,6 +24,7 @@ ;; (def-package! doom-themes + :load-path "~/work/plugins/emacs-doom-themes/" :defer t :init (unless doom-theme From 76868fe48d8539ebc1c8aaf5417219e5b876eccc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 18:06:44 +0200 Subject: [PATCH 2643/4235] ui/modeline: allow more options for bar --- modules/ui/modeline/config.el | 36 +++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index e512de144..479332f2c 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -19,6 +19,14 @@ (defvar +modeline-height 21 "How tall the mode-line should be (only respected in GUI emacs).") +(defvar +modeline-bar-at-end nil + "If non-nil, the bar is placed at the end, instead of at the beginning of the +modeline.") + +(defvar +modeline-bar-invisible nil + "If non-nil, the bar is transparent, and only used to police the height of the +mode-line.") + (defvar +modeline-buffer-path-function #'+modeline-file-path "The function that returns the buffer name display for file-visiting buffers.") @@ -32,6 +40,9 @@ buffers.") (put '+modeline-format-left 'risky-local-variable t) (put '+modeline-format-right 'risky-local-variable t) +;; +(defvar +modeline--vspc (propertize " " 'face 'variable-pitch)) + ;; externs (defvar anzu--state nil) (defvar evil-mode nil) @@ -232,13 +243,25 @@ buffers.") ;; Bars ;; +(defvar +modeline-bar-start nil "TODO") +(put '+modeline-bar-start 'risky-local-variable t) +(defvar +modeline-bar-end nil "TODO") +(put '+modeline-bar-end 'risky-local-variable t) + (defvar +modeline-bar-active nil "TODO") (defvar +modeline-bar-inactive nil "TODO") (defun +modeline|setup-bars () (setq +modeline-bar-active - (+modeline--make-xpm +modeline-width +modeline-height (face-background 'doom-modeline-bar)) + (+modeline--make-xpm +modeline-width +modeline-height + (unless +modeline-bar-invisible + (face-background 'doom-modeline-bar nil t))) +modeline-bar-inactive - (+modeline--make-xpm +modeline-width +modeline-height))) + (+modeline--make-xpm +modeline-width +modeline-height)) + (setq +modeline-bar-start nil + +modeline-bar-end nil) + (if +modeline-bar-at-end + (setq +modeline-bar-end '+modeline-bar) + (setq +modeline-bar-start '+modeline-bar))) (add-hook 'doom-load-theme-hook #'+modeline|setup-bars) (defun +modeline|setup-bars-after-change (sym val op _where) @@ -247,6 +270,8 @@ buffers.") (+modeline|setup-bars))) (add-variable-watcher '+modeline-width #'+modeline|setup-bars-after-change) (add-variable-watcher '+modeline-height #'+modeline|setup-bars-after-change) +(add-variable-watcher '+modeline-bar-at-end #'+modeline|setup-bars-after-change) +(add-variable-watcher '+modeline-bar-invisible #'+modeline|setup-bars-after-change) (def-modeline-segment! +modeline-bar (if (active) +modeline-bar-active +modeline-bar-inactive)) @@ -338,7 +363,8 @@ buffers.") "git-compare" :face face :v-adjust -0.05))) - " " + +modeline--vspc + +modeline--vspc (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) 'face (if active face))))))) @@ -483,8 +509,6 @@ segment.") (add-hook 'deactivate-mark-hook #'+modeline|disable-selection-info))) ;; flycheck -(defvar +modeline--vspc (propertize " " 'face 'variable-pitch)) - (defun +doom-ml-icon (icon &optional text face voffset) "Displays an octicon ICON with FACE, followed by TEXT. Uses `all-the-icons-octicon' to fetch the icon." @@ -565,7 +589,7 @@ icons." ,(1+ (string-width rhs-str)))))) rhs-str))) -(setq-default mode-line-format '("" +modeline-bar +modeline-format-left +modeline--rest)) +(setq-default mode-line-format '("" +modeline-bar-start +modeline-format-left +modeline--rest +modeline-bar-end)) ;; From 0b130d7b9a1100343a615d29b2f3f97090568df6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 18:07:06 +0200 Subject: [PATCH 2644/4235] ui/modeline: fix spacing issues with flycheck/vc --- modules/ui/modeline/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 479332f2c..99d77b04c 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -364,7 +364,6 @@ buffers.") :face face :v-adjust -0.05))) +modeline--vspc - +modeline--vspc (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) 'face (if active face))))))) @@ -536,7 +535,7 @@ segment.") (defun +doom-modeline|update-flycheck-segment (&optional status) (setq +modeline-flycheck (when-let* ((status-str (+modeline-flycheck-status status))) - (concat +modeline--vspc status-str +modeline--vspc)))) + (concat +modeline--vspc status-str " ")))) (add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) (add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) From 0c36b4450ebf21479697dd2c9853486b0cc4f15c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 18:07:31 +0200 Subject: [PATCH 2645/4235] lang/ruby: update rspec-mode integration Prompted by upstream updates. --- modules/lang/ruby/config.el | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index ccb7689bf..f4f0fe637 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -69,9 +69,6 @@ (def-package! rspec-mode :mode ("/\\.rspec\\'" . text-mode) :init - (associate! rspec-mode :match "/\\.rspec$") - (associate! rspec-mode :modes (enh-ruby-mode yaml-mode) :files ("spec/")) - (defvar evilmi-ruby-match-tags '((("unless" "if") ("elsif" "else") "end") ("begin" ("rescue" "ensure") "end") @@ -80,14 +77,20 @@ ;; Rake (("task" "namespace") () "end"))) - ;; This package autoloads this advice, but does not autoload the advice - ;; function, causing void-symbol errors when using the compilation buffer - ;; (even for things unrelated to ruby/rspec). Even if the function were - ;; autoloaded, it seems silly to add this advice before rspec-mode is loaded, - ;; so remove it anyway! - (advice-remove 'compilation-buffer-name #'rspec-compilation-buffer-name-wrapper) + (unless (featurep! :feature evil) + (setq rspec-verifiable-mode-keymap (make-sparse-keymap) "TODO") + (setq rspec-mode-keymap (make-sparse-keymap) "TODO")) + + (defun +ruby*init-appropriate-rspec-mode () + "TODO" + (cond ((rspec-buffer-is-spec-p) + (rspec-mode +1)) + ((let ((proot (doom-project-root 'nocache))) + (or (file-directory-p (expand-file-name "spec" proot)) + (file-exists-p (expand-file-name ".rspec" proot)))) + (rspec-verifiable-mode +1)))) + (advice-add #'rspec-enable-appropriate-mode :override #'+ruby*init-appropriate-rspec-mode) :config - (remove-hook 'enh-ruby-mode-hook #'rspec-enable-appropriate-mode) (map! :map (rspec-mode-map rspec-verifiable-mode-map) :localleader :prefix "t" From 417736ecf6a600fbedd97fd338a93a6d554d27ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 18:20:27 +0200 Subject: [PATCH 2646/4235] Move hideshow config from ui/doom->emacs/hideshow --- modules/emacs/hideshow/autoload.el | 18 ++++++++++++++++++ modules/emacs/hideshow/config.el | 5 ++++- modules/ui/doom/config.el | 20 -------------------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/modules/emacs/hideshow/autoload.el b/modules/emacs/hideshow/autoload.el index 3f23e0c4f..087bb62df 100644 --- a/modules/emacs/hideshow/autoload.el +++ b/modules/emacs/hideshow/autoload.el @@ -1,5 +1,10 @@ ;;; emacs/hideshow/autoload.el -*- lexical-binding: t; -*- +(defface +hideshow-folded-face + `((t (:inherit font-lock-comment-face :weight light))) + "Face to hightlight `hideshow' overlays." + :group 'doom-themes) + ;;;###autoload (defun +hideshow-haml-forward-sexp (arg) (haml-forward-sexp arg) @@ -14,6 +19,19 @@ (goto-char (cadr range)) (end-of-line))))) +;;;###autoload +(defun +hideshow-set-up-overlay (ov) + (when (eq 'code (overlay-get ov 'hs)) + (when (featurep 'vimish-fold) + (overlay-put + ov 'before-string + (propertize "…" 'display + (list vimish-fold-indication-mode + 'empty-line + 'vimish-fold-fringe)))) + (overlay-put + ov 'display (propertize " [...] " 'face '+hideshow-folded-face)))) + ;; ;; Indentation detection diff --git a/modules/emacs/hideshow/config.el b/modules/emacs/hideshow/config.el index d1674574a..900f2cd4b 100644 --- a/modules/emacs/hideshow/config.el +++ b/modules/emacs/hideshow/config.el @@ -1,8 +1,11 @@ ;;; emacs/hideshow/config.el -*- lexical-binding: t; -*- (after! hideshow ; built-in - (setq hs-hide-comments-when-hiding-all nil) + (setq hs-hide-comments-when-hiding-all nil + ;; Nicer code-folding overlays (with fringe indicators) + hs-set-up-overlay #'+hideshow-set-up-overlay) + ;; extra folding support for more languages (unless (assq 't hs-special-modes-alist) (setq hs-special-modes-alist (append diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 35ca8b43f..121586d2c 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -63,23 +63,3 @@ ;; considered an unreal buffer, so solaire-mode must be restored. (add-hook 'org-capture-mode-hook #'turn-on-solaire-mode)) - -(after! hideshow - (defface +doom-folded-face `((t (:inherit font-lock-comment-face :weight light))) - "Face to hightlight `hideshow' overlays." - :group 'doom-themes) - - ;; Nicer code-folding overlays (with fringe indicators) - (defun +doom-set-up-overlay (ov) - (when (eq 'code (overlay-get ov 'hs)) - (when (featurep 'vimish-fold) - (overlay-put - ov 'before-string - (propertize "…" 'display - (list vimish-fold-indication-mode - 'empty-line - 'vimish-fold-fringe)))) - (overlay-put - ov 'display (propertize " [...] " 'face '+doom-folded-face)))) - (setq hs-set-up-overlay #'+doom-set-up-overlay)) - From b12944fddb8382979c8f15631491c94edaf7f6cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 18:25:24 +0200 Subject: [PATCH 2647/4235] undo-tree-auto-save-history = t Persistent undo history is great. I'm hoping that, with undo-tree-enable-undo-in-region disabled, we can enable this feature again safely. Time will tell. --- core/core-editor.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b39230c5b..0a35f5e36 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -212,13 +212,13 @@ savehist file." (def-package! undo-tree :after-call (doom-exit-buffer-hook after-find-file) :config - ;; persistent undo history and undo-in-region is known to cause undo history - ;; corruption, which can be very destructive! Disabling it deters the error, - ;; but does not fix it entirely! - (setq undo-tree-auto-save-history nil + (setq undo-tree-auto-save-history t + ;; undo-in-region is known to cause undo history corruption, which can + ;; be very destructive! Disabling it deters the error, but does not fix + ;; it entirely! undo-tree-enable-undo-in-region nil undo-tree-history-directory-alist - (list (cons "." (concat doom-cache-dir "undo-tree-hist/")))) + `(("." . ,(concat doom-cache-dir "undo-tree-hist/")))) (global-undo-tree-mode +1)) From 261aa7c944b826338c14e002b00e7e57e5116201 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 18:34:51 +0200 Subject: [PATCH 2648/4235] Compress/compact undo-tree history (and shut up) --- core/core-editor.el | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 0a35f5e36..f198f89ec 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -219,7 +219,31 @@ savehist file." undo-tree-enable-undo-in-region nil undo-tree-history-directory-alist `(("." . ,(concat doom-cache-dir "undo-tree-hist/")))) - (global-undo-tree-mode +1)) + (global-undo-tree-mode +1) + + ;; compress undo with xz + (advice-add #'undo-tree-make-history-save-file-name :filter-return + (cond ((executable-find "zstd") (lambda (file) (concat file ".zst"))) + ((executable-find "gzip") (lambda (file) (concat file ".gz"))))) + + (advice-add #'undo-tree-load-history :around #'doom*shut-up) + + (defun doom*strip-text-properties-from-undo-history (orig-fn &rest args) + (dolist (item buffer-undo-list) + (and (consp item) + (stringp (car item)) + (setcar item (substring-no-properties (car item))))) + (apply orig-fn args)) + (advice-add 'undo-list-transfer-to-tree :around #'doom*strip-text-properties-from-undo-history) + + (defun doom*compress-undo-tree-history (orig-fn &rest args) + (cl-letf* ((jka-compr-verbose nil) + (old-write-region (symbol-function #'write-region)) + ((symbol-function #'write-region) + (lambda (start end filename &optional append _visit &rest args) + (apply old-write-region start end filename append 0 args)))) + (apply orig-fn args))) + (advice-add #'undo-tree-save-history :around #'doom*compress-undo-tree-history)) ;; From 4db89a2fb42e40e1a1be4181e1cfdcc72336002a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 19:15:46 +0200 Subject: [PATCH 2649/4235] Remove treemacs popup hack Now that it is supported upstream. Relevant to #766 --- modules/ui/popup/+hacks.el | 10 ---------- modules/ui/treemacs/config.el | 8 +++++++- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 499d3d84a..e69ba4ae5 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -282,16 +282,6 @@ instead of switch-to-buffer-*." (set-popup-rule! "\\(^\\*Contents\\|'s annots\\*$\\)" :ignore t)) -;; `treemacs' -(after! treemacs - (set-popup-rule! "^ \\*Treemacs" :side 'left :size treemacs-width :quit nil :ttl 0) - (defun +popup*set-popup (&rest _) - "Create and setup a buffer for treemacs in the right position and size." - (pop-to-buffer (treemacs--get-framelocal-buffer)) - (treemacs--forget-last-highlight)) - (advice-add #'treemacs--setup-buffer :override #'+popup*set-popup)) - - ;; `wgrep' (progn ;; close the popup after you're done with a wgrep buffer diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 9f596546d..7e6f399e0 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -9,11 +9,17 @@ treemacs-sorting 'alphabetic-desc treemacs-show-hidden-files t treemacs-goto-tag-strategy 'refetch-index - ;; for `treemacs-persistence' + treemacs-display-in-side-window t treemacs-persist-file (concat doom-cache-dir "treemacs-persist")) (after! treemacs + (set-popup-rule! "^ \\*Treemacs" + :side treemacs-position + :size treemacs-width + :quit nil + :ttl 0) + (defvar +treemacs-use-git-mode (pcase (cons (not (null (executable-find "git"))) (not (null (executable-find "python3")))) From 35b88a597b734188418f1b1f50d4e093ba02fb83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 21:37:42 +0200 Subject: [PATCH 2650/4235] Activate ivy-prescient-mode on ivy-mode --- modules/completion/ivy/config.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 78a3d25b8..ee21b361d 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -176,7 +176,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-prescient - :after ivy + :hook (ivy-mode . ivy-prescient-mode) :init (if (featurep! +fuzzy) (setq prescient-filter-method 'fuzzy) @@ -184,6 +184,7 @@ immediately runs it on the current candidate (ending the ivy session)." ivy-prescient-retain-classic-highlighting t)) :config (setq prescient-save-file (concat doom-cache-dir "presclient-save.el")) + (prescient-persist-mode +1) ;; `ivy-prescient' is too slow for fuzzy projectile-find-file and ;; counsel-file-jump, so ensure they're ignored @@ -191,10 +192,7 @@ immediately runs it on the current candidate (ending the ivy session)." (add-to-list 'ivy-re-builders-alist '(counsel-file-jump . +ivy--regex-fuzzy)) (add-to-list 'ivy-re-builders-alist '(projectile-find-file . +ivy--regex-fuzzy))) (add-to-list 'ivy-prescient-excluded-commands 'counsel-find-jump nil #'eq) - (add-to-list 'ivy-prescient-excluded-commands 'projectile-find-file nil #'eq) - - (prescient-persist-mode +1) - (ivy-prescient-mode +1)) + (add-to-list 'ivy-prescient-excluded-commands 'projectile-find-file nil #'eq)) (def-package! wgrep From 1f1f2c3ebfebda12bf5d11a4c45e1fce2ffe770b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 21:57:47 +0200 Subject: [PATCH 2651/4235] completion/ivy: fix ivy--regex-fuzzy typos --- modules/completion/ivy/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index ee21b361d..786e0993e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -189,8 +189,8 @@ immediately runs it on the current candidate (ending the ivy session)." ;; `ivy-prescient' is too slow for fuzzy projectile-find-file and ;; counsel-file-jump, so ensure they're ignored (when (featurep! +fuzzy) - (add-to-list 'ivy-re-builders-alist '(counsel-file-jump . +ivy--regex-fuzzy)) - (add-to-list 'ivy-re-builders-alist '(projectile-find-file . +ivy--regex-fuzzy))) + (add-to-list 'ivy-re-builders-alist '(counsel-file-jump . ivy--regex-fuzzy)) + (add-to-list 'ivy-re-builders-alist '(projectile-find-file . ivy--regex-fuzzy))) (add-to-list 'ivy-prescient-excluded-commands 'counsel-find-jump nil #'eq) (add-to-list 'ivy-prescient-excluded-commands 'projectile-find-file nil #'eq)) From 4489ce6b81711751575c34fc67223c6968a7572a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 3 Aug 2018 23:56:28 +0200 Subject: [PATCH 2652/4235] ui/popup: refactor hacks --- modules/ui/popup/+hacks.el | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index e69ba4ae5..85c7d617a 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -35,7 +35,7 @@ ;; ;; `company' -(after! company +(progn (defun +popup*dont-select-me (orig-fn &rest args) (let ((+popup--inhibit-select t)) (apply orig-fn args))) @@ -43,7 +43,7 @@ ;; `eshell' -(after! eshell +(progn (setq eshell-destroy-buffer-when-process-dies t) ;; When eshell runs a visual command (see `eshell-visual-commands'), it spawns @@ -59,7 +59,7 @@ ;; `evil' -(after! evil +(progn (defun +popup*evil-command-window (hist cmd-key execute-fn) "The evil command window has a mind of its own (uses `switch-to-buffer'). We monkey patch it to use pop-to-buffer, and to remember the previous window." @@ -150,7 +150,7 @@ the command buffer." ;; `helpful' -(after! helpful +(progn ;; Open link in origin window (non-popup) instead of inside the popup window. (defun +popup*helpful--navigate (button) (let ((path (substring-no-properties (button-get button 'path))) @@ -183,7 +183,7 @@ the command buffer." ;; `helm-ag' -(after! helm-ag +(progn (defun +helm*pop-to-buffer (orig-fn &rest args) (pop-to-buffer (save-window-excursion (apply orig-fn args) @@ -290,17 +290,16 @@ instead of switch-to-buffer-*." ;; `which-key' -(after! which-key - (setq which-key-popup-type 'custom - which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) - which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window - which-key-custom-show-popup-function - (lambda (act-popup-dim) - (cl-letf (((symbol-function 'display-buffer-in-side-window) - (lambda (buffer alist) - (+popup-display-buffer-stacked-side-window - buffer (append '((vslot . -9999)) alist))))) - (which-key--show-buffer-side-window act-popup-dim))))) +(setq which-key-popup-type 'custom + which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) + which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window + which-key-custom-show-popup-function + (lambda (act-popup-dim) + (cl-letf (((symbol-function 'display-buffer-in-side-window) + (lambda (buffer alist) + (+popup-display-buffer-stacked-side-window + buffer (append '((vslot . -9999)) alist))))) + (which-key--show-buffer-side-window act-popup-dim)))) ;; `windmove' From 316a9f06b289955550f75375178da5ddb895c861 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 02:14:43 +0200 Subject: [PATCH 2653/4235] completion/company: add company-prescient --- modules/completion/company/config.el | 7 +++++++ modules/completion/company/packages.el | 1 + 2 files changed, 8 insertions(+) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index f019ff89a..2d454a357 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -29,6 +29,13 @@ :config (setq company-idle-delay 0.2)) +(def-package! company-prescient + :hook (company-mode . company-prescient-mode) + :config + (setq prescient-save-file (concat doom-cache-dir "prescient-save.el")) + (prescient-persist-mode +1)) + + (def-package! company-box :when (and EMACS26+ (featurep! +childframe)) :hook (company-mode . company-box-mode) diff --git a/modules/completion/company/packages.el b/modules/completion/company/packages.el index 3de2d1da3..1e2b7a64b 100644 --- a/modules/completion/company/packages.el +++ b/modules/completion/company/packages.el @@ -3,5 +3,6 @@ (package! company) (package! company-dict) +(package! company-prescient) (when (and EMACS26+ (featurep! +childframe)) (package! company-box)) From c878314aa6086b044fb715db41e41ec24834bc25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 02:28:45 +0200 Subject: [PATCH 2654/4235] Refactor +ivy/projectile-find-file to use counsel counsel-projectile-find-file has other capabilities (like actions and sorting). So we conditionally use projectile-find-file only if the project is large enough to warrant it. --- modules/completion/ivy/autoload/ivy.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 5d666cdac..da1c8a4de 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -210,20 +210,25 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;;;###autoload (defun +ivy/projectile-find-file () - "A more sensible `projectile-find-file', which will revert to -`counsel-find-file' if invoked from $HOME (usually not what you want), or -`counsel-file-jump' if invoked from a non-project. + "A more sensible `counsel-projectile-find-file', which will revert to +`counsel-find-file' if invoked from $HOME, `counsel-file-jump' if invoked from a +non-project, `projectile-find-file' if in a bug project (more than +`ivy-sort-max-size' files), or `counsel-projectile-find-file' otherwise. -Both are much faster than letting `projectile-find-file' index massive file -trees." +The point of this is to avoid Emacs locking up indexing massive file trees." (interactive) (call-interactively (cond ((or (file-equal-p default-directory "~") (when-let* ((proot (doom-project-root 'nocache))) (file-equal-p proot "~"))) #'counsel-find-file) + ((doom-project-p 'nocache) - #'projectile-find-file) + (let ((files (projectile-current-project-files))) + (if (<= (length files) ivy-sort-max-size) + #'counsel-projectile-find-file + #'projectile-find-file))) + (#'counsel-file-jump)))) ;;;###autoload From 41a641f53bc517a91100bde4b09bc1b8e979d25a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 02:30:26 +0200 Subject: [PATCH 2655/4235] Disable counsel-projectile-find-file transformer --- modules/completion/ivy/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 786e0993e..f912650af 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -171,8 +171,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap projectile-ag] #'counsel-projectile-ag [remap projectile-switch-project] #'counsel-projectile-switch-project) :config - ;; Highlight entries that have been visited; opposite of default - (ivy-set-display-transformer #'counsel-projectile-find-file #'+ivy-projectile-find-file-transformer)) + ;; no highlighting visited files; slows down the filtering + (ivy-set-display-transformer #'counsel-projectile-find-file nil)) (def-package! ivy-prescient From e916a4d6fe58be56c3c9d821b3b028c0797281ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 02:31:37 +0200 Subject: [PATCH 2656/4235] Remove ivy-prescient Doesn't bring enough to the table, slows down fuzzy searches too much, and alters the way ivy highlights. --- modules/completion/ivy/config.el | 23 ----------------------- modules/completion/ivy/packages.el | 1 - 2 files changed, 24 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index f912650af..3adb6e776 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -65,9 +65,6 @@ immediately runs it on the current candidate (ending the ivy session)." (t . ivy--regex-fuzzy)) ivy-initial-inputs-alist nil)) - ;; make projectile-find-file faster - (add-to-list 'ivy-sort-functions-alist '(projectile-find-file)) - (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) @@ -175,26 +172,6 @@ immediately runs it on the current candidate (ending the ivy session)." (ivy-set-display-transformer #'counsel-projectile-find-file nil)) -(def-package! ivy-prescient - :hook (ivy-mode . ivy-prescient-mode) - :init - (if (featurep! +fuzzy) - (setq prescient-filter-method 'fuzzy) - (setq prescient-filter-method 'regexp - ivy-prescient-retain-classic-highlighting t)) - :config - (setq prescient-save-file (concat doom-cache-dir "presclient-save.el")) - (prescient-persist-mode +1) - - ;; `ivy-prescient' is too slow for fuzzy projectile-find-file and - ;; counsel-file-jump, so ensure they're ignored - (when (featurep! +fuzzy) - (add-to-list 'ivy-re-builders-alist '(counsel-file-jump . ivy--regex-fuzzy)) - (add-to-list 'ivy-re-builders-alist '(projectile-find-file . ivy--regex-fuzzy))) - (add-to-list 'ivy-prescient-excluded-commands 'counsel-find-jump nil #'eq) - (add-to-list 'ivy-prescient-excluded-commands 'projectile-find-file nil #'eq)) - - (def-package! wgrep :commands wgrep-change-to-wgrep-mode :config (setq wgrep-auto-save-buffer t)) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 53c383744..888368ce1 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -9,7 +9,6 @@ (package! ivy-hydra) (package! ivy-rich) (package! wgrep) -(package! ivy-prescient) (when (and EMACS26+ (featurep! +childframe)) (package! ivy-posframe)) From c4ec1413dc3d9a7c2bae4eed69c05cbb95d8def3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 12:18:54 +0200 Subject: [PATCH 2657/4235] ui/treemacs: update function name Due to change upstream --- modules/ui/treemacs/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index cae1d8a17..324fe884b 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -10,7 +10,7 @@ project to add." (interactive) (require 'treemacs) - (pcase (treemacs--current-visibility) + (pcase (treemacs-current-visibility) (`visible (delete-window (treemacs--is-visible?))) (`exists (treemacs-select-window)) (`none From 8248e80570a4a1f88d85c0d42ff59121ca618858 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 13:39:39 +0200 Subject: [PATCH 2658/4235] Improve web-mode + smartparens compatibility This addresses two edge cases: 1. if web-mode-auto-close-style == 3, <'s behavior may insert an extra > 2. Some web-mode engines have pairs that end with smartparens pairs, which will result in web-mode inserting its closing pairs _and_ smartparens inserting its closing pairs; resulting in extra characters. Reported by @ar1a --- modules/lang/web/+html.el | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 5c8af811e..3c33cc562 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -19,21 +19,26 @@ web-mode-auto-close-style 2) (after! smartparens + (defun +web-is-auto-close-style-3 (_id action _context) + (and (eq action 'insert) + (eq web-mode-auto-close-style 3))) + (sp-local-pair 'web-mode "<" nil :unless '(:add +web-is-auto-close-style-3)) + ;; let smartparens handle these (setq web-mode-enable-auto-quoting nil web-mode-enable-auto-pairing t) - ;; Remove web-mode auto pairs that end with >, because smartparens autopairs - ;; them, causing duplicates. Also remove truncated autopairs, like . + + ;; 1. Remove web-mode auto pairs whose end pair starts with a latter + ;; (truncated autopairs like ). Smartparens handles these + ;; better. + ;; 2. Strips out extra closing pairs to prevent redundant characters + ;; inserted by smartparens. (dolist (alist web-mode-engines-auto-pairs) - (setcdr alist (delq nil - (mapcar (lambda (pair) - (unless (string-match-p "^[a-z-]" (cdr pair)) - (cons (car pair) - (if (equal (substring (cdr pair) -1) ">") - (substring (cdr pair) 0 -1) - (cdr pair))))) - (cdr alist))))) + (setcdr alist + (cl-loop for pair in (cdr alist) + unless (string-match-p "^[a-z-]" (cdr pair)) + collect (cons (car pair) + (string-trim-right (cdr pair) "\\(?:>\\|]\\|}\\)+"))))) (setf (alist-get nil web-mode-engines-auto-pairs) nil)) (map! :map web-mode-map From fa4b7502c28ef3a2be9c3886a5129cdc2a67015e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 13:41:38 +0200 Subject: [PATCH 2659/4235] lang/cc: add +cc/imenu command Plus minor reformatting of autoloads file --- modules/lang/cc/autoload.el | 55 ++++++++++++++++++++++++------------- modules/lang/cc/config.el | 2 +- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 000f7eb70..1ab7cd017 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -8,25 +8,6 @@ ;; Library ;; -;;;###autoload -(defun +cc/reload-compile-db () - "Reload the current project's JSON compilation database." - (interactive) - (unless (memq major-mode '(c-mode c++-mode objc-mode)) - (user-error "Not a C/C++/ObjC buffer")) - (unless (project-file-exists-p! "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-sp-point-is-template-p (id action context) "Return t if point is in the right place for C++ angle-brackets." @@ -106,6 +87,42 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." ((c-mode))))) +;; +;; Commands +;; + +;;;###autoload +(defun +cc/reload-compile-db () + "Reload the current project's JSON compilation database." + (interactive) + (unless (memq major-mode '(c-mode c++-mode objc-mode)) + (user-error "Not a C/C++/ObjC buffer")) + (unless (project-file-exists-p! "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/imenu () + "Invoke `rtags-imenu' if a running rdm process is available, otherwise invoke +`imenu'." + (interactive) + (call-interactively + (if (and (processp rtags-rdm-process) + (not (eq (process-status rtags-rdm-process) 'exit)) + (not (eq (process-status rtags-rdm-process) 'signal))) + #'rtags-imenu + #'imenu))) + + ;; ;; Hooks ;; diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 9ebedc341..602855658 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -220,7 +220,7 @@ compilation database is present in the project.") (add-hook! 'kill-emacs-hook (ignore-errors (rtags-cancel-process))) ;; Use rtags-imenu instead of imenu/counsel-imenu - (define-key! (c-mode-map c++-mode-map) [remap imenu] #'rtags-imenu) + (define-key! (c-mode-map c++-mode-map) [remap imenu] #'+cc/imenu) (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) From fbe4e94fbc4249ef3e4356db5bad7f8d7640a418 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 13:42:10 +0200 Subject: [PATCH 2660/4235] Mention restart when bin/doom is finished It is preferrable to doom/reload. --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 029bec2e2..75020a054 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -339,7 +339,7 @@ it exists." (defun doom--warn-refresh-session () (message "Detected a running Emacs session.\n") - (message "Use `M-x doom/reload' for changes to take effect.")) + (message "Restart Emacs or use `M-x doom/reload' for changes to take effect.")) (defun doom--do-load (&rest files) (if (and noninteractive (not (daemonp))) From 9a3e71731ce8894d19f11c7b8b75501a299a244f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 13:47:19 +0200 Subject: [PATCH 2661/4235] completion/ivy: bring back flx --- modules/completion/ivy/config.el | 20 ++++++++++++-------- modules/completion/ivy/packages.el | 3 +++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 3adb6e776..5b87887ac 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -57,14 +57,6 @@ immediately runs it on the current candidate (ending the ivy session)." ;; enable ability to select prompt (alternative to `ivy-immediate-done') ivy-use-selectable-prompt t) - (when (featurep! +fuzzy) - (setq ivy-re-builders-alist - '((counsel-ag . ivy--regex-plus) - (counsel-grep . ivy--regex-plus) - (swiper . ivy--regex-plus) - (t . ivy--regex-fuzzy)) - ivy-initial-inputs-alist nil)) - (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) @@ -211,6 +203,18 @@ immediately runs it on the current candidate (ending the ivy session)." (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) +(def-package! flx + :when (featurep! +fuzzy) + :defer t ; is loaded by ivy + :init + (setq ivy-re-builders-alist + '((counsel-ag . ivy--regex-plus) + (counsel-grep . ivy--regex-plus) + (swiper . ivy--regex-plus) + (t . ivy--regex-fuzzy)) + ivy-initial-inputs-alist nil)) + + ;; Used by `counsel-M-x' (setq amx-save-file (concat doom-cache-dir "amx-items")) diff --git a/modules/completion/ivy/packages.el b/modules/completion/ivy/packages.el index 888368ce1..ace65cf1b 100644 --- a/modules/completion/ivy/packages.el +++ b/modules/completion/ivy/packages.el @@ -10,5 +10,8 @@ (package! ivy-rich) (package! wgrep) +(when (featurep! +fuzzy) + (package! flx)) + (when (and EMACS26+ (featurep! +childframe)) (package! ivy-posframe)) From 2c956593cfa2811b91a6f077006b08a38fef28e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 16:00:11 +0200 Subject: [PATCH 2662/4235] completion/helm: don't index HOME Invoke helm-find-files instead --- modules/completion/helm/autoload/helm.el | 12 ++++++++++++ modules/completion/helm/config.el | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 0c1ec29b5..6e44f4a32 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -6,6 +6,18 @@ ;; TODO Implement `+helm/tasks' (error "Not implemented yet")) +;;;###autoload +(defun +helm/projectile-find-file () + "Call `helm-find-files' if called from HOME, otherwise +`helm-projectile-find-file'." + (interactive) + (call-interactively + (if (or (file-equal-p default-directory "~") + (when-let* ((proot (doom-project-root 'nocache))) + (file-equal-p proot "~"))) + #'helm-find-files + #'helm-projectile-find-file))) + ;; ;; Project search diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 0b126187a..1834a78fb 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -30,7 +30,7 @@ If you want to already use git-grep or grep, set this to nil.") [remap imenu-anywhere] #'helm-imenu-anywhere [remap imenu] #'helm-semantic-or-imenu [remap noop-show-kill-ring] #'helm-show-kill-ring - [remap projectile-find-file] #'helm-projectile-find-file + [remap projectile-find-file] #'+helm/projectile-find-file [remap projectile-recentf] #'helm-projectile-recentf [remap projectile-switch-project] #'helm-projectile-switch-project [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer From 552b8b50c066e1018a581f7865a0c285194a226b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 16:34:01 +0200 Subject: [PATCH 2663/4235] lang/python: pyvenv-mode -> pyvenv #777 Fixed incorrect package name. --- modules/lang/python/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index 24e5b85af..1c30b8bf1 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -11,7 +11,7 @@ (when (featurep! +pyenv) (package! pyenv-mode)) (when (featurep! +pyvenv) - (package! pyvenv-mode)) + (package! pyvenv)) (when (featurep! +conda) (package! conda)) From d504c4bafe8b54e763f7882bc7f9b563269a15a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 18:23:53 +0200 Subject: [PATCH 2664/4235] lang/org: respect inherited foreground in eldoc --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index eefa0f93d..4b34710bc 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -365,7 +365,7 @@ conditions where a window's buffer hasn't changed at the time this hook is run." for seg in (delq nil path) for face = (nth (% (cl-incf i) org-n-level-faces) org-level-faces) collect (propertize (replace-regexp-in-string "[ \t]+\\'" "" seg) - 'face (if face `(:foreground ,(face-foreground face))))) + 'face (if face `(:foreground ,(face-foreground face nil t))))) separator)))) (funcall orig-fn))) (advice-add #'org-eldoc-get-breadcrumb :around #'+org*fix-font-size-variation-in-eldoc) From 44472d3ee823da254183f5c9e302899e5b2a3404 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 18:24:54 +0200 Subject: [PATCH 2665/4235] lang/org: use unicode separator for eldoc --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 4b34710bc..9d1c0d81a 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -155,6 +155,7 @@ unfold to point on startup." org-adapt-indentation nil org-cycle-include-plain-lists t org-cycle-separator-lines 1 + org-eldoc-breadcrumb-separator " → " org-entities-user '(("flat" "\\flat" nil "" "" "266D" "♭") ("sharp" "\\sharp" nil "" "" "266F" "♯")) From c1e2919294e0425d369868d0b63300fb5b3cfe14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 18:40:39 +0200 Subject: [PATCH 2666/4235] completion/helm: set default window height = 22% A little smaller than the default --- modules/ui/popup/+hacks.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 85c7d617a..113cd354c 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -169,8 +169,9 @@ the command buffer." ;; `helm' (after! helm - (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window)) (set-popup-rule! "^\\*helm" :ignore t) + (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window) + helm-display-buffer-default-height 0.22) ;; Fix left-over popup window when closing persistent help for `helm-M-x' (defun +popup*helm-elisp--persistent-help (candidate _fun &optional _name) From b180aceaa871e5035f10933deaf2648ee3f97ef4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 18:41:33 +0200 Subject: [PATCH 2667/4235] completion/helm: fix 'n refactor +fuzzy flag Didn't properly disable fuzzy search when +fuzzy flag was absent. --- modules/completion/helm/config.el | 38 ++++++++++++++++--------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 1834a78fb..e5f184f50 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -52,6 +52,24 @@ If you want to already use git-grep or grep, set this to nil.") ;; Don't override evil-ex's completion helm-mode-handle-completion-in-region nil) + (let ((fuzzy (featurep! +fuzzy))) + (setq helm-mode-fuzzy-match fuzzy + helm-completion-in-region-fuzzy-match fuzzy + helm-M-x-fuzzy-match fuzzy + helm-apropos-fuzzy-match fuzzy + helm-bookmark-show-location fuzzy + helm-buffers-fuzzy-matching fuzzy + helm-completion-in-region-fuzzy-match fuzzy + helm-file-cache-fuzzy-match fuzzy + helm-flx-for-helm-locate fuzzy + helm-imenu-fuzzy-match fuzzy + helm-apropos-fuzzy-match fuzzy + helm-lisp-fuzzy-completion fuzzy + helm-locate-fuzzy-match fuzzy + helm-projectile-fuzzy-match fuzzy + helm-recentf-fuzzy-match fuzzy + helm-semantic-fuzzy-match fuzzy)) + :config (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." @@ -81,24 +99,8 @@ If you want to already use git-grep or grep, set this to nil.") (def-package! helm-flx :when (featurep! +fuzzy) - :after helm - :init - (setq helm-candidate-number-limit 40 - helm-M-x-fuzzy-match t - helm-apropos-fuzzy-match t - helm-bookmark-show-location t - helm-buffers-fuzzy-matching t - helm-completion-in-region-fuzzy-match t - helm-file-cache-fuzzy-match t - helm-imenu-fuzzy-match t - helm-locate-fuzzy-match t - helm-flx-for-helm-locate t - helm-mode-fuzzy-match t - helm-projectile-fuzzy-match t - helm-recentf-fuzzy-match t - helm-semantic-fuzzy-match t) - :config - (helm-flx-mode +1)) + :hook (helm-mode . helm-flx-mode) + :config (helm-flx-mode +1)) ;; `helm-ag' From 7f5e778b0c3abe14b2597f9b93fb399ff2335e62 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 19:52:09 +0200 Subject: [PATCH 2668/4235] Replace helm-swoop with swiper-helm Swiper is superior. The downside is it pulls in ivy as a dependency, but that is acceptable considering how small it is. --- modules/completion/helm/config.el | 13 +++---------- modules/completion/helm/packages.el | 2 +- modules/config/default/+bindings.el | 4 ++-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index e5f184f50..c7a53d3f4 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -144,16 +144,9 @@ If you want to already use git-grep or grep, set this to nil.") (set-keymap-parent helm-projectile-find-file-map helm-map)) -(def-package! helm-swoop ; https://github.com/ShingoFukuyama/helm-swoop - :commands helm-multi-swoop-all - :config - (setq helm-swoop-use-line-number-face t - helm-swoop-candidate-number-limit 200 - helm-swoop-speed-or-color t - ;; no initial input - helm-swoop-pre-input-function (lambda () "") - ;; Always split below current window - helm-swoop-split-with-multiple-windows t)) +;; `swiper-helm' +(setq swiper-helm-display-function + (lambda (buf &optional _resume) (pop-to-buffer buf))) (def-package! wgrep diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index 9144ff576..13e0452b7 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -8,7 +8,7 @@ (package! helm-css-scss) (package! helm-describe-modes :recipe (:fetcher github :repo "emacs-helm/helm-describe-modes")) (package! helm-projectile) -(package! helm-swoop) +(package! swiper-helm) (package! wgrep) (when (featurep! +fuzzy) (package! helm-flx)) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 6b544743f..c4ce5581e 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -60,7 +60,7 @@ :n "M-c" #'evil-yank :n "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) (:when (featurep! :completion helm) - :n "M-f" #'helm-swoop) + :n "M-f" #'swiper-helm) (:when (featurep! :completion ivy) :n "M-f" #'swiper) :n "M-s" #'save-buffer @@ -522,7 +522,7 @@ :desc "Project" :nv "p" #'+ivy/project-search :desc "Directory" :nv "d" (λ! (+ivy/project-search t))) (:when (featurep! :completion helm) - :desc "Buffer" :nv "b" #'helm-swoop + :desc "Buffer" :nv "b" #'swiper-helm :desc "Project" :nv "p" #'+helm/project-search :desc "Directory" :nv "d" (λ! (+helm/project-search t))) :desc "Symbols" :nv "i" #'imenu From 860dff3e636718fcf30fdc7d16c1f8f0175df6bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 20:50:54 +0200 Subject: [PATCH 2669/4235] completion/helm: refactor posframe config --- modules/completion/helm/autoload/posframe.el | 59 ++++++++++++++++++++ modules/completion/helm/config.el | 43 +++++++------- modules/ui/modeline/config.el | 9 ++- 3 files changed, 86 insertions(+), 25 deletions(-) create mode 100644 modules/completion/helm/autoload/posframe.el diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el new file mode 100644 index 000000000..7ba3fc156 --- /dev/null +++ b/modules/completion/helm/autoload/posframe.el @@ -0,0 +1,59 @@ +;;; completion/helm/autoload/posframe.el -*- lexical-binding: t; -*- + +(add-hook 'helm-cleanup-hook #'+helm|posframe-cleanup) + +;;;###autoload +(defun +helm-poshandler-frame-center-near-bottom (info) + "Display the child frame in the center of the frame, slightly closer to the +bottom, which is easier on the eyes on big displays." + (let ((parent-frame (plist-get info :parent-frame)) + (pos (posframe-poshandler-frame-center info))) + (cons (car pos) + (truncate (/ (frame-pixel-height parent-frame) + 1.8))))) + +(defvar +helm--posframe-buffer nil) +(defvar +helm--posframe-last-window nil) +;;;###autoload +(defun +helm-posframe-display (buffer &optional _resume) + "TODO" + (setq +helm--posframe-last-window (selected-window)) + (require 'posframe) + (posframe-show + (setq +helm--posframe-buffer buffer) + :poshandler +helm-posframe-handler + :internal-border-width (truncate (/ (frame-fringe-width) 2)) + :respect-header-line t + :respect-mode-line t + :width + (cond ((functionp helm-display-buffer-default-width) + (funcall helm-display-buffer-default-width)) + ((integerp helm-display-buffer-default-width) + helm-display-buffer-default-width) + ((floatp helm-display-buffer-default-width) + (truncate (* (frame-width) helm-display-buffer-default-width))) + ((min (max (truncate (* (frame-width) 0.8)) + 100) + 140))) + :height + (cond ((functionp helm-display-buffer-default-height) + (funcall helm-display-buffer-default-height)) + ((integerp helm-display-buffer-default-height) + helm-display-buffer-default-height) + ((floatp helm-display-buffer-default-height) + (truncate (* (frame-height) helm-display-buffer-default-height))) + ((truncate (* (frame-height) 0.4))))) + (when +helm-posframe-font-scale + (with-current-buffer buffer + (text-scale-set +helm-posframe-font-scale)))) + +;;;###autoload +(defun +helm|posframe-cleanup () + "TODO" + ;; Ensure the underlying window is switched to, to ensure that frame is given + ;; proper focus; this gives the modeline a chance to refresh. + (select-window +helm--posframe-last-window) + (setq +helm--posframe-last-frame nil) + ;; + (posframe-delete +helm--posframe-buffer)) + diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index c7a53d3f4..3e49e7e0a 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -13,6 +13,17 @@ silently ignored. If you want to already use git-grep or grep, set this to nil.") +;; Posframe (requires +childframe) +(defvar +helm-posframe-handler + #'+helm-poshandler-frame-center-near-bottom + "The function that determines the location of the childframe. It should return +a cons cell representing the X and Y coordinates. See +`posframe-poshandler-frame-center' as a reference.") + +(defvar +helm-posframe-font-scale 1 + "The text-scale to use in the helm childframe. Set to nil for no scaling. Can +be negative.") + ;; ;; Packages @@ -50,7 +61,15 @@ If you want to already use git-grep or grep, set this to nil.") helm-ff-auto-update-initial-value nil helm-find-files-doc-header nil ;; Don't override evil-ex's completion - helm-mode-handle-completion-in-region nil) + helm-mode-handle-completion-in-region nil + ;; default sizes + helm-display-buffer-default-width nil + helm-display-buffer-default-height 0.25) + + (when (and EMACS26+ (featurep! +childframe)) + (setq helm-display-function #'+helm-posframe-display + helm-display-buffer-default-height 0.3) + (advice-add #'posframe--get-font-height :override #'ignore)) (let ((fuzzy (featurep! +fuzzy))) (setq helm-mode-fuzzy-match fuzzy @@ -154,28 +173,6 @@ If you want to already use git-grep or grep, set this to nil.") :config (setq wgrep-auto-save-buffer t)) -(def-package! posframe - :when (and EMACS26+ (featurep! +childframe)) - :after helm - :config - (defvar +helm--posframe-buffer nil) - - (defun +helm-posframe-display (buffer &optional _resume) - (posframe-show - (setq +helm--posframe-buffer buffer) - :poshandler #'posframe-poshandler-frame-bottom-left-corner - :left-fringe 10 - :width (frame-width) - :height 16 ;; ivy/+childframe uses 16 - :respect-header-line t)) - - (defun +helm|posframe-cleanup () - (posframe-hide +helm--posframe-buffer)) - - (add-hook 'helm-cleanup-hook #'+helm|posframe-cleanup) - (setq helm-display-function #'+helm-posframe-display)) - - ;; ;; Evil integration ;; diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 99d77b04c..d02c5e36c 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -179,16 +179,21 @@ buffers.") ;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) (defvar +modeline-remap-face-cookie nil) -(defun +modeline|focus () +(defun +modeline|focus (&rest _) (when +modeline-remap-face-cookie (require 'face-remap) (face-remap-remove-relative +modeline-remap-face-cookie))) (add-hook 'focus-in-hook #'+modeline|focus) -(defun +modeline|unfocus () +(defun +modeline|unfocus (&rest _) (setq +modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) (add-hook 'focus-out-hook #'+modeline|unfocus) +(add-hook 'helm-after-initialize-hook #'+modeline|unfocus) + +(advice-add #'posframe-hide :after #'+modeline|focus) +(advice-add #'posframe-delete :after #'+modeline|focus) + ;; ;; Helpers From a9357bb4673e41e0b6945084f4f96e90be456ec8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 4 Aug 2018 20:51:50 +0200 Subject: [PATCH 2670/4235] completion/helm: use hide-mode-line-mode --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 3e49e7e0a..a174ba81d 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -101,7 +101,7 @@ be negative.") (defun +helm*hide-header (&rest _) "Hide header-line & mode-line in helm windows." - (setq mode-line-format nil)) + (hide-mode-line-mode +1)) (advice-add #'helm-display-mode-line :override #'+helm*hide-header) (defun +helm*hide-minibuffer-maybe () From ca6afcf3c7ba01bb3fe6d73b86dd2e15dc51d8b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 21:45:21 +0200 Subject: [PATCH 2671/4235] Add +helm-posframe-border-width option Controls posframe's internal-border-width --- modules/completion/helm/autoload/posframe.el | 2 +- modules/completion/helm/config.el | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el index 7ba3fc156..5b54162f9 100644 --- a/modules/completion/helm/autoload/posframe.el +++ b/modules/completion/helm/autoload/posframe.el @@ -22,7 +22,7 @@ bottom, which is easier on the eyes on big displays." (posframe-show (setq +helm--posframe-buffer buffer) :poshandler +helm-posframe-handler - :internal-border-width (truncate (/ (frame-fringe-width) 2)) + :internal-border-width +helm-posframe-border-width :respect-header-line t :respect-mode-line t :width diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index a174ba81d..8766a5c9c 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -24,6 +24,10 @@ a cons cell representing the X and Y coordinates. See "The text-scale to use in the helm childframe. Set to nil for no scaling. Can be negative.") +(defvar +helm-posframe-border-width 8 + "The text-scale to use in the helm childframe. Set to nil for no scaling. Can +be negative.") + ;; ;; Packages From 41697e4e6ed14dcfd404e2a719ed5978dc0f8595 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 22:04:33 +0200 Subject: [PATCH 2672/4235] Move helm posframe up slightly And display input line in posframe. --- modules/completion/helm/autoload/posframe.el | 2 +- modules/completion/helm/config.el | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el index 5b54162f9..c529e6349 100644 --- a/modules/completion/helm/autoload/posframe.el +++ b/modules/completion/helm/autoload/posframe.el @@ -10,7 +10,7 @@ bottom, which is easier on the eyes on big displays." (pos (posframe-poshandler-frame-center info))) (cons (car pos) (truncate (/ (frame-pixel-height parent-frame) - 1.8))))) + 2))))) (defvar +helm--posframe-buffer nil) (defvar +helm--posframe-last-window nil) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 8766a5c9c..68b4e1d10 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -72,7 +72,9 @@ be negative.") (when (and EMACS26+ (featurep! +childframe)) (setq helm-display-function #'+helm-posframe-display - helm-display-buffer-default-height 0.3) + helm-display-buffer-default-height 0.42 + helm-echo-input-in-header-line t) + ;; Fix "Specified window is not displaying the current buffer" error (advice-add #'posframe--get-font-height :override #'ignore)) (let ((fuzzy (featurep! +fuzzy))) From 0cfd35cfc01f5e01d27e7efa3c189b16cb51425e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 22:06:46 +0200 Subject: [PATCH 2673/4235] Refactor how helm mode-line is hidden --- modules/completion/helm/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 68b4e1d10..ca385de3b 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -60,8 +60,9 @@ be negative.") :after helm-mode :init (setq helm-candidate-number-limit 50 - ;; Display extraineous helm UI elements + ;; Remove extraineous helm UI elements helm-display-header-line nil + helm-mode-line-string nil helm-ff-auto-update-initial-value nil helm-find-files-doc-header nil ;; Don't override evil-ex's completion @@ -105,10 +106,10 @@ be negative.") plist))) (advice-add #'helm :filter-args #'+helm*replace-prompt) - (defun +helm*hide-header (&rest _) - "Hide header-line & mode-line in helm windows." - (hide-mode-line-mode +1)) - (advice-add #'helm-display-mode-line :override #'+helm*hide-header) + (defun +helm*hide-mode-line (&rest _) + (unless helm-mode-line-string + (hide-mode-line-mode +1))) + (advice-add #'helm-display-mode-line :override #'+helm*hide-mode-line) (defun +helm*hide-minibuffer-maybe () "Hide minibuffer in Helm session if we use the header line as input field." From 4dc5ef3879d4355ac9b834fba322373328e3b5e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 22:09:46 +0200 Subject: [PATCH 2674/4235] Add highlight-escape-sequences --- core/core-ui.el | 5 +++++ core/packages.el | 1 + 2 files changed, 6 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index 3229c7f07..3510af655 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -142,6 +142,11 @@ Also see `doom-exit-buffer-hook'.") (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+.*\\_>") (add-hook 'prog-mode-hook #'highlight-numbers-mode) +;; `highlight-escape-sequences' +(def-package! highlight-escape-sequences + :after-call after-find-file + :config (hes-mode +1)) + ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially ;; in parentheses-drunk languages like Lisp. (def-package! rainbow-delimiters diff --git a/core/packages.el b/core/packages.el index 4a15d5710..b67d49e22 100644 --- a/core/packages.el +++ b/core/packages.el @@ -11,6 +11,7 @@ (package! hide-mode-line) (package! highlight-indentation) (package! highlight-numbers) +(package! highlight-escape-sequences) (unless (boundp 'display-line-numbers) (package! nlinum) (package! nlinum-hl) From 8d26879f990907f8b8d18a39eb21d2fd6ef211f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 22:10:36 +0200 Subject: [PATCH 2675/4235] Add :editor multiple-cursors module Moves evil-mc/evil-multiedit out of feature/evil. --- init.example.el | 1 + modules/editor/multiple-cursors/config.el | 108 ++++++++++++++++++ modules/editor/multiple-cursors/packages.el | 9 ++ modules/feature/evil/config.el | 120 +------------------- modules/feature/evil/packages.el | 2 - 5 files changed, 120 insertions(+), 120 deletions(-) create mode 100644 modules/editor/multiple-cursors/config.el create mode 100644 modules/editor/multiple-cursors/packages.el diff --git a/init.example.el b/init.example.el index 15ee9d59a..ee95b7d7a 100644 --- a/init.example.el +++ b/init.example.el @@ -47,6 +47,7 @@ window-select ; visually switch windows :editor + multiple-cursors ; editing in many places at once ;parinfer ; turn lisp into python, sort of rotate-text ; cycle region at point between text candidates diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el new file mode 100644 index 000000000..98fd1bbcc --- /dev/null +++ b/modules/editor/multiple-cursors/config.el @@ -0,0 +1,108 @@ +;;; editor/multiple-cursors/config.el -*- lexical-binding: t; -*- + +(def-package! evil-mc + :when (featurep! :feature evil) + :commands (evil-mc-make-cursor-here evil-mc-make-all-cursors + evil-mc-undo-all-cursors evil-mc-pause-cursors + evil-mc-resume-cursors evil-mc-make-and-goto-first-cursor + evil-mc-make-and-goto-last-cursor + evil-mc-make-cursor-move-next-line + evil-mc-make-cursor-move-prev-line evil-mc-make-cursor-at-pos + evil-mc-has-cursors-p evil-mc-make-and-goto-next-cursor + evil-mc-skip-and-goto-next-cursor evil-mc-make-and-goto-prev-cursor + evil-mc-skip-and-goto-prev-cursor evil-mc-make-and-goto-next-match + evil-mc-skip-and-goto-next-match evil-mc-skip-and-goto-next-match + evil-mc-make-and-goto-prev-match evil-mc-skip-and-goto-prev-match) + :init + (defvar evil-mc-key-map (make-sparse-keymap)) + :config + (global-evil-mc-mode +1) + + (after! smartparens + ;; Make evil-mc cooperate with smartparens better + (let ((vars (cdr (assq :default evil-mc-cursor-variables)))) + (unless (memq (car sp--mc/cursor-specific-vars) vars) + (setcdr (assq :default evil-mc-cursor-variables) + (append vars sp--mc/cursor-specific-vars))))) + + ;; Add custom commands to whitelisted commands + (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol + doom/backward-kill-to-bol-and-indent)) + (add-to-list 'evil-mc-custom-known-commands `(,fn (:default . evil-mc-execute-default-call)))) + + ;; Activate evil-mc cursors upon switching to insert mode + (defun +evil-mc|resume-cursors () (setq evil-mc-frozen nil)) + (add-hook 'evil-insert-state-entry-hook #'+evil-mc|resume-cursors) + + ;; disable evil-escape in evil-mc; causes unwanted text on invocation + (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode nil #'eq) + + (defun +multiple-cursors|escape-multiple-cursors () + "Clear evil-mc cursors and restore state." + (when (evil-mc-has-cursors-p) + (evil-mc-undo-all-cursors) + (evil-mc-resume-cursors) + t)) + (add-hook 'doom-escape-hook #'+multiple-cursors|escape-multiple-cursors) + + ;; + (evil-add-command-properties '+evil:align :evil-mc t) + (evil-add-command-properties '+evil:mc :evil-mc t)) + + +(def-package! multiple-cursors + :defer t + :config + ;; TODO multiple-cursors config for Emacs users? + + ;; mc doesn't play well with evil, this attempts to assuage some of its + ;; problems so that any plugins that depend on multiple-cursors (which I have + ;; no control over) can still use it in relative safety. + (when (featurep! :feature evil) + (evil-define-key* '(normal emacs) mc/keymap [escape] #'mc/keyboard-quit) + + (defvar +mc--compat-evil-prev-state nil) + (defvar +mc--compat-mark-was-active nil) + + (defun +multiple-cursors|compat-switch-to-emacs-state () + (when (and (bound-and-true-p evil-mode) + (not (memq evil-state '(insert emacs)))) + (setq +mc--compat-evil-prev-state evil-state) + (when (region-active-p) + (setq +mc--compat-mark-was-active t)) + (let ((mark-before (mark)) + (point-before (point))) + (evil-emacs-state 1) + (when (or +mc--compat-mark-was-active (region-active-p)) + (goto-char point-before) + (set-mark mark-before))))) + (add-hook 'multiple-cursors-mode-enabled-hook #'+multiple-cursors|compat-switch-to-emacs-state) + + (defun +multiple-cursors|compat-back-to-previous-state () + (when +mc--compat-evil-prev-state + (unwind-protect + (case +mc--compat-evil-prev-state + ((normal visual) (evil-force-normal-state)) + (t (message "Don't know how to handle previous state: %S" + +mc--compat-evil-prev-state))) + (setq +mc--compat-evil-prev-state nil) + (setq +mc--compat-mark-was-active nil)))) + (add-hook 'multiple-cursors-mode-disabled-hook #'+multiple-cursors|compat-back-to-previous-state) + + ;; When running edit-lines, point will return (position + 1) as a + ;; result of how evil deals with regions + (defun +multiple-cursors*adjust-mark-for-evil (&rest _) + (when (and (bound-and-true-p evil-mode) + (not (memq evil-state '(insert emacs)))) + (if (> (point) (mark)) + (goto-char (1- (point))) + (push-mark (1- (mark)))))) + (advice-add #'mc/edit-lines :before #'+multiple-cursors*adjust-mark-for-evil) + + (defun +multiple-cursors|evil-compat-rect-switch-state () + (if rectangular-region-mode + (+multiple-cursors|compat-switch-to-emacs-state) + (setq +mc--compat-evil-prev-state nil))) + (add-hook 'rectangular-region-mode-hook '+multiple-cursors|evil-compat-rect-switch-state) + + (defvar mc--default-cmds-to-run-once nil))) diff --git a/modules/editor/multiple-cursors/packages.el b/modules/editor/multiple-cursors/packages.el new file mode 100644 index 000000000..5519a9a4e --- /dev/null +++ b/modules/editor/multiple-cursors/packages.el @@ -0,0 +1,9 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/multiple-cursors/packages.el + +(cond ((featurep! :feature evil) + (package! evil-multiedit) + (package! evil-mc)) + + ((package! multiple-cursors))) + diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index be2a48ecf..240f5b7b4 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -138,9 +138,9 @@ ;; Forward declare these so that ex completion works, even if the autoloaded ;; functions aren't loaded yet. (evil-set-command-properties - '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :evil-mc t :keep-visual t :suppress-operator t) + '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :keep-visual t :suppress-operator t) (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t :evil-mc t) + '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t) ;; `evil-collection' (when (featurep! +everywhere) @@ -272,64 +272,6 @@ the new algorithm is confusing, like in python or ruby." (add-hook 'python-mode-hook #'+evil|simple-matchit)) -(def-package! evil-multiedit - :commands (evil-multiedit-match-all - evil-multiedit-match-and-next - evil-multiedit-match-and-prev - evil-multiedit-match-symbol-and-next - evil-multiedit-match-symbol-and-prev - evil-multiedit-toggle-or-restrict-region - evil-multiedit-next - evil-multiedit-prev - evil-multiedit-abort - evil-multiedit-ex-match)) - - -(def-package! evil-mc - :commands (evil-mc-make-cursor-here evil-mc-make-all-cursors - evil-mc-undo-all-cursors evil-mc-pause-cursors - evil-mc-resume-cursors evil-mc-make-and-goto-first-cursor - evil-mc-make-and-goto-last-cursor - evil-mc-make-cursor-move-next-line - evil-mc-make-cursor-move-prev-line evil-mc-make-cursor-at-pos - evil-mc-has-cursors-p evil-mc-make-and-goto-next-cursor - evil-mc-skip-and-goto-next-cursor evil-mc-make-and-goto-prev-cursor - evil-mc-skip-and-goto-prev-cursor evil-mc-make-and-goto-next-match - evil-mc-skip-and-goto-next-match evil-mc-skip-and-goto-next-match - evil-mc-make-and-goto-prev-match evil-mc-skip-and-goto-prev-match) - :init - (defvar evil-mc-key-map (make-sparse-keymap)) - :config - (global-evil-mc-mode +1) - - (after! smartparens - ;; Make evil-mc cooperate with smartparens better - (let ((vars (cdr (assq :default evil-mc-cursor-variables)))) - (unless (memq (car sp--mc/cursor-specific-vars) vars) - (setcdr (assq :default evil-mc-cursor-variables) - (append vars sp--mc/cursor-specific-vars))))) - - ;; Add custom commands to whitelisted commands - (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol - doom/backward-kill-to-bol-and-indent)) - (add-to-list 'evil-mc-custom-known-commands `(,fn (:default . evil-mc-execute-default-call)))) - - ;; Activate evil-mc cursors upon switching to insert mode - (defun +evil-mc|resume-cursors () (setq evil-mc-frozen nil)) - (add-hook 'evil-insert-state-entry-hook #'+evil-mc|resume-cursors) - - ;; disable evil-escape in evil-mc; causes unwanted text on invocation - (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode nil #'eq) - - (defun +evil|escape-multiple-cursors () - "Clear evil-mc cursors and restore state." - (when (evil-mc-has-cursors-p) - (evil-mc-undo-all-cursors) - (evil-mc-resume-cursors) - t)) - (add-hook 'doom-escape-hook #'+evil|escape-multiple-cursors)) - - (def-package! evil-snipe :commands (evil-snipe-mode evil-snipe-override-mode evil-snipe-local-mode evil-snipe-override-local-mode) @@ -392,61 +334,3 @@ the new algorithm is confusing, like in python or ruby." (def-package! exato :commands (evil-outer-xml-attr evil-inner-xml-attr)) - - -;; -;; Multiple cursors compatibility (for the plugins that use it) -;; - -;; mc doesn't play well with evil, this attempts to assuage some of its problems -;; 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 - (evil-define-key* '(normal emacs) mc/keymap [escape] #'mc/keyboard-quit) - - (defvar +evil--mc-compat-evil-prev-state nil) - (defvar +evil--mc-compat-mark-was-active nil) - - (defun +evil|mc-compat-switch-to-emacs-state () - (when (and (bound-and-true-p evil-mode) - (not (memq evil-state '(insert emacs)))) - (setq +evil--mc-compat-evil-prev-state evil-state) - (when (region-active-p) - (setq +evil--mc-compat-mark-was-active t)) - (let ((mark-before (mark)) - (point-before (point))) - (evil-emacs-state 1) - (when (or +evil--mc-compat-mark-was-active (region-active-p)) - (goto-char point-before) - (set-mark mark-before))))) - - (defun +evil|mc-compat-back-to-previous-state () - (when +evil--mc-compat-evil-prev-state - (unwind-protect - (case +evil--mc-compat-evil-prev-state - ((normal visual) (evil-force-normal-state)) - (t (message "Don't know how to handle previous state: %S" - +evil--mc-compat-evil-prev-state))) - (setq +evil--mc-compat-evil-prev-state nil) - (setq +evil--mc-compat-mark-was-active nil)))) - - (add-hook 'multiple-cursors-mode-enabled-hook #'+evil|mc-compat-switch-to-emacs-state) - (add-hook 'multiple-cursors-mode-disabled-hook #'+evil|mc-compat-back-to-previous-state) - - ;; When running edit-lines, point will return (position + 1) as a - ;; result of how evil deals with regions - (defun +evil*mc/edit-lines (&rest _) - (when (and (bound-and-true-p evil-mode) - (not (memq evil-state '(insert emacs)))) - (if (> (point) (mark)) - (goto-char (1- (point))) - (push-mark (1- (mark)))))) - (advice-add #'mc/edit-lines :before #'+evil*mc/edit-lines) - - (defun +evil|mc-evil-compat-rect-switch-state () - (if rectangular-region-mode - (+evil|mc-compat-switch-to-emacs-state) - (setq +evil--mc-compat-evil-prev-state nil))) - (add-hook 'rectangular-region-mode-hook '+evil|mc-evil-compat-rect-switch-state) - - (defvar mc--default-cmds-to-run-once nil)) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index 1e04024de..0f5096ef0 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -10,8 +10,6 @@ (package! evil-exchange) (package! evil-indent-plus) (package! evil-matchit) -(package! evil-mc) -(package! evil-multiedit) (package! evil-numbers) (package! evil-textobj-anyblock) (package! evil-snipe) From e05f3ec739b715a9aa89c52ed5e535f2153acd97 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 22:45:28 +0200 Subject: [PATCH 2676/4235] Add python & enh-ruby support to hes-mode --- core/core-ui.el | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 3510af655..431e5e404 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -145,7 +145,20 @@ Also see `doom-exit-buffer-hook'.") ;; `highlight-escape-sequences' (def-package! highlight-escape-sequences :after-call after-find-file - :config (hes-mode +1)) + :config + (defconst hes-python-escape-sequence-re + (rx (submatch + (and ?\\ (submatch + (or (repeat 1 3 (in "0-7")) + (and ?x (repeat 2 xdigit)) + (and ?u (repeat 4 xdigit)) + (and ?U (repeat 8 xdigit)) + (and ?N "{" (one-or-more alpha) "}") + (any "\"\'\\abfnrtv"))))))) + (add-to-list 'hes-mode-alist `(python-mode . ,hes-python-escape-sequence-re)) + + (add-to-list 'hes-mode-alist `(enh-ruby-mode . ,hes-ruby-escape-sequence-keywords)) + (hes-mode +1)) ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially ;; in parentheses-drunk languages like Lisp. From 9c11ee9eef0a7caf5892a9a7557160f6f506b5f9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 5 Aug 2018 23:42:27 +0200 Subject: [PATCH 2677/4235] Fix workspace-restricted helm-buffers-list Now SPC b b and SPC b B can both enjoy the power of helm-buffers-list, while the former is restricted to the buffers in the current workspace. --- modules/completion/helm/autoload/helm.el | 7 +++++++ modules/completion/helm/config.el | 2 ++ 2 files changed, 9 insertions(+) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 6e44f4a32..655e635f3 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -18,6 +18,13 @@ #'helm-find-files #'helm-projectile-find-file))) +;;;###autoload +(defun +helm/persp-buffer-list () + "A version of `helm-buffers-list', but with its buffer list restricted to the +current workspace." + (interactive) + (with-persp-buffer-list nil (helm-buffers-list))) + ;; ;; Project search diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index ca385de3b..82d4fbd28 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -45,6 +45,8 @@ be negative.") [remap imenu-anywhere] #'helm-imenu-anywhere [remap imenu] #'helm-semantic-or-imenu [remap noop-show-kill-ring] #'helm-show-kill-ring + [remap persp-switch-to-buffer] #'+helm/persp-buffer-list + [remap switch-to-buffer] #'helm-buffers-list [remap projectile-find-file] #'+helm/projectile-find-file [remap projectile-recentf] #'helm-projectile-recentf [remap projectile-switch-project] #'helm-projectile-switch-project From a01aeb6daf099cdfdc90a9758cdb22b469c24f41 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 00:08:28 +0200 Subject: [PATCH 2678/4235] Make helm the default completion module for Doom It's been a change a long time coming. Ivy's snappiness and simple API was Ivy's selling point (as far as Doom is concerned). It helps that much of helm's vast featureset has been ported over and its API is so much simpler to grok, but its greatest weakness lies in its choice of display mechanism: the minibuffer. Ivy's performance suffers dramatically with large datasets because mutating results in the minibuffer blocks the minibuffer, which also happens to be where we type in our queries. This can make input feel dreadfully sluggish in the best cases, locking up Emacs entirely in the worst. Helm updates a buffer asynchronously, so it suffers none of this (though the overhead of maintaining this buffer is certainly overkill for tiny datasets). And Ivy's simple API, while easier to understand, is significantly less powerful. That it takes so much effort to grok Helm is a huge turn off (and of course, no fault of the dev). Still, there simply is no excuse for power users like myself to not do so anyway. The more I learn about it, the more I wonder why I stuck to ivy for so long (but also reminds me exactly why I did)! --- init.example.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/init.example.el b/init.example.el index ee95b7d7a..c1be24b80 100644 --- a/init.example.el +++ b/init.example.el @@ -18,11 +18,11 @@ :completion (company ; the ultimate code completion backend +auto) ; as-you-type code completion - ;(helm ; the *other* search engine for love and life - ; +fuzzy) ; enable fuzzy search backend for helm + (helm ; the *other* search engine for love and life + +fuzzy) ; enable fuzzy search backend for helm ;ido ; the other *other* search engine... - (ivy ; a search engine for love and life - +fuzzy) ; enable fuzzy search backend for ivy + ;(ivy ; a search engine for love and life + ; +fuzzy) ; enable fuzzy search backend for ivy :ui doom ; what makes DOOM look the way it does From d04efc977437cbb8358e9924c6ba2dc5940bbece Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 00:11:37 +0200 Subject: [PATCH 2679/4235] helm-imenu: don't autojump to symbol at point --- modules/completion/helm/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 82d4fbd28..5ab3f348c 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -69,9 +69,12 @@ be negative.") helm-find-files-doc-header nil ;; Don't override evil-ex's completion helm-mode-handle-completion-in-region nil - ;; default sizes + ;; Default helm window sizes helm-display-buffer-default-width nil - helm-display-buffer-default-height 0.25) + helm-display-buffer-default-height 0.25 + ;; When calling `helm-semantic-or-imenu', don't immediately jump to + ;; symbol at point + helm-imenu-execute-action-at-once-if-one nil) (when (and EMACS26+ (featurep! +childframe)) (setq helm-display-function #'+helm-posframe-display From bd0b7d234173be8823573e42bd2fd36b8fae3fc7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 00:17:48 +0200 Subject: [PATCH 2680/4235] Remove wgrep from completion/helm (unused package) --- modules/completion/helm/config.el | 5 ----- modules/completion/helm/packages.el | 1 - 2 files changed, 6 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 5ab3f348c..872270e49 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -180,11 +180,6 @@ be negative.") (lambda (buf &optional _resume) (pop-to-buffer buf))) -(def-package! wgrep - :commands wgrep-change-to-wgrep-mode - :config (setq wgrep-auto-save-buffer t)) - - ;; ;; Evil integration ;; diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index 13e0452b7..746135f85 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -9,7 +9,6 @@ (package! helm-describe-modes :recipe (:fetcher github :repo "emacs-helm/helm-describe-modes")) (package! helm-projectile) (package! swiper-helm) -(package! wgrep) (when (featurep! +fuzzy) (package! helm-flx)) (when (and EMACS26+ (featurep! +childframe)) From b56404f0ceffa10abbc745f7d2f83cd8c283d35a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 00:21:12 +0200 Subject: [PATCH 2681/4235] Correct docstring for +helm-project-search-engines Re:git-grep/grep fallback --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 872270e49..bb28baad1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -11,7 +11,7 @@ To disable a particular tool, remove it from this list. To prioritize a tool over others, move it to the front of the list. Later duplicates in this list are silently ignored. -If you want to already use git-grep or grep, set this to nil.") +This falls back to git-grep (then grep) if none of these available.") ;; Posframe (requires +childframe) (defvar +helm-posframe-handler From 2aaea3a0d5aded00f488a49013009bbdd22053c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 00:28:26 +0200 Subject: [PATCH 2682/4235] Use helpful for helm-apropos --- modules/completion/helm/config.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index bb28baad1..48542db64 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -125,7 +125,17 @@ be negative.") (let ((bg-color (face-background 'default nil))) `(:background ,bg-color :foreground ,bg-color))) (setq-local cursor-type nil)))) - (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe)) + (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe) + + ;; TODO Find a better way + (defun +helm*use-helpful (orig-fn &rest args) + (cl-letf (((symbol-function #'describe-function) + (symbol-function #'helpful-callable)) + ((symbol-function #'describe-variable) + (symbol-function #'helpful-variable))) + (apply orig-fn args))) + (advice-add #'helm-describe-variable :around #'+helm*use-helpful) + (advice-add #'helm-describe-function :around #'+helm*use-helpful)) (def-package! helm-flx From d01926a7c3d2b2fb87bb14f33490c77a0f0b64a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 11:18:26 +0200 Subject: [PATCH 2683/4235] Fix void-function treemacs--is-visible? error --- modules/ui/treemacs/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index 324fe884b..41807ae0a 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -11,7 +11,7 @@ (interactive) (require 'treemacs) (pcase (treemacs-current-visibility) - (`visible (delete-window (treemacs--is-visible?))) + (`visible (delete-window (treemacs-get-local-window))) (`exists (treemacs-select-window)) (`none (let ((project-root (doom-project-root 'nocache))) From d5363a5a2eb972acbbfc69cdb4f9f1c5069e1368 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 11:56:50 +0200 Subject: [PATCH 2684/4235] Fix recursive helm error in helm-buffers-list --- modules/completion/helm/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 48542db64..77ed800ef 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -216,8 +216,7 @@ be negative.") "S-" #'helm-ff-run-switch-other-window) (:after helm-buffers :map helm-buffer-map - [M-return] #'helm-buffer-switch-other-window - [return] #'display-buffer) + [M-return] #'helm-buffer-switch-other-window) (:after helm-regexp :map helm-moccur-map [M-return] #'helm-moccur-run-goto-line-ow) From fd13df48a5896bec77b04a1fb4a3ddfc72e2fa3c Mon Sep 17 00:00:00 2001 From: Douglas Wilson Date: Tue, 7 Aug 2018 08:31:50 +1200 Subject: [PATCH 2685/4235] Fix helm-execute-persistent-action With (helm +childframe) in doom! section, without this patch execute-persistent-action opens an extra non-child frame. This doesn't play nicely with my tiling window manager. This patch is taken from helm-posframe, and seems to fix it. --- modules/completion/helm/autoload/posframe.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el index c529e6349..efde5b1dc 100644 --- a/modules/completion/helm/autoload/posframe.el +++ b/modules/completion/helm/autoload/posframe.el @@ -19,6 +19,7 @@ bottom, which is easier on the eyes on big displays." "TODO" (setq +helm--posframe-last-window (selected-window)) (require 'posframe) + (setq helm--buffer-in-new-frame-p t) (posframe-show (setq +helm--posframe-buffer buffer) :poshandler +helm-posframe-handler From 4ab1bbbdbaf777c84a93629fd15a4e858f0eff49 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 13:20:46 +0200 Subject: [PATCH 2686/4235] Fix 'simple mode for +treemacs-use-git-mode Due to pattern mismatch, 'simple mode was never activated. --- modules/ui/treemacs/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 7e6f399e0..4deff39f0 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -24,7 +24,7 @@ (pcase (cons (not (null (executable-find "git"))) (not (null (executable-find "python3")))) (`(t . t) 'extended) - (`(t . _) 'simple)) + (`(t) 'simple)) "Type of git integration for `treemacs-git-mode'. There are 2 possible values: 1) simple, which highlights only files based on their git status, and is From eaaf6751d3090a8f3108e47bab37d8876d516c4d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 20:19:25 +0200 Subject: [PATCH 2687/4235] Polish docstring for set-company-backend! --- modules/completion/company/autoload.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 669ddd51f..79c483610 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -19,12 +19,16 @@ If the car of BACKENDS is nil, unset the backends for MODES. Examples: - (set-company-backend! 'js2-mode 'company-tide 'company-yasnippet) + (set-company-backend! 'js2-mode + 'company-tide 'company-yasnippet) + (set-company-backend! 'sh-mode '(company-shell :with company-yasnippet)) - (set-company-backend! 'js2-mode + + (set-company-backend! '(c-mode c++-mode) '(:separate company-irony-c-headers company-irony)) - (set-company-backend! 'sh-mode nil) + + (set-company-backend! 'sh-mode nil) ; unsets backends for sh-mode To have BACKENDS apply to any mode that is a parent of MODES, set MODES to :derived, e.g. From 2a8b3e674ad863c4687843c509c55b2b54f6b856 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 21:10:20 +0200 Subject: [PATCH 2688/4235] ui/modeline: refactor focus/unfocus logic And improves integration with helm --- modules/ui/modeline/config.el | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index d02c5e36c..b37767c36 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -177,22 +177,29 @@ buffers.") (eq (selected-window) +modeline-current-window)) ;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) -(defvar +modeline-remap-face-cookie nil) +(defvar +modeline-remap-face-cookies nil) -(defun +modeline|focus (&rest _) - (when +modeline-remap-face-cookie - (require 'face-remap) - (face-remap-remove-relative +modeline-remap-face-cookie))) -(add-hook 'focus-in-hook #'+modeline|focus) +(defun +modeline|focus-all-windows (&rest _) + (dolist (window +modeline-remap-face-cookies) + (with-selected-window (car window) + (face-remap-remove-relative (cdr window))))) -(defun +modeline|unfocus (&rest _) - (setq +modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) -(add-hook 'focus-out-hook #'+modeline|unfocus) +(defun +modeline|unfocus-all-windows (&rest _) + (setq +modeline-remap-face-cookies + (mapcar (lambda (window) + (with-selected-window window + (cons window + (face-remap-add-relative 'mode-line + 'mode-line-inactive)))) + (window-list)))) -(add-hook 'helm-after-initialize-hook #'+modeline|unfocus) - -(advice-add #'posframe-hide :after #'+modeline|focus) -(advice-add #'posframe-delete :after #'+modeline|focus) +(add-hook 'focus-in-hook #'+modeline|focus-all-windows) +(add-hook 'focus-out-hook #'+modeline|unfocus-all-windows) +(when (featurep! :completion helm) + (add-hook 'helm-before-initialize-hook #'+modeline|unfocus-all-windows) + (add-hook 'helm-cleanup-hook #'+modeline|focus-all-windows) + (advice-add #'posframe-hide :after #'+modeline|focus-all-windows) + (advice-add #'posframe-delete :after #'+modeline|focus-all-windows)) ;; From e266ec9eecded13bec4720089067d6b59844ac21 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 6 Aug 2018 23:03:02 +0200 Subject: [PATCH 2689/4235] Add company-ispell to default text-mode backends --- modules/completion/company/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 79c483610..eacaab324 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -2,7 +2,7 @@ ;;;###autoload (defvar +company-backend-alist - '((text-mode :derived (company-dabbrev company-yasnippet)) + '((text-mode :derived (company-dabbrev company-yasnippet company-ispell)) (prog-mode :derived (:separate company-capf company-yasnippet)) (conf-mode :derived company-capf company-dabbrev-code company-yasnippet)) "An alist matching modes to company backends. The backends for any mode is From c45e5634533fa19530eb8942d7a5325a4d36e471 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 03:14:28 +0200 Subject: [PATCH 2690/4235] Fix advice for `undo-tree-make-history-save-file-name' Inspired by #786: `:filter-return' expects a function to be given. If neither "zstd" or "gzip" are found on the executable path, then it gets given nil instead, which results in sadness when trying to save files. --- core/core-editor.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index f198f89ec..3a42c8609 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -221,13 +221,16 @@ savehist file." `(("." . ,(concat doom-cache-dir "undo-tree-hist/")))) (global-undo-tree-mode +1) - ;; compress undo with xz - (advice-add #'undo-tree-make-history-save-file-name :filter-return - (cond ((executable-find "zstd") (lambda (file) (concat file ".zst"))) - ((executable-find "gzip") (lambda (file) (concat file ".gz"))))) - (advice-add #'undo-tree-load-history :around #'doom*shut-up) + ;; compress undo history with xz + (defun doom*undo-tree-make-history-save-file-name (file) + (cond ((executable-find "zstd") (concat file ".zst")) + ((executable-find "gzip") (concat file ".gz")) + (file))) + (advice-add #'undo-tree-make-history-save-file-name :filter-return + #'doom*undo-tree-make-history-save-file-name) + (defun doom*strip-text-properties-from-undo-history (orig-fn &rest args) (dolist (item buffer-undo-list) (and (consp item) From 37e80c48788f4e01ed582f4442965a37149bef45 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 03:27:24 +0200 Subject: [PATCH 2691/4235] Refactor doom*strip-text-properties-from-undo-history :around -> :before advice --- core/core-editor.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 3a42c8609..3100044f1 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -231,13 +231,12 @@ savehist file." (advice-add #'undo-tree-make-history-save-file-name :filter-return #'doom*undo-tree-make-history-save-file-name) - (defun doom*strip-text-properties-from-undo-history (orig-fn &rest args) + (defun doom*strip-text-properties-from-undo-history (&rest args) (dolist (item buffer-undo-list) (and (consp item) (stringp (car item)) - (setcar item (substring-no-properties (car item))))) - (apply orig-fn args)) - (advice-add 'undo-list-transfer-to-tree :around #'doom*strip-text-properties-from-undo-history) + (setcar item (substring-no-properties (car item)))))) + (advice-add 'undo-list-transfer-to-tree :before #'doom*strip-text-properties-from-undo-history) (defun doom*compress-undo-tree-history (orig-fn &rest args) (cl-letf* ((jka-compr-verbose nil) From 85e837e06a96490756f802c62d0dca500064e8cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 12:57:21 +0200 Subject: [PATCH 2692/4235] Fix wrong-type-arg: integerp by posframe Due to destructive advice. Fixes #787 --- modules/completion/helm/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 77ed800ef..7d5203224 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -81,7 +81,9 @@ be negative.") helm-display-buffer-default-height 0.42 helm-echo-input-in-header-line t) ;; Fix "Specified window is not displaying the current buffer" error - (advice-add #'posframe--get-font-height :override #'ignore)) + (defun +helm*fix-get-font-height (orig-fn position) + (ignore-errors (funcall orig-fn position))) + (advice-add #'posframe--get-font-height :around #'+helm*fix-get-font-height)) (let ((fuzzy (featurep! +fuzzy))) (setq helm-mode-fuzzy-match fuzzy From 3d363d4cb12b3103247b30742ee15af95d389b8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 14:42:58 +0200 Subject: [PATCH 2693/4235] completion/helm: refactor posframe support (again) --- modules/completion/helm/autoload/posframe.el | 37 ++++++-------------- modules/completion/helm/config.el | 15 ++++---- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el index efde5b1dc..daf0405f0 100644 --- a/modules/completion/helm/autoload/posframe.el +++ b/modules/completion/helm/autoload/posframe.el @@ -17,36 +17,18 @@ bottom, which is easier on the eyes on big displays." ;;;###autoload (defun +helm-posframe-display (buffer &optional _resume) "TODO" - (setq +helm--posframe-last-window (selected-window)) (require 'posframe) - (setq helm--buffer-in-new-frame-p t) + (setq +helm--posframe-last-window (selected-window) + helm--buffer-in-new-frame-p t) (posframe-show (setq +helm--posframe-buffer buffer) + :position (point) :poshandler +helm-posframe-handler - :internal-border-width +helm-posframe-border-width - :respect-header-line t - :respect-mode-line t - :width - (cond ((functionp helm-display-buffer-default-width) - (funcall helm-display-buffer-default-width)) - ((integerp helm-display-buffer-default-width) - helm-display-buffer-default-width) - ((floatp helm-display-buffer-default-width) - (truncate (* (frame-width) helm-display-buffer-default-width))) - ((min (max (truncate (* (frame-width) 0.8)) - 100) - 140))) - :height - (cond ((functionp helm-display-buffer-default-height) - (funcall helm-display-buffer-default-height)) - ((integerp helm-display-buffer-default-height) - helm-display-buffer-default-height) - ((floatp helm-display-buffer-default-height) - (truncate (* (frame-height) helm-display-buffer-default-height))) - ((truncate (* (frame-height) 0.4))))) - (when +helm-posframe-font-scale + :override-parameters +helm-posframe-parameters) + (unless (or (null +helm-posframe-text-scale) + (= +helm-posframe-text-scale 0)) (with-current-buffer buffer - (text-scale-set +helm-posframe-font-scale)))) + (text-scale-set +helm-posframe-text-scale)))) ;;;###autoload (defun +helm|posframe-cleanup () @@ -54,7 +36,10 @@ bottom, which is easier on the eyes on big displays." ;; Ensure the underlying window is switched to, to ensure that frame is given ;; proper focus; this gives the modeline a chance to refresh. (select-window +helm--posframe-last-window) - (setq +helm--posframe-last-frame nil) ;; (posframe-delete +helm--posframe-buffer)) + +;;;###autoload +(defun +helm*fix-get-font-height (orig-fn position) + (ignore-errors (funcall orig-fn position))) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 7d5203224..6dcecc793 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -20,13 +20,17 @@ This falls back to git-grep (then grep) if none of these available.") a cons cell representing the X and Y coordinates. See `posframe-poshandler-frame-center' as a reference.") -(defvar +helm-posframe-font-scale 1 +(defvar +helm-posframe-text-scale 1 "The text-scale to use in the helm childframe. Set to nil for no scaling. Can be negative.") -(defvar +helm-posframe-border-width 8 - "The text-scale to use in the helm childframe. Set to nil for no scaling. Can -be negative.") +(defvar +helm-posframe-parameters + '((internal-border-width . 8) + (min-width . 80) + (min-height . 16) + (width . 0.5) + (height . 0.55)) + "TODO") ;; @@ -78,11 +82,8 @@ be negative.") (when (and EMACS26+ (featurep! +childframe)) (setq helm-display-function #'+helm-posframe-display - helm-display-buffer-default-height 0.42 helm-echo-input-in-header-line t) ;; Fix "Specified window is not displaying the current buffer" error - (defun +helm*fix-get-font-height (orig-fn position) - (ignore-errors (funcall orig-fn position))) (advice-add #'posframe--get-font-height :around #'+helm*fix-get-font-height)) (let ((fuzzy (featurep! +fuzzy))) From 685f282b5358d8aac39a058aee0852036b978927 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 14:43:27 +0200 Subject: [PATCH 2694/4235] completion/ivy: nudge posframe up some It was too far down on smaller displays --- modules/completion/ivy/autoload/posframe.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/posframe.el b/modules/completion/ivy/autoload/posframe.el index 43f034abc..0b31f9a6b 100644 --- a/modules/completion/ivy/autoload/posframe.el +++ b/modules/completion/ivy/autoload/posframe.el @@ -12,5 +12,5 @@ (let ((parent-frame (plist-get info :parent-frame)) (pos (posframe-poshandler-frame-center info))) (cons (car pos) - (truncate (/ (frame-pixel-height parent-frame) 1.6))))) + (truncate (/ (frame-pixel-height parent-frame) 2))))) From b349dd3473a47ec9fad401a726df9418b45c9153 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 14:44:10 +0200 Subject: [PATCH 2695/4235] ui/popup: respect org-src-window-setup --- modules/ui/popup/+hacks.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 113cd354c..212da8d61 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -232,10 +232,9 @@ the command buffer." (defun +popup*org-src-pop-to-buffer (orig-fn buffer context) "Hand off the src-block window to the popup system by using `display-buffer' instead of switch-to-buffer-*." - (if +popup-mode - (if (eq org-src-window-setup 'switch-invisibly) ; for internal calls - (set-buffer buffer) - (display-buffer buffer)) + (if (and (eq org-src-window-setup 'other-window) + +popup-mode) + (pop-to-buffer buffer) (funcall orig-fn buffer context))) (advice-add #'org-src-switch-to-buffer :around #'+popup*org-src-pop-to-buffer) (setq org-src-window-setup 'other-window) From 7e5b8012b6f149369ddecc1365a60dffcadfcb81 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 21:07:08 +0200 Subject: [PATCH 2696/4235] lang/cc: set company backends on irony-mode Rather than c/c++/objc modes. --- 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 602855658..19a7057a3 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -150,8 +150,7 @@ compilation database is present in the project.") (def-package! company-irony :when (featurep! :completion company) :init - (set-company-backend! - '(c-mode c++-mode objc-mode) + (set-company-backend! 'irony-mode '(:separate company-irony-c-headers company-irony)) :config (require 'company-irony-c-headers))) From c385ed77084c7f9eb2c3aa0335d4d4a1e6c0a921 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 21:31:34 +0200 Subject: [PATCH 2697/4235] Set no default company-backends No magic. Let the user decide exactly what backends to use for any given buffer. --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 2d454a357..ccbdf17e0 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -12,7 +12,7 @@ company-require-match 'never company-global-modes '(not comint-mode erc-mode message-mode help-mode gud-mode eshell-mode) - company-backends '(company-dabbrev) + company-backends nil company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend) From 78e455946591f97b01dd7cffbe0888a21ee78851 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 7 Aug 2018 22:51:44 +0200 Subject: [PATCH 2698/4235] Move mode-line-misc-info to front of :main rhs This ensures any extraneous spacing it adds to the mode-line isn't visible, without compromising plugins' ability to add information to your modeline. --- modules/ui/modeline/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index b37767c36..243d038b6 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -566,9 +566,9 @@ icons." +modeline-buffer-state +modeline-buffer-id " %2l:%c %p ") - `(+modeline-encoding + `(mode-line-misc-info + +modeline-encoding +modeline-major-mode " " - mode-line-misc-info (vc-mode (" " +modeline-vcs " ")) mode-line-process +modeline-flycheck)) From b17bbf272955b3af06c5ad9a4fc1435474808f31 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 00:11:20 +0200 Subject: [PATCH 2699/4235] lang/cc: refactor company-(glsl|cmake) configs --- modules/lang/cc/config.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 19a7057a3..ea1623f8b 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -161,12 +161,10 @@ compilation database is present in the project.") ;; ;; `cmake-mode' -(after! cmake-mode - (set-company-backend! 'cmake-mode '(company-cmake company-yasnippet))) - (def-package! company-cmake :when (featurep! :completion company) - :after cmake-mode) + :after cmake-mode + :config (set-company-backend! 'cmake-mode 'company-cmake)) ;; `demangle-mode' @@ -178,7 +176,7 @@ compilation database is present in the project.") (def-package! company-glsl :when (featurep! :completion company) :after glsl-mode - :config (set-company-backend! 'glsl-mode '(company-glsl))) + :config (set-company-backend! 'glsl-mode 'company-glsl)) ;; From 9d74ede2860b7a7c8e6c73d6fb0b428684221c56 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 18:01:58 +0200 Subject: [PATCH 2700/4235] lang/org: remove second org-src popup rule And rearrange ipython rules --- modules/lang/org/+babel.el | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 0d4ec79ca..4c57a9b94 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -71,15 +71,12 @@ string). Stops at the first function to return non-nil.") (add-hook '+org-babel-load-functions #'+org|babel-load-ipython) :config (set-popup-rules! - '(("^\\*Org Src" - :side right :size 100 :height 0.6 :slot -1 - :quit nil :select t) + '(("\\*ob-ipython.*" + :slot 2 :side right :size 100 :height 0.2 + :select nil :quit nil :transient nil) ("^\\*Python" :slot 0 :side right :size 100 :select nil :quit nil :ttl nil) - ("\\*ob-ipython.*" - :slot 2 :side right :size 100 :height 0.2 - :select nil :quit nil :transient nil) ("\\*Python:.*" :slot 0 :side right :size 100 :select nil :quit nil :transient nil))) From 2e98e1ae50a914ad8dc92cedee099312ea00e916 Mon Sep 17 00:00:00 2001 From: Aidan Gilmore Date: Wed, 8 Aug 2018 12:06:07 -0400 Subject: [PATCH 2701/4235] Configurable sync backends for NotMuch --- modules/app/notmuch/autoload.el | 10 +++++++++- modules/app/notmuch/config.el | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/app/notmuch/autoload.el b/modules/app/notmuch/autoload.el index afccecd52..22d6d2104 100644 --- a/modules/app/notmuch/autoload.el +++ b/modules/app/notmuch/autoload.el @@ -35,7 +35,15 @@ (interactive) (start-process-shell-command "notmuch update" nil - "cd ~/.mail/account.gmail && /usr/local/bin/gmi push && /usr/local/bin/gmi pull && /usr/local/bin/notmuch new && /usr/local/bin/afew -a -t")) + (pcase +notmuch-sync-backend + (`gmi + (concat "cd " +notmuch-mail-folder " && gmi push && gmi pull && notmuch new && afew -a -t")) + (`mbsync + "mbsync -a && notmuch new && afew -a -t") + (`mbsync-xdg + "mbsync -c \"$XDG_CONFIG_HOME\"/isync/mbsyncrc -a && notmuch new && afew -a -t") + (`offlineimap + "offlineimap && notmuch new && afew -a -t")))) ;;;###autoload (defun +notmuch/search-delete () diff --git a/modules/app/notmuch/config.el b/modules/app/notmuch/config.el index f415211e7..c9e6f47a8 100644 --- a/modules/app/notmuch/config.el +++ b/modules/app/notmuch/config.el @@ -2,6 +2,12 @@ ;; FIXME This module is a WIP! +(defvar +notmuch-sync-backend 'gmi + "Which backend to use. Can be either gmi, mbsync, offlineimap or nil (manual).") + +(defvar +notmuch-mail-folder "~/.mail/account.gmail" + "Where your email folder is located (for use with gmailieer).") + (after! notmuch (set-company-backend! 'notmuch-message-mode '(notmuch-company (company-ispell :with company-yasnippet))) From e30ca73dc43e1a38866319a8839ccc7a842a1ac5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 20:44:03 +0200 Subject: [PATCH 2702/4235] Autoload +org-capture-window-params --- modules/lang/org/autoload/org-capture.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 01552b3e0..29dfd9d9c 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -5,6 +5,7 @@ ;; --- External frame --------------------- +;;;###autoload (defvar +org-capture-window-params `((name . "org-capture") (width . 70) From 60f6418db230bf7246343a04382d4bf573d8bb14 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 21:38:58 +0200 Subject: [PATCH 2703/4235] lang/org: Rename +org-capture-window-params These are frame parameters; it is incorrect to call them window parameters. --- modules/lang/org/autoload/org-capture.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 29dfd9d9c..d6c51c890 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -6,7 +6,7 @@ ;; --- External frame --------------------- ;;;###autoload -(defvar +org-capture-window-params +(defvar +org-capture-frame-parameters `((name . "org-capture") (width . 70) (height . 25) @@ -43,7 +43,7 @@ you're done. This can be called from an external shell script." (frame (if (+org-capture-frame-p) (selected-frame) (let (before-make-frame-hook after-make-frame-functions) - (make-frame +org-capture-window-params))))) + (make-frame +org-capture-frame-parameters))))) (with-selected-frame frame (require 'org-capture) (condition-case ex From 916210d5a8bb6d20d0e11a22558ad9efe884c2cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 21:41:11 +0200 Subject: [PATCH 2704/4235] feature/lookup: silence cl-destructuring-bind errors In likely case where (bounds-of-thing-at-point 'symbol) returns nil, cl-destructuring-bind would throw a wrong-number-of-args error we don't care about. --- modules/feature/lookup/autoload/lookup.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index e65dcc018..d74457fe6 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -164,12 +164,13 @@ evil-mode is active." ((and (featurep 'evil) evil-mode - (cl-destructuring-bind (beg . end) - (bounds-of-thing-at-point 'symbol) - (evil-goto-definition) - (let ((pt (point))) - (not (and (>= pt beg) - (< pt end))))))) + (ignore-errors + (cl-destructuring-bind (beg . end) + (bounds-of-thing-at-point 'symbol) + (evil-goto-definition) + (let ((pt (point))) + (not (and (>= pt beg) + (< pt end)))))))) ((error "Couldn't find '%s'" identifier)))) From f88a97177c92ae7b07a00f26cb37e76998e8a1cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 21:43:50 +0200 Subject: [PATCH 2705/4235] Rename doom-ensure-core-directories Give it a more descriptive name --- core/core.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 7585e11b2..a21c335dd 100644 --- a/core/core.el +++ b/core/core.el @@ -276,7 +276,7 @@ Meant to be used with `run-hook-wrapped'." (noninteractive (error "Aborting")) ((kill-emacs)))) -(defun doom-ensure-core-directories () +(defun doom-ensure-core-directories-exist () "Make sure all Doom's essential local directories (in and including `doom-local-dir') exist." (dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir)) @@ -317,6 +317,9 @@ If RETURN-P, return the message as a string instead of displaying it." (defun doom-initialize (&optional force-p force-load-core-p) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). +Loads Doom core files if in an interactive session or FORCE-LOAD-CORE-P is +non-nil. + The bootstrap process involves making sure 1) the essential directories exist, 2) the core packages are installed, 3) `doom-autoload-file' and `doom-package-autoload-file' exist and have been loaded, and 4) Doom's core @@ -348,7 +351,7 @@ to least)." ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. (when (or force-p (not (doom-initialize-autoloads doom-autoload-file))) - (doom-ensure-core-directories) + (doom-ensure-core-directories-exist) (doom-ensure-same-emacs-version-p) (require 'core-packages) From 6eafdd7c62d4d5d891deca0027ad168a45d5ddb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 21:45:07 +0200 Subject: [PATCH 2706/4235] Refactor module load process doom! no longer loads modules, it only sets doom-modules (incrementally). Instead, modules are loaded by doom-initialize-modules (which makes more sense). --- core/core-modules.el | 102 ++++++++++++++++++++----------------------- core/core-tests.el | 3 +- core/core.el | 8 +--- 3 files changed, 51 insertions(+), 62 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index f955bed42..26068a2cc 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -38,12 +38,22 @@ session of Dooming. Will noop if used more than once, unless FORCE-P is non-nil." (when (or force-p (not doom-init-modules-p)) (setq doom-init-modules-p t) - (when doom-private-dir - (condition-case e - (load (expand-file-name "init" doom-private-dir) - 'noerror 'nomessage) - ((debug doom-error) (signal (car e) (cdr e))) - ((debug error) (signal 'doom-private-error (list "init.el" e))))))) + + (load! "init" doom-private-dir t) + (maphash (lambda (key plist) + (let ((doom--current-module key) + (doom--current-flags (plist-get plist :flags))) + (load! "init" (plist-get plist :path) t))) + doom-modules) + (run-hook-wrapped 'doom-init-hook #'doom-try-run-hook) + (unless noninteractive + (maphash (lambda (key plist) + (let ((doom--current-module key) + (doom--current-flags (plist-get plist :flags))) + (load! "config" (plist-get plist :path) t))) + doom-modules) + (load! "config" doom-private-dir t) + (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)))) ;; @@ -159,14 +169,13 @@ non-nil, return paths of possible modules, activated or otherwise." "Minimally initialize `doom-modules' (a hash table) and return it." (or (unless refresh-p doom-modules) (let ((noninteractive t) + (doom-modules + (make-hash-table :test #'equal + :size 20 + :rehash-threshold 1.0)) doom-init-modules-p) (message "Initializing modules") - (doom-initialize-modules t) - (unless doom-modules - (setq doom-modules - (make-hash-table :test #'equal - :size 20 - :rehash-threshold 1.0))) + (load! "init" doom-private-dir t) doom-modules))) @@ -260,50 +269,33 @@ The overall load order of Doom is as follows: Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." - (let ((doom-modules - (make-hash-table :test #'equal - :size (if modules (length modules) 100) - :rehash-threshold 1.0)) - category init-forms config-forms) + (unless doom-modules + (setq doom-modules + (make-hash-table :test #'equal + :size (if modules (length modules) 100) + :rehash-threshold 1.0))) + (let (category m) (while modules - (let ((m (pop modules))) - (cond ((keywordp m) (setq category m)) - ((not category) (error "No module category specified for %s" m)) - ((catch 'doom-modules - (let* ((module (if (listp m) (car m) m)) - (flags (if (listp m) (cdr m)))) - (when-let* ((new (assoc (list category module) doom-obsolete-modules))) - (let ((newkeys (cdr new))) - (if (null newkeys) - (message "Warning: the %s module is deprecated" key) - (message "Warning: the %s module is deprecated. Use %s instead." - (list category module) newkeys) - (push category modules) - (dolist (key newkeys) - (setq modules (append key modules))) - (throw 'doom-modules t)))) - (let ((path (doom-module-locate-path category module))) - (if (not path) - (message "Warning: couldn't find the %s %s module" category module) - (let ((key (cons category module))) - (doom-module-set category module :flags flags :path path) - (push `(let ((doom--current-module ',key) - (doom--current-flags ',flags)) - (load! "init" ,path t)) - init-forms) - (push `(let ((doom--current-module ',key) - (doom--current-flags ',flags)) - (load! "config" ,path t)) - config-forms)))))))))) - `(let (file-name-handler-alist) - (setq doom-modules ',doom-modules) - ,@(nreverse init-forms) - (run-hook-wrapped 'doom-init-hook #'doom-try-run-hook) - (unless noninteractive - (let ((doom--stage 'config)) - ,@(nreverse config-forms) - (when doom-private-dir - (load! "config" doom-private-dir t))))))) + (setq m (pop modules)) + (cond ((keywordp m) (setq category m)) + ((not category) (error "No module category specified for %s" m)) + ((catch 'doom-modules + (let* ((module (if (listp m) (car m) m)) + (flags (if (listp m) (cdr m)))) + (when-let* ((new (assoc (list category module) doom-obsolete-modules))) + (let ((newkeys (cdr new))) + (if (null newkeys) + (message "Warning: the %s module is deprecated" key) + (message "Warning: the %s module is deprecated. Use %s instead." + (list category module) newkeys) + (push category modules) + (dolist (key newkeys) + (setq modules (append key modules))) + (throw 'doom-modules t)))) + (if-let* ((path (doom-module-locate-path category module))) + (doom-module-set category module :flags flags :path path) + (message "Warning: couldn't find the %s %s module" category module))))))) + `(setq doom-modules ',doom-modules))) (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) diff --git a/core/core-tests.el b/core/core-tests.el index daf9b0f42..157e3223c 100644 --- a/core/core-tests.el +++ b/core/core-tests.el @@ -9,7 +9,8 @@ If neither is available, run all tests in all enabled modules." ;; Core libraries aren't fully loaded in a noninteractive session, so we ;; reload it with `noninteractive' set to nil to force them to. (quiet! (doom-reload-autoloads)) - (doom-initialize t t) + (doom-initialize 'force t) + (doom-initialize-modules 'force) (let ((target-paths ;; Convert targets into a list of string paths, pointing to the root ;; directory of modules diff --git a/core/core.el b/core/core.el index a21c335dd..2a834a7e5 100644 --- a/core/core.el +++ b/core/core.el @@ -295,10 +295,6 @@ If RETURN-P, return the message as a string instead of displaying it." (or doom-init-time (setq doom-init-time (float-time (time-subtract (current-time) before-init-time)))))) -(defun doom|post-init () - "Run `doom-post-init-hook'. That's all." - (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)) - (defun doom|run-all-startup-hooks () "Run all startup Emacs hooks. Meant to be executed after starting Emacs with -q or -Q, for example: @@ -372,8 +368,8 @@ to least)." (require 'core-os) (when (or force-load-core-p (not noninteractive)) - (add-hook! 'emacs-startup-hook - #'(doom|post-init doom|display-benchmark)) + (add-hook 'emacs-startup-hook #'doom|display-benchmark) + (require 'core-ui) (require 'core-editor) (require 'core-projects) From 541ce81b9124e5d57e260d41f56042bf0e647ffd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 23:22:37 +0200 Subject: [PATCH 2707/4235] Fix #791: replace global-command-log-mode global-command-log-mode isn't autoloaded, but clm/toggle-command-log-buffer is, and if command-log-mode-is-global is set, it is equivalent to global-command-log-mode. --- core/core-editor.el | 4 +++- modules/config/default/+bindings.el | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 3100044f1..88ae20724 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -254,7 +254,9 @@ savehist file." ;; `command-log-mode' (setq command-log-mode-auto-show t - command-log-mode-open-log-turns-on-mode t) + command-log-mode-open-log-turns-on-mode t + command-log-mode-is-global t) + (def-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index c4ce5581e..ec3e95aac 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -635,7 +635,7 @@ :desc "Describe key" :n "k" #'describe-key :desc "Find documentation" :n "K" #'+lookup/documentation :desc "Find library" :n "l" #'find-library - :desc "Command log" :n "L" #'global-command-log-mode + :desc "Command log" :n "L" #'clm/toggle-command-log-buffer :desc "View *Messages*" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode :desc "Toggle profiler" :n "p" #'doom/toggle-profiler From 808c1356df5f1eeb08839c9afd632c950276acbd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 23:34:11 +0200 Subject: [PATCH 2708/4235] Don't sort company candidates by default --- modules/completion/company/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index ccbdf17e0..d682a5a39 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -15,8 +15,7 @@ company-backends nil company-frontends '(company-pseudo-tooltip-frontend - company-echo-metadata-frontend) - company-transformers '(company-sort-by-occurrence)) + company-echo-metadata-frontend)) :config (add-hook 'company-mode-hook #'+company|init-backends) (global-company-mode +1)) From 63cc8b430646f2a5f9d6515f4aa72c8cfa79d78b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 8 Aug 2018 23:34:41 +0200 Subject: [PATCH 2709/4235] Fix flycheck staying enabled after doom/reload --- modules/lang/emacs-lisp/config.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 67af58f9d..f62761396 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -57,7 +57,7 @@ defined by Emacs, not Doom or packages). This can help make typos stand out.") ;; fontification rainbow-delimiters-mode highlight-quoted-mode ;; initialization - +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) + +emacs-lisp|init-imenu)) ;; Special fontification for doom (font-lock-add-keywords @@ -98,11 +98,14 @@ defined by Emacs, not Doom or packages). This can help make typos stand out.") (defun +emacs-lisp|disable-flycheck-maybe () "Disable flycheck-mode if in emacs.d." - (when (or (not buffer-file-name) - (cl-loop for dir in (list doom-emacs-dir doom-private-dir) - if (file-in-directory-p buffer-file-name dir) - return t)) - (flycheck-mode -1)))) + (when (and flycheck-mode + (eq major-mode 'emacs-lisp-mode) + (or (not buffer-file-name) + (cl-loop for dir in (list doom-emacs-dir doom-private-dir) + if (file-in-directory-p buffer-file-name dir) + return t))) + (flycheck-mode -1))) + (add-hook 'flycheck-mode-hook #'+emacs-lisp|disable-flycheck-maybe)) ;; From 56fcad4970fca60c43ddf794777b3a2a88543a78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Aug 2018 00:40:26 +0200 Subject: [PATCH 2710/4235] lang/php: use internal phpctags only Other versions of phpctags may cause errors. --- modules/lang/php/config.el | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 6609f877d..216835eaa 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -73,15 +73,7 @@ :init (add-to-list '+php--company-backends 'company-ac-php-backend nil #'eq) (add-hook 'php-mode-hook #'+php|init-ac-php-core-eldoc) - (setq ac-php-tags-path (concat doom-cache-dir "ac-php/")) - ;; loaded by `company-php' - (after! ac-php-core - (when (equal ac-php-ctags-executable - (concat ac-php-root-directory "phpctags")) - ;; prioritize phpctags in PATH - (setq ac-php-ctags-executable - (or (executable-find "phpctags") - ac-php-ctags-executable))))) + (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) ;; From 3131bda98c45098d6a41880a26478ee4e6bf396f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Aug 2018 01:02:47 +0200 Subject: [PATCH 2711/4235] lang/php: fix interpolation in unquoted lambda --- modules/lang/php/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 216835eaa..1ce136079 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -58,10 +58,10 @@ (unless (file-exists-p (concat php-extras-eldoc-functions-file ".el")) (message "Generating PHP eldoc files...") (require 'async) - (async-start (lambda () - ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") - (require 'php-extras-gen-eldoc) - (php-extras-generate-eldoc-1 t)) + (async-start `(lambda () + ,(async-inject-variables "\\`\\(load-path\\|php-extras-eldoc-functions-file\\)$") + (require 'php-extras-gen-eldoc) + (php-extras-generate-eldoc-1 t)) (lambda (_) (load (concat php-extras-eldoc-functions-file ".el")) (message "PHP eldoc updated!"))))) From 01dcc248cfec0f507012832afaf57d1033ff911a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Aug 2018 12:56:15 +0200 Subject: [PATCH 2712/4235] Improve posframe/modeline focus fix switch-to-buffer is more reliable than select-window --- modules/completion/helm/autoload/posframe.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el index daf0405f0..e274ad47a 100644 --- a/modules/completion/helm/autoload/posframe.el +++ b/modules/completion/helm/autoload/posframe.el @@ -13,13 +13,11 @@ bottom, which is easier on the eyes on big displays." 2))))) (defvar +helm--posframe-buffer nil) -(defvar +helm--posframe-last-window nil) ;;;###autoload (defun +helm-posframe-display (buffer &optional _resume) "TODO" (require 'posframe) - (setq +helm--posframe-last-window (selected-window) - helm--buffer-in-new-frame-p t) + (setq helm--buffer-in-new-frame-p t) (posframe-show (setq +helm--posframe-buffer buffer) :position (point) @@ -33,9 +31,9 @@ bottom, which is easier on the eyes on big displays." ;;;###autoload (defun +helm|posframe-cleanup () "TODO" - ;; Ensure the underlying window is switched to, to ensure that frame is given - ;; proper focus; this gives the modeline a chance to refresh. - (select-window +helm--posframe-last-window) + ;; Ensure focus is properly returned to the underlying window, by forcing a + ;; chance in buffer/window focus. This gives the modeline a chance to refresh. + (switch-to-buffer +helm--posframe-buffer t) ;; (posframe-delete +helm--posframe-buffer)) From 68dc510a1c1e4407327ae1a1c8d648e232a5221d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Aug 2018 12:58:26 +0200 Subject: [PATCH 2713/4235] Refactor +modeline-file-path Remove unused letvars and face management. --- modules/ui/modeline/config.el | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 243d038b6..ddc4c4fb9 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -237,16 +237,14 @@ buffers.") (directory-name-p buffer-file-name)) (propertize (abbreviate-file-name (or buffer-file-name default-directory)) 'face 'doom-modeline-buffer-path)) - ((let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (true-filename (file-truename buffer-file-name)) + ((let* ((true-filename (file-truename buffer-file-name)) (relative-dirs (file-relative-name (file-name-directory true-filename) - (concat root "../"))) - (relative-faces (or modified-faces 'doom-modeline-buffer-path)) - (file-faces (or modified-faces 'doom-modeline-buffer-file))) + (concat root "../")))) (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) + (concat (propertize relative-dirs + 'face 'doom-modeline-buffer-path) (propertize (file-name-nondirectory true-filename) - 'face (if file-faces `(:inherit ,file-faces))))))))) + 'face 'doom-modeline-buffer-file))))))) ;; TODO Add shrink-path alternatives From 87c8f6e18efd9b21d90eae004b97ba4eed2f4307 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 9 Aug 2018 13:00:11 +0200 Subject: [PATCH 2714/4235] Temporary fix for counsel-projectile arrayp error This should be reversed once the issue is fixed upstream. Addresses #792 --- modules/completion/ivy/autoload/ivy.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index da1c8a4de..e556da596 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -224,10 +224,14 @@ The point of this is to avoid Emacs locking up indexing massive file trees." #'counsel-find-file) ((doom-project-p 'nocache) - (let ((files (projectile-current-project-files))) - (if (<= (length files) ivy-sort-max-size) - #'counsel-projectile-find-file - #'projectile-find-file))) + #'projectile-find-file) + + ;; FIXME When counsel-projectile-find-file is fixed upstream + ;; ((doom-project-p 'nocache) + ;; (let ((files (projectile-current-project-files))) + ;; (if (<= (length files) ivy-sort-max-size) + ;; #'counsel-projectile-find-file + ;; #'projectile-find-file))) (#'counsel-file-jump)))) From ff4d5be1fa4a2306ccac2ac439f35712e2a2e139 Mon Sep 17 00:00:00 2001 From: Vikash Kathirvel Date: Thu, 9 Aug 2018 19:22:08 +0530 Subject: [PATCH 2715/4235] Fixed ess main load point --- modules/lang/ess/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index f3ee2b564..4815fbefc 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -1,6 +1,6 @@ ;;; lang/ess/config.el -*- lexical-binding: t; -*- -(def-package! ess-site +(def-package! ess-mode :commands (R stata julia SAS) :mode (("\\.sp\\'" . S-mode) ("/R/.*\\.q\\'" . R-mode) From 53d54608d3e994e93682524db288f26ac080c710 Mon Sep 17 00:00:00 2001 From: Vikash Kathirvel Date: Thu, 9 Aug 2018 22:33:44 +0530 Subject: [PATCH 2716/4235] Removed broken package ess-smart-equals --- modules/lang/ess/config.el | 7 +------ modules/lang/ess/packages.el | 1 - 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 4815fbefc..e701ad80d 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -30,6 +30,7 @@ ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) :init + (setq ess-smart-S-assign-key nil) (unless (featurep! :lang julia) (add-to-list 'auto-mode-alist '("\\.jl\\'" . ess-julia-mode))) :config @@ -38,7 +39,6 @@ ess-expression-offset 2 ess-nuke-trailing-whitespace-p t ess-default-style 'DEFAULT) - (ess-toggle-underscore t) (set-repl-handler! 'ess-mode #'+ess/r-repl) (set-lookup-handlers! 'ess-mode :documentation #'ess-display-help-on-object) (define-key! ess-doc-map @@ -78,8 +78,3 @@ :n "cm" #'ess-noweb-mark-chunk :n "cp" #'ess-noweb-previous-chunk :n "cn" #'ess-noweb-next-chunk)) - - -;; `ess-smart-equals-mode' -(add-hook! '(ess-mode-hook inferior-ess-hook) - #'ess-smart-equals-mode) diff --git a/modules/lang/ess/packages.el b/modules/lang/ess/packages.el index 066bca909..dc9e8a9f8 100644 --- a/modules/lang/ess/packages.el +++ b/modules/lang/ess/packages.el @@ -2,5 +2,4 @@ ;;; lang/ess/packages.el (package! ess) -(package! ess-smart-equals) (package! ess-R-data-view) From 74e905cb6845f6bda2a5c76ef484c0cd361296ba Mon Sep 17 00:00:00 2001 From: hackeryarn Date: Thu, 9 Aug 2018 21:05:29 -0500 Subject: [PATCH 2717/4235] added refactor shortcut to clojure --- modules/lang/clojure/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 5f33f3f96..cba5ec627 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -5,7 +5,11 @@ (def-package! clj-refactor - :after clojure-mode) + :after clojure-mode + :config + (map! :map clj-refactor-map + :localleader + :desc "Refactor hydra" :n "." #'hydra-cljr-help-menu/body)) (def-package! cider ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider From e33cb446aa9803577df7ba66c60e76da8e5b3f56 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 12:34:17 +0200 Subject: [PATCH 2718/4235] Refactor dashboard banner display & centering --- modules/ui/doom-dashboard/config.el | 56 ++++++++++++++--------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 4c0399d14..89da7799f 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -12,13 +12,15 @@ dashboard. These functions take no arguments and the dashboard buffer is current while they run.") -;; (defvar +doom-dashboard-banner-file "e.png" -;; "The path to the image file to be used in on the dashboard. The path is -;; relative to modules/ui/doom-dashboard/banners/. If nil, always use the ASCII -;; banner.") +(defvar +doom-dashboard-banner-file "default.png" + "The path to the image file to be used in on the dashboard. The path is +relative to `+doom-dashboard-banner-dir'. If nil, always use the ASCII banner.") -;; (defvar +doom-dashboard-banner-dir (concat (DIR!) "banners/") -;; "Where to look for `+doom-dashboard-banner-file'.") +(defvar +doom-dashboard-banner-dir (concat (DIR!) "banners/") + "Where to look for `+doom-dashboard-banner-file'.") + +(defvar +doom-dashboard-banner-padding '(4 . 4) + "Number of newlines to pad the banner with, above and below, respectively.") (defvar +doom-dashboard-inhibit-refresh nil "If non-nil, the doom buffer won't be refreshed.") @@ -88,7 +90,6 @@ PLIST can have the following properties: ;; (defvar +doom-dashboard--last-cwd nil) (defvar +doom-dashboard--width 80) -(defvar +doom-dashboard--hoffset 2) (defvar +doom-dashboard--old-fringe-indicator fringe-indicator-alist) (defvar +doom-dashboard--pwd-alist ()) @@ -235,11 +236,10 @@ whose dimensions may not be fully initialized by the time this is run." (point))) (insert (make-string (max 0 (- (/ (window-height (get-buffer-window)) 2) - (truncate (/ (+ (count-lines (point-min) (point-max)) - +doom-dashboard--hoffset) - 2)))) - ?\n) - "\n"))))))) + (round (/ (+ (count-lines (point-min) (point-max)) + (car +doom-dashboard-banner-padding)) + 2)))) + ?\n)))))))) (defun +doom-dashboard|detect-project (&rest _) "Check for a `last-project-root' parameter in the perspective, and set the @@ -300,7 +300,6 @@ controlled by `+doom-dashboard-pwd-policy'." (unless (eq major-mode '+doom-dashboard-mode) (+doom-dashboard-mode)) (erase-buffer) - (insert "\n") (run-hooks '+doom-dashboard-functions))) (+doom-dashboard|resize) (+doom-dashboard|detect-project) @@ -365,22 +364,21 @@ controlled by `+doom-dashboard-pwd-policy'." "==' _-' E M A C S \\/ `==" "\\ _-' `-_ /" " `'' ``'")) - ;; TODO Add Doom logo - ;; (when (and +doom-dashboard-banner-file (display-graphic-p)) - ;; (let* ((image (create-image (expand-file-name +doom-dashboard-banner-file - ;; +doom-dashboard-banner-dir) - ;; 'png nil)) - ;; (size (image-size image)) - ;; (margin (+ 1 (/ (- +doom-dashboard--width (car size)) 2)))) - ;; (setq +doom-dashboard--hoffset (- (cdr size) 2)) - ;; (add-text-properties - ;; point (point) `(display ,image rear-nonsticky (display))) - ;; (when (> margin 0) - ;; (save-excursion - ;; (goto-char point) - ;; (insert (make-string (truncate margin) ? ))))) - ;; (insert "\n\n\n\n")) - )) + (when (and (stringp +doom-dashboard-banner-file) + (display-graphic-p) + (file-exists-p! +doom-dashboard-banner-file +doom-dashboard-banner-dir)) + (let* ((image (create-image (expand-file-name +doom-dashboard-banner-file + +doom-dashboard-banner-dir) + 'png nil)) + (size (image-size image nil)) + (margin (+ 1 (/ (- +doom-dashboard--width (car size)) 2)))) + (add-text-properties + point (point) `(display ,image rear-nonsticky (display))) + (when (> margin 0) + (save-excursion + (goto-char point) + (insert (make-string (truncate margin) ? ))))) + (insert (make-string (or (cdr +doom-dashboard-banner-padding) 0) ?\n))))) (defun doom-dashboard-widget-loaded () (insert From b100fe332b99250ad2529a819cf6079344045c35 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 14:13:48 +0200 Subject: [PATCH 2719/4235] Slightly larger default +modeline-height (23) --- modules/ui/modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ddc4c4fb9..9f2141b94 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -16,7 +16,7 @@ (defvar +modeline-width 3 "How wide the mode-line bar should be (only respected in GUI emacs).") -(defvar +modeline-height 21 +(defvar +modeline-height 23 "How tall the mode-line should be (only respected in GUI emacs).") (defvar +modeline-bar-at-end nil From 519330fcb1fce3efe485c6670eaeaaeb9d1c7761 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 18:52:20 +0200 Subject: [PATCH 2720/4235] Fix wrong-type-argument: treemacs-workspace error Caused by changes upstream. --- modules/ui/treemacs/autoload.el | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index 41807ae0a..ebad12cf6 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -3,20 +3,23 @@ ;;;###autoload (defun +treemacs/toggle () "Initialize or toggle treemacs. + * If the treemacs window is visible hide it. * If a treemacs buffer exists, but is not visible show it. * If no treemacs buffer exists for the current frame create and show it. -* If the workspace is empty additionally ask for the root path of the first - project to add." +* If the workspace is empty, add the current project to it automatically." (interactive) (require 'treemacs) - (pcase (treemacs-current-visibility) - (`visible (delete-window (treemacs-get-local-window))) - (`exists (treemacs-select-window)) - (`none - (let ((project-root (doom-project-root 'nocache))) - (when project-root - (unless (treemacs--find-project-for-path project-root) - (treemacs-add-project-at (treemacs--canonical-path project-root) - (doom-project-name 'nocache)))) - (treemacs--init project-root))))) + (let ((origin-buffer (current-buffer))) + (cl-letf (((symbol-function 'treemacs-workspace->is-empty?) + (symbol-function 'ignore))) + (treemacs--init)) + ;; + (treemacs-do-add-project-to-workspace + (treemacs--canonical-path (doom-project-root 'nocache)) + (doom-project-name 'nocache)) + ;; + (setq treemacs--ready-to-follow t) + (when (or treemacs-follow-after-init treemacs-follow-mode) + (with-current-buffer origin-buffer + (treemacs--follow))))) From d6f89aaafd2429721ee26a317b90d699c6e03deb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 19:13:31 +0200 Subject: [PATCH 2721/4235] Make doom/copy-backtrace copy the whole backtrace --- core/autoload/debug.el | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 47f571ca3..9f61ca392 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -124,16 +124,13 @@ branch and commit." ;;;###autoload (defun doom/copy-backtrace () - "Copy the first 1000 bytes from the *Backtrace* window into your clipboard for -easy pasting into a bug report or discord." + "Copy the contents of the *Backtrace* window into your clipboard for easy +pasting into a bug report or discord." (interactive) (if-let* ((buf (get-buffer "*Backtrace*"))) (with-current-buffer buf (kill-new - (string-trim - (buffer-substring-no-properties - (point-min) - (min (point-max) 1000))))) + (string-trim (buffer-string)))) (user-error "No backtrace buffer detected"))) From 3e7c85244b94f97a144bfd54661f2864b1b27ced Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 19:26:56 +0200 Subject: [PATCH 2722/4235] Improve modeline refocusing fixes By affecting buffers instead of windows --- modules/ui/modeline/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 9f2141b94..ce3c1c641 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -180,15 +180,15 @@ buffers.") (defvar +modeline-remap-face-cookies nil) (defun +modeline|focus-all-windows (&rest _) - (dolist (window +modeline-remap-face-cookies) - (with-selected-window (car window) - (face-remap-remove-relative (cdr window))))) + (dolist (buf +modeline-remap-face-cookies) + (with-current-buffer (car buf) + (face-remap-remove-relative (cdr buf))))) (defun +modeline|unfocus-all-windows (&rest _) (setq +modeline-remap-face-cookies (mapcar (lambda (window) - (with-selected-window window - (cons window + (with-current-buffer (window-buffer window) + (cons (current-buffer) (face-remap-add-relative 'mode-line 'mode-line-inactive)))) (window-list)))) From a24e4f51cd8d097d66ad8cb61493b871aeef8479 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 19:30:08 +0200 Subject: [PATCH 2723/4235] ui/modeline: refocus after closing any posframe --- modules/ui/modeline/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ce3c1c641..d4fd16ee8 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -195,11 +195,11 @@ buffers.") (add-hook 'focus-in-hook #'+modeline|focus-all-windows) (add-hook 'focus-out-hook #'+modeline|unfocus-all-windows) +(advice-add #'posframe-hide :after #'+modeline|focus-all-windows) +(advice-add #'posframe-delete :after #'+modeline|focus-all-windows) (when (featurep! :completion helm) (add-hook 'helm-before-initialize-hook #'+modeline|unfocus-all-windows) - (add-hook 'helm-cleanup-hook #'+modeline|focus-all-windows) - (advice-add #'posframe-hide :after #'+modeline|focus-all-windows) - (advice-add #'posframe-delete :after #'+modeline|focus-all-windows)) + (add-hook 'helm-cleanup-hook #'+modeline|focus-all-windows)) ;; From 7a216692e8e879059cf03b779ae2db3bcea007c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 19:30:51 +0200 Subject: [PATCH 2724/4235] Don't modify helm-echo-input-in-header-line This variable isn't reliable; some sources change it, making it difficult to see our input. --- modules/completion/helm/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 6dcecc793..27bd78ac0 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -81,8 +81,7 @@ be negative.") helm-imenu-execute-action-at-once-if-one nil) (when (and EMACS26+ (featurep! +childframe)) - (setq helm-display-function #'+helm-posframe-display - helm-echo-input-in-header-line t) + (setq helm-display-function #'+helm-posframe-display) ;; Fix "Specified window is not displaying the current buffer" error (advice-add #'posframe--get-font-height :around #'+helm*fix-get-font-height)) From 76b4af99cc4d031c6769da858d6b88db7ce1091e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 19:39:28 +0200 Subject: [PATCH 2725/4235] lang/emacs-lisp: rewrite extra fontification Now fontifies defined variables and functions, rather than from a hardcoded list. --- modules/lang/emacs-lisp/+symbols.el | 2432 --------------------------- modules/lang/emacs-lisp/config.el | 53 +- 2 files changed, 34 insertions(+), 2451 deletions(-) delete mode 100644 modules/lang/emacs-lisp/+symbols.el diff --git a/modules/lang/emacs-lisp/+symbols.el b/modules/lang/emacs-lisp/+symbols.el deleted file mode 100644 index 28b688393..000000000 --- a/modules/lang/emacs-lisp/+symbols.el +++ /dev/null @@ -1,2432 +0,0 @@ -;;; lang/emacs-lisp/+symbols.el -*- lexical-binding: t; -*- - -;; shamelessly borrowed these lists from `xah-elisp-mode': -;; TODO derive these dynamically - -(defvar +emacs-lisp-function-list - '("mouse-on-link-p" - "macrop" - "run-hooks" - "run-hook-with-args" - "run-hook-with-args-until-failure" - "run-hook-with-args-until-success" - "define-fringe-bitmap" - "destroy-fringe-bitmap" - "set-fringe-bitmap-face" - "file-name-directory" - "file-name-nondirectory" - "file-name-sans-versions" - "file-name-extension" - "file-name-sans-extension" - "file-name-base" - "buffer-file-name" - "get-file-buffer" - "find-buffer-visiting" - "make-xwidget" - "xwidgetp" - "xwidget-plist" - "set-xwidget-plist" - "xwidget-buffer" - "get-buffer-xwidgets" - "xwidget-webkit-goto-uri" - "xwidget-webkit-execute-script" - "xwidget-webkit-execute-script-rv" - "xwidget-webkit-get-title" - "xwidget-resize" - "xwidget-size-request" - "xwidget-info" - "set-xwidget-query-on-exit-flag" - "xwidget-query-on-exit-flag" - "split-window" - "window-total-height" - "window-total-width" - "window-total-size" - "window-pixel-height" - "window-pixel-width" - "window-full-height-p" - "window-full-width-p" - "window-body-height" - "window-body-width" - "window-body-size" - "window-mode-line-height" - "window-header-line-height" - "window-max-chars-per-line" - "window-min-size" - "window-edges" - "window-body-edges" - "window-at" - "coordinates-in-window-p" - "window-pixel-edges" - "window-body-pixel-edges" - "window-absolute-pixel-edges" - "window-absolute-body-pixel-edges" - "window-absolute-pixel-position" - "buffer-modified-p" - "set-buffer-modified-p" - "restore-buffer-modified-p" - "buffer-modified-tick" - "buffer-chars-modified-tick" - "decode-time" - "encode-time" - "marker-position" - "marker-buffer" - "create-fontset-from-fontset-spec" - "set-fontset-font" - "char-displayable-p" - "custom-add-frequent-value" - "custom-reevaluate-setting" - "custom-variable-p" - "custom-theme-set-variables" - "custom-theme-set-faces" - "custom-theme-p" - "add-to-list" - "add-to-ordered-list" - "sin" - "cos" - "tan" - "asin" - "acos" - "atan" - "exp" - "log" - "expt" - "sqrt" - "get-char-code-property" - "char-code-property-description" - "put-char-code-property" - "prepare-change-group" - "activate-change-group" - "accept-change-group" - "cancel-change-group" - "active-minibuffer-window" - "minibuffer-window" - "set-minibuffer-window" - "window-minibuffer-p" - "minibuffer-window-active-p" - "define-category" - "category-docstring" - "get-unused-category" - "category-table" - "category-table-p" - "standard-category-table" - "copy-category-table" - "set-category-table" - "make-category-table" - "make-category-set" - "char-category-set" - "category-set-mnemonics" - "modify-category-entry" - "memory-limit" - "memory-use-counts" - "memory-info" - "smie-rule-bolp" - "smie-rule-hanging-p" - "smie-rule-next-p" - "smie-rule-prev-p" - "smie-rule-parent-p" - "smie-rule-sibling-p" - "smie-rule-parent" - "smie-rule-separator" - "lookup-key" - "local-key-binding" - "global-key-binding" - "minor-mode-key-binding" - "user-ptrp" - "gui-get-selection" - "point" - "point-min" - "point-max" - "buffer-end" - "buffer-size" - "foo" - "add-to-history" - "car" - "cdr" - "car-safe" - "cdr-safe" - "nth" - "nthcdr" - "last" - "safe-length" - "caar" - "cadr" - "cdar" - "cddr" - "butlast" - "nbutlast" - "macroexpand" - "macroexpand-all" - "string-to-syntax" - "syntax-after" - "syntax-class" - "make-finalizer" - "unsafep" - "set-buffer-multibyte" - "string-as-unibyte" - "string-as-multibyte" - "tabulated-list-init-header" - "tabulated-list-print" - "ffloor" - "fceiling" - "ftruncate" - "fround" - "assoc" - "rassoc" - "assq" - "alist-get" - "rassq" - "assoc-default" - "copy-alist" - "assq-delete-all" - "rassq-delete-all" - "make-serial-process" - "serial-process-configure" - "make-temp-file" - "make-temp-name" - "current-time-zone" - "key-description" - "single-key-description" - "text-char-description" - "vectorp" - "vector" - "make-vector" - "vconcat" - "create-file-buffer" - "after-find-file" - "buffer-live-p" - "transpose-regions" - "number-to-string" - "string-to-number" - "char-to-string" - "string-to-char" - "makunbound" - "boundp" - "consp" - "atom" - "listp" - "nlistp" - "null" - "buffer-base-buffer" - "charsetp" - "charset-priority-list" - "set-charset-priority" - "char-charset" - "charset-plist" - "put-charset-property" - "get-charset-property" - "decode-char" - "encode-char" - "map-charset-chars" - "x-list-fonts" - "x-family-fonts" - "momentary-string-display" - "frame-char-height" - "frame-char-width" - "abbrev-symbol" - "abbrev-expansion" - "abbrev-insert" - "setcdr" - "fill-context-prefix" - "position-bytes" - "byte-to-position" - "bufferpos-to-filepos" - "filepos-to-bufferpos" - "multibyte-string-p" - "string-bytes" - "unibyte-string" - "split-window-sensibly" - "same-window-p" - "get-text-property" - "get-char-property" - "get-pos-property" - "get-char-property-and-overlay" - "text-properties-at" - "color-defined-p" - "defined-colors" - "color-supported-p" - "color-gray-p" - "color-values" - "scroll-bar-event-ratio" - "scroll-bar-scale" - "get-register" - "set-register" - "register-read-with-preview" - "button-start" - "button-end" - "button-get" - "button-put" - "button-activate" - "button-label" - "button-type" - "button-has-type-p" - "button-at" - "button-type-put" - "button-type-get" - "button-type-subtype-p" - "buffer-list" - "other-buffer" - "last-buffer" - "current-frame-configuration" - "set-frame-configuration" - "funcall" - "apply" - "apply-partially" - "identity" - "ignore" - "file-name-as-directory" - "directory-name-p" - "directory-file-name" - "abbreviate-file-name" - "delete-and-extract-region" - "map-y-or-n-p" - "message" - "message-or-box" - "message-box" - "display-message-or-buffer" - "current-message" - "ding" - "beep" - "x-popup-dialog" - "network-interface-list" - "network-interface-info" - "format-network-address" - "floatp" - "integerp" - "numberp" - "natnump" - "zerop" - "imagemagick-types" - "completion-table-dynamic" - "completion-table-with-cache" - "mouse-position" - "set-mouse-position" - "mouse-pixel-position" - "set-mouse-pixel-position" - "mouse-absolute-pixel-position" - "set-mouse-absolute-pixel-position" - "frame-pointer-visible-p" - "tool-bar-add-item" - "tool-bar-add-item-from-menu" - "tool-bar-local-item-from-menu" - "send-string-to-terminal" - "insert-and-inherit" - "insert-before-markers-and-inherit" - "completing-read" - "minibuffer-prompt" - "minibuffer-prompt-end" - "minibuffer-prompt-width" - "minibuffer-contents" - "minibuffer-contents-no-properties" - "windowp" - "window-live-p" - "window-valid-p" - "selected-window" - "selected-window-group" - "window-resizable" - "window-resize" - "adjust-window-trailing-edge" - "edebug-trace" - "frame-live-p" - "window-frame" - "window-list" - "frame-root-window" - "window-parent" - "window-top-child" - "window-left-child" - "window-child" - "window-combined-p" - "window-next-sibling" - "window-prev-sibling" - "frame-first-window" - "window-in-direction" - "window-tree" - "tty-top-frame" - "font-family-list" - "bitmap-spec-p" - "region-beginning" - "region-end" - "use-region-p" - "default-value" - "default-boundp" - "set-default" - "put-text-property" - "add-text-properties" - "remove-text-properties" - "remove-list-of-text-properties" - "set-text-properties" - "add-face-text-property" - "propertize" - "not" - "error" - "signal" - "user-error" - "set-marker" - "move-marker" - "frame-current-scroll-bars" - "frame-scroll-bar-width" - "frame-scroll-bar-height" - "set-window-scroll-bars" - "window-scroll-bars" - "window-current-scroll-bars" - "window-scroll-bar-width" - "window-scroll-bar-height" - "window-hscroll" - "set-window-hscroll" - "create-image" - "find-image" - "image-load-path-for-library" - "make-byte-code" - "field-beginning" - "field-end" - "field-string" - "field-string-no-properties" - "delete-field" - "constrain-to-field" - "insert-for-yank" - "insert-buffer-substring-as-yank" - "get-internal-run-time" - "eq" - "equal" - "equal-including-properties" - "define-package" - "print" - "princ" - "prin1" - "terpri" - "write-char" - "pp" - "set-process-sentinel" - "process-sentinel" - "waiting-for-user-input-p" - "make-char-table" - "char-table-p" - "char-table-subtype" - "char-table-parent" - "set-char-table-parent" - "char-table-extra-slot" - "set-char-table-extra-slot" - "char-table-range" - "set-char-table-range" - "map-char-table" - "string-match" - "string-match-p" - "looking-at" - "looking-back" - "looking-at-p" - "make-syntax-table" - "copy-syntax-table" - "char-syntax" - "set-syntax-table" - "syntax-table" - "face-remap-add-relative" - "face-remap-remove-relative" - "face-remap-set-base" - "face-remap-reset-base" - "keymap-parent" - "set-keymap-parent" - "make-composed-keymap" - "define-key" - "substitute-key-definition" - "suppress-keymap" - "plist-get" - "plist-put" - "lax-plist-get" - "lax-plist-put" - "plist-member" - "libxml-parse-html-region" - "shr-insert-document" - "libxml-parse-xml-region" - "recenter-window-group" - "called-interactively-p" - "keywordp" - "compare-buffer-substrings" - "notifications-notify" - "notifications-close-notification" - "notifications-get-capabilities" - "notifications-get-server-information" - "sequencep" - "length" - "elt" - "copy-sequence" - "reverse" - "nreverse" - "sort" - "seq-elt" - "seq-length" - "seqp" - "seq-drop" - "seq-take" - "seq-take-while" - "seq-drop-while" - "seq-do" - "seq-map" - "seq-mapn" - "seq-filter" - "seq-remove" - "seq-reduce" - "seq-some" - "seq-find" - "seq-every-p" - "seq-empty-p" - "seq-count" - "seq-sort" - "seq-contains" - "seq-position" - "seq-uniq" - "seq-subseq" - "seq-concatenate" - "seq-mapcat" - "seq-partition" - "seq-intersection" - "seq-difference" - "seq-group-by" - "seq-into" - "seq-min" - "seq-max" - "stringp" - "string-or-null-p" - "char-or-string-p" - "ewoc-create" - "ewoc-buffer" - "ewoc-get-hf" - "ewoc-set-hf" - "ewoc-enter-first" - "ewoc-enter-last" - "ewoc-enter-before" - "ewoc-enter-after" - "ewoc-prev" - "ewoc-next" - "ewoc-nth" - "ewoc-data" - "ewoc-set-data" - "ewoc-locate" - "ewoc-location" - "ewoc-goto-prev" - "ewoc-goto-next" - "ewoc-goto-node" - "ewoc-refresh" - "ewoc-invalidate" - "ewoc-delete" - "ewoc-filter" - "ewoc-collect" - "ewoc-map" - "indirect-function" - "set-network-process-option" - "face-spec-set" - "substitute-command-keys" - "make-progress-reporter" - "progress-reporter-update" - "progress-reporter-force-update" - "progress-reporter-done" - "current-buffer" - "set-buffer" - "minibufferp" - "minibuffer-selected-window" - "minibuffer-message" - "this-command-keys" - "this-command-keys-vector" - "clear-this-command-keys" - "markerp" - "integer-or-marker-p" - "number-or-marker-p" - "make-translation-table" - "make-translation-table-from-vector" - "make-translation-table-from-alist" - "sit-for" - "sleep-for" - "read-from-minibuffer" - "read-string" - "read-regexp" - "read-no-blanks-input" - "frame-visible-p" - "make-process" - "make-pipe-process" - "start-process" - "start-file-process" - "start-process-shell-command" - "start-file-process-shell-command" - "find-file-name-handler" - "file-local-copy" - "file-remote-p" - "unhandled-file-name-directory" - "match-data" - "set-match-data" - "overlay-get" - "overlay-put" - "overlay-properties" - "file-name-absolute-p" - "file-relative-name" - "hack-dir-local-variables" - "hack-dir-local-variables-non-file-buffer" - "dir-locals-set-class-variables" - "dir-locals-set-directory-class" - "make-button" - "insert-button" - "make-text-button" - "insert-text-button" - "insert-image" - "insert-sliced-image" - "put-image" - "remove-images" - "image-size" - "insert-file-contents" - "insert-file-contents-literally" - "format" - "format-message" - "run-mode-hooks" - "cl-call-next-method" - "cl-next-method-p" - "char-equal" - "string-equal" - "string-collate-equalp" - "string-prefix-p" - "string-suffix-p" - "string-lessp" - "string-greaterp" - "string-collate-lessp" - "compare-strings" - "assoc-string" - "display-popup-menus-p" - "display-graphic-p" - "display-mouse-p" - "display-color-p" - "display-grayscale-p" - "display-supports-face-attributes-p" - "display-selections-p" - "display-images-p" - "display-screens" - "display-pixel-height" - "display-pixel-width" - "display-mm-height" - "display-mm-width" - "display-backing-store" - "display-save-under" - "display-planes" - "display-visual-class" - "display-color-cells" - "x-server-version" - "x-server-vendor" - "define-prefix-command" - "insert" - "insert-before-markers" - "insert-buffer-substring" - "insert-buffer-substring-no-properties" - "replace-match" - "match-substitute-replacement" - "set-input-mode" - "current-input-mode" - "tty-color-define" - "tty-color-clear" - "tty-color-alist" - "tty-color-approximate" - "tty-color-translate" - "call-process" - "process-file" - "call-process-region" - "call-process-shell-command" - "process-file-shell-command" - "shell-command-to-string" - "process-lines" - "current-kill" - "kill-new" - "kill-append" - "symbol-function" - "fboundp" - "fmakunbound" - "fset" - "hack-local-variables" - "safe-local-variable-p" - "risky-local-variable-p" - "keymapp" - "select-safe-coding-system" - "read-coding-system" - "read-non-nil-coding-system" - "current-time-string" - "current-time" - "float-time" - "seconds-to-time" - "set-default-file-modes" - "default-file-modes" - "read-file-modes" - "file-modes-symbolic-to-number" - "set-file-times" - "set-file-extended-attributes" - "set-file-selinux-context" - "set-file-acl" - "current-left-margin" - "current-fill-column" - "delete-to-left-margin" - "indent-to-left-margin" - "sort-subr" - "backup-file-name-p" - "make-backup-file-name" - "find-backup-file-name" - "file-newest-backup" - "locate-user-emacs-file" - "convert-standard-filename" - "add-hook" - "remove-hook" - "error-message-string" - "window-point" - "set-window-point" - "quit-restore-window" - "x-parse-geometry" - "process-list" - "get-process" - "process-command" - "process-contact" - "process-id" - "process-name" - "process-status" - "process-live-p" - "process-type" - "process-exit-status" - "process-tty-name" - "process-coding-system" - "set-process-coding-system" - "process-get" - "process-put" - "process-plist" - "set-process-plist" - "keyboard-translate" - "execute-kbd-macro" - "date-to-time" - "format-time-string" - "format-seconds" - "make-ring" - "ring-p" - "ring-size" - "ring-length" - "ring-elements" - "ring-copy" - "ring-empty-p" - "ring-ref" - "ring-insert" - "ring-remove" - "ring-insert-at-beginning" - "set-window-combination-limit" - "window-combination-limit" - "regexp-quote" - "regexp-opt" - "regexp-opt-depth" - "regexp-opt-charset" - "backup-buffer" - "event-modifiers" - "event-basic-type" - "mouse-movement-p" - "event-convert-list" - "read-key-sequence" - "read-key-sequence-vector" - "file-truename" - "file-chase-links" - "file-equal-p" - "file-in-directory-p" - "eval" - "frame-parameter" - "frame-parameters" - "modify-frame-parameters" - "set-frame-parameter" - "modify-all-frames-parameters" - "process-datagram-address" - "set-process-datagram-address" - "current-window-configuration" - "set-window-configuration" - "window-configuration-p" - "compare-window-configurations" - "window-configuration-frame" - "window-state-get" - "window-state-put" - "charset-after" - "find-charset-region" - "find-charset-string" - "abbrev-table-put" - "abbrev-table-get" - "coding-system-list" - "coding-system-p" - "check-coding-system" - "coding-system-eol-type" - "coding-system-change-eol-conversion" - "coding-system-change-text-conversion" - "find-coding-systems-region" - "find-coding-systems-string" - "find-coding-systems-for-charsets" - "check-coding-systems-region" - "detect-coding-region" - "detect-coding-string" - "coding-system-charset-list" - "iter-next" - "iter-close" - "locate-file" - "executable-find" - "symbol-name" - "make-symbol" - "intern" - "intern-soft" - "mapatoms" - "unintern" - "current-column" - "special-variable-p" - "accessible-keymaps" - "map-keymap" - "where-is-internal" - "window-display-table" - "set-window-display-table" - "redisplay" - "force-window-update" - "window-start" - "window-group-start" - "window-end" - "window-group-end" - "set-window-start" - "set-window-group-start" - "pos-visible-in-window-p" - "pos-visible-in-window-group-p" - "window-line-height" - "fringe-bitmaps-at-pos" - "buffer-name" - "get-buffer" - "generate-new-buffer-name" - "jit-lock-register" - "jit-lock-unregister" - "file-notify-add-watch" - "file-notify-rm-watch" - "file-notify-valid-p" - "local-variable-p" - "local-variable-if-set-p" - "buffer-local-value" - "buffer-local-variables" - "kill-all-local-variables" - "eventp" - "skip-chars-forward" - "skip-chars-backward" - "window-parameter" - "window-parameters" - "set-window-parameter" - "recent-keys" - "terminal-parameters" - "terminal-parameter" - "set-terminal-parameter" - "memq" - "delq" - "remq" - "memql" - "member" - "delete" - "remove" - "member-ignore-case" - "delete-dups" - "parse-partial-sexp" - "get-buffer-create" - "generate-new-buffer" - "current-global-map" - "current-local-map" - "current-minor-mode-maps" - "use-global-map" - "use-local-map" - "set-transient-map" - "accept-process-output" - "skip-syntax-forward" - "skip-syntax-backward" - "backward-prefix-chars" - "vertical-motion" - "count-screen-lines" - "move-to-window-group-line" - "compute-motion" - "file-exists-p" - "file-readable-p" - "file-executable-p" - "file-writable-p" - "file-accessible-directory-p" - "access-file" - "file-ownership-preserved-p" - "file-modes" - "open-network-stream" - "undo-boundary" - "undo-auto-amalgamate" - "primitive-undo" - "keyboard-coding-system" - "terminal-coding-system" - "symbolp" - "booleanp" - "functionp" - "subrp" - "byte-code-function-p" - "subr-arity" - "char-width" - "string-width" - "truncate-string-to-width" - "window-text-pixel-size" - "documentation-property" - "documentation" - "face-documentation" - "Snarf-documentation" - "match-string" - "match-string-no-properties" - "match-beginning" - "match-end" - "coding-system-priority-list" - "set-coding-system-priority" - "x-popup-menu" - "-" - "mod" - "symbol-file" - "command-line" - "get-load-suffixes" "define-button-type" - "custom-set-variables" - "custom-set-faces" - "interactive-form" - "encode-coding-string" - "decode-coding-string" - "decode-coding-inserted-region" - "make-hash-table" - "secure-hash" - "frame-geometry" - "frame-edges" - "buffer-narrowed-p" - "locale-info" - "keymap-prompt" - "set-window-margins" - "window-margins" - "try-completion" - "all-completions" - "test-completion" - "completion-boundaries" - "add-to-invisibility-spec" - "remove-from-invisibility-spec" - "invisible-p" - "char-after" - "char-before" - "following-char" - "preceding-char" - "bobp" - "eobp" - "bolp" - "eolp" - "coding-system-get" - "coding-system-aliases" - "defvaralias" - "make-obsolete-variable" - "indirect-variable" - "read-file-name" - "read-directory-name" - "read-shell-command" - "select-window" - "frame-selected-window" - "set-frame-selected-window" - "window-use-time" - "make-glyph-code" - "glyph-char" - "glyph-face" - "command-remapping" - "help-buffer" - "help-setup-xref" - "downcase" - "upcase" - "capitalize" - "upcase-initials" - "redraw-frame" - "characterp" - "max-char" - "get-byte" - "float" - "truncate" - "floor" - "ceiling" - "round" - "window-vscroll" - "set-window-vscroll" - "selected-frame" - "select-frame-set-input-focus" - "redirect-frame-focus" - "image-multi-frame-p" - "image-current-frame" - "image-show-frame" - "image-animate" - "image-animate-timer" - "replace-regexp-in-string" - "perform-replace" - "current-idle-time" - "subst-char-in-region" - "derived-mode-p" - "dom-node" - "face-attribute" - "face-attribute-relative-p" - "face-all-attributes" - "merge-face-attribute" - "set-face-attribute" - "set-face-bold" - "set-face-italic" - "set-face-underline" - "set-face-inverse-video" - "face-font" - "face-foreground" - "face-background" - "face-stipple" - "face-bold-p" - "face-italic-p" - "face-underline-p" - "face-inverse-video-p" - "file-name-all-completions" - "file-name-completion" - "make-string" - "string" - "substring" - "substring-no-properties" - "concat" - "split-string" - "window-buffer" - "set-window-buffer" - "get-buffer-window" - "get-buffer-window-list" - "process-query-on-exit-flag" - "set-process-query-on-exit-flag" - "process-send-string" - "process-send-region" - "process-send-eof" - "process-running-child-p" - "frame-position" - "set-frame-position" - "frame-pixel-height" - "frame-pixel-width" - "frame-text-height" - "frame-text-width" - "frame-height" - "frame-width" - "set-frame-size" - "set-frame-height" - "set-frame-width" - "recursion-depth" - "buffer-substring" - "buffer-substring-no-properties" - "buffer-string" - "filter-buffer-substring" - "current-word" - "thing-at-point" - "bufferp" - "random" - "processp" - "case-table-p" - "set-standard-case-table" - "standard-case-table" - "current-case-table" - "set-case-table" - "set-case-syntax-pair" - "set-case-syntax-delims" - "set-case-syntax" - "window-prev-buffers" - "set-window-prev-buffers" - "window-next-buffers" - "set-window-next-buffers" - "read-passwd" - "bindat-unpack" - "bindat-get-field" - "bindat-length" - "bindat-pack" - "bindat-ip-to-string" - "frame-list" - "visible-frame-list" - "next-frame" - "previous-frame" - "face-list" - "face-id" - "face-equal" - "face-differs-from-default-p" - "file-symlink-p" - "file-directory-p" - "file-regular-p" - "find-file-noselect" - "event-click-count" - "fontp" - "font-at" - "font-spec" - "font-put" - "find-font" - "list-fonts" - "font-get" - "font-face-attributes" - "font-xlfd-name" - "font-info" - "query-font" - "default-font-width" - "default-font-height" - "window-font-width" - "window-font-height" - "kbd" - "terminal-name" - "terminal-list" - "get-device-terminal" - "delete-terminal" - "x-display-list" - "x-open-connection" - "x-close-connection" - "display-monitor-attributes-list" - "frame-monitor-attributes" - "read-event" - "read-char" - "read-char-exclusive" - "read-key" - "read-char-choice" - "backtrace-debug" - "backtrace-frame" - "directory-files" - "directory-files-recursively" - "directory-files-and-attributes" - "file-expand-wildcards" - "insert-directory" - "scan-lists" - "scan-sexps" - "forward-comment" - "tq-create" - "tq-enqueue" - "tq-close" - "set-window-fringes" - "window-fringes" - "commandp" - "call-interactively" - "funcall-interactively" - "command-execute" - "make-bool-vector" - "bool-vector" - "bool-vector-p" - "bool-vector-exclusive-or" - "bool-vector-union" - "bool-vector-intersection" - "bool-vector-set-difference" - "bool-vector-not" - "bool-vector-subsetp" - "bool-vector-count-consecutive" - "bool-vector-count-population" - "current-active-maps" - "key-binding" - "byte-compile" - "batch-byte-compile" - "tooltip-mode" - "tooltip-event-buffer" - "gap-position" - "gap-size" - "fetch-bytecode" - "define-key-after" - "set-process-filter" - "process-filter" - "read-minibuffer" - "eval-minibuffer" - "edit-and-eval-command" - "verify-visited-file-modtime" - "clear-visited-file-modtime" - "visited-file-modtime" - "set-visited-file-modtime" - "ask-user-about-supersession-threat" - "string-to-multibyte" - "string-to-unibyte" - "byte-to-string" - "multibyte-char-to-unibyte" - "unibyte-char-to-multibyte" - "syntax-ppss" - "syntax-ppss-flush-cache" - "smie-config-local" - "read" - "read-from-string" - "set-binary-mode" - "event-start" - "event-end" - "posnp" - "posn-window" - "posn-area" - "posn-point" - "posn-x-y" - "posn-col-row" - "posn-actual-col-row" - "posn-string" - "posn-image" - "posn-object" - "posn-object-x-y" - "posn-object-width-height" - "posn-timestamp" - "posn-at-point" - "posn-at-x-y" - "image-flush" - "clear-image-cache" - "sentence-end" - "system-name" - "parse-colon-path" - "load-average" - "emacs-pid" - "y-or-n-p" - "y-or-n-p-with-timeout" - "yes-or-no-p" - "hash-table-p" - "copy-hash-table" - "hash-table-count" - "hash-table-test" - "hash-table-weakness" - "hash-table-rehash-size" - "hash-table-rehash-threshold" - "hash-table-size" - "custom-initialize-delay" - "dump-emacs" - "define-error" - "set-auto-mode" - "set-buffer-major-mode" - "next-window" - "previous-window" - "walk-windows" - "one-window-p" - "get-lru-window" - "get-mru-window" - "get-largest-window" - "get-window-with-predicate" - "list-system-processes" - "process-attributes" - "define-abbrev" - "find-auto-coding" - "set-auto-coding" - "find-operation-coding-system" - "listify-key-sequence" - "input-pending-p" - "discard-input" - "messages-buffer" - "set" - "auto-save-file-name-p" - "make-auto-save-file-name" - "recent-auto-save-p" - "set-buffer-auto-saved" - "delete-auto-save-file-if-necessary" - "rename-auto-save-file" - "abbrev-put" - "abbrev-get" - "forward-word-strictly" - "backward-word-strictly" - "advice-add" - "advice-remove" - "advice-member-p" - "advice-mapc" - "store-substring" - "clear-string" - "user-login-name" - "user-real-login-name" - "user-full-name" - "user-real-uid" - "user-uid" - "group-gid" - "group-real-gid" - "system-users" - "system-groups" - "play-sound" - "overlays-at" - "overlays-in" - "next-overlay-change" - "previous-overlay-change" - "next-property-change" - "previous-property-change" - "next-single-property-change" - "previous-single-property-change" - "next-char-property-change" - "previous-char-property-change" - "next-single-char-property-change" - "previous-single-char-property-change" - "text-property-any" - "text-property-not-all" - "symbol-value" - "make-abbrev-table" - "abbrev-table-p" - "clear-abbrev-table" - "copy-abbrev-table" - "define-abbrev-table" - "insert-abbrev-table-description" - "advice-function-member-p" - "advice-function-mapc" - "advice-eval-interactive-spec" - "display-buffer-same-window" - "display-buffer-reuse-window" - "display-buffer-pop-up-frame" - "display-buffer-use-some-frame" - "display-buffer-pop-up-window" - "display-buffer-below-selected" - "display-buffer-in-previous-window" - "display-buffer-at-bottom" - "display-buffer-use-some-window" - "display-buffer-no-window" - "isnan" - "frexp" - "ldexp" - "copysign" - "logb" - "file-newer-than-file-p" - "file-attributes" - "file-nlinks" - "barf-if-buffer-read-only" - "file-acl" - "file-selinux-context" - "file-extended-attributes" - "zlib-available-p" - "zlib-decompress-region" - "window-preserve-size" - "window-preserved-size" - "load" - "arrayp" - "aref" - "aset" - "fillarray" - "delete-process" - "image-mask-p" - "interrupt-process" - "kill-process" - "quit-process" - "stop-process" - "continue-process" - "minibuffer-depth" - "gethash" - "puthash" - "remhash" - "clrhash" - "maphash" - "read-quoted-char" - "eql" - "max" - "min" - "abs" - "framep" - "frame-terminal" - "terminal-live-p" - "image-type-available-p" - "mapcar" - "mapc" - "mapconcat" - "purecopy" - "current-bidi-paragraph-direction" - "move-point-visually" - "bidi-string-mark-left-to-right" - "bidi-find-overridden-directionality" - "buffer-substring-with-bidi-context" - "special-form-p" - "type-of" - "syntax-ppss-toplevel-pos" - "shell-quote-argument" - "split-string-and-unquote" - "combine-and-quote-strings" - "posix-looking-at" - "posix-string-match" - "smie-setup" - "define-hash-table-test" - "sxhash" - "window-system" - "setcar" - "read-buffer" - "read-command" - "read-variable" - "force-mode-line-update" - "file-locked-p" - "lock-buffer" - "unlock-buffer" - "ask-user-about-lock" - "make-display-table" - "display-table-slot" - "set-display-table-slot" - "describe-display-table" - "get" - "put" - "symbol-plist" - "setplist" - "function-get" - "function-put" - "process-buffer" - "process-mark" - "set-process-buffer" - "get-buffer-process" - "set-process-window-size" - "current-indentation" - "read-input-method-name" - "make-obsolete" - "set-advertised-calling-convention" - "suspend-tty" - "resume-tty" - "controlling-tty-p" - "overlayp" - "make-overlay" - "overlay-start" - "overlay-end" - "overlay-buffer" - "delete-overlay" - "move-overlay" - "remove-overlays" - "copy-overlay" - "overlay-recenter" - "nconc" - "expand-file-name" - "substitute-in-file-name" - "prefix-numeric-value" - "lsh" - "ash" - "logand" - "logior" - "logxor" - "lognot" - "display-warning" - "lwarn" - "warn" - "next-button" - "previous-button" - "font-lock-add-keywords" - "font-lock-remove-keywords" - "current-justification" - "display-completion-list" - "make-sparse-keymap" - "make-keymap" - "copy-keymap" - "window-right-divider-width" - "window-bottom-divider-width" - "autoload" - "autoloadp" - "autoload-do-load" - "syntax-table-p" - "standard-syntax-table" - "throw" - "facep" - "x-get-resource" - "set-marker-insertion-type" - "marker-insertion-type" - "format-mode-line" - "quietly-read-abbrev-file" - "window-dedicated-p" - "set-window-dedicated-p" - "cancel-timer" - "make-network-process" - "time-less-p" - "time-subtract" - "time-add" - "time-to-days" - "time-to-day-in-year" - "date-leap-year-p" - "buffer-swap-text" - "mark" - "mark-marker" - "set-mark" - "push-mark" - "pop-mark" - "deactivate-mark" - "handle-shift-selection" - "cons" - "list" - "make-list" - "append" - "copy-tree" - "number-sequence" - "line-beginning-position" - "line-end-position" - "count-lines" - "line-number-at-pos" - "completion-in-region" - "make-marker" - "point-marker" - "point-min-marker" - "point-max-marker" - "copy-marker") - "List of elisp functions, those in elisp doc marked as function. (basically, -all functions that's not command, macro, special forms.)") - -(defvar +emacs-lisp-variable-list - '("abbrev-expand-function" - "abbrev-minor-mode-table-alist" - "abbrev-start-location" - "abbrev-start-location-buffer" - "abbrev-table-name-list" - "abbrevs-changed" - "activate-mark-hook" - "after-change-functions" - "after-change-major-mode-hook" - "after-delete-frame-functions" - "after-init-hook" - "after-insert-file-functions" - "after-load-alist" - "after-load-functions" - "after-make-frame-functions" - "after-revert-hook" - "ascii-case-table" - "auto-fill-chars" - "auto-fill-function" - "auto-mode-alist" - "auto-raise-tool-bar-buttons" - "auto-resize-tool-bars" - "auto-save-hook" - "auto-save-list-file-name" - "auto-window-vscroll" - "backup-enable-predicate" - "backup-inhibited" - "before-change-functions" - "before-hack-local-variables-hook" - "before-init-hook" - "before-make-frame-hook" - "before-revert-hook" - "beginning-of-defun-function" - "bidi-display-reordering" - "bidi-paragraph-direction" - "blink-paren-function" - "buffer-access-fontified-property" - "buffer-access-fontify-functions" - "buffer-auto-save-file-format" - "buffer-auto-save-file-name" - "buffer-backed-up" - "buffer-display-count" - "buffer-display-table" - "buffer-display-time" - "buffer-file-coding-system" - "buffer-file-format" - "buffer-file-name" - "buffer-file-number" - "buffer-file-truename" - "buffer-invisibility-spec" - "buffer-list-update-hook" - "buffer-name-history" - "buffer-read-only" - "buffer-save-without-query" - "buffer-saved-size" - "buffer-stale-function" - "buffer-substring-filters" - "buffer-undo-list" - "byte-boolean-vars" - "byte-compile-dynamic" - "change-major-mode-after-body-hook" - "change-major-mode-hook" - "char-property-alias-alist" - "char-script-table" - "char-width-table" - "charset-list" - "coding-system-for-read" - "coding-system-for-write" - "command-debug-status" - "command-error-function" - "command-history" - "command-line-args" - "command-line-args-left" - "command-line-functions" - "command-line-processed" - "command-switch-alist" - "comment-end-can-be-escaped" - "completing-read-function" - "completion-at-point-functions" - "completion-extra-properties" - "completion-ignore-case" - "completion-regexp-list" - "completion-styles-alist" - "cons-cells-consed" - "current-input-method" - "current-prefix-arg" - "cursor-in-echo-area" - "cursor-type" - "custom-known-themes" - "customize-package-emacs-version-alist" - "data-directory" - "deactivate-mark" - "deactivate-mark-hook" - "debug-on-message" - "debug-on-next-call" - "debugger" - "default-directory" - "default-minibuffer-frame" - "default-process-coding-system" - "default-text-properties" - "defining-kbd-macro" - "delayed-warnings-hook" - "delayed-warnings-list" - "delete-terminal-functions" - "desktop-buffer-mode-handlers" - "desktop-save-buffer" - "dir-locals-class-alist" - "dir-locals-directory-cache" - "disable-point-adjustment" - "disabled-command-function" - "display-buffer-overriding-action" - "doc-directory" - "dynamic-library-alist" - "echo-area-clear-hook" - "electric-future-map" - "emacs-build-time" - "emacs-major-version" - "emacs-minor-version" - "emacs-save-session-functions" - "emacs-startup-hook" - "emacs-version" - "emulation-mode-map-alists" - "enable-dir-local-variables" - "enable-multibyte-characters" - "end-of-defun-function" - "exec-directory" - "executing-kbd-macro" - "extended-command-history" - "extra-keyboard-modifiers" - "face-font-rescale-alist" - "face-name-history" - "face-remapping-alist" - "features" - "file-local-variables-alist" - "file-name-coding-system" - "file-name-history" - "fill-forward-paragraph-function" - "fill-paragraph-function" - "filter-buffer-substring-function" - "filter-buffer-substring-functions" - "find-file-literally" - "find-file-not-found-functions" - "find-word-boundary-function-table" - "first-change-hook" - "float-e" - "float-output-format" - "float-pi" - "floats-consed" - "focus-in-hook" - "focus-out-hook" - "font-lock-defaults" - "font-lock-ensure-function" - "font-lock-extend-after-change-region-function" - "font-lock-extra-managed-props" - "font-lock-flush-function" - "font-lock-fontify-buffer-function" - "font-lock-fontify-region-function" - "font-lock-keywords" - "font-lock-keywords-case-fold-search" - "font-lock-keywords-only" - "font-lock-mark-block-function" - "font-lock-multiline" - "font-lock-syntactic-face-function" - "font-lock-syntax-table" - "font-lock-unfontify-buffer-function" - "font-lock-unfontify-region-function" - "fontification-functions" - "format-alist" - "frame-inherited-parameters" - "frame-title-format" - "fringe-cursor-alist" - "fringe-indicator-alist" - "fringes-outside-margins" - "fundamental-mode-abbrev-table" - "gc-elapsed" - "gcs-done" - "generate-autoload-cookie" - "generated-autoload-file" - "global-abbrev-table" - "global-disable-point-adjustment" - "global-map" - "global-mode-string" - "glyph-table" - "glyphless-char-display" - "hack-local-variables-hook" - "header-line-format" - "help-form" - "help-map" - "history-add-new-input" - "horizontal-scroll-bar" - "icon-title-format" - "ignore-window-parameters" - "ignored-local-variables" - "image-cache-eviction-delay" - "image-format-suffixes" - "image-types" - "imenu-case-fold-search" - "imenu-create-index-function" - "imenu-extract-index-name-function" - "imenu-generic-expression" - "imenu-prev-index-position-function" - "imenu-syntax-alist" - "indent-line-function" - "indent-region-function" - "inhibit-field-text-motion" - "inhibit-file-name-handlers" - "inhibit-file-name-operation" - "inhibit-iso-escape-detection" - "inhibit-local-variables-regexps" - "inhibit-message" - "inhibit-modification-hooks" - "inhibit-null-byte-detection" - "inhibit-point-motion-hooks" - "inhibit-quit" - "inhibit-read-only" - "inhibit-x-resources" - "init-file-user" - "initial-environment" - "initial-window-system" - "input-decode-map" - "input-method-alist" - "input-method-function" - "insert-directory-program" - "installation-directory" - "interpreter-mode-alist" - "interprogram-cut-function" - "interprogram-paste-function" - "intervals-consed" - "invocation-directory" - "invocation-name" - "kbd-macro-termination-hook" - "key-translation-map" - "keyboard-translate-table" - "kill-buffer-hook" - "kill-buffer-query-functions" - "kill-emacs-hook" - "kill-emacs-query-functions" - "kill-ring" - "kill-ring-yank-pointer" - "last-abbrev" - "last-abbrev-location" - "last-abbrev-text" - "last-coding-system-used" - "last-command" - "last-command-event" - "last-event-frame" - "last-input-event" - "last-kbd-macro" - "last-nonmenu-event" - "last-prefix-arg" - "last-repeatable-command" - "left-fringe-width" - "left-margin-width" - "lexical-binding" - "line-prefix" - "lisp-mode-abbrev-table" - "list-buffers-directory" - "load-file-name" - "load-file-rep-suffixes" - "load-history" - "load-in-progress" - "load-path" - "load-read-function" - "load-suffixes" - "local-abbrev-table" - "local-function-key-map" - "locale-coding-system" - "magic-fallback-mode-alist" - "magic-mode-alist" - "mark-active" - "mark-ring" - "max-image-size" - "memory-full" - "menu-bar-final-items" - "menu-bar-update-hook" - "menu-prompt-more-char" - "message-truncate-lines" - "minibuffer-allow-text-properties" - "minibuffer-completion-confirm" - "minibuffer-completion-predicate" - "minibuffer-completion-table" - "minibuffer-confirm-exit-commands" - "minibuffer-exit-hook" - "minibuffer-help-form" - "minibuffer-history" - "minibuffer-local-completion-map" - "minibuffer-local-filename-completion-map" - "minibuffer-local-map" - "minibuffer-local-must-match-map" - "minibuffer-local-ns-map" - "minibuffer-local-shell-command-map" - "minibuffer-scroll-window" - "minibuffer-setup-hook" - "minor-mode-alist" - "minor-mode-list" - "minor-mode-map-alist" - "minor-mode-overriding-map-alist" - "misc-objects-consed" - "mode-line-buffer-identification" - "mode-line-client" - "mode-line-end-spaces" - "mode-line-frame-identification" - "mode-line-front-space" - "mode-line-misc-info" - "mode-line-modes" - "mode-line-modified" - "mode-line-mule-info" - "mode-line-position" - "mode-line-process" - "mode-line-remote" - "mode-name" - "module-file-suffix" - "most-negative-fixnum" - "most-positive-fixnum" - "mouse-position-function" - "multi-query-replace-map" - "multibyte-syntax-as-symbol" - "multiple-frames" - "network-coding-system-alist" - "noninteractive" - "normal-auto-fill-function" - "num-input-keys" - "num-nonmacro-input-events" - "obarray" - "other-window-scroll-buffer" - "overlay-arrow-position" - "overlay-arrow-string" - "overlay-arrow-variable-list" - "overriding-local-map" - "overriding-local-map-menu-flag" - "overriding-terminal-local-map" - "overwrite-mode" - "parse-sexp-lookup-properties" - "path-separator" - "play-sound-functions" - "post-command-hook" - "post-gc-hook" - "pre-command-hook" - "pre-redisplay-function" - "pre-redisplay-functions" - "prefix-arg" - "prefix-help-command" - "print-circle" - "print-continuous-numbering" - "print-escape-multibyte" - "print-escape-newlines" - "print-escape-nonascii" - "print-gensym" - "print-length" - "print-level" - "print-number-table" - "print-quoted" - "printable-chars" - "process-adaptive-read-buffering" - "process-coding-system-alist" - "process-connection-type" - "process-environment" - "process-file-side-effects" - "pure-bytes-used" - "purify-flag" - "query-replace-history" - "query-replace-map" - "quit-flag" - "read-circle" - "read-expression-history" - "read-file-name-function" - "real-last-command" - "regexp-history" - "register-alist" - "replace-re-search-function" - "replace-search-function" - "revert-buffer-function" - "revert-buffer-in-progress-p" - "revert-buffer-insert-file-contents-function" - "right-fringe-width" - "right-margin-width" - "save-buffer-coding-system" - "scroll-bar-height" - "scroll-bar-width" - "search-spaces-regexp" - "selective-display" - "shell-command-history" - "show-help-function" - "special-event-map" - "split-string-default-separators" - "standard-display-table" - "standard-input" - "standard-output" - "standard-translation-table-for-decode" - "standard-translation-table-for-encode" - "string-chars-consed" - "strings-consed" - "suspend-hook" - "suspend-resume-hook" - "symbols-consed" - "syntax-propertize-extend-region-functions" - "syntax-propertize-function" - "system-configuration" - "system-key-alist" - "system-messages-locale" - "system-time-locale" - "system-type" - "tabulated-list-entries" - "tabulated-list-format" - "tabulated-list-printer" - "tabulated-list-revert-hook" - "tabulated-list-sort-key" - "temp-buffer-setup-hook" - "temp-buffer-show-hook" - "text-mode-abbrev-table" - "text-property-default-nonsticky" - "text-quoting-style" - "this-command" - "this-original-command" - "tool-bar-border" - "tool-bar-button-margin" - "tool-bar-button-relief" - "tool-bar-map" - "tooltip-frame-parameters" - "tooltip-functions" - "translation-table-for-input" - "tty-erase-char" - "tty-setup-hook" - "undo-auto-current-boundary-timer" - "undo-in-progress" - "unicode-category-table" - "unload-feature-special-hooks" - "unread-command-events" - "use-hard-newlines" - "user-emacs-directory" - "user-init-file" - "values" - "vc-mode" - "vector-cells-consed" - "vertical-scroll-bar" - "warning-fill-prefix" - "warning-levels" - "warning-prefix-function" - "warning-series" - "warning-type-format" - "window-configuration-change-hook" - "window-persistent-parameters" - "window-point-insertion-type" - "window-scroll-functions" - "window-setup-hook" - "window-size-change-functions" - "window-size-fixed" - "window-system" - "wrap-prefix" - "write-contents-functions" - "write-file-functions" - "write-region-annotate-functions" - "write-region-post-annotation-function" - "x-alt-keysym" - "x-hyper-keysym" - "x-meta-keysym" - "x-pointer-shape" - "x-resource-class" - "x-resource-name" - "x-sensitive-text-pointer-shape" - "x-super-keysym" - "yank-undo-function") - "TODO") - -(defvar +emacs-lisp-option-list - '("abbrev-all-caps" - "abbrev-file-name" - "adaptive-fill-first-line-regexp" - "adaptive-fill-function" - "adaptive-fill-mode" - "adaptive-fill-regexp" - "after-save-hook" - "auto-coding-alist" - "auto-coding-functions" - "auto-coding-regexp-alist" - "auto-save-default" - "auto-save-interval" - "auto-save-list-file-prefix" - "auto-save-timeout" - "auto-save-visited-file-name" - "backup-by-copying" - "backup-by-copying-when-linked" - "backup-by-copying-when-mismatch" - "backup-by-copying-when-privileged-mismatch" - "backup-directory-alist" - "backward-delete-char-untabify-method" - "baud-rate" - "before-save-hook" - "blink-cursor-alist" - "blink-matching-delay" - "blink-matching-paren" - "blink-matching-paren-distance" - "buffer-offer-save" - "byte-compile-dynamic-docstrings" - "case-fold-search" - "case-replace" - "completion-auto-help" - "completion-category-overrides" - "completion-ignored-extensions" - "completion-styles" - "create-lockfiles" - "ctl-arrow" - "cursor-in-non-selected-windows" - "custom-unlispify-remove-prefixes" - "debug-ignored-errors" - "debug-on-error" - "debug-on-event" - "debug-on-quit" - "debug-on-signal" - "default-frame-alist" - "default-input-method" - "default-justification" - "defun-prompt-regexp" - "delete-auto-save-files" - "delete-exited-processes" - "delete-old-versions" - "dired-kept-versions" - "display-buffer-alist" - "display-buffer-base-action" - "display-mm-dimensions-alist" - "double-click-fuzz" - "double-click-time" - "echo-keystrokes" - "edebug-all-defs" - "edebug-all-forms" - "edebug-continue-kbd-macro" - "edebug-eval-macro-args" - "edebug-global-break-condition" - "edebug-initial-mode" - "edebug-on-error" - "edebug-on-quit" - "edebug-print-circle" - "edebug-print-length" - "edebug-print-level" - "edebug-save-displayed-buffer-points" - "edebug-save-windows" - "edebug-setup-hook" - "edebug-sit-for-seconds" - "edebug-test-coverage" - "edebug-trace" - "edebug-unwrap-results" - "enable-local-eval" - "enable-local-variables" - "enable-recursive-minibuffers" - "eval-expression-debug-on-error" - "eval-expression-print-length" - "eval-expression-print-level" - "even-window-sizes" - "exec-path" - "exec-suffixes" - "face-font-family-alternatives" - "face-font-registry-alternatives" - "face-font-selection-order" - "file-coding-system-alist" - "file-precious-flag" - "fill-column" - "fill-individual-varying-indent" - "fill-nobreak-predicate" - "fill-prefix" - "find-file-hook" - "find-file-wildcards" - "fit-frame-to-buffer" - "fit-frame-to-buffer-margins" - "fit-frame-to-buffer-sizes" - "fit-window-to-buffer-horizontally" - "focus-follows-mouse" - "frame-auto-hide-function" - "frame-inhibit-implied-resize" - "frame-resize-pixelwise" - "garbage-collection-messages" - "gc-cons-percentage" - "gc-cons-threshold" - "glyphless-char-display-control" - "help-char" - "help-event-list" - "history-delete-duplicates" - "history-length" - "horizontal-scroll-bar-mode" - "image-load-path" - "imagemagick-enabled-types" - "imagemagick-types-inhibit" - "indent-tabs-mode" - "indicate-buffer-boundaries" - "indicate-empty-lines" - "inhibit-default-init" - "inhibit-eol-conversion" - "inhibit-startup-echo-area-message" - "inhibit-startup-screen" - "initial-buffer-choice" - "initial-frame-alist" - "initial-major-mode" - "initial-scratch-message" - "insert-default-directory" - "kept-new-versions" - "kept-old-versions" - "kill-read-only-ok" - "kill-ring-max" - "left-margin" - "load-prefer-newer" - "mail-host-address" - "major-mode" - "make-backup-file-name-function" - "make-backup-files" - "mark-even-if-inactive" - "mark-ring-max" - "max-lisp-eval-depth" - "max-mini-window-height" - "max-mini-window-height" - "max-specpdl-size" - "message-log-max" - "meta-prefix-char" - "minibuffer-auto-raise" - "minibuffer-frame-alist" - "mode-line-format" - "next-screen-context-lines" - "no-redraw-on-reenter" - "only-global-abbrevs" - "open-paren-in-column-0-is-defun-start" - "overflow-newline-into-fringe" - "package-archive-upload-base" - "package-archives" - "page-delimiter" - "paragraph-separate" - "paragraph-start" - "parse-sexp-ignore-comments" - "pop-up-frame-alist" - "pop-up-frame-function" - "pop-up-frames" - "pop-up-windows" - "read-buffer-completion-ignore-case" - "read-buffer-function" - "read-file-name-completion-ignore-case" - "read-regexp-defaults-function" - "recenter-positions" - "recenter-redisplay" - "remote-file-name-inhibit-cache" - "require-final-newline" - "resize-mini-windows" - "revert-without-query" - "ring-bell-function" - "safe-local-eval-forms" - "safe-local-variable-values" - "same-window-buffer-names" - "same-window-regexps" - "save-abbrevs" - "scalable-fonts-allowed" - "scroll-bar-mode" - "scroll-conservatively" - "scroll-down-aggressively" - "scroll-error-top-bottom" - "scroll-margin" - "scroll-preserve-screen-position" - "scroll-step" - "scroll-up-aggressively" - "selection-coding-system" - "selective-display-ellipses" - "sentence-end" - "sentence-end-double-space" - "sentence-end-without-period" - "sentence-end-without-space" - "site-run-file" - "small-temporary-file-directory" - "smie-config" - "sort-fold-case" - "sort-numeric-base" - "split-height-threshold" - "split-width-threshold" - "split-window-keep-point" - "split-window-preferred-function" - "switch-to-buffer-in-dedicated-window" - "switch-to-buffer-preserve-window-point" - "switch-to-visible-buffer" - "tab-always-indent" - "tab-stop-list" - "tab-width" - "temp-buffer-max-height" - "temp-buffer-max-width" - "temp-buffer-resize-mode" - "temp-buffer-show-function" - "temporary-file-directory" - "term-file-aliases" - "term-file-prefix" - "three-step-help" - "timer-max-repeats" - "transient-mark-mode" - "truncate-lines" - "truncate-partial-width-windows" - "underline-minimum-offset" - "undo-ask-before-discard" - "undo-limit" - "undo-outer-limit" - "undo-strong-limit" - "user-mail-address" - "version-control" - "visible-bell" - "void-text-area-pointer" - "warning-minimum-level" - "warning-minimum-log-level" - "warning-suppress-log-types" - "warning-suppress-types" - "window-adjust-process-window-size-function" - "window-combination-limit" - "window-combination-resize" - "window-min-height" - "window-min-width" - "window-resize-pixelwise" - "words-include-escapes" - "x-bitmap-file-path" - "x-stretch-cursor" - "yank-excluded-properties" - "yank-handled-properties") - "TODO") - -(defvar +emacs-lisp-command-list - '("abbrev-prefix-mark" - "abort-recursive-edit" - "add-name-to-file" - "append-to-file" - "apropos" - "auto-save-mode" - "back-to-indentation" - "backtrace" - "backward-button" - "backward-char" - "backward-delete-char-untabify" - "backward-list" - "backward-sexp" - "backward-to-indentation" - "backward-up-list" - "backward-word" - "balance-windows" - "balance-windows-area" - "base64-decode-region" - "base64-encode-region" - "beginning-of-buffer" - "beginning-of-defun" - "beginning-of-line" "end-of-line" - "blink-matching-open" - "buffer-disable-undo" - "buffer-enable-undo" - "bury-buffer" - "byte-compile-file" - "byte-recompile-directory" - "cancel-debug-on-entry" - "capitalize-region" - "capitalize-word" - "clone-indirect-buffer" - "compile-defun" - "conf-mode" - "copy-directory" - "copy-file" - "copy-region-as-kill" - "count-words" - "debug" - "debug-on-entry" - "decode-coding-region" - "delete-backward-char" - "delete-blank-lines" - "delete-char" - "delete-directory" - "delete-file" - "delete-frame" - "delete-horizontal-space" - "delete-indentation" - "delete-minibuffer-contents" - "delete-other-windows" - "delete-region" - "delete-trailing-whitespace" - "delete-window" - "delete-windows-on" - "describe-bindings" - "describe-buffer-case-table" - "describe-categories" - "describe-current-display-table" - "describe-mode" - "describe-prefix-bindings" - "describe-syntax" - "digit-argument" - "disable-command" - "disable-theme" - "disassemble" - "display-buffer" - "do-auto-save" - "down-list" - "downcase-region" - "downcase-word" - "edebug-display-freq-count" - "edebug-set-initial-mode" - "emacs-init-time" - "emacs-uptime" - "emacs-version" - "enable-command" - "enable-theme" - "encode-coding-region" - "end-of-buffer" - "end-of-defun" - "erase-buffer" - "eval-buffer" - "eval-region" - "execute-extended-command" - "exit-minibuffer" - "exit-recursive-edit" - "expand-abbrev" - "fill-individual-paragraphs" - "fill-paragraph" - "fill-region" - "fill-region-as-paragraph" - "find-file" - "find-file-literally" - "find-file-other-window" - "find-file-read-only" - "fit-frame-to-buffer" - "fit-window-to-buffer" - "fixup-whitespace" - "format-find-file" - "format-insert-file" - "format-write-file" - "forward-button" - "forward-char" - "forward-line" - "forward-list" - "forward-sexp" - "forward-to-indentation" - "forward-word" - "fundamental-mode" - "garbage-collect" - "getenv" - "global-set-key" - "global-unset-key" - "goto-char" - "gui-set-selection" - "handle-switch-frame" - "Helper-describe-bindings" - "Helper-help" - "iconify-frame" - "imenu-add-to-menubar" - "indent-according-to-mode" - "indent-code-rigidly" - "indent-for-tab-command" - "indent-region" - "indent-relative" - "indent-relative-maybe" - "indent-rigidly" - "indent-to" - "insert-buffer" - "insert-char" - "insert-register" - "invert-face" - "just-one-space" - "justify-current-line" - "keyboard-quit" - "kill-buffer" - "kill-emacs" - "kill-local-variable" - "kill-region" - "list-charset-chars" - "list-load-path-shadows" - "list-processes" - "load-file" - "load-library" - "load-theme" - "local-set-key" - "local-unset-key" - "locate-library" - "lower-frame" - "make-directory" - "make-frame" - "make-frame-invisible" - "make-frame-on-display" - "make-frame-visible" - "make-indirect-buffer" - "make-local-variable" - "make-symbolic-link" - "make-variable-buffer-local" - "maximize-window" - "minibuffer-complete" - "minibuffer-complete-and-exit" - "minibuffer-complete-word" - "minibuffer-completion-help" - "minibuffer-inactive-mode" - "minimize-window" - "modify-syntax-entry" - "move-to-column" - "move-to-left-margin" - "move-to-window-line" - "narrow-to-page" - "narrow-to-region" - "negative-argument" - "newline" - "newline-and-indent" - "next-complete-history-element" - "next-history-element" - "next-matching-history-element" - "normal-mode" - "not-modified" - "open-dribble-file" - "open-termscript" - "other-window" - "package-initialize" - "package-upload-buffer" - "package-upload-file" - "play-sound-file" - "pop-to-buffer" - "posix-search-backward" - "posix-search-forward" - "previous-complete-history-element" - "previous-history-element" - "previous-matching-history-element" - "prog-mode" - "push-button" - "quit-window" - "raise-frame" - "re-search-backward" - "re-search-forward" - "read-color" - "read-kbd-macro" - "read-only-mode" - "recenter" - "recenter-top-bottom" - "recursive-edit" - "redraw-display" - "reindent-then-newline-and-indent" - "rename-buffer" - "rename-file" - "replace-buffer-in-windows" - "revert-buffer" - "run-at-time" - "run-with-idle-timer" - "save-buffer" - "save-some-buffers" - "scroll-down" - "scroll-down-command" - "scroll-left" - "scroll-other-window" - "scroll-right" - "scroll-up" - "scroll-up-command" - "search-backward" - "search-forward" - "select-frame" - "self-insert-and-exit" - "self-insert-command" - "serial-term" - "set-face-background" - "set-face-font" - "set-face-foreground" - "set-face-stipple" - "set-file-modes" - "set-frame-font" - "set-input-method" - "set-keyboard-coding-system" - "set-left-margin" - "set-right-margin" - "set-terminal-coding-system" - "set-visited-file-name" - "setenv" - "shrink-window-if-larger-than-buffer" - "signal-process" - "smie-close-block" - "smie-config-guess" - "smie-config-save" - "smie-config-set-indent" - "smie-config-show-indent" - "smie-down-list" - "sort-columns" - "sort-fields" - "sort-lines" - "sort-numeric-fields" - "sort-pages" - "sort-paragraphs" - "sort-regexp-fields" - "special-mode" - "split-window-below" - "split-window-right" - "strong>help-command" - "suspend-emacs" - "suspend-frame" - "switch-to-buffer" - "switch-to-buffer-other-frame" - "switch-to-buffer-other-window" - "switch-to-next-buffer" - "switch-to-prev-buffer" - "tab-to-tab-stop" - "text-mode" - "top-level" - "translate-region" - "unbury-buffer" - "undefined" - "universal-argument" - "unload-feature" - "up-list" - "upcase-region" - "upcase-word" - "view-register" - "widen" - "word-search-backward" - "word-search-backward-lax" - "word-search-forward" - "word-search-forward-lax" - "write-abbrev-file" - "write-file" - "write-region" - "yank" - "yank-pop") - "List of elisp commands.") diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index f62761396..d1e35ee1b 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,10 +1,5 @@ ;;; lang/emacs-lisp/config.el -*- lexical-binding: t; -*- -(defvar +emacs-lisp-enable-extra-fontification t - "If non-nil, fontify built-in functions and variables especially (symbols -defined by Emacs, not Doom or packages). This can help make typos stand out.") - - ;; ;; elisp-mode deferral hack ;; @@ -59,23 +54,43 @@ defined by Emacs, not Doom or packages). This can help make typos stand out.") ;; initialization +emacs-lisp|init-imenu)) + (defvar +emacs-lisp--face nil) + (defun +emacs-lisp-highlight-vars-and-faces (end) + "Match defined variables and functions. + +Functions are differentiated into special forms, built-in functions and +library/userland functions" + (catch 'matcher + (while (re-search-forward "\\_<.+?\\_>" end t) + (let ((symbol (intern-soft (match-string-no-properties 0)))) + (and (cond ((null symbol)) + ((special-variable-p symbol) + (setq +emacs-lisp--face 'font-lock-variable-name-face)) + ((and (fboundp symbol) + (eq (char-before (match-beginning 0)) ?\()) + (let ((unaliased (indirect-function symbol t))) + (unless (or (macrop unaliased) + (special-form-p unaliased)) + (let ((orig (let (unadvised) + (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) + (setq unaliased (indirect-function unadvised t))))) + unaliased))) + (setq +emacs-lisp--face + (if (subrp orig) + 'font-lock-constant-face + 'font-lock-function-name-face))))))) + (throw 'matcher t)))) + nil)) + (eval-when-compile + (byte-compile #'+emacs-lisp-highlight-vars-and-faces)) + ;; Special fontification for doom (font-lock-add-keywords 'emacs-lisp-mode - `(;; custom Doom cookies - ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; doom/module functions - ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 'font-lock-keyword-face)))) - - ;; Highlight symbols in standard library - (when +emacs-lisp-enable-extra-fontification - (load! "+symbols") - (font-lock-add-keywords - 'emacs-lisp-mode - `((,(concat "\\(?:(\\|#'\\)" (regexp-opt +emacs-lisp-function-list t) "\\_>") (1 'font-lock-function-name-face)) - (,(concat "\\(?:(\\|#'\\)" (regexp-opt +emacs-lisp-command-list t) "\\_>") (1 'font-lock-function-name-face)) - (,(regexp-opt +emacs-lisp-variable-list 'symbols) . font-lock-variable-name-face) - (,(regexp-opt +emacs-lisp-option-list 'symbols) . font-lock-variable-name-face)))) + (append `(;; custom Doom cookies + ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) + ;; highlight defined, special variables & functions + (+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face)))) (defun +emacs-lisp|init-imenu () "Improve imenu support with better expression regexps and Doom-specific forms." From e348e32cbc93b3155106239524fd0aa38a88dc8b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 20:37:12 +0200 Subject: [PATCH 2726/4235] Fix def-project-mode! :add-hooks overwriting hooks Would overwrite hooks previously added to the project mode. --- core/core-projects.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index bfad45883..86fda91a7 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -130,8 +130,9 @@ Relevant: `doom-project-hook'." ,on-load (setq ,init-var t))) ,on-enter)) - ,(when add-hooks - `(setq ,(intern (format "%s-hook" name)) ',add-hooks)) + ,@(cl-loop for hook in add-hooks + collect `(add-hook ',(intern (format "%s-hook" name)) + #',hook)) ,(when (or modes match files when) `(associate! ,name :modes ,modes From 631f075a82d6e2d20c3e8e8f297f24f67f13373c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 23:30:36 +0200 Subject: [PATCH 2727/4235] lang/emacs-lisp: polish symbol fontification Follow up on 76b4af99; resolves "flickering christmas lights" issue where symbols were incorrectly fontified with the last face while typing them. --- modules/lang/emacs-lisp/config.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index d1e35ee1b..e2198019b 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -63,7 +63,8 @@ library/userland functions" (catch 'matcher (while (re-search-forward "\\_<.+?\\_>" end t) (let ((symbol (intern-soft (match-string-no-properties 0)))) - (and (cond ((null symbol)) + (and (cond ((null symbol) nil) + ((eq symbol t) nil) ((special-variable-p symbol) (setq +emacs-lisp--face 'font-lock-variable-name-face)) ((and (fboundp symbol) @@ -71,14 +72,14 @@ library/userland functions" (let ((unaliased (indirect-function symbol t))) (unless (or (macrop unaliased) (special-form-p unaliased)) - (let ((orig (let (unadvised) - (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) - (setq unaliased (indirect-function unadvised t))))) - unaliased))) - (setq +emacs-lisp--face - (if (subrp orig) - 'font-lock-constant-face - 'font-lock-function-name-face))))))) + (let (unadvised) + (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) + (setq unaliased (indirect-function unadvised t))))) + unaliased) + (setq +emacs-lisp--face + (if (subrp unaliased) + 'font-lock-constant-face + 'font-lock-function-name-face)))))) (throw 'matcher t)))) nil)) (eval-when-compile From e290c6e03b267346c982b4dd822b3f6aa1e64a6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 23:32:21 +0200 Subject: [PATCH 2728/4235] Minor refactor of associate!'s initializer --- core/core-lib.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index c64bd6133..132877e07 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -408,7 +408,8 @@ The available conditions are: (and (fboundp ',mode) (not (bound-and-true-p ,mode)) (and buffer-file-name (not (file-remote-p buffer-file-name))) - ,(if match `(if buffer-file-name (string-match-p ,match buffer-file-name)) t) + ,(or (not match) + `(if buffer-file-name (string-match-p ,match buffer-file-name))) ,(or (not files) (doom--resolve-path-forms (if (stringp (car files)) (cons 'and files) files) From e127819d889c74b018fe2ecdc82e8840dee17e7c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 10 Aug 2018 23:41:55 +0200 Subject: [PATCH 2729/4235] Don't override ispell-program-name Better not to override possible user customizations, only adjust ispell-extra-args in case of aspell, to improve its performance. --- modules/feature/spellcheck/config.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el index 496f512b1..40cb910f5 100644 --- a/modules/feature/spellcheck/config.el +++ b/modules/feature/spellcheck/config.el @@ -13,10 +13,8 @@ Since spellchecking can be slow in some buffers, this can be disabled with: ispell-extr-args '("--dont-tex-check-comments")) (after! ispell - (cond ((executable-find "hunspell") - (setq ispell-program-name "hunspell")) - ((executable-find "aspell") - (add-to-list 'ispell-extra-args "--sug-mode=ultra")))) + (when (equal (file-name-base ispell-program-name) "aspell") + (add-to-list 'ispell-extra-args "--sug-mode=ultra"))) (def-package! flyspell ; built-in From 3b4fd56cacecb1f9e8cc2b10d9c1e1ab7b95ccbe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 00:27:56 +0200 Subject: [PATCH 2730/4235] Force helm posframe to respect min-(width|height) And enable solaire-mode if available, and unused in origin buffer (to make it easier to see posframe over non-solaire-mode buffers). --- modules/completion/helm/autoload/posframe.el | 43 +++++++++++++++----- modules/completion/helm/config.el | 6 +-- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/modules/completion/helm/autoload/posframe.el b/modules/completion/helm/autoload/posframe.el index e274ad47a..308679c74 100644 --- a/modules/completion/helm/autoload/posframe.el +++ b/modules/completion/helm/autoload/posframe.el @@ -16,17 +16,40 @@ bottom, which is easier on the eyes on big displays." ;;;###autoload (defun +helm-posframe-display (buffer &optional _resume) "TODO" - (require 'posframe) (setq helm--buffer-in-new-frame-p t) - (posframe-show - (setq +helm--posframe-buffer buffer) - :position (point) - :poshandler +helm-posframe-handler - :override-parameters +helm-posframe-parameters) - (unless (or (null +helm-posframe-text-scale) - (= +helm-posframe-text-scale 0)) - (with-current-buffer buffer - (text-scale-set +helm-posframe-text-scale)))) + (let ((solaire-p (bound-and-true-p solaire-mode)) + (params (copy-sequence +helm-posframe-parameters))) + (let-alist params + (require 'posframe) + (posframe-show + (setq +helm--posframe-buffer buffer) + :position (point) + :poshandler +helm-posframe-handler + :width + (max (cl-typecase .width + (integer .width) + (float (truncate (* (frame-width) .width))) + (function (funcall .width)) + (t 0)) + .min-width) + :height + (max (cl-typecase .height + (integer .height) + (float (truncate (* (frame-height) .height))) + (function (funcall .height)) + (t 0)) + .min-height) + :override-parameters + (dolist (p '(width height min-width min-height) params) + (setq params (delq (assq p params) params))))) + ;; + (unless (or (null +helm-posframe-text-scale) + (= +helm-posframe-text-scale 0)) + (with-current-buffer buffer + (when (and (featurep 'solaire-mode) + (not solaire-p)) + (solaire-mode +1)) + (text-scale-set +helm-posframe-text-scale))))) ;;;###autoload (defun +helm|posframe-cleanup () diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 27bd78ac0..02159e05f 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -26,10 +26,10 @@ be negative.") (defvar +helm-posframe-parameters '((internal-border-width . 8) - (min-width . 80) - (min-height . 16) (width . 0.5) - (height . 0.55)) + (height . 0.35) + (min-width . 80) + (min-height . 16)) "TODO") From 43e0314e86bc527c0c20c98d13f5e98011d26dff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 00:33:23 +0200 Subject: [PATCH 2731/4235] Add doom/switch-theme; a more sensible load-theme load-theme doesn't disable previously enabled themes before switching. doom/switch-theme does. This remaps any keys bound to load-theme to doom/switch-theme. --- core/autoload/ui.el | 17 +++++++++++++++++ core/core-ui.el | 10 +++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 82f89cdf7..2186efc93 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -103,3 +103,20 @@ presentations." (mapc #'disable-theme custom-enabled-themes)) (doom|init-theme) (doom|init-fonts))) + +;;;###autoload +(defun doom/switch-theme (theme) + "Like `load-theme', but will unload currently loaded themes before switching +to a new one." + (interactive + (list (completing-read + "Load theme: " + (mapcar #'symbol-name + (custom-available-themes))))) + (condition-case nil + (progn + (mapc #'disable-theme custom-enabled-themes) + (load-theme (intern theme) t) + (when (fboundp 'powerline-reset) + (powerline-reset))) + (error "Problem loading theme %s" x))) diff --git a/core/core-ui.el b/core/core-ui.el index 431e5e404..9d8752713 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -540,14 +540,18 @@ frame's window-system, the theme will be reloaded.") (setq frame-title-format '("%b – Doom Emacs")) ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only -;; prompts the user for confirmation when deleting a non-empty frame -(define-key global-map [remap delete-frame] #'doom/delete-frame) - ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) +;; More sensibile replacements for default commands +(define-key! 'global + ;; prompts the user for confirmation when deleting a non-empty frame + [remap delete-frame] #'doom/delete-frame + ;; a more sensible load-theme, that disables previous themes first + [remap load-theme] #'doom/switch-theme) + (defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) (let ((frame (apply orig-fn args))) (with-selected-frame frame From 09678f8b1d408cb8c60f037e60bc79d420823f69 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 00:37:21 +0200 Subject: [PATCH 2732/4235] lang/emacs-lisp: combine imenu var rules --- modules/lang/emacs-lisp/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index e2198019b..b1b798e1c 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -108,8 +108,7 @@ library/userland functions" ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) - ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) - ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) + ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\|var\\(?:-local\\)?\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) (defun +emacs-lisp|disable-flycheck-maybe () From 9653185478e9f39acf0ccbdf7ae5ef9301707606 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 01:09:07 +0200 Subject: [PATCH 2733/4235] lang/latex: fix PDF Tools viewer on MacOS --- modules/lang/latex/+viewers.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index 0fdcac95f..28dc06322 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -23,6 +23,9 @@ (`pdf-tools (when (featurep! :tools pdf) (add-to-list 'TeX-view-program-selection '(output-pdf "PDF Tools")) + (when IS-MAC + ;; PDF Tools isn't in `TeX-view-program-list-builtin' on macs + (add-to-list 'TeX-view-program-list '("PDF Tools" TeX-pdf-tools-sync-view))) ;; Update PDF buffers after successful LaTeX runs (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)))) From 4c8c9a2d092282947f7056e99fa777bec8d7cc3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 01:17:07 +0200 Subject: [PATCH 2734/4235] Add "resume last search" keybind for ivy/helm #742 --- modules/config/default/+bindings.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ec3e95aac..c06635c94 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -481,7 +481,10 @@ :desc "Find file in project" :n "SPC" #'projectile-find-file :desc "Browse files" :n "." #'find-file :desc "Toggle last popup" :n "~" #'+popup/toggle - :desc "Eval expression" :n "`" #'eval-expression + (:when (featurep! :completion ivy) + :desc "Resume last search" :n "'" #'ivy-resume) + (:when (featurep! :completion helm) + :desc "Resume last search" :n "'" #'helm-resume) :desc "Blink cursor line" :n "DEL" #'+nav-flash/blink-cursor :desc "Jump to bookmark" :n "RET" #'bookmark-jump From ddf107a507cf5c0bc2e9a52eef600ad61e63f91e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 01:36:26 +0200 Subject: [PATCH 2735/4235] Disable counsel-projectile temporarily #93 Until upstream resolves ericdanan/counsel-projectile#93 --- modules/completion/ivy/autoload/ivy.el | 12 ++++-------- modules/completion/ivy/config.el | 1 + 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index e556da596..da1c8a4de 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -224,14 +224,10 @@ The point of this is to avoid Emacs locking up indexing massive file trees." #'counsel-find-file) ((doom-project-p 'nocache) - #'projectile-find-file) - - ;; FIXME When counsel-projectile-find-file is fixed upstream - ;; ((doom-project-p 'nocache) - ;; (let ((files (projectile-current-project-files))) - ;; (if (<= (length files) ivy-sort-max-size) - ;; #'counsel-projectile-find-file - ;; #'projectile-find-file))) + (let ((files (projectile-current-project-files))) + (if (<= (length files) ivy-sort-max-size) + #'counsel-projectile-find-file + #'projectile-find-file))) (#'counsel-file-jump)))) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 5b87887ac..62a3d96dc 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -149,6 +149,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel-projectile + :disabled t :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init From 12c5490a39a2acad2ce5c32f442779487c2a2efe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 01:55:38 +0200 Subject: [PATCH 2736/4235] Add node_modules/.bin to exec-path regardless #798 Before, this was conditional to the directory's existence. Add it anyway, in case the folder is created while the buffer is open. This may cause a problem is the project root changes while the buffer is open, but for that case there's M-x doom/reload-project. --- modules/lang/javascript/autoload.el | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 2cf22ab83..711f9fb2d 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -86,19 +86,15 @@ Run this for any buffer you want to skewer." ;;;###autoload (defun +javascript|add-node-modules-path () - "Search the current buffer's parent directories for `node_modules/.bin`. -If it's found, then add it to the `exec-path'." - (if-let* ((root (locate-dominating-file - (or (buffer-file-name) default-directory) - "node_modules")) - (path (expand-file-name "node_modules/.bin/" root))) - (progn - (make-local-variable 'exec-path) - (cl-pushnew path exec-path :test #'string=) - (when doom-debug-mode - (message "Added %s to exec-path" path))) - (when doom-debug-mode - (message "node_modules not found in %s" root)))) + "Add current project's `node_modules/.bin` to `exec-path', so js tools +prioritize project-local packages over global ones." + (make-local-variable 'exec-path) + (cl-pushnew (expand-file-name "node_modules/.bin/" + (or (locate-dominating-file + (or (buffer-file-name) default-directory) + "node_modules") + (doom-project-root))) + exec-path :test #'string=)) ;;;###autoload (defun +javascript|cleanup-tide-processes () From 735e14270ee0b527a4a014954667122aefe071ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 02:05:33 +0200 Subject: [PATCH 2737/4235] Fix non-string errors from kill-ring When unpropertizing the kill ring. --- core/core-editor.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 88ae20724..0962c5a7b 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -102,7 +102,10 @@ fundamental-mode) for performance sake." (defun doom|unpropertize-kill-ring () "Remove text properties from `kill-ring' in the interest of shrinking the savehist file." - (setq kill-ring (mapcar #'substring-no-properties kill-ring))) + (setq kill-ring (cl-loop for item in kill-ring + if (stringp item) + collect (substring-no-properties item) + else if item collect it))) (add-hook 'kill-emacs-hook #'doom|unpropertize-kill-ring)) ;; persistent point location in buffers From 1490b9ec8dc647cf55ce53c1222dde1181ab0bc8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 16:48:31 +0200 Subject: [PATCH 2738/4235] Prioritize private snippets over built-in ones In the case of snippet conflicts, you'd normally be prompted to select which snippet you want. Built-in snippets are now disregarded if conflicting private ones exist. This makes it easier for users to add overriding snippets to DOOMDIR/snippets. --- modules/feature/snippets/autoload/snippets.el | 18 +++++++++++++++--- modules/feature/snippets/config.el | 8 +++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index bc7e4b75f..aeeb52720 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -1,8 +1,20 @@ ;;; feature/snippets/autoload/snippets.el -*- lexical-binding: t; -*- -;; -;; Commands -;; +;;;###autoload +(defun +snippets-prompt-private (prompt choices &optional fn) + "Prioritize private snippets (in `+snippets-dir') over built-in ones if there +are multiple choices." + (when-let* + ((choices + (or (cl-loop for tpl in choices + if (file-in-directory-p (yas--template-get-file tpl) + +snippets-dir) + collect tpl) + choices))) + (if (cdr choices) + (let ((prompt-functions (remq '+snippets-prompt-private yas-prompt-functions))) + (run-hook-with-args-until-success 'prompt-functions prompt choices fn)) + (car choices)))) ;;;###autoload (defun +snippets/goto-start-of-field () diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index bbc3a4eeb..29b1f3fd2 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -22,11 +22,17 @@ :config (setq yas-verbosity (if doom-debug-mode 3 0) yas-also-auto-indent-first-line t - yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) yas-triggers-in-field t) ; Allow nested snippets + ;; Allow private snippets in DOOMDIR/snippets (add-to-list 'yas-snippet-dirs '+snippets-dir nil #'eq) + ;; Remove GUI dropdown prompt (prefer ivy/helm) + (delq #'yas-dropdown-prompt yas-prompt-functions) + ;; Prioritize private snippets in `+snippets-dir' over built-in ones if there + ;; are multiple choices. + (add-to-list 'yas-prompt-functions #'+snippets-prompt-private nil #'eq) + ;; Register `def-project-mode!' modes with yasnippet. This enables project ;; specific snippet libraries (e.g. for Laravel, React or Jekyll projects). (add-hook 'doom-project-hook #'+snippets|enable-project-modes) From 18925b51dbd84a19dacd7257fddf574d72ace4a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 21:03:15 +0200 Subject: [PATCH 2739/4235] Update comments in feature/evil/+everywhere --- modules/feature/evil/+everywhere.el | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 1b0e5e26d..f9c075647 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -1,14 +1,11 @@ ;;; feature/evil/+everywhere.el -*- lexical-binding: t; -*- -;; Here we *truly* lazy-load evil-collection's modules by ensuring its modules -;; do not load at startup (some of them, like buff-menu, help or elisp-mode are -;; loaded immediately, causing evil-collection to be pulled in). -;; -;; We load evil-collection ourselves for three reasons: +;; We load evil-collection ourselves for these reasons: ;; ;; 1. To truly lazy load it. Some of its modules, like the elisp-mode and ;; buff-menu ones are loaded immediately, because Emacs loads them -;; immediately. +;; immediately, pulling it all of evil-collection and sometimes other +;; packages. ;; 2. This ensures a predictable load order, versus lazy loading using :defer or ;; :after-call. This means users can use (after! org ...) and be sure that ;; their changes will override evil-collection's. From 69eb2cd40d6f23e7a5c322018e0fad5842cd0353 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 21:18:21 +0200 Subject: [PATCH 2740/4235] lang/python: improve pipenv support --- modules/lang/python/config.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index c1535849f..9fc9bc9de 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -130,7 +130,11 @@ (def-package! pipenv :commands pipenv-project-p - :hook (python-mode . pipenv-mode)) + :hook (python-mode . pipenv-mode) + :init (setq pipenv-with-projectile nil) + :config + (advice-add #'pipenv-activate :after-while #'+python|update-version) + (advice-add #'pipenv-deactivate :after-while #'+python|update-version)) (def-package! pyenv-mode From 9ddfca44d1b2e0e81f80ed6a0fd8d503a44b2dee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 21:45:53 +0200 Subject: [PATCH 2741/4235] Rename doom//reload-project -> doom/reload-project Conform command to new naming convention (removed the doom//abc convention). --- core/autoload/projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index d70fc0c11..216f7afb9 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -28,7 +28,7 @@ they are absolute." ;; ;;;###autoload -(defun doom//reload-project () +(defun doom/reload-project () "Reload the project root cache." (interactive) (projectile-invalidate-cache nil) From cd280e0fa94d2048d2a9951e005ceab596e21328 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 11 Aug 2018 22:56:31 +0200 Subject: [PATCH 2742/4235] Load ox-pandoc conditionally This allows users to disable it --- modules/lang/org/+export.el | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index 2386bb463..ac418cc66 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -12,22 +12,19 @@ path too.") (define-obsolete-variable-alias 'org-export-directory '+org-export-dir "2.1.0") -(def-package! ox-pandoc - :defer t - :config - (add-to-list 'org-export-backends 'pandoc nil #'eq) - (setq org-pandoc-options - '((standalone . t) - (mathjax . t) - (variable . "revealjs-url=https://cdn.jsdelivr.net/npm/reveal.js@3/")))) ;; (defun +org|init-export () (setq org-export-backends '(ascii html latex md) org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/")) - (when (executable-find "pandoc") - (require 'ox-pandoc)) + (when (and (executable-find "pandoc") + (require 'ox-pandoc nil t)) + (add-to-list 'org-export-backends 'pandoc nil #'eq) + (setq org-pandoc-options + '((standalone . t) + (mathjax . t) + (variable . "revealjs-url=https://cdn.jsdelivr.net/npm/reveal.js@3/")))) ;; Export to a central location by default or if target isn't in ;; `org-directory'. From c530866f0acd88cb713f7955b31695f9de47ae52 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 12 Aug 2018 02:41:20 +0200 Subject: [PATCH 2743/4235] Add option to load doom in vanilla sandbox This adds the option to run elisp in an environment where doom core & modules are loaded, but not your private modules or config. Also updates the vanilla sandbox text template. --- core/autoload/debug.el | 47 ++++++++++++++++++++++------------ core/templates/VANILLA_SANDBOX | 9 +++---- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 9f61ca392..27b69f36f 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -138,8 +138,9 @@ pasting into a bug report or discord." ;; Vanilla sandbox ;; -(defun doom--run-vanilla-sandbox () - "TODO" +(defvar doom--sandbox-init-doom-p nil) + +(defun doom--run-vanilla-sandbox (&optional load-doom-p) (interactive) (let ((contents (buffer-string)) (file (make-temp-file "/tmp/doom-eval-"))) @@ -147,31 +148,43 @@ pasting into a bug report or discord." (require 'pp) (require 'restart-emacs) (restart-emacs--launch-other-emacs - (list "-Q" - "--eval" - (prin1-to-string - `(setq user-emacs-directory ,doom-emacs-dir - package--init-file-ensured t - package-user-dir ,package-user-dir - package-archives ',package-archives - debug-on-error t)) - "-f" "package-initialize" - "--eval" (prin1-to-string `(unwind-protect (load ,file) (delete-file ,file))))))) + (append (list "-Q") + (if load-doom-p + (list "--eval" + (prin1-to-string + `(setq doom-private-dir "/tmp/does/not/exist" + doom-modules ,doom-modules)) + "-l" (shell-quote-argument user-init-file)) + (list "--eval" + (prin1-to-string + `(setq user-emacs-directory ,doom-emacs-dir + package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives)))) + (list "--eval" + (prin1-to-string + `(unwind-protect (load ,file) + (delete-file ,file)))))))) + +(defun doom--run-vanilla-doom-sandbox () + (interactive) + (doom--run-vanilla-sandbox t)) ;;;###autoload (defun doom/open-vanilla-sandbox () - "Open an Emacs Lisp buffer destinated to run in a blank Emacs session. + "Open an Emacs Lisp buffer destinated to run in a blank Emacs session (and +optionally load only Doom and its modules, without your private config). -This vanilla sandbox is started with emacs -Q, and provides a testbed for -debugging code without Doom standing in the way, and without sacrificing -access to the installed packages." +This provides a testbed for debugging code without Doom (or your private config) +standing in the way, and without sacrificing access to installed packages." (interactive) (let ((buf (get-buffer-create "*doom:vanilla-sandbox*"))) (with-current-buffer buf (emacs-lisp-mode) (local-set-key (kbd "C-c C-c") #'doom--run-vanilla-sandbox) + (local-set-key (kbd "C-c C-d") #'doom--run-vanilla-doom-sandbox) (local-set-key (kbd "C-c C-k") #'kill-this-buffer) - (setq header-line-format "C-c C-c to run the session / C-c C-k to abort it") + (setq header-line-format "C-c C-c to run the session / C-c C-d to run it with vanilla Doom loaded / C-c C-k to abort it") (setq-local default-directory doom-emacs-dir) (doom-template-insert "VANILLA_SANDBOX") (goto-char (point-max))) diff --git a/core/templates/VANILLA_SANDBOX b/core/templates/VANILLA_SANDBOX index 201ad51d1..520d8c49c 100644 --- a/core/templates/VANILLA_SANDBOX +++ b/core/templates/VANILLA_SANDBOX @@ -1,7 +1,6 @@ -;; Welcome to the vanilla sanbox! +;; Welcome to the vanilla sandbox! ;; -;; This is a test bed for Emacs Lisp to be run in a blank instance of Emacs -;; (free of Doom's clutches). This is equivalent to using emacs -Q with -;; package.el initialized and nothing else (so you have access to installed -;; plugins). +;; This is a test bed for running Emacs Lisp in either a vanilla Emacs session +;; free of Doom's clutches (C-c C-c), or in a vanilla Doom session free of your +;; private config (C-c C-d). From 36044fccc97a2a6fda8994a10a856ba0f3516182 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 12 Aug 2018 02:45:28 +0200 Subject: [PATCH 2744/4235] defconst -> defvar for global constants So they can be changed prior to being defined (e.g. for doom/open-vanilla-sandbox). --- core/core.el | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/core.el b/core/core.el index 2a834a7e5..66b7c0ad2 100644 --- a/core/core.el +++ b/core/core.el @@ -28,39 +28,39 @@ line or use --debug-init to enable this.") ;; -(defconst doom-emacs-dir +(defvar doom-emacs-dir (eval-when-compile (file-truename user-emacs-directory)) "The path to this emacs.d directory. Must end in a slash.") -(defconst doom-core-dir (concat doom-emacs-dir "core/") +(defvar doom-core-dir (concat doom-emacs-dir "core/") "Where essential files are stored.") -(defconst doom-modules-dir (concat doom-emacs-dir "modules/") +(defvar doom-modules-dir (concat doom-emacs-dir "modules/") "The main directory where Doom modules are stored.") -(defconst doom-local-dir (concat doom-emacs-dir ".local/") +(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).") -(defconst doom-etc-dir (concat doom-local-dir "etc/") +(defvar doom-etc-dir (concat doom-local-dir "etc/") "Directory for non-volatile storage. Use this for files that don't change much, like servers binaries, external dependencies or long-term shared data.") -(defconst doom-cache-dir (concat doom-local-dir "cache/") +(defvar doom-cache-dir (concat doom-local-dir "cache/") "Directory for volatile storage. Use this for files that change often, like cache files.") -(defconst doom-packages-dir (concat doom-local-dir "packages/") +(defvar doom-packages-dir (concat doom-local-dir "packages/") "Where package.el and quelpa plugins (and their caches) are stored.") -(defconst doom-docs-dir (concat doom-emacs-dir "docs/") +(defvar doom-docs-dir (concat doom-emacs-dir "docs/") "Where the Doom manual is stored.") -(defconst doom-private-dir +(defvar doom-private-dir (eval-when-compile (or (getenv "DOOMDIR") (let ((xdg-path @@ -72,10 +72,10 @@ Use this for files that change often, like cache files.") "Where your private customizations are placed. Must end in a slash. Respects XDG directory conventions if ~/.config/doom exists.") -(defconst doom-autoload-file (concat doom-local-dir "autoloads.el") +(defvar doom-autoload-file (concat doom-local-dir "autoloads.el") "Where `doom-reload-doom-autoloads' will generate its core autoloads file.") -(defconst doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el") +(defvar doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el") "Where `doom-reload-package-autoloads' will generate its package.el autoloads file.") From cbad18bf95d0e12cee05e4fa910882782bb199ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 12 Aug 2018 02:46:06 +0200 Subject: [PATCH 2745/4235] Fix wrong-type-arg hash-table-p error In the rare case your private init.el has no doom! block. --- core/core-modules.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/core-modules.el b/core/core-modules.el index 26068a2cc..e6cdf15e4 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -40,6 +40,9 @@ non-nil." (setq doom-init-modules-p t) (load! "init" doom-private-dir t) + (unless doom-modules + (setq doom-modules (make-hash-table :test #'equal))) + (maphash (lambda (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) From 69e992e54aaa98d065d51e8530ab5a0600b8033a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 12 Aug 2018 02:46:55 +0200 Subject: [PATCH 2746/4235] lang/python: minor reformatting --- modules/lang/python/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 9fc9bc9de..26276aa06 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -156,7 +156,9 @@ (defun +python-current-pyvenv () pyvenv-virtual-env-name) (add-hook 'pyvenv-post-activate-hooks #'+python|update-version) (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version) - (add-to-list '+python-mode-line-indicator '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) 'append)) + (add-to-list '+python-mode-line-indicator + '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) + 'append)) (def-package! conda @@ -190,6 +192,5 @@ (add-hook 'conda-postactivate-hook #'+python|update-version) (add-hook 'conda-postdeactivate-hook #'+python|update-version) (add-to-list '+python-mode-line-indicator - '(conda-env-current-name - (" conda:" conda-env-current-name)) + '(conda-env-current-name (" conda:" conda-env-current-name)) 'append)) From 36ac08f3fa5e1d078151fc7f7e7f31d77e242380 Mon Sep 17 00:00:00 2001 From: Marcelo dos Santos Date: Sun, 12 Aug 2018 13:13:25 -0300 Subject: [PATCH 2747/4235] Company-capf needs to be the first --- modules/lang/racket/config.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 3d0d9c4a8..42efe2b52 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -5,8 +5,6 @@ :config (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) - (set-company-backend! 'racket-mode - '(company-abbrev company-dabbrev-code company-dabbrev company-files)) (set-lookup-handlers! 'racket-mode :definition #'racket-describe :documentation #'racket-doc) @@ -19,6 +17,14 @@ :symbols '(("#true" "#false"))) (setq racket-smart-open-bracket-enable t) + (when (featurep! :completion company) + (setq-local company-backends + '(company-capf + company-abbrev + company-dabbrev-code + company-dabbrev + company-files + company-yasnippet))) (add-hook! racket-mode #'(;; 3rd-party functionality From d692718ab41d1571331e67e363ad7572048b7cbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 12 Aug 2018 18:25:09 +0200 Subject: [PATCH 2748/4235] Fix selecting deleted window error Caused by focus/unfocus modeline fixes accessing possibly dead buffers. --- modules/ui/modeline/config.el | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index d4fd16ee8..0df7c38e4 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -180,18 +180,21 @@ buffers.") (defvar +modeline-remap-face-cookies nil) (defun +modeline|focus-all-windows (&rest _) - (dolist (buf +modeline-remap-face-cookies) - (with-current-buffer (car buf) - (face-remap-remove-relative (cdr buf))))) + (cl-loop for (buffer . cookie) in +modeline-remap-face-cookies + if (buffer-live-p buffer) + do (with-current-buffer buffer + (face-remap-remove-relative cookie)))) (defun +modeline|unfocus-all-windows (&rest _) (setq +modeline-remap-face-cookies - (mapcar (lambda (window) - (with-current-buffer (window-buffer window) - (cons (current-buffer) - (face-remap-add-relative 'mode-line - 'mode-line-inactive)))) - (window-list)))) + (cl-loop for window in (window-list) + for buffer = (window-buffer window) + if (buffer-live-p buffer) + collect + (with-current-buffer buffer + (cons buffer + (face-remap-add-relative 'mode-line + 'mode-line-inactive)))))) (add-hook 'focus-in-hook #'+modeline|focus-all-windows) (add-hook 'focus-out-hook #'+modeline|unfocus-all-windows) From 2f7282af12e1624a2b29ab75e0669794ab174701 Mon Sep 17 00:00:00 2001 From: Marcelo dos Santos Date: Sun, 12 Aug 2018 13:52:35 -0300 Subject: [PATCH 2749/4235] Input-method optional --- modules/lang/racket/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 42efe2b52..fe4b3770e 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -1,7 +1,7 @@ ;;; lang/racket/config.el -*- lexical-binding: t; -*- (def-package! racket-mode - :hook ((racket-mode racket-repl-mode) . racket-unicode-input-method-enable) + :hook (racket-repl-mode . racket-unicode-input-method-enable) :config (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) @@ -70,4 +70,5 @@ :n "a" #'racket-align :n "A" #'racket-unalign :nv ";" #'comment-dwim - :nv "\\" #'indent-region)) + :nv "\\" #'indent-region + :n "i" #'racket-unicode-input-method-enable)) From f143a03221d66e2451e17f7907aea5977e53eda6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 02:59:38 +0200 Subject: [PATCH 2750/4235] Use set-company-backend! Fixes incorrect usage of setq-local in a global context. --- modules/lang/racket/config.el | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index fe4b3770e..5d75f8300 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -5,6 +5,8 @@ :config (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) + (set-company-backend! 'racket-mode + '(company-capf company-abbrev company-dabbrev-code company-dabbrev company-files company-yasnippet)) (set-lookup-handlers! 'racket-mode :definition #'racket-describe :documentation #'racket-doc) @@ -17,14 +19,6 @@ :symbols '(("#true" "#false"))) (setq racket-smart-open-bracket-enable t) - (when (featurep! :completion company) - (setq-local company-backends - '(company-capf - company-abbrev - company-dabbrev-code - company-dabbrev - company-files - company-yasnippet))) (add-hook! racket-mode #'(;; 3rd-party functionality From b0c71c2492892c410fb9c5459129da39e6f26615 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 01:51:34 +0200 Subject: [PATCH 2751/4235] Add +helm/workspace-mini command & bind to SPC b b + Rename +helm/persp-buffer-list to +helm/workspace-buffer-list + Silence compiler warnings when feature/workspaces is disabled + Throw error if feature/workspaces is disabled and these commands are called. --- modules/completion/helm/autoload/helm.el | 19 ++++++++++++++++--- modules/completion/helm/config.el | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 655e635f3..7d0e31e85 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -19,11 +19,24 @@ #'helm-projectile-find-file))) ;;;###autoload -(defun +helm/persp-buffer-list () - "A version of `helm-buffers-list', but with its buffer list restricted to the +(defun +helm/workspace-buffer-list () + "A version of `helm-buffers-list' with its buffer list restricted to the current workspace." (interactive) - (with-persp-buffer-list nil (helm-buffers-list))) + (unless (featurep! :feature workspaces) + (user-error "This command requires the :feature workspaces module")) + (with-no-warnings + (with-persp-buffer-list nil (helm-buffers-list)))) + +;;;###autoload +(defun +helm/workspace-mini () + "A version of `helm-mini' with its buffer list restricted to the current +workspace." + (interactive) + (unless (featurep! :feature workspaces) + (user-error "This command requires the :feature workspaces module")) + (with-no-warnings + (with-persp-buffer-list nil (helm-mini)))) ;; diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 02159e05f..5ad874feb 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -49,7 +49,7 @@ be negative.") [remap imenu-anywhere] #'helm-imenu-anywhere [remap imenu] #'helm-semantic-or-imenu [remap noop-show-kill-ring] #'helm-show-kill-ring - [remap persp-switch-to-buffer] #'+helm/persp-buffer-list + [remap persp-switch-to-buffer] #'+helm/workspace-mini [remap switch-to-buffer] #'helm-buffers-list [remap projectile-find-file] #'+helm/projectile-find-file [remap projectile-recentf] #'helm-projectile-recentf From 7d617f1541f769deac2c9d6e5593db066d4051b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 01:59:25 +0200 Subject: [PATCH 2752/4235] Refactor helm project search API + Heavily refactored +helm-file-search + Removed -z flag from all engines by default + Changed the behavior of the universal argument for from-cwd interactive commands (e.g. +helm/rg-from-cwd). It used to enable recursive searches, but now enables inclusion of hidden and compressed files in the search instead. *-from-cwd searches are always recursive now. + Now generates +helm/X and +helm/X-from-cwd commands dynamically. + Split +helm/project-search into +helm/project-search-from-cwd. Universal arguments are passed from these commands to their delegated engine command. --- modules/completion/helm/autoload/helm.el | 235 +++++++++++------------ 1 file changed, 116 insertions(+), 119 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 7d0e31e85..40b91513a 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -43,6 +43,66 @@ workspace." ;; Project search ;; +(defun +helm-ag-search-args (all-files-p recursive-p) + (list "ag -S" + (if IS-WINDOWS "--vimgrep" "--nocolor --nogroup") + (if all-files-p "-z -a") + (unless recursive-p "--depth 1"))) + +(defun +helm-rg-search-args (all-files-p recursive-p) + (list "rg -S --no-heading --line-number --color never" + (when all-files-p "-z -uu") + (unless recursive-p "--maxdepth 1"))) + +(defun +helm-pt-search-args (all-files-p recursive-p) + (list "pt -S --nocolor --nogroup -e" + (if all-files-p "-z -a") + (unless recursive-p "--depth 1"))) + +;; +(defun +helm--grep-source () + (helm-build-async-source (capitalize (helm-grep-command t)) + :header-name (lambda (_name) "Helm Projectile Grep (C-c ? Help)") + :candidates-process #'helm-grep-collect-candidates + :filter-one-by-one #'helm-grep-filter-one-by-one + :candidate-number-limit 9999 + :nohighlight t + :keymap helm-grep-map + :history 'helm-grep-history + :action (apply #'helm-make-actions helm-projectile-grep-or-ack-actions) + :persistent-action 'helm-grep-persistent-action + :persistent-help "Jump to line (`C-u' Record in mark ring)" + :requires-pattern 2)) + +(defun +helm--grep-search (directory query prompt &optional all-files-p recursive-p) + (let* ((default-directory directory) + (helm-ff-default-directory directory) + (helm-grep-in-recurse recursive-p) + (helm-grep-ignored-files + (unless all-files-p + (cl-union (projectile-ignored-files-rel) grep-find-ignored-files))) + (helm-grep-ignored-directories + (unless all-files-p + (cl-union (mapcar 'directory-file-name (projectile-ignored-directories-rel)) + grep-find-ignored-directories))) + (helm-grep-default-command + (if (and nil (eq (projectile-project-vcs) 'git)) + (format "git --no-pager grep --no-color -n%%c -e %%p %s -- %%f" + (if recursive-p "" "--max-depth 1 ")) + (format "grep -si -a%s %%e -n%%cH -e %%p %%f %s" + (if recursive-p " -R" "") + (if recursive-p "." "./*")))) + (helm-grep-default-recurse-command helm-grep-default-command)) + (setq helm-source-grep (+helm--grep-source)) + (helm :sources 'helm-source-grep + :input query + :prompt prompt + :buffer "*helm grep*" + :default-directory directory + :keymap helm-grep-map + :history 'helm-grep-history + :truncate-lines helm-grep-truncate-lines))) + ;;;###autoload (cl-defun +helm-file-search (engine &key query in all-files (recursive t)) "Conduct a file search using ENGINE, which can be any of: rg, ag, pt, and @@ -65,13 +125,12 @@ order. (helm-ag--default-directory directory) (helm-ag--default-target (list directory)) (engine (or engine - (cl-loop for tool in +helm-project-search-engines - if (executable-find (symbol-name tool)) - return tool) + (cl-find-if #'executable-find +helm-project-search-engines + :key #'symbol-name) (and (or (executable-find "grep") (executable-find "git")) 'grep) - (error "No search engine specified (is ag, rg, pt or git installed?)"))) + (user-error "No search engine specified (is ag, rg, pt or git installed?)"))) (query (or query (when (use-region-p) (let ((beg (or (bound-and-true-p evil-visual-beginning) (region-beginning))) @@ -81,67 +140,18 @@ order. "")) (prompt (format "%s%%s %s" (symbol-name engine) - (cond ((equal directory default-directory) + (cond ((file-equal-p directory default-directory) "./") - ((equal directory project-root) + ((file-equal-p directory project-root) (projectile-project-name)) - (t - (file-relative-name directory project-root))))) + ((file-relative-name directory project-root))))) (command (pcase engine - ('grep - (let* ((helm-ff-default-directory directory) - (helm-grep-in-recurse recursive) - (helm-grep-ignored-files - (unless all-files - (cl-union (projectile-ignored-files-rel) grep-find-ignored-files))) - (helm-grep-ignored-directories - (unless all-files - (cl-union (mapcar 'directory-file-name (projectile-ignored-directories-rel)) - grep-find-ignored-directories))) - (helm-grep-default-command - (if (and nil (eq (projectile-project-vcs) 'git)) - (format "git --no-pager grep --no-color -n%%c -e %%p %s -- %%f" - (if recursive "" "--max-depth 1 ")) - (format "grep -si -a%s %%e -n%%cH -e %%p %%f %s" - (if recursive " -R" "") - (if recursive "." "./*")))) - (helm-grep-default-recurse-command helm-grep-default-command)) - (setq helm-source-grep - (helm-build-async-source (capitalize (helm-grep-command t)) - :header-name (lambda (_name) "Helm Projectile Grep (C-c ? Help)") - :candidates-process #'helm-grep-collect-candidates - :filter-one-by-one #'helm-grep-filter-one-by-one - :candidate-number-limit 9999 - :nohighlight t - :keymap helm-grep-map - :history 'helm-grep-history - :action (apply #'helm-make-actions helm-projectile-grep-or-ack-actions) - :persistent-action 'helm-grep-persistent-action - :persistent-help "Jump to line (`C-u' Record in mark ring)" - :requires-pattern 2)) - (helm :sources 'helm-source-grep - :input query - :prompt prompt - :buffer "*helm grep*" - :default-directory directory - :keymap helm-grep-map - :history 'helm-grep-history - :truncate-lines helm-grep-truncate-lines)) - (cl-return t)) - (`ag - (list "ag -zS" - (if IS-WINDOWS "--vimgrep" "--nocolor --nogroup") - (when all-files "-a") - (unless recursive "--depth 1"))) - (`rg - (list "rg -zS --no-heading --line-number --color never" - (when all-files "-uu") - (unless recursive "--maxdepth 1"))) - (`pt - (list "pt -zS --nocolor --nogroup -e" - (when all-files "-a") - (unless recursive "--depth 1"))))) + (`ag (+helm-ag-search-args all-files recursive)) + (`rg (+helm-rg-search-args all-files recursive)) + (`pt (+helm-pt-search-args all-files recursive)) + ('grep (+helm--grep-search directory query prompt all-files recursive) + (cl-return t)))) (helm-ag-base-command (string-join command " "))) (if (and (eq engine 'ag) (equal query "")) @@ -156,67 +166,54 @@ order. :keymap helm-ag-map :history 'helm-ag--helm-history)))) +(defun +helm--get-command (format) + (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines :from-end t) + if (executable-find (symbol-name tool)) + return (intern (format format tool)))) + ;;;###autoload -(defun +helm/project-search (arg) - "Performs a project search using the first available search backend from a -list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), -preform search from current directory." +(defun +helm/project-search (&optional all-files-p) + "Performs a project search from the project root. + +Uses the first available search backend from `+helm-project-search-engines'. If +ALL-FILES-P (universal argument), include all files, even hidden or compressed +ones, in the search." (interactive "P") (call-interactively - (or (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines :from-end t) - if (executable-find (symbol-name tool)) - return (intern (format "+helm/%s%s" tool (if arg "-from-cwd" "")))) - (if arg - #'+helm/grep-from-cwd - #'+helm/grep)))) + (or (+helm--get-command "+helm/%s") + #'+helm/grep))) + +;;;###autoload +(defun +helm/project-search-from-cwd (&optional all-files-p) + "Performs a project search recursively from the current directory. + +Uses the first available search backend from `+helm-project-search-engines'. If +ALL-FILES-P (universal argument), include all files, even hidden or compressed +ones." + (interactive "P") + (call-interactively + (or (+helm--get-command "+helm/%s-from-cwd") + #'+helm/grep-from-cwd))) + ;; Relative to project root -;;;###autoload -(defun +helm/rg (all-files-p &optional query directory) - "TODO" - (interactive "P") - (+helm-file-search 'rg :query query :in directory :all-files all-files-p)) - -;;;###autoload -(defun +helm/ag (all-files-p &optional query directory) - "TODO" - (interactive "P") - (+helm-file-search 'ag :query query :in directory :all-files all-files-p)) - -;;;###autoload -(defun +helm/pt (all-files-p &optional query directory) - "TODO" - (interactive "P") - (+helm-file-search 'pt :query query :in directory :all-files all-files-p)) - -;;;###autoload -(defun +helm/grep (all-files-p &optional query directory) - "TODO" - (interactive "P") - (+helm-file-search 'grep :query query :in directory :all-files all-files-p)) - -;; Relative to current directory -;;;###autoload -(defun +helm/rg-from-cwd (recurse-p &optional query) - "TODO" - (interactive "P") - (+helm-file-search 'rg :query query :in default-directory :recursive recurse-p)) - -;;;###autoload -(defun +helm/ag-from-cwd (recurse-p &optional query) - "TODO" - (interactive "P") - (+helm-file-search 'ag :query query :in default-directory :recursive recurse-p)) - -;;;###autoload -(defun +helm/pt-from-cwd (recurse-p &optional query) - "TODO" - (interactive "P") - (+helm-file-search 'pt :query query :in default-directory :recursive recurse-p)) - -;;;###autoload -(defun +helm/grep-from-cwd (recurse-p &optional query) - "TODO" - (interactive "P") - (+helm-file-search 'grep :query query :in default-directory :recursive recurse-p)) +;;;###autoload (autoload '+helm/rg "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/rg-from-cwd "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/ag "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/ag-from-cwd "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/pt "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/pt-from-cwd "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/grep "completion/helm/autoload/helm") +;;;###autoload (autoload '+helm/grep-from-cwd "completion/helm/autoload/helm") +(dolist (engine (cl-remove-duplicates +helm-project-search-engines :from-end t)) + (defalias (intern (format "+helm/%s" engine)) + (lambda (all-files-p &optional query directory) + (interactive "P") + (+helm-file-search engine :query query :in directory :all-files all-files-p)) + "TODO") + (defalias (intern (format "+helm/%s-from-cwd" engine)) + (lambda (all-files-p &optional query directory) + (interactive "P") + (+helm-file-search engine :query query :in default-directory :all-files all-files-p)) + "TODO")) From 25d9786edf7dc91b9cebc9ddcc1e3375217228d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 03:45:58 +0200 Subject: [PATCH 2753/4235] Add early-init-file support to doom/profile-emacs #788 And fix wrong-type-argument: stringp errors when running esup. Also ensure that doom|run-all-startup-hooks sets after-init-time. --- core/autoload/debug.el | 27 ++++++++++++++++----------- core/core.el | 4 +++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 27b69f36f..c7d9d32c1 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -290,17 +290,22 @@ If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." (setq esup-server-process (esup-server-create (esup-select-port))) (setq esup-server-port (process-contact esup-server-process :service)) (message "esup process started on port %s" esup-server-port) - (let ((process-args `("*esup-child*" - "*esup-child*" - ,esup-emacs-path - "-q" - "-L" ,esup-load-path - "-l" "esup-child" - ,(format "--eval=(esup-child-run \"%s\" \"%s\" %d)" - init-file - esup-server-port - esup-depth) - "--eval=(doom|run-all-startup-hooks)"))) + (let ((process-args + (append `("*esup-child*" + "*esup-child*" + ,esup-emacs-path + "-Q" + "--eval=(setq after-init-time nil)" + "-L" ,esup-load-path) + (when (bound-and-true-p early-init-file) + `("-l" ,early-init-file)) + `("-l" "esup-child" + ,(format "--eval=(let ((load-file-name \"%s\")) (esup-child-run \"%s\" \"%s\" %d))" + init-file + init-file + esup-server-port + esup-depth) + "--eval=(doom|run-all-startup-hooks)")))) (when esup-run-as-batch-p (setq process-args (append process-args '("--batch")))) (setq esup-child-process (apply #'start-process process-args))) diff --git a/core/core.el b/core/core.el index 66b7c0ad2..ba79a2fca 100644 --- a/core/core.el +++ b/core/core.el @@ -300,7 +300,9 @@ If RETURN-P, return the message as a string instead of displaying it." -q or -Q, for example: emacs -Q -l init.el -f doom|run-all-startup-hooks" - (dolist (hook (list 'after-init-hook 'delayed-warnings-hook + (run-hook-wrapped 'after-init-hook #'doom-try-run-hook) + (setq after-init-time (current-time)) + (dolist (hook (list 'delayed-warnings-hook 'emacs-startup-hook 'term-setup-hook 'window-setup-hook)) (run-hook-wrapped hook #'doom-try-run-hook))) From b149dcffd40d17f433527156ef3be036c79c5d4c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 03:49:55 +0200 Subject: [PATCH 2754/4235] Replace esup with doom/profile-emacs #788 Since esup (called directly) doesn't work with Doom. --- core/autoload/debug.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index c7d9d32c1..02f0d38b8 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -311,3 +311,5 @@ If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." (setq esup-child-process (apply #'start-process process-args))) (set-process-sentinel esup-child-process 'esup-child-process-sentinel))) +;;;###autoload +(advice-add #'esup :override #'doom/profile-emacs) From 5714ff423a12ef2d4fb08b4e842adf8f9b58441e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 14:00:51 +0200 Subject: [PATCH 2755/4235] Fix evil jumplist after jumping to ag match helm-ag would formerly add multiple entries to the jump list. It now only adds one, and recenters the window when jumping to an ag match. --- core/autoload/ui.el | 4 ++++ modules/completion/helm/config.el | 4 +++- modules/feature/evil/config.el | 11 +++++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 2186efc93..af357eeaf 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -120,3 +120,7 @@ to a new one." (when (fboundp 'powerline-reset) (powerline-reset))) (error "Problem loading theme %s" x))) + +;;;###autoload +(defun doom*recenter (&rest _) + (recenter)) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 5ad874feb..9307918d3 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -150,7 +150,9 @@ be negative.") (after! helm-ag (map! :map helm-ag-edit-map :n "RET" #'compile-goto-error) (define-key helm-ag-edit-map [remap quit-window] #'helm-ag--edit-abort) - (set-popup-rule! "^\\*helm-ag-edit" :size 0.35 :ttl 0 :quit nil)) + (set-popup-rule! "^\\*helm-ag-edit" :size 0.35 :ttl 0 :quit nil) + ;; Recenter after jumping to match + (advice-add #'helm-ag--find-file-action :after-while #'doom*recenter)) ;; `helm-bookmark' diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 240f5b7b4..8b495be87 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -114,10 +114,13 @@ (advice-add #'evil-window-split :override #'+evil*window-split) (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) - ;; Ensure jump points are created - (defun +evil*set-jump (&rest _) - (evil-set-jump)) - (advice-add #'counsel-git-grep-action :before #'+evil*set-jump) + (defun +evil*set-jump (orig-fn &rest args) + "Set a jump point and ensure ORIG-FN doesn't set any new jump points." + (evil-set-jump) + (let ((evil--jumps-jumping t)) + (apply orig-fn args))) + (advice-add #'counsel-git-grep-action :around #'+evil*set-jump) + (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) ;; --- custom interactive codes ----------- ;; These arg types will highlight matches in the current buffer From 90fa4a8c3792a1d7552b0e5d6e9e928eab90af49 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 14:02:49 +0200 Subject: [PATCH 2756/4235] Add helm-ag-fuzzy-match support --- modules/completion/helm/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 9307918d3..9490b9f74 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -89,6 +89,7 @@ be negative.") (setq helm-mode-fuzzy-match fuzzy helm-completion-in-region-fuzzy-match fuzzy helm-M-x-fuzzy-match fuzzy + helm-ag-fuzzy-match fuzzy helm-apropos-fuzzy-match fuzzy helm-bookmark-show-location fuzzy helm-buffers-fuzzy-matching fuzzy From 5663778e36c3b6167bb283c66f3a3bebd363ca18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 15:21:03 +0200 Subject: [PATCH 2757/4235] Make TAB respect org-cycle-separator-lines #800 outline-toggle-children and org-cycle-hide-drawers didn't respect org-cycle-separator-lines. --- modules/lang/org/autoload/org.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 11f7ec9f1..3621d4eec 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -398,15 +398,16 @@ with `org-cycle')." (unless (eq this-command 'org-shifttab) (save-excursion (org-beginning-of-line) - (when (and (org-at-heading-p) - (or org-cycle-open-archived-trees - (not (member org-archive-tag (org-get-tags)))) - (or (not arg) - (outline-invisible-p (line-end-position)))) - (outline-toggle-children) - (unless (outline-invisible-p (line-end-position)) - (org-cycle-hide-drawers 'subtree)) - t)))) + (let (invisible-p) + (when (and (org-at-heading-p) + (or org-cycle-open-archived-trees + (not (member org-archive-tag (org-get-tags)))) + (or (not arg) + (setq invisible-p (outline-invisible-p (line-end-position))))) + (unless invisible-p + (setq org-cycle-subtree-status 'subtree)) + (org-cycle-internal-local) + t))))) ;;;###autoload (defun +org|remove-occur-highlights () From e0f2c260a1a303e11c0ef81c517dd725a90f7788 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 16:07:10 +0200 Subject: [PATCH 2758/4235] Update lang/nix to reflect changes upstream + Restore nix-mode entry in auto-mode-alist + Add .drv entry to auto-mode-alist + Minor refactor for def-package! blocks --- modules/lang/nix/config.el | 13 +++++++++---- modules/lang/nix/packages.el | 1 - 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index b03095541..ca0ea6adc 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -1,8 +1,10 @@ ;;; lang/nix/config.el -*- lexical-binding: t; -*- -(after! nix-mode +(def-package! nix-mode + :mode "\\.nix\\'" + :config (set-company-backend! 'nix-mode 'company-nixos-options) - + (map! :map nix-mode-map :localleader :n "f" #'nix-update-fetch @@ -14,8 +16,11 @@ (:when (featurep! :completion helm) :n "o" #'helm-nixos-options))) +(def-package! nix-drv-mode + :mode "\\.drv\\'") + (def-package! nix-update - :commands (nix-update-fetch)) + :commands nix-update-fetch) (def-package! nix-repl - :commands (nix-repl-show)) + :commands nix-repl-show) diff --git a/modules/lang/nix/packages.el b/modules/lang/nix/packages.el index 47ebff527..eb3256b84 100644 --- a/modules/lang/nix/packages.el +++ b/modules/lang/nix/packages.el @@ -2,7 +2,6 @@ ;;; lang/nix/packages.el (package! nix-mode) - (package! nix-update) (when (featurep! :completion company) From 9c4d1c3b02c0288f269f5d418a5a430fd37ed722 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 18:12:50 +0200 Subject: [PATCH 2759/4235] lang/php: replace ac-php with phpactor.el phpactor is superior to phpctags, though it requires more setup. phpactors.el is superior to ac-php, though it is in alpha. --- modules/lang/php/autoload.el | 11 +++++ modules/lang/php/config.el | 82 +++++++++++++++++++++++------------- modules/lang/php/packages.el | 4 +- 3 files changed, 64 insertions(+), 33 deletions(-) diff --git a/modules/lang/php/autoload.el b/modules/lang/php/autoload.el index 93b68eb43..012d7e0b3 100644 --- a/modules/lang/php/autoload.el +++ b/modules/lang/php/autoload.el @@ -2,6 +2,17 @@ (defvar +php-composer-conf (make-hash-table :test 'equal)) +;;;###autoload +(defun +php-company-backend (command &optional arg &rest _ignored) + "A delegating company-backend that uses `company-phpactor' if phpactor is +available and installed, or `php-extras-company' otherwise." + (cond ((and (require 'company-phpactor nil t) + (ignore-errors (phpactor-find-executable))) + (company-phpactor command arg)) + ((and (require 'php-extras nil t) + (file-exists-p (concat php-extras-eldoc-functions-file ".el"))) + (php-extras-company command arg)))) + ;;;###autoload (defun +php-composer-conf (&optional project-root refresh-p) "Retrieve the contents of composer.json as an alist. If REFRESH-P is non-nil diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 1ce136079..bb5aaeddf 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -1,7 +1,5 @@ ;;; lang/php/config.el -*- lexical-binding: t; -*- -(defvar +php--company-backends nil) - (def-package! php-mode :mode "\\.inc\\'" :config @@ -12,13 +10,12 @@ (set-repl-handler! 'php-mode #'php-boris) (set-lookup-handlers! 'php-mode :documentation #'php-search-documentation) - ;; ac-php provides custom autocompletion, php-extras provides autocompletion - ;; for built-in libraries - (when +php--company-backends - (set-company-backend! 'php-mode +php--company-backends)) + ;; `+php-company-backend' uses `company-phpactor', `php-extras-company' or + ;; `company-dabbrev-code', in that order. + (set-company-backend! 'php-mode '+php-company-backend 'company-dabbrev-code) ;; Use the smallest `sp-max-pair-length' for optimum `smartparens' performance - (setq-hook! 'php-mode-hook sp-max-pair-length 6) + (setq-hook! 'php-mode-hook sp-max-pair-length 5) (sp-with-modes '(php-mode) (sp-local-pair "" :post-handlers '(("| " "SPC" "=") ("||\n[i]" "RET") ("[d2]" "p"))) @@ -26,34 +23,63 @@ (map! :map php-mode-map :localleader - (:prefix "r" - :n "cv" #'php-refactor--convert-local-to-instance-variable - :n "u" #'php-refactor--optimize-use - :v "xm" #'php-refactor--extract-method - :n "rv" #'php-refactor--rename-local-variable) - (:prefix "t" - :n "r" #'phpunit-current-project - :n "a" #'phpunit-current-class - :n "s" #'phpunit-current-test))) + :prefix "t" + :n "r" #'phpunit-current-project + :n "a" #'phpunit-current-class + :n "s" #'phpunit-current-test)) -(def-package! hack-mode - :when (featurep! +hack) - :mode "\\.hh$") +(def-package! phpactor + :after php-mode + :config + (set-lookup-handlers! 'php-mode + :definition #'phpactor-goto-definition) + + ;; TODO PR these for phpactor.el? + ;; company-phpactor breaks company if executable doesn't exist + (defun +php*company-phpactor-fail-silently (orig-fn &rest args) + (when (phpactor-find-executable) + (apply orig-fn args))) + (advice-add #'company-phpactor :around #'+php*company-phpactor-fail-silently) + + ;; `phpactor-get-working-dir' throws stringp errors if not in a project. + (defun +php*project-root (&rest _) + (setq phpactor-working-dir + (or phpactor-working-dir + (php-project-get-root-dir) + (doom-project-root)))) + (advice-add #'phpactor-get-working-dir :before #'+php*project-root) + + (map! :map php-mode-map + :localleader + :prefix "r" + :n "cc" #'phpactor-copy-class + :n "mc" #'phpactor-move-class + :v "oi" #'phpactor-offset-info + :n "t" #'phpactor-transform + :n "ic" #'phpactor-import-class)) (def-package! php-refactor-mode - :hook php-mode) + :hook php-mode + :config + (map! :map php-refactor-mode-map + :localleader + :prefix "r" + :n "cv" #'php-refactor--convert-local-to-instance-variable + :n "u" #'php-refactor--optimize-use + :v "xm" #'php-refactor--extract-method + :n "rv" #'php-refactor--rename-local-variable)) (def-package! php-extras :after php-mode - :preface (advice-add #'php-extras-company-setup :override #'ignore) - :init (add-to-list '+php--company-backends 'php-extras-company nil #'eq) + :preface + ;; We'll set up company support ourselves + (advice-add #'php-extras-company-setup :override #'ignore) :config (setq php-extras-eldoc-functions-file (concat doom-etc-dir "php-extras-eldoc-functions")) - ;; Make expensive php-extras generation async (unless (file-exists-p (concat php-extras-eldoc-functions-file ".el")) (message "Generating PHP eldoc files...") @@ -67,13 +93,9 @@ (message "PHP eldoc updated!"))))) -(def-package! company-php - :when (featurep! :completion company) - :commands (ac-php-remake-tags ac-php-remake-tags-all) - :init - (add-to-list '+php--company-backends 'company-ac-php-backend nil #'eq) - (add-hook 'php-mode-hook #'+php|init-ac-php-core-eldoc) - (setq ac-php-tags-path (concat doom-cache-dir "ac-php/"))) +(def-package! hack-mode + :when (featurep! +hack) + :mode "\\.hh$") ;; diff --git a/modules/lang/php/packages.el b/modules/lang/php/packages.el index 553413d80..6324ca750 100644 --- a/modules/lang/php/packages.el +++ b/modules/lang/php/packages.el @@ -5,11 +5,9 @@ (package! php-extras :recipe (:fetcher github :repo "arnested/php-extras")) (package! php-mode) (package! php-refactor-mode) +(package! phpactor :recipe (:fetcher github :repo "emacs-php/phpactor.el" :files ("*.el"))) (package! phpunit) -(when (featurep! :completion company) - (package! company-php)) - (when (featurep! +hack) (package! hack-mode :recipe (:fetcher github :repo "hhvm/hack-mode"))) From 4c18fc81af3289b4d4cebe36ddd3503a6b895734 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 18:21:07 +0200 Subject: [PATCH 2760/4235] Ensure switch hooks don't reference dead buffers --- core/core-ui.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9d8752713..34c22b0a6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -315,8 +315,9 @@ from the default." (let ((doom-inhibit-switch-buffer-hooks t)) (run-hooks 'doom-exit-buffer-hook) (prog1 (apply orig-fn buffer-or-name args) - (with-current-buffer buffer-or-name - (run-hooks 'doom-enter-buffer-hook)))))) + (when (buffer-live-p (get-buffer buffer-or-name)) + (with-current-buffer buffer-or-name + (run-hooks 'doom-enter-buffer-hook))))))) (defun doom|init-custom-hooks (&optional disable) (dolist (spec '((select-window . doom*switch-window-hooks) From 391ac1cae54d6d413aa1e004a6f324f6e72e306c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 18:21:41 +0200 Subject: [PATCH 2761/4235] Leverage cache in tide-project-root advise --- modules/lang/javascript/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 711f9fb2d..787e1528a 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -120,4 +120,4 @@ prioritize project-local packages over global ones." (or tide-project-root (or (locate-dominating-file default-directory "tsconfig.json") (locate-dominating-file default-directory "jsconfig.json")) - (doom-project-root 'nocache))) + (doom-project-root))) From 2cc5d223fec078d2f762add5741dd6fef4acb18e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 18:24:58 +0200 Subject: [PATCH 2762/4235] Rewrite how magit windows/popups are managed The old policy was to invoke magit in fullscreen, but in practice, I've found myself wanting to peek at other buffers (maybe even notes) while I manage my project in version control. So this change introduces two big changes and one fix: + Instead of a full-frame policy, we use full-column. e.g. Invoking magit-status will take up a full column of windows (and will restore them when you quit). + Popups are displayed below the current window if called from a magit buffer, otherwise as a popup at the bottom of the frame. + Fixes popups opening in a random window if called from a magit buffer in a popup. This is only a start and needs more testing. --- modules/tools/magit/autoload.el | 52 +++++++++++++++------------------ modules/tools/magit/config.el | 5 ++-- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index ad15fa351..3d0d44e04 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -1,7 +1,7 @@ ;;; tools/magit/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +magit-display-buffer-fullscreen (buffer) +(defun +magit-display-buffer (buffer) "Like `magit-display-buffer-fullframe-status-v1' with two differences: 1. Magit sub-buffers that aren't spawned from a status screen are opened as @@ -11,41 +11,37 @@ (let ((buffer-mode (buffer-local-value 'major-mode buffer))) (display-buffer buffer (cond - ;; If opened from an eshell window, use the same window. - ((derived-mode-p 'eshell-mode) + ;; If opened from an eshell window or popup, use the same window. + ((or (derived-mode-p 'eshell-mode) + (eq (window-dedicated-p) 'side)) '(display-buffer-same-window)) - ;; If opened from a magit window from a popup, open the results - ;; full screen. We want to see it all. - ((eq (window-dedicated-p) 'side) - '(magit--display-buffer-fullframe)) - ;; From a commit or magit-log buffer, open detail buffers below - ;; this one. + ;; Open target buffers below the current one (we want previous + ;; magit windows to be visible; especially magit-status). ((or (bound-and-true-p git-commit-mode) - (derived-mode-p 'magit-log-mode)) - '(display-buffer-below-selected . ((window-height . 0.7)))) - ;; From a magit buffer, set aside the magit-status window if it - ;; exists (we want it always to be visible), then display the - ;; target buffer in the current window. - ((derived-mode-p 'magit-mode) - (when (eq major-mode 'magit-status-mode) - (display-buffer-in-side-window - (current-buffer) '((side . left) - (window-width . 0.35) - (window-parameters (quit))))) - '(display-buffer-same-window)) - ;; If the target buffer opening is a commit, revision or diff, we - ;; want to see the whole thing. - ((or (buffer-local-value 'git-commit-mode buffer) - (memq buffer-mode '(magit-revision-mode magit-diff-mode))) - '(magit--display-buffer-fullframe)) + (derived-mode-p 'magit-mode)) + (let ((size (cond ((eq buffer-mode 'magit-process-mode) 0.35) + ((bound-and-true-p git-commit-mode) 0.7) + (t 0.9)))) + `(display-buffer-below-selected . ((window-height . ,size))))) ;; log/stash/process buffers, unless opened from a magit-status ;; window, should be opened in popups. ((memq buffer-mode '(magit-process-mode magit-log-mode magit-stash-mode)) '(display-buffer-in-side-window)) - ;; Last resort: plain old fullscreen. - ('(magit--display-buffer-fullframe)))))) + ;; Last resort: plain old fullcolumn. + ('(magit--display-buffer-fullcolumn)))))) + +;;;###autoload +(defun +magit-display-popup-buffer (buffer &optional alist) + "TODO" + (cond ((eq (window-dedicated-p) 'side) + (if (fboundp '+popup-display-buffer-stacked-side-window) + (+popup-display-buffer-stacked-side-window buffer alist) + (display-buffer-in-side-window buffer alist))) + ((derived-mode-p 'magit-mode) + (display-buffer-below-selected buffer alist)) + ((display-buffer-in-side-window buffer alist)))) ;; diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 747938673..6bf623d91 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -26,8 +26,8 @@ available.") #'magit-builtin-completing-read) magit-revision-show-gravatars '("^Author: " . "^Commit: ") magit-diff-refine-hunk t ; show word-granularity on selected hunk - magit-display-buffer-function #'+magit-display-buffer-fullscreen - magit-popup-display-buffer-action '((display-buffer-in-side-window))) + magit-display-buffer-function #'+magit-display-buffer + magit-popup-display-buffer-action '((+magit-display-popup-buffer))) (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore t) ;; so magit buffers can be switched to @@ -50,6 +50,7 @@ available.") (def-package! magithub :after magit :preface + ;; Magithub is not well-behaved, so this needs to be set early (setq magithub-dir (concat doom-etc-dir "magithub/")) :init (setq magithub-clone-default-directory "~/" From f94b00887b8451f1c36cb4a502fcea11da9e2526 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 18:28:22 +0200 Subject: [PATCH 2763/4235] config/default: bind SPC b B/SPC b b appropriately Depending on the status of feature/workspaces. --- modules/config/default/+bindings.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index c06635c94..a8b2f2bdb 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -560,8 +560,11 @@ (: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 + (:when (featurep! :feature workspaces) + :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer + :desc "Switch buffer" :n "B" #'switch-to-buffer) + (:unless (featurep! :feature workspaces) + :desc "Switch buffer" :n "b" #'switch-to-buffer) :desc "Kill buffer" :n "k" #'kill-this-buffer :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers :desc "Save buffer" :n "s" #'save-buffer From 77408ff12fe5fe9a832acadf1e63ee07261f6d44 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 19:14:25 +0200 Subject: [PATCH 2764/4235] Refactor ivy project search API The same as 7d617f15, but for ivy: + Heavily refactored +ivy-file-search + Removed -z flag from all engines by default + Changed the behavior of the universal argument for from-cwd interactive commands (e.g. +ivy/rg-from-cwd). It used to enable recursive searches, but now enables inclusion of hidden and compressed files in the search instead. *-from-cwd searches are always recursive now. + Now generates +ivy/X and +ivy/X-from-cwd commands dynamically. + Split +ivy/project-search into +ivy/project-search-from-cwd. Universal arguments are passed from these commands to their delegated engine command. --- modules/completion/ivy/autoload/ivy.el | 116 ++++++++++--------------- 1 file changed, 48 insertions(+), 68 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index da1c8a4de..94abf79e2 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -303,87 +303,67 @@ order. (counsel-pt query))) (_ (error "No search engine specified")))))) +(defun +ivy--get-command (format) + (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines :from-end t) + if (executable-find (symbol-name tool)) + return (intern (format format tool)))) + ;;;###autoload -(defun +ivy/project-search (arg) - "Performs a project search using the first available search backend from a -list of: ripgrep, ag, pt, git-grep and grep. If ARG (universal argument), -preform search from current directory." +(defun +ivy/project-search (&optional all-files-p) + "Performs a project search from the project root. + +Uses the first available search backend from `+ivy-project-search-engines'. If +ALL-FILES-P (universal argument), include all files, even hidden or compressed +ones, in the search." (interactive "P") (call-interactively - (or (cl-loop for tool in (cl-remove-duplicates +ivy-project-search-engines :from-end t) - if (executable-find (symbol-name tool)) - return (intern (format "+ivy/%s%s" tool (if arg "-from-cwd" "")))) - (if arg - #'+ivy/grep-from-cwd - #'+ivy/grep)))) + (or (+ivy--get-command "+ivy/%s") + #'+ivy/grep))) ;;;###autoload -(defun +ivy/rg (all-files-p &optional query directory) - "Perform a project file search using ripgrep. QUERY is a regexp. If omitted, -the current selection is used. If no selection is active, the last known search -is used. +(defun +ivy/project-search-from-cwd (&optional all-files-p) + "Performs a project search recursively from the current directory. -If ALL-FILES-P, don't respect .gitignore files and search everything. - -NOTE: ripgrep doesn't support multiline searches (yet)." +Uses the first available search backend from `+ivy-project-search-engines'. If +ALL-FILES-P (universal argument), include all files, even hidden or compressed +ones." (interactive "P") - (+ivy-file-search 'rg :query query :in directory :all-files all-files-p)) + (call-interactively + (or (+ivy--get-command "+ivy/%s-from-cwd") + #'+ivy/grep-from-cwd))) -;;;###autoload -(defun +ivy/ag (all-files-p &optional query directory) - "Perform a project file search using the silver searcher. QUERY is a pcre -regexp. If omitted, the current selection is used. If no selection is active, -the last known search is used. -If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive "P") - (+ivy-file-search 'ag :query query :in directory :all-files all-files-p)) +;; Relative to project root +;;;###autoload (autoload '+ivy/rg "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/rg-from-cwd "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/ag "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/ag-from-cwd "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/pt "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/pt-from-cwd "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/grep "completion/ivy/autoload/ivy") +;;;###autoload (autoload '+ivy/grep-from-cwd "completion/ivy/autoload/ivy") -;;;###autoload -(defun +ivy/pt (all-files-p &optional query directory) - "Perform a project file search using the platinum searcher. QUERY is a grep -regexp. If omitted, the current selection is used. If no selection is active, -the last known search is used. +(dolist (engine (cl-remove-duplicates +ivy-project-search-engines :from-end t)) + (defalias (intern (format "+ivy/%s" engine)) + (lambda (all-files-p &optional query directory) + (interactive "P") + (+ivy-file-search engine :query query :in directory :all-files all-files-p)) + (format "Perform a project file search using %s. -If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive "P") - (+ivy-file-search 'pt :query query :in directory :all-files all-files-p)) - -;;;###autoload -(defun +ivy/grep (all-files-p &optional query directory) - "Perform a project file search using grep (or git-grep in git repos). QUERY is -a grep regexp. If omitted, the current selection is used. If no selection is +QUERY is a regexp. If omitted, the current selection is used. If no selection is active, the last known search is used. -If ALL-FILES-P, don't respect .gitignore files and search everything." - (interactive "P") - (+ivy-file-search 'grep :query query :in directory :all-files all-files-p)) +If ALL-FILES-P, search compressed and hidden files as well." + engine)) -;; Relative to current directory -;;;###autoload -(defun +ivy/rg-from-cwd (recursive-p &optional query) - "Like `+ivy/rg', but from the current directory (recursively if RECURSIVE-P is -non-nil)." - (interactive "P") - (+ivy-file-search 'rg :query query :in default-directory :recursive recursive-p)) + (defalias (intern (format "+ivy/%s-from-cwd" engine)) + (lambda (all-files-p &optional query directory) + (interactive "P") + (+ivy-file-search engine :query query :in default-directory :all-files all-files-p)) + (format "Perform a project file search from the current directory using %s. -;;;###autoload -(defun +ivy/ag-from-cwd (recursive-p &optional query) - "Like `+ivy/ag', but from the current directory (recursively if RECURSIVE-P is -non-nil)." - (interactive "P") - (+ivy-file-search 'ag :query query :in default-directory :recursive recursive-p)) +QUERY is a regexp. If omitted, the current selection is used. If no selection is +active, the last known search is used. -;;;###autoload -(defun +ivy/pt-from-cwd (recursive-p &optional query) - "Like `+ivy/pt', but from the current directory (recursively if RECURSIVE-P is -non-nil)." - (interactive "P") - (+ivy-file-search 'pt :query query :in default-directory :recursive recursive-p)) - -;;;###autoload -(defun +ivy/grep-from-cwd (recursive-p &optional query) - "Like `+ivy/grep', but from the current directory (recursively if RECURSIVE-P is -non-nil)." - (interactive "P") - (+ivy-file-search 'grep :query query :in default-directory :recursive recursive-p)) +If ALL-FILES-P, search compressed and hidden files as well." + engine))) From 9d7f8c359e72d3b6838aba3e8a1ee6360361c08c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 19:14:30 +0200 Subject: [PATCH 2765/4235] Add docstrings to helm project search commands --- modules/completion/helm/autoload/helm.el | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 40b91513a..c9d8162d2 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -211,9 +211,22 @@ ones." (lambda (all-files-p &optional query directory) (interactive "P") (+helm-file-search engine :query query :in directory :all-files all-files-p)) - "TODO") + (format "Perform a project file search using %s. + +QUERY is a regexp. If omitted, the current selection is used. If no selection is +active, the last known search is used. + +If ALL-FILES-P, search compressed and hidden files as well." + engine)) + (defalias (intern (format "+helm/%s-from-cwd" engine)) (lambda (all-files-p &optional query directory) (interactive "P") (+helm-file-search engine :query query :in default-directory :all-files all-files-p)) - "TODO")) + (format "Perform a project file search from the current directory using %s. + +QUERY is a regexp. If omitted, the current selection is used. If no selection is +active, the last known search is used. + +If ALL-FILES-P, search compressed and hidden files as well." + engine))) From b8f1b90744144e5bfcdef81fa3b5840e29c79c09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 13 Aug 2018 23:57:10 +0200 Subject: [PATCH 2766/4235] Remove set-company-backend! Since racket-mode uses company-capf, it isn't necessary to set any default backends for it. --- modules/lang/racket/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 5d75f8300..18a896d1f 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -5,8 +5,6 @@ :config (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) - (set-company-backend! 'racket-mode - '(company-capf company-abbrev company-dabbrev-code company-dabbrev company-files company-yasnippet)) (set-lookup-handlers! 'racket-mode :definition #'racket-describe :documentation #'racket-doc) From a824e04e9262434371ebb727f8698a135f8ce167 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 14 Aug 2018 09:28:58 +0200 Subject: [PATCH 2767/4235] lang/ruby: fix wrong-num-of-args error from setq --- modules/lang/ruby/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index f4f0fe637..88ffe3031 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -78,8 +78,8 @@ (("task" "namespace") () "end"))) (unless (featurep! :feature evil) - (setq rspec-verifiable-mode-keymap (make-sparse-keymap) "TODO") - (setq rspec-mode-keymap (make-sparse-keymap) "TODO")) + (setq rspec-verifiable-mode-keymap (make-sparse-keymap) + rspec-mode-keymap (make-sparse-keymap))) (defun +ruby*init-appropriate-rspec-mode () "TODO" From 94092081db55fd58445ec5d5607e6ae011cb6502 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Tue, 14 Aug 2018 01:08:13 -0700 Subject: [PATCH 2768/4235] Fix running make from inside doom The `term.el` package defines an environment variable `EMACS` inside its shell process, containing the Emacs and term.el version, in a string that looks like this: `26.1 (term:0.96)`. This interferes with the `bin/doom` command, which expects that environment variable to be a path to an Emacs binary. Trying to run make inside a doom terminal thus gives you this error: ``` Emacs isn't installed make: *** [Makefile:5: all] Error 1 ``` This simple fix just checks if `$EMACS` looks like a term version string, and ignores it if so. --- bin/doom | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index 0b21a0382..6d55d29bd 100755 --- a/bin/doom +++ b/bin/doom @@ -1,5 +1,5 @@ #!/usr/bin/env bash -":"; EMACS=${EMACS:-emacs} # -*-emacs-lisp-*- +":"; [[ $EMACS = *"term"* ]] && EMACS=emacs || EMACS=${EMACS:-emacs} # -*-emacs-lisp-*- ":"; command -v $EMACS >/dev/null || { >&2 echo "Emacs isn't installed"; exit 1; } ":"; VERSION=$($EMACS --version | head -n1) ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run Doom. Check your PATH"; echo; exit 2; } From fa223ceafdbc94768884d35af2f464deafd2e445 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 14 Aug 2018 23:21:55 +0200 Subject: [PATCH 2769/4235] Added basic coq support --- modules/lang/coq/config.el | 9 +++++++++ modules/lang/coq/packages.el | 4 ++++ 2 files changed, 13 insertions(+) create mode 100644 modules/lang/coq/config.el create mode 100644 modules/lang/coq/packages.el diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el new file mode 100644 index 000000000..926c69592 --- /dev/null +++ b/modules/lang/coq/config.el @@ -0,0 +1,9 @@ +;;; lang/coq/config.el -*- lexical-binding: t; -*- + +(defvar +coq-pg-loc "/home/patrl/GitHub/PG/generic") + +(def-package! proof-site + :load-path +coq-pg-loc + :defer t + :mode ("\\.v\\'" . coq-mode) + :hook (coq-mode . company-coq-mode)) diff --git a/modules/lang/coq/packages.el b/modules/lang/coq/packages.el new file mode 100644 index 000000000..d813083d3 --- /dev/null +++ b/modules/lang/coq/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/coq/packages.el + +(package! company-coq) From 4280ea3418755cf981f93f0736390349a45c2783 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 14 Aug 2018 23:30:20 +0200 Subject: [PATCH 2770/4235] Added readme. --- modules/lang/coq/README.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 modules/lang/coq/README.org diff --git a/modules/lang/coq/README.org b/modules/lang/coq/README.org new file mode 100644 index 000000000..1a59ea85a --- /dev/null +++ b/modules/lang/coq/README.org @@ -0,0 +1,13 @@ +#+TITLE: :lang coq + +This module adds [[https://coq.inria.fr][coq]] support, powered by [[https://proofgeneral.github.io][Proof General]], with code completion via [[https://github.com/cpitclaudel/company-coq][company-coq]]. + +* Install +Unfortunately, Proof General needs to be installed manually. + +#+BEGIN_SRC sh +git clone https://github.com/ProofGeneral/PG $PG-LOC && cd $PG-LOC +make +#+END_SRC + +Manually set the variable ~+coq-pg-loc~ to the value of $PG-LOC in your doom config. From 2929b58cdef7b6fe0e1ee2c6e066b926dc4891a1 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 15 Aug 2018 08:17:20 +0200 Subject: [PATCH 2771/4235] Modified variable --- modules/lang/coq/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index 926c69592..a8a600663 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -1,6 +1,7 @@ ;;; lang/coq/config.el -*- lexical-binding: t; -*- -(defvar +coq-pg-loc "/home/patrl/GitHub/PG/generic") +;; set this to the absolute path of the folder containing proof-site.el, e.g. /home/$USER/GitHub/PG/generic +(defvar +coq-pg-loc nil) (def-package! proof-site :load-path +coq-pg-loc From f5c1be44baac162ecaa1f40fc5427a3da4f8e14d Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 15 Aug 2018 08:33:38 +0200 Subject: [PATCH 2772/4235] Added quelpa recipe --- modules/lang/coq/config.el | 3 --- modules/lang/coq/packages.el | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index a8a600663..62bbe97fe 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -1,8 +1,5 @@ ;;; lang/coq/config.el -*- lexical-binding: t; -*- -;; set this to the absolute path of the folder containing proof-site.el, e.g. /home/$USER/GitHub/PG/generic -(defvar +coq-pg-loc nil) - (def-package! proof-site :load-path +coq-pg-loc :defer t diff --git a/modules/lang/coq/packages.el b/modules/lang/coq/packages.el index d813083d3..3ae652118 100644 --- a/modules/lang/coq/packages.el +++ b/modules/lang/coq/packages.el @@ -1,4 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/coq/packages.el +(package! proof-general :recipe (:fetcher github :repo "ProofGeneral/PG" :files ("*"))) + (package! company-coq) From 55b5c7711b83d32c01b4be3c3e67d0bc3184fbab Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 15 Aug 2018 08:34:21 +0200 Subject: [PATCH 2773/4235] Updated readme --- modules/lang/coq/README.org | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/modules/lang/coq/README.org b/modules/lang/coq/README.org index 1a59ea85a..680555966 100644 --- a/modules/lang/coq/README.org +++ b/modules/lang/coq/README.org @@ -1,13 +1,3 @@ #+TITLE: :lang coq This module adds [[https://coq.inria.fr][coq]] support, powered by [[https://proofgeneral.github.io][Proof General]], with code completion via [[https://github.com/cpitclaudel/company-coq][company-coq]]. - -* Install -Unfortunately, Proof General needs to be installed manually. - -#+BEGIN_SRC sh -git clone https://github.com/ProofGeneral/PG $PG-LOC && cd $PG-LOC -make -#+END_SRC - -Manually set the variable ~+coq-pg-loc~ to the value of $PG-LOC in your doom config. From 486d4a12e7d86378bfe6ae32917d96a0b0964517 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 14 Aug 2018 14:56:19 +0200 Subject: [PATCH 2774/4235] Fix wrong-type-argument error opening new files Caused when either your snippets library is empty or a file-template doesn't exist when expanded. --- modules/feature/file-templates/autoload.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index b92d410c6..2c07c6b51 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -79,10 +79,10 @@ evil is loaded and enabled)." (unless yas-minor-mode (yas-minor-mode-on)) (when (and yas-minor-mode - (yas-expand-snippet - (yas--template-content - (cl-find trigger (yas--all-templates (yas--get-snippet-tables mode)) - :key #'yas--template-key :test #'equal))) + (when-let* + ((template (cl-find trigger (yas--all-templates (yas--get-snippet-tables mode)) + :key #'yas--template-key :test #'equal))) + (yas-expand-snippet (yas--template-content template))) (and (featurep 'evil) evil-mode) (and yas--active-field-overlay (overlay-buffer yas--active-field-overlay) From 9584dd6005e4dd13d0fc00cc311febc3ca5386d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 14 Aug 2018 15:23:50 +0200 Subject: [PATCH 2775/4235] Ensure file-template snippets are loaded In case :feature snippets is disabled. --- modules/feature/file-templates/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index e42059c43..4a0b0a9ab 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -131,7 +131,9 @@ must be non-read-only, empty, and there must be a rule in yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) yas-snippet-dirs nil) ;; Exit snippets on ESC from normal mode - (add-hook 'doom-escape-hook #'yas-abort-snippet)) + (add-hook 'doom-escape-hook #'yas-abort-snippet) + ;; + (yas-reload-all)) (defun +file-templates|init () From 104e01f588406bf13e84e9656e6f045b51835c1c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 09:24:53 +0200 Subject: [PATCH 2776/4235] Improve set-repl-handler!'s docstring --- modules/feature/eval/autoload/settings.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 0f9dd1dfb..04ec819ca 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -10,8 +10,13 @@ ;;;###autodef (defun set-repl-handler! (modes command) - "Define a REPL for MODES. MODES is either a single major mode symbol or a list -of them. COMMAND is a function that creates and returns the REPL buffer." + "Defines a REPL for MODES. + +MODES is either a single major mode symbol or a list of them. COMMAND is a +function that creates and returns the REPL buffer. + +COMMAND can either be a function that takes no arguments, or an interactive +command that will be called interactively." (dolist (mode (doom-enlist modes)) (setf (alist-get mode +eval-repls) command))) From 11b8ee55a1310d2bc8e7cced52ac447d38a27990 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 19:44:09 +0200 Subject: [PATCH 2777/4235] Use helm-do-ag instead of helm-ag #805 Fixes project search matching against the leading file name. And ensures modeline remains disabled. --- modules/completion/helm/autoload/helm.el | 18 ++++++------------ modules/completion/helm/config.el | 12 ++++++++---- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index c9d8162d2..ea0c874c4 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -153,18 +153,12 @@ order. ('grep (+helm--grep-search directory query prompt all-files recursive) (cl-return t)))) (helm-ag-base-command (string-join command " "))) - (if (and (eq engine 'ag) - (equal query "")) - (helm-do-ag directory) - (setq helm-ag--last-query query) - (helm-attrset 'search-this-file nil helm-ag-source) - (helm-attrset 'name (helm-ag--helm-header helm-ag--default-directory) helm-ag-source) - (helm :sources '(helm-ag-source) - :input query - :prompt prompt - :buffer "*helm-ag*" - :keymap helm-ag-map - :history 'helm-ag--helm-history)))) + (when (> (length query) 0) + (setcdr (assq 'requires-pattern helm-source-do-ag) 1)) + (cl-letf (((symbol-function 'helm-ag--marked-input) (lambda (_escape) query))) + (helm-do-ag directory) + ;; restore default + (setcdr (assq 'requires-pattern helm-source-do-ag) 3)))) (defun +helm--get-command (format) (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines :from-end t) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 9490b9f74..c30bbd0a9 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -114,10 +114,14 @@ be negative.") plist))) (advice-add #'helm :filter-args #'+helm*replace-prompt) - (defun +helm*hide-mode-line (&rest _) - (unless helm-mode-line-string - (hide-mode-line-mode +1))) - (advice-add #'helm-display-mode-line :override #'+helm*hide-mode-line) + ;; Hide the modeline + (defun +helm|hide-mode-line (&rest _) + (with-current-buffer (helm-buffer-get) + (unless helm-mode-line-string + (hide-mode-line-mode +1)))) + (add-hook 'helm-after-initialize-hook #'+helm|hide-mode-line) + (advice-add #'helm-display-mode-line :override #'+helm|hide-mode-line) + (advice-add #'helm-ag-show-status-default-mode-line :override #'ignore) (defun +helm*hide-minibuffer-maybe () "Hide minibuffer in Helm session if we use the header line as input field." From 40a900f533c6bea214fa3beb37971f35b6536d1d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 19:51:33 +0200 Subject: [PATCH 2778/4235] lang/web: fix Emacs<26 incompatibility #806 The regexp argument for string-trim-right was introduced in 26.1. --- modules/lang/web/+html.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 3c33cc562..cec94b1b1 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -38,7 +38,10 @@ (cl-loop for pair in (cdr alist) unless (string-match-p "^[a-z-]" (cdr pair)) collect (cons (car pair) - (string-trim-right (cdr pair) "\\(?:>\\|]\\|}\\)+"))))) + ;; TODO Replace with `string-trim-right' (Emacs 26+) + (if (string-match "\\(?:>\\|]\\|}\\)+\\'" string) + (replace-match "" t t string) + string))))) (setf (alist-get nil web-mode-engines-auto-pairs) nil)) (map! :map web-mode-map From 7d1246888b613f58e2339b7f9b919fe51c015682 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 20:39:42 +0200 Subject: [PATCH 2779/4235] Only set display function for counsel-ag counsel-rg and counsel-pt both identify themselves as counsel-ag, so these extra specifications were unnecessary. --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 62a3d96dc..7ba2fa133 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -200,7 +200,7 @@ immediately runs it on the current candidate (ending the ivy session)." (setf (alist-get t ivy-display-functions-alist) #'+ivy-display-at-frame-center-near-bottom) ;; posframe doesn't work well with async sources - (dolist (fn '(swiper counsel-rg counsel-ag counsel-pt counsel-grep counsel-git-grep)) + (dolist (fn '(swiper counsel-ag counsel-grep counsel-git-grep)) (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) From c69543fecc7c398d5f6543eafc5ddc44165d5a7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 23:32:53 +0200 Subject: [PATCH 2780/4235] Fix helm not cooperating with other popups Like the compilation window --- modules/completion/helm/config.el | 2 ++ modules/ui/popup/+hacks.el | 4 +--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index c30bbd0a9..f43a596c3 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -105,6 +105,8 @@ be negative.") helm-semantic-fuzzy-match fuzzy)) :config + (set-popup-rule! "^\\*helm" :vslot -100 :size 0.22) + (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." (cond ((not +helm-global-prompt) plist) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 212da8d61..c2417cd0d 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -169,9 +169,7 @@ the command buffer." ;; `helm' (after! helm - (set-popup-rule! "^\\*helm" :ignore t) - (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window) - helm-display-buffer-default-height 0.22) + (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window)) ;; Fix left-over popup window when closing persistent help for `helm-M-x' (defun +popup*helm-elisp--persistent-help (candidate _fun &optional _name) From c27ab26fd90cbd54c19f2dea94a9bd4e41d0c427 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 23:34:22 +0200 Subject: [PATCH 2781/4235] Refactor +helm-file-search & show prompt --- modules/completion/helm/autoload/helm.el | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index ea0c874c4..546618c7d 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -138,12 +138,12 @@ order. (when (> (abs (- end beg)) 1) (rxt-quote-pcre (buffer-substring-no-properties beg end))))) "")) - (prompt (format "%s%%s %s" + (prompt (format "[%s %s] " (symbol-name engine) - (cond ((file-equal-p directory default-directory) - "./") - ((file-equal-p directory project-root) + (cond ((file-equal-p directory project-root) (projectile-project-name)) + ((file-equal-p directory default-directory) + "./") ((file-relative-name directory project-root))))) (command (pcase engine @@ -153,12 +153,14 @@ order. ('grep (+helm--grep-search directory query prompt all-files recursive) (cl-return t)))) (helm-ag-base-command (string-join command " "))) - (when (> (length query) 0) - (setcdr (assq 'requires-pattern helm-source-do-ag) 1)) - (cl-letf (((symbol-function 'helm-ag--marked-input) (lambda (_escape) query))) - (helm-do-ag directory) - ;; restore default - (setcdr (assq 'requires-pattern helm-source-do-ag) 3)))) + (cl-letf ((+helm-global-prompt prompt) + ((symbol-function 'helm-do-ag--helm) + (lambda () (helm :sources '(helm-source-do-ag) + :buffer "*helm-ag*" + :keymap helm-do-ag-map + :input query + :history 'helm-ag--helm-history)))) + (helm-do-ag directory)))) (defun +helm--get-command (format) (cl-loop for tool in (cl-remove-duplicates +helm-project-search-engines :from-end t) From 6a582d4f5f05ce2d0051addd70a988fd4e8386ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 15 Aug 2018 23:35:12 +0200 Subject: [PATCH 2782/4235] Fix SPC / d Use new +(ivy|helm)/project-search-from-cwd command --- modules/config/default/+bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a8b2f2bdb..807d0915c 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -523,11 +523,11 @@ (:when (featurep! :completion ivy) :desc "Buffer" :nv "b" #'swiper :desc "Project" :nv "p" #'+ivy/project-search - :desc "Directory" :nv "d" (λ! (+ivy/project-search t))) + :desc "Directory" :nv "d" #'+ivy/project-search-from-cwd) (:when (featurep! :completion helm) :desc "Buffer" :nv "b" #'swiper-helm :desc "Project" :nv "p" #'+helm/project-search - :desc "Directory" :nv "d" (λ! (+helm/project-search t))) + :desc "Directory" :nv "d" #'+helm/project-search-from-cwd) :desc "Symbols" :nv "i" #'imenu :desc "Symbols across buffers" :nv "I" #'imenu-anywhere :desc "Online providers" :nv "o" #'+lookup/online-select) From 480378d30c89bd256b510814d8787b629a0d468a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 01:26:28 +0200 Subject: [PATCH 2783/4235] Fix doom/info in noninteractive sessions --- core/autoload/debug.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 02f0d38b8..935d690ec 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -11,7 +11,8 @@ "Returns diagnostic information about the current Emacs session in markdown, ready to be pasted in a bug report on github." (require 'vc-git) - (let ((default-directory doom-emacs-dir)) + (let ((default-directory doom-emacs-dir) + (doom-modules (doom-modules))) (format (concat "- OS: %s (%s)\n" "- Emacs: %s (%s)\n" @@ -47,7 +48,7 @@ ready to be pasted in a bug report on github." (insert (format "%s" system-type))) (string-trim (buffer-string)))) (or (cl-loop with cat = nil - for key being the hash-keys of (doom-modules) + for key being the hash-keys of doom-modules if (or (not cat) (not (eq cat (car key)))) do (setq cat (car key)) and collect cat else collect From 3cddbd1949bae0742d5a1a8128b39da11aa04b1d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 02:18:44 +0200 Subject: [PATCH 2784/4235] Fix void-variable string #809 --- modules/lang/web/+html.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index cec94b1b1..5c896e08c 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -39,9 +39,10 @@ unless (string-match-p "^[a-z-]" (cdr pair)) collect (cons (car pair) ;; TODO Replace with `string-trim-right' (Emacs 26+) - (if (string-match "\\(?:>\\|]\\|}\\)+\\'" string) - (replace-match "" t t string) - string))))) + (let ((string (cdr pair))) + (if (string-match "\\(?:>\\|]\\|}\\)+\\'" string) + (replace-match "" t t string) + string)))))) (setf (alist-get nil web-mode-engines-auto-pairs) nil)) (map! :map web-mode-map From 7be7a8b0462fc3c7e4a9b7b971e30c4393c116ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 11:35:11 +0200 Subject: [PATCH 2785/4235] Rebind SPC o a -> org-agenda --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 807d0915c..ca0bfecb8 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -669,7 +669,7 @@ :desc "Org capture" :n "x" #'org-capture) (:desc "open" :prefix "o" - :desc "Org agenda" :n "a" #'org-agenda-list + :desc "Org agenda" :n "a" #'org-agenda :desc "Default browser" :n "b" #'browse-url-of-file :desc "Debugger" :n "d" #'+debug/open :desc "REPL" :n "r" #'+eval/open-repl From 7c82cb60025b6efba2c90b67c62153f4ea8fc80f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 12:32:13 +0200 Subject: [PATCH 2786/4235] org-capture: remove window-system frame parameter Hopefully, `make-frame` can figure out which window-system to use. --- modules/lang/org/autoload/org-capture.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index d6c51c890..4efa77780 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -11,9 +11,6 @@ (width . 70) (height . 25) (transient . t) - (window-system . ,(cond (IS-MAC 'ns) - (IS-LINUX 'x) - (t 'w32))) ,(if IS-LINUX '(display . ":0"))) "TODO") From a715f848aae6b301a835a11a6529a199aaac13c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 12:53:38 +0200 Subject: [PATCH 2787/4235] Let EMACS_SERVER_NAME envvar change server-name --- core/core-editor.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-editor.el b/core/core-editor.el index 0962c5a7b..3398f59e3 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -146,6 +146,8 @@ savehist file." :defer 1 :after-call (pre-command-hook after-find-file) :config + (when-let* ((name (getenv "EMACS_SERVER_NAME"))) + (setq server-name name)) (unless (server-running-p) (server-start))) From ce9f03f31063be9d0faf9e9de2b94186e3f2496c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 15:17:07 +0200 Subject: [PATCH 2788/4235] Use personal fork of highlight-escape-sequences Improves elisp support, adds support for more modes and fixes some minor issues. --- core/core-ui.el | 16 +--------------- core/packages.el | 3 ++- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 34c22b0a6..28c7cfc9a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -144,21 +144,7 @@ Also see `doom-exit-buffer-hook'.") ;; `highlight-escape-sequences' (def-package! highlight-escape-sequences - :after-call after-find-file - :config - (defconst hes-python-escape-sequence-re - (rx (submatch - (and ?\\ (submatch - (or (repeat 1 3 (in "0-7")) - (and ?x (repeat 2 xdigit)) - (and ?u (repeat 4 xdigit)) - (and ?U (repeat 8 xdigit)) - (and ?N "{" (one-or-more alpha) "}") - (any "\"\'\\abfnrtv"))))))) - (add-to-list 'hes-mode-alist `(python-mode . ,hes-python-escape-sequence-re)) - - (add-to-list 'hes-mode-alist `(enh-ruby-mode . ,hes-ruby-escape-sequence-keywords)) - (hes-mode +1)) + :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially ;; in parentheses-drunk languages like Lisp. diff --git a/core/packages.el b/core/packages.el index b67d49e22..bbe27d438 100644 --- a/core/packages.el +++ b/core/packages.el @@ -11,7 +11,8 @@ (package! hide-mode-line) (package! highlight-indentation) (package! highlight-numbers) -(package! highlight-escape-sequences) +(package! highlight-escape-sequences + :recipe (:fetcher github :repo "hlissner/highlight-escape-sequences")) (unless (boundp 'display-line-numbers) (package! nlinum) (package! nlinum-hl) From d60296111e1af8cccfac0c1c8f2251f98f420b48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 16:42:01 +0200 Subject: [PATCH 2789/4235] lang/rest: prompt for self-signed/invalid certs --- modules/lang/rest/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 9b54b78c7..0e6340597 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -4,6 +4,14 @@ :mode ("\\.http\\'" . restclient-mode) :config (set-popup-rule! "^\\*HTTP Response" :size 0.4 :quit 'other) + + ;; Forces underlying SSL verification to prompt for self-signed or invalid + ;; certs, rather than silently reject them. + (defun +rest*permit-self-signed-ssl (orig-fn &rest args) + (let (gnutls-verify-error tls-checktrust) + (apply orig-fn args))) + (advice-add #'restclient-http-do :around #'+rest*permit-self-signed-ssl) + (map! :mode restclient-mode :n [M-return] 'restclient-http-send-current :localleader From 772febedb7f582a200f546e5bd4187ce5cea2814 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 17:36:05 +0200 Subject: [PATCH 2790/4235] lang/rest: fix za, zm & zr fold keys --- modules/lang/rest/autoload.el | 28 ++++++++++++++++++++++++++++ modules/lang/rest/config.el | 4 ++++ 2 files changed, 32 insertions(+) create mode 100644 modules/lang/rest/autoload.el diff --git a/modules/lang/rest/autoload.el b/modules/lang/rest/autoload.el new file mode 100644 index 000000000..0562764b0 --- /dev/null +++ b/modules/lang/rest/autoload.el @@ -0,0 +1,28 @@ +;;; lang/rest/autoload.el -*- lexical-binding: t; -*- + +(defun +rest-request-at-point-p (&optional pos) + (save-excursion + (if pos (goto-char pos)) + (beginning-of-line) + (and (re-search-forward restclient-method-url-regexp + (line-end-position) t) + (not (nth 4 (syntax-ppss)))))) + +;;;###autoload +(defun +rest/dwim-at-point () + "TODO" + (interactive) + (when (+rest-request-at-point-p) + (restclient-http-send-current-stay-in-window))) + +;;;###autoload +(defun +rest/fold-all () + "TODO" + (interactive) + (save-excursion + (goto-char (point-min)) + (let ((last (point))) + (while (and (restclient-jump-next) + (not (= last (setq last (point))))) + (unless (overlays-at (line-end-position)) + (restclient-toggle-body-visibility)))))) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 0e6340597..5599e137e 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -14,6 +14,10 @@ (map! :mode restclient-mode :n [M-return] 'restclient-http-send-current + :n "za" #'restclient-toggle-body-visibility + :n "zm" #'+rest/fold-all + :n "zr" #'outline-show-all + :localleader :desc "Execute HTTP request" :n "e" 'restclient-http-send-current :desc "Execute raw HTTP request" :n "E" 'restclient-http-send-current-raw From 957ba3ee678bdbb507659d85a355d3ef3f8cbfc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 17:36:25 +0200 Subject: [PATCH 2791/4235] lang/rest: :n RET = run request at point --- modules/lang/rest/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 5599e137e..c2efc11a7 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -13,7 +13,7 @@ (advice-add #'restclient-http-do :around #'+rest*permit-self-signed-ssl) (map! :mode restclient-mode - :n [M-return] 'restclient-http-send-current + :n [return] #'+rest/dwim-at-point :n "za" #'restclient-toggle-body-visibility :n "zm" #'+rest/fold-all :n "zr" #'outline-show-all From 6df179bb294c839469cc170a00256d324ba5aa26 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 19:34:03 +0200 Subject: [PATCH 2792/4235] Use def-package! for highlight-numbers-mode Easier for users to disable --- core/core-ui.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 28c7cfc9a..ca1836fdd 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -139,8 +139,9 @@ Also see `doom-exit-buffer-hook'.") (add-hook 'Man-mode-hook #'hide-mode-line-mode) ;; `highlight-numbers-mode' -- better number literal fontification in code -(setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+.*\\_>") -(add-hook 'prog-mode-hook #'highlight-numbers-mode) +(def-package! highlight-numbers-mode + :hook prog-mode + :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+.*\\_>")) ;; `highlight-escape-sequences' (def-package! highlight-escape-sequences From ffccb3a31a9ac09b8384a1b8e544d2f27e2a2262 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 20:39:16 +0200 Subject: [PATCH 2793/4235] Sharp-quote keybind commands --- modules/lang/rest/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index c2efc11a7..018f291a9 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -19,9 +19,9 @@ :n "zr" #'outline-show-all :localleader - :desc "Execute HTTP request" :n "e" 'restclient-http-send-current - :desc "Execute raw HTTP request" :n "E" 'restclient-http-send-current-raw - :desc "Copy curl command" :n "c" 'restclient-copy-curl-command)) + :desc "Execute HTTP request" :n "e" #'restclient-http-send-current + :desc "Execute raw HTTP request" :n "E" #'restclient-http-send-current-raw + :desc "Copy curl command" :n "c" #'restclient-copy-curl-command)) (def-package! company-restclient From 8a0d12d4f07a2598701468d72017e67fb4b22567 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 16 Aug 2018 22:02:30 +0200 Subject: [PATCH 2794/4235] Enable line numbers in restclient-mode --- modules/lang/rest/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 018f291a9..b059c111e 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -5,6 +5,9 @@ :config (set-popup-rule! "^\\*HTTP Response" :size 0.4 :quit 'other) + ;; line numbers aren't enabled by default in fundamental-mode-derived modes + (add-hook 'restclient-mode-hook #'doom|enable-line-numbers) + ;; Forces underlying SSL verification to prompt for self-signed or invalid ;; certs, rather than silently reject them. (defun +rest*permit-self-signed-ssl (orig-fn &rest args) From 4a4b012b5d486295b97742ca71fe8b271b13022c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 01:50:52 +0200 Subject: [PATCH 2795/4235] Move custom hooks to core/core.el Also ensures that the custom hooks aren't fired until as late as possible, which prevents a few packages from prematurely loading at startup. Faster startup! Yay! --- core/core-ui.el | 75 ----------------------------------- core/core.el | 101 ++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 89 insertions(+), 87 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index ca1836fdd..2286d8971 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -28,35 +28,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (defvar doom-init-ui-hook nil "List of hooks to run when the UI has been initialized.") -(defvar doom-load-theme-hook nil - "Hook run when the theme (and font) is initialized (or reloaded -with `doom/reload-theme').") - -(defvar doom-before-switch-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. See -`doom-enter-window-hook'.") - -(defvar doom-after-switch-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. See -`doom-exit-window-hook'.") - -(defvar doom-before-switch-buffer-hook nil - "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-after-switch-buffer-hook'.") - -(defvar doom-after-switch-buffer-hook nil - "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-exit-buffer-hook'.") - -(define-obsolete-variable-alias 'doom-after-switch-buffer-hook 'doom-enter-buffer-hook "2.1.0") -(define-obsolete-variable-alias 'doom-before-switch-buffer-hook 'doom-exit-buffer-hook "2.1.0") -(define-obsolete-variable-alias 'doom-after-switch-window-hook 'doom-enter-window-hook "2.1.0") -(define-obsolete-variable-alias 'doom-before-switch-window-hook 'doom-exit-window-hook "2.1.0") - (setq-default ansi-color-for-comint-mode t bidi-display-reordering nil ; disable bidirectional text for tiny performance boost @@ -276,52 +247,6 @@ from the default." (add-hook 'after-change-major-mode-hook #'doom|show-whitespace-maybe) -;; -;; Custom hooks -;; - -(defvar doom-inhibit-switch-buffer-hooks nil) -(defvar doom-inhibit-switch-window-hooks nil) - -(defun doom*switch-window-hooks (orig-fn window &optional norecord) - (if (or doom-inhibit-switch-window-hooks - (null window) - (eq window (selected-window)) - (window-minibuffer-p) - (window-minibuffer-p window)) - (funcall orig-fn window norecord) - (let ((doom-inhibit-switch-window-hooks t)) - (run-hooks 'doom-exit-window-hook) - (prog1 (funcall orig-fn window norecord) - (with-selected-window window - (run-hooks 'doom-enter-window-hook)))))) -(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) - (if (or doom-inhibit-switch-buffer-hooks - (eq (get-buffer buffer-or-name) (current-buffer))) - (apply orig-fn buffer-or-name args) - (let ((doom-inhibit-switch-buffer-hooks t)) - (run-hooks 'doom-exit-buffer-hook) - (prog1 (apply orig-fn buffer-or-name args) - (when (buffer-live-p (get-buffer buffer-or-name)) - (with-current-buffer buffer-or-name - (run-hooks 'doom-enter-buffer-hook))))))) - -(defun doom|init-custom-hooks (&optional disable) - (dolist (spec '((select-window . doom*switch-window-hooks) - (switch-to-buffer . doom*switch-buffer-hooks) - (display-buffer . doom*switch-buffer-hooks) - (pop-to-buffer . doom*switch-buffer-hooks))) - (if disable - (advice-remove (car spec) (cdr spec)) - (advice-add (car spec) :around (cdr spec))))) -(add-hook 'doom-init-ui-hook #'doom|init-custom-hooks) - -(defun doom*load-theme-hooks (theme &rest _) - (setq doom-theme theme) - (run-hooks 'doom-load-theme-hook)) -(advice-add #'load-theme :after #'doom*load-theme-hooks) - - ;; ;; Silence motion errors in minibuffer ;; diff --git a/core/core.el b/core/core.el index ba79a2fca..6add8b8a6 100644 --- a/core/core.el +++ b/core/core.el @@ -97,18 +97,6 @@ Doom was setup, which can cause problems.") (defvar doom-site-load-path load-path "The starting load-path, before it is altered by `doom-initialize'.") -(defvar doom-init-hook nil - "Hooks run after all init.el files are loaded, including your private and all -module init.el files, but before their config.el files are loaded.") - -(defvar doom-post-init-hook nil - "A list of hooks run when Doom is fully initialized. Fires at the end of -`emacs-startup-hook', as late as possible. Guaranteed to run after everything -else (except for `window-setup-hook').") - -(defvar doom-reload-hook nil - "A list of hooks to run when `doom//reload-load-path' is called.") - (defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) (defvar doom--last-emacs-version nil) (defvar doom--refreshed-p nil) @@ -236,6 +224,95 @@ original value of `symbol-file'." (fset #'display-startup-echo-area-message #'ignore) +;; +;; Custom hooks +;; + + +(defvar doom-init-hook nil + "Hooks run after all init.el files are loaded, including your private and all +module init.el files, but before their config.el files are loaded.") + +(defvar doom-post-init-hook nil + "A list of hooks run when Doom is fully initialized. Fires at the end of +`emacs-startup-hook', as late as possible. Guaranteed to run after everything +else (except for `window-setup-hook').") + +(defvar doom-reload-hook nil + "A list of hooks to run when `doom//reload-load-path' is called.") + +(defvar doom-load-theme-hook nil + "Hook run when the theme (and font) is initialized (or reloaded +with `doom/reload-theme').") + +(defvar doom-before-switch-window-hook nil + "Hook run before `switch-window' or `switch-frame' are called. See +`doom-enter-window-hook'.") + +(defvar doom-after-switch-window-hook nil + "Hook run after `switch-window' or `switch-frame' are called. See +`doom-exit-window-hook'.") + +(defvar doom-before-switch-buffer-hook nil + "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-after-switch-buffer-hook'.") + +(defvar doom-after-switch-buffer-hook nil + "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-exit-buffer-hook'.") + +(defvar doom-inhibit-switch-buffer-hooks nil) +(defvar doom-inhibit-switch-window-hooks nil) + +(defun doom*switch-window-hooks (orig-fn window &optional norecord) + (if (or doom-inhibit-switch-window-hooks + (null window) + (eq window (selected-window)) + (window-minibuffer-p) + (window-minibuffer-p window)) + (funcall orig-fn window norecord) + (let ((doom-inhibit-switch-window-hooks t)) + (run-hooks 'doom-exit-window-hook) + (prog1 (funcall orig-fn window norecord) + (with-selected-window window + (run-hooks 'doom-enter-window-hook)))))) + +(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) + (if (or doom-inhibit-switch-buffer-hooks + (eq (get-buffer buffer-or-name) (current-buffer))) + (apply orig-fn buffer-or-name args) + (let ((doom-inhibit-switch-buffer-hooks t)) + (run-hooks 'doom-exit-buffer-hook) + (prog1 (apply orig-fn buffer-or-name args) + (when (buffer-live-p (get-buffer buffer-or-name)) + (with-current-buffer buffer-or-name + (run-hooks 'doom-enter-buffer-hook))))))) + +(defun doom|init-switch-hooks (&optional disable) + "Set up enter/exit hooks for windows and buffers. + +See `doom-enter-buffer-hook', `doom-enter-window-hook', `doom-exit-buffer-hook' +and `doom-exit-window-hook'." + (dolist (spec '((select-window . doom*switch-window-hooks) + (switch-to-buffer . doom*switch-buffer-hooks) + (display-buffer . doom*switch-buffer-hooks) + (pop-to-buffer . doom*switch-buffer-hooks))) + (if disable + (advice-remove (car spec) (cdr spec)) + (advice-add (car spec) :around (cdr spec))))) +(add-hook 'emacs-startup-hook #'doom|init-switch-hooks) + +(defun doom*load-theme-hooks (theme &rest _) + "Set up `doom-load-theme-hook' to run after `load-theme' is called." + (setq doom-theme theme) + (run-hooks 'doom-load-theme-hook)) +(advice-add #'load-theme :after #'doom*load-theme-hooks) + + ;; ;; Bootstrap helpers ;; From 7a578eb24296ccdcb002695bbbeecb3dcc8b9b7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 03:37:07 +0200 Subject: [PATCH 2796/4235] Move counsel+helpful integration to ivy module --- core/core-editor.el | 20 +++++++------------- modules/completion/ivy/config.el | 2 ++ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 3398f59e3..c60ada15d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -262,7 +262,7 @@ savehist file." command-log-mode-open-log-turns-on-mode t command-log-mode-is-global t) - +;; `expand-region' (def-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) :config @@ -273,18 +273,12 @@ savehist file." (advice-add #'evil-escape :before #'doom*quit-expand-region) (advice-add #'doom/escape :before #'doom*quit-expand-region)) -;; A better *help* buffer -(def-package! helpful - :defer t - :init - (setq counsel-describe-function-function #'helpful-callable - counsel-describe-variable-function #'helpful-variable) - - (define-key! 'global - [remap describe-function] #'helpful-callable - [remap describe-command] #'helpful-command - [remap describe-variable] #'helpful-variable - [remap describe-key] #'helpful-key)) +;; `helpful' --- a better *help* buffer +(define-key! 'global + [remap describe-function] #'helpful-callable + [remap describe-command] #'helpful-command + [remap describe-variable] #'helpful-variable + [remap describe-key] #'helpful-key) (provide 'core-editor) ;;; core-editor.el ends here diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 7ba2fa133..c453aa666 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -103,6 +103,8 @@ immediately runs it on the current candidate (ending the ivy session)." (set-popup-rule! "^\\*ivy-occur" :size 0.35 :ttl 0 :quit nil) (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)" + counsel-describe-function-function #'helpful-callable + counsel-describe-variable-function #'helpful-variable ;; Add smart-casing and compressed archive searching (-zS) to default ;; command arguments: counsel-rg-base-command "rg -zS --no-heading --line-number --color never %s ." From 1a6519aa45033526526de1285cebcc4306f47963 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 03:56:45 +0200 Subject: [PATCH 2797/4235] Display search command & directory in helm header Displays the full command (minus formatting options) and target directory rather than the unhelpful "The Silver Searcher", even if we're using ripgrep or pt. --- modules/completion/helm/autoload/helm.el | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 546618c7d..ff07cd41d 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -44,18 +44,20 @@ workspace." ;; (defun +helm-ag-search-args (all-files-p recursive-p) - (list "ag -S" - (if IS-WINDOWS "--vimgrep" "--nocolor --nogroup") + (list (concat "ag " (if IS-WINDOWS "--vimgrep" "--nocolor --nogroup")) + "-S" (if all-files-p "-z -a") (unless recursive-p "--depth 1"))) (defun +helm-rg-search-args (all-files-p recursive-p) - (list "rg -S --no-heading --line-number --color never" + (list "rg --no-heading --line-number --color never" + "-S" (when all-files-p "-z -uu") (unless recursive-p "--maxdepth 1"))) (defun +helm-pt-search-args (all-files-p recursive-p) - (list "pt -S --nocolor --nogroup -e" + (list "pt --nocolor --nogroup -e" + "-S" (if all-files-p "-z -a") (unless recursive-p "--depth 1"))) @@ -153,6 +155,12 @@ order. ('grep (+helm--grep-search directory query prompt all-files recursive) (cl-return t)))) (helm-ag-base-command (string-join command " "))) + ;; TODO Define our own sources instead + (helm-attrset 'name (format "[%s %s] Searching %s" + engine + (string-join (delq nil (cdr command)) " ") + (abbreviate-file-name directory)) + helm-source-do-ag) (cl-letf ((+helm-global-prompt prompt) ((symbol-function 'helm-do-ag--helm) (lambda () (helm :sources '(helm-source-do-ag) From deea5f11b35e6b536e3eb309c43543469f648a74 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 04:01:46 +0200 Subject: [PATCH 2798/4235] Fix enter/exit window/buffer hook names --- core/core.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core.el b/core/core.el index 6add8b8a6..2ecfb9913 100644 --- a/core/core.el +++ b/core/core.el @@ -245,21 +245,21 @@ else (except for `window-setup-hook').") "Hook run when the theme (and font) is initialized (or reloaded with `doom/reload-theme').") -(defvar doom-before-switch-window-hook nil +(defvar doom-exit-window-hook nil "Hook run before `switch-window' or `switch-frame' are called. See `doom-enter-window-hook'.") -(defvar doom-after-switch-window-hook nil +(defvar doom-enter-window-hook nil "Hook run after `switch-window' or `switch-frame' are called. See `doom-exit-window-hook'.") -(defvar doom-before-switch-buffer-hook nil +(defvar doom-exit-buffer-hook nil "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are called. The buffer to be switched to is current when these hooks run. -Also see `doom-after-switch-buffer-hook'.") +Also see `doom-enter-buffer-hook'.") -(defvar doom-after-switch-buffer-hook nil +(defvar doom-enter-buffer-hook nil "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are called. The buffer to be switched to is current when these hooks run. From 1dca969a14fa911297c897bf5ae7b7c7a8ce5caf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 04:03:07 +0200 Subject: [PATCH 2799/4235] Update switch hook tests --- core/test/test-core-ui.el | 72 +--------------------------------- core/test/test-core.el | 81 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 77 deletions(-) diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el index c9471f0bb..2ef290d63 100644 --- a/core/test/test-core-ui.el +++ b/core/test/test-core-ui.el @@ -58,75 +58,5 @@ (expect (kill-buffer (get-buffer-create "a")))) (it "shouldn't kill the fallback buffer" - (expect (not (kill-buffer (doom-fallback-buffer)))))) - - - (describe "switch hooks" - :var (before-hook after-hook a b) - (before-each - (setq a (switch-to-buffer (get-buffer-create "a")) - b (get-buffer-create "b")) - (spy-on 'before-hook) - (spy-on 'after-hook) - (doom|init-custom-hooks)) - (after-each - (doom|init-custom-hooks 'disable) - (kill-buffer a) - (kill-buffer b)) - - - (describe "switch-buffer" - :var (doom-exit-buffer-hook - doom-enter-buffer-hook) - (before-each - (setq doom-exit-buffer-hook '(before-hook) - doom-enter-buffer-hook '(after-hook))) - (after-each - (setq doom-exit-buffer-hook nil - doom-enter-buffer-hook nil)) - - (it "should trigger when switching buffers" - (switch-to-buffer b) - (switch-to-buffer a) - (switch-to-buffer b) - (expect 'before-hook :to-have-been-called-times 3) - (expect 'after-hook :to-have-been-called-times 3)) - - (it "should trigger only once on the same buffer" - (switch-to-buffer b) - (switch-to-buffer b) - (switch-to-buffer a) - (expect 'before-hook :to-have-been-called-times 2) - (expect 'after-hook :to-have-been-called-times 2))) - - - (describe "switch-window" - :var (doom-exit-window-hook - doom-enter-window-hook - x y) - (before-each - (delete-other-windows) - (setq x (get-buffer-window a) - y (save-selected-window (split-window))) - (with-selected-window y - (switch-to-buffer b)) - (select-window x) - (spy-calls-reset 'before-hook) - (spy-calls-reset 'after-hook) - (setq doom-exit-window-hook '(before-hook) - doom-enter-window-hook '(after-hook))) - - (it "should trigger when switching windows" - (select-window y) - (select-window x) - (select-window y) - (expect 'before-hook :to-have-been-called-times 3) - (expect 'after-hook :to-have-been-called-times 3)) - - (it "should trigger only once on the same window" - (select-window y) - (select-window y) - (select-window x) - (expect 'before-hook :to-have-been-called-times 2) - (expect 'after-hook :to-have-been-called-times 2))))) + (expect (not (kill-buffer (doom-fallback-buffer))))))) diff --git a/core/test/test-core.el b/core/test/test-core.el index 4e69aa1e4..068d9ff7f 100644 --- a/core/test/test-core.el +++ b/core/test/test-core.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core.el -(xdescribe "core" - (describe "initialize" +(describe "core" + (xdescribe "initialize" :var (doom-init-p doom-init-modules-p doom-private-dir) (before-each (setq doom-init-p nil @@ -41,16 +41,85 @@ (it "does not load autoloads file if forced" ) (it "does not regenerate missing autoloads" ))) - (describe "initialize-packages" + (xdescribe "initialize-packages" (before-each (spy-on 'quelpa-setup-p)) (it "initializes package.el once, unless forced" ) (it "initializes quelpa once, unless forced" ) (it "initializes doom-packages once, unless forced" )) - (describe "initialize-modules" + (xdescribe "initialize-modules" (it "loads private init.el once, unless forced" )) - (describe "initialize-autoloads" + (xdescribe "initialize-autoloads" (it "loads autoloads file" ) - (it "ignores autoloads file if cleared" ))) + (it "ignores autoloads file if cleared" )) + + (describe "custom hooks" + (describe "switch hooks" + :var (before-hook after-hook a b) + (before-each + (setq a (switch-to-buffer (get-buffer-create "a")) + b (get-buffer-create "b")) + (spy-on 'before-hook) + (spy-on 'after-hook) + (doom|init-switch-hooks)) + (after-each + (doom|init-switch-hooks 'disable) + (kill-buffer a) + (kill-buffer b)) + + (describe "switch-buffer" + :var (doom-exit-buffer-hook + doom-enter-buffer-hook) + (before-each + (setq doom-exit-buffer-hook '(before-hook) + doom-enter-buffer-hook '(after-hook))) + (after-each + (setq doom-exit-buffer-hook nil + doom-enter-buffer-hook nil)) + + (it "should trigger when switching buffers" + (switch-to-buffer b) + (switch-to-buffer a) + (switch-to-buffer b) + (expect 'before-hook :to-have-been-called-times 3) + (expect 'after-hook :to-have-been-called-times 3)) + + (it "should trigger only once on the same buffer" + (switch-to-buffer b) + (switch-to-buffer b) + (switch-to-buffer a) + (expect 'before-hook :to-have-been-called-times 2) + (expect 'after-hook :to-have-been-called-times 2))) + + + (describe "switch-window" + :var (doom-exit-window-hook + doom-enter-window-hook + x y) + (before-each + (delete-other-windows) + (setq x (get-buffer-window a) + y (save-selected-window (split-window))) + (with-selected-window y + (switch-to-buffer b)) + (select-window x) + (spy-calls-reset 'before-hook) + (spy-calls-reset 'after-hook) + (setq doom-exit-window-hook '(before-hook) + doom-enter-window-hook '(after-hook))) + + (it "should trigger when switching windows" + (select-window y) + (select-window x) + (select-window y) + (expect 'before-hook :to-have-been-called-times 3) + (expect 'after-hook :to-have-been-called-times 3)) + + (it "should trigger only once on the same window" + (select-window y) + (select-window y) + (select-window x) + (expect 'before-hook :to-have-been-called-times 2) + (expect 'after-hook :to-have-been-called-times 2)))))) From 6ab9cf64607099c8289b8030caf048c6d1ea2f93 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 04:10:11 +0200 Subject: [PATCH 2800/4235] Switch org-agenda-list for org-agenda on dashboard --- modules/ui/doom-dashboard/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 89da7799f..0ca1262fc 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -49,10 +49,10 @@ Possible values: persp-save-dir))) :face (:inherit (font-lock-keyword-face bold)) :action +workspace/load-last-session) - ("See agenda for this week" + ("Open org-agenda" :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) - :when (fboundp 'org-agenda-list) - :action org-agenda-list) + :when (fboundp 'org-agenda) + :action org-agenda) ("Recently opened files" :icon (all-the-icons-octicon "file-text" :face 'font-lock-keyword-face) :action recentf-open-files) From f923ed4341f377ed22e45dfff9535cff39904eb3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 04:34:43 +0200 Subject: [PATCH 2801/4235] Add docstrings to doom-inhibit-switch-*-hooks vars --- core/core.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 2ecfb9913..4613e090d 100644 --- a/core/core.el +++ b/core/core.el @@ -265,8 +265,10 @@ called. The buffer to be switched to is current when these hooks run. Also see `doom-exit-buffer-hook'.") -(defvar doom-inhibit-switch-buffer-hooks nil) -(defvar doom-inhibit-switch-window-hooks nil) +(defvar doom-inhibit-switch-buffer-hooks nil + "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'.") +(defvar doom-inhibit-switch-window-hooks nil + "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'.") (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks From b867afff1f5d807dbcc1461a6ec14bc1effec58d Mon Sep 17 00:00:00 2001 From: wanghao Date: Fri, 17 Aug 2018 10:48:14 +0800 Subject: [PATCH 2802/4235] delete redundant comma this cause wrong tab width in c mode --- 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 ea1623f8b..59dec5276 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -66,7 +66,7 @@ compilation database is present in the project.") ;; Custom style, based off of linux (unless (assoc "doom" c-style-alist) (push '("doom" - (c-basic-offset . ,tab-width) + (c-basic-offset . tab-width) (c-comment-only-line-offset . 0) (c-hanging-braces-alist (brace-list-open) (brace-entry-open) From f38e04bf83959010a5323d5bee2f57987292d800 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 12:40:47 +0200 Subject: [PATCH 2803/4235] Restore default mu4e non-fancy marks #810 --- modules/app/email/config.el | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index e26b708f0..8f9210440 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -63,20 +63,20 @@ ;; Use fancy icons (setq mu4e-headers-has-child-prefix '("+" . "") mu4e-headers-empty-parent-prefix '("-" . "") - mu4e-headers-first-child-prefix '("-" . "") - mu4e-headers-duplicate-prefix '("-" . "") - mu4e-headers-default-prefix '("-" . "") - mu4e-headers-draft-mark '("-" . "") - mu4e-headers-flagged-mark '("-" . "") - mu4e-headers-new-mark '("-" . "") - mu4e-headers-passed-mark '("-" . "") - mu4e-headers-replied-mark '("-" . "") - mu4e-headers-seen-mark '("-" . "") - mu4e-headers-trashed-mark '("-" . "") - mu4e-headers-attach-mark '("-" . "") - mu4e-headers-encrypted-mark '("-" . "") - mu4e-headers-signed-mark '("-" . "") - mu4e-headers-unread-mark '("-" . "")) + mu4e-headers-first-child-prefix '("\\" . "") + mu4e-headers-duplicate-prefix '("=" . "") + mu4e-headers-default-prefix '("|" . "") + mu4e-headers-draft-mark '("D" . "") + mu4e-headers-flagged-mark '("F" . "") + mu4e-headers-new-mark '("N" . "") + mu4e-headers-passed-mark '("P" . "") + mu4e-headers-replied-mark '("R" . "") + mu4e-headers-seen-mark '("S" . "") + mu4e-headers-trashed-mark '("T" . "") + mu4e-headers-attach-mark '("a" . "") + mu4e-headers-encrypted-mark '("x" . "") + mu4e-headers-signed-mark '("s" . "") + mu4e-headers-unread-mark '("u" . "")) ;; Add a column to display what email account the email belongs to. (add-to-list 'mu4e-header-info-custom From 1d3a1ee82fdad7e639ad2046ca74d3d2043de82b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 17 Aug 2018 13:03:59 +0200 Subject: [PATCH 2804/4235] highlight-numbers-mode -> highlight-numbers #813 Correct package name --- core/core-ui.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 2286d8971..a4cc2d24e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -109,9 +109,9 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'completion-list-mode-hook #'hide-mode-line-mode) (add-hook 'Man-mode-hook #'hide-mode-line-mode) -;; `highlight-numbers-mode' -- better number literal fontification in code -(def-package! highlight-numbers-mode - :hook prog-mode +;; `highlight-numbers' -- better number literal fontification in code +(def-package! highlight-numbers + :hook (prog-mode . highlight-numbers-mode) :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+.*\\_>")) ;; `highlight-escape-sequences' From 6393ebe16bef4e581726329f7adc41022b0cd96f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sat, 18 Aug 2018 14:51:21 +0200 Subject: [PATCH 2805/4235] Removed redundant config --- modules/lang/coq/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index 62bbe97fe..ea8974723 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -1,7 +1,5 @@ ;;; lang/coq/config.el -*- lexical-binding: t; -*- (def-package! proof-site - :load-path +coq-pg-loc - :defer t :mode ("\\.v\\'" . coq-mode) :hook (coq-mode . company-coq-mode)) From 48c531e76cadd3576e303e33856ca0b87fdefd2d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 18 Aug 2018 23:45:36 +0200 Subject: [PATCH 2806/4235] lang/coq: move config.el to autoload.el The auto-mode-alist entry for coq-mode and friends are already added by proof-general's autoloads file, and neither coq-mode nor company-coq-mode belong to proof-site specifically, so they shouldn't be treated like they are (this could cause autoloading errors). The `def-package!` block altogether is unnecessary. The only thing we need is to enable `company-coq-mode` on coq-mode-hook. However, having a one-line config.el is a tad excessive, so we put it in autoload.el instead. --- modules/lang/coq/autoload.el | 4 ++++ modules/lang/coq/config.el | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 modules/lang/coq/autoload.el delete mode 100644 modules/lang/coq/config.el diff --git a/modules/lang/coq/autoload.el b/modules/lang/coq/autoload.el new file mode 100644 index 000000000..624185018 --- /dev/null +++ b/modules/lang/coq/autoload.el @@ -0,0 +1,4 @@ +;;; lang/coq/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(add-hook 'coq-mode-hook #'company-coq-mode) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el deleted file mode 100644 index ea8974723..000000000 --- a/modules/lang/coq/config.el +++ /dev/null @@ -1,5 +0,0 @@ -;;; lang/coq/config.el -*- lexical-binding: t; -*- - -(def-package! proof-site - :mode ("\\.v\\'" . coq-mode) - :hook (coq-mode . company-coq-mode)) From a3c0985aa0ada4e223fb503a7ea6fe1d96de7edd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 18 Aug 2018 23:50:28 +0200 Subject: [PATCH 2807/4235] lang/racket: remove keybind :desc properties #814 --- modules/lang/racket/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 18a896d1f..cfc912473 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -34,11 +34,11 @@ :n "t" #'racket-test :n "l" #'racket-logger :n "o" #'racket-profile - (:desc "eval" :prefix "s" + (:prefix "s" :n "d" #'racket-send-definition :n "l" #'racket-send-last-sexp :n "r" #'racket-send-region) - (:desc "macro expand" :prefix "e" + (:prefix "e" :n "d" #'racket-expand-definition :n "l" #'racket-expand-last-sexp :n "r" #'racket-expand-region From 81c3f3f02482a793d6c8e38c0ba068aaa14e351c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 18 Aug 2018 23:51:58 +0200 Subject: [PATCH 2808/4235] lang/racket: remove redundant localleader keybinds These already exist on TAB (for all users) and gc/= for evil users (or M-;/C-M-\ for non-evil users). --- modules/lang/racket/config.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index cfc912473..627b91fe9 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -44,7 +44,6 @@ :n "r" #'racket-expand-region :n "a" #'racket-expand-again) :n "r" #'racket-open-require-path - :n "TAB" #'indent-for-tab-command :n "u" #'racket-backward-up-list :n "[" #'racket-smart-open-bracket :n ")" #'racket-insert-closing @@ -61,6 +60,4 @@ :n "F" #'racket-unfold-all-tests :n "a" #'racket-align :n "A" #'racket-unalign - :nv ";" #'comment-dwim - :nv "\\" #'indent-region :n "i" #'racket-unicode-input-method-enable)) From 99815f8b98fbeb022c5d5abfb22dc46a3876ec1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 00:08:32 +0200 Subject: [PATCH 2809/4235] lang/racket: more sensible lookup handlers definition: racket-visit-definition documentation: racket-describe --- modules/lang/racket/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 627b91fe9..5e4899141 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -6,8 +6,8 @@ (set-popup-rule! "^\\*Racket REPL" :size 10 :select t) (set-repl-handler! 'racket-mode #'+racket/repl) (set-lookup-handlers! 'racket-mode - :definition #'racket-describe - :documentation #'racket-doc) + :definition #'racket-visit-definition + :documentation #'racket-describe) (set-docset! 'racket-mode "Racket") (set-pretty-symbols! 'racket-mode :lambda "lambda" From 743e43add1b2845808b02fba41fb3905069456b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 00:09:04 +0200 Subject: [PATCH 2810/4235] lang/racket: redo keybinds + Improve verbal mneumonics and enforce localleader conventions (e.g. h = help, g = goto) + Remove keybinds that other features replace (like smartparens or lookup handlers). + Alphabetize keybinds for easier skimming. --- modules/lang/racket/config.el | 48 +++++++++++++++-------------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 5e4899141..d86227128 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -27,37 +27,31 @@ (map! :map racket-mode-map :localleader - :n "c" #'racket-run - :n "z" #'racket-repl - :n "C" #'racket-run-and-switch-to-repl - :n "x" #'racket-racket - :n "t" #'racket-test + :n "a" #'racket-align + :n "A" #'racket-unalign + :n "f" #'racket-fold-all-tests + :n "F" #'racket-unfold-all-tests + :n "h" #'racket-doc + :n "i" #'racket-unicode-input-method-enable :n "l" #'racket-logger :n "o" #'racket-profile - (:prefix "s" - :n "d" #'racket-send-definition - :n "l" #'racket-send-last-sexp - :n "r" #'racket-send-region) + :n "p" #'racket-cycle-paren-shapes + :n "r" #'racket-run + :n "R" #'racket-run-and-switch-to-repl + :n "t" #'racket-test + :n "u" #'racket-backward-up-list + :n "y" #'racket-insert-lambda (:prefix "e" :n "d" #'racket-expand-definition :n "l" #'racket-expand-last-sexp :n "r" #'racket-expand-region :n "a" #'racket-expand-again) - :n "r" #'racket-open-require-path - :n "u" #'racket-backward-up-list - :n "[" #'racket-smart-open-bracket - :n ")" #'racket-insert-closing - :n "]" #'racket-insert-closing - :n "}" #'racket-insert-closing - :n "p" #'racket-cycle-paren-shapes - :n "y" #'racket-insert-lambda - :n "d" #'racket-doc - :n "." #'racket-describe - :n "M-." #'racket-visit-definition - :n "C-." #'racket-visit-module - :n "," #'racket-unvisit - :n "f" #'racket-fold-all-tests - :n "F" #'racket-unfold-all-tests - :n "a" #'racket-align - :n "A" #'racket-unalign - :n "i" #'racket-unicode-input-method-enable)) + (:prefix "g" + :n "d" #'racket-visit-definition + :n "m" #'racket-visit-module + :n "r" #'racket-open-require-path + :n "b" #'racket-unvisit) + (:prefix "s" + :n "d" #'racket-send-definition + :n "l" #'racket-send-last-sexp + :n "r" #'racket-send-region))) From 3d4b03a8ea1eb92526ec54ddb8d16357460583ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 00:13:18 +0200 Subject: [PATCH 2811/4235] lang/emacs-lisp: replace xref with elisp-def Possibly better goto-definition behavior than xref; needs more testing. --- modules/lang/emacs-lisp/config.el | 4 +++- modules/lang/emacs-lisp/packages.el | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index b1b798e1c..dd17e2659 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -31,7 +31,9 @@ (after! elisp-mode (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) - (set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) + (set-lookup-handlers! 'emacs-lisp-mode + :definition #'elisp-def + :documentation #'info-lookup-symbol) (set-docset! 'emacs-lisp-mode "Emacs Lisp") (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") (set-rotate-patterns! 'emacs-lisp-mode diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index cd22e35b0..12a4d1f24 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -5,6 +5,7 @@ (package! highlight-quoted) (package! macrostep) (package! overseer) +(package! elisp-def) (when (featurep! :feature syntax-checker) (package! flycheck-cask)) From 6d1db77fae3a67f0174659807f46ddc1066c56b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 01:12:24 +0200 Subject: [PATCH 2812/4235] Refactor lang/clojure & fix clojure handlers Ensure repl/eval/lookup handlers are set soon enough to take effect in first buffer. --- modules/lang/clojure/config.el | 61 +++++++++++++++++----------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 5f33f3f96..c3ffb044f 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,38 +1,37 @@ ;;; lang/clojure/config.el -*- lexical-binding: t; -*- ;; `clojure-mode' -(add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) +(after! clojure-mode + (add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) + + (def-package! cider + ;; NOTE: if you don't have an org directory set (the dir doesn't exist), + ;; cider jack in won't work. + :commands (cider-jack-in cider-jack-in-clojurescript) + :hook (clojure-mode . cider-mode) + :init + (set-popup-rule! "^\\*cider-repl" :quit nil :select nil) + (set-repl-handler! 'clojure-mode #'+clojure/repl) + (set-eval-handler! 'clojure-mode #'cider-eval-region) + (set-lookup-handlers! 'clojure-mode + :definition #'cider-browse-ns-find-at-point + :documentation #'cider-browse-ns-doc-at-point) + :config + (setq nrepl-hide-special-buffers t + cider-stacktrace-default-filters '(tooling dup) + cider-prompt-save-file-on-load nil + cider-repl-use-clojure-font-lock t) + (map! :map cider-mode-map + :localleader + :n "'" #'cider-jack-in + :n "\"" #'cider-jack-in-clojurescript + :n "B" #'cider-switch-to-repl-buffer + :n "n" #'cider-repl-set-ns + :n "j" #'cider-find-var + :n "h" #'cider-doc + :n "c" #'cider-repl-clear-buffer + :n "p" #'cider-eval-sexp-at-point))) (def-package! clj-refactor :after clojure-mode) - -(def-package! cider - ;; NOTE: if you don't have an org directory set (the dir doesn't exist), cider - ;; jack in won't work. - :commands (cider-jack-in cider-jack-in-clojurescript) - :hook (clojure-mode . cider-mode) - :config - (setq nrepl-hide-special-buffers t - cider-stacktrace-default-filters '(tooling dup) - cider-prompt-save-file-on-load nil - cider-repl-use-clojure-font-lock t) - (set-popup-rule! "^\\*cider-repl" :quit nil :select nil) - (set-repl-handler! 'clojure-mode #'+clojure/repl) - (set-eval-handler! 'clojure-mode #'cider-eval-region) - (set-lookup-handlers! 'clojure-mode - :definition #'cider-browse-ns-find-at-point - :documentation #'cider-browse-ns-doc-at-point) - - (map! :map cider-mode-map - :localleader - :n "'" #'cider-jack-in - :n "\"" #'cider-jack-in-clojurescript - :n "B" #'cider-switch-to-repl-buffer - :n "b" #'cider-eval-buffer - :n "n" #'cider-repl-set-ns - :n "j" #'cider-find-var - :n "d" #'cider-doc - :n "c" #'cider-repl-clear-buffer - :n "p" #'cider-eval-sexp-at-point - :n "r" #'cider-eval-region)) From 9e0e586dd8c0cd93a31e1b5ef8e0294cde6e5cc8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 01:13:45 +0200 Subject: [PATCH 2813/4235] tools/magit: use current window instead of fullcol Full column is a bit tempermental. This also removes the need to restore the window config after quitting magit. Why the switch from full-frame magit to current-buffer? It is the least intrusive policy; it doesn't rearrange the user's workspace. --- modules/tools/magit/autoload.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 3d0d44e04..ae0159869 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -21,16 +21,17 @@ (derived-mode-p 'magit-mode)) (let ((size (cond ((eq buffer-mode 'magit-process-mode) 0.35) ((bound-and-true-p git-commit-mode) 0.7) - (t 0.9)))) - `(display-buffer-below-selected . ((window-height . ,size))))) + (0.9)))) + `(display-buffer-below-selected + . ((window-height . ,(truncate (* (window-height) size))))))) ;; log/stash/process buffers, unless opened from a magit-status ;; window, should be opened in popups. ((memq buffer-mode '(magit-process-mode magit-log-mode magit-stash-mode)) - '(display-buffer-in-side-window)) - ;; Last resort: plain old fullcolumn. - ('(magit--display-buffer-fullcolumn)))))) + '(display-buffer-below-selected)) + ;; Last resort: use current window + ('(display-buffer-same-window)))))) ;;;###autoload (defun +magit-display-popup-buffer (buffer &optional alist) @@ -52,9 +53,7 @@ (defun +magit/quit (&optional _kill-buffer) "Clean up magit buffers after quitting `magit-status'." (interactive) - (let ((buffers (magit-mode-get-buffers))) - (magit-restore-window-configuration) - (mapc #'+magit--kill-buffer buffers))) + (mapc #'+magit--kill-buffer (magit-mode-get-buffers))) (defun +magit--kill-buffer (buf) "TODO" From e5096f854d6529f9904b7750b618d3ce30ef80b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 03:24:41 +0200 Subject: [PATCH 2814/4235] bin/doom: minimize user-error messages --- bin/doom | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bin/doom b/bin/doom index 6d55d29bd..20301491e 100755 --- a/bin/doom +++ b/bin/doom @@ -88,6 +88,8 @@ (setq argv nil noninteractive 'doom) (condition-case e (doom-dispatch args) + (user-error + (signal (car e) (cdr e))) ((debug error) (message "--------------------------------------------------\n") (message "There was an unexpected error:") From 2be0772b132d0aeba0c23b41150177a648c4fab6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 03:44:42 +0200 Subject: [PATCH 2815/4235] bin/doom: add patch-macos command Patches Emacs.app to respect your shell environment. --- core/core-cli.el | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/core/core-cli.el b/core/core-cli.el index 75020a054..250508d38 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -190,6 +190,20 @@ recompile. Run this whenever you: 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)") +(dispatcher! (patch-macos) (doom-patch-macos args) + "Patches Emacs.app to respect your shell environment. + +This searches for Emacs.app in /Applications and ~/Applications, then moves +Contents/MacOS/Emacs to Contents/MacOS/RunEmacs, and replaces the former with +the following wrapper script: + + #!/usr/bin/env bash + args=\"$@\" + pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\" + exec \"$SHELL\" -c \"$pwd/RunEmacs $args\" + +This ensures that Emacs is always aware of your shell environment.") + ;; ;; Quality of Life Commands @@ -281,12 +295,14 @@ problems with doom." This deploys a barebones config to `doom-private-dir', installs all missing packages and regenerates the autoloads file." + ;; Create `doom-private-dir' (let ((short-private-dir (abbreviate-file-name doom-private-dir))) (if (file-directory-p doom-private-dir) (print! (yellow "%s directory already exists. Skipping." short-private-dir)) (print! "Creating %s" short-private-dir) (make-directory doom-private-dir t) (print! (green "Done!"))) + ;; Create init.el (let ((init-file (expand-file-name "init.el" doom-private-dir))) (if (file-exists-p init-file) (print! (yellow "%sinit.el already exists. Skipping." short-private-dir)) @@ -294,6 +310,7 @@ packages and regenerates the autoloads file." (copy-file (expand-file-name "init.example.el" doom-emacs-dir) init-file) (print! (green "Done!")))) + ;; Create config.el (let ((config-file (expand-file-name "config.el" doom-private-dir))) (if (file-exists-p config-file) (print! "%sconfig.el already exists. Skipping." short-private-dir) @@ -309,6 +326,49 @@ packages and regenerates the autoloads file." (doom-template-insert "QUICKSTART_INTRO") (print! (buffer-string)))) +(defun doom-patch-macos (args) + "Patches Emacs.app to respect your shell environment." + (unless IS-MAC + (user-error "You don't seem to be running MacOS")) + (let ((appdir + (cl-find-if #'file-exists-p + (list "/Applications/Emacs.app" + "~/Applications/Emacs.app")))) + (unless appdir + (user-error "Couldn't find Emacs.app in /Applications or ~/Applications")) + (let ((oldbin (expand-file-name "Contents/MacOS/Emacs" appdir)) + (newbin (expand-file-name "Contents/MacOS/RunEmacs" appdir))) + (cond ((or (member "--undo" args) + (member "-u" args)) + (unless (file-exists-p newbin) + (user-error "Emacs.app is not patched")) + (copy-file newbin oldbin 'ok-if-already-exists nil nil 'preserve-permissions) + (unless (file-exists-p oldbin) + (error "Failed to copy %s to %s" newbin oldbin)) + (delete-file newbin) + (message "%s successfully unpatched" appdir)) + + ((file-exists-p newbin) + (user-error "%s is already patched" appdir)) + + ((or doom-auto-accept + (progn + (print! "/Applications/Emacs.app needs to be patched.") + (print! "\nWhy? So that Emacs will respect your shell configuration when not launched from the shell.") + (print! "\nHow? By replacing Emacs.app/Contents/MacOS/Emacs with a wrapper that launches Emacs from your shell.") + (y-or-n-p "Patch Emacs.app?"))) + (copy-file oldbin newbin nil nil nil 'preserve-permissions) + (unless (file-exists-p newbin) + (error "Failed to copy %s to %s" oldbin newbin)) + (with-temp-buffer + (insert "#!/usr/bin/env bash\n" + "args=\"$@\"\n" + "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"" + "exec \"$SHELL\" -c \"$pwd/RunEmacs $args\"") + (write-file oldbin) + (chmod oldbin (file-modes newbin))) + (message "%s successfully patched" appdir)))))) + ;; ;; Autoload file generation From f9b06bd3a84e7c9a4de95bca905b92d9aaadc2fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 19 Aug 2018 03:59:23 +0200 Subject: [PATCH 2816/4235] bin/doom: fix Emacs.app patch wrapper script --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 250508d38..94548a65a 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -363,7 +363,7 @@ packages and regenerates the autoloads file." (with-temp-buffer (insert "#!/usr/bin/env bash\n" "args=\"$@\"\n" - "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"" + "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"\n" "exec \"$SHELL\" -c \"$pwd/RunEmacs $args\"") (write-file oldbin) (chmod oldbin (file-modes newbin))) From 40eda029ab6eb9250afa8ebd0fe8710ea7dd6650 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 00:31:48 +0200 Subject: [PATCH 2817/4235] Fix "Select a root directory" prompts Occurs when :feature snippets is disabled, but :feature file-templates is enabled. --- modules/feature/file-templates/config.el | 29 +++++++++--------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index 4a0b0a9ab..f7fcaab41 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -124,22 +124,15 @@ must be non-read-only, empty, and there must be a rule in ;; Bootstrap ;; -(def-package! yasnippet - :unless (featurep! :feature snippets) - :config - (setq yas-verbosity (if doom-debug-mode 3 0) - yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) - yas-snippet-dirs nil) - ;; Exit snippets on ESC from normal mode - (add-hook 'doom-escape-hook #'yas-abort-snippet) - ;; - (yas-reload-all)) - - -(defun +file-templates|init () - (after! yasnippet - (add-to-list 'yas-snippet-dirs '+file-templates-dir 'append #'eq)) - (add-hook 'find-file-hook #'+file-templates|check)) - -(add-hook 'doom-post-init-hook #'+file-templates|init) +(after! yasnippet + (if (featurep! :feature snippets) + (add-to-list 'yas-snippet-dirs '+file-templates-dir 'append #'eq) + (setq yas-prompt-functions (delq #'yas-dropdown-prompt yas-prompt-functions) + yas-snippet-dirs '(+file-templates-dir)) + ;; Exit snippets on ESC from normal mode + (add-hook 'doom-escape-hook #'yas-abort-snippet) + ;; Ensure file templates in `+file-templates-dir' are visible + (yas-reload-all))) +;; +(add-hook 'find-file-hook #'+file-templates|check) From ecf9c14229432c02e0e2736a21dc9e34781877b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 00:33:19 +0200 Subject: [PATCH 2818/4235] Enable rainbow-delimiters-mode in sh-mode --- modules/lang/sh/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 0ae3712d6..5921322ef 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -39,6 +39,8 @@ (1 'sh-quoted-exec prepend)) (,(regexp-opt +sh-builtin-keywords 'words) (0 'font-lock-type-face append)))) + ;; 4. Fontify delimiters by depth + (add-hook 'sh-mode-hook #'rainbow-delimiters-mode) ;; autoclose backticks (sp-local-pair 'sh-mode "`" nil :unless '(sp-point-before-word-p sp-point-before-same-p)) From ce4891ea0dccfc42a21d4241bd1b05049290a9c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 23:33:07 +0200 Subject: [PATCH 2819/4235] lang/ledger: fix leader key in reports #818 --- modules/lang/ledger/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 0eb2c6339..7c8690de3 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -3,6 +3,12 @@ ;; `ledger-mode' (setq ledger-clear-whole-transactions 1) +;; Restore leader key in ledger reports +(after! ledger-mode + (define-key! (ledger-report-mode-map ledger-reconcile-mode-map) + doom-leader-key nil) + (define-key ledger-reconcile-mode-map [tab] #'ledger-reconcile-toggle)) + (def-package! evil-ledger :when (featurep! :feature evil) From a6f575ab1d51362f7aa99fe43ce1b1fbbf7d817c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 23:33:29 +0200 Subject: [PATCH 2820/4235] lang/ledger: don't error if ledger isn't installed --- modules/lang/ledger/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 7c8690de3..b53d9ae81 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -3,6 +3,13 @@ ;; `ledger-mode' (setq ledger-clear-whole-transactions 1) +(defun +ledger*check-version (orig-fn) + "Fail gracefully if ledger binary isn't available." + (if (executable-find ledger-binary-path) + (funcall orig-fn) + (message "Couldn't find '%s' executable" ledger-binary-path))) +(advice-add #'ledger-check-version :around #'+ledger*check-version) + ;; Restore leader key in ledger reports (after! ledger-mode (define-key! (ledger-report-mode-map ledger-reconcile-mode-map) From 9a792f34011db6b7aed6dda9c10503296efabdda Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 23:33:45 +0200 Subject: [PATCH 2821/4235] lang/ledger: tie evil-ledger to evil's +everywhere And move it down. Core plugins should be closer to the top. --- modules/lang/ledger/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index b53d9ae81..f4cffbdb6 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -17,11 +17,11 @@ (define-key ledger-reconcile-mode-map [tab] #'ledger-reconcile-toggle)) -(def-package! evil-ledger - :when (featurep! :feature evil) - :hook (ledger-mode . evil-ledger-mode)) - - (def-package! flycheck-ledger :when (featurep! :feature syntax-checker) :after ledger-mode) + + +(def-package! evil-ledger + :when (featurep! :feature evil +everywhere) + :hook (ledger-mode . evil-ledger-mode)) From 97bc69b9e58a42ad6892570ddebdd811d4ca2972 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 23:47:16 +0200 Subject: [PATCH 2822/4235] lang/emacs-lisp: recenter window after elisp-def --- modules/lang/emacs-lisp/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index dd17e2659..9cb5f9b64 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -122,7 +122,10 @@ library/userland functions" if (file-in-directory-p buffer-file-name dir) return t))) (flycheck-mode -1))) - (add-hook 'flycheck-mode-hook #'+emacs-lisp|disable-flycheck-maybe)) + (add-hook 'flycheck-mode-hook #'+emacs-lisp|disable-flycheck-maybe) + + ;; Recenter window after following definition + (advice-add #'elisp-def :after #'doom*recenter)) ;; From 1cb31d7cb5be4efdbfe63a8fc248e4a330fc52a8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 23:47:31 +0200 Subject: [PATCH 2823/4235] lang/emacs-lisp: optimize symbol fontification By ignoring symbols in comments and strings. --- modules/lang/emacs-lisp/config.el | 41 +++++++++++++++++-------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 9cb5f9b64..f4eb8bf89 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -64,25 +64,28 @@ Functions are differentiated into special forms, built-in functions and library/userland functions" (catch 'matcher (while (re-search-forward "\\_<.+?\\_>" end t) - (let ((symbol (intern-soft (match-string-no-properties 0)))) - (and (cond ((null symbol) nil) - ((eq symbol t) nil) - ((special-variable-p symbol) - (setq +emacs-lisp--face 'font-lock-variable-name-face)) - ((and (fboundp symbol) - (eq (char-before (match-beginning 0)) ?\()) - (let ((unaliased (indirect-function symbol t))) - (unless (or (macrop unaliased) - (special-form-p unaliased)) - (let (unadvised) - (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) - (setq unaliased (indirect-function unadvised t))))) - unaliased) - (setq +emacs-lisp--face - (if (subrp unaliased) - 'font-lock-constant-face - 'font-lock-function-name-face)))))) - (throw 'matcher t)))) + (unless (save-excursion + (let ((ppss (syntax-ppss))) + (or (nth 3 ppss) (nth 4 ppss)))) + (let ((symbol (intern-soft (match-string-no-properties 0)))) + (and (cond ((null symbol) nil) + ((eq symbol t) nil) + ((special-variable-p symbol) + (setq +emacs-lisp--face 'font-lock-variable-name-face)) + ((and (fboundp symbol) + (eq (char-before (match-beginning 0)) ?\()) + (let ((unaliased (indirect-function symbol t))) + (unless (or (macrop unaliased) + (special-form-p unaliased)) + (let (unadvised) + (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) + (setq unaliased (indirect-function unadvised t))))) + unaliased) + (setq +emacs-lisp--face + (if (subrp unaliased) + 'font-lock-constant-face + 'font-lock-function-name-face)))))) + (throw 'matcher t))))) nil)) (eval-when-compile (byte-compile #'+emacs-lisp-highlight-vars-and-faces)) From 6b7f97f4fc14f25b52c0a5e27a76406e2f5c8309 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 20 Aug 2018 23:56:56 +0200 Subject: [PATCH 2824/4235] Autoload doom-quit-p & revise its docstring --- core/autoload/ui.el | 12 ++++++++++++ core/core-ui.el | 13 ++----------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index af357eeaf..71ae4297c 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -124,3 +124,15 @@ to a new one." ;;;###autoload (defun doom*recenter (&rest _) (recenter)) + +;;;###autoload +(defun doom-quit-p (&optional prompt) + "Prompt the user for confirmation when killing Emacs. + +Returns t if it is safe to kill this session. Does not prompt if no real buffers +are open." + "Return t if this session should be killed silently." + (if (ignore-errors (doom-real-buffer-list)) + (or (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) + (ignore (message "Aborted"))) + t)) diff --git a/core/core-ui.el b/core/core-ui.el index a4cc2d24e..11a3f638f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -36,7 +36,8 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") compilation-ask-about-save nil ; save all buffers on `compile' compilation-scroll-output 'first-error confirm-nonexistent-file-or-buffer t - cursor-in-non-selected-windows nil ; hide cursors in other windows + confirm-kill-emacs #'doom-quit-p ; custom confirmation when killing Emacs + cursor-in-non-selected-windows nil ; hide cursors in other windows custom-theme-directory (expand-file-name "themes/" doom-private-dir) display-line-numbers-width 3 enable-recursive-minibuffers nil @@ -490,16 +491,6 @@ frame's window-system, the theme will be reloaded.") (add-hook 'doom-escape-hook #'doom|delete-posframe-on-escape) (add-hook 'doom-cleanup-hook #'posframe-delete-all)) -;; Customized confirmation prompt for quitting Emacs -(defun doom-quit-p (&optional prompt) - "Return t if this session should be killed. Prompts the user for -confirmation." - (if (ignore-errors (doom-real-buffer-list)) - (or (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) - (ignore (message "Aborted"))) - t)) -(setq confirm-kill-emacs #'doom-quit-p) - (defun doom|compilation-ansi-color-apply () "Applies ansi codes to the compilation buffers. Meant for `compilation-filter-hook'." From 4acb3f29ab9fdeeb8e488e60a4a356887eea1e75 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 00:04:48 +0200 Subject: [PATCH 2825/4235] lang/emacs-lisp: reformat & autoload functions --- modules/lang/emacs-lisp/autoload.el | 106 ++++++++++++++++++++++++---- modules/lang/emacs-lisp/config.el | 71 +++---------------- 2 files changed, 99 insertions(+), 78 deletions(-) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 4071df3f1..faa2700d4 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -1,24 +1,9 @@ ;;; lang/emacs-lisp/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(autoload 'overseer-test "overseer" nil t) - - ;; ;; Library ;; -;;;###autoload -(defun +emacs-lisp/repl () - "Open the Emacs Lisp REPL (`ielm')." - (interactive) - (pop-to-buffer - (or (get-buffer "*ielm*") - (progn (ielm) - (let ((buf (get-buffer "*ielm*"))) - (bury-buffer buf) - buf))))) - ;;;###autoload (defun +emacs-lisp-eval (beg end) "Evaluate a region and print it to the echo area (if one line long), otherwise @@ -44,3 +29,94 @@ to a pop up buffer." (t (message "%s" (buffer-substring (point-min) (point-max))) (kill-buffer buf)))))) + +(defvar +emacs-lisp--face nil) +;;;###autoload +(defun +emacs-lisp-highlight-vars-and-faces (end) + "Match defined variables and functions. + +Functions are differentiated into special forms, built-in functions and +library/userland functions" + (catch 'matcher + (while (re-search-forward "\\_<.+?\\_>" end t) + (unless (save-excursion + (let ((ppss (syntax-ppss))) + (or (nth 3 ppss) (nth 4 ppss)))) + (let ((symbol (intern-soft (match-string-no-properties 0)))) + (and (cond ((null symbol) nil) + ((eq symbol t) nil) + ((special-variable-p symbol) + (setq +emacs-lisp--face 'font-lock-variable-name-face)) + ((and (fboundp symbol) + (eq (char-before (match-beginning 0)) ?\()) + (let ((unaliased (indirect-function symbol))) + (unless (or (macrop unaliased) + (special-form-p unaliased)) + (let (unadvised) + (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) + (setq unaliased (indirect-function unadvised))))) + unaliased) + (setq +emacs-lisp--face + (if (subrp unaliased) + 'font-lock-constant-face + 'font-lock-function-name-face)))))) + (throw 'matcher t))))) + nil)) + +;; `+emacs-lisp-highlight-vars-and-faces' is a potentially expensive function +;; and should be byte-compiled, no matter what, to ensure it runs as fast as +;; possible: +(eval-when-compile + (with-no-warnings + (byte-compile #'+emacs-lisp-highlight-vars-and-faces))) + + +;; +;; Commands +;; + +;;;###autoload +(defun +emacs-lisp/repl () + "Open the Emacs Lisp REPL (`ielm')." + (interactive) + (pop-to-buffer + (or (get-buffer "*ielm*") + (progn (ielm) + (let ((buf (get-buffer "*ielm*"))) + (bury-buffer buf) + buf))))) + + +;; +;; Hooks +;; + +;;;###autoload +(defun +emacs-lisp|extend-imenu () + "Improve imenu support with better expression regexps and Doom-specific forms." + (setq imenu-generic-expression + '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) + ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) + ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) + ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) + ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) + ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") + ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) + ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) + ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) + ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) + ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\|var\\(?:-local\\)?\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) + ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) + +;;;###autoload +(defun +emacs-lisp|disable-flycheck-maybe () + "Disable flycheck-mode if in emacs.d." + (when (and (bound-and-true-p flycheck-mode) + (eq major-mode 'emacs-lisp-mode) + (or (not buffer-file-name) + (cl-loop for dir in (list doom-emacs-dir doom-private-dir) + if (file-in-directory-p buffer-file-name dir) + return t))) + (flycheck-mode -1))) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index f4eb8bf89..7aab19a2c 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -54,41 +54,11 @@ ;; fontification rainbow-delimiters-mode highlight-quoted-mode ;; initialization - +emacs-lisp|init-imenu)) + +emacs-lisp|extend-imenu)) - (defvar +emacs-lisp--face nil) - (defun +emacs-lisp-highlight-vars-and-faces (end) - "Match defined variables and functions. - -Functions are differentiated into special forms, built-in functions and -library/userland functions" - (catch 'matcher - (while (re-search-forward "\\_<.+?\\_>" end t) - (unless (save-excursion - (let ((ppss (syntax-ppss))) - (or (nth 3 ppss) (nth 4 ppss)))) - (let ((symbol (intern-soft (match-string-no-properties 0)))) - (and (cond ((null symbol) nil) - ((eq symbol t) nil) - ((special-variable-p symbol) - (setq +emacs-lisp--face 'font-lock-variable-name-face)) - ((and (fboundp symbol) - (eq (char-before (match-beginning 0)) ?\()) - (let ((unaliased (indirect-function symbol t))) - (unless (or (macrop unaliased) - (special-form-p unaliased)) - (let (unadvised) - (while (not (eq (setq unadvised (ad-get-orig-definition unaliased)) - (setq unaliased (indirect-function unadvised t))))) - unaliased) - (setq +emacs-lisp--face - (if (subrp unaliased) - 'font-lock-constant-face - 'font-lock-function-name-face)))))) - (throw 'matcher t))))) - nil)) - (eval-when-compile - (byte-compile #'+emacs-lisp-highlight-vars-and-faces)) + ;; Flycheck produces a *lot* of false positives in emacs configs, so disable + ;; it when you're editing them + (add-hook 'flycheck-mode-hook #'+emacs-lisp|disable-flycheck-maybe) ;; Special fontification for doom (font-lock-add-keywords @@ -98,35 +68,6 @@ library/userland functions" ;; highlight defined, special variables & functions (+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face)))) - (defun +emacs-lisp|init-imenu () - "Improve imenu support with better expression regexps and Doom-specific forms." - (setq imenu-generic-expression - '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) - ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) - ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) - ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) - ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) - ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") - ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) - ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) - ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) - ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) - ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\|var\\(?:-local\\)?\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) - ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) - - (defun +emacs-lisp|disable-flycheck-maybe () - "Disable flycheck-mode if in emacs.d." - (when (and flycheck-mode - (eq major-mode 'emacs-lisp-mode) - (or (not buffer-file-name) - (cl-loop for dir in (list doom-emacs-dir doom-private-dir) - if (file-in-directory-p buffer-file-name dir) - return t))) - (flycheck-mode -1))) - (add-hook 'flycheck-mode-hook #'+emacs-lisp|disable-flycheck-maybe) - ;; Recenter window after following definition (advice-add #'elisp-def :after #'doom*recenter)) @@ -165,6 +106,10 @@ library/userland functions" (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps))) +;; `overseer' +(autoload 'overseer-test "overseer" nil t) + + (def-package! flycheck-cask :when (featurep! :feature syntax-checker) :defer t From 154b3c331bfbada500f1c2a67d38c9f9110e87c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 00:05:39 +0200 Subject: [PATCH 2826/4235] helm: remap find-library -> helm-locate-library Is superior to find-library --- modules/completion/helm/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index f43a596c3..d72077cef 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -43,6 +43,7 @@ be negative.") :init (define-key! 'global [remap apropos] #'helm-apropos + [remap find-library] #'helm-locate-library [remap bookmark-jump] #'helm-bookmarks [remap execute-extended-command] #'helm-M-x [remap find-file] #'helm-find-files From aa9b0a8b94863113394f70b31acf9c97d4e7e3a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 02:45:23 +0200 Subject: [PATCH 2827/4235] lang/org: set org-cycle-separator-lines to default Relevant to #800 --- modules/lang/org/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 9d1c0d81a..73b4b3a10 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -154,7 +154,6 @@ unfold to point on startup." (setq-default org-adapt-indentation nil org-cycle-include-plain-lists t - org-cycle-separator-lines 1 org-eldoc-breadcrumb-separator " → " org-entities-user '(("flat" "\\flat" nil "" "" "266D" "♭") From 64a88385cb155b28a24b2c9ada6a1936dd68e695 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 02:46:17 +0200 Subject: [PATCH 2828/4235] lang/org: make shiftab respect org-cycle-separator-lines #800 --- modules/lang/org/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 73b4b3a10..c6e6e6960 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -185,7 +185,6 @@ unfold to point on startup." (sequence "TODO(T)" "|" "DONE(D)") (sequence "NEXT(n)" "ACTIVE(a)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)")) org-use-sub-superscripts '{} - outline-blank-line t ;; Scale up LaTeX previews a bit (default is too small) org-preview-latex-image-directory (concat doom-cache-dir "org-latex/") From 4618b7afadbb9294a54772e1d93e19f23bbe31d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 02:52:08 +0200 Subject: [PATCH 2829/4235] Refactor & reformat core-ui --- core/autoload/buffers.el | 46 +++++++++++++ core/autoload/ui.el | 7 ++ core/core-ui.el | 136 ++++++++++++++------------------------- 3 files changed, 100 insertions(+), 89 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index f05ba64ae..1d599623d 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -199,12 +199,58 @@ regex PATTERN. Returns the number of killed buffers." ;; Hooks ;; +;;;###autoload +(defun doom|protect-visible-buffer () + "Don't kill the current buffer if it is visible in another window (bury it +instead). Meant for `kill-buffer-query-functions'." + (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) + (not (member (substring (buffer-name) 0 1) '(" " "*")))))) + +;;;###autoload +(defun doom|protect-fallback-buffer () + "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." + (not (eq (current-buffer) (doom-fallback-buffer)))) + ;;;###autoload (defun doom|mark-buffer-as-real () "Hook function that marks the current buffer as real." (doom-set-buffer-real (current-buffer) t)) +;; +;; Advice +;; + +;;;###autoload +(defun doom*switch-to-fallback-buffer-maybe (orig-fn) + "Advice for `kill-this-buffer'. If in a dedicated window, delete it. If there +are no real buffers left OR if all remaining buffers are visible in other +windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original +`kill-this-buffer'." + (let ((buf (current-buffer))) + (cond ((window-dedicated-p) + (delete-window)) + ((eq buf (doom-fallback-buffer)) + (message "Can't kill the fallback buffer.")) + ((doom-real-buffer-p buf) + (if (and buffer-file-name + (buffer-modified-p buf) + (not (y-or-n-p + (format "Buffer %s is modified; kill anyway?" buf)))) + (message "Aborted") + (set-buffer-modified-p nil) + (when (or ;; if there aren't more real buffers than visible buffers, + ;; then there are no real, non-visible buffers left. + (not (cl-set-difference (doom-real-buffer-list) + (doom-visible-buffers))) + ;; if we end up back where we start (or previous-buffer + ;; returns nil), we have nowhere left to go + (memq (previous-buffer) (list buf 'nil))) + (switch-to-buffer (doom-fallback-buffer))) + (kill-buffer buf))) + ((funcall orig-fn))))) + + ;; ;; Interactive commands ;; diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 71ae4297c..490ce3b94 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -136,3 +136,10 @@ are open." (or (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) (ignore (message "Aborted"))) t)) + +;;;###autoload +(defun doom|apply-ansi-color-to-compilation-buffer () + "Applies ansi codes to the compilation buffers. Meant for +`compilation-filter-hook'." + (with-silent-modifications + (ansi-color-apply-on-region compilation-filter-start (point)))) diff --git a/core/core-ui.el b/core/core-ui.el index 11a3f638f..45ee5ccae 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -83,6 +83,50 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (defun define-fringe-bitmap (&rest _))) +;; +;; Fixes/hacks +;; + +(defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) + (let ((frame (apply orig-fn args))) + (with-selected-frame frame + (setq-local whitespace-style nil) + frame))) +(advice-add #'company-box--make-frame :around #'doom*fix-whitespace-mode-in-childframes) +(advice-add #'posframe--create-posframe :around #'doom*fix-whitespace-mode-in-childframes) + +;; Posframes sometimes linger; force it to clean up after itself! +(after! posframe + ;; TODO Find a better place for this + (defun doom|delete-posframe-on-escape () + (unless (frame-parameter (selected-frame) 'posframe-buffer) + (cl-loop for frame in (frame-list) + if (and (frame-parameter frame 'posframe-buffer) + (not (frame-visible-p frame))) + do (delete-frame frame)) + (dolist (buffer (buffer-list)) + (let ((frame (buffer-local-value 'posframe--frame buffer))) + (when (and frame (or (not (frame-live-p frame)) + (not (frame-visible-p frame)))) + (posframe--kill-buffer buffer)))))) + (add-hook 'doom-escape-hook #'doom|delete-posframe-on-escape) + (add-hook 'doom-cleanup-hook #'posframe-delete-all)) + +;; Disruptive motion errors take over the minibuffer while we're typing there; +;; prevent this from happening. +(defun doom*silence-motion-errors (orig-fn &rest args) + (if (not (minibufferp)) + (apply orig-fn args) + (ignore-errors (apply orig-fn args)) + (when (<= (point) (minibuffer-prompt-end)) + (goto-char (minibuffer-prompt-end))))) + +(advice-add #'left-char :around #'doom*silence-motion-errors) +(advice-add #'right-char :around #'doom*silence-motion-errors) +(advice-add #'delete-backward-char :around #'doom*silence-motion-errors) +(advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) + + ;; ;; Plugins ;; @@ -248,23 +292,6 @@ from the default." (add-hook 'after-change-major-mode-hook #'doom|show-whitespace-maybe) -;; -;; Silence motion errors in minibuffer -;; - -(defun doom*silence-motion-errors (orig-fn &rest args) - (if (not (minibufferp)) - (apply orig-fn args) - (ignore-errors (apply orig-fn args)) - (when (<= (point) (minibuffer-prompt-end)) - (goto-char (minibuffer-prompt-end))))) - -(advice-add #'left-char :around #'doom*silence-motion-errors) -(advice-add #'right-char :around #'doom*silence-motion-errors) -(advice-add #'delete-backward-char :around #'doom*silence-motion-errors) -(advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) - - ;; ;; Line numbers ;; @@ -466,37 +493,6 @@ frame's window-system, the theme will be reloaded.") ;; a more sensible load-theme, that disables previous themes first [remap load-theme] #'doom/switch-theme) -(defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) - (let ((frame (apply orig-fn args))) - (with-selected-frame frame - (setq-local whitespace-style nil) - frame))) -(advice-add #'company-box--make-frame :around #'doom*fix-whitespace-mode-in-childframes) -(advice-add #'posframe--create-posframe :around #'doom*fix-whitespace-mode-in-childframes) - -;; ensure posframe cleans up after itself -(after! posframe - ;; TODO Find a better place for this - (defun doom|delete-posframe-on-escape () - (unless (frame-parameter (selected-frame) 'posframe-buffer) - (cl-loop for frame in (frame-list) - if (and (frame-parameter frame 'posframe-buffer) - (not (frame-visible-p frame))) - do (delete-frame frame)) - (dolist (buffer (buffer-list)) - (let ((frame (buffer-local-value 'posframe--frame buffer))) - (when (and frame (or (not (frame-live-p frame)) - (not (frame-visible-p frame)))) - (posframe--kill-buffer buffer)))))) - (add-hook 'doom-escape-hook #'doom|delete-posframe-on-escape) - (add-hook 'doom-cleanup-hook #'posframe-delete-all)) - -(defun doom|compilation-ansi-color-apply () - "Applies ansi codes to the compilation buffers. Meant for -`compilation-filter-hook'." - (with-silent-modifications - (ansi-color-apply-on-region compilation-filter-start (point)))) - (defun doom|no-fringes-in-minibuffer (&rest _) "Disable fringes in the minibuffer window." (set-window-fringes (minibuffer-window) 0 0 nil)) @@ -516,44 +512,6 @@ frame's window-system, the theme will be reloaded.") ((stringp name) name) ((error "'%s' isn't a valid name for %s" name major-mode)))))) -(defun doom|protect-visible-buffers () - "Don't kill the current buffer if it is visible in another window (bury it -instead)." - (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) - (not (member (substring (buffer-name) 0 1) '(" " "*")))))) - -(defun doom|protect-fallback-buffer () - "Don't kill the scratch buffer." - (not (eq (current-buffer) (doom-fallback-buffer)))) - -(defun doom*switch-to-fallback-buffer-maybe (orig-fn) - "Advice for `kill-this-buffer'. If in a dedicated window, delete it. If there -are no real buffers left OR if all remaining buffers are visible in other -windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original -`kill-this-buffer'." - (let ((buf (current-buffer))) - (cond ((window-dedicated-p) - (delete-window)) - ((eq buf (doom-fallback-buffer)) - (message "Can't kill the fallback buffer.")) - ((doom-real-buffer-p buf) - (if (and buffer-file-name - (buffer-modified-p buf) - (not (y-or-n-p - (format "Buffer %s is modified; kill anyway?" buf)))) - (message "Aborted") - (set-buffer-modified-p nil) - (when (or ;; if there aren't more real buffers than visible buffers, - ;; then there are no real, non-visible buffers left. - (not (cl-set-difference (doom-real-buffer-list) - (doom-visible-buffers))) - ;; if we end up back where we start (or previous-buffer - ;; returns nil), we have nowhere left to go - (memq (previous-buffer) (list buf 'nil))) - (switch-to-buffer (doom-fallback-buffer))) - (kill-buffer buf))) - ((funcall orig-fn))))) - (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." @@ -562,13 +520,13 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; Switch to `doom-fallback-buffer' if on last real buffer (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) ;; Don't kill the fallback buffer - (add-hook 'kill-buffer-query-functions #'doom|protect-fallback-buffer) + (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil #'eq) ;; Don't kill buffers that are visible in another window, only bury them - (add-hook 'kill-buffer-query-functions #'doom|protect-visible-buffers) + (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil #'eq) ;; Renames major-modes [pedantry intensifies] (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) ;; Ensure ansi codes in compilation buffers are replaced - (add-hook 'compilation-filter-hook #'doom|compilation-ansi-color-apply) + (add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) ;; (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) From 24cddafc8abf849b7b603957bc67a140616ebd3a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 03:34:12 +0200 Subject: [PATCH 2830/4235] Update tests --- core/test/test-autoload-package.el | 9 +++++++-- core/test/test-core-ui.el | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core/test/test-autoload-package.el b/core/test/test-autoload-package.el index 73ba65722..3560b53e7 100644 --- a/core/test/test-autoload-package.el +++ b/core/test/test-autoload-package.el @@ -4,6 +4,7 @@ (describe "core/autoload/packages" :var (package-alist package-archive-contents + package-selected-packages doom-packages quelpa-cache quelpa-initialized-p @@ -16,7 +17,9 @@ (before-all (fset 'pkg (lambda (name version &optional reqs) - (package-desc-create :name name :version version :reqs reqs))) + (package-desc-create + :name name :version version :reqs reqs + :dir (expand-file-name (format "%s/" name) package-user-dir)))) (require 'package) (require 'quelpa) (setq doom-packages-dir (expand-file-name "packages/" (file-name-directory load-file-name)) @@ -24,6 +27,7 @@ quelpa-dir (expand-file-name "quelpa" doom-packages-dir) quelpa-initialized-p t doom-core-packages nil) + (spy-on #'package--user-installed-p :and-call-fake (lambda (_p) t)) (spy-on #'doom-initialize-packages :and-call-fake (lambda (&optional _))) (spy-on #'package-refresh-contents :and-call-fake (lambda (&optional _))) (spy-on #'quelpa-checkout :and-call-fake @@ -57,7 +61,8 @@ quelpa-cache '((doom-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist") (doom-noquelpa-dummy :fetcher github :repo "hlissner/does-not-exist-3") - (doom-new-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist-2")))) + (doom-new-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist-2")) + package-selected-packages (mapcar #'car doom-packages))) (describe "package-backend" (it "determines the correct backend of a package" diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el index 2ef290d63..eedc64a1d 100644 --- a/core/test/test-core-ui.el +++ b/core/test/test-core-ui.el @@ -23,12 +23,12 @@ (expect (js-mode) :to-throw 'error))) - (describe "doom|protect-visible-buffers" + (describe "doom|protect-visible-buffer" :var (kill-buffer-query-functions wconf a b) (before-each (setq a (switch-to-buffer (get-buffer-create "a")) b (get-buffer-create "b") - kill-buffer-query-functions '(doom|protect-visible-buffers) + kill-buffer-query-functions '(doom|protect-visible-buffer) wconf (current-window-configuration)) (delete-other-windows)) From a7da9a473817bb26addd76ff01bcaa4b67ab91f4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 02:54:28 +0200 Subject: [PATCH 2831/4235] :boom: Rewrite line numbers system for Emacs 25 This removes the various doom-line-number* variables and replaces it with the Emacs 26 display-line-numbers API, which I've ported to Emacs 25.x (however, it uses nlinum under the hood, and not all of display-line-numbers options are supported). --- core/autoload/line-numbers.el | 82 +++++++++++++++++++++++++++++++++++ core/core-ui.el | 42 +++--------------- modules/app/write/config.el | 4 +- modules/lang/ess/config.el | 2 +- modules/lang/rest/config.el | 2 +- 5 files changed, 90 insertions(+), 42 deletions(-) create mode 100644 core/autoload/line-numbers.el diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el new file mode 100644 index 000000000..279d2fbac --- /dev/null +++ b/core/autoload/line-numbers.el @@ -0,0 +1,82 @@ +;;; core/autoload/line-numbers.el -*- lexical-binding: t; -*- +;;;###if (not (boundp 'display-line-numbers)) + +;; This was lifted out of the display-line-numbers library in Emacs 26.1 and +;; modified to use nlinum for Emacs 25.x users. It should be removed should +;; Emacs 25 support be removed. + +;;;###autoload +(defvar display-line-numbers t + "Non-nil means display line numbers. + +If the value is t, display the absolute number of each line of a buffer +shown in a window. Absolute line numbers count from the beginning of +the current narrowing, or from buffer beginning. If the value is +relative, display for each line not containing the window's point its +relative number instead, i.e. the number of the line relative to the +line showing the window's point. + +In either case, line numbers are displayed at the beginning of each +non-continuation line that displays buffer text, i.e. after each newline +character that comes from the buffer. The value visual is like +relative but counts screen lines instead of buffer lines. In practice +this means that continuation lines count as well when calculating the +relative number of a line. + +Lisp programs can disable display of a line number of a particular +buffer line by putting the display-line-numbers-disable text property +or overlay property on the first visible character of that line.") + +;;;###autoload +(defcustom display-line-numbers-type t + "The default type of line numbers to use in `display-line-numbers-mode'. +See `display-line-numbers' for value options." + :type '(choice (const :tag "Relative line numbers" relative) + (const :tag "Relative visual line numbers" visual) + (other :tag "Absolute line numbers" t))) + +;;;###autoload +(defcustom display-line-numbers-grow-only nil + "If non-nil, do not shrink line number width." + :type 'boolean) + +;;;###autoload +(defcustom display-line-numbers-width-start nil + "If non-nil, count number of lines to use for line number width. +When `display-line-numbers-mode' is turned on, +`display-line-numbers-width' is set to the minimum width necessary +to display all line numbers in the buffer." + :type 'boolean) + +(defun display-line-numbers-update-width () + "Prevent the line number width from shrinking." + (let ((width (line-number-display-width))) + (when (> width (or display-line-numbers-width 1)) + (setq display-line-numbers-width width)))) + +;;;###autoload +(define-minor-mode display-line-numbers-mode + "Toggle display of line numbers in the buffer. +This uses `display-line-numbers' internally. + +To change the type of line numbers displayed by default, +customize `display-line-numbers-type'. To change the type while +the mode is on, set `display-line-numbers' directly." + :lighter nil + (cond ((eq display-line-numbers-type 'relative) + (if display-line-numbers-mode + (nlinum-relative-off) + (nlinum-relative-on))) + ((not (null display-line-numbers-type)) + (nlinum-mode (if display-line-numbers-mode +1 -1))))) + +(defun display-line-numbers--turn-on () + "Turn on `display-line-numbers-mode'." + (unless (or (minibufferp) + ;; taken from linum.el + (and (daemonp) (null (frame-parameter nil 'client)))) + (display-line-numbers-mode))) + +;;;###autoload +(define-globalized-minor-mode global-display-line-numbers-mode + display-line-numbers-mode display-line-numbers--turn-on) diff --git a/core/core-ui.el b/core/core-ui.el index 45ee5ccae..383e70856 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -296,43 +296,11 @@ from the default." ;; Line numbers ;; -(defvar doom-line-numbers-style t - "The default styles to use for the line number display. Accepts one of the -following: +;; Emacs 26+ has native line number support, and will ignore nlinum. This is for +;; Emacs 25 users: +(defun doom|enable-line-numbers () (display-line-numbers-mode +1)) +(defun doom|disable-line-numbers () (display-line-numbers-mode -1)) - nil No line numbers - t Ordinary line numbers - 'relative Relative line numbers - -Use `doom/toggle-line-numbers' to cycle between these line number styles.") - -(when (boundp 'display-line-numbers) - (defvar doom-line-numbers-visual-style nil - "If non-nil, relative line numbers will be countered by screen line, rather -than buffer line. Setting this to non-nil is the equivalent of using 'visual in -`display-line-numbers'. - -It has no effect on nlinum.")) - -(defun doom|enable-line-numbers (&optional arg) - "Enables the display of line numbers, using `display-line-numbers' (in Emacs -26+) or `nlinum-mode'. - -See `doom-line-numbers-style' to control the style of line numbers to display." - (cond ((boundp 'display-line-numbers) - (setq display-line-numbers (unless (eq arg -1) doom-line-numbers-style))) - ((eq doom-line-numbers-style 'relative) - (if (eq arg -1) - (nlinum-relative-off) - (nlinum-relative-on))) - ((not (null doom-line-numbers-style)) - (nlinum-mode (or arg +1))))) - -(defun doom|disable-line-numbers () - "Disable the display of line numbers." - (doom|enable-line-numbers -1)) - -;; Emacs 26+ has native line number support. ;; Line number column. A faster (or equivalent, in the worst case) line number ;; plugin than `linum-mode'. (def-package! nlinum @@ -484,7 +452,7 @@ frame's window-system, the theme will be reloaded.") ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) ;; line numbers in most modes -(add-hook! (prog-mode text-mode conf-mode) #'doom|enable-line-numbers) +(add-hook! (prog-mode text-mode conf-mode) #'display-line-numbers-mode) ;; More sensibile replacements for default commands (define-key! 'global diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 2f85f1eb3..39c74b326 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -7,9 +7,7 @@ "What to set `line-spacing' in `+write-mode'.") (defun +write|init-line-numbers () - (if +write-mode - (doom|enable-line-numbers) - (doom|disable-line-numbers))) + (display-line-numbers-mode (if +write-mode +1 -1))) (defun +write|init-mixed-pitch () (mixed-pitch-mode (if +write-mode +1 -1))) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index e701ad80d..a4e7a3467 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -34,7 +34,7 @@ (unless (featurep! :lang julia) (add-to-list 'auto-mode-alist '("\\.jl\\'" . ess-julia-mode))) :config - (add-hook 'ess-mode-hook #'doom|enable-line-numbers) + (add-hook 'ess-mode-hook #'display-line-numbers-mode) (setq ess-offset-continued 'straight ess-expression-offset 2 ess-nuke-trailing-whitespace-p t diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index b059c111e..2ba0f1584 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -6,7 +6,7 @@ (set-popup-rule! "^\\*HTTP Response" :size 0.4 :quit 'other) ;; line numbers aren't enabled by default in fundamental-mode-derived modes - (add-hook 'restclient-mode-hook #'doom|enable-line-numbers) + (add-hook 'restclient-mode-hook #'display-line-numbers-mode) ;; Forces underlying SSL verification to prompt for self-signed or invalid ;; certs, rather than silently reject them. From ee73d6c9af32f1a442c00c710222a352f25b727c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 02:57:40 +0200 Subject: [PATCH 2832/4235] Minor reformatting & comment tweaks --- core/core.el | 1 - modules/completion/helm/config.el | 2 +- modules/lang/sh/config.el | 1 + modules/ui/doom-dashboard/config.el | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 4613e090d..621199786 100644 --- a/core/core.el +++ b/core/core.el @@ -228,7 +228,6 @@ original value of `symbol-file'." ;; Custom hooks ;; - (defvar doom-init-hook nil "Hooks run after all init.el files are loaded, including your private and all module init.el files, but before their config.el files are loaded.") diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index d72077cef..755195f26 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -59,7 +59,7 @@ be negative.") [remap recentf-open-files] #'helm-recentf) :config (helm-mode +1) - ;; helm is too heavy for find-file-at-point + ;; helm is too heavy for `find-file-at-point' (add-to-list 'helm-completing-read-handlers-alist (cons #'find-file-at-point nil))) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 5921322ef..c0743dd14 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -63,6 +63,7 @@ (set-company-backend! 'sh-mode '(company-shell company-files)) (setq company-shell-delete-duplicates t)) + (def-package! fish-mode :when (featurep! +fish) :defer t diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 0ca1262fc..93da1ce82 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -449,6 +449,6 @@ controlled by `+doom-dashboard-pwd-policy'." (propertize "github" 'face 'font-lock-keyword-face)) 'action (lambda (_) (browse-url "https://github.com/hlissner/doom-emacs")) 'follow-link t - 'help-echo "Open github page") + 'help-echo "Open Doom Emacs github page") (buffer-string))) "\n")) From da7f9019d1e575fd3c6aa63a2e28585d053b778c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 04:03:05 +0200 Subject: [PATCH 2833/4235] Run doom-post-init-hook as late as possible Possibly fixes recursive load errors, to do with kill-buffer-query-functions and buffer-predicate autoloads loading in a weird way on Emacs 25 (and especially on MacOS, for some reason). --- core/core-modules.el | 8 +++++++- core/core.el | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index e6cdf15e4..5b12eccfc 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -56,7 +56,13 @@ non-nil." (load! "config" (plist-get plist :path) t))) doom-modules) (load! "config" doom-private-dir t) - (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)))) + (if after-init-time + (doom|run-post-init-hook) + (add-hook 'emacs-startup-hook #'doom|run-post-init-hook))))) + +(defun doom|run-post-init-hook () + "Run `doom-post-init-hook'. That's all." + (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)) ;; diff --git a/core/core.el b/core/core.el index 621199786..2cfe8b565 100644 --- a/core/core.el +++ b/core/core.el @@ -233,7 +233,7 @@ original value of `symbol-file'." module init.el files, but before their config.el files are loaded.") (defvar doom-post-init-hook nil - "A list of hooks run when Doom is fully initialized. Fires at the end of + "A list of hooks run when Doom is fully initialized. Fires near the end of `emacs-startup-hook', as late as possible. Guaranteed to run after everything else (except for `window-setup-hook').") @@ -305,7 +305,7 @@ and `doom-exit-window-hook'." (if disable (advice-remove (car spec) (cdr spec)) (advice-add (car spec) :around (cdr spec))))) -(add-hook 'emacs-startup-hook #'doom|init-switch-hooks) +(add-hook 'doom-post-init-hook #'doom|init-switch-hooks) (defun doom*load-theme-hooks (theme &rest _) "Set up `doom-load-theme-hook' to run after `load-theme' is called." From 9a4cce8d9a77759374efc821aa9ef3f9283a4cfd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 04:10:18 +0200 Subject: [PATCH 2834/4235] Refactor detection of native display-line-numbers --- core/autoload/line-numbers.el | 2 ++ core/core-ui.el | 6 +++--- core/packages.el | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index 279d2fbac..576cf61b5 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -26,6 +26,8 @@ relative number of a line. Lisp programs can disable display of a line number of a particular buffer line by putting the display-line-numbers-disable text property or overlay property on the first visible character of that line.") +;;;###autoload +(put 'display-line-numbers 'nlinum t) ;;;###autoload (defcustom display-line-numbers-type t diff --git a/core/core-ui.el b/core/core-ui.el index 383e70856..10ee7988b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -304,7 +304,7 @@ from the default." ;; Line number column. A faster (or equivalent, in the worst case) line number ;; plugin than `linum-mode'. (def-package! nlinum - :unless (boundp 'display-line-numbers) + :when (get 'display-line-numbers 'nlinum) :commands nlinum-mode :init (defvar doom-line-number-lpad 4 @@ -352,7 +352,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Fixes disappearing line numbers in nlinum and other quirks (def-package! nlinum-hl - :unless (boundp 'display-line-numbers) + :when (get 'display-line-numbers 'nlinum) :after nlinum :config ;; With `markdown-fontify-code-blocks-natively' enabled in `markdown-mode', @@ -367,7 +367,7 @@ character that looks like a space that `whitespace-mode' won't affect.") (advice-add #'set-frame-font :after #'nlinum-hl-flush-all-windows)) (def-package! nlinum-relative - :unless (boundp 'display-line-numbers) + :when (get 'display-line-numbers 'nlinum) :commands (nlinum-relative-mode nlinum-relative-on nlinum-relative-off) :config (setq nlinum-format " %d ") diff --git a/core/packages.el b/core/packages.el index bbe27d438..6ad7e7f87 100644 --- a/core/packages.el +++ b/core/packages.el @@ -13,7 +13,7 @@ (package! highlight-numbers) (package! highlight-escape-sequences :recipe (:fetcher github :repo "hlissner/highlight-escape-sequences")) -(unless (boundp 'display-line-numbers) +(unless (locate-library "display-line-numbers") (package! nlinum) (package! nlinum-hl) (package! nlinum-relative)) From 62977247c98ca651c02e99ed55b1840297b82709 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 04:27:14 +0200 Subject: [PATCH 2835/4235] Revert da7f9019 & refactor doom init hooks --- core/core-modules.el | 8 +------- core/core-ui.el | 2 +- core/core.el | 4 ++-- 3 files changed, 4 insertions(+), 10 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 5b12eccfc..e6cdf15e4 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -56,13 +56,7 @@ non-nil." (load! "config" (plist-get plist :path) t))) doom-modules) (load! "config" doom-private-dir t) - (if after-init-time - (doom|run-post-init-hook) - (add-hook 'emacs-startup-hook #'doom|run-post-init-hook))))) - -(defun doom|run-post-init-hook () - "Run `doom-post-init-hook'. That's all." - (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)) + (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)))) ;; diff --git a/core/core-ui.el b/core/core-ui.el index 10ee7988b..c31dcb2a3 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -498,7 +498,7 @@ frame's window-system, the theme will be reloaded.") ;; (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) -(add-hook 'doom-post-init-hook #'doom|init-ui) +(add-hook 'emacs-startup-hook #'doom|init-ui) (provide 'core-ui) ;;; core-ui.el ends here diff --git a/core/core.el b/core/core.el index 2cfe8b565..34d7b31a3 100644 --- a/core/core.el +++ b/core/core.el @@ -305,7 +305,6 @@ and `doom-exit-window-hook'." (if disable (advice-remove (car spec) (cdr spec)) (advice-add (car spec) :around (cdr spec))))) -(add-hook 'doom-post-init-hook #'doom|init-switch-hooks) (defun doom*load-theme-hooks (theme &rest _) "Set up `doom-load-theme-hook' to run after `load-theme' is called." @@ -448,7 +447,8 @@ to least)." (require 'core-os) (when (or force-load-core-p (not noninteractive)) - (add-hook 'emacs-startup-hook #'doom|display-benchmark) + (add-hook! 'emacs-startup-hook + #'(doom|init-switch-hooks doom|display-benchmark)) (require 'core-ui) (require 'core-editor) From 9e08620350add4359fa9b64ab392673203079444 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 04:32:27 +0200 Subject: [PATCH 2836/4235] Use locate-library to detect display-line-numbers Now that display-line-numbers is polyfilled, a boundp check is useless. --- core/autoload/line-numbers.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index 576cf61b5..cf5985093 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -1,5 +1,5 @@ ;;; core/autoload/line-numbers.el -*- lexical-binding: t; -*- -;;;###if (not (boundp 'display-line-numbers)) +;;;###if (not (locate-library "display-line-numbers")) ;; This was lifted out of the display-line-numbers library in Emacs 26.1 and ;; modified to use nlinum for Emacs 25.x users. It should be removed should From b3a83daf5f6ad95841741d84cc33145a9d354d1e Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 21 Aug 2018 12:46:29 +0200 Subject: [PATCH 2837/4235] Added basic agda support. --- modules/lang/agda/README.org | 9 +++++++++ modules/lang/agda/config.el | 7 +++++++ modules/lang/agda/doctor.el | 5 +++++ 3 files changed, 21 insertions(+) create mode 100644 modules/lang/agda/README.org create mode 100644 modules/lang/agda/config.el create mode 100644 modules/lang/agda/doctor.el diff --git a/modules/lang/agda/README.org b/modules/lang/agda/README.org new file mode 100644 index 000000000..1812f748d --- /dev/null +++ b/modules/lang/agda/README.org @@ -0,0 +1,9 @@ +#+TITLE: :lang agda + +This module adds support for the [[http://wiki.portal.chalmers.se/agda/pmwiki.php][agda]] programming language. + +Emacs support is included in the agda release (you can find installation +instructions [[https://agda.readthedocs.io/en/latest/getting-started/installation.html][here]]). This module attempts to find the location of ~agda2.el~ via +the ~agda-mode locate~ command that comes with the agda release. Users can set +this manually by setting the ~+agda2-dir~ variable. + diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el new file mode 100644 index 000000000..a294c30f7 --- /dev/null +++ b/modules/lang/agda/config.el @@ -0,0 +1,7 @@ +;;; lang/agda/config.el -*- lexical-binding: t; -*- + +(defvar +agda-dir (string-remove-suffix "/agda2.el" (shell-command-to-string "agda-mode locate"))) + +(def-package! agda2 + :load-path +agda-dir) + diff --git a/modules/lang/agda/doctor.el b/modules/lang/agda/doctor.el new file mode 100644 index 000000000..e38ccbc03 --- /dev/null +++ b/modules/lang/agda/doctor.el @@ -0,0 +1,5 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/agda/doctor.el + +(unless (executable-find "agda-mode") + (warn! "Couldn't find agda-mode. Agda support won't work")) From a2c1a62cd6be577fb750dacf59432c4dbe7cff4c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 21 Aug 2018 13:35:58 +0200 Subject: [PATCH 2838/4235] Add basic idris support --- modules/lang/idris/README.org | 3 +++ modules/lang/idris/config.el | 17 +++++++++++++++++ modules/lang/idris/packages.el | 4 ++++ 3 files changed, 24 insertions(+) create mode 100644 modules/lang/idris/README.org create mode 100644 modules/lang/idris/config.el create mode 100644 modules/lang/idris/packages.el diff --git a/modules/lang/idris/README.org b/modules/lang/idris/README.org new file mode 100644 index 000000000..60f8ef1a3 --- /dev/null +++ b/modules/lang/idris/README.org @@ -0,0 +1,3 @@ +#+TITLE: :lang idris + +Adds support for the [[https://www.idris-lang.org/][idris]] programming language. diff --git a/modules/lang/idris/config.el b/modules/lang/idris/config.el new file mode 100644 index 000000000..db01e19cb --- /dev/null +++ b/modules/lang/idris/config.el @@ -0,0 +1,17 @@ +;;; lang/idris/config.el -*- lexical-binding: t; -*- + +(def-package! idris-mode + :config + (add-hook! 'idris-mode-hook 'turn-on-idris-simple-indent) + (set-repl-handler! 'idris-mode 'idris-pop-to-repl) + (map! :map idris-mode-map + :localleader + :n "r" #'idris-load-file + :n "t" #'idris-type-at-point + :n "d" #'idris-add-clause + :n "l" #'idris-make-lemma + :n "c" #'idris-case-split + :n "w" #'idris-make-with-block + :n "m" #'idris-add-missing + :n "p" #'idris-proof-search + :n "h" #'idris-docs-at-point)) diff --git a/modules/lang/idris/packages.el b/modules/lang/idris/packages.el new file mode 100644 index 000000000..d600f1309 --- /dev/null +++ b/modules/lang/idris/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/idris/packages.el + +(package! idris-mode) From dbca4eef125df69a37e1ef0a45a45703295d7b0b Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 21 Aug 2018 13:44:11 +0200 Subject: [PATCH 2839/4235] Put company features behind conditional --- modules/lang/coq/autoload.el | 1 + modules/lang/coq/packages.el | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/coq/autoload.el b/modules/lang/coq/autoload.el index 624185018..390a3f94f 100644 --- a/modules/lang/coq/autoload.el +++ b/modules/lang/coq/autoload.el @@ -1,4 +1,5 @@ ;;; lang/coq/autoload.el -*- lexical-binding: t; -*- +;;;###if (featurep! :completion company) ;;;###autoload (add-hook 'coq-mode-hook #'company-coq-mode) diff --git a/modules/lang/coq/packages.el b/modules/lang/coq/packages.el index 3ae652118..69d5299b5 100644 --- a/modules/lang/coq/packages.el +++ b/modules/lang/coq/packages.el @@ -3,4 +3,5 @@ (package! proof-general :recipe (:fetcher github :repo "ProofGeneral/PG" :files ("*"))) -(package! company-coq) +(when (featurep! :completion company) + (package! company-coq)) From 2c6ae455f9fcc3fa1f82439caf03675651e3ef9c Mon Sep 17 00:00:00 2001 From: hackeryarn Date: Tue, 21 Aug 2018 07:16:44 -0500 Subject: [PATCH 2840/4235] updated readme to use set-popup-rules! --- modules/ui/popup/README.org | 58 ++++++++++++++----------------------- 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/modules/ui/popup/README.org b/modules/ui/popup/README.org index 4b872e31e..9a36b1270 100644 --- a/modules/ui/popup/README.org +++ b/modules/ui/popup/README.org @@ -14,38 +14,26 @@ system should clean up after itself and kill off buffers I mark as transient. #+end_quote * Table of Contents :TOC: -- [[#configuration][Configuration]] - - [[#the-popup-setting][The ~:popup~ setting]] - - [[#disabling-aggressive-mode-line-hiding-in-popups][Disabling aggressive mode-line hiding in popups]] -- [[#appendix][Appendix]] - - [[#commands][Commands]] - - [[#library][Library]] - - [[#hacks][Hacks]] +- [[Configuration][Configuration]] + - [[~set-popup-rules!~][~set-popup-rules!~]] + - [[Disabling aggressive mode-line hiding in popups][Disabling aggressive mode-line hiding in popups]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] + - [[Library][Library]] + - [[Hacks][Hacks]] * Configuration -** The ~:popup~ setting +** ~set-popup-rules!~ This module has one setting for defining your own rules for popups: #+BEGIN_SRC emacs-lisp -(set! :popup CONDITION &optional ALIST PARAMETERS) +(set-popup-rules! &rest RULESETS) #+END_SRC -+ ~CONDITION~ can be a function or regexp string. If the function returns - non-nil, or the regexp string matches the buffer's name, it will be opened in - a popup window. -+ ~ALIST~ dictates the characteristics of the popup, such as what side to spawn - it on and what size to make it. See ~display-buffer~'s documentation to see - what parameters are supported. - - This supports one custom parameter: ~size~, which will map to ~window-width~ - or ~window-height~ depending on what ~side~ you (or the defaults) specify. -+ ~PARAMETERS~ dictate what window parameters are set on the popup window. See - ~+popup-window-parameters~'s documentation and the [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Parameters.html#Window-Parameters][Window Parameters section - of the Emacs manual]] for what parameters are supported. - - This supports four custom parameters: =transient=, =quit=, =select= and - =modeline=. For details on these, look at the documentation for - ~+popup-window-parameters.~ ++ ~RULESETS~ consist of a function or regexp string that matches the buffer's + name, and a list of settings. See ~display-buffer~'s, + ~display-window-parameters~'s, and ~+popup-window-parameters~'s documentation + for what parameters are supported. Rules are added to ~display-buffer-alist~, which instructs ~display-buffer~ calls on how to set up windows for buffers that meet certain conditions. @@ -58,19 +46,17 @@ affected by ~display-buffer-alist~. Here are a couple example rules: #+BEGIN_SRC emacs-lisp -(set! :popup "^ \\*" '((slot . -1))) ; fallback rule for special buffers -(set! :popup "^\\*" nil '((select . t))) -(set! :popup "^\\*Completions" '((slot . -1)) '((transient . 0))) -(set! :popup "^\\*\\(?:scratch\\|Messages\\)" nil '((transient))) -(set! :popup "^\\*Help" - '((slot . -1) (size . 0.2)) - '((select . t))) -(set! :popup "^\\*doom:" - '((size . 0.35)) - '((select . t) (modeline . t) (quit) (transient))) +(set-popup-rules! + '(("^ \\*" :slot -1) ; fallback rule for special buffers + ("^\\*" :select t) + ("^\\*Completions" :slot -1 :transient 0) + ("^\\*\\(?:scratch\\|Messages\\)" :transient t) + ("^\\*Help" :slot -1 :size 0.2 :select t) + ("^\\*doom:" + :size . 0.35 :select t :modeline t :quit t :transient t))) #+END_SRC -Omitted parameters in a ~:popup~ rule will use the defaults set in +Omitted parameters in a ~set-popup-rules!~ will use the defaults set in ~+popup-default-alist~ and ~+popup-default-parameters~. ** Disabling aggressive mode-line hiding in popups From 18a0b059d0c21de16b109748aa550c65b6959225 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 21:36:56 +0200 Subject: [PATCH 2841/4235] lang/ledger: fix S P C key sequence #818 Forgot to run doom-leader-key through kbd --- modules/lang/ledger/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index f4cffbdb6..8bdbe4551 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -13,7 +13,7 @@ ;; Restore leader key in ledger reports (after! ledger-mode (define-key! (ledger-report-mode-map ledger-reconcile-mode-map) - doom-leader-key nil) + (kbd doom-leader-key) nil) (define-key ledger-reconcile-mode-map [tab] #'ledger-reconcile-toggle)) From 17abb990e4fd789ee46358e81cb457e693a5bdea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 22:45:42 +0200 Subject: [PATCH 2842/4235] tools/magit: don't make new windows too tall Some popups (like logs or revisions) completely consume the current window. --- modules/tools/magit/autoload.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index ae0159869..3c4c12ea5 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -19,9 +19,9 @@ ;; magit windows to be visible; especially magit-status). ((or (bound-and-true-p git-commit-mode) (derived-mode-p 'magit-mode)) - (let ((size (cond ((eq buffer-mode 'magit-process-mode) 0.35) - ((bound-and-true-p git-commit-mode) 0.7) - (0.9)))) + (let ((size (if (eq buffer-mode 'magit-process-mode) + 0.35 + 0.7))) `(display-buffer-below-selected . ((window-height . ,(truncate (* (window-height) size))))))) ;; log/stash/process buffers, unless opened from a magit-status From c7e6cb981b1fed8ecaec21cf97f55c23f6f0c6f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 21 Aug 2018 23:15:54 +0200 Subject: [PATCH 2843/4235] lang/cc: simplify add-hook! call --- 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 59dec5276..536d3c44a 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -60,8 +60,7 @@ compilation database is present in the project.") ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) - (add-hook! '(c-mode-hook c++-mode-hook) - #'(+cc|fontify-constants)) + (add-hook! '(c-mode-hook c++-mode-hook) #'+cc|fontify-constants) ;; Custom style, based off of linux (unless (assoc "doom" c-style-alist) From f51f2948af47fecb9783c6b48ee26019a908b7bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 02:15:44 +0200 Subject: [PATCH 2844/4235] New :editor format module Centralized code formatting with built-in support for a variety of languages. Provides the set-formatter! function for defining your own. Still experimental and needs more testing! --- init.example.el | 1 + modules/editor/format/autoload.el | 154 ++++++++++++++++++++++++++++++ modules/editor/format/config.el | 32 +++++++ modules/editor/format/packages.el | 4 + modules/lang/go/config.el | 4 +- modules/lang/php/config.el | 1 + modules/lang/sh/config.el | 4 +- 7 files changed, 194 insertions(+), 6 deletions(-) create mode 100644 modules/editor/format/autoload.el create mode 100644 modules/editor/format/config.el create mode 100644 modules/editor/format/packages.el diff --git a/init.example.el b/init.example.el index c1be24b80..58a5e0fb2 100644 --- a/init.example.el +++ b/init.example.el @@ -47,6 +47,7 @@ window-select ; visually switch windows :editor + ;(format +onsave) ; automated prettiness multiple-cursors ; editing in many places at once ;parinfer ; turn lisp into python, sort of rotate-text ; cycle region at point between text candidates diff --git a/modules/editor/format/autoload.el b/modules/editor/format/autoload.el new file mode 100644 index 000000000..b13b0cfda --- /dev/null +++ b/modules/editor/format/autoload.el @@ -0,0 +1,154 @@ +;;; editor/format/autoload.el -*- lexical-binding: t; -*- + +;;;###autodef +(cl-defun set-formatter! (modes formatter &key + name + install + filter + ok-statuses + error-regexp) + "Define a FORMATTER for MODES. + +MODES can be a major mode symbol, a vector of major modes, or a vector of +two-element vectors made up of [MAJOR-MODE FORM]. FORM is evaluated when the +buffer is formatted and its return value is a predicate for this formatter. Its +return value is stored in If it is non-nil, this formatter is used. Its return +value is stored in the `mode-result' variable for FORMATTER (if it's not a +string). + +FORMATTER can be a function, string or nested vector. + + If a function, it should be a formatter function that + `format-all-buffer-thunk' will accept. + If a string, it is assumed to be a shell command that the text will be piped + to (stdin). + If a vector, it should represent a shell command as a list of arguments. Each + element is either a string or vector [STRING ARG] where STRING is a format + string and ARG is both a predicate and argument for STRING. If ARG is nil, + STRING will be omitted from the vector. + +NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME will +default to \"default\". + +INSTALL should be a string representing the shell command necessary to install +this formatter's dependencies. INSTALL can also be a list of lists made up of +two items: (OS COMMAND). + +Basic examples: + + (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") + (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") + +Advanced examples: + + (set-formatter! + '((c-mode \".c\") + (c++-mode \".cpp\") + (java-mode \".java\") + (objc-mode \".m\") + (protobuf-mode \".proto\")) + '(\"clang-format\" + (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) + :install '(macos \"brew install clang-format\")) + + (set-formatter! + '(html-mode + (web-mode (and (equal \"none\" web-mode-engine) + (car (member web-mode-content-type '(\"xml\" \"html\")))))) + '(\"tidy\" \"-q\" \"-indent\" + (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) + :ok-statuses '(0 1) + :install '(macos \"brew install tidy-html5\")) + + (set-formatter! 'elm-mode + \"elm-format --yes --stdin\" + :install '(macos \"brew install elm\") + :filter + (lambda (output errput first-diff) + (list output + (format-all-remove-ansi-color errput) + first-diff)))" + (declare (indent defun)) + (let* ((command-list (cond ((stringp formatter) ; shell command + (split-string formatter " " t)) + ((listp formatter) ; shell command in lists + formatter))) + (name (cond ((or name (car command-list))) + ((symbolp formatter) (symbol-name formatter)) + ("default")))) + (after! format-all + (puthash + name + (lambda (executable mode-result) + (ignore mode-result executable) + (apply (or filter #'identity) + (cond ((commandp formatter) + (let ((mode major-mode) + (file buffer-file-name)) + (format-all-buffer-thunk + (lambda (input) + (setq buffer-file-name file) + (funcall mode) + (insert input) + (condition-case e + (progn + (call-interactively formatter) + (list nil "")) + (error (list t (error-message-string e)))))))) + ((functionp formatter) + (format-all-buffer-thunk formatter)) + ((let ((args (cl-loop for arg in command-list + if (stringp arg) collect arg + else if + (and (listp arg) + (eval (cadr arg) t)) + collect (format (car arg) it)))) + (if (or ok-statuses error-regexp) + (apply #'format-all-buffer-hard ok-statuses error-regexp args) + (apply #'format-all-buffer-easy args))))))) format-all-format-table) + (puthash name (car command-list) format-all-executable-table) + (puthash name (format-all-resolve-system install) format-all-install-table) + (dolist (mode (doom-enlist modes)) + (cl-destructuring-bind (m &optional probe) + (doom-enlist mode) + (format-all-pushhash + m (cons name (if probe `(lambda () ,probe))) + format-all-mode-table)))) + name)) + +;;;###autoload +(defun +format-region (beg end) + "TODO" + (cl-check-type beg integer) + (cl-check-type end integer) + (save-restriction + (let* ((beg (save-excursion (goto-char beg) (line-beginning-position))) + (end (save-excursion (goto-char end) (line-end-position))) + (file buffer-file-name) + (input (buffer-substring-no-properties beg end))) + (with-temp-buffer + (setq buffer-file-name file) + (insert input) + (format-all-buffer))))) + + +;; +;; Commands +;; + +;;;###autoload +(defalias '+format/buffer 'format-all-buffer) + +;;;###autoload +(defun +format/region (beg end) + "TODO" + (interactive "r") + (+format-region beg end)) + +;;;###autoload +(defun +format/region-or-buffer (beg end) + "TODO" + (interactive "r") + (if (use-region-p) + (+format-region beg end) + (format-all-buffer))) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el new file mode 100644 index 000000000..e3e4fa05f --- /dev/null +++ b/modules/editor/format/config.el @@ -0,0 +1,32 @@ +;;; editor/format/config.el -*- lexical-binding: t; -*- + +(defvar +format-on-save-enabled-modes t + "A list of major modes in which to enable `format-all-mode'. + +This mode will auto-format buffers when you save them. + +If this list begins with `not', then it negates the list. +If it is `t', it is enabled in all modes. +If nil, it is disabled in all modes, the same as if the +onsave flag wasn't + used at all.") + + +;; +;; Plugins +;; + +(defun +format|enable-on-save-maybe () + "Enable `format-all-mode' in buffers. See `+format-on-save-enabled-modes' to +control which major modes to target." + (unless (or (eq major-mode 'fundamental-mode) + (cond ((booleanp +format-on-save-enabled-modes) + (null +format-on-save-enabled-modes)) + ((eq (car +format-on-save-enabled-modes) 'not) + (memq major-mode (cdr +format-on-save-enabled-modes))) + ((not (memq major-mode +format-on-save-enabled-modes)))) + (require 'format-all nil t) + (not (format-all-probe))) + (format-all-mode +1))) + +(when (featurep! +onsave) + (add-hook 'after-change-major-mode-hook #'+format|enable-on-save-maybe)) diff --git a/modules/editor/format/packages.el b/modules/editor/format/packages.el new file mode 100644 index 000000000..858b6d9ee --- /dev/null +++ b/modules/editor/format/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/format/packages.el + +(package! format-all) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index ec26c9a38..82e74217e 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -12,15 +12,13 @@ :references #'go-guru-referrers :documentation #'godoc-at-point) + (set-formatter! 'go-mode #'gofmt) (when-let* ((goimports (executable-find "goimports"))) (setq gofmt-command goimports)) - (when (featurep! :feature syntax-checker) (setq gofmt-show-errors nil)) ; Leave it to flycheck (add-hook 'go-mode-hook #'go-eldoc-setup) - (add-hook! go-mode - (add-hook 'before-save-hook #'gofmt-before-save nil t)) (def-menu! +go/refactor-menu "Refactoring commands for `go-mode' buffers." diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index bb5aaeddf..493f21e06 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -9,6 +9,7 @@ (set-repl-handler! 'php-mode #'php-boris) (set-lookup-handlers! 'php-mode :documentation #'php-search-documentation) + (set-formatter! 'php-mode #'php-cs-fixer-fix) ;; `+php-company-backend' uses `company-phpactor', `php-extras-company' or ;; `company-dabbrev-code', in that order. diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index c0743dd14..77abb3e8a 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -67,6 +67,4 @@ (def-package! fish-mode :when (featurep! +fish) :defer t - :config - (add-hook! fish-mode - (add-hook 'before-save-hook #'fish_indent-before-save))) + :config (set-formatter! 'fish-mode #'fish_indent)) From ecb01dbdfcb5de648dbb70d50c2ec34b5a22e14c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 02:16:58 +0200 Subject: [PATCH 2845/4235] lang/javascript: attempt more fontification --- modules/lang/javascript/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 0caa4a554..e39b965db 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -28,7 +28,6 @@ :commands js2-line-break :config (setq js2-skip-preprocessor-directives t - js2-highlight-external-variables nil js-chain-indent t ;; let flycheck handle this js2-mode-show-parse-errors nil @@ -36,7 +35,10 @@ ;; Flycheck provides these features, so disable them: conflicting with ;; the eslint settings. js2-strict-trailing-comma-warning nil - js2-strict-missing-semi-warning nil) + js2-strict-missing-semi-warning nil + ;; maximum fontification + js2-highlight-level 3 + js2-highlight-external-variables t) (add-hook 'js2-mode-hook #'rainbow-delimiters-mode) ;; Indent switch-case another step From 2694a42fdb449bc132bdca2cb2641a95588c67d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 02:35:55 +0200 Subject: [PATCH 2846/4235] lang/ledger: polish keybindings Fixes #818 --- modules/lang/ledger/config.el | 37 +++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 8bdbe4551..700d127da 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -12,9 +12,12 @@ ;; Restore leader key in ledger reports (after! ledger-mode - (define-key! (ledger-report-mode-map ledger-reconcile-mode-map) - (kbd doom-leader-key) nil) - (define-key ledger-reconcile-mode-map [tab] #'ledger-reconcile-toggle)) + (define-key! ledger-report-mode-map + (kbd "C-c C-c") #'ledger-report-edit-report + (kbd "C-c C-r") #'ledger-report-redo + (kbd "C-c C-s") #'ledger-report-save) + (define-key ledger-reconcile-mode-map + [tab] #'ledger-reconcile-toggle)) (def-package! flycheck-ledger @@ -24,4 +27,30 @@ (def-package! evil-ledger :when (featurep! :feature evil +everywhere) - :hook (ledger-mode . evil-ledger-mode)) + :hook (ledger-mode . evil-ledger-mode) + :config + (set-evil-initial-state! 'ledger-report-mode 'normal) + (evil-define-key* 'normal ledger-report-mode-map + "q" #'ledger-report-quit + "RET" #'ledger-report-edit-report + "gd" #'ledger-report-visit-source + "gr" #'ledger-report-redo) + (evil-define-key* 'motion ledger-mode-map + "]]" #'ledger-navigate-next-xact-or-directive + "[[" #'ledger-navigate-prev-xact-or-directive) + (map! :map ledger-mode-map + :localleader + :n "a" #'ledger-add-transaction + :n "t" #'ledger-toggle-current + :n "d" #'ledger-delete-current-transaction + :n "r" #'ledger-report + :n "R" #'ledger-reconcile + :n "S" #'ledger-schedule-upcoming + :v "s" #'ledger-sort-region + (:prefix "g" + :n "s" #'ledger-display-ledger-stats + :n "b" #'ledger-display-balance-at-point)) + ;; Fix inaccurate keybind message + (defun +ledger*fix-key-help (&rest _) + (message "q to quit; gr to redo; RET to edit; C-c C-s to save")) + (advice-add #'ledger-report :after #'+ledger*fix-key-help)) From f80b9bb8c5b9559ec985efd6154bed4e7905ab06 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 03:33:12 +0200 Subject: [PATCH 2847/4235] Defer loading of idris-mode package --- modules/lang/idris/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/idris/config.el b/modules/lang/idris/config.el index db01e19cb..3cf0b0594 100644 --- a/modules/lang/idris/config.el +++ b/modules/lang/idris/config.el @@ -1,7 +1,6 @@ ;;; lang/idris/config.el -*- lexical-binding: t; -*- -(def-package! idris-mode - :config +(after! idris-mode (add-hook! 'idris-mode-hook 'turn-on-idris-simple-indent) (set-repl-handler! 'idris-mode 'idris-pop-to-repl) (map! :map idris-mode-map From c5334f61a31dedf231f636cb6e40f35363cc7d71 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 03:34:51 +0200 Subject: [PATCH 2848/4235] Add lookup-handlers for idris-mode --- modules/lang/idris/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/idris/config.el b/modules/lang/idris/config.el index 3cf0b0594..2f5b5b8cb 100644 --- a/modules/lang/idris/config.el +++ b/modules/lang/idris/config.el @@ -3,6 +3,9 @@ (after! idris-mode (add-hook! 'idris-mode-hook 'turn-on-idris-simple-indent) (set-repl-handler! 'idris-mode 'idris-pop-to-repl) + (set-lookup-handlers! 'idris-mode + :documentation #'idris-docs-at-point + :file #'idris-load-file) (map! :map idris-mode-map :localleader :n "r" #'idris-load-file From 06262fef1761d0f7018e5c2991853687b7f53be8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 03:52:53 +0200 Subject: [PATCH 2849/4235] Lazy-load agda2; more robust +agda-dir resolution --- modules/lang/agda/config.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index a294c30f7..6166727b9 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -1,7 +1,11 @@ ;;; lang/agda/config.el -*- lexical-binding: t; -*- -(defvar +agda-dir (string-remove-suffix "/agda2.el" (shell-command-to-string "agda-mode locate"))) +(defvar +agda-dir + (when (executable-find "adga-mode") + (file-name-directory (shell-command-to-string "agda-mode locate"))) + "TODO") + (def-package! agda2 - :load-path +agda-dir) - + :load-path +agda-dir + :defer t) From f6dbc00bc4abb6790f6bfe31f254213c06c1dba8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 03:53:19 +0200 Subject: [PATCH 2850/4235] Fix agda-mode executable typo --- modules/lang/agda/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index 6166727b9..cd355d43c 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -1,7 +1,7 @@ ;;; lang/agda/config.el -*- lexical-binding: t; -*- (defvar +agda-dir - (when (executable-find "adga-mode") + (when (executable-find "agda-mode") (file-name-directory (shell-command-to-string "agda-mode locate"))) "TODO") From 34fcaec6785c9bf2e5ba7e5d4bb4649cbbce2219 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 04:15:39 +0200 Subject: [PATCH 2851/4235] config/default: add SPC c f for formatting code Powered by the new :editor format module. --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ca0bfecb8..2d37b7f14 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -579,6 +579,8 @@ :desc "Evaluate buffer/region" :n "e" #'+eval/buffer :v "e" #'+eval/region :desc "Evaluate & replace region" :nv "E" #'+eval:replace-region + :desc "Format buffer/region" :n "f" #'+format/buffer + :v "f" #'+format/region :desc "Build tasks" :nv "b" #'+eval/build :desc "Jump to definition" :n "d" #'+lookup/definition :desc "Jump to references" :n "D" #'+lookup/references From 8e7a7c1878ef4e1030bb22ad690324f0f3aa5edb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 16:26:31 +0200 Subject: [PATCH 2852/4235] Fix void-function format-all-resolve-system error This function is only defined at compile time for the format-all package, so we must extract it into a new function. --- modules/editor/format/autoload.el | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/editor/format/autoload.el b/modules/editor/format/autoload.el index b13b0cfda..ba306f0ac 100644 --- a/modules/editor/format/autoload.el +++ b/modules/editor/format/autoload.el @@ -1,5 +1,13 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(defun +format--resolve-system (choices) + "Get first choice matching `format-all-system-type' from CHOICES." + (cl-loop for choice in choices + if (atom choice) return choice + else if (eql format-all-system-type (car choice)) + return (cadr choice))) + ;;;###autodef (cl-defun set-formatter! (modes formatter &key name @@ -106,8 +114,11 @@ Advanced examples: (if (or ok-statuses error-regexp) (apply #'format-all-buffer-hard ok-statuses error-regexp args) (apply #'format-all-buffer-easy args))))))) format-all-format-table) + (puthash name (cond ((null install) install) + ((listp install) (cdr (assq (+format--resolve-system) install))) + (install)) + format-all-install-table) (puthash name (car command-list) format-all-executable-table) - (puthash name (format-all-resolve-system install) format-all-install-table) (dolist (mode (doom-enlist modes)) (cl-destructuring-bind (m &optional probe) (doom-enlist mode) From 4dfb84211b7867761ed2970ac111e611d9291218 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 16:29:34 +0200 Subject: [PATCH 2853/4235] feature/lookup: minor refactor --- modules/feature/lookup/autoload/lookup.el | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index d74457fe6..9c5ae2201 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -146,15 +146,15 @@ evil-mode is active." ((and (require 'dumb-jump nil t) ;; dumb-jump doesn't tell us if it succeeded or not - (let ((old-fn (symbol-function 'dumb-jump-get-results)) - successful) - (cl-letf (((symbol-function 'dumb-jump-get-results) - (lambda (&optional prompt) - (let* ((plist (funcall old-fn prompt)) - (results (plist-get plist :results))) - (when (and results (> (length results) 0)) - (setq successful t)) - plist)))) + (let (successful) + (cl-letf* ((old-fn (symbol-function 'dumb-jump-get-results)) + ((symbol-function 'dumb-jump-get-results) + (lambda (&optional prompt) + (let* ((plist (funcall old-fn prompt)) + (results (plist-get plist :results))) + (when (and results (> (length results) 0)) + (setq successful t)) + plist)))) (if other-window (dumb-jump-go-other-window) (dumb-jump-go)) @@ -210,6 +210,7 @@ Goes down a list of possible backends: (require 'helm-dash nil t)) (or (bound-and-true-p counsel-dash-docsets) (bound-and-true-p helm-dash-docsets)) + ;; counsel-dash uses helm-dash under the hood (helm-dash-installed-docsets)) (+lookup/in-docsets identifier)) From 6282526743792862d01d345a90f82ba1d18950f9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 20:55:47 +0200 Subject: [PATCH 2854/4235] ui/modeline: fontify project root separately And add new doom-modeline-buffer-project-root face. --- modules/ui/modeline/config.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 0df7c38e4..d90c39e84 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -71,6 +71,11 @@ buffers.") "Face used for the filename part of the mode-line buffer path." :group '+modeline) +(defface doom-modeline-buffer-project-root + '((t (:inherit doom-modeline-buffer-path))) + "Face used for the project root at the beginning of the mode-line path." + :group '+modeline) + (defface doom-modeline-buffer-modified '((t (:inherit (error bold) :background nil))) "Face used for the 'unsaved' symbol in the mode-line." :group '+modeline) @@ -242,9 +247,11 @@ buffers.") 'face 'doom-modeline-buffer-path)) ((let* ((true-filename (file-truename buffer-file-name)) (relative-dirs (file-relative-name (file-name-directory true-filename) - (concat root "../")))) + root))) (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize relative-dirs + (concat (propertize (concat (doom-project-name) "/") + 'face 'doom-modeline-buffer-project-root) + (propertize relative-dirs 'face 'doom-modeline-buffer-path) (propertize (file-name-nondirectory true-filename) 'face 'doom-modeline-buffer-file))))))) From dc9841b19285e27b6dd14d31ead1d7a8980767df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 22:36:44 +0200 Subject: [PATCH 2855/4235] ui/modeline: refactor path builder & add other styles This brings +doom-modeline-buffer-file-name styles to the new modeline module, controlled by the +modeline-buffer-path-function variable. The available functions are: * +modeline-file-path-with-project: project/src/lib/file.c * +modeline-file-path-from-project: src/lib/file.c * +modeline-file-path-truncated-with-project: project/s/l/file.c * +modeline-file-path-truncated-upto-project: ~/w/project/src/lib/file.c * +modeline-file-path-truncated-upto-project-root: ~/w/p/s/lib/file.c * +modeline-file-path-truncated: ~/w/p/s/l/file.c * +modeline-file-name: file.c The default is file-path-with-project. --- modules/ui/modeline/config.el | 143 ++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 24 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index d90c39e84..9306ea66e 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -27,9 +27,22 @@ modeline.") "If non-nil, the bar is transparent, and only used to police the height of the mode-line.") -(defvar +modeline-buffer-path-function #'+modeline-file-path - "The function that returns the buffer name display for file-visiting -buffers.") +(defvar +modeline-buffer-path-function #'+modeline-file-path-with-project + "A function that returns, in list form, components of the buffer file name +display in the mode-line. + +Each item should either be a string or a a cons cell whose CAR is the path +component and CDR is the name of a face. + +Currently available functions: + ++ `+modeline-file-path-with-project': project/src/lib/file.c ++ `+modeline-file-path-from-project': src/lib/file.c ++ `+modeline-file-path-truncated-with-project': project/s/l/file.c ++ `+modeline-file-path-truncated-upto-project': ~/w/project/src/lib/file.c ++ `+modeline-file-path-truncated-upto-project-root': ~/w/p/s/lib/file.c ++ `+modeline-file-path-truncated': ~/w/p/s/l/file.c ++ `+modeline-file-name': file.c") ;; Convenience aliases (defvaralias 'mode-line-format-left '+modeline-format-left) @@ -236,27 +249,109 @@ buffers.") concat (if (eq idx len) "\"};" "\",\n"))) 'xpm t :ascent 'center))))) -(defun +modeline-file-path (&optional path) - (let ((buffer-file-name (or path buffer-file-name)) - (root (doom-project-root))) - (cond ((null root) - (propertize "%b" 'face 'doom-modeline-buffer-file)) - ((or (null buffer-file-name) - (directory-name-p buffer-file-name)) - (propertize (abbreviate-file-name (or buffer-file-name default-directory)) - 'face 'doom-modeline-buffer-path)) - ((let* ((true-filename (file-truename buffer-file-name)) - (relative-dirs (file-relative-name (file-name-directory true-filename) - root))) - (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize (concat (doom-project-name) "/") - 'face 'doom-modeline-buffer-project-root) - (propertize relative-dirs - 'face 'doom-modeline-buffer-path) - (propertize (file-name-nondirectory true-filename) - 'face 'doom-modeline-buffer-file))))))) +(defun +modeline-build-path (&optional path) + "Construct the file path for the `+modeline-buffer-id' segment using +`+mdoeline-buffer-path-function'. If the buffer has no `buffer-file-name', just +use `buffer-name'." + (let ((buffer-file-name (or path buffer-file-name))) + (if (or (eq major-mode 'dired-mode) + (null buffer-file-name)) + (propertize "%s" 'face 'doom-modeline-buffer-path) + (cl-loop for spec in (funcall +modeline-buffer-path-function) + if (stringp spec) concat spec + else concat (propertize (car spec) 'face (cdr spec)))))) -;; TODO Add shrink-path alternatives + +;; +;; Buffer file path styles +;; + +(defun +modeline-file-path-with-project () + "Returns the unaltered buffer file path relative to the project root's +parent. + +e.g. project/src/lib/file.c" + (let* ((project-root (doom-project-root)) + (true-filename (file-truename buffer-file-name)) + (relative-dirs (file-relative-name (file-name-directory true-filename) + project-root))) + (list (cons (concat (doom-project-name) "/") + 'doom-modeline-buffer-project-root) + (cons (if (equal "./" relative-dirs) "" relative-dirs) + 'doom-modeline-buffer-path) + (cons (file-name-nondirectory true-filename) + 'doom-modeline-buffer-file)))) + +(defun +modeline-file-path-from-project () + "Returns file path relative to the project root. + +e.g. src/lib/file.c + +Meant for `+modeline-buffer-path-function'." + (cdr (+modeline-file-path-with-project))) + +(defun +modeline-file-path-truncated-with-project () + "Returns file path relative to (and including) project root, with descendent +folders truncated. + +e.g. project/s/l/file.c + +Meant for `+modeline-buffer-path-function'." + (let* ((parts (+modeline-file-path-with-project)) + (dirs (car (nth 1 parts)))) + (setcar (nth 1 parts) + (shrink-path--dirs-internal dirs t)) + parts)) + +(defun +modeline-file-path-truncated-upto-project () + "Returns file path, truncating segments prior to the project. + +e.g. ~/w/project/src/lib/file.c + +Meant for `+modeline-buffer-path-function'." + (pcase-let + ((`(,root-parent ,root ,dir, file) + (shrink-path-file-mixed (doom-project-root) + (file-name-directory buffer-file-name) + buffer-file-name))) + (list (cons root-parent 'font-lock-comment-face) + (cons root 'doom-modeline-buffer-project-root) + (cons (concat "/" dir) 'doom-modeline-buffer-path) + (cons file 'doom-modeline-buffer-file)))) + +(defun +modeline-file-path-truncated-upto-project-root () + "Return file path, truncating segemnts prior to (and including) the project +root. + +e.g. ~/w/p/src/lib/file.c + +Meant for `+modeline-buffer-path-function'." + (let* ((parts (+modeline-file-path-truncated-upto-project)) + (root (car (nth 1 parts)))) + (setcar (nth 1 parts) + (let ((first (substring root 0 1))) + (if (equal first ".") + (substring root 0 2) + first))) + parts)) + +(defun +modeline-file-path-truncated () + "Return absolute file path with all directories truncated. + +e.g. ~/w/p/s/l/file.c + +Meant for `+modeline-buffer-path-function'." + (pcase-let ((`(,dir . ,file) (shrink-path-prompt buffer-file-name))) + (list (cons dir 'doom-modeline-buffer-path) + (cons file 'doom-modeline-buffer-file)))) + +(defun +modeline-file-name () + "Return buffer name. + +e.g. file.c + +Meant for `+modeline-buffer-path-function'." + (list (cons "%b" 'doom-modeline-buffer-path))) ;; @@ -339,7 +434,7 @@ buffers.") :init "%b" :faces t (if buffer-file-name - (funcall +modeline-buffer-path-function buffer-file-name) + (+modeline-build-path buffer-file-name) "%b")) (def-modeline-segment! +modeline-buffer-directory From e003c2aa6a96c2925f7ad1323237ab2a1014a942 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 22 Aug 2018 22:44:22 +0200 Subject: [PATCH 2856/4235] Remove :load-path Accidentally snuck into a commit! --- modules/ui/doom/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 121586d2c..3e5e9bb9e 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -24,7 +24,6 @@ ;; (def-package! doom-themes - :load-path "~/work/plugins/emacs-doom-themes/" :defer t :init (unless doom-theme From 12f6add32974113c7e7edc0628ccd28ff7012095 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 11:27:27 +0200 Subject: [PATCH 2857/4235] package-initialize for doom/open-vanilla-sandbox --- core/autoload/debug.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 935d690ec..22aade9c3 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -158,10 +158,12 @@ pasting into a bug report or discord." "-l" (shell-quote-argument user-init-file)) (list "--eval" (prin1-to-string - `(setq user-emacs-directory ,doom-emacs-dir - package--init-file-ensured t - package-user-dir ,package-user-dir - package-archives ',package-archives)))) + `(progn + (setq user-emacs-directory ,doom-emacs-dir + package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives) + (package-initialize))))) (list "--eval" (prin1-to-string `(unwind-protect (load ,file) From 1890356d11de666e2dbe13ec44c7b5ea6690d991 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 16:17:52 +0200 Subject: [PATCH 2858/4235] Refactor & fix vanilla sandbox in tty Emacs Except for Windows users. Doesn't seem to be possible to suspend and foreground Emacs in windows' shell. --- core/autoload/debug.el | 51 +++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 22aade9c3..8203ceae8 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -146,28 +146,37 @@ pasting into a bug report or discord." (let ((contents (buffer-string)) (file (make-temp-file "/tmp/doom-eval-"))) (with-temp-file file (insert contents)) - (require 'pp) (require 'restart-emacs) - (restart-emacs--launch-other-emacs - (append (list "-Q") - (if load-doom-p - (list "--eval" - (prin1-to-string - `(setq doom-private-dir "/tmp/does/not/exist" - doom-modules ,doom-modules)) - "-l" (shell-quote-argument user-init-file)) - (list "--eval" - (prin1-to-string - `(progn - (setq user-emacs-directory ,doom-emacs-dir - package--init-file-ensured t - package-user-dir ,package-user-dir - package-archives ',package-archives) - (package-initialize))))) - (list "--eval" - (prin1-to-string - `(unwind-protect (load ,file) - (delete-file ,file)))))))) + (let* ((args + (append '("-Q") + (if load-doom-p + `("--eval" (setq doom-private-dir "/tmp/does/not/exist" + doom-modules ,doom-modules) + "-l" user-init-file) + `("--eval" (setq user-emacs-directory ,doom-emacs-dir + package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives) + "--eval" (package-initialize))) + ;; Clean up temp file afterwards + `("--eval" (unwind-protect (load ,file) (delete-file ,file))))) + (formatted-args + (mapcar #'shell-quote-argument + (cl-loop for arg in (delq nil args) + if (stringp arg) collect arg + else collect (prin1-to-string arg))))) + (condition-case _ + (cond ((display-graphic-p) + (if (memq system-type '(windows-nt ms-dos)) + (restart-emacs--start-gui-on-windows formatted-args) + (restart-emacs--start-gui-using-sh formatted-args))) + ((memq system-type '(windows-nt ms-dos)) + (user-error "Cannot start another Emacs from Windows shell.")) + ((suspend-emacs + (format "%s %s -nw; fg" + (shell-quote-argument (restart-emacs--get-emacs-binary)) + (string-join formatted-args " "))))) + (error (delete-file file)))))) (defun doom--run-vanilla-doom-sandbox () (interactive) From fa81f7ed71adf9a2c3ccb92901fff4d0c02bc541 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 16:21:21 +0200 Subject: [PATCH 2859/4235] Improve doom patch-macos documentation Makes doom help patch-macos more informative, and simplifies confirmation prompt when using it. --- core/core-cli.el | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 94548a65a..7b216f1d1 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -193,16 +193,29 @@ recompile. Run this whenever you: (dispatcher! (patch-macos) (doom-patch-macos args) "Patches Emacs.app to respect your shell environment. -This searches for Emacs.app in /Applications and ~/Applications, then moves -Contents/MacOS/Emacs to Contents/MacOS/RunEmacs, and replaces the former with -the following wrapper script: +A common issue with GUI Emacs on MacOS is that it launches in an environment +independent of your shell configuration, including your PATH and any other +utilities like rbenv, rvm or virtualenv. - #!/usr/bin/env bash - args=\"$@\" - pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\" - exec \"$SHELL\" -c \"$pwd/RunEmacs $args\" +This patch fixes this by patching Emacs.app (in /Applications or +~/Applications). It will: -This ensures that Emacs is always aware of your shell environment.") + 1. Move Contents/MacOS/Emacs to Contents/MacOS/RunEmacs + 2. And replace Contents/MacOS/Emacs with the following wrapper script: + + #!/usr/bin/env bash + args=\"$@\" + pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\" + exec \"$SHELL\" -c \"$pwd/RunEmacs $args\" + +This ensures that Emacs is always aware of your shell environment, regardless of +how it is launched. + +It can be undone with the --undo or -u options. + +Alternatively, you can install the exec-path-from-shell Emacs plugin, which will +scrape your shell environment remotely, at startup. However, this can be slow +depending on your shell configuration and isn't always reliable.") ;; @@ -352,11 +365,8 @@ packages and regenerates the autoloads file." (user-error "%s is already patched" appdir)) ((or doom-auto-accept - (progn - (print! "/Applications/Emacs.app needs to be patched.") - (print! "\nWhy? So that Emacs will respect your shell configuration when not launched from the shell.") - (print! "\nHow? By replacing Emacs.app/Contents/MacOS/Emacs with a wrapper that launches Emacs from your shell.") - (y-or-n-p "Patch Emacs.app?"))) + (y-or-n-p (concat "/Applications/Emacs.app needs to be patched. See `bin/doom help patch-macos' for why and how.\n\n" + "Patch Emacs.app?"))) (copy-file oldbin newbin nil nil nil 'preserve-permissions) (unless (file-exists-p newbin) (error "Failed to copy %s to %s" oldbin newbin)) From f23960b919f429acc28c98b22966f7b771d81ce0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 16:54:02 +0200 Subject: [PATCH 2860/4235] lang/ruby: don't enable global-rbenv-mode To be consistent with pyenv/virtualenvs; rbenv should be managed manually, rather than trying to guess what the user wants. --- modules/lang/ruby/config.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 88ffe3031..6d34cbf69 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -118,10 +118,7 @@ (def-package! rbenv :when (featurep! +rbenv) :after enh-ruby-mode - :config - (set-env! "RBENV_ROOT") - (when (executable-find "rbenv") - (global-rbenv-mode +1))) + :config (set-env! "RBENV_ROOT")) (def-package! rvm From c7abe743d1db1862bf12603296370d9945ddbe3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 16:55:02 +0200 Subject: [PATCH 2861/4235] lang/ruby: show messages when robe throws errors --- modules/lang/ruby/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 6d34cbf69..5308e06b7 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -58,7 +58,8 @@ (when (executable-find "ruby") (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_) t))) (save-window-excursion - (ignore-errors (robe-start))) + (with-demoted-errors "ROBE ERROR: %s" + (robe-start))) (when (robe-running-p) (add-hook 'kill-buffer-hook #'+ruby|cleanup-robe-servers nil t))))) (add-hook 'enh-ruby-mode-hook #'+ruby|init-robe) From 641cef98480baf7af29eeaa6825044a1c40846d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 17:09:37 +0200 Subject: [PATCH 2862/4235] Refresh vc when magit refreshes #826 Magit does not inform vc that changes have occurred to open buffers. This fixes that (and indirectly fixes branch display in the modeline). --- modules/tools/magit/config.el | 10 +++++++++- modules/ui/doom-modeline/config.el | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 6bf623d91..cf440a5e2 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -36,7 +36,15 @@ available.") (add-hook! '(magit-mode-hook magit-popup-mode-hook) #'hide-mode-line-mode) ;; properly kill leftover magit buffers on quit - (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) + (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) + + (defun +magit|update-vc () + "Update vc in all verson-controlled buffers when magit refreshes." + (dolist (buf (buffer-list)) + (with-current-buffer buf + (vc-refresh-state)))) + (add-hook 'magit-post-refresh-hook #'+magit|update-vc)) + (def-package! magit-todos diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 81c5cd9cb..ceba2594c 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -529,6 +529,7 @@ directory, the file name, and its state (modified, read-only or non-existent)." (add-hook 'after-revert-hook #'+doom-modeline--update-vcs) (add-hook 'after-save-hook #'+doom-modeline--update-vcs) (add-hook 'find-file-hook #'+doom-modeline--update-vcs t) +(advice-add #'vc-refresh-state :after #'+doom-modeline--update-vcs) (def-modeline-segment! vcs "Displays the current branch, colored based on its state." From bfa6fce15f26e3b59893e210d0ffcdf5d42cefbc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 17:12:49 +0200 Subject: [PATCH 2863/4235] +popup/buffer: hide buffer being popped up #825 --- modules/ui/popup/autoload/popup.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 0a72f937a..755d0ba7d 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -279,6 +279,18 @@ Any non-nil value besides the above will be used as the raw value for ;;;###autoload (defalias 'other-popup #'+popup/other) +;;;###autoload +(defun +popup/buffer () + "Open this buffer in a popup window." + (interactive) + (let ((+popup-default-display-buffer-actions + '(+popup-display-buffer-stacked-side-window)) + (display-buffer-alist +popup--display-buffer-alist) + (buffer (current-buffer))) + (push (+popup--make "." +popup-defaults) display-buffer-alist) + (bury-buffer) + (pop-to-buffer buffer))) + ;;;###autoload (defun +popup/other () "Cycle through popup windows, like `other-window'. Ignores regular windows." From 9eae0860c6ef4468256f8c76ae2315324f6c5f18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 17:21:28 +0200 Subject: [PATCH 2864/4235] Fix doom/window-enlargen in popup windows #825 --- core/autoload/ui.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 490ce3b94..9d3ae9091 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -69,7 +69,21 @@ windows (unlike `doom/window-zoom') Activate again to undo." (assoc ?_ register-alist)) (ignore (jump-to-register ?_)) (window-configuration-to-register ?_) - (maximize-window) + (if (window-dedicated-p) + ;; `window-resize' and `window-max-delta' don't respect + ;; `ignore-window-parameters', so we gotta force it to. + (cl-letf* ((old-window-resize (symbol-function #'window-resize)) + (old-window-max-delta (symbol-function #'window-max-delta)) + ((symbol-function #'window-resize) + (lambda (window delta &optional horizontal _ignore pixelwise) + (funcall old-window-resize window delta horizontal + t pixelwise))) + ((symbol-function #'window-max-delta) + (lambda (&optional window horizontal _ignore trail noup nodown pixelwise) + (funcall old-window-max-delta window horizontal t + trail noup nodown pixelwise)))) + (maximize-window)) + (maximize-window)) t))) ;;;###autoload From ed8a08226cbf538779e1f02e00a9c265986ab961 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 17:27:31 +0200 Subject: [PATCH 2865/4235] ui/modeline: install shrink-path --- modules/ui/modeline/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/modeline/packages.el b/modules/ui/modeline/packages.el index e82f1e343..9c484100f 100644 --- a/modules/ui/modeline/packages.el +++ b/modules/ui/modeline/packages.el @@ -17,4 +17,4 @@ (when (featurep! :feature evil) (package! evil-anzu)) -;; TODO (package! shrink-path) +(package! shrink-path) From c5f3cc17c5261d61a4f5c83082474c5911f73bee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 17:31:21 +0200 Subject: [PATCH 2866/4235] Fix doom quickstart not respecting -y/--yes #817 --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 7b216f1d1..cb1387ddc 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -331,7 +331,7 @@ packages and regenerates the autoloads file." (with-temp-file config-file (insert "")) (print! (green "Done!"))))) (print! "Installing plugins") - (doom-packages-install) + (doom-packages-install doom-auto-accept) (print! "Regenerating autoloads files") (doom-reload-autoloads nil 'force-p) (print! (bold (green "\nFinished! Doom is ready to go!\n"))) From e3f412abb749d7465d99b46a99b7f4a32373d60c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 23 Aug 2018 18:42:09 +0200 Subject: [PATCH 2867/4235] Add +evil-want-o/O-to-continue-comments Controls whether o/O continue commented lines. Since this is the default behavior of vim, it is enabled by default. --- modules/feature/evil/config.el | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 8b495be87..f50a8cce3 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -3,6 +3,10 @@ ;; I'm a vimmer at heart. Its modal philosophy suits me better, and this module ;; strives to make Emacs a much better vim than vim was. +(defvar +evil-want-o/O-to-continue-comments t + "If non-nil, the o/O keys will continue comment lines if the point is on a +line with a linewise comment.") + ;; Set these defaults before `evil'; use `defvar' so they can be changed prior ;; to loading. (defvar evil-want-C-u-scroll t) @@ -122,6 +126,38 @@ (advice-add #'counsel-git-grep-action :around #'+evil*set-jump) (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) + ;; Make o/O continue comments + (defun +evil*insert-newline-above-and-respect-comments (orig-fn) + (if (or (not +evil-want-o/O-to-continue-comments) + (evil-insert-state-p)) + (funcall orig-fn) + (evil-narrow-to-field + (if (nth 4 (syntax-ppss (line-end-position))) + (evil-save-goal-column + (comment-beginning) + ;; Use a dummy char to force correct indentation + (insert "_") + (save-excursion (call-interactively #'comment-indent-new-line)) + (delete-char -1)) + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation))))) + (advice-add #'evil-insert-newline-above :around #'+evil*insert-newline-above-and-respect-comments) + + (defun +evil*insert-newline-below-and-respect-comments (orig-fn) + (if (or (not +evil-want-o/O-to-continue-comments) + (evil-insert-state-p)) + (funcall orig-fn) + (let ((comment-p (nth 4 (syntax-ppss (line-end-position))))) + (evil-narrow-to-field + (evil-move-end-of-line) + (if comment-p + (comment-indent-new-line) + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation)))))) + (advice-add #'evil-insert-newline-below :around #'+evil*insert-newline-below-and-respect-comments) + ;; --- custom interactive codes ----------- ;; These arg types will highlight matches in the current buffer (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) From 627aae436d278a52416d2b4ba71d25d1a79c6efe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 01:07:55 +0200 Subject: [PATCH 2868/4235] completion/helm: add helm-ff-fuzzy-matching Also resorts the fuzzy-match variable list. --- modules/completion/helm/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 755195f26..cd614d080 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -87,20 +87,21 @@ be negative.") (advice-add #'posframe--get-font-height :around #'+helm*fix-get-font-height)) (let ((fuzzy (featurep! +fuzzy))) - (setq helm-mode-fuzzy-match fuzzy - helm-completion-in-region-fuzzy-match fuzzy - helm-M-x-fuzzy-match fuzzy + (setq helm-M-x-fuzzy-match fuzzy helm-ag-fuzzy-match fuzzy helm-apropos-fuzzy-match fuzzy + helm-apropos-fuzzy-match fuzzy helm-bookmark-show-location fuzzy helm-buffers-fuzzy-matching fuzzy helm-completion-in-region-fuzzy-match fuzzy + helm-completion-in-region-fuzzy-match fuzzy + helm-ff-fuzzy-matching fuzzy helm-file-cache-fuzzy-match fuzzy helm-flx-for-helm-locate fuzzy helm-imenu-fuzzy-match fuzzy - helm-apropos-fuzzy-match fuzzy helm-lisp-fuzzy-completion fuzzy helm-locate-fuzzy-match fuzzy + helm-mode-fuzzy-match fuzzy helm-projectile-fuzzy-match fuzzy helm-recentf-fuzzy-match fuzzy helm-semantic-fuzzy-match fuzzy)) From 619ac430178777ce74326dbf1b20c8098e270689 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 01:08:39 +0200 Subject: [PATCH 2869/4235] completion/helm: unbind / #829 Disables special behavior on / and /, which are strange. --- modules/completion/helm/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index cd614d080..e6d5bdaa1 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -65,7 +65,7 @@ be negative.") (def-package! helm :after helm-mode - :init + :preface (setq helm-candidate-number-limit 50 ;; Remove extraineous helm UI elements helm-display-header-line nil @@ -79,8 +79,11 @@ be negative.") helm-display-buffer-default-height 0.25 ;; When calling `helm-semantic-or-imenu', don't immediately jump to ;; symbol at point - helm-imenu-execute-action-at-once-if-one nil) + helm-imenu-execute-action-at-once-if-one nil + ;; disable special behavior for left/right, M-left/right keys. + helm-ff-lynx-style-map nil) + :init (when (and EMACS26+ (featurep! +childframe)) (setq helm-display-function #'+helm-posframe-display) ;; Fix "Specified window is not displaying the current buffer" error From 6b9103928370d87aa236d607205336b75be17775 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 01:09:53 +0200 Subject: [PATCH 2870/4235] Fix helm persistent action with *Org Links* window Fixes #829. Helm's persistent action would try to operate on the *Org Links* window, which is dedicated, causing a "Cannot split side window or parent of side window" error. This fix gets rid of this unhelpful popup altogether when helm is enabled. --- modules/ui/popup/+hacks.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index c2417cd0d..7ab69d82f 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -168,7 +168,7 @@ the command buffer." ;; `helm' -(after! helm +(when (featurep! :completion helm) (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window)) ;; Fix left-over popup window when closing persistent help for `helm-M-x' @@ -178,11 +178,21 @@ the command buffer." (string= candidate (helm-attr 'help-current-symbol)) (setq win (get-buffer-window (get-buffer (help-buffer))))) (delete-window win)))) - (advice-add #'helm-elisp--persistent-help :before #'+popup*helm-elisp--persistent-help)) + (advice-add #'helm-elisp--persistent-help :before #'+popup*helm-elisp--persistent-help) + ;; Get rid of useless Org Links popup, which causes window selection errors + ;; with helm's persistent action. + (defun +popup*delete-org-links-popup (orig-fn &rest args) + (cl-letf* ((old-org-completing-read (symbol-function #'org-completing-read)) + ((symbol-function #'org-completing-read) + (lambda (&rest args) + (when-let* ((win (get-buffer-window "*Org Links*"))) + (delete-window win)) + (apply old-org-completing-read args)))) + (apply orig-fn args))) + (advice-add #'org-insert-link :around #'+popup*delete-org-links-popup) -;; `helm-ag' -(progn + ;; `helm-ag' (defun +helm*pop-to-buffer (orig-fn &rest args) (pop-to-buffer (save-window-excursion (apply orig-fn args) From 08c09c2898d830a6aebf8e0813b7ebe291ba7119 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 01:12:05 +0200 Subject: [PATCH 2871/4235] bin/doom patch-macos: show "Patching X" message --- core/core-cli.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-cli.el b/core/core-cli.el index cb1387ddc..c20644147 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -367,6 +367,7 @@ packages and regenerates the autoloads file." ((or doom-auto-accept (y-or-n-p (concat "/Applications/Emacs.app needs to be patched. See `bin/doom help patch-macos' for why and how.\n\n" "Patch Emacs.app?"))) + (message "Patching '%s'" appdir) (copy-file oldbin newbin nil nil nil 'preserve-permissions) (unless (file-exists-p newbin) (error "Failed to copy %s to %s" oldbin newbin)) From 9eee22e3fcc15412db6d1f69c0294c090cb4aa5a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 01:47:44 +0200 Subject: [PATCH 2872/4235] completion/helm: redesign keybindings A more vim-friendly (and spacemacs-friendly) keybinding scheme. May address #829 --- modules/completion/helm/config.el | 37 ++------------------ modules/config/default/+bindings.el | 54 +++++++++++++++++++---------- 2 files changed, 38 insertions(+), 53 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index e6d5bdaa1..d6e669fa5 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -83,6 +83,9 @@ be negative.") ;; disable special behavior for left/right, M-left/right keys. helm-ff-lynx-style-map nil) + (when (featurep! :feature evil +everywhere) + (setq helm-default-prompt-display-function #'+helm--set-prompt-display)) + :init (when (and EMACS26+ (featurep! +childframe)) (setq helm-display-function #'+helm-posframe-display) @@ -205,37 +208,3 @@ be negative.") (setq swiper-helm-display-function (lambda (buf &optional _resume) (pop-to-buffer buf))) - -;; -;; Evil integration -;; - -(when (featurep! :feature evil +everywhere) - (setq helm-default-prompt-display-function #'+helm--set-prompt-display) - - (map! (:after helm - :map helm-map - "C-S-p" #'helm-previous-source - "C-S-n" #'helm-next-source - "C-l" #'helm-execute-persistent-action - "C-j" #'helm-next-line - "C-k" #'helm-previous-line - "C-f" #'helm-next-page - "C-u" #'helm-previous-page - [tab] #'helm-select-action) - (:after helm-files - :map (helm-find-files-map helm-read-file-map) - [M-return] #'helm-ff-run-switch-other-window - "M-h" #'helm-find-files-up-one-level) - (:after helm-locate - :map helm-generic-files-map - "S-" #'helm-ff-run-switch-other-window) - (:after helm-buffers - :map helm-buffer-map - [M-return] #'helm-buffer-switch-other-window) - (:after helm-regexp - :map helm-moccur-map - [M-return] #'helm-moccur-run-goto-line-ow) - (:after helm-grep - :map helm-grep-map - [M-return] #'helm-grep-run-other-window-action))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2d37b7f14..23fc47d36 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -343,27 +343,43 @@ ;; 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-s" #'helm-minibuffer-history - "C-b" #'backward-word - [left] #'backward-char - [right] #'forward-char - [escape] #'helm-keyboard-quit - [tab] #'helm-execute-persistent-action) + [up] #'previous-history-element + [down] #'next-history-element + "C-S-n" #'helm-next-source + "C-S-p" #'helm-previous-source + "C-j" #'helm-next-line + "C-k" #'helm-previous-line + "C-S-j" #'helm-next-source + "C-S-k" #'helm-previous-source + "C-f" #'helm-next-page + "C-S-f" #'helm-previous-page + "C-u" #'helm-delete-minibuffer-contents + "C-w" #'backward-kill-word + "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! + "C-s" #'helm-minibuffer-history + "C-b" #'backward-word + ;; Swap TAB and C-z + [tab] #'helm-execute-persistent-action + "C-z" #'helm-select-action) (:after helm-files - (:map helm-generic-files-map - :e [escape] #'helm-keyboard-quit) - (:map helm-find-files-map - "C-w" #'helm-find-files-up-one-level - [tab] #'helm-execute-persistent-action)) + :map (helm-find-files-map helm-read-file-map) + [M-return] #'helm-ff-run-switch-other-window + "C-w" #'helm-find-files-up-one-level) (:after helm-ag - (:map helm-ag-map - [backtab] #'helm-ag-edit))) + :map helm-ag-map + [backtab] #'helm-ag-edit) + (:after helm-locate + :map helm-generic-files-map + [M-return] #'helm-ff-run-switch-other-window) + (:after helm-buffers + :map helm-buffer-map + [M-return] #'helm-buffer-switch-other-window) + (:after helm-regexp + :map helm-moccur-map + [M-return] #'helm-moccur-run-goto-line-ow) + (:after helm-grep + :map helm-grep-map + [M-return] #'helm-grep-run-other-window-action)) ;; hl-todo :m "]t" #'hl-todo-next From 62b9166871afcab83771cd02b586fea6cc57a671 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 12:36:16 +0200 Subject: [PATCH 2873/4235] Change :make to reuse last command Unless given a command. --- modules/config/default/+evil-commands.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index cce6952ac..8ce341ac1 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -23,9 +23,9 @@ "Run the current project Makefile's COMMAND. If FROM-PWD (bang), run the make command from the current directory instead of the project root." (interactive "") - (let ((default-directory (if from-pwd default-directory (doom-project-root t))) - (command (and command (evil-ex-replace-special-filenames command)))) - (compile command))) + (let ((default-directory (if from-pwd default-directory (doom-project-root t)))) + (compile (or (if command (evil-ex-replace-special-filenames command)) + compile-command)))) (evil-define-command doom:reverse-lines (beg end) "Reverse lines between BEG and END." From 6a39b98f675cf4babb72123844cd0317d075d876 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 16:56:24 +0200 Subject: [PATCH 2874/4235] Trigger +javascript-npm-mode in json-mode too --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index e39b965db..1dba38e26 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -252,7 +252,7 @@ :files ("gulpfile.js")) (def-project-mode! +javascript-npm-mode - :modes (html-mode css-mode web-mode js2-mode markdown-mode) + :modes (html-mode css-mode web-mode js2-mode json-mode markdown-mode) :files ("package.json") :add-hooks (+javascript|add-node-modules-path)) From d59f36eee14f000973b25fdaa5567daed0e1d3a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 17:53:21 +0200 Subject: [PATCH 2875/4235] Eval compile-command in :make In case it is a set to a lisp form by a file local variable. --- modules/config/default/+evil-commands.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 8ce341ac1..657524b18 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -25,7 +25,7 @@ command from the current directory instead of the project root." (interactive "") (let ((default-directory (if from-pwd default-directory (doom-project-root t)))) (compile (or (if command (evil-ex-replace-special-filenames command)) - compile-command)))) + (eval compile-command))))) (evil-define-command doom:reverse-lines (beg end) "Reverse lines between BEG and END." From 469cc7fbc1a0b3f4edfa944d2fbdb7cad5fea955 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 24 Aug 2018 19:28:03 +0200 Subject: [PATCH 2876/4235] Remove up/down keybinds in helm --- modules/config/default/+bindings.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 23fc47d36..638019ce6 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -343,8 +343,6 @@ ;; helm (:after helm (:map helm-map - [up] #'previous-history-element - [down] #'next-history-element "C-S-n" #'helm-next-source "C-S-p" #'helm-previous-source "C-j" #'helm-next-line From 171c87aa2c9a6c94b607072a82846c7ac35cdd3e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 00:02:53 +0200 Subject: [PATCH 2877/4235] editor/format: general fix & refactor + Fixes function/command formatters (like #'gofmt) + Fixes formatting by region + Adds default keybindings: + gQ evil operator + SPC c f (normal mode) to format buffer + SPC c f (visual mode) to format selection --- modules/config/default/+bindings.el | 1 + modules/editor/format/autoload.el | 165 ----------------- modules/editor/format/autoload/evil.el | 8 + modules/editor/format/autoload/format.el | 219 +++++++++++++++++++++++ 4 files changed, 228 insertions(+), 165 deletions(-) delete mode 100644 modules/editor/format/autoload.el create mode 100644 modules/editor/format/autoload/evil.el create mode 100644 modules/editor/format/autoload/format.el diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 638019ce6..2321a8c98 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -92,6 +92,7 @@ :m "gd" #'+lookup/definition :m "gD" #'+lookup/references :n "gf" #'+lookup/file + :n "gQ" #'+format:region :n "gp" #'+evil/reselect-paste :v "gp" #'+evil/paste-preserve-register :n "gr" #'+eval:region diff --git a/modules/editor/format/autoload.el b/modules/editor/format/autoload.el deleted file mode 100644 index ba306f0ac..000000000 --- a/modules/editor/format/autoload.el +++ /dev/null @@ -1,165 +0,0 @@ -;;; editor/format/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +format--resolve-system (choices) - "Get first choice matching `format-all-system-type' from CHOICES." - (cl-loop for choice in choices - if (atom choice) return choice - else if (eql format-all-system-type (car choice)) - return (cadr choice))) - -;;;###autodef -(cl-defun set-formatter! (modes formatter &key - name - install - filter - ok-statuses - error-regexp) - "Define a FORMATTER for MODES. - -MODES can be a major mode symbol, a vector of major modes, or a vector of -two-element vectors made up of [MAJOR-MODE FORM]. FORM is evaluated when the -buffer is formatted and its return value is a predicate for this formatter. Its -return value is stored in If it is non-nil, this formatter is used. Its return -value is stored in the `mode-result' variable for FORMATTER (if it's not a -string). - -FORMATTER can be a function, string or nested vector. - - If a function, it should be a formatter function that - `format-all-buffer-thunk' will accept. - If a string, it is assumed to be a shell command that the text will be piped - to (stdin). - If a vector, it should represent a shell command as a list of arguments. Each - element is either a string or vector [STRING ARG] where STRING is a format - string and ARG is both a predicate and argument for STRING. If ARG is nil, - STRING will be omitted from the vector. - -NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME will -default to \"default\". - -INSTALL should be a string representing the shell command necessary to install -this formatter's dependencies. INSTALL can also be a list of lists made up of -two items: (OS COMMAND). - -Basic examples: - - (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") - (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") - -Advanced examples: - - (set-formatter! - '((c-mode \".c\") - (c++-mode \".cpp\") - (java-mode \".java\") - (objc-mode \".m\") - (protobuf-mode \".proto\")) - '(\"clang-format\" - (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) - :install '(macos \"brew install clang-format\")) - - (set-formatter! - '(html-mode - (web-mode (and (equal \"none\" web-mode-engine) - (car (member web-mode-content-type '(\"xml\" \"html\")))))) - '(\"tidy\" \"-q\" \"-indent\" - (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) - :ok-statuses '(0 1) - :install '(macos \"brew install tidy-html5\")) - - (set-formatter! 'elm-mode - \"elm-format --yes --stdin\" - :install '(macos \"brew install elm\") - :filter - (lambda (output errput first-diff) - (list output - (format-all-remove-ansi-color errput) - first-diff)))" - (declare (indent defun)) - (let* ((command-list (cond ((stringp formatter) ; shell command - (split-string formatter " " t)) - ((listp formatter) ; shell command in lists - formatter))) - (name (cond ((or name (car command-list))) - ((symbolp formatter) (symbol-name formatter)) - ("default")))) - (after! format-all - (puthash - name - (lambda (executable mode-result) - (ignore mode-result executable) - (apply (or filter #'identity) - (cond ((commandp formatter) - (let ((mode major-mode) - (file buffer-file-name)) - (format-all-buffer-thunk - (lambda (input) - (setq buffer-file-name file) - (funcall mode) - (insert input) - (condition-case e - (progn - (call-interactively formatter) - (list nil "")) - (error (list t (error-message-string e)))))))) - ((functionp formatter) - (format-all-buffer-thunk formatter)) - ((let ((args (cl-loop for arg in command-list - if (stringp arg) collect arg - else if - (and (listp arg) - (eval (cadr arg) t)) - collect (format (car arg) it)))) - (if (or ok-statuses error-regexp) - (apply #'format-all-buffer-hard ok-statuses error-regexp args) - (apply #'format-all-buffer-easy args))))))) format-all-format-table) - (puthash name (cond ((null install) install) - ((listp install) (cdr (assq (+format--resolve-system) install))) - (install)) - format-all-install-table) - (puthash name (car command-list) format-all-executable-table) - (dolist (mode (doom-enlist modes)) - (cl-destructuring-bind (m &optional probe) - (doom-enlist mode) - (format-all-pushhash - m (cons name (if probe `(lambda () ,probe))) - format-all-mode-table)))) - name)) - -;;;###autoload -(defun +format-region (beg end) - "TODO" - (cl-check-type beg integer) - (cl-check-type end integer) - (save-restriction - (let* ((beg (save-excursion (goto-char beg) (line-beginning-position))) - (end (save-excursion (goto-char end) (line-end-position))) - (file buffer-file-name) - (input (buffer-substring-no-properties beg end))) - (with-temp-buffer - (setq buffer-file-name file) - (insert input) - (format-all-buffer))))) - - -;; -;; Commands -;; - -;;;###autoload -(defalias '+format/buffer 'format-all-buffer) - -;;;###autoload -(defun +format/region (beg end) - "TODO" - (interactive "r") - (+format-region beg end)) - -;;;###autoload -(defun +format/region-or-buffer (beg end) - "TODO" - (interactive "r") - (if (use-region-p) - (+format-region beg end) - (format-all-buffer))) diff --git a/modules/editor/format/autoload/evil.el b/modules/editor/format/autoload/evil.el new file mode 100644 index 000000000..72cb0bc36 --- /dev/null +++ b/modules/editor/format/autoload/evil.el @@ -0,0 +1,8 @@ +;;; editor/format/autoload/evil.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) + +;;;###autoload (autoload '+format:region "editor/format/autoload/evil" nil t) +(evil-define-operator +format:region (beg end type) + "Evil ex interface to `+format-region'." + (interactive "") + (+format-region beg end)) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el new file mode 100644 index 000000000..64a8080da --- /dev/null +++ b/modules/editor/format/autoload/format.el @@ -0,0 +1,219 @@ +;;; editor/format/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +format--resolve-system (choices) + "Get first choice matching `format-all-system-type' from CHOICES." + (cl-loop for choice in choices + if (atom choice) return choice + else if (eql format-all-system-type (car choice)) + return (cadr choice))) + +;;;###autodef +(cl-defun set-formatter! (modes formatter &key + name + install + filter + ok-statuses + error-regexp) + "Define a FORMATTER for MODES. + +MODES can be a major mode symbol, a vector of major modes, or a vector of +two-element vectors made up of [MAJOR-MODE FORM]. FORM is evaluated when the +buffer is formatted and its return value is a predicate for this formatter. Its +return value is stored in If it is non-nil, this formatter is used. Its return +value is stored in the `mode-result' variable for FORMATTER (if it's not a +string). + +FORMATTER can be a function, string or nested vector. + + If a function, it should be a formatter function that + `format-all-buffer-thunk' will accept. + If a string, it is assumed to be a shell command that the text will be piped + to (stdin). + If a vector, it should represent a shell command as a list of arguments. Each + element is either a string or vector [STRING ARG] where STRING is a format + string and ARG is both a predicate and argument for STRING. If ARG is nil, + STRING will be omitted from the vector. + +NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME will +default to \"default\". + +INSTALL should be a string representing the shell command necessary to install +this formatter's dependencies. INSTALL can also be a list of lists made up of +two items: (OS COMMAND). + +Basic examples: + + (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") + (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") + +Advanced examples: + + (set-formatter! + '((c-mode \".c\") + (c++-mode \".cpp\") + (java-mode \".java\") + (objc-mode \".m\") + (protobuf-mode \".proto\")) + '(\"clang-format\" + (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) + :install '(macos \"brew install clang-format\")) + + (set-formatter! + '(html-mode + (web-mode (and (equal \"none\" web-mode-engine) + (car (member web-mode-content-type '(\"xml\" \"html\")))))) + '(\"tidy\" \"-q\" \"-indent\" + (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) + :ok-statuses '(0 1) + :install '(macos \"brew install tidy-html5\")) + + (set-formatter! 'elm-mode + \"elm-format --yes --stdin\" + :install '(macos \"brew install elm\") + :filter + (lambda (output errput first-diff) + (list output + (format-all-remove-ansi-color errput) + first-diff)))" + (declare (indent defun)) + (cl-check-type name (or symbol null)) + (let* ((command-list (cond ((stringp formatter) ; shell command + (split-string formatter " " t)) + ((listp formatter) ; shell command in lists + formatter))) + (name (cond (name) + ((car command-list) (intern (car command-list))) + ((symbolp formatter) formatter) + ((user-error "Anonymous formatter requires a :name")))) + (fn (lambda (executable mode-result) + (let ((result + (cond ((commandp formatter) + (let ((mode major-mode) + (file buffer-file-name) + (dir default-directory)) + (format-all-buffer-thunk + (lambda (input) + (with-silent-modifications + (setq buffer-file-name file + default-directory dir) + (delay-mode-hooks (funcall mode)) + (insert input) + (condition-case e + (progn + (call-interactively formatter) + (list nil "")) + (error (list t (error-message-string e))))))))) + ((functionp formatter) + (format-all-buffer-thunk formatter)) + ((cl-loop for arg in command-list + if (stringp arg) + collect arg into args + else if (eval (cadr arg) t) + collect (format (car arg) it) into args + finally do + (if (or ok-statuses error-regexp) + (apply #'format-all-buffer-hard ok-statuses error-regexp args) + (apply #'format-all-buffer-easy args))))))) + (if filter + (apply filter result) + result)))) + (install (cond ((null install) install) + ((listp install) + (cdr (assq (+format--resolve-system) install))) + (install)))) + (after! format-all + (puthash name fn format-all-format-table) + (puthash name install format-all-install-table) + (puthash name (car command-list) format-all-executable-table) + (dolist (mode (doom-enlist modes)) + (cl-destructuring-bind (m &optional probe) + (doom-enlist mode) + (format-all-pushhash + m (cons name (if probe `(lambda () ,probe))) + format-all-mode-table)))) + name)) + +;;;###autoload +(defun +format-region (beg end) + "Runs the active formatter on the selected region." + (cl-check-type beg integer) + (cl-check-type end integer) + ;; TODO Refactor me + ;; Hack ahoy! We force format-all (and the programs it delegates to) to only + ;; format a region rather than the whole buffer. + (require 'format-all) + (save-restriction + (let* ((beg (save-excursion (goto-char beg) (line-beginning-position))) + (end (save-excursion (goto-char end) + (if (bolp) (backward-char)) + (line-end-position))) + (file buffer-file-name) + (dir default-directory) + (mode major-mode) + (input (buffer-substring-no-properties beg end)) + (leading-indent 0) + final-output) + (with-temp-buffer + (with-silent-modifications + (setq buffer-file-name file + default-directory dir) + (delay-mode-hooks (funcall mode)) + (save-excursion (insert input)) + (setq leading-indent (current-indentation)) + (indent-rigidly (point-min) (point-max) (- leading-indent)) + ;; From `format-all-buffer' + (cl-destructuring-bind (formatter mode-result) (format-all-probe) + (unless formatter (error "Don't know how to format %S code" major-mode)) + (let ((f-function (gethash formatter format-all-format-table)) + (executable (format-all-formatter-executable formatter))) + (cl-destructuring-bind (output errput first-diff) + (funcall f-function executable mode-result) + (cl-case output + ((nil) + (message "Syntax error")) + ((t) + (message "Already formatted")) + (t + (erase-buffer) + (insert output) + (indent-rigidly (point-min) (point-max) leading-indent) + (setq final-output (string-trim-right (buffer-string))))) + (with-current-buffer (get-buffer-create "*format-all-errors*") + (erase-buffer) + (unless (= 0 (length errput)) + (insert errput) + (display-buffer (current-buffer))))))))) + (when final-output + (message "Reformatted!") + (save-excursion + (goto-char beg) + (delete-region beg end) + (insert final-output)))))) + + +;; +;; Commands +;; + +;;;###autoload +(defalias '+format/buffer 'format-all-buffer) + +;;;###autoload +(defun +format/region (beg end) + "Runs the active formatter on the lines within BEG and END. + +WARNING: this may not work everywhere. It will throw errors if the region +contains a syntax error in isolation. It is mostly useful for formatting +snippets or single lines." + (interactive "r") + (+format-region beg end)) + +;;;###autoload +(defun +format/region-or-buffer (beg end) + "Runs the active formatter on the selected region (or whole buffer, if nothing +is selected)." + (interactive "r") + (if (use-region-p) + (+format-region beg end) + (format-all-buffer))) From c514ad200ab3711329c7b2b7b915ef2bcd8877d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 00:04:53 +0200 Subject: [PATCH 2878/4235] Remove web-beautify from javascript & web modules Superceded by :editor format module, which uses prettier. --- modules/lang/javascript/config.el | 4 ---- modules/lang/javascript/packages.el | 1 - modules/lang/web/config.el | 9 --------- modules/lang/web/packages.el | 1 - 4 files changed, 15 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 1dba38e26..f57d1e34e 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -234,10 +234,6 @@ :n "se" #'skewer-html-eval-tag)) -;; `web-beautify' -(map! :map* (json-mode-map js2-mode-map) :n "gQ" #'web-beautify-js) - - ;; ;; Projects ;; diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 65e1ba8a0..0a65090ff 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -12,7 +12,6 @@ (package! skewer-mode) (package! tide) (package! typescript-mode) -(package! web-beautify) (when (featurep! :feature lookup) (package! xref-js2)) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index e6aebcfa5..6a9c0179f 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -4,15 +4,6 @@ (load! "+css") -(def-package! web-beautify - :commands (web-beautify-html web-beautify-css) - :init - (map! (:map* (css-mode-map scss-mode-map less-css-mode-map) - :n "gQ" #'web-beautify-css) - (:map* web-mode-map - :n "gQ" #'web-beautify-html))) - - (def-package! emmet-mode :commands emmet-mode :preface (defvar emmet-mode-keymap (make-sparse-keymap)) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index 9a864d1bc..bbfcbfd3b 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -4,7 +4,6 @@ ;; requires js-beautify stylelint stylelint-scss (package! rainbow-mode) -(package! web-beautify) (when (featurep! :completion ivy) (package! counsel-css)) From 6515a1c539b91b1fd7318f4a464c9b92f8346fe5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 01:10:47 +0200 Subject: [PATCH 2879/4235] editor/format: fix +onsave --- modules/editor/format/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index e3e4fa05f..ff47cad60 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -24,7 +24,7 @@ control which major modes to target." ((eq (car +format-on-save-enabled-modes) 'not) (memq major-mode (cdr +format-on-save-enabled-modes))) ((not (memq major-mode +format-on-save-enabled-modes)))) - (require 'format-all nil t) + (not (require 'format-all nil t)) (not (format-all-probe))) (format-all-mode +1))) From 77838534ce878f98a4ed946778dbf021385db0bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 03:16:32 +0200 Subject: [PATCH 2880/4235] Polyfill line-number-display-width for Emacs 25 Fixes void-function line-number-display-width errors (used in company-pseudo-tooltip-frontend). --- core/autoload/line-numbers.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index cf5985093..1fa32d7a6 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -50,6 +50,13 @@ When `display-line-numbers-mode' is turned on, to display all line numbers in the buffer." :type 'boolean) +;;;###autoload +(defun line-number-display-width () + "Return the width used for displaying line numbers in the +selected window." + (length (save-excursion (goto-char (point-max)) + (format-mode-line "%l")))) + (defun display-line-numbers-update-width () "Prevent the line number width from shrinking." (let ((width (line-number-display-width))) From 33b0a8d36c38cdbc1d5cc255fc058f2c6a284504 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 03:17:58 +0200 Subject: [PATCH 2881/4235] bin/doom quickstart: Offer to patch Emacs.app --- core/core-cli.el | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/core/core-cli.el b/core/core-cli.el index c20644147..85e36ffab 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -330,6 +330,27 @@ packages and regenerates the autoloads file." (print! "Deploying empty config.el file in %s" short-private-dir) (with-temp-file config-file (insert "")) (print! (green "Done!"))))) + ;; Ask if Emacs.app should be patched + (condition-case e + (when IS-MAC + (message "MacOS detected") + (let ((appdir (cl-find-if #'file-directory-p + (list "/Applications/Emacs.app" + "~/Applications/Emacs.app")))) + (unless appdir + (user-error "Couldn't find Emacs.app in /Applications or ~/Applications")) + (when (file-exists-p! "Contents/MacOS/RunEmacs" appdir) + (user-error "Emacs.app is already patched")) + (unless (or doom-auto-accept + (y-or-n-p + (concat "Doom would like to patch your Emacs.app bundle so that it respects\n" + "your shell configuration. For more information on why and how, run\n\n" + " bin/doom help patch-macos\n\n" + "Patch Emacs.app?"))) + (user-error "Will not patch Emacs.app")) + (doom-patch-macos))) + (user-error (message "%s" (error-message-string e)))) + ;; Install Doom packages (print! "Installing plugins") (doom-packages-install doom-auto-accept) (print! "Regenerating autoloads files") From 8e092b9884bd98ee0a628bf0c74857077a4582de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 04:01:35 +0200 Subject: [PATCH 2882/4235] Refactor doom-quit-p --- core/autoload/ui.el | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 9d3ae9091..1bb3e0300 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -145,11 +145,9 @@ to a new one." Returns t if it is safe to kill this session. Does not prompt if no real buffers are open." - "Return t if this session should be killed silently." - (if (ignore-errors (doom-real-buffer-list)) - (or (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) - (ignore (message "Aborted"))) - t)) + (or (not (ignore-errors (doom-real-buffer-list))) + (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) + (ignore (message "Aborted")))) ;;;###autoload (defun doom|apply-ansi-color-to-compilation-buffer () From cc47798846e1f55c2bd10d6263bcb41d28e23092 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 12:00:27 +0200 Subject: [PATCH 2883/4235] Revert 6b910392 #829 Causes other errors. Will need a better solution. --- modules/ui/popup/+hacks.el | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 7ab69d82f..6d5f9b334 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -180,18 +180,6 @@ the command buffer." (delete-window win)))) (advice-add #'helm-elisp--persistent-help :before #'+popup*helm-elisp--persistent-help) - ;; Get rid of useless Org Links popup, which causes window selection errors - ;; with helm's persistent action. - (defun +popup*delete-org-links-popup (orig-fn &rest args) - (cl-letf* ((old-org-completing-read (symbol-function #'org-completing-read)) - ((symbol-function #'org-completing-read) - (lambda (&rest args) - (when-let* ((win (get-buffer-window "*Org Links*"))) - (delete-window win)) - (apply old-org-completing-read args)))) - (apply orig-fn args))) - (advice-add #'org-insert-link :around #'+popup*delete-org-links-popup) - ;; `helm-ag' (defun +helm*pop-to-buffer (orig-fn &rest args) (pop-to-buffer From 7510f5abf0a7ad97848600aa791253141d3a1d38 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 12:02:19 +0200 Subject: [PATCH 2884/4235] bin/quickstart: fix wrong-number-of-args error --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 85e36ffab..b2497dc86 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -348,7 +348,7 @@ packages and regenerates the autoloads file." " bin/doom help patch-macos\n\n" "Patch Emacs.app?"))) (user-error "Will not patch Emacs.app")) - (doom-patch-macos))) + (doom-patch-macos nil))) (user-error (message "%s" (error-message-string e)))) ;; Install Doom packages (print! "Installing plugins") From 0009c7bebfaca362945ce968d3e2fba74ce29d03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 15:16:28 +0200 Subject: [PATCH 2885/4235] Append space on C-SPC if not at end-of-symbol Completion rarely works in the middle of (or at the beginning of) a symbol, so we insert a space in front of the cursor in those cases and then invoke completion. --- modules/completion/company/autoload.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index eacaab324..4252aefe0 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -103,6 +103,9 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to "Bring up the completion popup. If only one result, complete it." (interactive) (require 'company) + (when (/= (point) + (cdr (bounds-of-thing-at-point 'symbol))) + (save-excursion (insert " "))) (when (and (company-manual-begin) (= company-candidates-length 1)) (company-complete-common))) From e64b8322a42af703977b281e411f0bbe946ca394 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sat, 25 Aug 2018 15:35:06 +0200 Subject: [PATCH 2886/4235] Added `helm-idris` --- modules/lang/idris/config.el | 4 ++++ modules/lang/idris/packages.el | 2 ++ 2 files changed, 6 insertions(+) diff --git a/modules/lang/idris/config.el b/modules/lang/idris/config.el index 2f5b5b8cb..d05c67fe0 100644 --- a/modules/lang/idris/config.el +++ b/modules/lang/idris/config.el @@ -17,3 +17,7 @@ :n "m" #'idris-add-missing :n "p" #'idris-proof-search :n "h" #'idris-docs-at-point)) + +;; TODO get this working +(def-package! helm-idris + :after idris-mode) diff --git a/modules/lang/idris/packages.el b/modules/lang/idris/packages.el index d600f1309..95d63ce50 100644 --- a/modules/lang/idris/packages.el +++ b/modules/lang/idris/packages.el @@ -2,3 +2,5 @@ ;;; lang/idris/packages.el (package! idris-mode) + +(package! helm-idris) From fb5d1ae739c0aadffb054969a107ef96b6dfd153 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sat, 25 Aug 2018 16:22:04 +0200 Subject: [PATCH 2887/4235] Remove (unmaintained) helm-idris package --- modules/lang/idris/config.el | 4 ---- modules/lang/idris/packages.el | 2 -- 2 files changed, 6 deletions(-) diff --git a/modules/lang/idris/config.el b/modules/lang/idris/config.el index d05c67fe0..2f5b5b8cb 100644 --- a/modules/lang/idris/config.el +++ b/modules/lang/idris/config.el @@ -17,7 +17,3 @@ :n "m" #'idris-add-missing :n "p" #'idris-proof-search :n "h" #'idris-docs-at-point)) - -;; TODO get this working -(def-package! helm-idris - :after idris-mode) diff --git a/modules/lang/idris/packages.el b/modules/lang/idris/packages.el index 95d63ce50..d600f1309 100644 --- a/modules/lang/idris/packages.el +++ b/modules/lang/idris/packages.el @@ -2,5 +2,3 @@ ;;; lang/idris/packages.el (package! idris-mode) - -(package! helm-idris) From f6d6096bf253290a03375053a74c306ca5a14728 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sat, 25 Aug 2018 17:27:42 +0200 Subject: [PATCH 2888/4235] load agda input method; bypass agda2; keybindings --- modules/lang/agda/config.el | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index cd355d43c..cb1a92f2e 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -2,10 +2,18 @@ (defvar +agda-dir (when (executable-find "agda-mode") - (file-name-directory (shell-command-to-string "agda-mode locate"))) - "TODO") + (file-name-directory (shell-command-to-string "agda-mode locate")))) +(def-package! agda-input + :load-path +agda-dir) -(def-package! agda2 - :load-path +agda-dir - :defer t) +(def-package! agda2-mode + :mode "\\.agda\\'" + :after agda-input + :config + (map! :map agda2-mode-map + :localleader + :n "l" #'agda2-load + :n "d" #'agda2-infer-type-maybe-toplevel + :n "o" #'agda2-module-contents-maybe-toplevel + :n "n" #'agda2-compute-normalised-maybe-toplevel)) From 631c4004ba3688817c420fa9c849497f6c42aa19 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 17:26:57 +0200 Subject: [PATCH 2889/4235] Load custom-file only once & after user's config This change facilitates the users that prefer their custom-file somewhere other than doom-local-dir (e.g. in ~/.doom.d/custom.el). This change prevents loading both files during startup. Just change `custom-file` and Doom will load it after your config.el is loaded (but before doom-post-init-hook runs). --- core/core-modules.el | 4 ++++ core/core.el | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index e6cdf15e4..b4ebc0a2b 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -56,6 +56,10 @@ non-nil." (load! "config" (plist-get plist :path) t))) doom-modules) (load! "config" doom-private-dir t) + (unless custom-file + (setq custom-file (concat doom-local-dir "custom.el"))) + (when (stringp custom-file) + (load custom-file t t t)) (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)))) diff --git a/core/core.el b/core/core.el index 34d7b31a3..a597d04c8 100644 --- a/core/core.el +++ b/core/core.el @@ -164,7 +164,6 @@ Doom was setup, which can cause problems.") abbrev-file-name (concat doom-local-dir "abbrev.el") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) - custom-file (concat doom-local-dir "custom.el") mc/list-file (concat doom-etc-dir "mc-lists.el") pcache-directory (concat doom-cache-dir "pcache/") request-storage-directory (concat doom-cache-dir "request") @@ -472,7 +471,6 @@ in interactive sessions, nil otherwise (but logs a warning)." (add-to-list 'load-path doom-core-dir) -(load custom-file t t t) (require 'core-lib) (require 'core-modules) (when noninteractive From b14bf99d4b8834430057fce0e5bd6b40af03a7f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 17:58:07 +0200 Subject: [PATCH 2890/4235] Fix over-reindentation when o/O continues comments This would run indent-according-to-mode after creating a new line, which would often throw new comment lines out of whack. Now it preserves the indentation of the originating line. Also fixes continuation whitespace issues with evil-open-above on C-style block comments. --- modules/feature/evil/config.el | 83 ++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f50a8cce3..479a91f66 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -127,36 +127,61 @@ line with a linewise comment.") (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) ;; Make o/O continue comments - (defun +evil*insert-newline-above-and-respect-comments (orig-fn) - (if (or (not +evil-want-o/O-to-continue-comments) - (evil-insert-state-p)) - (funcall orig-fn) - (evil-narrow-to-field - (if (nth 4 (syntax-ppss (line-end-position))) - (evil-save-goal-column - (comment-beginning) - ;; Use a dummy char to force correct indentation - (insert "_") - (save-excursion (call-interactively #'comment-indent-new-line)) - (delete-char -1)) - (evil-move-beginning-of-line) - (insert (if use-hard-newlines hard-newline "\n")) - (forward-line -1) - (back-to-indentation))))) - (advice-add #'evil-insert-newline-above :around #'+evil*insert-newline-above-and-respect-comments) + (defun +evil*insert-newline-above-and-respect-comments (orig-fn count) + (cl-letf* ((old-insert-newline-above (symbol-function 'evil-insert-newline-above)) + ((symbol-function 'evil-insert-newline-above) + (lambda () + (if (or (not +evil-want-o/O-to-continue-comments) + (evil-insert-state-p)) + (funcall old-insert-newline-above) + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (if (save-excursion (nth 4 (syntax-ppss pos))) + (evil-save-goal-column + (setq evil-auto-indent nil) + (goto-char pos) + (let ((ws (abs (skip-chars-backward " \t")))) + ;; FIXME oh god why + (save-excursion + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line)) + (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) + (eq (char-after) ?/)) + (insert "*")) + (insert + (make-string (max 0 (+ ws (skip-chars-backward " \t"))) + 32))) + (insert (make-string (max 1 ws) 32)))) + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation)))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count)))) + (advice-add #'evil-open-above :around #'+evil*insert-newline-above-and-respect-comments) - (defun +evil*insert-newline-below-and-respect-comments (orig-fn) - (if (or (not +evil-want-o/O-to-continue-comments) - (evil-insert-state-p)) - (funcall orig-fn) - (let ((comment-p (nth 4 (syntax-ppss (line-end-position))))) - (evil-narrow-to-field - (evil-move-end-of-line) - (if comment-p - (comment-indent-new-line) - (insert (if use-hard-newlines hard-newline "\n")) - (back-to-indentation)))))) - (advice-add #'evil-insert-newline-below :around #'+evil*insert-newline-below-and-respect-comments) + (defun +evil*insert-newline-below-and-respect-comments (orig-fn count) + (cl-letf* ((old-insert-newline-below (symbol-function 'evil-insert-newline-below)) + ((symbol-function 'evil-insert-newline-below) + (lambda () + (if (or (not +evil-want-o/O-to-continue-comments) + (evil-insert-state-p)) + (funcall old-insert-newline-below) + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (evil-move-end-of-line) + (cond ((sp-point-in-comment pos) + (setq evil-auto-indent nil) + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line))) + (t + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation))))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count)))) + (advice-add #'evil-open-below :around #'+evil*insert-newline-below-and-respect-comments) ;; --- custom interactive codes ----------- ;; These arg types will highlight matches in the current buffer From 3948704c69ff7551ad0270006a309e55eb11265e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 19:54:11 +0200 Subject: [PATCH 2891/4235] completion/company: add +tng flag & support --- modules/completion/company/config.el | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index d682a5a39..b784b2e2e 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -25,7 +25,19 @@ :when (featurep! +auto) :defer 2 :after-call post-self-insert-hook - :config (setq company-idle-delay 0.2)) + :config (setq company-idle-delay 0.1)) + + +(def-package! company-tng + :when (featurep! +tng) + :defer 2 + :after-call post-self-insert-hook + :config + (add-to-list 'company-frontends 'company-tng-frontend) + (define-key! company-active-map + [return] nil + [tab] #'company-select-next + [backtab] #'company-select-previous)) (def-package! company-prescient From 4f671c3acbc37174f9864b0b7425e8d194589730 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 20:58:42 +0200 Subject: [PATCH 2892/4235] Fix stringp error caused by app/write's doctor Caused by langtool-langauge-tool-jar not being set (because defvar won't change a defined variable), and app/write/doctor.el uses it in a file-exists-p call, which throws the stringp error if given anything other than a string. --- modules/app/write/config.el | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 39c74b326..08a74ddff 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -36,14 +36,15 @@ langtool-correct-buffer) :init (setq langtool-default-language "en-US") :config - (defvar langtool-language-tool-jar - (cond (IS-MAC - (locate-file "libexec/languagetool-commandline.jar" - (doom-files-in "/usr/local/Cellar/languagetool" - :type 'dirs - :depth 1))) - (IS-LINUX - "/usr/share/java/languagetool/languagetool-commandline.jar")))) + (unless langtool-language-tool-jar + (setq langtool-language-tool-jar + (cond (IS-MAC + (locate-file "libexec/languagetool-commandline.jar" + (doom-files-in "/usr/local/Cellar/languagetool" + :type 'dirs + :depth 1))) + (IS-LINUX + "/usr/share/java/languagetool/languagetool-commandline.jar"))))) ;; `synosaurus' From 2aa509b36c400aeb20b7e56e6a1d00390c610cb0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 23:38:40 +0200 Subject: [PATCH 2893/4235] Fix left/right keys in helm These should be set to left-char/right-char, anything else is disruptive, especially when C-b and C-f are backward/forward-word. --- modules/config/default/+bindings.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2321a8c98..9477929e6 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -344,6 +344,8 @@ ;; helm (:after helm (:map helm-map + [left] #'left-char + [right] #'right-char "C-S-n" #'helm-next-source "C-S-p" #'helm-previous-source "C-j" #'helm-next-line @@ -366,7 +368,9 @@ "C-w" #'helm-find-files-up-one-level) (:after helm-ag :map helm-ag-map - [backtab] #'helm-ag-edit) + [backtab] #'helm-ag-edit + [left] nil + [right] nil) (:after helm-locate :map helm-generic-files-map [M-return] #'helm-ff-run-switch-other-window) From 469aa81570c8e287863f9edc4efe30800de2d00f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 23:47:31 +0200 Subject: [PATCH 2894/4235] Forward-require dependencies in tests Easier to see at a glance what the test's dependencies are. --- core/test/test-autoload-buffers.el | 1 + core/test/test-autoload-files.el | 6 +++--- core/test/test-core-projects.el | 6 ++---- modules/ui/doom-dashboard/test/test-doom-dashboard.el | 11 +++++------ modules/ui/popup/test/test-popup.el | 3 ++- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/core/test/test-autoload-buffers.el b/core/test/test-autoload-buffers.el index 931c4ddfa..f80e2538c 100644 --- a/core/test/test-autoload-buffers.el +++ b/core/test/test-autoload-buffers.el @@ -1,6 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-autoload-buffers.el +(require 'core-projects) (load! "autoload/buffers" doom-core-dir) ;; diff --git a/core/test/test-autoload-files.el b/core/test/test-autoload-files.el index 996cd7e17..f3c2d4b92 100644 --- a/core/test/test-autoload-files.el +++ b/core/test/test-autoload-files.el @@ -1,11 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-autoload-files.el +;;; +(require 'core-projects) +(require 'projectile) (describe "core/autoload/files" :var (src dest projectile-projects-cache-time projectile-projects-cache) - (before-all (require 'projectile)) - (after-all (unload-feature 'projectile t)) - (before-each (setq src (make-temp-file "test-src") existing (make-temp-file "test-existing") diff --git a/core/test/test-core-projects.el b/core/test/test-core-projects.el index e2c715283..0afc0c1f1 100644 --- a/core/test/test-core-projects.el +++ b/core/test/test-core-projects.el @@ -2,13 +2,11 @@ ;;; ../core/test/test-core-projects.el (require 'core-projects) +(require 'projectile) (describe "core/projects" - (before-all (require 'projectile)) - (after-all (unload-feature 'projectile t)) - (before-each (projectile-mode +1)) - (after-each (projectile-mode -1)) + (after-each (projectile-mode -1)) (describe "project-p" (it "Should detect when in a valid project" diff --git a/modules/ui/doom-dashboard/test/test-doom-dashboard.el b/modules/ui/doom-dashboard/test/test-doom-dashboard.el index 4c482158b..507c6c93a 100644 --- a/modules/ui/doom-dashboard/test/test-doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/test-doom-dashboard.el @@ -1,14 +1,13 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/doom-dashboard/test/test-doom-dashboard.el +(require 'core-projects) +(require 'projectile) +(require! :ui doom-dashboard) + (describe "ui/doom-dashboard" :var (default-directory projectile-enable-caching) - (before-all - (require! :ui doom-dashboard) - (require 'projectile) - (setq projectile-enable-caching nil)) - (after-all - (unload-feature 'projectile t)) + (before-all (setq projectile-enable-caching nil)) (before-each (projectile-mode +1)) (after-each (projectile-mode -1)) diff --git a/modules/ui/popup/test/test-popup.el b/modules/ui/popup/test/test-popup.el index 0f666affe..7a0b2327c 100644 --- a/modules/ui/popup/test/test-popup.el +++ b/modules/ui/popup/test/test-popup.el @@ -1,6 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/popup/test/test-popup.el +(require! :ui popup) + (describe "ui/popup" :var (display-buffer-alist +popup-default-display-buffer-actions @@ -9,7 +11,6 @@ wconf) (before-all - (require! :ui popup) (delete-other-windows) (switch-to-buffer "*scratch*") (setq wconf (current-window-configuration)) From 26896fd8bb5a0bc5e5945dd43df4de9708c821e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 25 Aug 2018 23:49:30 +0200 Subject: [PATCH 2895/4235] Announce DOOM envvar to sub-processes --- init.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/init.el b/init.el index 07e42f0a2..7113f7afe 100644 --- a/init.el +++ b/init.el @@ -32,3 +32,7 @@ nil t)) (require 'core (concat user-emacs-directory "core/core")) + +;; Announce Doom's version, in case shell config wants to detect Doom and offer +;; special support for Doom Emacs. +(setenv "DOOM" doom-version) From 300181aba392e3cdc2118dfd037a3f73b2b062b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 00:16:56 +0200 Subject: [PATCH 2896/4235] Move custom hooks in core.el closer to top Conform to the Doom/lisp convention of defining customizable elements close to the top of files. --- core/core.el | 178 +++++++++++++++++++++++++-------------------------- 1 file changed, 89 insertions(+), 89 deletions(-) diff --git a/core/core.el b/core/core.el index a597d04c8..47693e03c 100644 --- a/core/core.el +++ b/core/core.el @@ -115,6 +115,95 @@ Doom was setup, which can cause problems.") (define-error 'doom-package-error "Error with packages" 'doom-error) +;; +;; Custom hooks +;; + +(defvar doom-init-hook nil + "Hooks run after all init.el files are loaded, including your private and all +module init.el files, but before their config.el files are loaded.") + +(defvar doom-post-init-hook nil + "A list of hooks run when Doom is fully initialized. Fires near the end of +`emacs-startup-hook', as late as possible. Guaranteed to run after everything +else (except for `window-setup-hook').") + +(defvar doom-reload-hook nil + "A list of hooks to run when `doom//reload-load-path' is called.") + +(defvar doom-load-theme-hook nil + "Hook run when the theme (and font) is initialized (or reloaded +with `doom/reload-theme').") + +(defvar doom-exit-window-hook nil + "Hook run before `switch-window' or `switch-frame' are called. See +`doom-enter-window-hook'.") + +(defvar doom-enter-window-hook nil + "Hook run after `switch-window' or `switch-frame' are called. See +`doom-exit-window-hook'.") + +(defvar doom-exit-buffer-hook nil + "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-enter-buffer-hook'.") + +(defvar doom-enter-buffer-hook nil + "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-exit-buffer-hook'.") + +(defvar doom-inhibit-switch-buffer-hooks nil + "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'.") +(defvar doom-inhibit-switch-window-hooks nil + "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'.") + +(defun doom*switch-window-hooks (orig-fn window &optional norecord) + (if (or doom-inhibit-switch-window-hooks + (null window) + (eq window (selected-window)) + (window-minibuffer-p) + (window-minibuffer-p window)) + (funcall orig-fn window norecord) + (let ((doom-inhibit-switch-window-hooks t)) + (run-hooks 'doom-exit-window-hook) + (prog1 (funcall orig-fn window norecord) + (with-selected-window window + (run-hooks 'doom-enter-window-hook)))))) + +(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) + (if (or doom-inhibit-switch-buffer-hooks + (eq (get-buffer buffer-or-name) (current-buffer))) + (apply orig-fn buffer-or-name args) + (let ((doom-inhibit-switch-buffer-hooks t)) + (run-hooks 'doom-exit-buffer-hook) + (prog1 (apply orig-fn buffer-or-name args) + (when (buffer-live-p (get-buffer buffer-or-name)) + (with-current-buffer buffer-or-name + (run-hooks 'doom-enter-buffer-hook))))))) + +(defun doom|init-switch-hooks (&optional disable) + "Set up enter/exit hooks for windows and buffers. + +See `doom-enter-buffer-hook', `doom-enter-window-hook', `doom-exit-buffer-hook' +and `doom-exit-window-hook'." + (dolist (spec '((select-window . doom*switch-window-hooks) + (switch-to-buffer . doom*switch-buffer-hooks) + (display-buffer . doom*switch-buffer-hooks) + (pop-to-buffer . doom*switch-buffer-hooks))) + (if disable + (advice-remove (car spec) (cdr spec)) + (advice-add (car spec) :around (cdr spec))))) + +(defun doom*load-theme-hooks (theme &rest _) + "Set up `doom-load-theme-hook' to run after `load-theme' is called." + (setq doom-theme theme) + (run-hooks 'doom-load-theme-hook)) +(advice-add #'load-theme :after #'doom*load-theme-hooks) + + ;; ;; Emacs core configuration ;; @@ -223,95 +312,6 @@ original value of `symbol-file'." (fset #'display-startup-echo-area-message #'ignore) -;; -;; Custom hooks -;; - -(defvar doom-init-hook nil - "Hooks run after all init.el files are loaded, including your private and all -module init.el files, but before their config.el files are loaded.") - -(defvar doom-post-init-hook nil - "A list of hooks run when Doom is fully initialized. Fires near the end of -`emacs-startup-hook', as late as possible. Guaranteed to run after everything -else (except for `window-setup-hook').") - -(defvar doom-reload-hook nil - "A list of hooks to run when `doom//reload-load-path' is called.") - -(defvar doom-load-theme-hook nil - "Hook run when the theme (and font) is initialized (or reloaded -with `doom/reload-theme').") - -(defvar doom-exit-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. See -`doom-enter-window-hook'.") - -(defvar doom-enter-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. See -`doom-exit-window-hook'.") - -(defvar doom-exit-buffer-hook nil - "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-enter-buffer-hook'.") - -(defvar doom-enter-buffer-hook nil - "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-exit-buffer-hook'.") - -(defvar doom-inhibit-switch-buffer-hooks nil - "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'.") -(defvar doom-inhibit-switch-window-hooks nil - "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'.") - -(defun doom*switch-window-hooks (orig-fn window &optional norecord) - (if (or doom-inhibit-switch-window-hooks - (null window) - (eq window (selected-window)) - (window-minibuffer-p) - (window-minibuffer-p window)) - (funcall orig-fn window norecord) - (let ((doom-inhibit-switch-window-hooks t)) - (run-hooks 'doom-exit-window-hook) - (prog1 (funcall orig-fn window norecord) - (with-selected-window window - (run-hooks 'doom-enter-window-hook)))))) - -(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) - (if (or doom-inhibit-switch-buffer-hooks - (eq (get-buffer buffer-or-name) (current-buffer))) - (apply orig-fn buffer-or-name args) - (let ((doom-inhibit-switch-buffer-hooks t)) - (run-hooks 'doom-exit-buffer-hook) - (prog1 (apply orig-fn buffer-or-name args) - (when (buffer-live-p (get-buffer buffer-or-name)) - (with-current-buffer buffer-or-name - (run-hooks 'doom-enter-buffer-hook))))))) - -(defun doom|init-switch-hooks (&optional disable) - "Set up enter/exit hooks for windows and buffers. - -See `doom-enter-buffer-hook', `doom-enter-window-hook', `doom-exit-buffer-hook' -and `doom-exit-window-hook'." - (dolist (spec '((select-window . doom*switch-window-hooks) - (switch-to-buffer . doom*switch-buffer-hooks) - (display-buffer . doom*switch-buffer-hooks) - (pop-to-buffer . doom*switch-buffer-hooks))) - (if disable - (advice-remove (car spec) (cdr spec)) - (advice-add (car spec) :around (cdr spec))))) - -(defun doom*load-theme-hooks (theme &rest _) - "Set up `doom-load-theme-hook' to run after `load-theme' is called." - (setq doom-theme theme) - (run-hooks 'doom-load-theme-hook)) -(advice-add #'load-theme :after #'doom*load-theme-hooks) - - ;; ;; Bootstrap helpers ;; From 1a6ee8e0df2faa617c08ba65f29d5c26edc362f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 11:47:04 +0200 Subject: [PATCH 2897/4235] Fix doom-project-find-file if $HOME is a repo #833 If HOME is a repo, projectile resolves all project roots to HOME. This fixes any commands that rely on this project resolution by explicitly telling them what project they're in instead. --- core/autoload/projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 216f7afb9..4d80622f5 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -73,7 +73,7 @@ If NOCACHE, don't fetch a cached answer." ;;;###autoload (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." - (let ((default-directory dir)) + (let ((projectile-project-root dir)) (without-project-cache! (call-interactively ;; completion modules may remap this command From 247b219ea102b6edc76728c28c3eb93dda47a280 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 12:00:13 +0200 Subject: [PATCH 2898/4235] doom-project-find-file: set default-directory too #833 Be extra sure! --- core/autoload/projects.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 4d80622f5..9d5eb2786 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -73,8 +73,9 @@ If NOCACHE, don't fetch a cached answer." ;;;###autoload (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." - (let ((projectile-project-root dir)) - (without-project-cache! + (without-project-cache! + (let ((default-directory dir) + (projectile-project-root dir)) (call-interactively ;; completion modules may remap this command (or (command-remapping #'projectile-find-file) From d7e4901bdaa6b6c45f3089c55a870defe5fc7b52 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 12:19:47 +0200 Subject: [PATCH 2899/4235] Disable bottom-up root search if HOME is a project #833 --- core/core-projects.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/core-projects.el b/core/core-projects.el index 86fda91a7..32926ccd0 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -32,6 +32,19 @@ ("less" "css") ("styl" "css")))) + ;; It breaks projectile's project root resolution if HOME is a project (e.g. + ;; it's a git repo). In that case, we disable bottom-up root searching to + ;; prevent issues. This makes project resolution a little slower and may cause + ;; incorrect project roots in other edge cases. + (let ((default-directory "~")) + (when (cl-find-if #'projectile-file-exists-p + projectile-project-root-files-bottom-up) + (message "HOME appears to be a project. Disabling bottom-up root search.") + (setq projectile-project-root-files + (append projectile-project-root-files-bottom-up + projectile-project-root-files) + projectile-project-root-files-bottom-up nil))) + ;; Projectile root-searching functions can cause an infinite loop on TRAMP ;; connections, so disable them. (defun doom*projectile-locate-dominating-file (orig-fn &rest args) From e40a58c423bc6b351a6b8d063c5e6eef53e95dd4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 14:12:50 +0200 Subject: [PATCH 2900/4235] Optimize +workspace-new & workspace creation This is much faster than the old method of switching to the persp to modify them. --- modules/feature/workspaces/autoload/workspaces.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 45d722491..9d7d4a0d9 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -155,7 +155,13 @@ Otherwise return t on success, nil otherwise." (error "Can't create a new '%s' workspace" name)) (when (+workspace-exists-p name) (error "A workspace named '%s' already exists" name)) - (persp-add-new name)) + (let ((persp (persp-add-new name)) + (+popup--inhibit-transient t)) + (save-window-excursion + (delete-other-windows) + (switch-to-buffer (doom-fallback-buffer)) + (setf (persp-window-conf persp) + (funcall persp-window-state-get-function (selected-frame)))))) ;;;###autoload (defun +workspace-rename (name new-name) @@ -342,8 +348,6 @@ workspace, otherwise the new workspace is blank." (clone-p (persp-copy name t)) (t (+workspace-switch name t) - (persp-delete-other-windows) - (switch-to-buffer (doom-fallback-buffer)) (+workspace/display))) ((debug error) (+workspace-error (cadr e) t)))) From 1ed88948269f9c390f47b25a784ce4c174587e7e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 14:14:53 +0200 Subject: [PATCH 2901/4235] +workspace/delete: error if workspace doesn't exist --- .../feature/workspaces/autoload/workspaces.el | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 9d7d4a0d9..04f48f0a1 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -301,22 +301,24 @@ workspace to delete." current-name)))) (condition-case-unless-debug ex (let ((workspaces (+workspace-list-names))) - (cond ((delq (selected-frame) (persp-frames-with-persp (get-frame-persp))) - (user-error "Can't close workspace, it's visible in another frame")) - ((> (length workspaces) 1) - (+workspace-delete name) - (+workspace-switch - (if (+workspace-exists-p +workspace--last) - +workspace--last - (car (+workspace-list-names)))) - (unless (doom-buffer-frame-predicate (current-buffer)) - (switch-to-buffer (doom-fallback-buffer)))) - (t - (+workspace-switch +workspaces-main t) - (unless (string= (car workspaces) +workspaces-main) - (+workspace-delete name)) - (doom/kill-all-buffers))) - (+workspace-message (format "Deleted '%s' workspace" name) 'success)) + (if (not (member name workspaces)) + (+workspace-message (format "'%s' workspace doesn't exist" name) 'warn) + (cond ((delq (selected-frame) (persp-frames-with-persp (get-frame-persp))) + (user-error "Can't close workspace, it's visible in another frame")) + ((> (length workspaces) 1) + (+workspace-delete name) + (+workspace-switch + (if (+workspace-exists-p +workspace--last) + +workspace--last + (car (+workspace-list-names)))) + (unless (doom-buffer-frame-predicate (current-buffer)) + (switch-to-buffer (doom-fallback-buffer)))) + (t + (+workspace-switch +workspaces-main t) + (unless (string= (car workspaces) +workspaces-main) + (+workspace-delete name)) + (doom/kill-all-buffers))) + (+workspace-message (format "Deleted '%s' workspace" name) 'success))) ('error (+workspace-error ex t)))) ;;;###autoload From d8fa5f39ade38e1cc955055606cb1c7ee71e4d32 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 16:38:35 +0200 Subject: [PATCH 2902/4235] Omit undefined/disable keybinds in which-key This is for commands in disabled modules. This does not disable their keybinds, but it stops them from showing up in which-key. --- core/core-ui.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index c31dcb2a3..ad9c70987 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -180,6 +180,14 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (+ (if (boundp 'display-line-numbers) 6 0) fill-column)) +(defun doom*hide-undefined-which-key-binds (bindings) + (cl-loop for bind in bindings + if (or (member (cdr bind) '("Prefix Command" "??")) + (fboundp (intern (cdr bind)))) + collect bind)) +(advice-add #'which-key--get-current-bindings :filter-return #'doom*hide-undefined-which-key-binds) +(advice-add #'which-key--get-keymap-bindings :filter-return #'doom*hide-undefined-which-key-binds) + ;; ;; Built-in packages From 3f3b00dde240f887dc3e12b253ad33b2e0b666a5 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sun, 26 Aug 2018 16:41:38 +0200 Subject: [PATCH 2903/4235] Basic deft module --- modules/tools/deft/README.org | 4 ++++ modules/tools/deft/config.el | 32 ++++++++++++++++++++++++++++++++ modules/tools/deft/packages.el | 4 ++++ 3 files changed, 40 insertions(+) create mode 100644 modules/tools/deft/README.org create mode 100644 modules/tools/deft/config.el create mode 100644 modules/tools/deft/packages.el diff --git a/modules/tools/deft/README.org b/modules/tools/deft/README.org new file mode 100644 index 000000000..651aa1632 --- /dev/null +++ b/modules/tools/deft/README.org @@ -0,0 +1,4 @@ +#+TITLE: :tools deft + +* TODO write deft readme + diff --git a/modules/tools/deft/config.el b/modules/tools/deft/config.el new file mode 100644 index 000000000..030e337bb --- /dev/null +++ b/modules/tools/deft/config.el @@ -0,0 +1,32 @@ +;;; tools/deft/config.el -*- lexical-binding: t; -*- + +(def-package! deft + :commands deft + :init + (setq deft-extensions '("org" "md" "tex" "txt") + deft-default-extension "org" + ;; de-couples filename and note title: + deft-use-filename-as-title nil + deft-use-filter-string-for-filename t + deft-org-mode-title-prefix t + ;; converts the filter string into a readable file-name using kebab-case: + deft-file-naming-rules + '((noslash . "-") + (nospace . "-") + (case-fn . downcase))) + :config + ;; start filtering immediately + (add-hook! 'deft-mode-hook '((evil-insert-state nil))) + (map! :map deft-mode-map + :localleader + :n "RET" #'deft-new-file-named + :n "a" #'deft-archive-file + :n "c" #'deft-filter-clear + :n "d" #'deft-delete-file + :n "f" #'deft-find-file + :n "g" #'deft-refresh + :n "l" #'deft-filter + :n "n" #'deft-new-file + :n "r" #'deft-rename-file + :n "s" #'deft-toggle-sort-method + :n "t" #'deft-toggle-incremental-search)) diff --git a/modules/tools/deft/packages.el b/modules/tools/deft/packages.el new file mode 100644 index 000000000..4d760f260 --- /dev/null +++ b/modules/tools/deft/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/deft/packages.el + +(package! deft) From 1655e84de225317f00431ff740f18065cd41595c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Sun, 26 Aug 2018 16:51:38 +0200 Subject: [PATCH 2904/4235] Added rudimentary readme --- modules/tools/deft/README.org | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/tools/deft/README.org b/modules/tools/deft/README.org index 651aa1632..ad2de827a 100644 --- a/modules/tools/deft/README.org +++ b/modules/tools/deft/README.org @@ -1,4 +1,11 @@ #+TITLE: :tools deft -* TODO write deft readme +[[https://jblevins.org/projects/deft/][Deft]] is a major mode for browsing and filtering notes written in plain text +formats, such as org-mode, markdown, and LaTeX. +To use this module, in your config file set the value of the variable ~deft-directory~ to the folder in which you +want to keep your notes. + +The default note format is org-mode. You can change this by setting the value of +the variable ~deft-default-extension~. Changing the value to ~"md"~ for example, +will change the default note format to markdown. From af045213e305452a768f32dfbd62de54d173f5ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 17:24:27 +0200 Subject: [PATCH 2905/4235] Preserve window state when toggling popups e.g. size --- modules/ui/popup/autoload/popup.el | 11 ++++++++--- modules/ui/popup/config.el | 7 +++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 755d0ba7d..63300a122 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -97,6 +97,12 @@ and enables `+popup-buffer-mode'." (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." (when alist + ;; In case ALIST is window state (from `window-state-get'), we map its + ;; entries to display-buffer alist parameters. + (dolist (prop +popup-window-state-alist) + (when-let* ((val (assq (car prop) alist))) + (setf (alist-get (cdr prop) alist) (cdr val)) + (setq alist (delq val alist)))) (let ((alist ; handle defaults (cl-remove-duplicates (append alist +popup-default-alist) @@ -359,9 +365,8 @@ the message buffer in a popup window." (unless +popup--last (error "No popups to restore")) (cl-loop for (buffer . state) in +popup--last - if (and (buffer-live-p buffer) - (display-buffer buffer)) - do (window-state-put state it)) + if (buffer-live-p buffer) + do (+popup-buffer buffer state)) (setq +popup--last nil) t) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 3f7e8382b..d24fd8378 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -20,6 +20,13 @@ Modifying this has no effect, unless done before ui/popup loads.") (no-other-window . t)) "The default window parameters.") +(defvar +popup-window-state-alist + '((total-width . window-width) + (total-height . window-height) + (parameters . window-parameters)) + "An alist mapping `window-state-get' entries to display-buffer alist entries. +Used by `+popup--normalize-alist'.") + (defvar +popup-margin-width 1 "Size of the margins to give popup windows. Set this to nil to disable margin adjustment.") From f1460ff5927b9e218b798ccdcf5b755997f0ae83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 17:26:54 +0200 Subject: [PATCH 2906/4235] editor/format: don't move cursor on save --- modules/editor/format/autoload/format.el | 11 +++++++++++ modules/editor/format/config.el | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 64a8080da..e48302c75 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -217,3 +217,14 @@ is selected)." (if (use-region-p) (+format-region beg end) (format-all-buffer))) + + +;; +;; Hooks +;; + +;;;###autoload +(defun +format|on-save () + "Runs `format-all-buffer' without moving the cursor." + (save-excursion + (format-all-buffer))) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index ff47cad60..955e0cf42 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -26,7 +26,7 @@ control which major modes to target." ((not (memq major-mode +format-on-save-enabled-modes)))) (not (require 'format-all nil t)) (not (format-all-probe))) - (format-all-mode +1))) + (add-hook 'before-save-hook #'+format|on-save))) (when (featurep! +onsave) (add-hook 'after-change-major-mode-hook #'+format|enable-on-save-maybe)) From 3b69045ed4abf73ffe576c1b49e8666e42dde491 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 17:31:14 +0200 Subject: [PATCH 2907/4235] editor/format: add +format|on-save buffer-locally --- modules/editor/format/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 955e0cf42..37f3c603d 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -26,7 +26,7 @@ control which major modes to target." ((not (memq major-mode +format-on-save-enabled-modes)))) (not (require 'format-all nil t)) (not (format-all-probe))) - (add-hook 'before-save-hook #'+format|on-save))) + (add-hook 'before-save-hook #'+format|on-save nil t))) (when (featurep! +onsave) (add-hook 'after-change-major-mode-hook #'+format|enable-on-save-maybe)) From 381851aab6207f437c8022bce8a5836f697d7c55 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 22:02:35 +0200 Subject: [PATCH 2908/4235] Prevent wrong-type error on +company/complete --- modules/completion/company/autoload.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 4252aefe0..58326f90b 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -103,8 +103,9 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to "Bring up the completion popup. If only one result, complete it." (interactive) (require 'company) - (when (/= (point) - (cdr (bounds-of-thing-at-point 'symbol))) + (when (ignore-errors + (/= (point) + (cdr (bounds-of-thing-at-point 'symbol)))) (save-excursion (insert " "))) (when (and (company-manual-begin) (= company-candidates-length 1)) From 16d7b552f1de33549d65f240160e8a677edb3d78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 26 Aug 2018 22:43:28 +0200 Subject: [PATCH 2909/4235] Bind M-` to other-frame on MacOS --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9477929e6..0f62a49d6 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -75,6 +75,8 @@ :en "C-l" #'evil-window-right "C-x p" #'+popup/other + (:when IS-MAC + "\M-`" #'other-frame) ;; --- Personal vim-esque bindings ------------------ From 3e7f1ccf4f8c2d3cb195689fad714a18b4f6fd66 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 03:25:49 +0200 Subject: [PATCH 2910/4235] Fix reference to doom-narrow-buffer This was renamed to doom/clone-and-narrow-buffer at some point. --- modules/feature/evil/autoload/evil.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 27c89e0f2..74a87bddd 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -137,10 +137,10 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" ;;;###autoload (autoload '+evil:narrow-buffer "feature/evil/autoload/evil" nil t) (evil-define-command +evil:narrow-buffer (beg end &optional bang) - "Wrapper around `doom-narrow-buffer'." + "Wrapper around `doom/clone-and-narrow-buffer'." :move-point nil (interactive "") - (doom-narrow-buffer beg end bang)) + (doom/clone-and-narrow-buffer beg end bang)) ;; --- custom arg handlers ---------------- From a005fed27445a537128ff01416c27c6f444213e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 03:32:42 +0200 Subject: [PATCH 2911/4235] Fix symlinks in modeline path segment This would cause a lot of ../'s when opening a symlinked file. --- modules/ui/modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 9306ea66e..568ace706 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -274,7 +274,7 @@ e.g. project/src/lib/file.c" (let* ((project-root (doom-project-root)) (true-filename (file-truename buffer-file-name)) (relative-dirs (file-relative-name (file-name-directory true-filename) - project-root))) + (file-truename project-root)))) (list (cons (concat (doom-project-name) "/") 'doom-modeline-buffer-project-root) (cons (if (equal "./" relative-dirs) "" relative-dirs) From 98b5c95ee5fd39d10932a1b33c3456cf056870db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 10:30:31 +0200 Subject: [PATCH 2912/4235] editor/format: add +format|enable-on-save alias --- modules/editor/format/autoload/format.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index e48302c75..211cb4804 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -223,6 +223,9 @@ is selected)." ;; Hooks ;; +;;;###autoload +(defalias '+format|enable-on-save #'format-all-mode) + ;;;###autoload (defun +format|on-save () "Runs `format-all-buffer' without moving the cursor." From 9b3442edae888118dc3d15edcc34e64c4febef8c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 27 Aug 2018 12:05:03 +0200 Subject: [PATCH 2913/4235] Removed hindent (included in format-all) --- modules/lang/haskell/config.el | 7 +------ modules/lang/haskell/doctor.el | 3 --- modules/lang/haskell/packages.el | 1 - 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 5b0231441..28d539687 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -7,15 +7,12 @@ ;; Common plugins ;; -(def-package! hindent - :hook (haskell-mode . hindent-mode)) - (after! haskell-mode (setq haskell-process-suggest-remove-import-lines t ; warnings for redundant imports etc haskell-process-auto-import-loaded-modules t) (when (featurep! :feature syntax-checker) (setq haskell-process-show-overlays nil)) ; flycheck makes this unnecessary - (add-hook! 'haskell-mode-hook + (add-hook! 'haskell-mode-hook #'(subword-mode ; improves text navigation with camelCase haskell-collapse-mode ; support folding haskell code blocks interactive-haskell-mode)) @@ -30,8 +27,6 @@ ;; this is set to use cabal for dante users and stack for intero users: :n "b" #'haskell-process-cabal-build :n "c" #'haskell-cabal-visit-file - :n "p" #'hindent-reformat-buffer - :v "p" #'hindent-reformat-region :v "h" #'haskell-hide-toggle :nv "H" #'haskell-hide-toggle-all)) diff --git a/modules/lang/haskell/doctor.el b/modules/lang/haskell/doctor.el index e9e776b0b..fe571bc14 100644 --- a/modules/lang/haskell/doctor.el +++ b/modules/lang/haskell/doctor.el @@ -9,9 +9,6 @@ (unless (executable-find "stack") (warn! "Couldn't find stack. Intero will not work"))) -(unless (executable-find "hindent") - (warn! "Couldn't find hindent. hindent-mode won't work")) - (when (or (featurep! +dante) (featurep! +intero)) (unless (executable-find "hlint") (warn! "Couldn't find hlint. Flycheck may have issues in haskell-mode"))) diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index c5a0e418a..9259b2e45 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -2,7 +2,6 @@ ;;; lang/haskell/packages.el (package! haskell-mode) -(package! hindent) (cond ((featurep! +dante) (package! dante) From d9f819dac4ec4e8d0b707717dd734098e569d838 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 27 Aug 2018 12:57:07 +0200 Subject: [PATCH 2914/4235] Only make company features conditional --- modules/lang/coq/autoload.el | 1 - modules/lang/coq/config.el | 5 +++++ modules/lang/coq/packages.el | 3 +-- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 modules/lang/coq/config.el diff --git a/modules/lang/coq/autoload.el b/modules/lang/coq/autoload.el index 390a3f94f..624185018 100644 --- a/modules/lang/coq/autoload.el +++ b/modules/lang/coq/autoload.el @@ -1,5 +1,4 @@ ;;; lang/coq/autoload.el -*- lexical-binding: t; -*- -;;;###if (featurep! :completion company) ;;;###autoload (add-hook 'coq-mode-hook #'company-coq-mode) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el new file mode 100644 index 000000000..eeb919779 --- /dev/null +++ b/modules/lang/coq/config.el @@ -0,0 +1,5 @@ +;;; lang/coq/config.el -*- lexical-binding: t; -*- + +(after! company-coq + (when (not (featurep! :completion company)) + (setq company-coq-disabled-features '(company company-defaults)))) diff --git a/modules/lang/coq/packages.el b/modules/lang/coq/packages.el index 69d5299b5..3ae652118 100644 --- a/modules/lang/coq/packages.el +++ b/modules/lang/coq/packages.el @@ -3,5 +3,4 @@ (package! proof-general :recipe (:fetcher github :repo "ProofGeneral/PG" :files ("*"))) -(when (featurep! :completion company) - (package! company-coq)) +(package! company-coq) From 5492315053fdc0957ed4e60e096551039c11a395 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 27 Aug 2018 13:57:00 +0200 Subject: [PATCH 2915/4235] Added lookup handlers --- modules/lang/coq/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index eeb919779..b91cb9efb 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -1,5 +1,9 @@ ;;; lang/coq/config.el -*- lexical-binding: t; -*- (after! company-coq + (set-lookup-handlers! 'company-coq-mode + :definition #'company-coq-jump-to-definition + :references #'company-coq-occur + :documentation #'company-coq-doc) (when (not (featurep! :completion company)) (setq company-coq-disabled-features '(company company-defaults)))) From d57588771fd3263846f0e91ce72c79e64316c65d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 14:08:27 +0200 Subject: [PATCH 2916/4235] Use set-evil-initial-state! instead of a hook --- modules/tools/deft/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/deft/config.el b/modules/tools/deft/config.el index 030e337bb..7add297c8 100644 --- a/modules/tools/deft/config.el +++ b/modules/tools/deft/config.el @@ -16,7 +16,7 @@ (case-fn . downcase))) :config ;; start filtering immediately - (add-hook! 'deft-mode-hook '((evil-insert-state nil))) + (set-evil-initial-state! 'deft-mode 'insert) (map! :map deft-mode-map :localleader :n "RET" #'deft-new-file-named From f6e9b943fd673213646d7ff9bcddc1d12b1561e7 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 27 Aug 2018 14:11:14 +0200 Subject: [PATCH 2917/4235] Change ref function --- modules/lang/coq/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index b91cb9efb..2997369b8 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -3,7 +3,7 @@ (after! company-coq (set-lookup-handlers! 'company-coq-mode :definition #'company-coq-jump-to-definition - :references #'company-coq-occur + :references #'company-coq-grep-symbol :documentation #'company-coq-doc) (when (not (featurep! :completion company)) (setq company-coq-disabled-features '(company company-defaults)))) From 953906ccdb62e904431c67992294a9429b364ca0 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 27 Aug 2018 15:35:18 +0200 Subject: [PATCH 2918/4235] Terminator triggers evaluation --- modules/lang/coq/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index 2997369b8..518c08d9d 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -1,5 +1,8 @@ ;;; lang/coq/config.el -*- lexical-binding: t; -*- +(after! coq + (setq proof-electric-terminator-enable t)) + (after! company-coq (set-lookup-handlers! 'company-coq-mode :definition #'company-coq-jump-to-definition From 8508e931caec666799d42f1607e59bd6a4eed93f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 27 Aug 2018 15:37:29 +0200 Subject: [PATCH 2919/4235] Move to :ui --- modules/{tools => ui}/deft/README.org | 2 +- modules/{tools => ui}/deft/config.el | 2 +- modules/{tools => ui}/deft/packages.el | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename modules/{tools => ui}/deft/README.org (96%) rename modules/{tools => ui}/deft/config.el (95%) rename modules/{tools => ui}/deft/packages.el (64%) diff --git a/modules/tools/deft/README.org b/modules/ui/deft/README.org similarity index 96% rename from modules/tools/deft/README.org rename to modules/ui/deft/README.org index ad2de827a..4737cfdbb 100644 --- a/modules/tools/deft/README.org +++ b/modules/ui/deft/README.org @@ -1,4 +1,4 @@ -#+TITLE: :tools deft +#+TITLE: :ui deft [[https://jblevins.org/projects/deft/][Deft]] is a major mode for browsing and filtering notes written in plain text formats, such as org-mode, markdown, and LaTeX. diff --git a/modules/tools/deft/config.el b/modules/ui/deft/config.el similarity index 95% rename from modules/tools/deft/config.el rename to modules/ui/deft/config.el index 030e337bb..4f1c44d52 100644 --- a/modules/tools/deft/config.el +++ b/modules/ui/deft/config.el @@ -1,4 +1,4 @@ -;;; tools/deft/config.el -*- lexical-binding: t; -*- +;;; ui/deft/config.el -*- lexical-binding: t; -*- (def-package! deft :commands deft diff --git a/modules/tools/deft/packages.el b/modules/ui/deft/packages.el similarity index 64% rename from modules/tools/deft/packages.el rename to modules/ui/deft/packages.el index 4d760f260..9c4b8f9c1 100644 --- a/modules/tools/deft/packages.el +++ b/modules/ui/deft/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; tools/deft/packages.el +;;; ui/deft/packages.el (package! deft) From 6318572d10197ef48edb4dccf9aea6633d750550 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 20:02:16 +0200 Subject: [PATCH 2920/4235] Fix invalid marker in doom/window-enlargen #825 --- core/autoload/ui.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 1bb3e0300..6ef70992e 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -67,7 +67,7 @@ windows (unlike `doom/window-zoom') Activate again to undo." (setq doom--window-enlargened (if (and doom--window-enlargened (assoc ?_ register-alist)) - (ignore (jump-to-register ?_)) + (ignore (ignore-errors (jump-to-register ?_))) (window-configuration-to-register ?_) (if (window-dedicated-p) ;; `window-resize' and `window-max-delta' don't respect From bd7f1f6d17d752f490fa290ca850a1e3784229c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 20:04:50 +0200 Subject: [PATCH 2921/4235] Fix wrong-type-arg on project switch #836 A regression caused by e40a58c4, which made +workspace-new return something other than a perspective struct. --- modules/feature/workspaces/autoload/workspaces.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 04f48f0a1..948282a14 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -161,7 +161,8 @@ Otherwise return t on success, nil otherwise." (delete-other-windows) (switch-to-buffer (doom-fallback-buffer)) (setf (persp-window-conf persp) - (funcall persp-window-state-get-function (selected-frame)))))) + (funcall persp-window-state-get-function (selected-frame)))) + persp)) ;;;###autoload (defun +workspace-rename (name new-name) From 9b84d800f3cd3ddff374fed6f17fc1dc349eefbd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 21:25:52 +0200 Subject: [PATCH 2922/4235] Make numbered vim markers global In evil, registers 2-9 are buffer-local. In vim, they're global. This fixes that. --- modules/feature/evil/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 479a91f66..185e45e65 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -126,6 +126,12 @@ line with a linewise comment.") (advice-add #'counsel-git-grep-action :around #'+evil*set-jump) (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) + ;; In evil, registers 2-9 are buffer-local. In vim, they're global, so... + (defun +evil*make-numbered-markers-global (orig-fn char) + (or (and (>= char ?2) (<= char ?9)) + (funcall orig-fn char))) + (advice-add #'evil-global-marker-p :around #'+evil*make-numbered-markers-global) + ;; Make o/O continue comments (defun +evil*insert-newline-above-and-respect-comments (orig-fn count) (cl-letf* ((old-insert-newline-above (symbol-function 'evil-insert-newline-above)) From e73e28a36092cbb425e0243876f9ec8e6bb8a5e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 27 Aug 2018 21:33:00 +0200 Subject: [PATCH 2923/4235] Add .directory to .gitignore #841 --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 78fdd0789..bd575d0c3 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ network-security.data *.dat *.eld -# transient files +# transient/os temp files *.cache-* *.log +.directory From a4250afb49ef8fa3a9bb144464be81e91ede7b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C3=98in=C3=A6s=20Myrseth?= Date: Mon, 27 Aug 2018 23:04:38 +0200 Subject: [PATCH 2924/4235] lang/org: Add evil-friendly calendar navigation --- modules/lang/org/config.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c6e6e6960..eb2ffcfa3 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -342,7 +342,16 @@ between the two." :n "C" #'org-clock-out :n "g" #'org-clock-goto :n "G" (λ! (org-clock-goto 'select)) - :n "x" #'org-clock-cancel))) + :n "x" #'org-clock-cancel)) + (map! :map org-read-date-minibuffer-local-map + "C-h" (λ! (org-eval-in-calendar '(calendar-backward-day 1))) + "C-l" (λ! (org-eval-in-calendar '(calendar-forward-day 1))) + "C-k" (λ! (org-eval-in-calendar '(calendar-backward-week 1))) + "C-j" (λ! (org-eval-in-calendar '(calendar-forward-week 1))) + "C-S-h" (λ! (org-eval-in-calendar '(calendar-backward-month 1))) + "C-S-l" (λ! (org-eval-in-calendar '(calendar-forward-month 1))) + "C-S-k" (λ! (org-eval-in-calendar '(calendar-backward-year 1))) + "C-S-j" (λ! (org-eval-in-calendar '(calendar-forward-year 1))))) (defun +org|setup-hacks () "Getting org to behave." From ee4d3172935c645fb41ef7f1b085b93ce0e99904 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 01:27:56 +0200 Subject: [PATCH 2925/4235] lang/latex: improve smartparens compatiblity Also fixes special quote insertion (mentionde in #485) --- modules/lang/latex/config.el | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index cf106d6f4..f0c6d2be8 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -26,9 +26,6 @@ If no viewers are found, `latex-preview-pane' is used.") ;; Plugins ;; -;; sp's default rules are obnoxious, so disable them -(provide 'smartparens-latex) - (def-package! tex :mode ("\\.tex\\'" . TeX-latex-mode) :config @@ -69,7 +66,19 @@ If no viewers are found, `latex-preview-pane' is used.") ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) - (add-hook 'TeX-mode-hook #'flyspell-mode :append))) + (add-hook 'TeX-mode-hook #'flyspell-mode :append)) + ;; All these excess pairs dramatically slow down typing in latex buffers, so + ;; we remove them. Let snippets do their job. + (after! smartparens-latex + (let ((modes '(tex-mode plain-tex-mode latex-mode LaTeX-mode))) + (dolist (open '("\\left(" "\\left[" "\\left\\{" "\\left|" + "\\bigl(" "\\biggl(" "\\Bigl(" "\\Biggl(" "\\bigl[" + "\\biggl[" "\\Bigl[" "\\Biggl[" "\\bigl\\{" "\\biggl\\{" + "\\Bigl\\{" "\\Biggl\\{" + "\\lfloor" "\\lceil" "\\langle" + "\\lVert" "\\lvert" "`")) + (sp-local-pair modes open nil :actions nil)) + (sp-local-pair modes "``" nil :unless '(:add sp-in-math-p))))) (after! latex From eed835b7ccb6c0db2294f77e2e0f711dd5f82009 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Mon, 27 Aug 2018 22:49:57 -0700 Subject: [PATCH 2926/4235] Fix typo in ivy/README.org Wrong command was listed in the table --- modules/completion/ivy/README.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/README.org b/modules/completion/ivy/README.org index 18f399739..974545c19 100644 --- a/modules/completion/ivy/README.org +++ b/modules/completion/ivy/README.org @@ -106,8 +106,8 @@ Here is a list of my commonly used commands, their default keybinds (defined in | ~counsel-projectile-find-file~ | =SPC f /= or =SPC SPC= | Find file in project | | ~counsel-projectile-switch-project~ | =SPC p p= | Open another project | | ~counsel-recentf~ | =SPC f r= | Find recently opened file | -| ~ivy-switch-buffer~ | =SPC b b= | Jump to buffer in current workspace | -| ~+ivy/switch-workspace-buffer~ | =SPC b B= | Jump to buffer across workspaces | +| ~+ivy/switch-workspace-buffer~ | =SPC b b= | Jump to buffer in current workspace | +| ~ivy-switch-buffer~ | =SPC b B= | Jump to buffer across workspaces | | ~+ivy:ag~ | ~:ag[!] [QUERY]~ | Search project (BANG = ignore gitignore) | | ~+ivy:ag-cwd~ | ~:agcwd[!] [QUERY]~ | Search this directory (BANG = don't recurse into subdirectories) | | ~+ivy:rg~ | ~:rg[!] [QUERY]~ | Search project (if BANG, ignore gitignore) | From 686929ad7a07b2819714c5ed2e3eb25e003cbae1 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 28 Aug 2018 11:43:00 +0200 Subject: [PATCH 2927/4235] Adds a default binding for deft under notes --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 0f62a49d6..01712bbd9 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -687,6 +687,8 @@ :desc "From snippet" :nv "s" #'yas-insert-snippet) (:desc "notes" :prefix "n" + (:when (featurep! :ui deft) + :desc "Deft" :n "d" #'deft) :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) From e932c747585b0ff4dc58be4a2319ecf0a68f6a9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 12:02:56 +0200 Subject: [PATCH 2928/4235] editor/format: don't move cursor on format-on-save Also renames +format|on-save to +format|buffer for clarity. It should not (normally) be used directly. Use `+format|enable-on-save-maybe` and `+format|enable-on-save`. --- modules/editor/format/autoload/format.el | 11 ++++++----- modules/editor/format/config.el | 7 ++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 211cb4804..487908ce8 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -224,10 +224,11 @@ is selected)." ;; ;;;###autoload -(defalias '+format|enable-on-save #'format-all-mode) +(defun +format|enable-on-save () + "Enables formatting on save." + (add-hook 'before-save-hook #'+format|buffer nil t)) ;;;###autoload -(defun +format|on-save () - "Runs `format-all-buffer' without moving the cursor." - (save-excursion - (format-all-buffer))) +(defun +format|buffer () + "Runs `format-all-buffer' immediately, without moving the cursor." + (save-excursion (format-all-buffer))) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 37f3c603d..94186e2a4 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -16,8 +16,9 @@ If nil, it is disabled in all modes, the same as if the +onsave flag wasn't ;; (defun +format|enable-on-save-maybe () - "Enable `format-all-mode' in buffers. See `+format-on-save-enabled-modes' to -control which major modes to target." + "Enable formatting on save in certain major modes. + +This is controlled by `+format-on-save-enabled-modes'." (unless (or (eq major-mode 'fundamental-mode) (cond ((booleanp +format-on-save-enabled-modes) (null +format-on-save-enabled-modes)) @@ -26,7 +27,7 @@ control which major modes to target." ((not (memq major-mode +format-on-save-enabled-modes)))) (not (require 'format-all nil t)) (not (format-all-probe))) - (add-hook 'before-save-hook #'+format|on-save nil t))) + (add-hook 'before-save-hook #'+format|buffer nil t))) (when (featurep! +onsave) (add-hook 'after-change-major-mode-hook #'+format|enable-on-save-maybe)) From d0295a26d4cc843d6a915caccf860c754c91d0f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 13:27:25 +0200 Subject: [PATCH 2929/4235] ui/treemacs: show only one project #846 If you use +treemacs/toggle. --- modules/ui/treemacs/autoload.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index ebad12cf6..d477128cf 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -4,10 +4,8 @@ (defun +treemacs/toggle () "Initialize or toggle treemacs. -* If the treemacs window is visible hide it. -* If a treemacs buffer exists, but is not visible show it. -* If no treemacs buffer exists for the current frame create and show it. -* If the workspace is empty, add the current project to it automatically." +Ensures that only the current project is present and all other projects have +been removed." (interactive) (require 'treemacs) (let ((origin-buffer (current-buffer))) @@ -15,9 +13,13 @@ (symbol-function 'ignore))) (treemacs--init)) ;; - (treemacs-do-add-project-to-workspace - (treemacs--canonical-path (doom-project-root 'nocache)) - (doom-project-name 'nocache)) + (dolist (project (treemacs-workspace->projects (treemacs-current-workspace))) + (treemacs-do-remove-project-from-workspace project)) + ;; + (with-current-buffer origin-buffer + (treemacs-do-add-project-to-workspace + (treemacs--canonical-path (doom-project-root 'nocache)) + (doom-project-name 'nocache))) ;; (setq treemacs--ready-to-follow t) (when (or treemacs-follow-after-init treemacs-follow-mode) From e866fc46aa785eee0be9730c609390e0a88fe085 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 13:30:51 +0200 Subject: [PATCH 2930/4235] ui/treemacs: make hl-line stand out more #846 By remapping it to the region face. Perhaps another face would be a better fit? --- modules/ui/treemacs/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 4deff39f0..10acd0222 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -34,6 +34,11 @@ There are 2 possible values: (defvar treemacs-collapse-dirs (if (executable-find "python3") 3 0)) + (defun +treemacs|improve-hl-line-contrast () + "`hl-line' doesn't stand out enough in some themes." + (face-remap-add-relative 'hl-line 'region)) + (add-hook 'treemacs-mode-hook #'+treemacs|improve-hl-line-contrast) + (treemacs-follow-mode -1) (treemacs-filewatch-mode t) (when (memq +treemacs-use-git-mode '(simple extended)) From ed0cbc1323bd30ee3988d9f5cec29f9f3624bfd4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 13:33:48 +0200 Subject: [PATCH 2931/4235] editor/format: fix format-all-probe check Returns '(nil nil) when there is no formatter for the current mode. This is truthy, so we needed a better check. --- modules/editor/format/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 94186e2a4..f71311a9c 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -26,7 +26,7 @@ This is controlled by `+format-on-save-enabled-modes'." (memq major-mode (cdr +format-on-save-enabled-modes))) ((not (memq major-mode +format-on-save-enabled-modes)))) (not (require 'format-all nil t)) - (not (format-all-probe))) + (equal (format-all-probe) (list nil nil))) (add-hook 'before-save-hook #'+format|buffer nil t))) (when (featurep! +onsave) From 2b560a6a0ef98979ea22f7bc2da943885d1d3706 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 13:36:44 +0200 Subject: [PATCH 2932/4235] General & minor refactoring --- core/core-cli.el | 2 +- core/core-editor.el | 2 +- core/core-ui.el | 5 +-- modules/editor/format/autoload/format.el | 43 ++++++++++++------------ modules/feature/evil/config.el | 2 +- modules/tools/magit/config.el | 5 ++- 6 files changed, 30 insertions(+), 29 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index b2497dc86..180be9804 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -908,7 +908,7 @@ module. This does not include your byte-compiled, third party packages.'" for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) (doom-files-in doom-core-dir :match "\\.elc$") - (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 3)) + (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) for truepath = (file-truename path) if (file-exists-p path) do (delete-file path) diff --git a/core/core-editor.el b/core/core-editor.el index c60ada15d..1c7477eb6 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -236,7 +236,7 @@ savehist file." (advice-add #'undo-tree-make-history-save-file-name :filter-return #'doom*undo-tree-make-history-save-file-name) - (defun doom*strip-text-properties-from-undo-history (&rest args) + (defun doom*strip-text-properties-from-undo-history (&rest _) (dolist (item buffer-undo-list) (and (consp item) (stringp (car item)) diff --git a/core/core-ui.el b/core/core-ui.el index ad9c70987..82867f43c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -138,12 +138,12 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; `all-the-icons' (def-package! all-the-icons :commands (all-the-icons-octicon all-the-icons-faicon all-the-icons-fileicon - all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon - all-the-icons-install-fonts) + all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) :init (defun doom*disable-all-the-icons-in-tty (orig-fn &rest args) (when (display-graphic-p) (apply orig-fn args))) + :config ;; all-the-icons doesn't work in the terminal, so we "disable" it. (dolist (fn '(all-the-icons-octicon all-the-icons-material all-the-icons-faicon all-the-icons-fileicon @@ -161,6 +161,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; `highlight-escape-sequences' (def-package! highlight-escape-sequences + :load-path "~/work/plugins/highlight-escape-sequences" :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 487908ce8..95ff949c8 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -144,27 +144,28 @@ Advanced examples: ;; format a region rather than the whole buffer. (require 'format-all) (save-restriction - (let* ((beg (save-excursion (goto-char beg) (line-beginning-position))) - (end (save-excursion (goto-char end) - (if (bolp) (backward-char)) - (line-end-position))) - (file buffer-file-name) - (dir default-directory) - (mode major-mode) - (input (buffer-substring-no-properties beg end)) - (leading-indent 0) - final-output) - (with-temp-buffer - (with-silent-modifications - (setq buffer-file-name file - default-directory dir) - (delay-mode-hooks (funcall mode)) - (save-excursion (insert input)) - (setq leading-indent (current-indentation)) - (indent-rigidly (point-min) (point-max) (- leading-indent)) - ;; From `format-all-buffer' - (cl-destructuring-bind (formatter mode-result) (format-all-probe) - (unless formatter (error "Don't know how to format %S code" major-mode)) + (cl-destructuring-bind (formatter mode-result) (format-all-probe) + (unless formatter + (user-error "Don't know how to format %S code" major-mode)) + (let* ((beg (save-excursion (goto-char beg) (line-beginning-position))) + (end (save-excursion (goto-char end) + (if (bolp) (backward-char)) + (line-end-position))) + (file buffer-file-name) + (dir default-directory) + (mode major-mode) + (input (buffer-substring-no-properties beg end)) + (leading-indent 0) + final-output) + (with-temp-buffer + (with-silent-modifications + (setq buffer-file-name file + default-directory dir) + (delay-mode-hooks (funcall mode)) + (save-excursion (insert input)) + (setq leading-indent (current-indentation)) + (indent-rigidly (point-min) (point-max) (- leading-indent)) + ;; From `format-all-buffer' (let ((f-function (gethash formatter format-all-format-table)) (executable (format-all-formatter-executable formatter))) (cl-destructuring-bind (output errput first-diff) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 185e45e65..dda2e9a76 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -328,7 +328,7 @@ line with a linewise comment.") evilmi-outer-text-object evilmi-inner-text-object) :config (global-evil-matchit-mode 1) :init - (define-key! 'global [remap evil-jump-item] #'evilmi-jump-items) + (global-set-key [remap evil-jump-item] #'evilmi-jump-items) (define-key evil-inner-text-objects-map "%" #'evilmi-inner-text-object) (define-key evil-outer-text-objects-map "%" #'evilmi-outer-text-object) :config diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index cf440a5e2..014ec96bc 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -46,7 +46,6 @@ available.") (add-hook 'magit-post-refresh-hook #'+magit|update-vc)) - (def-package! magit-todos :hook (magit-mode . magit-todos-mode) :config @@ -102,5 +101,5 @@ available.") (evil-define-key* evil-magit-state git-rebase-mode-map "gj" #'git-rebase-move-line-down "gk" #'git-rebase-move-line-up)) - (map! :map (magit-mode-map magit-blame-read-only-mode-map) - doom-leader-key nil)) + (define-key! (magit-mode-map magit-blame-read-only-mode-map) + (kbd doom-leader-key) nil)) From ef6e09dac9919598815d2d010fe750cd175437a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 19:13:34 +0200 Subject: [PATCH 2933/4235] Search for Emacs.app in /usr/local/opt And refactors doom-patch-macos function, its dispatcher, and its usage in doom-quickstart. --- core/core-cli.el | 107 +++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 180be9804..a6187e860 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -190,7 +190,10 @@ recompile. Run this whenever you: 3. Add or remove autoloaded functions in module autoloaded files. 4. Update Doom outside of Doom (e.g. with git)") -(dispatcher! (patch-macos) (doom-patch-macos args) +(dispatcher! (patch-macos) + (doom-patch-macos (or (member "--undo" args) + (member "-u" args)) + (doom--find-emacsapp-path)) "Patches Emacs.app to respect your shell environment. A common issue with GUI Emacs on MacOS is that it launches in an environment @@ -303,6 +306,16 @@ problems with doom." (car e) (buffer-string)))))))) +(defun doom--find-emacsapp-path () + (or (getenv "EMACS_APP_PATH") + (cl-find-if #'file-directory-p + (list "/usr/local/opt/emacs" + "/usr/local/opt/emacs-plus" + "/Applications" + "~/Applications") + :key (lambda (x) (concat x "/Emacs.app"))) + (user-error "Couldn't find Emacs.app"))) + (defun doom-quickstart () "Quickly deploy a private module and Doom. @@ -331,25 +344,11 @@ packages and regenerates the autoloads file." (with-temp-file config-file (insert "")) (print! (green "Done!"))))) ;; Ask if Emacs.app should be patched - (condition-case e - (when IS-MAC - (message "MacOS detected") - (let ((appdir (cl-find-if #'file-directory-p - (list "/Applications/Emacs.app" - "~/Applications/Emacs.app")))) - (unless appdir - (user-error "Couldn't find Emacs.app in /Applications or ~/Applications")) - (when (file-exists-p! "Contents/MacOS/RunEmacs" appdir) - (user-error "Emacs.app is already patched")) - (unless (or doom-auto-accept - (y-or-n-p - (concat "Doom would like to patch your Emacs.app bundle so that it respects\n" - "your shell configuration. For more information on why and how, run\n\n" - " bin/doom help patch-macos\n\n" - "Patch Emacs.app?"))) - (user-error "Will not patch Emacs.app")) - (doom-patch-macos nil))) - (user-error (message "%s" (error-message-string e)))) + (when IS-MAC + (message "MacOS detected") + (condition-case e + (doom-patch-macos nil (doom--find-emacsapp-path)) + (user-error (message "%s" (error-message-string e))))) ;; Install Doom packages (print! "Installing plugins") (doom-packages-install doom-auto-accept) @@ -360,46 +359,44 @@ packages and regenerates the autoloads file." (doom-template-insert "QUICKSTART_INTRO") (print! (buffer-string)))) -(defun doom-patch-macos (args) +(defun doom-patch-macos (undo-p appdir) "Patches Emacs.app to respect your shell environment." (unless IS-MAC (user-error "You don't seem to be running MacOS")) - (let ((appdir - (cl-find-if #'file-exists-p - (list "/Applications/Emacs.app" - "~/Applications/Emacs.app")))) - (unless appdir - (user-error "Couldn't find Emacs.app in /Applications or ~/Applications")) - (let ((oldbin (expand-file-name "Contents/MacOS/Emacs" appdir)) - (newbin (expand-file-name "Contents/MacOS/RunEmacs" appdir))) - (cond ((or (member "--undo" args) - (member "-u" args)) - (unless (file-exists-p newbin) - (user-error "Emacs.app is not patched")) - (copy-file newbin oldbin 'ok-if-already-exists nil nil 'preserve-permissions) - (unless (file-exists-p oldbin) - (error "Failed to copy %s to %s" newbin oldbin)) - (delete-file newbin) - (message "%s successfully unpatched" appdir)) + (unless (file-directory-p appdir) + (user-error "Couldn't find '%s'" appdir)) + (let ((oldbin (expand-file-name "Contents/MacOS/Emacs" appdir)) + (newbin (expand-file-name "Contents/MacOS/RunEmacs" appdir))) + (cond (undo-p + (unless (file-exists-p newbin) + (user-error "Emacs.app is not patched")) + (copy-file newbin oldbin 'ok-if-already-exists nil nil 'preserve-permissions) + (unless (file-exists-p oldbin) + (error "Failed to copy %s to %s" newbin oldbin)) + (delete-file newbin) + (message "%s successfully unpatched" appdir)) - ((file-exists-p newbin) - (user-error "%s is already patched" appdir)) + ((file-exists-p newbin) + (user-error "%s is already patched" appdir)) - ((or doom-auto-accept - (y-or-n-p (concat "/Applications/Emacs.app needs to be patched. See `bin/doom help patch-macos' for why and how.\n\n" - "Patch Emacs.app?"))) - (message "Patching '%s'" appdir) - (copy-file oldbin newbin nil nil nil 'preserve-permissions) - (unless (file-exists-p newbin) - (error "Failed to copy %s to %s" oldbin newbin)) - (with-temp-buffer - (insert "#!/usr/bin/env bash\n" - "args=\"$@\"\n" - "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"\n" - "exec \"$SHELL\" -c \"$pwd/RunEmacs $args\"") - (write-file oldbin) - (chmod oldbin (file-modes newbin))) - (message "%s successfully patched" appdir)))))) + ((or doom-auto-accept + (y-or-n-p + (concat "Doom would like to patch your Emacs.app bundle so that it respects\n" + "your shell configuration. For more information on why and how, run\n\n" + " bin/doom help patch-macos\n\n" + "Patch Emacs.app?"))) + (message "Patching '%s'" appdir) + (copy-file oldbin newbin nil nil nil 'preserve-permissions) + (unless (file-exists-p newbin) + (error "Failed to copy %s to %s" oldbin newbin)) + (with-temp-buffer + (insert "#!/usr/bin/env bash\n" + "args=\"$@\"\n" + "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"\n" + "exec \"$SHELL\" -c \"$pwd/RunEmacs $args\"") + (write-file oldbin) + (chmod oldbin (file-modes newbin))) + (message "%s successfully patched" appdir))))) ;; From 9ee1d8d0e23094d49542b853d5ebc911ea55717c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 19:14:18 +0200 Subject: [PATCH 2934/4235] Set indent function for dispatcher! macro --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index a6187e860..e2bcc0377 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -71,7 +71,7 @@ first line should be short (under 60 letters), as it will be displayed for bin/doom help. BODY will be run when this dispatcher is called." - (declare (doc-string 3)) + (declare (indent defun) (doc-string 3)) (cl-destructuring-bind (cmd &rest aliases) (doom-enlist command) (macroexp-progn From 5021b0dbb6203516ffe167988cf34a02a8e8a173 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 19:35:56 +0200 Subject: [PATCH 2935/4235] completion/helm: fix undefined helm/grep* --- modules/completion/helm/autoload/helm.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index ff07cd41d..af39ece1a 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -210,7 +210,7 @@ ones." ;;;###autoload (autoload '+helm/grep "completion/helm/autoload/helm") ;;;###autoload (autoload '+helm/grep-from-cwd "completion/helm/autoload/helm") -(dolist (engine (cl-remove-duplicates +helm-project-search-engines :from-end t)) +(dolist (engine `(,@(cl-remove-duplicates +helm-project-search-engines :from-end t) grep)) (defalias (intern (format "+helm/%s" engine)) (lambda (all-files-p &optional query directory) (interactive "P") From a57c0fbede5175921788a139ad0498593bfe2bc7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 28 Aug 2018 20:48:49 +0200 Subject: [PATCH 2936/4235] feature/lookup: remove devdocs support (for now) devdocs-lookup is broken at the moment. devdocs search is still available through +lookup/online as a provider however. This may be reversed later, when (and if) we find a better devdocs backend. --- init.example.el | 1 - modules/config/default/+evil-commands.el | 1 - modules/feature/lookup/autoload/devdocs.el | 22 ---------------------- modules/feature/lookup/autoload/evil.el | 6 ------ modules/feature/lookup/autoload/lookup.el | 9 +-------- modules/feature/lookup/config.el | 21 +-------------------- modules/feature/lookup/packages.el | 3 --- 7 files changed, 2 insertions(+), 61 deletions(-) delete mode 100644 modules/feature/lookup/autoload/devdocs.el diff --git a/init.example.el b/init.example.el index 58a5e0fb2..87b2429d7 100644 --- a/init.example.el +++ b/init.example.el @@ -7,7 +7,6 @@ (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files (lookup ; helps you navigate your code and documentation - +devdocs ; ...on devdocs.io online +docsets) ; ...or in Dash docsets locally snippets ; my elves. They type so I don't have to spellcheck ; tasing you for misspelling mispelling diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 657524b18..0683cdbae 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -59,7 +59,6 @@ command from the current directory instead of the project root." ;; TODO (ex! "go[ogle]" #'doom:google-search) (ex! "lo[okup]" #'+lookup:online) (ex! "dash" #'+lookup:dash) -(ex! "dd" #'+lookup:devdocs) (ex! "http" #'httpd-start) ; start http server (ex! "repl" #'+eval:repl) ; invoke or send to repl ;; TODO (ex! "rx" 'doom:regex) ; open re-builder diff --git a/modules/feature/lookup/autoload/devdocs.el b/modules/feature/lookup/autoload/devdocs.el deleted file mode 100644 index 5625c81e9..000000000 --- a/modules/feature/lookup/autoload/devdocs.el +++ /dev/null @@ -1,22 +0,0 @@ -;;; feature/lookup/autoload/devdocs.el -*- lexical-binding: t; -*- -;;;###if (featurep! +devdocs) - -;;;###autodef -(defun set-devdocs! (modes docset) - "Map major MODES (one major-mode symbol or a list of them) to a devdocs -DOCSET (a string). - -See `devdocs-alist' for the defaults. " - (defer-until! (boundp 'devdocs-alist) - (dolist (mode (doom-enlist modes)) - (setf (alist-get mode devdocs-alist) docset)))) - -;; FIXME obsolete :devdocs -;;;###autoload -(def-setting! :devdocs (modes docset) - "Map major MODES (one major-mode symbol or a list of them) to a devdocs -DOCSET (a string). - -See `devdocs-alist' for the defaults. " - :obsolete set-devdocs! - `(set-devdocs! ,modes ,docset)) diff --git a/modules/feature/lookup/autoload/evil.el b/modules/feature/lookup/autoload/evil.el index 72c193fcc..26bafc489 100644 --- a/modules/feature/lookup/autoload/evil.el +++ b/modules/feature/lookup/autoload/evil.el @@ -14,9 +14,3 @@ engine." "TODO" (interactive "") (+lookup/in-docsets query (if bang 'blank))) - -;;;###autoload (autoload '+lookup:devdocs "feature/lookup/autoload/evil" nil t) -(evil-define-command +lookup:devdocs (query &optional bang) - "TODO" - (interactive "") - (+lookup/in-devdocs query (if bang 'blank))) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 9c5ae2201..078165241 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -198,8 +198,7 @@ Goes down a list of possible backends: 1. The :documentation spec defined with by `set-lookup-handlers!' 2. If the +docsets flag is active for :feature lookup, use `+lookup/in-docsets' -3. If the +devdocs flag is active for :feature lookup, run `+lookup/in-devdocs' -4. Fall back to an online search, with `+lookup/online'" +3. Fall back to an online search, with `+lookup/online'" (interactive (list (+lookup--symbol-or-region))) (cond ((and +lookup-documentation-functions @@ -214,9 +213,6 @@ Goes down a list of possible backends: (helm-dash-installed-docsets)) (+lookup/in-docsets identifier)) - ((featurep! +devdocs) - (call-interactively #'+lookup/in-devdocs)) - ((+lookup/online identifier (+lookup--online-provider (not current-prefix-arg)))))) @@ -272,9 +268,6 @@ Otherwise, falls back on `find-file-at-point'." ;; Source-specific commands ;; -;;;###autoload -(defalias #'+lookup/in-devdocs #'devdocs-lookup) - (defvar counsel-dash-docsets) (defvar helm-dash-docsets) ;;;###autoload diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 5f0431a4b..8ea92aa0f 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -5,11 +5,7 @@ ;; + `+lookup/definition': a jump-to-definition that should 'just work' ;; + `+lookup/references': find a symbol's references in the current project ;; + `+lookup/online'; look up a symbol on online resources -;; + `+lookup/docs-at-point' -;; + `+lookup/docs-dash' -;; + `+lookup/docs-dash-at-point' -;; + `+lookup/devdocs' -;; + `+lookup/devdocs-at-point' +;; + `+lookup/in-docsets': look up in Dash docsets ;; ;; This module uses `xref', an experimental new library in Emacs. It may change ;; in the future. When xref can't be depended on it will fall back to @@ -140,18 +136,3 @@ argument: the identifier at point.") (featurep! :completion ivy)) :commands counsel-dash-install-docset :config (setq counsel-dash-min-length 2)) - - -;; -;; devdocs.io integration -;; - -(when (featurep! +devdocs) - (after! devdocs-lookup - (unless (assoc "SCSS" devdocs-subjects) - (setq devdocs-subjects - (append '(("SCSS" "scss") - ("GFM" "markdown") - ("Typescript" "typescript")) - devdocs-subjects))))) - diff --git a/modules/feature/lookup/packages.el b/modules/feature/lookup/packages.el index edfc1acad..743c8631a 100644 --- a/modules/feature/lookup/packages.el +++ b/modules/feature/lookup/packages.el @@ -19,6 +19,3 @@ (package! helm-dash)) (when (featurep! :completion ivy) (package! counsel-dash))) - -(when (featurep! +devdocs) - (package! devdocs-lookup :recipe (:fetcher github :repo "skeeto/devdocs-lookup"))) From d6695d4cf381debf94a26faa2b64384feab748f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 01:11:50 +0200 Subject: [PATCH 2937/4235] Update doom/toggle-line-numbers #847 Now that display-line-numbers-mode has been backported to Emacs 25, we can use it instead of interacting with nlinum directly. --- core/autoload/ui.el | 51 ++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 6ef70992e..112c7f1d0 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -5,36 +5,31 @@ "Toggle line numbers. Cycles through regular, relative and no line numbers. The order depends on what -`doom-line-numbers-style' is set to. +`display-line-numbers-type' is set to. If you're using Emacs 26+, and +visual-line-mode is on, this skips relative and uses visual instead. -Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." +See `display-line-numbers' for what these values mean." (interactive) - (defvar doom--line-number-style doom-line-numbers-style) - (let* ((styles '(t relative nil)) - (order (cons doom-line-numbers-style (delq doom-line-numbers-style styles))) - (queue (memq doom--line-number-style order)) - (next (if (= (length queue) 1) - (car order) - (car (cdr queue))))) - (setq doom--line-number-style next) - (cond ((boundp 'display-line-numbers) - (when (and (eq next 'relative) - doom-line-numbers-visual-style) - (setq next 'visual)) - (setq display-line-numbers next)) - ((featurep 'nlinum) - (pcase next - (`t (nlinum-relative-off) (nlinum-mode +1)) - (`relative (nlinum-relative-on)) - (`nil (nlinum-mode -1)))) - (t - (error "No line number plugin detected"))) - (message "Switched to %s line numbers" - (pcase next - (`t "normal") - (`relative "relative") - (`visual "visual") - (`nil "disabled"))))) + (defvar doom--line-number-style display-line-numbers-type) + (let ((nlinum-p (get 'display-line-numbers 'nlinum))) + (let* ((styles `(t ,(if (and (not nlinum-p) visual-line-mode) 'visual 'relative) nil)) + (order (cons display-line-numbers-type (remq display-line-numbers-type styles))) + (queue (memq doom--line-number-style order)) + (next (if (= (length queue) 1) + (car order) + (car (cdr queue))))) + (setq doom--line-number-style next) + (if (get 'display-line-numbers 'nlinum) + (pcase next + (`t (nlinum-relative-off) (nlinum-mode +1)) + (`relative (nlinum-relative-on)) + (`nil (nlinum-mode -1))) + (setq display-line-numbers next)) + (message "Switched to %s line numbers" + (pcase next + (`t "normal") + (`nil "disabled") + (x (symbol-name next))))))) ;;;###autoload (defun doom-resize-window (window new-size &optional horizontal force-p) From be8eedc296fa11d0694dfa21e1ae00113f2c1aa6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 01:58:18 +0200 Subject: [PATCH 2938/4235] Fix lost window state when toggling popups Replaces af045213 with a method for preserving popup state. --- modules/ui/popup/autoload/popup.el | 23 +++++++++++++---------- modules/ui/popup/config.el | 7 ------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 63300a122..ff732a24b 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -97,12 +97,6 @@ and enables `+popup-buffer-mode'." (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." (when alist - ;; In case ALIST is window state (from `window-state-get'), we map its - ;; entries to display-buffer alist parameters. - (dolist (prop +popup-window-state-alist) - (when-let* ((val (assq (car prop) alist))) - (setf (alist-get (cdr prop) alist) (cdr val)) - (setq alist (delq val alist)))) (let ((alist ; handle defaults (cl-remove-duplicates (append alist +popup-default-alist) @@ -119,9 +113,9 @@ and enables `+popup-buffer-mode'." 'window-width 'window-height))) (setq list (assq-delete-all 'size alist)) - (setcdr (assq param alist) size)) - (setcdr (assq 'window-parameters alist) - parameters) + (setf (alist-get param alist) size)) + (setf (alist-get 'window-parameters alist) + parameters) alist))) @@ -197,6 +191,15 @@ Uses `shrink-window-if-larger-than-buffer'." (unless (= (- (point-max) (point-min)) 0) (shrink-window-if-larger-than-buffer window))) +;;;###autoload +(defun +popup-alist-from-window-state (state) + "Convert window STATE (from `window-state-get') to a `display-buffer' alist." + (let* ((params (alist-get 'parameters state))) + `((side . ,(alist-get 'window-side params)) + (window-width . ,(alist-get 'total-width state)) + (window-height . ,(alist-get 'total-height state)) + (window-parameters ,@params)))) + ;; ;; Hooks @@ -366,7 +369,7 @@ the message buffer in a popup window." (error "No popups to restore")) (cl-loop for (buffer . state) in +popup--last if (buffer-live-p buffer) - do (+popup-buffer buffer state)) + do (+popup-buffer buffer (+popup-alist-from-window-state state))) (setq +popup--last nil) t) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index d24fd8378..3f7e8382b 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -20,13 +20,6 @@ Modifying this has no effect, unless done before ui/popup loads.") (no-other-window . t)) "The default window parameters.") -(defvar +popup-window-state-alist - '((total-width . window-width) - (total-height . window-height) - (parameters . window-parameters)) - "An alist mapping `window-state-get' entries to display-buffer alist entries. -Used by `+popup--normalize-alist'.") - (defvar +popup-margin-width 1 "Size of the margins to give popup windows. Set this to nil to disable margin adjustment.") From cab0ee33d13f67fea505c247b7e015e6e4cc6a50 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 02:04:12 +0200 Subject: [PATCH 2939/4235] ui/treemacs: fix SPC o P (treemacs-find-file) Would create a blank treemacs window when invoked before a treemacs window was first initialized. --- modules/config/default/+bindings.el | 2 +- modules/ui/treemacs/autoload.el | 46 ++++++++++++++++++----------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 0f62a49d6..889fe8442 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -703,7 +703,7 @@ :desc "Find file in project sidebar" :n "P" #'+neotree/find-this-file) (:when (featurep! :ui treemacs) :desc "Project sidebar" :n "p" #'+treemacs/toggle - :desc "Find file in project sidebar" :n "P" #'treemacs-find-file) + :desc "Find file in project sidebar" :n "P" #'+treemacs/find-file) :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle :desc "Terminal" :n "t" #'+term/open :desc "Terminal in popup" :n "T" #'+term/open-popup-in-project diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index d477128cf..b34f34d19 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -1,27 +1,39 @@ ;;; ui/treemacs/autoload.el -*- lexical-binding: t; -*- +(defun +treemacs--init () + (require 'treemacs) + (let ((origin-buffer (current-buffer))) + (cl-letf (((symbol-function 'treemacs-workspace->is-empty?) + (symbol-function 'ignore))) + (treemacs--init)) + (dolist (project (treemacs-workspace->projects (treemacs-current-workspace))) + (treemacs-do-remove-project-from-workspace project)) + (with-current-buffer origin-buffer + (treemacs-do-add-project-to-workspace + (treemacs--canonical-path (doom-project-root 'nocache)) + (doom-project-name 'nocache)) + (setq treemacs--ready-to-follow t) + (when (or treemacs-follow-after-init treemacs-follow-mode) + (treemacs--follow))))) + ;;;###autoload (defun +treemacs/toggle () "Initialize or toggle treemacs. Ensures that only the current project is present and all other projects have -been removed." +been removed. + +Use `treemacs' command for old functionality." (interactive) - (require 'treemacs) + (pcase (treemacs-current-visibility) + (`visible (delete-window (treemacs-get-local-window))) + (_ (+treemacs--init)))) + +;;;###autoload +(defun +treemacs/find-file (arg) + "Open treemacs (if necessary) and find current file." + (interactive "P") (let ((origin-buffer (current-buffer))) - (cl-letf (((symbol-function 'treemacs-workspace->is-empty?) - (symbol-function 'ignore))) - (treemacs--init)) - ;; - (dolist (project (treemacs-workspace->projects (treemacs-current-workspace))) - (treemacs-do-remove-project-from-workspace project)) - ;; + (+treemacs--init) (with-current-buffer origin-buffer - (treemacs-do-add-project-to-workspace - (treemacs--canonical-path (doom-project-root 'nocache)) - (doom-project-name 'nocache))) - ;; - (setq treemacs--ready-to-follow t) - (when (or treemacs-follow-after-init treemacs-follow-mode) - (with-current-buffer origin-buffer - (treemacs--follow))))) + (treemacs-find-file arg)))) From 10a1e46bf5b2e36d121dd935bd25ce919054ed3e Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 29 Aug 2018 11:03:28 +0200 Subject: [PATCH 2940/4235] Added deft and coq modules --- init.example.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/init.example.el b/init.example.el index 87b2429d7..325d5ec37 100644 --- a/init.example.el +++ b/init.example.el @@ -24,6 +24,7 @@ ; +fuzzy) ; enable fuzzy search backend for ivy :ui + ;deft ; notational velocity for Emacs doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs doom-modeline ; a snazzy Atom-inspired mode-line @@ -81,6 +82,7 @@ ;(cc +irony +rtags); C/C++/Obj-C madness ;clojure ; java with a lisp ;common-lisp ; if you've seen one lisp, you've seen them all + ;coq ; proofs-as-programs ;crystal ; ruby at the speed of c ;csharp ; unity, .NET, and mono shenanigans data ; config/data formats From 902386b60f9ef948aea29376d974de164d550b46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 12:44:09 +0200 Subject: [PATCH 2941/4235] Fix file-missing error during patch-macos Forgot to add Emacs.app to the end of the directories to be searched! Whoops! --- core/core-cli.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index e2bcc0377..8a9fd717b 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -308,12 +308,13 @@ problems with doom." (defun doom--find-emacsapp-path () (or (getenv "EMACS_APP_PATH") - (cl-find-if #'file-directory-p - (list "/usr/local/opt/emacs" - "/usr/local/opt/emacs-plus" - "/Applications" - "~/Applications") - :key (lambda (x) (concat x "/Emacs.app"))) + (cl-loop for dir in (list "/usr/local/opt/emacs" + "/usr/local/opt/emacs-plus" + "/Applications" + "~/Applications") + for appdir = (concat dir "/Emacs.app") + if (file-directory-p appdir) + return appdir) (user-error "Couldn't find Emacs.app"))) (defun doom-quickstart () From cb5c9cc9ea1dd267a4edcb85da31b31e8543f16d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 12:46:24 +0200 Subject: [PATCH 2942/4235] Don't autoformat emacs-lisp-mode buffers on save This is much too unpredictable, considering the variable nature of elisp indentation, and the possibility that certain functions and their indent behavior may not be defined/declared when the file is being formatted. --- modules/editor/format/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index f71311a9c..cbd65634c 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -1,6 +1,6 @@ ;;; editor/format/config.el -*- lexical-binding: t; -*- -(defvar +format-on-save-enabled-modes t +(defvar +format-on-save-enabled-modes '(not emacs-lisp-mode) "A list of major modes in which to enable `format-all-mode'. This mode will auto-format buffers when you save them. From 4b9233bec773a163970684af497d0d810cf37a31 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 12:48:38 +0200 Subject: [PATCH 2943/4235] editor/format: format by diff & major refactor This redesigns how format-all applies changes. Before, it would erase the buffer and insert the formatted result. This would throw markers out of whack, and usually meant the cursor would end up somewhere else (e.g. the beginning of the file). Now, changes are made to the buffer line by line, via RCS patch. Other changes: + +format-region function was removed (replaced by +format-buffer and +format/region). + set-formatter! was moved to autoload/settings.el + New +format/buffer command to replace format-all-buffer --- modules/editor/format/autoload/evil.el | 4 +- modules/editor/format/autoload/format.el | 321 +++++++++------------ modules/editor/format/autoload/settings.el | 134 +++++++++ 3 files changed, 266 insertions(+), 193 deletions(-) create mode 100644 modules/editor/format/autoload/settings.el diff --git a/modules/editor/format/autoload/evil.el b/modules/editor/format/autoload/evil.el index 72cb0bc36..298056f47 100644 --- a/modules/editor/format/autoload/evil.el +++ b/modules/editor/format/autoload/evil.el @@ -3,6 +3,6 @@ ;;;###autoload (autoload '+format:region "editor/format/autoload/evil" nil t) (evil-define-operator +format:region (beg end type) - "Evil ex interface to `+format-region'." + "Evil ex interface to `+format/region'." (interactive "") - (+format-region beg end)) + (+format/region beg end)) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 95ff949c8..a157f61ac 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -1,196 +1,105 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- +;; Stolen shamelessly from go-mode +(defun +format--delete-whole-line (&optional arg) + "Delete the current line without putting it in the `kill-ring'. +Derived from function `kill-whole-line'. ARG is defined as for that +function." + (setq arg (or arg 1)) + (if (and (> arg 0) + (eobp) + (save-excursion (forward-visible-line 0) (eobp))) + (signal 'end-of-buffer nil)) + (if (and (< arg 0) + (bobp) + (save-excursion (end-of-visible-line) (bobp))) + (signal 'beginning-of-buffer nil)) + (cond ((zerop arg) + (delete-region (progn (forward-visible-line 0) (point)) + (progn (end-of-visible-line) (point)))) + ((< arg 0) + (delete-region (progn (end-of-visible-line) (point)) + (progn (forward-visible-line (1+ arg)) + (unless (bobp) + (backward-char)) + (point)))) + ((delete-region (progn (forward-visible-line 0) (point)) + (progn (forward-visible-line arg) (point)))))) + +;; Stolen shamelessly from go-mode ;;;###autoload -(defun +format--resolve-system (choices) - "Get first choice matching `format-all-system-type' from CHOICES." - (cl-loop for choice in choices - if (atom choice) return choice - else if (eql format-all-system-type (car choice)) - return (cadr choice))) +(defun +format--apply-rcs-patch (patch-buffer) + "Apply an RCS-formatted diff from PATCH-BUFFER to the current buffer." + (let ((target-buffer (current-buffer)) + ;; Relative offset between buffer line numbers and line numbers + ;; in patch. + ;; + ;; Line numbers in the patch are based on the source file, so + ;; we have to keep an offset when making changes to the + ;; buffer. + ;; + ;; Appending lines decrements the offset (possibly making it + ;; negative), deleting lines increments it. This order + ;; simplifies the forward-line invocations. + (line-offset 0) + (column (current-column))) + (save-excursion + (with-current-buffer patch-buffer + (goto-char (point-min)) + (while (not (eobp)) + (unless (looking-at "^\\([ad]\\)\\([0-9]+\\) \\([0-9]+\\)") + (error "Invalid rcs patch or internal error in +format--apply-rcs-patch")) + (forward-line) + (let ((action (match-string 1)) + (from (string-to-number (match-string 2))) + (len (string-to-number (match-string 3)))) + (cond + ((equal action "a") + (let ((start (point))) + (forward-line len) + (let ((text (buffer-substring start (point)))) + (with-current-buffer target-buffer + (cl-decf line-offset len) + (goto-char (point-min)) + (forward-line (- from len line-offset)) + (insert text))))) + ((equal action "d") + (with-current-buffer target-buffer + (goto-char (point-min)) + (forward-line (1- (- from line-offset))) + (cl-incf line-offset len) + (+format--delete-whole-line len))) + ((error "Invalid rcs patch or internal error in +format--apply-rcs-patch"))))))) + (move-to-column column))) -;;;###autodef -(cl-defun set-formatter! (modes formatter &key - name - install - filter - ok-statuses - error-regexp) - "Define a FORMATTER for MODES. -MODES can be a major mode symbol, a vector of major modes, or a vector of -two-element vectors made up of [MAJOR-MODE FORM]. FORM is evaluated when the -buffer is formatted and its return value is a predicate for this formatter. Its -return value is stored in If it is non-nil, this formatter is used. Its return -value is stored in the `mode-result' variable for FORMATTER (if it's not a -string). - -FORMATTER can be a function, string or nested vector. - - If a function, it should be a formatter function that - `format-all-buffer-thunk' will accept. - If a string, it is assumed to be a shell command that the text will be piped - to (stdin). - If a vector, it should represent a shell command as a list of arguments. Each - element is either a string or vector [STRING ARG] where STRING is a format - string and ARG is both a predicate and argument for STRING. If ARG is nil, - STRING will be omitted from the vector. - -NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME will -default to \"default\". - -INSTALL should be a string representing the shell command necessary to install -this formatter's dependencies. INSTALL can also be a list of lists made up of -two items: (OS COMMAND). - -Basic examples: - - (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") - (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") - -Advanced examples: - - (set-formatter! - '((c-mode \".c\") - (c++-mode \".cpp\") - (java-mode \".java\") - (objc-mode \".m\") - (protobuf-mode \".proto\")) - '(\"clang-format\" - (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) - :install '(macos \"brew install clang-format\")) - - (set-formatter! - '(html-mode - (web-mode (and (equal \"none\" web-mode-engine) - (car (member web-mode-content-type '(\"xml\" \"html\")))))) - '(\"tidy\" \"-q\" \"-indent\" - (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) - :ok-statuses '(0 1) - :install '(macos \"brew install tidy-html5\")) - - (set-formatter! 'elm-mode - \"elm-format --yes --stdin\" - :install '(macos \"brew install elm\") - :filter - (lambda (output errput first-diff) - (list output - (format-all-remove-ansi-color errput) - first-diff)))" - (declare (indent defun)) - (cl-check-type name (or symbol null)) - (let* ((command-list (cond ((stringp formatter) ; shell command - (split-string formatter " " t)) - ((listp formatter) ; shell command in lists - formatter))) - (name (cond (name) - ((car command-list) (intern (car command-list))) - ((symbolp formatter) formatter) - ((user-error "Anonymous formatter requires a :name")))) - (fn (lambda (executable mode-result) - (let ((result - (cond ((commandp formatter) - (let ((mode major-mode) - (file buffer-file-name) - (dir default-directory)) - (format-all-buffer-thunk - (lambda (input) - (with-silent-modifications - (setq buffer-file-name file - default-directory dir) - (delay-mode-hooks (funcall mode)) - (insert input) - (condition-case e - (progn - (call-interactively formatter) - (list nil "")) - (error (list t (error-message-string e))))))))) - ((functionp formatter) - (format-all-buffer-thunk formatter)) - ((cl-loop for arg in command-list - if (stringp arg) - collect arg into args - else if (eval (cadr arg) t) - collect (format (car arg) it) into args - finally do - (if (or ok-statuses error-regexp) - (apply #'format-all-buffer-hard ok-statuses error-regexp args) - (apply #'format-all-buffer-easy args))))))) - (if filter - (apply filter result) - result)))) - (install (cond ((null install) install) - ((listp install) - (cdr (assq (+format--resolve-system) install))) - (install)))) - (after! format-all - (puthash name fn format-all-format-table) - (puthash name install format-all-install-table) - (puthash name (car command-list) format-all-executable-table) - (dolist (mode (doom-enlist modes)) - (cl-destructuring-bind (m &optional probe) - (doom-enlist mode) - (format-all-pushhash - m (cons name (if probe `(lambda () ,probe))) - format-all-mode-table)))) - name)) +;; +;; Public library +;; ;;;###autoload -(defun +format-region (beg end) - "Runs the active formatter on the selected region." - (cl-check-type beg integer) - (cl-check-type end integer) - ;; TODO Refactor me - ;; Hack ahoy! We force format-all (and the programs it delegates to) to only - ;; format a region rather than the whole buffer. +(defun +format-buffer () + "Auto-format the source code in the current buffer." + (interactive) (require 'format-all) - (save-restriction - (cl-destructuring-bind (formatter mode-result) (format-all-probe) - (unless formatter - (user-error "Don't know how to format %S code" major-mode)) - (let* ((beg (save-excursion (goto-char beg) (line-beginning-position))) - (end (save-excursion (goto-char end) - (if (bolp) (backward-char)) - (line-end-position))) - (file buffer-file-name) - (dir default-directory) - (mode major-mode) - (input (buffer-substring-no-properties beg end)) - (leading-indent 0) - final-output) - (with-temp-buffer - (with-silent-modifications - (setq buffer-file-name file - default-directory dir) - (delay-mode-hooks (funcall mode)) - (save-excursion (insert input)) - (setq leading-indent (current-indentation)) - (indent-rigidly (point-min) (point-max) (- leading-indent)) - ;; From `format-all-buffer' - (let ((f-function (gethash formatter format-all-format-table)) - (executable (format-all-formatter-executable formatter))) - (cl-destructuring-bind (output errput first-diff) - (funcall f-function executable mode-result) - (cl-case output - ((nil) - (message "Syntax error")) - ((t) - (message "Already formatted")) - (t - (erase-buffer) - (insert output) - (indent-rigidly (point-min) (point-max) leading-indent) - (setq final-output (string-trim-right (buffer-string))))) - (with-current-buffer (get-buffer-create "*format-all-errors*") - (erase-buffer) - (unless (= 0 (length errput)) - (insert errput) - (display-buffer (current-buffer))))))))) - (when final-output - (message "Reformatted!") - (save-excursion - (goto-char beg) - (delete-region beg end) - (insert final-output)))))) + (cl-destructuring-bind (formatter mode-result) (format-all-probe) + (unless formatter + (error "Don't know how to format %S code" major-mode)) + (let ((f-function (gethash formatter format-all-format-table)) + (executable (format-all-formatter-executable formatter))) + (cl-destructuring-bind (output errput first-diff) + (funcall f-function executable mode-result) + (prog1 (cl-case output + ((nil) 'error) + ((t) 'noop) + (t (erase-buffer) + (insert output) + (list output errput first-diff))) + (with-current-buffer (get-buffer-create "*format-all-errors*") + (erase-buffer) + (unless (= 0 (length errput)) + (insert errput) + (display-buffer (current-buffer))))))))) ;; @@ -198,7 +107,10 @@ Advanced examples: ;; ;;;###autoload -(defalias '+format/buffer 'format-all-buffer) +(defun +format/buffer () + "TODO" + (interactive) + (+format|buffer)) ;;;###autoload (defun +format/region (beg end) @@ -208,7 +120,9 @@ WARNING: this may not work everywhere. It will throw errors if the region contains a syntax error in isolation. It is mostly useful for formatting snippets or single lines." (interactive "r") - (+format-region beg end)) + (save-restriction + (narrow-to-region beg end) + (+format/buffer))) ;;;###autoload (defun +format/region-or-buffer (beg end) @@ -216,8 +130,8 @@ snippets or single lines." is selected)." (interactive "r") (if (use-region-p) - (+format-region beg end) - (format-all-buffer))) + (+format/region beg end) + (+format/buffer))) ;; @@ -231,5 +145,30 @@ is selected)." ;;;###autoload (defun +format|buffer () - "Runs `format-all-buffer' immediately, without moving the cursor." - (save-excursion (format-all-buffer))) + "TODO" + (let ((tmpfile (make-temp-file "doom_format")) + (patchbuf (get-buffer-create " *doom format patch*")) + (mode major-mode) + (file buffer-file-name) + (dir default-directory) + (coding-system-for-read 'utf-8) + (coding-system-for-write 'utf-8)) + (unwind-protect + (save-restriction + (with-current-buffer patchbuf (erase-buffer)) + (quiet! (write-region (point-min) (point-max) tmpfile)) + (pcase (with-current-buffer (find-file-noselect tmpfile t) + (delay-mode-hooks (funcall mode)) + (setq buffer-file-name file + default-directory dir) + (quiet! (+format-buffer)) + (quiet! (write-region nil nil tmpfile))) + (`noop (message "Buffer is already formatted")) + (`error (message "Couldn't format the buffer due to errors")) + (_ (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) + (message "Buffer is already formatted") + (+format--apply-rcs-patch patchbuf) + (message "Formatted buffer"))))) + (kill-buffer patchbuf) + (delete-file tmpfile)))) + diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el new file mode 100644 index 000000000..7215d0e42 --- /dev/null +++ b/modules/editor/format/autoload/settings.el @@ -0,0 +1,134 @@ +;;; editor/format/autoload/settings.el -*- lexical-binding: t; -*- + +(defun +format--resolve-system (choices) + "Get first choice matching `format-all-system-type' from CHOICES." + (cl-loop for choice in choices + if (atom choice) return choice + else if (eql format-all-system-type (car choice)) + return (cadr choice))) + +;;;###autodef +(cl-defun set-formatter! (modes formatter &key + name + install + filter + ok-statuses + error-regexp) + "Define a FORMATTER for MODES. + +MODES can be a major mode symbol, a vector of major modes, or a vector of +two-element vectors made up of [MAJOR-MODE FORM]. FORM is evaluated when the +buffer is formatted and its return value is a predicate for this formatter. Its +return value is stored in If it is non-nil, this formatter is used. Its return +value is stored in the `mode-result' variable for FORMATTER (if it's not a +string). + +FORMATTER can be a function, string or nested vector. + + If a function, it should be a formatter function that + `format-all-buffer-thunk' will accept. + If a string, it is assumed to be a shell command that the text will be piped + to (stdin). + If a vector, it should represent a shell command as a list of arguments. Each + element is either a string or vector [STRING ARG] where STRING is a format + string and ARG is both a predicate and argument for STRING. If ARG is nil, + STRING will be omitted from the vector. + +NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME will +default to \"default\". + +INSTALL should be a string representing the shell command necessary to install +this formatter's dependencies. INSTALL can also be a list of lists made up of +two items: (OS COMMAND). + +Basic examples: + + (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") + (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") + +Advanced examples: + + (set-formatter! + '((c-mode \".c\") + (c++-mode \".cpp\") + (java-mode \".java\") + (objc-mode \".m\") + (protobuf-mode \".proto\")) + '(\"clang-format\" + (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) + :install '(macos \"brew install clang-format\")) + + (set-formatter! + '(html-mode + (web-mode (and (equal \"none\" web-mode-engine) + (car (member web-mode-content-type '(\"xml\" \"html\")))))) + '(\"tidy\" \"-q\" \"-indent\" + (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) + :ok-statuses '(0 1) + :install '(macos \"brew install tidy-html5\")) + + (set-formatter! 'elm-mode + \"elm-format --yes --stdin\" + :install '(macos \"brew install elm\") + :filter + (lambda (output errput first-diff) + (list output + (format-all-remove-ansi-color errput) + first-diff)))" + (declare (indent defun)) + (cl-check-type name (or symbol null)) + (let* ((command-list (cond ((stringp formatter) ; shell command + (split-string formatter " " t)) + ((listp formatter) ; shell command in lists + formatter))) + (name (cond (name) + ((car command-list) (intern (car command-list))) + ((symbolp formatter) formatter) + ((user-error "Anonymous formatter requires a :name")))) + (fn (lambda (executable mode-result) + (let ((result + (cond ((commandp formatter) + (let ((mode major-mode) + (file buffer-file-name) + (dir default-directory)) + (format-all-buffer-thunk + (lambda (input) + (with-silent-modifications + (setq buffer-file-name file + default-directory dir) + (delay-mode-hooks (funcall mode)) + (insert input) + (condition-case e + (progn + (call-interactively formatter) + (list nil "")) + (error (list t (error-message-string e))))))))) + ((functionp formatter) + (format-all-buffer-thunk formatter)) + ((cl-loop for arg in command-list + if (stringp arg) + collect arg into args + else if (eval (cadr arg) t) + collect (format (car arg) it) into args + finally do + (if (or ok-statuses error-regexp) + (apply #'format-all-buffer-hard ok-statuses error-regexp args) + (apply #'format-all-buffer-easy args))))))) + (if filter + (apply filter result) + result)))) + (install (cond ((null install) install) + ((listp install) + (cdr (assq (+format--resolve-system) install))) + (install)))) + (after! format-all + (puthash name fn format-all-format-table) + (puthash name install format-all-install-table) + (puthash name (car command-list) format-all-executable-table) + (dolist (mode (doom-enlist modes)) + (cl-destructuring-bind (m &optional probe) + (doom-enlist mode) + (format-all-pushhash + m (cons name (if probe `(lambda () ,probe))) + format-all-mode-table)))) + name)) From 6e03ddacdafc7835600f8c37c0bb6b619c7670c0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 15:56:59 +0200 Subject: [PATCH 2944/4235] Update & revise set-formatter! docstring --- modules/editor/format/autoload/settings.el | 61 ++++++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el index 7215d0e42..cfb162943 100644 --- a/modules/editor/format/autoload/settings.el +++ b/modules/editor/format/autoload/settings.el @@ -1,10 +1,24 @@ ;;; editor/format/autoload/settings.el -*- lexical-binding: t; -*- +(defconst +format-system-type + (cl-case system-type + (windows-nt 'windows) + (cygwin 'windows) + (darwin 'macos) + (gnu/linux 'linux) + (berkeley-unix + (save-match-data + (let ((case-fold-search t)) + (cond ((string-match "freebsd" system-configuration) 'freebsd) + ((string-match "openbsd" system-configuration) 'openbsd) + ((string-match "netbsd" system-configuration) 'netbsd)))))) + "Current operating system according to the format-all package.") + (defun +format--resolve-system (choices) "Get first choice matching `format-all-system-type' from CHOICES." (cl-loop for choice in choices if (atom choice) return choice - else if (eql format-all-system-type (car choice)) + else if (eql +format-system-type (car choice)) return (cadr choice))) ;;;###autodef @@ -16,30 +30,43 @@ error-regexp) "Define a FORMATTER for MODES. -MODES can be a major mode symbol, a vector of major modes, or a vector of -two-element vectors made up of [MAJOR-MODE FORM]. FORM is evaluated when the -buffer is formatted and its return value is a predicate for this formatter. Its -return value is stored in If it is non-nil, this formatter is used. Its return -value is stored in the `mode-result' variable for FORMATTER (if it's not a -string). +MODES can be a major mode symbol, a list of major modes, or a list of +two-element lists made up of (MAJOR-MODE FORM). FORM is evaluated when the +buffer is formatted and its return value serves two roles: -FORMATTER can be a function, string or nested vector. +1. It is a predicate for this formatter. If it returns non-nil (and MAJOR-MODE + matches the current mode), that formatter is used. +2. Its return value is stored in the `mode-result' variable for FORMATTER (if + it's a function). + +FORMATTER can be a function, string or nested list. If a function, it should be a formatter function that `format-all-buffer-thunk' will accept. - If a string, it is assumed to be a shell command that the text will be piped - to (stdin). - If a vector, it should represent a shell command as a list of arguments. Each - element is either a string or vector [STRING ARG] where STRING is a format + If a string, it is assumed to be a shell command that the buffer's text will + be piped to (through stdin). + If a list, it should represent a shell command as a list of arguments. Each + element is either a string or list (STRING ARG) where STRING is a format string and ARG is both a predicate and argument for STRING. If ARG is nil, STRING will be omitted from the vector. -NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME will -default to \"default\". +NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME is +required. -INSTALL should be a string representing the shell command necessary to install -this formatter's dependencies. INSTALL can also be a list of lists made up of -two items: (OS COMMAND). +INSTALL is a string representing the shell command to install this formatter's +dependencies. INSTALL can also be a list of lists made up of two items: (OS +COMMAND). OS can be windows, macos, linux, freebsd, openbsd or netbsd. + +FILTER is a function that takes three arguments: the formatted output, any error +output and the position of the first change, and must return these three after +making whatever changes you like to them. This might be useful if the output +contains ANSI color codes that need to be stripped out (as is the case with +elm-format). + +OK-STATUSES is a list of integer exit codes that should be treated as success +codes. However, if ERROR-REGEXP is given, and the program's stderr contains that +regexp, then the formatting is considered failed even if the exit status is in +OK-STATUSES. Basic examples: From d24fce1dcd3e3ecf712a93333f715e59cce9ce0c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 16:45:09 +0200 Subject: [PATCH 2945/4235] Fix void-variable org-capture-is-refiling error In case org-capture.el isn't loaded when org-refile is used. --- modules/lang/org/+capture.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 988b71400..4c7025664 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -37,7 +37,7 @@ ;; fix #462: when refiling from org-capture, Emacs prompts to kill the ;; underlying, modified buffer. This fixes that. (defun +org-capture*refile (&rest _) - (when org-capture-is-refiling + (when (bound-and-true-p org-capture-is-refiling) (org-save-all-org-buffers))) (advice-add 'org-refile :after #'+org-capture*refile) From fd9a3c36ee824b79703643b74f1a98ca7291a3aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 17:02:49 +0200 Subject: [PATCH 2946/4235] editor/format: refactor (again) --- modules/editor/format/autoload/format.el | 87 ++++++++++++------------ 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index a157f61ac..881445dba 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -72,6 +72,19 @@ function." ((error "Invalid rcs patch or internal error in +format--apply-rcs-patch"))))))) (move-to-column column))) +(defun +format--with-copy-of-buffer (formatter executable mode-result) + "Run formatter in a copy of the current buffer. + +Since `format-all' functions (and various formatting functions, like `gofmt') +widen the buffer, in order to only format a region of text, we must make a copy +of the buffer to apply formatting to." + (if (buffer-narrowed-p) + (let ((output (buffer-substring-no-properties (point-min) (point-max)))) + (with-temp-buffer + (insert output) + (funcall formatter executable mode-result))) + (funcall formatter executable mode-result))) + ;; ;; Public library @@ -79,27 +92,39 @@ function." ;;;###autoload (defun +format-buffer () - "Auto-format the source code in the current buffer." - (interactive) + "Format the source code in the current buffer. + +See `+format/buffer' for the interactive version of this function, and +`+format|buffer' to use as a `before-save-hook' hook." (require 'format-all) - (cl-destructuring-bind (formatter mode-result) (format-all-probe) + (cl-destructuring-bind (formatter mode-result) + (format-all-probe) (unless formatter (error "Don't know how to format %S code" major-mode)) (let ((f-function (gethash formatter format-all-format-table)) (executable (format-all-formatter-executable formatter))) (cl-destructuring-bind (output errput first-diff) - (funcall f-function executable mode-result) - (prog1 (cl-case output - ((nil) 'error) - ((t) 'noop) - (t (erase-buffer) - (insert output) - (list output errput first-diff))) - (with-current-buffer (get-buffer-create "*format-all-errors*") - (erase-buffer) - (unless (= 0 (length errput)) - (insert errput) - (display-buffer (current-buffer))))))))) + (+format--with-copy-of-buffer f-function executable mode-result) + (unwind-protect + (cond ((null output) 'error) + ((eq output t) 'noop) + ((let ((tmpfile (make-temp-file "doom_format")) + (patchbuf (get-buffer-create " *doom format patch*")) + (coding-system-for-read 'utf-8) + (coding-system-for-write 'utf-8)) + (unwind-protect + (progn + (with-current-buffer patchbuf (erase-buffer)) + (with-temp-file tmpfile (erase-buffer) (insert output)) + (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) + (message "Buffer is already formatted") + (+format--apply-rcs-patch patchbuf) + (message "Formatted buffer with %s" formatter))) + (kill-buffer patchbuf) + (delete-file tmpfile)) + (list output errput first-diff)))) + (unless (= 0 (length errput)) + (message "Formatter error output:\n%s" errput))))))) ;; @@ -108,9 +133,9 @@ function." ;;;###autoload (defun +format/buffer () - "TODO" + "Format the source code in the current buffer." (interactive) - (+format|buffer)) + (+format-buffer)) ;;;###autoload (defun +format/region (beg end) @@ -144,31 +169,5 @@ is selected)." (add-hook 'before-save-hook #'+format|buffer nil t)) ;;;###autoload -(defun +format|buffer () - "TODO" - (let ((tmpfile (make-temp-file "doom_format")) - (patchbuf (get-buffer-create " *doom format patch*")) - (mode major-mode) - (file buffer-file-name) - (dir default-directory) - (coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8)) - (unwind-protect - (save-restriction - (with-current-buffer patchbuf (erase-buffer)) - (quiet! (write-region (point-min) (point-max) tmpfile)) - (pcase (with-current-buffer (find-file-noselect tmpfile t) - (delay-mode-hooks (funcall mode)) - (setq buffer-file-name file - default-directory dir) - (quiet! (+format-buffer)) - (quiet! (write-region nil nil tmpfile))) - (`noop (message "Buffer is already formatted")) - (`error (message "Couldn't format the buffer due to errors")) - (_ (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) - (message "Buffer is already formatted") - (+format--apply-rcs-patch patchbuf) - (message "Formatted buffer"))))) - (kill-buffer patchbuf) - (delete-file tmpfile)))) +(defalias '+format|buffer #'+format-buffer) From 48948f725f092be1346b23c9a0f2988e37639681 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 17:17:01 +0200 Subject: [PATCH 2947/4235] Enable +javascript-npm-mode in rjsx-mode too --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index f57d1e34e..18587951c 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -248,7 +248,7 @@ :files ("gulpfile.js")) (def-project-mode! +javascript-npm-mode - :modes (html-mode css-mode web-mode js2-mode json-mode markdown-mode) + :modes (html-mode css-mode web-mode js2-mode rjsx-mode json-mode markdown-mode) :files ("package.json") :add-hooks (+javascript|add-node-modules-path)) From 0fc9b6be91be69c2d0abe6b272aa062ac0d297ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 29 Aug 2018 23:01:59 +0200 Subject: [PATCH 2948/4235] Improve patch-macos wrapper script Reported to produce better results. --- core/core-cli.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index 8a9fd717b..3865a0829 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -391,10 +391,10 @@ packages and regenerates the autoloads file." (unless (file-exists-p newbin) (error "Failed to copy %s to %s" oldbin newbin)) (with-temp-buffer - (insert "#!/usr/bin/env bash\n" + (insert "#!/bin/bash\n" "args=\"$@\"\n" "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"\n" - "exec \"$SHELL\" -c \"$pwd/RunEmacs $args\"") + "exec \"$SHELL\" -l -c \"$pwd/RunEmacs $args\"") (write-file oldbin) (chmod oldbin (file-modes newbin))) (message "%s successfully patched" appdir))))) From cc1b0f7ee67c82b6b6ec5e9bd668087c6641b51c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 00:42:34 +0200 Subject: [PATCH 2949/4235] Show comparison diff link on bin/doom upgrade --- core/core-cli.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-cli.el b/core/core-cli.el index 3865a0829..94491abd7 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -286,6 +286,8 @@ problems with doom." (user-error "Doom is up to date!")) (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" current-rev rev) + (message "Comparision diff: https://github.com/hlissner/doom-emacs/compare/%s...%s\n" + (substring rev 0 10) (substring current-rev 0 10)) ;; TODO Display newsletter diff (unless (or doom-auto-accept (y-or-n-p "Proceed?")) (user-error "Aborted")) From 60c03a78d90056c7f88c6eaad1bf8534ade8d901 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 13:11:18 +0200 Subject: [PATCH 2950/4235] Fix void-function treemacs-current-visibility error Tried to use a function before it was defined. --- modules/ui/treemacs/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index b34f34d19..696bd0cb9 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -25,6 +25,7 @@ been removed. Use `treemacs' command for old functionality." (interactive) + (require 'treemacs) (pcase (treemacs-current-visibility) (`visible (delete-window (treemacs-get-local-window))) (_ (+treemacs--init)))) From 76163166345e60b7e34f93e6c35d719641fff8b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 13:12:44 +0200 Subject: [PATCH 2951/4235] editor/format: improve message feedback Announce failures, noops and successes clearly, and log errors. --- modules/editor/format/autoload/format.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 881445dba..fc4b9d380 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -108,7 +108,7 @@ See `+format/buffer' for the interactive version of this function, and (unwind-protect (cond ((null output) 'error) ((eq output t) 'noop) - ((let ((tmpfile (make-temp-file "doom_format")) + ((let ((tmpfile (make-temp-file "doom-format")) (patchbuf (get-buffer-create " *doom format patch*")) (coding-system-for-read 'utf-8) (coding-system-for-write 'utf-8)) @@ -117,12 +117,11 @@ See `+format/buffer' for the interactive version of this function, and (with-current-buffer patchbuf (erase-buffer)) (with-temp-file tmpfile (erase-buffer) (insert output)) (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) - (message "Buffer is already formatted") + 'noop (+format--apply-rcs-patch patchbuf) - (message "Formatted buffer with %s" formatter))) - (kill-buffer patchbuf) - (delete-file tmpfile)) - (list output errput first-diff)))) + (list output errput first-diff)))) + (kill-buffer patchbuf) + (delete-file tmpfile)))) (unless (= 0 (length errput)) (message "Formatter error output:\n%s" errput))))))) @@ -135,7 +134,10 @@ See `+format/buffer' for the interactive version of this function, and (defun +format/buffer () "Format the source code in the current buffer." (interactive) - (+format-buffer)) + (pcase (+format-buffer) + (`error (message "Failed to format buffer due to errors")) + (`noop (message "Buffer was already formatted")) + (_ (message "Formatted (%s)" (car (format-all-probe)))))) ;;;###autoload (defun +format/region (beg end) From 068cf5f7d42a8df9245c7536b762c5abcfe57f27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 13:13:32 +0200 Subject: [PATCH 2952/4235] Rename +evil|save-buffer to be self-explanitory +evil|disable-vimlike-save-message --- modules/feature/evil/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index dda2e9a76..4b71fae9f 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -86,7 +86,7 @@ line with a linewise comment.") ;; --- evil hacks ------------------------- - (defun +evil|save-buffer () + (defun +evil|display-vimlike-save-message () "Shorter, vim-esque save messages." (message "\"%s\" %dL, %dC written" (if buffer-file-name @@ -96,7 +96,7 @@ line with a linewise comment.") (buffer-size))) (unless noninteractive (setq save-silently t) - (add-hook 'after-save-hook #'+evil|save-buffer)) + (add-hook 'after-save-hook #'+evil|display-vimlike-save-message)) ;; Make ESC (from normal mode) the universal escaper. See `doom-escape-hook'. (advice-add #'evil-force-normal-state :after #'+evil*escape) ;; Don't move cursor when indenting From 895cf136d55045161d493f4bf7026486de093828 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 13:14:07 +0200 Subject: [PATCH 2953/4235] Ensure evil popup rules are defined later Otherwise they fall before ui/popup's fallback rules in display-buffer-alist --- modules/feature/evil/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 4b71fae9f..23497ce47 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -44,9 +44,11 @@ line with a linewise comment.") (put 'evil-define-key* 'lisp-indent-function 'defun) - (set-popup-rules! - '(("^\\*evil-registers" :size 0.3) - ("^\\*Command Line" :size 8))) + (defun +evil|init-popup-rules () + (set-popup-rules! + '(("^\\*evil-registers" :size 0.3) + ("^\\*Command Line" :size 8)))) + (add-hook 'doom-post-init-hook #'+evil|init-popup-rules) ;; Change the cursor color in emacs mode (defvar +evil--default-cursor-color "#ffffff") From 25cc01ce41309b1f9108c8f557caff94ced9b43e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 13:28:43 +0200 Subject: [PATCH 2954/4235] Fix & refactor doom/open-vanilla-sandbox It would fail to run the new instance because the arguments send to it were incorrectly formatted. --- core/autoload/debug.el | 57 +++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 8203ceae8..cd963b9fa 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -144,39 +144,37 @@ pasting into a bug report or discord." (defun doom--run-vanilla-sandbox (&optional load-doom-p) (interactive) (let ((contents (buffer-string)) - (file (make-temp-file "/tmp/doom-eval-"))) - (with-temp-file file (insert contents)) - (require 'restart-emacs) - (let* ((args - (append '("-Q") - (if load-doom-p - `("--eval" (setq doom-private-dir "/tmp/does/not/exist" - doom-modules ,doom-modules) - "-l" user-init-file) - `("--eval" (setq user-emacs-directory ,doom-emacs-dir - package--init-file-ensured t - package-user-dir ,package-user-dir - package-archives ',package-archives) - "--eval" (package-initialize))) - ;; Clean up temp file afterwards - `("--eval" (unwind-protect (load ,file) (delete-file ,file))))) - (formatted-args - (mapcar #'shell-quote-argument - (cl-loop for arg in (delq nil args) - if (stringp arg) collect arg - else collect (prin1-to-string arg))))) - (condition-case _ + (file (make-temp-file "doom-sandbox-"))) + (with-temp-file file + (insert + (prin1-to-string + `(cond (,load-doom-p + (setq doom-private-dir "/tmp/does/not/exist" + doom-modules ,doom-modules) + (load ,user-init-file)) + ((setq package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives + user-emacs-directory ,doom-emacs-dir) + (package-initialize)))) + "\n(unwind-protect (progn\n" contents "\n)\n" + (format "(delete-file %S))" file))) + (let ((args (list "-Q" "-l" file))) + (require 'restart-emacs) + (condition-case e (cond ((display-graphic-p) (if (memq system-type '(windows-nt ms-dos)) - (restart-emacs--start-gui-on-windows formatted-args) - (restart-emacs--start-gui-using-sh formatted-args))) + (restart-emacs--start-gui-on-windows args) + (restart-emacs--start-gui-using-sh args))) ((memq system-type '(windows-nt ms-dos)) (user-error "Cannot start another Emacs from Windows shell.")) ((suspend-emacs (format "%s %s -nw; fg" (shell-quote-argument (restart-emacs--get-emacs-binary)) - (string-join formatted-args " "))))) - (error (delete-file file)))))) + (string-join (mapcar #'shell-quote-argument args) " "))))) + (error + (delete-file file) + (signal (car e) (cdr e))))))) (defun doom--run-vanilla-doom-sandbox () (interactive) @@ -190,7 +188,9 @@ optionally load only Doom and its modules, without your private config). This provides a testbed for debugging code without Doom (or your private config) standing in the way, and without sacrificing access to installed packages." (interactive) - (let ((buf (get-buffer-create "*doom:vanilla-sandbox*"))) + (let* ((buffer-name "*doom:vanilla-sandbox*") + (exists (get-buffer buffer-name)) + (buf (get-buffer-create buffer-name))) (with-current-buffer buf (emacs-lisp-mode) (local-set-key (kbd "C-c C-c") #'doom--run-vanilla-sandbox) @@ -198,7 +198,8 @@ standing in the way, and without sacrificing access to installed packages." (local-set-key (kbd "C-c C-k") #'kill-this-buffer) (setq header-line-format "C-c C-c to run the session / C-c C-d to run it with vanilla Doom loaded / C-c C-k to abort it") (setq-local default-directory doom-emacs-dir) - (doom-template-insert "VANILLA_SANDBOX") + (unless (buffer-live-p exists) + (doom-template-insert "VANILLA_SANDBOX")) (goto-char (point-max))) (pop-to-buffer buf))) From 2d21f1af6df2075084155692694bfcab1b6aa9c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 13:36:21 +0200 Subject: [PATCH 2955/4235] Fix comparison link for `doom upgrade` The hashes were the wrong way around. --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 94491abd7..f269c53c8 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -287,7 +287,7 @@ problems with doom." (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" current-rev rev) (message "Comparision diff: https://github.com/hlissner/doom-emacs/compare/%s...%s\n" - (substring rev 0 10) (substring current-rev 0 10)) + (substring current-rev 0 10) (substring rev 0 10)) ;; TODO Display newsletter diff (unless (or doom-auto-accept (y-or-n-p "Proceed?")) (user-error "Aborted")) From 1ae3523f751917e49e26fe39d78dd87e7e2bbcc3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 14:44:37 +0200 Subject: [PATCH 2956/4235] editor/format: autoload format-all-probe #834 --- modules/editor/format/autoload/format.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index fc4b9d380..029684331 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -1,5 +1,8 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- +;;;###autoload +(autoload 'format-all-probe "format-all") + ;; Stolen shamelessly from go-mode (defun +format--delete-whole-line (&optional arg) "Delete the current line without putting it in the `kill-ring'. From 1b4040229e81a7c869dda210cbc9c8b768aaa578 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 14:56:50 +0200 Subject: [PATCH 2957/4235] editor/format: update documentation --- modules/editor/format/autoload/format.el | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 029684331..b4b64aa94 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -3,11 +3,12 @@ ;;;###autoload (autoload 'format-all-probe "format-all") -;; Stolen shamelessly from go-mode (defun +format--delete-whole-line (&optional arg) "Delete the current line without putting it in the `kill-ring'. Derived from function `kill-whole-line'. ARG is defined as for that -function." +function. + +Stolen shamelessly from go-mode" (setq arg (or arg 1)) (if (and (> arg 0) (eobp) @@ -29,10 +30,11 @@ function." ((delete-region (progn (forward-visible-line 0) (point)) (progn (forward-visible-line arg) (point)))))) -;; Stolen shamelessly from go-mode ;;;###autoload (defun +format--apply-rcs-patch (patch-buffer) - "Apply an RCS-formatted diff from PATCH-BUFFER to the current buffer." + "Apply an RCS-formatted diff from PATCH-BUFFER to the current buffer. + +Stolen shamelessly from go-mode" (let ((target-buffer (current-buffer)) ;; Relative offset between buffer line numbers and line numbers ;; in patch. @@ -97,6 +99,16 @@ of the buffer to apply formatting to." (defun +format-buffer () "Format the source code in the current buffer. +Returns any of the following values: + + 'unknown No formatter is defined for this major-mode + 'error Couldn't format buffer due to formatter errors + 'noop Buffer is already formatted + +Otherwise, returns a list: (list OUTPUT ERRORS FIRST-DIFF), where OUTPUT is the +formatted text, ERRORS are any errors in string format, and FIRST-DIFF is the +position of the first change in the buffer. + See `+format/buffer' for the interactive version of this function, and `+format|buffer' to use as a `before-save-hook' hook." (require 'format-all) From 349fb49c7b8ff61fa5c0531d27b8f48ffb0ab28f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 14:57:31 +0200 Subject: [PATCH 2958/4235] editor/format: refactor +format-buffer & users --- modules/editor/format/autoload/format.el | 70 ++++++++++++------------ 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index b4b64aa94..49110377d 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -96,7 +96,7 @@ of the buffer to apply formatting to." ;; ;;;###autoload -(defun +format-buffer () +(defun +format-buffer (formatter mode-result) "Format the source code in the current buffer. Returns any of the following values: @@ -111,34 +111,31 @@ position of the first change in the buffer. See `+format/buffer' for the interactive version of this function, and `+format|buffer' to use as a `before-save-hook' hook." - (require 'format-all) - (cl-destructuring-bind (formatter mode-result) - (format-all-probe) - (unless formatter - (error "Don't know how to format %S code" major-mode)) - (let ((f-function (gethash formatter format-all-format-table)) - (executable (format-all-formatter-executable formatter))) - (cl-destructuring-bind (output errput first-diff) - (+format--with-copy-of-buffer f-function executable mode-result) - (unwind-protect - (cond ((null output) 'error) - ((eq output t) 'noop) - ((let ((tmpfile (make-temp-file "doom-format")) - (patchbuf (get-buffer-create " *doom format patch*")) - (coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8)) - (unwind-protect - (progn - (with-current-buffer patchbuf (erase-buffer)) - (with-temp-file tmpfile (erase-buffer) (insert output)) - (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) - 'noop - (+format--apply-rcs-patch patchbuf) - (list output errput first-diff)))) - (kill-buffer patchbuf) - (delete-file tmpfile)))) - (unless (= 0 (length errput)) - (message "Formatter error output:\n%s" errput))))))) + (unless formatter + (user-error "Don't know how to format '%s' code" major-mode)) + (let ((f-function (gethash formatter format-all-format-table)) + (executable (format-all-formatter-executable formatter))) + (cl-destructuring-bind (output errput first-diff) + (+format--with-copy-of-buffer f-function executable mode-result) + (unwind-protect + (cond ((null output) 'error) + ((eq output t) 'noop) + ((let ((tmpfile (make-temp-file "doom-format")) + (patchbuf (get-buffer-create " *doom format patch*")) + (coding-system-for-read 'utf-8) + (coding-system-for-write 'utf-8)) + (unwind-protect + (progn + (with-current-buffer patchbuf (erase-buffer)) + (with-temp-file tmpfile (erase-buffer) (insert output)) + (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) + 'noop + (+format--apply-rcs-patch patchbuf) + (list output errput first-diff)))) + (kill-buffer patchbuf) + (delete-file tmpfile)))) + (unless (= 0 (length errput)) + (message "Formatter error output:\n%s" errput)))))) ;; @@ -149,10 +146,7 @@ See `+format/buffer' for the interactive version of this function, and (defun +format/buffer () "Format the source code in the current buffer." (interactive) - (pcase (+format-buffer) - (`error (message "Failed to format buffer due to errors")) - (`noop (message "Buffer was already formatted")) - (_ (message "Formatted (%s)" (car (format-all-probe)))))) + (+format|buffer)) ;;;###autoload (defun +format/region (beg end) @@ -186,5 +180,13 @@ is selected)." (add-hook 'before-save-hook #'+format|buffer nil t)) ;;;###autoload -(defalias '+format|buffer #'+format-buffer) +(defun +format|buffer () + "Format the source code in the current buffer with minimal feedback. + +Meant for `before-save-hook'." + (cl-destructuring-bind (formatter mode-result) (format-all-probe) + (pcase (+format-buffer formatter mode-result) + (`error (message "Failed to format buffer due to errors")) + (`noop (message "Buffer was already formatted")) + (_ (message "Formatted (%s)" formatter))))) From 33d692a6be431c7081990a353db3db426539aaaa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 16:31:09 +0200 Subject: [PATCH 2959/4235] Make bin/doom work when it's symlinked --- bin/doom | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index 20301491e..3e25a819d 100755 --- a/bin/doom +++ b/bin/doom @@ -41,7 +41,7 @@ ;; (let ((args (cdr (cdr (cdr command-line-args)))) (emacs-dir (or (getenv "EMACSDIR") - (expand-file-name "../" (file-name-directory load-file-name))))) + (expand-file-name "../" (file-name-directory (file-truename load-file-name)))))) ;; Parse options (while (ignore-errors (string-prefix-p "-" (car args))) (pcase (pop args) From 68e2b814e7808a5673b184a893c5fa41a85eb9b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 17:40:33 +0200 Subject: [PATCH 2960/4235] Fix stringp error when inserting new snippets #852 New snippets (created with yas-new-snippet) may not yet be associated with a file when it is passed to the functions in yas-prompt-functions. One of those functions, +snippets-prompt-private, prioritizes private snippets over default ones, but determines which is which with `file-in-directory-p`, which expects string arguments. To fix this, we can safely assume that if a snippet has no associated file, it is a private snippet. --- modules/feature/snippets/autoload/snippets.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index aeeb52720..b283abc3c 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -7,8 +7,9 @@ are multiple choices." (when-let* ((choices (or (cl-loop for tpl in choices - if (file-in-directory-p (yas--template-get-file tpl) - +snippets-dir) + for file = (yas--template-get-file tpl) + if (or (null file) + (file-in-directory-p file +snippets-dir)) collect tpl) choices))) (if (cdr choices) From fcf2a2632910915248121ae1ecce12bbd2f8c491 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 19:42:57 +0200 Subject: [PATCH 2961/4235] lang/nim: fix blank nimsuggest-path stringp error --- modules/lang/nim/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 728780223..69c022477 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -4,7 +4,9 @@ (defun +nim|init-nimsuggest-mode () "Conditionally load `nimsuggest-mode', instead of clumsily erroring out if nimsuggest isn't installed." - (when (file-executable-p nimsuggest-path) + (unless (stringp nimsuggest-path) + (setq nimsuggest-path (executable-find "nimsuggest"))) + (when (and nimsuggest-path (file-executable-p nimsuggest-path)) (nimsuggest-mode))) (add-hook 'nim-mode-hook #'+nim|init-nimsuggest-mode) From edc9bf70aff2e6d3cf771b0a50ff7afbdb1e2b38 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 20:13:43 +0200 Subject: [PATCH 2962/4235] Delete trailing whitespace, globally, by default Also adds doom|disable-delete-trailing-whitespace hook, which can be used to disable this behavior on a per-buffer basis. If you want to turn off this global behavior: (remove-hook 'write-file-functions #'delete-trailing-whitespace) --- core/autoload/editor.el | 14 +++++++++++--- core/core-editor.el | 5 +++++ modules/lang/emacs-lisp/config.el | 2 +- modules/lang/racket/config.el | 7 +------ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index e6f2fd041..0aeddfa54 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -281,6 +281,14 @@ with weak native support." ;;;###autoload (defun doom|enable-delete-trailing-whitespace () - "Enables the automatic deletion of trailing whitespaces upon file save, by -attaching `delete-trailing-whitespace' to a buffer-local `before-save-hook'." - (add-hook 'before-save-hook #'delete-trailing-whitespace nil t)) + "Enables the automatic deletion of trailing whitespaces upon file save. + +i.e. adds `delete-trailing-whitespace' to `write-file-functions', buffer-locally." + (add-hook 'write-file-functions #'delete-trailing-whitespace nil t)) + +;;;###autoload +(defun doom|disable-delete-trailing-whitespace () + "Disables the automatic deletion of trailing whitespaces upon file save. + +i.e. removes `delete-trailing-whitespace' from `write-file-functions'." + (remove-hook 'write-file-functions #'delete-trailing-whitespace t)) diff --git a/core/core-editor.el b/core/core-editor.el index 1c7477eb6..bd7d60702 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -81,6 +81,11 @@ fundamental-mode) for performance sake." (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) +;; Deleting trailing whitespace is on by default, but must be set on +;; write-file-functions, so that editorconfig can see it (so it doesn't add it +;; redundantly and can remove it when needed). +(add-hook 'write-file-functions #'delete-trailing-whitespace) + ;; revert buffers for changed files (def-package! autorevert :after-call after-find-file diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7aab19a2c..4449dd255 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -50,7 +50,7 @@ (add-hook! 'emacs-lisp-mode-hook #'(;; 3rd-party functionality - auto-compile-on-save-mode doom|enable-delete-trailing-whitespace + auto-compile-on-save-mode ;; fontification rainbow-delimiters-mode highlight-quoted-mode ;; initialization diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index d86227128..460fd2d47 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -18,12 +18,7 @@ (setq racket-smart-open-bracket-enable t) - (add-hook! racket-mode - #'(;; 3rd-party functionality - doom|enable-delete-trailing-whitespace - ;; fontification - rainbow-delimiters-mode - highlight-quoted-mode)) + (add-hook! racket-mode #'(rainbow-delimiters-mode highlight-quoted-mode)) (map! :map racket-mode-map :localleader From a7b87fe3dede26c35f26047018be0e52bbdb9beb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 20:41:54 +0200 Subject: [PATCH 2963/4235] Add +emacs-lisp-enable-extra-fontification option --- modules/lang/emacs-lisp/config.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 4449dd255..2b9b4a854 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,5 +1,8 @@ ;;; lang/emacs-lisp/config.el -*- lexical-binding: t; -*- +(defvar +emacs-lisp-enable-extra-fontification t + "If non-nil, highlight special forms, and defined functions and variables.") + ;; ;; elisp-mode deferral hack ;; @@ -51,8 +54,6 @@ (add-hook! 'emacs-lisp-mode-hook #'(;; 3rd-party functionality auto-compile-on-save-mode - ;; fontification - rainbow-delimiters-mode highlight-quoted-mode ;; initialization +emacs-lisp|extend-imenu)) @@ -60,13 +61,16 @@ ;; it when you're editing them (add-hook 'flycheck-mode-hook #'+emacs-lisp|disable-flycheck-maybe) - ;; Special fontification for doom + ;; Special fontification for elisp (font-lock-add-keywords 'emacs-lisp-mode (append `(;; custom Doom cookies - ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) - ;; highlight defined, special variables & functions - (+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face)))) + ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t))) + ;; highlight defined, special variables & functions + (when +emacs-lisp-enable-extra-fontification + `((+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face))))) + + (add-hook! 'emacs-lisp-mode-hook #'(rainbow-delimiters-mode highlight-quoted-mode)) ;; Recenter window after following definition (advice-add #'elisp-def :after #'doom*recenter)) From bfe7b9f1c4745dd293e790681cf23cee047465b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 22:35:25 +0200 Subject: [PATCH 2964/4235] lang/nim: fix invalid argument errors The nimsuggest plugin tries to build a unique path for temporary files for its flycheck checker. This path contains /tmp/emacs-nim-mode/A/B, where A is the frame ID and B is the full path to the file being checked. However, the original `nimsuggest--get-dirty-dir' incorrectly extracts the frame ID from the string representation of `selected-frame' if frame-title-format has been modified (which Doom has). The result is the title of the frame, which can contain illegal path characters in Windows, which in turn causes invalid argument errors when `nimsuggest--make-tempdir' tries to use it. This should really be reported upstream! --- modules/lang/nim/config.el | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 69c022477..3baaf0241 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -10,6 +10,17 @@ nimsuggest isn't installed." (nimsuggest-mode))) (add-hook 'nim-mode-hook #'+nim|init-nimsuggest-mode) + (defun doom*nimsuggest--get-dirty-dir () + "The original `nimsuggest--get-dirty-dir' incorrectly extracts the frame +number from the string representation of `selected-frame', which can contain +characters that are illegal on Windows, causing invalid argument errors when +`nimsuggest--make-tempdir' tries to use it." + (let* ((frame-str (format "%s" (selected-frame))) + (frame-num-str (if (string-match " \\(0x[0-9a-z]+\\)>$" frame-str) + (match-string 1 frame-str)))) + (file-name-as-directory (concat nimsuggest-dirty-directory frame-num-str)))) + (advice-add #'nimsuggest--get-dirty-dir :override #'doom*nimsuggest--get-dirty-dir) + (map! :map nim-mode-map :localleader :n "b" #'nim-compile)) From c1fa37245ff70c39911d79a57c70ac32946e6868 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 22:39:03 +0200 Subject: [PATCH 2965/4235] Fix dtrt-indent errors in broken smie modes Some smie modes throw errors when trying to guess their indentation, like `nim-mode'. This prevents them from leaving Emacs in a broken state. --- core/core-editor.el | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index bd7d60702..f1a98ace7 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -216,7 +216,22 @@ savehist file." #'doom|detect-indentation) :config (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) - (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width))) + (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width)) + + (defun doom*fix-broken-smie-modes (orig-fn arg) + "Some smie modes throw errors when trying to guess their indentation, like +`nim-mode'. This prevents them from leaving Emacs in a broken state." + (let ((dtrt-indent-run-after-smie dtrt-indent-run-after-smie)) + (cl-letf* ((old-smie-config-guess (symbol-function 'smie-config-guess)) + ((symbol-function 'smie-config-guess) + (lambda () + (condition-case e (funcall old-smie-config-guess) + (error (setq dtrt-indent-run-after-smie t) + (message "[WARNING] Indent detection: %s" + (error-message-string e)) + (message "")))))) ; warn silently + (funcall orig-fn arg)))) + (advice-add #'dtrt-indent-mode :around #'doom*fix-broken-smie-modes)) ;; Branching undo (def-package! undo-tree From 147fa794d3f844718fae06bb9babecbb25469d8b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 30 Aug 2018 23:36:32 +0200 Subject: [PATCH 2966/4235] lang/nim: fix invalid chars in nimsuggest tmp path --- modules/lang/nim/config.el | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 3baaf0241..c848e5cbf 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -10,16 +10,26 @@ nimsuggest isn't installed." (nimsuggest-mode))) (add-hook 'nim-mode-hook #'+nim|init-nimsuggest-mode) - (defun doom*nimsuggest--get-dirty-dir () - "The original `nimsuggest--get-dirty-dir' incorrectly extracts the frame + (when IS-WINDOWS + ;; TODO File PR/report upstream (https://github.com/nim-lang/nim-mode) + (defun doom*nimsuggest--get-dirty-dir () + "The original `nimsuggest--get-dirty-dir' incorrectly extracts the frame number from the string representation of `selected-frame', which can contain characters that are illegal on Windows, causing invalid argument errors when `nimsuggest--make-tempdir' tries to use it." - (let* ((frame-str (format "%s" (selected-frame))) - (frame-num-str (if (string-match " \\(0x[0-9a-z]+\\)>$" frame-str) - (match-string 1 frame-str)))) - (file-name-as-directory (concat nimsuggest-dirty-directory frame-num-str)))) - (advice-add #'nimsuggest--get-dirty-dir :override #'doom*nimsuggest--get-dirty-dir) + (let* ((frame-str (format "%s" (selected-frame))) + (frame-num-str (if (string-match " \\(0x[0-9a-z]+\\)>$" frame-str) + (match-string 1 frame-str)))) + (file-name-as-directory (concat nimsuggest-dirty-directory frame-num-str)))) + (advice-add #'nimsuggest--get-dirty-dir :override #'doom*nimsuggest--get-dirty-dir) + + ;; TODO File PR/report upstream (https://github.com/nim-lang/nim-mode) + (defun doom*nimsuggest--get-temp-file-name (path) + "Removes invalid characters from the temp file path, including the unicode +character that colon is replaced with, which is known to cause issues on +windows." + (replace-regexp-in-string "[꞉* |<>\"?*]" "" path)) + (advice-remove #'nimsuggest--get-temp-file-name :filter-return #'doom*nimsuggest--get-temp-file-name)) (map! :map nim-mode-map :localleader From 2c5ccaa864f0dcbefe6fc240b3ccffdf490cb6a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 00:19:34 +0200 Subject: [PATCH 2967/4235] Update patch-macos documentation Follows up on 0fc9b6be --- core/core-cli.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index f269c53c8..8d1c63618 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -206,10 +206,10 @@ This patch fixes this by patching Emacs.app (in /Applications or 1. Move Contents/MacOS/Emacs to Contents/MacOS/RunEmacs 2. And replace Contents/MacOS/Emacs with the following wrapper script: - #!/usr/bin/env bash + #!/bin/bash args=\"$@\" pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\" - exec \"$SHELL\" -c \"$pwd/RunEmacs $args\" + exec \"$SHELL\" -l -c \"$pwd/RunEmacs $args\" This ensures that Emacs is always aware of your shell environment, regardless of how it is launched. From 2df262232932060a05a90a6f4e48df4244cf2b9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 02:40:15 +0200 Subject: [PATCH 2968/4235] lang/web/autoload/css: escape braces Prevents auto-formatting of braces by tools like parinfer. --- modules/lang/web/autoload/css.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el index a857155bd..7c1a2167b 100644 --- a/modules/lang/web/autoload/css.el +++ b/modules/lang/web/autoload/css.el @@ -27,8 +27,8 @@ (let ((inhibit-modification-hooks t)) (cl-destructuring-bind (&key beg end op cl &allow-other-keys) (save-excursion - (when (and (eq (char-after) ?{) - (not (eq (char-before) ?{))) + (when (and (eq (char-after) ?\{) + (not (eq (char-before) ?\{))) (forward-char)) (sp-get-sexp)) (when (or (not (and beg end op cl)) From fd8f8c510861a08e86b5361640dbfb208a8658e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 02:44:49 +0200 Subject: [PATCH 2969/4235] feature/lookup: rewrite dash docset integration + Uses alist variable to store config, rather than hooks + Added check for installed docsets in +lookup/documentation + Set docsets for various language modules (c-mode, c++-mode, css-mode, scss-mode, sass-mode, web-mode, go-mode, racket-mode, emacs-lisp-mode, js2-mode, rjsx-mode, typescript-mode, rust-mode, and php-mode) + Made *eww* popups for dash docsets larger + Renamed set-docset! => set-docsets! (set-docset! is aliased to set-docsets!) + New +lookup/install-docset alias --- modules/feature/lookup/autoload/docsets.el | 95 +++++++++++++++++----- modules/feature/lookup/autoload/lookup.el | 17 ++-- modules/feature/lookup/config.el | 2 +- modules/lang/cc/config.el | 2 + modules/lang/emacs-lisp/config.el | 2 +- modules/lang/go/config.el | 1 + modules/lang/javascript/config.el | 14 ++++ modules/lang/php/config.el | 1 + modules/lang/racket/config.el | 2 +- modules/lang/rust/config.el | 2 +- modules/lang/web/+css.el | 11 ++- modules/lang/web/+html.el | 2 + modules/ui/popup/config.el | 3 + 13 files changed, 119 insertions(+), 35 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index 6293b6f29..c19a7fbbe 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -1,16 +1,16 @@ ;;; feature/lookup/autoload/docsets.el -*- lexical-binding: t; -*- ;;;###if (featurep! +docsets) -(defvar-local helm-dash-docsets nil - "Docsets to use for this buffer.") +(defvar +lookup-docset-alist nil + "An alist mapping major and minor modes to lists of Dash docsets. -(defvar-local counsel-dash-docsets nil - "Docsets to use for this buffer.") +Entries are added by `set-docsets!' and used by `+lookup-docsets-for-buffer' to +assemble a list of installed & active docsets.") ;;;###autodef -(defun set-docset! (modes &rest docsets) +(defun set-docsets! (modes &rest docsets) "Registers a list of DOCSETS (strings) for MODES (either one major/minor mode -symbol or a list of them). +symbol or a list of them). DOCSETS can also contain sublists. If MODES is a minor mode, you can use :add or :remove as the first element of DOCSETS, to instruct it to append (or remove) those from the docsets already set @@ -19,29 +19,82 @@ by a major-mode, if any. Used by `+lookup/in-docsets' and `+lookup/documentation'." (declare (indent defun)) (dolist (mode (doom-enlist modes)) - (let ((fn (intern (format "+lookup|init-docsets--%s" mode))) - (hook (intern (format "%s-hook" mode)))) - (cond ((null (car-safe docsets)) - (remove-hook hook fn) - (unintern fn nil)) - ((fset fn - (lambda () - (let ((var-sym (if (featurep! :completion ivy) - 'counsel-dash-docsets - 'helm-dash-docsets))) - (set var-sym - (append (symbol-value var-sym) - docsets))))) - (add-hook hook fn)))))) + (if (null docsets) + (setq +lookup-docset-alist + (delq (assq mode +lookup-docset-alist) + +lookup-docset-alist))) + (setf (alist-get mode +lookup-docset-alist) + (mapcan #'doom-enlist docsets)))) + +;;;###autodef +(defalias 'set-docset! #'set-docsets!) ;; FIXME obsolete :docset ;;;###autoload (def-setting! :docset (modes &rest docsets) :obsolete set-docset! - `(set-docset! ,modes ,@docsets)) + `(set-docsets! ,modes ,@docsets)) + + +;; +;; Library +;; + +;;;###autoload +(defun +lookup-docsets-for-buffer () + "Return list of installed & selected docsets for the current major mode. + +This list is built from `+lookup-docset-alist'." + (let ((base-docsets (cdr (assq major-mode +lookup-docset-alist)))) + (dolist (spec +lookup-docset-alist) + (cl-destructuring-bind (mode . docsets) spec + (when (and (boundp mode) (symbol-value mode)) + (pcase (car docsets) + (:add (nconc base-docsets (cdr docsets))) + (:remove + (dolist (docset (cdr docsets)) + (setq base-docsets (delete docset base-docsets)))) + (_ (setq base-docsets docsets)))))) + base-docsets)) + +;;;###autoload +(defun +lookup-docset-installed-p (docset) + "Return t if DOCSET is installed." + (let ((path (helm-dash-docsets-path))) + (file-directory-p + (expand-file-name (format "%s.docset" docset) + path)))) ;;;###autoload (autoload 'helm-dash-installed-docsets "helm-dash") ;;;###autoload (autoload 'helm-dash-docset-installed-p "helm-dash") + + +;; +;; Commands +;; + +;;;###autoload +(defalias '+lookup/install-docset #'helm-dash-install-docset) + +(defvar counsel-dash-docsets) +(defvar helm-dash-docsets) +;;;###autoload +(defun +lookup/in-docsets (&optional query docsets) + "Lookup QUERY in dash DOCSETS. + +QUERY is a string and docsets in an array of strings, each a name of a Dash +docset. Requires either helm or ivy. + +Use `+lookup/install-docset' to install docsets." + (interactive) + (let* ((counsel-dash-docsets (or docsets (+lookup-docsets-for-buffer))) + (helm-dash-docsets counsel-dash-docsets) + (query (or query (+lookup--symbol-or-region) ""))) + (cond ((featurep! :completion helm) + (helm-dash query)) + ((featurep! :completion ivy) + (counsel-dash query)) + ((user-error "No dash backend is installed, enable ivy or helm."))))) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 078165241..d188e4c7b 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -63,6 +63,10 @@ properties: `(set-lookup-handlers! ,modes ,@plist)) +;; +;; Library +;; + ;; Helpers (defun +lookup--online-provider (&optional force-p namespace) (let ((key (or namespace major-mode))) @@ -201,17 +205,18 @@ Goes down a list of possible backends: 3. Fall back to an online search, with `+lookup/online'" (interactive (list (+lookup--symbol-or-region))) - (cond ((and +lookup-documentation-functions + (cond ((null identifier) (user-error "Nothing under point")) + + ((and +lookup-documentation-functions (+lookup--jump-to :documentation identifier))) ((and (featurep! +docsets) (or (require 'counsel-dash nil t) (require 'helm-dash nil t)) - (or (bound-and-true-p counsel-dash-docsets) - (bound-and-true-p helm-dash-docsets)) - ;; counsel-dash uses helm-dash under the hood - (helm-dash-installed-docsets)) - (+lookup/in-docsets identifier)) + (let ((docsets (+lookup-docsets-for-buffer))) + (when (cl-some #'+lookup-docset-installed-p docsets) + (+lookup/in-docsets identifier docsets) + t)))) ((+lookup/online identifier diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 8ea92aa0f..46971184d 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -120,8 +120,8 @@ argument: the identifier at point.") ;; Both packages depend on helm-dash, for now (def-package! helm-dash - :defer t :when (featurep! +docsets) + :defer t :init (setq helm-dash-enable-debugging doom-debug-mode helm-dash-browser-func #'eww) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 536d3c44a..bfde05d0f 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -41,6 +41,8 @@ compilation database is present in the project.") :config (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) + (set-docsets! 'c-mode "C") + (set-docsets! 'c++-mode "C++" "Boost") (set-pretty-symbols! '(c-mode c++-mode) ;; Functional diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 2b9b4a854..f2ecb5536 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -37,7 +37,7 @@ (set-lookup-handlers! 'emacs-lisp-mode :definition #'elisp-def :documentation #'info-lookup-symbol) - (set-docset! 'emacs-lisp-mode "Emacs Lisp") + (set-docsets! 'emacs-lisp-mode "Emacs Lisp") (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") (set-rotate-patterns! 'emacs-lisp-mode :symbols '(("t" "nil") diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 82e74217e..260268578 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -6,6 +6,7 @@ (after! go-mode (set-env! "GOPATH" "GOROOT") + (set-docsets! 'go-mode "Go") (set-repl-handler! 'go-mode #'gorepl-run) (set-lookup-handlers! 'go-mode :definition #'go-guru-definition diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 18587951c..470ab60b5 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -1,5 +1,14 @@ ;;; lang/javascript/config.el -*- lexical-binding: t; -*- +(defvar +javascript-docsets + '("JavaScript" + "AngularJS" "Backbone" "BackboneJS" "Bootstrap" "D3JS" "EmberJS" "Express" + "ExtJS" "JQuery" "JQuery_Mobile" "JQuery_UI" "KnockoutJS" "Lo-Dash" + "MarionetteJS" "MomentJS" "NodeJS" "PrototypeJS" "React" "RequireJS" + "SailsJS" "UnderscoreJS" "VueJS" "ZeptoJS") + "A list of dash docsets to use for Javascript modes (`js2-mode' and +`rjsx-mode'). These are used by `+lookup/in-docsets'.") + (after! (:any js2-mode web-mode) (set-pretty-symbols! '(js2-mode web-mode) ;; Functional @@ -46,6 +55,7 @@ (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/repl) + (set-docsets! 'js2-mode +javascript-docsets) (map! :map js2-mode-map :localleader @@ -66,6 +76,7 @@ (add-to-list 'magic-mode-alist '(+javascript-jsx-file-p . rjsx-mode)) :config (set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?>)) + (set-docsets! 'rjsx-mode +javascript-docsets) (add-hook! 'rjsx-mode-hook ;; jshint doesn't know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers)) @@ -86,6 +97,7 @@ comment-line-break-function #'js2-line-break) (set-electric! 'typescript-mode :chars '(?\} ?\)) :words '("||" "&&")) + (set-docsets! 'typescript-mode "TypeScript" "AngularTS") (set-pretty-symbols! 'typescript-mode ;; Functional :def "function" @@ -106,6 +118,8 @@ ;; `coffee-mode' (setq coffee-indent-like-python-mode t) +(after! coffee-mode + (set-docsets! 'coffee-mode "CoffeeScript")) ;; diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 493f21e06..31ee4e3d7 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -7,6 +7,7 @@ ;; php+html. Use the .phtml (setq php-template-compatibility nil) + (set-docsets! 'php-mode "PHP" "PHPUnit" "Laravel" "CakePHP" "CodeIgniter" "Doctrine_ORM") (set-repl-handler! 'php-mode #'php-boris) (set-lookup-handlers! 'php-mode :documentation #'php-search-documentation) (set-formatter! 'php-mode #'php-cs-fixer-fix) diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 460fd2d47..6f86bc3f9 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -8,7 +8,7 @@ (set-lookup-handlers! 'racket-mode :definition #'racket-visit-definition :documentation #'racket-describe) - (set-docset! 'racket-mode "Racket") + (set-docsets! 'racket-mode "Racket") (set-pretty-symbols! 'racket-mode :lambda "lambda" :map "map" diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index d2502c7b1..3bbade611 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -2,7 +2,7 @@ (after! rust-mode (set-env! "RUST_SRC_PATH") - (set-docset! 'rust-mode "Rust") + (set-docsets! 'rust-mode "Rust") (setq rust-indent-method-chain t) (map! :map rust-mode-map diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 2ddacc41e..45eae706e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -1,5 +1,8 @@ ;;; lang/web/+css.el -*- lexical-binding: t; -*- +(defvar +web-css-docsets '("CSS" "HTML" "Bourbon" "Compass") + "TODO") + ;; An improved newline+continue comment function (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) @@ -33,10 +36,10 @@ :defer t :config ;; contains both css-mode & scss-mode - (set-docset! 'css-mode "CSS") - (set-docset! 'scss-mode "Sass") + (set-docsets! 'css-mode +web-css-docsets) + (set-docsets! 'scss-mode "Sass" +web-css-docsets) (unless EMACS26+ - ;; css-mode's built in completion is superior + ;; css-mode's built in completion is superior in 26+ (set-company-backend! '(css-mode scss-mode) 'company-css)) (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) @@ -44,7 +47,7 @@ (def-package! sass-mode :defer t :config - (set-docset! 'sass-mode "Sass") + (set-docsets! 'sass-mode "Sass" +web-css-docsets) (set-company-backend! 'sass-mode 'company-css) (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 5c896e08c..13c8fb9b5 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -15,6 +15,8 @@ :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config + (set-docsets! 'web-mode "HTML" "Twig" "WordPress") + (setq web-mode-enable-html-entities-fontification t web-mode-auto-close-style 2) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 3f7e8382b..acb13bbe9 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -156,6 +156,9 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; `help-mode', `helpful-mode' ("^\\*[Hh]elp" :slot 2 :vslot 2 :size 0.35 :select t) + ;; `eww' (and used by dash docsets) + ("^\\*eww\\*" + :vslot 50 :size 0.35 :select t) ;; `Info-mode' ("^\\*info\\*$" :slot 2 :vslot 2 :size 0.45 :select t))) From 0cf9d1f2f267e1871254280f28be40ed587f664c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 02:50:47 +0200 Subject: [PATCH 2970/4235] Minor refactor & revision across the board --- init.example.el | 12 ++++++------ modules/feature/lookup/autoload/lookup.el | 10 ++++++---- modules/feature/lookup/packages.el | 4 ++-- modules/lang/javascript/config.el | 9 +++++---- modules/lang/org/+capture.el | 1 - modules/lang/web/+css.el | 1 - modules/ui/doom/config.el | 1 - 7 files changed, 19 insertions(+), 19 deletions(-) diff --git a/init.example.el b/init.example.el index 87b2429d7..ede5648e2 100644 --- a/init.example.el +++ b/init.example.el @@ -67,7 +67,7 @@ ;gist ; interacting with github gists ;macos ; MacOS-specific commands ;make ; run make tasks from Emacs - ;magit ; + ;magit ; a git porcelain for Emacs ;password-store ; password manager for nerds ;pdf ; pdf enhancements ;prodigy ; FIXME managing external services & code builders @@ -119,7 +119,7 @@ ;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} ;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() ;scala ; java, but good - (sh +fish) ; she sells (ba|z)sh shells on the C xor + (sh +fish) ; she sells (ba|z|fi)sh shells on the C xor ;solidity ; do you need a blockchain? No. ;swift ; who asked for emoji variables? ;web ; the tubes @@ -145,9 +145,9 @@ ;; literate config in your `doom-private-dir' whenever it changes. ;literate - ;; The default module set reasonable defaults for Emacs. It also provides - ;; a Spacemacs-inspired keybinding scheme, a custom yasnippet library, - ;; and additional ex commands for evil-mode. Use it as a reference for - ;; your own modules. + ;; The default module sets reasonable defaults for Emacs. It also + ;; provides a Spacemacs-inspired keybinding scheme, a custom yasnippet + ;; library, and additional ex commands for evil-mode. Use it as a + ;; reference for your own modules. (default +bindings +snippets +evil-commands)) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index d188e4c7b..de5964ff9 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -141,9 +141,9 @@ point or current buffer. Falls back to dumb-jump, naive ripgrep/the_silver_searcher text search, then `evil-goto-definition' if evil-mode is active." (interactive - (list (+lookup--symbol-or-region) current-prefix-arg)) - (cond ((null identifier) - (user-error "Nothing under point")) + (list (+lookup--symbol-or-region) + current-prefix-arg)) + (cond ((null identifier) (user-error "Nothing under point")) ((and +lookup-definition-functions (+lookup--jump-to :definition identifier))) @@ -187,7 +187,9 @@ point and/or current buffer. Falls back to a naive ripgrep/the_silver_searcher search otherwise." (interactive (list (+lookup--symbol-or-region))) - (cond ((and +lookup-references-functions + (cond ((null identifier) (user-error "Nothing under point")) + + ((and +lookup-references-functions (+lookup--jump-to :references identifier))) ((+lookup--file-search identifier)) diff --git a/modules/feature/lookup/packages.el b/modules/feature/lookup/packages.el index 743c8631a..67e05165f 100644 --- a/modules/feature/lookup/packages.el +++ b/modules/feature/lookup/packages.el @@ -1,8 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; feature/lookup/packages.el -;; `dumb-jump' uses the `helm-build-sync-source' macro, but this requires helm be -;; loaded before it is byte-compiled during installation. To ensure this, we +;; `dumb-jump' uses the `helm-build-sync-source' macro, but this requires helm +;; be loaded before it is byte-compiled during installation. To ensure this, we ;; declare helm before dumb-jump. (when (featurep! :completion helm) (depends-on! :completion helm)) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 470ab60b5..dbcb6d1b1 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -77,14 +77,15 @@ :config (set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?>)) (set-docsets! 'rjsx-mode +javascript-docsets) - (add-hook! 'rjsx-mode-hook - ;; jshint doesn't know how to deal with jsx - (push 'javascript-jshint flycheck-disabled-checkers)) + (when (featurep! :feature syntax-checker) + (add-hook! 'rjsx-mode-hook + ;; jshint doesn't know how to deal with jsx + (push 'javascript-jshint flycheck-disabled-checkers))) ;; `rjsx-electric-gt' relies on js2's parser to tell it when the cursor is in ;; a self-closing tag, so that it can insert a matching ending tag at point. ;; However, the parser doesn't run immediately, so a fast typist can outrun - ;; it, causing tags to stay unclosed, so force it to parse. + ;; it, causing tags to stay unclosed, so we force it to parse. (defun +javascript|reparse (n) ;; if n != 1, rjsx-electric-gt calls rjsx-maybe-reparse itself (if (= n 1) (rjsx-maybe-reparse))) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 4c7025664..4794bf657 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -27,7 +27,6 @@ (file+headline +org-default-notes-file "Inbox") "* %u %?\n%i" :prepend t :kill-buffer t))) - (defun +org|init-capture () (setq org-default-notes-file (expand-file-name +org-default-notes-file org-directory) +org-default-todo-file (expand-file-name +org-default-todo-file org-directory)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 45eae706e..d68fed0a8 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -19,7 +19,6 @@ (add-hook 'css-mode-hook #'rainbow-delimiters-mode) (add-hook! (css-mode sass-mode stylus-mode) #'(yas-minor-mode-on - flycheck-mode rainbow-mode)) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 3e5e9bb9e..e123b2060 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -31,7 +31,6 @@ :config ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) - ;; more Atom-esque file icons for neotree/treemacs (when (featurep! :ui neotree) (add-hook 'doom-load-theme-hook #'doom-themes-neotree-config) From a1a66f54453c71dff5f101c5948c74f93df6e811 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 02:51:40 +0200 Subject: [PATCH 2971/4235] lang/javascript: improve project file detection +javascript-npm-mode now uses a better search for package.json, making extra sure that your local node_modules folder is added to exec-path. --- modules/lang/javascript/config.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index dbcb6d1b1..9333aa94d 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -253,17 +253,16 @@ ;; Projects ;; +(def-project-mode! +javascript-npm-mode + :modes (html-mode css-mode web-mode js2-mode rjsx-mode json-mode markdown-mode) + :when (locate-dominating-file default-directory "package.json") + :add-hooks (+javascript|add-node-modules-path)) + +(def-project-mode! +javascript-gulp-mode + :when (locate-dominating-file default-directory "gulpfile.js")) + (def-project-mode! +javascript-screeps-mode :match "/screeps\\(?:-ai\\)?/.+$" :modes (+javascript-npm-mode) :add-hooks (+javascript|init-screeps-mode) :on-load (load! "+screeps")) - -(def-project-mode! +javascript-gulp-mode - :files ("gulpfile.js")) - -(def-project-mode! +javascript-npm-mode - :modes (html-mode css-mode web-mode js2-mode rjsx-mode json-mode markdown-mode) - :files ("package.json") - :add-hooks (+javascript|add-node-modules-path)) - From 7b2661d6a0bdc89da98f5aa29cd340cf9be63be2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 03:04:29 +0200 Subject: [PATCH 2972/4235] feature/lookup: update +lookup:dash ex command --- modules/feature/lookup/autoload/evil.el | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/feature/lookup/autoload/evil.el b/modules/feature/lookup/autoload/evil.el index 26bafc489..16084bba4 100644 --- a/modules/feature/lookup/autoload/evil.el +++ b/modules/feature/lookup/autoload/evil.el @@ -11,6 +11,12 @@ engine." ;;;###autoload (autoload '+lookup:dash "feature/lookup/autoload/evil" nil t) (evil-define-command +lookup:dash (query &optional bang) - "TODO" + "Look up QUERY in your dash docsets. If BANG, prompt to select a docset (and +install it if necessary)." (interactive "") - (+lookup/in-docsets query (if bang 'blank))) + (let (selected) + (when bang + (setq selected (helm-dash-read-docset "Select docset" (helm-dash-official-docsets))) + (unless (+lookup-docset-installed-p selected) + (+lookup/install-docset selected))) + (+lookup/in-docsets query (or selected (+lookup-docsets-for-buffer))))) From f95623989d515fae7295f9b1ca422477adea915c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 03:31:58 +0200 Subject: [PATCH 2973/4235] lang/coq: remove unnecessary after! For setting a variable, an after! block is overkill --- modules/lang/coq/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index 518c08d9d..fc2b0b85e 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -1,7 +1,7 @@ ;;; lang/coq/config.el -*- lexical-binding: t; -*- -(after! coq - (setq proof-electric-terminator-enable t)) +;; `coq' +(setq proof-electric-terminator-enable t) (after! company-coq (set-lookup-handlers! 'company-coq-mode From f75381ae51e40cbd4fdb8e14e4e414b8f6db8ef9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 03:32:25 +0200 Subject: [PATCH 2974/4235] when not => unless --- modules/lang/coq/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index fc2b0b85e..1ff5cc560 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -8,5 +8,5 @@ :definition #'company-coq-jump-to-definition :references #'company-coq-grep-symbol :documentation #'company-coq-doc) - (when (not (featurep! :completion company)) + (unless (featurep! :completion company) (setq company-coq-disabled-features '(company company-defaults)))) From f30a21042889bdd465e271e5e9dccc76c1f16f3d Mon Sep 17 00:00:00 2001 From: Sven Grunewaldt Date: Fri, 31 Aug 2018 11:28:28 +0200 Subject: [PATCH 2975/4235] Add flycheck-credo for lang/elixir --- modules/lang/elixir/config.el | 4 ++++ modules/lang/elixir/packages.el | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 8f0fae3e3..0f72f2cdf 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -38,3 +38,7 @@ (set-eval-handler! 'elixir-mode #'alchemist-eval-region) (set-repl-handler! 'elixir-mode #'alchemist-iex-project-run)) +(def-package! flycheck-credo + :when (featurep! :feature syntax-checker) + :after flycheck + :config (flycheck-credo-setup)) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index 3c5e308b9..42ba8a6f5 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -4,3 +4,4 @@ ;; +elixir.el (package! elixir-mode) (package! alchemist) +(package! flycheck-credo) From eac0c0b09e791f707aa403f2d44d4c3dcf31ac97 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 12:08:40 +0200 Subject: [PATCH 2976/4235] Fix M-` keybind on MacOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Escaping it causes it to map à instead. --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index f5057b1d7..a6c197e33 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -76,7 +76,7 @@ "C-x p" #'+popup/other (:when IS-MAC - "\M-`" #'other-frame) + "M-`" #'other-frame) ;; --- Personal vim-esque bindings ------------------ From a33165d47a990a2d6b489ac86b76eb64817d11a8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 12:44:24 +0200 Subject: [PATCH 2977/4235] editor/format: disable in sql-mode by default sqlformat appears to be broken. It either throws an IndexError or formats SQL incorrectly and/or poorly. --- modules/editor/format/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index cbd65634c..99d98abf1 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -1,6 +1,8 @@ ;;; editor/format/config.el -*- lexical-binding: t; -*- -(defvar +format-on-save-enabled-modes '(not emacs-lisp-mode) +(defvar +format-on-save-enabled-modes + '(not emacs-lisp-mode ; elisp's mechanisms are good enough + sql-mode) ; sqlformat is currently broken "A list of major modes in which to enable `format-all-mode'. This mode will auto-format buffers when you save them. From d80e79203a3d3d18b36881c5e252fdc6a9afc7ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 13:56:50 +0200 Subject: [PATCH 2978/4235] Replace delete-trailing-whitespace with ws-butler ws-butler only strips trailing spaces on lines that have been modified. + ws-butler is disabled if editorconfig enables trim_trailing_whitespace, which resorts to delete-trailing-whitespace instead. + Updates doom|(enable|disable)-delete-trailing-whitespace hooks to use ws-butler-mode. --- core/autoload/editor.el | 8 ++++---- core/core-editor.el | 12 +++++++----- core/packages.el | 1 + modules/tools/editorconfig/config.el | 8 ++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 0aeddfa54..c304405db 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -283,12 +283,12 @@ with weak native support." (defun doom|enable-delete-trailing-whitespace () "Enables the automatic deletion of trailing whitespaces upon file save. -i.e. adds `delete-trailing-whitespace' to `write-file-functions', buffer-locally." - (add-hook 'write-file-functions #'delete-trailing-whitespace nil t)) +i.e. enables `ws-butler-mode' in the current buffer." + (ws-butler-mode +1)) ;;;###autoload (defun doom|disable-delete-trailing-whitespace () "Disables the automatic deletion of trailing whitespaces upon file save. -i.e. removes `delete-trailing-whitespace' from `write-file-functions'." - (remove-hook 'write-file-functions #'delete-trailing-whitespace t)) +i.e. disables `ws-butler-mode' in the current buffer." + (ws-butler-mode -1)) diff --git a/core/core-editor.el b/core/core-editor.el index f1a98ace7..3141d9142 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -81,11 +81,6 @@ fundamental-mode) for performance sake." (add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) -;; Deleting trailing whitespace is on by default, but must be set on -;; write-file-functions, so that editorconfig can see it (so it doesn't add it -;; redundantly and can remove it when needed). -(add-hook 'write-file-functions #'delete-trailing-whitespace) - ;; revert buffers for changed files (def-package! autorevert :after-call after-find-file @@ -300,5 +295,12 @@ savehist file." [remap describe-variable] #'helpful-variable [remap describe-key] #'helpful-key) +;; `ws-butler' --- a better `delete-trailing-whitespaces' +(def-package! ws-butler + :after-call (after-find-file) + :config + (nconc ws-butler-global-exempt-modes '(special-mode comint-mode term-mode eshell-mode)) + (ws-butler-global-mode)) + (provide 'core-editor) ;;; core-editor.el ends here diff --git a/core/packages.el b/core/packages.el index 6ad7e7f87..d49ab3d04 100644 --- a/core/packages.el +++ b/core/packages.el @@ -32,6 +32,7 @@ (package! pcre2el) (package! smartparens) (package! undo-tree) +(package! ws-butler) ;; core-projects.el (package! projectile) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 82d4966f0..5bc85a54a 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -42,7 +42,15 @@ extension, try to guess one." (apply orig-fn args))) (advice-add #'editorconfig-call-editorconfig-exec :around #'doom*editorconfig-smart-detection) + (defun +editorconfig|disable-ws-butler-maybe (props) + "Disable `ws-butler-mode' if trim_trailing_whitespace is true." + (when (equal (gethash 'trim_trailing_whitespace props) "true") + (ws-butler-mode -1))) + (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-ws-butler-maybe) + (defun +editorconfig|disable-indent-detection (props) + "Inhibit `dtrt-indent' if an explicit indent_style and indent_size is +specified by editorconfig." (when (or (gethash 'indent_style props) (gethash 'indent_size props)) (setq doom-inhibit-indent-detection t))) From 55d4cbd314a1ff57a6f3993e8697f4fe13b3e027 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 14:10:25 +0200 Subject: [PATCH 2979/4235] Fix vestigial refs to before-switch-buffer hook doom-before-switch-buffer-hook was renamed to doom-enter-buffer-hook --- modules/feature/syntax-checker/config.el | 2 +- modules/tools/editorconfig/config.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 21238960b..e19a4e032 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -2,7 +2,7 @@ (def-package! flycheck :commands (flycheck-list-errors flycheck-buffer) - :after-call (after-find-file doom-before-switch-buffer) + :after-call (doom-enter-buffer-hook after-find-file) :config ;; Emacs feels snappier without checks on newline (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 5bc85a54a..b4b737039 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -18,7 +18,7 @@ ;; specify their own formatting rules. (def-package! editorconfig :defer 2 - :after-call (doom-before-switch-buffer after-find-file) + :after-call (doom-enter-buffer-hook after-find-file) :config ;; Register missing indent variables (unless (assq 'mips-mode editorconfig-indentation-alist) From 0b64bc004fec68865cb5d1275db5b3283b5005ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 16:07:33 +0200 Subject: [PATCH 2980/4235] lang/nim: fix wrong-number-of-args error Meant to use advice-add, not advice-remove --- modules/lang/nim/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index c848e5cbf..22db62b9e 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -29,7 +29,7 @@ characters that are illegal on Windows, causing invalid argument errors when character that colon is replaced with, which is known to cause issues on windows." (replace-regexp-in-string "[꞉* |<>\"?*]" "" path)) - (advice-remove #'nimsuggest--get-temp-file-name :filter-return #'doom*nimsuggest--get-temp-file-name)) + (advice-add #'nimsuggest--get-temp-file-name :filter-return #'doom*nimsuggest--get-temp-file-name)) (map! :map nim-mode-map :localleader From 79cbae56b6f6cc0c21a7a164fb832f4bc9436985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=95=B8=E5=82=B2=E5=B1=85=E5=A3=AB?= Date: Sat, 1 Sep 2018 01:56:12 +0800 Subject: [PATCH 2981/4235] add shortcut to "magit-gitflow-popup" with '%' in magit-mode --- modules/tools/magit/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 014ec96bc..a9930cb7b 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -93,7 +93,8 @@ available.") (kbd "M-3") nil (kbd "M-4") nil) (evil-define-key* '(normal visual) magit-mode-map - "zz" #'evil-scroll-line-to-center) + "zz" #'evil-scroll-line-to-center + "%" #'magit-gitflow-popup) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (setcar (assoc (car key) evil-magit-rebase-commands-w-descriptions) From 4e2bd2286933b27b221d4fac5d151f74303e780a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 23:36:54 +0200 Subject: [PATCH 2982/4235] Don't chmod +x scripts This silent change is a bit too intrusive. It's convenient, but let the user decide to use it, rather than force it on them. --- core/core-editor.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 3141d9142..5e9a68459 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -79,8 +79,6 @@ fundamental-mode) for performance sake." (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. -(add-hook 'after-save-hook #'executable-make-buffer-file-executable-if-script-p) - ;; revert buffers for changed files (def-package! autorevert :after-call after-find-file From 44e536e8e860a2c8f840715b9da8d264aec331a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 23:38:54 +0200 Subject: [PATCH 2983/4235] Refactor core-ui + Remove doom/switch-theme (replaced with an advice for load-theme) + Reorganize core-ui + Fix Emacs 26+ hl-line hack being applied for Emacs 25 users + Rename doom|show-whitespace-maybe to doom|highlight-non-default-indentation + Disable tool-bar, menu-bar and vertical-scroll-bars via default-frame-alist; this is a little faster than using the minor modes. --- core/autoload/buffers.el | 12 ---- core/autoload/ui.el | 17 ----- core/core-ui.el | 151 +++++++++++++++++++-------------------- 3 files changed, 73 insertions(+), 107 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 1d599623d..e6d447475 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -199,18 +199,6 @@ regex PATTERN. Returns the number of killed buffers." ;; Hooks ;; -;;;###autoload -(defun doom|protect-visible-buffer () - "Don't kill the current buffer if it is visible in another window (bury it -instead). Meant for `kill-buffer-query-functions'." - (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) - (not (member (substring (buffer-name) 0 1) '(" " "*")))))) - -;;;###autoload -(defun doom|protect-fallback-buffer () - "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." - (not (eq (current-buffer) (doom-fallback-buffer)))) - ;;;###autoload (defun doom|mark-buffer-as-real () "Hook function that marks the current buffer as real." diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 112c7f1d0..2022842ff 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -113,23 +113,6 @@ presentations." (doom|init-theme) (doom|init-fonts))) -;;;###autoload -(defun doom/switch-theme (theme) - "Like `load-theme', but will unload currently loaded themes before switching -to a new one." - (interactive - (list (completing-read - "Load theme: " - (mapcar #'symbol-name - (custom-available-themes))))) - (condition-case nil - (progn - (mapc #'disable-theme custom-enabled-themes) - (load-theme (intern theme) t) - (when (fboundp 'powerline-reset) - (powerline-reset))) - (error "Problem loading theme %s" x))) - ;;;###autoload (defun doom*recenter (&rest _) (recenter)) diff --git a/core/core-ui.el b/core/core-ui.el index 82867f43c..11ea6e4be 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -78,54 +78,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no -;; doesn't exist in terminal Emacs; define it to prevent errors -(unless (fboundp 'define-fringe-bitmap) - (defun define-fringe-bitmap (&rest _))) - - -;; -;; Fixes/hacks -;; - -(defun doom*fix-whitespace-mode-in-childframes (orig-fn &rest args) - (let ((frame (apply orig-fn args))) - (with-selected-frame frame - (setq-local whitespace-style nil) - frame))) -(advice-add #'company-box--make-frame :around #'doom*fix-whitespace-mode-in-childframes) -(advice-add #'posframe--create-posframe :around #'doom*fix-whitespace-mode-in-childframes) - -;; Posframes sometimes linger; force it to clean up after itself! -(after! posframe - ;; TODO Find a better place for this - (defun doom|delete-posframe-on-escape () - (unless (frame-parameter (selected-frame) 'posframe-buffer) - (cl-loop for frame in (frame-list) - if (and (frame-parameter frame 'posframe-buffer) - (not (frame-visible-p frame))) - do (delete-frame frame)) - (dolist (buffer (buffer-list)) - (let ((frame (buffer-local-value 'posframe--frame buffer))) - (when (and frame (or (not (frame-live-p frame)) - (not (frame-visible-p frame)))) - (posframe--kill-buffer buffer)))))) - (add-hook 'doom-escape-hook #'doom|delete-posframe-on-escape) - (add-hook 'doom-cleanup-hook #'posframe-delete-all)) - -;; Disruptive motion errors take over the minibuffer while we're typing there; -;; prevent this from happening. -(defun doom*silence-motion-errors (orig-fn &rest args) - (if (not (minibufferp)) - (apply orig-fn args) - (ignore-errors (apply orig-fn args)) - (when (<= (point) (minibuffer-prompt-end)) - (goto-char (minibuffer-prompt-end))))) - -(advice-add #'left-char :around #'doom*silence-motion-errors) -(advice-add #'right-char :around #'doom*silence-motion-errors) -(advice-add #'delete-backward-char :around #'doom*silence-motion-errors) -(advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) - ;; ;; Plugins @@ -213,7 +165,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; On Emacs 26+, when point is on the last line, hl-line highlights bleed into ;; the rest of the window after eob. This is the fix. - (when (boundp 'display-line-numbers) + (unless (get 'display-line-numbers 'nlinum) (defun doom--line-range () (cons (line-beginning-position) (cond ((save-excursion @@ -225,18 +177,16 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ((line-beginning-position 2))))) (setq hl-line-range-function #'doom--line-range)) + ;; Disable `hl-line' in evil-visual mode (temporarily). `hl-line' can make the + ;; selection region harder to see while in evil visual mode. (after! evil (defvar-local doom-buffer-hl-line-mode nil) - - ;; Disable `hl-line' in evil-visual mode (temporarily). `hl-line' can make - ;; the selection region harder to see while in evil visual mode. (defun doom|disable-hl-line () (when hl-line-mode (setq doom-buffer-hl-line-mode t) (hl-line-mode -1))) (defun doom|enable-hl-line-maybe () (if doom-buffer-hl-line-mode (hl-line-mode +1))) - (add-hook 'evil-visual-state-entry-hook #'doom|disable-hl-line) (add-hook 'evil-visual-state-exit-hook #'doom|enable-hl-line-maybe))) @@ -281,9 +231,8 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (newline-mark ?\n [?¬ ?\n]) (space-mark ?\ [?·] [?.]))) -(defun doom|show-whitespace-maybe () - "Show whitespace-mode when file has an `indent-tabs-mode' that is different -from the default." +(defun doom|highlight-non-default-indentation () + "Highlight whitespace that doesn't match your `indent-tabs-mode' setting." (unless (or (bound-and-true-p global-whitespace-mode) (bound-and-true-p whitespace-mode) (eq indent-tabs-mode (default-value 'indent-tabs-mode)) @@ -298,7 +247,6 @@ from the default." `(face ,@(if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) trailing-lines tail))) (whitespace-mode +1))) -(add-hook 'after-change-major-mode-hook #'doom|show-whitespace-maybe) ;; @@ -456,19 +404,26 @@ frame's window-system, the theme will be reloaded.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) + ;; draw me like one of your French editors (tooltip-mode -1) ; relegate tooltips to echo area only + ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) + ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'display-line-numbers-mode) -;; More sensibile replacements for default commands -(define-key! 'global - ;; prompts the user for confirmation when deleting a non-empty frame - [remap delete-frame] #'doom/delete-frame - ;; a more sensible load-theme, that disables previous themes first - [remap load-theme] #'doom/switch-theme) +;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. +(add-to-list 'default-frame-alist (cons 'buffer-predicate #'doom-buffer-frame-predicate)) + +;; Prevent the glimpse of un-styled Emacs by setting these early. +(add-to-list 'default-frame-alist '(tool-bar-lines 0)) +(add-to-list 'default-frame-alist '(menu-bar-lines 0)) +(add-to-list 'default-frame-alist '(vertical-scroll-bars)) + +;; prompts the user for confirmation when deleting a non-empty frame +(global-set-key [remap delete-frame] #'doom/delete-frame) (defun doom|no-fringes-in-minibuffer (&rest _) "Disable fringes in the minibuffer window." @@ -476,11 +431,6 @@ frame's window-system, the theme will be reloaded.") (add-hook! '(doom-init-ui-hook minibuffer-setup-hook window-configuration-change-hook) #'doom|no-fringes-in-minibuffer) -(defun doom|no-fringes-in-which-key-buffer (&rest _) - (doom|no-fringes-in-minibuffer) - (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) -(advice-add 'which-key--show-buffer-side-window :after #'doom|no-fringes-in-which-key-buffer) - (defun doom|set-mode-name () "Set the major mode's `mode-name', as dictated by `doom-major-mode-names'." (when-let* ((name (cdr (assq major-mode doom-major-mode-names)))) @@ -489,25 +439,70 @@ frame's window-system, the theme will be reloaded.") ((stringp name) name) ((error "'%s' isn't a valid name for %s" name major-mode)))))) +(defun doom|protect-visible-buffer () + "Don't kill the current buffer if it is visible in another window (bury it +instead). Meant for `kill-buffer-query-functions'." + (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) + (not (member (substring (buffer-name) 0 1) '(" " "*")))))) + +(defun doom|protect-fallback-buffer () + "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." + (not (eq (current-buffer) (doom-fallback-buffer)))) (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." - ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. - (add-to-list 'default-frame-alist (cons 'buffer-predicate #'doom-buffer-frame-predicate)) - ;; Switch to `doom-fallback-buffer' if on last real buffer - (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) - ;; Don't kill the fallback buffer (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil #'eq) - ;; Don't kill buffers that are visible in another window, only bury them - (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil #'eq) - ;; Renames major-modes [pedantry intensifies] + (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil #'eq) (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) - ;; Ensure ansi codes in compilation buffers are replaced + (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) (add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) ;; (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) - (add-hook 'emacs-startup-hook #'doom|init-ui) + +;; +;; Fixes/hacks +;; + +;; doesn't exist in terminal Emacs; we define it to prevent errors +(unless (fboundp 'define-fringe-bitmap) + (defun define-fringe-bitmap (&rest _))) + +(defun doom*disable-old-themes-first (orig-fn &rest args) + (mapc #'disable-theme custom-enabled-themes) + (apply orig-fn args) + (when (fboundp 'powerline-reset) + (powerline-reset))) +(advice-add #'load-theme :around #'doom*disable-old-themes-first) + +(defun doom|disable-whitespace-mode-in-childframes (frame) + (when (frame-parameter frame 'parent-frame) + (with-selected-frame frame + (setq-local whitespace-style nil) + frame))) +(add-hook 'after-make-frame-functions #'doom|fix-whitespace-mode-in-childframes) + +;; Disruptive motion errors take over the minibuffer while we're typing there; +;; prevent this from happening. +(defun doom*silence-motion-errors (orig-fn &rest args) + (if (not (minibufferp)) + (apply orig-fn args) + (ignore-errors (apply orig-fn args)) + (when (<= (point) (minibuffer-prompt-end)) + (goto-char (minibuffer-prompt-end))))) +(advice-add #'left-char :around #'doom*silence-motion-errors) +(advice-add #'right-char :around #'doom*silence-motion-errors) +(advice-add #'delete-backward-char :around #'doom*silence-motion-errors) +(advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) + +(defun doom*no-fringes-in-which-key-buffer (&rest _) + (doom|no-fringes-in-minibuffer) + (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) +(advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) + +;; Switch to `doom-fallback-buffer' if on last real buffer +(advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) + (provide 'core-ui) ;;; core-ui.el ends here From 96f22089951f6f3c8542d7cc98eb4a146e44ddb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 23:40:54 +0200 Subject: [PATCH 2984/4235] Move early-init.el to init.el (for now) Calling tool-bar-mode, menu-bar-mode or scroll-bar-mode from early-init.el seems to cause a 15-30% slowdown in startup time, possibly for loading the UI libraries early. Also, loading early-init.el eagerly from init.el causes a GC hit for Emacs 25/26 users. It's too early to use this optimization. --- early-init.el | 49 ++++++++----------------------------------------- init.el | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 48 deletions(-) diff --git a/early-init.el b/early-init.el index af00a89e5..c2c4a4a91 100644 --- a/early-init.el +++ b/early-init.el @@ -1,47 +1,14 @@ ;;; early-init.el -*- lexical-binding: t; -*- ;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el, -;; before package and UI initialization happens. We can use this opportunity to -;; cull parts of the startup process early and optimize Emacs startup ASAP. +;; before package and UI initialization happens. -(unless noninteractive - (defvar doom--file-name-handler-alist - file-name-handler-alist) - (unless after-init-time - ;; A big contributor to long startup times is the garbage collector, so we - ;; up its memory threshold, temporarily and reset it later in - ;; `doom|finalize'. - (setq gc-cons-threshold 402653184 - gc-cons-percentage 1.0 - ;; consulted on every `require', `load' and various file reading - ;; functions. You get a minor speed up by nooping this. - file-name-handler-alist nil)) - - (defun doom|finalize () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes) and resets -`file-name-handler-alist'." - (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 16777216 - gc-cons-percentage 0.15)) - - (add-hook 'emacs-startup-hook #'doom|finalize) - (add-hook 'doom-reload-hook #'doom|finalize)) - -;; Ensure Doom is always running out of this file's directory -(setq user-emacs-directory (file-name-directory load-file-name) - ;; In noninteractive sessions, we hope that non-byte-compiled files will - ;; take precedence over byte-compiled ones, however, if you're getting odd - ;; recursive load errors, it may help to set this to nil. - load-prefer-newer noninteractive - ;; Package initialize occurs automatically, before `user-init-file' is - ;; loaded, but after `early-init-file'. Doom handles package - ;; initialization, so we must prevent Emacs from doing it early! - package-enable-at-startup nil) +;; Package initialize occurs automatically, before `user-init-file' is +;; loaded, but after `early-init-file'. Doom handles package +;; initialization, so we must prevent Emacs from doing it early! +(setq package-enable-at-startup nil) ;; Prevent the glimpse of un-styled Emacs by setting these early. -(if (fboundp 'tool-bar-mode) (tool-bar-mode -1)) -(if (fboundp 'menu-bar-mode) (menu-bar-mode -1)) -(if (fboundp 'scroll-bar-mode) (scroll-bar-mode -1)) - -;; TODO Once Emacs 27 hits stable, perhaps replace init.el with early-init.el +(add-to-list 'default-frame-alist '(tool-bar-lines 0)) +(add-to-list 'default-frame-alist '(menu-bar-lines 0)) +(add-to-list 'default-frame-alist '(vertical-scroll-bars)) diff --git a/init.el b/init.el index 7113f7afe..afda2d3d6 100644 --- a/init.el +++ b/init.el @@ -27,12 +27,35 @@ ;; ;;; License: MIT -(unless (bound-and-true-p early-init-file) - (load (concat (file-name-directory load-file-name) "early-init") - nil t)) +(defvar doom--file-name-handler-alist file-name-handler-alist) +(unless after-init-time + ;; A big contributor to long startup times is the garbage collector, so we + ;; up its memory threshold, temporarily and reset it later in + ;; `doom|finalize'. + (setq gc-cons-threshold 402653184 + gc-cons-percentage 1.0 + ;; consulted on every `require', `load' and various file reading + ;; functions. You get a minor speed up by nooping this. + file-name-handler-alist nil)) + +(defun doom|finalize () + "Resets garbage collection settings to reasonable defaults (if you don't do +this, you'll get stuttering and random freezes) and resets +`file-name-handler-alist'." + (setq file-name-handler-alist doom--file-name-handler-alist + gc-cons-threshold 16777216 + gc-cons-percentage 0.15)) + +(add-hook 'emacs-startup-hook #'doom|finalize) +(add-hook 'doom-reload-hook #'doom|finalize) + +;; Ensure Doom is always running out of this file's directory +(setq user-emacs-directory (file-name-directory load-file-name) + ;; In noninteractive sessions, we hope that non-byte-compiled files will + ;; take precedence over byte-compiled ones, however, if you're getting odd + ;; recursive load errors, it may help to set this to nil. + load-prefer-newer noninteractive) + +;; Let 'er rip! (require 'core (concat user-emacs-directory "core/core")) - -;; Announce Doom's version, in case shell config wants to detect Doom and offer -;; special support for Doom Emacs. -(setenv "DOOM" doom-version) From 36bdf7782b7fbd0b2319736422074278b90a1291 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 23:42:31 +0200 Subject: [PATCH 2985/4235] completion/helm: don't hide minibuffer input line Some helm sources don't display input in the headerline, despite helm-echo-input-in-header-line's value, making your input invisible. --- modules/completion/helm/config.el | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index d6e669fa5..cbb8e01ed 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -133,17 +133,6 @@ be negative.") (advice-add #'helm-display-mode-line :override #'+helm|hide-mode-line) (advice-add #'helm-ag-show-status-default-mode-line :override #'ignore) - (defun +helm*hide-minibuffer-maybe () - "Hide minibuffer in Helm session if we use the header line as input field." - (when (with-current-buffer (helm-buffer-get) helm-echo-input-in-header-line) - (let ((ov (make-overlay (point-min) (point-max) nil nil t))) - (overlay-put ov 'window (selected-window)) - (overlay-put ov 'face - (let ((bg-color (face-background 'default nil))) - `(:background ,bg-color :foreground ,bg-color))) - (setq-local cursor-type nil)))) - (add-hook 'helm-minibuffer-set-up-hook #'+helm*hide-minibuffer-maybe) - ;; TODO Find a better way (defun +helm*use-helpful (orig-fn &rest args) (cl-letf (((symbol-function #'describe-function) From d72f485a9706815270b5c9d8d2a73d3da15b5c58 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 31 Aug 2018 23:43:31 +0200 Subject: [PATCH 2986/4235] tools/editorconfig: defer for 3 seconds Give other plugins more room to load first. --- modules/tools/editorconfig/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index b4b737039..b498d0c55 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -17,7 +17,7 @@ ;; Handles whitespace (tabs/spaces) settings externally. This way projects can ;; specify their own formatting rules. (def-package! editorconfig - :defer 2 + :defer 3 :after-call (doom-enter-buffer-hook after-find-file) :config ;; Register missing indent variables From 708ad138c8760e9e601adbd5d9f71c653e6a5602 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 1 Sep 2018 00:02:39 +0200 Subject: [PATCH 2987/4235] doom/sudo-find-file: don't sudo writeable files --- core/autoload/files.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 9afcb041d..99831229b 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -5,11 +5,11 @@ "Open FILE as root." (interactive (list (read-file-name "Open as root: "))) - (find-file (if (file-writable-p file) - file - (if (file-remote-p file) - (concat "/" (file-remote-p file 'method) ":" (file-remote-p file 'user) "@" (file-remote-p file 'host) "|sudo:root@" (file-remote-p file 'host) ":" (file-remote-p file 'localname)) - (concat "/sudo:root@localhost:" file))))) + (when (file-writable-p file) + (user-error "File is user writeable, aborting sudo")) + (find-file (if (file-remote-p file) + (concat "/" (file-remote-p file 'method) ":" (file-remote-p file 'user) "@" (file-remote-p file 'host) "|sudo:root@" (file-remote-p file 'host) ":" (file-remote-p file 'localname)) + (concat "/sudo:root@localhost:" file)))) ;;;###autoload (defun doom/sudo-this-file () From a188ba9a1e7346aa6885a2ca28de79258b4b4ef0 Mon Sep 17 00:00:00 2001 From: Quentin Le Guennec Date: Fri, 31 Aug 2018 23:10:23 +0200 Subject: [PATCH 2988/4235] adds npm-mode for javascript module --- modules/lang/javascript/config.el | 14 +++++++++++++- modules/lang/javascript/packages.el | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 9333aa94d..043c0840c 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -248,6 +248,18 @@ :localleader :n "se" #'skewer-html-eval-tag)) +;; `npm-mode' +(map! (:after npm-mode + :map npm-mode-keymap + :localleader + :n "nn" #'npm-mode-npm-init + :n "ni" #'npm-mode-npm-install + :n "ns" #'npm-mode-npm-install-save + :n "nd" #'npm-mode-npm-install-save-dev + :n "nu" #'npm-mode-npm-uninstall + :n "nl" #'npm-mode-npm-list + :n "nr" #'npm-mode-npm-run + :n "nv" #'npm-mode-visit-project-file)) ;; ;; Projects @@ -256,7 +268,7 @@ (def-project-mode! +javascript-npm-mode :modes (html-mode css-mode web-mode js2-mode rjsx-mode json-mode markdown-mode) :when (locate-dominating-file default-directory "package.json") - :add-hooks (+javascript|add-node-modules-path)) + :add-hooks (+javascript|add-node-modules-path npm-mode)) (def-project-mode! +javascript-gulp-mode :when (locate-dominating-file default-directory "gulpfile.js")) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 0a65090ff..9d4723a73 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -12,6 +12,7 @@ (package! skewer-mode) (package! tide) (package! typescript-mode) +(package! npm-mode) (when (featurep! :feature lookup) (package! xref-js2)) From 72d8c5dd563a4d9b62d89b3f034692bc2eb97540 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 1 Sep 2018 12:30:34 +0200 Subject: [PATCH 2989/4235] New doom/delete-trailing-newlines command --- core/autoload/editor.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index c304405db..56d9cb942 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -254,6 +254,22 @@ Inspired from http://demonastery.org/2013/04/emacs-evil-narrow-region/" (t (widen)))) +;;;###autoload +(defun doom/delete-trailing-newlines () + "Trim trailing newlines. + +Respects `require-final-newline'." + (interactive) + (goto-char (point-max)) + (skip-chars-backward " \t\n\v") + (when (looking-at "\n\\(\n\\|\\'\\)") + (forward-char 1)) + (when require-final-newline + (unless (bolp) + (insert "\n"))) + (when (looking-at "\n+") + (replace-match ""))) + ;; ;; Advice From 712b775f36c7908d60359213efe99daf08426c49 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 1 Sep 2018 12:31:37 +0200 Subject: [PATCH 2990/4235] Remove doom*set-indirect-buffer-filename hack This was done to help the modeline build its file path in indirect buffers, but this has been fixed by using buffer-base-buffer. Both ui/modeline and ui/doom-modeline have been refactored to accommodate this. --- core/core.el | 13 ------- modules/ui/doom-modeline/config.el | 58 ++++++++++++++++-------------- modules/ui/modeline/config.el | 2 +- 3 files changed, 33 insertions(+), 40 deletions(-) diff --git a/core/core.el b/core/core.el index 47693e03c..90a2d67d1 100644 --- a/core/core.el +++ b/core/core.el @@ -288,19 +288,6 @@ enable multiple minor modes for the same regexp.") (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*symbol-file (orig-fn symbol &optional type) "If a `doom-file' symbol property exists on SYMBOL, use that instead of the original value of `symbol-file'." diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index ceba2594c..800b7342e 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -294,28 +294,35 @@ file-name => comint.el") (defun +doom-modeline-buffer-file-name () "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." - (let ((buffer-file-name (or buffer-file-name "")) - (buffer-file-truename (or buffer-file-truename ""))) + (let ((buffer-file-name (or (buffer-file-name (buffer-base-buffer)) ""))) + (unless buffer-file-truename + (setq buffer-file-truename (file-truename buffer-file-name))) (propertize (pcase +doom-modeline-buffer-file-name-style - (`truncate-upto-project (+doom-modeline--buffer-file-name 'shrink)) - (`truncate-upto-root (+doom-modeline--buffer-file-name-truncate)) - (`truncate-all (+doom-modeline--buffer-file-name-truncate t)) - (`relative-to-project (+doom-modeline--buffer-file-name-relative)) - (`relative-from-project (+doom-modeline--buffer-file-name-relative 'include-project)) - (`file-name (propertize (file-name-nondirectory buffer-file-name) - 'face - (let ((face (or (and (buffer-modified-p) - 'doom-modeline-buffer-modified) - (and (active) - 'doom-modeline-buffer-file)))) - (when face `(:inherit ,face)))))) + (`truncate-upto-project + (+doom-modeline--buffer-file-name buffer-file-name buffer-file-truename 'shrink)) + (`truncate-upto-root + (+doom-modeline--buffer-file-name-truncate buffer-file-name buffer-file-truename)) + (`truncate-all + (+doom-modeline--buffer-file-name-truncate buffer-file-name buffer-file-truename t)) + (`relative-to-project + (+doom-modeline--buffer-file-name-relative buffer-file-name buffer-file-truename)) + (`relative-from-project + (+doom-modeline--buffer-file-name-relative buffer-file-name buffer-file-truename 'include-project)) + (`file-name + (propertize (file-name-nondirectory buffer-file-name) + 'face + (let ((face (or (and (buffer-modified-p) + 'doom-modeline-buffer-modified) + (and (active) + 'doom-modeline-buffer-file)))) + (when face `(:inherit ,face)))))) 'help-echo buffer-file-truename))) -(defun +doom-modeline--buffer-file-name-truncate (&optional truncate-tail) +(defun +doom-modeline--buffer-file-name-truncate (file-path true-file-path &optional truncate-tail) "Propertized `buffer-file-name' that truncates every dir along path. If TRUNCATE-TAIL is t also truncate the parent directory of the file." - (let ((dirs (shrink-path-prompt (file-name-directory buffer-file-truename))) + (let ((dirs (shrink-path-prompt (file-name-directory true-file-path))) (active (active))) (if (null dirs) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) @@ -328,27 +335,26 @@ If TRUNCATE-TAIL is t also truncate the parent directory of the file." (if truncate-tail (substring basename 0 1) basename) "/") 'face (if dir-faces `(:inherit ,dir-faces))) - (propertize (file-name-nondirectory buffer-file-name) + (propertize (file-name-nondirectory file-path) 'face (if file-faces `(:inherit ,file-faces))))))))) -(defun +doom-modeline--buffer-file-name-relative (&optional include-project) +(defun +doom-modeline--buffer-file-name-relative (_file-path true-file-path &optional include-project) "Propertized `buffer-file-name' showing directories relative to project's root only." (let ((root (doom-project-root)) (active (active))) (if (null root) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (true-filename (file-truename buffer-file-name)) - (relative-dirs (file-relative-name (file-name-directory true-filename) + (relative-dirs (file-relative-name (file-name-directory true-file-path) (if include-project (concat root "../") root))) (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) (if (equal "./" relative-dirs) (setq relative-dirs "")) (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory true-filename) + (propertize (file-name-nondirectory true-file-path) 'face (if file-faces `(:inherit ,file-faces)))))))) -(defun +doom-modeline--buffer-file-name (truncate-project-root-parent) +(defun +doom-modeline--buffer-file-name (file-path _true-file-path &optional truncate-project-root-parent) "Propertized `buffer-file-name'. If TRUNCATE-PROJECT-ROOT-PARENT is t space will be saved by truncating it down fish-shell style. @@ -357,12 +363,12 @@ Example: ~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" (let* ((project-root (doom-project-root)) (file-name-split (shrink-path-file-mixed project-root - (file-name-directory buffer-file-name) - buffer-file-name)) + (file-name-directory file-path) + file-path)) (active (active))) (if (null file-name-split) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (pcase-let ((`(,root-path-parent ,project ,relative-path ,filename) file-name-split)) + (pcase-let ((`(,root-path-parent ,project ,relative-path ,file-path) file-name-split)) (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) (let ((sp-faces (or modified-faces (if active 'font-lock-comment-face))) (project-faces (or modified-faces (if active 'font-lock-string-face))) @@ -378,7 +384,7 @@ Example: 'face sp-props) (propertize (concat project "/") 'face project-props) (if relative-path (propertize relative-path 'face relative-props)) - (propertize filename 'face file-props))))))))) + (propertize file-path 'face file-props))))))))) ;; diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 568ace706..01b0ed36e 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -434,7 +434,7 @@ Meant for `+modeline-buffer-path-function'." :init "%b" :faces t (if buffer-file-name - (+modeline-build-path buffer-file-name) + (+modeline-build-path (buffer-file-name (buffer-base-buffer))) "%b")) (def-modeline-segment! +modeline-buffer-directory From fdea8ff5ee08aadea2cb16de12dbb7beea2e9d8b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 1 Sep 2018 12:40:08 +0200 Subject: [PATCH 2991/4235] ui/modeline: fontify buffer-id default value --- modules/ui/modeline/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 01b0ed36e..7f80e329d 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -431,11 +431,11 @@ Meant for `+modeline-buffer-path-function'." (def-modeline-segment! +modeline-buffer-id :on-hooks (find-file-hook after-save-hook after-revert-hook) - :init "%b" + :init (propertize "%b" 'face 'doom-modeline-buffer-file) :faces t (if buffer-file-name (+modeline-build-path (buffer-file-name (buffer-base-buffer))) - "%b")) + (propertize "%b" 'face 'doom-modeline-buffer-file))) (def-modeline-segment! +modeline-buffer-directory (let ((face (if (active) 'doom-modeline-buffer-path))) From 92cfcf3627af69685d6eebaacbec4a104728defc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 1 Sep 2018 16:17:52 +0200 Subject: [PATCH 2992/4235] lang/elixir: conditionally install flycheck-credo And register flycheck-credo after elixir-mode loads. --- modules/lang/elixir/config.el | 11 +++++------ modules/lang/elixir/packages.el | 3 ++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 0f72f2cdf..5f90a772e 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -26,7 +26,11 @@ ;; the entire closure to get rid of it. (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) (remove-hook 'alchemist-mode-hook fn) - (remove-hook 'alchemist-iex-mode-hook fn)))) + (remove-hook 'alchemist-iex-mode-hook fn))) + + (def-package! flycheck-credo + :when (featurep! :feature syntax-checker) + :config (flycheck-credo-setup))) (def-package! alchemist @@ -37,8 +41,3 @@ :documentation #'alchemist-help-search-at-point) (set-eval-handler! 'elixir-mode #'alchemist-eval-region) (set-repl-handler! 'elixir-mode #'alchemist-iex-project-run)) - -(def-package! flycheck-credo - :when (featurep! :feature syntax-checker) - :after flycheck - :config (flycheck-credo-setup)) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index 42ba8a6f5..f55347979 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -4,4 +4,5 @@ ;; +elixir.el (package! elixir-mode) (package! alchemist) -(package! flycheck-credo) +(when (featurep! :feature syntax-checker) + (package! flycheck-credo)) From 83a843bfe6964b7d2f6b449faedc1aa01d0204cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 1 Sep 2018 16:30:17 +0200 Subject: [PATCH 2993/4235] Fix void-function doom|fix-whitespace-mode-in-childframes Function was renamed. --- 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 11ea6e4be..fbcc483f6 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -481,7 +481,7 @@ instead). Meant for `kill-buffer-query-functions'." (with-selected-frame frame (setq-local whitespace-style nil) frame))) -(add-hook 'after-make-frame-functions #'doom|fix-whitespace-mode-in-childframes) +(add-hook 'after-make-frame-functions #'doom|disable-whitespace-mode-in-childframes) ;; Disruptive motion errors take over the minibuffer while we're typing there; ;; prevent this from happening. From 32de22b1d273bf63b8e1d06a11a8279bd72fc743 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 13:00:46 +0200 Subject: [PATCH 2994/4235] Remove :load-path Gah, it snuck in again! Sneaky punk... --- core/core-ui.el | 1 - 1 file changed, 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index fbcc483f6..efc609067 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -113,7 +113,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; `highlight-escape-sequences' (def-package! highlight-escape-sequences - :load-path "~/work/plugins/highlight-escape-sequences" :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) ;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially From b3fb3ef55ffc08666aefca253c32ec71a001aa70 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 15:15:58 +0200 Subject: [PATCH 2995/4235] Fix highlight-numbers in elixir-mode The new highlight-numbers regexp depends on a mode to have a well defined syntax table. elixir-mode does not appear to be one of those modes. --- 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 efc609067..927de96af 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -109,7 +109,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; `highlight-numbers' -- better number literal fontification in code (def-package! highlight-numbers :hook (prog-mode . highlight-numbers-mode) - :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+.*\\_>")) + :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) ;; `highlight-escape-sequences' (def-package! highlight-escape-sequences From a581b7fc3f84687c955350b2c87117115ec2ed04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 15:18:16 +0200 Subject: [PATCH 2996/4235] Remove jit-lock-* options Only jit-lock-stealth-nice is different from the default, and slows down some scrolling operations without helping much. It may be better to conditionally enable this in larger buffer. --- core/core-ui.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 927de96af..0672d744c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -61,11 +61,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") use-dialog-box nil ; always avoid GUI visible-cursor nil x-stretch-cursor nil - ;; defer jit font locking slightly to [try to] improve Emacs performance - jit-lock-defer-time nil - jit-lock-stealth-nice 0.1 - jit-lock-stealth-time 0.2 - jit-lock-stealth-verbose nil ;; `pos-tip' defaults pos-tip-internal-border-width 6 pos-tip-border-width 1 From daef19ba640d920c3105a394decfc3afe1189254 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 17:06:12 +0200 Subject: [PATCH 2997/4235] Defer garbage collection in the minibuffer This can speed up things that run in or from the minibuffer, like projectile/helm/ivy commands. --- core/core.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/core.el b/core/core.el index 90a2d67d1..410067e9e 100644 --- a/core/core.el +++ b/core/core.el @@ -298,6 +298,14 @@ original value of `symbol-file'." ;; Truly silence startup message (fset #'display-startup-echo-area-message #'ignore) +;; Don't garbage collect to speed up minibuffer commands +(defun doom|defer-garbage-collection () + (setq gc-cons-threshold most-positive-fixnum)) +(defun doom|restore-garbage-collection () + (setq gc-cons-threshold doom-gc-cons-threshold)) +(add-hook 'minibuffer-setup-hook #'doom|defer-garbage-collection) +(add-hook 'minibuffer-exit-hook #'doom|restore-garbage-collection) + ;; ;; Bootstrap helpers From 3a23ff56cd054d744fe1df5e11a9f466cfb59f65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 17:18:31 +0200 Subject: [PATCH 2998/4235] General formatting & minor refactors --- core/core-editor.el | 4 +++- core/core-os.el | 3 +-- core/core-ui.el | 3 ++- modules/lang/elixir/config.el | 4 ++-- modules/lang/javascript/config.el | 22 +++++++++++----------- modules/tools/magit/config.el | 2 +- modules/ui/modeline/config.el | 6 ++---- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 5e9a68459..6151c7c46 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -297,7 +297,9 @@ savehist file." (def-package! ws-butler :after-call (after-find-file) :config - (nconc ws-butler-global-exempt-modes '(special-mode comint-mode term-mode eshell-mode)) + (setq ws-butler-global-exempt-modes + (append ws-butler-global-exempt-modes + '(special-mode comint-mode term-mode eshell-mode))) (ws-butler-global-mode)) (provide 'core-editor) diff --git a/core/core-os.el b/core/core-os.el index 9e1178496..e0723f6a7 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -8,8 +8,7 @@ ;; stop copying each visual state move to the clipboard: ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on -;; Most of this code grokked from: -;; http://stackoverflow.com/questions/15873346/elisp-rename-macro +;; grokked from: http://stackoverflow.com/questions/15873346/elisp-rename-macro (advice-add #'evil-visual-update-x-selection :override #'ignore) (defmacro set-env! (&rest _vars) diff --git a/core/core-ui.el b/core/core-ui.el index 0672d744c..4015c6d67 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -372,7 +372,8 @@ frame's window-system, the theme will be reloaded.") ;; frames, however. There's always `doom/reload-theme' if you need it! (defun doom|reload-theme-in-frame-maybe (frame) "Reloads the theme in new daemon or tty frames." - (when (and (framep frame) + (when (and doom-theme + (framep frame) (not (eq doom-last-window-system (framep-on-display frame)))) (with-selected-frame frame (load-theme doom-theme t)) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 5f90a772e..cfa23f7b0 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -22,8 +22,8 @@ :init (set-company-backend! 'elixir-mode '(alchemist-company company-yasnippet)) :config - ;; Alchemist doesn't use hook symbols to add these backends, so we have to use - ;; the entire closure to get rid of it. + ;; Alchemist doesn't use hook symbols to add these backends, so we have to + ;; use the entire closure to get rid of it. (let ((fn (byte-compile (lambda () (add-to-list (make-local-variable 'company-backends) 'alchemist-company))))) (remove-hook 'alchemist-mode-hook fn) (remove-hook 'alchemist-iex-mode-hook fn))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 043c0840c..794822161 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -249,17 +249,17 @@ :n "se" #'skewer-html-eval-tag)) ;; `npm-mode' -(map! (:after npm-mode - :map npm-mode-keymap - :localleader - :n "nn" #'npm-mode-npm-init - :n "ni" #'npm-mode-npm-install - :n "ns" #'npm-mode-npm-install-save - :n "nd" #'npm-mode-npm-install-save-dev - :n "nu" #'npm-mode-npm-uninstall - :n "nl" #'npm-mode-npm-list - :n "nr" #'npm-mode-npm-run - :n "nv" #'npm-mode-visit-project-file)) +(map! :after npm-mode + :map npm-mode-keymap + :localleader + :n "nn" #'npm-mode-npm-init + :n "ni" #'npm-mode-npm-install + :n "ns" #'npm-mode-npm-install-save + :n "nd" #'npm-mode-npm-install-save-dev + :n "nu" #'npm-mode-npm-uninstall + :n "nl" #'npm-mode-npm-list + :n "nr" #'npm-mode-npm-run + :n "nv" #'npm-mode-visit-project-file) ;; ;; Projects diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index a9930cb7b..fe0d4d1e4 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -87,7 +87,7 @@ available.") (setq evil-magit-state 'normal evil-magit-use-z-for-folds t) :config - (define-key! magit-mode-map + (define-key! magit-mode-map ; replaced by z1, z2, z3, etc (kbd "M-1") nil (kbd "M-2") nil (kbd "M-3") nil diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 7f80e329d..955b84af4 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -249,7 +249,7 @@ Currently available functions: concat (if (eq idx len) "\"};" "\",\n"))) 'xpm t :ascent 'center))))) -(defun +modeline-build-path (&optional path) +(defun +modeline-build-path (path) "Construct the file path for the `+modeline-buffer-id' segment using `+mdoeline-buffer-path-function'. If the buffer has no `buffer-file-name', just use `buffer-name'." @@ -433,9 +433,7 @@ Meant for `+modeline-buffer-path-function'." :on-hooks (find-file-hook after-save-hook after-revert-hook) :init (propertize "%b" 'face 'doom-modeline-buffer-file) :faces t - (if buffer-file-name - (+modeline-build-path (buffer-file-name (buffer-base-buffer))) - (propertize "%b" 'face 'doom-modeline-buffer-file))) + (+modeline-build-path (buffer-file-name (buffer-base-buffer)))) (def-modeline-segment! +modeline-buffer-directory (let ((face (if (active) 'doom-modeline-buffer-path))) From 3d5c8ba27964e09054b54d6d568d2a690c12358d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 17:18:55 +0200 Subject: [PATCH 2999/4235] Add :lang idris to init.example.el Needs a witty comment! --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 9a084b5b3..aaae090b1 100644 --- a/init.example.el +++ b/init.example.el @@ -94,6 +94,7 @@ ;go ; the hipster dialect ;(haskell +intero) ; a language that's lazier than I am ;hy ; readability of scheme w/ speed of python + ;idris ; ;(java +meghanada) ; the poster child for carpal tunnel syndrome ;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;julia ; a better, faster MATLAB From 31bcac9a1ef555aca3b6e33800299c90fb17fb84 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 17:28:04 +0200 Subject: [PATCH 3000/4235] Refactor gc optimizations on startup Slightly smaller default gc-cons-threshold (and default gc-cons-percentage), for less stuttering, and use most-postive-fixnum as a ceiling. --- init.el | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/init.el b/init.el index afda2d3d6..e54173824 100644 --- a/init.el +++ b/init.el @@ -27,35 +27,38 @@ ;; ;;; License: MIT +(defvar doom-gc-cons-threshold (* 8 1024 1024) + "The default value to use for `gc-cons-threshold'.") + + (defvar doom--file-name-handler-alist file-name-handler-alist) - (unless after-init-time - ;; A big contributor to long startup times is the garbage collector, so we - ;; up its memory threshold, temporarily and reset it later in - ;; `doom|finalize'. - (setq gc-cons-threshold 402653184 - gc-cons-percentage 1.0 - ;; consulted on every `require', `load' and various file reading - ;; functions. You get a minor speed up by nooping this. - file-name-handler-alist nil)) + ;; A big contributor to long startup times is the garbage collector, so we up + ;; its memory threshold, temporarily and reset it later in + ;; `doom|disable-startup-optimizations'. + (setq gc-cons-threshold most-positive-fixnum) + ;; This is consulted on every `require', `load' and various file reading + ;; functions. You get a minor speed up by nooping this. + (setq file-name-handler-alist nil)) -(defun doom|finalize () +(defun doom|disable-startup-optimizations () "Resets garbage collection settings to reasonable defaults (if you don't do this, you'll get stuttering and random freezes) and resets `file-name-handler-alist'." (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold 16777216 - gc-cons-percentage 0.15)) + gc-cons-threshold doom-gc-cons-threshold) + (makunbound 'doom--file-name-handler-alist)) + +(add-hook 'emacs-startup-hook #'doom|disable-startup-optimizations) +(add-hook 'doom-reload-hook #'doom|disable-startup-optimizations) -(add-hook 'emacs-startup-hook #'doom|finalize) -(add-hook 'doom-reload-hook #'doom|finalize) ;; Ensure Doom is always running out of this file's directory -(setq user-emacs-directory (file-name-directory load-file-name) - ;; In noninteractive sessions, we hope that non-byte-compiled files will - ;; take precedence over byte-compiled ones, however, if you're getting odd - ;; recursive load errors, it may help to set this to nil. - load-prefer-newer noninteractive) +(setq user-emacs-directory (file-name-directory load-file-name)) +;; In noninteractive sessions, we hope that non-byte-compiled files will take +;; precedence over byte-compiled ones, however, if you're getting odd recursive +;; load errors, it may help to set this to nil. +(setq load-prefer-newer noninteractive) ;; Let 'er rip! (require 'core (concat user-emacs-directory "core/core")) From 5e25cfd6a7766e1f27fe4c1d5715452c4bb69dba Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 20:38:36 +0200 Subject: [PATCH 3001/4235] Fix delete-other-windows in popups #858 Originally, calling delete-other-windows from a popup window would kill only popup windows. This has been corrected to raise the popup, *then* delete other windows. As if you'd done `M-x +popup/raise` then `M-x delete-other-windows` --- modules/ui/popup/autoload/popup.el | 54 +++++++++++++++++------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index ff732a24b..eb856a004 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -28,29 +28,6 @@ the buffer is visible, then set another timer and try again later." (let (kill-buffer-hook kill-buffer-query-functions) (kill-buffer buffer)))))))))) -;;;###autoload -(defun +popup--init (window &optional alist) - "Initializes a popup window. Run any time a popup is opened. It sets the -default window parameters for popup windows, clears leftover transient timers -and enables `+popup-buffer-mode'." - (with-selected-window window - (setq alist (delq (assq 'actions alist) alist)) - (when (and alist +popup--populate-wparams) - ;; Emacs 26+ will automatically map the window-parameters alist entry to - ;; the popup window, so we need this for Emacs 25.x users - (dolist (param (cdr (assq 'window-parameters alist))) - (set-window-parameter window (car param) (cdr param)))) - (set-window-parameter window 'popup t) - (set-window-parameter window 'delete-window #'+popup--delete-window) - (set-window-parameter window 'delete-other-windows #'+popup/close-all) - (set-window-dedicated-p window 'popup) - (window-preserve-size - window (memq (window-parameter window 'window-side) - '(left right)) - t) - (+popup-buffer-mode +1) - (run-hooks '+popup-create-window-hook))) - (defun +popup--delete-window (window) "Do housekeeping before destroying a popup window. @@ -94,6 +71,14 @@ and enables `+popup-buffer-mode'." (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))))))))) +(defun +popup--delete-other-windows (window) + "Called in lieu of `delete-other-windows' in popup windows. + +Raises WINDOW (assumed to be a popup), then deletes other windows." + (when-let* ((window (+popup/raise))) + (delete-other-windows window)) + nil) + (defun +popup--normalize-alist (alist) "Merge `+popup-default-alist' and `+popup-default-parameters' with ALIST." (when alist @@ -118,6 +103,29 @@ and enables `+popup-buffer-mode'." parameters) alist))) +;;;###autoload +(defun +popup--init (window &optional alist) + "Initializes a popup window. Run any time a popup is opened. It sets the +default window parameters for popup windows, clears leftover transient timers +and enables `+popup-buffer-mode'." + (with-selected-window window + (setq alist (delq (assq 'actions alist) alist)) + (when (and alist +popup--populate-wparams) + ;; Emacs 26+ will automatically map the window-parameters alist entry to + ;; the popup window, so we need this for Emacs 25.x users + (dolist (param (cdr (assq 'window-parameters alist))) + (set-window-parameter window (car param) (cdr param)))) + (set-window-parameter window 'popup t) + (set-window-parameter window 'delete-window #'+popup--delete-window) + (set-window-parameter window 'delete-other-windows #'+popup--delete-other-windows) + (set-window-dedicated-p window 'popup) + (window-preserve-size + window (memq (window-parameter window 'window-side) + '(left right)) + t) + (+popup-buffer-mode +1) + (run-hooks '+popup-create-window-hook))) + ;; ;; Public library From c885cd2b9d29082b6769fbfc759531f00ceb13de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 20:45:16 +0200 Subject: [PATCH 3002/4235] editor/format: refactor & reformat +format-buffer Also switches cl-destructuring-bind to pcase-let to avoid breaking errors being thrown. --- modules/editor/format/autoload/format.el | 37 +++++++++++------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 49110377d..a9abbd3b8 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -77,19 +77,6 @@ Stolen shamelessly from go-mode" ((error "Invalid rcs patch or internal error in +format--apply-rcs-patch"))))))) (move-to-column column))) -(defun +format--with-copy-of-buffer (formatter executable mode-result) - "Run formatter in a copy of the current buffer. - -Since `format-all' functions (and various formatting functions, like `gofmt') -widen the buffer, in order to only format a region of text, we must make a copy -of the buffer to apply formatting to." - (if (buffer-narrowed-p) - (let ((output (buffer-substring-no-properties (point-min) (point-max)))) - (with-temp-buffer - (insert output) - (funcall formatter executable mode-result))) - (funcall formatter executable mode-result))) - ;; ;; Public library @@ -115,8 +102,15 @@ See `+format/buffer' for the interactive version of this function, and (user-error "Don't know how to format '%s' code" major-mode)) (let ((f-function (gethash formatter format-all-format-table)) (executable (format-all-formatter-executable formatter))) - (cl-destructuring-bind (output errput first-diff) - (+format--with-copy-of-buffer f-function executable mode-result) + (pcase-let + ((`(,output ,errput ,first-diff) + ;; Since `format-all' functions (and various formatting functions, + ;; like `gofmt') widen the buffer, in order to only format a region of + ;; text, we must make a copy of the buffer to apply formatting to. + (let ((output (buffer-substring-no-properties (point-min) (point-max)))) + (with-temp-buffer + (insert output) + (funcall f-function executable mode-result))))) (unwind-protect (cond ((null output) 'error) ((eq output t) 'noop) @@ -126,14 +120,17 @@ See `+format/buffer' for the interactive version of this function, and (coding-system-for-write 'utf-8)) (unwind-protect (progn - (with-current-buffer patchbuf (erase-buffer)) - (with-temp-file tmpfile (erase-buffer) (insert output)) + (with-current-buffer patchbuf + (erase-buffer)) + (with-temp-file tmpfile + (erase-buffer) + (insert output)) (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) 'noop (+format--apply-rcs-patch patchbuf) - (list output errput first-diff)))) - (kill-buffer patchbuf) - (delete-file tmpfile)))) + (list output errput first-diff))) + (kill-buffer patchbuf) + (delete-file tmpfile))))) (unless (= 0 (length errput)) (message "Formatter error output:\n%s" errput)))))) From 75b39a9396f728213ee8bb22026b75268fed8416 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 20:46:13 +0200 Subject: [PATCH 3003/4235] editor/format: preserve indentation for regions --- modules/editor/format/autoload/format.el | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index a9abbd3b8..014838713 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -155,7 +155,23 @@ snippets or single lines." (interactive "r") (save-restriction (narrow-to-region beg end) - (+format/buffer))) + ;; Since we're piping a region of text to the formatter, remove any leading + ;; indentation to make it look like a file. + (let ((indent (save-excursion + (goto-char beg) + (skip-chars-forward " \t\n") + (current-indentation)))) + (with-silent-modifications + (indent-rigidly (point-min) (point-max) (- indent))) + (+format/buffer) + (with-silent-modifications + ;; Then restore it afterwards, without affecting new indentation + (indent-rigidly (point-min) (point-max) + (max 0 (- indent + (save-excursion + (goto-char beg) + (skip-chars-forward " \t\n") + (current-column))))))))) ;;;###autoload (defun +format/region-or-buffer (beg end) From 81ee563c4c914932d2948c9b9506e5106470962d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 2 Sep 2018 20:46:43 +0200 Subject: [PATCH 3004/4235] +format|buffer: use pcase-let & return boolean So it can be used in other functions. --- modules/editor/format/autoload/format.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 014838713..99200a29e 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -197,9 +197,8 @@ is selected)." "Format the source code in the current buffer with minimal feedback. Meant for `before-save-hook'." - (cl-destructuring-bind (formatter mode-result) (format-all-probe) + (pcase-let ((`(,formatter ,mode-result) (format-all-probe))) (pcase (+format-buffer formatter mode-result) - (`error (message "Failed to format buffer due to errors")) - (`noop (message "Buffer was already formatted")) - (_ (message "Formatted (%s)" formatter))))) - + (`error (message "Failed to format buffer due to errors") nil) + (`noop (message "Buffer was already formatted") nil) + (_ (message "Formatted (%s)" formatter) t)))) From eaa10946f1d4df001405bd0a3d41d15ec15b043f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 01:18:52 +0200 Subject: [PATCH 3005/4235] Refactor startup optimizations + Add doom-gc-cons-upper-limit variable + Don't use most-positive-fixnum, in case Emacs somehow wants to allocate that much! + Don't use startup optimizations in noninteractive sessions + Restore gc-cons-threshold on idle timer, instead of hook (to defer the possible GC pause and so deferred packages can take advantage of these optimizations). --- core/core.el | 15 ++++++++------- init.el | 41 +++++++++++++++++++++++++---------------- 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/core/core.el b/core/core.el index 410067e9e..9ef4927ce 100644 --- a/core/core.el +++ b/core/core.el @@ -300,7 +300,7 @@ original value of `symbol-file'." ;; Don't garbage collect to speed up minibuffer commands (defun doom|defer-garbage-collection () - (setq gc-cons-threshold most-positive-fixnum)) + (setq gc-cons-threshold doom-gc-cons-upper-limit)) (defun doom|restore-garbage-collection () (setq gc-cons-threshold doom-gc-cons-threshold)) (add-hook 'minibuffer-setup-hook #'doom|defer-garbage-collection) @@ -318,12 +318,13 @@ easier to tell where the came from. Meant to be used with `run-hook-wrapped'." (when doom-debug-mode (message "Running doom hook: %s" hook)) - (condition-case e - (funcall hook) - ((debug error) - (signal 'doom-hook-error (list hook e)))) - ;; return nil so `run-hook-wrapped' won't short circuit - nil) + (let ((gc-cons-threshold doom-gc-cons-upper-limit)) + (condition-case e + (funcall hook) + ((debug error) + (signal 'doom-hook-error (list hook e)))) + ;; return nil so `run-hook-wrapped' won't short circuit + nil)) (defun doom-ensure-same-emacs-version-p () "Check if the running version of Emacs has changed and set diff --git a/init.el b/init.el index e54173824..3529750bc 100644 --- a/init.el +++ b/init.el @@ -27,30 +27,38 @@ ;; ;;; License: MIT -(defvar doom-gc-cons-threshold (* 8 1024 1024) - "The default value to use for `gc-cons-threshold'.") +(defvar doom-gc-cons-threshold 16777216 ; 16mb + "The default value to use for `gc-cons-threshold'. If you experience freezing, +decrease this. If you experience stuttering, increase this.") + +(defvar doom-gc-cons-upper-limit 268435456 ; 256mb + "The temporary value for `gc-cons-threshold' to defer it.") (defvar doom--file-name-handler-alist file-name-handler-alist) -(unless after-init-time + +(defun doom|restore-startup-optimizations () + "Resets garbage collection settings to reasonable defaults (a large +`gc-cons-threshold' can cause random freezes otherwise) and resets +`file-name-handler-alist'." + (setq file-name-handler-alist doom--file-name-handler-alist + gc-cons-threshold doom-gc-cons-threshold)) + + +(if (or after-init-time noninteractive) + (setq gc-cons-threshold doom-gc-cons-threshold) ;; A big contributor to long startup times is the garbage collector, so we up ;; its memory threshold, temporarily and reset it later in ;; `doom|disable-startup-optimizations'. - (setq gc-cons-threshold most-positive-fixnum) + (setq gc-cons-threshold doom-gc-cons-upper-limit) ; 256mb ;; This is consulted on every `require', `load' and various file reading ;; functions. You get a minor speed up by nooping this. - (setq file-name-handler-alist nil)) - -(defun doom|disable-startup-optimizations () - "Resets garbage collection settings to reasonable defaults (if you don't do -this, you'll get stuttering and random freezes) and resets -`file-name-handler-alist'." - (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold doom-gc-cons-threshold) - (makunbound 'doom--file-name-handler-alist)) - -(add-hook 'emacs-startup-hook #'doom|disable-startup-optimizations) -(add-hook 'doom-reload-hook #'doom|disable-startup-optimizations) + (setq file-name-handler-alist nil) + ;; Restore these to their defaults later. Do it on an idle timer to defer the + ;; possible GC pause, and to give deferred packages the ability to take + ;; advantage of these optimizations. + (run-with-idle-timer 5 nil #'doom|restore-startup-optimizations) + (add-hook 'doom-reload-hook #'doom|restore-startup-optimizations)) ;; Ensure Doom is always running out of this file's directory @@ -60,5 +68,6 @@ this, you'll get stuttering and random freezes) and resets ;; load errors, it may help to set this to nil. (setq load-prefer-newer noninteractive) + ;; Let 'er rip! (require 'core (concat user-emacs-directory "core/core")) From 596705dbda308cb03dec61a3e8c90bf3001d69f2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 02:15:10 +0200 Subject: [PATCH 3006/4235] Properly prioritize private snippets #852 In the previous solution, if *any* private snippets existed, *all* non-private snippets were hidden. --- modules/feature/snippets/autoload/snippets.el | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index b283abc3c..5a3aeea10 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -1,21 +1,30 @@ ;;; feature/snippets/autoload/snippets.el -*- lexical-binding: t; -*- +(defun +snippets--remove-p (x y) + (and (equal (yas--template-key x) (yas--template-key y)) + (file-in-directory-p (yas--template-get-file x) doom-emacs-dir))) + ;;;###autoload (defun +snippets-prompt-private (prompt choices &optional fn) - "Prioritize private snippets (in `+snippets-dir') over built-in ones if there -are multiple choices." - (when-let* - ((choices - (or (cl-loop for tpl in choices - for file = (yas--template-get-file tpl) - if (or (null file) - (file-in-directory-p file +snippets-dir)) - collect tpl) - choices))) - (if (cdr choices) - (let ((prompt-functions (remq '+snippets-prompt-private yas-prompt-functions))) - (run-hook-with-args-until-success 'prompt-functions prompt choices fn)) - (car choices)))) + "Prioritize private snippets over built-in ones if there are multiple +choices. + +There are two groups of snippets in Doom Emacs. The built in ones (under +`doom-emacs-dir'; provided by Doom or its plugins) or your private snippets +(outside of `doom-eamcs-dir'). + +If there are multiple snippets with the same key in either camp (but not both), +you will be prompted to select one. + +If there are conflicting keys across the two camps, the built-in ones are +ignored. This makes it easy to override built-in snippets with private ones." + (when (memq this-command '(yas-expand +snippets/expand-on-region)) + (let* ((gc-cons-threshold doom-gc-cons-upper-limit) + (choices (cl-remove-duplicates choices :test #'+snippets--remove-p))) + (if (cdr choices) + (let ((prompt-functions (remq '+snippets-prompt-private yas-prompt-functions))) + (run-hook-with-args-until-success 'prompt-functions prompt choices fn)) + (car choices))))) ;;;###autoload (defun +snippets/goto-start-of-field () From 06c268954d03ee18166b42849c2b5b4906c47518 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 02:20:45 +0200 Subject: [PATCH 3007/4235] Bind `SPC s r` to `yas-reload-all` --- modules/config/default/+bindings.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index a6c197e33..df7258d15 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -764,7 +764,8 @@ :desc "Insert snippet" :nv "i" #'yas-insert-snippet :desc "Find snippet" :n "s" #'+default/find-in-snippets :desc "Find snippet for mode" :n "S" #'+default/browse-snippets - :desc "Find global snippet" :n "/" #'yas-visit-snippet-file)) + :desc "Find global snippet" :n "/" #'yas-visit-snippet-file + :desc "Reload snippets" :n "r" #'yas-reload-all)) (:desc "toggle" :prefix "t" :desc "Flyspell" :n "s" #'flyspell-mode From e7d5da2686e96c098403e237a9042a43e1c8b788 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 03:25:06 +0200 Subject: [PATCH 3008/4235] feature/evil: detect frame cursor-color #851 In case set-cursor-color was used early in the config process (e.g. in ~/.doom.d/init.el), detect it before resorting to #FFFFFF as a default. --- modules/feature/evil/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 23497ce47..9ade07129 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -51,7 +51,10 @@ line with a linewise comment.") (add-hook 'doom-post-init-hook #'+evil|init-popup-rules) ;; Change the cursor color in emacs mode - (defvar +evil--default-cursor-color "#ffffff") + (defvar +evil--default-cursor-color + (or (ignore-errors (frame-parameter nil 'cursor-color)) + "#ffffff")) + (defun +evil-default-cursor () (set-cursor-color +evil--default-cursor-color)) (defun +evil-emacs-cursor () (set-cursor-color (face-foreground 'warning))) From df42d8ce8953f446650a704251290b4fef7a9cd7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 03:53:07 +0200 Subject: [PATCH 3009/4235] editor/format: rewrite & fix set-formatter! + Updated docstring (and added two more examples) + Can now be used with shell command strings or string lists. String sublists can have more than 2 elements. Non-string items will be interpolated into the string before it. If any non-string item is nil, its sublist is omitted entirely. + Can now be used to redefine formatters predefined by the format-all package, by passing the formatter's name (as a symbol) as the first argument. + Added :modes property for cases when first argument isn't a major mode or list of them (when redefining a formatter). --- modules/editor/format/autoload/settings.el | 148 +++++++++++++-------- 1 file changed, 92 insertions(+), 56 deletions(-) diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el index cfb162943..3d8183e1c 100644 --- a/modules/editor/format/autoload/settings.el +++ b/modules/editor/format/autoload/settings.el @@ -22,22 +22,28 @@ return (cadr choice))) ;;;###autodef -(cl-defun set-formatter! (modes formatter &key - name - install - filter - ok-statuses - error-regexp) - "Define a FORMATTER for MODES. +(cl-defun set-formatter! + (modes-or-name formatter + &key + name + modes + install + filter + ok-statuses + error-regexp) + "Define a formatter. -MODES can be a major mode symbol, a list of major modes, or a list of -two-element lists made up of (MAJOR-MODE FORM). FORM is evaluated when the -buffer is formatted and its return value serves two roles: +MODES-OR-NAME can either be a major mode symbol (or list thereof), a unique name +for the formatter being defined (also a symbol), or a special list of +two-element sublists with the structure: (MAJOR-MODE FORM). -1. It is a predicate for this formatter. If it returns non-nil (and MAJOR-MODE - matches the current mode), that formatter is used. -2. Its return value is stored in the `mode-result' variable for FORMATTER (if - it's a function). +FORM is evaluated when the buffer is formatted and its return value serves two +purposes: + +1. It is a predicate for this formatter. Assuming the MAJOR-MODE matches the + current mode, if FORM evaluates to nil, the formatter is skipped. +2. It's return value is made available to FORMATTER if it is a function or list + of shell arguments via the `mode-result' variable. FORMATTER can be a function, string or nested list. @@ -50,18 +56,23 @@ FORMATTER can be a function, string or nested list. string and ARG is both a predicate and argument for STRING. If ARG is nil, STRING will be omitted from the vector. -NAME is the identifier for this formatter. If FORMATTER is a lambda, NAME is -required. +NAME is a symbol that identifies this formatter. If NAME isn't specified and +FORMATTER is a function symbol, the symbol's name is used. If FORMATTER is a +string or list of strings, the executable is extracted from it and used as the +NAME. If FORMATTER is a lambda, NAME is required and will error if omitted. Note +that any formatters with the same NAME will be overwritten by FORMATTER. INSTALL is a string representing the shell command to install this formatter's -dependencies. INSTALL can also be a list of lists made up of two items: (OS -COMMAND). OS can be windows, macos, linux, freebsd, openbsd or netbsd. +dependencies. INSTALL can also be a two-element list: (OS COMMAND), or a list of +these. OS can be windows, macos, linux, freebsd, openbsd or netbsd. FILTER is a function that takes three arguments: the formatted output, any error -output and the position of the first change, and must return these three after -making whatever changes you like to them. This might be useful if the output -contains ANSI color codes that need to be stripped out (as is the case with -elm-format). +output and the position of the first change. This function must return these +three after making whatever changes you like to them. This might be useful if +the output contains ANSI color codes that need to be stripped out (as is the +case with elm-format). + +OK-STATUSES and ERROR-REGEXP are ignored if FORMATTER is not a shell command. OK-STATUSES is a list of integer exit codes that should be treated as success codes. However, if ERROR-REGEXP is given, and the program's stderr contains that @@ -72,6 +83,7 @@ Basic examples: (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") + (set-formatter! 'tidy \"tidy -q -indent\" :modes '(html-mode web-mode)) Advanced examples: @@ -94,6 +106,16 @@ Advanced examples: :ok-statuses '(0 1) :install '(macos \"brew install tidy-html5\")) + (set-formatter! 'html-tidy ; overwrite predefined html-tidy formatter + '(\"tidy\" \"-q\" \"-indent\" + \"--tidy-mark\" \"no\" + \"--drop-empty-elements\" \"no\" + \"--show-body-only\" \"auto\" + (\"--indent-spaces\" \"%d\" tab-width) + (\"--indent-with-tabs\" \"%s\" (if indent-tabs-mode \"yes\" \"no\")) + (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) + :ok-statuses '(0 1))) + (set-formatter! 'elm-mode \"elm-format --yes --stdin\" :install '(macos \"brew install elm\") @@ -104,6 +126,11 @@ Advanced examples: first-diff)))" (declare (indent defun)) (cl-check-type name (or symbol null)) + ;; Determine if MODES-OR-NAME means MODES or NAMES + (if (and (symbolp modes-or-name) + (not (string-match-p "-mode$" (symbol-name modes-or-name)))) + (setq name modes-or-name) + (setq modes (doom-enlist modes-or-name))) (let* ((command-list (cond ((stringp formatter) ; shell command (split-string formatter " " t)) ((listp formatter) ; shell command in lists @@ -112,46 +139,55 @@ Advanced examples: ((car command-list) (intern (car command-list))) ((symbolp formatter) formatter) ((user-error "Anonymous formatter requires a :name")))) - (fn (lambda (executable mode-result) - (let ((result - (cond ((commandp formatter) - (let ((mode major-mode) - (file buffer-file-name) - (dir default-directory)) - (format-all-buffer-thunk - (lambda (input) - (with-silent-modifications - (setq buffer-file-name file - default-directory dir) - (delay-mode-hooks (funcall mode)) - (insert input) - (condition-case e - (progn - (call-interactively formatter) - (list nil "")) - (error (list t (error-message-string e))))))))) - ((functionp formatter) - (format-all-buffer-thunk formatter)) - ((cl-loop for arg in command-list - if (stringp arg) - collect arg into args - else if (eval (cadr arg) t) - collect (format (car arg) it) into args - finally do - (if (or ok-statuses error-regexp) - (apply #'format-all-buffer-hard ok-statuses error-regexp args) - (apply #'format-all-buffer-easy args))))))) - (if filter - (apply filter result) - result)))) + (formatter + (cond ((commandp formatter) + `(format-all-buffer-thunk + (lambda (input) + (with-silent-modifications + (setq buffer-file-name ,(buffer-file-name (buffer-base-buffer)) + default-directory ,default-directory) + (delay-mode-hooks (funcall ',major-mode)) + (insert input) + (condition-case e + (progn (call-interactively #',formatter) + (list nil "")) + (error (list t (error-message-string e)))))))) + ((functionp formatter) + `(format-all-buffer-thunk #',formatter)) + (`(let (args) + (dolist (arg ',command-list) + (cond ((stringp arg) (push arg args)) + ((listp arg) + (catch 'skip + (let (subargs this) + (while (setq this (pop arg)) + (cond ((not (stringp (car arg))) + (let ((val (eval (pop arg) t))) + (unless val (throw 'skip nil)) + (push (format this val) subargs))) + ((stringp this) + (push this subargs)))) + (setq args (append subargs args))))))) + (if ,(and (or ok-statuses error-regexp) t) + (apply #'format-all-buffer-hard + ',ok-statuses ,error-regexp + (reverse args)) + (apply #'format-all-buffer-easy (reverse args))))))) + (fn + `(lambda (executable mode-result) + (let ((result ,formatter)) + ,(if filter + `(apply #',filter result) + 'result)))) (install (cond ((null install) install) ((listp install) (cdr (assq (+format--resolve-system) install))) (install)))) (after! format-all - (puthash name fn format-all-format-table) - (puthash name install format-all-install-table) + (puthash name (eval fn t) format-all-format-table) (puthash name (car command-list) format-all-executable-table) + (puthash name (or install (gethash name format-all-install-table)) + format-all-install-table) (dolist (mode (doom-enlist modes)) (cl-destructuring-bind (m &optional probe) (doom-enlist mode) From b697ad982e11df38c6cc5254874697edd2cf8cdd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 03:59:24 +0200 Subject: [PATCH 3010/4235] lang/web: more sensible html-tidy formatter config + No longer inserts html/body tags unless they're detected in the buffer + Respect tab-width and indent-tab-mode + Don't auto-remove empty elements --- modules/lang/web/+html.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 13c8fb9b5..e5d70fa86 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -17,6 +17,18 @@ :config (set-docsets! 'web-mode "HTML" "Twig" "WordPress") + ;; tidy is already defined by the format-all package. We redefine it to add + ;; more sensible arguments to the tidy command. + (set-formatter! 'html-tidy + '("tidy" "-q" "-indent" + "--tidy-mark" "no" + "--drop-empty-elements" "no" + "--show-body-only" "auto" + ("--indent-spaces" "%d" tab-width) + ("--indent-with-tabs" "%s" (if indent-tabs-mode "yes" "no")) + ("-xml" (memq major-mode '(nxml-mode xml-mode)))) + :ok-statuses '(0 1)) + (setq web-mode-enable-html-entities-fontification t web-mode-auto-close-style 2) From f8f9144f0881ae9c1309e369a47e1edf6889356e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 04:03:33 +0200 Subject: [PATCH 3011/4235] ui/modeline: add indent type+width to modeline Also, display nothing for file encoding if encoding is undecided. --- modules/ui/modeline/config.el | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 955b84af4..cdfcc9820 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -482,16 +482,20 @@ Meant for `+modeline-buffer-path-function'." (def-modeline-segment! +modeline-encoding :on-hooks (after-revert-hook after-save-hook find-file-hook) - :on-set (buffer-file-coding-system) - (concat (pcase (coding-system-eol-type buffer-file-coding-system) - (0 "LF ") - (1 "CRLF ") - (2 "CR ")) - (let ((sys (coding-system-plist buffer-file-coding-system))) - (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) - "UTF-8" - (upcase (symbol-name (plist-get sys :name))))) - " ")) + :on-set (buffer-file-coding-system indent-tabs-mode tab-width) + (concat (format (if indent-tabs-mode "⭾%d" "␣%d") + tab-width) + " " + (pcase (coding-system-eol-type buffer-file-coding-system) + (0 "LF") + (1 "CRLF") + (2 "CR")) + " " + (let* ((sys (coding-system-plist buffer-file-coding-system)) + (category (plist-get sys :category))) + (cond ((eq category 'coding-category-undecided) "") + ((eq category 'coding-category-utf-8) "UTF-8 ") + ((concat (upcase (symbol-name (plist-get sys :name))) " ")))))) (def-modeline-segment! +modeline-major-mode (propertize (format-mode-line mode-name) From 939dd93e79860aa66902663a328831f2cdd3362f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 3 Sep 2018 13:14:59 +0200 Subject: [PATCH 3012/4235] Impose fallback behaviour --- core/core-ui.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 4015c6d67..e63b5bab7 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -346,8 +346,7 @@ frame's window-system, the theme will be reloaded.") `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font)))))) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) - (setq use-default-font-for-symbols nil) - (set-fontset-font t 'unicode doom-unicode-font nil) + (set-fontset-font t 'unicode doom-unicode-font nil 'append) nil)) ((debug error) (if (string-prefix-p "Font not available: " (error-message-string e)) From 82651f247eaf57a550740792fcc2e02f4e3c443f Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 3 Sep 2018 13:54:49 +0200 Subject: [PATCH 3013/4235] Fix syntax highlighting --- modules/lang/agda/config.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index cb1a92f2e..f44e235db 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -10,6 +10,21 @@ (def-package! agda2-mode :mode "\\.agda\\'" :after agda-input + :init + ;; fix syntax highlighting + ;; (taken from https://github.com/syl20bnr/spacemacs/blob/develop/layers/%2Blang/agda/packages.el) + (progn + (mapc + (lambda (x) (add-to-list 'face-remapping-alist x)) + '((agda2-highlight-datatype-face . font-lock-type-face) + (agda2-highlight-function-face . font-lock-type-face) + (agda2-highlight-inductive-constructor-face . font-lock-function-name-face) + (agda2-highlight-keyword-face . font-lock-keyword-face) + (agda2-highlight-module-face . font-lock-constant-face) + (agda2-highlight-number-face . nil) + (agda2-highlight-postulate-face . font-lock-type-face) + (agda2-highlight-primitive-type-face . font-lock-type-face) + (agda2-highlight-record-face . font-lock-type-face)))) :config (map! :map agda2-mode-map :localleader @@ -17,3 +32,4 @@ :n "d" #'agda2-infer-type-maybe-toplevel :n "o" #'agda2-module-contents-maybe-toplevel :n "n" #'agda2-compute-normalised-maybe-toplevel)) + ;; TODO finish keybindings From 17f0b4c50e67f006d7333d8aca0dc6759d5f5575 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 3 Sep 2018 15:45:43 +0200 Subject: [PATCH 3014/4235] Update syntax highlighting --- modules/lang/agda/config.el | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index f44e235db..ea753aec7 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -16,15 +16,23 @@ (progn (mapc (lambda (x) (add-to-list 'face-remapping-alist x)) - '((agda2-highlight-datatype-face . font-lock-type-face) - (agda2-highlight-function-face . font-lock-type-face) - (agda2-highlight-inductive-constructor-face . font-lock-function-name-face) - (agda2-highlight-keyword-face . font-lock-keyword-face) - (agda2-highlight-module-face . font-lock-constant-face) - (agda2-highlight-number-face . nil) - (agda2-highlight-postulate-face . font-lock-type-face) - (agda2-highlight-primitive-type-face . font-lock-type-face) - (agda2-highlight-record-face . font-lock-type-face)))) + '((agda2-highlight-keyword-face . font-lock-keyword-face) + (agda2-highlight-string-face . font-lock-string-face) + (agda2-highlight-number-face . font-lock-string-face) + (agda2-highlight-symbol-face . font-lock-variable-name-face) + (agda2-highlight-primitive-type-face . font-lock-type-face) + (agda2-highlight-bound-variable-face . font-lock-variable-name-face) + (agda2-highlight-inductive-constructor-face . font-lock-type-face) + (agda2-highlight-coinductive-constructor-face . font-lock-type-face) + (agda2-highlight-datatype-face . font-lock-type-face) + (agda2-highlight-field-face . font-lock-type-face) + (agda2-highlight-function-face . font-lock-function-name-face) + (agda2-highlight-module-face . font-lock-variable-name-face) + (agda2-highlight-postulate-face . font-lock-type-face) + (agda2-highlight-primitive-face . font-lock-type-face) + (agda2-highlight-macro-face . font-lock-function-name-face) + (agda2-highlight-record-face . font-lock-type-face) + (agda2-highlight-error-face . font-lock-warning-face)))) :config (map! :map agda2-mode-map :localleader From 57415658a012124e3c9804f5c9639a46b947733c Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 3 Sep 2018 16:00:40 +0200 Subject: [PATCH 3015/4235] More syntax highlighting --- modules/lang/agda/config.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index ea753aec7..5ae19aca1 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -11,8 +11,7 @@ :mode "\\.agda\\'" :after agda-input :init - ;; fix syntax highlighting - ;; (taken from https://github.com/syl20bnr/spacemacs/blob/develop/layers/%2Blang/agda/packages.el) + ;; make syntax-highlighting more consistent with other major modes (progn (mapc (lambda (x) (add-to-list 'face-remapping-alist x)) @@ -32,7 +31,14 @@ (agda2-highlight-primitive-face . font-lock-type-face) (agda2-highlight-macro-face . font-lock-function-name-face) (agda2-highlight-record-face . font-lock-type-face) - (agda2-highlight-error-face . font-lock-warning-face)))) + (agda2-highlight-error-face . font-lock-warning-face) + (agda2-highlight-dotted-face . font-lock-variable-name-face) + (agda2-highlight-unsolved-meta-face . font-lock-warning-face) + (agda2-highlight-unsolved-constraint-face . font-lock-warning-face) + (agda2-highlight-termination-problem-face . font-lock-warning-face) + (agda2-highlight-positivity-problem-face . font-lock-warning-face) + (agda2-highlight-incomplete-pattern-face . font-lock-warning-face) + (agda2-highlight-typechecks-face . font-lock-warning-face)))) :config (map! :map agda2-mode-map :localleader From 818df0afe437cb64c6cd0d550f20805cec63ac96 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 3 Sep 2018 16:11:08 +0200 Subject: [PATCH 3016/4235] More keybindings --- modules/lang/agda/config.el | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index 5ae19aca1..dce22f3a0 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -41,9 +41,27 @@ (agda2-highlight-typechecks-face . font-lock-warning-face)))) :config (map! :map agda2-mode-map - :localleader - :n "l" #'agda2-load - :n "d" #'agda2-infer-type-maybe-toplevel - :n "o" #'agda2-module-contents-maybe-toplevel - :n "n" #'agda2-compute-normalised-maybe-toplevel)) - ;; TODO finish keybindings + :localleader + :n "?" #'agda2-show-goals + :n "." #'agda2-goal-and-context-and-inferred + :n "," #'agda2-goal-and-context + :n "=" #'agda2-show-constraints + :n "SPC" #'agda2-give + :n "a" #'agda2-auto + :n "c" #'agda2-make-case + :n "d" #'agda2-infer-type-maybe-toplevel + :n "e" #'agda2-show-context + :n "gG" #'agda2-go-back + :n "h" #'agda2-helper-function-type + :n "l" #'agda2-load + :n "n" #'agda2-compute-normalised-maybe-toplevel + :n "p" #'agda2-module-contents-maybe-toplevel + :n "r" #'agda2-refine + :n "s" #'agda2-solveAll + :n "t" #'agda2-goal-type + :n "w" #'agda2-why-in-scope-maybe-toplevel + :n "xc" #'agda2-compile + :n "xd" #'agda2-remove-annotations + :n "xh" #'agda2-display-implicit-arguments + :n "xq" #'agda2-quit + :n "xr" #'agda2-restart)) From 37b920f461a7f13091875f76b36be0bb3dd1a45d Mon Sep 17 00:00:00 2001 From: Quentin Le Guennec Date: Mon, 3 Sep 2018 16:38:11 +0200 Subject: [PATCH 3017/4235] adds common js pretty symbols for rjsx-mode --- modules/lang/javascript/config.el | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 794822161..10086f0a5 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -82,6 +82,22 @@ ;; jshint doesn't know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers))) + (set-pretty-symbols! 'rjsx-mode + ;; Functional + :def "function" + :lambda "() =>" + :composition "compose" + ;; Types + :null "null" + :true "true" :false "false" + ;; Flow + :not "!" + :and "&&" :or "||" + :for "for" + :return "return" + ;; Other + :yield "import") + ;; `rjsx-electric-gt' relies on js2's parser to tell it when the cursor is in ;; a self-closing tag, so that it can insert a matching ending tag at point. ;; However, the parser doesn't run immediately, so a fast typist can outrun From 10b22b9750dd305cdcc3ab1e0e88831220432ac8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 23:56:25 +0200 Subject: [PATCH 3018/4235] Merge rjsx-mode pretty-symbols with pre-existing --- modules/lang/javascript/config.el | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 10086f0a5..0332158af 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -9,8 +9,8 @@ "A list of dash docsets to use for Javascript modes (`js2-mode' and `rjsx-mode'). These are used by `+lookup/in-docsets'.") -(after! (:any js2-mode web-mode) - (set-pretty-symbols! '(js2-mode web-mode) +(after! (:any js2-mode rjsx-mode web-mode) + (set-pretty-symbols! '(js2-mode rjsx-mode web-mode) ;; Functional :def "function" :lambda "() =>" @@ -82,22 +82,6 @@ ;; jshint doesn't know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers))) - (set-pretty-symbols! 'rjsx-mode - ;; Functional - :def "function" - :lambda "() =>" - :composition "compose" - ;; Types - :null "null" - :true "true" :false "false" - ;; Flow - :not "!" - :and "&&" :or "||" - :for "for" - :return "return" - ;; Other - :yield "import") - ;; `rjsx-electric-gt' relies on js2's parser to tell it when the cursor is in ;; a self-closing tag, so that it can insert a matching ending tag at point. ;; However, the parser doesn't run immediately, so a fast typist can outrun From 475e2f9982299ba99ae64d0e836d28823d696247 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Tue, 4 Sep 2018 10:13:48 +0200 Subject: [PATCH 3019/4235] Fix unicode regression --- 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 e63b5bab7..0a018fd8d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -346,7 +346,7 @@ frame's window-system, the theme will be reloaded.") `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font)))))) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font nil 'append) + (set-fontset-font t nil doom-unicode-font nil 'append) nil)) ((debug error) (if (string-prefix-p "Font not available: " (error-message-string e)) From 5bfaabd99bb4e0fb226475ae15c24113037b3f29 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 6 Sep 2018 01:29:01 +0200 Subject: [PATCH 3020/4235] Proof-general is now on melpa --- modules/lang/coq/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/coq/packages.el b/modules/lang/coq/packages.el index 3ae652118..78a5c61be 100644 --- a/modules/lang/coq/packages.el +++ b/modules/lang/coq/packages.el @@ -1,6 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/coq/packages.el -(package! proof-general :recipe (:fetcher github :repo "ProofGeneral/PG" :files ("*"))) +(package! proof-general) (package! company-coq) From 515ed02dfbe73668e955a0257865204badfd54b8 Mon Sep 17 00:00:00 2001 From: Ruslan Kamashev Date: Thu, 6 Sep 2018 22:07:58 +0300 Subject: [PATCH 3021/4235] Add docker module --- modules/tools/docker/config.el | 22 ++++++++++++++++++++++ modules/tools/docker/packages.el | 6 ++++++ 2 files changed, 28 insertions(+) create mode 100644 modules/tools/docker/config.el create mode 100644 modules/tools/docker/packages.el diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el new file mode 100644 index 000000000..c9bcc422a --- /dev/null +++ b/modules/tools/docker/config.el @@ -0,0 +1,22 @@ +;;; tools/docker/config.el -*- lexical-binding: t; -*- + +(def-package! docker) +(def-package! docker-tramp) +(def-package! dockerfile-mode) + +(after! docker + (set-evil-initial-state! 'docker-container-mode 'emacs) + (set-evil-initial-state! 'docker-image-mode 'emacs) + (set-evil-initial-state! 'docker-network-mode 'emacs) + (set-evil-initial-state! 'docker-volume-mode 'emacs) + (set-evil-initial-state! 'docker-machine-mode 'emacs)) + +(map! + (:leader + (:prefix "d" + :desc "Docker":n "." #'docker + :desc "Docker Containers":n "c" #'docker-containers + :desc "Docker Images":n "i" #'docker-images + :desc "Docker Networks":n "n" #'docker-networks + :desc "Docker Volumes":n "v" #'docker-volumes + :desc "Docker Machines":n "m" #'docker-machines))) diff --git a/modules/tools/docker/packages.el b/modules/tools/docker/packages.el new file mode 100644 index 000000000..9266beee4 --- /dev/null +++ b/modules/tools/docker/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/docker/packages.el + +(package! docker) +(package! docker-tramp) +(package! dockerfile-mode) From 2fdd82a8f0d0c0d6c2512dba4fd7cc8050e3a406 Mon Sep 17 00:00:00 2001 From: Ruslan Kamashev Date: Sat, 8 Sep 2018 03:22:34 +0300 Subject: [PATCH 3022/4235] Add docker to init.example.el --- init.example.el | 1 + modules/tools/docker/config.el | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/init.example.el b/init.example.el index aaae090b1..3c78166e8 100644 --- a/init.example.el +++ b/init.example.el @@ -76,6 +76,7 @@ ;tmux ; an API for interacting with tmux ;upload ; map local to remote projects via ssh/ftp ;wakatime + ;docker :lang ;assembly ; assembly for fun or debugging diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el index c9bcc422a..d17963fa8 100644 --- a/modules/tools/docker/config.el +++ b/modules/tools/docker/config.el @@ -14,9 +14,9 @@ (map! (:leader (:prefix "d" - :desc "Docker":n "." #'docker - :desc "Docker Containers":n "c" #'docker-containers - :desc "Docker Images":n "i" #'docker-images - :desc "Docker Networks":n "n" #'docker-networks - :desc "Docker Volumes":n "v" #'docker-volumes - :desc "Docker Machines":n "m" #'docker-machines))) + :desc "Docker":n "." #'docker + :desc "Docker Containers":n "c" #'docker-containers + :desc "Docker Images":n "i" #'docker-images + :desc "Docker Networks":n "n" #'docker-networks + :desc "Docker Volumes":n "v" #'docker-volumes + :desc "Docker Machines":n "m" #'docker-machines))) From dc3a3660943e18d93d0f7d925ec9ca3b12f2fd19 Mon Sep 17 00:00:00 2001 From: Ruslan Kamashev Date: Sat, 8 Sep 2018 03:51:37 +0300 Subject: [PATCH 3023/4235] Fix bindings --- modules/config/default/+bindings.el | 5 ++++- modules/tools/docker/config.el | 18 ++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index df7258d15..ebfbfbd42 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -729,7 +729,10 @@ :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 "Send project to Launchbar" :n "L" #'+macos/send-project-to-launchbar) + + (:when (featurep! :tools docker) + :desc "Docker" :n "D" #'docker)) (:desc "project" :prefix "p" :desc "Browse project" :n "." #'+default/browse-project diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el index d17963fa8..9178c41bb 100644 --- a/modules/tools/docker/config.el +++ b/modules/tools/docker/config.el @@ -1,22 +1,12 @@ ;;; tools/docker/config.el -*- lexical-binding: t; -*- -(def-package! docker) -(def-package! docker-tramp) -(def-package! dockerfile-mode) - -(after! docker +(def-package! docker + :config (set-evil-initial-state! 'docker-container-mode 'emacs) (set-evil-initial-state! 'docker-image-mode 'emacs) (set-evil-initial-state! 'docker-network-mode 'emacs) (set-evil-initial-state! 'docker-volume-mode 'emacs) (set-evil-initial-state! 'docker-machine-mode 'emacs)) -(map! - (:leader - (:prefix "d" - :desc "Docker":n "." #'docker - :desc "Docker Containers":n "c" #'docker-containers - :desc "Docker Images":n "i" #'docker-images - :desc "Docker Networks":n "n" #'docker-networks - :desc "Docker Volumes":n "v" #'docker-volumes - :desc "Docker Machines":n "m" #'docker-machines))) +(def-package! docker-tramp) +(def-package! dockerfile-mode) From e28fea3777d7cccb7cd494cc950e350494927683 Mon Sep 17 00:00:00 2001 From: Ruslan Kamashev Date: Sat, 8 Sep 2018 03:55:11 +0300 Subject: [PATCH 3024/4235] Fix clj-refactor bindings --- modules/lang/clojure/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index f04e1b9a9..b15ea77ed 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -33,6 +33,7 @@ :n "p" #'cider-eval-sexp-at-point)) (def-package! clj-refactor + :hook (clojure-mode . clj-refactor-mode) :config (map! :map clj-refactor-map :localleader From 1f581a4e3657ef2513a8add44b665cadda28f520 Mon Sep 17 00:00:00 2001 From: Matthew Lyon Date: Fri, 7 Sep 2018 20:35:29 -0700 Subject: [PATCH 3025/4235] Add option for flycheck-joker for clojure This is provided as a +feature on clojure because joker is not included in the standard clojure distribution, and I wouldn't assume a given clojurist has or wants to have it installed. But I think installing it is the least-fuss option for syntax-checking clojure/script code in emacs with flycheck. --- init.example.el | 2 +- modules/lang/clojure/+joker.el | 4 ++++ modules/lang/clojure/config.el | 3 +++ modules/lang/clojure/packages.el | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 modules/lang/clojure/+joker.el diff --git a/init.example.el b/init.example.el index aaae090b1..e5d9ddc5f 100644 --- a/init.example.el +++ b/init.example.el @@ -80,7 +80,7 @@ :lang ;assembly ; assembly for fun or debugging ;(cc +irony +rtags); C/C++/Obj-C madness - ;clojure ; java with a lisp + ;(clojure +joker) ; java with a lisp ;common-lisp ; if you've seen one lisp, you've seen them all ;coq ; proofs-as-programs ;crystal ; ruby at the speed of c diff --git a/modules/lang/clojure/+joker.el b/modules/lang/clojure/+joker.el new file mode 100644 index 000000000..cb0ac937e --- /dev/null +++ b/modules/lang/clojure/+joker.el @@ -0,0 +1,4 @@ +;;; lang/clojure/+joker.el -*- lexical-binding: t; -*- + +(def-package! flycheck-joker + :after (flycheck clojure-mode)) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index f04e1b9a9..8a10c40a3 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -37,3 +37,6 @@ (map! :map clj-refactor-map :localleader :desc "Refactor hydra" :n "r" #'hydra-cljr-help-menu/body))) + +(when (and (featurep! +joker) (featurep! :feature syntax-checker)) + (load! "+joker")) diff --git a/modules/lang/clojure/packages.el b/modules/lang/clojure/packages.el index a61dc39ed..50bef036b 100644 --- a/modules/lang/clojure/packages.el +++ b/modules/lang/clojure/packages.el @@ -4,3 +4,6 @@ (package! cider) (package! clj-refactor) +(when (and (featurep! :feature syntax-checker) + (featurep! +joker)) + (package! flycheck-joker)) From 45e22c7e234eaaa4cc0b499951085ec0c8e4ab25 Mon Sep 17 00:00:00 2001 From: Allen Shaw Date: Sun, 9 Sep 2018 17:18:39 +0800 Subject: [PATCH 3026/4235] add anaconda3 home path '/usr/local/anaconda3' --- modules/lang/python/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 26276aa06..e44c4d2bf 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -179,7 +179,8 @@ (unless (cl-loop for dir in (list conda-anaconda-home "~/.anaconda" "~/.miniconda" - "/usr/bin/anaconda3") + "/usr/bin/anaconda3" + "/usr/local/anaconda3") if (file-directory-p dir) return (setq conda-anaconda-home dir conda-env-home-directory dir)) From 0e1049189c7c997cc5c78c4097c59573369e3e3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 09:49:22 -0400 Subject: [PATCH 3027/4235] Lazy-load docker-tramp & dockerfile-mode No extra configuration is required to lazy load these two plugins (they autoload themselves). These blocks would force them to load at startup otherwise. --- modules/tools/docker/config.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el index 9178c41bb..151352899 100644 --- a/modules/tools/docker/config.el +++ b/modules/tools/docker/config.el @@ -7,6 +7,3 @@ (set-evil-initial-state! 'docker-network-mode 'emacs) (set-evil-initial-state! 'docker-volume-mode 'emacs) (set-evil-initial-state! 'docker-machine-mode 'emacs)) - -(def-package! docker-tramp) -(def-package! dockerfile-mode) From 0b07220c5f5913ae883f1b5c99705121fe0795ac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 09:52:23 -0400 Subject: [PATCH 3028/4235] Lazy-load docker.el & refactor evil-initial-state `set-evil-initial-state!` accepts multiple modes as its first argument and is marginally faster when used that way. --- modules/tools/docker/config.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/tools/docker/config.el b/modules/tools/docker/config.el index 151352899..cf3c8a32f 100644 --- a/modules/tools/docker/config.el +++ b/modules/tools/docker/config.el @@ -1,9 +1,10 @@ ;;; tools/docker/config.el -*- lexical-binding: t; -*- -(def-package! docker - :config - (set-evil-initial-state! 'docker-container-mode 'emacs) - (set-evil-initial-state! 'docker-image-mode 'emacs) - (set-evil-initial-state! 'docker-network-mode 'emacs) - (set-evil-initial-state! 'docker-volume-mode 'emacs) - (set-evil-initial-state! 'docker-machine-mode 'emacs)) +(after! docker + (set-evil-initial-state! + '(docker-container-mode + docker-image-mode + docker-network-mode + docker-volume-mode + docker-machine-mode) + 'emacs)) From 6052e27bd1dc48c2b8e9f964a268a7e59040d989 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 09:55:56 -0400 Subject: [PATCH 3029/4235] Alphabetize :tools docker in init.example.el --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 3c78166e8..809dc3e2f 100644 --- a/init.example.el +++ b/init.example.el @@ -63,6 +63,7 @@ vc ; version-control and Emacs, sitting in a tree :tools + ;docker editorconfig ; let someone else argue about tabs vs spaces ;ein ; tame Jupyter notebooks with emacs ;gist ; interacting with github gists @@ -76,7 +77,6 @@ ;tmux ; an API for interacting with tmux ;upload ; map local to remote projects via ssh/ftp ;wakatime - ;docker :lang ;assembly ; assembly for fun or debugging From 786ab9e7b50c64c2b5eca0af727c7c61bd0d421c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 04:32:43 +0200 Subject: [PATCH 3030/4235] ui/modeline: show UTF-8 for prefer-utf-8 encoding --- modules/ui/modeline/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index cdfcc9820..b2a06c7c7 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -494,7 +494,9 @@ Meant for `+modeline-buffer-path-function'." (let* ((sys (coding-system-plist buffer-file-coding-system)) (category (plist-get sys :category))) (cond ((eq category 'coding-category-undecided) "") - ((eq category 'coding-category-utf-8) "UTF-8 ") + ((or (eq category 'coding-category-utf-8) + (eq (plist-get sys :name) 'prefer-utf-8)) + "UTF-8 ") ((concat (upcase (symbol-name (plist-get sys :name))) " ")))))) (def-modeline-segment! +modeline-major-mode From 1f3fa61c2b5a1ae61409b621739155154fa4e408 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 04:36:46 +0200 Subject: [PATCH 3031/4235] Allow debugging in doom quickstart --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 8d1c63618..b620e9dc5 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -268,7 +268,7 @@ problems with doom." (user-error "Refusing to upgrade because Doom has been modified. Stash or undo your changes")) (with-temp-buffer (let ((buf (current-buffer))) - (condition-case e + (condition-case-unless-debug e (progn (process-file "git" nil buf nil "remote" "remove" doom-repo-remote) (unless (zerop (process-file "git" nil buf nil "remote" "add" From 937f118e6a7755cbfaa692a3329ae96915fa0d63 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Sep 2018 23:52:14 +0200 Subject: [PATCH 3032/4235] Reset gc-cons-threshold on idle timer And remove reset from doom-reload-hook, as it is no longer necessary anymore. ~/.emacs.d/init.el is no longer re-evaluated at any point. --- init.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/init.el b/init.el index 3529750bc..6db64b2ae 100644 --- a/init.el +++ b/init.el @@ -41,8 +41,11 @@ decrease this. If you experience stuttering, increase this.") "Resets garbage collection settings to reasonable defaults (a large `gc-cons-threshold' can cause random freezes otherwise) and resets `file-name-handler-alist'." - (setq file-name-handler-alist doom--file-name-handler-alist - gc-cons-threshold doom-gc-cons-threshold)) + (setq-default file-name-handler-alist doom--file-name-handler-alist) + ;; Do it on an idle timer to defer the possible GC pause, and to give deferred + ;; packages the opportunity to take advantage of these optimizations. + (run-with-idle-timer + 3 nil (lambda () (setq-default gc-cons-threshold doom-gc-cons-threshold)))) (if (or after-init-time noninteractive) @@ -50,15 +53,12 @@ decrease this. If you experience stuttering, increase this.") ;; A big contributor to long startup times is the garbage collector, so we up ;; its memory threshold, temporarily and reset it later in ;; `doom|disable-startup-optimizations'. - (setq gc-cons-threshold doom-gc-cons-upper-limit) ; 256mb + (setq gc-cons-threshold doom-gc-cons-upper-limit) ;; This is consulted on every `require', `load' and various file reading ;; functions. You get a minor speed up by nooping this. (setq file-name-handler-alist nil) - ;; Restore these to their defaults later. Do it on an idle timer to defer the - ;; possible GC pause, and to give deferred packages the ability to take - ;; advantage of these optimizations. - (run-with-idle-timer 5 nil #'doom|restore-startup-optimizations) - (add-hook 'doom-reload-hook #'doom|restore-startup-optimizations)) + ;; Not restoring these to their defaults will cause stuttering/freezes. + (add-hook 'emacs-startup-hook #'doom|restore-startup-optimizations)) ;; Ensure Doom is always running out of this file's directory From d2f9d28577a866d5625ff5ff755c2ea620f9bdbd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 01:01:54 +0200 Subject: [PATCH 3033/4235] doom-project-(find-file|browse): resolve symlinks This prevents absolute paths appearing in many find-in/browse commands, like +default/find-in-emacsd, +default/find-in-config, or +default/browse-project. --- core/autoload/projects.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 9d5eb2786..0d5c5d305 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -74,8 +74,8 @@ If NOCACHE, don't fetch a cached answer." (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." (without-project-cache! - (let ((default-directory dir) - (projectile-project-root dir)) + (let* ((default-directory (file-truename dir)) + (projectile-project-root default-directory)) (call-interactively ;; completion modules may remap this command (or (command-remapping #'projectile-find-file) @@ -84,7 +84,7 @@ If NOCACHE, don't fetch a cached answer." ;;;###autoload (defun doom-project-browse (dir) "Traverse a file structure starting linearly from DIR." - (let ((default-directory dir)) + (let ((default-directory (file-truename dir))) (call-interactively ;; completion modules may remap this command (or (command-remapping #'find-file) From 84abac6b6988075625d2c870ddb170eec6e7aba3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 03:04:00 +0200 Subject: [PATCH 3034/4235] Remove def-menu!; use :localleader keys instead def-menu was clumsy. We could use a better UI for refactoring commands, but they should be available via localleader keybinds in any case. --- core/autoload/menu.el | 122 ------------------------------ modules/lang/go/config.el | 70 +++++++---------- modules/lang/java/+eclim.el | 54 ++++++------- modules/lang/java/+meghanada.el | 32 +++----- modules/lang/javascript/config.el | 49 ++---------- modules/lang/lua/config.el | 18 ++--- modules/lang/rust/config.el | 12 +-- 7 files changed, 77 insertions(+), 280 deletions(-) delete mode 100644 core/autoload/menu.el diff --git a/core/autoload/menu.el b/core/autoload/menu.el deleted file mode 100644 index 8afb19d85..000000000 --- a/core/autoload/menu.el +++ /dev/null @@ -1,122 +0,0 @@ -;;; ../core/autoload/menu.el -*- lexical-binding: t; -*- - -;; Command dispatchers: basically M-x, but context sensitive, customizable and -;; persistent across Emacs sessions. - -(defvar doom-menu-display-fn #'doom-menu-read-default - "The method to use to prompt the user with the menu. This takes two arguments: -PROMPT (a string) and COMMAND (a list of command plists; see `def-menu!').") - -(defvar-local doom-menu-last-command nil - "TODO") - -(defun doom-menu-read-default (prompt commands) - "Default method for displaying a completion-select prompt." - (completing-read prompt (mapcar #'car commands) nil nil nil nil (car doom-menu-last-command))) - -;;;###autoload -(defun doom--menu-read (prompt commands) - (if-let* ((choice (funcall doom-menu-display-fn prompt commands))) - (assoc choice commands) - (user-error "Aborted"))) - -;;;###autoload -(defun doom--menu-exec (plist) - (save-selected-window - (let ((command (plist-get plist :exec)) - (cwd (plist-get plist :cwd))) - (let ((default-directory - (cond ((eq cwd t) (doom-project-root)) - ((stringp cwd) cwd) - ((functionp cwd) (funcall cwd)) - (t default-directory)))) - (cond ((stringp command) - (let (buf) - (compile command) - (setq buf next-error-last-buffer) - (unless buf - (error "Couldn't create compilation buffer")) - (with-current-buffer buf - (setq header-line-format - (concat (propertize "$ " 'face 'font-lock-doc-face) - (propertize command 'face 'font-lock-preprocessor-face)))))) - ((or (symbolp command) - (functionp command)) - (call-interactively command)) - ((and command (listp command)) - (eval command t)) - (t - (error "Not a valid command: %s" command))))))) - -;;;###autoload -(defmacro def-menu! (name desc commands &rest plist) - "Defines a menu and returns a function symbol for invoking it. - -A dispatcher is an interactive command named NAME (a symbol). When called, this -dispatcher prompts you to select a command to run. This list is filtered -depending on its properties. Each command is takes the form of: - - (DESCRIPTION :exec COMMAND &rest PROPERTIES) - -PROPERTIES accepts the following properties: - - :when FORM - :unless FORM - :region BOOL - :cwd BOOL|PATH|FUNCTION - :project BOOL|PATH|FUNCTION - -COMMAND can be a string (a shell command), a symbol (an elisp function) or a -lisp form. - -`def-menu!'s PLIST supports the following properties: - - :prompt STRING" - (declare (indent defun) (doc-string 2)) - (let ((commands-var (intern (format "%s-commands" name))) - (prop-prompt (or (plist-get plist :prompt) "> ")) - (prop-sort (plist-get plist :sort))) - `(progn - (defconst ,commands-var - ,(if prop-sort - `(cl-sort ,commands #'string-lessp :key #'car) - commands) - ,(format "Menu for %s" name)) - (defun ,name (arg command) - ,(concat - (if (stringp desc) (concat desc "\n\n")) - "This is a command dispatcher. It will rerun the last command on\n" - "consecutive executions. If ARG (universal argument) is non-nil\n" - "then it always prompt you.") - (declare (interactive-only t)) - (interactive - (list current-prefix-arg - (progn - (unless ,commands-var - (user-error "The '%s' menu is empty" ',name)) - (doom--menu-read - ,prop-prompt - (or (cl-remove-if-not - (let ((project-root (doom-project-root))) - (lambda (cmd) - (let ((plist (cdr cmd))) - (and (cond ((not (plist-member plist :region)) t) - ((plist-get plist :region) (use-region-p)) - (t (not (use-region-p)))) - (let ((when (plist-get plist :when)) - (unless (plist-get plist :unless)) - (project (plist-get plist :project))) - (when (functionp project) - (setq project (funcall project))) - (or (or (not when) (eval when)) - (or (not unless) (not (eval unless))) - (and (stringp project) - (file-in-directory-p (or buffer-file-name default-directory) - project-root)))))))) - ,commands-var) - (user-error "No commands available here")))))) - (doom--menu-exec - (cdr (or (when arg doom-menu-last-command) - (setq doom-menu-last-command command) - (user-error "No command selected")))))))) - diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 260268578..fe97b79a0 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -21,51 +21,35 @@ (add-hook 'go-mode-hook #'go-eldoc-setup) - (def-menu! +go/refactor-menu - "Refactoring commands for `go-mode' buffers." - '(("Add import" :exec go-import-add :region nil) - ("Remove unused imports" :exec go-remove-unused-imports :region nil) - ("Format buffer (gofmt)" :exec go-gofmt)) - :prompt "Refactor: ") - - (def-menu! +go/build-menu - "Build/compilation commands for `go-mode' buffers." - '(("Build project" :exec "go build") - ("Build & run project" :exec "go run") - ("Clean files" :exec "go clean")) - :prompt "Run test: ") - - (def-menu! +go/test-menu - "Test commands for `go-mode' buffers." - '(("Last test" :exec +go/test-rerun) - ("All tests" :exec +go/test-all) - ("Single test" :exec +go/test-single) - ("Nested test" :exec +go/test-nested)) - :prompt "Run test: ") - - (def-menu! +go/help-menu - "Help and information commands for `go-mode' buffers." - '(("Go to imports" :exec go-goto-imports) - ("Lookup in godoc" :exec godoc-at-point) - ("Describe this" :exec go-guru-describe) - ("List free variables" :exec go-guru-freevars) - ("What does this point to" :exec go-guru-pointsto) - ("Implements relations for package types" :exec go-guru-implements :region nil) - ("List peers for channel" :exec go-guru-peers) - ("List references to object" :exec go-guru-referrers) - ("Which errors" :exec go-guru-whicerrs) - ("What query" :exec go-guru-what) - ("Show callers of this function" :exec go-guru-callers :region nil) - ("Show callees of this function" :exec go-guru-callees :region nil))) - (map! :map go-mode-map :localleader - :nr "r" #'+go/refactor-menu - :n "b" #'+go/build-menu - :n "h" #'+go/help-menu - :n "t" #'+go/test-menu - :n "r" #'go-play-buffer - :v "r" #'go-play-region)) + :n "r" #'go-play-buffer + :v "r" #'go-play-region + :n "i" #'go-goto-imports ; Go to imports + (:prefix "h" + :n "." #'godoc-at-point ; Lookup in godoc + :n "d" #'go-guru-describe ; Describe this + :n "v" #'go-guru-freevars ; List free variables + :n "i" #'go-guru-implements ; Implements relations for package types + :n "p" #'go-guru-peers ; List peers for channel + :n "P" #'go-guru-pointsto ; What does this point to + :n "r" #'go-guru-referrers ; List references to object + :n "e" #'go-guru-whicherrs ; Which errors + :n "w" #'go-guru-what ; What query + :n "c" #'go-guru-callers ; Show callers of this function + :n "C" #'go-guru-callees) ; Show callees of this function + (:prefix "r" + :n "ia" #'go-import-add + :n "ir" #'go-remove-unused-imports) + (:prefix "b" + :n "r" (λ! (compile "go run")) + :n "b" (λ! (compile "go build")) + :n "c" (λ! (compile "go clean"))) + (:prefix "t" + :n "t" #'+go/test-rerun + :n "a" #'+go/test-all + :n "s" #'+go/test-single + :n "n" #'+go/test-nested))) (def-package! gorepl-mode diff --git a/modules/lang/java/+eclim.el b/modules/lang/java/+eclim.el index 3848324ab..b96060cc2 100644 --- a/modules/lang/java/+eclim.el +++ b/modules/lang/java/+eclim.el @@ -16,39 +16,31 @@ help-at-pt-timer-delay 0.1) (help-at-pt-set-timer) - ;; - (def-menu! +java/refactor-menu - "Refactoring commands for `java-mode' buffers." - '(("Generate constructor" :exec eclim-java-constructor) - ("Generate getter & setter" :exec eclim-java-generate-getter-and-setter) - ("Organize imports" :exec eclim-java-import-organize) - ("Reformat" :exec eclim-java-format) - ("Rename symbol at point" :exec eclim-java-refactor-rename-symbol-at-point :region nil))) - - (def-menu! +java/help-menu - "Help and information commands for `java-mode' buffers." - '(("Find documentation for current element" :exec eclim-java-show-documentation-for-current-element) - ("Find references" :exec eclim-java-find-references) - ("View call hierarchy" :exec eclim-java-call-hierarchy) - ("View hierarchy" :exec eclim-java-hierarchy) - ("View problems" :exec eclim-problems))) - - (def-menu! +java/project-menu - "Building/compilation commands for `java-mode' buffers." - '(("Build project" :exec eclim-project-build) - ("Create project" :exec eclim-project-create) - ("Delete project" :exec eclim-project-delete) - ("Go to project" :exec eclim-project-goto) - ("Import project" :exec eclim-project-import) - ("Close project" :exec eclim-project-close) - ("Open project" :exec eclim-project-open) - ("Update project" :exec eclim-project-update))) - (map! :map java-mode-map :localleader - "r" #'+java/refactor-menu - "c" #'+java/compile-menu - "p" #'+java/project-menu)) + (:prefix "r" + :n "gc" #'eclim-java-constructor + :n "gg" #'eclim-java-generate-getter-and-setter + :n "oi" #'eclim-java-import-organize + :n "f" #'eclim-java-format + :n "r" #'eclim-java-refactor-rename-symbol-at-point) + (:prefix "h" + :n "." #'eclim-java-show-documentation-for-current-element + :n "r" #'eclim-java-find-references + :n "c" #'eclim-java-call-hierarchy + :n "h" #'eclim-java-hierarchy + :n "p" #'eclim-problems + :n "r" #'meghanada-reference + :n "t" #'meghanada-typeinfo) + (:prefix "b" + :n "b" #'eclim-project-build + :n "c" #'eclim-project-create + :n "d" #'eclim-project-delete + :n "g" #'eclim-project-goto + :n "i" #'eclim-project-import + :n "k" #'eclim-project-close + :n "o" #'eclim-project-open + :n "u" #'eclim-project-update))) (def-package! company-emacs-eclim diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index b2905e188..3e170ec39 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -14,26 +14,16 @@ :definition #'meghanada-jump-declaration :references #'meghanada-reference) - ;; - (def-menu! +java/refactor-menu - "Refactoring commands for `java-mode' buffers." - '(("Add imports for unqualified classes" :exec meghanada-import-all) - ("Optimize and clean up imports" :exec meghanada-optimize-import) - ("Introduce local variable" :exec meghanada-local-variable) - ("Format buffer code" :exec meghanada-code-beautify))) - - (def-menu! +java/help-menu - "Help and information commands for `java-mode' buffers." - '(("Find usages" :exec meghanada-reference) - ("Show type hierarchives and implemented interfaces" :exec meghanada-typeinfo))) - - (def-menu! +java/project-menu - "Project commands for `java-mode' buffers." - '(("Compile current file" :exec meghanada-compile-file) - ("Compile project" :exec meghanada-compile-project))) - (map! :map java-mode-map :localleader - :nv "r" #'+java/refactor-menu - :nv "c" #'+java/compile-menu - :nv "p" #'+java/project-menu)) + (:prefix "r" + :n "ia" #'meghanada-import-all + :n "io" #'meghanada-optimize-import + :n "l" #'meghanada-local-variable + :n "f" #'meghanada-code-beautify) + (:prefix "h" + :n "r" #'meghanada-reference + :n "t" #'meghanada-typeinfo) + (:prefix "b" + :n "f" #'meghanada-compile-file + :n "p" #'meghanada-compile-project))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 0332158af..77c107b97 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -163,42 +163,12 @@ (add-hook! 'tide-mode-hook (add-hook 'kill-buffer-hook #'+javascript|cleanup-tide-processes nil t)) - (def-menu! +javascript/refactor-menu - "Refactoring commands for `js2-mode' buffers." - '(("Restart tsserver" :exec tide-restart-server :when (bound-and-true-p tide-mode)) - ("Reformat buffer/region (tide)" :exec tide-reformat :when (bound-and-true-p tide-mode)) - ("Organize imports" :exec tide-organize-imports :when (bound-and-true-p tide-mode)) - ("Rename symbol" :exec tide-rename-symbol :when (bound-and-true-p tide-mode) :region nil) - ("Reformat buffer (eslint_d)" :exec eslintd-fix :when (bound-and-true-p eslintd-fix-mode) :region nil) - ("Extract into function" :exec js2r-extract-function :region t) - ("Extract into method" :exec js2r-extract-method :region t) - ("Introduce parameter to function" :exec js2r-introduce-parameter :region t) - ("Localize parameter" :exec js2r-localize-parameter :region nil) - ("Expand object" :exec js2r-expand-object :region nil) - ("Expand function" :exec js2r-expand-function :region nil) - ("Expand array" :exec js2r-expand-array :region nil) - ("Contract object" :exec js2r-contract-object :region nil) - ("Contract function" :exec js2r-contract-function :region nil) - ("Contract array" :exec js2r-contract-array :region nil) - ("Wrap buffer in IIFE" :exec js2r-wrap-buffer-in-iife :region nil) - ("Inject global into IIFE" :exec js2r-inject-global-in-iife :region t) - ("Add to globals annotation" :exec js2r-add-to-globals-annotation :region nil) - ("Extract variable" :exec js2r-extract-var :region t) - ("Inline variable" :exec js2r-inline-var :region t) - ("Rename variable" :exec js2r-rename-var :region nil) - ("Replace var with this" :exec js2r-var-to-this :region nil) - ("Arguments to object" :exec js2r-arguments-to-object :region nil) - ("Ternary to if" :exec js2r-ternary-to-if :region nil) - ("Split var declaration" :exec js2r-split-var-declaration :region nil) - ("Split string" :exec js2r-split-string :region nil) - ("Unwrap" :exec js2r-unwrap :region t) - ("Log this" :exec js2r-log-this) - ("Debug this" :exec js2r-debug-this)) - :prompt "Refactor: ") - (map! :map tide-mode-map :localleader - :n "r" #'+javascript/refactor-menu)) + :n "R" #'tide-restart-server + :n "f" #'tide-reformat + :n "rs" #'tide-rename-symbol + :n "roi" #'tide-organize-imports)) (def-package! xref-js2 @@ -208,15 +178,8 @@ (def-package! js2-refactor - :commands - (js2r-extract-function js2r-extract-method js2r-introduce-parameter - js2r-localize-parameter js2r-expand-object js2r-contract-object - js2r-expand-function js2r-contract-function js2r-expand-array - js2r-contract-array js2r-wrap-buffer-in-iife js2r-inject-global-in-iife - js2r-add-to-globals-annotation js2r-extract-var js2r-inline-var - js2r-rename-var js2r-var-to-this js2r-arguments-to-object js2r-ternary-to-if - js2r-split-var-declaration js2r-split-string js2r-unwrap js2r-log-this - js2r-debug-this js2r-forward-slurp js2r-forward-barf)) + :hook ((js2-mode rjsx-mode) . js2-refactor-mode) + :config (js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key))) (def-package! eslintd-fix diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 9774638b2..58d086f43 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -7,16 +7,7 @@ (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) (set-repl-handler! 'lua-mode #'+lua/repl) - (set-company-backend! 'lua-mode '(company-lua company-yasnippet)) - - (def-menu! +lua/build-menu - "Build/compilation commands for `lua-mode' buffers." - '(("Run Love app" :exec +lua/run-love-game :when +lua-love-mode)) - :prompt "Build tasks: ") - - (map! :map lua-mode-map - :localleader - :n "b" #'+lua/build-menu)) + (set-company-backend! 'lua-mode '(company-lua company-yasnippet))) (after! moonscript @@ -29,5 +20,8 @@ (def-project-mode! +lua-love-mode :modes (lua-mode markdown-mode json-mode) - :files (and "main.lua" "conf.lua")) - + :files (and "main.lua" "conf.lua") + :on-load + (map! :map +lua-love-mode-map + :localleader + :n "b" #'+lua/run-love-game)) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 3bbade611..a95c4e512 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -7,14 +7,10 @@ (map! :map rust-mode-map :localleader - :n "b" #'+rust/build-menu) - - (def-menu! +rust/build-menu - "TODO" - '(("cargo run" :exec "cargo run --color always") - ("cargo build" :exec "cargo build --color always") - ("cargo test" :exec "cargo test --color always")) - :prompt "Cargo: ")) + :prefix "b" + :n "b" (λ! (compile "cargo build --color always")) + :n "r" (λ! (compile "cargo run --color always")) + :n "t" (λ! (compile "cargo test --color always")))) (def-package! racer From e89e3bd15e1946fba911fc3ba540c660431c3957 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 03:19:01 +0200 Subject: [PATCH 3035/4235] Redesign set-docsets! autodef + Adds :add/:remove support. + Adds conditional docset support through nested vectors + Removes support for setting docsets on a minor-mode basis (mostly for performance reasons, but now that we have conditional docsets, it's unnecessary). --- modules/feature/lookup/autoload/docsets.el | 49 +++++++++++++--------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index c19a7fbbe..c7ba5b008 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -9,12 +9,24 @@ assemble a list of installed & active docsets.") ;;;###autodef (defun set-docsets! (modes &rest docsets) - "Registers a list of DOCSETS (strings) for MODES (either one major/minor mode -symbol or a list of them). DOCSETS can also contain sublists. + "Registers a list of DOCSETS for MODES. -If MODES is a minor mode, you can use :add or :remove as the first element of -DOCSETS, to instruct it to append (or remove) those from the docsets already set -by a major-mode, if any. +MODES can be one major mode, or a list thereof. + +DOCSETS can be strings, each representing a dash docset, or a vector with the +structure [DOCSET FORM]. If FORM evaluates to nil, the DOCSET is omitted. If it +is non-nil, (format DOCSET FORM) is used as the docset. + +The first element in DOCSETS can be :add or :remove, making it easy for users to +add to or remove default docsets from modes. + +DOCSETS can also contain sublists, which will be flattened. + +Example: + + (set-docsets! '(js2-mode rjsx-mode) \"JavaScript\" + [\"React\" (eq major-mode 'rjsx-mode)] + [\"TypeScript\" (bound-and-true-p tide-mode)]) Used by `+lookup/in-docsets' and `+lookup/documentation'." (declare (indent defun)) @@ -22,9 +34,14 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (if (null docsets) (setq +lookup-docset-alist (delq (assq mode +lookup-docset-alist) - +lookup-docset-alist))) - (setf (alist-get mode +lookup-docset-alist) - (mapcan #'doom-enlist docsets)))) + +lookup-docset-alist)) + (let ((action (if (keywordp (car docsets)) (pop docsets))) + (docsets (mapcan #'doom-enlist docsets))) ; flatten list + (setf (alist-get mode +lookup-docset-alist) + (pcase action + (:add (append docsets (alist-get mode +lookup-docset-alist))) + (:remove (cl-set-difference (alist-get mode +lookup-docset-alist) docsets)) + (_ docsets))))))) ;;;###autodef (defalias 'set-docset! #'set-docsets!) @@ -45,17 +62,11 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." "Return list of installed & selected docsets for the current major mode. This list is built from `+lookup-docset-alist'." - (let ((base-docsets (cdr (assq major-mode +lookup-docset-alist)))) - (dolist (spec +lookup-docset-alist) - (cl-destructuring-bind (mode . docsets) spec - (when (and (boundp mode) (symbol-value mode)) - (pcase (car docsets) - (:add (nconc base-docsets (cdr docsets))) - (:remove - (dolist (docset (cdr docsets)) - (setq base-docsets (delete docset base-docsets)))) - (_ (setq base-docsets docsets)))))) - base-docsets)) + (cl-loop for docset in (cdr (assq major-mode +lookup-docset-alist)) + when (or (stringp docset) + (and (vectorp docset) + (eval (aref docset 1) t))) + collect docset)) ;;;###autoload (defun +lookup-docset-installed-p (docset) From 48c77b11263ea5d799633b5f1ecb62cd42c48f46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 03:42:44 +0200 Subject: [PATCH 3036/4235] Move helm-css-scss package to lang/web/+css --- modules/completion/helm/config.el | 5 ----- modules/completion/helm/packages.el | 1 - modules/lang/web/+css.el | 11 +++++++++++ modules/lang/web/packages.el | 2 ++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index cbb8e01ed..05184198c 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -163,11 +163,6 @@ be negative.") (setq helm-bookmark-show-location t) -;; `helm-css-scss' -- https://github.com/ShingoFukuyama/helm-css-scss -(setq helm-css-scss-split-direction #'split-window-vertically - helm-css-scss-split-with-multiple-windows t) - - ;; `helm-files' (after! helm-files (setq helm-boring-file-regexp-list diff --git a/modules/completion/helm/packages.el b/modules/completion/helm/packages.el index 746135f85..1e8d9d178 100644 --- a/modules/completion/helm/packages.el +++ b/modules/completion/helm/packages.el @@ -5,7 +5,6 @@ (package! helm-ag) (package! helm-c-yasnippet) (package! helm-company) -(package! helm-css-scss) (package! helm-describe-modes :recipe (:fetcher github :repo "emacs-helm/helm-describe-modes")) (package! helm-projectile) (package! swiper-helm) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index d68fed0a8..655d7a4b3 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -31,6 +31,17 @@ :localleader :n ";" #'counsel-css)) +(def-package! helm-css-scss + :when (featurep! :completion helm) + :defer t + :init + (map! :map* (css-mode-map scss-mode-map less-css-mode-map) + :localleader :n ";" #'helm-css-scss) + :config + (setq helm-css-scss-split-direction #'split-window-vertically + helm-css-scss-split-with-multiple-windows t)) + + (def-package! css-mode ; built-in :defer t :config diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index bbfcbfd3b..84dd794cf 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -6,6 +6,8 @@ (package! rainbow-mode) (when (featurep! :completion ivy) (package! counsel-css)) +(when (featurep! :completion helm) + (package! helm-css-scss)) ;; +html.el (package! emmet-mode) From 8b7404bf7577cd5744fcb078bb0c5214822c37e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 04:11:32 +0200 Subject: [PATCH 3037/4235] Refactor hl-line eob fix in Emacs 26+ --- core/core-ui.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 0a018fd8d..bb596db38 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -159,14 +159,15 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; On Emacs 26+, when point is on the last line, hl-line highlights bleed into ;; the rest of the window after eob. This is the fix. - (unless (get 'display-line-numbers 'nlinum) + (when EMACS26+ (defun doom--line-range () (cons (line-beginning-position) - (cond ((save-excursion - (goto-char (line-end-position)) - (and (eobp) (not (bolp)))) + (cond ((let ((eol (line-end-position))) + (and (= eol (point-max)) + (/= eol (line-beginning-position)))) (1- (line-end-position))) - ((or (eobp) (save-excursion (forward-line) (eobp))) + ((or (eobp) + (= (line-end-position 2) (point-max))) (line-end-position)) ((line-beginning-position 2))))) (setq hl-line-range-function #'doom--line-range)) From 0f901b560fbec6a193c3224b085dd8ea48060925 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 04:26:06 +0200 Subject: [PATCH 3038/4235] tools/editorconfig: add enh-ruby-mode support --- modules/tools/editorconfig/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index b498d0c55..908ee1927 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -25,7 +25,8 @@ (setq editorconfig-indentation-alist (append '((mips-mode mips-tab-width) (haxor-mode haxor-tab-width) - (nasm-mode nasm-basic-offset)) + (nasm-mode nasm-basic-offset) + (enh-ruby-mode enh-ruby-indent-level)) editorconfig-indentation-alist))) (defun doom*editorconfig-smart-detection (orig-fn &rest args) From c0ff5b030aebf97eb860ba1502b4beb9bca508d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 05:29:00 +0200 Subject: [PATCH 3039/4235] feature/evil: fix evil-change recommenting line Due to a bug crossing over from +evil-want-o/O-continue-comments functionality. It has also been refactored for performance. This also fixes an issue where smartparens functions could be called before smartparens was loaded, making o/O inoperable. --- modules/feature/evil/config.el | 102 +++++++++++++++++---------------- 1 file changed, 52 insertions(+), 50 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 9ade07129..e07c5850d 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -139,59 +139,61 @@ line with a linewise comment.") ;; Make o/O continue comments (defun +evil*insert-newline-above-and-respect-comments (orig-fn count) - (cl-letf* ((old-insert-newline-above (symbol-function 'evil-insert-newline-above)) - ((symbol-function 'evil-insert-newline-above) - (lambda () - (if (or (not +evil-want-o/O-to-continue-comments) - (evil-insert-state-p)) - (funcall old-insert-newline-above) - (let ((pos (save-excursion (beginning-of-line-text) (point)))) - (evil-narrow-to-field - (if (save-excursion (nth 4 (syntax-ppss pos))) - (evil-save-goal-column - (setq evil-auto-indent nil) - (goto-char pos) - (let ((ws (abs (skip-chars-backward " \t")))) - ;; FIXME oh god why - (save-excursion - (if comment-line-break-function - (funcall comment-line-break-function) - (comment-indent-new-line)) - (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) - (eq (char-after) ?/)) - (insert "*")) - (insert - (make-string (max 0 (+ ws (skip-chars-backward " \t"))) - 32))) - (insert (make-string (max 1 ws) 32)))) - (evil-move-beginning-of-line) - (insert (if use-hard-newlines hard-newline "\n")) - (forward-line -1) - (back-to-indentation)))))))) - (let ((evil-auto-indent evil-auto-indent)) - (funcall orig-fn count)))) + (if (or (not +evil-want-o/O-to-continue-comments) + (not (eq this-command 'evil-open-above)) + (evil-insert-state-p)) + (funcall orig-fn count) + (cl-letf (((symbol-function 'evil-insert-newline-above) + (lambda () + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (require 'smartparens) + (if (save-excursion (nth 4 (sp--syntax-ppss pos))) + (evil-save-goal-column + (setq evil-auto-indent nil) + (goto-char pos) + (let ((ws (abs (skip-chars-backward " \t")))) + ;; FIXME oh god why + (save-excursion + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line)) + (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) + (eq (char-after) ?/)) + (insert "*")) + (insert + (make-string (max 0 (+ ws (skip-chars-backward " \t"))) + 32))) + (insert (make-string (max 1 ws) 32)))) + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count))))) (advice-add #'evil-open-above :around #'+evil*insert-newline-above-and-respect-comments) (defun +evil*insert-newline-below-and-respect-comments (orig-fn count) - (cl-letf* ((old-insert-newline-below (symbol-function 'evil-insert-newline-below)) - ((symbol-function 'evil-insert-newline-below) - (lambda () - (if (or (not +evil-want-o/O-to-continue-comments) - (evil-insert-state-p)) - (funcall old-insert-newline-below) - (let ((pos (save-excursion (beginning-of-line-text) (point)))) - (evil-narrow-to-field - (evil-move-end-of-line) - (cond ((sp-point-in-comment pos) - (setq evil-auto-indent nil) - (if comment-line-break-function - (funcall comment-line-break-function) - (comment-indent-new-line))) - (t - (insert (if use-hard-newlines hard-newline "\n")) - (back-to-indentation))))))))) - (let ((evil-auto-indent evil-auto-indent)) - (funcall orig-fn count)))) + (if (or (not +evil-want-o/O-to-continue-comments) + (not (eq this-command 'evil-open-below)) + (evil-insert-state-p)) + (funcall orig-fn count) + (cl-letf (((symbol-function 'evil-insert-newline-below) + (lambda () + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (evil-move-end-of-line) + (require 'smartparens) + (cond ((sp-point-in-comment pos) + (setq evil-auto-indent nil) + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line))) + (t + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation)))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count))))) (advice-add #'evil-open-below :around #'+evil*insert-newline-below-and-respect-comments) ;; --- custom interactive codes ----------- From f7326a2c40e4c9f25e1024382c22de437a3ade29 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Sep 2018 00:25:30 +0200 Subject: [PATCH 3040/4235] Update doom doctor for new init process For changes made in 31bcac9a --- bin/doom-doctor | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index ccd83c284..ac162f863 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -277,8 +277,10 @@ (condition-case ex (let ((inhibit-message t) + (after-init-time (current-time)) noninteractive) - (load-file (concat user-emacs-directory "core/core.el")) + (delq 'core features) + (load-file (concat user-emacs-directory "init.el")) (require 'core-packages) (doom-initialize-packages) (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) From a0250e60e3d89ece1abf24465c0b7e6b33c176f2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Sep 2018 01:40:04 +0200 Subject: [PATCH 3041/4235] Add rainbow-delimiters in lang/common-lisp instead Gives users one place to look to determine what cosmetic hooks are applied in lisp-mode. --- core/core-ui.el | 8 +++----- modules/lang/common-lisp/config.el | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index bb596db38..54fe47f9d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -110,11 +110,9 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (def-package! highlight-escape-sequences :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) -;; `rainbow-delimiters' Helps us distinguish stacked delimiter pairs. Especially -;; in parentheses-drunk languages like Lisp. -(def-package! rainbow-delimiters - :hook (lisp-mode . rainbow-delimiters-mode) - :config (setq rainbow-delimiters-max-face-count 3)) +;; `rainbow-delimiters' --- helps us distinguish stacked delimiter pairs. +;; Especially in parentheses-drunk languages like Lisp. +(setq rainbow-delimiters-max-face-count 3) ;; `restart-emacs' (setq restart-emacs--args (list "--restore")) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index eac1e33c2..0db5ccc10 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -9,6 +9,8 @@ :definition #'sly-edit-definition :documentation #'sly-describe-symbol) + (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) + (defun +common-lisp|cleanup-sly-maybe () "Kill processes and leftover buffers when killing the last sly buffer." (unless (cl-loop for buf in (delq (current-buffer) (buffer-list)) From 628b40f8823e7b8062ae2b36fa640f546f6150df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Sep 2018 01:42:41 +0200 Subject: [PATCH 3042/4235] emacs/ediff: fix hooks not being appended --- modules/emacs/ediff/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/emacs/ediff/config.el b/modules/emacs/ediff/config.el index 120a3ebdd..cc9130e27 100644 --- a/modules/emacs/ediff/config.el +++ b/modules/emacs/ediff/config.el @@ -12,5 +12,6 @@ (setq +ediff--saved-wconf (current-window-configuration))) (defun +ediff|restore-wconf () (set-window-configuration +ediff--saved-wconf)) + (add-hook 'ediff-before-setup-hook #'+ediff|save-wconf) -(add-hook! '(ediff-quit-hook ediff-suspend-hook) #'+ediff|restore-wconf 'append) +(add-hook! :append '(ediff-quit-hook ediff-suspend-hook) #'+ediff|restore-wconf) From 50fdaa0ed534e74f052176bbed6a616f6ef07d77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 19:18:44 -0400 Subject: [PATCH 3043/4235] Silence "unbound key" spam on mouse-1 in dashboard --- 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 93da1ce82..31e1da990 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -151,6 +151,7 @@ PLIST can have the following properties: [tab] #'forward-button [backtab] #'backward-button) (define-key! +doom-dashboard-mode-map + [left-margin mouse-1] #'ignore [remap evil-next-visual-line] #'forward-button [remap evil-previous-visual-line] #'backward-button [remap evil-delete] #'ignore From 7d3ffdff06492f76770b05f97d5abfbbc62d25da Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 19:36:16 -0400 Subject: [PATCH 3044/4235] Remove third line in section headers This is truly important stuff. We've saved many lives with this update. --- core/autoload/buffers.el | 4 ---- core/autoload/cache.el | 1 - core/autoload/debug.el | 13 +++---------- core/autoload/editor.el | 3 --- core/autoload/files.el | 4 ++++ core/autoload/help.el | 2 -- core/autoload/packages.el | 4 ---- core/autoload/projects.el | 3 --- core/autoload/scratch.el | 1 - core/core-cli.el | 5 +---- core/core-editor.el | 4 +--- core/core-lib.el | 6 ++---- core/core-modules.el | 5 ----- core/core-packages.el | 3 --- core/core-projects.el | 3 +-- core/core-ui.el | 7 +------ core/core.el | 8 -------- modules/app/calendar/config.el | 3 +-- modules/app/email/autoload/email.el | 1 - modules/app/email/config.el | 4 +--- modules/app/irc/config.el | 3 +-- modules/app/notmuch/autoload.el | 2 -- modules/app/rss/autoload.el | 2 -- modules/app/rss/config.el | 1 - modules/app/twitter/autoload.el | 1 - modules/app/write/config.el | 3 +-- modules/completion/company/autoload.el | 4 +--- modules/completion/company/config.el | 3 +++ modules/completion/helm/autoload/evil.el | 3 ++- modules/completion/helm/autoload/helm.el | 1 - modules/completion/helm/config.el | 1 - modules/completion/ivy/autoload/evil.el | 3 ++- modules/completion/ivy/autoload/ivy.el | 2 -- modules/completion/ivy/config.el | 2 -- modules/config/default/+bindings.el | 2 -- modules/config/default/+evil-commands.el | 3 +-- modules/config/default/config.el | 4 +--- modules/config/literate/init.el | 2 -- modules/editor/format/autoload/format.el | 2 -- modules/editor/format/config.el | 3 +-- modules/emacs/dired/config.el | 1 - modules/emacs/eshell/autoload/eshell.el | 4 ---- modules/emacs/eshell/config.el | 3 +-- modules/emacs/hideshow/autoload.el | 1 - modules/emacs/vc/config.el | 5 ++--- modules/feature/eval/autoload/settings.el | 3 --- modules/feature/eval/config.el | 3 +-- modules/feature/evil/+everywhere.el | 1 - modules/feature/evil/autoload/evil.el | 2 -- modules/feature/evil/config.el | 4 +--- modules/feature/file-templates/autoload.el | 2 -- modules/feature/file-templates/config.el | 2 -- modules/feature/lookup/autoload/docsets.el | 2 -- modules/feature/lookup/autoload/lookup.el | 3 --- modules/feature/lookup/config.el | 3 --- modules/feature/snippets/autoload/snippets.el | 1 - modules/feature/snippets/config.el | 3 +-- .../feature/workspaces/autoload/workspaces.el | 7 +------ modules/feature/workspaces/config.el | 3 +-- modules/lang/cc/autoload.el | 3 --- modules/lang/cc/config.el | 12 +++--------- modules/lang/clojure/config.el | 1 + modules/lang/data/config.el | 2 -- modules/lang/emacs-lisp/autoload.el | 3 --- modules/lang/emacs-lisp/config.el | 7 ++----- modules/lang/go/autoload.el | 1 - modules/lang/go/config.el | 3 +-- modules/lang/haskell/config.el | 3 +-- modules/lang/java/config.el | 3 +-- modules/lang/javascript/autoload.el | 3 --- modules/lang/latex/config.el | 3 +-- modules/lang/lua/config.el | 2 +- modules/lang/org/+attach.el | 4 +--- modules/lang/org/+babel.el | 3 +-- modules/lang/org/+present.el | 5 +---- modules/lang/org/autoload/org-attach.el | 1 - modules/lang/org/autoload/org.el | 4 ---- modules/lang/org/config.el | 7 +------ modules/lang/php/config.el | 1 - modules/lang/python/config.el | 4 +--- modules/lang/ruby/config.el | 4 +--- modules/lang/sh/config.el | 3 +-- modules/lang/solidity/config.el | 3 +-- modules/lang/web/config.el | 3 +-- modules/tools/ein/autoload.el | 1 - modules/tools/ein/config.el | 3 +-- modules/tools/magit/autoload.el | 2 -- modules/tools/magit/config.el | 3 +-- modules/tools/password-store/autoload.el | 4 ---- modules/tools/password-store/config.el | 3 +-- modules/tools/tmux/autoload/tmux.el | 2 -- modules/ui/doom-dashboard/config.el | 5 ----- modules/ui/doom-modeline/config.el | 18 +----------------- modules/ui/doom/config.el | 3 +-- modules/ui/fci/config.el | 3 +-- modules/ui/modeline/config.el | 13 +------------ modules/ui/popup/+hacks.el | 2 -- modules/ui/popup/autoload/popup.el | 5 ----- modules/ui/popup/autoload/settings.el | 1 - modules/ui/popup/config.el | 4 ---- modules/ui/vc-gutter/config.el | 3 +-- 101 files changed, 64 insertions(+), 283 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index e6d447475..3107710b5 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -42,7 +42,6 @@ leftover buffers and processes.") ;; ;; Functions -;; ;;;###autoload (defun doom-buffer-frame-predicate (buf) @@ -197,7 +196,6 @@ regex PATTERN. Returns the number of killed buffers." ;; ;; Hooks -;; ;;;###autoload (defun doom|mark-buffer-as-real () @@ -207,7 +205,6 @@ regex PATTERN. Returns the number of killed buffers." ;; ;; Advice -;; ;;;###autoload (defun doom*switch-to-fallback-buffer-maybe (orig-fn) @@ -241,7 +238,6 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;; ;; Interactive commands -;; ;;;###autoload (defun doom/kill-this-buffer-in-all-windows (buffer &optional dont-save) diff --git a/core/autoload/cache.el b/core/autoload/cache.el index bf1c46bd5..235f6243a 100644 --- a/core/autoload/cache.el +++ b/core/autoload/cache.el @@ -34,7 +34,6 @@ listed in `doom-cache-alists' to files." ;; ;; Library -;; ;;;###autoload (defmacro with-cache! (location &rest body) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index cd963b9fa..675201a4c 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -71,7 +71,6 @@ ready to be pasted in a bug report on github." ;; ;; Commands -;; ;;;###autoload (defun doom/info () @@ -135,9 +134,7 @@ pasting into a bug report or discord." (user-error "No backtrace buffer detected"))) -;; -;; Vanilla sandbox -;; +;;; Vanilla sandbox (defvar doom--sandbox-init-doom-p nil) @@ -204,9 +201,7 @@ standing in the way, and without sacrificing access to installed packages." (pop-to-buffer buf))) -;; -;; Reporting bugs -;; +;;; Reporting bugs (defun doom--open-bug-report () "TODO" @@ -276,9 +271,7 @@ will be automatically appended to the result." (pop-to-buffer buf)))) -;; -;; Profiling -;; +;;; Profiling (defvar doom--profiler nil) ;;;###autoload diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 56d9cb942..572e35c6f 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -28,7 +28,6 @@ lines, above and below, with only whitespace in between." ;; ;; Commands -;; ;;;###autoload (defun doom/backward-to-bol-or-indent () @@ -273,7 +272,6 @@ Respects `require-final-newline'." ;; ;; Advice -;; ;;;###autoload (defun doom*newline-and-indent (_orig-fn) @@ -293,7 +291,6 @@ with weak native support." ;; ;; Hooks -;; ;;;###autoload (defun doom|enable-delete-trailing-whitespace () diff --git a/core/autoload/files.el b/core/autoload/files.el index 99831229b..a1066b0f6 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -67,6 +67,10 @@ short-new-name) (short-new-name)))) + +;; +;; Commands + ;;;###autoload (defun doom/delete-this-file (&optional path force-p) "Delete FILENAME (defaults to the file associated with current buffer) and diff --git a/core/autoload/help.el b/core/autoload/help.el index d41dc7662..6f2d4d8d0 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -44,7 +44,6 @@ ;; ;; Helpers -;; ;;;###autoload (defun doom-active-minor-modes () @@ -57,7 +56,6 @@ ;; ;; Commands -;; ;;;###autoload (define-obsolete-function-alias 'doom/describe-setting 'doom/describe-setters "2.1.0") diff --git a/core/autoload/packages.el b/core/autoload/packages.el index d6b5624e7..2c4b47e6d 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -34,7 +34,6 @@ ;; ;; Library -;; ;;;###autoload (defun doom-refresh-packages-maybe (&optional force-p) @@ -314,7 +313,6 @@ Used by `doom-packages-install'." ;; ;; Main functions -;; (defun doom--delete-package-files (name-or-desc) (let ((pkg-build-dir @@ -404,7 +402,6 @@ package.el as appropriate." ;; ;; Interactive commands -;; ;;;###autoload (defun doom/update-package (pkg) @@ -436,7 +433,6 @@ calls." ;; ;; Advice -;; ;;;###autoload (defun doom*package-delete (desc &rest _) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 0d5c5d305..e43f5af15 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -2,7 +2,6 @@ ;; ;; Macros -;; ;;;###autoload (defmacro without-project-cache! (&rest body) @@ -25,7 +24,6 @@ they are absolute." ;; ;; Commands -;; ;;;###autoload (defun doom/reload-project () @@ -39,7 +37,6 @@ they are absolute." ;; ;; Library -;; ;;;###autoload (defun doom-project-p (&optional nocache) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index 7d3d06536..97a2ed206 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -22,7 +22,6 @@ following: ;; ;; Library -;; ;;;###autoload (defun doom-scratch-buffer (&optional file mode text) diff --git a/core/core-cli.el b/core/core-cli.el index b620e9dc5..35290bcea 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -10,7 +10,6 @@ ;; ;; Dispatcher API -;; (defvar doom-auto-accept (getenv "YES") "If non-nil, Doom will auto-accept any confirmation prompts during batch @@ -85,10 +84,8 @@ BODY will be run when this dispatcher is called." ;; -;; Dispatch commands -;; +;; Dummy dispatch commands (no-op because they're handled especially) -;; Dummy dispatchers (no-op because they're handled especially) (dispatcher! run :noop "Run Doom Emacs from bin/doom's parent directory. diff --git a/core/core-editor.el b/core/core-editor.el index 6151c7c46..1ba77ff3a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -73,7 +73,6 @@ fundamental-mode) for performance sake." ;; ;; Built-in plugins -;; (push '("/LICENSE\\'" . text-mode) auto-mode-alist) @@ -151,8 +150,7 @@ savehist file." ;; -;; Core Plugins -;; +;; Packages ;; Auto-close delimiters and blocks as you type. It's more powerful than that, ;; but that is all Doom uses it for. diff --git a/core/core-lib.el b/core/core-lib.el index 132877e07..bc154dac3 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,6 +1,6 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -;; Built in packages we use a lot of +;; Built-in packages we use a lot of (require 'subr-x) (require 'cl-lib) @@ -31,7 +31,6 @@ means to remove KEY from ALIST if the new value is `eql' to DEFAULT." ;; ;; Helpers -;; (defun doom--resolve-path-forms (spec &optional directory) "Converts a simple nested series of or/and forms into a series of @@ -93,8 +92,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." ;; -;; Functions -;; +;; Public library (defun doom-unquote (exp) "Return EXP unquoted." diff --git a/core/core-modules.el b/core/core-modules.el index b4ebc0a2b..f2813bf3a 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -30,7 +30,6 @@ A warning will be put out if these deprecated modules are used.") ;; ;; Bootstrap API -;; (defun doom-initialize-modules (&optional force-p) "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy @@ -65,7 +64,6 @@ non-nil." ;; ;; Module API -;; (defun doom-module-p (category module) "Returns t if CATEGORY MODULE is enabled (ie. present in `doom-modules')." @@ -188,7 +186,6 @@ non-nil, return paths of possible modules, activated or otherwise." ;; ;; Use-package modifications -;; (autoload 'use-package "use-package-core" nil nil t) @@ -246,7 +243,6 @@ non-nil, return paths of possible modules, activated or otherwise." ;; ;; Module config macros -;; (defmacro doom! (&rest modules) "Bootstraps DOOM Emacs and its modules. @@ -382,7 +378,6 @@ omitted. eg. (featurep! +flag1)" ;; ;; FIXME Cross-module configuration (deprecated) -;; ;; I needed a way to reliably cross-configure modules without littering my ;; modules with `after!' blocks or testing whether they were enabled, so I wrote diff --git a/core/core-packages.el b/core/core-packages.el index 72d430971..36121bf39 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -75,7 +75,6 @@ missing) and shouldn't be deleted.") ;; ;; Bootstrapper -;; (defun doom-initialize-packages (&optional force-p) "Ensures that Doom's package management system, package.el and quelpa are @@ -137,7 +136,6 @@ them." ;; ;; Package API -;; (defun doom-ensure-packages-initialized (&optional force-p) "Make sure package.el is initialized." @@ -169,7 +167,6 @@ them." ;; ;; Module package macros -;; (cl-defmacro package! (name &rest plist &key recipe pin disable _ignore _freeze) "Declares a package and how to install it (if applicable). diff --git a/core/core-projects.el b/core/core-projects.el index 32926ccd0..d24811088 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -63,8 +63,7 @@ ;; -;; Projects -;; +;; Project-based minor modes (defvar-local doom-project nil "Either the symbol or a list of project modes you want to enable. Available diff --git a/core/core-ui.el b/core/core-ui.el index 54fe47f9d..a53c12e08 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -75,8 +75,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; -;; Plugins -;; +;; Third party packages ;; `avy' (setq avy-all-windows nil @@ -136,7 +135,6 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; ;; Built-in packages -;; ;; show typed keystrokes in minibuffer (defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) @@ -326,7 +324,6 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; ;; Theme & font -;; (defvar doom-last-window-system (if (daemonp) 'daemon initial-window-system) @@ -393,7 +390,6 @@ frame's window-system, the theme will be reloaded.") ;; ;; Bootstrap -;; ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) @@ -454,7 +450,6 @@ instead). Meant for `kill-buffer-query-functions'." (add-hook 'emacs-startup-hook #'doom|init-ui) -;; ;; Fixes/hacks ;; diff --git a/core/core.el b/core/core.el index 9ef4927ce..c8aa7ae11 100644 --- a/core/core.el +++ b/core/core.el @@ -12,7 +12,6 @@ line or use --debug-init to enable this.") ;; ;; Constants -;; (defconst doom-version "2.0.9" "Current version of DOOM emacs.") @@ -82,7 +81,6 @@ file.") ;; ;; Doom core variables -;; (defvar doom-init-p nil "Non-nil if `doom-initialize' has run.") @@ -105,7 +103,6 @@ Doom was setup, which can cause problems.") ;; ;; Custom error types -;; (define-error 'doom-error "Error in Doom Emacs core") (define-error 'doom-hook-error "Error in a Doom startup hook" 'doom-error) @@ -117,7 +114,6 @@ Doom was setup, which can cause problems.") ;; ;; Custom hooks -;; (defvar doom-init-hook nil "Hooks run after all init.el files are loaded, including your private and all @@ -206,7 +202,6 @@ and `doom-exit-window-hook'." ;; ;; Emacs core configuration -;; ;; UTF-8 as the default coding system (when (fboundp 'set-charset-priority) @@ -309,7 +304,6 @@ original value of `symbol-file'." ;; ;; Bootstrap helpers -;; (defun doom-try-run-hook (hook) "Run HOOK (a hook function), but marks thrown errors to make it a little @@ -382,7 +376,6 @@ If RETURN-P, return the message as a string instead of displaying it." ;; ;; Bootstrap functions -;; (defun doom-initialize (&optional force-p force-load-core-p) "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). @@ -463,7 +456,6 @@ in interactive sessions, nil otherwise (but logs a warning)." ;; ;; Bootstrap Doom -;; (add-to-list 'load-path doom-core-dir) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index b359e1212..c1c9b0a43 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -9,8 +9,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! calfw :commands (cfw:open-calendar-buffer) diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index 7b2f017bc..a471fa181 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -74,7 +74,6 @@ default/fallback account." ;; ;; Hooks -;; (defun +email|init () (add-hook 'kill-buffer-hook #'+email|kill-mu4e nil t)) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 8f9210440..2894d0471 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -9,8 +9,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! mu4e :commands (mu4e mu4e-compose-new) @@ -134,6 +133,5 @@ ;; ;; Sub-modules -;; (if (featurep! +gmail) (load! "+gmail")) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 3adb8557f..d80a17993 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -44,8 +44,7 @@ playback.") ;; -;; Plugins -;; +;; Packages (def-package! circe :commands (circe circe-server-buffers) diff --git a/modules/app/notmuch/autoload.el b/modules/app/notmuch/autoload.el index 22d6d2104..67f4f5e0c 100644 --- a/modules/app/notmuch/autoload.el +++ b/modules/app/notmuch/autoload.el @@ -21,7 +21,6 @@ ;; ;; Commands -;; ;;;###autoload (defun +notmuch/quit () @@ -88,7 +87,6 @@ ;; ;; Advice -;; ;;;###autoload (defun +notmuch*dont-confirm-on-kill-process (orig-fn &rest args) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index f83756e58..982707c8d 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -46,7 +46,6 @@ ;; ;; Hooks -;; ;;;###autoload (defun +rss|elfeed-wrap () @@ -81,7 +80,6 @@ ;; ;; Functions -;; ;;;###autoload (defun +rss-dead-feeds (&optional years) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 256ef0c05..2aedd9816 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -18,7 +18,6 @@ easier to scroll through.") ;; ;; Packages -;; (def-package! elfeed :commands elfeed diff --git a/modules/app/twitter/autoload.el b/modules/app/twitter/autoload.el index 1214c0537..274bd02fd 100644 --- a/modules/app/twitter/autoload.el +++ b/modules/app/twitter/autoload.el @@ -21,7 +21,6 @@ that works with the feature/popup module." ;; ;; Commands -;; (defvar +twitter--old-wconf nil) ;;;###autoload diff --git a/modules/app/write/config.el b/modules/app/write/config.el index 08a74ddff..ecb6adc01 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -25,8 +25,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! langtool :when (featurep! +langtool) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 58326f90b..0ce0e9b3a 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -56,7 +56,6 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; ;; Library -;; (defun +company--backends () (append (cl-loop for (mode . rest) in +company-backend-alist @@ -73,7 +72,6 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; ;; Hooks -;; ;;;###autoload (defun +company|init-backends () @@ -87,7 +85,6 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; ;; Commands -;; ;;;###autoload (defun +company/toggle-auto-completion () @@ -151,6 +148,7 @@ C-x C-l." ;;;###autoload (defun +company/dabbrev-code-previous () + "TODO" (interactive) (require 'company-dabbrev) (let ((company-selection-wrap-around t)) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index b784b2e2e..f14b12223 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -40,6 +40,9 @@ [backtab] #'company-select-previous)) +;; +;; Packages + (def-package! company-prescient :hook (company-mode . company-prescient-mode) :config diff --git a/modules/completion/helm/autoload/evil.el b/modules/completion/helm/autoload/evil.el index 45ef949d7..f7a0372c4 100644 --- a/modules/completion/helm/autoload/evil.el +++ b/modules/completion/helm/autoload/evil.el @@ -8,7 +8,8 @@ (helm-swoop :$query search :$multiline bang)) -;; --- file searching --------------------- +;; +;; Project searching ;;;###autoload (autoload '+helm:pt "completion/helm/autoload/evil" nil t) (evil-define-command +helm:pt (all-files-p query) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index af39ece1a..422ed99a7 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -41,7 +41,6 @@ workspace." ;; ;; Project search -;; (defun +helm-ag-search-args (all-files-p recursive-p) (list (concat "ag " (if IS-WINDOWS "--vimgrep" "--nocolor --nogroup")) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 05184198c..445daa079 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -35,7 +35,6 @@ be negative.") ;; ;; Packages -;; (def-package! helm-mode :defer 1 diff --git a/modules/completion/ivy/autoload/evil.el b/modules/completion/ivy/autoload/evil.el index 0f408044b..28a83c11f 100644 --- a/modules/completion/ivy/autoload/evil.el +++ b/modules/completion/ivy/autoload/evil.el @@ -14,7 +14,8 @@ (+ivy/tasks bang)) -;; --- file searching --------------------- +;; +;; Project searching ;;;###autoload (autoload '+ivy:pt "completion/ivy/autoload/evil" nil t) (evil-define-command +ivy:pt (all-files-p query) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 94abf79e2..f7a0b15b9 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -21,7 +21,6 @@ ;; ;; Library -;; ;;;###autoload (defun +ivy-projectile-find-file-transformer (str) @@ -206,7 +205,6 @@ search current file. See `+ivy-task-tags' to customize what this searches for." ;; ;; File searching -;; ;;;###autoload (defun +ivy/projectile-find-file () diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index c453aa666..5ea37780c 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -31,7 +31,6 @@ immediately runs it on the current candidate (ending the ivy session)." ;; ;; Packages -;; (def-package! ivy :defer 1 @@ -224,7 +223,6 @@ immediately runs it on the current candidate (ending the ivy session)." ;; ;; Evil key fixes -;; (map! :when (featurep! :feature evil +everywhere) :after ivy diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ebfbfbd42..18f84b6dd 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -488,7 +488,6 @@ [remap quit-window] #'kill-this-buffer)) -;; ;; ;; @@ -785,7 +784,6 @@ ;; ;; Keybinding fixes -;; ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 0683cdbae..4b49f280f 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -35,9 +35,8 @@ command from the current directory instead of the project root." ;; ;; Commands -;; -;;; Commands defined elsewhere +;;; these are defined in feature/evil ;;(ex! "al[ign]" #'+evil:align) ;;(ex! "g[lobal]" #'+evil:global) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index dc7df3979..fe294b412 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -4,8 +4,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! emacs-snippets :if (featurep! +snippets) @@ -14,7 +13,6 @@ ;; ;; Config -;; ;; Don't store authinfo in non-encrypted files! (defvar auth-sources diff --git a/modules/config/literate/init.el b/modules/config/literate/init.el index a7a7c19e7..ce02535b2 100644 --- a/modules/config/literate/init.el +++ b/modules/config/literate/init.el @@ -1,7 +1,5 @@ ;;; config/literate/init.el -*- lexical-binding: t; -*- -;;; config/literate/config.el -*- lexical-binding: t; -*- - (defvar +literate-config-file (expand-file-name "config.org" doom-private-dir) "The file path of your literate config file.") diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 99200a29e..e0bd6d6fe 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -137,7 +137,6 @@ See `+format/buffer' for the interactive version of this function, and ;; ;; Commands -;; ;;;###autoload (defun +format/buffer () @@ -185,7 +184,6 @@ is selected)." ;; ;; Hooks -;; ;;;###autoload (defun +format|enable-on-save () diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 99d98abf1..438eb970e 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -14,8 +14,7 @@ If nil, it is disabled in all modes, the same as if the +onsave flag wasn't ;; -;; Plugins -;; +;; Bootstrap (defun +format|enable-on-save-maybe () "Enable formatting on save in certain major modes. diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 1b878c206..1bdafea03 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -62,7 +62,6 @@ ;; ;; Evil integration -;; (map! :when (featurep! :feature evil +everywhere) :after dired diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 0069dcc61..7f734a49c 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -11,7 +11,6 @@ ;; ;; Helpers -;; (defun +eshell--add-buffer (buf) (ring-remove+insert+extend +eshell-buffers buf 'grow)) @@ -77,7 +76,6 @@ ;; ;; Commands -;; ;;;###autoload (defun +eshell/open (arg &optional command) @@ -124,7 +122,6 @@ module to be loaded." ;; ;; Keybinds -;; ;;;###autoload (defun +eshell/search-history () @@ -245,7 +242,6 @@ delete." ;; ;; Hooks -;; ;;;###autoload (defun +eshell|init () diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 60c3ccd8c..1fb2194b1 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -47,8 +47,7 @@ You should use `det-eshell-alias!' to change this.") ;; -;; Plugins -;; +;; Packages (after! eshell ; built-in (setq eshell-banner-message diff --git a/modules/emacs/hideshow/autoload.el b/modules/emacs/hideshow/autoload.el index 087bb62df..d676d57bc 100644 --- a/modules/emacs/hideshow/autoload.el +++ b/modules/emacs/hideshow/autoload.el @@ -35,7 +35,6 @@ ;; ;; Indentation detection -;; (defun +hideshow--empty-line-p () (string= "" (string-trim (thing-at-point 'line)))) diff --git a/modules/emacs/vc/config.el b/modules/emacs/vc/config.el index 427b4403d..38a590e84 100644 --- a/modules/emacs/vc/config.el +++ b/modules/emacs/vc/config.el @@ -38,12 +38,11 @@ otherwise in default state." ;; ;; `vc' (built-in) -;; ;; `vc-hooks' (setq vc-make-backup-files nil) -;; `vc-annotate' (built-in) +;; `vc-annotate' (after! vc-annotate (set-popup-rules! '(("^\\vc-d" :select nil) ; *vc-diff* @@ -52,7 +51,7 @@ otherwise in default state." '(vc-annotate-mode vc-git-log-view-mode) 'normal)) -;; `smerge-mode' (built-in) +;; `smerge-mode' (after! smerge-mode (unless EMACS26+ (with-no-warnings diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 04ec819ca..5a9e579eb 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -2,7 +2,6 @@ ;; ;; REPLs -;; (defvar +eval-repls nil "An alist mapping major modes to plists that describe REPLs. Used by @@ -29,8 +28,6 @@ command that will be called interactively." ;; ;; Evaluation -;; - (defvar +eval-runners nil "Alist mapping major modes to interactive runner functions.") diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index f17bc335d..994a8cd94 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -6,8 +6,7 @@ ;; -;; Plugin(s) -;; +;; Packages (def-package! quickrun :defer t diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index f9c075647..371701a62 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -136,7 +136,6 @@ variable for an explanation of the defaults (in comments). See ;; ;; Bootstrap -;; (after! eldoc (eldoc-add-command-completions "evil-window-")) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 74a87bddd..f15c13b11 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -20,7 +20,6 @@ ;; ;; Commands -;; ;;;###autoload (defun +evil/visual-indent () @@ -104,7 +103,6 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" ;; ;; Evil commands/operators -;; ;;;###autoload (autoload '+evil:apply-macro "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:apply-macro (beg end) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index e07c5850d..4ea48d95e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -225,8 +225,7 @@ line with a linewise comment.") ;; -;; Plugins -;; +;; Packages (def-package! evil-commentary :commands (evil-commentary evil-commentary-yank evil-commentary-line) @@ -398,7 +397,6 @@ the new algorithm is confusing, like in python or ruby." ;; ;; Text object plugins -;; (def-package! evil-args :commands (evil-inner-arg evil-outer-arg diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 2c07c6b51..595b9f6e0 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -59,7 +59,6 @@ these properties: ;; ;; Library -;; ;;;###autoload (cl-defun +file-templates--expand (pred &key project mode trigger ignore _when) @@ -113,7 +112,6 @@ evil is loaded and enabled)." ;; ;; Commands -;; ;;;###autoload (defun +file-templates/insert-license () diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index f7fcaab41..b7cb10292 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -101,7 +101,6 @@ information.") ;; ;; Library -;; (defun +file-templates-in-emacs-dirs-p (file) "Returns t if FILE is in Doom or your private directory." @@ -122,7 +121,6 @@ must be non-read-only, empty, and there must be a rule in ;; ;; Bootstrap -;; (after! yasnippet (if (featurep! :feature snippets) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index c7ba5b008..f8b8efbca 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -55,7 +55,6 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." ;; ;; Library -;; ;;;###autoload (defun +lookup-docsets-for-buffer () @@ -85,7 +84,6 @@ This list is built from `+lookup-docset-alist'." ;; ;; Commands -;; ;;;###autoload (defalias '+lookup/install-docset #'helm-dash-install-docset) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index de5964ff9..0f988a137 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -65,7 +65,6 @@ properties: ;; ;; Library -;; ;; Helpers (defun +lookup--online-provider (&optional force-p namespace) @@ -128,7 +127,6 @@ properties: ;; ;; Main commands -;; ;;;###autoload (defun +lookup/definition (identifier &optional other-window) @@ -273,7 +271,6 @@ Otherwise, falls back on `find-file-at-point'." ;; ;; Source-specific commands -;; (defvar counsel-dash-docsets) (defvar helm-dash-docsets) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 46971184d..11fbe186d 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -74,7 +74,6 @@ argument: the identifier at point.") ;; ;; dumb-jump -;; (def-package! dumb-jump :commands dumb-jump-result-follow @@ -89,7 +88,6 @@ argument: the identifier at point.") ;; ;; xref -;; ;; By default, `etags--xref-backend' is the default xref backend. No need. We'll ;; set these up ourselves in other modules. @@ -116,7 +114,6 @@ argument: the identifier at point.") ;; ;; Dash docset integration -;; ;; Both packages depend on helm-dash, for now (def-package! helm-dash diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index 5a3aeea10..ce7518cac 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -92,7 +92,6 @@ buggy behavior when is pressed in an empty field." ;; ;; Hooks -;; ;;;###autoload (defun +snippets|enable-project-modes (mode &rest _) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 29b1f3fd2..e1aedd1b3 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -5,8 +5,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! yasnippet :commands (yas-minor-mode-on yas-expand yas-expand-snippet yas-lookup-snippet diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 948282a14..4464b621e 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -16,7 +16,6 @@ ;; ;; Library -;; (defun +workspace--protected-p (name) (equal name persp-nil-name)) @@ -203,8 +202,7 @@ throws an error." ;; -;; Interactive commands -;; +;; Commands ;;;###autoload (defun +workspace/load (name) @@ -446,7 +444,6 @@ the next." ;; ;; Tabs display in minibuffer -;; (defun +workspace--tabline (&optional names) (let ((names (or names (+workspace-list-names))) @@ -493,7 +490,6 @@ the next." ;; ;; Hooks -;; ;;;###autoload (defun +workspaces|delete-associated-workspace (&optional frame) @@ -581,7 +577,6 @@ This be hooked to `projectile-after-switch-project-hook'." ;; ;; Advice -;; ;;;###autoload (defun +workspaces*autosave-real-buffers (orig-fn &rest args) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 76ff118e9..f6df57581 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -33,8 +33,7 @@ stored in `persp-save-dir'.") ;; -;; Plugins -;; +;; Packages (def-package! persp-mode :defer t diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 1ab7cd017..d1da3d579 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -6,7 +6,6 @@ ;; ;; Library -;; ;;;###autoload (defun +cc-sp-point-is-template-p (id action context) @@ -89,7 +88,6 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." ;; ;; Commands -;; ;;;###autoload (defun +cc/reload-compile-db () @@ -125,7 +123,6 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." ;; ;; Hooks -;; ;;;###autoload (defun +cc|fontify-constants () diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index bfde05d0f..189e77fca 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -20,8 +20,7 @@ compilation database is present in the project.") ;; -;; Plugins -;; +;; Packages (def-package! cc-mode :commands (c-mode c++-mode objc-mode java-mode) @@ -159,22 +158,18 @@ compilation database is present in the project.") ;; ;; Major modes -;; -;; `cmake-mode' -(def-package! company-cmake +(def-package! company-cmake ; for `cmake-mode' :when (featurep! :completion company) :after cmake-mode :config (set-company-backend! 'cmake-mode 'company-cmake)) -;; `demangle-mode' (def-package! demangle-mode :hook llvm-mode) -;; `glsl-mode' -(def-package! company-glsl +(def-package! company-glsl ; for `glsl-mode' :when (featurep! :completion company) :after glsl-mode :config (set-company-backend! 'glsl-mode 'company-glsl)) @@ -182,7 +177,6 @@ compilation database is present in the project.") ;; ;; Rtags Support -;; (def-package! rtags :when (featurep! +rtags) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index b15ea77ed..f06931192 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -21,6 +21,7 @@ cider-stacktrace-default-filters '(tooling dup) cider-prompt-save-file-on-load nil cider-repl-use-clojure-font-lock t) + (map! :map cider-mode-map :localleader :n "'" #'cider-jack-in diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index cc3e79889..6314281c5 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -10,7 +10,6 @@ (set-company-backend! 'nxml-mode '(company-nxml company-yasnippet))) -;; ;; Third-party plugins ;; @@ -37,7 +36,6 @@ :mode "\\.?vimperatorrc\\'") -;; ;; Frameworks ;; diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index faa2700d4..3d743fdc0 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -2,7 +2,6 @@ ;; ;; Library -;; ;;;###autoload (defun +emacs-lisp-eval (beg end) @@ -73,7 +72,6 @@ library/userland functions" ;; ;; Commands -;; ;;;###autoload (defun +emacs-lisp/repl () @@ -89,7 +87,6 @@ library/userland functions" ;; ;; Hooks -;; ;;;###autoload (defun +emacs-lisp|extend-imenu () diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index f2ecb5536..9c500bfb3 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -3,9 +3,9 @@ (defvar +emacs-lisp-enable-extra-fontification t "If non-nil, highlight special forms, and defined functions and variables.") + ;; ;; elisp-mode deferral hack -;; ;; `elisp-mode' is loaded at startup. In order to lazy load its config we need ;; to pretend it isn't loaded @@ -27,7 +27,6 @@ ;; ;; Config -;; (add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) @@ -77,8 +76,7 @@ ;; -;; Plugins -;; +;; Packages ;; `auto-compile' (setq auto-compile-display-buffer nil @@ -124,7 +122,6 @@ ;; ;; Project modes -;; (def-project-mode! +emacs-lisp-ert-mode :modes (emacs-lisp-mode) diff --git a/modules/lang/go/autoload.el b/modules/lang/go/autoload.el index 5532e757c..83bfb3d96 100644 --- a/modules/lang/go/autoload.el +++ b/modules/lang/go/autoload.el @@ -2,7 +2,6 @@ ;; ;; Tests -;; (defvar +go-test-last nil "The last test run.") diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index fe97b79a0..57397706a 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -1,8 +1,7 @@ ;;; lang/go/config.el -*- lexical-binding: t; -*- ;; -;; Plugins -;; +;; Packages (after! go-mode (set-env! "GOPATH" "GOROOT") diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 28d539687..2a608cda9 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -4,8 +4,7 @@ ((featurep! +dante) (load! "+dante"))) ;; -;; Common plugins -;; +;; Common packages (after! haskell-mode (setq haskell-process-suggest-remove-import-lines t ; warnings for redundant imports etc diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index bd5a11904..9e42b0b62 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -9,8 +9,7 @@ ;; -;; Common plugins -;; +;; Common packages (def-package! android-mode :commands android-mode diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 787e1528a..00bf9d692 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -34,7 +34,6 @@ ignore the cache." ;; ;; Commands -;; ;;;###autoload (defun +javascript/repl () @@ -82,7 +81,6 @@ Run this for any buffer you want to skewer." ;; ;; Hooks -;; ;;;###autoload (defun +javascript|add-node-modules-path () @@ -112,7 +110,6 @@ prioritize project-local packages over global ones." ;; ;; Advice -;; ;;;###autoload (defun +javascript*tide-project-root () diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index f0c6d2be8..51669a764 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -23,8 +23,7 @@ If no viewers are found, `latex-preview-pane' is used.") ;; -;; Plugins -;; +;; Packages (def-package! tex :mode ("\\.tex\\'" . TeX-latex-mode) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 58d086f43..90ce581a3 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -3,6 +3,7 @@ ;; sp's default rules are obnoxious, so disable them (provide 'smartparens-lua) + (after! lua-mode (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) @@ -16,7 +17,6 @@ ;; ;; Frameworks -;; (def-project-mode! +lua-love-mode :modes (lua-mode markdown-mode json-mode) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 09ed06832..3a31dbdf1 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -25,8 +25,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! org-download :commands (org-download-dnd org-download-dnd-base64) @@ -70,7 +69,6 @@ ;; ;; Bootstrap -;; (defun +org|init-attach () (setq org-attach-directory (expand-file-name +org-attach-dir org-directory)) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 4c57a9b94..615833886 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -53,8 +53,7 @@ string). Stops at the first function to return non-nil.") ;; -;; Plugins -;; +;; Packages (def-package! ob-ipython :when (featurep! +ipython) diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index 99b3f5d49..6c99391d4 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -7,8 +7,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! ox-reveal :defer t @@ -43,8 +42,6 @@ ;; ;; Bootstrap -;; (defun +org|init-present () (require 'ox-reveal)) - diff --git a/modules/lang/org/autoload/org-attach.el b/modules/lang/org/autoload/org-attach.el index 1eb724d7c..c99715ef7 100644 --- a/modules/lang/org/autoload/org-attach.el +++ b/modules/lang/org/autoload/org-attach.el @@ -113,7 +113,6 @@ the cursor." ;; ;; Advice -;; ;;;###autoload (defun +org-attach*insert-link (_link filename) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 3621d4eec..edf161be6 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -22,7 +22,6 @@ current file). Only scans first 2048 bytes of the document." ;; ;; Modes -;; ;;;###autoload (define-minor-mode +org-pretty-mode @@ -39,7 +38,6 @@ current file). Only scans first 2048 bytes of the document." ;; ;; Commands -;; ;;;###autoload (defun +org/dwim-at-point () @@ -314,7 +312,6 @@ another level of headings on each invocation." ;; ;; Hooks -;; ;;;###autoload (defun +org|delete-backward-char-and-realign-table-maybe () @@ -419,7 +416,6 @@ with `org-cycle')." ;; ;; Advice -;; ;;;###autoload (defun +org*fix-newline-and-indent-in-src-blocks () diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index eb2ffcfa3..06cedc4c4 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -15,8 +15,7 @@ ;; -;; Plugins -;; +;; Packages ;; `toc-org' (setq toc-org-hrefify-default "org") @@ -39,7 +38,6 @@ ;; ;; Bootstrap -;; (add-hook! 'org-load-hook #'(org-crypt-use-before-save-magic @@ -68,7 +66,6 @@ ;; ;; `org-mode' hooks -;; (defun +org|unfold-to-2nd-level-or-point () "My version of the 'overview' #+STARTUP option: expand first-level headings. @@ -118,7 +115,6 @@ unfold to point on startup." ;; ;; `org-load' hooks -;; (defun +org|setup-agenda () (setq-default @@ -404,7 +400,6 @@ conditions where a window's buffer hasn't changed at the time this hook is run." ;; ;; Built-in libraries -;; (def-package! org-crypt ; built-in :commands org-crypt-use-before-save-magic diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 31ee4e3d7..c92cae75b 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -102,7 +102,6 @@ ;; ;; Projects -;; (def-project-mode! +php-laravel-mode :modes (php-mode yaml-mode web-mode nxml-mode js2-mode scss-mode) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index e44c4d2bf..6485698b1 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -9,8 +9,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! python :defer t @@ -126,7 +125,6 @@ ;; ;; Environment management -;; (def-package! pipenv :commands pipenv-project-p diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 5308e06b7..37d852c6a 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -9,8 +9,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! enh-ruby-mode :mode "\\.rb\\'" @@ -114,7 +113,6 @@ ;; ;; Version managers -;; (def-package! rbenv :when (featurep! +rbenv) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index 77abb3e8a..e73738fca 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -8,8 +8,7 @@ ;; -;; Plugins -;; +;; Packages (def-package! sh-script ; built-in :mode ("\\.zunit\\'" . sh-mode) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index 0795e40b8..0157c37fd 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -1,8 +1,7 @@ ;;; lang/solidity/config.el -*- lexical-binding: t; -*- ;; -;; Plugins -;; +;; Packages ;; `solidity-mode' (setq solidity-comment-style 'slash) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index 6a9c0179f..747435a50 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -20,8 +20,7 @@ ;; -;; Frameworks -;; +;; Framework-based minor-modes (def-project-mode! +web-jekyll-mode :modes (web-mode js-mode coffee-mode css-mode haml-mode pug-mode) diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index 3796e2a22..5ddcbaae5 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -9,7 +9,6 @@ ;; ;; Library -;; (defun +ein--collect-ein-buffer-links () (let ((end (window-end)) diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index 97126600d..e9b2f0412 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -5,8 +5,7 @@ ;; -;; Plugins -;; +;; Packages (after! ein (setq ein:notebook-modes diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 3c4c12ea5..72df14f4f 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -47,7 +47,6 @@ ;; ;; Commands -;; ;;;###autoload (defun +magit/quit (&optional _kill-buffer) @@ -102,7 +101,6 @@ format." ;; ;; Advice -;; ;;;###autoload (defun +magit*hub-settings--format-magithub.enabled () diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index fe0d4d1e4..383a88997 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -12,8 +12,7 @@ available.") ;; -;; Plugins -;; +;; Packages (def-package! magit :commands magit-file-delete diff --git a/modules/tools/password-store/autoload.el b/modules/tools/password-store/autoload.el index 856b984ce..a464569e9 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -30,7 +30,6 @@ ;; ;; API -;; ;;;###autoload (autoload 'auth-source-pass-parse-entry "auth-source-pass") ;;;###autoload @@ -62,7 +61,6 @@ search of your username. May prompt for your gpg passphrase." ;; ;; Commands -;; ;;;###autoload (autoload 'password-store-dir "password-store") ;;;###autoload (autoload 'password-store-list "password-store") @@ -112,7 +110,6 @@ fields in `+pass-url-fields' is used to find the url field." ;; ;; Ivy interface -;; ;;;###autoload (defun +pass/ivy (arg) @@ -136,7 +133,6 @@ fields in `+pass-url-fields' is used to find the url field." ;; ;; TODO Helm interface -;; ;; (defun +pass/helm () ;; (interactive) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index bf982a1d2..3ccfa5b5b 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -8,8 +8,7 @@ ;; -;; Plugins -;; +;; Packages ;; `password-store' (setq password-store-password-length 12) diff --git a/modules/tools/tmux/autoload/tmux.el b/modules/tools/tmux/autoload/tmux.el index c3173845c..63f51156e 100644 --- a/modules/tools/tmux/autoload/tmux.el +++ b/modules/tools/tmux/autoload/tmux.el @@ -13,7 +13,6 @@ ;; ;; Commands -;; ;;;###autoload (defun +tmux (command &rest args) @@ -87,7 +86,6 @@ but do not execute them." ;; ;; Data functions -;; ;;;###autoload (defun +tmux-list-sessions () diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 31e1da990..65700c31c 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -99,7 +99,6 @@ PLIST can have the following properties: ;; ;; Bootstrap -;; (setq doom-fallback-buffer-name +doom-dashboard-name initial-buffer-choice #'+doom-dashboard-initial-buffer) @@ -109,7 +108,6 @@ PLIST can have the following properties: ;; ;; Major mode -;; (define-derived-mode +doom-dashboard-mode special-mode (format "DOOM v%s" doom-version) @@ -168,7 +166,6 @@ PLIST can have the following properties: ;; ;; Hooks -;; (defun +doom-dashboard|reposition-point () "Trap the point in the buttons." @@ -264,7 +261,6 @@ project (which may be different across perspective)." ;; ;; Library -;; (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." @@ -338,7 +334,6 @@ controlled by `+doom-dashboard-pwd-policy'." ;; ;; Widgets -;; (defun doom-dashboard-widget-banner () (let ((point (point))) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 800b7342e..753d93afa 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -2,7 +2,6 @@ ;; ;; Modeline library -;; (defvar doom--modeline-fn-alist ()) (defvar doom--modeline-var-alist ()) @@ -89,7 +88,6 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; ;; Custom faces -;; (defgroup +doom-modeline nil "TODO" @@ -157,8 +155,7 @@ active." ;; -;; Plugins -;; +;; Packages ;; anzu and evil-anzu expose current/total state that can be displayed in the ;; mode-line. @@ -229,7 +226,6 @@ active." ;; ;; Variables -;; (defvar +doom-modeline-height 23 "How tall the mode-line should be (only respected in GUI emacs).") @@ -260,7 +256,6 @@ file-name => comint.el") ;; ;; Modeline helpers -;; (defun active () (eq (selected-window) +doom-modeline-current-window)) @@ -389,7 +384,6 @@ Example: ;; ;; buffer information -;; (def-modeline-segment! buffer-default-directory "Displays `default-directory'. This is for special buffers like the scratch @@ -479,7 +473,6 @@ directory, the file name, and its state (modified, read-only or non-existent)." ;; ;; major-mode -;; (def-modeline-segment! major-mode "The major mode, including process, environment and text-scale info." @@ -495,7 +488,6 @@ directory, the file name, and its state (modified, read-only or non-existent)." ;; ;; vcs -;; (defvar-local +doom-modeline--vcs nil) (defun +doom-modeline--update-vcs () @@ -544,7 +536,6 @@ directory, the file name, and its state (modified, read-only or non-existent)." ;; ;; flycheck -;; (defvar +doom-modeline-vspc (propertize " " 'face 'variable-pitch) @@ -589,7 +580,6 @@ icons." ;; ;; selection-info -;; (defsubst doom-column (pos) (save-excursion (goto-char pos) @@ -629,7 +619,6 @@ lines are selected, or the NxM dimensions of a block selection." ;; ;; matches (anzu, evil-substitute, iedit, macro) -;; (defun +doom-modeline--macro-recording () "Display current Emacs or evil macro being recorded." @@ -715,7 +704,6 @@ with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." ;; ;; media-info -;; (def-modeline-segment! media-info "Metadata regarding the current file, such as dimensions for images." @@ -728,7 +716,6 @@ with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." ;; ;; bar -;; (defvar +doom-modeline--bar-active nil) (defvar +doom-modeline--bar-inactive nil) @@ -759,7 +746,6 @@ Returns \"\" to not break --no-window-system." ;; ;; Mode lines -;; (def-modeline! 'main '(bar matches " " buffer-info " %l:%c %p " selection-info) @@ -784,7 +770,6 @@ Returns \"\" to not break --no-window-system." ;; ;; Hooks -;; (defun +doom-modeline|refresh-bars (&optional width height) (setq +doom-modeline--bar-active @@ -818,7 +803,6 @@ Returns \"\" to not break --no-window-system." ;; ;; Bootstrap -;; (doom-set-modeline 'main t) ; set default modeline diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index e123b2060..44c74a63c 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -19,8 +19,7 @@ ;; -;; Plugins -;; +;; Packages ;; (def-package! doom-themes diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index 705001078..fdef24869 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -12,8 +12,7 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") ;; -;; Plugins -;; +;; Packages (def-package! fill-column-indicator :hook ((text-mode prog-mode conf-mode) . turn-on-fci-mode) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index b2a06c7c7..56384e303 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -68,7 +68,6 @@ Currently available functions: ;; ;; Custom faces -;; (defgroup +modeline nil "TODO" @@ -124,8 +123,7 @@ Currently available functions: ;; -;; Plugins -;; +;; Packages (def-package! anzu :after-call isearch-mode @@ -161,7 +159,6 @@ Currently available functions: ;; ;; Hacks -;; ;; Keep `+modeline-current-window' up-to-date (defvar +modeline-current-window (frame-selected-window)) @@ -225,7 +222,6 @@ Currently available functions: ;; ;; Helpers -;; (defun +modeline--make-xpm (width height &optional color) "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." @@ -264,7 +260,6 @@ use `buffer-name'." ;; ;; Buffer file path styles -;; (defun +modeline-file-path-with-project () "Returns the unaltered buffer file path relative to the project root's @@ -356,7 +351,6 @@ Meant for `+modeline-buffer-path-function'." ;; ;; Bars -;; (defvar +modeline-bar-start nil "TODO") (put '+modeline-bar-start 'risky-local-variable t) @@ -394,7 +388,6 @@ Meant for `+modeline-buffer-path-function'." ;; ;; Segments -;; (defun +modeline|update-on-change () (+modeline--set-+modeline-buffer-state) @@ -666,7 +659,6 @@ icons." ;; ;; Preset modeline formats -;; (def-modeline-format! :main '(+modeline-matches " " @@ -696,9 +688,6 @@ icons." ;; -;; -;; - (def-modeline-segment! +modeline--rest (let ((rhs-str (format-mode-line +modeline-format-right))) (list (propertize diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 6d5f9b334..f30d81e96 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -24,7 +24,6 @@ ;; ;; Core functions -;; ;; Don't try to resize popup windows (advice-add #'balance-windows :around #'+popup*save) @@ -32,7 +31,6 @@ ;; ;; External functions -;; ;; `company' (progn diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index eb856a004..dc2a036eb 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -129,7 +129,6 @@ and enables `+popup-buffer-mode'." ;; ;; Public library -;; ;;;###autoload (defun +popup-buffer-p (&optional buffer) @@ -211,7 +210,6 @@ Uses `shrink-window-if-larger-than-buffer'." ;; ;; Hooks -;; ;;;###autoload (defun +popup|adjust-fringes () @@ -291,7 +289,6 @@ Any non-nil value besides the above will be used as the raw value for ;; ;; Commands -;; ;;;###autoload (defalias 'other-popup #'+popup/other) @@ -397,7 +394,6 @@ the message buffer in a popup window." ;; ;; Advice -;; ;;;###autoload (defun +popup*close (&rest _) @@ -555,7 +551,6 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set ;; ;; Emacs backwards compatibility -;; (unless EMACS26+ (defvar window-sides-reversed nil) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index e700e5445..ed685f686 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -199,7 +199,6 @@ Example: ;; ;; Obsolete settings -;; ;; FIXME obsolete :popup ;;;###autoload diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index acb13bbe9..04fa0bd1c 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -35,7 +35,6 @@ adjustment.") ;; ;; Global modes -;; (defvar +popup-mode-map (make-sparse-keymap) "Active keymap in a session with the popup system enabled. See @@ -95,7 +94,6 @@ that window has been changed or closed." ;; ;; Macros -;; (defmacro with-popup-rules! (rules &rest body) "Evaluate BODY with popup RULES. RULES is a list of popup rules. Each rule @@ -128,7 +126,6 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; ;; Default popup rules & bootstrap -;; (set-popup-rules! (when (featurep! +all) @@ -175,6 +172,5 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; ;; Hacks -;; (load! "+hacks") diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index df77e025d..3a4ad4caa 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -17,8 +17,7 @@ to the right fringe.") ;; -;; Plugins -;; +;; Packages (def-package! git-gutter-fringe :commands (git-gutter:revert-hunk git-gutter:stage-hunk) From be29623f0d6ce631a110263dfa37f1b76e2a5b16 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 19:38:16 -0400 Subject: [PATCH 3045/4235] Reorganize doom core-lib & reformat autoload/ui.el + Move doom-files-in to autoload/files.el + Move doom*shut-up to autoload/ui.el + Reorganize autoload/ui.el --- core/autoload/editor.el | 3 +- core/autoload/files.el | 106 +++++++++++++++++++++++++++++++----- core/autoload/ui.el | 117 ++++++++++++++++++++++++---------------- core/core-lib.el | 86 ++--------------------------- 4 files changed, 168 insertions(+), 144 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 572e35c6f..fd2deb91a 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -279,8 +279,7 @@ Respects `require-final-newline'." executed from a commented line; handling special cases for certain languages with weak native support." (interactive) - (cond ((sp-point-in-string) - (newline)) + (cond ((sp-point-in-string) (newline)) ((and (sp-point-in-comment) comment-line-break-function) (funcall comment-line-break-function)) diff --git a/core/autoload/files.el b/core/autoload/files.el index a1066b0f6..c85d67e59 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -1,24 +1,86 @@ ;;; core/autoload/files.el -*- lexical-binding: t; -*- -;;;###autoload -(defun doom/sudo-find-file (file) - "Open FILE as root." - (interactive - (list (read-file-name "Open as root: "))) - (when (file-writable-p file) - (user-error "File is user writeable, aborting sudo")) - (find-file (if (file-remote-p file) - (concat "/" (file-remote-p file 'method) ":" (file-remote-p file 'user) "@" (file-remote-p file 'host) "|sudo:root@" (file-remote-p file 'host) ":" (file-remote-p file 'localname)) - (concat "/sudo:root@localhost:" file)))) +;; +;; Public library ;;;###autoload -(defun doom/sudo-this-file () - "Open the current file as root." - (interactive) - (doom/sudo-find-file (file-truename buffer-file-name))) +(cl-defun doom-files-in + (path-or-paths &rest rest + &key + filter + map + full + nosort + (follow-symlinks t) + (type 'files) + (relative-to (unless full default-directory)) + (depth 99999) + (mindepth 0) + (match "/[^.]")) + "Returns a list of files/directories in PATH-OR-PATHS (one string path or a +list of them). + +FILTER is a function or symbol that takes one argument (the path). If it returns +non-nil, the entry will be excluded. + +MAP is a function or symbol which will be used to transform each entry in the +results. + +TYPE determines what kind of path will be included in the results. This can be t +(files and folders), 'files or 'dirs. + +By default, this function returns paths relative to PATH-OR-PATHS if it is a +single path. If it a list of paths, this function returns absolute paths. +Otherwise, by setting RELATIVE-TO to a path, the results will be transformed to +be relative to it. + +The search recurses up to DEPTH and no further. DEPTH is an integer. + +MATCH is a string regexp. Only entries that match it will be included." + (cond + ((listp path-or-paths) + (cl-loop for path in path-or-paths + if (file-directory-p path) + nconc (apply #'doom-files-in path (plist-put rest :relative-to relative-to)))) + ((let ((path path-or-paths) + result) + (when (file-directory-p path) + (dolist (file (directory-files path nil "." nosort)) + (unless (member file '("." "..")) + (let ((fullpath (expand-file-name file path))) + (cond ((file-directory-p fullpath) + (when (and (memq type '(t dirs)) + (string-match-p match fullpath) + (not (and filter (funcall filter fullpath))) + (not (and (file-symlink-p fullpath) + (not follow-symlinks))) + (<= mindepth 0)) + (setq result + (nconc result + (list (cond (map (funcall map fullpath)) + (relative-to (file-relative-name fullpath relative-to)) + (fullpath)))))) + (unless (< depth 1) + (setq result + (nconc result (apply #'doom-files-in fullpath + (append `(:mindepth ,(1- mindepth) + :depth ,(1- depth) + :relative-to ,relative-to) + rest)))))) + ((and (memq type '(t files)) + (string-match-p match fullpath) + (not (and filter (funcall filter fullpath))) + (<= mindepth 0)) + (push (if relative-to + (file-relative-name fullpath relative-to) + fullpath) + result)))))) + result))))) ;; +;; Helpers + (defun doom--forget-file (old-path &optional new-path) "Ensure `recentf', `projectile' and `save-place' forget OLD-PATH." (when (bound-and-true-p recentf-mode) @@ -130,3 +192,19 @@ file if it exists, without confirmation." (`aborted (message "Aborted")) (_ t))) +;;;###autoload +(defun doom/sudo-find-file (file) + "Open FILE as root." + (interactive + (list (read-file-name "Open as root: "))) + (when (file-writable-p file) + (user-error "File is user writeable, aborting sudo")) + (find-file (if (file-remote-p file) + (concat "/" (file-remote-p file 'method) ":" (file-remote-p file 'user) "@" (file-remote-p file 'host) "|sudo:root@" (file-remote-p file 'host) ":" (file-remote-p file 'localname)) + (concat "/sudo:root@localhost:" file)))) + +;;;###autoload +(defun doom/sudo-this-file () + "Open the current file as root." + (interactive) + (doom/sudo-find-file (file-truename buffer-file-name))) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 2022842ff..8a0ebaee5 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -1,5 +1,56 @@ ;;; core/autoload/ui.el -*- lexical-binding: t; -*- +;; +;; Public library + +;;;###autoload +(defun doom-resize-window (window new-size &optional horizontal force-p) + "Resize a window to NEW-SIZE. If HORIZONTAL, do it width-wise. +If FORCE-P is omitted when `window-size-fixed' is non-nil, resizing will fail." + (with-selected-window (or window (selected-window)) + (let ((window-size-fixed (unless force-p window-size-fixed))) + (enlarge-window (- new-size (if horizontal (window-width) (window-height))) + horizontal)))) + +;;;###autoload +(defun doom-quit-p (&optional prompt) + "Prompt the user for confirmation when killing Emacs. + +Returns t if it is safe to kill this session. Does not prompt if no real buffers +are open." + (or (not (ignore-errors (doom-real-buffer-list))) + (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) + (ignore (message "Aborted")))) + + +;; +;; Advice + +;;;###autoload +(defun doom*recenter (&rest _) + "Generic advisor for recentering window (typically :after other functions)." + (recenter)) + +;;;###autoload +(defun doom*shut-up (orig-fn &rest args) + "Generic advisor for silencing noisy functions." + (quiet! (apply orig-fn args))) + + +;; +;; Hooks + +;;;###autoload +(defun doom|apply-ansi-color-to-compilation-buffer () + "Applies ansi codes to the compilation buffers. Meant for +`compilation-filter-hook'." + (with-silent-modifications + (ansi-color-apply-on-region compilation-filter-start (point)))) + + +;; +;; Commands + ;;;###autoload (defun doom/toggle-line-numbers () "Toggle line numbers. @@ -32,13 +83,23 @@ See `display-line-numbers' for what these values mean." (x (symbol-name next))))))) ;;;###autoload -(defun doom-resize-window (window new-size &optional horizontal force-p) - "Resize a window to NEW-SIZE. If HORIZONTAL, do it width-wise. -If FORCE-P is omitted when `window-size-fixed' is non-nil, resizing will fail." - (with-selected-window (or window (selected-window)) - (let ((window-size-fixed (unless force-p window-size-fixed))) - (enlarge-window (- new-size (if horizontal (window-width) (window-height))) - horizontal)))) +(defun doom/reload-theme () + "Reset the current color theme and fonts." + (interactive) + (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) + (when theme + (mapc #'disable-theme custom-enabled-themes)) + (doom|init-theme) + (doom|init-fonts))) + +;;;###autoload +(defun doom/delete-frame () + "Delete the current frame, but ask for confirmation if it isn't empty." + (interactive) + (if (cdr (frame-list)) + (when (doom-quit-p "Close frame?") + (delete-frame)) + (save-buffers-kill-emacs))) ;;;###autoload (defun doom/window-zoom () @@ -81,14 +142,9 @@ windows (unlike `doom/window-zoom') Activate again to undo." (maximize-window)) t))) -;;;###autoload -(defun doom/delete-frame () - "Delete the current frame, but ask for confirmation if it isn't empty." - (interactive) - (if (cdr (frame-list)) - (when (doom-quit-p "Close frame?") - (delete-frame)) - (save-buffers-kill-emacs))) + +;; +;; Modes ;;;###autoload (define-minor-mode doom-big-font-mode @@ -102,34 +158,3 @@ presentations." (if doom-big-font-mode (set-frame-font doom-big-font t t) (set-frame-font doom-font t t))) - -;;;###autoload -(defun doom/reload-theme () - "Reset the current color theme and fonts." - (interactive) - (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) - (when theme - (mapc #'disable-theme custom-enabled-themes)) - (doom|init-theme) - (doom|init-fonts))) - -;;;###autoload -(defun doom*recenter (&rest _) - (recenter)) - -;;;###autoload -(defun doom-quit-p (&optional prompt) - "Prompt the user for confirmation when killing Emacs. - -Returns t if it is safe to kill this session. Does not prompt if no real buffers -are open." - (or (not (ignore-errors (doom-real-buffer-list))) - (yes-or-no-p (format "››› %s" (or prompt "Quit Emacs?"))) - (ignore (message "Aborted")))) - -;;;###autoload -(defun doom|apply-ansi-color-to-compilation-buffer () - "Applies ansi codes to the compilation buffers. Meant for -`compilation-filter-hook'." - (with-silent-modifications - (ansi-color-apply-on-region compilation-filter-start (point)))) diff --git a/core/core-lib.el b/core/core-lib.el index bc154dac3..993564bb0 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -118,88 +118,6 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (cl-check-type :test keyword) (substring (symbol-name keyword) 1)) -(cl-defun doom-files-in - (path-or-paths &rest rest - &key - filter - map - full - nosort - (follow-symlinks t) - (type 'files) - (relative-to (unless full default-directory)) - (depth 99999) - (mindepth 0) - (match "/[^.]")) - "Returns a list of files/directories in PATH-OR-PATHS (one string path or a -list of them). - -FILTER is a function or symbol that takes one argument (the path). If it returns -non-nil, the entry will be excluded. - -MAP is a function or symbol which will be used to transform each entry in the -results. - -TYPE determines what kind of path will be included in the results. This can be t -(files and folders), 'files or 'dirs. - -By default, this function returns paths relative to PATH-OR-PATHS if it is a -single path. If it a list of paths, this function returns absolute paths. -Otherwise, by setting RELATIVE-TO to a path, the results will be transformed to -be relative to it. - -The search recurses up to DEPTH and no further. DEPTH is an integer. - -MATCH is a string regexp. Only entries that match it will be included." - (cond - ((listp path-or-paths) - (cl-loop for path in path-or-paths - if (file-directory-p path) - nconc (apply #'doom-files-in path (plist-put rest :relative-to relative-to)))) - ((let ((path path-or-paths) - result) - (when (file-directory-p path) - (dolist (file (directory-files path nil "." nosort)) - (unless (member file '("." "..")) - (let ((fullpath (expand-file-name file path))) - (cond ((file-directory-p fullpath) - (when (and (memq type '(t dirs)) - (string-match-p match fullpath) - (not (and filter (funcall filter fullpath))) - (not (and (file-symlink-p fullpath) - (not follow-symlinks))) - (<= mindepth 0)) - (setq result - (nconc result - (list (cond (map (funcall map fullpath)) - (relative-to (file-relative-name fullpath relative-to)) - (fullpath)))))) - (unless (< depth 1) - (setq result - (nconc result (apply #'doom-files-in fullpath - (append `(:mindepth ,(1- mindepth) - :depth ,(1- depth) - :relative-to ,relative-to) - rest)))))) - ((and (memq type '(t files)) - (string-match-p match fullpath) - (not (and filter (funcall filter fullpath))) - (<= mindepth 0)) - (push (if relative-to - (file-relative-name fullpath relative-to) - fullpath) - result)))))) - result))))) - -(defun doom*shut-up (orig-fn &rest args) - "Generic advisor for silencing noisy functions." - (quiet! (apply orig-fn args))) - - -;; -;; Macros -;; - (defun FILE! () "Return the emacs lisp file this macro is called from." (cond ((bound-and-true-p byte-compile-current-file)) @@ -212,6 +130,10 @@ MATCH is a string regexp. Only entries that match it will be included." (let ((file (FILE!))) (and file (file-name-directory file)))) + +;; +;; Macros + (defmacro λ! (&rest body) "A shortcut for inline interactive lambdas." (declare (doc-string 1)) From 49e6e68a07909a2f30aaa761a119cb6d2bd869f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 20:08:06 -0400 Subject: [PATCH 3046/4235] Use EMACS26+ to detect native line numbers Checking for the 'display-line-numbers symbol property is clumsy and checking for boundp is pointless now that we have a Emacs 25 polyfill for display-line-numbers-mode. --- core/autoload/line-numbers.el | 4 +--- core/autoload/ui.el | 37 +++++++++++++++++------------------ core/core-ui.el | 27 ++++++++++++------------- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index 1fa32d7a6..6ea35584d 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -1,5 +1,5 @@ ;;; core/autoload/line-numbers.el -*- lexical-binding: t; -*- -;;;###if (not (locate-library "display-line-numbers")) +;;;###if (not EMACS26+) ;; This was lifted out of the display-line-numbers library in Emacs 26.1 and ;; modified to use nlinum for Emacs 25.x users. It should be removed should @@ -26,8 +26,6 @@ relative number of a line. Lisp programs can disable display of a line number of a particular buffer line by putting the display-line-numbers-disable text property or overlay property on the first visible character of that line.") -;;;###autoload -(put 'display-line-numbers 'nlinum t) ;;;###autoload (defcustom display-line-numbers-type t diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 8a0ebaee5..8866cf76e 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -62,25 +62,24 @@ visual-line-mode is on, this skips relative and uses visual instead. See `display-line-numbers' for what these values mean." (interactive) (defvar doom--line-number-style display-line-numbers-type) - (let ((nlinum-p (get 'display-line-numbers 'nlinum))) - (let* ((styles `(t ,(if (and (not nlinum-p) visual-line-mode) 'visual 'relative) nil)) - (order (cons display-line-numbers-type (remq display-line-numbers-type styles))) - (queue (memq doom--line-number-style order)) - (next (if (= (length queue) 1) - (car order) - (car (cdr queue))))) - (setq doom--line-number-style next) - (if (get 'display-line-numbers 'nlinum) - (pcase next - (`t (nlinum-relative-off) (nlinum-mode +1)) - (`relative (nlinum-relative-on)) - (`nil (nlinum-mode -1))) - (setq display-line-numbers next)) - (message "Switched to %s line numbers" - (pcase next - (`t "normal") - (`nil "disabled") - (x (symbol-name next))))))) + (let* ((styles `(t ,(if (and EMACS26+ visual-line-mode) 'visual 'relative) nil)) + (order (cons display-line-numbers-type (remq display-line-numbers-type styles))) + (queue (memq doom--line-number-style order)) + (next (if (= (length queue) 1) + (car order) + (car (cdr queue))))) + (setq doom--line-number-style next) + (if EMACS26+ + (setq display-line-numbers next) + (pcase next + (`t (nlinum-relative-off) (nlinum-mode +1)) + (`relative (nlinum-relative-on)) + (`nil (nlinum-mode -1)))) + (message "Switched to %s line numbers" + (pcase next + (`t "normal") + (`nil "disabled") + (_ (symbol-name next)))))) ;;;###autoload (defun doom/reload-theme () diff --git a/core/core-ui.el b/core/core-ui.el index a53c12e08..b9972e780 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -121,8 +121,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (setq 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)) + (+ (if EMACS26+ 6 0) fill-column)) (defun doom*hide-undefined-which-key-binds (bindings) (cl-loop for bind in bindings @@ -242,18 +241,20 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; ;; Line numbers -;; + +;; line numbers in most modes +(add-hook! (prog-mode text-mode conf-mode) #'display-line-numbers-mode) ;; Emacs 26+ has native line number support, and will ignore nlinum. This is for ;; Emacs 25 users: (defun doom|enable-line-numbers () (display-line-numbers-mode +1)) (defun doom|disable-line-numbers () (display-line-numbers-mode -1)) -;; Line number column. A faster (or equivalent, in the worst case) line number -;; plugin than `linum-mode'. (def-package! nlinum - :when (get 'display-line-numbers 'nlinum) - :commands nlinum-mode + ;; Line number column. A faster (or equivalent, in the worst case) line number + ;; plugin than `linum-mode'. + :unless EMACS26+ + :defer t :init (defvar doom-line-number-lpad 4 "How much padding to place before line numbers.") @@ -298,9 +299,9 @@ character that looks like a space that `whitespace-mode' won't affect.") (format-mode-line "%l"))))) (add-hook 'nlinum-mode-hook #'doom|init-nlinum-width)) -;; Fixes disappearing line numbers in nlinum and other quirks (def-package! nlinum-hl - :when (get 'display-line-numbers 'nlinum) + ;; Fixes disappearing line numbers in nlinum and other quirks + :unless EMACS26+ :after nlinum :config ;; With `markdown-fontify-code-blocks-natively' enabled in `markdown-mode', @@ -315,8 +316,8 @@ character that looks like a space that `whitespace-mode' won't affect.") (advice-add #'set-frame-font :after #'nlinum-hl-flush-all-windows)) (def-package! nlinum-relative - :when (get 'display-line-numbers 'nlinum) - :commands (nlinum-relative-mode nlinum-relative-on nlinum-relative-off) + :unless EMACS26+ + :defer t :config (setq nlinum-format " %d ") (add-hook 'evil-mode #'nlinum-relative-setup-evil)) @@ -399,10 +400,6 @@ frame's window-system, the theme will be reloaded.") ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) - -;; line numbers in most modes -(add-hook! (prog-mode text-mode conf-mode) #'display-line-numbers-mode) - ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. (add-to-list 'default-frame-alist (cons 'buffer-predicate #'doom-buffer-frame-predicate)) From 57579b883bc0c76c258e3df38a586c6c223cbf47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 21:43:32 -0400 Subject: [PATCH 3047/4235] Refactor doom core files --- core/core-editor.el | 34 +++++++++++++++-------------- core/core-keybinds.el | 7 +++++- core/core-modules.el | 4 ++-- core/core-projects.el | 8 +++---- core/core-ui.el | 51 ++++++++++++++++++++----------------------- core/core.el | 48 +++++++++++++++++++--------------------- init.el | 18 +++++++-------- 7 files changed, 86 insertions(+), 84 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 1ba77ff3a..bba32d48a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -78,15 +78,15 @@ fundamental-mode) for performance sake." (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. -;; revert buffers for changed files (def-package! autorevert + ;; revert buffers for changed files :after-call after-find-file :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) -;; persist variables across sessions (def-package! savehist + ;; persist variables across sessions :defer 1 :after-call post-command-hook :config @@ -105,8 +105,8 @@ savehist file." else if item collect it))) (add-hook 'kill-emacs-hook #'doom|unpropertize-kill-ring)) -;; persistent point location in buffers (def-package! saveplace + ;; persistent point location in buffers :after-call (after-find-file dired-initial-position-hook) :config (setq save-place-file (concat doom-cache-dir "saveplace")) @@ -117,8 +117,8 @@ savehist file." :after-while #'doom*recenter-on-load-saveplace) (save-place-mode +1)) -;; Keep track of recently opened files (def-package! recentf + ;; Keep track of recently opened files :defer 1 :after-call after-find-file :commands recentf-open-files @@ -152,9 +152,9 @@ savehist file." ;; ;; Packages -;; Auto-close delimiters and blocks as you type. It's more powerful than that, -;; but that is all Doom uses it for. (def-package! smartparens + ;; Auto-close delimiters and blocks as you type. It's more powerful than that, + ;; but that is all Doom uses it for. :after-call (doom-exit-buffer-hook after-find-file) :commands (sp-pair sp-local-pair sp-with-modes) :config @@ -192,8 +192,9 @@ savehist file." (smartparens-global-mode +1)) -;; Automatic detection of indent settings + (def-package! dtrt-indent + ;; Automatic detection of indent settings :unless noninteractive :defer t :init @@ -207,8 +208,10 @@ savehist file." #'doom|detect-indentation) :config (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) - (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width)) - + ;; always keep tab-width up-to-date + (push '(t tab-width) dtrt-indent-hook-generic-mapping-list) + + (defvar dtrt-indent-run-after-smie) (defun doom*fix-broken-smie-modes (orig-fn arg) "Some smie modes throw errors when trying to guess their indentation, like `nim-mode'. This prevents them from leaving Emacs in a broken state." @@ -224,8 +227,9 @@ savehist file." (funcall orig-fn arg)))) (advice-add #'dtrt-indent-mode :around #'doom*fix-broken-smie-modes)) -;; Branching undo + (def-package! undo-tree + ;; Branching & persistent undo :after-call (doom-exit-buffer-hook after-find-file) :config (setq undo-tree-auto-save-history t @@ -264,16 +268,12 @@ savehist file." (advice-add #'undo-tree-save-history :around #'doom*compress-undo-tree-history)) -;; -;; Autoloaded Plugins -;; - ;; `command-log-mode' (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode t command-log-mode-is-global t) -;; `expand-region' + (def-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) :config @@ -284,6 +284,7 @@ savehist file." (advice-add #'evil-escape :before #'doom*quit-expand-region) (advice-add #'doom/escape :before #'doom*quit-expand-region)) + ;; `helpful' --- a better *help* buffer (define-key! 'global [remap describe-function] #'helpful-callable @@ -291,8 +292,9 @@ savehist file." [remap describe-variable] #'helpful-variable [remap describe-key] #'helpful-key) -;; `ws-butler' --- a better `delete-trailing-whitespaces' + (def-package! ws-butler + ;; a less intrusive `delete-trailing-whitespaces' on save :after-call (after-find-file) :config (setq ws-butler-global-exempt-modes diff --git a/core/core-keybinds.el b/core/core-keybinds.el index eff1ab08e..e63c780f0 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -56,10 +56,15 @@ If any hook returns non-nil, all hooks after it are ignored.") which-key-min-display-lines 6 which-key-side-window-slot -10) :config - ;; embolden local bindings + ;; general improvements to which-key readability (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) (setq-hook! 'which-key-init-buffer-hook line-spacing 3) + (defun doom*no-fringes-in-which-key-buffer (&rest _) + (doom|no-fringes-in-minibuffer) + (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) + (advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) + (which-key-mode +1)) diff --git a/core/core-modules.el b/core/core-modules.el index f2813bf3a..e5cde27e1 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -304,8 +304,8 @@ to least)." (defmacro def-package! (name &rest plist) "This is a thin wrapper around `use-package'." `(use-package ,name - ,@(append (if (memq name doom-disabled-packages) `(:disabled t)) - plist))) + ,@(if (memq name doom-disabled-packages) `(:disabled t)) + ,@plist)) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. diff --git a/core/core-projects.el b/core/core-projects.el index d24811088..8ecf1bccd 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -47,18 +47,18 @@ ;; Projectile root-searching functions can cause an infinite loop on TRAMP ;; connections, so disable them. - (defun doom*projectile-locate-dominating-file (orig-fn &rest args) + (defun doom*projectile-locate-dominating-file (orig-fn file name) "Don't traverse the file system if on a remote connection." (unless (file-remote-p default-directory) - (apply orig-fn args))) + (funcall orig-fn file name))) (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file) - (defun doom*projectile-cache-current-file (orig-fun &rest args) + (defun doom*projectile-cache-current-file (orig-fn) "Don't cache ignored files." (unless (cl-loop for path in (projectile-ignored-directories) if (string-prefix-p (or buffer-file-name "") (expand-file-name path)) return t) - (apply orig-fun args))) + (funcall orig-fn))) (advice-add #'projectile-cache-current-file :around #'doom*projectile-cache-current-file)) diff --git a/core/core-ui.el b/core/core-ui.el index b9972e780..72a9ca02e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -71,7 +71,11 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") window-resize-pixelwise t frame-resize-pixelwise t) -(fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no +;; y/n instead of yes/no +(fset #'yes-or-no-p #'y-or-n-p) + +;; Truly silence startup message +(fset #'display-startup-echo-area-message #'ignore) ;; @@ -100,7 +104,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'completion-list-mode-hook #'hide-mode-line-mode) (add-hook 'Man-mode-hook #'hide-mode-line-mode) -;; `highlight-numbers' -- better number literal fontification in code +;; `highlight-numbers' --- better number literal fontification in code (def-package! highlight-numbers :hook (prog-mode . highlight-numbers-mode) :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) @@ -113,10 +117,11 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; Especially in parentheses-drunk languages like Lisp. (setq rainbow-delimiters-max-face-count 3) -;; `restart-emacs' +;; `restart-emacs' --- provides a simple mechanism for restarting Emacs and +;; daemons interactively. (setq restart-emacs--args (list "--restore")) -;; `visual-fill-column' For a distractions-free-like UI, that dynamically +;; `visual-fill-column' --- for a distractions-free-like UI, that dynamically ;; resizes margins and can center a buffer. (setq visual-fill-column-center-text t visual-fill-column-width @@ -143,8 +148,9 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) (add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) -;; Highlights the current line + (def-package! hl-line ; built-in + ;; Highlights the current line :hook ((prog-mode text-mode conf-mode) . hl-line-mode) :config ;; I don't need hl-line showing in other windows. This also offers a small @@ -180,14 +186,16 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'evil-visual-state-entry-hook #'doom|disable-hl-line) (add-hook 'evil-visual-state-exit-hook #'doom|enable-hl-line-maybe))) -;; undo/redo changes to Emacs' window layout + (def-package! winner + ;; undo/redo changes to Emacs' window layout :after-call doom-exit-window-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) -;; highlight matching delimiters + (def-package! paren + ;; highlight matching delimiters :after-call (after-find-file doom-exit-buffer-hook) :init (defun doom|disable-show-paren-mode () @@ -199,6 +207,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") show-paren-when-point-inside-paren t) (show-paren-mode +1)) + ;; The native border "consumes" a pixel of the fringe on righter-most splits, ;; `window-divider' does not. Available since Emacs 25.1. (setq-default window-divider-default-places t @@ -206,12 +215,8 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") window-divider-default-right-width 1) (add-hook 'doom-init-ui-hook #'window-divider-mode) -;; remove prompt if the file is opened in other clients -(defun server-remove-kill-buffer-hook () - (remove-hook 'kill-buffer-query-functions #'server-kill-buffer-query-function)) -(add-hook 'server-visit-hook #'server-remove-kill-buffer-hook) -;; `whitespace-mode' (built-in) +;; `whitespace-mode' (setq whitespace-line-column nil whitespace-style '(face indentation tabs tab-mark spaces space-mark newline newline-mark @@ -384,7 +389,8 @@ frame's window-system, the theme will be reloaded.") ;; fonts (add-hook 'doom-init-ui-hook #'doom|init-fonts) ;; themes -(add-hook 'doom-init-ui-hook #'doom|init-theme) +(unless (daemonp) + (add-hook 'doom-init-ui-hook #'doom|init-theme)) (add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) (add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) @@ -394,20 +400,16 @@ frame's window-system, the theme will be reloaded.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) - -;; draw me like one of your French editors -(tooltip-mode -1) ; relegate tooltips to echo area only - +;; relegate tooltips to echo area only +(tooltip-mode -1) ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. -(add-to-list 'default-frame-alist (cons 'buffer-predicate #'doom-buffer-frame-predicate)) - +(add-to-list 'default-frame-alist '(buffer-predicate . doom-buffer-frame-predicate)) ;; Prevent the glimpse of un-styled Emacs by setting these early. (add-to-list 'default-frame-alist '(tool-bar-lines 0)) (add-to-list 'default-frame-alist '(menu-bar-lines 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars)) - ;; prompts the user for confirmation when deleting a non-empty frame (global-set-key [remap delete-frame] #'doom/delete-frame) @@ -442,13 +444,13 @@ instead). Meant for `kill-buffer-query-functions'." (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) (add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) - ;; (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) + (add-hook 'emacs-startup-hook #'doom|init-ui) -;; Fixes/hacks ;; +;; Fixes/hacks ;; doesn't exist in terminal Emacs; we define it to prevent errors (unless (fboundp 'define-fringe-bitmap) @@ -481,11 +483,6 @@ instead). Meant for `kill-buffer-query-functions'." (advice-add #'delete-backward-char :around #'doom*silence-motion-errors) (advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) -(defun doom*no-fringes-in-which-key-buffer (&rest _) - (doom|no-fringes-in-minibuffer) - (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) -(advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) - ;; Switch to `doom-fallback-buffer' if on last real buffer (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) diff --git a/core/core.el b/core/core.el index c8aa7ae11..91531e739 100644 --- a/core/core.el +++ b/core/core.el @@ -16,10 +16,8 @@ line or use --debug-init to enable this.") (defconst doom-version "2.0.9" "Current version of DOOM emacs.") -(defconst EMACS26+ - (eval-when-compile (not (version< emacs-version "26")))) -(defconst EMACS27+ - (eval-when-compile (not (version< emacs-version "27")))) +(defconst EMACS26+ (> emacs-major-version 25)) +(defconst EMACS27+ (> emacs-major-version 26)) (defconst IS-MAC (eq system-type 'darwin)) (defconst IS-LINUX (eq system-type 'gnu/linux)) @@ -27,15 +25,14 @@ line or use --debug-init to enable this.") ;; -(defvar doom-emacs-dir - (eval-when-compile (file-truename user-emacs-directory)) +(defvar doom-emacs-dir user-emacs-directory "The path to this emacs.d directory. Must end in a slash.") (defvar doom-core-dir (concat doom-emacs-dir "core/") - "Where essential files are stored.") + "The root directory of core Doom files.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") - "The main directory where Doom modules are stored.") + "The root directory for Doom's modules.") (defvar doom-local-dir (concat doom-emacs-dir ".local/") "Root directory for local Emacs files. Use this as permanent storage for files @@ -125,19 +122,21 @@ module init.el files, but before their config.el files are loaded.") else (except for `window-setup-hook').") (defvar doom-reload-hook nil - "A list of hooks to run when `doom//reload-load-path' is called.") + "A list of hooks to run when `doom/reload' is called.") (defvar doom-load-theme-hook nil - "Hook run when the theme (and font) is initialized (or reloaded -with `doom/reload-theme').") + "Hook run after the theme is loaded with `load-theme' or reloaded with +`doom/reload-theme'.") (defvar doom-exit-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. See -`doom-enter-window-hook'.") + "Hook run before `switch-window' or `switch-frame' are called. + +Also see `doom-enter-window-hook'.") (defvar doom-enter-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. See -`doom-exit-window-hook'.") + "Hook run after `switch-window' or `switch-frame' are called. + +Also see `doom-exit-window-hook'.") (defvar doom-exit-buffer-hook nil "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are @@ -152,9 +151,11 @@ called. The buffer to be switched to is current when these hooks run. Also see `doom-exit-buffer-hook'.") (defvar doom-inhibit-switch-buffer-hooks nil - "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'.") + "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'. +Do not set this directly.") (defvar doom-inhibit-switch-window-hooks nil - "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'.") + "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'. +Do not set this directly.") (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks @@ -290,9 +291,6 @@ original value of `symbol-file'." (funcall orig-fn symbol type))) (advice-add #'symbol-file :around #'doom*symbol-file) -;; Truly silence startup message -(fset #'display-startup-echo-area-message #'ignore) - ;; Don't garbage collect to speed up minibuffer commands (defun doom|defer-garbage-collection () (setq gc-cons-threshold doom-gc-cons-upper-limit)) @@ -306,13 +304,13 @@ original value of `symbol-file'." ;; Bootstrap helpers (defun doom-try-run-hook (hook) - "Run HOOK (a hook function), but marks thrown errors to make it a little -easier to tell where the came from. + "Run HOOK (a hook function), but handle errors better, to make debugging +issues easier. Meant to be used with `run-hook-wrapped'." - (when doom-debug-mode - (message "Running doom hook: %s" hook)) (let ((gc-cons-threshold doom-gc-cons-upper-limit)) + (when doom-debug-mode + (message "Running doom hook: %s" hook)) (condition-case e (funcall hook) ((debug error) @@ -400,9 +398,9 @@ The overall load order of Doom is as follows: `doom-init-hook' Module config.el files ~/.doom.d/config.el + `doom-post-init-hook' `after-init-hook' `emacs-startup-hook' - `doom-post-init-hook' (at end of `emacs-startup-hook') Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most diff --git a/init.el b/init.el index 6db64b2ae..95567e45a 100644 --- a/init.el +++ b/init.el @@ -41,17 +41,17 @@ decrease this. If you experience stuttering, increase this.") "Resets garbage collection settings to reasonable defaults (a large `gc-cons-threshold' can cause random freezes otherwise) and resets `file-name-handler-alist'." - (setq-default file-name-handler-alist doom--file-name-handler-alist) - ;; Do it on an idle timer to defer the possible GC pause, and to give deferred - ;; packages the opportunity to take advantage of these optimizations. + (setq file-name-handler-alist doom--file-name-handler-alist) + ;; Do this on idle timer to defer a possible GC pause that could result; also + ;; allows deferred packages to take advantage of these optimizations. (run-with-idle-timer 3 nil (lambda () (setq-default gc-cons-threshold doom-gc-cons-threshold)))) (if (or after-init-time noninteractive) (setq gc-cons-threshold doom-gc-cons-threshold) - ;; A big contributor to long startup times is the garbage collector, so we up - ;; its memory threshold, temporarily and reset it later in + ;; A big contributor to startup times is garbage collection. We up the gc + ;; threshold to temporarily prevent it from running, then reset it later in ;; `doom|disable-startup-optimizations'. (setq gc-cons-threshold doom-gc-cons-upper-limit) ;; This is consulted on every `require', `load' and various file reading @@ -61,11 +61,11 @@ decrease this. If you experience stuttering, increase this.") (add-hook 'emacs-startup-hook #'doom|restore-startup-optimizations)) -;; Ensure Doom is always running out of this file's directory +;; Ensure Doom is running out of this file's directory (setq user-emacs-directory (file-name-directory load-file-name)) -;; In noninteractive sessions, we hope that non-byte-compiled files will take -;; precedence over byte-compiled ones, however, if you're getting odd recursive -;; load errors, it may help to set this to nil. +;; In noninteractive sessions, prioritize non-byte-compiled source files to +;; prevent stale, byte-compiled code from running. However, if you're getting +;; recursive load errors, it may help to set this to nil. (setq load-prefer-newer noninteractive) From 77d2d84e1477b3a9fe83ceef9de86192a09485ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 21:49:49 -0400 Subject: [PATCH 3048/4235] Refactor core-cli Moved to separate files for better organization. --- core/autoload/debug.el | 1 - core/autoload/packages.el | 152 ------ core/cli/autoloads.el | 361 ++++++++++++ core/cli/byte-compile.el | 176 ++++++ core/cli/debug.el | 7 + core/cli/packages.el | 167 ++++++ core/cli/patch-macos.el | 85 +++ core/cli/quickstart.el | 59 ++ core/{core-tests.el => cli/test.el} | 18 +- core/cli/upgrade.el | 76 +++ core/core-cli.el | 819 +--------------------------- 11 files changed, 966 insertions(+), 955 deletions(-) create mode 100644 core/cli/autoloads.el create mode 100644 core/cli/byte-compile.el create mode 100644 core/cli/debug.el create mode 100644 core/cli/packages.el create mode 100644 core/cli/patch-macos.el create mode 100644 core/cli/quickstart.el rename core/{core-tests.el => cli/test.el} (88%) create mode 100644 core/cli/upgrade.el diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 675201a4c..cfe956e55 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -76,7 +76,6 @@ ready to be pasted in a bug report on github." (defun doom/info () "Collects some debug information about your Emacs session, formats it into markdown and copies it to your clipboard, ready to be pasted into bug reports!" - (declare (interactive-only t)) (interactive) (message "Generating Doom info...") (if noninteractive diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 2c4b47e6d..036a114a6 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -446,160 +446,8 @@ calls." (doom--delete-package-files name))))) -;; -;; Package Management -;; - -;;;###autoload -(defun doom-packages-install (&optional auto-accept-p) - "Interactive command for installing missing packages." - (print! "Looking for packages to install...") - (let ((packages (reverse (doom-get-missing-packages)))) - (cond ((not packages) - (print! (green "No packages to install!")) - nil) - - ((not (or auto-accept-p - (y-or-n-p - (format "%s packages will be installed:\n\n%s\n\nProceed?" - (length packages) - (mapconcat - (lambda (pkg) - (format "+ %s (%s)" - (car pkg) - (cond ((doom-package-different-recipe-p (car pkg)) - "new recipe") - ((doom-package-different-backend-p (car pkg)) - (if (plist-get (cdr pkg) :recipe) - "ELPA->QUELPA" - "QUELPA->ELPA")) - ((plist-get (cdr pkg) :recipe) - "QUELPA") - ("ELPA")))) - (cl-sort (cl-copy-list packages) #'string-lessp - :key #'car) - "\n"))))) - (user-error "Aborted!")) - - ((let (success) - (doom-refresh-packages-maybe doom-debug-mode) - (dolist (pkg packages) - (print! "Installing %s" (car pkg)) - (doom--condition-case! - (let ((result - (or (and (package-installed-p (car pkg)) - (not (doom-package-different-backend-p (car pkg))) - (not (doom-package-different-recipe-p (car pkg))) - 'already-installed) - (and (doom-install-package (car pkg) (cdr pkg)) - (setq success t) - 'success) - 'failure)) - (pin-label - (and (plist-member (cdr pkg) :pin) - (format " [pinned: %s]" (plist-get (cdr pkg) :pin))))) - (print! "%s%s" - (pcase result - (`already-installed (dark (white "⚠ ALREADY INSTALLED"))) - (`success (green "✓ DONE")) - (`failure (red "✕ FAILED"))) - (or pin-label ""))))) - (print! (bold (green "Finished!"))) - (when success - (set-file-times doom-packages-dir) - (doom-delete-autoloads-file doom-package-autoload-file)) - success))))) - -;;;###autoload -(defun doom-packages-update (&optional auto-accept-p) - "Interactive command for updating packages." - (print! "Looking for outdated packages...") - (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp - :key #'car))) - (cond ((not packages) - (print! (green "Everything is up-to-date")) - nil) - - ((not (or auto-accept-p - (y-or-n-p - (format "%s packages will be updated:\n\n%s\n\nProceed?" - (length packages) - (let ((max-len - (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) - #'>)) - 10))) - (mapconcat - (lambda (pkg) - (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) - (symbol-name (car pkg)) - (package-version-join (cadr pkg)) - (package-version-join (cl-caddr pkg)))) - packages - "\n")))))) - (user-error "Aborted!")) - - ((let (success) - (dolist (pkg packages) - (print! "Updating %s" (car pkg)) - (doom--condition-case! - (print! - (let ((result (doom-update-package (car pkg) t))) - (when result (setq success t)) - (color (if result 'green 'red) - (if result "✓ DONE" "✕ FAILED")))))) - (print! (bold (green "Finished!"))) - (when success - (set-file-times doom-packages-dir) - (doom-delete-autoloads-file doom-package-autoload-file)) - success))))) - -;;;###autoload -(defun doom-packages-autoremove (&optional auto-accept-p) - "Interactive command for auto-removing orphaned packages." - (print! "Looking for orphaned packages...") - (let ((packages (doom-get-orphaned-packages))) - (cond ((not packages) - (print! (green "No unused packages to remove")) - nil) - - ((not - (or auto-accept-p - (y-or-n-p - (format "%s packages will be deleted:\n\n%s\n\nProceed?" - (length packages) - (mapconcat - (lambda (sym) - (let ((backend (doom-package-backend sym))) - (format "+ %s (%s)" sym - (if (doom-package-different-backend-p sym) - (pcase backend - (`quelpa "QUELPA->ELPA") - (`elpa "ELPA->QUELPA") - (_ "removed")) - (upcase (symbol-name backend)))))) - (sort (cl-copy-list packages) #'string-lessp) - "\n"))))) - (user-error "Aborted!")) - - ((let (success) - (dolist (pkg packages) - (doom--condition-case! - (let ((result (doom-delete-package pkg t))) - (if result (setq success t)) - (print! (color (if result 'green 'red) - "%s %s" - (if result "✓ Removed" "✕ Failed to remove") - pkg))))) - (print! (bold (green "Finished!"))) - (when success - (set-file-times doom-packages-dir) - (doom-delete-autoloads-file doom-package-autoload-file)) - success))))) - - ;; ;; Make package.el cooperate with Doom -;; ;; Updates QUELPA after deleting a package ;;;###autoload diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el new file mode 100644 index 000000000..4d427be58 --- /dev/null +++ b/core/cli/autoloads.el @@ -0,0 +1,361 @@ +;;; core/cli/autoloads.el -*- lexical-binding: t; -*- + +(dispatcher! (autoloads a) (doom-reload-autoloads nil 'force) + "Regenerates Doom's autoloads file. + +This file tells Emacs where to find your module's autoloaded functions and +plugins.") + +;; external variables +(defvar autoload-timestamps) +(defvar generated-autoload-load-name) +(defvar generated-autoload-file) + + +;; +;; Helpers + +(defvar doom-autoload-excluded-packages '(marshal gh) + "Packages that have silly or destructive autoload files that try to load +everyone in the universe and their dog, causing errors that make babies cry. No +one wants that.") + +(defun doom-delete-autoloads-file (file) + "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if +it exists." + (cl-check-type file string) + (when (file-exists-p file) + (when-let* ((buf (find-buffer-visiting doom-autoload-file))) + (with-current-buffer buf + (set-buffer-modified-p nil)) + (kill-buffer buf)) + (delete-file file) + (ignore-errors (delete-file (byte-compile-dest-file file))) + (message "Deleted old %s" (file-name-nondirectory file)))) + +(defun doom--warn-refresh-session () + (message "Detected a running Emacs session.\n") + (message "Restart Emacs or use `M-x doom/reload' for changes to take effect.")) + +(defun doom--do-load (&rest files) + (if (and noninteractive (not (daemonp))) + (progn + (require 'server) + (when (server-running-p) + (add-hook 'kill-emacs-hook #'doom--warn-refresh-session))) + (dolist (file files) + (load-file (byte-compile-dest-file file))))) + +(defun doom--byte-compile-file (file) + (let ((short-name (file-name-nondirectory file)) + (byte-compile-dynamic-docstrings t)) + (condition-case e + (when (byte-compile-file file) + ;; Give autoloads file a chance to report error + (load (if doom-debug-mode + file + (byte-compile-dest-file file)) + nil t) + (unless noninteractive + (message "Finished compiling %s" short-name))) + ((debug error) + (let ((backup-file (concat file ".bk"))) + (message "Copied backup to %s" backup-file) + (copy-file file backup-file 'overwrite)) + (doom-delete-autoloads-file file) + (signal 'doom-autoload-error (list short-name e)))))) + +(defun doom-reload-autoloads (&optional file force-p) + "Reloads FILE (an autoload file), if it needs reloading. + +FILE should be one of `doom-autoload-file' or `doom-package-autoload-file'. If +it is nil, it will try to reload both. If FORCE-P (universal argument) do it +even if it doesn't need reloading!" + (or (null file) + (stringp file) + (signal 'wrong-type-argument (list 'stringp file))) + (if (stringp file) + (cond ((file-equal-p file doom-autoload-file) + (doom-reload-doom-autoloads force-p)) + ((file-equal-p file doom-package-autoload-file) + (doom-reload-package-autoloads force-p)) + ((error "Invalid autoloads file: %s" file))) + (doom-reload-doom-autoloads force-p) + (doom-reload-package-autoloads force-p))) + + +;; +;; Doom autoloads + +(defun doom--file-cookie-p (file) + "Returns the return value of the ;;;###if predicate form in FILE." + (with-temp-buffer + (insert-file-contents-literally file nil 0 256) + (if (and (re-search-forward "^;;;###if " nil t) + (<= (line-number-at-pos) 3)) + (let ((load-file-name file)) + (eval (sexp-at-point))) + t))) + +(defun doom--generate-header (func) + (goto-char (point-min)) + (insert ";; -*- lexical-binding:t -*-\n" + ";; This file is autogenerated by `" (symbol-name func) "', DO NOT EDIT !!\n\n")) + +(defun doom--generate-autoloads (targets) + (require 'autoload) + (dolist (file targets) + (let* ((file (file-truename file)) + (generated-autoload-file doom-autoload-file) + (generated-autoload-load-name (file-name-sans-extension file)) + (noninteractive (not doom-debug-mode)) + autoload-timestamps) + (print! + (cond ((not (doom--file-cookie-p file)) + "⚠ Ignoring %s") + ((autoload-generate-file-autoloads file (current-buffer)) + (yellow "✕ Nothing in %s")) + ((green "✓ Scanned %s"))) + (if (file-in-directory-p file default-directory) + (file-relative-name file) + (abbreviate-file-name file)))))) + +(defun doom--expand-autoloads () + (let ((load-path (append doom-modules-dirs load-path)) + cache) + (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) + (let ((path (match-string 1))) + (replace-match + (or (cdr (assoc path cache)) + (when-let* ((libpath (locate-library path)) + (libpath (file-name-sans-extension libpath))) + (push (cons path (abbreviate-file-name libpath)) cache) + libpath) + path) + t t nil 1))))) + +(defun doom--generate-autodefs (targets enabled-targets) + (goto-char (point-max)) + (search-backward ";;;***" nil t) + (save-excursion (insert "\n")) + (dolist (path targets) + (insert + (with-temp-buffer + (insert-file-contents path) + (let ((member-p (or (member path enabled-targets) + (file-in-directory-p path doom-core-dir))) + forms) + (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) + (let* ((sexp (sexp-at-point)) + (pred (match-string 1)) + (type (car sexp)) + (name (doom-unquote (cadr sexp))) + (origin (cond ((doom-module-from-path path)) + ((file-in-directory-p path doom-private-dir) + `(:private . ,(intern (file-name-base path)))) + ((file-in-directory-p path doom-emacs-dir) + `(:core . ,(intern (file-name-base path)))))) + (doom-file-form + `(put ',name 'doom-file ,(abbreviate-file-name path)))) + (cond ((memq type '(defun defmacro cl-defun cl-defmacro)) + (cl-destructuring-bind (_ name arglist &rest body) sexp + (let ((docstring (if (stringp (car body)) + (pop body) + "No documentation."))) + (push (cond ((not (and member-p + (or (null pred) + (let ((load-file-name path)) + (eval (read pred) t))))) + (push doom-file-form forms) + (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" + origin docstring)) + (condition-case-unless-debug e + (append (list (pcase type + (`defun 'defmacro) + (`cl-defun `cl-defmacro) + (_ type)) + name arglist docstring) + (cl-loop for arg in arglist + if (and (symbolp arg) + (not (keywordp arg)) + (not (memq arg cl--lambda-list-keywords))) + collect arg into syms + else if (listp arg) + collect (car arg) into syms + finally return (if syms `((ignore ,@syms))))) + ('error + (message "Ignoring autodef %s (%s)" + name e) + nil))) + ((make-autoload sexp (abbreviate-file-name (file-name-sans-extension path))))) + forms) + (push `(put ',name 'doom-module ',origin) forms)))) + + ((eq type 'defalias) + (cl-destructuring-bind (type name target &optional docstring) sexp + (let ((name (doom-unquote name)) + (target (doom-unquote target))) + (unless (and member-p + (or (null pred) + (let ((load-file-name path)) + (eval (read pred) t)))) + (setq target #'ignore)) + (push doom-file-form forms) + (push `(put ',name 'doom-module ',origin) forms) + (push `(defalias ',name #',target ,docstring) + forms)))) + + ((and member-p + (or (null pred) + (eval (read pred) t))) + (push sexp forms))))) + (if forms + (concat (string-join (mapcar #'prin1-to-string (reverse forms)) "\n") + "\n") + "")))))) + +(defun doom--cleanup-autoloads () + (goto-char (point-min)) + (when (re-search-forward "^;;\\(;[^\n]*\\| no-byte-compile: t\\)\n" nil t) + (replace-match "" t t))) + +(defun doom-reload-doom-autoloads (&optional force-p) + "Refreshes the autoloads.el file, specified by `doom-autoload-file', if +necessary (or if FORCE-P is non-nil). + +It scans and reads core/autoload/*.el, modules/*/*/autoload.el and +modules/*/*/autoload/*.el, and generates `doom-autoload-file'. This file tells +Emacs where to find lazy-loaded functions. + +This should be run whenever your `doom!' block, or a module autoload file, is +modified." + (let* ((default-directory doom-emacs-dir) + (doom-modules (doom-modules)) + (targets + (file-expand-wildcards + (expand-file-name "autoload/*.el" doom-core-dir))) + (enabled-targets (copy-sequence targets)) + case-fold-search) + (dolist (path (doom-module-load-path t)) + (let* ((auto-dir (expand-file-name "autoload" path)) + (auto-file (expand-file-name "autoload.el" path)) + (module (doom-module-from-path auto-file)) + (module-p (or (doom-module-p (car module) (cdr module)) + (file-equal-p path doom-private-dir)))) + (when (file-exists-p auto-file) + (push auto-file targets) + (if module-p (push auto-file enabled-targets))) + (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) + (push file targets) + (if module-p (push file enabled-targets))))) + (if (and (not force-p) + (not doom-emacs-changed-p) + (file-exists-p doom-autoload-file) + (not (file-newer-than-file-p (expand-file-name "init.el" doom-private-dir) + doom-autoload-file)) + (not (cl-loop for file in targets + if (file-newer-than-file-p file doom-autoload-file) + return t))) + (progn (print! (green "Doom core autoloads is up-to-date")) + (doom-initialize-autoloads doom-autoload-file) + nil) + (doom-delete-autoloads-file doom-autoload-file) + (message "Generating new autoloads.el") + (make-directory (file-name-directory doom-autoload-file) t) + (with-temp-file doom-autoload-file + (doom--generate-header 'doom-reload-doom-autoloads) + (save-excursion + (doom--generate-autoloads (reverse enabled-targets))) + ;; Replace autoload paths (only for module autoloads) with absolute + ;; paths for faster resolution during load and simpler `load-path' + (save-excursion + (doom--expand-autoloads) + (print! (green "✓ Expanded module autoload paths"))) + ;; Generates stub definitions for functions/macros defined in disabled + ;; modules, so that you will never get a void-function when you use + ;; them. + (save-excursion + (doom--generate-autodefs (reverse targets) enabled-targets) + (print! (green "✓ Generated autodefs"))) + ;; Remove byte-compile inhibiting file variables so we can byte-compile + ;; the file, and autoload comments. + (doom--cleanup-autoloads) + (print! (green "✓ Clean up autoloads"))) + ;; Byte compile it to give the file a chance to reveal errors. + (doom--byte-compile-file doom-autoload-file) + (doom--do-load doom-autoload-file) + t))) + + +;; +;; Package autoloads + +(defun doom--generate-package-autoloads () + (dolist (spec (doom-get-package-alist)) + (if-let* ((pkg (car spec)) + (desc (cdr spec))) + (unless (memq pkg doom-autoload-excluded-packages) + (let ((file (concat (package--autoloads-file-name desc) ".el"))) + (when (file-exists-p file) + (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") + (insert-file-contents file) + (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\|(provide '[^\n]+\\)" nil t) + (unless (nth 8 (syntax-ppss)) + (replace-match "" t t))) + (unless (bolp) (insert "\n")) + (insert ")\n")))) + (message "Couldn't find package desc for %s" (car spec))))) + +(defun doom--generate-var-cache () + (doom-initialize-packages) + (prin1 `(setq load-path ',load-path + auto-mode-alist ',auto-mode-alist + Info-directory-list ',Info-directory-list + doom-disabled-packages ',doom-disabled-packages + package-activated-list ',package-activated-list) + (current-buffer))) + +(defun doom--cleanup-package-autoloads () + (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) + (goto-char (match-beginning 1)) + (kill-sexp))) + +(defun doom-reload-package-autoloads (&optional force-p) + "Compiles `doom-package-autoload-file' from the autoloads files of all +installed packages. It also caches `load-path', `Info-directory-list', +`doom-disabled-packages', `package-activated-list' and `auto-mode-alist'. + +Will do nothing if none of your installed packages have been modified. If +FORCE-P (universal argument) is non-nil, regenerate it anyway. + +This should be run whenever your `doom!' block or update your packages." + (if (and (not force-p) + (not doom-emacs-changed-p) + (file-exists-p doom-package-autoload-file) + (not (file-newer-than-file-p doom-packages-dir doom-package-autoload-file)) + (not (ignore-errors + (cl-loop for key being the hash-keys of (doom-modules) + for path = (doom-module-path (car key) (cdr key) "packages.el") + if (file-newer-than-file-p path doom-package-autoload-file) + return t)))) + (ignore (print! (green "Doom package autoloads is up-to-date")) + (doom-initialize-autoloads doom-package-autoload-file)) + (let (case-fold-search) + (doom-delete-autoloads-file doom-package-autoload-file) + (with-temp-file doom-package-autoload-file + (doom--generate-header 'doom-reload-package-autoloads) + (save-excursion + ;; Cache the important and expensive-to-initialize state here. + (doom--generate-var-cache) + (print! (green "✓ Cached package state")) + ;; Loop through packages and concatenate all their autoloads files. + (doom--generate-package-autoloads) + (print! (green "✓ Package autoloads included"))) + ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, + ;; at least); they are cached later, so all those membership checks are + ;; unnecessary overhead. + (doom--cleanup-package-autoloads) + (print! (green "✓ Removed load-path/auto-mode-alist entries")))) + (doom--byte-compile-file doom-package-autoload-file) + (doom--do-load doom-package-autoload-file) + t)) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el new file mode 100644 index 000000000..6803ba9ae --- /dev/null +++ b/core/cli/byte-compile.el @@ -0,0 +1,176 @@ +;;; core/cli/byte-compile.el -*- lexical-binding: t; -*- + +(dispatcher! (compile c) (doom-byte-compile args) + "Byte-compiles your config or selected modules. + + compile [TARGETS...] + compile :core :private lang/python + compile feature lang + +Accepts :core, :private and :plugins as special arguments, indicating you want +to byte-compile Doom's core files, your private config or your ELPA plugins, +respectively.") + +(dispatcher! (recompile rc) (doom-byte-compile args 'recompile) + "Re-byte-compiles outdated *.elc files.") + +(dispatcher! clean (doom-clean-byte-compiled-files) + "Delete all *.elc files.") + + +;; +;; Helpers + +(defun doom-byte-compile (&optional modules recompile-p) + "Byte compiles your emacs configuration. + +init.el is always byte-compiled by this. + +If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are +byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom +core. It always ignores unit tests and files with `no-byte-compile' enabled. + +WARNING: byte-compilation yields marginal gains and makes debugging new issues +difficult. It is recommended you don't use it unless you understand the +reprecussions. + +Use `doom-clean-byte-compiled-files' or `make clean' to reverse +byte-compilation. + +If RECOMPILE-P is non-nil, only recompile out-of-date files." + (let ((default-directory doom-emacs-dir) + (total-ok 0) + (total-fail 0) + (total-noop 0) + compile-plugins-p + targets) + (dolist (module (delete-dups modules) (nreverse targets)) + (pcase module + (":core" (push doom-core-dir targets)) + (":private" (push doom-private-dir targets)) + (":plugins" + (cl-loop for (_name . desc) in (doom-get-package-alist) + do (package--compile desc)) + (setq compile-plugins-p t + modules (delete ":plugins" modules))) + ((pred file-directory-p) + (push module targets)) + ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) + (push (doom-module-locate-path + (doom-keyword-intern (match-string 1 module)) + (intern (match-string 2 module))) + targets)))) + (cl-block 'byte-compile + ;; If we're just here to byte-compile our plugins, we're done! + (and (not modules) + compile-plugins-p + (cl-return-from 'byte-compile t)) + (unless (or (equal modules '(":core")) + recompile-p) + (unless (and (not doom-auto-accept) + (y-or-n-p + (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" + "efforts to debug issues. It is not recommended you do it if you frequently\n" + "tinker with your Emacs config.\n\n" + "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" + "Doom core files, as these don't change often.\n\n" + "If you have issues, please make sure byte-compilation isn't the cause by using\n" + "`bin/doom clean` to clear out your *.elc files.\n\n" + "Byte-compile anyway?"))) + (message "Aborting.") + (cl-return-from 'byte-compile))) + (and (not recompile-p) + (or (null modules) (equal modules '(":core"))) + (doom-clean-byte-compiled-files)) + (let (doom-emacs-changed-p + noninteractive) + ;; But first we must be sure that Doom and your private config have been + ;; fully loaded. Which usually aren't so in an noninteractive session. + (unless (and (doom-initialize-autoloads doom-autoload-file) + (doom-initialize-autoloads doom-package-autoload-file)) + (doom-reload-autoloads)) + (doom-initialize) + (doom-initialize-modules 'force)) + ;; If no targets were supplied, then we use your module list. + (unless modules + (setq targets (append (list doom-core-dir) + (doom-module-load-path)))) + ;; Assemble el files we want to compile; taking into account that + ;; MODULES may be a list of MODULE/SUBMODULE strings from the command + ;; line. + (let ((target-files (doom-files-in targets :depth 1 :match "\\.el$")) + (load-path load-path) + kill-emacs-hook kill-buffer-query-functions) + (unless target-files + (if targets + (message "Couldn't find any valid targets") + (message "No targets to %scompile" (if recompile-p "re" ""))) + (cl-return-from 'byte-compile)) + (require 'use-package) + (condition-case e + (let ((use-package-defaults use-package-defaults) + (use-package-expand-minimally t)) + ;; Prevent packages from being loaded at compile time if they + ;; don't meet their own predicates. + (push (list :no-require t + (lambda (_name args) + (or (when-let* ((pred (or (plist-get args :if) + (plist-get args :when)))) + (not (eval pred t))) + (when-let* ((pred (plist-get args :unless))) + (eval pred t))))) + use-package-defaults) + ;; Always compile private init file + (push (expand-file-name "init.el" doom-private-dir) target-files) + (push (expand-file-name "init.el" doom-emacs-dir) target-files) + (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) + (if (or (not recompile-p) + (let ((elc-file (byte-compile-dest-file target))) + (and (file-exists-p elc-file) + (file-newer-than-file-p target elc-file)))) + (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) + (not (doom--file-cookie-p target))) + 'no-byte-compile + (byte-compile-file target))) + (short-name (if (file-in-directory-p target doom-emacs-dir) + (file-relative-name target doom-emacs-dir) + (abbreviate-file-name target)))) + (cl-incf + (cond ((eq result 'no-byte-compile) + (print! (dark (white "⚠ Ignored %s")) short-name) + total-noop) + ((null result) + (print! (red "✕ Failed to compile %s") short-name) + total-fail) + (t + (print! (green "✓ Compiled %s") short-name) + (quiet! (load target t t)) + total-ok)))) + (cl-incf total-noop))) + (print! (bold (color (if (= total-fail 0) 'green 'red) + "%s %d/%d file(s) (%d ignored)")) + (if recompile-p "Recompiled" "Compiled") + total-ok (- (length target-files) total-noop) + total-noop)) + ((debug error) + (print! (red "\nThere were breaking errors.\n\n%s") + "Reverting changes...") + (signal 'doom-error (list 'byte-compile e)))))))) + +(defun doom-clean-byte-compiled-files () + "Delete all the compiled elc files in your Emacs configuration and private +module. This does not include your byte-compiled, third party packages.'" + (cl-loop with default-directory = doom-emacs-dir + for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) + (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) + (doom-files-in doom-core-dir :match "\\.elc$") + (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) + for truepath = (file-truename path) + if (file-exists-p path) + do (delete-file path) + and do + (print! (green "✓ Deleted %s") + (if (file-in-directory-p truepath default-directory) + (file-relative-name truepath) + (abbreviate-file-name truepath))) + finally do (print! (bold (green "Everything is clean"))))) diff --git a/core/cli/debug.el b/core/cli/debug.el new file mode 100644 index 000000000..a66a52507 --- /dev/null +++ b/core/cli/debug.el @@ -0,0 +1,7 @@ +;;; core/cli/debug.el -*- lexical-binding: t; -*- + +(dispatcher! info (doom/info) + "Output system info in markdown for bug reports.") + +(dispatcher! (version v) (doom/version) + "Reports the version of Doom and Emacs.") diff --git a/core/cli/packages.el b/core/cli/packages.el new file mode 100644 index 000000000..3125c03a1 --- /dev/null +++ b/core/cli/packages.el @@ -0,0 +1,167 @@ +;; -*- no-byte-compile: t; -*- +;;; core/cli/packages.el + +(dispatcher! (install i) (doom--do #'doom-packages-install) + "Installs requested packages that aren't installed.") + +(dispatcher! (update u) (doom--do #'doom-packages-update) + "Updates packages.") + +(dispatcher! (autoremove r) (doom--do #'doom-packages-autoremove) + "Removes packages that are no longer needed.") + + +;; +;; Helpers + +(defsubst doom--do (fn) + (doom-reload-doom-autoloads) + (when (funcall fn doom-auto-accept) + (doom-reload-package-autoloads))) + + +;; +;; Library + +(defun doom-packages-install (&optional auto-accept-p) + "Interactive command for installing missing packages." + (print! "Looking for packages to install...") + (let ((packages (reverse (doom-get-missing-packages)))) + (cond ((not packages) + (print! (green "No packages to install!")) + nil) + + ((not (or auto-accept-p + (y-or-n-p + (format "%s packages will be installed:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (pkg) + (format "+ %s (%s)" + (car pkg) + (cond ((doom-package-different-recipe-p (car pkg)) + "new recipe") + ((doom-package-different-backend-p (car pkg)) + (if (plist-get (cdr pkg) :recipe) + "ELPA->QUELPA" + "QUELPA->ELPA")) + ((plist-get (cdr pkg) :recipe) + "QUELPA") + ("ELPA")))) + (cl-sort (cl-copy-list packages) #'string-lessp + :key #'car) + "\n"))))) + (user-error "Aborted!")) + + ((let (success) + (doom-refresh-packages-maybe doom-debug-mode) + (dolist (pkg packages) + (print! "Installing %s" (car pkg)) + (doom--condition-case! + (let ((result + (or (and (doom-package-installed-p (car pkg)) + (not (doom-package-different-backend-p (car pkg))) + (not (doom-package-different-recipe-p (car pkg))) + 'already-installed) + (and (doom-install-package (car pkg) (cdr pkg)) + (setq success t) + 'success) + 'failure)) + (pin-label + (and (plist-member (cdr pkg) :pin) + (format " [pinned: %s]" (plist-get (cdr pkg) :pin))))) + (print! "%s%s" + (pcase result + (`already-installed (dark (white "⚠ ALREADY INSTALLED"))) + (`success (green "✓ DONE")) + (`failure (red "✕ FAILED"))) + (or pin-label ""))))) + (print! (bold (green "Finished!"))) + (when success + (set-file-times doom-packages-dir) + (doom-delete-autoloads-file doom-package-autoload-file)) + success))))) + +(defun doom-packages-update (&optional auto-accept-p) + "Interactive command for updating packages." + (print! "Looking for outdated packages...") + (let ((packages (cl-sort (cl-copy-list (doom-get-outdated-packages)) #'string-lessp + :key #'car))) + (cond ((not packages) + (print! (green "Everything is up-to-date")) + nil) + + ((not (or auto-accept-p + (y-or-n-p + (format "%s packages will be updated:\n\n%s\n\nProceed?" + (length packages) + (let ((max-len + (or (car (sort (mapcar (lambda (it) (length (symbol-name (car it)))) packages) + #'>)) + 10))) + (mapconcat + (lambda (pkg) + (format (format "+ %%-%ds %%-%ds -> %%s" (+ max-len 2) 14) + (symbol-name (car pkg)) + (package-version-join (cadr pkg)) + (package-version-join (cl-caddr pkg)))) + packages + "\n")))))) + (user-error "Aborted!")) + + ((let (success) + (dolist (pkg packages) + (print! "Updating %s" (car pkg)) + (doom--condition-case! + (print! + (let ((result (doom-update-package (car pkg) t))) + (when result (setq success t)) + (color (if result 'green 'red) + (if result "✓ DONE" "✕ FAILED")))))) + (print! (bold (green "Finished!"))) + (when success + (set-file-times doom-packages-dir) + (doom-delete-autoloads-file doom-package-autoload-file)) + success))))) + +(defun doom-packages-autoremove (&optional auto-accept-p) + "Interactive command for auto-removing orphaned packages." + (print! "Looking for orphaned packages...") + (let ((packages (doom-get-orphaned-packages))) + (cond ((not packages) + (print! (green "No unused packages to remove")) + nil) + + ((not + (or auto-accept-p + (y-or-n-p + (format "%s packages will be deleted:\n\n%s\n\nProceed?" + (length packages) + (mapconcat + (lambda (sym) + (let ((backend (doom-package-backend sym))) + (format "+ %s (%s)" sym + (if (doom-package-different-backend-p sym) + (pcase backend + (`quelpa "QUELPA->ELPA") + (`elpa "ELPA->QUELPA") + (_ "removed")) + (upcase (symbol-name backend)))))) + (sort (cl-copy-list packages) #'string-lessp) + "\n"))))) + (user-error "Aborted!")) + + ((let (success) + (dolist (pkg packages) + (doom--condition-case! + (let ((result (doom-delete-package pkg t))) + (if result (setq success t)) + (print! (color (if result 'green 'red) + "%s %s" + (if result "✓ Removed" "✕ Failed to remove") + pkg))))) + (print! (bold (green "Finished!"))) + (when success + (set-file-times doom-packages-dir) + (doom-delete-autoloads-file doom-package-autoload-file)) + success))))) diff --git a/core/cli/patch-macos.el b/core/cli/patch-macos.el new file mode 100644 index 000000000..e680dcd90 --- /dev/null +++ b/core/cli/patch-macos.el @@ -0,0 +1,85 @@ +;;; core/cli/patch-macos.el -*- lexical-binding: t; -*- + +(dispatcher! (patch-macos) + (doom-patch-macos (or (member "--undo" args) + (member "-u" args)) + (doom--find-emacsapp-path)) + "Patches Emacs.app to respect your shell environment. + +A common issue with GUI Emacs on MacOS is that it launches in an environment +independent of your shell configuration, including your PATH and any other +utilities like rbenv, rvm or virtualenv. + +This patch fixes this by patching Emacs.app (in /Applications or +~/Applications). It will: + + 1. Move Contents/MacOS/Emacs to Contents/MacOS/RunEmacs + 2. And replace Contents/MacOS/Emacs with the following wrapper script: + + #!/bin/bash + args=\"$@\" + pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\" + exec \"$SHELL\" -l -c \"$pwd/RunEmacs $args\" + +This ensures that Emacs is always aware of your shell environment, regardless of +how it is launched. + +It can be undone with the --undo or -u options. + +Alternatively, you can install the exec-path-from-shell Emacs plugin, which will +scrape your shell environment remotely, at startup. However, this can be slow +depending on your shell configuration and isn't always reliable.") + + +;; +;; Library + +(defun doom--find-emacsapp-path () + (or (getenv "EMACS_APP_PATH") + (cl-loop for dir in (list "/usr/local/opt/emacs" + "/usr/local/opt/emacs-plus" + "/Applications" + "~/Applications") + for appdir = (concat dir "/Emacs.app") + if (file-directory-p appdir) + return appdir) + (user-error "Couldn't find Emacs.app"))) + +(defun doom-patch-macos (undo-p appdir) + "Patches Emacs.app to respect your shell environment." + (unless IS-MAC + (user-error "You don't seem to be running MacOS")) + (unless (file-directory-p appdir) + (user-error "Couldn't find '%s'" appdir)) + (let ((oldbin (expand-file-name "Contents/MacOS/Emacs" appdir)) + (newbin (expand-file-name "Contents/MacOS/RunEmacs" appdir))) + (cond (undo-p + (unless (file-exists-p newbin) + (user-error "Emacs.app is not patched")) + (copy-file newbin oldbin 'ok-if-already-exists nil nil 'preserve-permissions) + (unless (file-exists-p oldbin) + (error "Failed to copy %s to %s" newbin oldbin)) + (delete-file newbin) + (message "%s successfully unpatched" appdir)) + + ((file-exists-p newbin) + (user-error "%s is already patched" appdir)) + + ((or doom-auto-accept + (y-or-n-p + (concat "Doom would like to patch your Emacs.app bundle so that it respects\n" + "your shell configuration. For more information on why and how, run\n\n" + " bin/doom help patch-macos\n\n" + "Patch Emacs.app?"))) + (message "Patching '%s'" appdir) + (copy-file oldbin newbin nil nil nil 'preserve-permissions) + (unless (file-exists-p newbin) + (error "Failed to copy %s to %s" oldbin newbin)) + (with-temp-buffer + (insert "#!/bin/bash\n" + "args=\"$@\"\n" + "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"\n" + "exec \"$SHELL\" -l -c \"$pwd/RunEmacs $args\"") + (write-file oldbin) + (chmod oldbin (file-modes newbin))) + (message "%s successfully patched" appdir))))) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el new file mode 100644 index 000000000..f9e10fe24 --- /dev/null +++ b/core/cli/quickstart.el @@ -0,0 +1,59 @@ +;;; core/cli/quickstart.el -*- lexical-binding: t; -*- + +(dispatcher! (quickstart qs) (doom-quickstart) + "Quickly deploy a private module and Doom. + +This deploys a barebones config to ~/.doom.d. The destination can be changed +with the -p option, e.g. + + doom -p ~/.config/doom quickstart + +This command will refuse to overwrite the private directory if it already +exists.") + + +;; +;; Library + +(defun doom-quickstart () + "Quickly deploy a private module and Doom. + +This deploys a barebones config to `doom-private-dir', installs all missing +packages and regenerates the autoloads file." + ;; Create `doom-private-dir' + (let ((short-private-dir (abbreviate-file-name doom-private-dir))) + (if (file-directory-p doom-private-dir) + (print! (yellow "%s directory already exists. Skipping.") short-private-dir) + (print! "Creating %s" short-private-dir) + (make-directory doom-private-dir t) + (print! (green "Done!"))) + ;; Create init.el + (let ((init-file (expand-file-name "init.el" doom-private-dir))) + (if (file-exists-p init-file) + (print! (yellow "%sinit.el already exists. Skipping.") short-private-dir) + (print! "Copying init.example.el to %s" short-private-dir) + (copy-file (expand-file-name "init.example.el" doom-emacs-dir) + init-file) + (print! (green "Done!")))) + ;; Create config.el + (let ((config-file (expand-file-name "config.el" doom-private-dir))) + (if (file-exists-p config-file) + (print! "%sconfig.el already exists. Skipping." short-private-dir) + (print! "Deploying empty config.el file in %s" short-private-dir) + (with-temp-file config-file (insert "")) + (print! (green "Done!"))))) + ;; Ask if Emacs.app should be patched + (when IS-MAC + (message "MacOS detected") + (condition-case e + (doom-patch-macos nil (doom--find-emacsapp-path)) + (user-error (message "%s" (error-message-string e))))) + ;; Install Doom packages + (print! "Installing plugins") + (doom-packages-install doom-auto-accept) + (print! "Regenerating autoloads files") + (doom-reload-autoloads nil 'force-p) + (print! (bold (green "\nFinished! Doom is ready to go!\n"))) + (with-temp-buffer + (doom-template-insert "QUICKSTART_INTRO") + (print! (buffer-string)))) diff --git a/core/core-tests.el b/core/cli/test.el similarity index 88% rename from core/core-tests.el rename to core/cli/test.el index 157e3223c..6a6a36c25 100644 --- a/core/core-tests.el +++ b/core/cli/test.el @@ -1,4 +1,11 @@ -;;; core/core-tests.el -*- lexical-binding: t; -*- +;;; core/cli/test.el -*- lexical-binding: t; -*- + +(dispatcher! test (doom-run-tests args) + "Run Doom unit tests.") + + +;; +;; Library (defun doom-run-tests (&optional modules) "Run all loaded tests, specified by MODULES (a list of module cons cells) or @@ -25,9 +32,7 @@ If neither is available, run all tests in all enabled modules." nconc (cl-loop for dir in doom-modules-dirs for path = (expand-file-name arg dir) if (file-directory-p path) - nconc - (doom-files-in - path :type 'dirs :depth 1 :full t)) + nconc (doom-files-in path :type 'dirs :depth 1 :full t)) finally do (setq argv nil)))) (modules ; cons-cells given to MODULES @@ -54,7 +59,7 @@ If neither is available, run all tests in all enabled modules." ;; -(defmacro def-test! (_name &rest _body)) +;; Test library (defmacro insert! (&rest text) "Insert TEXT in buffer, then move cursor to last {0} marker." @@ -62,6 +67,3 @@ If neither is available, run all tests in all enabled modules." (insert ,@text) (when (search-backward "{0}" nil t) (replace-match "" t t)))) - -(provide 'core-tests) -;;; core-tests.el ends here diff --git a/core/cli/upgrade.el b/core/cli/upgrade.el new file mode 100644 index 000000000..09329cb87 --- /dev/null +++ b/core/cli/upgrade.el @@ -0,0 +1,76 @@ +;;; core/cli/upgrade.el -*- lexical-binding: t; -*- + +(dispatcher! (upgrade up) (doom-upgrade) + "Checks out the latest Doom on this branch.") + + +;; +;; Quality of Life Commands + +(defvar doom-repo-url "https://github.com/hlissner/doom-emacs" + "TODO") +(defvar doom-repo-remote "_upgrade" + "TODO") + +(defun doom--working-tree-dirty-p (dir) + (with-temp-buffer + (let ((default-directory dir)) + (if (zerop (process-file "git" nil (current-buffer) nil + "status" "--porcelain" "-uno")) + (string-match-p "[^ \t\n]" (buffer-string)) + (error "Failed to check working tree in %s" dir))))) + +(defun doom-upgrade () + "Upgrade Doom to the latest version non-destructively." + (require 'vc-git) + (let* ((gitdir (expand-file-name ".git" doom-emacs-dir)) + (branch (vc-git--symbolic-ref doom-emacs-dir)) + (default-directory doom-emacs-dir)) + (unless (file-exists-p gitdir) + (error "Couldn't find %s. Was Doom cloned properly?" + (abbreviate-file-name gitdir))) + (unless branch + (error "Couldn't detect what branch you're using. Is Doom detached?")) + (when (doom--working-tree-dirty-p doom-emacs-dir) + (user-error "Refusing to upgrade because Doom has been modified. Stash or undo your changes")) + (with-temp-buffer + (let ((buf (current-buffer))) + (condition-case-unless-debug e + (progn + (process-file "git" nil buf nil "remote" "remove" doom-repo-remote) + (unless (zerop (process-file "git" nil buf nil "remote" "add" + doom-repo-remote doom-repo-url)) + (error "Failed to add %s to remotes" doom-repo-remote)) + (unless (zerop (process-file "git" nil buf nil "fetch" "--tags" + doom-repo-remote branch)) + (error "Failed to fetch from upstream")) + (let ((current-rev (vc-git-working-revision doom-emacs-dir)) + (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) + (unless rev + (error "Couldn't detect Doom's version. Is %s a repo?" + (abbreviate-file-name doom-emacs-dir))) + (when (equal current-rev rev) + (user-error "Doom is up to date!")) + (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" + current-rev rev) + (message "Comparision diff: https://github.com/hlissner/doom-emacs/compare/%s...%s\n" + (substring current-rev 0 10) (substring rev 0 10)) + ;; TODO Display newsletter diff + (unless (or doom-auto-accept (y-or-n-p "Proceed?")) + (user-error "Aborted")) + (message "Removing byte-compiled files from your config (if any)") + (doom-clean-byte-compiled-files) + (unless (zerop (process-file "git" nil buf nil "reset" "--hard" + (format "%s/%s" doom-repo-remote branch))) + (error "An error occurred while checking out the latest commit\n\n%s" + (buffer-string))) + (unless (equal (vc-git-working-revision doom-emacs-dir) rev) + (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) + (doom-refresh 'force) + (message "Done! Please restart Emacs for changes to take effect"))) + (user-error + (message "%s Aborting." (error-message-string e))) + (error + (message "There was an unexpected error.\n\n%s\n\nOutput:\n%s" + (car e) + (buffer-string)))))))) diff --git a/core/core-cli.el b/core/core-cli.el index 35290bcea..e4aab3b03 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -3,9 +3,10 @@ ;; Eagerly load these libraries because this module may be loaded in a session ;; that hasn't been fully initialized (where autoloads files haven't been ;; generated or `load-path' populated). -(load! "autoload/packages") (load! "autoload/debug") +(load! "autoload/files") (load! "autoload/message") +(load! "autoload/packages") ;; @@ -38,7 +39,7 @@ commands like `doom-packages-install', `doom-packages-update' and omitted, show all available commands, their aliases and brief descriptions." (if command (princ (doom--dispatch-format desc)) - (print! (bold "%-10s\t%s\t%s" "Command:" "Alias" "Description")) + (print! (bold "%-10s\t%s\t%s") "Command:" "Alias" "Description") (dolist (spec (cl-sort doom--dispatch-command-alist #'string-lessp :key #'car)) (cl-destructuring-bind (command &key desc _body) spec @@ -80,7 +81,7 @@ BODY will be run when this dispatcher is called." (setf (alist-get alias doom--dispatch-alias-alist) ',cmd)))) `((setf (alist-get ',cmd doom--dispatch-command-alist) (list :desc ,docstring - :body (lambda (args) ,form)))))))) + :body (lambda (args) (ignore args) ,form)))))))) ;; @@ -99,142 +100,28 @@ additional overhead for be started this way. For the best performance, it is best to run Doom out of ~/.emacs.d and ~/.doom.d.") (dispatcher! (doctor doc) :noop - "Checks for issues with your current Doom config.") + "Checks for issues with your current Doom config. + +Also checks for missing optional dependencies for all enabled modules.") (dispatcher! (help h) :noop "Look up additional information about a command.") -;; Real dispatchers -(dispatcher! (quickstart qs) (doom-quickstart) - "Quickly deploy a private module and Doom. +;; +;; Real dispatch commands -This deploys a barebones config to ~/.doom.d. The destination can be changed -with the -p option, e.g. - - doom -p ~/.config/doom quickstart - -This command will refuse to overwrite the private directory if it already -exists.") - -(dispatcher! (install i) (doom--do 'doom-packages-install) - "Installs requested plugins that aren't installed.") - -(dispatcher! (update u) (doom--do 'doom-packages-update) - "Installs requested plugins that aren't installed.") - -(dispatcher! (autoremove r) (doom--do 'doom-packages-autoremove) - "Installs requested plugins that aren't installed.") - -(dispatcher! (autoloads a) (doom-reload-autoloads nil 'force) - "Regenerates Doom's autoloads file. - -This file tells Emacs where to find your module's autoloaded functions and -plugins.") - - -(dispatcher! (upgrade up) (doom-upgrade) - "Checks out the latest Doom on this branch.") - -(dispatcher! (compile c) (doom-byte-compile args) - "Byte-compiles your config or selected modules. - - compile [TARGETS...] - compile :core :private lang/python - compile feature lang - -Accepts :core, :private and :plugins as special arguments, indicating you want -to byte-compile Doom's core files, your private config or your ELPA plugins, -respectively.") - -(dispatcher! (compile c) (doom-byte-compile args) - "Byte-compiles your config or selected modules. - - compile [TARGETS...] - compile :core :private lang/python - compile feature lang - -Accepts :core, :private and :plugins as special arguments, indicating you want -to byte-compile Doom's core files, your private config or your ELPA plugins, -respectively.") - -(dispatcher! (recompile rc) (doom-byte-compile args 'recompile) - "Re-byte-compiles outdated *.elc files.") - -(dispatcher! clean (doom-clean-byte-compiled-files) - "Delete all *.elc files.") - - -(dispatcher! test - (progn (require 'core-tests) - (doom-run-tests args)) - "Run Doom unit tests.") - -(dispatcher! info (doom/info) - "Output system info in markdown for bug reports.") - -(dispatcher! (version v) (doom/version) - "Reports the version of Doom and Emacs.") - -(dispatcher! (refresh re) (doom-refresh 'force) - "Refresh Doom. Same as autoremove+install+autoloads. - -This is the equivalent of running autoremove, install, autoloads, then -recompile. Run this whenever you: - - 1. Modify your `doom!' block, - 2. Add or remove `package!' blocks to your config, - 3. Add or remove autoloaded functions in module autoloaded files. - 4. Update Doom outside of Doom (e.g. with git)") - -(dispatcher! (patch-macos) - (doom-patch-macos (or (member "--undo" args) - (member "-u" args)) - (doom--find-emacsapp-path)) - "Patches Emacs.app to respect your shell environment. - -A common issue with GUI Emacs on MacOS is that it launches in an environment -independent of your shell configuration, including your PATH and any other -utilities like rbenv, rvm or virtualenv. - -This patch fixes this by patching Emacs.app (in /Applications or -~/Applications). It will: - - 1. Move Contents/MacOS/Emacs to Contents/MacOS/RunEmacs - 2. And replace Contents/MacOS/Emacs with the following wrapper script: - - #!/bin/bash - args=\"$@\" - pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\" - exec \"$SHELL\" -l -c \"$pwd/RunEmacs $args\" - -This ensures that Emacs is always aware of your shell environment, regardless of -how it is launched. - -It can be undone with the --undo or -u options. - -Alternatively, you can install the exec-path-from-shell Emacs plugin, which will -scrape your shell environment remotely, at startup. However, this can be slow -depending on your shell configuration and isn't always reliable.") +(load! "cli/autoloads") +(load! "cli/byte-compile") +(load! "cli/debug") +(load! "cli/packages") +(load! "cli/patch-macos") +(load! "cli/quickstart") +(load! "cli/upgrade") +(load! "cli/test") ;; -;; Quality of Life Commands -;; - -(defvar doom-repo-url "https://github.com/hlissner/doom-emacs" - "TODO") -(defvar doom-repo-remote "_upgrade" - "TODO") - -(defun doom--working-tree-dirty-p (dir) - (with-temp-buffer - (let ((default-directory dir)) - (if (zerop (process-file "git" nil (current-buffer) nil - "status" "--porcelain" "-uno")) - (string-match-p "[^ \t\n]" (buffer-string)) - (error "Failed to check working tree in %s" dir))))) - (defun doom-refresh (&optional force-p) "Ensure Doom is in a working state by checking autoloads and packages, and recompiling any changed compiled files. This is the shotgun solution to most @@ -249,672 +136,16 @@ problems with doom." (doom-reload-package-autoloads force-p) (doom-byte-compile nil 'recompile))) -(defun doom-upgrade () - "Upgrade Doom to the latest version non-destructively." - (require 'vc-git) - (let* ((gitdir (expand-file-name ".git" doom-emacs-dir)) - (branch (vc-git--symbolic-ref doom-emacs-dir)) - (default-directory doom-emacs-dir)) - (unless (file-exists-p gitdir) - (error "Couldn't find %s. Was Doom cloned properly?" - (abbreviate-file-name gitdir))) - (unless branch - (error "Couldn't detect what branch you're using. Is Doom detached?" - (abbreviate-file-name doom-emacs-dir))) - (when (doom--working-tree-dirty-p doom-emacs-dir) - (user-error "Refusing to upgrade because Doom has been modified. Stash or undo your changes")) - (with-temp-buffer - (let ((buf (current-buffer))) - (condition-case-unless-debug e - (progn - (process-file "git" nil buf nil "remote" "remove" doom-repo-remote) - (unless (zerop (process-file "git" nil buf nil "remote" "add" - doom-repo-remote doom-repo-url)) - (error "Failed to add %s to remotes" doom-repo-remote)) - (unless (zerop (process-file "git" nil buf nil "fetch" "--tags" - doom-repo-remote branch)) - (error "Failed to fetch from upstream")) - (let ((current-rev (vc-git-working-revision doom-emacs-dir)) - (rev (string-trim (shell-command-to-string (format "git rev-parse %s/%s" doom-repo-remote branch))))) - (unless rev - (error "Couldn't detect Doom's version. Is %s a repo?" - (abbreviate-file-name doom-emacs-dir))) - (when (equal current-rev rev) - (user-error "Doom is up to date!")) - (message "Updates for Doom are available!\n\n Old revision: %s\n New revision: %s\n" - current-rev rev) - (message "Comparision diff: https://github.com/hlissner/doom-emacs/compare/%s...%s\n" - (substring current-rev 0 10) (substring rev 0 10)) - ;; TODO Display newsletter diff - (unless (or doom-auto-accept (y-or-n-p "Proceed?")) - (user-error "Aborted")) - (message "Removing byte-compiled files from your config (if any)") - (doom-clean-byte-compiled-files) - (unless (zerop (process-file "git" nil buf nil "reset" "--hard" - (format "%s/%s" doom-repo-remote branch))) - (error "An error occurred while checking out the latest commit\n\n%s" - (buffer-string))) - (unless (equal (vc-git-working-revision doom-emacs-dir) rev) - (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) - (doom-refresh 'force) - (message "Done! Please restart Emacs for changes to take effect"))) - (user-error - (message "%s Aborting." (error-message-string e))) - (error - (message "There was an unexpected error.\n\n%s -> %s\n\nOutput:\n%s" - (car e) - (buffer-string)))))))) +(dispatcher! (refresh re) (doom-refresh 'force) + "Refresh Doom. Same as autoremove+install+autoloads. -(defun doom--find-emacsapp-path () - (or (getenv "EMACS_APP_PATH") - (cl-loop for dir in (list "/usr/local/opt/emacs" - "/usr/local/opt/emacs-plus" - "/Applications" - "~/Applications") - for appdir = (concat dir "/Emacs.app") - if (file-directory-p appdir) - return appdir) - (user-error "Couldn't find Emacs.app"))) +This is the equivalent of running autoremove, install, autoloads, then +recompile. Run this whenever you: -(defun doom-quickstart () - "Quickly deploy a private module and Doom. - -This deploys a barebones config to `doom-private-dir', installs all missing -packages and regenerates the autoloads file." - ;; Create `doom-private-dir' - (let ((short-private-dir (abbreviate-file-name doom-private-dir))) - (if (file-directory-p doom-private-dir) - (print! (yellow "%s directory already exists. Skipping." short-private-dir)) - (print! "Creating %s" short-private-dir) - (make-directory doom-private-dir t) - (print! (green "Done!"))) - ;; Create init.el - (let ((init-file (expand-file-name "init.el" doom-private-dir))) - (if (file-exists-p init-file) - (print! (yellow "%sinit.el already exists. Skipping." short-private-dir)) - (print! "Copying init.example.el to %s" short-private-dir) - (copy-file (expand-file-name "init.example.el" doom-emacs-dir) - init-file) - (print! (green "Done!")))) - ;; Create config.el - (let ((config-file (expand-file-name "config.el" doom-private-dir))) - (if (file-exists-p config-file) - (print! "%sconfig.el already exists. Skipping." short-private-dir) - (print! "Deploying empty config.el file in %s" short-private-dir) - (with-temp-file config-file (insert "")) - (print! (green "Done!"))))) - ;; Ask if Emacs.app should be patched - (when IS-MAC - (message "MacOS detected") - (condition-case e - (doom-patch-macos nil (doom--find-emacsapp-path)) - (user-error (message "%s" (error-message-string e))))) - ;; Install Doom packages - (print! "Installing plugins") - (doom-packages-install doom-auto-accept) - (print! "Regenerating autoloads files") - (doom-reload-autoloads nil 'force-p) - (print! (bold (green "\nFinished! Doom is ready to go!\n"))) - (with-temp-buffer - (doom-template-insert "QUICKSTART_INTRO") - (print! (buffer-string)))) - -(defun doom-patch-macos (undo-p appdir) - "Patches Emacs.app to respect your shell environment." - (unless IS-MAC - (user-error "You don't seem to be running MacOS")) - (unless (file-directory-p appdir) - (user-error "Couldn't find '%s'" appdir)) - (let ((oldbin (expand-file-name "Contents/MacOS/Emacs" appdir)) - (newbin (expand-file-name "Contents/MacOS/RunEmacs" appdir))) - (cond (undo-p - (unless (file-exists-p newbin) - (user-error "Emacs.app is not patched")) - (copy-file newbin oldbin 'ok-if-already-exists nil nil 'preserve-permissions) - (unless (file-exists-p oldbin) - (error "Failed to copy %s to %s" newbin oldbin)) - (delete-file newbin) - (message "%s successfully unpatched" appdir)) - - ((file-exists-p newbin) - (user-error "%s is already patched" appdir)) - - ((or doom-auto-accept - (y-or-n-p - (concat "Doom would like to patch your Emacs.app bundle so that it respects\n" - "your shell configuration. For more information on why and how, run\n\n" - " bin/doom help patch-macos\n\n" - "Patch Emacs.app?"))) - (message "Patching '%s'" appdir) - (copy-file oldbin newbin nil nil nil 'preserve-permissions) - (unless (file-exists-p newbin) - (error "Failed to copy %s to %s" oldbin newbin)) - (with-temp-buffer - (insert "#!/bin/bash\n" - "args=\"$@\"\n" - "pwd=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\"; pwd -P)\"\n" - "exec \"$SHELL\" -l -c \"$pwd/RunEmacs $args\"") - (write-file oldbin) - (chmod oldbin (file-modes newbin))) - (message "%s successfully patched" appdir))))) - - -;; -;; Autoload file generation -;; - -(defvar doom-autoload-excluded-packages '(marshal gh) - "Packages that have silly or destructive autoload files that try to load -everyone in the universe and their dog, causing errors that make babies cry. No -one wants that.") - -(defun doom-delete-autoloads-file (file) - "Delete FILE (an autoloads file), and delete the accompanying *.elc file, if -it exists." - (cl-check-type file string) - (when (file-exists-p file) - (when-let* ((buf (find-buffer-visiting doom-autoload-file))) - (with-current-buffer buf - (set-buffer-modified-p nil)) - (kill-buffer buf)) - (delete-file file) - (ignore-errors (delete-file (byte-compile-dest-file file))) - (message "Deleted old %s" (file-name-nondirectory file)))) - -(defun doom--do (fn) - (doom-reload-doom-autoloads) - (when (funcall fn doom-auto-accept) - (doom-reload-package-autoloads))) - -(defun doom--warn-refresh-session () - (message "Detected a running Emacs session.\n") - (message "Restart Emacs or use `M-x doom/reload' for changes to take effect.")) - -(defun doom--do-load (&rest files) - (if (and noninteractive (not (daemonp))) - (progn - (require 'server) - (when (server-running-p) - (add-hook 'kill-emacs-hook #'doom--warn-refresh-session))) - (dolist (file files) - (load-file (byte-compile-dest-file file))))) - -(defun doom--byte-compile-file (file) - (let ((short-name (file-name-nondirectory file)) - (byte-compile-dynamic-docstrings t)) - (condition-case e - (when (byte-compile-file file) - ;; Give autoloads file a chance to report error - (load (if doom-debug-mode - file - (byte-compile-dest-file file)) - nil t) - (unless noninteractive - (message "Finished compiling %s" short-name))) - ((debug error) - (let ((backup-file (concat file ".bk"))) - (message "Copied backup to %s" backup-file) - (copy-file file backup-file 'overwrite)) - (doom-delete-autoloads-file file) - (signal 'doom-autoload-error (list short-name e)))))) - -(defun doom-reload-autoloads (&optional file force-p) - "Reloads FILE (an autoload file), if it needs reloading. - -FILE should be one of `doom-autoload-file' or `doom-package-autoload-file'. If -it is nil, it will try to reload both. If FORCE-P (universal argument) do it -even if it doesn't need reloading!" - (or (null file) - (stringp file) - (signal 'wrong-type-argument (list 'stringp file))) - (if (stringp file) - (cond ((file-equal-p file doom-autoload-file) - (doom-reload-doom-autoloads force-p)) - ((file-equal-p file doom-package-autoload-file) - (doom-reload-package-autoloads force-p)) - ((error "Invalid autoloads file: %s" file))) - (doom-reload-doom-autoloads force-p) - (doom-reload-package-autoloads force-p))) - - -;; -;; Doom autoloads -;; - -(defun doom--file-cookie-p (file) - "Returns the return value of the ;;;###if predicate form in FILE." - (with-temp-buffer - (insert-file-contents-literally file nil 0 256) - (if (and (re-search-forward "^;;;###if " nil t) - (<= (line-number-at-pos) 3)) - (let ((load-file-name file)) - (eval (sexp-at-point))) - t))) - -(defun doom--generate-header (func) - (goto-char (point-min)) - (insert ";; -*- lexical-binding:t -*-\n" - ";; This file is autogenerated by `" (symbol-name func) "', DO NOT EDIT !!\n\n")) - -(defun doom--generate-autoloads (targets) - (require 'autoload) - (dolist (file targets) - (let* ((file (file-truename file)) - (generated-autoload-file doom-autoload-file) - (generated-autoload-load-name (file-name-sans-extension file)) - (noninteractive (not doom-debug-mode)) - autoload-timestamps) - (print! - (cond ((not (doom--file-cookie-p file)) - "⚠ Ignoring %s") - ((autoload-generate-file-autoloads file (current-buffer)) - (yellow "✕ Nothing in %%s")) - ((green "✓ Scanned %%s"))) - (if (file-in-directory-p file default-directory) - (file-relative-name file) - (abbreviate-file-name file)))))) - -(defun doom--expand-autoloads () - (let ((load-path (append doom-modules-dirs load-path)) - cache) - (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) - (let ((path (match-string 1))) - (replace-match - (or (cdr (assoc path cache)) - (when-let* ((libpath (locate-library path)) - (libpath (file-name-sans-extension libpath))) - (push (cons path (abbreviate-file-name libpath)) cache) - libpath) - path) - t t nil 1))))) - -(defun doom--generate-autodefs (targets enabled-targets) - (goto-char (point-max)) - (search-backward ";;;***" nil t) - (save-excursion (insert "\n")) - (dolist (path targets) - (insert - (with-temp-buffer - (insert-file-contents path) - (let ((member-p (or (member path enabled-targets) - (file-in-directory-p path doom-core-dir))) - forms) - (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) - (let* ((sexp (sexp-at-point)) - (pred (match-string 1)) - (type (car sexp)) - (name (doom-unquote (cadr sexp))) - (origin (cond ((doom-module-from-path path)) - ((file-in-directory-p path doom-private-dir) - `(:private . ,(intern (file-name-base path)))) - ((file-in-directory-p path doom-emacs-dir) - `(:core . ,(intern (file-name-base path)))))) - (doom-file-form - `(put ',name 'doom-file ,(abbreviate-file-name path)))) - (cond ((memq type '(defun defmacro cl-defun cl-defmacro)) - (cl-destructuring-bind (type name arglist &rest body) sexp - (let ((docstring (if (stringp (car body)) - (pop body) - "No documentation."))) - (push (cond ((not (and member-p - (or (null pred) - (let ((load-file-name path)) - (eval (read pred) t))))) - (push doom-file-form forms) - (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" - origin docstring)) - (condition-case-unless-debug e - (append (list (pcase type - (`defun 'defmacro) - (`cl-defun `cl-defmacro) - (_ type)) - name arglist docstring) - (cl-loop for arg in arglist - if (and (symbolp arg) - (not (keywordp arg)) - (not (memq arg cl--lambda-list-keywords))) - collect arg into syms - else if (listp arg) - collect (car arg) into syms - finally return (if syms `((ignore ,@syms))))) - ('error - (message "Ignoring autodef %s (%s)" - name e) - nil))) - ((make-autoload sexp (abbreviate-file-name (file-name-sans-extension path))))) - forms) - (push `(put ',name 'doom-module ',origin) forms)))) - - ((eq type 'defalias) - (cl-destructuring-bind (type name target &optional docstring) sexp - (let ((name (doom-unquote name)) - (target (doom-unquote target))) - (unless (and member-p - (or (null pred) - (let ((load-file-name path)) - (eval (read pred) t)))) - (setq target #'ignore)) - (push doom-file-form forms) - (push `(put ',name 'doom-module ',origin) forms) - (push `(defalias ',name #',target ,docstring) - forms)))) - - ((and member-p - (or (null pred) - (eval (read pred) t))) - (push sexp forms))))) - (if forms - (concat (string-join (mapcar #'prin1-to-string (reverse forms)) "\n") - "\n") - "")))))) - -(defun doom--cleanup-autoloads () - (goto-char (point-min)) - (when (re-search-forward "^;;\\(;[^\n]*\\| no-byte-compile: t\\)\n" nil t) - (replace-match "" t t))) - -(defun doom-reload-doom-autoloads (&optional force-p) - "Refreshes the autoloads.el file, specified by `doom-autoload-file', if -necessary (or if FORCE-P is non-nil). - -It scans and reads core/autoload/*.el, modules/*/*/autoload.el and -modules/*/*/autoload/*.el, and generates `doom-autoload-file'. This file tells -Emacs where to find lazy-loaded functions. - -This should be run whenever your `doom!' block, or a module autoload file, is -modified." - (let* ((default-directory doom-emacs-dir) - (doom-modules (doom-modules)) - (targets - (file-expand-wildcards - (expand-file-name "autoload/*.el" doom-core-dir))) - (enabled-targets (copy-sequence targets)) - case-fold-search) - (dolist (path (doom-module-load-path t)) - (let* ((auto-dir (expand-file-name "autoload" path)) - (auto-file (expand-file-name "autoload.el" path)) - (module (doom-module-from-path auto-file)) - (module-p (or (doom-module-p (car module) (cdr module)) - (file-equal-p path doom-private-dir)))) - (when (file-exists-p auto-file) - (push auto-file targets) - (if module-p (push auto-file enabled-targets))) - (dolist (file (doom-files-in auto-dir :match "\\.el$" :full t)) - (push file targets) - (if module-p (push file enabled-targets))))) - (if (and (not force-p) - (not doom-emacs-changed-p) - (file-exists-p doom-autoload-file) - (not (file-newer-than-file-p (expand-file-name "init.el" doom-private-dir) - doom-autoload-file)) - (not (cl-loop for file in targets - if (file-newer-than-file-p file doom-autoload-file) - return t))) - (progn (print! (green "Doom core autoloads is up-to-date")) - (doom-initialize-autoloads doom-autoload-file) - nil) - (doom-delete-autoloads-file doom-autoload-file) - (message "Generating new autoloads.el") - (make-directory (file-name-directory doom-autoload-file) t) - (with-temp-file doom-autoload-file - (doom--generate-header 'doom-reload-doom-autoloads) - (save-excursion - (doom--generate-autoloads (reverse enabled-targets))) - ;; Replace autoload paths (only for module autoloads) with absolute - ;; paths for faster resolution during load and simpler `load-path' - (save-excursion - (doom--expand-autoloads) - (print! (green "✓ Expanded module autoload paths"))) - ;; Generates stub definitions for functions/macros defined in disabled - ;; modules, so that you will never get a void-function when you use - ;; them. - (save-excursion - (doom--generate-autodefs (reverse targets) enabled-targets) - (print! (green "✓ Generated autodefs"))) - ;; Remove byte-compile inhibiting file variables so we can byte-compile - ;; the file, and autoload comments. - (doom--cleanup-autoloads) - (print! (green "✓ Clean up autoloads"))) - ;; Byte compile it to give the file a chance to reveal errors. - (doom--byte-compile-file doom-autoload-file) - (doom--do-load doom-autoload-file) - t))) - - -;; -;; Package autoloads -;; - -(defun doom--generate-package-autoloads () - (dolist (spec (doom-get-package-alist)) - (if-let* ((pkg (car spec)) - (desc (cdr spec))) - (unless (memq pkg doom-autoload-excluded-packages) - (let ((file (concat (package--autoloads-file-name desc) ".el"))) - (when (file-exists-p file) - (insert "(let ((load-file-name " (prin1-to-string (abbreviate-file-name file)) "))\n") - (insert-file-contents file) - (while (re-search-forward "^\\(?:;;\\(.*\n\\)\\|\n\\|(provide '[^\n]+\\)" nil t) - (unless (nth 8 (syntax-ppss)) - (replace-match "" t t))) - (unless (bolp) (insert "\n")) - (insert ")\n")))) - (message "Couldn't find package desc for %s" (car spec))))) - -(defun doom--generate-var-cache () - (doom-initialize-packages) - (prin1 `(setq load-path ',load-path - auto-mode-alist ',auto-mode-alist - Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages - package-activated-list ',package-activated-list) - (current-buffer))) - -(defun doom--cleanup-package-autoloads () - (while (re-search-forward "^\\s-*\\((\\(?:add-to-list\\|\\(?:when\\|if\\) (boundp\\)\\s-+'\\(?:load-path\\|auto-mode-alist\\)\\)" nil t) - (goto-char (match-beginning 1)) - (kill-sexp))) - -(defun doom-reload-package-autoloads (&optional force-p) - "Compiles `doom-package-autoload-file' from the autoloads files of all -installed packages. It also caches `load-path', `Info-directory-list', -`doom-disabled-packages', `package-activated-list' and `auto-mode-alist'. - -Will do nothing if none of your installed packages have been modified. If -FORCE-P (universal argument) is non-nil, regenerate it anyway. - -This should be run whenever your `doom!' block or update your packages." - (if (and (not force-p) - (not doom-emacs-changed-p) - (file-exists-p doom-package-autoload-file) - (not (file-newer-than-file-p doom-packages-dir doom-package-autoload-file)) - (not (ignore-errors - (cl-loop for key being the hash-keys of (doom-modules) - for path = (doom-module-path (car key) (cdr key) "packages.el") - if (file-newer-than-file-p path doom-package-autoload-file) - return t)))) - (ignore (print! (green "Doom package autoloads is up-to-date")) - (doom-initialize-autoloads doom-package-autoload-file)) - (let (case-fold-search) - (doom-delete-autoloads-file doom-package-autoload-file) - (with-temp-file doom-package-autoload-file - (doom--generate-header 'doom-reload-package-autoloads) - (save-excursion - ;; Cache the important and expensive-to-initialize state here. - (doom--generate-var-cache) - (print! (green "✓ Cached package state")) - ;; Loop through packages and concatenate all their autoloads files. - (doom--generate-package-autoloads) - (print! (green "✓ Package autoloads included"))) - ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, - ;; at least); they are cached later, so all those membership checks are - ;; unnecessary overhead. - (doom--cleanup-package-autoloads) - (print! (green "✓ Removed load-path/auto-mode-alist entries")))) - (doom--byte-compile-file doom-package-autoload-file) - (doom--do-load doom-package-autoload-file) - t)) - - -;; -;; Byte compilation -;; - -(defun doom-byte-compile (&optional modules recompile-p) - "Byte compiles your emacs configuration. - -init.el is always byte-compiled by this. - -If MODULES is specified (a list of module strings, e.g. \"lang/php\"), those are -byte-compiled. Otherwise, all enabled modules are byte-compiled, including Doom -core. It always ignores unit tests and files with `no-byte-compile' enabled. - -WARNING: byte-compilation yields marginal gains and makes debugging new issues -difficult. It is recommended you don't use it unless you understand the -reprecussions. - -Use `doom-clean-byte-compiled-files' or `make clean' to reverse -byte-compilation. - -If RECOMPILE-P is non-nil, only recompile out-of-date files." - (let ((default-directory doom-emacs-dir) - (total-ok 0) - (total-fail 0) - (total-noop 0) - compile-plugins-p - targets) - (dolist (module (delete-dups modules) (nreverse targets)) - (pcase module - (":core" (push doom-core-dir targets)) - (":private" (push doom-private-dir targets)) - (":plugins" - (cl-loop for (name . desc) in (doom-get-package-alist) - do (package--compile desc)) - (setq compile-plugins-p t - modules (delete ":plugins" modules))) - ((pred file-directory-p) - (push module targets)) - ((pred (string-match "^\\([^/]+\\)/\\([^/]+\\)$")) - (push (doom-module-locate-path - (doom-keyword-intern (match-string 1 module)) - (intern (match-string 2 module))) - targets)))) - (cl-block 'byte-compile - ;; If we're just here to byte-compile our plugins, we're done! - (and (not modules) - compile-plugins-p - (cl-return-from 'byte-compile t)) - (unless (or (equal modules '(":core")) - recompile-p) - (unless (and (not doom-auto-accept) - (y-or-n-p - (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" - "efforts to debug issues. It is not recommended you do it if you frequently\n" - "tinker with your Emacs config.\n\n" - "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" - "Doom core files, as these don't change often.\n\n" - "If you have issues, please make sure byte-compilation isn't the cause by using\n" - "`bin/doom clean` to clear out your *.elc files.\n\n" - "Byte-compile anyway?"))) - (message "Aborting.") - (cl-return-from 'byte-compile))) - (and (not recompile-p) - (or (null modules) (equal modules '(":core"))) - (doom-clean-byte-compiled-files)) - (let (doom-emacs-changed-p - noninteractive) - ;; But first we must be sure that Doom and your private config have been - ;; fully loaded. Which usually aren't so in an noninteractive session. - (unless (and (doom-initialize-autoloads doom-autoload-file) - (doom-initialize-autoloads doom-package-autoload-file)) - (doom-reload-autoloads)) - (doom-initialize) - (doom-initialize-modules 'force)) - ;; If no targets were supplied, then we use your module list. - (unless modules - (setq targets (append (list doom-core-dir) - (doom-module-load-path)))) - ;; Assemble el files we want to compile; taking into account that - ;; MODULES may be a list of MODULE/SUBMODULE strings from the command - ;; line. - (let ((target-files (doom-files-in targets :depth 1 :match "\\.el$")) - (load-path load-path) - kill-emacs-hook kill-buffer-query-functions) - (unless target-files - (if targets - (message "Couldn't find any valid targets") - (message "No targets to %scompile" (if recompile-p "re" ""))) - (cl-return-from 'byte-compile)) - (require 'use-package) - (condition-case e - (let ((use-package-defaults use-package-defaults) - (use-package-expand-minimally t)) - ;; Prevent packages from being loaded at compile time if they - ;; don't meet their own predicates. - (push (list :no-require t - (lambda (_name args) - (or (when-let* ((pred (or (plist-get args :if) - (plist-get args :when)))) - (not (eval pred t))) - (when-let* ((pred (plist-get args :unless))) - (eval pred t))))) - use-package-defaults) - ;; Always compile private init file - (push (expand-file-name "init.el" doom-private-dir) target-files) - (push (expand-file-name "init.el" doom-emacs-dir) target-files) - (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) - (if (or (not recompile-p) - (let ((elc-file (byte-compile-dest-file target))) - (and (file-exists-p elc-file) - (file-newer-than-file-p target elc-file)))) - (let ((result (if (or (string-match-p "/\\(?:packages\\|doctor\\)\\.el$" target) - (not (doom--file-cookie-p target))) - 'no-byte-compile - (byte-compile-file target))) - (short-name (if (file-in-directory-p target doom-emacs-dir) - (file-relative-name target doom-emacs-dir) - (abbreviate-file-name target)))) - (cl-incf - (cond ((eq result 'no-byte-compile) - (print! (dark (white "⚠ Ignored %s" short-name))) - total-noop) - ((null result) - (print! (red "✕ Failed to compile %s" short-name)) - total-fail) - (t - (print! (green "✓ Compiled %s" short-name)) - (quiet! (load target t t)) - total-ok)))) - (cl-incf total-noop))) - (print! - (bold - (color (if (= total-fail 0) 'green 'red) - "%s %d/%d file(s) (%d ignored)" - (if recompile-p "Recompiled" "Compiled") - total-ok (- (length target-files) total-noop) - total-noop)))) - ((debug error) - (print! (red "\n%s\n\n%%s" "There were breaking errors.") - "Reverting changes...") - (signal 'doom-error (list 'byte-compile e)))))))) - -(defun doom-clean-byte-compiled-files () - "Delete all the compiled elc files in your Emacs configuration and private -module. This does not include your byte-compiled, third party packages.'" - (cl-loop with default-directory = doom-emacs-dir - for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) - (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) - (doom-files-in doom-core-dir :match "\\.elc$") - (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) - for truepath = (file-truename path) - if (file-exists-p path) - do (delete-file path) - and do - (print! (green "✓ Deleted %%s") - (if (file-in-directory-p truepath default-directory) - (file-relative-name truepath) - (abbreviate-file-name truepath))) - finally do (print! (bold (green "Everything is clean"))))) + 1. Modify your `doom!' block, + 2. Add or remove `package!' blocks to your config, + 3. Add or remove autoloaded functions in module autoloaded files. + 4. Update Doom outside of Doom (e.g. with git)") (provide 'core-cli) ;;; core-cli.el ends here From 309fd767d686247bf9de14a83810ac5533f94788 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 21:52:11 -0400 Subject: [PATCH 3049/4235] Add :deps property to doom-get-packages Also fixes an issue where doom install wouldn't catch missing dependnecies of desired packages. If :dep is non-nil, doom-get-packages will include package dependencies in the resulting package list. --- core/autoload/packages.el | 123 +++++++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 47 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 036a114a6..94b2d4e1b 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -88,6 +88,14 @@ list of the package." (when (version-list-< old-version new-version) (list name old-version new-version))))) +;;;###autoload +(defun doom-package-installed-p (name) + "TODO" + (and (package-installed-p name) + (when-let* ((desc (cadr (assq name package-alist)))) + (let ((dir (package-desc-dir desc))) + (file-directory-p dir))))) + ;;;###autoload (defun doom-package-prop (name prop &optional eval) "Return PROPerty in NAME's plist." @@ -128,7 +136,8 @@ was installed with." (ignored 'any) (sort t) changed - backend) + backend + deps) "Retrieves a list of primary packages (i.e. non-dependencies). Each element is a cons cell, whose car is the package symbol and whose cdr is the quelpa recipe (if any). @@ -149,45 +158,55 @@ properties: :pinned BOOL|ARCHIVE Only return packages that are pinned (t), not pinned (nil) or pinned to a specific archive (stringp) + :deps BOOL + Includes the package's dependencies (t). The resulting list is sorted unless :sort nil is passed to this function. Warning: this function is expensive, as it re-evaluates your all packages.el files." (doom-initialize-packages) - (cl-loop with packages = - (cl-remove-duplicates (append (mapcar #'list doom-core-packages) - doom-packages) - :key #'car) - for (sym . plist) - in (if sort - (cl-sort (copy-sequence packages) #'string-lessp :key #'car) - packages) - if (and (or (not backend) - (eq (doom-package-backend sym t) backend)) - (or (eq ignored 'any) - (let* ((form (plist-get plist :ignore)) - (value (eval form))) - (if ignored value (not value)))) - (or (eq disabled 'any) - (if disabled - (plist-get plist :disable) - (not (plist-get plist :disable)))) - (or (eq installed 'any) - (if installed - (package-installed-p sym) - (not (package-installed-p sym)))) - (or (eq private 'any) - (if private - (plist-get plist :private) - (not (plist-get plist :private)))) - (or (eq pinned 'any) - (cond ((eq pinned 't) - (plist-get plist :pin)) - ((null pinned) - (not (plist-get plist :pin))) - ((equal (plist-get plist :pin) pinned))))) - collect (cons sym plist))) + (cl-remove-duplicates + (cl-loop with packages = (append (mapcar #'list doom-core-packages) + doom-packages) + for (sym . plist) + in (if sort + (cl-sort (copy-sequence packages) #'string-lessp :key #'car) + packages) + if (and (or (not backend) + (eq (doom-package-backend sym t) backend)) + (or (eq ignored 'any) + (let* ((form (plist-get plist :ignore)) + (value (eval form))) + (if ignored value (not value)))) + (or (eq disabled 'any) + (if disabled + (plist-get plist :disable) + (not (plist-get plist :disable)))) + (or (eq installed 'any) + (if installed + (doom-package-installed-p sym) + (not (doom-package-installed-p sym)))) + (or (eq private 'any) + (if private + (plist-get plist :private) + (not (plist-get plist :private)))) + (or (eq pinned 'any) + (cond ((eq pinned 't) + (plist-get plist :pin)) + ((null pinned) + (not (plist-get plist :pin))) + ((equal (plist-get plist :pin) pinned))))) + collect (cons sym plist) + and if (and deps (not (package-built-in-p sym))) + nconc + (cl-loop for pkg in (doom-get-dependencies-for sym 'recursive 'noerror) + if (or (eq installed 'any) + (if installed + (doom-package-installed-p pkg) + (not (doom-package-installed-p pkg)))) + collect (cons pkg (cdr (assq pkg doom-packages))))) + :key #'car)) ;;;###autoload (defun doom-get-package-alist () @@ -207,22 +226,30 @@ objects, in the order of their `package! blocks.'" :from-end t)) ;;;###autoload -(defun doom-get-depending-on (name) +(defun doom-get-depending-on (name &optional noerror) "Return a list of packages that depend on the package named NAME." (cl-check-type name symbol) - (when (package-built-in-p name) - (error "Can't get the dependency tree for built-in packages")) - (if-let* ((desc (cadr (assq name package-alist)))) - (mapcar #'package-desc-name (package--used-elsewhere-p desc nil t)) - (error "Couldn't find %s, is it installed?" name))) + (unless (package-built-in-p name) + (if-let* ((desc (cadr (assq name package-alist)))) + (mapcar #'package-desc-name (package--used-elsewhere-p desc nil t)) + (unless noerror + (error "Couldn't find %s, is it installed?" name))))) ;;;###autoload -(defun doom-get-dependencies-for (name &optional only) +(defun doom-get-dependencies-for (name &optional recursive noerror) "Return a list of dependencies for a package." (cl-check-type name symbol) - (when (package-built-in-p name) - (error "Can't get the dependency tree for built-in packages")) - (package--get-deps name only)) + ;; can't get dependencies for built-in packages + (unless (package-built-in-p name) + (if-let* ((desc (cadr (assq name package-alist)))) + (let* ((deps (mapcar #'car (package-desc-reqs desc))) + (deps (cl-remove-if #'package-built-in-p deps))) + (if recursive + (nconc deps (mapcan (lambda (dep) (doom-get-dependencies-for dep t t)) + deps)) + deps)) + (unless noerror + (error "Couldn't find %s, is it installed?" name))))) ;;;###autoload (defun doom-get-outdated-packages (&optional include-frozen-p) @@ -302,10 +329,12 @@ i.e. they have an :ignore property. Used by `doom-packages-install'." (doom-initialize-packages) (cl-loop for (name . plist) - in (doom-get-packages :ignored (if include-ignored-p 'any) :disabled nil) + in (doom-get-packages :ignored (if include-ignored-p 'any) + :disabled nil + :deps t) if (and (or (plist-get plist :pin) - (not (assq name package--builtins))) - (or (not (assq name package-alist)) + (not (package-built-in-p name))) + (or (not (doom-package-installed-p name)) (doom-package-different-backend-p name) (doom-package-different-recipe-p name))) collect (cons name plist))) From f7ad520ee0b45c8601f10930a4866c1e675ee846 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 21:53:30 -0400 Subject: [PATCH 3050/4235] doom update: prevent GC in async instances Offers a marginal improved to outdated check times. --- 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 94b2d4e1b..721e6ccdb 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -281,7 +281,8 @@ Used by `doom-packages-update'." (message "New thread for: %s" pkg)) (push (async-start `(lambda () - (let ((doom-init-p t) + (let ((gc-cons-threshold ,doom-gc-cons-upper-limit) + (doom-init-p t) (noninteractive t) (load-path ',load-path) (package-alist ',package-alist) From 4d10c28c379a6455ab527cfd8eb6acad1dc92d96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 21:56:07 -0400 Subject: [PATCH 3051/4235] Change doom-ansi-apply, print! & format! Color let-functions no longer take format string arguments. e.g. (format! (red "Hello %s" "world")) Becomes (format! (red "Hello %s") "world") The same goes for print!. Also, doom-ansi-apply now takes two arguments instead of three. Also merges doom-message-{fg,bg,fx} into doom-ansi-alist, and reduces backtrace noise when errors originate from inside these macros. --- core/autoload/message.el | 91 ++++++++++++-------------- core/autoload/packages.el | 6 +- core/cli/packages.el | 7 +- core/test/test-autoload-message.el | 18 ++--- modules/completion/ivy/autoload/ivy.el | 6 +- 5 files changed, 60 insertions(+), 68 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index 3fcdc86a9..6421c839f 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -1,29 +1,8 @@ ;;; core/autoload/message.el -*- lexical-binding: t; -*- -(defconst doom-message-fg - '((black 30 term-color-black) - (red 31 term-color-red) - (green 32 term-color-green) - (yellow 33 term-color-yellow) - (blue 34 term-color-blue) - (magenta 35 term-color-magenta) - (cyan 36 term-color-cyan) - (white 37 term-color-white)) - "List of text colors.") - -(defconst doom-message-bg - '((on-black 40 term-color-black) - (on-red 41 term-color-red) - (on-green 42 term-color-green) - (on-yellow 43 term-color-yellow) - (on-blue 44 term-color-blue) - (on-magenta 45 term-color-magenta) - (on-cyan 46 term-color-cyan) - (on-white 47 term-color-white)) - "List of colors to draw text on.") - -(defconst doom-message-fx - '((bold 1 :weight bold) +(defvar doom-ansi-alist + '(;; fx + (bold 1 :weight bold) (dark 2) (italic 3 :slant italic) (underscore 4 :underline t) @@ -31,48 +10,62 @@ (rapid 6) (contrary 7) (concealed 8) - (strike 9 :strike-through t)) - "List of styles.") + (strike 9 :strike-through t) + ;; fg + (black 30 term-color-black) + (red 31 term-color-red) + (green 32 term-color-green) + (yellow 33 term-color-yellow) + (blue 34 term-color-blue) + (magenta 35 term-color-magenta) + (cyan 36 term-color-cyan) + (white 37 term-color-white) + ;; bg + (on-black 40 term-color-black) + (on-red 41 term-color-red) + (on-green 42 term-color-green) + (on-yellow 43 term-color-yellow) + (on-blue 44 term-color-blue) + (on-magenta 45 term-color-magenta) + (on-cyan 46 term-color-cyan) + (on-white 47 term-color-white)) + "TODO") ;;;###autoload -(defun doom-ansi-apply (code message &rest args) +(defun doom-ansi-apply (style text) "Apply CODE to formatted MESSAGE with ARGS. CODE is derived from any of `doom-message-fg', `doom-message-bg' or `doom-message-fx'. In a noninteractive session, this wraps the result in ansi color codes. Otherwise, it maps colors to a term-color-* face." - (let ((text (apply #'format message args))) + (let ((code (cadr (assq style doom-ansi-alist)))) (if noninteractive (format "\e[%dm%s\e[%dm" - (cadr - (or (assq code doom-message-fg) - (assq code doom-message-bg) - (assq code doom-message-fx))) + (cadr (assq style doom-ansi-alist)) text 0) (require 'term) ; piggyback on term's color faces (propertize text 'face - (let (spec) - (cond ((setq spec (caddr (assq code doom-message-fg))) - `(:foreground ,(face-foreground spec))) - ((setq spec (caddr (assq code doom-message-bg))) - `(:background ,(face-background spec))) - ((cddr (assq code doom-message-fx))))))))) + (append (get-text-property 0 'face text) + (let (spec) + (cond ((>= code 40) + `(:background ,(caddr (assq style doom-ansi-alist)))) + ((>= code 30) + `(:foreground ,(face-foreground (caddr (assq style doom-ansi-alist))))) + ((cddr (assq style doom-ansi-alist)))))))))) ;;;###autoload (defmacro format! (message &rest args) "An alternative to `format' that understands (color ...) and converts them into faces or ANSI codes depending on the type of sesssion we're in." `(cl-flet* - (,@(cl-loop for rule - in (append doom-message-fg doom-message-bg doom-message-fx) - collect - `(,(car rule) - (lambda (message &rest args) - (apply #'doom-ansi-apply ',(car rule) message args)))) + (,@(mapcar (lambda (rule) `(,(car rule) + (lambda (message) + (doom-ansi-apply ',(car rule) message)))) + doom-ansi-alist) (color - (lambda (code format &rest args) - (apply #'doom-ansi-apply code format args)))) + (lambda (code format) + (doom-ansi-apply code format)))) (format ,message ,@args))) ;;;###autoload @@ -82,9 +75,9 @@ standard out). Can be colored using (color ...) blocks: - (print! \"Hello %s %s\" (bold (blue \"How are you?\"))) - (print! \"Hello %s %s\" (red \"World\")) - (print! (green \"Great %s!\" \"success\")) + (print! \"Hello %s\" (bold (blue \"How are you?\"))) + (print! \"Hello %s\" (red \"World\")) + (print! (green \"Great %s!\") \"success\") Uses faces in interactive sessions and ANSI codes otherwise." `(if (not noninteractive) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 721e6ccdb..90f844168 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -17,14 +17,14 @@ `(condition-case-unless-debug e (progn ,@body) ('user-error - (print! (bold (red " NOTICE: %s" e)))) + (print! (bold (red " NOTICE: %s")) e)) ('file-error - (print! (bold (red " FILE ERROR: %s" (error-message-string e)))) + (print! (bold (red " FILE ERROR: %s")) (error-message-string e)) (print! " Trying again...") (quiet! (doom-refresh-packages-maybe t)) ,@body) ('error - (print! (bold (red " FATAL ERROR: %s\n Run again with the -d flag for details" e)))))) + (print! (bold (red " FATAL ERROR: %s\n Run again with the -d flag for details")) e)))) (defun doom--refresh-pkg-cache () "Clear the cache for `doom-refresh-packages-maybe'." diff --git a/core/cli/packages.el b/core/cli/packages.el index 3125c03a1..ed71d5a77 100644 --- a/core/cli/packages.el +++ b/core/cli/packages.el @@ -156,10 +156,9 @@ (doom--condition-case! (let ((result (doom-delete-package pkg t))) (if result (setq success t)) - (print! (color (if result 'green 'red) - "%s %s" - (if result "✓ Removed" "✕ Failed to remove") - pkg))))) + (print! (color (if result 'green 'red) "%s %s") + (if result "✓ Removed" "✕ Failed to remove") + pkg)))) (print! (bold (green "Finished!"))) (when success (set-file-times doom-packages-dir) diff --git a/core/test/test-autoload-message.el b/core/test/test-autoload-message.el index bc8644786..30c20eaa9 100644 --- a/core/test/test-autoload-message.el +++ b/core/test/test-autoload-message.el @@ -11,27 +11,27 @@ :to-equal "Hello World")) (it "supports ansi coloring in noninteractive sessions" - (expect (format! (red "Hello %s" "World")) + (expect (format! (red "Hello %s") "World") :to-equal "Hello World")) (it "supports faces in interactive sessions" (let (noninteractive) - (expect (get-text-property 0 'face (format! (red "Hello %s" "World"))) + (expect (get-text-property 0 'face (format! (red "Hello %s") "World")) :to-equal (list :foreground (face-foreground 'term-color-red))))) (it "supports nested color specs" - (expect (format! (bold (red "Hello %s" "World"))) + (expect (format! (bold (red "Hello %s")) "World") :to-equal (format "\e[%dm%s\e[0m" 1 (format "\e[%dm%s\e[0m" 31 "Hello World"))) - (expect (format! (on-red (bold "Hello %s" "World"))) + (expect (format! (on-red (bold "Hello %s")) "World") :to-equal (format "\e[%dm%s\e[0m" 41 (format "\e[%dm%s\e[0m" 1 "Hello World"))) - (expect (format! (dark (white "Hello %s" "World"))) + (expect (format! (dark (white "Hello %s")) "World") :to-equal (format "\e[%dm%s\e[0m" 2 (format "\e[%dm%s\e[0m" 37 "Hello World")))) (it "supports dynamic color apply syntax" - (expect (format! (color 'red "Hello %s" "World")) - :to-equal (format! (red "Hello %s" "World"))) - (expect (format! (color (if nil 'red 'blue) "Hello %s" "World")) - :to-equal (format! (blue "Hello %s" "World")))))) + (expect (format! (color 'red "Hello %s") "World") + :to-equal (format! (red "Hello %s") "World")) + (expect (format! (color (if nil 'red 'blue) "Hello %s") "World") + :to-equal (format! (blue "Hello %s") "World"))))) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index f7a0b15b9..ddb66d0a7 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -115,9 +115,9 @@ If ARG (universal argument), open selection in other-window." "\\):?\\s-*\\(.+\\)") x) (error - (print! (red "Error matching task in file: (%s) %s" - (error-message-string ex) - (car (split-string x ":")))) + (print! (red "Error matching task in file: (%s) %s") + (error-message-string ex) + (car (split-string x ":"))) nil)) collect `((type . ,(match-string 3 x)) (desc . ,(match-string 4 x)) From f07ae6a02be55a54b16fd6b6659a7b4c29ae72f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 21:58:38 -0400 Subject: [PATCH 3052/4235] max-specpdl-size = 5000, max-lisp-eval-depth = 2500 The defaults were designed for much, much older systems. We can safely increase this to stave off premature abortion of intentional deeply nested loops or excessive allocations. --- core/core.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 91531e739..8a1929de9 100644 --- a/core/core.el +++ b/core/core.el @@ -259,7 +259,10 @@ and `doom-exit-window-hook'." tramp-persistency-file-name (concat doom-cache-dir "tramp-persistency.el") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/") - gamegrid-user-score-file-directory (concat doom-etc-dir "games/")) + gamegrid-user-score-file-directory (concat doom-etc-dir "games/") + ;; The defaults for these are conservative, we can increase them + max-specpdl-size 5000 + max-lisp-eval-depth 2500) (defvar doom-auto-minor-mode-alist '() "Alist mapping filename patterns to corresponding minor mode functions, like From 18554ca5b52ecb283273f72a70eb518a8c274919 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 22:02:41 -0400 Subject: [PATCH 3053/4235] feature/evil: extract advice functions Into its own autoloads file, for better organization. --- modules/feature/evil/autoload/advice.el | 179 ++++++++++++++++++++++++ modules/feature/evil/autoload/evil.el | 155 ++------------------ modules/feature/evil/config.el | 57 +------- 3 files changed, 195 insertions(+), 196 deletions(-) create mode 100644 modules/feature/evil/autoload/advice.el diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el new file mode 100644 index 000000000..8f9a97158 --- /dev/null +++ b/modules/feature/evil/autoload/advice.el @@ -0,0 +1,179 @@ +;;; feature/evil/autoload/advice.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +evil*insert-newline-below-and-respect-comments (orig-fn count) + (if (or (not +evil-want-o/O-to-continue-comments) + (not (eq this-command 'evil-open-below)) + (evil-insert-state-p)) + (funcall orig-fn count) + (cl-letf (((symbol-function 'evil-insert-newline-below) + (lambda () + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (evil-move-end-of-line) + (require 'smartparens) + (cond ((sp-point-in-comment pos) + (setq evil-auto-indent nil) + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line))) + (t + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation)))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count))))) + +;;;###autoload +(defun +evil*insert-newline-above-and-respect-comments (orig-fn count) + (if (or (not +evil-want-o/O-to-continue-comments) + (not (eq this-command 'evil-open-above)) + (evil-insert-state-p)) + (funcall orig-fn count) + (cl-letf (((symbol-function 'evil-insert-newline-above) + (lambda () + (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (evil-narrow-to-field + (require 'smartparens) + (if (save-excursion (nth 4 (sp--syntax-ppss pos))) + (evil-save-goal-column + (setq evil-auto-indent nil) + (goto-char pos) + (let ((ws (abs (skip-chars-backward " \t")))) + ;; FIXME oh god why + (save-excursion + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line)) + (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) + (eq (char-after) ?/)) + (insert "*")) + (insert + (make-string (max 0 (+ ws (skip-chars-backward " \t"))) + 32))) + (insert (make-string (max 1 ws) 32)))) + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation))))))) + (let ((evil-auto-indent evil-auto-indent)) + (funcall orig-fn count))))) + +;;;###autoload +(defun +evil*static-reindent (orig-fn &rest args) + "Don't move cursor on indent." + (save-excursion (apply orig-fn args))) + +;;;###autoload +(defun +evil*resolve-vim-path (file-name) + "Take a path and resolve any vim-like filename modifiers in it. This adds +support for most vim file modifiers, as well as: + + %:P Resolves to `doom-project-root'. + +See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for +more information on modifiers." + (let* (case-fold-search + (regexp (concat "\\(?:^\\|[^\\\\]\\)" + "\\([#%]\\)" + "\\(\\(?::\\(?:[PphtreS~.]\\|g?s[^:\t\n ]+\\)\\)*\\)")) + (matches + (cl-loop with i = 0 + while (and (< i (length file-name)) + (string-match regexp file-name i)) + do (setq i (1+ (match-beginning 0))) + and collect + (cl-loop for j to (/ (length (match-data)) 2) + collect (match-string j file-name))))) + (dolist (match matches) + (let ((flags (split-string (car (cdr (cdr match))) ":" t)) + (path (and buffer-file-name + (pcase (car (cdr match)) + ("%" (file-relative-name buffer-file-name)) + ("#" (save-excursion (other-window 1) (file-relative-name buffer-file-name)))))) + flag global) + (if (not path) + (setq path "") + (while flags + (setq flag (pop flags)) + (when (string-suffix-p "\\" flag) + (setq flag (concat flag (pop flags)))) + (when (string-prefix-p "gs" flag) + (setq global t + flag (substring flag 1))) + (setq path + (or (pcase (substring flag 0 1) + ("p" (expand-file-name path)) + ("~" (concat "~/" (file-relative-name path "~"))) + ("." (file-relative-name path default-directory)) + ("t" (file-name-nondirectory (directory-file-name path))) + ("r" (file-name-sans-extension path)) + ("e" (file-name-extension path)) + ("S" (shell-quote-argument path)) + ("h" + (let ((parent (file-name-directory (expand-file-name path)))) + (unless (equal (file-truename path) + (file-truename parent)) + (if (file-name-absolute-p path) + (directory-file-name parent) + (file-relative-name parent))))) + ("s" + (if (featurep 'evil) + (when-let* ((args (evil-delimited-arguments (substring flag 1) 2))) + (let ((pattern (evil-transform-vim-style-regexp (car args))) + (replace (cadr args))) + (replace-regexp-in-string + (if global pattern (concat "\\(" pattern "\\).*\\'")) + (evil-transform-vim-style-regexp replace) path t t + (unless global 1)))) + path)) + ("P" + (let ((default-directory (file-name-directory (expand-file-name path)))) + (abbreviate-file-name (doom-project-root)))) + (_ path)) + ""))) + ;; strip trailing slash, if applicable + (when (and (not (string= path "")) (equal (substring path -1) "/")) + (setq path (substring path 0 -1)))) + (setq file-name + (replace-regexp-in-string (format "\\(?:^\\|[^\\\\]\\)\\(%s\\)" + (regexp-quote (string-trim-left (car match)))) + path file-name t t 1)))) + (replace-regexp-in-string regexp "\\1" file-name t))) + +;;;###autoload (autoload '+evil*window-split "feature/evil/autoload/advice" nil t) +(evil-define-command +evil*window-split (&optional count file) + "Same as `evil-window-split', but focuses (and recenters) the new split." + :repeat nil + (interactive "P") + (split-window (selected-window) count + (if evil-split-window-below 'above 'below)) + (call-interactively + (if evil-split-window-below + #'evil-window-up + #'evil-window-down)) + (recenter) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (if file (evil-edit file))) + +;;;###autoload (autoload '+evil*window-vsplit "feature/evil/autoload/advice" nil t) +(evil-define-command +evil*window-vsplit (&optional count file) + "Same as `evil-window-vsplit', but focuses (and recenters) the new split." + :repeat nil + (interactive "P") + (split-window (selected-window) count + (if evil-vsplit-window-right 'left 'right)) + (call-interactively + (if evil-vsplit-window-right + #'evil-window-left + #'evil-window-right)) + (recenter) + (when (and (not count) evil-auto-balance-windows) + (balance-windows (window-parent))) + (if file (evil-edit file))) + +;;;###autoload +(defun +evil*escape (&rest _) + "Call `doom/escape' if `evil-force-normal-state' is called interactively." + (when (called-interactively-p 'any) + (call-interactively #'doom/escape))) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index f15c13b11..8893d5a94 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -100,6 +100,21 @@ evil-window-move-* (e.g. `evil-window-move-far-left')" ;;;###autoload (defun +evil/window-move-down () "See `+evil--window-swap'" (interactive) (+evil--window-swap 'down)) +;;;###autoload +(defun +evil/easymotion () + "Invoke and lazy-load `evil-easymotion' without compromising which-key +integration." + (interactive) + (let ((prefix (this-command-keys))) + (evil-define-key* 'motion 'global prefix nil) + (evilem-default-keybindings prefix) + (which-key-reload-key-sequence + (vconcat (when evil-this-operator + (where-is-internal evil-this-operator + evil-normal-state-map + t)) + prefix)))) + ;; ;; Evil commands/operators @@ -243,143 +258,3 @@ the first match on each line)." (goto-char beg) (call-interactively #'wgrep-mark-deletion)) beg (1- end) nil)))) - - -;; -;; Advice -;; - -;;;###autoload -(defun +evil*static-reindent (orig-fn &rest args) - "Don't move cursor on indent." - (save-excursion (apply orig-fn args))) - -;;;###autoload -(defun +evil*resolve-vim-path (file-name) - "Take a path and resolve any vim-like filename modifiers in it. This adds -support for most vim file modifiers, as well as: - - %:P Resolves to `doom-project-root'. - -See http://vimdoc.sourceforge.net/htmldoc/cmdline.html#filename-modifiers for -more information on modifiers." - (let* (case-fold-search - (regexp (concat "\\(?:^\\|[^\\\\]\\)" - "\\([#%]\\)" - "\\(\\(?::\\(?:[PphtreS~.]\\|g?s[^:\t\n ]+\\)\\)*\\)")) - (matches - (cl-loop with i = 0 - while (and (< i (length file-name)) - (string-match regexp file-name i)) - do (setq i (1+ (match-beginning 0))) - and collect - (cl-loop for j to (/ (length (match-data)) 2) - collect (match-string j file-name))))) - (dolist (match matches) - (let ((flags (split-string (car (cdr (cdr match))) ":" t)) - (path (and buffer-file-name - (pcase (car (cdr match)) - ("%" (file-relative-name buffer-file-name)) - ("#" (save-excursion (other-window 1) (file-relative-name buffer-file-name)))))) - flag global) - (if (not path) - (setq path "") - (while flags - (setq flag (pop flags)) - (when (string-suffix-p "\\" flag) - (setq flag (concat flag (pop flags)))) - (when (string-prefix-p "gs" flag) - (setq global t - flag (substring flag 1))) - (setq path - (or (pcase (substring flag 0 1) - ("p" (expand-file-name path)) - ("~" (concat "~/" (file-relative-name path "~"))) - ("." (file-relative-name path default-directory)) - ("t" (file-name-nondirectory (directory-file-name path))) - ("r" (file-name-sans-extension path)) - ("e" (file-name-extension path)) - ("S" (shell-quote-argument path)) - ("h" - (let ((parent (file-name-directory (expand-file-name path)))) - (unless (equal (file-truename path) - (file-truename parent)) - (if (file-name-absolute-p path) - (directory-file-name parent) - (file-relative-name parent))))) - ("s" - (if (featurep 'evil) - (when-let* ((args (evil-delimited-arguments (substring flag 1) 2))) - (let ((pattern (evil-transform-vim-style-regexp (car args))) - (replace (cadr args))) - (replace-regexp-in-string - (if global pattern (concat "\\(" pattern "\\).*\\'")) - (evil-transform-vim-style-regexp replace) path t t - (unless global 1)))) - path)) - ("P" - (let ((default-directory (file-name-directory (expand-file-name path)))) - (abbreviate-file-name (doom-project-root)))) - (_ path)) - ""))) - ;; strip trailing slash, if applicable - (when (and (not (string= path "")) (equal (substring path -1) "/")) - (setq path (substring path 0 -1)))) - (setq file-name - (replace-regexp-in-string (format "\\(?:^\\|[^\\\\]\\)\\(%s\\)" - (regexp-quote (string-trim-left (car match)))) - path file-name t t 1)))) - (replace-regexp-in-string regexp "\\1" file-name t))) - -;;;###autoload (autoload '+evil*window-split "feature/evil/autoload/evil" nil t) -(evil-define-command +evil*window-split (&optional count file) - "Same as `evil-window-split', but focuses (and recenters) the new split." - :repeat nil - (interactive "P") - (split-window (selected-window) count - (if evil-split-window-below 'above 'below)) - (call-interactively - (if evil-split-window-below - #'evil-window-up - #'evil-window-down)) - (recenter) - (when (and (not count) evil-auto-balance-windows) - (balance-windows (window-parent))) - (if file (evil-edit file))) - -;;;###autoload (autoload '+evil*window-vsplit "feature/evil/autoload/evil" nil t) -(evil-define-command +evil*window-vsplit (&optional count file) - "Same as `evil-window-vsplit', but focuses (and recenters) the new split." - :repeat nil - (interactive "P") - (split-window (selected-window) count - (if evil-vsplit-window-right 'left 'right)) - (call-interactively - (if evil-vsplit-window-right - #'evil-window-left - #'evil-window-right)) - (recenter) - (when (and (not count) evil-auto-balance-windows) - (balance-windows (window-parent))) - (if file (evil-edit file))) - -;;;###autoload -(defun +evil*escape (&rest _) - "Call `doom/escape' if `evil-force-normal-state' is called interactively." - (when (called-interactively-p 'any) - (call-interactively #'doom/escape))) - -;;;###autoload -(defun +evil/easymotion () - "Invoke and lazy-load `evil-easymotion' without compromising which-key -integration." - (interactive) - (let ((prefix (this-command-keys))) - (evil-define-key* 'motion 'global prefix nil) - (evilem-default-keybindings prefix) - (which-key-reload-key-sequence - (vconcat (when evil-this-operator - (where-is-internal evil-this-operator - evil-normal-state-map - t)) - prefix)))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 4ea48d95e..6d804abd2 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -137,63 +137,8 @@ line with a linewise comment.") (funcall orig-fn char))) (advice-add #'evil-global-marker-p :around #'+evil*make-numbered-markers-global) - ;; Make o/O continue comments - (defun +evil*insert-newline-above-and-respect-comments (orig-fn count) - (if (or (not +evil-want-o/O-to-continue-comments) - (not (eq this-command 'evil-open-above)) - (evil-insert-state-p)) - (funcall orig-fn count) - (cl-letf (((symbol-function 'evil-insert-newline-above) - (lambda () - (let ((pos (save-excursion (beginning-of-line-text) (point)))) - (evil-narrow-to-field - (require 'smartparens) - (if (save-excursion (nth 4 (sp--syntax-ppss pos))) - (evil-save-goal-column - (setq evil-auto-indent nil) - (goto-char pos) - (let ((ws (abs (skip-chars-backward " \t")))) - ;; FIXME oh god why - (save-excursion - (if comment-line-break-function - (funcall comment-line-break-function) - (comment-indent-new-line)) - (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) - (eq (char-after) ?/)) - (insert "*")) - (insert - (make-string (max 0 (+ ws (skip-chars-backward " \t"))) - 32))) - (insert (make-string (max 1 ws) 32)))) - (evil-move-beginning-of-line) - (insert (if use-hard-newlines hard-newline "\n")) - (forward-line -1) - (back-to-indentation))))))) - (let ((evil-auto-indent evil-auto-indent)) - (funcall orig-fn count))))) + ;; Make o/O continue comments (see `+evil-want-o/O-to-continue-comments') (advice-add #'evil-open-above :around #'+evil*insert-newline-above-and-respect-comments) - - (defun +evil*insert-newline-below-and-respect-comments (orig-fn count) - (if (or (not +evil-want-o/O-to-continue-comments) - (not (eq this-command 'evil-open-below)) - (evil-insert-state-p)) - (funcall orig-fn count) - (cl-letf (((symbol-function 'evil-insert-newline-below) - (lambda () - (let ((pos (save-excursion (beginning-of-line-text) (point)))) - (evil-narrow-to-field - (evil-move-end-of-line) - (require 'smartparens) - (cond ((sp-point-in-comment pos) - (setq evil-auto-indent nil) - (if comment-line-break-function - (funcall comment-line-break-function) - (comment-indent-new-line))) - (t - (insert (if use-hard-newlines hard-newline "\n")) - (back-to-indentation)))))))) - (let ((evil-auto-indent evil-auto-indent)) - (funcall orig-fn count))))) (advice-add #'evil-open-below :around #'+evil*insert-newline-below-and-respect-comments) ;; --- custom interactive codes ----------- From 89b83f2457549c2a53a45a53808f5a5edf442bcf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 22:03:24 -0400 Subject: [PATCH 3054/4235] Enable evil-escape-mode I know this is redundant with the pre-command-hook hook, but the hook allows us to lazy load the package, and the mode allows other modes (or the user) to interactively disable it. For example, evil-mc disabled it while cursors are active due to incompatibility. This isn't possible if the mode isn't enabled to begin with. --- modules/feature/evil/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 6d804abd2..4af92139a 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -257,7 +257,9 @@ line with a linewise comment.") (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config ;; no `evil-escape' in minibuffer - (add-hook 'evil-escape-inhibit-functions #'minibufferp)) + (add-hook 'evil-escape-inhibit-functions #'minibufferp) + ;; so that evil-escape-mode-hook runs, and can be toggled by evil-mc + (evil-escape-mode +1)) (def-package! evil-exchange From c58077810d885ec5c6c095fc5f78a77a7864bda3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Sep 2018 22:08:11 -0400 Subject: [PATCH 3055/4235] General refactor of modules General code and comment improvements. Also, removed the :desc's for csv-mode because map! is currently unable to set which-key descriptions mode-locally, and should be avoided for anything but global keybinds. This will be fixed when General is introduced into Doom. --- modules/editor/format/autoload/evil.el | 4 +-- modules/feature/snippets/autoload/snippets.el | 5 ++-- modules/lang/cc/autoload.el | 23 +++++++++-------- modules/lang/cc/config.el | 4 +++ modules/lang/crystal/config.el | 7 +++--- modules/lang/csharp/config.el | 7 +++--- modules/lang/data/config.el | 25 +++++++++---------- modules/lang/emacs-lisp/autoload.el | 3 ++- modules/lang/javascript/config.el | 5 ++-- modules/lang/javascript/packages.el | 2 -- modules/lang/lua/config.el | 4 +-- modules/lang/python/config.el | 4 ++- modules/lang/web/+html.el | 2 +- modules/lang/web/packages.el | 14 ++++------- modules/tools/editorconfig/config.el | 7 +++--- 15 files changed, 59 insertions(+), 57 deletions(-) diff --git a/modules/editor/format/autoload/evil.el b/modules/editor/format/autoload/evil.el index 298056f47..c84caa83b 100644 --- a/modules/editor/format/autoload/evil.el +++ b/modules/editor/format/autoload/evil.el @@ -2,7 +2,7 @@ ;;;###if (featurep! :feature evil) ;;;###autoload (autoload '+format:region "editor/format/autoload/evil" nil t) -(evil-define-operator +format:region (beg end type) +(evil-define-operator +format:region (beg end) "Evil ex interface to `+format/region'." - (interactive "") + (interactive "") (+format/region beg end)) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index ce7518cac..ff6ef9f2f 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -22,8 +22,9 @@ ignored. This makes it easy to override built-in snippets with private ones." (let* ((gc-cons-threshold doom-gc-cons-upper-limit) (choices (cl-remove-duplicates choices :test #'+snippets--remove-p))) (if (cdr choices) - (let ((prompt-functions (remq '+snippets-prompt-private yas-prompt-functions))) - (run-hook-with-args-until-success 'prompt-functions prompt choices fn)) + (cl-loop for fn in (cdr (memq '+snippets-prompt-private yas-prompt-functions)) + if (funcall prompt choices fn) + return it) (car choices))))) ;;;###autoload diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index d1da3d579..9da91b052 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -27,14 +27,14 @@ ;;;###autoload (defun +cc-c++-lineup-inclass (langelem) "Indent inclass lines one level further than access modifier keywords." - (when (and (eq major-mode 'c++-mode) - (or (assoc 'access-label c-syntactic-context) - (save-excursion - (save-match-data - (re-search-backward - "\\(?:p\\(?:ublic\\|r\\(?:otected\\|ivate\\)\\)\\)" - (c-langelem-pos langelem) t))))) - '++)) + (and (eq major-mode 'c++-mode) + (or (assoc 'access-label c-syntactic-context) + (save-excursion + (save-match-data + (re-search-backward + "\\(?:p\\(?:ublic\\|r\\(?:otected\\|ivate\\)\\)\\)" + (c-langelem-pos langelem) t)))) + '++)) ;;;###autoload (defun +cc-lineup-arglist-close (langlem) @@ -55,10 +55,9 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." (re-search-forward regexp magic-mode-regexp-match-limit t))))) ;;;###autoload -(defun +cc-c-c++-objc-mode (&optional file) +(defun +cc-c-c++-objc-mode () "Sets either `c-mode', `objc-mode' or `c++-mode', whichever is appropriate." - (let ((base (file-name-sans-extension buffer-file-name)) - file) + (let ((base (file-name-sans-extension (buffer-file-name (buffer-base-buffer))))) (cond ((file-exists-p! (or (concat base ".cpp") (concat base ".cc"))) (c++-mode)) @@ -83,6 +82,8 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." "\\|" "#include" ws-maybe "<\\(?:string\\|iostream\\|map\\)>" "\\)"))) (c++-mode)) + ((functionp +cc-default-header-file-mode) + (funcall +cc-default-header-file-mode)) ((c-mode))))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 189e77fca..d17554eba 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -5,6 +5,10 @@ C/C++. Paths can be absolute. This is ignored if your project has a compilation database.") +(defvar +cc-default-header-file-mode 'c-mode + "Fallback major mode for .h files if all other heuristics fail (in +`+cc-c-c++-objc-mode').") + (defvar +cc-default-compiler-options `((c-mode . nil) (c++-mode diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index c1e219f45..d75ed9b3a 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -1,8 +1,6 @@ ;;; lang/crystal/config.el -*- lexical-binding: t; -*- -(def-package! crystal-mode - :defer t - :config +(after! crystal-mode (set-lookup-handlers! 'crystal-mode :definition #'crystal-def-jump :references #'crystal-tool-imp) @@ -17,4 +15,5 @@ :after crystal-mode) -(def-package! inf-crystal :commands crystal-switch-to-inf) +(def-package! inf-crystal + :commands crystal-switch-to-inf) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index f8927b350..b12521463 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,6 +1,6 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- -;; unity shaders +;; `shader-mode' --- unity shaders (add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) @@ -15,9 +15,10 @@ "Clean up the omnisharp server once you kill the last csharp-mode buffer." (unless (doom-buffers-in-mode 'csharp-mode (buffer-list)) (omnisharp-stop-server))) - (add-hook! csharp-mode (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) + (add-hook! csharp-mode + (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) - (set-company-backend! 'csharp-mode '(company-omnisharp)) + (set-company-backend! 'csharp-mode 'company-omnisharp) (set-lookup-handlers! 'csharp-mode :definition #'omnisharp-go-to-definition diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 6314281c5..fef54fb72 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -1,28 +1,27 @@ ;;; lang/data/config.el -*- lexical-binding: t; -*- ;; Built in plugins -(unless after-init-time - (push '("/sxhkdrc\\'" . conf-mode) auto-mode-alist) - (push '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode) auto-mode-alist) - (push '("\\.plist\\'" . nxml-mode) auto-mode-alist)) +(add-to-list 'auto-mode-alist '("/sxhkdrc\\'" . conf-mode)) +(add-to-list 'auto-mode-alist '("\\.\\(?:hex\\|nes\\)\\'" . hexl-mode)) +(add-to-list 'auto-mode-alist '("\\.plist\\'" . nxml-mode)) (after! nxml-mode (set-company-backend! 'nxml-mode '(company-nxml company-yasnippet))) -;; Third-party plugins ;; +;; Third-party plugins ;; `csv-mode' (map! :after csv-mode :map csv-mode-map - (:localleader - :desc "Align fields" :nvm "a" #'csv-align-fields - :desc "Unalign fields" :nvm "u" #'csv-unalign-fields - :desc "Sort fields" :nvm "s" #'csv-sort-fields - :desc "Sort fields (n)" :nvm "S" #'csv-sort-numeric-fields - :desc "Kill fields" :nvm "k" #'csv-kill-fields - :desc "Transpose fields" :nvm "t" #'csv-transpose)) + :localleader + :nvm "a" #'csv-align-fields + :nvm "u" #'csv-unalign-fields + :nvm "s" #'csv-sort-fields + :nvm "S" #'csv-sort-numeric-fields + :nvm "k" #'csv-kill-fields + :nvm "t" #'csv-transpose) (def-package! graphql-mode :mode "\\.gql\\'") @@ -36,8 +35,8 @@ :mode "\\.?vimperatorrc\\'") -;; Frameworks ;; +;; Frameworks (def-project-mode! +data-ansible-mode :modes (yaml-mode) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 3d743fdc0..98309b8fd 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -16,7 +16,8 @@ to a pop up buffer." (read-only-mode +1) (erase-buffer) (setq-local scroll-margin 0) - (delay-mode-hooks (emacs-lisp-mode)) + (let (emacs-lisp-mode-hook) + (emacs-lisp-mode)) (prin1 result buf) (pp-buffer) (setq lines (count-lines (point-min) (point-max))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 77c107b97..d93f1e936 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -29,7 +29,6 @@ ;; ;; Major modes -;; (def-package! js2-mode :mode "\\.js\\'" @@ -125,7 +124,6 @@ ;; ;; Tools -;; (def-package! tide :defer t @@ -211,6 +209,7 @@ :localleader :n "se" #'skewer-html-eval-tag)) + ;; `npm-mode' (map! :after npm-mode :map npm-mode-keymap @@ -224,9 +223,9 @@ :n "nr" #'npm-mode-npm-run :n "nv" #'npm-mode-visit-project-file) + ;; ;; Projects -;; (def-project-mode! +javascript-npm-mode :modes (html-mode css-mode web-mode js2-mode rjsx-mode json-mode markdown-mode) diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index 9d4723a73..e281c0b8f 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -1,8 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/javascript/packages.el -;; requires node npm js-beautify eslint eslint-plugin-react - (package! coffee-mode) (package! eslintd-fix) (package! js2-mode) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 90ce581a3..a951c3067 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -11,8 +11,8 @@ (set-company-backend! 'lua-mode '(company-lua company-yasnippet))) -(after! moonscript - (defvaralias 'moonscript-indent-offset 'tab-width)) +;; `moonscript' +(setq-hook! 'moonscript-mode-hook moonscript-indent-offset tab-width) ;; diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 6485698b1..8fc520268 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -42,7 +42,9 @@ (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens (sp-with-modes 'python-mode - (sp-local-pair "'" nil :unless '(sp-point-before-word-p sp-point-after-word-p sp-point-before-same-p))) + (sp-local-pair "'" nil :unless '(sp-point-before-word-p + sp-point-after-word-p + sp-point-before-same-p))) (when (featurep! +ipython) (setq python-shell-interpreter "ipython" diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index e5d70fa86..dc87b688c 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -23,7 +23,7 @@ '("tidy" "-q" "-indent" "--tidy-mark" "no" "--drop-empty-elements" "no" - "--show-body-only" "auto" + "--show-body-only" "auto" ; don't inject html/body tags ("--indent-spaces" "%d" tab-width) ("--indent-with-tabs" "%s" (if indent-tabs-mode "yes" "no")) ("-xml" (memq major-mode '(nxml-mode xml-mode)))) diff --git a/modules/lang/web/packages.el b/modules/lang/web/packages.el index 84dd794cf..553bc6111 100644 --- a/modules/lang/web/packages.el +++ b/modules/lang/web/packages.el @@ -1,14 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/web/packages.el -;; requires js-beautify stylelint stylelint-scss - -(package! rainbow-mode) -(when (featurep! :completion ivy) - (package! counsel-css)) -(when (featurep! :completion helm) - (package! helm-css-scss)) - ;; +html.el (package! emmet-mode) (package! haml-mode) @@ -22,4 +14,8 @@ (package! less-css-mode) (package! sass-mode) (package! stylus-mode) - +(package! rainbow-mode) +(when (featurep! :completion ivy) + (package! counsel-css)) +(when (featurep! :completion helm) + (package! helm-css-scss)) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 908ee1927..99c6f2ec0 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -29,7 +29,7 @@ (enh-ruby-mode enh-ruby-indent-level)) editorconfig-indentation-alist))) - (defun doom*editorconfig-smart-detection (orig-fn &rest args) + (defun doom*editorconfig-smart-detection (orig-fn) "Retrieve the properties for the current file. If it doesn't have an extension, try to guess one." (let ((buffer-file-name @@ -40,12 +40,13 @@ extension, try to guess one." (if-let* ((ext (cdr (assq major-mode +editorconfig-mode-alist)))) (concat "." ext) ""))))) - (apply orig-fn args))) + (funcall orig-fn))) (advice-add #'editorconfig-call-editorconfig-exec :around #'doom*editorconfig-smart-detection) (defun +editorconfig|disable-ws-butler-maybe (props) "Disable `ws-butler-mode' if trim_trailing_whitespace is true." - (when (equal (gethash 'trim_trailing_whitespace props) "true") + (when (and (equal (gethash 'trim_trailing_whitespace props) "true") + (bound-and-true-p ws-butler-mode)) (ws-butler-mode -1))) (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-ws-butler-maybe) From bd28eea778a5d606aed1940c0274452fd646daff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:10:49 -0400 Subject: [PATCH 3056/4235] feature/evil: remove <> opener/closers And remove unnecessary def-package block. These commands are already autoloaded by the package. --- modules/feature/evil/config.el | 9 --------- 1 file changed, 9 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 4af92139a..9ab3d96e1 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -345,14 +345,5 @@ the new algorithm is confusing, like in python or ruby." ;; ;; Text object plugins -(def-package! evil-args - :commands (evil-inner-arg evil-outer-arg - evil-forward-arg evil-backward-arg - evil-jump-out-args) - :config - (unless (member "<" evil-args-openers) - (push "<" evil-args-openers) - (push ">" evil-args-closers))) - (def-package! exato :commands (evil-outer-xml-attr evil-inner-xml-attr)) From 22a94fc41a14fed1ef8cbeea5433aa286c649446 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:20:40 -0400 Subject: [PATCH 3057/4235] Make helm/ivy project search api more consistent +{helm,ivy}/*-from-cwd no longer accepts a third DIRECTORY argument. --- modules/completion/helm/autoload/helm.el | 14 +++++++------- modules/completion/ivy/autoload/ivy.el | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 422ed99a7..015e6792a 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -182,9 +182,9 @@ Uses the first available search backend from `+helm-project-search-engines'. If ALL-FILES-P (universal argument), include all files, even hidden or compressed ones, in the search." (interactive "P") - (call-interactively - (or (+helm--get-command "+helm/%s") - #'+helm/grep))) + (funcall (or (+helm--get-command "+helm/%s") + #'+helm/grep) + (or all-files-p current-prefix-arg))) ;;;###autoload (defun +helm/project-search-from-cwd (&optional all-files-p) @@ -194,9 +194,9 @@ Uses the first available search backend from `+helm-project-search-engines'. If ALL-FILES-P (universal argument), include all files, even hidden or compressed ones." (interactive "P") - (call-interactively - (or (+helm--get-command "+helm/%s-from-cwd") - #'+helm/grep-from-cwd))) + (funcall (or (+helm--get-command "+helm/%s-from-cwd") + #'+helm/grep-from-cwd) + (or all-files-p current-prefix-arg))) ;; Relative to project root @@ -223,7 +223,7 @@ If ALL-FILES-P, search compressed and hidden files as well." engine)) (defalias (intern (format "+helm/%s-from-cwd" engine)) - (lambda (all-files-p &optional query directory) + (lambda (all-files-p &optional query) (interactive "P") (+helm-file-search engine :query query :in default-directory :all-files all-files-p)) (format "Perform a project file search from the current directory using %s. diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index ddb66d0a7..b0789b78c 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -314,9 +314,9 @@ Uses the first available search backend from `+ivy-project-search-engines'. If ALL-FILES-P (universal argument), include all files, even hidden or compressed ones, in the search." (interactive "P") - (call-interactively - (or (+ivy--get-command "+ivy/%s") - #'+ivy/grep))) + (funcall (or (+helm--get-command "+ivy/%s") + #'+ivy/grep) + (or all-files-p current-prefix-arg))) ;;;###autoload (defun +ivy/project-search-from-cwd (&optional all-files-p) @@ -326,9 +326,9 @@ Uses the first available search backend from `+ivy-project-search-engines'. If ALL-FILES-P (universal argument), include all files, even hidden or compressed ones." (interactive "P") - (call-interactively - (or (+ivy--get-command "+ivy/%s-from-cwd") - #'+ivy/grep-from-cwd))) + (funcall (or (+helm--get-command "+ivy/%s-from-cwd") + #'+ivy/grep-from-cwd) + (or all-files-p current-prefix-arg))) ;; Relative to project root @@ -355,7 +355,7 @@ If ALL-FILES-P, search compressed and hidden files as well." engine)) (defalias (intern (format "+ivy/%s-from-cwd" engine)) - (lambda (all-files-p &optional query directory) + (lambda (all-files-p &optional query) (interactive "P") (+ivy-file-search engine :query query :in default-directory :all-files all-files-p)) (format "Perform a project file search from the current directory using %s. From 1b172e9f43ff7d4ab8629af8cf214878d2da967b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:22:41 -0400 Subject: [PATCH 3058/4235] Better enh-ruby-mode suport in doom/describe-module & editorconfig + Associates enh-ruby-mode with :lang ruby for doom/describe-module + Enables editorconfig to detect extension-less or file-less ruby files (from shebang lines or file local variables). --- core/autoload/help.el | 1 + modules/tools/editorconfig/config.el | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 6f2d4d8d0..c30be5e94 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -28,6 +28,7 @@ (python-mode :lang python) (restclient-mode :lang rest) (ruby-mode :lang ruby) + (enh-ruby-mode :lang ruby) (rust-mode :lang rust) (scala-mode :lang scala) (sh-mode :lang sh) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 99c6f2ec0..33b99b936 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -5,11 +5,12 @@ ;; major mode to drop editorconfig a hint? This is accomplished by temporarily ;; appending an extension to `buffer-file-name' when we talk to editorconfig. (defvar +editorconfig-mode-alist - '((sh-mode . "sh") - (python-mode . "py") - (ruby-mode . "rb") - (perl-mode . "pl") - (php-mode . "php")) + '((sh-mode . "sh") + (python-mode . "py") + (ruby-mode . "rb") + (enh-ruby-mode . "rb") + (perl-mode . "pl") + (php-mode . "php")) "An alist mapping major modes to extensions. Used by `doom*editorconfig-smart-detection' to give editorconfig filetype hints.") From 001f90df2f6fa094520c5a12a7bccd0407d8c706 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:35:45 -0400 Subject: [PATCH 3059/4235] lang/web: update set-docsets! & general refactor --- modules/lang/web/+css.el | 56 +++++++++++++++++---------------------- modules/lang/web/+html.el | 2 +- 2 files changed, 25 insertions(+), 33 deletions(-) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 655d7a4b3..04a0ed3fc 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -1,8 +1,5 @@ ;;; lang/web/+css.el -*- lexical-binding: t; -*- -(defvar +web-css-docsets '("CSS" "HTML" "Bourbon" "Compass") - "TODO") - ;; An improved newline+continue comment function (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) @@ -10,17 +7,33 @@ :localleader :n "rb" #'+css/toggle-inline-or-block) +(after! (:any css-mode sass-mode) + (set-docsets! '(css-mode scss-mode sass-mode) + "CSS" "HTML" "Bourbon" "Compass" + ["Sass" (memq major-mode '(scss-mode sass-mode))])) + ;; -;; Packages +;; Major modes + +(add-hook! (css-mode sass-mode stylus-mode) #'rainbow-mode) + +(after! css-mode ; built-in -- contains both css-mode & scss-mode + ;; css-mode hooks apply to scss and less-css modes + (add-hook 'css-mode-hook #'rainbow-delimiters-mode) + (unless EMACS26+ + ;; css-mode's built in completion is superior in 26+ + (set-company-backend! '(css-mode scss-mode) 'company-css)) + (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) + + +(after! sass-mode + (set-company-backend! 'sass-mode 'company-css) + (map! :map sass-mode-map :localleader :n "b" #'+css/sass-build)) + + ;; - -;; css-mode hooks apply to scss and less-css modes -(add-hook 'css-mode-hook #'rainbow-delimiters-mode) -(add-hook! (css-mode sass-mode stylus-mode) - #'(yas-minor-mode-on - rainbow-mode)) - +;; Tools (def-package! counsel-css :when (featurep! :completion ivy) @@ -40,24 +53,3 @@ :config (setq helm-css-scss-split-direction #'split-window-vertically helm-css-scss-split-with-multiple-windows t)) - - -(def-package! css-mode ; built-in - :defer t - :config - ;; contains both css-mode & scss-mode - (set-docsets! 'css-mode +web-css-docsets) - (set-docsets! 'scss-mode "Sass" +web-css-docsets) - (unless EMACS26+ - ;; css-mode's built in completion is superior in 26+ - (set-company-backend! '(css-mode scss-mode) 'company-css)) - (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) - - -(def-package! sass-mode - :defer t - :config - (set-docsets! 'sass-mode "Sass" +web-css-docsets) - (set-company-backend! 'sass-mode 'company-css) - (map! :map scss-mode-map :localleader :n "b" #'+css/sass-build)) - diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index dc87b688c..08dc50049 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -15,7 +15,7 @@ :mode "wp-content/themes/.+/.+\\.php$" :mode "templates/.+\\.php$" :config - (set-docsets! 'web-mode "HTML" "Twig" "WordPress") + (set-docsets! 'web-mode "HTML" "CSS" "Twig" "WordPress") ;; tidy is already defined by the format-all package. We redefine it to add ;; more sensible arguments to the tidy command. From 2019aaff97b34e3a562ec9f570f480b13ef11052 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:36:24 -0400 Subject: [PATCH 3060/4235] lang/javascript: enable xref support in rjsx-mode --- modules/lang/javascript/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d93f1e936..971688200 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -171,8 +171,10 @@ (def-package! xref-js2 :when (featurep! :feature lookup) - :commands xref-js2-xref-backend - :init (set-lookup-handlers! 'js2-mode :xref-backend #'xref-js2-xref-backend)) + :after (:or js2-mode rjsx-mode) + :config + (set-lookup-handlers! '(js2-mode rjsx-mode) + :xref-backend #'xref-js2-xref-backend)) (def-package! js2-refactor From 95fa12390d92a279e8dcc352fd27665d063ec945 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:37:26 -0400 Subject: [PATCH 3061/4235] lang/org: fix unfontified remote links --- modules/lang/org/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 06cedc4c4..bfdf2785f 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -221,8 +221,10 @@ unfold to point on startup." (org-link-set-parameters "file" :face (lambda (path) - (unless (file-remote-p path) - (if (file-exists-p path) 'org-link 'error)))) + (if (or (file-remote-p path) + (file-exists-p path)) + 'org-link + 'error))) (eval-when-compile (defmacro def-org-file-link! (key dir) From 5c96b0a801f1908913e4dd27d436894f6ad573ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:37:52 -0400 Subject: [PATCH 3062/4235] lang/javascript: update set-docsets! --- modules/lang/javascript/config.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 971688200..dbcf70c1b 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -1,15 +1,12 @@ ;;; lang/javascript/config.el -*- lexical-binding: t; -*- -(defvar +javascript-docsets - '("JavaScript" +(after! (:any js2-mode rjsx-mode web-mode) + (set-docsets! '(js2-mode rjsx-mode) "JavaScript" "AngularJS" "Backbone" "BackboneJS" "Bootstrap" "D3JS" "EmberJS" "Express" "ExtJS" "JQuery" "JQuery_Mobile" "JQuery_UI" "KnockoutJS" "Lo-Dash" "MarionetteJS" "MomentJS" "NodeJS" "PrototypeJS" "React" "RequireJS" "SailsJS" "UnderscoreJS" "VueJS" "ZeptoJS") - "A list of dash docsets to use for Javascript modes (`js2-mode' and -`rjsx-mode'). These are used by `+lookup/in-docsets'.") -(after! (:any js2-mode rjsx-mode web-mode) (set-pretty-symbols! '(js2-mode rjsx-mode web-mode) ;; Functional :def "function" @@ -54,7 +51,6 @@ (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/repl) - (set-docsets! 'js2-mode +javascript-docsets) (map! :map js2-mode-map :localleader @@ -75,7 +71,6 @@ (add-to-list 'magic-mode-alist '(+javascript-jsx-file-p . rjsx-mode)) :config (set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?>)) - (set-docsets! 'rjsx-mode +javascript-docsets) (when (featurep! :feature syntax-checker) (add-hook! 'rjsx-mode-hook ;; jshint doesn't know how to deal with jsx From bcb444fa183a55895a493d8611ccc646a886e3ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:38:09 -0400 Subject: [PATCH 3063/4235] Enable yas-minor-mode in conf-modes too --- modules/feature/snippets/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index e1aedd1b3..4c4c3318b 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -15,7 +15,7 @@ ;; have additional configuration for yasnippet. For example, file-templates. (add-transient-hook! 'yas-minor-mode-hook (yas-reload-all)) - (add-hook! (text-mode prog-mode snippet-mode) + (add-hook! (text-mode prog-mode conf-mode snippet-mode) #'yas-minor-mode-on) :config From 533355d7d5dbfcd7adee102af1966c503515d72d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:39:03 -0400 Subject: [PATCH 3064/4235] lang/clojure: fix evil keybinds in cider repl --- modules/lang/clojure/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index f06931192..ccf1953cc 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -31,7 +31,9 @@ :n "j" #'cider-find-var :n "h" #'cider-doc :n "c" #'cider-repl-clear-buffer - :n "p" #'cider-eval-sexp-at-point)) + :n "p" #'cider-eval-sexp-at-point) + (when (featurep! :feature evil +everywhere) + (add-hook 'cider-repl-mode-hook #'evil-normalize-keymaps))) (def-package! clj-refactor :hook (clojure-mode . clj-refactor-mode) From 86d51dd0563d8736f1a468fd0f7733005d6158b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:40:11 -0400 Subject: [PATCH 3065/4235] Add +doom-dashboard-mode to swiper-font-lock-exclude It breaks the dashboard --- modules/completion/helm/config.el | 7 ++++--- modules/completion/ivy/config.el | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 445daa079..1f0309dc0 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -188,6 +188,7 @@ be negative.") ;; `swiper-helm' -(setq swiper-helm-display-function - (lambda (buf &optional _resume) (pop-to-buffer buf))) - +(after! swiper-helm + (setq swiper-helm-display-function + (lambda (buf &optional _resume) (pop-to-buffer buf))) + (add-to-list 'swiper-font-lock-exclude #'+doom-dashboard-mode nil #'eq)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 5ea37780c..59f2724e3 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -110,6 +110,8 @@ immediately runs it on the current candidate (ending the ivy session)." counsel-ag-base-command "ag -zS --nocolor --nogroup %s" counsel-pt-base-command "pt -zS --nocolor --nogroup -e %s") + (add-to-list 'swiper-font-lock-exclude #'+doom-dashboard-mode nil #'eq) + ;; Dim recentf entries that are not in the current project. (ivy-set-display-transformer #'counsel-recentf #'+ivy-recentf-transformer) From 6767bb926e7c9bf7b7e8228b0798c4d8565bb835 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:40:52 -0400 Subject: [PATCH 3066/4235] lang/go: rebind conflicting keybinds for go-play-* Fixes a startup error regarding binding to a non-prefix key. --- modules/lang/go/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 57397706a..1c09c4a1e 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -22,8 +22,8 @@ (map! :map go-mode-map :localleader - :n "r" #'go-play-buffer - :v "r" #'go-play-region + :n "e" #'go-play-buffer + :v "e" #'go-play-region :n "i" #'go-goto-imports ; Go to imports (:prefix "h" :n "." #'godoc-at-point ; Lookup in godoc From 90f0765cfb2181cd333d15a2c828c393825d7fd7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 18:42:03 -0400 Subject: [PATCH 3067/4235] lang/org: set default for org-refile-targets So org-refile can see your agenda files and files adjacent to the current one. --- modules/lang/org/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index bfdf2785f..271451a4e 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -172,6 +172,9 @@ unfold to point on startup." '((?a . error) (?b . warning) (?c . success)) + org-refile-targets + '((nil :maxlevel . 3) + (org-agenda-files :maxlevel . 3)) org-startup-folded t org-startup-indented t org-startup-with-inline-images nil From da2a8b106333bc651cae05063ae6734b0a37b092 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:16:15 -0400 Subject: [PATCH 3068/4235] tools/magit: don't mark process buffers as real Otherwise, kill-this-buffer may switch to them. --- modules/tools/magit/config.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 383a88997..9d5786888 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -29,11 +29,18 @@ available.") magit-popup-display-buffer-action '((+magit-display-popup-buffer))) (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore t) - ;; so magit buffers can be switched to - (add-hook 'magit-mode-hook #'doom|mark-buffer-as-real) + + ;; so magit buffers can be switched to (except for process buffers) + (defun +magit-buffer-p (buf) + (with-current-buffer buf + (and (derived-mode-p 'magit-mode) + (not (eq major-mode 'magit-process-mode))))) + (add-to-list 'doom-real-buffer-functions #'+magit-buffer-p nil #'eq) + ;; modeline isn't helpful in magit (add-hook! '(magit-mode-hook magit-popup-mode-hook) #'hide-mode-line-mode) + ;; properly kill leftover magit buffers on quit (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) From 0b350f6ea441a094a7454e7f00ae17387d834faf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:27:18 -0400 Subject: [PATCH 3069/4235] ui/popup: refactor +popup/raise Improves its error tolerance and gives it a window argument. --- modules/ui/popup/autoload/popup.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index dc2a036eb..a526c45fa 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -75,7 +75,7 @@ the buffer is visible, then set another timer and try again later." "Called in lieu of `delete-other-windows' in popup windows. Raises WINDOW (assumed to be a popup), then deletes other windows." - (when-let* ((window (+popup/raise))) + (when-let* ((window (+popup/raise window))) (delete-other-windows window)) nil) @@ -379,13 +379,13 @@ the message buffer in a popup window." t) ;;;###autoload -(defun +popup/raise () +(defun +popup/raise (window) "Raise the current popup window into a regular window." - (interactive) - (unless (+popup-window-p) + (interactive (list (selected-window))) + (cl-check-type window window) + (unless (+popup-window-p window) (user-error "Cannot raise a non-popup window")) - (let ((window (selected-window)) - (buffer (current-buffer)) + (let ((buffer (current-buffer)) +popup--remember-last) (set-window-parameter window 'ttl nil) (+popup/close window 'force) From 46083ed3983a8713fc883d738421ec9deb2aab15 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 4 Sep 2018 02:11:07 +0200 Subject: [PATCH 3070/4235] editor/format: preserve indent in +format-buffer --- modules/editor/format/autoload/format.el | 39 ++++++++++++------------ 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index e0bd6d6fe..7d2972aa0 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -77,6 +77,12 @@ Stolen shamelessly from go-mode" ((error "Invalid rcs patch or internal error in +format--apply-rcs-patch"))))))) (move-to-column column))) +(defun +format--current-indentation () + (save-excursion + (goto-char (point-min)) + (skip-chars-forward " \t\n") + (current-indentation))) + ;; ;; Public library @@ -101,7 +107,8 @@ See `+format/buffer' for the interactive version of this function, and (unless formatter (user-error "Don't know how to format '%s' code" major-mode)) (let ((f-function (gethash formatter format-all-format-table)) - (executable (format-all-formatter-executable formatter))) + (executable (format-all-formatter-executable formatter)) + indent) (pcase-let ((`(,output ,errput ,first-diff) ;; Since `format-all' functions (and various formatting functions, @@ -110,6 +117,11 @@ See `+format/buffer' for the interactive version of this function, and (let ((output (buffer-substring-no-properties (point-min) (point-max)))) (with-temp-buffer (insert output) + ;; Since we're piping a region of text to the formatter, remove + ;; any leading indentation to make it look like a file. + (setq indent (+format--current-indentation)) + (when (> indent 0) + (indent-rigidly (point-min) (point-max) (- indent))) (funcall f-function executable mode-result))))) (unwind-protect (cond ((null output) 'error) @@ -124,7 +136,12 @@ See `+format/buffer' for the interactive version of this function, and (erase-buffer)) (with-temp-file tmpfile (erase-buffer) - (insert output)) + (insert output) + (when (> indent 0) + ;; restore indentation without affecting new + ;; indentation + (indent-rigidly (point-min) (point-max) + (max 0 (- indent (+format--current-indentation)))))) (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) 'noop (+format--apply-rcs-patch patchbuf) @@ -154,23 +171,7 @@ snippets or single lines." (interactive "r") (save-restriction (narrow-to-region beg end) - ;; Since we're piping a region of text to the formatter, remove any leading - ;; indentation to make it look like a file. - (let ((indent (save-excursion - (goto-char beg) - (skip-chars-forward " \t\n") - (current-indentation)))) - (with-silent-modifications - (indent-rigidly (point-min) (point-max) (- indent))) - (+format/buffer) - (with-silent-modifications - ;; Then restore it afterwards, without affecting new indentation - (indent-rigidly (point-min) (point-max) - (max 0 (- indent - (save-excursion - (goto-char beg) - (skip-chars-forward " \t\n") - (current-column))))))))) + (+format/buffer))) ;;;###autoload (defun +format/region-or-buffer (beg end) From 8480f52081004ca1452d7dacaa07324728cad5f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:36:24 -0400 Subject: [PATCH 3071/4235] editor/format: add +format-with option + A formatter can now be specified explicitly buffer-locally by setting +format-with to a symbol representing the name of the formatter (accepts any key of format-all-format-table) + Passing C-u to any of +format/buffer, +format/region or +format/region-or-buffer will now prompt you to select a formatter. + Revise docstring for +format-on-save-enabled-modes --- modules/editor/format/autoload/format.el | 35 ++++++++++++++++-------- modules/editor/format/config.el | 19 ++++++++++--- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 7d2972aa0..d4e3ff8a8 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -86,7 +86,19 @@ Stolen shamelessly from go-mode" ;; ;; Public library -;; + +(defun +format-completing-read () + (require 'format-all) + (let* ((fmtlist (mapcar #'symbol-name (hash-table-keys format-all-format-table))) + (fmt (completing-read "Formatter: " fmtlist))) + (if fmt (cons (intern fmt) t)))) + +;;;###autoload +(defun +format*probe (orig-fn) + "Use `+format-with' instead, if it is set." + (if +format-with + (cons +format-with t) + (funcall orig-fn))) ;;;###autoload (defun +format-buffer (formatter mode-result) @@ -156,31 +168,32 @@ See `+format/buffer' for the interactive version of this function, and ;; Commands ;;;###autoload -(defun +format/buffer () +(defun +format/buffer (&optional arg) "Format the source code in the current buffer." - (interactive) - (+format|buffer)) + (interactive "P") + (let ((+format-with (if arg (+format-completing-read)))) + (+format|buffer arg))) ;;;###autoload -(defun +format/region (beg end) +(defun +format/region (beg end &optional arg) "Runs the active formatter on the lines within BEG and END. WARNING: this may not work everywhere. It will throw errors if the region contains a syntax error in isolation. It is mostly useful for formatting snippets or single lines." - (interactive "r") + (interactive "rP") (save-restriction (narrow-to-region beg end) - (+format/buffer))) + (+format/buffer arg))) ;;;###autoload -(defun +format/region-or-buffer (beg end) +(defun +format/region-or-buffer (beg end &optional arg) "Runs the active formatter on the selected region (or whole buffer, if nothing is selected)." - (interactive "r") + (interactive "rP") (if (use-region-p) - (+format/region beg end) - (+format/buffer))) + (+format/region beg end arg) + (+format/buffer arg))) ;; diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 438eb970e..1ad72e590 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -3,14 +3,17 @@ (defvar +format-on-save-enabled-modes '(not emacs-lisp-mode ; elisp's mechanisms are good enough sql-mode) ; sqlformat is currently broken - "A list of major modes in which to enable `format-all-mode'. - -This mode will auto-format buffers when you save them. + "A list of major modes in which to reformat the buffer upon saving. If this list begins with `not', then it negates the list. If it is `t', it is enabled in all modes. If nil, it is disabled in all modes, the same as if the +onsave flag wasn't - used at all.") + used at all. + +Irrelevant if you do not have the +onsave flag enabled for this module.") + +(defvar-local +format-with nil "Set this to explicitly use a certain formatter + for the current buffer.") ;; @@ -32,3 +35,11 @@ This is controlled by `+format-on-save-enabled-modes'." (when (featurep! +onsave) (add-hook 'after-change-major-mode-hook #'+format|enable-on-save-maybe)) + + +;; +;; Hacks + +;; Allow a specific formatter to be used by setting `+format-with', either +;; buffer-locally or let-bound. +(advice-add #'format-all-probe :around #'+format*probe) From 3c34ff003b1a1b4d26aca34613ed593515c9a475 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:39:52 -0400 Subject: [PATCH 3072/4235] editor/format: override format-all-buffer w/ +format/buffer --- modules/editor/format/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 1ad72e590..47002c9e3 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -43,3 +43,11 @@ This is controlled by `+format-on-save-enabled-modes'." ;; Allow a specific formatter to be used by setting `+format-with', either ;; buffer-locally or let-bound. (advice-add #'format-all-probe :around #'+format*probe) + +;; Doom uses a modded `format-all-buffer', which +;; 1. Doesn't move the cursorafter reformatting, +;; 2. Can reformat regions, rather than the entire buffer (while preserving +;; leading indentation), +;; 3. Applies changes via RCS patch, line by line, as not to protect buffer +;; markers and avoid any jarring cursor+window scrolling. +(advice-add #'format-all-buffer :override #'+format/buffer) From e3d590784cb5582e3b175d45271c8eb513092faa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:41:47 -0400 Subject: [PATCH 3073/4235] editor/format: defer test for formatter By deferring formatter predicates until formatting actually happens, users won't have to reset the major mode to get formatting to work. --- modules/editor/format/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 47002c9e3..bd908e689 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -29,8 +29,7 @@ This is controlled by `+format-on-save-enabled-modes'." ((eq (car +format-on-save-enabled-modes) 'not) (memq major-mode (cdr +format-on-save-enabled-modes))) ((not (memq major-mode +format-on-save-enabled-modes)))) - (not (require 'format-all nil t)) - (equal (format-all-probe) (list nil nil))) + (not (require 'format-all nil t))) (add-hook 'before-save-hook #'+format|buffer nil t))) (when (featurep! +onsave) From f6234e463a68dd9a7dc4ca327794273d35343d73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:44:40 -0400 Subject: [PATCH 3074/4235] editor/format: rewrite set-formatter! + First argument is no longer a major mode or list thereof, it is NAME. Use :modes instead. + Updated docstring & examples. + Added formatting unsetting: (set-formatter! 'some-formatter nil) --- modules/editor/format/autoload/settings.el | 229 +++++++++++---------- 1 file changed, 119 insertions(+), 110 deletions(-) diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el index 3d8183e1c..2a2fe3f53 100644 --- a/modules/editor/format/autoload/settings.el +++ b/modules/editor/format/autoload/settings.el @@ -1,5 +1,7 @@ ;;; editor/format/autoload/settings.el -*- lexical-binding: t; -*- +;; This must be redefined here because `format-all' only makes it available at +;; compile time. (defconst +format-system-type (cl-case system-type (windows-nt 'windows) @@ -21,31 +23,83 @@ else if (eql +format-system-type (car choice)) return (cadr choice))) + +(defun +format--make-command (formatter &rest _) + `(format-all-buffer-thunk + (lambda (input) + (with-silent-modifications + (setq buffer-file-name ,(buffer-file-name (buffer-base-buffer)) + default-directory ,default-directory) + (delay-mode-hooks (funcall ',major-mode)) + (insert input) + (condition-case e + (progn + (when doom-debug-mode + (message "formatter (commandp) %s" #',formatter)) + (call-interactively #',formatter) + (list nil "")) + (error (list t (error-message-string e)))))))) + +(defun +format--make-function (formatter &rest _) + `(progn + (when doom-debug-mode + (message "formatter (functionp) %s" #',formatter)) + (format-all-buffer-thunk #',formatter))) + +(defun +format--make-shell-command (command ok-statuses error-regexp) + (+format--make-shell-command-list (split-string command " " t) + ok-statuses error-regexp)) + +(defun +format--make-shell-command-list (command-list ok-statuses error-regexp) + `(let (args) + (dolist (arg (list ,@command-list)) + (cond ((stringp arg) + (push arg args)) + ((listp arg) + (catch 'skip + (let (subargs this) + (while (setq this (pop arg)) + (cond ((not (stringp (car arg))) + (let ((val (eval (pop arg) t))) + (unless val (throw 'skip nil)) + (push (format this val) subargs))) + ((stringp this) + (push this subargs)))) + (setq args (append subargs args))))))) + (when doom-debug-mode + (message "formatter (arglist) %s" args)) + (if ,(and (or ok-statuses error-regexp) t) + (apply #'format-all-buffer-hard + ',ok-statuses ,error-regexp + (reverse args)) + (apply #'format-all-buffer-easy (reverse args))))) + +(cl-defun +format--set (name &key function modes unset) + (declare (indent defun)) + (when (and unset (not (gethash name format-all-format-table))) + (error "'%s' formatter does not exist to be unset")) + (puthash name function format-all-format-table) + (dolist (mode (doom-enlist modes)) + (cl-destructuring-bind (m &optional probe) + (doom-enlist mode) + (if unset + (puthash m (assq-delete-all name (gethash key format-all-mode-table)) + format-all-mode-table) + (format-all-pushhash + m (cons name (if probe `(lambda () ,probe))) + format-all-mode-table))))) + ;;;###autodef (cl-defun set-formatter! - (modes-or-name formatter - &key - name - modes - install - filter - ok-statuses - error-regexp) - "Define a formatter. + (name formatter &key modes filter ok-statuses error-regexp) + "Define (or modify) a formatter named NAME. -MODES-OR-NAME can either be a major mode symbol (or list thereof), a unique name -for the formatter being defined (also a symbol), or a special list of -two-element sublists with the structure: (MAJOR-MODE FORM). +Supported keywords: :modes :install :filter :ok-statuses :error-regexp -FORM is evaluated when the buffer is formatted and its return value serves two -purposes: +NAME is a symbol that identifies this formatter. -1. It is a predicate for this formatter. Assuming the MAJOR-MODE matches the - current mode, if FORM evaluates to nil, the formatter is skipped. -2. It's return value is made available to FORMATTER if it is a function or list - of shell arguments via the `mode-result' variable. - -FORMATTER can be a function, string or nested list. +FORMATTER can be a symbol referring to another formatter, a function, string or +nested list. If a function, it should be a formatter function that `format-all-buffer-thunk' will accept. @@ -56,15 +110,14 @@ FORMATTER can be a function, string or nested list. string and ARG is both a predicate and argument for STRING. If ARG is nil, STRING will be omitted from the vector. -NAME is a symbol that identifies this formatter. If NAME isn't specified and -FORMATTER is a function symbol, the symbol's name is used. If FORMATTER is a -string or list of strings, the executable is extracted from it and used as the -NAME. If FORMATTER is a lambda, NAME is required and will error if omitted. Note -that any formatters with the same NAME will be overwritten by FORMATTER. +MODES is a major mode, a list thereof, or a list of two-element sublists with +the structure: (MAJOR-MODE FORM). FORM is evaluated when the buffer is formatted +and its return value serves two purposes: -INSTALL is a string representing the shell command to install this formatter's -dependencies. INSTALL can also be a two-element list: (OS COMMAND), or a list of -these. OS can be windows, macos, linux, freebsd, openbsd or netbsd. + 1. It is a predicate for this formatter. Assuming the MAJOR-MODE matches the + current mode, if FORM evaluates to nil, the formatter is skipped. + 2. It's return value is made available to FORMATTER if it is a function or + list of shell arguments via the `mode-result' variable. FILTER is a function that takes three arguments: the formatted output, any error output and the position of the first change. This function must return these @@ -81,30 +134,32 @@ OK-STATUSES. Basic examples: - (set-formatter! '(asm-mode nasm-mode) \"asmfmt\") - (set-formatter! 'python-mode \"black -q -\" :install \"pip install black\") - (set-formatter! 'tidy \"tidy -q -indent\" :modes '(html-mode web-mode)) + (set-formatter! 'asmfmt \"asmfmt\" :modes '(asm-mode nasm-mode)) + (set-formatter! 'black \"black -q -\") + (set-formatter! 'html-tidy \"tidy -q -indent\" :modes '(html-mode web-mode)) Advanced examples: (set-formatter! + 'clang-format + '(\"clang-format\" + (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) + :modes '((c-mode \".c\") (c++-mode \".cpp\") (java-mode \".java\") (objc-mode \".m\") - (protobuf-mode \".proto\")) - '(\"clang-format\" - (\"-assume-filename=%S\" (or buffer-file-name mode-result \"\"))) - :install '(macos \"brew install clang-format\")) + (protobuf-mode \".proto\"))) - (set-formatter! + (set-formatter! 'html-tidy + '(\"tidy\" \"-q\" \"-indent\" + (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) + :modes '(html-mode (web-mode (and (equal \"none\" web-mode-engine) (car (member web-mode-content-type '(\"xml\" \"html\")))))) - '(\"tidy\" \"-q\" \"-indent\" - (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) :ok-statuses '(0 1) - :install '(macos \"brew install tidy-html5\")) + :executable \"tidy\") (set-formatter! 'html-tidy ; overwrite predefined html-tidy formatter '(\"tidy\" \"-q\" \"-indent\" @@ -116,82 +171,36 @@ Advanced examples: (\"-xml\" (memq major-mode '(nxml-mode xml-mode)))) :ok-statuses '(0 1))) - (set-formatter! 'elm-mode + (set-formatter! 'elm-format \"elm-format --yes --stdin\" - :install '(macos \"brew install elm\") :filter (lambda (output errput first-diff) (list output (format-all-remove-ansi-color errput) first-diff)))" (declare (indent defun)) - (cl-check-type name (or symbol null)) - ;; Determine if MODES-OR-NAME means MODES or NAMES - (if (and (symbolp modes-or-name) - (not (string-match-p "-mode$" (symbol-name modes-or-name)))) - (setq name modes-or-name) - (setq modes (doom-enlist modes-or-name))) - (let* ((command-list (cond ((stringp formatter) ; shell command - (split-string formatter " " t)) - ((listp formatter) ; shell command in lists - formatter))) - (name (cond (name) - ((car command-list) (intern (car command-list))) - ((symbolp formatter) formatter) - ((user-error "Anonymous formatter requires a :name")))) - (formatter - (cond ((commandp formatter) - `(format-all-buffer-thunk - (lambda (input) - (with-silent-modifications - (setq buffer-file-name ,(buffer-file-name (buffer-base-buffer)) - default-directory ,default-directory) - (delay-mode-hooks (funcall ',major-mode)) - (insert input) - (condition-case e - (progn (call-interactively #',formatter) - (list nil "")) - (error (list t (error-message-string e)))))))) - ((functionp formatter) - `(format-all-buffer-thunk #',formatter)) - (`(let (args) - (dolist (arg ',command-list) - (cond ((stringp arg) (push arg args)) - ((listp arg) - (catch 'skip - (let (subargs this) - (while (setq this (pop arg)) - (cond ((not (stringp (car arg))) - (let ((val (eval (pop arg) t))) - (unless val (throw 'skip nil)) - (push (format this val) subargs))) - ((stringp this) - (push this subargs)))) - (setq args (append subargs args))))))) - (if ,(and (or ok-statuses error-regexp) t) - (apply #'format-all-buffer-hard - ',ok-statuses ,error-regexp - (reverse args)) - (apply #'format-all-buffer-easy (reverse args))))))) - (fn + (cl-check-type name symbol) + (after! format-all + (if (null formatter) + (+format--set name + :unset t + :modes modes) + (let ((fn (funcall (cond ((stringp formatter) + #'+format--make-shell-command) + ((listp formatter) + #'+format--make-shell-command-list) + ((and (commandp formatter) + (not (stringp formatter))) + #'+format--make-command) + ((functionp formatter) + #'+format--make-function)) + formatter + ok-statuses + error-regexp))) + (cl-check-type filter (or function null)) + (+format--set name + :function `(lambda (executable mode-result) - (let ((result ,formatter)) - ,(if filter - `(apply #',filter result) - 'result)))) - (install (cond ((null install) install) - ((listp install) - (cdr (assq (+format--resolve-system) install))) - (install)))) - (after! format-all - (puthash name (eval fn t) format-all-format-table) - (puthash name (car command-list) format-all-executable-table) - (puthash name (or install (gethash name format-all-install-table)) - format-all-install-table) - (dolist (mode (doom-enlist modes)) - (cl-destructuring-bind (m &optional probe) - (doom-enlist mode) - (format-all-pushhash - m (cons name (if probe `(lambda () ,probe))) - format-all-mode-table)))) - name)) + ,(if filter `(apply #',filter ,fn) fn)) + :modes modes) + name)))) From a963bcfe2c55b7a293045dbd6c79933e8b7f377d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:47:07 -0400 Subject: [PATCH 3075/4235] editor/format: add (some) unit tests & stubs --- modules/editor/format/test/test-format.el | 103 ++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 modules/editor/format/test/test-format.el diff --git a/modules/editor/format/test/test-format.el b/modules/editor/format/test/test-format.el new file mode 100644 index 000000000..955123533 --- /dev/null +++ b/modules/editor/format/test/test-format.el @@ -0,0 +1,103 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/format/test/test-format.el + +(load! "../autoload/settings") +(load! "../autoload/format") +(require! :editor format) +(require 'format-all) + +;; +(describe "editor/format" + :var (format-all-format-table + format-all-mode-table) + + (before-each + (setq format-all-format-table (make-hash-table) + format-all-mode-table (make-hash-table))) + + (describe "set-formatter!" + (before-each + (set-formatter! 'test (lambda () (interactive)))) + + (it "defines a formatter" + (set-formatter! 'new (lambda () (interactive))) + (expect (gethash 'new format-all-mode-table) :to-equal nil) + (expect (functionp (gethash 'new format-all-format-table)))) + + (it "defines a formatter with modes" + (set-formatter! 'new (lambda () (interactive)) + :modes '(a-mode (b-mode "x"))) + (expect (gethash 'a-mode format-all-mode-table) + :to-equal '((new))) + (expect (gethash 'b-mode format-all-mode-table) + :to-equal '((new . (lambda () "x"))))) + + (it "replaces a pre-existing formatter" + (let ((old-fn (gethash 'test format-all-format-table))) + (set-formatter! 'test "echo") + (expect (gethash 'test format-all-format-table) :not :to-equal old-fn))) + + (it "unsets a pre-existing formatter" + (set-formatter! 'test nil) + (expect (gethash 'test format-all-format-table) :to-be nil)) + + (it "errors when unsetting non-existent formatter" + (expect (set-formatter! 'doesnt-exist nil) :to-throw))) + + + ;; TODO + (xdescribe "hooks" + (describe "format|enable-on-save-maybe") + (describe "format|enable-on-save")) + + + ;; TODO + (xdescribe "formatting" + (before-each + (set-formatter! 'command + (lambda () + (interactive) + (let ((first-line (car (split-string (buffer-string) "\n")))) + (erase-buffer) + (insert first-line))) + :modes '(text-mode)) + (set-formatter! 'faulty-command + (lambda () + (interactive) + (error "This is a test")) + :modes '(text-mode)) + (set-formatter! 'function + (lambda (input) + (insert (car (split-string input "\n"))) + (list nil nil)) + :modes '(text-mode)) + (set-formatter! 'shellcmd "head -n 1" + :modes '(text-mode)) + (set-formatter! 'cmdlist '("head" "-n" "1") + :modes '(text-mode))) + + (describe "with an interactive command" + (it "formats a buffer" ) + (it "formats a region" ) + (it "no-ops if no change" ) + (it "doesn't modify the buffer in case of errors" ) + (it "preserves indentation" )) + + (describe "with a function" + (it "formats a buffer" ) + (it "formats a region" ) + (it "no-ops if no change" ) + (it "doesn't modify the buffer in case of errors" ) + (it "preserves indentation" )) + + (describe "with a shell command") + + (describe "with a shell command list" + (it "formats a buffer" ) + (it "formats a region" ) + (it "no-ops if no change" ) + (it "doesn't modify the buffer in case of errors" ) + (it "preserves indentation" ) + + (it "interpolates non-strings into format strings" ) + (it "conditionally appends sublisted options" )))) From bc092acaeeb16c22f447a7f6dcc2656dce9363ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:47:44 -0400 Subject: [PATCH 3076/4235] lang/go: use gofmt for partials goimports (if available) doesn't play well with partial code reformatting. --- modules/lang/go/config.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 1c09c4a1e..bad6fd442 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -12,11 +12,13 @@ :references #'go-guru-referrers :documentation #'godoc-at-point) - (set-formatter! 'go-mode #'gofmt) - (when-let* ((goimports (executable-find "goimports"))) - (setq gofmt-command goimports)) - (when (featurep! :feature syntax-checker) - (setq gofmt-show-errors nil)) ; Leave it to flycheck + ;; Redefines default formatter to *not* use goimports if reformatting a + ;; region; as it doesn't play well with partial code. + (set-formatter! 'gofmt + '(("%s" (if (or (use-region-p) + (not (executable-find "goimports"))) + "gofmt" + "goimports")))) (add-hook 'go-mode-hook #'go-eldoc-setup) From d73f488c112ae7ee7b9a62e49bf4bd1298ff3f7a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 8 Sep 2018 23:48:43 -0400 Subject: [PATCH 3077/4235] lang/ruby: add indent detection support It already exists for ruby-mode, but not enh-ruby-mode. This fixes that. --- modules/lang/ruby/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 37d852c6a..e199afd4d 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -21,6 +21,9 @@ (set-electric! 'enh-ruby-mode :words '("else" "end" "elsif")) (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' + (after! dtrt-indent + ;; `dtrt-indent' supports ruby-mode. Make it aware of enh-ruby-mode + (add-to-list 'dtrt-indent-hook-mapping-list '(enh-ruby-mode ruby enh-ruby-indent-level))) ;; so class and module pairs work (setq-hook! 'enh-ruby-mode-hook sp-max-pair-length 6) From 3128b830f9decd90d4ccd9640e13494ae80923df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 09:27:27 -0400 Subject: [PATCH 3078/4235] ui/modeline: +modeline-height = 25 +2 to default height --- modules/ui/modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 56384e303..182da638f 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -16,7 +16,7 @@ (defvar +modeline-width 3 "How wide the mode-line bar should be (only respected in GUI emacs).") -(defvar +modeline-height 23 +(defvar +modeline-height 25 "How tall the mode-line should be (only respected in GUI emacs).") (defvar +modeline-bar-at-end nil From a64b06aa770562bb35138533299de2cb7be72e4e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 10:05:14 -0400 Subject: [PATCH 3079/4235] lang/data: remove dockerfile-mode Now in tools/docker --- modules/lang/data/packages.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el index cb211419f..2f57bdb10 100644 --- a/modules/lang/data/packages.el +++ b/modules/lang/data/packages.el @@ -1,7 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/data/packages.el -(package! dockerfile-mode) (package! graphql-mode) (package! json-mode) (package! toml-mode) From 11feeaea5fd7974363b74f15efac7d946038bac6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 10:09:45 -0400 Subject: [PATCH 3080/4235] Fix autoload-package::get-packages tests --- core/test/test-autoload-package.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/test/test-autoload-package.el b/core/test/test-autoload-package.el index 3560b53e7..32b4bd4d5 100644 --- a/core/test/test-autoload-package.el +++ b/core/test/test-autoload-package.el @@ -89,6 +89,11 @@ (expect (doom-package-outdated-p 'xyz) :to-be nil))) (describe "get-packages" + (before-all + ;; In addition to `package-installed-p', `doom-package-installed-p' does + ;; file existence checks which won't work here, so we simplify it + (spy-on #'doom-package-installed-p :and-call-fake #'package-installed-p)) + (it "returns all packages" (expect (mapcar #'car (doom-get-packages)) :to-have-same-items-as From ca033e714c8355c66cf94c8f15cad686e6894b75 Mon Sep 17 00:00:00 2001 From: Matthew Lyon Date: Sun, 9 Sep 2018 10:15:20 -0700 Subject: [PATCH 3081/4235] Remove +joker flag for clojure layer Flycheck apparently won't complain if joker isn't installed --- init.example.el | 2 +- modules/lang/clojure/+joker.el | 4 ---- modules/lang/clojure/config.el | 5 +++-- modules/lang/clojure/packages.el | 3 +-- 4 files changed, 5 insertions(+), 9 deletions(-) delete mode 100644 modules/lang/clojure/+joker.el diff --git a/init.example.el b/init.example.el index e5d9ddc5f..aaae090b1 100644 --- a/init.example.el +++ b/init.example.el @@ -80,7 +80,7 @@ :lang ;assembly ; assembly for fun or debugging ;(cc +irony +rtags); C/C++/Obj-C madness - ;(clojure +joker) ; java with a lisp + ;clojure ; java with a lisp ;common-lisp ; if you've seen one lisp, you've seen them all ;coq ; proofs-as-programs ;crystal ; ruby at the speed of c diff --git a/modules/lang/clojure/+joker.el b/modules/lang/clojure/+joker.el deleted file mode 100644 index cb0ac937e..000000000 --- a/modules/lang/clojure/+joker.el +++ /dev/null @@ -1,4 +0,0 @@ -;;; lang/clojure/+joker.el -*- lexical-binding: t; -*- - -(def-package! flycheck-joker - :after (flycheck clojure-mode)) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 8a10c40a3..ad2a334ea 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -38,5 +38,6 @@ :localleader :desc "Refactor hydra" :n "r" #'hydra-cljr-help-menu/body))) -(when (and (featurep! +joker) (featurep! :feature syntax-checker)) - (load! "+joker")) +(when (featurep! :feature syntax-checker) + (def-package! flycheck-joker + :after (flycheck clojure-mode))) diff --git a/modules/lang/clojure/packages.el b/modules/lang/clojure/packages.el index 50bef036b..1f62de5fc 100644 --- a/modules/lang/clojure/packages.el +++ b/modules/lang/clojure/packages.el @@ -4,6 +4,5 @@ (package! cider) (package! clj-refactor) -(when (and (featurep! :feature syntax-checker) - (featurep! +joker)) +(when (featurep! :feature syntax-checker) (package! flycheck-joker)) From 2d685d736e0ba3a4964cf2822542b4e412f4488c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 13:44:12 -0400 Subject: [PATCH 3082/4235] completion/ivy: fix +helm--get-command references Bad copypasta! --- modules/completion/ivy/autoload/ivy.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index b0789b78c..51ed26a15 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -314,7 +314,7 @@ Uses the first available search backend from `+ivy-project-search-engines'. If ALL-FILES-P (universal argument), include all files, even hidden or compressed ones, in the search." (interactive "P") - (funcall (or (+helm--get-command "+ivy/%s") + (funcall (or (+ivy--get-command "+ivy/%s") #'+ivy/grep) (or all-files-p current-prefix-arg))) @@ -326,7 +326,7 @@ Uses the first available search backend from `+ivy-project-search-engines'. If ALL-FILES-P (universal argument), include all files, even hidden or compressed ones." (interactive "P") - (funcall (or (+helm--get-command "+ivy/%s-from-cwd") + (funcall (or (+ivy--get-command "+ivy/%s-from-cwd") #'+ivy/grep-from-cwd) (or all-files-p current-prefix-arg))) From 1535a8d64ab845fe2670779a67c3bea97876aa25 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 16:35:16 -0400 Subject: [PATCH 3083/4235] lang/clojure: move flycheck-joker block --- modules/lang/clojure/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 683c3049c..0ebbc708f 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -40,8 +40,8 @@ :config (map! :map clj-refactor-map :localleader - :desc "Refactor hydra" :n "r" #'hydra-cljr-help-menu/body))) + :desc "Refactor hydra" :n "r" #'hydra-cljr-help-menu/body)) -(when (featurep! :feature syntax-checker) (def-package! flycheck-joker - :after (flycheck clojure-mode))) + :when (featurep! :feature syntax-checker) + :after flycheck)) From 41743869af3191a4d66a8d6039101676030372b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 16:44:02 -0400 Subject: [PATCH 3084/4235] Fix -y option for bin/doom compile #875 --- core/cli/byte-compile.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index 6803ba9ae..c14e3a7c6 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -67,16 +67,16 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (cl-return-from 'byte-compile t)) (unless (or (equal modules '(":core")) recompile-p) - (unless (and (not doom-auto-accept) - (y-or-n-p - (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" - "efforts to debug issues. It is not recommended you do it if you frequently\n" - "tinker with your Emacs config.\n\n" - "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" - "Doom core files, as these don't change often.\n\n" - "If you have issues, please make sure byte-compilation isn't the cause by using\n" - "`bin/doom clean` to clear out your *.elc files.\n\n" - "Byte-compile anyway?"))) + (unless (or doom-auto-accept + (y-or-n-p + (concat "Warning: byte compiling is for advanced users. It will interfere with your\n" + "efforts to debug issues. It is not recommended you do it if you frequently\n" + "tinker with your Emacs config.\n\n" + "Alternatively, use `bin/doom compile :core` instead to byte-compile only the\n" + "Doom core files, as these don't change often.\n\n" + "If you have issues, please make sure byte-compilation isn't the cause by using\n" + "`bin/doom clean` to clear out your *.elc files.\n\n" + "Byte-compile anyway?"))) (message "Aborting.") (cl-return-from 'byte-compile))) (and (not recompile-p) From 7b6dbe92c00956c0e6eadc42c392d22ecd00f8fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 18:17:12 -0400 Subject: [PATCH 3085/4235] Add doom/reload-font command --- core/autoload/ui.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 8866cf76e..faddcfe67 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -141,6 +141,15 @@ windows (unlike `doom/window-zoom') Activate again to undo." (maximize-window)) t))) +;;;###autoload +(defun doom/reload-font () + "Reload `doom-font', `doom-variable-pitch-font', and `doom-unicode-font', if +set." + (interactive) + (when (fontp doom-font) + (set-frame-font doom-font t)) + (doom|init-fonts)) + ;; ;; Modes From f115e4a883208e528f0699713fa990b5fbe01499 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 23:15:55 -0400 Subject: [PATCH 3086/4235] lang/javascript: fix hijacked SPC in insert mode #876 --- modules/lang/javascript/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index dbcf70c1b..69b5d0fcf 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -174,7 +174,10 @@ (def-package! js2-refactor :hook ((js2-mode rjsx-mode) . js2-refactor-mode) - :config (js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key))) + :config + (when (featurep! :feature evil +everywhere) + (let ((js2-refactor-mode-map (evil-get-auxiliary-keymap js2-refactor-mode-map 'normal t t))) + (js2r-add-keybindings-with-prefix (format "%s r" doom-localleader-key))))) (def-package! eslintd-fix From fe79178b1fac8213d7fedcd55b83ffd0ff526ba1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 23:16:55 -0400 Subject: [PATCH 3087/4235] Revise docstrings for run/doc dispatchers --- core/core-cli.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core-cli.el b/core/core-cli.el index e4aab3b03..d7eef59d8 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -96,13 +96,13 @@ All arguments are passed on to Emacs (except for -p and -e). doom run -nw init.el WARNING: this command exists for convenience and testing. Doom will suffer -additional overhead for be started this way. For the best performance, it -is best to run Doom out of ~/.emacs.d and ~/.doom.d.") +additional overhead by being started this way. For the best performance, it is +best to run Doom out of ~/.emacs.d and ~/.doom.d.") (dispatcher! (doctor doc) :noop - "Checks for issues with your current Doom config. + "Checks for issues with your environment & Doom config. -Also checks for missing optional dependencies for all enabled modules.") +Also checks for missing dependencies for any enabled modules.") (dispatcher! (help h) :noop "Look up additional information about a command.") From 947130df8b3b0da261a2cba3a642e998d944f022 Mon Sep 17 00:00:00 2001 From: re-mx Date: Mon, 10 Sep 2018 17:56:09 +0800 Subject: [PATCH 3088/4235] Improve +fci|disable-when-company-activates --- modules/ui/fci/autoload.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/fci/autoload.el b/modules/ui/fci/autoload.el index f59f555db..f7af8865f 100644 --- a/modules/ui/fci/autoload.el +++ b/modules/ui/fci/autoload.el @@ -5,8 +5,7 @@ ;;;###autoload (defun +fci|disable-when-company-activates (&rest ignore) "TODO" - (setq +fci-last-state fci-mode) - (when fci-mode + (when (setq +fci-last-state (bound-and-true-p fci-mode)) (fci-mode -1))) ;;;###autoload From e38e79e6d71f7a087facd3223592203e52c57495 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 08:20:56 -0400 Subject: [PATCH 3089/4235] editor/format: fix not-a-function error Because unquoted lists were being evaluated, it was treated as a function call. --- modules/editor/format/autoload/settings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el index 2a2fe3f53..1e8b54cbb 100644 --- a/modules/editor/format/autoload/settings.el +++ b/modules/editor/format/autoload/settings.el @@ -52,7 +52,7 @@ (defun +format--make-shell-command-list (command-list ok-statuses error-regexp) `(let (args) - (dolist (arg (list ,@command-list)) + (dolist (arg ',command-list) (cond ((stringp arg) (push arg args)) ((listp arg) From e0f8325f453519562945f712209f82e67be3a7a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 08:22:21 -0400 Subject: [PATCH 3090/4235] editor/format: fix wrong-number-of-args error +format|buffer takes no arguments --- modules/editor/format/autoload/format.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index d4e3ff8a8..f1309d62e 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -172,7 +172,7 @@ See `+format/buffer' for the interactive version of this function, and "Format the source code in the current buffer." (interactive "P") (let ((+format-with (if arg (+format-completing-read)))) - (+format|buffer arg))) + (+format|buffer))) ;;;###autoload (defun +format/region (beg end &optional arg) From c52d2a5a14d7cec5dae8395dddefcedc83e7959d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 08:22:42 -0400 Subject: [PATCH 3091/4235] editor/format: add +format-type letvar In case we need a conditional to test against in our formatters. e.g. in go-mode, goimports is incompatible with partial formatting, so we force it to use gofmt in that case. --- modules/editor/format/autoload/format.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index f1309d62e..860f03104 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -1,5 +1,9 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- +(defvar +format-type 'buffer + "A symbol representing whether the buffer or a region of it is being +formatted. Can be 'buffer or 'region.") + ;;;###autoload (autoload 'format-all-probe "format-all") @@ -184,7 +188,8 @@ snippets or single lines." (interactive "rP") (save-restriction (narrow-to-region beg end) - (+format/buffer arg))) + (let ((+format-type 'region)) + (+format/buffer arg)))) ;;;###autoload (defun +format/region-or-buffer (beg end &optional arg) From 08d9c02218fd9e2ac9bb5004fd74d207847ea6b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 08:23:52 -0400 Subject: [PATCH 3092/4235] lang/go: fix formatter `use-region-p` is not a reliable mechanism for detecting region-type formatting, so +format-type was added to the editor/format module. --- modules/lang/go/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index bad6fd442..42c30116c 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -15,7 +15,7 @@ ;; Redefines default formatter to *not* use goimports if reformatting a ;; region; as it doesn't play well with partial code. (set-formatter! 'gofmt - '(("%s" (if (or (use-region-p) + '(("%s" (if (or (eq +format-type 'region) (not (executable-find "goimports"))) "gofmt" "goimports")))) From 75036cefb02503a2c93cdfd6d051a5bc0519065c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 09:01:03 -0400 Subject: [PATCH 3093/4235] Revert max-{specpdl-size,lisp-eval-depth} changes They were unnecessary and could cause crashing in some cases. --- core/core.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index 8a1929de9..91531e739 100644 --- a/core/core.el +++ b/core/core.el @@ -259,10 +259,7 @@ and `doom-exit-window-hook'." tramp-persistency-file-name (concat doom-cache-dir "tramp-persistency.el") url-cache-directory (concat doom-cache-dir "url/") url-configuration-directory (concat doom-etc-dir "url/") - gamegrid-user-score-file-directory (concat doom-etc-dir "games/") - ;; The defaults for these are conservative, we can increase them - max-specpdl-size 5000 - max-lisp-eval-depth 2500) + gamegrid-user-score-file-directory (concat doom-etc-dir "games/")) (defvar doom-auto-minor-mode-alist '() "Alist mapping filename patterns to corresponding minor mode functions, like From 5b807a1c7216ec93b9b1907aa48b79a00d4a8744 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 12:48:19 -0400 Subject: [PATCH 3094/4235] Fix alist-get polyfill's use of assoc in Emacs 25 assoc has only two arguments in Emacs 25, but the polyfill was using its third argument. This was discussed in #875 --- core/core-lib.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 993564bb0..af6408b36 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -22,9 +22,9 @@ This is a generalized variable suitable for use with `setf'. When using it to set a value, optional argument REMOVE non-nil means to remove KEY from ALIST if the new value is `eql' to DEFAULT." (ignore remove) ;;Silence byte-compiler. - (let ((x (if (not testfn) - (assq key alist) - (assoc key alist testfn)))) + (let ((x (cond ((null testfn) (assq key alist)) + ((eq testfn #'equal) (assoc key alist)) + ((cl-find key alist :key #'car :test testfn))))) (if x (cdr x) default))) (advice-add #'alist-get :override #'doom*alist-get)))) From f54c36e72130b5688f6de9d0192dfcf991e566ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 12:50:45 -0400 Subject: [PATCH 3095/4235] lang/common-lisp: revise sly popup rules Fixes issues with the compilation, inspector, debug or trace buffers replacing the repl popup. --- modules/lang/common-lisp/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 0db5ccc10..ebe3f3cb3 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -3,7 +3,13 @@ (after! sly (setq inferior-lisp-program "sbcl") - (set-popup-rule! "^\\*sly" :quit nil :ttl nil) + (set-popup-rules! + '(("^\\*sly-mrepl" :vslot 2 :quit nil :ttl nil) + ("^\\*sly-db" :vslot 3 :quit nil :ttl nil) + ("^\\*sly-compilation" :vslot 4 :ttl nil) + ("^\\*sly-inspector" :vslot 5 :ttl nil) + ("^\\*sly-traces" :vslot 6 :ttl nil))) + (set-repl-handler! 'lisp-mode #'sly-mrepl) (set-lookup-handlers! 'lisp-mode :definition #'sly-edit-definition From ae6d106dcee3c4d431b72d5d7429f5e888349a03 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 22:36:37 -0400 Subject: [PATCH 3096/4235] lang/ess: update to reflect changes upstream #880 --- modules/lang/ess/config.el | 49 ++++++++++---------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index a4e7a3467..2e1444b8e 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -1,34 +1,7 @@ ;;; lang/ess/config.el -*- lexical-binding: t; -*- -(def-package! ess-mode - :commands (R stata julia SAS) - :mode (("\\.sp\\'" . S-mode) - ("/R/.*\\.q\\'" . R-mode) - ("\\.[qsS]\\'" . S-mode) - ("\\.ssc\\'" . S-mode) - ("\\.SSC\\'" . S-mode) - ("\\.[rR]\\'" . R-mode) - ("\\.[rR]nw\\'" . Rnw-mode) - ("\\.[sS]nw\\'" . Snw-mode) - ("\\.[rR]profile\\'" . R-mode) - ("NAMESPACE\\'" . R-mode) - ("CITATION\\'" . R-mode) - ("\\.omg\\'" . omegahat-mode) - ("\\.hat\\'" . omegahat-mode) - ("\\.lsp\\'" . XLS-mode) - ("\\.do\\'" . STA-mode) - ("\\.ado\\'" . STA-mode) - ("\\.[Ss][Aa][Ss]\\'" . SAS-mode) - ("\\.[Ss]t\\'" . S-transcript-mode) - ("\\.Sout" . S-transcript-mode) - ("\\.[Rr]out" . R-transcript-mode) - ("\\.Rd\\'" . Rd-mode) - ("\\.[Bb][Uu][Gg]\\'" . ess-bugs-mode) - ("\\.[Bb][Oo][Gg]\\'" . ess-bugs-mode) - ("\\.[Bb][Mm][Dd]\\'" . ess-bugs-mode) - ("\\.[Jj][Aa][Gg]\\'" . ess-jags-mode) - ("\\.[Jj][Oo][Gg]\\'" . ess-jags-mode) - ("\\.[Jj][Mm][Dd]\\'" . ess-jags-mode)) +(def-package! ess + :commands (stata SAS) :init (setq ess-smart-S-assign-key nil) (unless (featurep! :lang julia) @@ -41,14 +14,16 @@ ess-default-style 'DEFAULT) (set-repl-handler! 'ess-mode #'+ess/r-repl) (set-lookup-handlers! 'ess-mode :documentation #'ess-display-help-on-object) - (define-key! ess-doc-map - "h" #'ess-display-help-on-object - "p" #'ess-R-dv-pprint - "t" #'ess-R-dv-ctable) - (define-key! ess-doc-map - [s-return] #'ess-eval-line - [up] #'comint-next-input - [down] #'comint-previous-input) + + (after! ess-help + (define-key! ess-doc-map + "h" #'ess-display-help-on-object + "p" #'ess-R-dv-pprint + "t" #'ess-R-dv-ctable) + (define-key! ess-doc-map + [s-return] #'ess-eval-line + [up] #'comint-next-input + [down] #'comint-previous-input)) (map! :map ess-mode-map :localleader :nv "," #'ess-eval-region-or-function-or-paragraph-and-step From ed702bab169df2b0429a1bad6c6472d0f0ebce7b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 22:39:11 -0400 Subject: [PATCH 3097/4235] lang/ess: minor reformatting Make hooks stand out a little more. --- modules/lang/ess/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 2e1444b8e..901b65b16 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -7,11 +7,13 @@ (unless (featurep! :lang julia) (add-to-list 'auto-mode-alist '("\\.jl\\'" . ess-julia-mode))) :config - (add-hook 'ess-mode-hook #'display-line-numbers-mode) (setq ess-offset-continued 'straight ess-expression-offset 2 ess-nuke-trailing-whitespace-p t ess-default-style 'DEFAULT) + + (add-hook 'ess-mode-hook #'display-line-numbers-mode) + (set-repl-handler! 'ess-mode #'+ess/r-repl) (set-lookup-handlers! 'ess-mode :documentation #'ess-display-help-on-object) From 856e4f27e54c9db63c7389c4097203ebff82e9c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Sep 2018 22:57:26 -0400 Subject: [PATCH 3098/4235] feature/eval: autoload +eval-{repls,runners} Fix void-variable error when, under certain conditions, these variables are referred to before their containing files are loaded. --- modules/feature/eval/autoload/settings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 5a9e579eb..6ff75db23 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -3,6 +3,7 @@ ;; ;; REPLs +;;;###autoload (defvar +eval-repls nil "An alist mapping major modes to plists that describe REPLs. Used by `+eval/open-repl' and filled with the `:repl' setting.") @@ -29,6 +30,7 @@ command that will be called interactively." ;; ;; Evaluation +;;;###autoload (defvar +eval-runners nil "Alist mapping major modes to interactive runner functions.") From 62212a4b94e81f7fe2e374c34d6b4458992f3a46 Mon Sep 17 00:00:00 2001 From: Ruslan Kamashev Date: Tue, 11 Sep 2018 22:16:24 +0300 Subject: [PATCH 3099/4235] Add tools/ansible --- init.example.el | 1 + modules/lang/data/config.el | 4 ---- modules/tools/ansible/config.el | 25 +++++++++++++++++++++++++ modules/tools/ansible/packages.el | 10 ++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 modules/tools/ansible/config.el create mode 100644 modules/tools/ansible/packages.el diff --git a/init.example.el b/init.example.el index 809dc3e2f..a864d3e64 100644 --- a/init.example.el +++ b/init.example.el @@ -63,6 +63,7 @@ vc ; version-control and Emacs, sitting in a tree :tools + ;ansible ;docker editorconfig ; let someone else argue about tabs vs spaces ;ein ; tame Jupyter notebooks with emacs diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index fef54fb72..1a7378093 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -38,10 +38,6 @@ ;; ;; Frameworks -(def-project-mode! +data-ansible-mode - :modes (yaml-mode) - :files ("roles/")) - (def-project-mode! +data-vagrant-mode :files ("Vagrantfile")) diff --git a/modules/tools/ansible/config.el b/modules/tools/ansible/config.el new file mode 100644 index 000000000..d44a4b8b3 --- /dev/null +++ b/modules/tools/ansible/config.el @@ -0,0 +1,25 @@ +;;; tools/ansible/config.el -*- lexical-binding: t; -*- + +(def-package! ansible + :commands ansible::auto-decrypt-encrypt + :init + (put 'ansible::vault-password-file 'safe-local-variable #'stringp) + :config + (setq ansible::section-face 'font-lock-variable-name-face + ansible::task-label-face 'font-lock-doc-face) + (map! :map ansible::key-map + :localleader + :n "d" #'ansible::decrypt-buffer + :n "e" #'ansible::encrypt-buffer + :n "h" #'ansible-doc)) + +(after! ansible-doc + (set-evil-initial-state! '(ansible-doc-module-mode) 'emacs)) + +(def-package! jinja2-mode + :mode "\\.j2$") + +(def-project-mode! +ansible-yaml-mode + :modes (yaml-mode) + :add-hooks (ansible ansible::auto-decrypt-encrypt ansible-doc-mode) + :files ("roles/")) diff --git a/modules/tools/ansible/packages.el b/modules/tools/ansible/packages.el new file mode 100644 index 000000000..0601eb054 --- /dev/null +++ b/modules/tools/ansible/packages.el @@ -0,0 +1,10 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/ansible/packages.el + +(package! yaml-mode) +(package! ansible) +(package! ansible-doc) +(package! jinja2-mode) + +(when (featurep! :completion company) + (package! company-ansible)) From cd22434df0f92b8700eaf0c179f1b33f243ea471 Mon Sep 17 00:00:00 2001 From: Vladyslav M Date: Wed, 12 Sep 2018 23:32:17 +0300 Subject: [PATCH 3100/4235] lang/rust: add `cargo check` localleader keybind --- modules/lang/rust/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index a95c4e512..60e34f15e 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -9,6 +9,7 @@ :localleader :prefix "b" :n "b" (λ! (compile "cargo build --color always")) + :n "c" (λ! (compile "cargo check --color always")) :n "r" (λ! (compile "cargo run --color always")) :n "t" (λ! (compile "cargo test --color always")))) From 575c3cccd9bd79ea529870ab5a6c709e320c0247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Sun, 9 Sep 2018 21:01:53 +0100 Subject: [PATCH 3101/4235] make compile: exit with non-zero code on error This would allow the CI to fail to compilation errors. --- bin/doom | 3 ++- core/cli/byte-compile.el | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/doom b/bin/doom index 3e25a819d..3a1fc43f5 100755 --- a/bin/doom +++ b/bin/doom @@ -103,4 +103,5 @@ "report, please include it!\n\n" "Emacs outputs to standard error, so you'll need to redirect stderr to\n" "stdout to pipe this to a file or clipboard!\n\n" - " e.g. doom -d install 2>&1 | clipboard-program"))))))))) + " e.g. doom -d install 2>&1 | clipboard-program")) + (signal 'doom-error e)))))))) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index c14e3a7c6..fcd46e9d3 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -151,7 +151,9 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "%s %d/%d file(s) (%d ignored)")) (if recompile-p "Recompiled" "Compiled") total-ok (- (length target-files) total-noop) - total-noop)) + total-noop) + (or (= total-fail 0) + (error "Failed to compile some files"))) ((debug error) (print! (red "\nThere were breaking errors.\n\n%s") "Reverting changes...") From 6eb95c98eafc3ac8ace291b685289a87083fd8e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Sun, 9 Sep 2018 21:05:45 +0100 Subject: [PATCH 3102/4235] Fix `bin/doom -d compile`: org-attach-directory not defined --- modules/lang/org/+attach.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 3a31dbdf1..eee6c0223 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -36,9 +36,6 @@ (advice-add #'org-download-enable :override #'ignore) :config - (setq-default org-download-image-dir org-attach-directory - org-download-heading-lvl nil - org-download-timestamp "_%Y%m%d_%H%M%S") (setq org-download-screenshot-method (cond (IS-MAC "screencapture -i %s") @@ -72,6 +69,9 @@ (defun +org|init-attach () (setq org-attach-directory (expand-file-name +org-attach-dir org-directory)) + (setq-default org-download-image-dir org-attach-directory + org-download-heading-lvl nil + org-download-timestamp "_%Y%m%d_%H%M%S") ;; A shorter link to attachments (add-to-list 'org-link-abbrev-alist (cons "attach" (abbreviate-file-name org-attach-directory))) From 9d445c8a1f79b7748f3b7de0bcd24d9018f894da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Sun, 9 Sep 2018 21:03:54 +0100 Subject: [PATCH 3103/4235] make compile: fix error in emacs-lisp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` In toplevel form: ../modules/lang/emacs-lisp/autoload.el:71:21:Error: Wrong type argument: listp, "~/.emacs.d/modules/lang/emacs-lisp/autoload" ✕ Failed to compile modules/lang/emacs-lisp/autoload.el ``` This apparently attempts to get compiled multiple times, avoid that by attempting to compile only if it is not compiled already. --- 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 98309b8fd..e8957ca5d 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -66,7 +66,7 @@ library/userland functions" ;; `+emacs-lisp-highlight-vars-and-faces' is a potentially expensive function ;; and should be byte-compiled, no matter what, to ensure it runs as fast as ;; possible: -(eval-when-compile +(when (not (byte-code-function-p (symbol-function '+emacs-lisp-highlight-vars-and-faces))) (with-no-warnings (byte-compile #'+emacs-lisp-highlight-vars-and-faces))) From b9c966ec54f0ba7b6ac53e078290ddb364a37cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Tue, 11 Sep 2018 21:24:56 +0100 Subject: [PATCH 3104/4235] Backport to Emacs 25: avoid (setf (alist-get ... 'equal)) We would need to use `'equal` for comparison, but Emacs 25 only allows `'eq`. Using `advice-add` to override `alist-get` does not work, because `setf` has special handling for `alist-get`. `repl.el`: Switch to a hash table which already supports multiple comparison functions, and changing of elements even in Emacs 25. `eshell/autoload/settings.el`: use conditional set-or-push. Drop `doom*alist-get`, it is unused now. Thanks to @hlissner for the reimplementation. --- core/core-lib.el | 19 +------------------ modules/emacs/eshell/autoload/settings.el | 7 +++++-- modules/feature/eval/autoload/repl.el | 18 +++++++++--------- 3 files changed, 15 insertions(+), 29 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index af6408b36..0e764aede 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -10,24 +10,7 @@ ;; if-let and when-let are deprecated in Emacs 26+ in favor of their ;; if-let* variants, so we alias them for 25 users. (defalias 'if-let* #'if-let) - (defalias 'when-let* #'when-let) - - ;; `alist-get' doesn't have its 5th argument before Emacs 26 - (defun doom*alist-get (key alist &optional default remove testfn) - "Return the value associated with KEY in ALIST. -If KEY is not found in ALIST, return DEFAULT. -Use TESTFN to lookup in the alist if non-nil. Otherwise, use `assq'. - -This is a generalized variable suitable for use with `setf'. -When using it to set a value, optional argument REMOVE non-nil -means to remove KEY from ALIST if the new value is `eql' to DEFAULT." - (ignore remove) ;;Silence byte-compiler. - (let ((x (cond ((null testfn) (assq key alist)) - ((eq testfn #'equal) (assoc key alist)) - ((cl-find key alist :key #'car :test testfn))))) - (if x (cdr x) default))) - (advice-add #'alist-get :override #'doom*alist-get)))) - + (defalias 'when-let* #'when-let)))) ;; ;; Helpers diff --git a/modules/emacs/eshell/autoload/settings.el b/modules/emacs/eshell/autoload/settings.el index 39a838517..276f44b02 100644 --- a/modules/emacs/eshell/autoload/settings.el +++ b/modules/emacs/eshell/autoload/settings.el @@ -7,8 +7,11 @@ (signal 'wrong-number-of-arguments (list 'even (length aliases)))) (after! eshell (while aliases - (setf (alist-get (pop aliases) +eshell-aliases nil nil #'equal) - (list (pop aliases)))) + (let ((alias (pop aliases)) + (command (pop aliases))) + (if-let* ((oldval (assoc alias +eshell-aliases))) + (setcdr oldval (list command)) + (push (list alias command) +eshell-aliases)))) (when (boundp 'eshell-command-aliases-list) (if +eshell--default-aliases (setq eshell-command-aliases-list diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index dcd8df1a1..dd1cf1039 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -1,20 +1,21 @@ ;;; feature/eval/autoload/repl.el -*- lexical-binding: t; -*- -(defvar +eval-repl-buffers-alist () +(defvar +eval-repl-buffers (make-hash-table :test 'equal) "The buffer of the last open repl.") (define-minor-mode +eval-repl-mode "A minor mode for REPL buffers.") (defun +eval--ensure-in-repl-buffer (&optional command same-window-p) - (setq +eval-repl-buffers-alist - (cl-remove-if-not #'buffer-live-p +eval-repl-buffers-alist - :key #'cdr)) + (maphash (lambda (key buffer) + (unless (buffer-live-p buffer) + (remhash key +eval-repl-buffers))) + +eval-repl-buffers) (let* ((project-root (doom-project-root 'nocache)) (key (cons major-mode project-root)) - (buffer (cdr (assoc key +eval-repl-buffers-alist)))) - (unless (and (bufferp buffer) - (eq buffer (current-buffer))) + (buffer (gethash key +eval-repl-buffers))) + (cl-check-type buffer (or buffer null)) + (unless (eq buffer (current-buffer)) (funcall (if same-window-p #'switch-to-buffer #'pop-to-buffer) (if (buffer-live-p buffer) buffer @@ -26,8 +27,7 @@ (unless (bufferp buffer) (error "REPL command didn't return a buffer")) (with-current-buffer buffer (+eval-repl-mode +1)) - (setf (alist-get key +eval-repl-buffers-alist nil nil #'equal) - buffer) + (puthash key buffer +eval-repl-buffers) buffer))) (with-current-buffer buffer (goto-char (if (and (derived-mode-p 'comint-mode) From b077b2f6a6cba0b5531776b7084dcc00a181a416 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 17:01:31 -0400 Subject: [PATCH 3105/4235] Use -y flag instead of piping yes to doom compile --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index da351bd35..4515b60a5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,3 +18,4 @@ env: script: - bin/doom version - bin/doom -d test + - bin/doom -y compile From 8f5d822363503c9340e6ed2c74ea955e12b50ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Sun, 9 Sep 2018 21:11:45 +0100 Subject: [PATCH 3106/4235] make compile-core: fix warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is easier to spot real problems if the code is warning-free. Replacing `gensym` with `make-symbol` is an idea taken from here: https://github.com/abo-abo/org-mode/commit/b44c08dd455236a63ae1da07cb30639d2679ba92 In defer-until!: core-lib.el:150:19:Warning: function ‘gensym’ from cl package called at runtime In add-transient-hook!: core-lib.el:216:16:Warning: function ‘gensym’ from cl package called at runtime In toplevel form: autoload/message.el:35:1:Warning: Unused lexical variable ‘spec’ In toplevel form: autoload/line-numbers.el:31:1:Warning: defcustom for ‘display-line-numbers-type’ fails to specify containing group autoload/line-numbers.el:31:1:Warning: defcustom for ‘display-line-numbers-type’ fails to specify containing group autoload/line-numbers.el:39:1:Warning: defcustom for ‘display-line-numbers-grow-only’ fails to specify containing group autoload/line-numbers.el:39:1:Warning: defcustom for ‘display-line-numbers-grow-only’ fails to specify containing group autoload/line-numbers.el:44:1:Warning: defcustom for ‘display-line-numbers-width-start’ fails to specify containing group autoload/line-numbers.el:44:1:Warning: defcustom for ‘display-line-numbers-width-start’ fails to specify containing group In toplevel form: cli/autoloads.el:137:1:Warning: Unused lexical variable ‘type’ Preserve name of unused lexical var _type Makes it obvious what is stored there. --- core/autoload/line-numbers.el | 3 +++ core/autoload/message.el | 2 +- core/cli/autoloads.el | 2 +- core/core-lib.el | 4 ++-- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index 6ea35584d..a02a7b899 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -27,6 +27,9 @@ Lisp programs can disable display of a line number of a particular buffer line by putting the display-line-numbers-disable text property or overlay property on the first visible character of that line.") +(defgroup display-line-numbers nil "Display line number preferences" + :group 'emacs) + ;;;###autoload (defcustom display-line-numbers-type t "The default type of line numbers to use in `display-line-numbers-mode'. diff --git a/core/autoload/message.el b/core/autoload/message.el index 6421c839f..e7645d352 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -47,7 +47,7 @@ Otherwise, it maps colors to a term-color-* face." (propertize text 'face (append (get-text-property 0 'face text) - (let (spec) + (let (_) (cond ((>= code 40) `(:background ,(caddr (assq style doom-ansi-alist)))) ((>= code 30) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index 4d427be58..e964bc5ae 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -192,7 +192,7 @@ even if it doesn't need reloading!" (push `(put ',name 'doom-module ',origin) forms)))) ((eq type 'defalias) - (cl-destructuring-bind (type name target &optional docstring) sexp + (cl-destructuring-bind (_type name target &optional docstring) sexp (let ((name (doom-unquote name)) (target (doom-unquote target))) (unless (and member-p diff --git a/core/core-lib.el b/core/core-lib.el index 0e764aede..e9275d53c 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -130,7 +130,7 @@ serve as a predicated alternative to `after!'." (declare (indent defun) (debug t)) `(if ,condition (progn ,@body) - ,(let ((fun (gensym "doom|delay-form-"))) + ,(let ((fun (make-symbol "doom|delay-form-"))) `(progn (fset ',fun (lambda (&rest args) (when ,(or condition t) @@ -196,7 +196,7 @@ advised)." (let ((append (if (eq (car forms) :after) (pop forms))) (fn (if (symbolp (car forms)) (intern (format "doom|transient-hook-%s" (pop forms))) - (gensym "doom|transient-hook-")))) + (make-symbol "doom|transient-hook-")))) `(progn (fset ',fn (lambda (&rest _) From d9a9243a62ba98055553b58b01e1b3e262329d2b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 9 Sep 2018 16:39:25 -0400 Subject: [PATCH 3107/4235] Remove unnecessary let block --- core/autoload/message.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index e7645d352..b475cb5ad 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -47,12 +47,11 @@ Otherwise, it maps colors to a term-color-* face." (propertize text 'face (append (get-text-property 0 'face text) - (let (_) - (cond ((>= code 40) - `(:background ,(caddr (assq style doom-ansi-alist)))) - ((>= code 30) - `(:foreground ,(face-foreground (caddr (assq style doom-ansi-alist))))) - ((cddr (assq style doom-ansi-alist)))))))))) + (cond ((>= code 40) + `(:background ,(caddr (assq style doom-ansi-alist)))) + ((>= code 30) + `(:foreground ,(face-foreground (caddr (assq style doom-ansi-alist))))) + ((cddr (assq style doom-ansi-alist))))))))) ;;;###autoload (defmacro format! (message &rest args) From 82651be90975670fb7214cf2a91dba4064c6af0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 11 Sep 2018 20:09:31 -0400 Subject: [PATCH 3108/4235] Remove sharp-quote on make-hash-table :test The function isn't really expecting a function, but the 'eq, 'eql or 'equal symbols. User supplied test/hash functions must be defined with define-hash-table-test. --- core/core-modules.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index e5cde27e1..d3567fa31 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -40,7 +40,7 @@ non-nil." (load! "init" doom-private-dir t) (unless doom-modules - (setq doom-modules (make-hash-table :test #'equal))) + (setq doom-modules (make-hash-table :test 'equal))) (maphash (lambda (key plist) (let ((doom--current-module key) @@ -175,7 +175,7 @@ non-nil, return paths of possible modules, activated or otherwise." (or (unless refresh-p doom-modules) (let ((noninteractive t) (doom-modules - (make-hash-table :test #'equal + (make-hash-table :test 'equal :size 20 :rehash-threshold 1.0)) doom-init-modules-p) @@ -274,7 +274,7 @@ for a list of all recognized module trees. Order defines precedence (from most to least)." (unless doom-modules (setq doom-modules - (make-hash-table :test #'equal + (make-hash-table :test 'equal :size (if modules (length modules) 100) :rehash-threshold 1.0))) (let (category m) From 03ce3db322357551e7e2899f5c05819a6a030acb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 12 Sep 2018 21:48:27 -0400 Subject: [PATCH 3109/4235] feature/evil: update for evil-collection changes Now, evil-want-keybindings must be set to nil instead of evil-want-integration. --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 9ab3d96e1..a0e61fafd 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -36,7 +36,7 @@ line with a linewise comment.") evil-insert-state-cursor 'bar evil-visual-state-cursor 'hollow ;; must be set before evil/evil-collection is loaded - evil-want-integration (not (featurep! +everywhere))) + evil-want-keybinding (not (featurep! +everywhere))) :config (add-hook 'doom-post-init-hook #'evil-mode) From 5145e7e8229c0e55710ed3870d85d52893328708 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 12 Sep 2018 22:58:20 -0400 Subject: [PATCH 3110/4235] lang/python: tab-width = python-indent-offset #882 This fixes evil-shift-width too (which is set to tab-width by evil-collection-python). --- modules/lang/python/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 8fc520268..40bce909a 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -57,6 +57,8 @@ python-shell-completion-string-code "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) + (setq-hook! 'python-mode-hook tab-width python-indent-offset) + ;; Add python/pipenv version string to the major mode in the modeline (defun +python|adjust-mode-line () (setq mode-name +python-mode-line-indicator)) From 2b5738194ef7bc53dacb421b7a415155eeaca233 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 12 Sep 2018 23:11:22 -0400 Subject: [PATCH 3111/4235] feature/lookup: reduce coupling w/ lookup backends You can now control exactly what lookup backends are used for the various lookup commands (definition, references, online and file). This allows you to disable (or add) backends by manipulating the default value for these lists with add-hook or remove-hook: * +lookup-definition-functions * +lookup-references-functions * +lookup-documentation-functions * +lookup-file-functions --- modules/feature/lookup/autoload/lookup.el | 135 ++++++++++++++-------- modules/feature/lookup/config.el | 14 ++- 2 files changed, 98 insertions(+), 51 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 0f988a137..45f527c3c 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -114,16 +114,92 @@ properties: (+helm-file-search nil :query query) t)))))) -;;;###autoload -(defun +lookup-xref-definitions (identifier) + +;; +;; Lookup backends + +(defun +lookup-xref-definitions-backend (identifier) "Non-interactive wrapper for `xref-find-definitions'" (xref-find-definitions identifier)) -;;;###autoload -(defun +lookup-xref-references (identifier) +(defun +lookup-xref-references-backend (identifier) "Non-interactive wrapper for `xref-find-references'" (xref-find-references identifier)) +(defun +lookup-dumb-jump-backend (_identifier) + "Look up the symbol at point (or selection) with `dumb-jump', which conducts a +project search with ag, rg, pt, or git-grep, combined with extra heuristics to +reduce false positives. + +This backend prefers \"just working\" over accuracy." + (when (require 'dumb-jump nil t) + ;; dumb-jump doesn't tell us if it succeeded or not + (let (successful) + (cl-letf* ((old-fn (symbol-function 'dumb-jump-get-results)) + ((symbol-function 'dumb-jump-get-results) + (lambda (&optional prompt) + (let* ((plist (funcall old-fn prompt)) + (results (plist-get plist :results))) + (when (and results (> (length results) 0)) + (setq successful t)) + plist)))) + (if other-window + (dumb-jump-go-other-window) + (dumb-jump-go)) + successful)))) + +(defun +lookup-project-search-backend (identifier) + "Conducts a simple project text search for IDENTIFIER. + +Uses and requires `+ivy-file-search' or `+helm-file-search'. Will return nil if +neither is available. These search backends will use ag, rg, or pt (in an order +dictated by `+ivy-project-search-engines' or `+helm-project-search-engines', +falling back to git-grep)." + (unless identifier + (let ((query (rxt-quote-pcre identifier))) + (ignore-errors + (cond ((featurep! :completion ivy) + (+ivy-file-search nil :query query) + t) + ((featurep! :completion helm) + (+helm-file-search nil :query query) + t)))))) + +(defun +lookup-evil-goto-definition-backend (identifier) + "Uses `evil-goto-definition' to conduct a text search for IDENTIFIER in the +current buffer." + (and (featurep 'evil) + evil-mode + (ignore-errors + (cl-destructuring-bind (beg . end) + (bounds-of-thing-at-point 'symbol) + (evil-goto-definition) + (let ((pt (point))) + (not (and (>= pt beg) + (< pt end)))))))) + +(defun +lookup-dash-docsets-backend (identifier) + "Looks up IDENTIFIER in available Dash docsets, if any are installed. + +Docsets must be installed with `+lookup/install-docset'. These can also be +accessed via `+lookup/in-docsets'." + (and (featurep! +docsets) + (or (require 'counsel-dash nil t) + (require 'helm-dash nil t)) + (let ((docsets (+lookup-docsets-for-buffer))) + (when (cl-some #'+lookup-docset-installed-p docsets) + (+lookup/in-docsets identifier docsets) + t)))) + +(defun +lookup-online-backend (identifier) + "Opens the browser and searches for IDENTIFIER online. + +Will prompt for which search engine to use the first time (or if the universal +argument is non-nil)." + (+lookup/online + identifier + (+lookup--online-provider (not current-prefix-arg)))) + ;; ;; Main commands @@ -146,35 +222,7 @@ evil-mode is active." ((and +lookup-definition-functions (+lookup--jump-to :definition identifier))) - ((and (require 'dumb-jump nil t) - ;; dumb-jump doesn't tell us if it succeeded or not - (let (successful) - (cl-letf* ((old-fn (symbol-function 'dumb-jump-get-results)) - ((symbol-function 'dumb-jump-get-results) - (lambda (&optional prompt) - (let* ((plist (funcall old-fn prompt)) - (results (plist-get plist :results))) - (when (and results (> (length results) 0)) - (setq successful t)) - plist)))) - (if other-window - (dumb-jump-go-other-window) - (dumb-jump-go)) - successful)))) - - ((+lookup--file-search identifier)) - - ((and (featurep 'evil) - evil-mode - (ignore-errors - (cl-destructuring-bind (beg . end) - (bounds-of-thing-at-point 'symbol) - (evil-goto-definition) - (let ((pt (point))) - (not (and (>= pt beg) - (< pt end)))))))) - - ((error "Couldn't find '%s'" identifier)))) + ((error "Couldn't find the definition of '%s'" identifier)))) ;;;###autoload (defun +lookup/references (identifier) @@ -190,9 +238,7 @@ search otherwise." ((and +lookup-references-functions (+lookup--jump-to :references identifier))) - ((+lookup--file-search identifier)) - - ((error "Couldn't find '%s'" identifier)))) + ((error "Couldn't find references of '%s'" identifier)))) ;;;###autoload (defun +lookup/documentation (identifier) @@ -210,17 +256,7 @@ Goes down a list of possible backends: ((and +lookup-documentation-functions (+lookup--jump-to :documentation identifier))) - ((and (featurep! +docsets) - (or (require 'counsel-dash nil t) - (require 'helm-dash nil t)) - (let ((docsets (+lookup-docsets-for-buffer))) - (when (cl-some #'+lookup-docset-installed-p docsets) - (+lookup/in-docsets identifier docsets) - t)))) - - ((+lookup/online - identifier - (+lookup--online-provider (not current-prefix-arg)))))) + ((user-error "Couldn't find documentation for '%s'" identifier)))) (defvar ffap-file-finder) ;;;###autoload @@ -276,7 +312,10 @@ Otherwise, falls back on `find-file-at-point'." (defvar helm-dash-docsets) ;;;###autoload (defun +lookup/in-docsets (&optional query docsets) - "TODO" + "Looks up QUERY (a string) in available Dash docsets for the current buffer. + +DOCSETS is a list of docset strings. Docsets can be installed with +`+lookup/install-docset'." (interactive) (let* ((counsel-dash-docsets (unless (eq docsets 'blank) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index 11fbe186d..da3769116 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -29,7 +29,11 @@ produces an url. Used by `+lookup/online'.") (defvar +lookup-open-url-fn #'browse-url "Function to use to open search urls.") -(defvar +lookup-definition-functions '(+lookup-xref-definitions) +(defvar +lookup-definition-functions + '(+lookup-xref-definitions-backend + +lookup-dumb-jump-backend + +lookup-project-search-backend + +lookup-evil-goto-definition-backend) "Functions for `+lookup/definition' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current window/point. @@ -38,7 +42,9 @@ If the argument is interactive (satisfies `commandp'), it is called with `call-interactively' (with no arguments). Otherwise, it is called with one argument: the identifier at point.") -(defvar +lookup-references-functions '(+lookup-xref-references) +(defvar +lookup-references-functions + '(+lookup-xref-references-backend + +lookup-project-search-backend) "Functions for `+lookup/references' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current window/point. @@ -47,7 +53,9 @@ If the argument is interactive (satisfies `commandp'), it is called with `call-interactively' (with no arguments). Otherwise, it is called with one argument: the identifier at point.") -(defvar +lookup-documentation-functions () +(defvar +lookup-documentation-functions + '(+lookup-dash-docsets-backend + +lookup-online-backend) "Functions for `+lookup/documentation' to try, before resorting to `dumb-jump'. Stops at the first function to return non-nil or change the current window/point. From 0a3334a1f67a9c754e3249f7a0b3adb54efa5ed3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 12 Sep 2018 23:15:31 -0400 Subject: [PATCH 3112/4235] ui/modeline: refactor +modeline-encoding segment --- modules/ui/modeline/config.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 182da638f..5b6eeaa59 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -476,21 +476,22 @@ Meant for `+modeline-buffer-path-function'." (def-modeline-segment! +modeline-encoding :on-hooks (after-revert-hook after-save-hook find-file-hook) :on-set (buffer-file-coding-system indent-tabs-mode tab-width) - (concat (format (if indent-tabs-mode "⭾%d" "␣%d") - tab-width) - " " + (format "%s%d %s %s" + (if indent-tabs-mode "⭾" "␣") + tab-width (pcase (coding-system-eol-type buffer-file-coding-system) (0 "LF") (1 "CRLF") (2 "CR")) - " " (let* ((sys (coding-system-plist buffer-file-coding-system)) (category (plist-get sys :category))) - (cond ((eq category 'coding-category-undecided) "") + (cond ((eq category 'coding-category-undecided) + "") ((or (eq category 'coding-category-utf-8) (eq (plist-get sys :name) 'prefer-utf-8)) "UTF-8 ") - ((concat (upcase (symbol-name (plist-get sys :name))) " ")))))) + ((concat (upcase (symbol-name (plist-get sys :name))) + " ")))))) (def-modeline-segment! +modeline-major-mode (propertize (format-mode-line mode-name) From 142d3646efd43e985349ce074433e533a87b5524 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:07:32 -0400 Subject: [PATCH 3113/4235] Add doom-private-dir to load-path Makes private autoload paths simpler --- core/core.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core.el b/core/core.el index 91531e739..b927c6dd1 100644 --- a/core/core.el +++ b/core/core.el @@ -466,6 +466,8 @@ in interactive sessions, nil otherwise (but logs a warning)." (unless noninteractive (doom-initialize-modules)) +(add-to-list 'load-path doom-private-dir) + (after! package (require 'core-packages)) From a1440f8d66c56f43743238752dfcf188540620d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:08:39 -0400 Subject: [PATCH 3114/4235] Fix meta keybinds in popup in tty Emacs #869 Meta keys map to ESC in tty Emacs. --- modules/ui/popup/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 04fa0bd1c..583ef3122 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -43,9 +43,9 @@ adjustment.") (defvar +popup-buffer-mode-map (let ((map (make-sparse-keymap))) (when (featurep! :feature evil) - ;; for maximum escape coverage in emacs state buffers - (define-key map [escape] #'doom/escape) - (define-key map (kbd "ESC") #'doom/escape)) + ;; For maximum escape coverage in emacs state buffers; this only works in + ;; GUI Emacs, in tty Emacs use C-g instead + (define-key map [escape] #'doom/escape)) map) "Active keymap in popup windows. See `+popup-buffer-mode'.") From 162b8dc81f1b4e19190e96e02fcdb09cc5dd2b28 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:09:48 -0400 Subject: [PATCH 3115/4235] Add doom/set-frame-opacity command I use this to play videos behind Emacs while I work. --- core/autoload/ui.el | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index faddcfe67..4201549a8 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -150,6 +150,17 @@ set." (set-frame-font doom-font t)) (doom|init-fonts)) +;;;###autoload +(defun doom/set-frame-opacity (opacity) + "Interactively change the current frame's opacity. + +OPACITY is an integer between 0 to 100, inclusive." + (interactive + (list (read-number "Opacity (0-100): " + (or (frame-parameter nil 'alpha) + 100)))) + (set-frame-parameter nil 'alpha opacity)) + ;; ;; Modes From 54a088230fa9a340bfbb69a9684b3ff7f53c3217 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:12:29 -0400 Subject: [PATCH 3116/4235] config/default: remove C-{h,j,k,l} keybinds These keybinds (particularly C-h) are a tad too imposing to be defaults. Without C-h, the help commands in certain special modes (like magit or org-agenda) become inaccessible. --- modules/config/default/+bindings.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 18f84b6dd..ceeb03fbb 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -68,11 +68,6 @@ :m "A-k" #'+default:multi-previous-line :nv "C-SPC" #'+evil:fold-toggle :gnvimr "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" #'+popup/other (:when IS-MAC From bd39ff3526dcb3b26276a1335c9c9512d6ff80be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:15:01 -0400 Subject: [PATCH 3117/4235] Minor reformatting --- core/cli/byte-compile.el | 2 +- modules/editor/format/config.el | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index fcd46e9d3..b5b0d7282 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -153,7 +153,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." total-ok (- (length target-files) total-noop) total-noop) (or (= total-fail 0) - (error "Failed to compile some files"))) + (error "Failed to compile some files"))) ((debug error) (print! (red "\nThere were breaking errors.\n\n%s") "Reverting changes...") diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index bd908e689..db213333a 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -12,8 +12,8 @@ If nil, it is disabled in all modes, the same as if the +onsave flag wasn't Irrelevant if you do not have the +onsave flag enabled for this module.") -(defvar-local +format-with nil "Set this to explicitly use a certain formatter - for the current buffer.") +(defvar-local +format-with nil + "Set this to explicitly use a certain formatter for the current buffer.") ;; From 1718770b0ed48886b5984350330bb9a0b5de214d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:39:41 -0400 Subject: [PATCH 3118/4235] Rebind q -> kill-this-buffer in Man-mode + evil --- modules/config/default/+bindings.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ceeb03fbb..ea83de3fe 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -824,6 +824,9 @@ "\C-b" #'backward-word "\C-f" #'forward-word) + (after! man + (evil-define-key* 'normal Man-mode-map "q" #'kill-this-buffer)) + (after! view (define-key view-mode-map [escape] #'View-quit-all))) From c37e3a1b80295ced47c0e0be439400c0d2bf3642 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Sep 2018 11:40:08 -0400 Subject: [PATCH 3119/4235] tools/magit: fix hijacked leader key in magit-diff-mode --- modules/tools/magit/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 9d5786888..68ee8cb05 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -44,6 +44,10 @@ available.") ;; properly kill leftover magit buffers on quit (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) + ;; Don't replace the leader key + ;; FIXME remove me when general.el is integrated + (define-key magit-diff-mode-map (kbd doom-leader-key) nil) + (defun +magit|update-vc () "Update vc in all verson-controlled buffers when magit refreshes." (dolist (buf (buffer-list)) From a9fdeefe15737e25951bc5922704a7d0340991d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 14 Sep 2018 09:35:00 -0400 Subject: [PATCH 3120/4235] Revert 142d364 Only add doom-private-dir to load-path during autoload generation, otherwise a $DOOMDIR/autoload.el will shadow the built-in autoload.el Emacs package. Note: with `doom-private-dir' in `load-path', Doom autoloads files will be unable to declare autoloads for the built-in autoload.el Emacs package, should $DOOMDIR/autoload.el exist. Not sure why they'd want to though, so it's an acceptable compromise for simpler autoload declarations. --- core/cli/autoloads.el | 9 ++++++++- core/core.el | 2 -- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index e964bc5ae..33150e75f 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -121,7 +121,14 @@ even if it doesn't need reloading!" (abbreviate-file-name file)))))) (defun doom--expand-autoloads () - (let ((load-path (append doom-modules-dirs load-path)) + (let ((load-path + ;; NOTE With `doom-private-dir' in `load-path', Doom autoloads files + ;; will be unable to declare autoloads for the built-in autoload.el + ;; Emacs package, should $DOOMDIR/autoload.el exist. Not sure why + ;; they'd want to though, so it's an acceptable compromise. + (append (list doom-private-dir) + doom-modules-dirs + load-path)) cache) (while (re-search-forward "^\\s-*(autoload\\s-+'[^ ]+\\s-+\"\\([^\"]*\\)\"" nil t) (let ((path (match-string 1))) diff --git a/core/core.el b/core/core.el index b927c6dd1..91531e739 100644 --- a/core/core.el +++ b/core/core.el @@ -466,8 +466,6 @@ in interactive sessions, nil otherwise (but logs a warning)." (unless noninteractive (doom-initialize-modules)) -(add-to-list 'load-path doom-private-dir) - (after! package (require 'core-packages)) From 9684b34389e3925d7156103536cbc5ecb73854f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 14 Sep 2018 09:41:06 -0400 Subject: [PATCH 3121/4235] lang/markdown: fix next/previous link keybinds They were the other way around. --- modules/lang/markdown/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index 11d4d3c03..e71ec63e6 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -38,8 +38,8 @@ "[h" #'markdown-previous-visible-heading "[p" #'markdown-promote "]p" #'markdown-demote - "[l" #'markdown-next-link - "]l" #'markdown-previous-link) + "[l" #'markdown-previous-link + "]l" #'markdown-next-link) (evil-define-key* 'insert markdown-mode-map (kbd "M--") #'markdown-insert-hr) (evil-define-key* 'normal markdown-mode-map From a9c925c50ba12b3f7c8428761bfcb6b1526a98fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 14 Sep 2018 10:42:09 -0400 Subject: [PATCH 3122/4235] Rename doom*newline-and-indent To doom*newline-indent-and-continue-comments; to better describe what it does. --- core/autoload/editor.el | 2 +- modules/config/default/config.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index fd2deb91a..51a2bfed6 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -274,7 +274,7 @@ Respects `require-final-newline'." ;; Advice ;;;###autoload -(defun doom*newline-and-indent (_orig-fn) +(defun doom*newline-indent-and-continue-comments (_orig-fn) "Inserts a newline and possibly indents it. Also continues comments if executed from a commented line; handling special cases for certain languages with weak native support." diff --git a/modules/config/default/config.el b/modules/config/default/config.el index fe294b412..8b662dee8 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -85,7 +85,7 @@ (advice-add #'delete-backward-char :override #'doom/delete-backward-char) ;; Makes `newline-and-indent' smarter when dealing with comments - (advice-add #'newline-and-indent :around #'doom*newline-and-indent)) + (advice-add #'newline-and-indent :around #'doom*newline-indent-and-continue-comments)) (when (featurep 'evil) From 1b7ae374473ab7f62d3e17de1ab6a68a67c3bd01 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 16 Sep 2018 10:38:12 -0400 Subject: [PATCH 3123/4235] feature/evil: refactor evil-collection integration + Move disabled modules into +evil-collection-disabled-list to make it easier to maintain our copy of evil-collection-list + Update evil-collection-list to reflect changes upstream + Fixes errors wrt missing evil-collection-* modules --- modules/feature/evil/+everywhere.el | 260 ++++++++++++++++------------ 1 file changed, 145 insertions(+), 115 deletions(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 371701a62..481d61cad 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -4,128 +4,45 @@ ;; ;; 1. To truly lazy load it. Some of its modules, like the elisp-mode and ;; buff-menu ones are loaded immediately, because Emacs loads them -;; immediately, pulling it all of evil-collection and sometimes other +;; immediately, pulling in all of evil-collection and sometimes other ;; packages. ;; 2. This ensures a predictable load order, versus lazy loading using :defer or ;; :after-call. This means users can use (after! org ...) and be sure that ;; their changes will override evil-collection's. -;; 3. I don't completely agree with all of evil-collection's design choices. -;; Sometimes, I disagree with entire modules. Other times it's just a couple -;; keybinds. I'd rather do all this integration work internally, rather than -;; delegate it to another package that I cannot control or predict. +;; 3. Eventually, I'd like to remove evil-collection. It changes too often, +;; introduces breaking bugs too frequently, and I don't always agree with +;; their design choices. Regardless, there are useful tidbits I'd like to +;; keep. This will be a slow transition, but this file is where most of it +;; will happen. ;; 4. Adds `+evil-collection-disabled-list', to make it easier for users to -;; disable modules. +;; disable modules, and to reduce the effort required to maintain our copy of +;; `evil-collection-list' (now I can just copy it from time to time). -(defvar +evil-collection-disabled-list () +(defvar +evil-collection-disabled-list + '(anaconda-mode + buff-menu + comint + company + custom + dired + eldoc + elisp-mode + ert + free-keys + help + helm + image + ivy + kotlin-mode + occur + package-menu + ruby-mode + simple + slime) "A list of `evil-collection' modules to ignore. See the definition of this variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") -(defvar evil-collection-mode-list - `(ace-jump-mode - ag - alchemist - ;; anaconda-mode - arc-mode - avy - bookmark - ;; (buff-menu "buff-menu") - calc - calendar - cider - cmake-mode - ;; comint - ;; company - compile - ;; custom - cus-theme - daemons - deadgrep - debbugs - debug - diff-mode - ;; dired - doc-view - edebug - ediff - ;; eldoc - elfeed - ;; elisp-mode - elisp-refs - emms - epa - ;; ert - eshell - eval-sexp-fu - etags-select - eww - flycheck - ;; free-keys - geiser - ggtags - git-timemachine - go-mode - ;; help - guix - ;; helm - ibuffer - ;; image - image+ - imenu-list - indium - info - ;; ivy - js2-mode - log-view - lsp-ui-imenu - lua-mode - ;; kotlin-mode - macrostep - man - magit - mu4e - mu4e-conversation - neotree - notmuch - nov - ;; occur is in replace.el which was built-in before Emacs 26. - ;; (occur ,(if EMACS26+ 'replace "replace")) - outline - p4 - ;; (package-menu package) - paren - pass - (pdf pdf-view) - popup - proced - prodigy - profiler - python - quickrun - racer - realgud - reftex - rjsx-mode - robe - ;; ruby-mode - rtags - ;; simple - ;; slime - (term term ansi-term multi-term) - tide - transmission - typescript-mode - vc-annotate - vdiff - view - vlf - which-key - wdired - wgrep - woman - xref - (ztree ztree-diff))) - (defun +evil-collection-init (module) (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) (when doom-debug-mode @@ -207,9 +124,8 @@ variable for an explanation of the defaults (in comments). See "ZZ" #'quit-window)) ;; These modes belong to packages that Emacs always loads at startup, causing -;; evil-collection to load immediately. By tacking it on to the modes -;; themselves, rather than the package being loaded, we manage to truly lazy -;; load evil-collection. +;; evil-collection to load immediately. We avoid this by loading them on first +;; invokation of their associated major/minor modes. (add-transient-hook! 'Buffer-menu-mode (+evil-collection-init '(buff-menu "buff-menu"))) (add-transient-hook! 'image-mode @@ -219,7 +135,121 @@ variable for an explanation of the defaults (in comments). See (add-transient-hook! 'occur-mode (+evil-collection-init (if EMACS26+ 'replace "replace"))) + +;; ;; Let 'er rip! + +(defvar evil-collection-setup-minibuffer nil) +(defvar evil-collection-mode-list + `(ag + alchemist + anaconda-mode + arc-mode + bookmark + (buff-menu "buff-menu") + calc + calendar + cider + cmake-mode + comint + company + compile + custom + cus-theme + daemons + deadgrep + debbugs + debug + diff-mode + dired + doc-view + edebug + ediff + eglot + elfeed + elisp-mode + elisp-refs + emms + epa + ert + eshell + eval-sexp-fu + evil-mc + eww + flycheck + flymake + free-keys + geiser + ggtags + git-timemachine + go-mode + grep + help + guix + helm + ibuffer + image + image-dired + image+ + imenu-list + indium + info + ivy + js2-mode + log-view + lsp-ui-imenu + lua-mode + kotlin-mode + macrostep + man + magit + magit-todos + ,@(when evil-collection-setup-minibuffer '(minibuffer)) + mu4e + mu4e-conversation + neotree + notmuch + nov + ;; occur is in replace.el which was built-in before Emacs 26. + (occur ,(if EMACS26+ 'replace "replace")) + outline + p4 + (package-menu package) + pass + (pdf pdf-view) + popup + proced + prodigy + profiler + python + quickrun + racer + realgud + reftex + rjsx-mode + robe + ruby-mode + rtags + simple + slime + (term term ansi-term multi-term) + tide + transmission + typescript-mode + vc-annotate + vc-dir + vc-git + vdiff + view + vlf + which-key + wdired + wgrep + woman + xref + youtube-dl + (ztree ztree-diff))) + (dolist (mode evil-collection-mode-list) (dolist (req (or (cdr-safe mode) (list mode))) (with-eval-after-load req From daccdc3e53e6a095e56f149e4cfe2545030123b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 16 Sep 2018 18:19:34 -0400 Subject: [PATCH 3124/4235] completion/company: fix lsp icons Fixes a wrong-type-argument error from company-box-frontend. Also reformats elisp company-box-icons-elisp icon list. --- modules/completion/company/config.el | 58 ++++++++++++++-------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index f14b12223..c4f382b74 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -59,36 +59,36 @@ company-box-icons-yasnippet (all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-green) company-box-icons-unknown (all-the-icons-material "find_in_page" :height 0.8 :face 'all-the-icons-purple) company-box-icons-elisp - (list (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red) - (all-the-icons-material "check_circle" :height 0.8 :face 'all-the-icons-blue) - (all-the-icons-material "stars" :height 0.8 :face 'all-the-icons-orange) - (all-the-icons-material "format_paint" :height 0.8 :face 'all-the-icons-pink)) + (list (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red) + (all-the-icons-material "check_circle" :height 0.8 :face 'all-the-icons-blue) + (all-the-icons-material "stars" :height 0.8 :face 'all-the-icons-orange) + (all-the-icons-material "format_paint" :height 0.8 :face 'all-the-icons-pink)) company-box-icons-lsp - '((1 . (all-the-icons-material "text_fields" :height 0.8 :face 'all-the-icons-green)) ; text - (2 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; method - (3 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; function - (4 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; constructor - (5 . (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; field - (6 . (all-the-icons-material "adjust" :height 0.8 :face 'all-the-icons-blue)) ; variable - (7 . (all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)) ; class - (8 . (all-the-icons-material "settings_input_component" :height 0.8 :face 'all-the-icons-red)) ; interface - (9 . (all-the-icons-material "view_module" :height 0.8 :face 'all-the-icons-red)) ; module - (10 . (all-the-icons-material "settings" :height 0.8 :face 'all-the-icons-red)) ; property - (11 . (all-the-icons-material "straighten" :height 0.8 :face 'all-the-icons-red)) ; unit - (12 . (all-the-icons-material "filter_1" :height 0.8 :face 'all-the-icons-red)) ; value - (13 . (all-the-icons-material "plus_one" :height 0.8 :face 'all-the-icons-red)) ; enum - (14 . (all-the-icons-material "filter_center_focus" :height 0.8 :face 'all-the-icons-red)) ; keyword - (15 . (all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-red)) ; snippet - (16 . (all-the-icons-material "color_lens" :height 0.8 :face 'all-the-icons-red)) ; color - (17 . (all-the-icons-material "insert_drive_file" :height 0.8 :face 'all-the-icons-red)) ; file - (18 . (all-the-icons-material "collections_bookmark" :height 0.8 :face 'all-the-icons-red)) ; reference - (19 . (all-the-icons-material "folder" :height 0.8 :face 'all-the-icons-red)) ; folder - (20 . (all-the-icons-material "people" :height 0.8 :face 'all-the-icons-red)) ; enumMember - (21 . (all-the-icons-material "pause_circle_filled" :height 0.8 :face 'all-the-icons-red)) ; constant - (22 . (all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) ; struct - (23 . (all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) ; event - (24 . (all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) ; operator - (25 . (all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)))) + `((1 . ,(all-the-icons-material "text_fields" :height 0.8 :face 'all-the-icons-green)) ; text + (2 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; method + (3 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; function + (4 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; constructor + (5 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; field + (6 . ,(all-the-icons-material "adjust" :height 0.8 :face 'all-the-icons-blue)) ; variable + (7 . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)) ; class + (8 . ,(all-the-icons-material "settings_input_component" :height 0.8 :face 'all-the-icons-red)) ; interface + (9 . ,(all-the-icons-material "view_module" :height 0.8 :face 'all-the-icons-red)) ; module + (10 . ,(all-the-icons-material "settings" :height 0.8 :face 'all-the-icons-red)) ; property + (11 . ,(all-the-icons-material "straighten" :height 0.8 :face 'all-the-icons-red)) ; unit + (12 . ,(all-the-icons-material "filter_1" :height 0.8 :face 'all-the-icons-red)) ; value + (13 . ,(all-the-icons-material "plus_one" :height 0.8 :face 'all-the-icons-red)) ; enum + (14 . ,(all-the-icons-material "filter_center_focus" :height 0.8 :face 'all-the-icons-red)) ; keyword + (15 . ,(all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-red)) ; snippet + (16 . ,(all-the-icons-material "color_lens" :height 0.8 :face 'all-the-icons-red)) ; color + (17 . ,(all-the-icons-material "insert_drive_file" :height 0.8 :face 'all-the-icons-red)) ; file + (18 . ,(all-the-icons-material "collections_bookmark" :height 0.8 :face 'all-the-icons-red)) ; reference + (19 . ,(all-the-icons-material "folder" :height 0.8 :face 'all-the-icons-red)) ; folder + (20 . ,(all-the-icons-material "people" :height 0.8 :face 'all-the-icons-red)) ; enumMember + (21 . ,(all-the-icons-material "pause_circle_filled" :height 0.8 :face 'all-the-icons-red)) ; constant + (22 . ,(all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) ; struct + (23 . ,(all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) ; event + (24 . ,(all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) ; operator + (25 . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)))) ;; Until sebastiencs/company-box#40 is merged (defun +company*box-frontend-even-if-single (command) From ed0857b988db8fc419e31692ca1ad2974c830bbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 17 Sep 2018 08:53:13 -0400 Subject: [PATCH 3125/4235] Fix invalid-function error on snippet prompt --- modules/feature/snippets/autoload/snippets.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index ff6ef9f2f..f58752a9e 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -5,7 +5,7 @@ (file-in-directory-p (yas--template-get-file x) doom-emacs-dir))) ;;;###autoload -(defun +snippets-prompt-private (prompt choices &optional fn) +(defun +snippets-prompt-private (prompt choices &optional display-fn) "Prioritize private snippets over built-in ones if there are multiple choices. @@ -23,7 +23,7 @@ ignored. This makes it easy to override built-in snippets with private ones." (choices (cl-remove-duplicates choices :test #'+snippets--remove-p))) (if (cdr choices) (cl-loop for fn in (cdr (memq '+snippets-prompt-private yas-prompt-functions)) - if (funcall prompt choices fn) + if (funcall fn prompt choices display-fn) return it) (car choices))))) From b7be38b2a9900d7d515c43edfbe89f515cb0e07c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 11:42:35 -0400 Subject: [PATCH 3126/4235] New incremental lazy-loading at startup This is for loading large packages (like org and magit) quietly in the background during idle time. It is already set up to incrementally load org and magit. This is still experimental, however. the idle timers may need to be tweaked. --- core/core.el | 63 +++++++++++++++++++++++++++++++++++ modules/lang/org/config.el | 6 ++++ modules/tools/magit/config.el | 2 ++ 3 files changed, 71 insertions(+) diff --git a/core/core.el b/core/core.el index 91531e739..7dda9a4b2 100644 --- a/core/core.el +++ b/core/core.el @@ -300,6 +300,69 @@ original value of `symbol-file'." (add-hook 'minibuffer-exit-hook #'doom|restore-garbage-collection) +;; +;; Incremental lazy-loading + +(defvar doom-incremental-packages '(t) + "A list of packages to load incrementally after startup. Any large packages +here may cause noticable pauses, so it's recommended you break them up into +sub-packages. For example, `org' is comprised of many packages, and can be broken up into: + + (doom-load-packages-incrementally + '(calendar find-func format-spec org-macs org-compat + org-faces org-entities org-list org-pcomplete org-src + org-footnote org-macro ob org org-clock org-agenda + org-capture)) + +This is already done by the lang/org module, however. + +If you want to disable incremental loading altogether, either remove +`doom|load-packages-incrementally' from `emacs-startup-hook' or set +`doom-incremental-first-idle-timer' to nil.") + +(defvar doom-incremental-first-idle-timer 2 + "How long (in idle seconds) until incremental loading starts. + +Set this to nil to disable incremental loading.") + +(defvar doom-incremental-idle-timer 1.5 + "How long (in idle seconds) in between incrementally loading packages.") + +(defun doom-load-packages-incrementally (packages &optional now) + "Registers PACKAGES to be loaded incrementally. + +If NOW is non-nil, load PACKAGES incrementally, in `doom-incremental-idle-timer' +intervals." + (if (not now) + (nconc doom-incremental-packages packages) + (when packages + (let ((gc-cons-threshold doom-gc-cons-upper-limit) + file-name-handler-alist) + (let* ((reqs (cl-remove-if #'featurep packages)) + (req (ignore-errors (pop reqs)))) + (when req + (when doom-debug-mode + (message "Incrementally loading %s" req)) + (require req) + (when reqs + (run-with-idle-timer doom-incremental-idle-timer + nil #'doom-load-packages-incrementally + reqs t)))))))) + +(defun doom|load-packages-incrementally () + "Begin incrementally loading packages in `doom-incremental-packages'. + +If this is a daemon session, load them all immediately instead." + (if (daemonp) + (mapc #'require (cdr doom-incremental-packages)) + (when (integerp doom-incremental-first-idle-timer) + (run-with-idle-timer doom-incremental-first-idle-timer + nil #'doom-load-packages-incrementally + (cdr doom-incremental-packages) t)))) + +(add-hook 'emacs-startup-hook #'doom|load-packages-incrementally) + + ;; ;; Bootstrap helpers diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 271451a4e..750a3d015 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -13,6 +13,12 @@ (if (featurep! +present) (load! "+present")) ;; TODO (if (featurep! +publish) (load! "+publish")) +(doom-load-packages-incrementally + '(calendar find-func format-spec org-macs org-compat + org-faces org-entities org-list org-pcomplete org-src + org-footnote org-macro ob org org-clock org-agenda + org-capture)) + ;; ;; Packages diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 68ee8cb05..8157147db 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -18,6 +18,8 @@ available.") :commands magit-file-delete :init (setq magit-auto-revert-mode nil) ; we already use `global-auto-revert-mode' + (doom-load-packages-incrementally + '(dash f s with-editor git-commit package magit)) :config (setq magit-completing-read-function (if (featurep! :completion ivy) From e80f5e4c8569b7d30eff553cda234c0089c0abe7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 11:45:13 -0400 Subject: [PATCH 3127/4235] Remove unnecessary optimization in doom-try-run-hook Hooks run with this should already be run in a gc-deferred state (at startup), so deferring garbage collection _again_ may just cause unnecessary consing. --- core/core.el | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/core/core.el b/core/core.el index 7dda9a4b2..a135c25ab 100644 --- a/core/core.el +++ b/core/core.el @@ -371,15 +371,14 @@ If this is a daemon session, load them all immediately instead." issues easier. Meant to be used with `run-hook-wrapped'." - (let ((gc-cons-threshold doom-gc-cons-upper-limit)) - (when doom-debug-mode - (message "Running doom hook: %s" hook)) - (condition-case e - (funcall hook) - ((debug error) - (signal 'doom-hook-error (list hook e)))) - ;; return nil so `run-hook-wrapped' won't short circuit - nil)) + (when doom-debug-mode + (message "Running doom hook: %s" hook)) + (condition-case e + (funcall hook) + ((debug error) + (signal 'doom-hook-error (list hook e)))) + ;; return nil so `run-hook-wrapped' won't short circuit + nil) (defun doom-ensure-same-emacs-version-p () "Check if the running version of Emacs has changed and set From 4067c8937e5deedc7f86bba25d48fe19a295ce30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 11:48:16 -0400 Subject: [PATCH 3128/4235] Remove doom-major-mode-names & doom|set-mode-name And replace it with buffer-local mode-name setters. This is more explicit and less magical, which is easier for users to discover and change, if they'd like. --- core/core-ui.el | 15 --------------- core/test/test-core-ui.el | 21 --------------------- modules/lang/emacs-lisp/config.el | 3 +++ modules/lang/sh/config.el | 3 +++ 4 files changed, 6 insertions(+), 36 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 72a9ca02e..d70ee1cf9 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -17,12 +17,6 @@ "Fallback font for unicode glyphs. Is ignored if :feature unicode is active. Expects a `font-spec'.") -(defvar doom-major-mode-names - '((sh-mode . "sh") - (emacs-lisp-mode . "Elisp")) - "An alist mapping major modes symbols to strings (or functions that will -return a string). This changes the 'long' name of a major-mode, allowing for -shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; (defvar doom-init-ui-hook nil @@ -419,14 +413,6 @@ frame's window-system, the theme will be reloaded.") (add-hook! '(doom-init-ui-hook minibuffer-setup-hook window-configuration-change-hook) #'doom|no-fringes-in-minibuffer) -(defun doom|set-mode-name () - "Set the major mode's `mode-name', as dictated by `doom-major-mode-names'." - (when-let* ((name (cdr (assq major-mode doom-major-mode-names)))) - (setq mode-name - (cond ((functionp name) (funcall name)) - ((stringp name) name) - ((error "'%s' isn't a valid name for %s" name major-mode)))))) - (defun doom|protect-visible-buffer () "Don't kill the current buffer if it is visible in another window (bury it instead). Meant for `kill-buffer-query-functions'." @@ -441,7 +427,6 @@ instead). Meant for `kill-buffer-query-functions'." "Initialize Doom's user interface by applying all its advice and hooks." (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil #'eq) (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil #'eq) - (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) (add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el index eedc64a1d..d3d3a1ecf 100644 --- a/core/test/test-core-ui.el +++ b/core/test/test-core-ui.el @@ -2,27 +2,6 @@ ;;; ../core/test/test-core-ui.el (describe "core/ui" - (describe "doom|set-mode-name" - :var (doom-major-mode-names after-change-major-mode-hook) - (before-all - (setq doom-major-mode-names - '((text-mode . "abc") - (lisp-mode . (lambda () "xyz")) - (js-mode . t)) - after-change-major-mode-hook '(doom|set-mode-name))) - - (it "changes `mode-name' to match a given string" - (text-mode) - (expect mode-name :to-equal "abc")) - - (it "changes `mode-name' to the result of a function" - (lisp-mode) - (expect mode-name :to-equal "xyz")) - - (it "should fail if given an invalid name" - (expect (js-mode) :to-throw 'error))) - - (describe "doom|protect-visible-buffer" :var (kill-buffer-query-functions wconf a b) (before-each diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 9c500bfb3..c8e2f6ca1 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -47,6 +47,9 @@ ("add-hook" "remove-hook") ("add-hook!" "remove-hook!"))) + ;; [pedantry intensifies] + (setq-hook! 'emacs-lisp-mode-hook mode-name "Elisp") + ;; variable-width indentation is superior in elisp (add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index e73738fca..b61562948 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -19,6 +19,9 @@ (setq sh-indent-after-continuation 'always) + ;; [pedantry intensifies] + (setq-hook! 'sh-mode-hook mode-name "sh") + ;; recognize function names with dashes in them (add-to-list 'sh-imenu-generic-expression '(sh (nil "^\\s-*function\\s-+\\([[:alpha:]_-][[:alnum:]_-]*\\)\\s-*\\(?:()\\)?" 1) From e71b26b1e8a0009adb256a30805fc588b5a0cc5f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 11:50:28 -0400 Subject: [PATCH 3129/4235] core-ui: minor reformatting/refactor --- core/core-ui.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index d70ee1cf9..7b901116a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -134,6 +134,10 @@ Expects a `font-spec'.") ;; ;; Built-in packages +;; Handle ansi codes in compilation buffer +(add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) + + ;; show typed keystrokes in minibuffer (defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) (defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) @@ -244,11 +248,11 @@ Expects a `font-spec'.") ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'display-line-numbers-mode) -;; Emacs 26+ has native line number support, and will ignore nlinum. This is for -;; Emacs 25 users: (defun doom|enable-line-numbers () (display-line-numbers-mode +1)) (defun doom|disable-line-numbers () (display-line-numbers-mode -1)) +;; Emacs 26+ has native line number support, and will ignore nlinum. This is for +;; Emacs 25 users: (def-package! nlinum ;; Line number column. A faster (or equivalent, in the worst case) line number ;; plugin than `linum-mode'. @@ -349,9 +353,7 @@ frame's window-system, the theme will be reloaded.") (lwarn 'doom-ui :warning "Could not find the '%s' font on your system, falling back to system font" (font-get (caddr e) :family)) - (lwarn 'doom-ui :error - "Unexpected error while initializing fonts: %s" - (error-message-string e)))))) + (signal 'doom-error e))))) (defun doom|init-theme () "Set the theme and load the font, in that order." @@ -395,7 +397,7 @@ frame's window-system, the theme will be reloaded.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) ;; relegate tooltips to echo area only -(tooltip-mode -1) +(if (boundp 'tooltip-mode) (tooltip-mode -1)) ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. @@ -428,7 +430,6 @@ instead). Meant for `kill-buffer-query-functions'." (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil #'eq) (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil #'eq) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) - (add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) (add-hook 'emacs-startup-hook #'doom|init-ui) From b96d50b3def06109d6f34584071f30955dca0fe5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 11:51:08 -0400 Subject: [PATCH 3130/4235] history-length = 500 --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index a135c25ab..489a4b307 100644 --- a/core/core.el +++ b/core/core.el @@ -233,7 +233,7 @@ and `doom-exit-window-hook'." ;; History & backup settings (save nothing, that's what git is for) auto-save-default nil create-lockfiles nil - history-length 250 + history-length 500 make-backup-files nil ; don't create backup~ files ;; byte compilation byte-compile-verbose doom-debug-mode From f4e119a642acdfe76a8da24d53d27dbc04ef16e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 11:51:24 -0400 Subject: [PATCH 3131/4235] Couple core-packages to package.el sooner This way, if the user loads package.el themselves, doom's package.el settings will take effect immediately. --- core/core.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 489a4b307..c434269f2 100644 --- a/core/core.el +++ b/core/core.el @@ -523,13 +523,12 @@ in interactive sessions, nil otherwise (but logs a warning)." (require 'core-modules) (when noninteractive (require 'core-cli)) +(after! package + (require 'core-packages)) (doom-initialize noninteractive) (unless noninteractive (doom-initialize-modules)) -(after! package - (require 'core-packages)) - (provide 'core) ;;; core.el ends here From 6a44cf01247a428b17ac813d1e29e2a9722246d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 13:14:39 -0400 Subject: [PATCH 3132/4235] editor/reformat: refactor & fixes + Change +format-type to +format-region-p (now a boolean) + Add PRESERVE-INDENT-P boolean argument to +format-buffer + Add +format-preserve-indentation variable (only controls indent preservation during +format/buffer, not +format/region, where it's always enabled). + Fix error arising from +format|buffer hook when no formatter is defined for the current mode #893 + Change +format|buffer to alias for +format/buffer. --- modules/editor/format/autoload/format.el | 127 ++++++++++++----------- modules/editor/format/config.el | 6 ++ modules/lang/go/config.el | 2 +- 3 files changed, 74 insertions(+), 61 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 860f03104..4113effd5 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -1,6 +1,6 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- -(defvar +format-type 'buffer +(defvar +format-region-p 'buffer "A symbol representing whether the buffer or a region of it is being formatted. Can be 'buffer or 'region.") @@ -105,7 +105,7 @@ Stolen shamelessly from go-mode" (funcall orig-fn))) ;;;###autoload -(defun +format-buffer (formatter mode-result) +(defun +format-buffer (formatter mode-result &optional preserve-indent-p) "Format the source code in the current buffer. Returns any of the following values: @@ -120,52 +120,53 @@ position of the first change in the buffer. See `+format/buffer' for the interactive version of this function, and `+format|buffer' to use as a `before-save-hook' hook." - (unless formatter - (user-error "Don't know how to format '%s' code" major-mode)) - (let ((f-function (gethash formatter format-all-format-table)) - (executable (format-all-formatter-executable formatter)) - indent) - (pcase-let - ((`(,output ,errput ,first-diff) - ;; Since `format-all' functions (and various formatting functions, - ;; like `gofmt') widen the buffer, in order to only format a region of - ;; text, we must make a copy of the buffer to apply formatting to. - (let ((output (buffer-substring-no-properties (point-min) (point-max)))) - (with-temp-buffer - (insert output) - ;; Since we're piping a region of text to the formatter, remove - ;; any leading indentation to make it look like a file. - (setq indent (+format--current-indentation)) - (when (> indent 0) - (indent-rigidly (point-min) (point-max) (- indent))) - (funcall f-function executable mode-result))))) - (unwind-protect - (cond ((null output) 'error) - ((eq output t) 'noop) - ((let ((tmpfile (make-temp-file "doom-format")) - (patchbuf (get-buffer-create " *doom format patch*")) - (coding-system-for-read 'utf-8) - (coding-system-for-write 'utf-8)) - (unwind-protect - (progn - (with-current-buffer patchbuf - (erase-buffer)) - (with-temp-file tmpfile - (erase-buffer) - (insert output) - (when (> indent 0) - ;; restore indentation without affecting new - ;; indentation - (indent-rigidly (point-min) (point-max) - (max 0 (- indent (+format--current-indentation)))))) - (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) - 'noop - (+format--apply-rcs-patch patchbuf) - (list output errput first-diff))) - (kill-buffer patchbuf) - (delete-file tmpfile))))) - (unless (= 0 (length errput)) - (message "Formatter error output:\n%s" errput)))))) + (if (not formatter) + 'no-formatter + (let ((f-function (gethash formatter format-all-format-table)) + (executable (format-all-formatter-executable formatter)) + (indent 0)) + (pcase-let + ((`(,output ,errput ,first-diff) + ;; Since `format-all' functions (and various formatting functions, + ;; like `gofmt') widen the buffer, in order to only format a region of + ;; text, we must make a copy of the buffer to apply formatting to. + (let ((output (buffer-substring-no-properties (point-min) (point-max)))) + (with-temp-buffer + (insert output) + ;; Since we're piping a region of text to the formatter, remove + ;; any leading indentation to make it look like a file. + (when preserve-indent-p + (setq indent (+format--current-indentation)) + (when (> indent 0) + (indent-rigidly (point-min) (point-max) (- indent)))) + (funcall f-function executable mode-result))))) + (unwind-protect + (cond ((null output) 'error) + ((eq output t) 'noop) + ((let ((tmpfile (make-temp-file "doom-format")) + (patchbuf (get-buffer-create " *doom format patch*")) + (coding-system-for-read 'utf-8) + (coding-system-for-write 'utf-8)) + (unwind-protect + (progn + (with-current-buffer patchbuf + (erase-buffer)) + (with-temp-file tmpfile + (erase-buffer) + (insert output) + (when (> indent 0) + ;; restore indentation without affecting new + ;; indentation + (indent-rigidly (point-min) (point-max) + (max 0 (- indent (+format--current-indentation)))))) + (if (zerop (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "-" tmpfile)) + 'noop + (+format--apply-rcs-patch patchbuf) + (list output errput first-diff))) + (kill-buffer patchbuf) + (delete-file tmpfile))))) + (unless (= 0 (length errput)) + (message "Formatter error output:\n%s" errput))))))) ;; @@ -175,8 +176,19 @@ See `+format/buffer' for the interactive version of this function, and (defun +format/buffer (&optional arg) "Format the source code in the current buffer." (interactive "P") - (let ((+format-with (if arg (+format-completing-read)))) - (+format|buffer))) + (let ((+format-with (or (if arg (+format-completing-read)) +format-with))) + (pcase-let ((`(,formatter ,mode-result) (format-all-probe))) + (pcase + (+format-buffer + formatter mode-result + (or +format-preserve-indentation +format-region-p)) + (`no-formatter + (when (called-interactively-p 'any) + (message "No formatter specified for %s" major-mode)) + nil) + (`error (message "Failed to format buffer due to errors") nil) + (`noop (message "Buffer was already formatted") nil) + (_ (message "Formatted (%s)" formatter) t))))) ;;;###autoload (defun +format/region (beg end &optional arg) @@ -188,8 +200,8 @@ snippets or single lines." (interactive "rP") (save-restriction (narrow-to-region beg end) - (let ((+format-type 'region)) - (+format/buffer arg)))) + (let ((+format-region-p t)) + (call-interactively #'+format/buffer)))) ;;;###autoload (defun +format/region-or-buffer (beg end &optional arg) @@ -198,7 +210,7 @@ is selected)." (interactive "rP") (if (use-region-p) (+format/region beg end arg) - (+format/buffer arg))) + (call-interactively #'+format/buffer))) ;; @@ -210,12 +222,7 @@ is selected)." (add-hook 'before-save-hook #'+format|buffer nil t)) ;;;###autoload -(defun +format|buffer () +(defalias '+format|buffer #'+format/buffer "Format the source code in the current buffer with minimal feedback. -Meant for `before-save-hook'." - (pcase-let ((`(,formatter ,mode-result) (format-all-probe))) - (pcase (+format-buffer formatter mode-result) - (`error (message "Failed to format buffer due to errors") nil) - (`noop (message "Buffer was already formatted") nil) - (_ (message "Formatted (%s)" formatter) t)))) +Meant for `before-save-hook'.") diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index db213333a..7e36d9bb4 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -12,6 +12,12 @@ If nil, it is disabled in all modes, the same as if the +onsave flag wasn't Irrelevant if you do not have the +onsave flag enabled for this module.") +(defvar +format-preserve-indentation t + "If non-nil, the leading indentation is preserved when formatting the whole +buffer. This is particularly useful for partials. + +Indentation is always preserved when formatting regions. ") + (defvar-local +format-with nil "Set this to explicitly use a certain formatter for the current buffer.") diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 42c30116c..1e3fcc847 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -15,7 +15,7 @@ ;; Redefines default formatter to *not* use goimports if reformatting a ;; region; as it doesn't play well with partial code. (set-formatter! 'gofmt - '(("%s" (if (or (eq +format-type 'region) + '(("%s" (if (or +format-region-p (not (executable-find "goimports"))) "gofmt" "goimports")))) From d332f00ca7ceb3c18638b475bc439aa0a4eed753 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 13:21:24 -0400 Subject: [PATCH 3133/4235] ui/doom-modeline: fix evil visual block indicator #895 --- modules/ui/doom-modeline/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 753d93afa..030e46aa5 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -595,7 +595,7 @@ segment.") (def-modeline-segment! selection-info "Information about the current selection, such as how many characters and lines are selected, or the NxM dimensions of a block selection." - (when (and mark-active (active)) + (when (and (active) (or mark-active (eq evil-state 'visual))) (cl-destructuring-bind (beg . end) (if (eq evil-state 'visual) (cons evil-visual-beginning evil-visual-end) From 9e79ea8c9c82a1a9c491c0f2b926d05ffb2117fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 13:58:27 -0400 Subject: [PATCH 3134/4235] Bind C-w O => doom/window-zoom #890 + C-w o enlargens the current window + C-w O deletes all other windows Both keys undo the change on second use (unless you have changed the frame too much since). --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index ea83de3fe..f139c5631 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -214,6 +214,7 @@ "C-u" #'winner-undo "C-r" #'winner-redo "o" #'doom/window-enlargen + "O" #'doom/window-zoom ;; Delete window "c" #'+workspace/close-window-or-workspace "C-C" #'ace-delete-window)) From 80e8ccec1cdcd3d832690b05a5d7a37000cc8422 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 14:54:16 -0400 Subject: [PATCH 3135/4235] Alias +org-default-notes-file to org-default-notes-file --- modules/lang/org/+capture.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 4794bf657..6bc9881dd 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -15,8 +15,7 @@ (defvar +org-default-todo-file "todo.org" "TODO") -(defvar +org-default-notes-file "notes.org" - "TODO") +(defvaralias '+org-default-notes-file 'org-default-notes-file) (defvar org-capture-templates '(("t" "Todo" entry @@ -24,12 +23,13 @@ "* [ ] %?\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))) +;; (defun +org|init-capture () - (setq org-default-notes-file (expand-file-name +org-default-notes-file org-directory) - +org-default-todo-file (expand-file-name +org-default-todo-file org-directory)) + (setq org-default-notes-file (expand-file-name org-default-notes-file org-directory) + +org-default-todo-file (expand-file-name +org-default-todo-file org-directory)) (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) From 895df84f8b7425d976e1c5d88fe3888af1bdb186 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 15:07:21 -0400 Subject: [PATCH 3136/4235] Add key-to-key binding support to map! Experimental, and will eventually be replaced by general-simulate-key. --- core/core-keybinds.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index e63c780f0..2e5cb97f3 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -245,6 +245,16 @@ Example (unless (> (length rest) 0) (user-error "map! has no definition for %s key" key)) (setq def (pop rest)) + (when (or (vectorp def) + (stringp def)) + (setq def + `(lambda () (interactive) + (setq unread-command-events + (nconc (mapcar (lambda (ev) (cons t ev)) + (listify-key-sequence + ,(cond ((vectorp def) def) + ((stringp def) (kbd def))))) + unread-command-events))))) (when desc (push `(doom--keybind-register ,(key-description (eval key)) ,desc ',modes) From 0c39e73a1ec31d5a3a3f8b0533f483147a47c480 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 15:16:22 -0400 Subject: [PATCH 3137/4235] Refactor/reformat core-ui + Move minibuffer fringe disabler to ui/doom + Disable blink-cursor-mode (too distracting, causes other issues e.g. #892) --- core/core-keybinds.el | 5 --- core/core-ui.el | 71 ++++++++++++++++++--------------------- modules/ui/doom/config.el | 16 ++++++++- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 2e5cb97f3..9e0e1b927 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -60,11 +60,6 @@ If any hook returns non-nil, all hooks after it are ignored.") (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) (setq-hook! 'which-key-init-buffer-hook line-spacing 3) - (defun doom*no-fringes-in-which-key-buffer (&rest _) - (doom|no-fringes-in-minibuffer) - (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) - (advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) - (which-key-mode +1)) diff --git a/core/core-ui.el b/core/core-ui.el index 7b901116a..ed573188f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -134,19 +134,6 @@ Expects a `font-spec'.") ;; ;; Built-in packages -;; Handle ansi codes in compilation buffer -(add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) - - -;; show typed keystrokes in minibuffer -(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) -(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) -(doom|enable-ui-keystrokes) -;; ...but hide them while isearch is active -(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) -(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) - - (def-package! hl-line ; built-in ;; Highlights the current line :hook ((prog-mode text-mode conf-mode) . hl-line-mode) @@ -224,23 +211,6 @@ Expects a `font-spec'.") (newline-mark ?\n [?¬ ?\n]) (space-mark ?\ [?·] [?.]))) -(defun doom|highlight-non-default-indentation () - "Highlight whitespace that doesn't match your `indent-tabs-mode' setting." - (unless (or (bound-and-true-p global-whitespace-mode) - (bound-and-true-p whitespace-mode) - (eq indent-tabs-mode (default-value 'indent-tabs-mode)) - (eq major-mode 'fundamental-mode) - (derived-mode-p 'special-mode)) - (require 'whitespace) - (set (make-local-variable 'whitespace-style) - (if (or (bound-and-true-p whitespace-mode) - (bound-and-true-p whitespace-newline-mode)) - (cl-union (if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) - whitespace-style) - `(face ,@(if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) - trailing-lines tail))) - (whitespace-mode +1))) - ;; ;; Line numbers @@ -396,10 +366,24 @@ frame's window-system, the theme will be reloaded.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) + ;; relegate tooltips to echo area only (if (boundp 'tooltip-mode) (tooltip-mode -1)) -;; a good indicator that Emacs isn't frozen -(add-hook 'doom-init-ui-hook #'blink-cursor-mode) + +;; enabled by default; no thanks, too distracting +(blink-cursor-mode -1) + +;; Handle ansi codes in compilation buffer +(add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) + +;; show typed keystrokes in minibuffer +(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) +(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) +(doom|enable-ui-keystrokes) +;; ...but hide them while isearch is active +(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) +(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) + ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. (add-to-list 'default-frame-alist '(buffer-predicate . doom-buffer-frame-predicate)) ;; Prevent the glimpse of un-styled Emacs by setting these early. @@ -409,12 +393,6 @@ frame's window-system, the theme will be reloaded.") ;; prompts the user for confirmation when deleting a non-empty frame (global-set-key [remap delete-frame] #'doom/delete-frame) -(defun doom|no-fringes-in-minibuffer (&rest _) - "Disable fringes in the minibuffer window." - (set-window-fringes (minibuffer-window) 0 0 nil)) -(add-hook! '(doom-init-ui-hook minibuffer-setup-hook window-configuration-change-hook) - #'doom|no-fringes-in-minibuffer) - (defun doom|protect-visible-buffer () "Don't kill the current buffer if it is visible in another window (bury it instead). Meant for `kill-buffer-query-functions'." @@ -425,6 +403,23 @@ instead). Meant for `kill-buffer-query-functions'." "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." (not (eq (current-buffer) (doom-fallback-buffer)))) +(defun doom|highlight-non-default-indentation () + "Highlight whitespace that doesn't match your `indent-tabs-mode' setting." + (unless (or (bound-and-true-p global-whitespace-mode) + (bound-and-true-p whitespace-mode) + (eq indent-tabs-mode (default-value 'indent-tabs-mode)) + (eq major-mode 'fundamental-mode) + (derived-mode-p 'special-mode)) + (require 'whitespace) + (set (make-local-variable 'whitespace-style) + (if (or (bound-and-true-p whitespace-mode) + (bound-and-true-p whitespace-newline-mode)) + (cl-union (if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) + whitespace-style) + `(face ,@(if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) + trailing-lines tail))) + (whitespace-mode +1))) + (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil #'eq) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 44c74a63c..b2e792d47 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -58,5 +58,19 @@ #'solaire-mode-reset) ;; org-capture takes an org buffer and narrows it. The result is erroneously ;; considered an unreal buffer, so solaire-mode must be restored. - (add-hook 'org-capture-mode-hook #'turn-on-solaire-mode)) + (add-hook 'org-capture-mode-hook #'turn-on-solaire-mode) + ;; Because fringes can't be given a buffer-local face, they can look odd, so + ;; we remove them in the minibuffer and which-key popups (they serve no + ;; purpose there anyway). + (defun +doom|disable-fringes-in-minibuffer (&rest _) + (set-window-fringes (minibuffer-window) 0 0 nil)) + (add-hook 'solaire-mode-hook #'+doom|disable-fringes-in-minibuffer) + + (defun doom*no-fringes-in-which-key-buffer (&rest _) + (+doom|disable-fringes-in-minibuffer) + (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) + (advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) + + (add-hook! '(minibuffer-setup-hook window-configuration-change-hook) + #'+doom|disable-fringes-in-minibuffer)) From 5ef94de541b342d75917a8add2d645148170791d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 17:41:25 -0400 Subject: [PATCH 3138/4235] Minor refactor, reformat & comment revision --- modules/completion/company/config.el | 5 ++--- modules/completion/helm/config.el | 4 ++-- modules/config/default/config.el | 2 +- modules/lang/markdown/autoload.el | 1 - modules/lang/org/config.el | 4 ++-- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c4f382b74..ee697c837 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -92,9 +92,8 @@ ;; Until sebastiencs/company-box#40 is merged (defun +company*box-frontend-even-if-single (command) - (cond ((eq command 'hide) - (company-box-hide)) - ((equal company-candidates-length 0) + (cond ((or (eq command 'hide) + (equal company-candidates-length 0)) (company-box-hide)) ((eq command 'update) (company-box-show)) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 1f0309dc0..e59c95e3f 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -133,12 +133,12 @@ be negative.") (advice-add #'helm-ag-show-status-default-mode-line :override #'ignore) ;; TODO Find a better way - (defun +helm*use-helpful (orig-fn &rest args) + (defun +helm*use-helpful (orig-fn arg) (cl-letf (((symbol-function #'describe-function) (symbol-function #'helpful-callable)) ((symbol-function #'describe-variable) (symbol-function #'helpful-variable))) - (apply orig-fn args))) + (funcall orig-fn arg))) (advice-add #'helm-describe-variable :around #'+helm*use-helpful) (advice-add #'helm-describe-function :around #'+helm*use-helpful)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 8b662dee8..37b55265e 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -14,7 +14,7 @@ ;; ;; Config -;; Don't store authinfo in non-encrypted files! +;; Don't store authinfo in plain text! (defvar auth-sources (list (expand-file-name "authinfo.gpg" doom-etc-dir) "~/.authinfo.gpg")) diff --git a/modules/lang/markdown/autoload.el b/modules/lang/markdown/autoload.el index 9576e360d..e7ef946c7 100644 --- a/modules/lang/markdown/autoload.el +++ b/modules/lang/markdown/autoload.el @@ -20,4 +20,3 @@ (if (thing-at-point-looking-at +markdown--regex-del) (markdown-unwrap-thing-at-point nil 2 4) (markdown-wrap-or-insert delim delim 'word nil nil))))) - diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 750a3d015..5081a6d0a 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -402,9 +402,9 @@ conditions where a window's buffer hasn't changed at the time this hook is run." nil)))) (add-hook 'org-agenda-finalize-hook #'+org|exclude-agenda-buffers-from-workspace) - (defun +org*exclude-agenda-buffers-from-recentf (orig-fn &rest args) + (defun +org*exclude-agenda-buffers-from-recentf (orig-fn file) (let ((recentf-exclude (list (lambda (_file) t)))) - (apply orig-fn args))) + (funcall orig-fn file))) (advice-add #'org-get-agenda-file-buffer :around #'+org*exclude-agenda-buffers-from-recentf)) From 316aa428fbc3fcc8f3d120a0a228877fae16cf98 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 18:15:58 -0400 Subject: [PATCH 3139/4235] lang/evil: refactor +everywhere Removed unnecessary blocks and reduced the amount of code to maintain. --- modules/feature/evil/+everywhere.el | 130 +++++++--------------------- 1 file changed, 32 insertions(+), 98 deletions(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 481d61cad..b0b8db09f 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -43,103 +43,8 @@ variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") -(defun +evil-collection-init (module) - (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) - (when doom-debug-mode - (message "Loaded evil-collection-%s" (or (car-safe module) module))) - (with-demoted-errors "evil-collection error: %s" - (evil-collection-init (list module))))) - - -;; -;; Bootstrap - -(after! eldoc - (eldoc-add-command-completions "evil-window-")) - -(after! comint - (evil-define-key* 'normal comint-mode-map - (kbd "C-d") #'evil-scroll-down - (kbd "C-n") #'comint-next-input - (kbd "C-p") #'comint-previous-input - (kbd "gj") #'comint-next-input - (kbd "gk") #'comint-previous-input - (kbd "]") #'comint-next-input - (kbd "[") #'comint-previous-input) - (evil-define-key* 'insert comint-mode-map - (kbd "") #'comint-previous-input - (kbd "") #'comint-next-input)) - -(after! cus-edit - (evil-set-initial-state 'Custom-mode 'normal) - (evil-define-key* 'motion custom-mode-map - (kbd "") #'widget-forward - (kbd "S-") #'widget-backward - (kbd "") #'widget-backward - (kbd "]") #'widget-forward - (kbd "[") #'widget-backward - (kbd "C-n") #'widget-forward - (kbd "C-p") #'widget-backward - "gj" #'widget-forward - "gk" #'widget-backward) - (evil-define-key* 'normal custom-mode-map - (kbd "") #'Custom-newline - (kbd "C-o") #'Custom-goto-parent - "^" #'Custom-goto-parent - "<" #'Custom-goto-parent - ;; quit - "q" #'Custom-buffer-done - "ZQ" #'evil-quit - "ZZ" #'Custom-buffer-done)) - -(after! help-mode - (evil-set-initial-state 'help-mode 'normal) - (evil-define-key* 'normal help-mode-map - ;; motion - (kbd "SPC") #'scroll-up-command - (kbd "S-SPC") #'scroll-down-command - (kbd "C-f") #'scroll-up-command - (kbd "C-b") #'scroll-down-command - (kbd "") #'forward-button - (kbd "") #'backward-button - (kbd "C-o") #'help-go-back - (kbd "C-i") #'help-go-forward - ;; TODO: Enable more help-go-* bindings? - ;; "gj" #'help-go-forward - ;; "gk" #'help-go-back - ;; "\C-j" #'help-go-forward - ;; "\C-k" #'help-go-back - ;; The following bindings don't do what they are supposed to. "go" should - ;; open in the same window and "gO" should open in a different one. - "go" #'push-button - "gO" #'push-button - "g?" #'describe-mode - "gr" #'revert-buffer - "<" #'help-go-back - ">" #'help-go-forward - "r" #'help-follow - ;; quit - "q" #'quit-window - "ZQ" #'evil-quit - "ZZ" #'quit-window)) - -;; These modes belong to packages that Emacs always loads at startup, causing -;; evil-collection to load immediately. We avoid this by loading them on first -;; invokation of their associated major/minor modes. -(add-transient-hook! 'Buffer-menu-mode - (+evil-collection-init '(buff-menu "buff-menu"))) -(add-transient-hook! 'image-mode - (+evil-collection-init 'image)) -(add-transient-hook! 'emacs-lisp-mode - (+evil-collection-init 'elisp-mode)) -(add-transient-hook! 'occur-mode - (+evil-collection-init (if EMACS26+ 'replace "replace"))) - - -;; -;; Let 'er rip! - -(defvar evil-collection-setup-minibuffer nil) +;; This has to be defined here since evil-collection doesn't autoload its own. +;; It must be updated whenever evil-collection updates theirs. (defvar evil-collection-mode-list `(ag alchemist @@ -204,7 +109,7 @@ variable for an explanation of the defaults (in comments). See man magit magit-todos - ,@(when evil-collection-setup-minibuffer '(minibuffer)) + ,@(if (bound-and-true-p evil-collection-setup-minibuffer) '(minibuffer)) mu4e mu4e-conversation neotree @@ -250,6 +155,35 @@ variable for an explanation of the defaults (in comments). See youtube-dl (ztree ztree-diff))) +(defun +evil-collection-init (module) + (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) + (when doom-debug-mode + (message "Loaded evil-collection-%s" (or (car-safe module) module))) + (with-demoted-errors "evil-collection error: %s" + (evil-collection-init (list module))))) + + +;; +;; Bootstrap + +;; These modes belong to packages that Emacs always loads at startup, causing +;; evil-collection to load immediately. We avoid this by loading them after +;; evil-collection has first loaded... +(after! evil-collection + (let (+evil-collection-disabled-list) + (mapc #'+evil-collection-init '(comint custom help)))) + +;; ...or on first invokation of their associated major/minor modes. +(add-transient-hook! 'Buffer-menu-mode + (+evil-collection-init '(buff-menu "buff-menu"))) +(add-transient-hook! 'image-mode + (+evil-collection-init 'image)) +(add-transient-hook! 'emacs-lisp-mode + (+evil-collection-init 'elisp-mode)) +(add-transient-hook! 'occur-mode + (+evil-collection-init (if EMACS26+ 'replace "replace"))) + +;; Load the rest (dolist (mode evil-collection-mode-list) (dolist (req (or (cdr-safe mode) (list mode))) (with-eval-after-load req From b76a09539c0505c8a198a57c40f819d28f3151a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 21:38:41 -0400 Subject: [PATCH 3140/4235] Fix helm TAB completion from org-insert-link #897 #829 This is a tricky issue and a tricky fix. See the comments in the commit for an explanation. --- modules/ui/popup/+hacks.el | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index f30d81e96..500149021 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -169,6 +169,23 @@ the command buffer." (when (featurep! :completion helm) (setq helm-default-display-buffer-functions '(+popup-display-buffer-stacked-side-window)) + ;; Fix #897: "cannot open side window" error when TAB-completing file links + (defun +popup*hide-org-links-popup (orig-fn &rest args) + (cl-letf* ((old-org-completing-read (symbol-function 'org-completing-read)) + ((symbol-function 'org-completing-read) + (lambda (&rest args) + (when-let* ((win (get-buffer-window "*Org Links*"))) + ;; While helm opened as a popup, helm commands will mistaken + ;; the *Org Links* popup for the "originated window", and + ;; try to manipulate it, but since that is a popup too (as + ;; is a dedicated side window), Emacs errors and complains + ;; it can't do that. So we get rid of it. + (delete-window win) + (get-buffer-create "*Org Links*")) + (apply old-org-completing-read args)))) + (apply orig-fn args))) + (advice-add #'org-insert-link :around #'+popup*hide-org-links-popup) + ;; Fix left-over popup window when closing persistent help for `helm-M-x' (defun +popup*helm-elisp--persistent-help (candidate _fun &optional _name) (let (win) From 54e8577bf60bd7dbd89527ad5f28d80ab7584c04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 18 Sep 2018 22:48:21 -0400 Subject: [PATCH 3141/4235] Simplify doom|init-fonts: add xft font support custom-set-faces is somewhat overkill for this. It overwrites any user customizations for the default & variable-pitch faces, and saves them to custom-file, which may cause those settings to persist even when we don't want them to. This new solution is a little faster, is more respective of customizations, and adds XFT font string support. XFT font strings are a little more powerful. For example, the :antialias font-spec property was unreliable, but now you can use: (setq doom-font "Fira Mono:pixelsize=12:antialias=off") --- core/core-ui.el | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index ed573188f..90d8f3781 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -307,17 +307,21 @@ frame's window-system, the theme will be reloaded.") (defun doom|init-fonts () "Initialize fonts." (condition-case e - (custom-set-faces - (when (fontp doom-font) - (let ((xlfd (font-xlfd-name doom-font))) - (add-to-list 'default-frame-alist (cons 'font xlfd)) - `(fixed-pitch ((t (:font ,xlfd)))))) - (when (fontp doom-variable-pitch-font) - `(variable-pitch ((t (:font ,(font-xlfd-name doom-variable-pitch-font)))))) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t nil doom-unicode-font nil 'append) - nil)) + (progn + (when doom-font + (add-to-list + 'default-frame-alist + (cons 'font + (cond ((stringp doom-font) doom-font) + ((fontp doom-font) (font-xlfd-name doom-font)) + ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))))) + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch t + :width 'normal :weight 'normal :slant 'normal + :font doom-variable-pitch-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t nil doom-unicode-font nil 'append))) ((debug error) (if (string-prefix-p "Font not available: " (error-message-string e)) (lwarn 'doom-ui :warning From f25a5942e8b6a79099f1edc3ae5552d775cd2ef7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 00:01:33 -0400 Subject: [PATCH 3142/4235] lang/scala: fix void-variable dtrt-indent-hook-mapping-list --- modules/lang/scala/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index 74f9a7b21..29f5ae5f1 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -2,7 +2,8 @@ (after! scala-mode (setq scala-indent:align-parameters t) - (add-to-list 'dtrt-indent-hook-mapping-list '(scala-mode c/c++/java scala-indent:step))) + (after! dtrt-indent + (add-to-list 'dtrt-indent-hook-mapping-list '(scala-mode c/c++/java scala-indent:step)))) (after! ensime From 27e17ace67f4ce55cb4718938f207c839fef8e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Wed, 19 Sep 2018 21:38:50 +0100 Subject: [PATCH 3143/4235] Fix race condition in popup load MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When compiling everything I got this on Emacs startup: ``` Debugger entered--Lisp error: (void-variable +popup--display-buffer-alist) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist window--sides-inhibit-check t) (cond (+popup-mode (add-hook 'doom-escape-hook (function +popup|close-on-escape) t) (add-hook 'doom-cleanup-hook (function +popup|cleanup-rules)) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist window--sides-inhibit-check t) (let ((--dolist-tail-- +popup-window-parameters)) (while --dolist-tail-- (let ((prop (car --dolist-tail--))) (setq window-persistent-parameters (cons (cons prop 'writable) window-persistent-parameters)) (setq --dolist-tail-- (cdr --dolist-tail--)))))) (t (remove-hook 'doom-escape-hook (function +popup|close-on-escape)) (remove-hook 'doom-cleanup-hook (function +popup|cleanup-rules)) (setq display-buffer-alist +popup--old-display-buffer-alist window--sides-inhibit-check nil) (+popup|cleanup-rules) (let ((--dolist-tail-- +popup-window-parameters)) (while --dolist-tail-- (let ((prop (car --dolist-tail--))) (delq (assq prop window-persistent-parameters) window-persistent-parameters) (setq --dolist-tail-- (cdr --dolist-tail--))))))) (let ((last-message (current-message))) (setq-default +popup-mode (if (eq arg 'toggle) (not (default-value '+popup-mode)) (> (prefix-numeric-value arg) 0))) (cond (+popup-mode (add-hook 'doom-escape-hook (function +popup|close-on-escape) t) (add-hook 'doom-cleanup-hook (function +popup|cleanup-rules)) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist window--sides-inhibit-check t) (let ((--dolist-tail-- +popup-window-parameters)) (while --dolist-tail-- (let ((prop (car --dolist-tail--))) (setq window-persistent-parameters (cons (cons prop 'writable) window-persistent-parameters)) (setq --dolist-tail-- (cdr --dolist-tail--)))))) (t (remove-hook 'doom-escape-hook (function +popup|close-on-escape)) (remove-hook 'doom-cleanup-hook (function +popup|cleanup-rules)) (setq display-buffer-alist +popup--old-display-buffer-alist window--sides-inhibit-check nil) (+popup|cleanup-rules) (let ((--dolist-tail-- +popup-window-parameters)) (while --dolist-tail-- (let ((prop (car --dolist-tail--))) (delq (assq prop window-persistent-parameters) window-persistent-parameters) (setq --dolist-tail-- (cdr --dolist-tail--))))))) (run-hooks '+popup-mode-hook (if (default-value '+popup-mode) '+popup-mode-on-hook '+popup-mode-off-hook)) (if (called-interactively-p 'any) (progn (customize-mark-as-set '+popup-mode) (if (and (current-message) (not (equal last-message (current-message)))) nil (let ((local "")) (message "+Popup mode %sabled%s" (if (default-value '+popup-mode) "en" "dis") local)))))) +popup-mode() doom-try-run-hook(+popup-mode) run-hook-wrapped(doom-try-run-hook +popup-mode) doom|init-ui() run-hooks(emacs-startup-hook term-setup-hook) #f(compiled-function () #)() normal-top-level() ``` Signed-off-by: Edwin Török --- modules/ui/popup/autoload/settings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index ed685f686..0148adda2 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -1,5 +1,6 @@ ;;; ui/popup/autoload/settings.el -*- lexical-binding: t; -*- +;;;###autoload (defvar +popup--display-buffer-alist nil) ;;;###autoload From fae47fc448b7b5f50e5a899ce6f876d7ef9a6d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Wed, 19 Sep 2018 00:25:17 +0100 Subject: [PATCH 3144/4235] Emacs27+: reduce number of GCs on startup from 4 to 1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Edwin Török --- early-init.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/early-init.el b/early-init.el index c2c4a4a91..8beec8fb5 100644 --- a/early-init.el +++ b/early-init.el @@ -3,6 +3,12 @@ ;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el, ;; before package and UI initialization happens. + +(defconst doom-gc-cons-upper-limit 268435456 ; 256mb + "The temporary value for `gc-cons-threshold' to defer it.") +;; This reduces gcs-done from 4 to 1 on startup +(setq gc-cons-threshold doom-gc-cons-upper-limit) + ;; Package initialize occurs automatically, before `user-init-file' is ;; loaded, but after `early-init-file'. Doom handles package ;; initialization, so we must prevent Emacs from doing it early! From a9b4fe296011ad2b346ae990e464f9373b6e48ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 18:14:01 -0400 Subject: [PATCH 3145/4235] Hard code gc-cons-threshold in early-init.el In the interest of DRY-ness, I avoid redefining `doom-gc-cons-upper-limit`. This value is likely to diverge from the default value of `doom-gc-cons-upper-limit` in the future anyway. --- early-init.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/early-init.el b/early-init.el index 8beec8fb5..6d883882a 100644 --- a/early-init.el +++ b/early-init.el @@ -3,11 +3,8 @@ ;; Emacs HEAD (27+) introduces early-init.el, which is run before init.el, ;; before package and UI initialization happens. - -(defconst doom-gc-cons-upper-limit 268435456 ; 256mb - "The temporary value for `gc-cons-threshold' to defer it.") -;; This reduces gcs-done from 4 to 1 on startup -(setq gc-cons-threshold doom-gc-cons-upper-limit) +;; Defer garbage collection further back in the startup process +(setq gc-cons-threshold 268435456) ;; Package initialize occurs automatically, before `user-init-file' is ;; loaded, but after `early-init-file'. Doom handles package From fd7f49885821217b43829fb974e60f0a60aa6a67 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 11:23:03 -0400 Subject: [PATCH 3146/4235] tools/pdf: hide cursor in pdf-view-mode #892 --- modules/tools/pdf/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 8ea1b0139..fa67f4f26 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -29,6 +29,8 @@ (setq-default pdf-view-display-size 'fit-page) ;; Turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0)) + ;; Don't show the cursor in pdf-view + (add-hook! 'pdf-view-mode-hook (internal-show-cursor nil nil)) ;; Custom modeline that removes useless info and adds page numbers (when (featurep! :ui doom-modeline) (load! "+modeline")) From cc28aacecbad7f83a35df9cf577c7687a2184158 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 18:18:28 -0400 Subject: [PATCH 3147/4235] Don't inline DOOMDIR in doom-private-dir Breaks DOOMDIR when config is byte-compiled, as mentioned in #900 --- core/core.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index c434269f2..7efd876f4 100644 --- a/core/core.el +++ b/core/core.el @@ -57,14 +57,14 @@ Use this for files that change often, like cache files.") "Where the Doom manual is stored.") (defvar doom-private-dir - (eval-when-compile - (or (getenv "DOOMDIR") + (or (getenv "DOOMDIR") + (eval-when-compile (let ((xdg-path (expand-file-name "doom/" (or (getenv "XDG_CONFIG_HOME") "~/.config")))) - (if (file-directory-p xdg-path) xdg-path)) - "~/.doom.d/")) + (if (file-directory-p xdg-path) xdg-path))) + "~/.doom.d/") "Where your private customizations are placed. Must end in a slash. Respects XDG directory conventions if ~/.config/doom exists.") From ba16dd89540154bde3b58ccaa120650cf46dd651 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 19:41:46 -0400 Subject: [PATCH 3148/4235] Resolve symlinks in doom-emacs-dir (and inline it) --- core/core.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 7efd876f4..687d629df 100644 --- a/core/core.el +++ b/core/core.el @@ -25,7 +25,8 @@ line or use --debug-init to enable this.") ;; -(defvar doom-emacs-dir user-emacs-directory +(defvar doom-emacs-dir + (eval-when-compile (file-truename user-emacs-directory)) "The path to this emacs.d directory. Must end in a slash.") (defvar doom-core-dir (concat doom-emacs-dir "core/") From 228204926d32fbfbc01919e43ac77b4f4517d029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Sun, 16 Sep 2018 19:11:07 +0100 Subject: [PATCH 3149/4235] Load .elc even for themes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Even when an `.elc` is preset `load-theme` would attempt to load the `.el` first, to give the opportunity to inspect the theme. However we are loading themes automatically from (M)ELPA, and loading a theme package is no more dangerous than loading a regular package. So override the search order for themes and atttempt to load the `.elc` first. This improves startup time by ~25ms with the default theme. Improved implementation by @hlissner. Signed-off-by: Edwin Török --- core/core-ui.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/core-ui.el b/core/core-ui.el index 90d8f3781..b172bfff0 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -448,6 +448,16 @@ instead). Meant for `kill-buffer-query-functions'." (powerline-reset))) (advice-add #'load-theme :around #'doom*disable-old-themes-first) +(defun doom*prefer-compiled-theme (orig-fn &rest args) + "Make `load-theme' prioritize the byte-compiled theme (if it exists) for a +moderate boost in startup (or theme switch) time." + (cl-letf* ((old-locate-file (symbol-function 'locate-file)) + ((symbol-function 'locate-file) + (lambda (filename path &optional _suffixes predicate) + (funcall old-locate-file filename path '("c" "") predicate)))) + (apply orig-fn args))) +(advice-add #'load-theme :around #'doom*prefer-compiled-theme) + (defun doom|disable-whitespace-mode-in-childframes (frame) (when (frame-parameter frame 'parent-frame) (with-selected-frame frame From 9970fdac2c3007c6eba9707896d932858f537449 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 19:42:21 -0400 Subject: [PATCH 3150/4235] Enable highlight-numbers-mode in conf-modes --- 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 90d8f3781..16096292e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -100,7 +100,7 @@ Expects a `font-spec'.") ;; `highlight-numbers' --- better number literal fontification in code (def-package! highlight-numbers - :hook (prog-mode . highlight-numbers-mode) + :hook ((prog-mode conf-mode) . highlight-numbers-mode) :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) ;; `highlight-escape-sequences' From 1e710e94e39a9b43855bf4f0aa1fdcbcbd05dda9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 19:43:05 -0400 Subject: [PATCH 3151/4235] Minor refactors + cl-flet* -> cl-flet + refactor display-line-numbers-mode --- core/autoload/line-numbers.el | 6 +++--- core/autoload/message.el | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index a02a7b899..10862f1fd 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -73,12 +73,12 @@ To change the type of line numbers displayed by default, customize `display-line-numbers-type'. To change the type while the mode is on, set `display-line-numbers' directly." :lighter nil - (cond ((eq display-line-numbers-type 'relative) + (cond ((null display-line-numbers-type)) + ((eq display-line-numbers-type 'relative) (if display-line-numbers-mode (nlinum-relative-off) (nlinum-relative-on))) - ((not (null display-line-numbers-type)) - (nlinum-mode (if display-line-numbers-mode +1 -1))))) + ((nlinum-mode (if display-line-numbers-mode +1 -1))))) (defun display-line-numbers--turn-on () "Turn on `display-line-numbers-mode'." diff --git a/core/autoload/message.el b/core/autoload/message.el index b475cb5ad..e00eb0236 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -57,7 +57,7 @@ Otherwise, it maps colors to a term-color-* face." (defmacro format! (message &rest args) "An alternative to `format' that understands (color ...) and converts them into faces or ANSI codes depending on the type of sesssion we're in." - `(cl-flet* + `(cl-flet (,@(mapcar (lambda (rule) `(,(car rule) (lambda (message) (doom-ansi-apply ',(car rule) message)))) From 77255a63e0dd7056d15b364bcfaf9fc2dce8e0b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 23:26:53 -0400 Subject: [PATCH 3152/4235] lang/org: refactor & expand org-capture-templates + Adds three new default org-capture templates, for todo, notes and changelogs. It will use the first {todo,notes,changelog}.org file found up the file heirarchy from the current file, or will use {project-root}/X.org. + Variables in org-capture-templates are now resolved relative to org-directory, if they aren't absolute. + Display target file in org capture window header-line. Mentioned in #886. --- modules/lang/org/+capture.el | 90 ++++++++++++++++++------ modules/lang/org/autoload/org-capture.el | 35 ++++++++- 2 files changed, 103 insertions(+), 22 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 6bc9881dd..03988510e 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -2,43 +2,91 @@ (add-hook 'org-load-hook #'+org|init-capture) -;; Sets up two `org-capture' workflows that I like: -;; -;; 1. The traditional way: invoking `org-capture' directly (or through a -;; command, like :org). +;; Sets up some reasonable defaults, as well as two `org-capture' workflows that +;; I like: ;; +;; 1. The traditional way: invoking `org-capture' directly, via SPC X, or +;; through the :cap ex command. ;; 2. Through a org-capture popup frame that is invoked from outside Emacs (the -;; script is in ~/.emacs.d/bin). This lets me open an org-capture box -;; anywhere I can call org-capture (whether or not Emacs is open/running), -;; like, say, from qutebrowser, vimperator, dmenu or a global keybinding. +;; ~/.emacs.d/bin/org-capture script). This can be invoked from qutebrowser, +;; vimperator, dmenu or a global keybinding. -(defvar +org-default-todo-file "todo.org" - "TODO") +(defvar +org-capture-todo-file "todo.org" + "The path to your personal todo file. -(defvaralias '+org-default-notes-file 'org-default-notes-file) +Is relative to `org-directory', unless it is absolute. Is used in Doom's default +`org-capture-templates'.") + +(defvar +org-capture-notes-file "notes.org" + "The path to your personal notes file. + +Is relative to `org-directory', unless it is absolute. Is used in Doom's default +`org-capture-templates'.") + +(defvar +org-capture-changelog-file "changelog.org" + "The filename to use for project changelog files. + +It is used in Doom's default `org-capture-templates'.") (defvar org-capture-templates - '(("t" "Todo" entry - (file+headline +org-default-todo-file "Inbox") + '(("t" "Personal todo" entry + (file+headline +org-capture-todo-file "Inbox") "* [ ] %?\n%i" :prepend t :kill-buffer t) + ("n" "Personal notes" entry + (file+headline +org-capture-notes-file "Inbox") + "* %u %?\n%i" :prepend t :kill-buffer t) + + ;; Will use {project-root}/{todo,notes,changelog}.org, unless a + ;; {todo,notes,changelog}.org file is found in a parent directory. + ("p" "Templates for projects") + ("pt" "Project todo" entry ; {project-root}/todo.org + (file+headline +org-capture-project-todo-file "Inbox") + "* [ ] %?\n%i" :prepend t :kill-buffer t) + ("pn" "Project notes" entry ; {project-root}/notes.org + (file+headline +org-capture-project-notes-file "Inbox") + "* [ ] %?\n%i" :prepend t :kill-buffer t) + ("pc" "Project changelog" entry ; {project-root}/changelog.org + (file+headline +org-capture-project-notes-file "Unreleased") + "* [ ] %?\n%i" :prepend t :kill-buffer t))) + + +(defvar org-default-notes-file nil) ; defined in org.el - ("n" "Notes" entry - (file+headline org-default-notes-file "Inbox") - "* %u %?\n%i" :prepend t :kill-buffer t))) ;; (defun +org|init-capture () - (setq org-default-notes-file (expand-file-name org-default-notes-file org-directory) - +org-default-todo-file (expand-file-name +org-default-todo-file org-directory)) + (dolist (var '(+org-capture-todo-file + +org-capture-notes-file)) + (set var (expand-file-name (symbol-value var) org-directory))) + (unless org-default-notes-file + (setq org-default-notes-file +org-capture-notes-file)) (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) - ;; fix #462: when refiling from org-capture, Emacs prompts to kill the - ;; underlying, modified buffer. This fixes that. - (defun +org-capture*refile (&rest _) + (defun +org*expand-variable-paths (file) + "If a variable is used for a file path in `org-capture-template', it is used +as is, and expanded relative to `default-directory'. This changes it to be +relative to `org-directory', unless it is an absolute path." + (if (and (symbolp file) (boundp file)) + (expand-file-name (symbol-value file) org-directory) + file)) + (advice-add #'org-capture-expand-file :filter-args #'+org*expand-variable-paths) + + (defun +org*prevent-save-prompts-when-refiling (&rest _) + "Fix #462: when refiling from org-capture, Emacs prompts to kill the +underlying, modified buffer. This fixes that." (when (bound-and-true-p org-capture-is-refiling) (org-save-all-org-buffers))) - (advice-add 'org-refile :after #'+org-capture*refile) + (advice-add 'org-refile :after #'+org*prevent-save-prompts-when-refiling) + + (defun +org|show-target-in-capture-header () + (setq header-line-format + (format "%s%s%s" + (propertize (abbreviate-file-name (buffer-file-name (buffer-base-buffer))) + 'face 'font-lock-string-face) + org-eldoc-breadcrumb-separator + header-line-format))) + (add-hook 'org-capture-mode-hook #'+org|show-target-in-capture-header) (when (featurep! :feature evil) (add-hook 'org-capture-mode-hook #'evil-insert-state)) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 4efa77780..85c701923 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -3,7 +3,8 @@ (defvar org-capture-initial) -;; --- External frame --------------------- +;; +;; External frame ;;;###autoload (defvar +org-capture-frame-parameters @@ -70,3 +71,35 @@ you're done. This can be called from an external shell script." (defun +org-capture-available-keys () "TODO" (string-join (mapcar #'car org-capture-templates) "")) + + +;; +;; Capture targets + +(defun +org--capture-root (path) + (let ((filename (file-name-nondirectory path))) + (expand-file-name + filename + (or (locate-dominating-file (file-truename default-directory) + filename) + (if (doom-project-p 'nocache) (doom-project-root 'nocache)) + (user-error "Couldn't detect a project"))))) + +;;;###autoload +(defun +org-capture-project-todo-file () + "Find the nearest `+org-capture-todo-file' in a parent directory, otherwise, +opens a blank one at the project root. Throws an error if not in a project." + (+org--capture-root +org-capture-todo-file)) + +;;;###autoload +(defun +org-capture-project-notes-file () + "Find the nearest `+org-capture-notes-file' in a parent directory, otherwise, +opens a blank one at the project root. Throws an error if not in a project." + (+org--capture-root +org-capture-notes-file)) + +;;;###autoload +(defun +org-capture-project-changelog-file () + "Find the nearest `+org-capture-changelog-file' in a parent directory, +otherwise, opens a blank one at the project root. Throws an error if not in a +project." + (+org--capture-root +org-capture-changelog-file)) From f415762e8bdd06b0448c77fb0b0b9bc6addb8273 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 23:34:00 -0400 Subject: [PATCH 3153/4235] completion/ivy: fix ivy-rich integration --- modules/completion/ivy/config.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 59f2724e3..ac7022246 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -66,12 +66,6 @@ immediately runs it on the current candidate (ending the ivy session)." (ivy-mode +1) - ;; Show more buffer information in switch-buffer commands - (after! ivy-rich - (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer - counsel-projectile-switch-to-buffer)) - (ivy-set-display-transformer cmd '+ivy-buffer-transformer))) - (def-package! ivy-hydra :commands (ivy-dispatching-done-hydra ivy--matcher-desc) :init @@ -80,6 +74,15 @@ immediately runs it on the current candidate (ending the ivy session)." (kbd "M-o") #'ivy-dispatching-done-hydra))) +(def-package! ivy-rich + :hook (ivy-mode . ivy-rich-mode) + :config + ;; Show more buffer information in other switch-buffer commands too + (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer + counsel-projectile-switch-to-buffer)) + (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer))) + + (def-package! counsel :commands counsel-describe-face :init From 40a2fffac756440881b29c72700be2a75ed43a24 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 23:48:05 -0400 Subject: [PATCH 3154/4235] tools/upload: clarify instructions in comments --- modules/tools/upload/config.el | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/tools/upload/config.el b/modules/tools/upload/config.el index 19615aa4a..ce1dcfe15 100644 --- a/modules/tools/upload/config.el +++ b/modules/tools/upload/config.el @@ -1,17 +1,16 @@ ;;; tools/upload/config.el -*- lexical-binding: t; -*- -;; Uses `ssh-deploy' to map a local folder to a remote one. Use -;; `ssh-deploy-root-remote' and `ssh-deploy-root-local' to set up this mapping. +;; Uses `ssh-deploy' to map a local folder to a remote one. Set +;; `ssh-deploy-root-remote' and `ssh-deploy-root-local' in a .dir-locals.el file +;; to establish this mapping. ;; ;; Example: -;; (setq ssh-deploy-root-local "/home/hlissner/work/site/" -;; ssh-deploy-root-remote "/ssh:hlissner@myserver.com:/var/www/site/" -;; ssh-deploy-on-explicity-save t) +;; ((nil . ((ssh-deploy-root-local . "/local/path/to/project") +;; (ssh-deploy-root-remote . "/ssh:user@server:/remote/project/") +;; (ssh-deploy-on-explicity-save . t)))) ;; ;; Note: `ssh-deploy-root-local' is optional, and will resort to ;; `doom-project-root' if unspecified. -;; -;; Can be used via .dir-locals.el file in your project. (def-package! ssh-deploy :commands (ssh-deploy-upload-handler From e0e63850d40834df6c7aac9ab1afc4171003529f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 23:51:56 -0400 Subject: [PATCH 3155/4235] tools/upload: mark file-local variables as safe --- modules/tools/upload/config.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/tools/upload/config.el b/modules/tools/upload/config.el index ce1dcfe15..d94542cab 100644 --- a/modules/tools/upload/config.el +++ b/modules/tools/upload/config.el @@ -19,6 +19,16 @@ ssh-deploy-browse-remote-handler ssh-deploy-remote-changes-handler) :init + ;; Make these safe as file-local variables + (dolist (sym '(ssh-deploy-root-local + ssh-deploy-root-remote + ssh-deploy-async + ssh-deploy-script)) + (put sym 'safe-local-variable #'stringp)) + (put 'ssh-deploy-on-explicitly-save 'safe-local-variable #'booleanp) + (put 'ssh-deploy-async 'safe-local-variable #'booleanp) + (put 'ssh-deploy-exclude-list 'safe-local-variable #'listp) + ;; Maybe auto-upload on save (defun +upload|init-after-save () (when (and (bound-and-true-p ssh-deploy-root-remote) From 25d19514de40d5141e446f06a0f401e96ef22a73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 19 Sep 2018 23:58:01 -0400 Subject: [PATCH 3156/4235] tools/upload: refactor safe-local-variable setters --- modules/tools/upload/config.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/modules/tools/upload/config.el b/modules/tools/upload/config.el index d94542cab..7e2c19246 100644 --- a/modules/tools/upload/config.el +++ b/modules/tools/upload/config.el @@ -20,14 +20,13 @@ ssh-deploy-remote-changes-handler) :init ;; Make these safe as file-local variables - (dolist (sym '(ssh-deploy-root-local - ssh-deploy-root-remote - ssh-deploy-async - ssh-deploy-script)) - (put sym 'safe-local-variable #'stringp)) - (put 'ssh-deploy-on-explicitly-save 'safe-local-variable #'booleanp) - (put 'ssh-deploy-async 'safe-local-variable #'booleanp) - (put 'ssh-deploy-exclude-list 'safe-local-variable #'listp) + (dolist (sym '((ssh-deploy-root-local . stringp) + (ssh-deploy-root-remote . stringp) + (ssh-deploy-script . functionp) + (ssh-deploy-on-explicitly-save . booleanp) + (ssh-deploy-async . booleanp) + (ssh-deploy-exclude-list . listp))) + (put (car sym) 'safe-local-variable (cdr sym))) ;; Maybe auto-upload on save (defun +upload|init-after-save () From b6530395359aaf1919f7ed52ccf6524f8424c666 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 10:41:19 -0400 Subject: [PATCH 3157/4235] Add :defer-incrementally use-package keyword --- core/core-editor.el | 24 ++++++++++++------------ core/core-modules.el | 13 +++++++++++++ modules/tools/magit/config.el | 3 +-- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index bba32d48a..2f7ab56d2 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -78,6 +78,16 @@ fundamental-mode) for performance sake." (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. +(def-package! server + :when (display-graphic-p) + :defer 1 + :after-call (pre-command-hook after-find-file) + :config + (when-let* ((name (getenv "EMACS_SERVER_NAME"))) + (setq server-name name)) + (unless (server-running-p) + (server-start))) + (def-package! autorevert ;; revert buffers for changed files :after-call after-find-file @@ -87,7 +97,7 @@ fundamental-mode) for performance sake." (def-package! savehist ;; persist variables across sessions - :defer 1 + :defer-incrementally (custom savehist) :after-call post-command-hook :config (setq savehist-file (concat doom-cache-dir "savehist") @@ -119,7 +129,7 @@ savehist file." (def-package! recentf ;; Keep track of recently opened files - :defer 1 + :defer-incrementally (easymenu tree-widget timer recentf) :after-call after-find-file :commands recentf-open-files :config @@ -138,16 +148,6 @@ savehist file." (add-hook 'kill-emacs-hook #'recentf-cleanup) (quiet! (recentf-mode +1)))) -(def-package! server - :when (display-graphic-p) - :defer 1 - :after-call (pre-command-hook after-find-file) - :config - (when-let* ((name (getenv "EMACS_SERVER_NAME"))) - (setq server-name name)) - (unless (server-running-p) - (server-start))) - ;; ;; Packages diff --git a/core/core-modules.el b/core/core-modules.el index d3567fa31..808b1b30c 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -204,10 +204,23 @@ non-nil, return paths of possible modules, activated or otherwise." ;; remove itself from the hook/function). (defvar doom--deferred-packages-alist '(t)) (after! use-package-core + (add-to-list 'use-package-deferring-keywords :defer-incrementally nil #'eq) (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) + + (setq use-package-keywords + (use-package-list-insert :defer-incrementally use-package-keywords :after)) (setq use-package-keywords (use-package-list-insert :after-call use-package-keywords :after)) + (defalias 'use-package-normalize/:defer-incrementally 'use-package-normalize-symlist) + (defun use-package-handler/:defer-incrementally (name _keyword targets rest state) + (use-package-concat + `((doom-load-packages-incrementally + ',(if (listp targets) + targets + (list name)))) + (use-package-process-keywords name rest state))) + (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) (defun use-package-handler/:after-call (name _keyword hooks rest state) (if (plist-get state :demand) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 8157147db..6792eecec 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -16,10 +16,9 @@ available.") (def-package! magit :commands magit-file-delete + :defer-incrementally (dash f s with-editor git-commit package magit) :init (setq magit-auto-revert-mode nil) ; we already use `global-auto-revert-mode' - (doom-load-packages-incrementally - '(dash f s with-editor git-commit package magit)) :config (setq magit-completing-read-function (if (featurep! :completion ivy) From c8b07f3caa1f07fa557e82f00f8259188d694e1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 10:41:47 -0400 Subject: [PATCH 3158/4235] Fail gracefully if incremental load fails ...and continue loading other packages regardless. --- core/core.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 687d629df..59c7e22b8 100644 --- a/core/core.el +++ b/core/core.el @@ -344,7 +344,8 @@ intervals." (when req (when doom-debug-mode (message "Incrementally loading %s" req)) - (require req) + (unless (require req nil t) + (message "Failed to load '%s' package incrementally" req)) (when reqs (run-with-idle-timer doom-incremental-idle-timer nil #'doom-load-packages-incrementally From 3cd0db82b8fee33e6e7c0945b1450ca52307f1e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 14:14:11 -0400 Subject: [PATCH 3159/4235] Append setq-hook! hooks So that later setq-hook! calls will overwrite earlier ones. --- core/core-lib.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index e9275d53c..b13015af0 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -274,8 +274,8 @@ Body forms can access the hook's arguments through the let-bound variable fill-column 80)" (declare (indent 1)) (unless (= 0 (% (length rest) 2)) - (signal 'wrong-number-of-arguments (length rest))) - `(add-hook! ,hooks + (signal 'wrong-number-of-arguments (listp #'evenp (length rest)))) + `(add-hook! :append ,hooks ,@(let (forms) (while rest (let ((var (pop rest)) From e38b710f296b302bb0f2efa887850253c95a7f1f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 14:16:21 -0400 Subject: [PATCH 3160/4235] Update docstrings for theme & font variables --- core/core-ui.el | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index bd739b749..886f3669f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -1,21 +1,29 @@ ;;; core-ui.el -*- lexical-binding: t; -*- (defvar doom-theme nil - "A symbol representing the color theme to load.") + "A symbol representing the Emacs theme to load at startup. + +This is changed when `load-theme' is used as well.") (defvar doom-font nil - "The default font to use. Expects a `font-spec'.") + "The default font to use. Expects either a `font-spec' or a XFT font string. + +Examples: + (setq doom-font (font-spec :family \"Fira Mono\" :size 12)) + (setq doom-font \"Terminus (TTF):pixelsize=12:antialias=off\")") (defvar doom-big-font nil - "The default large font to use when `doom-big-font-mode' is enabled. Expects a -`font-spec'.") + "The font to use when `doom-big-font-mode' is enabled. Expects either a +`font-spec' or a XFT font string. See `doom-font' for examples.") (defvar doom-variable-pitch-font nil - "The default font to use for variable-pitch text. Expects a `font-spec'.") + "The font to use for variable-pitch text. Expects either a `font-spec' +or a XFT font string. See `doom-font' for examples.") (defvar doom-unicode-font nil "Fallback font for unicode glyphs. Is ignored if :feature unicode is active. -Expects a `font-spec'.") +Expects either a `font-spec' or a XFT font string. See `doom-font' for +examples.") ;; From cc1c28a27c8ab3c79bdc392627225b37dee822d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 15:01:28 -0400 Subject: [PATCH 3161/4235] Fix dual windows when opening files via terminal #850 --- modules/ui/doom-dashboard/config.el | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 65700c31c..a309d3501 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -101,7 +101,16 @@ PLIST can have the following properties: ;; Bootstrap (setq doom-fallback-buffer-name +doom-dashboard-name - initial-buffer-choice #'+doom-dashboard-initial-buffer) + ;; Fixes #850: `emacs file.txt' opens two windows, one for file.txt and + ;; one for `initial-buffer-choice' (in `command-line-1'). We want one or + ;; the other, not both. + initial-buffer-choice + (when (or (daemonp) + (not (cl-loop for arg in (cdr command-line-args) + if (and (string-match-p "^[^-]" arg) + (file-exists-p arg)) + return t))) + #'+doom-dashboard-initial-buffer)) (add-hook 'window-setup-hook #'+doom-dashboard|init) @@ -264,9 +273,7 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (if (string-match-p "^ ?\\*\\(?:scratch\\|server\\)" (buffer-name)) - (get-buffer-create +doom-dashboard-name) - (current-buffer))) + (get-buffer-create +doom-dashboard-name)) (defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." From aa08f338de6e46e29c86953f3c3a30044b536b9b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 15:28:03 -0400 Subject: [PATCH 3162/4235] lang/emacs-lisp: add outline-minor-mode And simplify outline-regexp for elisp buffers. --- modules/lang/emacs-lisp/config.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index c8e2f6ca1..9e875a81b 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -47,15 +47,19 @@ ("add-hook" "remove-hook") ("add-hook!" "remove-hook!"))) - ;; [pedantry intensifies] - (setq-hook! 'emacs-lisp-mode-hook mode-name "Elisp") + (setq-hook! 'emacs-lisp-mode-hook + ;; shorter name in modeline + mode-name "Elisp" + ;; Don't treat autoloads or sexp openers as outline headers, we have + ;; hideshow for that. + outline-regexp ";;;;* [^ \t\n]") ;; variable-width indentation is superior in elisp (add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) (add-hook! 'emacs-lisp-mode-hook #'(;; 3rd-party functionality - auto-compile-on-save-mode + auto-compile-on-save-mode outline-minor-mode ;; initialization +emacs-lisp|extend-imenu)) From c3b39be4aba2b534a72791d4197af06b4f751fb6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 15:43:42 -0400 Subject: [PATCH 3163/4235] lang/crystal: improve dtrt-indent support --- modules/lang/crystal/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index d75ed9b3a..ac221d42a 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -7,7 +7,9 @@ (set-eval-handler! 'crystal-mode '((:command . "crystal") (:exec . "%c %s") - (:description . "Run Crystal script")))) + (:description . "Run Crystal script"))) + (after! dtrt-indent + (add-to-list 'dtrt-indent-hook-mapping-list '(crystal-mode ruby crystal-indent-level)))) (def-package! flycheck-crystal From 9245e030bbd10e426a298bff665f086305e01622 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 22:22:14 -0400 Subject: [PATCH 3164/4235] Fix doom/reload-font for XFT fonts --- core/autoload/ui.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 4201549a8..3146407c6 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -146,7 +146,7 @@ windows (unlike `doom/window-zoom') Activate again to undo." "Reload `doom-font', `doom-variable-pitch-font', and `doom-unicode-font', if set." (interactive) - (when (fontp doom-font) + (when doom-font (set-frame-font doom-font t)) (doom|init-fonts)) From 6fce87bd06465cef191bee58bcaa5df924b7eb8a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 22:23:33 -0400 Subject: [PATCH 3165/4235] feature/evil: refactor folding & outline support Code folding commands will now obey outline headers (if outline-minor-mode is on and in outline-mode). --- modules/emacs/hideshow/autoload.el | 6 ++ modules/emacs/hideshow/config.el | 9 +- modules/feature/evil/autoload/folds.el | 138 ++++++++++++++++--------- modules/feature/evil/config.el | 14 +-- 4 files changed, 108 insertions(+), 59 deletions(-) diff --git a/modules/emacs/hideshow/autoload.el b/modules/emacs/hideshow/autoload.el index d676d57bc..a2bc009e5 100644 --- a/modules/emacs/hideshow/autoload.el +++ b/modules/emacs/hideshow/autoload.el @@ -5,6 +5,12 @@ "Face to hightlight `hideshow' overlays." :group 'doom-themes) +;;;###autoload +(defun +hideshow*ensure-mode (&rest _) + "Ensure hs-minor-mode is enabled." + (unless (bound-and-true-p hs-minor-mode) + (hs-minor-mode +1))) + ;;;###autoload (defun +hideshow-haml-forward-sexp (arg) (haml-forward-sexp arg) diff --git a/modules/emacs/hideshow/config.el b/modules/emacs/hideshow/config.el index 900f2cd4b..b68fb1157 100644 --- a/modules/emacs/hideshow/config.el +++ b/modules/emacs/hideshow/config.el @@ -25,7 +25,14 @@ enh-ruby-forward-sexp nil) (matlab-mode "if\\|switch\\|case\\|otherwise\\|while\\|for\\|try\\|catch" "end" - nil (lambda (arg) (matlab-forward-sexp)))) + nil (lambda (_arg) (matlab-forward-sexp)))) hs-special-modes-alist '((t)))))) + +;; Ensure `hs-minor-mode' is active when triggering these commands +(advice-add #'hs-toggle-hiding :before #'+hideshow*ensure-mode) +(advice-add #'hs-hide-block :before #'+hideshow*ensure-mode) +(advice-add #'hs-hide-level :before #'+hideshow*ensure-mode) +(advice-add #'hs-show-all :before #'+hideshow*ensure-mode) +(advice-add #'hs-hide-all :before #'+hideshow*ensure-mode) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index 99daa6466..99de9190d 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -1,38 +1,34 @@ ;;; feature/evil/autoload/folds.el -*- lexical-binding: t; -*- -(require 'evil-vimish-fold) (require 'hideshow) ;; `hideshow' is a decent code folding implementation, but it won't let you -;; create custom folds. `evil-vimish-fold' offers custom folds, but essentially +;; create custom folds. `vimish-fold' offers custom folds, but essentially ;; ignores any other type of folding (indent or custom markers, which -;; hs-minor-mode gives you). +;; hs-minor-mode and `outline-mode' give you). ;; ;; So this is my effort to combine them. (defun +evil--vimish-fold-p () - (cl-some #'vimish-fold--vimish-overlay-p (overlays-at (point)))) + (and (featurep 'vimish-fold) + (cl-some #'vimish-fold--vimish-overlay-p + (overlays-at (point))))) -(defun +evil--ensure-modes (&rest _) - "Ensure hs-minor-mode is enabled." - (unless (bound-and-true-p hs-minor-mode) - (hs-minor-mode +1))) +(defun +evil--outline-fold-p () + (and (or (bound-and-true-p outline-minor-mode) + (derived-mode-p 'outline-mode)) + (outline-on-heading-p))) -(advice-add #'hs-toggle-hiding :before #'+evil--ensure-modes) -(advice-add #'hs-hide-block :before #'+evil--ensure-modes) -(advice-add #'hs-hide-level :before #'+evil--ensure-modes) -(advice-add #'hs-show-all :before #'+evil--ensure-modes) -(advice-add #'hs-hide-all :before #'+evil--ensure-modes) +(defun +evil--hideshow-fold-p () + (hs-minor-mode +1) + (save-excursion + (ignore-errors + (or (hs-looking-at-block-start-p) + (hs-find-block-beginning))))) -;; --- fold commands ---------------------- - -;;;###autoload -(defun +evil-fold-p () - (or (+evil--vimish-fold-p) - (ignore-errors - (+evil--ensure-modes) - (hs-already-hidden-p)))) +;; +;; Code folding (defmacro +evil-from-eol (&rest body) "Perform action after moving to the end of the line." @@ -40,47 +36,87 @@ (end-of-line) ,@body)) -;;;###autoload (autoload '+evil:fold-toggle "feature/evil/autoload/folds" nil t) -(evil-define-command +evil:fold-toggle () +;;;###autoload +(defun +evil/fold-toggle () (interactive) - (if (+evil--vimish-fold-p) - (vimish-fold-toggle) - (+evil-from-eol (hs-toggle-hiding)))) + (save-excursion + (cond ((+evil--vimish-fold-p) (vimish-fold-toggle)) + ((+evil--hideshow-fold-p) (+evil-from-eol (hs-toggle-hiding))) + ((+evil--outline-fold-p) (outline-toggle-children))))) -;;;###autoload (autoload '+evil:fold-open "feature/evil/autoload/folds" nil t) -(evil-define-command +evil:fold-open () +;;;###autoload +(defun +evil/fold-open () (interactive) - (if (+evil--vimish-fold-p) - (vimish-fold-unfold) - (+evil-from-eol (hs-show-block)))) + (save-excursion + (cond ((+evil--vimish-fold-p) (vimish-fold-unfold)) + ((+evil--hideshow-fold-p) (+evil-from-eol (hs-show-block))) + ((+evil--outline-fold-p) + (outline-show-children) + (outline-show-entry))))) -;;;###autoload (autoload '+evil:fold-close "feature/evil/autoload/folds" nil t) -(evil-define-command +evil:fold-close () +;;;###autoload +(defun +evil/fold-close () (interactive) - (if (+evil--vimish-fold-p) - (vimish-fold-refold) - (+evil-from-eol (hs-hide-block)))) + (save-excursion + (cond ((+evil--vimish-fold-p) (vimish-fold-refold)) + ((+evil--hideshow-fold-p) (+evil-from-eol (hs-hide-block))) + ((+evil--outline-fold-p) (outline-hide-subtree))))) -;;;###autoload (autoload '+evil:fold-open-all "feature/evil/autoload/folds" nil t) -(evil-define-command +evil:fold-open-all (&optional level) +;;;###autoload +(defun +evil/fold-open-all (&optional level) "Open folds at LEVEL (or all folds if LEVEL is nil)." - (interactive "") - (vimish-fold-unfold-all) - (if (integerp level) - (hs-hide-level (1- level)) - (hs-show-all))) + (interactive + (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) + (when (featurep 'vimish-fold) + (vimish-fold-unfold-all)) + (save-excursion + (if (integerp level) + (progn + (outline-hide-sublevels (max 1 (1- level))) + (hs-life-goes-on + (hs-hide-level-recursive (1- level) (point-min) (point-max)))) + (hs-show-all) + (when (fboundp 'outline-show-all) + (outline-show-all))))) -;;;###autoload (autoload '+evil:fold-close-all "feature/evil/autoload/folds" nil t) -(evil-define-command +evil:fold-close-all (&optional level) +;;;###autoload +(defun +evil/fold-close-all (&optional level) "Close folds at LEVEL (or all folds if LEVEL is nil)." - (interactive "") - (vimish-fold-refold-all) - (if (integerp level) - (hs-hide-level (1- level)) - (hs-hide-all))) + (interactive + (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) + (save-excursion + (when (featurep 'vimish-fold) + (vimish-fold-refold-all)) + (if (integerp level) + (progn + (when (fboundp 'outline-hide-sublevels) + (outline-hide-sublevels (max 1 (1- level)))) + (hs-life-goes-on + (hs-hide-level-recursive (1- level) (point-min) (point-max)))) + (when (fboundp 'outline-hide-sublevels) + (outline-hide-sublevels 1)) + (hs-hide-all)))) + +(defun +evil--invisible-points (count) + (let (points) + (save-excursion + (catch 'abort + (if (< count 0) (beginning-of-line)) + (while (re-search-forward hs-block-start-regexp nil t + (if (> count 0) 1 -1)) + (unless (invisible-p (point)) + (end-of-line) + (when (hs-already-hidden-p) + (push (point) points) + (when (>= (length points) count) + (throw 'abort nil)))) + (forward-line (if (> count 0) 1 -1))))) + points)) -;; --- misc ------------------------------- + +;; +;; Misc ;;;###autoload (defun +evil/matchit-or-toggle-fold () diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index a0e61fafd..5f8384d13 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -73,14 +73,14 @@ line with a linewise comment.") ;; `evil-delete' in wgrep buffers. (define-key wgrep-mode-map [remap evil-delete] #'+evil-delete)) - ;; replace native folding commands + ;; Add vimish-fold, outline-mode & hideshow support to folding commands (define-key! 'global - [remap evil-toggle-fold] #'+evil:fold-toggle - [remap evil-close-fold] #'+evil:fold-close - [remap evil-open-fold] #'+evil:fold-open - [remap evil-open-fold-rec] #'+evil:fold-open - [remap evil-close-folds] #'+evil:fold-close-all - [remap evil-open-folds] #'+evil:fold-open-all) + [remap evil-toggle-fold] #'+evil/fold-toggle + [remap evil-close-fold] #'+evil/fold-close + [remap evil-open-fold] #'+evil/fold-open + [remap evil-open-fold-rec] #'+evil/fold-open + [remap evil-close-folds] #'+evil/fold-close-all + [remap evil-open-folds] #'+evil/fold-open-all) (defun +evil|disable-highlights () "Disable ex search buffer highlights." From 5410f1d57592c0ae9b2202698f88953d246a4f65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 22:24:34 -0400 Subject: [PATCH 3166/4235] feature/evil: add arbitrary code folding keybinds --- modules/feature/evil/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 5f8384d13..00954bbef 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -325,6 +325,11 @@ the new algorithm is confusing, like in python or ruby." :init (setq vimish-fold-dir (concat doom-cache-dir "vimish-fold/") vimish-fold-indication-mode 'right-fringe) + (evil-define-key* 'motion 'global + "zf" #'evil-vimish-fold/create + "zF" #'evil-vimish-fold/create-line + "zd" #'vimish-fold-delete + "zE" #'vimish-fold-delete-all) :config (vimish-fold-global-mode +1)) From feabbc31dab51c84cd4785f973053fb86241deed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 22:25:42 -0400 Subject: [PATCH 3167/4235] feature/evil: add +evil/fold-{next,previous} Brings zj/zk to evil --- modules/feature/evil/autoload/folds.el | 27 ++++++++++++++++++++++++++ modules/feature/evil/config.el | 3 +++ 2 files changed, 30 insertions(+) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index 99de9190d..68cf16ad5 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -113,6 +113,33 @@ (forward-line (if (> count 0) 1 -1))))) points)) +;;;###autoload +(defun +evil/fold-next (count) + "Jump to the next vimish fold, outline heading or folded region." + (interactive "p") + (cl-loop with orig-pt = (point) + for fn + in (list (lambda () + (when hs-block-start-regexp + (car (+evil--invisible-points count)))) + (lambda () + (if (> count 0) + (evil-vimish-fold/next-fold count) + (evil-vimish-fold/previous-fold (- count))) + (if (/= (point) orig-pt) (point)))) + if (save-excursion (funcall fn)) + collect it into points + finally do + (if-let* ((pt (car (sort points (if (> count 0) #'< #'>))))) + (goto-char pt) + (message "No more folds %s point" (if (> count 0) "after" "before")) + (goto-char orig-pt)))) + +;;;###autoload +(defun +evil/fold-previous (count) + "Jump to the previous vimish fold, outline heading or folded region." + (interactive "p") + (+evil/fold-next (- count))) ;; diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 00954bbef..fd56b336d 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -81,6 +81,9 @@ line with a linewise comment.") [remap evil-open-fold-rec] #'+evil/fold-open [remap evil-close-folds] #'+evil/fold-close-all [remap evil-open-folds] #'+evil/fold-open-all) + (evil-define-key* 'motion 'global + "zj" #'+evil/fold-next + "zk" #'+evil/fold-previous) (defun +evil|disable-highlights () "Disable ex search buffer highlights." From 1b3511890ede16c79616816c8c3ced43c5db23f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 22:27:15 -0400 Subject: [PATCH 3168/4235] feature/evil: fix overzealous folding from :n TAB Changes +evil/matchit-or-toggle-fold to be less trigger-happy about toggling folds (it will only open folds not, not toggle them). Also updates its docstring. --- modules/feature/evil/autoload/folds.el | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index 68cf16ad5..1acefc5dd 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -147,15 +147,16 @@ ;;;###autoload (defun +evil/matchit-or-toggle-fold () - "Do what I mean. If on a fold-able element, toggle the fold with -`hs-toggle-hiding'. Otherwise, if on a delimiter, jump to the matching one with -`evilmi-jump-items'. If in a magit-status buffer, use `magit-section-toggle'." + "Do what I mean. + +If in a magit-status buffer, use `magit-section-toggle'. +If on a folded element, unfold it. +Otherwise, jump to the matching delimiter with `evilmi-jump-items'." (interactive) (ignore-errors (call-interactively (cond ((derived-mode-p 'magit-mode) #'magit-section-toggle) - ((+evil-fold-p) - #'+evil:fold-toggle) - (t - #'evilmi-jump-items))))) + ((+evil-from-eol (invisible-p (point))) + #'+evil/fold-toggle) + (#'evilmi-jump-items))))) From 02a5109c4f76243dce7f572428b78047c9672938 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 22:28:39 -0400 Subject: [PATCH 3169/4235] Comment on disabling fci-mode in org-mode --- modules/ui/fci/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index fdef24869..77da05dd8 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -17,6 +17,8 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") (def-package! fill-column-indicator :hook ((text-mode prog-mode conf-mode) . turn-on-fci-mode) :config + ;; fci is broken in `org-mode' when `org-indent-mode' is active. org-indent is + ;; more important to me, so... (add-hook 'org-mode-hook #'turn-off-fci-mode) (defun +fci|set-color () From 92cf264b1b6d5ed3318894ab338a5875cad89f68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Sep 2018 23:13:17 -0400 Subject: [PATCH 3170/4235] lang/cc: don't complain if irony isn't installed --- 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 d17554eba..e6a7202ea 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -134,7 +134,8 @@ compilation database is present in the project.") (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) :init (defun +cc|init-irony-mode () - (when (memq major-mode '(c-mode c++-mode objc-mode)) + (when (and (memq major-mode '(c-mode c++-mode objc-mode)) + (file-directory-p irony-server-install-prefix)) (irony-mode +1))) (add-hook 'c-mode-common-hook #'+cc|init-irony-mode) :config From a65868ba896a8fe51b5620125ca1ca9e42f32f5b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 00:52:53 -0400 Subject: [PATCH 3171/4235] Fix "end of buffer" errors on backspace --- core/autoload/editor.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 51a2bfed6..7459c921d 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -1,7 +1,7 @@ ;;; core/autoload/editor.el -*- lexical-binding: t; -*- ;;;###autoload -(defun doom-surrounded-p (&optional pair inline balanced) +(defun doom-surrounded-p (pair &optional inline balanced) "Returns t if point is surrounded by a brace delimiter: {[( If INLINE is non-nil, only returns t if braces are on the same line, and @@ -9,7 +9,7 @@ whitespace is balanced on either side of the cursor. If INLINE is nil, returns t if the opening and closing braces are on adjacent lines, above and below, with only whitespace in between." - (when-let* ((pair (or pair (sp-get-thing)))) + (when pair (let ((beg (plist-get pair :beg)) (end (plist-get pair :end)) (pt (point))) @@ -120,7 +120,7 @@ afterwards, kill line to beginning of line." "Delete back to the previous column of whitespace, or as much whitespace as possible, or just one char if that's not possible." (interactive) - (let* ((context (sp-get-thing)) + (let* ((context (ignore-errors (sp-get-thing))) (op (plist-get context :op)) (cl (plist-get context :cl)) open-len close-len) @@ -191,7 +191,7 @@ possible, or just one char if that's not possible." (and (> (- (skip-chars-backward " \t" (line-beginning-position))) 0) (bolp)))) (doom/backward-delete-whitespace-to-column)) - ((let* ((pair (sp-get-thing)) + ((let* ((pair (ignore-errors (sp-get-thing))) (op (plist-get pair :op)) (cl (plist-get pair :cl)) (beg (plist-get pair :beg)) From 55c54a984806e8088e030137ffc6cd9701110818 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 00:55:30 -0400 Subject: [PATCH 3172/4235] Add ]o [o keybinds -> next/prev outline heading --- modules/config/default/+bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index f139c5631..e45110e02 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -82,6 +82,8 @@ :m "[a" #'evil-backward-arg :n "]b" #'next-buffer :n "[b" #'previous-buffer + :m "]o" #'outline-next-visible-heading + :m "[o" #'outline-previous-visible-heading :n "]w" #'+workspace/switch-right :n "[w" #'+workspace/switch-left :m "gt" #'+workspace/switch-right From c23fe02869d2a33866f2e89d64ad04373174b486 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Fri, 21 Sep 2018 14:52:42 +0200 Subject: [PATCH 3173/4235] Remove syntax highlighting --- modules/lang/agda/config.el | 35 +++-------------------------------- 1 file changed, 3 insertions(+), 32 deletions(-) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index dce22f3a0..dc21ae25c 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -4,41 +4,12 @@ (when (executable-find "agda-mode") (file-name-directory (shell-command-to-string "agda-mode locate")))) -(def-package! agda-input +(def-package! agda2 + :when +agda-dir :load-path +agda-dir) (def-package! agda2-mode - :mode "\\.agda\\'" - :after agda-input - :init - ;; make syntax-highlighting more consistent with other major modes - (progn - (mapc - (lambda (x) (add-to-list 'face-remapping-alist x)) - '((agda2-highlight-keyword-face . font-lock-keyword-face) - (agda2-highlight-string-face . font-lock-string-face) - (agda2-highlight-number-face . font-lock-string-face) - (agda2-highlight-symbol-face . font-lock-variable-name-face) - (agda2-highlight-primitive-type-face . font-lock-type-face) - (agda2-highlight-bound-variable-face . font-lock-variable-name-face) - (agda2-highlight-inductive-constructor-face . font-lock-type-face) - (agda2-highlight-coinductive-constructor-face . font-lock-type-face) - (agda2-highlight-datatype-face . font-lock-type-face) - (agda2-highlight-field-face . font-lock-type-face) - (agda2-highlight-function-face . font-lock-function-name-face) - (agda2-highlight-module-face . font-lock-variable-name-face) - (agda2-highlight-postulate-face . font-lock-type-face) - (agda2-highlight-primitive-face . font-lock-type-face) - (agda2-highlight-macro-face . font-lock-function-name-face) - (agda2-highlight-record-face . font-lock-type-face) - (agda2-highlight-error-face . font-lock-warning-face) - (agda2-highlight-dotted-face . font-lock-variable-name-face) - (agda2-highlight-unsolved-meta-face . font-lock-warning-face) - (agda2-highlight-unsolved-constraint-face . font-lock-warning-face) - (agda2-highlight-termination-problem-face . font-lock-warning-face) - (agda2-highlight-positivity-problem-face . font-lock-warning-face) - (agda2-highlight-incomplete-pattern-face . font-lock-warning-face) - (agda2-highlight-typechecks-face . font-lock-warning-face)))) + :defer t :config (map! :map agda2-mode-map :localleader From 20cf412c96b477b2bcf5ae8435e674767a885f2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 10:47:26 -0400 Subject: [PATCH 3174/4235] tools/pdf: revert fd7f498 Causes an issue where cursor invisibility persists through a workspace session restore. Relevant to #892 --- modules/tools/pdf/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index fa67f4f26..8ea1b0139 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -29,8 +29,6 @@ (setq-default pdf-view-display-size 'fit-page) ;; Turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0)) - ;; Don't show the cursor in pdf-view - (add-hook! 'pdf-view-mode-hook (internal-show-cursor nil nil)) ;; Custom modeline that removes useless info and adds page numbers (when (featurep! :ui doom-modeline) (load! "+modeline")) From 77b5571ed9a80343d0fc644ac30a6182f19f677f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 13:31:13 -0400 Subject: [PATCH 3175/4235] ui/modeline: fix *invalid* in global-mode-string --- modules/ui/modeline/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 5b6eeaa59..1ffc88df4 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -53,6 +53,9 @@ Currently available functions: (put '+modeline-format-left 'risky-local-variable t) (put '+modeline-format-right 'risky-local-variable t) +;; Otherwise appended segments will produce *Invalid* +(setq global-mode-string '("")) + ;; (defvar +modeline--vspc (propertize " " 'face 'variable-pitch)) From ccaa642d988b78211a6917297f13d3323b4bb335 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 13:31:46 -0400 Subject: [PATCH 3176/4235] lang/python: fix pipenv creating Pipfiles in pwd #888 `pipenv run ...` searches for a Pipfile itself, but doesn't search far enough, creating a Pipfile in the current directory. Instead, we run the command from the pipenv project root so it doesn't have to search. --- modules/lang/python/autoload/python.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 4f4030763..ecca5a796 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -14,7 +14,9 @@ the current pipenv. This is not necessarily aware of env management tools like virtualenv, pyenv or pipenv, unless those tools have modified the PATH that Emacs picked up when you started it." - (let* ((command (if (pipenv-project-p) + (let* ((pipenv-dir (pipenv-project-p)) + (default-directory (or pipenv-dir default-directory)) + (command (if pipenv-dir "pipenv run python --version" "python --version")) (bin (car (split-string command " ")))) @@ -26,4 +28,4 @@ started it." (output (string-trim (buffer-string)))) (unless (zerop p) (user-error "'%s' failed: %s" command output)) - (nth 1 (split-string output " " t)))))) + (cadr (split-string output " " t)))))) From fad1fc8f1b57b819a774c171b933b0866804044a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 14:06:15 -0400 Subject: [PATCH 3177/4235] Resolve GPG keys by user name instead of address #877 epa-file-encrypt-to is now set to the ids of all keys that match user-full-name, if it is set. This should fix issues with multiple keys with the same email addresses. --- modules/config/default/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 37b55265e..699581137 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -20,7 +20,13 @@ "~/.authinfo.gpg")) (after! epa - (setq epa-file-encrypt-to (or epa-file-encrypt-to user-mail-address) + (setq epa-file-encrypt-to + (or epa-file-encrypt-to + ;; Collect all public key IDs with your username + (unless (string-empty-p user-full-name) + (cl-loop for key in (epg-list-keys (epg-make-context) user-full-name) + collect (epg-sub-key-id (car (epg-key-sub-key-list key))))) + 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)) From ed1775b42de7170a47b3ce383b925ac57b0b76a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 22:36:26 -0400 Subject: [PATCH 3178/4235] lang/org: refactor +babel/ipython library + Conform ipython advice and helpers to naming conventions. + Refactor out dash.el usage --- modules/lang/org/+babel.el | 13 +-- modules/lang/org/autoload/ipython.el | 118 ++++++++++++++------------- 2 files changed, 69 insertions(+), 62 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 615833886..42edd5c53 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -9,13 +9,16 @@ (sh . shell) (bash . shell) (matlab . octave)) - "An alist that maps languages to babel libraries. This is necessary for babel -libraries (ob-*.el) that don't match the name of the language.") + "An alist mapping languages to babel libraries. This is necessary for babel +libraries (ob-*.el) that don't match the name of the language. + +For example, with (fish . shell) will cause #+BEGIN_SRC fish to load ob-shell.el +when executed.") (defvar +org-babel-load-functions () - "A list of functions that are used to try to load the current executing src -block. They take one argument (the language specified in the src block, as -string). Stops at the first function to return non-nil.") + "A list of functions for loading the current executing src block. They take +one argument (the language specified in the src block, as a string). Stops at +the first function to return non-nil.") (defun +org|init-babel () (setq org-src-fontify-natively t ; make code pretty diff --git a/modules/lang/org/autoload/ipython.el b/modules/lang/org/autoload/ipython.el index 4a602b6d5..ba28a7cda 100644 --- a/modules/lang/org/autoload/ipython.el +++ b/modules/lang/org/autoload/ipython.el @@ -18,54 +18,7 @@ Make sure your src block has a :session param.") session) params))) -;;;###autoload -(defun +org*ob-ipython--create-repl (name &optional params) - "Create repl based on NAME and PARAMS. -If PARAMS specifies remote kernel, copy the kernel config from remote server and -create a repl connecting to remote session." - (let ((cmd (string-join (ob-ipython--kernel-repl-cmd name) " "))) - (cond ((string= "default" name) - (run-python cmd nil nil) - (format "*%s*" python-shell-buffer-name)) - ((string-match "^remote-.*ssh.json" name) - (when (not (ignore-errors - (process-live-p - (get-process - (format - "Python:ob-ipython-%s" - name))))) - (let* ((remote (s-split "-" name)) - (remote-host (nth 1 remote)) - (remote-session (nth 3 remote))) - (+org/ob-ipython-generate-local-path-from-remote - remote-session - remote-host - params)))) - ((let* ((process-name (format "Python:ob-ipython-%s" name)) - (python-shell-prompt-detect-enabled nil) - (python-shell-completion-native-enable nil) - (buf (python-shell-make-comint cmd process-name t)) - (dir (cdr (assoc :pydir params)))) - (if dir - (with-current-buffer buf - (setq-local default-directory dir))) - (sleep-for 1) - (format "*%s*" process-name)))))) - -;;;###autoload -(defun +org*org-babel-execute:ipython (body params) - "Execute a BODY of IPython code with PARAMS in org-babel. -This function is called by `org-babel-execute-src-block'." - (message default-directory) - (let ((session (cdr (assoc :session params)))) - (org-babel-ipython-initiate-session session params)) - (ob-ipython--clear-output-buffer) - (if (cdr (assoc :async params)) - (ob-ipython--execute-async body params) - (ob-ipython--execute-sync body params))) - -;;;###autoload -(defun +org/ob-ipython-generate-local-path-from-remote (session host params) +(defun +org--ob-ipython-generate-local-path-from-remote (session host params) "Given a remote SESSION with PARAMS and corresponding HOST, copy remote config to local, start a jupyter console to generate a new one." (let* ((runtime-dir (substring (shell-command-to-string (concat "ssh " host " jupyter --runtime-dir")) 0 -1)) @@ -100,7 +53,56 @@ This function is called by `org-babel-execute-src-block'." (setq-local default-directory dir))) (format "*%s*" proc)))) +;;;###autoload +(defun +org*ob-ipython--create-repl (name &optional params) + "Create repl based on NAME and PARAMS. +If PARAMS specifies remote kernel, copy the kernel config from remote server and +create a repl connecting to remote session." + (let ((cmd (string-join (ob-ipython--kernel-repl-cmd name) " "))) + (cond ((string= "default" name) + (run-python cmd nil nil) + (format "*%s*" python-shell-buffer-name)) + ((string-match "^remote-.*ssh.json" name) + (when (not (ignore-errors + (process-live-p + (get-process + (format + "Python:ob-ipython-%s" + name))))) + (let* ((remote (s-split "-" name)) + (remote-host (nth 1 remote)) + (remote-session (nth 3 remote))) + (+org--ob-ipython-generate-local-path-from-remote + remote-session + remote-host + params)))) + ((let* ((process-name (format "Python:ob-ipython-%s" name)) + (python-shell-prompt-detect-enabled nil) + (python-shell-completion-native-enable nil) + (buf (python-shell-make-comint cmd process-name t)) + (dir (cdr (assoc :pydir params)))) + (if dir + (with-current-buffer buf + (setq-local default-directory dir))) + (sleep-for 1) + (format "*%s*" process-name)))))) + +;;;###autoload +(defun +org*org-babel-execute:ipython (body params) + "Execute a BODY of IPython code with PARAMS in org-babel. +This function is called by `org-babel-execute-src-block'." + (message default-directory) + (let ((session (cdr (assoc :session params)))) + (org-babel-ipython-initiate-session session params)) + (ob-ipython--clear-output-buffer) + (if (cdr (assoc :async params)) + (ob-ipython--execute-async body params) + (ob-ipython--execute-sync body params))) + + +;; ;; * org-src-edit + ;;;###autoload (defun +org*org-babel-edit-prep:ipython (info) (let* ((params (nth 2 info)) @@ -109,12 +111,12 @@ This function is called by `org-babel-execute-src-block'." ;; Support for python.el's "send-code" commands within edit buffers. (setq-local python-shell-buffer-name (format "Python:ob-ipython-%s" - (->> info (nth 2) (assoc :session) - cdr ob-ipython--normalize-session))) + (ob-ipython--normalize-session + (cdr (assoc :session (nth 2 info)))))) (setq-local default-directory (format "%s" - (->> info (nth 2) (assoc :pydir) - cdr ob-ipython--normalize-session))) + (ob-ipython--normalize-session + (cdr (assoc :pydir (nth 2 info)))))) (ob-ipython-mode 1) ;; hack on company mode to use company-capf rather than company-anaconda (when (featurep! :completion company) @@ -127,14 +129,16 @@ This function is called by `org-babel-execute-src-block'." (when (featurep 'lpy) (setq lispy-python-proc (format "Python:ob-ipython-%s" - (->> info (nth 2) (assoc :session) - cdr ob-ipython--normalize-session)) + (ob-ipython--normalize-session + (cdr (assoc :session (nth 2 info))))) lispy--python-middleware-loaded-p nil) (lispy--python-middleware-load))) + +;; ;; * retina -;;;###autoload -(defun +org/ob-ipython-mac-2x-image-file-name (filename &optional scale) + +(defun +org--ob-ipython-mac-2x-image-file-name (filename &optional scale) "Return the name of high-resolution image file for FILENAME. The optional arg SCALE is scale factor, and defaults to 2." (let ((pos (or (string-match "\\.[^./]*\\'" filename) (length filename)))) @@ -147,6 +151,6 @@ The optional arg SCALE is scale factor, and defaults to 2." (defun +org*ob-ipython--write-base64-string (oldfunc &rest args) (let ((file (car args)) (b64-string (cdr args))) - (let ((file2x (+org/ob-ipython-mac-2x-image-file-name file))) + (let ((file2x (+org--ob-ipython-mac-2x-image-file-name file))) (apply oldfunc file2x b64-string) (shell-command (concat "convert " file2x " -resize 50% " file))))) From 9726a982d1f8d4322f623e65ff6f571d75fbb768 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 22:42:26 -0400 Subject: [PATCH 3179/4235] lang/org: revise org-modules & revise load order Improves the startup performance of org-mode by disabling modules I don't think are commonly used (it's easy to add back however). --- modules/lang/org/config.el | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 5081a6d0a..2a92c9dc0 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -5,6 +5,18 @@ (defvar org-directory "~/org/") +(defvar org-modules + '(org-w3m + ;; org-bbdb + org-bibtex + org-docview + ;; org-gnus + org-info + ;; org-irc + ;; org-mhe + ;; org-rmail + )) + ;; Sub-modules (if (featurep! +attach) (load! "+attach")) (if (featurep! +babel) (load! "+babel")) @@ -16,8 +28,7 @@ (doom-load-packages-incrementally '(calendar find-func format-spec org-macs org-compat org-faces org-entities org-list org-pcomplete org-src - org-footnote org-macro ob org org-clock org-agenda - org-capture)) + org-footnote org-macro ob org org-agenda org-capture)) ;; @@ -46,8 +57,7 @@ ;; Bootstrap (add-hook! 'org-load-hook - #'(org-crypt-use-before-save-magic - +org|setup-ui + #'(+org|setup-ui +org|setup-popup-rules +org|setup-agenda +org|setup-keybinds @@ -413,7 +423,11 @@ conditions where a window's buffer hasn't changed at the time this hook is run." ;; Built-in libraries (def-package! org-crypt ; built-in - :commands org-crypt-use-before-save-magic + :commands org-encrypt-entries + :hook (org-reveal-start . org-decrypt-entry) + :init + (add-hook! 'org-mode-hook + (add-hook 'before-save-hook 'org-encrypt-entries nil t)) :config (setq org-tags-exclude-from-inheritance '("crypt") org-crypt-key user-mail-address)) @@ -421,6 +435,7 @@ conditions where a window's buffer hasn't changed at the time this hook is run." (def-package! org-clock :commands org-clock-save :hook (org-mode . org-clock-load) + :defer-incrementally t :init (setq org-clock-persist 'history org-clock-persist-file (concat doom-etc-dir "org-clock-save.el")) From 75ad188e015ec00a48c7b0b9a1ae9acf8d5494db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 21 Sep 2018 22:43:52 -0400 Subject: [PATCH 3180/4235] Fix :defer-incrementally t Should be the same as :defer-incrementally () --- core/core-editor.el | 2 +- core/core-modules.el | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 2f7ab56d2..d1827db88 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -137,7 +137,7 @@ savehist file." recentf-auto-cleanup 'never recentf-max-menu-items 0 recentf-max-saved-items 300 - recentf-filename-handlers '(file-truename) + recentf-filename-handlers '(file-truename abbreviate-file-name) recentf-exclude (list #'file-remote-p "\\.\\(?:gz\\|gif\\|svg\\|png\\|jpe?g\\)$" "^/tmp/" "^/ssh:" "\\.?ido\\.last$" "\\.revive$" "/TAGS$" diff --git a/core/core-modules.el b/core/core-modules.el index 808b1b30c..1ae339930 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -216,9 +216,9 @@ non-nil, return paths of possible modules, activated or otherwise." (defun use-package-handler/:defer-incrementally (name _keyword targets rest state) (use-package-concat `((doom-load-packages-incrementally - ',(if (listp targets) - targets - (list name)))) + ',(if (equal targets '(t)) + (list name) + targets))) (use-package-process-keywords name rest state))) (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) From 736bdeb205ce43f6272f309a9e8e56313df7c366 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 01:37:47 -0400 Subject: [PATCH 3181/4235] lang/org: fix variable font-size for agenda paths When you hover your cursor over agenda items, the path to that headline is displayed in the minibuffer. If org-level-N have unusual :height values, they'll cause the minibuffer to grow. This removes any variable font sizes from this display. --- modules/lang/org/config.el | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 2a92c9dc0..bc36f23ba 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -382,18 +382,17 @@ conditions where a window's buffer hasn't changed at the time this hook is run." (add-hook 'org-follow-link-hook #'+org|delayed-recenter) ;; Fix variable height org-level-N faces in the eldoc string - (defun +org*fix-font-size-variation-in-eldoc (orig-fn) - (cl-letf (((symbol-function 'org-format-outline-path) - (lambda (path &optional _width _prefix separator) - (string-join - (cl-loop with i = -1 - for seg in (delq nil path) - for face = (nth (% (cl-incf i) org-n-level-faces) org-level-faces) - collect (propertize (replace-regexp-in-string "[ \t]+\\'" "" seg) - 'face (if face `(:foreground ,(face-foreground face nil t))))) - separator)))) - (funcall orig-fn))) - (advice-add #'org-eldoc-get-breadcrumb :around #'+org*fix-font-size-variation-in-eldoc) + (defun +org*format-outline-path (orig-fn path &optional width prefix separator) + (let ((result (funcall orig-fn path width prefix separator)) + (seperator (or separator "/"))) + (string-join + (cl-loop for part + in (split-string (substring-no-properties result) separator) + for n from 0 + for face = (nth (% n org-n-level-faces) org-level-faces) + collect (org-add-props part nil 'face `(:foreground ,(face-foreground face nil t) :weight bold))) + separator))) + (advice-add #'org-format-outline-path :around #'+org*format-outline-path) (setq org-file-apps `(("pdf" . default) From f8fb321f2c5925641407c870e4f1113bb92891d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 10:34:31 -0400 Subject: [PATCH 3182/4235] Remove outline support from +evil/fold-close-all It is buggy in modes with a poorly written outline-level function (like elisp). --- modules/feature/evil/autoload/folds.el | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index 1acefc5dd..e38a85a9a 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -87,15 +87,10 @@ (save-excursion (when (featurep 'vimish-fold) (vimish-fold-refold-all)) - (if (integerp level) - (progn - (when (fboundp 'outline-hide-sublevels) - (outline-hide-sublevels (max 1 (1- level)))) - (hs-life-goes-on - (hs-hide-level-recursive (1- level) (point-min) (point-max)))) - (when (fboundp 'outline-hide-sublevels) - (outline-hide-sublevels 1)) - (hs-hide-all)))) + (hs-life-goes-on + (if (integerp level) + (hs-hide-level-recursive (1- level) (point-min) (point-max)) + (hs-hide-all))))) (defun +evil--invisible-points (count) (let (points) From 7acece3e0bd2abacb1bf38f0c14cbd9d5dfe32ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 11:47:36 -0400 Subject: [PATCH 3183/4235] Disable projectile mode-line segment If either module module is active, this is just extra overhead. --- modules/ui/doom-modeline/config.el | 4 ++++ modules/ui/modeline/config.el | 2 ++ 2 files changed, 6 insertions(+) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 030e46aa5..905a87de8 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -1,5 +1,9 @@ ;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- +;; We handle this ourselves +(setq projectile-dynamic-mode-line nil) + + ;; ;; Modeline library diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 1ffc88df4..84e4acf8b 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -55,6 +55,8 @@ Currently available functions: ;; Otherwise appended segments will produce *Invalid* (setq global-mode-string '("")) +;; We handle this ourselves +(setq projectile-dynamic-mode-line nil) ;; (defvar +modeline--vspc (propertize " " 'face 'variable-pitch)) From ac63596be81036afbc9fb1d7faceaa5ac297bd00 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 11:54:08 -0400 Subject: [PATCH 3184/4235] Fix doom-project-root returning nil if no project It should return default-directory. A change upstream broke this. --- core/autoload/files.el | 2 +- core/autoload/projects.el | 5 ++++- modules/feature/lookup/autoload/lookup.el | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index c85d67e59..fea61b96e 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -89,7 +89,7 @@ MATCH is a string regexp. Only entries that match it will be included." (recentf-remove-if-non-kept old-path)) (when (and (bound-and-true-p projectile-mode) (projectile-project-p) - (projectile-file-cached-p old-path (projectile-project-root))) + (projectile-file-cached-p old-path (doom-project-root 'nocache))) (projectile-purge-file-from-cache old-path)) (when (bound-and-true-p save-place-mode) (save-place-forget-unreadable-files))) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index e43f5af15..40267da90 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -62,7 +62,10 @@ If NOCACHE, don't fetch a cached answer." (if nocache (without-project-cache! (doom-project-root nil)) (let (projectile-require-project-root) - (projectile-project-root)))) + ;; NOTE `projectile-project-root' should return default-directory if we're + ;; not in a project. Seems to be a bug upstream. + (or (projectile-project-root) + default-directory)))) ;;;###autoload (defalias 'doom-project-expand #'projectile-expand-root) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 45f527c3c..b20e274bb 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -299,7 +299,7 @@ Otherwise, falls back on `find-file-at-point'." (let ((file (projectile-completing-read "Find file: " (projectile-current-project-files) :initial-input path))) - (find-file (expand-file-name file (projectile-project-root))) + (find-file (expand-file-name file (doom-project-root))) (run-hooks 'projectile-find-file-hook)))))) (#'doom-project-browse)))) (find-file-at-point path)))))) From cffb1d367f1b1c630488fac6750b409b2b0de0c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 12:42:38 -0400 Subject: [PATCH 3185/4235] Update without-project-cache! macro To match upstream changes in projectile --- core/autoload/projects.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 40267da90..cdd134802 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -7,10 +7,9 @@ (defmacro without-project-cache! (&rest body) "Run BODY with projectile's project-root cache disabled. This is necessary if you want to interactive with a project other than the one you're in." - `(let (projectile-project-name - projectile-require-project-root - projectile-cached-buffer-file-name - projectile-cached-project-root) + `(let ((projectile-project-root-cache (make-hash-table :test 'equal)) + projectile-project-name + projectile-require-project-root) ,@body)) ;;;###autoload From 74af5bde264fa2a25b90bf21d7bfa616729f6cb8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 13:14:38 -0400 Subject: [PATCH 3186/4235] ui/modeline: fix buffer file path segment To cope with changes upstream in the projectile package. --- modules/ui/modeline/config.el | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 84e4acf8b..47d2d6e8c 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -260,7 +260,8 @@ use `buffer-name'." (propertize "%s" 'face 'doom-modeline-buffer-path) (cl-loop for spec in (funcall +modeline-buffer-path-function) if (stringp spec) concat spec - else concat (propertize (car spec) 'face (cdr spec)))))) + else if (not (null spec)) + concat (propertize (car spec) 'face (cdr spec)))))) ;; @@ -271,16 +272,18 @@ use `buffer-name'." parent. e.g. project/src/lib/file.c" - (let* ((project-root (doom-project-root)) - (true-filename (file-truename buffer-file-name)) - (relative-dirs (file-relative-name (file-name-directory true-filename) - (file-truename project-root)))) - (list (cons (concat (doom-project-name) "/") - 'doom-modeline-buffer-project-root) - (cons (if (equal "./" relative-dirs) "" relative-dirs) - 'doom-modeline-buffer-path) - (cons (file-name-nondirectory true-filename) - 'doom-modeline-buffer-file)))) + (let ((filename (or buffer-file-truename (file-truename buffer-file-name)))) + (append (if (doom-project-p) + (let* ((project-root (doom-project-root)) + (relative-dirs (file-relative-name (file-name-directory filename) + (file-truename project-root)))) + (list (cons (concat (doom-project-name) "/") + 'doom-modeline-buffer-project-root) + (unless (equal "./" relative-dirs) + (cons relative-dirs 'doom-modeline-buffer-path)))) + (list nil (cons (file-name-directory filename) 'doom-modeline-buffer-path))) + (list (cons (file-name-nondirectory filename) + 'doom-modeline-buffer-file))))) (defun +modeline-file-path-from-project () "Returns file path relative to the project root. From 5fd0699158b403bfa769a0f288bdf911dc43446f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Sep 2018 15:10:06 -0400 Subject: [PATCH 3187/4235] init.example.el: disable with two semicolons This avoids disruptive behavior where aggressive reformatting tools -- like parinfer, aggressive-indent, the elisp formatter (in the editor/format module), or even Emacs' own indent-according-to-mode command -- will reindent lines commented with one semicolon far to the right. --- init.example.el | 154 ++++++++++++++++++++++++------------------------ 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/init.example.el b/init.example.el index a864d3e64..d1def0b8b 100644 --- a/init.example.el +++ b/init.example.el @@ -2,7 +2,7 @@ ;; Copy me to ~/.doom.d/init.el or ~/.config/doom/init.el, then edit me! (doom! :feature - ;debugger ; FIXME stepping through code, to help you add bugs + ;;debugger ; FIXME stepping through code, to help you add bugs eval ; run code, run (also, repls) (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files @@ -19,136 +19,136 @@ +auto) ; as-you-type code completion (helm ; the *other* search engine for love and life +fuzzy) ; enable fuzzy search backend for helm - ;ido ; the other *other* search engine... - ;(ivy ; a search engine for love and life - ; +fuzzy) ; enable fuzzy search backend for ivy + ;;ido ; the other *other* search engine... + ;;(ivy ; a search engine for love and life + ;; +fuzzy) ; enable fuzzy search backend for ivy :ui - ;deft ; notational velocity for Emacs + ;;deft ; notational velocity for Emacs doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs doom-modeline ; a snazzy Atom-inspired mode-line doom-quit ; DOOM quit-message prompts when you quit Emacs evil-goggles ; display visual hints when editing in evil - ;fci ; a `fill-column' indicator + ;;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags - ;modeline ; snazzy, Atom-inspired modeline, plus API + ;;modeline ; snazzy, Atom-inspired modeline, plus API nav-flash ; blink the current line after jumping - ;neotree ; a project drawer, like NERDTree for vim + ;;neotree ; a project drawer, like NERDTree for vim treemacs ; a project drawer, like neotree but cooler (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules - ;pretty-code ; replace bits of code with pretty symbols - ;tabbar ; FIXME an (incomplete) tab bar for Emacs - ;unicode ; extended unicode support for various languages + ;;pretty-code ; replace bits of code with pretty symbols + ;;tabbar ; FIXME an (incomplete) tab bar for Emacs + ;;unicode ; extended unicode support for various languages vc-gutter ; vcs diff in the fringe vi-tilde-fringe ; fringe tildes to mark beyond EOB window-select ; visually switch windows :editor - ;(format +onsave) ; automated prettiness + ;;(format +onsave) ; automated prettiness multiple-cursors ; editing in many places at once - ;parinfer ; turn lisp into python, sort of + ;;parinfer ; turn lisp into python, sort of rotate-text ; cycle region at point between text candidates :emacs dired ; making dired pretty [functional] ediff ; comparing files in Emacs electric ; smarter, keyword-based electric-indent - ;eshell ; a consistent, cross-platform shell (WIP) + ;;eshell ; a consistent, cross-platform shell (WIP) hideshow ; basic code-folding support imenu ; an imenu sidebar and searchable code index - ;term ; terminals in Emacs + ;;term ; terminals in Emacs vc ; version-control and Emacs, sitting in a tree :tools - ;ansible - ;docker + ;;ansible + ;;docker editorconfig ; let someone else argue about tabs vs spaces - ;ein ; tame Jupyter notebooks with emacs - ;gist ; interacting with github gists - ;macos ; MacOS-specific commands - ;make ; run make tasks from Emacs - ;magit ; a git porcelain for Emacs - ;password-store ; password manager for nerds - ;pdf ; pdf enhancements - ;prodigy ; FIXME managing external services & code builders - ;rgb ; creating color strings - ;tmux ; an API for interacting with tmux - ;upload ; map local to remote projects via ssh/ftp - ;wakatime + ;;ein ; tame Jupyter notebooks with emacs + ;;gist ; interacting with github gists + ;;macos ; MacOS-specific commands + ;;make ; run make tasks from Emacs + ;;magit ; a git porcelain for Emacs + ;;password-store ; password manager for nerds + ;;pdf ; pdf enhancements + ;;prodigy ; FIXME managing external services & code builders + ;;rgb ; creating color strings + ;;tmux ; an API for interacting with tmux + ;;upload ; map local to remote projects via ssh/ftp + ;;wakatime :lang - ;assembly ; assembly for fun or debugging - ;(cc +irony +rtags); C/C++/Obj-C madness - ;clojure ; java with a lisp - ;common-lisp ; if you've seen one lisp, you've seen them all - ;coq ; proofs-as-programs - ;crystal ; ruby at the speed of c - ;csharp ; unity, .NET, and mono shenanigans + ;;assembly ; assembly for fun or debugging + ;;(cc +irony +rtags); C/C++/Obj-C madness + ;;clojure ; java with a lisp + ;;common-lisp ; if you've seen one lisp, you've seen them all + ;;coq ; proofs-as-programs + ;;crystal ; ruby at the speed of c + ;;csharp ; unity, .NET, and mono shenanigans data ; config/data formats - ;erlang ; an elegant language for a more civilized age - ;elixir ; erlang done right - ;elm ; care for a cup of TEA? + ;;erlang ; an elegant language for a more civilized age + ;;elixir ; erlang done right + ;;elm ; care for a cup of TEA? emacs-lisp ; drown in parentheses - ;ess ; emacs speaks statistics - ;go ; the hipster dialect - ;(haskell +intero) ; a language that's lazier than I am - ;hy ; readability of scheme w/ speed of python - ;idris ; - ;(java +meghanada) ; the poster child for carpal tunnel syndrome - ;javascript ; all(hope(abandon(ye(who(enter(here)))))) - ;julia ; a better, faster MATLAB - ;latex ; writing papers in Emacs has never been so fun - ;ledger ; an accounting system in Emacs - ;lua ; one-based indices? one-based indices + ;;ess ; emacs speaks statistics + ;;go ; the hipster dialect + ;;(haskell +intero) ; a language that's lazier than I am + ;;hy ; readability of scheme w/ speed of python + ;;idris ; + ;;(java +meghanada) ; the poster child for carpal tunnel syndrome + ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) + ;;julia ; a better, faster MATLAB + ;;latex ; writing papers in Emacs has never been so fun + ;;ledger ; an accounting system in Emacs + ;;lua ; one-based indices? one-based indices markdown ; writing docs for people to ignore - ;nim ; python + lisp at the speed of c - ;nix ; I hereby declare "nix geht mehr!" - ;ocaml ; an objective camel + ;;nim ; python + lisp at the speed of c + ;;nix ; I hereby declare "nix geht mehr!" + ;;ocaml ; an objective camel (org ; organize your plain life in plain text +attach ; custom attachment system +babel ; running code in org +capture ; org-capture in and outside of Emacs +export ; Exporting org to whatever you want +present) ; Emacs for presentations - ;perl ; write code no one else can comprehend - ;php ; perl's insecure younger brother - ;plantuml ; diagrams for confusing people more - ;purescript ; javascript, but functional - ;python ; beautiful is better than ugly - ;qt ; the 'cutest' gui framework ever - ;racket ; a DSL for DSLs - ;rest ; Emacs as a REST client - ;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} - ;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() - ;scala ; java, but good + ;;perl ; write code no one else can comprehend + ;;php ; perl's insecure younger brother + ;;plantuml ; diagrams for confusing people more + ;;purescript ; javascript, but functional + ;;python ; beautiful is better than ugly + ;;qt ; the 'cutest' gui framework ever + ;;racket ; a DSL for DSLs + ;;rest ; Emacs as a REST client + ;;ruby ; 1.step do {|i| p "Ruby is #{i.even? ? 'love' : 'life'}"} + ;;rust ; Fe2O3.unwrap().unwrap().unwrap().unwrap() + ;;scala ; java, but good (sh +fish) ; she sells (ba|z|fi)sh shells on the C xor - ;solidity ; do you need a blockchain? No. - ;swift ; who asked for emoji variables? - ;web ; the tubes + ;;solidity ; do you need a blockchain? No. + ;;swift ; who asked for emoji variables? + ;;web ; the tubes ;; Applications are complex and opinionated modules that transform Emacs ;; toward a specific purpose. They may have additional dependencies and ;; should be loaded late. :app - ;(email +gmail) ; emacs as an email client - ;irc ; how neckbeards socialize - ;(rss +org) ; emacs as an RSS reader - ;twitter ; twitter client https://twitter.com/vnought - ;(write ; emacs as a word processor (latex + org + markdown) - ; +wordnut ; wordnet (wn) search - ; +langtool) ; a proofreader (grammar/style check) for Emacs + ;;(email +gmail) ; emacs as an email client + ;;irc ; how neckbeards socialize + ;;(rss +org) ; emacs as an RSS reader + ;;twitter ; twitter client https://twitter.com/vnought + ;;(write ; emacs as a word processor (latex + org + markdown) + ;; +wordnut ; wordnet (wn) search + ;; +langtool) ; a proofreader (grammar/style check) for Emacs :collab - ;floobits ; peer programming for a price - ;impatient-mode ; show off code over HTTP + ;;floobits ; peer programming for a price + ;;impatient-mode ; show off code over HTTP :config ;; For literate config users. This will tangle+compile a config.org ;; literate config in your `doom-private-dir' whenever it changes. - ;literate + ;;literate ;; The default module sets reasonable defaults for Emacs. It also ;; provides a Spacemacs-inspired keybinding scheme, a custom yasnippet From c2c7def1926b998bd5edc3946059470c046343c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Sep 2018 10:25:58 -0400 Subject: [PATCH 3188/4235] editor/multiple-cursors: better command whitelist + Fixes explicit usage of evil-escape from evil-mc cursors (e.g. M-x evil-escape or C-g, not the escape sequences jk/fd) + Fixes delete-char (DEL key) from cursors + Fixes all custom commands when used with a COUNT --- modules/editor/multiple-cursors/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 98fd1bbcc..7fe19db89 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -27,8 +27,10 @@ ;; Add custom commands to whitelisted commands (dolist (fn '(doom/backward-to-bol-or-indent doom/forward-to-last-non-comment-or-eol - doom/backward-kill-to-bol-and-indent)) - (add-to-list 'evil-mc-custom-known-commands `(,fn (:default . evil-mc-execute-default-call)))) + doom/backward-kill-to-bol-and-indent delete-char)) + (add-to-list 'evil-mc-custom-known-commands `(,fn (:default . evil-mc-execute-default-call-with-count)))) + ;; Have evil-mc work with explicit `evil-escape' (typically bound to C-g) + (add-to-list 'evil-mc-custom-known-commands '(evil-escape (:default . evil-mc-execute-default-evil-normal-state))) ;; Activate evil-mc cursors upon switching to insert mode (defun +evil-mc|resume-cursors () (setq evil-mc-frozen nil)) From 5a079c7fd67345ef8dc7ef1271b3fea22053977b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Sep 2018 16:30:23 -0400 Subject: [PATCH 3189/4235] Enable company-mode in comint-modes --- modules/completion/company/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index ee697c837..8b4901e17 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -11,7 +11,7 @@ company-tooltip-align-annotations t company-require-match 'never company-global-modes - '(not comint-mode erc-mode message-mode help-mode gud-mode eshell-mode) + '(not erc-mode message-mode help-mode gud-mode eshell-mode) company-backends nil company-frontends '(company-pseudo-tooltip-frontend From b53b300657f4ac8d93a79fb7f87d398b80d39021 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Sep 2018 16:30:43 -0400 Subject: [PATCH 3190/4235] Don't affect ivy-switch-buffer's transformer ivy-rich already does this under the hood. This is redundant. --- modules/completion/ivy/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index ac7022246..7a3d2eacb 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -78,8 +78,8 @@ immediately runs it on the current candidate (ending the ivy session)." :hook (ivy-mode . ivy-rich-mode) :config ;; Show more buffer information in other switch-buffer commands too - (dolist (cmd '(ivy-switch-buffer +ivy/switch-workspace-buffer - counsel-projectile-switch-to-buffer)) + (dolist (cmd '(+ivy/switch-workspace-buffer + counsel-projectile-switch-to-buffer)) (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer))) From 8c4504380face1bfd4add2f85bc4035f9d6d46a6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Sep 2018 21:03:42 -0400 Subject: [PATCH 3191/4235] +evil/fold-toggle: don't hide recursively Otherwise sub-entries will be folded and remain folded when unfolding entries. --- modules/feature/evil/autoload/folds.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index e38a85a9a..dcacb4f8b 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -42,7 +42,10 @@ (save-excursion (cond ((+evil--vimish-fold-p) (vimish-fold-toggle)) ((+evil--hideshow-fold-p) (+evil-from-eol (hs-toggle-hiding))) - ((+evil--outline-fold-p) (outline-toggle-children))))) + ((+evil--outline-fold-p) + (cl-letf (((symbol-function #'outline-hide-subtree) + (symbol-function #'outline-hide-entry))) + (outline-toggle-children)))))) ;;;###autoload (defun +evil/fold-open () From 3dbeb4e3a7a325a6b4be29b454a174c61e0d5440 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Sep 2018 21:06:45 -0400 Subject: [PATCH 3192/4235] Add doctstrings to +evil/fold-* commands --- modules/feature/evil/autoload/folds.el | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index dcacb4f8b..2de7bc0c5 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -38,6 +38,9 @@ ;;;###autoload (defun +evil/fold-toggle () + "Toggle the fold at point. + +Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion (cond ((+evil--vimish-fold-p) (vimish-fold-toggle)) @@ -49,6 +52,9 @@ ;;;###autoload (defun +evil/fold-open () + "Open the folded region at point. + +Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion (cond ((+evil--vimish-fold-p) (vimish-fold-unfold)) @@ -59,6 +65,9 @@ ;;;###autoload (defun +evil/fold-close () + "Close the folded region at point. + +Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion (cond ((+evil--vimish-fold-p) (vimish-fold-refold)) From 0c70d1bf08780f846c79ed2efe2dd1126b7935b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 24 Sep 2018 08:36:20 -0400 Subject: [PATCH 3193/4235] Remove defunct [h keybind (smart-backward) --- modules/config/default/+bindings.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index e45110e02..831d96608 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -523,7 +523,6 @@ :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) From 271e7689ae61be52e6967afc81f5723290eb5a0f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 10:29:57 -0400 Subject: [PATCH 3194/4235] Don't error when no gpg keys exist --- modules/config/default/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 699581137..7b8539c96 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -24,7 +24,7 @@ (or epa-file-encrypt-to ;; Collect all public key IDs with your username (unless (string-empty-p user-full-name) - (cl-loop for key in (epg-list-keys (epg-make-context) user-full-name) + (cl-loop for key in (ignore-errors (epg-list-keys (epg-make-context) user-full-name)) collect (epg-sub-key-id (car (epg-key-sub-key-list key))))) user-mail-address) ;; With GPG 2.1, this forces gpg-agent to use the Emacs minibuffer to From 377dbae3fc625a167bd56574165d11e1e2a21d64 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 10:31:52 -0400 Subject: [PATCH 3195/4235] Install/compile packages in order of declaration This should fix an issue where a package A, which uses macros from a package B, is installed before package B, causing void-function errors. The currently known and affected packages are neotree, parinfer, and evil-collection. --- core/autoload/packages.el | 17 ++++++++--------- core/cli/packages.el | 2 +- core/core-packages.el | 3 ++- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 90f844168..1afd7a85d 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -214,14 +214,12 @@ files." objects, in the order of their `package! blocks.'" (doom-initialize-packages) (cl-remove-duplicates - (let (packages) - (dolist (name (append (mapcar #'car doom-packages) doom-core-packages)) - (when-let* ((desc (cadr (assq name package-alist)))) - (push (cons name desc) packages) - (cl-loop for dep in (package--get-deps name) - if (assq dep package-alist) - do (push (cons dep (cadr it)) packages)))) - packages) + (cl-loop for name in (append doom-core-packages (mapcar #'car doom-packages)) + if (assq name package-alist) + nconc (cl-loop for dep in (package--get-deps name) + if (assq dep package-alist) + collect (cons dep (cadr it))) + and collect (cons name (cadr it))) :key #'car :from-end t)) @@ -332,7 +330,8 @@ Used by `doom-packages-install'." (cl-loop for (name . plist) in (doom-get-packages :ignored (if include-ignored-p 'any) :disabled nil - :deps t) + :deps t + :sort nil) if (and (or (plist-get plist :pin) (not (package-built-in-p name))) (or (not (doom-package-installed-p name)) diff --git a/core/cli/packages.el b/core/cli/packages.el index ed71d5a77..be9592de4 100644 --- a/core/cli/packages.el +++ b/core/cli/packages.el @@ -26,7 +26,7 @@ (defun doom-packages-install (&optional auto-accept-p) "Interactive command for installing missing packages." (print! "Looking for packages to install...") - (let ((packages (reverse (doom-get-missing-packages)))) + (let ((packages (doom-get-missing-packages))) (cond ((not packages) (print! (green "No packages to install!")) nil) diff --git a/core/core-packages.el b/core/core-packages.el index 36121bf39..60c5b9dc1 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -131,7 +131,8 @@ them." (cl-loop for key being the hash-keys of doom-modules for path = (doom-module-path (car key) (cdr key) "packages.el") do (let ((doom--current-module key)) (_load path t))) - (_load private-packages t)))))))) + (_load private-packages t) + (setq doom-packages (reverse doom-packages))))))))) ;; From 8afbb804d9221a51d5b944a967d60b1fc512e8de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 16:40:23 -0400 Subject: [PATCH 3196/4235] lang/ruby: add bundler + keybinds --- modules/lang/ruby/config.el | 14 ++++++++++++++ modules/lang/ruby/packages.el | 1 + 2 files changed, 15 insertions(+) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index e199afd4d..a824657c5 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -102,6 +102,20 @@ :n "s" #'rspec-verify-single :n "v" #'rspec-verify) + + (def-package! bundler + :after enh-ruby-mode + :config + (map! :localleader + :map enh-ruby-mode-map + :prefix "b" + :n "c" #'bundle-check + :n "C" #'bundle-console + :n "i" #'bundle-install + :n "u" #'bundle-update + :n "e" #'bundle-exec + :n "o" #'bundle-open)) + ;; Evil integration (when (featurep! :feature evil +everywhere) (add-hook! '(rspec-mode-hook rspec-verifiable-mode-hook) diff --git a/modules/lang/ruby/packages.el b/modules/lang/ruby/packages.el index 5bcef5610..ca9d05264 100644 --- a/modules/lang/ruby/packages.el +++ b/modules/lang/ruby/packages.el @@ -10,6 +10,7 @@ (package! yard-mode) (package! rake) (package! robe) +(package! bundler) (when (featurep! :completion company) (package! company-inf-ruby)) From b91a8f0d2fe99df49d41a31b94ed525b297ae358 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 22:17:41 -0400 Subject: [PATCH 3197/4235] lang/python: rewrite modeline version segment + Add $PYENV_ROOT/shims was added to exec-path, so pyenv python version is picked up on. + Fixes out-of-date python version in the modeline of other buffers after switching pyenv/pyvenv/conda envs. + The pipenv version and regular python display have been merged. --- modules/lang/python/autoload/python.el | 56 +++++++++++++++++++------- modules/lang/python/config.el | 29 ++++++------- 2 files changed, 53 insertions(+), 32 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index ecca5a796..827bc9cbc 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -1,11 +1,18 @@ ;;; lang/python/autoload/python.el -*- lexical-binding: t; -*- +(defvar +python-version-cache (make-hash-table :test 'equal) + "TODO") + ;;;###autoload (defun +python/repl () "Open the Python REPL." (interactive) (process-buffer (run-python nil t t))) +(defun +python--extract-version (prefix str) + (when str + (format "%s%s" prefix (cadr (split-string str " "))))) + ;;;###autoload (defun +python-version () "Return the currently installed version of python on your system or active in @@ -14,18 +21,37 @@ the current pipenv. This is not necessarily aware of env management tools like virtualenv, pyenv or pipenv, unless those tools have modified the PATH that Emacs picked up when you started it." - (let* ((pipenv-dir (pipenv-project-p)) - (default-directory (or pipenv-dir default-directory)) - (command (if pipenv-dir - "pipenv run python --version" - "python --version")) - (bin (car (split-string command " ")))) - (unless (executable-find bin) - (user-error "Couldn't find %s executable in PATH" bin)) - (with-temp-buffer - (let ((p (apply #'call-process bin nil (current-buffer) nil - (cdr (split-string command " " t)))) - (output (string-trim (buffer-string)))) - (unless (zerop p) - (user-error "'%s' failed: %s" command output)) - (cadr (split-string output " " t)))))) + (condition-case _ + (if-let* ((proot (and (fboundp 'pipenv-project-p) + (pipenv-project-p)))) + (let* ((default-directory proot) + (v (car (process-lines "pipenv" "run" "python" "--version")))) + (puthash proot + (+python--extract-version "Pipenv " v) + +python-version-cache)) + (puthash (doom-project-root) + (+python--extract-version "Python " (car (process-lines "python" "--version"))) + +python-version-cache)) + (error "Python"))) + + +;; +;; Hooks + +;;;###autoload +(defun +python|update-version (&rest _) + "Update `+python--version' by consulting `+python-version' function." + (setq +python--version + (or (gethash (or (and (fboundp 'pipenv-project-p) + (pipenv-project-p)) + (doom-project-root)) + +python-version-cache) + (+python-version)))) + +;;;###autoload +(defun +python|update-version-in-all-buffers () + "Update `+python-version' in all buffers in `python-mode'." + (dolist (buffer (doom-buffers-in-mode 'python-mode)) + (setq +python-version-cache (clrhash +python-version-cache)) + (with-current-buffer buffer + (+python|update-version)))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 40bce909a..1dc367b46 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,10 +1,9 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- -(defvar +python-mode-line-indicator - '("Python" (+python-version (" " +python-version))) +(defconst +python-mode-line-indicator '("" +python--version) "Format for the python version/env indicator in the mode-line.") -(defvar-local +python-version nil +(defvar-local +python--version nil "The python version in the current buffer.") @@ -64,9 +63,6 @@ (setq mode-name +python-mode-line-indicator)) (add-hook 'python-mode-hook #'+python|adjust-mode-line) - (defun +python|update-version (&rest _) - (setq +python-version (+python-version))) - (+python|update-version) (add-hook 'python-mode-hook #'+python|update-version)) @@ -135,8 +131,8 @@ :hook (python-mode . pipenv-mode) :init (setq pipenv-with-projectile nil) :config - (advice-add #'pipenv-activate :after-while #'+python|update-version) - (advice-add #'pipenv-deactivate :after-while #'+python|update-version)) + (advice-add #'pipenv-activate :after-while #'+python|update-version-in-all-buffers) + (advice-add #'pipenv-deactivate :after-while #'+python|update-version-in-all-buffers)) (def-package! pyenv-mode @@ -144,11 +140,10 @@ :after python :config (pyenv-mode +1) - (advice-add #'pyenv-mode-set :after #'+python|update-version) - (advice-add #'pyenv-mode-unset :after #'+python|update-version) - (add-to-list '+python-mode-line-indicator - '(:eval (if (pyenv-mode-version) (concat " pyenv:" (pyenv-mode-version)))) - 'append)) + (when (executable-find "pyenv") + (add-to-list 'exec-path (expand-file-name "shims" (or (getenv "PYENV_ROOT") "~/.pyenv")))) + (advice-add #'pyenv-mode-set :after #'+python|update-version-in-all-buffers) + (advice-add #'pyenv-mode-unset :after #'+python|update-version-in-all-buffers)) (def-package! pyvenv @@ -156,8 +151,8 @@ :after python :config (defun +python-current-pyvenv () pyvenv-virtual-env-name) - (add-hook 'pyvenv-post-activate-hooks #'+python|update-version) - (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version) + (add-hook 'pyvenv-post-activate-hooks #'+python|update-version-in-all-buffers) + (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version-in-all-buffers) (add-to-list '+python-mode-line-indicator '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) 'append)) @@ -192,8 +187,8 @@ (conda-env-initialize-interactive-shells) (after! eshell (conda-env-initialize-eshell)) - (add-hook 'conda-postactivate-hook #'+python|update-version) - (add-hook 'conda-postdeactivate-hook #'+python|update-version) + (add-hook 'conda-postactivate-hook #'+python|update-version-in-all-buffers) + (add-hook 'conda-postdeactivate-hook #'+python|update-version-in-all-buffers) (add-to-list '+python-mode-line-indicator '(conda-env-current-name (" conda:" conda-env-current-name)) 'append)) From 8bdb42fe15d498aeb620f11ef3a69a529b0654a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 22:45:13 -0400 Subject: [PATCH 3198/4235] lang/ruby: major refactor + Robe is now to be started manually. + Adds more keybindings for robe (including ' for robe-start). + Use ruby-mode if ruby isn't available (e.g. editing ruby files on remote systems), enh-ruby-mode otherwise. + Added rake, bundler, rvm, rbenv and minitest packages + Added $RBENV_ROOT/shims to exec-path. This should fix rbenv support for the ruby version display in the modeline. --- modules/lang/ruby/autoload.el | 36 +++++-- modules/lang/ruby/config.el | 190 ++++++++++++++++++++-------------- modules/lang/ruby/packages.el | 16 ++- 3 files changed, 150 insertions(+), 92 deletions(-) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index 980fdd2ce..77bc34756 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -1,5 +1,8 @@ ;;; lang/ruby/autoload.el -*- lexical-binding: t; -*- +(defvar +ruby-version-cache (make-hash-table :test 'equal) + "TODO") + ;;;###autoload (defun +ruby|cleanup-robe-servers () "Clean up dangling inf robe processes if there are no more `enh-ruby-mode' @@ -22,11 +25,28 @@ ruby executable found in your PATH). This is not necessarily aware of env management tools like virtualenv, pyenv or pipenv, unless those tools have modified the PATH that Emacs picked up when you started it." - (unless (executable-find "ruby") - (user-error "Couldn't find ruby executable in PATH")) - (with-temp-buffer - (let ((p (call-process "ruby" nil (current-buffer) nil "--version")) - (output (string-trim (buffer-string)))) - (unless (zerop p) - (user-error "ruby --version failed: %s" output)) - (nth 1 (split-string output " " t))))) + (condition-case _ + (let ((version-str (car (process-lines "ruby" "--version")))) + (puthash (doom-project-root) + (format "Ruby %s" (cadr (split-string version-str " "))) + +ruby-version-cache)) + (error "Ruby"))) + + +;; +;; Hooks + +;;;###autoload +(defun +ruby|update-version (&rest _) + "Update `+ruby--version' by consulting `+ruby-version' function." + (setq +ruby--version + (or (gethash (doom-project-root) +python-version-cache) + (+ruby-version)))) + +;;;###autoload +(defun +ruby|update-version-in-all-buffers () + "Update `+ruby--version' in all `enh-ruby-mode' buffers." + (dolist (buffer (doom-buffers-in-mode 'enh-ruby-mode)) + (setq +ruby-version-cache (clrhash +ruby-version-cache)) + (with-current-buffer buffer + (+ruby|update-version)))) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index a824657c5..1c55609ff 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -1,10 +1,9 @@ ;;; lang/ruby/config.el -*- lexical-binding: t; -*- -(defvar +ruby-mode-line-indicator - '("Ruby" (+ruby-version (" " +ruby-version))) +(defvar +ruby-mode-line-indicator '("" +ruby--version) "Format for the ruby version/env indicator in the mode-line.") -(defvar-local +ruby-version nil +(defvar-local +ruby--version nil "The ruby version in the current buffer.") @@ -12,33 +11,66 @@ ;; Packages (def-package! enh-ruby-mode - :mode "\\.rb\\'" - :mode "\\.rake\\'" - :mode "\\.gemspec\\'" - :mode "\\.\\(?:pry\\|irb\\)rc\\'" - :mode "/\\(?:Gem\\|Cap\\|Vagrant\\|Rake\\|Pod\\|Puppet\\|Berks\\)file\\'" + :mode ("\\.\\(?:pry\\|irb\\)rc\\'" . +ruby|init) + :mode ("\\.\\(?:rb\\|rake\\|rabl\\|ru\\|builder\\|gemspec\\|jbuilder\\|thor\\)\\'" . +ruby|init) + :mode ("/\\(?:Berks\\|Cap\\|Gem\\|Guard\\|Pod\\|Puppet\\|Rake\\|Thor\\|Vagrant\\)file\\'" . +ruby|init) + :preface + (after! ruby-mode (require 'enh-ruby-mode)) + (defun +ruby|init () + "Enable `enh-ruby-mode' if ruby is available, otherwise `ruby-mode'." + (if (executable-find "ruby") + (enh-ruby-mode) + (ruby-mode))) :config - (set-electric! 'enh-ruby-mode :words '("else" "end" "elsif")) - (set-repl-handler! 'enh-ruby-mode #'inf-ruby) ; `inf-ruby' + (set-env! "RBENV_ROOT") + (set-electric! '(ruby-mode enh-ruby-mode) :words '("else" "end" "elsif")) + (set-repl-handler! '(ruby-mode enh-ruby-mode) #'inf-ruby) + + (after! company-dabbrev-code + (add-to-list 'company-dabbrev-code-modes 'enh-ruby-mode nil #'eq) + (add-to-list 'company-dabbrev-code-modes 'ruby-mode nil #'eq)) (after! dtrt-indent ;; `dtrt-indent' supports ruby-mode. Make it aware of enh-ruby-mode (add-to-list 'dtrt-indent-hook-mapping-list '(enh-ruby-mode ruby enh-ruby-indent-level))) + ;; so class and module pairs work - (setq-hook! 'enh-ruby-mode-hook sp-max-pair-length 6) + (setq-hook! (ruby-mode enh-ruby-mode) sp-max-pair-length 6) ;; Add ruby version string to the major mode in the modeline (defun +ruby|adjust-mode-line () (setq mode-name +ruby-mode-line-indicator)) (add-hook 'enh-ruby-mode-hook #'+ruby|adjust-mode-line) - (defun +ruby|update-version (&rest _) - (setq +ruby-version (+ruby-version))) - (+ruby|update-version) (add-hook 'enh-ruby-mode-hook #'+ruby|update-version)) -(def-package! yard-mode :hook enh-ruby-mode) +(def-package! robe + :hook (enh-ruby-mode . robe-mode) + :config + (set-repl-handler! 'enh-ruby-mode #'robe-start) + (set-company-backend! 'enh-ruby-mode 'company-robe) + (set-lookup-handlers! 'enh-ruby-mode + :definition #'robe-jump + :documentation #'robe-doc) + (map! :localleader + :map robe-mode-map + :n "'" #'robe-start + ;; robe mode specific + :n "h" #'robe-doc + :n "rr" #'robe-rails-refresh + ;; inf-enh-ruby-mode + :prefix "s" + :n "f" #'ruby-send-definition + :n "F" #'ruby-send-definition-and-go + :n "r" #'ruby-send-region + :n "R" #'ruby-send-region-and-go + :n "i" #'ruby-switch-to-inf)) + + +;; NOTE Must be loaded before `robe-mode' +(def-package! yard-mode + :hook (ruby-mode enh-ruby-mode)) (def-package! rubocop @@ -52,22 +84,45 @@ :nv "P" #'rubocop-autocorrect-project)) -(def-package! robe - :hook (enh-ruby-mode . robe-mode) - :init - ;; robe-start errors if you hit no. - (defun +ruby|init-robe () - (when (executable-find "ruby") - (cl-letf (((symbol-function #'yes-or-no-p) (lambda (_) t))) - (save-window-excursion - (with-demoted-errors "ROBE ERROR: %s" - (robe-start))) - (when (robe-running-p) - (add-hook 'kill-buffer-hook #'+ruby|cleanup-robe-servers nil t))))) - (add-hook 'enh-ruby-mode-hook #'+ruby|init-robe) - :config - (set-company-backend! 'robe-mode 'company-robe)) +;; +;; Package & Ruby version management +(def-package! rake + :defer t + :init + (setq rake-cache-file (concat doom-cache-dir "rake.cache")) + (map! :after enh-ruby-mode + :localleader + :map enh-ruby-mode-map + :prefix "k" + :n "k" #'rake + :n "r" #'rake-rerun + :n "R" #'rake-regenerate-cache + :n "f" #'rake-find-task)) + +(def-package! bundler + :defer t + :init + (map! :after enh-ruby-mode + :localleader + :map enh-ruby-mode-map + :prefix "b" + :n "c" #'bundle-check + :n "C" #'bundle-console + :n "i" #'bundle-install + :n "u" #'bundle-update + :n "e" #'bundle-exec + :n "o" #'bundle-open)) + +;; `rvm' +(setq rspec-use-rvm t) + +(after! rbenv + (add-to-list 'exec-path (expand-file-name "shims" rbenv-installation-dir))) + + +;; +;; Testing frameworks (def-package! rspec-mode :mode ("/\\.rspec\\'" . text-mode) @@ -80,64 +135,41 @@ ;; Rake (("task" "namespace") () "end"))) - (unless (featurep! :feature evil) + (if (featurep! :feature evil) + (add-hook 'rspec-mode-hook #'evil-normalize-keymaps) (setq rspec-verifiable-mode-keymap (make-sparse-keymap) rspec-mode-keymap (make-sparse-keymap))) - - (defun +ruby*init-appropriate-rspec-mode () - "TODO" - (cond ((rspec-buffer-is-spec-p) - (rspec-mode +1)) - ((let ((proot (doom-project-root 'nocache))) - (or (file-directory-p (expand-file-name "spec" proot)) - (file-exists-p (expand-file-name ".rspec" proot)))) - (rspec-verifiable-mode +1)))) - (advice-add #'rspec-enable-appropriate-mode :override #'+ruby*init-appropriate-rspec-mode) :config - (map! :map (rspec-mode-map rspec-verifiable-mode-map) + (map! :map rspec-mode-map :localleader :prefix "t" :n "r" #'rspec-rerun :n "a" #'rspec-verify-all :n "s" #'rspec-verify-single - :n "v" #'rspec-verify) + :n "v" #'rspec-verify + :n "c" #'rspec-verify-continue + :n "e" #'rspec-toggle-example-pendingness + :n "f" #'rspec-verify-method + :n "l" #'rspec-run-last-failed + :n "m" #'rspec-verify-matching + :n "t" #'rspec-toggle-spec-and-target-find-example + :n "T" #'rspec-toggle-spec-and-target)) - (def-package! bundler - :after enh-ruby-mode - :config - (map! :localleader - :map enh-ruby-mode-map - :prefix "b" - :n "c" #'bundle-check - :n "C" #'bundle-console - :n "i" #'bundle-install - :n "u" #'bundle-update - :n "e" #'bundle-exec - :n "o" #'bundle-open)) - - ;; Evil integration - (when (featurep! :feature evil +everywhere) - (add-hook! '(rspec-mode-hook rspec-verifiable-mode-hook) - #'evil-normalize-keymaps))) +(def-package! minitest + :defer t + :config + (when (featurep! :feature evil) + (add-hook 'minitest-mode-hook #'evil-normalize-keymaps)) + (map! :map minitest-mode-map + :localleader + :prefix "t" + :n "r" #'minitest-rerun + :n "a" #'minitest-verify-all + :n "s" #'minitest-verify-single + :n "v" #'minitest-verify)) -(def-package! company-inf-ruby - :when (featurep! :completion company) - :after inf-ruby - :config (set-company-backend! 'inf-ruby-mode 'company-inf-ruby)) - - -;; -;; Version managers - -(def-package! rbenv - :when (featurep! +rbenv) - :after enh-ruby-mode - :config (set-env! "RBENV_ROOT")) - - -(def-package! rvm - :when (featurep! +rvm) - :after enh-ruby-mode) - +;; Evil integration +(when (featurep! :feature evil +everywhere) + (add-hook! 'rspec-mode-hook #'evil-normalize-keymaps)) diff --git a/modules/lang/ruby/packages.el b/modules/lang/ruby/packages.el index ca9d05264..c0b98741e 100644 --- a/modules/lang/ruby/packages.el +++ b/modules/lang/ruby/packages.el @@ -4,18 +4,24 @@ ;; requires ruby ruby-lint (package! enh-ruby-mode) -(package! rubocop) -(package! inf-ruby) -(package! rspec-mode) (package! yard-mode) -(package! rake) +(package! inf-ruby) (package! robe) -(package! bundler) (when (featurep! :completion company) (package! company-inf-ruby)) +;; Project tools +(package! bundler) +(package! rake) +(package! rubocop) + +;; Version management (when (featurep! +rbenv) (package! rbenv)) (when (featurep! +rvm) (package! rvm)) + +;; Testing frameworks +(package! rspec-mode) +(package! minitest) From 2a84836c115101cc324b20209011a56a1d006e1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 23:26:08 -0400 Subject: [PATCH 3199/4235] +emacs-lisp-eval: emit backtrace on error Running +eval/region (gr) and +eval/buffer (gR) will use +emacs-lisp-eval (in emacs-lisp-mode buffers). This change will force it to emit a backtrace in case of an error. --- modules/lang/emacs-lisp/autoload.el | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index e8957ca5d..31800f138 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -8,10 +8,15 @@ "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 (concat "(progn " (buffer-substring-no-properties beg end) "\n)")))) + (let ((result + (let ((debug-on-error t)) + (eval (read + (concat "(progn " + (buffer-substring-no-properties beg end) + "\n)")) + t))) (buf (get-buffer-create "*doom eval*")) - (inhibit-read-only t) - lines) + (inhibit-read-only t)) (with-current-buffer buf (read-only-mode +1) (erase-buffer) @@ -20,15 +25,14 @@ to a pop up buffer." (emacs-lisp-mode)) (prin1 result buf) (pp-buffer) - (setq lines (count-lines (point-min) (point-max))) - (cond ((> lines 1) - (save-selected-window - (pop-to-buffer buf) - (with-current-buffer buf - (goto-char (point-min))))) - (t - (message "%s" (buffer-substring (point-min) (point-max))) - (kill-buffer buf)))))) + (let ((lines (count-lines (point-min) (point-max)))) + (if (> lines 1) + (save-selected-window + (pop-to-buffer buf) + (with-current-buffer buf + (goto-char (point-min)))) + (message "%s" (buffer-substring (point-min) (point-max))) + (kill-buffer buf)))))) (defvar +emacs-lisp--face nil) ;;;###autoload From aa930256b8641e655075e68ff1eab680ff127980 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 23:36:54 -0400 Subject: [PATCH 3200/4235] Update doom/reload-project for changes upstream In projectile. --- core/autoload/projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index cdd134802..e92d8e6b6 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -29,7 +29,7 @@ they are absolute." "Reload the project root cache." (interactive) (projectile-invalidate-cache nil) - (projectile-reset-cached-project-root) + (setq-default projectile-project-root nil) (dolist (fn projectile-project-root-files-functions) (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) From 9afc61e57e1cb1a9860db2569e8e28db5223d23e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Sep 2018 23:52:20 -0400 Subject: [PATCH 3201/4235] Refactor & optimize doom! + module API --- core/core-modules.el | 69 ++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 1ae339930..2c7fe893f 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -12,9 +12,9 @@ "A list of module root directories. Order determines priority.") (defconst doom-obsolete-modules - '(((:tools rotate-text) (:editor rotate-text)) - ((:emacs electric-indent) (:emacs electric)) - ((:feature version-control) (:emacs vc) (:ui vc-gutter))) + '((:tools (rotate-text (:editor rotate-text))) + (:emacs (electric-indent (:emacs electric))) + (:feature (version-control (:emacs vc) (:ui vc-gutter)))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . MODULES). E.g. @@ -80,16 +80,19 @@ non-nil." (plist-get plist property) plist))) -(defun doom-module-put (category module property value &rest rest) +(defun doom-module-put (category module &rest plist) "Set a PROPERTY for CATEGORY MODULE to VALUE. PLIST should be additional pairs -of PROPERTY and VALUEs." - (when-let* ((plist (doom-module-get category module))) - (plist-put plist property value) - (when rest - (when (cl-oddp (length rest)) - (signal 'wrong-number-of-arguments (list (length rest)))) - (while rest - (plist-put rest (pop rest) (pop rest)))) +of PROPERTY and VALUEs. + +\(fn CATEGORY MODULE PROPERTY VALUE &rest [PROPERTY VALUE [...]])" + (if-let* ((old-plist (doom-module-get category module))) + (progn + (when plist + (when (cl-oddp (length plist)) + (signal 'wrong-number-of-arguments (list (length plist)))) + (while plist + (plist-put old-plist (pop plist) (pop plist)))) + (puthash (cons category module) old-plist doom-modules)) (puthash (cons category module) plist doom-modules))) (defun doom-module-set (category module &rest plist) @@ -103,13 +106,6 @@ following properties: Example: (doom-module-set :lang 'haskell :flags '(+intero))" - (when plist - (let ((old-plist (doom-module-get category module))) - (unless (plist-member plist :flags) - (plist-put plist :flags (plist-get old-plist :flags))) - (unless (plist-member plist :path) - (plist-put plist :path (or (plist-get old-plist :path) - (doom-module-locate-path category module)))))) (puthash (cons category module) plist doom-modules)) @@ -135,7 +131,7 @@ returns nil, otherwise an absolute path. This doesn't require modules to be enabled. For enabled modules us `doom-module-path'." (when (keywordp category) - (setq category (substring (symbol-name category) 1))) + (setq category (doom-keyword-name category))) (when (and module (symbolp module)) (setq module (symbol-name module))) (cl-loop with file-name-handler-alist = nil @@ -147,7 +143,8 @@ This doesn't require modules to be enabled. For enabled modules us (defun doom-module-from-path (&optional path) "Returns a cons cell (CATEGORY . MODULE) derived from PATH (a file path)." (or doom--current-module - (let ((path (or path (FILE!)))) + (let* (file-name-handler-alist + (path (or path (FILE!)))) (save-match-data (setq path (file-truename path)) (when (string-match "/modules/\\([^/]+\\)/\\([^/]+\\)\\(?:/.*\\)?$" path) @@ -174,14 +171,14 @@ non-nil, return paths of possible modules, activated or otherwise." "Minimally initialize `doom-modules' (a hash table) and return it." (or (unless refresh-p doom-modules) (let ((noninteractive t) - (doom-modules - (make-hash-table :test 'equal - :size 20 - :rehash-threshold 1.0)) + doom-modules doom-init-modules-p) (message "Initializing modules") (load! "init" doom-private-dir t) - doom-modules))) + (or doom-modules + (make-hash-table :test 'equal + :size 20 + :rehash-threshold 1.0))))) ;; @@ -288,7 +285,7 @@ to least)." (unless doom-modules (setq doom-modules (make-hash-table :test 'equal - :size (if modules (length modules) 100) + :size (if modules (length modules) 150) :rehash-threshold 1.0))) (let (category m) (while modules @@ -298,7 +295,8 @@ to least)." ((catch 'doom-modules (let* ((module (if (listp m) (car m) m)) (flags (if (listp m) (cdr m)))) - (when-let* ((new (assoc (list category module) doom-obsolete-modules))) + (when-let* ((obsolete (assq category doom-obsolete-modules)) + (new (assq module obsolete))) (let ((newkeys (cdr new))) (if (null newkeys) (message "Warning: the %s module is deprecated" key) @@ -310,8 +308,8 @@ to least)." (throw 'doom-modules t)))) (if-let* ((path (doom-module-locate-path category module))) (doom-module-set category module :flags flags :path path) - (message "Warning: couldn't find the %s %s module" category module))))))) - `(setq doom-modules ',doom-modules))) + (message "Warning: couldn't find the %s %s module" category module)))))))) + `(setq doom-modules ',doom-modules)) (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) @@ -349,7 +347,16 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (defmacro require! (category module &rest plist) "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." `(let ((module-path (doom-module-locate-path ,category ',module))) - (doom-module-set ,category ',module ,@plist) + (doom-module-set + ,category ',module + ,@(when plist + (let ((old-plist (doom-module-get category module))) + (unless (plist-member plist :flags) + (plist-put plist :flags (plist-get old-plist :flags))) + (unless (plist-member plist :path) + (plist-put plist :path (or (plist-get old-plist :path) + (doom-module-locate-path category module))))) + plist)) (if (directory-name-p module-path) (condition-case-unless-debug ex (let ((doom--current-module ',(cons category module))) From 239c183b703ca8edbf96079c774a5033f692555f Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 26 Sep 2018 12:55:22 +0200 Subject: [PATCH 3202/4235] tools/pdf: recognize modeline and doom-modeline --- modules/tools/pdf/+modeline.el | 6 +++--- modules/tools/pdf/config.el | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/tools/pdf/+modeline.el b/modules/tools/pdf/+modeline.el index 2ca275663..916886aae 100644 --- a/modules/tools/pdf/+modeline.el +++ b/modules/tools/pdf/+modeline.el @@ -4,16 +4,16 @@ "Current and total page indicator for PDF documents." (format "P %d/%d" (pdf-view-current-page) (pdf-cache-number-of-pages))) -(if (featurep! :ui doom-modeline +new) +(if (featurep! :ui modeline) (def-modeline-format! '+pdf '(+mode-line-bar " " +mode-line-buffer-id " " +pdf-pages) '(+mode-line-major-mode +mode-line-vcs)) (def-modeline! '+pdf - '(bar matches " " buffer-info +pdf-pages) + '(bar matches " " buffer-info " " +pdf-pages) '(major-mode vcs))) (defun +pdf|init-modeline () - (funcall (if (featurep! :ui doom-modeline +new) + (funcall (if (featurep! :ui modeline) #'set-modeline! #'doom-set-modeline) '+pdf)) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 8ea1b0139..b4ce9e2d0 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -30,7 +30,7 @@ ;; Turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0)) ;; Custom modeline that removes useless info and adds page numbers - (when (featurep! :ui doom-modeline) + (when (or (featurep! :ui doom-modeline) (featurep! :ui modeline)) (load! "+modeline")) ;; Handle PDF-tools related popups better (set-popup-rule! "^\\*Outline*" :side 'right :size 40 :select nil) From 4e0a4e1b51a936e5972769ced61e014380b32109 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 09:41:43 -0400 Subject: [PATCH 3203/4235] lang/{ruby,python}: Fix advice arguments errors --- modules/lang/python/autoload/python.el | 2 +- modules/lang/ruby/autoload.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 827bc9cbc..088342178 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -49,7 +49,7 @@ started it." (+python-version)))) ;;;###autoload -(defun +python|update-version-in-all-buffers () +(defun +python|update-version-in-all-buffers (&rest _) "Update `+python-version' in all buffers in `python-mode'." (dolist (buffer (doom-buffers-in-mode 'python-mode)) (setq +python-version-cache (clrhash +python-version-cache)) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index 77bc34756..321d35d66 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -44,7 +44,7 @@ started it." (+ruby-version)))) ;;;###autoload -(defun +ruby|update-version-in-all-buffers () +(defun +ruby|update-version-in-all-buffers (&rest ) "Update `+ruby--version' in all `enh-ruby-mode' buffers." (dolist (buffer (doom-buffers-in-mode 'enh-ruby-mode)) (setq +ruby-version-cache (clrhash +ruby-version-cache)) From eb9fa90adf5f99afbdf75e2a731574790e50926b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 10:42:09 -0400 Subject: [PATCH 3204/4235] editor/parinfer: fix void-function evil-define-key errors Parinfer uses `evil-define-key' without loading evil. This means that if evil is installed *after* parinfer, parinfer will throw up void-function errors, because evil-define-key (a macro) wasn't expanded at compile-time. So we make extra sure evil is installed before parinfer (or at least, make sure evil-define-key is autoloaded at install time, in case evil was installed in another session). --- modules/editor/parinfer/packages.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/editor/parinfer/packages.el b/modules/editor/parinfer/packages.el index 56af803d7..13875d6a6 100644 --- a/modules/editor/parinfer/packages.el +++ b/modules/editor/parinfer/packages.el @@ -1,4 +1,14 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/parinfer/packages.el +(when (featurep! :feature evil) + ;; Parinfer uses `evil-define-key' without loading evil, so if evil is + ;; installed *after* parinfer, parinfer will throw up void-function errors. + ;; because evil-define-key (a macro) wasn't expanded at compile-time. So we + ;; make sure evil is installed before parinfer... + (package! evil) + ;; ...and that it can see `evil-define-key' if evil was installed in a + ;; separate session: + (autoload 'evil-define-key "evil-core" nil nil 'macro)) + (package! parinfer) From d9a179d0719fb46932cb10c186567487f24e65f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 10:46:43 -0400 Subject: [PATCH 3205/4235] feature/evil: refactor neotree-make-executor fix The autoload is necessary in case neotree was installed in another session. --- modules/feature/evil/packages.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index 0f5096ef0..d0973bd8b 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -24,6 +24,7 @@ ;; `evil-collection-neotree' uses the `neotree-make-executor' macro, but this ;; requires neotree be available during byte-compilation (while installing). (when (featurep! :ui neotree) - (depends-on! :ui neotree)) + (package! neotree) + (autoload 'neotree-make-executor "neotree" nil nil 'macro)) (package! evil-collection)) From fcd1e913c519d51a18e6f8157ccd1a0f0669340c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 12:10:00 -0400 Subject: [PATCH 3206/4235] tools/magit: update vc on +magit/quit Instead of magit-post-refresh-hook, which fires much more frequently. Updating vc across all buffers is expensive, so let's only do it when we quit magit. Warning: this may make quitting magit expensive when you have many buffers open. Still searching for a better solution. --- modules/tools/magit/autoload.el | 11 +++++++++-- modules/tools/magit/config.el | 9 +-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 72df14f4f..d6cda9596 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -50,9 +50,16 @@ ;;;###autoload (defun +magit/quit (&optional _kill-buffer) - "Clean up magit buffers after quitting `magit-status'." + "Clean up magit buffers after quitting `magit-status' and refresh version +control in buffers." (interactive) - (mapc #'+magit--kill-buffer (magit-mode-get-buffers))) + (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (fboundp 'vc-refresh-state) + (vc-refresh-state)) + (when (fboundp '+version-control|update-git-gutter) + (+version-control|update-git-gutter))))) (defun +magit--kill-buffer (buf) "TODO" diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 6792eecec..413ae80ac 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -47,14 +47,7 @@ available.") ;; Don't replace the leader key ;; FIXME remove me when general.el is integrated - (define-key magit-diff-mode-map (kbd doom-leader-key) nil) - - (defun +magit|update-vc () - "Update vc in all verson-controlled buffers when magit refreshes." - (dolist (buf (buffer-list)) - (with-current-buffer buf - (vc-refresh-state)))) - (add-hook 'magit-post-refresh-hook #'+magit|update-vc)) + (define-key magit-diff-mode-map (kbd doom-leader-key) nil)) (def-package! magit-todos From 68699c3d5b36c7243b74f1661887b2210b9011b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 12:28:32 -0400 Subject: [PATCH 3207/4235] lang/python: make repl/eval handlers respect pipenv --- modules/lang/python/autoload/python.el | 8 +++++++- modules/lang/python/config.el | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 088342178..b31099b98 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -7,7 +7,13 @@ (defun +python/repl () "Open the Python REPL." (interactive) - (process-buffer (run-python nil t t))) + (process-buffer + (if-let* ((bin (executable-find "pipenv")) + (dir (pipenv-project-p))) + (let* ((default-directory dir) + (python-shell-interpreter (format "%s run %s" bin python-shell-interpreter))) + (run-python nil t t)) + (run-python nil t t)))) (defun +python--extract-version (prefix str) (when str diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 1dc367b46..35303dce6 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -131,6 +131,15 @@ :hook (python-mode . pipenv-mode) :init (setq pipenv-with-projectile nil) :config + (set-eval-handler! 'python-mode + '((:command . "python") + (:exec (lambda () + (if-let* ((bin (executable-find "pipenv")) + (dir (pipenv-project-p))) + (format "cd %S && %s run %%c %%o %%s %%a" dir bin) + "%c %o %s %a"))) + (:description . "Run Python script"))) + (advice-add #'pipenv-activate :after-while #'+python|update-version-in-all-buffers) (advice-add #'pipenv-deactivate :after-while #'+python|update-version-in-all-buffers)) From 4a9a2c00d94c3741f39dc44cc6a1ce259ed3b48e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 12:29:55 -0400 Subject: [PATCH 3208/4235] Remove smex-completion-read reference Doom no longer uses smex. --- modules/completion/ivy/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 7a3d2eacb..ac93170e7 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -40,7 +40,6 @@ immediately runs it on the current candidate (ending the ivy session)." ivy-wrap t ivy-fixed-height-minibuffer t projectile-completion-system 'ivy - smex-completion-method 'ivy ;; Don't use ^ as initial input ivy-initial-inputs-alist nil ;; highlight til EOL From da55ee2af24646798b1d12d282a34b536766877c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 20:37:35 -0400 Subject: [PATCH 3209/4235] lang/python: fix pipenv support for +python/repl --- modules/lang/python/autoload/python.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index b31099b98..cd8412ed3 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -7,13 +7,16 @@ (defun +python/repl () "Open the Python REPL." (interactive) - (process-buffer - (if-let* ((bin (executable-find "pipenv")) - (dir (pipenv-project-p))) - (let* ((default-directory dir) - (python-shell-interpreter (format "%s run %s" bin python-shell-interpreter))) - (run-python nil t t)) - (run-python nil t t)))) + (pop-to-buffer + (process-buffer + (let ((interp python-shell-interpreter) + (interp-args python-shell-interpreter-args)) + (if-let* ((bin (executable-find "pipenv")) + (default-directory (pipenv-project-p)) + (python-shell-interpreter "pipenv") + (python-shell-interpreter-args (format "run %s %s" interp interp-args))) + (run-python nil t t) + (run-python nil t t)))))) (defun +python--extract-version (prefix str) (when str From 431ea613b06f058f9b4ccb074d0c9f58cdc8340e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 20:38:02 -0400 Subject: [PATCH 3210/4235] lang/python: set PIPENV_MAX_DEPTH in eval handler Instead of changing the cwd, which chould have other reprecussions for the code about to be executed. --- modules/lang/python/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 35303dce6..5ee85feef 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -135,8 +135,8 @@ '((:command . "python") (:exec (lambda () (if-let* ((bin (executable-find "pipenv")) - (dir (pipenv-project-p))) - (format "cd %S && %s run %%c %%o %%s %%a" dir bin) + (_ (pipenv-project-p))) + (format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin) "%c %o %s %a"))) (:description . "Run Python script"))) From c7032cf8b02d2350f83830ccbafc9ba2c64be79e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 20:38:47 -0400 Subject: [PATCH 3211/4235] lang/web: fully remove nil autopair group This removes the nil autopair group, rather than just setting it to nil. No functional different, it's [slightly] more performant. --- modules/lang/web/+html.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 08dc50049..436dcc3e8 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -57,7 +57,7 @@ (if (string-match "\\(?:>\\|]\\|}\\)+\\'" string) (replace-match "" t t string) string)))))) - (setf (alist-get nil web-mode-engines-auto-pairs) nil)) + (delq (assq nil web-mode-engines-auto-pairs) web-mode-engines-auto-pairs)) (map! :map web-mode-map (:localleader From 01dde977764ce1cc7e2a55417482d572e85a4ae6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Sep 2018 20:44:54 -0400 Subject: [PATCH 3212/4235] lang/org: tweak org-todo-keywords{,-faces} --- modules/lang/org/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index bc36f23ba..49eaf17b9 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -198,7 +198,12 @@ unfold to point on startup." org-todo-keywords '((sequence "[ ](t)" "[-](p)" "[?](m)" "|" "[X](d)") (sequence "TODO(T)" "|" "DONE(D)") - (sequence "NEXT(n)" "ACTIVE(a)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)")) + (sequence "NEXT(n)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)")) + org-todo-keyword-faces + '(("[-]" . font-lock-constant-face) + ("[?]" . warning) + ("WAITING" . default) + ("LATER" . warning)) org-use-sub-superscripts '{} ;; Scale up LaTeX previews a bit (default is too small) From d5f8ecdfcee614dec435485b1b8aee8acbaab054 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 18:16:21 -0400 Subject: [PATCH 3213/4235] ui/treemacs: fix leader key in treemacs This is an ugly hack and I should be ashamed. Shame. Shame. Shame. But alas, it shall do until general.el is in. Fixes #860 --- modules/ui/treemacs/config.el | 81 ++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 10acd0222..861800fc9 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -48,7 +48,86 @@ There are 2 possible values: (def-package! treemacs-evil :when (featurep! :feature evil +everywhere) :after treemacs - :config (define-key evil-treemacs-state-map [escape] #'delete-window)) + :config + ;; FIXME Remove this when general.el is in + (set-evil-initial-state! 'treemacs-mode 'normal) + (map! :map treemacs-mode-map + :n "?" #'treemacs-helpful-hydra + :n [mouse-1] #'treemacs-leftclick-action + :n [double-mouse-1] #'treemacs-doubleclick-action + :n [tab] #'treemacs-TAB-action + :n [?\t] #'treemacs-TAB-action + :n [return] #'treemacs-RET-action + :n "RET" #'treemacs-RET-action + :n "r" #'treemacs-refresh + :n "d" #'treemacs-delete + :n "cf" #'treemacs-create-file + :n "cd" #'treemacs-create-dir + :n "R" #'treemacs-rename + :n "u" #'treemacs-goto-parent-node + :n "q" #'bury-buffer + :n "Q" #'treemacs-kill-buffer + :n "ov" #'treemacs-visit-node-vertical-split + :n "oh" #'treemacs-visit-node-horizontal-split + :n "oo" #'treemacs-visit-node-no-split + :n "oaa" #'treemacs-visit-node-ace + :n "oah" #'treemacs-visit-node-ace-horizontal-split + :n "oav" #'treemacs-visit-node-ace-vertical-split + :n "ox" #'treemacs-visit-node-in-external-application + :n "P" #'treemacs-peek + :n "n" #'treemacs-next-line + :n "p" #'treemacs-previous-line + :n "M-N" #'treemacs-next-line-other-window + :n "M-P" #'treemacs-previous-line-other-window + :n "" #'treemacs-previous-page-other-window + :n "" #'treemacs-next-page-other-window + :n "M-n" #'treemacs-next-neighbour + :n "M-p" #'treemacs-previous-neighbour + :n "th" #'treemacs-toggle-show-dotfiles + :n "tw" #'treemacs-toggle-fixed-width + :n "tv" #'treemacs-fringe-indicator-mode + :n "tg" #'treemacs-git-mode + :n "tf" #'treemacs-follow-mode + :n "ta" #'treemacs-filewatch-mode + :n "w" #'treemacs-set-width + :n "yy" #'treemacs-copy-path-at-point + :n "yr" #'treemacs-copy-project-root + :n "s" #'treemacs-resort + :n "b" #'treemacs-add-bookmark + :n "C-p r" #'treemacs-rename-project + :n "C-p a" #'treemacs-add-project-to-workspace + :n "C-p d" #'treemacs-remove-project-from-workspace + :n "C-p c c" #'treemacs-collapse-project + :n "C-p c o" #'treemacs-collapse-other-projects + :n "C-p c a" #'treemacs-collapse-all-projects + :n "" #'treemacs-collapse-all-projects + :n "C-j" #'treemacs-next-project + :n "C-k" #'treemacs-previous-project + :n "h" #'treemacs-root-up + :n "l" #'treemacs-root-down + :n [escape] #'delete-window + :n "j" #'treemacs-next-line + :n "k" #'treemacs-previous-line + :n "M-j" #'treemacs-next-neighbour + :n "M-k" #'treemacs-previous-neighbour + :n "M-J" #'treemacs-next-line-other-window + :n "M-K" #'treemacs-previous-line-other-window + :n "th" #'treemacs-toggle-show-dotfiles + :n "tw" #'treemacs-toggle-fixed-width + :n "tv" #'treemacs-fringe-indicator-mode + :n "tf" #'treemacs-follow-mode + :n "ta" #'treemacs-filewatch-mode + :n "tg" #'treemacs-git-mode + :n "w" #'treemacs-set-width + :n "b" #'treemacs-add-bookmark + :n "?" #'treemacs-helpful-hydra + :n "RET" #'treemacs-RET-action + :n "yr" #'treemacs-copy-project-root + :n "yy" #'treemacs-copy-path-at-point + :n "gr" #'treemacs-refresh + :n [down-mouse-1] #'ignore + :n "h" #'treemacs-root-up + :n "l" #'treemacs-root-down)) (def-package! treemacs-projectile From 4bdd6002a47a191c986ba6d7c9dfde5bd8cd2b0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 20:59:17 -0400 Subject: [PATCH 3214/4235] Restore projectile-project-root's old behavior For now... --- core/autoload/projects.el | 5 +---- core/core-projects.el | 9 +++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index e92d8e6b6..1a3cb4acd 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -61,10 +61,7 @@ If NOCACHE, don't fetch a cached answer." (if nocache (without-project-cache! (doom-project-root nil)) (let (projectile-require-project-root) - ;; NOTE `projectile-project-root' should return default-directory if we're - ;; not in a project. Seems to be a bug upstream. - (or (projectile-project-root) - default-directory)))) + (projectile-project-root)))) ;;;###autoload (defalias 'doom-project-expand #'projectile-expand-root) diff --git a/core/core-projects.el b/core/core-projects.el index 8ecf1bccd..d60d32282 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -45,6 +45,15 @@ projectile-project-root-files) projectile-project-root-files-bottom-up nil))) + ;; Restores the old behavior of `projectile-project-root', where it returns + ;; `default-directory' if not in a project, at least until I update Doom to + ;; deal with this. + ;; FIXME Check again after https://github.com/bbatsov/projectile/issues/1296 + (defun doom*projectile-project-root (project-root) + (or project-root + default-directory)) + (advice-add #'projectile-project-root :filter-return #'doom*projectile-project-root) + ;; Projectile root-searching functions can cause an infinite loop on TRAMP ;; connections, so disable them. (defun doom*projectile-locate-dominating-file (orig-fn file name) From 29ad900c1fcd8c629d37d33cc14a26dc3b13933f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 22:44:07 -0400 Subject: [PATCH 3215/4235] lang/css: refactor +css/toggle-inline-or-block Replaces instances of replace-regexp (interactive-only functions), removing the need for with-no-warnings and quiet!. Improves regexp responsible for compacting whitespace in between properties, which reduces compaction of whitespace in string arguments. --- modules/lang/web/autoload/css.el | 33 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/modules/lang/web/autoload/css.el b/modules/lang/web/autoload/css.el index 7c1a2167b..93eacc2a0 100644 --- a/modules/lang/web/autoload/css.el +++ b/modules/lang/web/autoload/css.el @@ -1,24 +1,29 @@ ;;; lang/web/autoload/css.el -*- lexical-binding: t; -*- -;;;###autoload +;; ;;;###autoload ;; TODO (defun +css/scss-build ()) -;;;###autoload +;; ;;;###autoload ;; TODO (defun +css/sass-build ()) (defun +css--toggle-inline-or-block (beg end) (skip-chars-forward " \t") (let ((orig (point-marker))) - (with-no-warnings - (quiet! - (if (= (line-number-at-pos beg) (line-number-at-pos end)) - (progn - (goto-char (1+ beg)) (insert "\n") - (replace-regexp ";\\s-+" ";\n" nil beg end) - (indent-region beg end)) - (replace-regexp "\n" " " nil beg end) - (replace-regexp " +" " " nil beg end)))) - (if orig (goto-char orig)))) + (goto-char beg) + (if (= (line-number-at-pos beg) (line-number-at-pos end)) + (progn + (forward-char) + (insert "\n") + (while (re-search-forward ";\\s-+" end t) + (replace-match ";\n" nil t)) + (indent-region beg end)) + (save-excursion + (while (re-search-forward "\n+" end t) + (replace-match " " nil t))) + (while (re-search-forward "\\([{;]\\) +" end t) + (replace-match (concat (match-string 1) " ") nil t))) + (if orig (goto-char orig)) + (skip-chars-forward " \t"))) ;;;###autoload (defun +css/toggle-inline-or-block () @@ -36,9 +41,7 @@ (user-error "No block found %s" (list beg end op cl))) (unless (string= op "{") (user-error "Incorrect block found")) - (if (featurep 'evil) - (evil-with-single-undo (+css--toggle-inline-or-block beg end)) - (+css--toggle-inline-or-block beg end))))) + (+css--toggle-inline-or-block beg end)))) ;;;###autoload (defun +css/comment-indent-new-line () From 8efc5828eacff4b54c31ffb5371c81497e0ae396 Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 24 Sep 2018 21:36:19 -0700 Subject: [PATCH 3216/4235] magit: only implement leader key logic when doom-leader-key is non-nil --- modules/tools/magit/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 413ae80ac..98e7bec6b 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -47,8 +47,8 @@ available.") ;; Don't replace the leader key ;; FIXME remove me when general.el is integrated - (define-key magit-diff-mode-map (kbd doom-leader-key) nil)) - + (when doom-leader-key + (define-key magit-diff-mode-map (kbd doom-leader-key) nil))) (def-package! magit-todos :hook (magit-mode . magit-todos-mode) From 078e3028a69ac996c9650a0067609ce010bcb02d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 23:04:16 -0400 Subject: [PATCH 3217/4235] Minor, general comment revision --- core/core-projects.el | 4 ++-- core/core-ui.el | 2 ++ core/core.el | 4 +++- modules/lang/org/config.el | 3 ++- modules/tools/editorconfig/config.el | 4 ++-- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index d60d32282..c3f779d73 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -34,8 +34,8 @@ ;; It breaks projectile's project root resolution if HOME is a project (e.g. ;; it's a git repo). In that case, we disable bottom-up root searching to - ;; prevent issues. This makes project resolution a little slower and may cause - ;; incorrect project roots in other edge cases. + ;; prevent issues. This makes project resolution a little slower and less + ;; accurate in some cases. (let ((default-directory "~")) (when (cl-find-if #'projectile-file-exists-p projectile-project-root-files-bottom-up) diff --git a/core/core-ui.el b/core/core-ui.el index 886f3669f..9ff6f9f0f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -8,6 +8,8 @@ This is changed when `load-theme' is used as well.") (defvar doom-font nil "The default font to use. Expects either a `font-spec' or a XFT font string. +This affects the `default' and `fixed-pitch' faces. + Examples: (setq doom-font (font-spec :family \"Fira Mono\" :size 12)) (setq doom-font \"Terminus (TTF):pixelsize=12:antialias=off\")") diff --git a/core/core.el b/core/core.el index 59c7e22b8..d3e1d1e09 100644 --- a/core/core.el +++ b/core/core.el @@ -292,7 +292,9 @@ original value of `symbol-file'." (funcall orig-fn symbol type))) (advice-add #'symbol-file :around #'doom*symbol-file) -;; Don't garbage collect to speed up minibuffer commands +;; To speed up minibuffer commands (like helm and ivy), defer garbage collection +;; when the minibuffer is active. It may mean a pause when finished, but that's +;; acceptable instead of pauses during. (defun doom|defer-garbage-collection () (setq gc-cons-threshold doom-gc-cons-upper-limit)) (defun doom|restore-garbage-collection () diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 49eaf17b9..eb18be390 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -446,6 +446,7 @@ conditions where a window's buffer hasn't changed at the time this hook is run." :config (add-hook 'kill-emacs-hook #'org-clock-save)) -;; + +;; In case org has already been loaded (or you're running `doom/reload') (when (featurep 'org) (run-hooks 'org-load-hook)) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 33b99b936..cafa04c5a 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -60,8 +60,8 @@ specified by editorconfig." (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-indent-detection) ;; Editorconfig makes indentation too rigid in Lisp modes, so tell - ;; editorconfig to ignore indentation there. I prefer dynamic indentation - ;; support built into Emacs. + ;; editorconfig to ignore indentation there. The dynamic indentation support + ;; built into Emacs is superior. (dolist (mode '(emacs-lisp-mode lisp-mode)) (delq (assq mode editorconfig-indentation-alist) editorconfig-indentation-alist)) From 4ea47541626d77dbbd11031637bd7b3fa35a3524 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 23:05:04 -0400 Subject: [PATCH 3218/4235] Add commands for using bin/doom from inside Emacs This is experimental. I'd eventually like users to be able to management Doom from inside Emacs, if they desire. This may be the only way to have a decent user experience on Windows, for that matter. Also adds a popup rule for it. --- core/autoload/cli.el | 66 ++++++++++++++++++++++++++++++++++++++ core/autoload/help.el | 21 ------------ modules/ui/popup/config.el | 4 ++- 3 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 core/autoload/cli.el diff --git a/core/autoload/cli.el b/core/autoload/cli.el new file mode 100644 index 000000000..5ab0f66d0 --- /dev/null +++ b/core/autoload/cli.el @@ -0,0 +1,66 @@ +;;; core/autoload/cli.el -*- lexical-binding: t; -*- + +(require 'core-cli) + +(defun doom--run (command &optional yes) + (let ((default-directory doom-emacs-dir) + (doom-auto-accept yes)) + (let ((compilation-buffer-name-function (lambda (_) "*bin/doom*"))) + (compile (format "bin/doom %s" command) t)) + (while compilation-in-progress + (sit-for 1)) + (when (y-or-n-p "Reload Doom config?") + (doom/reload)) + (message "Done"))) + + +;;;###autoload +(defun doom//update (&optional yes) + "TODO" + (interactive "P") + (doom--run "update" yes)) + +;;;###autoload +(defun doom//upgrade (&optional yes) + "TODO" + (interactive "P") + (doom--run "upgrade" yes)) + +;;;###autoload +(defun doom//install (&optional yes) + "TODO" + (interactive "P") + (doom--run "install" yes)) + +;;;###autoload +(defun doom//autoremove (&optional yes) + "TODO" + (interactive "P") + (doom--run "autoremove" yes)) + +;;;###autoload +(defun doom//refresh (&optional yes) + "TODO" + (interactive "P") + (doom--run "refresh" yes)) + +;;;###autoload +(defun doom/reload (&optional force-p) + "Reloads your config. This is experimental! + +If called from a noninteractive session, this will try to communicate with a +live server (if one is found) to tell it to run this function. + +If called from an interactive session, tries to reload autoloads files (if +necessary), reinistalize doom (via `doom-initialize') and reloads your private +init.el and config.el. Then runs `doom-reload-hook'." + (interactive "P") + (require 'core-cli) + (doom-reload-autoloads force-p) + (setq load-path doom-site-load-path) + (let (doom-init-p) + (doom-initialize)) + (with-demoted-errors "PRIVATE CONFIG ERROR: %s" + (doom-initialize-modules 'force)) + (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) + (message "Finished!")) diff --git a/core/autoload/help.el b/core/autoload/help.el index c30be5e94..75d4d1a69 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -220,24 +220,3 @@ whose car is the list of faces and cadr is the list of overlay faces." "TODO" (interactive) (find-file (expand-file-name "index.org" doom-docs-dir))) - -;;;###autoload -(defun doom/reload (&optional force-p) - "Reloads your config. This is experimental! - -If called from a noninteractive session, this will try to communicate with a -live server (if one is found) to tell it to run this function. - -If called from an interactive session, tries to reload autoloads files (if -necessary), reinistalize doom (via `doom-initialize') and reloads your private -init.el and config.el. Then runs `doom-reload-hook'." - (interactive "P") - (require 'core-cli) - (doom-reload-autoloads force-p) - (setq load-path doom-site-load-path) - (let (doom-init-p) - (doom-initialize)) - (with-demoted-errors "PRIVATE CONFIG ERROR: %s" - (doom-initialize-modules 'force)) - (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) - (message "Finished!")) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 583ef3122..e2dbf8958 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -132,7 +132,9 @@ prevent the popup(s) from messing up the UI (or vice versa)." '(("^\\*" :slot 1 :vslot -1 :select t) ("^ \\*" :slot 1 :vslot -1 :size +popup-shrink-to-fit))) (when (featurep! +defaults) - '(("^\\*Completions" + '(("^\\*bin/doom\\*$" + :vslot 9999 :size 0.75 :quit 'current :select t :ttl 0) + ("^\\*Completions" :slot -1 :vslot -2 :ttl 0) ("^\\*Compil\\(?:ation\\|e-Log\\)" :size 0.3 :ttl 0 :quit t) From 8a8b5c60894b6e4191bcb7441ba5cc6662e9e057 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 23:08:51 -0400 Subject: [PATCH 3219/4235] Refactor bin/doom & doom-dispatch Done to make bin/doom produce better debugger output (and more readily). A lot of bin/doom errors aren't recurring, so it's better to produce the full error report ASAP. --- bin/doom | 24 +++--------------------- core/core-cli.el | 31 ++++++++++++++++++------------- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/bin/doom b/bin/doom index 3a1fc43f5..d40557c5e 100755 --- a/bin/doom +++ b/bin/doom @@ -48,7 +48,6 @@ ((or "-h" "--help") (error "Did you mean 'doom help'?")) ((or "-d" "--debug") - (setq doom-debug-mode t) (setenv "DEBUG" "1") (message "Debug mode on")) ((or "-i" "--insecure") @@ -64,7 +63,6 @@ (setq emacs-dir (expand-file-name (concat (pop args) "/"))) (message "Emacs directory changed to %s" emacs-dir)) ((or "-y" "--yes") - (setq doom-auto-accept t) (setenv "YES" "1") (message "Auto-yes mode on")))) @@ -84,24 +82,8 @@ (usage) (message "") (error "No command detected, aborting!")) - ((let ((default-directory emacs-dir)) + ((let ((default-directory emacs-dir) + (debug-on-error t)) (setq argv nil noninteractive 'doom) - (condition-case e (doom-dispatch args) - (user-error - (signal (car e) (cdr e))) - ((debug error) - (message "--------------------------------------------------\n") - (message "There was an unexpected error:") - (message " %s (%s)" (get (car e) 'error-message) (car e)) - (dolist (item (cdr e)) - (message " %s" item)) - (unless debug-on-error - (message - (concat "\nRun the command again with the -d (or --debug) option to enable debug\n" - "mode and, hopefully, generate a stack trace. If you decide to file a bug\n" - "report, please include it!\n\n" - "Emacs outputs to standard error, so you'll need to redirect stderr to\n" - "stdout to pipe this to a file or clipboard!\n\n" - " e.g. doom -d install 2>&1 | clipboard-program")) - (signal 'doom-error e)))))))) + (doom-dispatch (car args) (cdr args)))))) diff --git a/core/core-cli.el b/core/core-cli.el index d7eef59d8..2674397bd 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -50,19 +50,24 @@ omitted, show all available commands, their aliases and brief descriptions." command (if aliases (string-join aliases ",") "") (doom--dispatch-format desc t))))))) -(defun doom-dispatch (args) - "Invoke a dispatcher command and pass ARGS to it." - (let ((help (equal (car args) "help"))) - (if help (pop args)) - (cl-destructuring-bind (command &key desc body) - (let ((sym (intern (car args)))) - (or (assq sym doom--dispatch-command-alist) - (assq (cdr (assq sym doom--dispatch-alias-alist)) - doom--dispatch-command-alist) - (error "Invalid command: %s" (car args)))) - (if help - (apply #'doom--dispatch-help command desc (cdr args)) - (funcall body (cdr args)))))) +(defun doom-dispatch (cmd args &optional show-help) + "Parses ARGS and invokes a dispatcher. + +If SHOW-HELP is non-nil, show the documentation for said dispatcher." + (when (equal cmd "help") + (setq show-help t) + (when args + (setq cmd (car args) + args (cdr args)))) + (cl-destructuring-bind (command &key desc body) + (let ((sym (intern cmd))) + (or (assq sym doom--dispatch-command-alist) + (assq (cdr (assq sym doom--dispatch-alias-alist)) + doom--dispatch-command-alist) + (error "Invalid command: %s" sym))) + (if show-help + (apply #'doom--dispatch-help command desc args) + (funcall body args)))) (defmacro dispatcher! (command form &optional docstring) "Define a dispatcher command. COMMAND is a symbol or a list of symbols From 15991b5639cfbd614b378f919d09f3e99cef4ad2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 23:45:32 -0400 Subject: [PATCH 3220/4235] Refactor quiet! to be less destructive It's possible for the debugger to be invoked from inside code wrapped in a (quiet! ...) call. The debugger pauses Emacs in a broken state where the functions locally rebound by quiet! (e.g. message, load-file, write-region, etc) are never returned to their original definitions. This attempts to reduce that probabilityby changing how quiet! silences code. Rather than silencing them completely, they will be logged to *Messages* but not displayed in the echo area. Also, quiet! is now used less, where it isn't strictly needed (or where inhibit-message is sufficient). --- core/cli/byte-compile.el | 2 +- core/core-lib.el | 29 ++++++++++++++++------------- core/core-packages.el | 2 +- core/test/test-autoload-files.el | 2 +- modules/lang/org/autoload/org.el | 8 ++++---- modules/lang/web/test/test-web.el | 2 +- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index b5b0d7282..a08602908 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -144,7 +144,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." total-fail) (t (print! (green "✓ Compiled %s") short-name) - (quiet! (load target t t)) + (load target t t) total-ok)))) (cl-incf total-noop))) (print! (bold (color (if (= total-fail 0) 'green 'red) diff --git a/core/core-lib.el b/core/core-lib.el index b13015af0..22877494a 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -170,19 +170,22 @@ compilation. This will no-op on features that have been disabled by the user." (defmacro quiet! (&rest forms) "Run FORMS without making any output." - `(if doom-debug-mode - (progn ,@forms) - (let ((old-fn (symbol-function 'write-region))) - (cl-letf* ((standard-output (lambda (&rest _))) - ((symbol-function 'load-file) (lambda (file) (load file nil t))) - ((symbol-function 'message) (lambda (&rest _))) - ((symbol-function 'write-region) - (lambda (start end filename &optional append visit lockname mustbenew) - (unless visit (setq visit 'no-message)) - (funcall old-fn start end filename append visit lockname mustbenew))) - (inhibit-message t) - (save-silently t)) - ,@forms)))) + `(cond (noninteractive + (let ((old-fn (symbol-function 'write-region))) + (cl-letf ((standard-output (lambda (&rest _))) + ((symbol-function 'load-file) (lambda (file) (load file nil t))) + ((symbol-function 'message) (lambda (&rest _))) + ((symbol-function 'write-region) + (lambda (start end filename &optional append visit lockname mustbenew) + (unless visit (setq visit 'no-message)) + (funcall old-fn start end filename append visit lockname mustbenew)))) + ,@forms))) + ((or doom-debug-mode debug-on-error debug-on-quit) + ,@forms) + ((let ((inhibit-message t) + (save-silently t)) + ,@forms + (message ""))))) (defmacro add-transient-hook! (hook-or-function &rest forms) "Attaches a self-removing function to HOOK-OR-FUNCTION. diff --git a/core/core-packages.el b/core/core-packages.el index 60c5b9dc1..438c524a3 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -146,7 +146,7 @@ them." package--initialized nil) (let (byte-compile-warnings) (condition-case _ - (quiet! (package-initialize)) + (package-initialize) ('error (package-refresh-contents) (setq doom--refreshed-p t) (package-initialize)))))) diff --git a/core/test/test-autoload-files.el b/core/test/test-autoload-files.el index f3c2d4b92..4251e6f0d 100644 --- a/core/test/test-autoload-files.el +++ b/core/test/test-autoload-files.el @@ -40,7 +40,7 @@ (expect (quiet! (doom/copy-this-file dest t))) (expect (file-exists-p! src dest))) (it "prompts if overwriting a file" - (quiet! (quiet! (doom/copy-this-file existing))) + (quiet! (doom/copy-this-file existing)) (expect 'y-or-n-p :to-have-been-called-times 1))) (describe "delete-this-file" diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index edf161be6..f4f586cb1 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -364,10 +364,10 @@ another level of headings on each invocation." (defun +org|realign-table-maybe () "Auto-align table under cursor and re-calculate formulas." (when (and (org-at-table-p) org-table-may-need-update) - (let ((pt (point))) - (quiet! - (org-table-recalculate) - (if org-table-may-need-update (org-table-align))) + (let ((pt (point)) + (inhibit-message t)) + (org-table-recalculate) + (if org-table-may-need-update (org-table-align)) (goto-char pt)))) ;;;###autoload diff --git a/modules/lang/web/test/test-web.el b/modules/lang/web/test/test-web.el index 27edb7c73..bd20b26d2 100644 --- a/modules/lang/web/test/test-web.el +++ b/modules/lang/web/test/test-web.el @@ -40,7 +40,7 @@ (describe "toggle-inline-or-block" (after-each - (+css/toggle-inline-or-block) + (quiet! (+css/toggle-inline-or-block)) (expect (string-trim (buffer-string)) :to-equal (string-join '("body {" From 523c2a114be5f998be3482f6c6df573a696669ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 23:51:55 -0400 Subject: [PATCH 3221/4235] lang/web (tests): Remove empty before-each block --- modules/lang/web/test/test-web.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/web/test/test-web.el b/modules/lang/web/test/test-web.el index bd20b26d2..72fbc04cf 100644 --- a/modules/lang/web/test/test-web.el +++ b/modules/lang/web/test/test-web.el @@ -50,7 +50,6 @@ "\n"))) (describe "css-mode" - (before-each ) (it "converts inline statements into multiline blocks" (insert! "body { color: red{0}; font-size: 2em; }")) (it "works when cursor is on closing brace" From b43888901f9fcf99ac6e066ee7b24ceeadeeab96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Sep 2018 23:52:22 -0400 Subject: [PATCH 3222/4235] lang/cc: add rotate patterns for c++-mode These can be used by pressing ! in normal mode, over rotatable regions of text. --- modules/lang/cc/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index e6a7202ea..07b69cf87 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -47,6 +47,10 @@ compilation database is present in the project.") (set-docsets! 'c-mode "C") (set-docsets! 'c++-mode "C++" "Boost") + (set-rotate-patterns! 'c++-mode + :symbols '(("public" "protected" "private") + ("class" "struct"))) + (set-pretty-symbols! '(c-mode c++-mode) ;; Functional ;; :def "void " From ddaf1e5b672a25c66e8fc9e9c57f480803873fee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 10:09:12 -0400 Subject: [PATCH 3223/4235] Fix wrong-type-arg error on menu-bar-open Due to malformed menu-bar-lines frame property. Same for tool-bar-lines as well. --- core/core-ui.el | 4 ++-- early-init.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9ff6f9f0f..7e9dadfa4 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -401,8 +401,8 @@ frame's window-system, the theme will be reloaded.") ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. (add-to-list 'default-frame-alist '(buffer-predicate . doom-buffer-frame-predicate)) ;; Prevent the glimpse of un-styled Emacs by setting these early. -(add-to-list 'default-frame-alist '(tool-bar-lines 0)) -(add-to-list 'default-frame-alist '(menu-bar-lines 0)) +(add-to-list 'default-frame-alist '(tool-bar-lines . 0)) +(add-to-list 'default-frame-alist '(menu-bar-lines . 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars)) ;; prompts the user for confirmation when deleting a non-empty frame (global-set-key [remap delete-frame] #'doom/delete-frame) diff --git a/early-init.el b/early-init.el index 6d883882a..d2eadd3c2 100644 --- a/early-init.el +++ b/early-init.el @@ -12,6 +12,6 @@ (setq package-enable-at-startup nil) ;; Prevent the glimpse of un-styled Emacs by setting these early. -(add-to-list 'default-frame-alist '(tool-bar-lines 0)) -(add-to-list 'default-frame-alist '(menu-bar-lines 0)) +(add-to-list 'default-frame-alist '(tool-bar-lines . 0)) +(add-to-list 'default-frame-alist '(menu-bar-lines . 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars)) From 3961ba166224f058d79330d3981fd51661cd5473 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 11:49:51 -0400 Subject: [PATCH 3224/4235] Fix command-log-mode not disabling on toggle clm/toggle-command-log-buffer enables global-command-log-mode, but doesn't disable it on second invocation, so we use global-command-log-mode instead. --- core/core-editor.el | 10 ++++++---- modules/config/default/+bindings.el | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index d1827db88..a101d000d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -268,10 +268,12 @@ savehist file." (advice-add #'undo-tree-save-history :around #'doom*compress-undo-tree-history)) -;; `command-log-mode' -(setq command-log-mode-auto-show t - command-log-mode-open-log-turns-on-mode t - command-log-mode-is-global t) +(def-package! command-log-mode + :commands global-command-log-mode + :config + (setq command-log-mode-auto-show t + command-log-mode-open-log-turns-on-mode nil + command-log-mode-is-global t)) (def-package! expand-region diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 831d96608..5c1ee1f85 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -660,7 +660,7 @@ :desc "Describe key" :n "k" #'describe-key :desc "Find documentation" :n "K" #'+lookup/documentation :desc "Find library" :n "l" #'find-library - :desc "Command log" :n "L" #'clm/toggle-command-log-buffer + :desc "Command log" :n "L" #'global-command-log-mode :desc "View *Messages*" :n "m" #'view-echo-area-messages :desc "Describe mode" :n "M" #'describe-mode :desc "Toggle profiler" :n "p" #'doom/toggle-profiler From 53fe7a1f0441c43b05dcfc84d17473c18f371eac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 13:54:20 -0400 Subject: [PATCH 3225/4235] Refactor Project API to reflect changes upstream projectile-project-root no longer returns `default-directory` if not in a project (it returns nil). As such, doom-project-* functions (and their uses) have been refactored. + doom-project-p & doom-project-root are aliases for projectile-project-p & projectile-project-root. + doom-project-{p,root,name,expand} now has a DIR argument (for consistency, since projectile-project-name and projectile-project-expand do not). + The nocache parameter is no longer necessary, as projectile's caching behavior is now more sane. + Removed some projectile advice/hacks that are no longer necessary. + Updated unit tests --- core/autoload/buffers.el | 2 +- core/autoload/files.el | 6 ++--- core/autoload/projects.el | 32 ++++++++--------------- core/core-projects.el | 20 ++------------ core/test/test-core-projects.el | 22 +++++----------- modules/completion/helm/autoload/helm.el | 2 +- modules/completion/ivy/autoload/ivy.el | 4 +-- modules/emacs/eshell/autoload/commands.el | 4 +-- modules/emacs/term/autoload.el | 4 +-- modules/feature/eval/autoload/repl.el | 2 +- modules/feature/lookup/autoload/lookup.el | 2 +- modules/lang/cc/autoload.el | 2 +- modules/lang/org/autoload/org-capture.el | 2 +- modules/lang/php/config.el | 3 ++- modules/lang/python/autoload/python.el | 5 ++-- modules/lang/ruby/autoload.el | 5 ++-- modules/tools/macos/autoload.el | 6 +++-- modules/tools/make/autoload.el | 2 +- modules/tools/prodigy/autoload.el | 2 +- modules/ui/modeline/config.el | 2 +- modules/ui/neotree/autoload.el | 4 +-- modules/ui/treemacs/autoload.el | 4 +-- 22 files changed, 53 insertions(+), 84 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 3107710b5..324fcd6f4 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -65,7 +65,7 @@ scratch buffer. See `doom-fallback-buffer-name' to change this." If no project is active, return all buffers." (let ((buffers (doom-buffer-list))) - (if-let* ((project-root (if (doom-project-p) (doom-project-root)))) + (if-let* ((project-root (doom-project-root))) (cl-loop for buf in buffers if (projectile-project-buffer-p buf project-root) collect buf) diff --git a/core/autoload/files.el b/core/autoload/files.el index fea61b96e..571863987 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -88,8 +88,8 @@ MATCH is a string regexp. Only entries that match it will be included." (recentf-add-file new-path)) (recentf-remove-if-non-kept old-path)) (when (and (bound-and-true-p projectile-mode) - (projectile-project-p) - (projectile-file-cached-p old-path (doom-project-root 'nocache))) + (doom-project-p) + (projectile-file-cached-p old-path (doom-project-root))) (projectile-purge-file-from-cache old-path)) (when (bound-and-true-p save-place-mode) (save-place-forget-unreadable-files))) @@ -111,7 +111,7 @@ MATCH is a string regexp. Only entries that match it will be included." (list new-path)))) (new-path-dir (file-name-directory new-path)) (project-root (doom-project-root)) - (short-new-name (if (file-in-directory-p new-path project-root) + (short-new-name (if (and project-root (file-in-directory-p new-path project-root)) (file-relative-name new-path project-root) (abbreviate-file-name new-path)))) (unless (file-directory-p new-path-dir) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 1a3cb4acd..00bc84d09 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -38,33 +38,23 @@ they are absolute." ;; Library ;;;###autoload -(defun doom-project-p (&optional nocache) - "Return t if this buffer is currently in a project. -If NOCACHE, don't fetch a cached answer." - (if nocache - (without-project-cache! (doom-project-p nil)) - (let ((projectile-require-project-root t)) - (and (projectile-project-p) t)))) +(defalias 'doom-project-p #'projectile-project-p) ;;;###autoload -(defun doom-project-name (&optional nocache) - "Return the name of the current project. -If NOCACHE, don't fetch a cached answer." - (if nocache - (without-project-cache! (doom-project-name nil)) - (projectile-project-name))) +(defalias 'doom-project-root #'projectile-project-root) ;;;###autoload -(defun doom-project-root (&optional nocache) - "Returns the root of your project, or `default-directory' if none was found. -If NOCACHE, don't fetch a cached answer." - (if nocache - (without-project-cache! (doom-project-root nil)) - (let (projectile-require-project-root) - (projectile-project-root)))) +(defun doom-project-name (&optional dir) + "Return the name of the current project." + (let ((project-root (projectile-project-root dir))) + (if project-root + (funcall projectile-project-name-function project-root) + "-"))) ;;;###autoload -(defalias 'doom-project-expand #'projectile-expand-root) +(defun doom-project-expand (name &optional dir) + "Expand NAME to project root." + (expand-file-name name (projectile-project-root dir))) ;;;###autoload (defun doom-project-find-file (dir) diff --git a/core/core-projects.el b/core/core-projects.el index c3f779d73..20e6e099d 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -45,30 +45,14 @@ projectile-project-root-files) projectile-project-root-files-bottom-up nil))) - ;; Restores the old behavior of `projectile-project-root', where it returns - ;; `default-directory' if not in a project, at least until I update Doom to - ;; deal with this. - ;; FIXME Check again after https://github.com/bbatsov/projectile/issues/1296 - (defun doom*projectile-project-root (project-root) - (or project-root - default-directory)) - (advice-add #'projectile-project-root :filter-return #'doom*projectile-project-root) - ;; Projectile root-searching functions can cause an infinite loop on TRAMP ;; connections, so disable them. + ;; TODO Is this still necessary? (defun doom*projectile-locate-dominating-file (orig-fn file name) "Don't traverse the file system if on a remote connection." (unless (file-remote-p default-directory) (funcall orig-fn file name))) - (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file) - - (defun doom*projectile-cache-current-file (orig-fn) - "Don't cache ignored files." - (unless (cl-loop for path in (projectile-ignored-directories) - if (string-prefix-p (or buffer-file-name "") (expand-file-name path)) - return t) - (funcall orig-fn))) - (advice-add #'projectile-cache-current-file :around #'doom*projectile-cache-current-file)) + (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file)) ;; diff --git a/core/test/test-core-projects.el b/core/test/test-core-projects.el index 0afc0c1f1..30a577795 100644 --- a/core/test/test-core-projects.el +++ b/core/test/test-core-projects.el @@ -10,29 +10,21 @@ (describe "project-p" (it "Should detect when in a valid project" - (let ((buffer-file-name (expand-file-name "init.el" doom-emacs-dir)) - (default-directory doom-emacs-dir)) - (expect (doom-project-p)))) + (expect (doom-project-p doom-emacs-dir))) (it "Should detect when not in a valid project" - (let ((buffer-file-name (expand-file-name "test" "~")) - (default-directory (expand-file-name "~"))) - (expect (doom-project-p) :to-be nil)))) + (expect (doom-project-p (expand-file-name "~")) :to-be nil))) (describe "project-root" (it "should resolve to the project's root" - (let ((buffer-file-name (expand-file-name "core.el" doom-core-dir)) - (default-directory doom-core-dir)) - (expect (doom-project-root) :to-equal doom-emacs-dir))) + (expect (doom-project-root doom-core-dir) :to-equal doom-emacs-dir)) (it "should resolve to the `default-directory'" - (let ((buffer-file-name (expand-file-name "test" "/")) - (default-directory (expand-file-name "/"))) - (expect (doom-project-root) :to-equal default-directory)))) + (expect (doom-project-root (expand-file-name "~")) + :to-equal (expand-file-name "~")))) (describe "project-expand" (it "expands to a path relative to the project root" - (let ((default-directory doom-core-dir)) - (expect (doom-project-expand "init.el") - :to-equal (expand-file-name "init.el" (doom-project-root)))))) + (expect (doom-project-expand "init.el" doom-core-dir) + :to-equal (expand-file-name "init.el" (doom-project-root doom-core-dir))))) (describe "project-file-exists-p!" (let ((default-directory doom-core-dir)) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 015e6792a..4bed42243 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -13,7 +13,7 @@ (interactive) (call-interactively (if (or (file-equal-p default-directory "~") - (when-let* ((proot (doom-project-root 'nocache))) + (when-let* ((proot (doom-project-root))) (file-equal-p proot "~"))) #'helm-find-files #'helm-projectile-find-file))) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 51ed26a15..331b52b42 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -217,11 +217,11 @@ The point of this is to avoid Emacs locking up indexing massive file trees." (interactive) (call-interactively (cond ((or (file-equal-p default-directory "~") - (when-let* ((proot (doom-project-root 'nocache))) + (when-let* ((proot (doom-project-root))) (file-equal-p proot "~"))) #'counsel-find-file) - ((doom-project-p 'nocache) + ((doom-project-p) (let ((files (projectile-current-project-files))) (if (<= (length files) ivy-sort-max-size) #'counsel-projectile-find-file diff --git a/modules/emacs/eshell/autoload/commands.el b/modules/emacs/eshell/autoload/commands.el index c1124c4cb..1661a6dad 100644 --- a/modules/emacs/eshell/autoload/commands.el +++ b/modules/emacs/eshell/autoload/commands.el @@ -3,9 +3,7 @@ ;;;###autoload (defun eshell/cd-to-project () "Change to the project root of the current directory." - (let* ((default-directory (eshell/pwd)) - (project-root (doom-project-root 'nocache))) - (eshell/cd project-root))) + (eshell/cd (doom-project-root (eshell/pwd)))) ;;;###autoload (defun eshell/quit-and-close (&rest _) diff --git a/modules/emacs/term/autoload.el b/modules/emacs/term/autoload.el index c1f6705b3..b30d29183 100644 --- a/modules/emacs/term/autoload.el +++ b/modules/emacs/term/autoload.el @@ -7,7 +7,7 @@ non-nil, cd into the current project's root." (interactive "P") (let ((default-directory (if arg - (doom-project-root 'nocache) + (or (doom-project-root) default-directory) default-directory))) ;; Doom's switch-buffer hooks prevent themselves from triggering when ;; switching from buffer A back to A. Because `multi-term' uses `set-buffer' @@ -22,7 +22,7 @@ non-nil, cd into the current project's root." (interactive "P") (let ((default-directory (if arg - (doom-project-root 'nocache) + (or (doom-project-root) default-directory) default-directory))) (pop-to-buffer (save-window-excursion (multi-term))))) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index dd1cf1039..3bb2335d2 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -11,7 +11,7 @@ (unless (buffer-live-p buffer) (remhash key +eval-repl-buffers))) +eval-repl-buffers) - (let* ((project-root (doom-project-root 'nocache)) + (let* ((project-root (doom-project-root)) (key (cons major-mode project-root)) (buffer (gethash key +eval-repl-buffers))) (cl-check-type buffer (or buffer null)) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index b20e274bb..acd7c4395 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -288,7 +288,7 @@ Otherwise, falls back on `find-file-at-point'." (when (and buffer-file-name (file-equal-p fullpath buffer-file-name)) (user-error "Already here")) (let* ((insert-default-directory t) - (project-root (doom-project-root 'nocache)) + (project-root (doom-project-root)) (ffap-file-finder (cond ((not (file-directory-p fullpath)) #'find-file) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 9da91b052..060177709 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -104,7 +104,7 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." (executable-find "rc")) (with-temp-buffer (message "Reloaded compile commands for rtags daemon") - (rtags-call-rc :silent t "-J" (doom-project-root)))) + (rtags-call-rc :silent t "-J" (or (doom-project-root) default-directory)))) ;; then irony (when (and (featurep 'irony) irony-mode) (+cc|irony-init-compile-options))) diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 85c701923..046a8083f 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -82,7 +82,7 @@ you're done. This can be called from an external shell script." filename (or (locate-dominating-file (file-truename default-directory) filename) - (if (doom-project-p 'nocache) (doom-project-root 'nocache)) + (doom-project-root) (user-error "Couldn't detect a project"))))) ;;;###autoload diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index c92cae75b..90fa3be46 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -49,7 +49,8 @@ (setq phpactor-working-dir (or phpactor-working-dir (php-project-get-root-dir) - (doom-project-root)))) + (doom-project-root) + default-directory))) (advice-add #'phpactor-get-working-dir :before #'+php*project-root) (map! :map php-mode-map diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index cd8412ed3..b34e7ba49 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -38,7 +38,7 @@ started it." (puthash proot (+python--extract-version "Pipenv " v) +python-version-cache)) - (puthash (doom-project-root) + (puthash (or (doom-project-root) default-directory) (+python--extract-version "Python " (car (process-lines "python" "--version"))) +python-version-cache)) (error "Python"))) @@ -53,7 +53,8 @@ started it." (setq +python--version (or (gethash (or (and (fboundp 'pipenv-project-p) (pipenv-project-p)) - (doom-project-root)) + (doom-project-root) + default-directory) +python-version-cache) (+python-version)))) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index 321d35d66..544781825 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -27,7 +27,7 @@ pipenv, unless those tools have modified the PATH that Emacs picked up when you started it." (condition-case _ (let ((version-str (car (process-lines "ruby" "--version")))) - (puthash (doom-project-root) + (puthash (or (doom-project-root) default-directory) (format "Ruby %s" (cadr (split-string version-str " "))) +ruby-version-cache)) (error "Ruby"))) @@ -40,7 +40,8 @@ started it." (defun +ruby|update-version (&rest _) "Update `+ruby--version' by consulting `+ruby-version' function." (setq +ruby--version - (or (gethash (doom-project-root) +python-version-cache) + (or (gethash (or (doom-project-root) default-directory) + +python-version-cache) (+ruby-version)))) ;;;###autoload diff --git a/modules/tools/macos/autoload.el b/modules/tools/macos/autoload.el index a500e110c..d4ff371aa 100644 --- a/modules/tools/macos/autoload.el +++ b/modules/tools/macos/autoload.el @@ -31,7 +31,8 @@ (+macos!open-with reveal-in-finder "Finder" default-directory) ;;;###autoload (autoload '+macos/reveal-project-in-finder "tools/macos/autoload" nil t) -(+macos!open-with reveal-project-in-finder "Finder" (doom-project-root)) +(+macos!open-with reveal-project-in-finder "Finder" + (or (doom-project-root) default-directory)) ;;;###autoload (autoload '+macos/send-to-transmit "tools/macos/autoload" nil t) (+macos!open-with send-to-transmit "Transmit") @@ -43,4 +44,5 @@ (+macos!open-with send-to-launchbar "LaunchBar") ;;;###autoload (autoload '+macos/send-project-to-launchbar "tools/macos/autoload" nil t) -(+macos!open-with send-project-to-launchbar "LaunchBar" (doom-project-root)) +(+macos!open-with send-project-to-launchbar "LaunchBar" + (or (doom-project-root) default-directory)) diff --git a/modules/tools/make/autoload.el b/modules/tools/make/autoload.el index b921ed3aa..121251ede 100644 --- a/modules/tools/make/autoload.el +++ b/modules/tools/make/autoload.el @@ -7,7 +7,7 @@ "Run a make task in the current project. If multiple makefiles are available, you'll be prompted to select one." (interactive) - (if (doom-project-p 'nocache) + (if (doom-project-p) (makefile-executor-execute-project-target) (let ((makefile (cl-loop with buffer-file = (or buffer-file-name default-directory) for file in (list "Makefile" "makefile") diff --git a/modules/tools/prodigy/autoload.el b/modules/tools/prodigy/autoload.el index 01d255136..d33a3d79e 100644 --- a/modules/tools/prodigy/autoload.el +++ b/modules/tools/prodigy/autoload.el @@ -44,7 +44,7 @@ (defun +prodigy*services (orig-fn &rest args) "Adds a new :project property to prodigy services, which hides the service unless invoked from the relevant project." - (let ((project-root (downcase (doom-project-root))) + (let ((project-root (downcase (or (doom-project-root) default-directory))) (services (apply orig-fn args))) (if current-prefix-arg services diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 47d2d6e8c..2adb9d52a 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -314,7 +314,7 @@ e.g. ~/w/project/src/lib/file.c Meant for `+modeline-buffer-path-function'." (pcase-let ((`(,root-parent ,root ,dir, file) - (shrink-path-file-mixed (doom-project-root) + (shrink-path-file-mixed (or (doom-project-root) default-directory) (file-name-directory buffer-file-name) buffer-file-name))) (list (cons root-parent 'font-lock-comment-face) diff --git a/modules/ui/neotree/autoload.el b/modules/ui/neotree/autoload.el index a9426f399..0855c807a 100644 --- a/modules/ui/neotree/autoload.el +++ b/modules/ui/neotree/autoload.el @@ -8,7 +8,7 @@ (defun +neotree/open () "Open the neotree window in the current project." (interactive) - (let ((project-root (doom-project-root 'nocache))) + (let ((project-root (doom-project-root))) (require 'neotree) (if (neo-global--window-exists-p) (neotree-hide) @@ -19,7 +19,7 @@ "Open the neotree window in the current project, and find the current file." (interactive) (let ((path buffer-file-name) - (project-root (doom-project-root 'nocache))) + (project-root (doom-project-root))) (require 'neotree) (cond ((and (neo-global--window-exists-p) (get-buffer-window neo-buffer-name t)) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index 696bd0cb9..b88ec058e 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -10,8 +10,8 @@ (treemacs-do-remove-project-from-workspace project)) (with-current-buffer origin-buffer (treemacs-do-add-project-to-workspace - (treemacs--canonical-path (doom-project-root 'nocache)) - (doom-project-name 'nocache)) + (treemacs--canonical-path (doom-project-root)) + (doom-project-name)) (setq treemacs--ready-to-follow t) (when (or treemacs-follow-after-init treemacs-follow-mode) (treemacs--follow))))) From 1785adb068b80fac2294dcd5d798c9795d119225 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 14:09:48 -0400 Subject: [PATCH 3226/4235] projectile-require-project-root = t Now that projectile-project-root has changed not throw errors (depending on projectile-require-project-root), it is safe to change this, in case you use other projectile commands that do require a project. --- core/core-projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 20e6e099d..8034271c2 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -7,7 +7,7 @@ (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) projectile-known-projects-file (concat doom-cache-dir "projectile.projects") - projectile-require-project-root nil + projectile-require-project-root t projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o") projectile-ignored-projects '("~/" "/tmp")) From 6da307d30eca5263752a48a6c61c83c112546127 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 20:45:20 -0400 Subject: [PATCH 3227/4235] Refactor font initialization + Add doom-serif-font variable + Update docstrings of all doom-*font variables to mention that they all support font-specs, font objects, XFT strings and XLFD strings. + Set doom-font if the user hasn't, ensuring that other functions know what the current, default font is set to (fixes doom-big-font-mode not switching back to normal when disabled). --- core/core-ui.el | 57 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 7e9dadfa4..53e160fe1 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -6,7 +6,10 @@ This is changed when `load-theme' is used as well.") (defvar doom-font nil - "The default font to use. Expects either a `font-spec' or a XFT font string. + "The default font to use. + +Expects either a `font-spec', font object, an XFT font string or an XLFD font +string. This affects the `default' and `fixed-pitch' faces. @@ -19,13 +22,31 @@ Examples: `font-spec' or a XFT font string. See `doom-font' for examples.") (defvar doom-variable-pitch-font nil - "The font to use for variable-pitch text. Expects either a `font-spec' -or a XFT font string. See `doom-font' for examples.") + "The font to use for variable-pitch text. + +Expects either a `font-spec', font object, a XFT font string or XLFD string. See +`doom-font' for examples. + +It is recommended you don't set specify a font-size, as to inherit `doom-font's +size.") + +(defvar doom-serif-font nil + "The default font to use for the `fixed-pitch-serif' face. + +Expects either a `font-spec', font object, a XFT font string or XLFD string. See +`doom-font' for examples. + +It is recommended you don't set specify a font-size, as to inherit `doom-font's +size.") (defvar doom-unicode-font nil "Fallback font for unicode glyphs. Is ignored if :feature unicode is active. -Expects either a `font-spec' or a XFT font string. See `doom-font' for -examples.") + +Expects either a `font-spec', font object, a XFT font string or XLFD string. See +`doom-font' for examples. + +It is recommended you don't set specify a font-size, as to inherit `doom-font's +size.") ;; @@ -318,17 +339,21 @@ frame's window-system, the theme will be reloaded.") "Initialize fonts." (condition-case e (progn - (when doom-font - (add-to-list - 'default-frame-alist - (cons 'font - (cond ((stringp doom-font) doom-font) - ((fontp doom-font) (font-xlfd-name doom-font)) - ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))))) - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch t - :width 'normal :weight 'normal :slant 'normal - :font doom-variable-pitch-font)) + (cond (doom-font + ;; We avoid `set-frame-font' for performance reasons. + ;; Manipulating `default-frame-alist' is effective enough. + (add-to-list + 'default-frame-alist + (cons 'font + (cond ((stringp doom-font) doom-font) + ((fontp doom-font) (font-xlfd-name doom-font)) + ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))))) + ((display-graphic-p) + (setq doom-font (face-attribute 'default :font)))) + (when doom-serif-font + (set-face-attribute 'fixed-pitch-serif t :font doom-serif-font)) + (when doom-variable-pitch-font + (set-face-attribute 'variable-pitch t :font doom-variable-pitch-font)) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) (set-fontset-font t nil doom-unicode-font nil 'append))) From 461fc8e312a2f4be9b9727797631315b45aeab76 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 20:48:19 -0400 Subject: [PATCH 3228/4235] Refactor doom-big-font-mode Complain if doom-font or doom-big-font aren't set. --- core/autoload/ui.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 3146407c6..623517b62 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -168,12 +168,17 @@ OPACITY is an integer between 0 to 100, inclusive." ;;;###autoload (define-minor-mode doom-big-font-mode "A global mode that resizes the font, for streams, screen-sharing and -presentations." +presentations. + +Uses `doom-big-font' when enabled." :init-value nil :lighter " BIG" :global t - (unless (fontp doom-big-font) - (user-error "`doom-big-font' isn't set to a valid font")) - (if doom-big-font-mode - (set-frame-font doom-big-font t t) - (set-frame-font doom-font t t))) + (unless doom-big-font + (user-error "`doom-big-font' must be set to a valid font")) + (unless doom-font + (user-error "`doom-font' must be set to a valid font")) + (set-frame-font (if doom-big-font-mode + doom-big-font + doom-font) + t t)) From 05d759fa8b6875298395b967846d4d3c07084ee7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 20:48:41 -0400 Subject: [PATCH 3229/4235] doom/window-{enlargen,zoom}: assoc -> assq A minor optimization. assq is significantly faster than assoc (not that it matters for this incredibly insignificant use-case, but yay for premature optimization!) --- core/autoload/ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 623517b62..168a5fa8f 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -108,7 +108,7 @@ window changes before then, the undo expires. Alternatively, use `doom/window-enlargen'." (interactive) (if (and (one-window-p) - (assoc ?_ register-alist)) + (assq ?_ register-alist)) (jump-to-register ?_) (window-configuration-to-register ?_) (delete-other-windows))) @@ -121,7 +121,7 @@ windows (unlike `doom/window-zoom') Activate again to undo." (interactive) (setq doom--window-enlargened (if (and doom--window-enlargened - (assoc ?_ register-alist)) + (assq ?_ register-alist)) (ignore (ignore-errors (jump-to-register ?_))) (window-configuration-to-register ?_) (if (window-dedicated-p) From 13cee6870ef7dce311d8207f8dd848b25daafe5b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 20:49:58 -0400 Subject: [PATCH 3230/4235] hack-local-variables before mode hooks The default behavior is to read file+directory-local variables after the major mode and its hooks have run. I think this is backwards. What if we want to use these local variables to customize the things running in hooks? This does mean hack-local-variables will run at least twice when the mode changes, but this is an acceptable compromise. --- core/core.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/core.el b/core/core.el index d3e1d1e09..8c52c7c35 100644 --- a/core/core.el +++ b/core/core.el @@ -302,6 +302,16 @@ original value of `symbol-file'." (add-hook 'minibuffer-setup-hook #'doom|defer-garbage-collection) (add-hook 'minibuffer-exit-hook #'doom|restore-garbage-collection) +;; The default behavior is to read file+directory-local variables after the +;; major mode and its hooks have run. I think this is backwards. What if we want +;; to use these local variables to customize the things running in hooks? +(defun doom|hack-local-variables () + (with-demoted-errors "File local-variables error: %s" + (hack-local-variables 'no-mode))) +;; `change-major-mode-hook' is too soon (runs before `kill-all-local-variables' +;; is run). `after-change-major-mode-hook' is too late (runs after mode hooks). +(add-hook 'change-major-mode-after-body-hook #'doom|hack-local-variables) + ;; ;; Incremental lazy-loading From d9fb1c5ca60c8f3fb177d35e179fc50cdc19c2bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 21:11:40 -0400 Subject: [PATCH 3231/4235] ui/modeline: add support for indirect buffers Indirect buffer support is still dodgy and needs work (some segments don't update at all). --- modules/ui/modeline/config.el | 45 +++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 2adb9d52a..face14654 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -272,7 +272,8 @@ use `buffer-name'." parent. e.g. project/src/lib/file.c" - (let ((filename (or buffer-file-truename (file-truename buffer-file-name)))) + (let* ((base (buffer-base-buffer)) + (filename (file-truename (buffer-file-name base)))) (append (if (doom-project-p) (let* ((project-root (doom-project-root)) (relative-dirs (file-relative-name (file-name-directory filename) @@ -314,9 +315,10 @@ e.g. ~/w/project/src/lib/file.c Meant for `+modeline-buffer-path-function'." (pcase-let ((`(,root-parent ,root ,dir, file) - (shrink-path-file-mixed (or (doom-project-root) default-directory) - (file-name-directory buffer-file-name) - buffer-file-name))) + (let ((buffer-file-name (or buffer-file-name (buffer-file-name (buffer-base-buffer))))) + (shrink-path-file-mixed (or (doom-project-root) default-directory) + (file-name-directory buffer-file-name) + buffer-file-name)))) (list (cons root-parent 'font-lock-comment-face) (cons root 'doom-modeline-buffer-project-root) (cons (concat "/" dir) 'doom-modeline-buffer-path) @@ -344,7 +346,8 @@ Meant for `+modeline-buffer-path-function'." e.g. ~/w/p/s/l/file.c Meant for `+modeline-buffer-path-function'." - (pcase-let ((`(,dir . ,file) (shrink-path-prompt buffer-file-name))) + (pcase-let ((`(,dir . ,file) + (shrink-path-prompt (buffer-file-name (buffer-base-buffer))))) (list (cons dir 'doom-modeline-buffer-path) (cons file 'doom-modeline-buffer-file)))) @@ -413,21 +416,23 @@ Meant for `+modeline-buffer-path-function'." after-change-functions after-save-hook after-revert-hook) - (let ((icon (cond (buffer-read-only - (all-the-icons-octicon - "lock" - :face 'doom-modeline-warning - :v-adjust -0.05)) - ((buffer-modified-p) - (all-the-icons-faicon - "floppy-o" - :face 'doom-modeline-buffer-modified - :v-adjust -0.05)) - ((and buffer-file-name (not (file-exists-p buffer-file-name))) - (all-the-icons-octicon - "circle-slash" - :face 'doom-modeline-urgent - :v-adjust -0.05))))) + (let* ((base (buffer-base-buffer)) + (icon (cond (buffer-read-only + (all-the-icons-octicon + "lock" + :face 'doom-modeline-warning + :v-adjust -0.05)) + ((buffer-modified-p base) + (all-the-icons-faicon + "floppy-o" + :face 'doom-modeline-buffer-modified + :v-adjust -0.05)) + ((and (buffer-file-name base) + (not (file-exists-p (buffer-file-name base)))) + (all-the-icons-octicon + "circle-slash" + :face 'doom-modeline-urgent + :v-adjust -0.05))))) (if icon (concat icon " ")))) (def-modeline-segment! +modeline-buffer-id From ccb04c43da988065167857452f4257513c8deeee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 21:13:52 -0400 Subject: [PATCH 3232/4235] ui/popup: refactor default rules The vslots don't have to be so far from 0. Also makes compilation popups bigger. --- modules/ui/popup/config.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index e2dbf8958..cb49d1e8d 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -137,15 +137,15 @@ prevent the popup(s) from messing up the UI (or vice versa)." ("^\\*Completions" :slot -1 :vslot -2 :ttl 0) ("^\\*Compil\\(?:ation\\|e-Log\\)" - :size 0.3 :ttl 0 :quit t) + :vslot -2 :size 0.3 :ttl 0 :quit t) ("^\\*\\(?:scratch\\|Messages\\)" :autosave t :ttl nil) ("^\\*Man " - :size 0.45 :vslot -6 :ttl 0 :quit t :select t) + :size 0.45 :vslot -3 :ttl 0 :quit t :select t) ("^\\*doom \\(?:term\\|eshell\\)" - :size 0.25 :vslot -10 :select t :quit nil :ttl 0) + :size 0.25 :vslot -4 :select t :quit nil :ttl 0) ("^\\*doom:" - :vslot -20 :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) + :vslot -5 :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) ("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" :size +popup-shrink-to-fit :ttl 0 :select ignore) ("^\\*Customize" @@ -154,10 +154,10 @@ prevent the popup(s) from messing up the UI (or vice versa)." :slot 2 :side left :size 20 :select t :quit t) ;; `help-mode', `helpful-mode' ("^\\*[Hh]elp" - :slot 2 :vslot 2 :size 0.35 :select t) + :slot 2 :vslot -2 :size 0.35 :select t) ;; `eww' (and used by dash docsets) ("^\\*eww\\*" - :vslot 50 :size 0.35 :select t) + :vslot -11 :size 0.35 :select t) ;; `Info-mode' ("^\\*info\\*$" :slot 2 :vslot 2 :size 0.45 :select t))) From 2908112dc4faf0ff2c4d6ea6e10887090d8b8d93 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 21:25:18 -0400 Subject: [PATCH 3233/4235] Update doom-project-root test --- core/test/test-core-projects.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/test/test-core-projects.el b/core/test/test-core-projects.el index 30a577795..3dbd953d5 100644 --- a/core/test/test-core-projects.el +++ b/core/test/test-core-projects.el @@ -17,9 +17,8 @@ (describe "project-root" (it "should resolve to the project's root" (expect (doom-project-root doom-core-dir) :to-equal doom-emacs-dir)) - (it "should resolve to the `default-directory'" - (expect (doom-project-root (expand-file-name "~")) - :to-equal (expand-file-name "~")))) + (it "should return nil if not in a project" + (expect (doom-project-root (expand-file-name "~")) :to-be nil))) (describe "project-expand" (it "expands to a path relative to the project root" From a91df46aa8b8db9e8e8b2b6fb6c9d1835c26be9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 21:59:06 -0400 Subject: [PATCH 3234/4235] bin/doom: revert debug-on-error = t It's too destructive. Will sometimes crash the script with no error output. --- bin/doom | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index d40557c5e..54885786e 100755 --- a/bin/doom +++ b/bin/doom @@ -82,8 +82,25 @@ (usage) (message "") (error "No command detected, aborting!")) - ((let ((default-directory emacs-dir) - (debug-on-error t)) + ((let ((default-directory emacs-dir)) (setq argv nil noninteractive 'doom) - (doom-dispatch (car args) (cdr args)))))) + (condition-case e + (doom-dispatch (car args) (cdr args)) + (user-error + (signal (car e) (cdr e))) + ((debug error) + (message "--------------------------------------------------\n") + (message "There was an unexpected error:") + (message " %s (%s)" (get (car e) 'error-message) (car e)) + (dolist (item (cdr e)) + (message " %s" item)) + (unless debug-on-error + (message + (concat "\nRun the command again with the -d (or --debug) option to enable debug\n" + "mode and, hopefully, generate a stack trace. If you decide to file a bug\n" + "report, please include it!\n\n" + "Emacs outputs to standard error, so you'll need to redirect stderr to\n" + "stdout to pipe this to a file or clipboard!\n\n" + " e.g. doom -d install 2>&1 | clipboard-program")) + (signal 'doom-error e)))))))) From f994fb07bf4be4fbdede5bfb9d8b1a14516427b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 22:29:42 -0400 Subject: [PATCH 3235/4235] bin/doom: make invalid command a user-error It shouldn't invoke error handlers. --- core/core-cli.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-cli.el b/core/core-cli.el index 2674397bd..52abc7ea6 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -64,7 +64,7 @@ If SHOW-HELP is non-nil, show the documentation for said dispatcher." (or (assq sym doom--dispatch-command-alist) (assq (cdr (assq sym doom--dispatch-alias-alist)) doom--dispatch-command-alist) - (error "Invalid command: %s" sym))) + (user-error "Invalid command: %s" sym))) (if show-help (apply #'doom--dispatch-help command desc args) (funcall body args)))) From cae500992544067c0d686372a37414aae236c0ad Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 22:50:39 -0400 Subject: [PATCH 3236/4235] cl-remove-if -> cl-delete-if Minor optimization for doom-load-packages-incrementally (cl-delete-if deletes in-place). --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index 8c52c7c35..134b27061 100644 --- a/core/core.el +++ b/core/core.el @@ -351,7 +351,7 @@ intervals." (when packages (let ((gc-cons-threshold doom-gc-cons-upper-limit) file-name-handler-alist) - (let* ((reqs (cl-remove-if #'featurep packages)) + (let* ((reqs (cl-delete-if #'featurep packages)) (req (ignore-errors (pop reqs)))) (when req (when doom-debug-mode From e7fc1d3290458ec8fea77f50abd6cc2afa0e1de4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 23:47:36 -0400 Subject: [PATCH 3237/4235] Fix wrong-type-arg: stringp, nocache errors Fix old usage of doom-project-name and doom-project-root. --- core/autoload/projects.el | 3 ++- modules/feature/workspaces/autoload/workspaces.el | 5 ++--- modules/ui/treemacs/autoload.el | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 00bc84d09..6662b9863 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -46,7 +46,8 @@ they are absolute." ;;;###autoload (defun doom-project-name (&optional dir) "Return the name of the current project." - (let ((project-root (projectile-project-root dir))) + (let ((project-root (or (projectile-project-root dir) + (if dir (expand-file-name dir))))) (if project-root (funcall projectile-project-name-function project-root) "-"))) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 4464b621e..8a55d622c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -552,8 +552,7 @@ This be hooked to `projectile-after-switch-project-hook'." (if (+workspace-buffer-list) (let* (persp-p (persp - (let* ((default-directory +workspaces--project-dir) - (project-name (doom-project-name 'nocache))) + (let ((project-name (doom-project-name +workspaces--project-dir))) (or (setq persp-p (+workspace-get project-name t)) (+workspace-new project-name)))) (new-name (persp-name persp))) @@ -569,7 +568,7 @@ This be hooked to `projectile-after-switch-project-hook'." 'success)) (with-current-buffer (switch-to-buffer (doom-fallback-buffer)) (setq default-directory +workspaces--project-dir) - (message "Switched to '%s'" (doom-project-name 'nocache))) + (message "Switched to '%s'" (doom-project-name +workspaces--project-dir))) (unless current-prefix-arg (funcall +workspaces-switch-project-function +workspaces--project-dir))) (setq +workspaces--project-dir nil)))) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index b88ec058e..6f8b75a9c 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -9,9 +9,10 @@ (dolist (project (treemacs-workspace->projects (treemacs-current-workspace))) (treemacs-do-remove-project-from-workspace project)) (with-current-buffer origin-buffer - (treemacs-do-add-project-to-workspace - (treemacs--canonical-path (doom-project-root)) - (doom-project-name)) + (let ((project-root (or (doom-project-root) default-directory))) + (treemacs-do-add-project-to-workspace + (treemacs--canonical-path project-root) + (doom-project-name project-root))) (setq treemacs--ready-to-follow t) (when (or treemacs-follow-after-init treemacs-follow-mode) (treemacs--follow))))) From b674aef31b7e760bffabbbf7550e85c97dd92d6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 23:52:22 -0400 Subject: [PATCH 3238/4235] tools/editorconfig: add binary check to doctor.el --- modules/tools/editorconfig/doctor.el | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 modules/tools/editorconfig/doctor.el diff --git a/modules/tools/editorconfig/doctor.el b/modules/tools/editorconfig/doctor.el new file mode 100644 index 000000000..2ad8898e8 --- /dev/null +++ b/modules/tools/editorconfig/doctor.el @@ -0,0 +1,5 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; tools/editorconfig/doctor.el + +(unless (executable-find "editorconfig") + (warn! "Couldn't find the editorconfig binary. Using native elisp version (slower)")) From fd19698927d1976c40a1a24b34542a832ab5d4db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 29 Sep 2018 14:57:17 -0400 Subject: [PATCH 3239/4235] doom|hack-local-variables => MODE-local-vars-hook Uses a less destructive method (the same that Spacemacs uses) than the one introduced in 13cee68, by introducing MODE-local-vars-hook hooks, which run after local vars have been initialized. The old method was to call `hack-local-variables` *before* mode hooks run, however, this causes variables set by modes to have higher precedence than local vars, which is unacceptable. Also moved intero-mode & dante-mode to haskell-mode-local-vars-hook --- core/core.el | 17 ++++++++--------- modules/lang/haskell/+dante.el | 2 +- modules/lang/haskell/+intero.el | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/core/core.el b/core/core.el index 134b27061..ad2eb1813 100644 --- a/core/core.el +++ b/core/core.el @@ -302,15 +302,14 @@ original value of `symbol-file'." (add-hook 'minibuffer-setup-hook #'doom|defer-garbage-collection) (add-hook 'minibuffer-exit-hook #'doom|restore-garbage-collection) -;; The default behavior is to read file+directory-local variables after the -;; major mode and its hooks have run. I think this is backwards. What if we want -;; to use these local variables to customize the things running in hooks? -(defun doom|hack-local-variables () - (with-demoted-errors "File local-variables error: %s" - (hack-local-variables 'no-mode))) -;; `change-major-mode-hook' is too soon (runs before `kill-all-local-variables' -;; is run). `after-change-major-mode-hook' is too late (runs after mode hooks). -(add-hook 'change-major-mode-after-body-hook #'doom|hack-local-variables) +;; File+dir local variables are initialized after the major mode and its hooks +;; have run. If you want hook functions to be aware of these customizations, add +;; them to MODE-local-vars-hook instead. +(defun doom|run-local-var-hooks () + "Run MODE-local-vars-hook after local variables are initialized." + (run-hook-wrapped (intern-soft (format "%s-local-vars-hook" major-mode)) + #'doom-try-run-hook)) +(add-hook 'hack-local-variables-hook #'doom|run-local-var-hooks) ;; diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index dcc4b7e97..e52f49c2f 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -2,7 +2,7 @@ ;;;###if (featurep! +dante) (def-package! dante - :hook (haskell-mode . dante-mode) + :hook (haskell-mode-local-vars . dante-mode) :init (setq dante-load-flags '(;; defaults: "+c" diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index b92a20c2a..e1985fc23 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -11,7 +11,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (if (executable-find "stack") (intero-mode +1) (message "Couldn't find stack. Refusing to enable intero-mode.")))) - (add-hook 'haskell-mode-hook #'+haskell|init-intero) + (add-hook 'haskell-mode-local-vars-hook #'+haskell|init-intero) :config (setq haskell-compile-cabal-build-command "stack build --fast") (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) From 6c5512896a753f21ae7e920decae17ac311071c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 29 Sep 2018 21:58:09 -0400 Subject: [PATCH 3240/4235] ui/doom-modeline: fix stringp errors Caused by old uses of doom-project-root. See 53fe7a1 for details. --- modules/ui/doom-modeline/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el index 905a87de8..f5f8d708f 100644 --- a/modules/ui/doom-modeline/config.el +++ b/modules/ui/doom-modeline/config.el @@ -339,7 +339,7 @@ If TRUNCATE-TAIL is t also truncate the parent directory of the file." (defun +doom-modeline--buffer-file-name-relative (_file-path true-file-path &optional include-project) "Propertized `buffer-file-name' showing directories relative to project's root only." - (let ((root (doom-project-root)) + (let ((root (or (doom-project-root) default-directory)) (active (active))) (if (null root) (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) @@ -360,7 +360,7 @@ fish-shell style. Example: ~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" - (let* ((project-root (doom-project-root)) + (let* ((project-root (or (doom-project-root) default-directory)) (file-name-split (shrink-path-file-mixed project-root (file-name-directory file-path) file-path)) From 263754402216923712ac4c8b2d0aa02b3d96d0ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 30 Sep 2018 00:55:39 -0400 Subject: [PATCH 3241/4235] bin/doom: refactor no-args error message Dumping usage to stdout just drowns out the problem: they forgot a command! --- bin/doom | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index 54885786e..23d6e916b 100755 --- a/bin/doom +++ b/bin/doom @@ -79,9 +79,8 @@ (member (car args) '("help" "h"))) (usage)) ((not args) - (usage) - (message "") - (error "No command detected, aborting!")) + (message "No command detected, aborting!\n\nRun %s help for documentation." + (file-name-nondirectory load-file-name))) ((let ((default-directory emacs-dir)) (setq argv nil noninteractive 'doom) From 05160a65267e616483d7db9031b001d02804a6c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 30 Sep 2018 15:14:01 -0400 Subject: [PATCH 3242/4235] lang/org: default org-agenda-files to org-directory --- modules/lang/org/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index eb18be390..6cafb5255 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -3,8 +3,8 @@ ;; FIXME deprecated (define-obsolete-variable-alias '+org-dir 'org-directory "2.1.0") +;; Changed org defaults (should be set before org loads) (defvar org-directory "~/org/") - (defvar org-modules '(org-w3m ;; org-bbdb @@ -133,6 +133,8 @@ unfold to point on startup." ;; `org-load' hooks (defun +org|setup-agenda () + (unless org-agenda-files + (setq org-agenda-files (list org-directory))) (setq-default org-agenda-dim-blocked-tasks nil org-agenda-inhibit-startup t From aaa21698e954e4fe1ffebf9bda0746bddb642637 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 30 Sep 2018 16:19:17 -0400 Subject: [PATCH 3243/4235] ui/pretty-code: don't error on non-existent symbol Users may want to customize the symbol list entirely, rather than modify in place. --- modules/ui/pretty-code/autoload.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 0a336f482..22bb3536b 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -99,11 +99,8 @@ Pretty symbols can be unset for emacs-lisp-mode with: (:merge (setq merge (pop rest))) (:alist (setq results (append (pop rest) results))) (_ - (unless (plist-member +pretty-code-symbols key) - (user-error "Invalid keyword in set-pretty-symbols!: %s" key)) - (let* ((sym (pop rest)) - (char (plist-get +pretty-code-symbols key))) - (push (cons sym char) results))))) + (when-let* ((char (plist-get +pretty-code-symbols key))) + (push (cons (pop rest) char) results))))) (unless merge (delq (assq mode +pretty-code-symbols-alist) +pretty-code-symbols-alist)) From e85aaabed95ff2be5cde899de967169c22909b09 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 30 Sep 2018 22:49:23 -0400 Subject: [PATCH 3244/4235] Rewrite bin/doom quickstart Now creates a packages.el file as well, with some commented examples, and includes comment headers for config.el and packages.el. --- core/cli/quickstart.el | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el index f9e10fe24..1d721124b 100644 --- a/core/cli/quickstart.el +++ b/core/cli/quickstart.el @@ -28,20 +28,31 @@ packages and regenerates the autoloads file." (make-directory doom-private-dir t) (print! (green "Done!"))) ;; Create init.el - (let ((init-file (expand-file-name "init.el" doom-private-dir))) - (if (file-exists-p init-file) - (print! (yellow "%sinit.el already exists. Skipping.") short-private-dir) - (print! "Copying init.example.el to %s" short-private-dir) - (copy-file (expand-file-name "init.example.el" doom-emacs-dir) - init-file) - (print! (green "Done!")))) - ;; Create config.el - (let ((config-file (expand-file-name "config.el" doom-private-dir))) - (if (file-exists-p config-file) - (print! "%sconfig.el already exists. Skipping." short-private-dir) - (print! "Deploying empty config.el file in %s" short-private-dir) - (with-temp-file config-file (insert "")) - (print! (green "Done!"))))) + (dolist + (file (list (cons "init.el" + (lambda () + (insert-file-contents (expand-file-name "init.example.el" doom-emacs-dir)))) + (cons "config.el" + (lambda () + (insert (format ";;; %sconfig.el -*- lexical-binding: t; -*-\n\n" + short-private-dir) + ";; Place your private configuration here\n"))) + (cons "packages.el" + (lambda () + (insert (format ";; -*- no-byte-compile: t; -*-\n;;; %spackages.el\n\n" + short-private-dir) + ";;; Examples:\n" + ";; (package! some-package)\n" + ";; (package! another-package :recipe (:fetcher github :repo \"username/repo\"))\n" + ";; (package! builtin-package :disable t)\n"))))) + (cl-destructuring-bind (path . fn) file + (let ((fullpath (expand-file-name path doom-private-dir))) + (if (file-exists-p fullpath) + (print! (yellow "%s%s already exists. Skipping.") short-private-dir path) + (print! "Creating %s%s" short-private-dir path) + (with-temp-file fullpath + (funcall fn)) + (print! (green "Done!"))))))) ;; Ask if Emacs.app should be patched (when IS-MAC (message "MacOS detected") From 868a0ab9b946acf15fcd0162fc1e7575d8ed44b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Oct 2018 12:06:08 -0400 Subject: [PATCH 3245/4235] emacs/eshell: fix wrong-type-arg: stringp errors Fix old usage of projectile API. --- modules/emacs/eshell/autoload/eshell.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/emacs/eshell/autoload/eshell.el b/modules/emacs/eshell/autoload/eshell.el index 7f734a49c..884889801 100644 --- a/modules/emacs/eshell/autoload/eshell.el +++ b/modules/emacs/eshell/autoload/eshell.el @@ -83,7 +83,8 @@ (interactive "P") (when (eq major-mode 'eshell-mode) (user-error "Already in an eshell buffer")) - (let* ((default-directory (if arg default-directory (doom-project-root))) + (let* ((default-directory (or (if arg default-directory (doom-project-root)) + default-directory)) (buf (+eshell--unused-buffer))) (with-current-buffer (switch-to-buffer buf) (if (eq major-mode 'eshell-mode) @@ -96,7 +97,8 @@ (defun +eshell/open-popup (arg &optional command) "Open eshell in a popup window." (interactive "P") - (let* ((default-directory (if arg default-directory (doom-project-root))) + (let* ((default-directory (or (if arg default-directory (doom-project-root)) + default-directory)) (buf (+eshell--unused-buffer))) (with-current-buffer (pop-to-buffer buf) (if (eq major-mode 'eshell-mode) @@ -110,7 +112,8 @@ "Open eshell in a separate workspace. Requires the (:feature workspaces) module to be loaded." (interactive "P") - (let ((default-directory (if arg default-directory (doom-project-root))) + (let ((default-directory (or (if arg default-directory (doom-project-root)) + default-directory)) (buf (+eshell--unused-buffer 'new))) (set-frame-parameter nil 'saved-wconf (current-window-configuration)) (delete-other-windows) From 270b381ce05bb6f4c103be3e210bee4930294938 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Oct 2018 12:28:58 -0400 Subject: [PATCH 3246/4235] lang/ruby: fix reference to +python-version-cache --- modules/lang/ruby/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index 544781825..879e3ca4b 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -41,7 +41,7 @@ started it." "Update `+ruby--version' by consulting `+ruby-version' function." (setq +ruby--version (or (gethash (or (doom-project-root) default-directory) - +python-version-cache) + +ruby-version-cache) (+ruby-version)))) ;;;###autoload From 1f839b4423b6a88e2d04a4b13352b1ff0dfb3eb4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Oct 2018 18:53:34 -0400 Subject: [PATCH 3247/4235] Revise & update comments Fix reference to old name of a hook function. --- init.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/init.el b/init.el index 95567e45a..62500530d 100644 --- a/init.el +++ b/init.el @@ -52,10 +52,10 @@ decrease this. If you experience stuttering, increase this.") (setq gc-cons-threshold doom-gc-cons-threshold) ;; A big contributor to startup times is garbage collection. We up the gc ;; threshold to temporarily prevent it from running, then reset it later in - ;; `doom|disable-startup-optimizations'. + ;; `doom|restore-startup-optimizations'. (setq gc-cons-threshold doom-gc-cons-upper-limit) - ;; This is consulted on every `require', `load' and various file reading - ;; functions. You get a minor speed up by nooping this. + ;; This is consulted on every `require', `load' and various path/io functions. + ;; You get a minor speed up by nooping this. (setq file-name-handler-alist nil) ;; Not restoring these to their defaults will cause stuttering/freezes. (add-hook 'emacs-startup-hook #'doom|restore-startup-optimizations)) From 394633b5d85c3cf6d425b7a7783c89d1160603be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Oct 2018 19:58:23 -0400 Subject: [PATCH 3248/4235] Leave lifecycle management of helm buffers to helm Could cause buffer processes to get killed, inadvertently. --- modules/completion/helm/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index e59c95e3f..13237f0eb 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -112,7 +112,7 @@ be negative.") helm-semantic-fuzzy-match fuzzy)) :config - (set-popup-rule! "^\\*helm" :vslot -100 :size 0.22) + (set-popup-rule! "^\\*helm" :vslot -100 :size 0.22 :ttl nil) (defun +helm*replace-prompt (plist) "Globally replace helm prompts with `+helm-global-prompt'." From 6368ef9ba098fdcd44c3d659ed0a5bfe372363b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Oct 2018 20:29:43 -0400 Subject: [PATCH 3249/4235] Add docstrings to fix hooks --- core/core-ui.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 53e160fe1..21ca9e83e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -494,15 +494,17 @@ moderate boost in startup (or theme switch) time." (advice-add #'load-theme :around #'doom*prefer-compiled-theme) (defun doom|disable-whitespace-mode-in-childframes (frame) + "`whitespace-mode' inundates child frames with whitspace markers, so disable +it to fix all that visual noise." (when (frame-parameter frame 'parent-frame) (with-selected-frame frame (setq-local whitespace-style nil) frame))) (add-hook 'after-make-frame-functions #'doom|disable-whitespace-mode-in-childframes) -;; Disruptive motion errors take over the minibuffer while we're typing there; -;; prevent this from happening. (defun doom*silence-motion-errors (orig-fn &rest args) + "Prevent disruptive motion errors taking over the minibuffer while we're in +it." (if (not (minibufferp)) (apply orig-fn args) (ignore-errors (apply orig-fn args)) From 63b195b133f23d61348a40b021d217f67aedfbb5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Oct 2018 23:52:29 -0400 Subject: [PATCH 3250/4235] lang/python: fix stringp errors when opening REPL Caused my misuse of if-let* to let-bind dynamic variables. The expanded code doesn't quite work out the way I expected, causing python-shell-interpreter to be nil regardless of which side of the if-else statement ran. --- modules/lang/python/autoload/python.el | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index b34e7ba49..ab9733d40 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -7,16 +7,20 @@ (defun +python/repl () "Open the Python REPL." (interactive) + (unless python-shell-interpreter + (user-error "`python-shell-interpreter' isn't set")) (pop-to-buffer (process-buffer - (let ((interp python-shell-interpreter) - (interp-args python-shell-interpreter-args)) - (if-let* ((bin (executable-find "pipenv")) - (default-directory (pipenv-project-p)) - (python-shell-interpreter "pipenv") - (python-shell-interpreter-args (format "run %s %s" interp interp-args))) - (run-python nil t t) - (run-python nil t t)))))) + (if-let* ((pipenv (executable-find "pipenv")) + (pipenv-project (pipenv-project-p))) + (let ((default-directory pipenv-project) + (python-shell-interpreter-args + (format "run %s %s" + python-shell-interpreter + python-shell-interpreter-args)) + (python-shell-interpreter pipenv)) + (run-python nil t t)) + (run-python nil t t))))) (defun +python--extract-version (prefix str) (when str From 6515efa19e700bdc6942a4764d49b9e086328894 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 00:00:56 -0400 Subject: [PATCH 3251/4235] feature/workspaces: add +workspaces-on-switch-project-behavior #836 To control when a new workspace is created when switching projectile projects. --- modules/feature/workspaces/autoload/workspaces.el | 4 +++- modules/feature/workspaces/config.el | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 8a55d622c..1c96a7143 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -549,7 +549,9 @@ This be hooked to `projectile-after-switch-project-hook'." (setq +workspaces--project-dir dir)) (when (and persp-mode +workspaces--project-dir) (unwind-protect - (if (+workspace-buffer-list) + (if (and (not (null +workspaces-on-switch-project-behavior)) + (or (eq +workspaces-on-switch-project-behavior t) + (+workspace-buffer-list))) (let* (persp-p (persp (let ((project-name (doom-project-name +workspaces--project-dir))) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index f6df57581..a42f7e62e 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -25,6 +25,16 @@ new project directory.") "The basename of the file to store single workspace perspectives. Will be stored in `persp-save-dir'.") +(defvar +workspaces-on-switch-project-behavior 'non-empty + "Controls the behavior of workspaces when switching to a new project. + +Can be one of the following: + +t Always create a new workspace for the project +'non-empty Only create a new workspace if the current one has no buffers + associated with it. +nil Never create a new workspace on project switch.") + ;; If emacs is passed --restore, restore the last session on startup. This is ;; used by the `+workspace/restart-emacs-then-restore' command. (defun +workspaces-restore-last-session (&rest _) From 0312f8656ab88bf202bc1d2ca8835f2036e051c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 00:02:01 -0400 Subject: [PATCH 3252/4235] completion/helm: remove +helm-global-prompt This could hide helpful prompt text. Addresses #923 --- modules/completion/helm/config.el | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index 13237f0eb..afca72d1a 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -1,8 +1,5 @@ ;;; completion/helm/config.el -*- lexical-binding: t; -*- -(defvar +helm-global-prompt "››› " - "The helm text prompt prefix string is globally replaced with this string.") - (defvar +helm-project-search-engines '(rg ag pt) "What search tools for `+helm/project-search' (and `+helm-file-search' when no ENGINE is specified) to try, and in what order. @@ -114,15 +111,6 @@ be negative.") :config (set-popup-rule! "^\\*helm" :vslot -100 :size 0.22 :ttl nil) - (defun +helm*replace-prompt (plist) - "Globally replace helm prompts with `+helm-global-prompt'." - (cond ((not +helm-global-prompt) plist) - ((keywordp (car plist)) - (plist-put plist :prompt +helm-global-prompt)) - ((setf (nth 2 plist) +helm-global-prompt) - plist))) - (advice-add #'helm :filter-args #'+helm*replace-prompt) - ;; Hide the modeline (defun +helm|hide-mode-line (&rest _) (with-current-buffer (helm-buffer-get) From b573fcce2087c67ec374e1228d5b2756799bc7cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 00:04:08 -0400 Subject: [PATCH 3253/4235] quit-window on multiple magit-status windows If you accidentally open multiple magit status windows, you'll be stuck in a deadlock, where `q` will do nothing. Now, +magit/quit will use `quit-window` on excess magit-status windows instead. --- modules/tools/magit/autoload.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index d6cda9596..fd19a45e6 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -53,13 +53,16 @@ "Clean up magit buffers after quitting `magit-status' and refresh version control in buffers." (interactive) - (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when (fboundp 'vc-refresh-state) - (vc-refresh-state)) - (when (fboundp '+version-control|update-git-gutter) - (+version-control|update-git-gutter))))) + (if (cdr (delq nil (mapcar (lambda (win) (with-selected-window win (eq major-mode 'magit-status-mode))) + (window-list)))) + (quit-window) + (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (fboundp 'vc-refresh-state) + (vc-refresh-state)) + (when (fboundp '+version-control|update-git-gutter) + (+version-control|update-git-gutter)))))) (defun +magit--kill-buffer (buf) "TODO" From 7f1b526f6405fa5a1888614b39cf3e82a46e0244 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 00:05:45 -0400 Subject: [PATCH 3254/4235] Set python-shell-* vars early To make it easier for users to overwrite them in thir config.el (without an after! block). --- modules/lang/python/config.el | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 5ee85feef..f23c48975 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -16,6 +16,16 @@ (setq python-environment-directory doom-cache-dir python-indent-guess-indent-offset-verbose nil python-shell-interpreter "python") + (when (featurep! +ipython) + (setq python-shell-interpreter "ipython" + python-shell-interpreter-args "-i --simple-prompt --no-color-info" + python-shell-prompt-regexp "In \\[[0-9]+\\]: " + python-shell-prompt-block-regexp "\\.\\.\\.\\.: " + python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " + python-shell-completion-setup-code + "from IPython.core.completerlib import module_completion" + python-shell-completion-string-code + "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) :config (set-env! "PYTHONPATH" "PYENV_ROOT" "ANACONDA_HOME") (set-electric! 'python-mode :chars '(?:)) @@ -45,17 +55,6 @@ sp-point-after-word-p sp-point-before-same-p))) - (when (featurep! +ipython) - (setq python-shell-interpreter "ipython" - python-shell-interpreter-args "-i --simple-prompt --no-color-info" - python-shell-prompt-regexp "In \\[[0-9]+\\]: " - python-shell-prompt-block-regexp "\\.\\.\\.\\.: " - python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " - python-shell-completion-setup-code - "from IPython.core.completerlib import module_completion" - python-shell-completion-string-code - "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) - (setq-hook! 'python-mode-hook tab-width python-indent-offset) ;; Add python/pipenv version string to the major mode in the modeline From d8928d4aabee69934a930a0ce5f3f1fac5846178 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 00:50:06 -0400 Subject: [PATCH 3255/4235] ui/popup: fix which-key vslot fix Prevents which-key from "sharing" popups. Reported by @mfiano --- modules/ui/popup/+hacks.el | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 500149021..bed4445d4 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -301,16 +301,18 @@ instead of switch-to-buffer-*." ;; `which-key' -(setq which-key-popup-type 'custom - which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) - which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window - which-key-custom-show-popup-function - (lambda (act-popup-dim) - (cl-letf (((symbol-function 'display-buffer-in-side-window) - (lambda (buffer alist) - (+popup-display-buffer-stacked-side-window - buffer (append '((vslot . -9999)) alist))))) - (which-key--show-buffer-side-window act-popup-dim)))) +(after! which-key + (when (eq which-key-popup-type 'side) + (setq which-key-popup-type 'custom + which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) + which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window + which-key-custom-show-popup-function + (lambda (act-popup-dim) + (cl-letf (((symbol-function 'display-buffer-in-side-window) + (lambda (buffer alist) + (+popup-display-buffer-stacked-side-window + buffer (append '((vslot . -9999)) alist))))) + (which-key--show-buffer-side-window act-popup-dim)))))) ;; `windmove' From fc0d074f15e9a13057f62622f9e8986583b29d94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 01:24:01 -0400 Subject: [PATCH 3256/4235] lang/common-lisp: S-RET => newline-and-indent (REPL) Suggested by @mfiano --- modules/lang/common-lisp/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index ebe3f3cb3..d4672e879 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -63,6 +63,8 @@ bin/doom while packages at compile-time (not a runtime though)." (set-evil-initial-state! '(sly-db-mode sly-inspector-mode sly-popup-buffer-mode sly-xref-mode) 'normal) + (evil-define-key 'insert sly-mrepl-mode-map + [S-return] #'newline-and-indent) (evil-define-key 'normal sly-parent-map (kbd "C-t") #'sly-pop-find-definition-stack) (evil-define-key 'normal sly-db-mode-map From a251c81aa35a79b81892040538dbe621b3189abe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 01:24:29 -0400 Subject: [PATCH 3257/4235] lang/common-lisp: add localleader keys & hydras Credit goes to @mfiano for these keybinds. --- .../{autoload.el => autoload/common-lisp.el} | 2 +- modules/lang/common-lisp/autoload/hydras.el | 38 +++++++++++++ modules/lang/common-lisp/config.el | 56 ++++++++++++++++++- 3 files changed, 94 insertions(+), 2 deletions(-) rename modules/lang/common-lisp/{autoload.el => autoload/common-lisp.el} (83%) create mode 100644 modules/lang/common-lisp/autoload/hydras.el diff --git a/modules/lang/common-lisp/autoload.el b/modules/lang/common-lisp/autoload/common-lisp.el similarity index 83% rename from modules/lang/common-lisp/autoload.el rename to modules/lang/common-lisp/autoload/common-lisp.el index 0423aa689..7fd720f11 100644 --- a/modules/lang/common-lisp/autoload.el +++ b/modules/lang/common-lisp/autoload/common-lisp.el @@ -1,4 +1,4 @@ -;;; lang/common-lisp/autoload.el -*- lexical-binding: t; -*- +;;; lang/common-lisp/autoload/common-lisp.el -*- lexical-binding: t; -*- ;;;###autoload (defun +common-lisp*sly-last-sexp (command &rest args) diff --git a/modules/lang/common-lisp/autoload/hydras.el b/modules/lang/common-lisp/autoload/hydras.el new file mode 100644 index 000000000..aa8ac79bd --- /dev/null +++ b/modules/lang/common-lisp/autoload/hydras.el @@ -0,0 +1,38 @@ +;;; lang/common-lisp/autoload/hydras.el -*- lexical-binding: t; -*- + +;;;###autoload (autoload '+common-lisp/navigation/body "lang/common-lisp/autoload/hydras" nil nil) +(defhydra +common-lisp/navigation (:exit nil :hint nil :foreign-keys run) + " +^^Definitions ^^Compiler Notes ^^Stickers +^^^^^^───────────────────────────────────────────────────────────────────────────────────── +[_g_] Jump to definition [_n_] Next compiler note [_s_] Next sticker +[_G_] Jump to definition (other window) [_N_] Previous compiler note [_S_] Previous sticker +[_b_] Pop from definition +[_q_] Exit +" + ("g" sly-edit-definition) + ("G" sly-edit-definition-other-window) + ("b" sly-pop-find-definition-stack) + ("n" sly-next-note) + ("N" sly-previous-note) + ("s" sly-stickers-next-sticker) + ("S" sly-stickers-prev-sticker) + ("q" nil :exit t)) + +;;;###autoload (autoload '+common-lisp/macrostep/body "lang/common-lisp/autoload/hydras" nil nil) +(defhydra +common-lisp/macrostep (:exit nil :hint nil :foreign-keys run) + " +Macro Expansion +^^Definitions ^^Compiler Notes ^^Stickers +^^^^^^───────────────────────────────────────────────────────────────────────────────────── +[_e_] Expand +[_c_] Collapse +[_n_] Next level +[_N_] Previous level +[_q_] Exit +" + ("e" macrostep-expand) + ("c" macrostep-collapse) + ("n" macrostep-next-macro) + ("N" macrostep-prev-macro) + ("q" macrostep-collapse-all :exit t)) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index d4672e879..d0a7191f6 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -52,7 +52,61 @@ bin/doom while packages at compile-time (not a runtime though)." (advice-remove #'sly-check-version #'+common-lisp*refresh-sly-version)) (advice-add #'sly-check-version :before #'+common-lisp*refresh-sly-version) - ;; evil integration + ;; FIXME Buffer/mode-local :desc's don't work yet + (map! :map sly-mode-map + :localleader + :desc "Start Sly" :n "'" #'sly + (:desc "help" :prefix "h" + :desc "Apropos" :n "a" #'sly-apropos + :desc "Who binds" :n "b" #'sly-who-binds + :desc "Disassemble symbol" :n "d" #'sly-disassemble-symbol + :desc "Describe symbol" :n "h" #'sly-describe-symbol + :desc "HyperSpec lookup" :n "H" #'sly-hyperspec-lookup + :desc "Who macroexpands" :n "m" #'sly-who-macroexpands + :desc "Apropos package" :n "p" #'sly-apropos-package + :desc "Who references" :n "r" #'sly-who-references + :desc "Who specializes" :n "s" #'sly-who-specializes + :desc "Who sets" :n "S" #'sly-who-sets + :desc "Who calls" :n "<" #'sly-who-calls + :desc "Calls who" :n ">" #'sly-calls-who) + (:desc "compile" :prefix "c" + :desc "Compile file" :n "c" #'sly-compile-file + :desc "Compile/load file" :n "C" #'sly-compile-and-load-file + :desc "Compile defun" :n "f" #'sly-compile-defun + :desc "Load file" :n "l" #'sly-load-file + :desc "Remove notes" :n "n" #'sly-remove-notes + :desc "Compile region" :n "r" #'sly-compile-region) + (:desc "evaluate" :prefix "e" + :desc "Evaluate buffer" :n "b" #'sly-eval-buffer + :desc "Evaluate last expression" :n "e" #'sly-eval-last-expression + :desc "Evaluate/print last expression" :n "E" #'sly-eval-print-last-expression + :desc "Evaluate defun" :n "f" #'sly-eval-defun + :desc "Undefine function" :n "F" #'sly-undefine-function + :desc "Evaluate region" :n "r" #'sly-eval-region) + (:desc "go" :n "g" #'+common-lisp/navigation/body) + (:desc "macro" :prefix "m" + :desc "Macro-expand 1 level" :n "e" #'sly-macroexpand-1 + :desc "Macro-expand all" :n "E" #'sly-macroexpand-all + :desc "Macro stepper" :n "s" #'+common-lisp/macrostep/body) + (:desc "repl" :prefix "r" + :desc "Clear REPL" :n "c" #'sly-mrepl-clear-repl + :desc "Quit Lisp" :n "q" #'sly-quit-lisp + :desc "Restart Lisp" :n "r" #'sly-restart-inferior-lisp + :desc "Sync REPL" :n "s" #'sly-mrepl-sync) + (:desc "stickers" :prefix "s" + :desc "Toggle break on sticker" :n "b" #'sly-stickers-toggle-break-on-stickers + :desc "Clear defun stickers" :n "c" #'sly-stickers-clear-defun-stickers + :desc "Clear buffer stickers" :n "C" #'sly-stickers-clear-buffer-stickers + :desc "Fetch sticker recordings" :n "f" #'sly-stickers-fetch + :desc "Replay sticker recordings" :n "r" #'sly-stickers-replay + :desc "Add/remove stickers" :n "s" #'sly-stickers-dwim) + (:desc "trace" :prefix "t" + :desc "Toggle tracing" :n "t" #'sly-toggle-trace-fdefinition + :desc "Toggle fancy tracing" :n "T" #'sly-toggle-fancy-trace + :desc "Un-trace all" :n "u" #'sly-untrace-all)) + + ;; Since `evil-collection-slime' exists, but not `evil-collection-sly', we + ;; simply copy it (when (featurep! :feature evil +everywhere) (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps) (unless evil-move-beyond-eol From ce1198f23d54c4f9c28e43b2866627f53c6f4ae8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 01:25:50 -0400 Subject: [PATCH 3258/4235] lang/common-lisp: don't autopair '/` in sly-mrepl Credit goes to @mfiano for this --- modules/lang/common-lisp/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index d0a7191f6..d32840f53 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -17,6 +17,12 @@ (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) + (after! smartparens + (sp-with-modes '(sly-mrepl-mode) + (sp-local-pair "'" "'" :actions nil) + (sp-local-pair "`" "`" :actions nil))) + + ;; (defun +common-lisp|cleanup-sly-maybe () "Kill processes and leftover buffers when killing the last sly buffer." (unless (cl-loop for buf in (delq (current-buffer) (buffer-list)) From 7a2bad551c811274f37b810175ce6307394e39ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 01:34:26 -0400 Subject: [PATCH 3259/4235] lang/common-lisp: fix comapny in sly repl --- modules/lang/common-lisp/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index d32840f53..42ebdd68d 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -14,6 +14,8 @@ (set-lookup-handlers! 'lisp-mode :definition #'sly-edit-definition :documentation #'sly-describe-symbol) + (set-company-backend! 'sly-mrepl-mode + '(company-capf :with company-files)) (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) From 46c3ff782ab6f85c14bc2b6f4834fcd270945c1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 01:41:33 -0400 Subject: [PATCH 3260/4235] lang/common-lisp: fix rainbow-delimiters-mode hook --- modules/lang/common-lisp/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 42ebdd68d..15155b494 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -1,5 +1,7 @@ ;;; lang/common-lisp/config.el -*- lexical-binding: t; -*- +(add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) + (after! sly (setq inferior-lisp-program "sbcl") @@ -17,8 +19,6 @@ (set-company-backend! 'sly-mrepl-mode '(company-capf :with company-files)) - (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) - (after! smartparens (sp-with-modes '(sly-mrepl-mode) (sp-local-pair "'" "'" :actions nil) From 702e0a61590c6615318552d24ed55f7dec3f9904 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 02:32:22 -0400 Subject: [PATCH 3261/4235] ui/popup: fix typo in d8928d4a --- modules/ui/popup/+hacks.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index bed4445d4..e71826425 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -302,7 +302,7 @@ instead of switch-to-buffer-*." ;; `which-key' (after! which-key - (when (eq which-key-popup-type 'side) + (when (eq which-key-popup-type 'side-window) (setq which-key-popup-type 'custom which-key-custom-popup-max-dimensions-function (lambda (_) (which-key--side-window-max-dimensions)) which-key-custom-hide-popup-function #'which-key--hide-buffer-side-window From f20cfd21c21d707549f913893595b82f9e3fbb68 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 02:33:18 -0400 Subject: [PATCH 3262/4235] Add mouse-over info to modeline segments Also extracts indentation style info from +modeline-encoding into new +modeline-indent-style segment. --- modules/ui/modeline/config.el | 66 ++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index face14654..c8924aa5e 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -439,19 +439,23 @@ Meant for `+modeline-buffer-path-function'." :on-hooks (find-file-hook after-save-hook after-revert-hook) :init (propertize "%b" 'face 'doom-modeline-buffer-file) :faces t - (+modeline-build-path (buffer-file-name (buffer-base-buffer)))) + (let ((file-path (buffer-file-name (buffer-base-buffer)))) + (propertize (+modeline-build-path file-path) + 'help-echo file-path))) (def-modeline-segment! +modeline-buffer-directory (let ((face (if (active) 'doom-modeline-buffer-path))) - (concat (if (display-graphic-p) " ") - (all-the-icons-octicon - "file-directory" - :face face - :v-adjust -0.1 - :height 1.25) - " " - (propertize (abbreviate-file-name default-directory) - 'face face)))) + (propertize + (concat (if (display-graphic-p) " ") + (all-the-icons-octicon + "file-directory" + :face face + :v-adjust -0.1 + :height 1.25) + " " + (propertize (abbreviate-file-name default-directory) + 'face face)) + 'help-echo default-directory))) (def-modeline-segment! +modeline-vcs :on-set (vc-mode) @@ -486,25 +490,36 @@ Meant for `+modeline-buffer-path-function'." (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) 'face (if active face))))))) +(def-modeline-segment! +modeline-indent-style + :on-hooks (after-revert-hook after-save-hook find-file-hook) + :on-set (indent-tabs-mode tab-width) + (propertize (format "%s%d " + (if indent-tabs-mode "⭾" "␣") + tab-width) + 'help-echo + (format "Indentation: %d %s wide" + tab-width + (if indent-tabs-mode "tabs" "spaces")))) + (def-modeline-segment! +modeline-encoding :on-hooks (after-revert-hook after-save-hook find-file-hook) - :on-set (buffer-file-coding-system indent-tabs-mode tab-width) - (format "%s%d %s %s" - (if indent-tabs-mode "⭾" "␣") - tab-width - (pcase (coding-system-eol-type buffer-file-coding-system) - (0 "LF") - (1 "CRLF") - (2 "CR")) + :on-set (buffer-file-coding-system) + (concat (pcase (coding-system-eol-type buffer-file-coding-system) + (0 (propertize "LF" 'help-echo "EOL convention: \\n (Unix)")) + (1 (propertize "CRLF" 'help-echo "EOL convention: \\r\\n (Windows, Symbian OS, etc)")) + (2 (propertize "CR" 'help-echo "EOL convention: \\r (pre-OSX MacOS)"))) + " " (let* ((sys (coding-system-plist buffer-file-coding-system)) (category (plist-get sys :category))) - (cond ((eq category 'coding-category-undecided) - "") - ((or (eq category 'coding-category-utf-8) - (eq (plist-get sys :name) 'prefer-utf-8)) - "UTF-8 ") - ((concat (upcase (symbol-name (plist-get sys :name))) - " ")))))) + (propertize + (cond ((eq category 'coding-category-undecided) + "") + ((or (eq category 'coding-category-utf-8) + (eq (plist-get sys :name) 'prefer-utf-8)) + "UTF-8 ") + ((concat (upcase (symbol-name (plist-get sys :name))) + " "))) + 'help-echo (plist-get (coding-system-plist buffer-file-coding-system) :docstring))))) (def-modeline-segment! +modeline-major-mode (propertize (format-mode-line mode-name) @@ -680,6 +695,7 @@ icons." +modeline-buffer-id " %2l:%c %p ") `(mode-line-misc-info + +modeline-indent-style +modeline-encoding +modeline-major-mode " " (vc-mode (" " +modeline-vcs " ")) From aeae3ef1f34dba7f53b2627fb65ecc43af079503 Mon Sep 17 00:00:00 2001 From: ragone Date: Wed, 3 Oct 2018 09:05:36 +1300 Subject: [PATCH 3263/4235] fix: mu4e-confirm-quit should be nil --- modules/app/email/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 2894d0471..0ed9596a5 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -50,7 +50,7 @@ ((featurep! :completion helm) #'completing-read) (t #'ido-completing-read)) ;; no need to ask - mu4e-confirm-quit t + mu4e-confirm-quit nil ;; remove 'lists' column mu4e-headers-fields '((:account . 12) From fe425c005eeb879e861f89660ebb33f7587fc553 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 11:14:08 -0400 Subject: [PATCH 3264/4235] Add g-/g= keys for buffer narrowing/widening --- core/autoload/editor.el | 5 +++-- modules/config/default/+bindings.el | 2 ++ modules/feature/evil/autoload/evil.el | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 7459c921d..5c896b702 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -238,8 +238,9 @@ 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) + (interactive "rP") + (cond ((or (region-active-p) + (and beg end)) (deactivate-mark) (when clone-p (let ((old-buf (current-buffer))) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 5c1ee1f85..3cc29bdd8 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -97,6 +97,8 @@ :n "gr" #'+eval:region :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region + :nv "g-" #'+evil:narrow-buffer + :n "g=" #'widen :v "@" #'+evil:apply-macro :n "g@" #'+evil:apply-macro ;; repeat in visual mode (FIXME buggy) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 8893d5a94..39aef130c 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -149,7 +149,7 @@ integration." (doom/retab beg end)) ;;;###autoload (autoload '+evil:narrow-buffer "feature/evil/autoload/evil" nil t) -(evil-define-command +evil:narrow-buffer (beg end &optional bang) +(evil-define-operator +evil:narrow-buffer (beg end &optional bang) "Wrapper around `doom/clone-and-narrow-buffer'." :move-point nil (interactive "") From ec44c5a702eea5a5814e49867adddb1299c6fe72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 11:14:55 -0400 Subject: [PATCH 3265/4235] Add SPC b - to toggle buffer narrowing --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 3cc29bdd8..2bc91e1f2 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -586,6 +586,7 @@ :desc "Switch buffer" :n "b" #'switch-to-buffer) :desc "Kill buffer" :n "k" #'kill-this-buffer :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers + :desc "Toggle narrowing" :nv "-" #'doom/clone-and-narrow-buffer :desc "Save buffer" :n "s" #'save-buffer :desc "Pop scratch buffer" :n "x" #'doom/open-scratch-buffer :desc "Bury buffer" :n "z" #'bury-buffer From ed48c2d54d4bca1aa422228645c988228c05c32d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 11:15:27 -0400 Subject: [PATCH 3266/4235] Add SPC b {n,p} keys for {next,prev}-buffer --- modules/config/default/+bindings.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 2bc91e1f2..7cbfee742 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -587,11 +587,13 @@ :desc "Kill buffer" :n "k" #'kill-this-buffer :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers :desc "Toggle narrowing" :nv "-" #'doom/clone-and-narrow-buffer + :desc "Next buffer" :n "n" #'next-buffer + :desc "Previous buffer" :n "p" #'previous-buffer + :desc "Next buffer" :n "]" #'next-buffer + :desc "Previous buffer" :n "[" #'previous-buffer :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 "]" #'next-buffer - :desc "Previous buffer" :n "[" #'previous-buffer :desc "Sudo edit this file" :n "S" #'doom/sudo-this-file) (:desc "code" :prefix "c" From bc16ef5431f1cd598f906a1a750ae9da40b0f0af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 11:15:51 -0400 Subject: [PATCH 3267/4235] ui/tabbar: add tabbar-mode to doom-init-ui Not that anybody should be using this module anyway... --- modules/ui/tabbar/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/tabbar/config.el b/modules/ui/tabbar/config.el index 296d5d04d..6d3eb5111 100644 --- a/modules/ui/tabbar/config.el +++ b/modules/ui/tabbar/config.el @@ -5,9 +5,9 @@ ;; find ivy (or helm) or even `buffer-menu' is better suited for this purpose. (def-package! tabbar + :hook (doom-init-ui . tabbar-mode) :config (setq tabbar-use-images nil) - (tabbar-mode) (defun +tabbar|disable-in-popups () (when (and +popup-buffer-mode tabbar-mode) From b4b19c40bf609a6e4cac4935d3c674cc575ea783 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 11:18:58 -0400 Subject: [PATCH 3268/4235] company-capf = universal default company-backend Also removes company-files from sly-mrepl-mode, because sly's capf completion includes file completion. --- modules/completion/company/config.el | 2 +- modules/lang/common-lisp/config.el | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 8b4901e17..71a071cf4 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -12,7 +12,7 @@ company-require-match 'never company-global-modes '(not erc-mode message-mode help-mode gud-mode eshell-mode) - company-backends nil + company-backends '(company-capf) company-frontends '(company-pseudo-tooltip-frontend company-echo-metadata-frontend)) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 15155b494..ca93024bc 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -16,8 +16,6 @@ (set-lookup-handlers! 'lisp-mode :definition #'sly-edit-definition :documentation #'sly-describe-symbol) - (set-company-backend! 'sly-mrepl-mode - '(company-capf :with company-files)) (after! smartparens (sp-with-modes '(sly-mrepl-mode) From 48f7d33c038c5fcb97e9303f0784b52c0316477d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 15:08:25 -0400 Subject: [PATCH 3269/4235] Don't doom|check-large-file on tags files Fixes an issue where reading TAGS files could cause "%s is a large file, open literally to avoid performance issues?" prompts every time you open a project file, if the tags file was larger than `doom-large-file-size' --- 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 a101d000d..77d1d5bc3 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -8,7 +8,7 @@ modes are active and the buffer is read-only.") (defvar doom-large-file-modes-list '(fundamental-mode special-mode archive-mode tar-mode jka-compr git-commit-mode image-mode doc-view-mode doc-view-mode-maybe - ebrowse-tree-mode pdf-view-mode) + ebrowse-tree-mode pdf-view-mode tags-table-mode) "Major modes that `doom|check-large-file' will ignore.") (defvar-local doom-inhibit-indent-detection nil From 5b4690419b8d29d5e9ead96c56274a5403aa0b2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 15:10:08 -0400 Subject: [PATCH 3270/4235] Increase doom-large-file-size threshold to 2mb 1mb is a little *too* conservative. --- 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 77d1d5bc3..464913887 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -1,6 +1,6 @@ ;;; core-editor.el -*- lexical-binding: t; -*- -(defvar doom-large-file-size 1 +(defvar doom-large-file-size 2 "Size (in MB) above which the user will be prompted to open the file literally to avoid performance issues. Opening literally means that no major or minor modes are active and the buffer is read-only.") From 6859f77e1d175f75aee8c4be445b2b3c32777961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Sun, 30 Sep 2018 23:42:13 +0100 Subject: [PATCH 3271/4235] format.el: fix `Wrong type argument: listp, t` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The intention here was to build a list of two elements. Signed-off-by: Edwin Török --- modules/editor/format/autoload/format.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 4113effd5..23042b1de 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -101,7 +101,7 @@ Stolen shamelessly from go-mode" (defun +format*probe (orig-fn) "Use `+format-with' instead, if it is set." (if +format-with - (cons +format-with t) + (list +format-with t) (funcall orig-fn))) ;;;###autoload From 7795da48003e14b77d371b6aa9bc085af5cd00df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Wed, 3 Oct 2018 22:57:22 +0100 Subject: [PATCH 3272/4235] Fix doom-serif-font and doom-variable-pitch-font: they need to be set for current frame too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Emacs 26.1 these two font settings had no effect on the main frame. Signed-off-by: Edwin Török --- core/core-ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 21ca9e83e..d53775a6d 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -351,9 +351,9 @@ frame's window-system, the theme will be reloaded.") ((display-graphic-p) (setq doom-font (face-attribute 'default :font)))) (when doom-serif-font - (set-face-attribute 'fixed-pitch-serif t :font doom-serif-font)) + (set-face-attribute 'fixed-pitch-serif nil :font doom-serif-font)) (when doom-variable-pitch-font - (set-face-attribute 'variable-pitch t :font doom-variable-pitch-font)) + (set-face-attribute 'variable-pitch nil :font doom-variable-pitch-font)) ;; Fallback to `doom-unicode-font' for Unicode characters (when (fontp doom-unicode-font) (set-fontset-font t nil doom-unicode-font nil 'append))) From 58dd73030c6d61e01a8e50f2836705f81517a865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Wed, 3 Oct 2018 22:58:18 +0100 Subject: [PATCH 3273/4235] +write-mode: initialization functions were not run MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit setting +write-mode-hook had no effect because +write-mode-hook was not defined yet, it is only defined by the minor mode definition inside autoload.el (which didn't get autoloaded yet). Due to this when activating `+write-mode` the `mixed-pitch-mode` did not get activated. Fix this by moving these all to autoload. Signed-off-by: Edwin Török --- modules/app/write/autoload.el | 21 +++++++++++++++++++++ modules/app/write/config.el | 18 ------------------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/modules/app/write/autoload.el b/modules/app/write/autoload.el index 46ebe462b..8a2f21044 100644 --- a/modules/app/write/autoload.el +++ b/modules/app/write/autoload.el @@ -20,3 +20,24 @@ "Initializes `org-mode' specific settings for `+write-mode'." (when (eq major-mode 'org-mode) (+org-pretty-mode (if +write-mode +1 -1)))) + +;;;###autoload +(defun +write|init-line-numbers () + (display-line-numbers-mode (if +write-mode +1 -1))) + +;;;###autoload +(defun +write|init-mixed-pitch () + (mixed-pitch-mode (if +write-mode +1 -1))) + +;;;###autoload +(defun +write|init-visual-fill-column () + (visual-fill-column-mode (if +write-mode +1 -1))) + +;;;###autoload +(add-hook! '+write-mode-hook + #'(flyspell-mode + visual-line-mode + +write|init-mixed-pitch + +write|init-visual-fill-column + +write|init-line-numbers + +write|init-org-mode)) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index ecb6adc01..a4b5e23bb 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -6,24 +6,6 @@ (defvar +write-line-spacing nil "What to set `line-spacing' in `+write-mode'.") -(defun +write|init-line-numbers () - (display-line-numbers-mode (if +write-mode +1 -1))) - -(defun +write|init-mixed-pitch () - (mixed-pitch-mode (if +write-mode +1 -1))) - -(defun +write|init-visual-fill-column () - (visual-fill-column-mode (if +write-mode +1 -1))) - -(add-hook! '+write-mode-hook - #'(flyspell-mode - visual-line-mode - +write|init-mixed-pitch - +write|init-visual-fill-column - +write|init-line-numbers - +write|init-org-mode)) - - ;; ;; Packages From 8f2fd970e68cbdf81eeda78aa4729229b70ed690 Mon Sep 17 00:00:00 2001 From: Manny Schneck Date: Wed, 3 Oct 2018 17:23:00 -0500 Subject: [PATCH 3274/4235] lang/js: add .mjs to auto-mode-alist regex --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 69b5d0fcf..1f68e3865 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -28,7 +28,7 @@ ;; Major modes (def-package! js2-mode - :mode "\\.js\\'" + :mode "\\.m?js\\'" :interpreter "node" :commands js2-line-break :config From cd314a118833c2b76b08fb24560b7f8250ae5c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Thu, 4 Oct 2018 00:36:42 +0100 Subject: [PATCH 3275/4235] fix setq-hook error path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In setq-hook!: core-lib.el:280:41:Warning: ‘listp’ called with 2 args, but requires 1 Signed-off-by: Edwin Török --- core/core-lib.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-lib.el b/core/core-lib.el index 22877494a..42b671be5 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -277,7 +277,7 @@ Body forms can access the hook's arguments through the let-bound variable fill-column 80)" (declare (indent 1)) (unless (= 0 (% (length rest) 2)) - (signal 'wrong-number-of-arguments (listp #'evenp (length rest)))) + (signal 'wrong-number-of-arguments (list #'evenp (length rest)))) `(add-hook! :append ,hooks ,@(let (forms) (while rest From e5ff6c841882d371062d9a62a2c4592a67e930c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Thu, 4 Oct 2018 00:37:09 +0100 Subject: [PATCH 3276/4235] fix +format--set error path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In +format--set: ../modules/editor/format/autoload/settings.el:81:26:Warning: ‘error’ called with 0 args to fill 1 format field(s) Signed-off-by: Edwin Török --- modules/editor/format/autoload/settings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el index 1e8b54cbb..31f0988b6 100644 --- a/modules/editor/format/autoload/settings.el +++ b/modules/editor/format/autoload/settings.el @@ -77,7 +77,7 @@ (cl-defun +format--set (name &key function modes unset) (declare (indent defun)) (when (and unset (not (gethash name format-all-format-table))) - (error "'%s' formatter does not exist to be unset")) + (error "'%s' formatter does not exist to be unset" name)) (puthash name function format-all-format-table) (dolist (mode (doom-enlist modes)) (cl-destructuring-bind (m &optional probe) From 649b0795de8c07ff17fd41a09bebda310464a704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Thu, 4 Oct 2018 00:37:34 +0100 Subject: [PATCH 3277/4235] fix org/config typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In toplevel form: ../modules/lang/org/config.el:380:1:Warning: Unused lexical variable ‘seperator’ Signed-off-by: Edwin Török --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 6cafb5255..5abf45e64 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -391,7 +391,7 @@ conditions where a window's buffer hasn't changed at the time this hook is run." ;; Fix variable height org-level-N faces in the eldoc string (defun +org*format-outline-path (orig-fn path &optional width prefix separator) (let ((result (funcall orig-fn path width prefix separator)) - (seperator (or separator "/"))) + (separator (or separator "/"))) (string-join (cl-loop for part in (split-string (substring-no-properties result) separator) From e4191a944baf8e2ccb09e8348062ac095e568dce Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Thu, 4 Oct 2018 11:11:08 -0700 Subject: [PATCH 3278/4235] fix +macos/open-in-default-project under ranger-mode --- modules/tools/macos/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/macos/autoload.el b/modules/tools/macos/autoload.el index d4ff371aa..05b415fa3 100644 --- a/modules/tools/macos/autoload.el +++ b/modules/tools/macos/autoload.el @@ -7,7 +7,7 @@ (let* ((path (expand-file-name (replace-regexp-in-string "'" "\\'" - (or path (if (eq major-mode 'dired-mode) + (or path (if (derived-mode-p 'dired-mode) (dired-get-file-for-visit) (buffer-file-name))) nil t))) From e44bb536b99b38c406a0edc56a124f208a1eedec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C3=98in=C3=A6s=20Myrseth?= Date: Fri, 28 Sep 2018 00:05:10 +0200 Subject: [PATCH 3279/4235] lang/purescript: Add lookup handlers Add psc-ide-goto-definition and purescript-pursuit as definition and documentation lookup handlers. --- modules/lang/purescript/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index 686ec691b..bc2adc270 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -3,7 +3,10 @@ (after! purescript-mode (add-hook! 'purescript-mode-hook #'(purescript-indentation-mode - rainbow-delimiters-mode))) + rainbow-delimiters-mode)) + (set-lookup-handlers! 'purescript-mode + :definition #'psc-ide-goto-definition + :documentation #'purescript-pursuit)) ;; (def-package! flycheck-purescript From 39059702c8c1bbfe3fdcfaa4f0c688dba9b9b7b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C3=98in=C3=A6s=20Myrseth?= Date: Fri, 28 Sep 2018 08:07:43 +0200 Subject: [PATCH 3280/4235] lang/haskell: Register intero-company backend --- modules/lang/haskell/+intero.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index e1985fc23..8d796726d 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -15,6 +15,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." :config (setq haskell-compile-cabal-build-command "stack build --fast") (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) + (set-company-backend! 'intero-mode 'intero-company) (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'intero '(warning . haskell-hlint))) From 6a17b193ea3ec7186070993a7d1538684a8b2ba5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Sep 2018 21:18:13 -0400 Subject: [PATCH 3281/4235] lang/purescript: fix set-lookup-handler! indent --- modules/lang/purescript/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index bc2adc270..4372a8743 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -4,9 +4,9 @@ (add-hook! 'purescript-mode-hook #'(purescript-indentation-mode rainbow-delimiters-mode)) - (set-lookup-handlers! 'purescript-mode - :definition #'psc-ide-goto-definition - :documentation #'purescript-pursuit)) + (set-lookup-handlers! 'purescript-mode + :definition #'psc-ide-goto-definition + :documentation #'purescript-pursuit)) ;; (def-package! flycheck-purescript From c9aca5a81e210538d3d1804591db2010789b1d78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Sat, 6 Oct 2018 14:47:06 +0200 Subject: [PATCH 3282/4235] Updated documentation to use better gocode fork (supports Go 1.11+) --- modules/lang/go/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/go/README.org b/modules/lang/go/README.org index 3447c530e..ec42995d3 100644 --- a/modules/lang/go/README.org +++ b/modules/lang/go/README.org @@ -51,7 +51,7 @@ This module requires a valid ~GOPATH~, and the following Go packages: export GOPATH=~/work/go go get -u github.com/motemen/gore -go get -u github.com/nsf/gocode +go get -u github.com/stamblerre/gocode go get -u golang.org/x/tools/cmd/godoc go get -u golang.org/x/tools/cmd/goimports go get -u golang.org/x/tools/cmd/gorename From ab273db50d42b2668bc6e566a4358dca24718ece Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Sat, 6 Oct 2018 23:52:18 +0800 Subject: [PATCH 3283/4235] Rule is too restrict for file templates --- modules/feature/file-templates/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/feature/file-templates/config.el b/modules/feature/file-templates/config.el index b7cb10292..f058d6c9c 100644 --- a/modules/feature/file-templates/config.el +++ b/modules/feature/file-templates/config.el @@ -113,7 +113,6 @@ must be non-read-only, empty, and there must be a rule in `+file-templates-alist' that applies to it." (when (and (not buffer-read-only) (bobp) (eobp) - (get-buffer-window) (not (string-match-p "^ *\\*" (buffer-name)))) (when-let* ((rule (cl-find-if #'+file-template-p +file-templates-alist))) (apply #'+file-templates--expand rule)))) From 706da14ec9d275eadb0767994227df7b726fd60e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 19:00:32 -0400 Subject: [PATCH 3284/4235] ui/modeline: fix void-variable evil-visual-* errors For non-evil users. --- modules/ui/modeline/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index c8924aa5e..ebdc6ae40 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -66,6 +66,8 @@ Currently available functions: (defvar evil-mode nil) (defvar evil-state nil) (defvar evil-visual-selection nil) +(defvar evil-visual-beginning nil) +(defvar evil-visual-end nil) (defvar iedit-mode nil) (defvar all-the-icons-scale-factor) (defvar all-the-icons-default-adjust) From 661632d55ea80fabc31d044910a848be684c4ab8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Oct 2018 19:01:06 -0400 Subject: [PATCH 3285/4235] ui/vc-gutter: fix git-gutter in tty Emacs Use git-gutter-mode in tty Emacs, and git-gutter-fringe in GUI Emacs. --- modules/ui/vc-gutter/config.el | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index 3a4ad4caa..1df3ba185 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -19,7 +19,7 @@ to the right fringe.") ;; ;; Packages -(def-package! git-gutter-fringe +(def-package! git-gutter :commands (git-gutter:revert-hunk git-gutter:stage-hunk) :init (defun +version-control|git-gutter-maybe () @@ -28,7 +28,17 @@ to the right fringe.") (vc-backend buffer-file-name) (or +vc-gutter-in-remote-files (not (file-remote-p buffer-file-name)))) - (require 'git-gutter-fringe) + (if (display-graphic-p) + (progn + (require 'git-gutter-fringe) + (setq-local git-gutter:init-function #'git-gutter-fr:init) + (setq-local git-gutter:view-diff-function #'git-gutter-fr:view-diff-infos) + (setq-local git-gutter:clear-function #'git-gutter-fr:clear) + (setq-local git-gutter:window-width -1)) + (setq-local git-gutter:init-function 'nil) + (setq-local git-gutter:view-diff-function #'git-gutter:view-diff-infos) + (setq-local git-gutter:clear-function #'git-gutter:clear-diff-infos) + (setq-local git-gutter:window-width nil)) (git-gutter-mode +1))) (add-hook! (text-mode prog-mode conf-mode after-save) #'+version-control|git-gutter-maybe) @@ -49,10 +59,12 @@ to the right fringe.") ;; update git-gutter when using magit commands (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter) - (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter) + (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter)) - ;; subtle diff indicators in the fringe - (when +vc-gutter-default-style + +;; subtle diff indicators in the fringe +(when +vc-gutter-default-style + (after! git-gutter-fringe ;; places the git gutter outside the margins. (setq-default fringes-outside-margins t) ;; thin fringe bitmaps From 77510ed2d89c23a78b11cab2ee12b227d2769fe4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Oct 2018 11:14:49 -0400 Subject: [PATCH 3286/4235] app/write: monospaced indentation in org --- modules/app/write/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/write/config.el b/modules/app/write/config.el index a4b5e23bb..e82a0137c 100644 --- a/modules/app/write/config.el +++ b/modules/app/write/config.el @@ -43,6 +43,7 @@ org-todo-keyword-kill org-todo-keyword-outd org-todo + org-indent line-number line-number-current-line org-special-keyword From 5d3bada86eeb78818afcfe78a4feb43fbc1bac48 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Oct 2018 23:29:20 -0400 Subject: [PATCH 3287/4235] Don't byte-compile xdg-path in doom-private-dir The danger of a stale value post-byte-compilation far outweighs the benefits. --- core/core.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/core.el b/core/core.el index ad2eb1813..8980f341c 100644 --- a/core/core.el +++ b/core/core.el @@ -59,12 +59,11 @@ Use this for files that change often, like cache files.") (defvar doom-private-dir (or (getenv "DOOMDIR") - (eval-when-compile - (let ((xdg-path - (expand-file-name "doom/" - (or (getenv "XDG_CONFIG_HOME") - "~/.config")))) - (if (file-directory-p xdg-path) xdg-path))) + (let ((xdg-path + (expand-file-name "doom/" + (or (getenv "XDG_CONFIG_HOME") + "~/.config")))) + (if (file-directory-p xdg-path) xdg-path)) "~/.doom.d/") "Where your private customizations are placed. Must end in a slash. Respects XDG directory conventions if ~/.config/doom exists.") From 9a17c909c9a0474eb6d4cf86491c3e4112e596db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 00:21:57 -0400 Subject: [PATCH 3288/4235] Don't always create dummy files on doom quickstart Only when DOOMDIR doesn't exist. --- core/cli/quickstart.el | 50 +++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el index 1d721124b..8c89b10ec 100644 --- a/core/cli/quickstart.el +++ b/core/cli/quickstart.el @@ -26,33 +26,29 @@ packages and regenerates the autoloads file." (print! (yellow "%s directory already exists. Skipping.") short-private-dir) (print! "Creating %s" short-private-dir) (make-directory doom-private-dir t) - (print! (green "Done!"))) - ;; Create init.el - (dolist - (file (list (cons "init.el" - (lambda () - (insert-file-contents (expand-file-name "init.example.el" doom-emacs-dir)))) - (cons "config.el" - (lambda () - (insert (format ";;; %sconfig.el -*- lexical-binding: t; -*-\n\n" - short-private-dir) - ";; Place your private configuration here\n"))) - (cons "packages.el" - (lambda () - (insert (format ";; -*- no-byte-compile: t; -*-\n;;; %spackages.el\n\n" - short-private-dir) - ";;; Examples:\n" - ";; (package! some-package)\n" - ";; (package! another-package :recipe (:fetcher github :repo \"username/repo\"))\n" - ";; (package! builtin-package :disable t)\n"))))) - (cl-destructuring-bind (path . fn) file - (let ((fullpath (expand-file-name path doom-private-dir))) - (if (file-exists-p fullpath) - (print! (yellow "%s%s already exists. Skipping.") short-private-dir path) - (print! "Creating %s%s" short-private-dir path) - (with-temp-file fullpath - (funcall fn)) - (print! (green "Done!"))))))) + (print! (green "Done!")) + ;; Create init.el, config.el & packages.el + (dolist (file (list (cons "init.el" + (lambda () + (insert-file-contents (expand-file-name "init.example.el" doom-emacs-dir)))) + (cons "config.el" + (lambda () + (insert (format ";;; %sconfig.el -*- lexical-binding: t; -*-\n\n" + short-private-dir) + ";; Place your private configuration here\n"))) + (cons "packages.el" + (lambda () + (insert (format ";; -*- no-byte-compile: t; -*-\n;;; %spackages.el\n\n" + short-private-dir) + ";;; Examples:\n" + ";; (package! some-package)\n" + ";; (package! another-package :recipe (:fetcher github :repo \"username/repo\"))\n" + ";; (package! builtin-package :disable t)\n"))))) + (cl-destructuring-bind (path . fn) file + (print! "Creating %s%s" short-private-dir path) + (with-temp-file (expand-file-name path doom-private-dir) + (funcall fn)) + (print! (green "Done!")))))) ;; Ask if Emacs.app should be patched (when IS-MAC (message "MacOS detected") From 301a01182dc822a852fd01dc6cf3f596f57d995c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 00:23:41 -0400 Subject: [PATCH 3289/4235] config/default: move ruby sp rules To group them with other major mode rules --- modules/config/default/config.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 7b8539c96..16e745595 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -44,11 +44,6 @@ (sp-pair "'" nil :unless unless-list) (sp-pair "\"" nil :unless unless-list)) - ;; Major-mode specific fixes - (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler)) - ;; Expand {|} => { | } ;; Expand {|} => { ;; | @@ -59,6 +54,11 @@ ;; I likely don't want a new pair if adjacent to a word or opening brace :unless '(sp-point-before-word-p sp-point-before-same-p))) + ;; Major-mode specific fixes + (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) + ;; Don't do square-bracket space-expansion where it doesn't make sense to (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) "[" nil :post-handlers '(:rem ("| " "SPC"))) From 7c6e2e705f3bb3b0264fbe8469dcf6160ce07f4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 00:24:44 -0400 Subject: [PATCH 3290/4235] lang/python: add Ipython/Jupyter REPL commands --- modules/lang/python/autoload/python.el | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index ab9733d40..73072dc83 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -22,6 +22,23 @@ (run-python nil t t)) (run-python nil t t))))) +;;;###autoload +(defun +python/open-ipython-repl () + "Open an IPython REPL." + (interactive) + (let ((python-shell-interpreter "ipython") + (python-shell-interpreter-args "-i --pylab --simple-prompt --no-color-info")) + (+python/repl))) + +;;;###autoload +(defun +python/open-jupyter-repl () + "Open a Jupyter console." + (interactive) + (add-to-list 'python-shell-completion-native-disabled-interpreters "jupyter") + (let ((python-shell-interpreter "jupyter") + (python-shell-interpreter-args "console --simple-prompt")) + (+python/repl))) + (defun +python--extract-version (prefix str) (when str (format "%s%s" prefix (cadr (split-string str " "))))) From 9185da824c3fdee67441f2ad836e592d7b27ae4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 00:25:50 -0400 Subject: [PATCH 3291/4235] lang/python: remove +ipython flag + Replace +ipython functionality with +python/open-ipython-repl command. + Use python-shell-interpreter for eval handlers, repl and python version detection. + Removed various python-shell-* variables for ipython; they are already supported upstream. --- modules/lang/python/autoload/python.el | 4 +++- modules/lang/python/config.el | 15 ++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 73072dc83..c972da568 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -60,7 +60,9 @@ started it." (+python--extract-version "Pipenv " v) +python-version-cache)) (puthash (or (doom-project-root) default-directory) - (+python--extract-version "Python " (car (process-lines "python" "--version"))) + (+python--extract-version + "Python " + (car (process-lines python-shell-intepreter "--version"))) +python-version-cache)) (error "Python"))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index f23c48975..14ee8fc82 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -14,18 +14,7 @@ :defer t :init (setq python-environment-directory doom-cache-dir - python-indent-guess-indent-offset-verbose nil - python-shell-interpreter "python") - (when (featurep! +ipython) - (setq python-shell-interpreter "ipython" - python-shell-interpreter-args "-i --simple-prompt --no-color-info" - python-shell-prompt-regexp "In \\[[0-9]+\\]: " - python-shell-prompt-block-regexp "\\.\\.\\.\\.: " - python-shell-prompt-output-regexp "Out\\[[0-9]+\\]: " - python-shell-completion-setup-code - "from IPython.core.completerlib import module_completion" - python-shell-completion-string-code - "';'.join(get_ipython().Completer.all_completions('''%s'''))\n")) + python-indent-guess-indent-offset-verbose nil) :config (set-env! "PYTHONPATH" "PYENV_ROOT" "ANACONDA_HOME") (set-electric! 'python-mode :chars '(?:)) @@ -131,7 +120,7 @@ :init (setq pipenv-with-projectile nil) :config (set-eval-handler! 'python-mode - '((:command . "python") + '((:command . (lambda () python-shell-interpreter)) (:exec (lambda () (if-let* ((bin (executable-find "pipenv")) (_ (pipenv-project-p))) From d21887149ff6e41567bc3934d422836eccbc6549 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 00:27:52 -0400 Subject: [PATCH 3292/4235] Minor refactor/reformatting --- core/core-editor.el | 2 +- modules/completion/company/config.el | 6 +++--- modules/lang/common-lisp/config.el | 7 +++---- modules/lang/python/config.el | 8 ++++---- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 464913887..40775e60a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -297,7 +297,7 @@ savehist file." (def-package! ws-butler ;; a less intrusive `delete-trailing-whitespaces' on save - :after-call (after-find-file) + :after-call (after-find-file) :config (setq ws-butler-global-exempt-modes (append ws-butler-global-exempt-modes diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 71a071cf4..cca1c43e9 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -35,9 +35,9 @@ :config (add-to-list 'company-frontends 'company-tng-frontend) (define-key! company-active-map - [return] nil - [tab] #'company-select-next - [backtab] #'company-select-previous)) + [return] nil + [tab] #'company-select-next + [backtab] #'company-select-previous)) ;; diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index ca93024bc..22551bba5 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -17,10 +17,9 @@ :definition #'sly-edit-definition :documentation #'sly-describe-symbol) - (after! smartparens - (sp-with-modes '(sly-mrepl-mode) - (sp-local-pair "'" "'" :actions nil) - (sp-local-pair "`" "`" :actions nil))) + (sp-with-modes '(sly-mrepl-mode) + (sp-local-pair "'" "'" :actions :rem) + (sp-local-pair "`" "`" :actions :rem)) ;; (defun +common-lisp|cleanup-sly-maybe () diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 14ee8fc82..d4c694611 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -39,10 +39,10 @@ :return "return" :yield "yield") (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens - (sp-with-modes 'python-mode - (sp-local-pair "'" nil :unless '(sp-point-before-word-p - sp-point-after-word-p - sp-point-before-same-p))) + (sp-local-pair 'python-mode "'" nil + :unless '(sp-point-before-word-p + sp-point-after-word-p + sp-point-before-same-p)) (setq-hook! 'python-mode-hook tab-width python-indent-offset) From 06cf518af85dec750885309b2a1fc1b25af24ca3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 12:35:08 -0400 Subject: [PATCH 3293/4235] lang/java: set meghanada-use-* vars earlier Fixes a race condition where certain features ended up enabled too late for the first buffer. --- modules/lang/java/+meghanada.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 3e170ec39..9e533c141 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -3,13 +3,13 @@ (def-package! meghanada :hook (java-mode . meghanada-mode) - :config + :init (setq meghanada-server-install-dir (concat doom-etc-dir "meghanada-server/") meghanada-use-company (featurep! :completion company) meghanada-use-flycheck (featurep! :feature syntax-checker) meghanada-use-eldoc t meghanada-use-auto-start t) - + :config (set-lookup-handlers! 'java-mode :definition #'meghanada-jump-declaration :references #'meghanada-reference) From 675f4fa821aa1bbb2ab33b275126c688a8964463 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 20:56:18 -0400 Subject: [PATCH 3294/4235] lang/latex: enable flyspell-mode after local-vars Gives setq hooks and file/directory-local variables the opportunity to take effect before flyspell activates. --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 51669a764..aeaebf900 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -65,7 +65,7 @@ If no viewers are found, `latex-preview-pane' is used.") ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) - (add-hook 'TeX-mode-hook #'flyspell-mode :append)) + (add-hook 'TeX-mode-local-vars-hook #'flyspell-mode)) ;; All these excess pairs dramatically slow down typing in latex buffers, so ;; we remove them. Let snippets do their job. (after! smartparens-latex From f416e28857b00a6055adb8f77ce6e446d8885753 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Oct 2018 20:57:23 -0400 Subject: [PATCH 3295/4235] lang/org: refactor default org-todo-keyword-faces To ensure consistency --- modules/lang/org/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 5abf45e64..575a74922 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -202,10 +202,10 @@ unfold to point on startup." (sequence "TODO(T)" "|" "DONE(D)") (sequence "NEXT(n)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)")) org-todo-keyword-faces - '(("[-]" . font-lock-constant-face) - ("[?]" . warning) - ("WAITING" . default) - ("LATER" . warning)) + '(("[-]" :inherit font-lock-constant-face :weight bold) + ("[?]" :inherit warning :weight bold) + ("WAITING" :inherit default :weight bold) + ("LATER" :inherit warning :weight bold)) org-use-sub-superscripts '{} ;; Scale up LaTeX previews a bit (default is too small) From d84b516cf46fb46a5d051b6742b55f38d109b9a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 00:33:58 -0400 Subject: [PATCH 3296/4235] lang/common-lisp: don't start sly in temp buffers Org source blocks use a temp buffer in lisp-mode to natively fontify CL blocks, which can trigger sly. This prevents that. --- modules/lang/common-lisp/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 22551bba5..b82101ec5 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -38,7 +38,8 @@ (defun +common-lisp|init-sly () "Attempt to auto-start sly when opening a lisp buffer." - (cond ((sly-connected-p)) + (cond ((or (doom-temp-buffer-p (current-buffer)) + (sly-connected-p))) ((executable-find inferior-lisp-program) (let ((sly-auto-start 'always)) (sly-auto-start) From e70a8d925e80e35323437ee53ae2347d0972e2a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 00:35:25 -0400 Subject: [PATCH 3297/4235] lang/common-lisp: fix consp errors on load --- modules/lang/common-lisp/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index b82101ec5..3c22eefa4 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -18,8 +18,8 @@ :documentation #'sly-describe-symbol) (sp-with-modes '(sly-mrepl-mode) - (sp-local-pair "'" "'" :actions :rem) - (sp-local-pair "`" "`" :actions :rem)) + (sp-local-pair "'" "'" :actions nil) + (sp-local-pair "`" "`" :actions nil)) ;; (defun +common-lisp|cleanup-sly-maybe () From 34d7e327b27270efb199126dbb5aa0b7350a2b6d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 00:35:41 -0400 Subject: [PATCH 3298/4235] lang/common-lisp: sly-eval-region = eval handler This allows you to use the `gr` operator to evaluate code on-the-fly. --- modules/lang/common-lisp/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 3c22eefa4..e7cd71ca4 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -13,6 +13,7 @@ ("^\\*sly-traces" :vslot 6 :ttl nil))) (set-repl-handler! 'lisp-mode #'sly-mrepl) + (set-eval-handler! 'lisp-mode #'sly-eval-region) (set-lookup-handlers! 'lisp-mode :definition #'sly-edit-definition :documentation #'sly-describe-symbol) From 352d9902e453089bed4010b290aa3bd79d26c8e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 00:36:34 -0400 Subject: [PATCH 3299/4235] Fix set-eval-handler! This ensures eval handlers shadow the correct entries in quickrun--language-alist, rather than adding new/duplicate ones. --- modules/feature/eval/autoload/settings.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index 6ff75db23..b80af5d1a 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -59,7 +59,8 @@ command that will be called interactively." ((listp command) (after! quickrun (quickrun-add-command - (symbol-name mode) + (or (cdr (assq mode quickrun--major-mode-alist)) + (string-remove-suffix "-mode" (symbol-name mode))) command :mode mode))))) ;; FIXME obsolete :eval From ba93402dcc7a1023ff9d7ae8c0dab3d6dfb4252b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 00:46:50 -0400 Subject: [PATCH 3300/4235] lang/python: fix typo in +python-version Thanks to @ztlevi --- modules/lang/python/autoload/python.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index c972da568..69766e881 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -62,7 +62,7 @@ started it." (puthash (or (doom-project-root) default-directory) (+python--extract-version "Python " - (car (process-lines python-shell-intepreter "--version"))) + (car (process-lines python-shell-interpreter "--version"))) +python-version-cache)) (error "Python"))) From a078e3f4b241118338eb603cb6c5b6550ff6cc86 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 00:47:14 -0400 Subject: [PATCH 3301/4235] lang/common-lisp: fix sly-mode localleader keys This fixes a bug that caused evil keybinds on sly-mode-map to be inaccessible until you switched states. --- modules/lang/common-lisp/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index e7cd71ca4..8a07794fc 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -115,6 +115,7 @@ bin/doom while packages at compile-time (not a runtime though)." ;; Since `evil-collection-slime' exists, but not `evil-collection-sly', we ;; simply copy it (when (featurep! :feature evil +everywhere) + (add-hook 'sly-mode-hook #'evil-normalize-keymaps) (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps) (unless evil-move-beyond-eol (advice-add #'sly-eval-last-expression :around #'+common-lisp*sly-last-sexp) From b89fcd8726c8fa2ad9e2aab20bbbf67e8cf8f6a5 Mon Sep 17 00:00:00 2001 From: Sebastian Wild Date: Sat, 6 Oct 2018 23:45:09 +0200 Subject: [PATCH 3302/4235] Replace Coq-Mode abbreviations with yasnippet Since ProofGenerals abbreviation usage interfers with evil-mode, this empties the abbreviation table of coq-mode. The abbreviations got transformed into yasnippet snippets and put into hlissner/emacs-snippets#4. --- modules/lang/coq/README.org | 5 ++++- modules/lang/coq/config.el | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/lang/coq/README.org b/modules/lang/coq/README.org index 680555966..57459aa7e 100644 --- a/modules/lang/coq/README.org +++ b/modules/lang/coq/README.org @@ -1,3 +1,6 @@ #+TITLE: :lang coq -This module adds [[https://coq.inria.fr][coq]] support, powered by [[https://proofgeneral.github.io][Proof General]], with code completion via [[https://github.com/cpitclaudel/company-coq][company-coq]]. +This module adds [[https://coq.inria.fr][coq]] support, powered by [[https://proofgeneral.github.io][Proof General]]. + ++ Code completion ([[https://github.com/cpitclaudel/company-coq][company-coq]]) ++ [[https://github.com/hlissner/emacs-snippets/tree/master/coq-mode][Snippets]] diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index 1ff5cc560..eebd75636 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -3,6 +3,8 @@ ;; `coq' (setq proof-electric-terminator-enable t) +(setq coq-mode-abbrev-table '()) + (after! company-coq (set-lookup-handlers! 'company-coq-mode :definition #'company-coq-jump-to-definition From f0465f22cce503770e1004c69b902b7db86bfcf6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 11:12:51 -0400 Subject: [PATCH 3303/4235] tools/magit: fix +magit/quit & default display fn When used with magit-display-buffer-traditional, q wouldn't close the window, just kill the buffer inside. --- modules/tools/magit/autoload.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index fd19a45e6..0c61fa12e 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -53,9 +53,13 @@ "Clean up magit buffers after quitting `magit-status' and refresh version control in buffers." (interactive) - (if (cdr (delq nil (mapcar (lambda (win) (with-selected-window win (eq major-mode 'magit-status-mode))) - (window-list)))) - (quit-window) + (quit-window) + (unless (cdr + (delq nil + (mapcar (lambda (win) + (with-selected-window win + (eq major-mode 'magit-status-mode))) + (window-list)))) (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) (dolist (buffer (buffer-list)) (with-current-buffer buffer From cdf745e72a3e8bf9bef1f0fa4d051b00aab351e3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Oct 2018 21:32:42 -0400 Subject: [PATCH 3304/4235] map!: remove buffer-local :desc properties which-key labels are registered globally, and will not work for buffer-local keybinds. Until general is brought in, we'll have to suffer label-less localleader keybinds. --- modules/app/irc/config.el | 25 ++++--- modules/lang/clojure/config.el | 2 +- modules/lang/common-lisp/config.el | 98 +++++++++++++-------------- modules/lang/org/config.el | 2 +- modules/lang/rest/config.el | 6 +- modules/lang/web/+html.el | 104 ++++++++++++++--------------- 6 files changed, 117 insertions(+), 120 deletions(-) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index d80a17993..f76dbeec2 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -121,21 +121,20 @@ playback.") ;; distinguish chat/channel buffers from server buffers. (add-hook 'circe-chat-mode-hook #'solaire-mode)) - (map! - (:localleader - (:map circe-mode-map - :desc "Next active buffer" :n "a" #'tracking-next-buffer - :desc "Join channel" :n "j" #'circe-command-JOIN - :desc "Send private message" :n "m" #'+irc/send-message - :desc "Part current channel" :n "p" #'circe-command-PART - :desc "Quit irc" :n "Q" #'+irc/quit - :desc "Reconnect" :n "R" #'circe-reconnect + (map! :localleader + (:map circe-mode-map + :n "a" #'tracking-next-buffer + :n "j" #'circe-command-JOIN + :n "m" #'+irc/send-message + :n "p" #'circe-command-PART + :n "Q" #'+irc/quit + :n "R" #'circe-reconnect - (:when (featurep! :completion ivy) - :desc "Jump to channel" :n "c" #'+irc/ivy-jump-to-channel)) + (:when (featurep! :completion ivy) + :n "c" #'+irc/ivy-jump-to-channel)) - (:map circe-channel-mode-map - :desc "Show names" :n "n" #'circe-command-NAMES)))) + (:map circe-channel-mode-map + :n "n" #'circe-command-NAMES))) (def-package! circe-color-nicks diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 0ebbc708f..d72f4c8eb 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -40,7 +40,7 @@ :config (map! :map clj-refactor-map :localleader - :desc "Refactor hydra" :n "r" #'hydra-cljr-help-menu/body)) + :n "r" #'hydra-cljr-help-menu/body)) (def-package! flycheck-joker :when (featurep! :feature syntax-checker) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 8a07794fc..943bcb001 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -59,58 +59,56 @@ bin/doom while packages at compile-time (not a runtime though)." (advice-remove #'sly-check-version #'+common-lisp*refresh-sly-version)) (advice-add #'sly-check-version :before #'+common-lisp*refresh-sly-version) - ;; FIXME Buffer/mode-local :desc's don't work yet (map! :map sly-mode-map :localleader - :desc "Start Sly" :n "'" #'sly - (:desc "help" :prefix "h" - :desc "Apropos" :n "a" #'sly-apropos - :desc "Who binds" :n "b" #'sly-who-binds - :desc "Disassemble symbol" :n "d" #'sly-disassemble-symbol - :desc "Describe symbol" :n "h" #'sly-describe-symbol - :desc "HyperSpec lookup" :n "H" #'sly-hyperspec-lookup - :desc "Who macroexpands" :n "m" #'sly-who-macroexpands - :desc "Apropos package" :n "p" #'sly-apropos-package - :desc "Who references" :n "r" #'sly-who-references - :desc "Who specializes" :n "s" #'sly-who-specializes - :desc "Who sets" :n "S" #'sly-who-sets - :desc "Who calls" :n "<" #'sly-who-calls - :desc "Calls who" :n ">" #'sly-calls-who) - (:desc "compile" :prefix "c" - :desc "Compile file" :n "c" #'sly-compile-file - :desc "Compile/load file" :n "C" #'sly-compile-and-load-file - :desc "Compile defun" :n "f" #'sly-compile-defun - :desc "Load file" :n "l" #'sly-load-file - :desc "Remove notes" :n "n" #'sly-remove-notes - :desc "Compile region" :n "r" #'sly-compile-region) - (:desc "evaluate" :prefix "e" - :desc "Evaluate buffer" :n "b" #'sly-eval-buffer - :desc "Evaluate last expression" :n "e" #'sly-eval-last-expression - :desc "Evaluate/print last expression" :n "E" #'sly-eval-print-last-expression - :desc "Evaluate defun" :n "f" #'sly-eval-defun - :desc "Undefine function" :n "F" #'sly-undefine-function - :desc "Evaluate region" :n "r" #'sly-eval-region) - (:desc "go" :n "g" #'+common-lisp/navigation/body) - (:desc "macro" :prefix "m" - :desc "Macro-expand 1 level" :n "e" #'sly-macroexpand-1 - :desc "Macro-expand all" :n "E" #'sly-macroexpand-all - :desc "Macro stepper" :n "s" #'+common-lisp/macrostep/body) - (:desc "repl" :prefix "r" - :desc "Clear REPL" :n "c" #'sly-mrepl-clear-repl - :desc "Quit Lisp" :n "q" #'sly-quit-lisp - :desc "Restart Lisp" :n "r" #'sly-restart-inferior-lisp - :desc "Sync REPL" :n "s" #'sly-mrepl-sync) - (:desc "stickers" :prefix "s" - :desc "Toggle break on sticker" :n "b" #'sly-stickers-toggle-break-on-stickers - :desc "Clear defun stickers" :n "c" #'sly-stickers-clear-defun-stickers - :desc "Clear buffer stickers" :n "C" #'sly-stickers-clear-buffer-stickers - :desc "Fetch sticker recordings" :n "f" #'sly-stickers-fetch - :desc "Replay sticker recordings" :n "r" #'sly-stickers-replay - :desc "Add/remove stickers" :n "s" #'sly-stickers-dwim) - (:desc "trace" :prefix "t" - :desc "Toggle tracing" :n "t" #'sly-toggle-trace-fdefinition - :desc "Toggle fancy tracing" :n "T" #'sly-toggle-fancy-trace - :desc "Un-trace all" :n "u" #'sly-untrace-all)) + :n "'" #'sly + :n "g" #'+common-lisp/navigation/body + (:prefix "h" + :n "a" #'sly-apropos + :n "b" #'sly-who-binds + :n "d" #'sly-disassemble-symbol + :n "h" #'sly-describe-symbol + :n "H" #'sly-hyperspec-lookup + :n "m" #'sly-who-macroexpands + :n "p" #'sly-apropos-package + :n "r" #'sly-who-references + :n "s" #'sly-who-specializes + :n "S" #'sly-who-sets + :n "<" #'sly-who-calls + :n ">" #'sly-calls-who) + (:prefix "c" + :n "c" #'sly-compile-file + :n "C" #'sly-compile-and-load-file + :n "f" #'sly-compile-defun + :n "l" #'sly-load-file + :n "n" #'sly-remove-notes + :n "r" #'sly-compile-region) + (:prefix "e" + :n "b" #'sly-eval-buffer + :n "e" #'sly-eval-last-expression + :n "E" #'sly-eval-print-last-expression + :n "f" #'sly-eval-defun + :n "F" #'sly-undefine-function + :n "r" #'sly-eval-region) + (:prefix "m" + :n "e" #'macrostep-expand + :n "E" #'+common-lisp/macrostep/body) + (:prefix "r" + :n "c" #'sly-mrepl-clear-repl + :n "q" #'sly-quit-lisp + :n "r" #'sly-restart-inferior-lisp + :n "s" #'sly-mrepl-sync) + (:prefix "s" + :n "b" #'sly-stickers-toggle-break-on-stickers + :n "c" #'sly-stickers-clear-defun-stickers + :n "C" #'sly-stickers-clear-buffer-stickers + :n "f" #'sly-stickers-fetch + :n "r" #'sly-stickers-replay + :n "s" #'sly-stickers-dwim) + (:prefix "t" + :n "t" #'sly-toggle-trace-fdefinition + :n "T" #'sly-toggle-fancy-trace + :n "u" #'sly-untrace-all)) ;; Since `evil-collection-slime' exists, but not `evil-collection-sly', we ;; simply copy it diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 575a74922..eb98fe121 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -361,7 +361,7 @@ between the two." :localleader :n "d" #'org-deadline :n "t" #'org-todo - (:desc "clock" :prefix "c" + (:prefix "c" :n "c" #'org-clock-in :n "C" #'org-clock-out :n "g" #'org-clock-goto diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 2ba0f1584..a9ad7b7e7 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -22,9 +22,9 @@ :n "zr" #'outline-show-all :localleader - :desc "Execute HTTP request" :n "e" #'restclient-http-send-current - :desc "Execute raw HTTP request" :n "E" #'restclient-http-send-current-raw - :desc "Copy curl command" :n "c" #'restclient-copy-curl-command)) + :n "e" #'restclient-http-send-current + :n "E" #'restclient-http-send-current-raw + :n "c" #'restclient-copy-curl-command)) (def-package! company-restclient diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 436dcc3e8..31db91490 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -64,62 +64,62 @@ :desc "Rehighlight buffer" :n "h" #'web-mode-buffer-highlight :desc "Indent buffer" :n "i" #'web-mode-buffer-indent - (:desc "attribute" :prefix "a" - :desc "Beginning" :n "b" #'web-mode-attribute-beginning - :desc "End" :n "e" #'web-mode-attribute-end - :desc "Insert" :n "i" #'web-mode-attribute-insert - :desc "Next" :n "n" #'web-mode-attribute-next - :desc "Select" :n "s" #'web-mode-attribute-select - :desc "Kill" :n "k" #'web-mode-attribute-kill - :desc "Previous" :n "p" #'web-mode-attribute-previous - :desc "Transpose" :n "p" #'web-mode-attribute-transpose) + (:prefix "a" + :n "b" #'web-mode-attribute-beginning + :n "e" #'web-mode-attribute-end + :n "i" #'web-mode-attribute-insert + :n "n" #'web-mode-attribute-next + :n "s" #'web-mode-attribute-select + :n "k" #'web-mode-attribute-kill + :n "p" #'web-mode-attribute-previous + :n "p" #'web-mode-attribute-transpose) - (:desc "block" :prefix "b" - :desc "Beginning" :n "b" #'web-mode-block-beginning - :desc "Close" :n "c" #'web-mode-block-close - :desc "End" :n "e" #'web-mode-block-end - :desc "Kill" :n "k" #'web-mode-block-kill - :desc "Next" :n "n" #'web-mode-block-next - :desc "Previous" :n "p" #'web-mode-block-previous - :desc "Select" :n "s" #'web-mode-block-select) + (:prefix "b" + :n "b" #'web-mode-block-beginning + :n "c" #'web-mode-block-close + :n "e" #'web-mode-block-end + :n "k" #'web-mode-block-kill + :n "n" #'web-mode-block-next + :n "p" #'web-mode-block-previous + :n "s" #'web-mode-block-select) - (:desc "dom" :prefix "d" - :desc "Replace apostrophes" :n "a" #'web-mode-dom-apostrophes-replace - :desc "Show errors" :n "d" #'web-mode-dom-errors-show - :desc "Replace entities" :n "e" #'web-mode-dom-entities-encode - :desc "Normalize" :n "n" #'web-mode-dom-normalize - :desc "Replace quotes" :n "q" #'web-mode-dom-quotes-replace - :desc "Traverse" :n "t" #'web-mode-dom-traverse - :desc "XPath" :n "x" #'web-mode-dom-xpath) + (:prefix "d" + :n "a" #'web-mode-dom-apostrophes-replace + :n "d" #'web-mode-dom-errors-show + :n "e" #'web-mode-dom-entities-encode + :n "n" #'web-mode-dom-normalize + :n "q" #'web-mode-dom-quotes-replace + :n "t" #'web-mode-dom-traverse + :n "x" #'web-mode-dom-xpath) - (:desc "element" :prefix "e" - :desc "Close" :n "/" #'web-mode-element-close - :desc "Select content" :n "a" #'web-mode-element-content-select - :desc "Beginning" :n "b" #'web-mode-element-beginning - :desc "Close" :n "c" #'web-mode-element-clone - :desc "Child" :n "d" #'web-mode-element-child - :desc "End" :n "e" #'web-mode-element-end - :desc "Toggle fold" :n "f" #'web-mode-element-children-fold-or-unfold - :desc "Insert" :n "i" #'web-mode-element-insert - :desc "Kill" :n "k" #'web-mode-element-kill - :desc "Mute blanks" :n "m" #'web-mode-element-mute-blanks - :desc "Next" :n "n" #'web-mode-element-next - :desc "Previous" :n "p" #'web-mode-element-previous - :desc "Rename" :n "r" #'web-mode-element-rename - :desc "Select" :n "s" #'web-mode-element-select - :desc "Transpose" :n "t" #'web-mode-element-transpose - :desc "Parent" :n "u" #'web-mode-element-parent - :desc "Vanish" :n "v" #'web-mode-element-vanish - :desc "Wrap" :n "w" #'web-mode-element-wrap) + (:prefix "e" + :n "/" #'web-mode-element-close + :n "a" #'web-mode-element-content-select + :n "b" #'web-mode-element-beginning + :n "c" #'web-mode-element-clone + :n "d" #'web-mode-element-child + :n "e" #'web-mode-element-end + :n "f" #'web-mode-element-children-fold-or-unfold + :n "i" #'web-mode-element-insert + :n "k" #'web-mode-element-kill + :n "m" #'web-mode-element-mute-blanks + :n "n" #'web-mode-element-next + :n "p" #'web-mode-element-previous + :n "r" #'web-mode-element-rename + :n "s" #'web-mode-element-select + :n "t" #'web-mode-element-transpose + :n "u" #'web-mode-element-parent + :n "v" #'web-mode-element-vanish + :n "w" #'web-mode-element-wrap) - (:desc "tag" :prefix "t" - :desc "Sort attributes" :n "a" #'web-mode-tag-attributes-sort - :desc "Beginning" :n "b" #'web-mode-tag-beginning - :desc "End" :n "e" #'web-mode-tag-end - :desc "Match" :n "m" #'web-mode-tag-match - :desc "Next" :n "n" #'web-mode-tag-next - :desc "Previous" :n "p" #'web-mode-tag-previous - :desc "Select" :n "s" #'web-mode-tag-select)) + (:prefix "t" + :n "a" #'web-mode-tag-attributes-sort + :n "b" #'web-mode-tag-beginning + :n "e" #'web-mode-tag-end + :n "m" #'web-mode-tag-match + :n "n" #'web-mode-tag-next + :n "p" #'web-mode-tag-previous + :n "s" #'web-mode-tag-select)) "M-/" #'web-mode-comment-or-uncomment :i "SPC" #'self-insert-command From 5735a994e02a3215051f3cc784dc885681acf948 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sun, 7 Oct 2018 21:50:46 -0400 Subject: [PATCH 3305/4235] Do not display debugger or inspector buffers in a popup window. --- modules/lang/common-lisp/config.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 943bcb001..c844bc6e1 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -7,10 +7,12 @@ (set-popup-rules! '(("^\\*sly-mrepl" :vslot 2 :quit nil :ttl nil) - ("^\\*sly-db" :vslot 3 :quit nil :ttl nil) - ("^\\*sly-compilation" :vslot 4 :ttl nil) - ("^\\*sly-inspector" :vslot 5 :ttl nil) - ("^\\*sly-traces" :vslot 6 :ttl nil))) + ("^\\*sly-compilation" :vslot 3 :ttl nil) + ("^\\*sly-traces" :vslot 4 :ttl nil))) + + ;; Do not display debugger or inspector buffers in a popup window. + ;; These buffers are meant to be displayed with sufficient vertical space. + (set-popup-rule! "^\\*sly-\\(db\\|inspector\\)" :ignore t) (set-repl-handler! 'lisp-mode #'sly-mrepl) (set-eval-handler! 'lisp-mode #'sly-eval-region) From 215ef4595cb676182c256b71c17369fc21712563 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sun, 7 Oct 2018 22:20:18 -0400 Subject: [PATCH 3306/4235] Added cider config and key bindings --- modules/lang/clojure/config.el | 60 +++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index d72f4c8eb..f9b4e31b0 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -17,21 +17,65 @@ :definition #'cider-browse-ns-find-at-point :documentation #'cider-browse-ns-doc-at-point) :config - (setq nrepl-hide-special-buffers t + (setq nrepl-log-messages nil + nrepl-hide-special-buffers t + cider-font-lock-dynamically '(macro core function var) + cider-overlays-use-font-lock t + cider-prompt-for-symbol nil + cider-repl-display-help-banner nil + cider-repl-pop-to-buffer-on-connect t + cider-repl-use-pretty-printing t + cider-repl-wrap-history nil + cider-repl-history-display-duplicates nil cider-stacktrace-default-filters '(tooling dup) - cider-prompt-save-file-on-load nil cider-repl-use-clojure-font-lock t) + ;; TODO: Add mode-local labels when general support is in. (map! :map cider-mode-map :localleader :n "'" #'cider-jack-in :n "\"" #'cider-jack-in-clojurescript - :n "B" #'cider-switch-to-repl-buffer - :n "n" #'cider-repl-set-ns - :n "j" #'cider-find-var - :n "h" #'cider-doc - :n "c" #'cider-repl-clear-buffer - :n "p" #'cider-eval-sexp-at-point) + ;; eval + (:prefix "e" + :n "d" #'cider-eval-defun-at-point + :n "D" #'cider-insert-defun-in-repl + :n "e" #'cider-eval-last-sexp + :n "E" #'cider-insert-last-sexp-in-repl + :n "r" #'cider-eval-region + :n "R" #'cider-insert-region-in-repl + :n "u" #'cider-undef) + ;; go/jump + (:prefix "g" + :n "b" #'cider-pop-back + :n "g" #'cider-find-var + :n "n" #'cider-find-ns) + ;; help + (:prefix "h" + :n "n" 'cider-find-ns + :n "a" 'cider-apropos + :n "d" 'cider-doc + :n "g" 'cider-grimoire-web + :n "j" 'cider-javadoc) + ;; inspect + (:prefix "i" + :n "i" 'cider-inspect + :n "r" 'cider-inspect-last-result) + ;; macro + (:prefix "m" + :n "e" 'cider-macroexpand-1 + :n "E" 'cider-macroexpand-al) + ;; namespace + (:prefix "n" + :n "n" 'cider-browse-ns + :n "N" 'cider-browse-ns-all) + ;; repl + (:prefix "r" + :n "n" 'cider-repl-set-ns + :n "q" 'cider-quit + :n "r" 'cider-refresh + :n "R" 'cider-restart + :n "B" #'cider-switch-to-repl-buffer + :n "c" #'cider-repl-clear-buffer)) (when (featurep! :feature evil +everywhere) (add-hook 'cider-repl-mode-hook #'evil-normalize-keymaps))) From b4f0d60894df4881d5b76a26fa172424a3c777bd Mon Sep 17 00:00:00 2001 From: Zaiste Date: Mon, 8 Oct 2018 18:37:13 +0200 Subject: [PATCH 3307/4235] fix: allow deadgreap folding in normal mode --- modules/feature/evil/autoload/folds.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/feature/evil/autoload/folds.el b/modules/feature/evil/autoload/folds.el index 2de7bc0c5..cbbf53009 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/feature/evil/autoload/folds.el @@ -164,6 +164,8 @@ Otherwise, jump to the matching delimiter with `evilmi-jump-items'." (call-interactively (cond ((derived-mode-p 'magit-mode) #'magit-section-toggle) + ((derived-mode-p 'deadgrep-mode) + #'deadgrep-toggle-file-results) ((+evil-from-eol (invisible-p (point))) #'+evil/fold-toggle) (#'evilmi-jump-items))))) From b59a27a1602246112324a9f5725f94f51a6f14c7 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 10 Oct 2018 17:36:25 +0200 Subject: [PATCH 3308/4235] Built-in capture templates add a link to the file from where capture was initiated --- modules/lang/org/+capture.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 03988510e..c9cacae3a 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -31,23 +31,23 @@ It is used in Doom's default `org-capture-templates'.") (defvar org-capture-templates '(("t" "Personal todo" entry (file+headline +org-capture-todo-file "Inbox") - "* [ ] %?\n%i" :prepend t :kill-buffer t) + "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) ("n" "Personal notes" entry (file+headline +org-capture-notes-file "Inbox") - "* %u %?\n%i" :prepend t :kill-buffer t) + "* %u %?\n%i\n%a" :prepend t :kill-buffer t) ;; Will use {project-root}/{todo,notes,changelog}.org, unless a ;; {todo,notes,changelog}.org file is found in a parent directory. ("p" "Templates for projects") ("pt" "Project todo" entry ; {project-root}/todo.org (file+headline +org-capture-project-todo-file "Inbox") - "* [ ] %?\n%i" :prepend t :kill-buffer t) + "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) ("pn" "Project notes" entry ; {project-root}/notes.org (file+headline +org-capture-project-notes-file "Inbox") - "* [ ] %?\n%i" :prepend t :kill-buffer t) + "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) ("pc" "Project changelog" entry ; {project-root}/changelog.org (file+headline +org-capture-project-notes-file "Unreleased") - "* [ ] %?\n%i" :prepend t :kill-buffer t))) + "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t))) (defvar org-default-notes-file nil) ; defined in org.el From 251e9c02446572e8f837b7a4c4c611f6a15d0393 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Wed, 10 Oct 2018 22:00:30 +0200 Subject: [PATCH 3309/4235] When :tools pdf is enabled, open org links to pdfs with pdf-view-mode --- modules/lang/org/config.el | 6 ++++++ modules/lang/org/packages.el | 3 +++ 2 files changed, 9 insertions(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index eb98fe121..5b0504563 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -52,6 +52,12 @@ :after org-agenda :config (evil-org-agenda-set-keys))) +(def-package! org-pdfview + :when (featurep! :tools pdf) + :config + (delete '("\\.pdf\\'" . default) org-file-apps) + (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (file link) (org-pdfview-open link)))) ;; org links to pdf files are opened in pdf-view-mode + (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (file link) (org-pdfview-open link))))) ;; support for links to specific pages ;; ;; Bootstrap diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 2bb2260fa..c3d5abedd 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -11,6 +11,9 @@ (when (featurep! :feature evil) (package! evil-org)) +(when (featurep! :tools pdf) + (package! org-pdfview)) + (when (featurep! +attach) (package! org-download)) From 623195e312ef5009b8eaec7134d2b01749eeb280 Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Thu, 11 Oct 2018 10:41:39 +0200 Subject: [PATCH 3310/4235] Checkboxes -> TODOs --- modules/lang/org/+capture.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index c9cacae3a..67a76d182 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -31,7 +31,7 @@ It is used in Doom's default `org-capture-templates'.") (defvar org-capture-templates '(("t" "Personal todo" entry (file+headline +org-capture-todo-file "Inbox") - "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) ("n" "Personal notes" entry (file+headline +org-capture-notes-file "Inbox") "* %u %?\n%i\n%a" :prepend t :kill-buffer t) @@ -41,13 +41,13 @@ It is used in Doom's default `org-capture-templates'.") ("p" "Templates for projects") ("pt" "Project todo" entry ; {project-root}/todo.org (file+headline +org-capture-project-todo-file "Inbox") - "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) ("pn" "Project notes" entry ; {project-root}/notes.org (file+headline +org-capture-project-notes-file "Inbox") - "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) ("pc" "Project changelog" entry ; {project-root}/changelog.org (file+headline +org-capture-project-notes-file "Unreleased") - "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t))) + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t))) (defvar org-default-notes-file nil) ; defined in org.el From 9fd5b7d0ed89ccda188ea4bc5dcdb7ac05c13040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Thu, 11 Oct 2018 17:19:30 +0200 Subject: [PATCH 3311/4235] Added terraform mode --- modules/tools/terraform/packages.el | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 modules/tools/terraform/packages.el diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el new file mode 100644 index 000000000..2dd8166a7 --- /dev/null +++ b/modules/tools/terraform/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/terraform/packages.el + + +(package! terraform-mode) From 73f99a1a269f14421b2508d88eeb164cc8446eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Thu, 11 Oct 2018 17:32:54 +0200 Subject: [PATCH 3312/4235] Added keybinds --- modules/tools/terraform/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 modules/tools/terraform/config.el diff --git a/modules/tools/terraform/config.el b/modules/tools/terraform/config.el new file mode 100644 index 000000000..2739e6f90 --- /dev/null +++ b/modules/tools/terraform/config.el @@ -0,0 +1,8 @@ +;;; tools/terraform/config.el -*- lexical-binding: t; -*- + +(after! terraform-mode + (map! :map terraform-mode-map + :localleader + :n "a" (λ! (compile "terraform apply")) + :n "i" (λ! (compile "terraform init")) + :n "p" (λ! (compile "terraform plan")))) From 765ca10a92238d69dd36bd24e6d12b0024d89910 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Oct 2018 16:06:25 -0400 Subject: [PATCH 3313/4235] Fix set-pretty-symbols! with multiple modes (set-pretty-symbols! '(c-mode c++-mode objc-mode) RULES*) This fixes a logic bug that prevented RULES from applying to any but the first mode in the list (e.g. only c-mode will be affected). --- modules/ui/pretty-code/autoload.el | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 22bb3536b..7d8ef4614 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -88,19 +88,18 @@ Pretty symbols can be unset for emacs-lisp-mode with: (set-pretty-symbols! 'emacs-lisp-mode nil)" (declare (indent defun)) - (dolist (mode (doom-enlist modes)) - (if (null (car-safe rest)) - (delq (assq mode +pretty-code-symbols-alist) - +pretty-code-symbols-alist) - (let (results merge key) - (while rest - (setq key (pop rest)) - (pcase key - (:merge (setq merge (pop rest))) - (:alist (setq results (append (pop rest) results))) - (_ - (when-let* ((char (plist-get +pretty-code-symbols key))) - (push (cons (pop rest) char) results))))) + (if (null (car-safe rest)) + (delq (assq mode +pretty-code-symbols-alist) + +pretty-code-symbols-alist) + (let (results merge key) + (while rest + (pcase (setq key (pop rest)) + (:merge (setq merge (pop rest))) + (:alist (setq results (append (pop rest) results))) + (_ + (when-let* ((char (plist-get +pretty-code-symbols key))) + (push (cons (pop rest) char) results))))) + (dolist (mode (doom-enlist modes)) (unless merge (delq (assq mode +pretty-code-symbols-alist) +pretty-code-symbols-alist)) From 0ebf526e018e25c8ff2f17d367c2233a923ad8d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Oct 2018 14:07:25 -0400 Subject: [PATCH 3314/4235] Fix doom/info omitting first module in each category Discovered in #941 --- core/autoload/debug.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index cfe956e55..f4676ac9a 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -50,7 +50,9 @@ ready to be pasted in a bug report on github." (or (cl-loop with cat = nil for key being the hash-keys of doom-modules if (or (not cat) (not (eq cat (car key)))) - do (setq cat (car key)) and collect cat + do (setq cat (car key)) + and collect cat + and collect (cdr key) else collect (let ((flags (doom-module-get cat (cdr key) :flags))) (if flags From 752b92570dac0c372889299fc5a253b5d35a493a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Oct 2018 14:11:37 -0400 Subject: [PATCH 3315/4235] lang/latex: defconst -> defvar #955 Allow +latex-viewers to be set sooner. --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index aeaebf900..b6dbab64a 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -11,7 +11,7 @@ enabling unicode symbols in math regions. This requires the unicode-math latex package to be installed.") -(defconst +latex-viewers `(skim zathura okular pdf-tools) +(defvar +latex-viewers `(skim zathura okular pdf-tools) "A list of enabled latex viewers to use, in this order. If they don't exist, they will be ignored. Recognized viewers are skim, zathura, okular and pdf-tools. From ce6e34aff005ceb4ddb802cbadbfd1be3563a9c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 13 Oct 2018 13:26:59 -0400 Subject: [PATCH 3316/4235] completion/ivy: fix +helm/grep* commands They weren't being defined, since grep is not in +ivy-project-search-engines. --- modules/completion/ivy/autoload/ivy.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 331b52b42..cac15e279 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -341,7 +341,7 @@ ones." ;;;###autoload (autoload '+ivy/grep "completion/ivy/autoload/ivy") ;;;###autoload (autoload '+ivy/grep-from-cwd "completion/ivy/autoload/ivy") -(dolist (engine (cl-remove-duplicates +ivy-project-search-engines :from-end t)) +(dolist (engine `(,@(cl-remove-duplicates +ivy-project-search-engines :from-end t) grep)) (defalias (intern (format "+ivy/%s" engine)) (lambda (all-files-p &optional query directory) (interactive "P") From 0bb06f052e9c36c45ab4da5b7a6d59099e59b8c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 13 Oct 2018 13:28:13 -0400 Subject: [PATCH 3317/4235] Fix dashboard hiding files opened via emacsclient --- modules/ui/doom-dashboard/config.el | 7 ------- 1 file changed, 7 deletions(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a309d3501..c53a018f6 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -196,8 +196,6 @@ PLIST can have the following properties: (add-hook 'window-size-change-functions #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) (add-hook 'doom-enter-buffer-hook #'+doom-dashboard|reload-on-kill) - (unless (daemonp) - (add-hook 'after-make-frame-functions #'+doom-dashboard|make-frame)) ;; `persp-mode' integration: update `default-directory' when switching (add-hook 'persp-created-functions #'+doom-dashboard|record-project) (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) @@ -220,11 +218,6 @@ If this is the dashboard buffer, reload the dashboard." (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, -whose dimensions may not be fully initialized by the time this is run." - (run-with-timer 0.1 nil #'+doom-dashboard/open frame)) - (defun +doom-dashboard|resize (&rest _) "Recenter the dashboard, and reset its margins and fringes." (let ((windows (get-buffer-window-list (doom-fallback-buffer) nil t))) From e9608ab93921ffae7de57f0ed5f91404bb2b1ea0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Oct 2018 23:59:26 -0400 Subject: [PATCH 3318/4235] doom-project-find-file: unset projectile-project-root Instead of setting it default-directory, which can cause symlink resolution issues. --- core/autoload/projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 6662b9863..bc1c911b0 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -62,7 +62,7 @@ they are absolute." "Fuzzy-find a file under DIR." (without-project-cache! (let* ((default-directory (file-truename dir)) - (projectile-project-root default-directory)) + projectile-project-root) (call-interactively ;; completion modules may remap this command (or (command-remapping #'projectile-find-file) From b1f249afaba498db114419b8a84d851856a3f8a2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 00:14:27 -0400 Subject: [PATCH 3319/4235] lang/org: lazyload & refactor org-pdfview --- modules/lang/org/config.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 5b0504563..aad01f167 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -54,10 +54,15 @@ (def-package! org-pdfview :when (featurep! :tools pdf) - :config - (delete '("\\.pdf\\'" . default) org-file-apps) - (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (file link) (org-pdfview-open link)))) ;; org links to pdf files are opened in pdf-view-mode - (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (file link) (org-pdfview-open link))))) ;; support for links to specific pages + :commands (org-pdfview-open) + :init + (after! org + (delete '("\\.pdf\\'" . default) org-file-apps) + ;; org links to pdf files are opened in pdf-view-mode + (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (_file link) (org-pdfview-open link)))) + ;; support for links to specific pages + (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link)))))) + ;; ;; Bootstrap From 1c847402c43f6d1af0434a842dfa21bac239650a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 00:08:48 -0400 Subject: [PATCH 3320/4235] lang/clojure: fix eldoc support in clojure-mode --- modules/lang/clojure/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index f9b4e31b0..a827aec61 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -16,6 +16,7 @@ (set-lookup-handlers! 'clojure-mode :definition #'cider-browse-ns-find-at-point :documentation #'cider-browse-ns-doc-at-point) + (add-hook 'cider-mode-hook #'eldoc-mode) :config (setq nrepl-log-messages nil nrepl-hide-special-buffers t From 63a5c4239a6f8c7d65272fe3d54f2f581ef633d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 00:49:41 -0400 Subject: [PATCH 3321/4235] lang/javascript: update tide project resolution To match projectile changes upstream. Fixes an error when opening an arbitrary JS file in a non-project root. --- modules/lang/javascript/autoload.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 00bf9d692..260767c10 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -117,4 +117,5 @@ prioritize project-local packages over global ones." (or tide-project-root (or (locate-dominating-file default-directory "tsconfig.json") (locate-dominating-file default-directory "jsconfig.json")) - (doom-project-root))) + (or (doom-project-root) + default-directory))) From 9a3e48d65a7fabb910c0ec81a4d762b1ce62a9d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Mon, 15 Oct 2018 09:12:01 +0200 Subject: [PATCH 3322/4235] added company-terraform --- modules/tools/terraform/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el index 2dd8166a7..52cd47686 100644 --- a/modules/tools/terraform/packages.el +++ b/modules/tools/terraform/packages.el @@ -3,3 +3,4 @@ (package! terraform-mode) +(package! company-terraform) From 6e057d53d80b10a7e170185c411238102065ce8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Mon, 15 Oct 2018 09:19:21 +0200 Subject: [PATCH 3323/4235] autoload company-terraform --- modules/tools/terraform/config.el | 6 ++++++ modules/tools/terraform/packages.el | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/tools/terraform/config.el b/modules/tools/terraform/config.el index 2739e6f90..b13df33ae 100644 --- a/modules/tools/terraform/config.el +++ b/modules/tools/terraform/config.el @@ -6,3 +6,9 @@ :n "a" (λ! (compile "terraform apply")) :n "i" (λ! (compile "terraform init")) :n "p" (λ! (compile "terraform plan")))) + +(def-package! company-terraform + :when (featurep! :completion company) + :after terraform-mode + :config + (set-company-backend! 'terraform-mode 'company-terraform)) diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el index 52cd47686..15e0d18a1 100644 --- a/modules/tools/terraform/packages.el +++ b/modules/tools/terraform/packages.el @@ -3,4 +3,5 @@ (package! terraform-mode) -(package! company-terraform) +(when (featurep! :completion company) + (package! company-terraform)) From 12ea77f93700e0d954d8dee4a02f89f8437b28f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20S=C3=BC=C3=9F?= Date: Mon, 15 Oct 2018 09:26:47 +0200 Subject: [PATCH 3324/4235] Updated to prefered gocode fork (again) --- modules/lang/go/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/go/README.org b/modules/lang/go/README.org index ec42995d3..827d0ce25 100644 --- a/modules/lang/go/README.org +++ b/modules/lang/go/README.org @@ -51,7 +51,7 @@ This module requires a valid ~GOPATH~, and the following Go packages: export GOPATH=~/work/go go get -u github.com/motemen/gore -go get -u github.com/stamblerre/gocode +go get -u github.com/mdempsky/gocode go get -u golang.org/x/tools/cmd/godoc go get -u golang.org/x/tools/cmd/goimports go get -u golang.org/x/tools/cmd/gorename From 7cb1e489dcabf02755bbd69f42d34748cfb6a7dc Mon Sep 17 00:00:00 2001 From: Patrick Elliott Date: Mon, 15 Oct 2018 13:39:24 +0200 Subject: [PATCH 3325/4235] Revert personal TODO back to checkbox in capture template --- modules/lang/org/+capture.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 67a76d182..e665d0b7e 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -31,7 +31,7 @@ It is used in Doom's default `org-capture-templates'.") (defvar org-capture-templates '(("t" "Personal todo" entry (file+headline +org-capture-todo-file "Inbox") - "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) + "* [] %?\n%i\n%a" :prepend t :kill-buffer t) ("n" "Personal notes" entry (file+headline +org-capture-notes-file "Inbox") "* %u %?\n%i\n%a" :prepend t :kill-buffer t) From 064579e33ec1f8b5047be70a4ef9cebc646d46e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Fri, 21 Sep 2018 00:06:12 +0100 Subject: [PATCH 3326/4235] Improve ocaml language support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See README.org. Signed-off-by: Edwin Török --- modules/lang/ocaml/README.org | 79 +++++++++++++++++++++++++++++++++ modules/lang/ocaml/config.el | 80 +++++++++++++++++++++++++++++++--- modules/lang/ocaml/doctor.el | 18 ++++++++ modules/lang/ocaml/packages.el | 27 +++++++++++- 4 files changed, 198 insertions(+), 6 deletions(-) create mode 100644 modules/lang/ocaml/README.org create mode 100644 modules/lang/ocaml/doctor.el diff --git a/modules/lang/ocaml/README.org b/modules/lang/ocaml/README.org new file mode 100644 index 000000000..53fa6db12 --- /dev/null +++ b/modules/lang/ocaml/README.org @@ -0,0 +1,79 @@ +#+TITLE: :lang ocaml + +This module adds [[https://ocaml.org/][OCaml]] support, powered by [[https://github.com/ocaml/tuareg][tuareg-mode]]. + ++ Code completion, look up documentation, and code navigation ([[https://github.com/ocaml/merlin/wiki/emacs-from-scratch][merlin]]) ++ REPL ([[https://github.com/ocaml-community/utop][utop]]) ++ Syntax-checking (~merlin~ with [[https://github.com/flycheck/flycheck-ocaml][flycheck-ocaml]]) ++ Auto-indentation ([[https://github.com/OCamlPro/ocp-indent][ocp-indent]]) ++ Code formatting ([[https://github.com/ocaml-ppx/ocamlformat][ocamlformat]]) ++ Dune file format ([[http://dune.build/][dune]]) + +* Table of Contents :TOC: +- [[Module Flags][Module Flags]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] +- [[Configuration][Configuration]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] + - [[Hacks][Hacks]] + +* Module Flags +This module provides the ~+opam-site-lisp~ flag to compile editor support ~.el~ +files from opam's =site-lisp= directory. +By default all editor plugins are installed from MELPA/GitHub even if the +corresponding =opam= package isn't installed. +If this flag is enabled then you must have all of the packages listed in +=package.el= installed via =opam=. + +To enable this, use: +#+BEGIN_SRC emacs-lisp +(doom! :lang (ocaml +opam-site-lisp)) +#+END_SRC + +* Prerequisites +It is highly recommended to install [[http://opam.ocaml.org/][opam]]. +To get all the features you should also install these ~opam~ packages, however +they are not all required (features should be disabled gracefully when a tool is +missing): +#+BEGIN_SRC shell +opam install merlin utop ocp-indent dune ocamlformat +#+END_SRC + +* Features ++ the following files should have syntax highlighting support: +~.ml{i,p,y,}~, ~.eliom{i,}~, ~jbuild~, ~dune~, ~opam~ ++ =merlin-mode= is activated whenever a =.merlin= file is found (including in a + parent directory) and =ocamlmerlin= executable is present ++ line-based auto-indentation is provided by =ocp-indent= when installed + +* Configuration ++ if =:completion company= is enabled then autocomplete is provided by =merlin= ++ when =:feature syntax-checker= is enabled then =flycheck-ocaml= is activated + to do on-the-fly syntax/type checking via =merlin=, otherwise this is only + done when the file is saved. ++ spell checking is activated in comments if =:feature spellcheck= is actived ++ a REPL is provided if =utop= is installed and =:feature eval= is actived ++ if =:editor format= is enabled, the =ocamlformat= executable is available and + there is an =.ocamlformat= file present then =format-all-buffer= is bound to + =ocamlformat=, otherwise to =ocp-indent= + +Run =make install= to install all packages, and =make doctor= to diagnose missing tools. + +* Appendix +** Commands + | command | key / ex command | description | + |------------------------------+------------------+------------------------------------| + | =merlin-type-enclosing= | =SPC m t= | display type under point | + | =tuareg-find-alternate-file= | =SPC m a= | switch between =.ml= and =.mli= | + | =merlin-locate= | =gd= | lookup definition | + | =merlin-occurences= | =SPC c D= | lookup references | + | =merlin-document= | =K= | lookup documentation | + | =utop= | =SPC o r= | open =utop= as REPL | + | =utop-eval-region= | =SPC c e= | evaluate selected region in =utop= | + +** Hacks ++ =set-pretty-symbols!= is called with the full tuareg prettify symbol list, this + can cause columns to change as certain keywords are shortened (e.g. =fun= + becomes \lambda. ++ =tuareg-opam-update-env= is called the first time =tuareg= is loaded diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 409e0dbef..5a7c5c66c 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -1,13 +1,83 @@ ;;; lang/ocaml/config.el -*- lexical-binding: t; -*- -(def-package! tuareg - :mode ("\\.ml[4ilpy]?\\'" . tuareg-mode)) +;; def-project-mode!/associate! doesn't work when a +;; package is lazy loaded, and everything is compiled +(def-package! tuareg + :defer t ;; modes set by autoload + :config + ;; tuareg-mode has the prettify symbols itself + (set-pretty-symbols! 'tuareg-mode :alist + (append tuareg-prettify-symbols-basic-alist + tuareg-prettify-symbols-extra-alist)) + (setq tuareg-prettify-symbols-full t) + ;; Use opam to set environment + (setq tuareg-opam-insinuate t) + (tuareg-opam-update-env (tuareg-opam-current-compiler)) + ;; Spell-check comments + (when (featurep! :feature spellcheck) + (add-hook 'tuareg-mode-hook #'flyspell-prog-mode))) (def-package! merlin :after tuareg - :hook (tuareg-mode . merlin-mode) + :init + (set-lookup-handlers! 'tuareg-mode + :definition #'merlin-locate + :references #'merlin-occurrences + :documentation #'merlin-document) + (defun +ocaml|init-merlin () + (when (and (projectile-locate-dominating-file default-directory ".merlin") + (executable-find "ocamlmerlin")) + (merlin-mode))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-merlin) + :config + (map! :map tuareg-mode-map + :localleader + :n "t" #'merlin-type-enclosing + :n "a" #'tuareg-find-alternate-file) (set-company-backend! 'tuareg-mode 'merlin-company-backend) - (after! company - (remove-hook 'company-backends 'merlin-company-backend))) + (setq merlin-completion-with-doc t)) + +(def-package! flycheck-ocaml + :when (featurep! :feature syntax-checker) + :after merlin + :config + ;; Disable Merlin's own error checking + (setq merlin-error-after-save nil) + ;; Enable Flycheck checker + (flycheck-ocaml-setup)) + +(def-package! ocp-indent + ;; must be careful to always defer this, it has autoloads that adds hooks + ;; which we do not want if the executable can't be found + :defer t + :init + (defun +ocaml|init-ocp-indent () + (when (executable-find "ocp-indent") + (ocp-setup-indent))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-ocp-indent)) + +(def-package! utop + :defer t ;; loaded by hook below + :when (featurep! :feature eval) + :init + (set-repl-handler! 'tuareg-mode #'utop) + (set-eval-handler! 'tuareg-mode #'utop-eval-region) + (defun +ocaml|init-utop () + (when (executable-find "utop") + (utop-minor-mode))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-utop)) + +(def-package! ocamlformat + :after tuareg + :commands (ocamlformat) + :init + (set-formatter! 'ocamlformat #'ocamlformat + :modes '(caml-mode tuareg-mode)) + (defun +ocaml|init-ocamlformat () + (setq +format-with 'ocp-indent) + (when (and (executable-find "ocamlformat") + (locate-dominating-file default-directory ".ocamlformat")) + (setq +format-with 'ocamlformat))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-ocamlformat)) diff --git a/modules/lang/ocaml/doctor.el b/modules/lang/ocaml/doctor.el new file mode 100644 index 000000000..0b3427f41 --- /dev/null +++ b/modules/lang/ocaml/doctor.el @@ -0,0 +1,18 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; lang/ocaml/doctor.el + +(unless (executable-find "ocamlmerlin") + (warn! "Couldn't find ocamlmerlin. Lookup, completion and syntax checking won't work.")) + +;; Tuareg can still indent +(unless (executable-find "ocp-indent") + (warn! "Couldn't find ocp-indent. Auto-indentation will be less precise.")) + +(when (featurep! :feature eval) + (unless (executable-find "utop") + (warn! "Couldn't find utop. REPL won't be available"))) + +(unless (executable-find "dune") + (warn! "Couldn't find dune. Won't be able to highlight dune files")) + +;; ocamlformat is optional, don't warn about it diff --git a/modules/lang/ocaml/packages.el b/modules/lang/ocaml/packages.el index 3da213bfd..2d6931013 100644 --- a/modules/lang/ocaml/packages.el +++ b/modules/lang/ocaml/packages.el @@ -1,5 +1,30 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/ocaml/packages.el +(when (featurep! +opam-site-lisp) + (defvar +ocaml-elisp-dir + (when (executable-find "opam") + (let ((opam-share (ignore-errors (car (process-lines "opam" "config" "var" "share" "--safe"))))) + (when (and opam-share (file-directory-p opam-share)) + (expand-file-name "emacs/site-lisp" opam-share))))) + + (defmacro localpackage! (name) + `(package! ,name :recipe (:fetcher file :path ,+ocaml-elisp-dir))) + + (localpackage! opam-site-lisp)) + (package! tuareg) -(package! merlin) + +(when (featurep! :feature syntax-checker) + (package! flycheck-ocaml)) + +(unless (featurep! +opam-site-lisp) + (package! merlin) + (package! ocp-indent) + (when (featurep! :feature eval) + (package! utop)) + (when (featurep! :editor format) + ;; by default quelpa generated a version 0pre0.20180929.192844, which got parsed into (0 -1 0 ...), which when compared with version nil (0) + ;; in package-installed-p always yielded false + (package! ocamlformat :recipe (:fetcher github :repo "ocaml-ppx/ocamlformat" :files ("emacs/*.el")))) + (package! dune :recipe (:fetcher github :repo "ocaml/dune" :files ("editor-integration/emacs/*.el")))) From cade77e4a9de2af5331f35663f6976c999c2af96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 16:14:37 -0400 Subject: [PATCH 3327/4235] lang/clojure: bind cider-jack-in to clojure-mode cider-quit kills cider-mode, rendering cider-mode-map keybinds unavailable, so these commands have been moved to clojure-mode-map, to ensure they're always available. Reported by @mfiano --- modules/lang/clojure/config.el | 91 +++++++++++++++++----------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index a827aec61..d09ec8afc 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -32,51 +32,52 @@ cider-repl-use-clojure-font-lock t) ;; TODO: Add mode-local labels when general support is in. - (map! :map cider-mode-map - :localleader - :n "'" #'cider-jack-in - :n "\"" #'cider-jack-in-clojurescript - ;; eval - (:prefix "e" - :n "d" #'cider-eval-defun-at-point - :n "D" #'cider-insert-defun-in-repl - :n "e" #'cider-eval-last-sexp - :n "E" #'cider-insert-last-sexp-in-repl - :n "r" #'cider-eval-region - :n "R" #'cider-insert-region-in-repl - :n "u" #'cider-undef) - ;; go/jump - (:prefix "g" - :n "b" #'cider-pop-back - :n "g" #'cider-find-var - :n "n" #'cider-find-ns) - ;; help - (:prefix "h" - :n "n" 'cider-find-ns - :n "a" 'cider-apropos - :n "d" 'cider-doc - :n "g" 'cider-grimoire-web - :n "j" 'cider-javadoc) - ;; inspect - (:prefix "i" - :n "i" 'cider-inspect - :n "r" 'cider-inspect-last-result) - ;; macro - (:prefix "m" - :n "e" 'cider-macroexpand-1 - :n "E" 'cider-macroexpand-al) - ;; namespace - (:prefix "n" - :n "n" 'cider-browse-ns - :n "N" 'cider-browse-ns-all) - ;; repl - (:prefix "r" - :n "n" 'cider-repl-set-ns - :n "q" 'cider-quit - :n "r" 'cider-refresh - :n "R" 'cider-restart - :n "B" #'cider-switch-to-repl-buffer - :n "c" #'cider-repl-clear-buffer)) + (map! :localleader + (:map clojure-mode-map + :n "'" #'cider-jack-in + :n "\"" #'cider-jack-in-clojurescript) + (:map cider-mode-map + ;; eval + (:prefix "e" + :n "d" #'cider-eval-defun-at-point + :n "D" #'cider-insert-defun-in-repl + :n "e" #'cider-eval-last-sexp + :n "E" #'cider-insert-last-sexp-in-repl + :n "r" #'cider-eval-region + :n "R" #'cider-insert-region-in-repl + :n "u" #'cider-undef) + ;; go/jump + (:prefix "g" + :n "b" #'cider-pop-back + :n "g" #'cider-find-var + :n "n" #'cider-find-ns) + ;; help + (:prefix "h" + :n "n" 'cider-find-ns + :n "a" 'cider-apropos + :n "d" 'cider-doc + :n "g" 'cider-grimoire-web + :n "j" 'cider-javadoc) + ;; inspect + (:prefix "i" + :n "i" 'cider-inspect + :n "r" 'cider-inspect-last-result) + ;; macro + (:prefix "m" + :n "e" 'cider-macroexpand-1 + :n "E" 'cider-macroexpand-al) + ;; namespace + (:prefix "n" + :n "n" 'cider-browse-ns + :n "N" 'cider-browse-ns-all) + ;; repl + (:prefix "r" + :n "n" 'cider-repl-set-ns + :n "q" 'cider-quit + :n "r" 'cider-refresh + :n "R" 'cider-restart + :n "B" #'cider-switch-to-repl-buffer + :n "c" #'cider-repl-clear-buffer))) (when (featurep! :feature evil +everywhere) (add-hook 'cider-repl-mode-hook #'evil-normalize-keymaps))) From db7632b2b62fb65b9f42cdf44b73327b06c73dfa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 16:18:43 -0400 Subject: [PATCH 3328/4235] lang/clojure: persist cider repl history Credit to @mfiano --- modules/lang/clojure/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index d09ec8afc..ff0bcbd0c 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -28,6 +28,7 @@ cider-repl-use-pretty-printing t cider-repl-wrap-history nil cider-repl-history-display-duplicates nil + cider-repl-history-file (concat doom-cache-dir "cider-repl-history") cider-stacktrace-default-filters '(tooling dup) cider-repl-use-clojure-font-lock t) From f2de08d79947149c02f1b4b85c4a31c8ffed89db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 16:21:17 -0400 Subject: [PATCH 3329/4235] lang/common-lisp: move mrepl history file To doom-cache-dir. Credit to @mfiano --- modules/lang/common-lisp/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index c844bc6e1..ab9dd2fdf 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -3,7 +3,8 @@ (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) (after! sly - (setq inferior-lisp-program "sbcl") + (setq inferior-lisp-program "sbcl" + sly-mrepl-history-file-name (concat doom-cache-dir "sly-mrepl-history")) (set-popup-rules! '(("^\\*sly-mrepl" :vslot 2 :quit nil :ttl nil) From 5ad27da2f1d5ead55952dfe8ead5cd46858c84f0 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Mon, 15 Oct 2018 18:43:56 -0400 Subject: [PATCH 3330/4235] lang/clojure: add binding to switch/set namespace Add a local leader keybinding to both switch to the CIDER REPL buffer and set the namespace according to the file buffer. --- modules/lang/clojure/config.el | 39 +++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index ff0bcbd0c..1db4471dc 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -4,6 +4,10 @@ (after! clojure-mode (add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) + (defun +clojure|cider-switch-to-repl-buffer-and-switch-ns () + (interactive) + (cider-switch-to-repl-buffer t)) + (def-package! cider ;; NOTE: if you don't have an org directory set (the dir doesn't exist), ;; cider jack in won't work. @@ -54,30 +58,31 @@ :n "n" #'cider-find-ns) ;; help (:prefix "h" - :n "n" 'cider-find-ns - :n "a" 'cider-apropos - :n "d" 'cider-doc - :n "g" 'cider-grimoire-web - :n "j" 'cider-javadoc) + :n "n" #'cider-find-ns + :n "a" #'cider-apropos + :n "d" #'cider-doc + :n "g" #'cider-grimoire-web + :n "j" #'cider-javadoc) ;; inspect (:prefix "i" - :n "i" 'cider-inspect - :n "r" 'cider-inspect-last-result) + :n "i" #'cider-inspect + :n "r" #'cider-inspect-last-result) ;; macro (:prefix "m" - :n "e" 'cider-macroexpand-1 - :n "E" 'cider-macroexpand-al) + :n "e" #'cider-macroexpand-1 + :n "E" #'cider-macroexpand-al) ;; namespace (:prefix "n" - :n "n" 'cider-browse-ns - :n "N" 'cider-browse-ns-all) + :n "n" #'cider-browse-ns + :n "N" #'cider-browse-ns-all) ;; repl (:prefix "r" - :n "n" 'cider-repl-set-ns - :n "q" 'cider-quit - :n "r" 'cider-refresh - :n "R" 'cider-restart - :n "B" #'cider-switch-to-repl-buffer + :n "n" #'cider-repl-set-ns + :n "q" #'cider-quit + :n "r" #'cider-refresh + :n "R" #'cider-restart + :n "b" #'cider-switch-to-repl-buffer + :n "B" #'+clojure|cider-switch-to-repl-buffer-and-switch-ns :n "c" #'cider-repl-clear-buffer))) (when (featurep! :feature evil +everywhere) (add-hook 'cider-repl-mode-hook #'evil-normalize-keymaps))) @@ -87,7 +92,7 @@ :config (map! :map clj-refactor-map :localleader - :n "r" #'hydra-cljr-help-menu/body)) + :n "R" #'hydra-cljr-help-menu/body)) (def-package! flycheck-joker :when (featurep! :feature syntax-checker) From 53cf2b4e2bbeaf1ef21f7c45789d4c04338488f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 22:44:39 -0400 Subject: [PATCH 3331/4235] Restore space in personal todo checkbox --- modules/lang/org/+capture.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index e665d0b7e..3b8edc8c7 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -31,7 +31,7 @@ It is used in Doom's default `org-capture-templates'.") (defvar org-capture-templates '(("t" "Personal todo" entry (file+headline +org-capture-todo-file "Inbox") - "* [] %?\n%i\n%a" :prepend t :kill-buffer t) + "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) ("n" "Personal notes" entry (file+headline +org-capture-notes-file "Inbox") "* %u %?\n%i\n%a" :prepend t :kill-buffer t) From bd1f2ec4d60d851d208f70947475679efe092d52 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Mon, 15 Oct 2018 23:08:59 -0400 Subject: [PATCH 3332/4235] lang/clojure: More changes - Add a popup rule for the history buffer, since we want to see the REPL change while it's open - Add hooks to enable company fuzzy completion - Add more cider configuration options - Configure Shift-Return to insert a newline and indent in the REPL without submitting the result - Bind normal state keybindings for the CIDER history buffer --- modules/lang/clojure/config.el | 40 +++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 1db4471dc..92a66f32e 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -4,6 +4,11 @@ (after! clojure-mode (add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) + (set-popup-rules! + '(("^\\*cider-error*" :ignore t) + ("^\\*cider-repl" :quit nil :select nil) + ("^\\*cider-repl-history" :vslot 2 :ttl nil))) + (defun +clojure|cider-switch-to-repl-buffer-and-switch-ns () (interactive) (cider-switch-to-repl-buffer t)) @@ -14,27 +19,46 @@ :commands (cider-jack-in cider-jack-in-clojurescript) :hook (clojure-mode . cider-mode) :init - (set-popup-rule! "^\\*cider-repl" :quit nil :select nil) (set-repl-handler! 'clojure-mode #'+clojure/repl) (set-eval-handler! 'clojure-mode #'cider-eval-region) (set-lookup-handlers! 'clojure-mode :definition #'cider-browse-ns-find-at-point :documentation #'cider-browse-ns-doc-at-point) + (add-hook 'cider-repl-mode-hook #'cider-company-enable-fuzzy-completion) + (add-hook 'cider-mode-hook #'cider-company-enable-fuzzy-completion) (add-hook 'cider-mode-hook #'eldoc-mode) :config - (setq nrepl-log-messages nil - nrepl-hide-special-buffers t + (setq nrepl-hide-special-buffers t + nrepl-log-messages nil cider-font-lock-dynamically '(macro core function var) cider-overlays-use-font-lock t cider-prompt-for-symbol nil cider-repl-display-help-banner nil - cider-repl-pop-to-buffer-on-connect t + cider-repl-history-display-duplicates nil + cider-repl-history-display-style 'one-line + cider-repl-history-file (concat doom-cache-dir "cider-repl-history") + cider-repl-history-highlight-current-entry t + cider-repl-history-quit-action 'delete-and-restore + cider-repl-history-highlight-inserted-item t + cider-repl-history-size 1000 + cider-repl-pop-to-buffer-on-connect 'display-only + cider-repl-result-prefix ";; => " + cider-repl-print-length 100 + cider-repl-use-clojure-font-lock t cider-repl-use-pretty-printing t cider-repl-wrap-history nil - cider-repl-history-display-duplicates nil - cider-repl-history-file (concat doom-cache-dir "cider-repl-history") - cider-stacktrace-default-filters '(tooling dup) - cider-repl-use-clojure-font-lock t) + cider-stacktrace-default-filters '(tooling dup)) + + (when (featurep! :feature evil +everywhere) + (evil-define-key 'insert cider-repl-mode-map + [S-return] #'cider-repl-newline-and-indent) + (evil-define-key 'normal cider-repl-history-mode-map + "q" 'cider-repl-history-quit + [return] 'cider-repl-history-insert-and-quit + "l" 'cider-repl-history-occur + "s" 'cider-repl-history-search-forward + "r" 'cider-repl-history-search-backward + "U" 'cider-repl-history-undo-other-window)) ;; TODO: Add mode-local labels when general support is in. (map! :localleader From 90140f1ab51c4cb866c72aad0473017ed59d3da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tuomo=20Syv=C3=A4nper=C3=A4?= Date: Tue, 16 Oct 2018 06:22:34 +0300 Subject: [PATCH 3333/4235] Add vala-mode --- init.example.el | 3 ++- modules/lang/vala/packages.el | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 modules/lang/vala/packages.el diff --git a/init.example.el b/init.example.el index d1def0b8b..69aa030f5 100644 --- a/init.example.el +++ b/init.example.el @@ -126,8 +126,9 @@ ;;scala ; java, but good (sh +fish) ; she sells (ba|z|fi)sh shells on the C xor ;;solidity ; do you need a blockchain? No. - ;;swift ; who asked for emoji variables? + ;;swtft ; who asked for emoji variables? ;;web ; the tubes + ;;vala ; GObjective-C ;; Applications are complex and opinionated modules that transform Emacs ;; toward a specific purpose. They may have additional dependencies and diff --git a/modules/lang/vala/packages.el b/modules/lang/vala/packages.el new file mode 100644 index 000000000..9bd41db12 --- /dev/null +++ b/modules/lang/vala/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/vala/packages.el + +(package! vala-mode) From a25257d8da396b3a85010c6439214a606405fc20 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 01:55:38 -0400 Subject: [PATCH 3334/4235] lang/clojure: remove fuzzy completion for company I prefer that fuzzy search is disabled by default, for consistency and performance. Fuzzy search tends to be much significantly slower, and no other company backend offers a fuzzy search mechanism (or should). Fuzzy search is usually gated behind variables and flags, but since opting in here is a trivial one-liner, I don't think it needs one. --- modules/lang/clojure/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 92a66f32e..0bb670701 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -24,8 +24,6 @@ (set-lookup-handlers! 'clojure-mode :definition #'cider-browse-ns-find-at-point :documentation #'cider-browse-ns-doc-at-point) - (add-hook 'cider-repl-mode-hook #'cider-company-enable-fuzzy-completion) - (add-hook 'cider-mode-hook #'cider-company-enable-fuzzy-completion) (add-hook 'cider-mode-hook #'eldoc-mode) :config (setq nrepl-hide-special-buffers t From 4fc7de442e8939d4cd8fa4a6a03c24e00b794871 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:03:23 -0400 Subject: [PATCH 3335/4235] lang/clojure: group & update evil integration Also removes evil-normalize-keymaps on cider-repl-mode-hook, because cider-repl-mode isn't a minor mode. The purpose of evil-normalize-keymaps is to ensure evil is aware of evil keybinds in minor-mode keymaps when it is first enabled. --- modules/lang/clojure/config.el | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 0bb670701..a6b633210 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -47,17 +47,6 @@ cider-repl-wrap-history nil cider-stacktrace-default-filters '(tooling dup)) - (when (featurep! :feature evil +everywhere) - (evil-define-key 'insert cider-repl-mode-map - [S-return] #'cider-repl-newline-and-indent) - (evil-define-key 'normal cider-repl-history-mode-map - "q" 'cider-repl-history-quit - [return] 'cider-repl-history-insert-and-quit - "l" 'cider-repl-history-occur - "s" 'cider-repl-history-search-forward - "r" 'cider-repl-history-search-backward - "U" 'cider-repl-history-undo-other-window)) - ;; TODO: Add mode-local labels when general support is in. (map! :localleader (:map clojure-mode-map @@ -106,8 +95,17 @@ :n "b" #'cider-switch-to-repl-buffer :n "B" #'+clojure|cider-switch-to-repl-buffer-and-switch-ns :n "c" #'cider-repl-clear-buffer))) + (when (featurep! :feature evil +everywhere) - (add-hook 'cider-repl-mode-hook #'evil-normalize-keymaps))) + (evil-define-key 'insert cider-repl-mode-map + [S-return] #'cider-repl-newline-and-indent) + (evil-define-key 'normal cider-repl-history-mode-map + "q" 'cider-repl-history-quit + [return] 'cider-repl-history-insert-and-quit + "l" 'cider-repl-history-occur + "s" 'cider-repl-history-search-forward + "r" 'cider-repl-history-search-backward + "U" 'cider-repl-history-undo-other-window))) (def-package! clj-refactor :hook (clojure-mode . clj-refactor-mode) From bef0f39535d59f10b7729dddb729c7f882af94d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:07:00 -0400 Subject: [PATCH 3336/4235] lang/clojure: conform command to naming convention Interactive commands in doom follow the `+module/name` naming convention. `+module|name` is used for hook functions. --- modules/lang/clojure/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index a6b633210..9409b2fe2 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -9,7 +9,7 @@ ("^\\*cider-repl" :quit nil :select nil) ("^\\*cider-repl-history" :vslot 2 :ttl nil))) - (defun +clojure|cider-switch-to-repl-buffer-and-switch-ns () + (defun +clojure/cider-switch-to-repl-buffer-and-switch-ns () (interactive) (cider-switch-to-repl-buffer t)) @@ -93,7 +93,7 @@ :n "r" #'cider-refresh :n "R" #'cider-restart :n "b" #'cider-switch-to-repl-buffer - :n "B" #'+clojure|cider-switch-to-repl-buffer-and-switch-ns + :n "B" #'+clojure/cider-switch-to-repl-buffer-and-switch-ns :n "c" #'cider-repl-clear-buffer))) (when (featurep! :feature evil +everywhere) From 794b1a94bf4acc04f8c3f2303f21efa5155221cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Oct 2018 23:17:29 -0400 Subject: [PATCH 3337/4235] tools/terraform: use map!'s :after --- modules/tools/terraform/config.el | 13 +++++++------ modules/tools/terraform/packages.el | 1 - 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/tools/terraform/config.el b/modules/tools/terraform/config.el index b13df33ae..e4523ca2e 100644 --- a/modules/tools/terraform/config.el +++ b/modules/tools/terraform/config.el @@ -1,11 +1,12 @@ ;;; tools/terraform/config.el -*- lexical-binding: t; -*- -(after! terraform-mode - (map! :map terraform-mode-map - :localleader - :n "a" (λ! (compile "terraform apply")) - :n "i" (λ! (compile "terraform init")) - :n "p" (λ! (compile "terraform plan")))) +(map! :after terraform-mode + :map terraform-mode-map + :localleader + :n "a" (λ! (compile "terraform apply")) + :n "i" (λ! (compile "terraform init")) + :n "p" (λ! (compile "terraform plan"))) + (def-package! company-terraform :when (featurep! :completion company) diff --git a/modules/tools/terraform/packages.el b/modules/tools/terraform/packages.el index 15e0d18a1..9c9217ad1 100644 --- a/modules/tools/terraform/packages.el +++ b/modules/tools/terraform/packages.el @@ -1,7 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/terraform/packages.el - (package! terraform-mode) (when (featurep! :completion company) (package! company-terraform)) From 036a645058ef5c3284c8e3db7127e5040fbf930f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:09:24 -0400 Subject: [PATCH 3338/4235] lang/clojure: move command to autoload.el --- modules/lang/clojure/autoload.el | 6 ++++++ modules/lang/clojure/config.el | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/lang/clojure/autoload.el b/modules/lang/clojure/autoload.el index 2b2ad3ec1..68f93e3ef 100644 --- a/modules/lang/clojure/autoload.el +++ b/modules/lang/clojure/autoload.el @@ -6,3 +6,9 @@ (interactive) (cider-jack-in) (current-buffer)) + +;;;###autoload +(defun +clojure/cider-switch-to-repl-buffer-and-switch-ns () + "TODO" + (interactive) + (cider-switch-to-repl-buffer t)) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 9409b2fe2..c73514d42 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -9,10 +9,6 @@ ("^\\*cider-repl" :quit nil :select nil) ("^\\*cider-repl-history" :vslot 2 :ttl nil))) - (defun +clojure/cider-switch-to-repl-buffer-and-switch-ns () - (interactive) - (cider-switch-to-repl-buffer t)) - (def-package! cider ;; NOTE: if you don't have an org directory set (the dir doesn't exist), ;; cider jack in won't work. From cb33d96bfa91046be4cdc6cf906ddd4e48417de4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:14:53 -0400 Subject: [PATCH 3339/4235] lang/clojure: fix +clojure/repl cider-jack-in takes one argument. Reported by @mfiano --- modules/lang/clojure/autoload.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/clojure/autoload.el b/modules/lang/clojure/autoload.el index 68f93e3ef..d555e26ff 100644 --- a/modules/lang/clojure/autoload.el +++ b/modules/lang/clojure/autoload.el @@ -1,10 +1,10 @@ ;;; lang/clojure/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +clojure/repl () +(defun +clojure/repl (&optional arg) "Open a Cider REPL and return the buffer." - (interactive) - (cider-jack-in) + (interactive "P") + (cider-jack-in arg) (current-buffer)) ;;;###autoload From 3c77b0d2600ce42f67e917f4e4a12fbdd7593222 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:15:25 -0400 Subject: [PATCH 3340/4235] lang/common-lisp: add settings & minor refactor Thanks to @mfiano --- modules/lang/common-lisp/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index ab9dd2fdf..4bb9ec9fd 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -1,10 +1,13 @@ ;;; lang/common-lisp/config.el -*- lexical-binding: t; -*- +(defvar inferior-lisp-program "sbcl") (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) + (after! sly - (setq inferior-lisp-program "sbcl" - sly-mrepl-history-file-name (concat doom-cache-dir "sly-mrepl-history")) + (setq sly-mrepl-history-file-name (concat doom-cache-dir "sly-mrepl-history") + sly-kill-without-query-p t + sly-net-coding-system 'utf-8-unix) (set-popup-rules! '(("^\\*sly-mrepl" :vslot 2 :quit nil :ttl nil) From 4e81605463c9bb88201b527b1db23d2f27cb1278 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:17:53 -0400 Subject: [PATCH 3341/4235] ui/doom: set load-theme hooks sooner Allows users to remove them without after! blocks. --- modules/ui/doom/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index b2e792d47..7d294abd2 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -27,7 +27,6 @@ :init (unless doom-theme (setq doom-theme 'doom-one)) - :config ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) ;; more Atom-esque file icons for neotree/treemacs From d1d9cffcc8dd80c9d4b96770ee71c1cde4d15db2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:45:12 -0400 Subject: [PATCH 3342/4235] lang/ocaml: major refactor + Load flyspell-mode a little later, to allow file/dir-local variables to customize flyspell. + Ensure setters (in merlin's config) are used as late as possible, by making merlin's (and all the other packages) config run after tuareg is loaded. + As discussed, installing packages locally is a bit unreliable, so I'm commenting out the +ocaml-site-lisp flag, and rely solely on packages from MELPA. + Add optional ocamlformat check in doctor.el and conditionally load the ocamlformat package (if editor/format is enabled). + Add docstrings to init hooks. --- modules/lang/ocaml/config.el | 138 +++++++++++++++++---------------- modules/lang/ocaml/doctor.el | 8 +- modules/lang/ocaml/packages.el | 46 +++++------ 3 files changed, 103 insertions(+), 89 deletions(-) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 5a7c5c66c..302c083a0 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -1,83 +1,91 @@ ;;; lang/ocaml/config.el -*- lexical-binding: t; -*- -;; def-project-mode!/associate! doesn't work when a -;; package is lazy loaded, and everything is compiled - -(def-package! tuareg - :defer t ;; modes set by autoload - :config +(after! tuareg ;; tuareg-mode has the prettify symbols itself (set-pretty-symbols! 'tuareg-mode :alist (append tuareg-prettify-symbols-basic-alist tuareg-prettify-symbols-extra-alist)) + ;; harmless if `prettify-symbols-mode' isn't active (setq tuareg-prettify-symbols-full t) + ;; Use opam to set environment (setq tuareg-opam-insinuate t) (tuareg-opam-update-env (tuareg-opam-current-compiler)) + ;; Spell-check comments (when (featurep! :feature spellcheck) - (add-hook 'tuareg-mode-hook #'flyspell-prog-mode))) + (add-hook 'tuareg-mode-local-vars-hook #'flyspell-prog-mode)) -(def-package! merlin - :after tuareg - :init - (set-lookup-handlers! 'tuareg-mode - :definition #'merlin-locate - :references #'merlin-occurrences - :documentation #'merlin-document) - (defun +ocaml|init-merlin () - (when (and (projectile-locate-dominating-file default-directory ".merlin") - (executable-find "ocamlmerlin")) - (merlin-mode))) - (add-hook 'tuareg-mode-hook #'+ocaml|init-merlin) - :config - (map! :map tuareg-mode-map - :localleader - :n "t" #'merlin-type-enclosing - :n "a" #'tuareg-find-alternate-file) - (set-company-backend! 'tuareg-mode 'merlin-company-backend) - (setq merlin-completion-with-doc t)) + (def-package! merlin + :defer t + :init + (defun +ocaml|init-merlin () + "Activate `merlin-mode' if the ocamlmerlin executable exists and the +current project possesses a .merlin file." + (when (and (projectile-locate-dominating-file default-directory ".merlin") + (executable-find "ocamlmerlin")) + (merlin-mode))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-merlin) -(def-package! flycheck-ocaml - :when (featurep! :feature syntax-checker) - :after merlin - :config - ;; Disable Merlin's own error checking - (setq merlin-error-after-save nil) - ;; Enable Flycheck checker - (flycheck-ocaml-setup)) + (set-company-backend! 'tuareg-mode 'merlin-company-backend) + (set-lookup-handlers! 'tuareg-mode + :definition #'merlin-locate + :references #'merlin-occurrences + :documentation #'merlin-document) + :config + (setq merlin-completion-with-doc t) -(def-package! ocp-indent - ;; must be careful to always defer this, it has autoloads that adds hooks - ;; which we do not want if the executable can't be found - :defer t - :init - (defun +ocaml|init-ocp-indent () - (when (executable-find "ocp-indent") - (ocp-setup-indent))) - (add-hook 'tuareg-mode-hook #'+ocaml|init-ocp-indent)) + (map! :map tuareg-mode-map + :localleader + :n "t" #'merlin-type-enclosing + :n "a" #'tuareg-find-alternate-file)) -(def-package! utop - :defer t ;; loaded by hook below - :when (featurep! :feature eval) - :init - (set-repl-handler! 'tuareg-mode #'utop) - (set-eval-handler! 'tuareg-mode #'utop-eval-region) - (defun +ocaml|init-utop () - (when (executable-find "utop") - (utop-minor-mode))) - (add-hook 'tuareg-mode-hook #'+ocaml|init-utop)) -(def-package! ocamlformat - :after tuareg - :commands (ocamlformat) - :init - (set-formatter! 'ocamlformat #'ocamlformat - :modes '(caml-mode tuareg-mode)) - (defun +ocaml|init-ocamlformat () - (setq +format-with 'ocp-indent) - (when (and (executable-find "ocamlformat") - (locate-dominating-file default-directory ".ocamlformat")) - (setq +format-with 'ocamlformat))) - (add-hook 'tuareg-mode-hook #'+ocaml|init-ocamlformat)) + (def-package! flycheck-ocaml + :when (featurep! :feature syntax-checker) + :after merlin + :config + ;; Disable Merlin's own error checking + (setq merlin-error-after-save nil) + ;; Enable Flycheck checker + (flycheck-ocaml-setup)) + + + (def-package! utop + :when (featurep! :feature eval) + :defer t ; loaded by hook below + :init + (set-repl-handler! 'tuareg-mode #'utop) + (set-eval-handler! 'tuareg-mode #'utop-eval-region) + (defun +ocaml|init-utop () + (when (executable-find "utop") + (utop-minor-mode))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-utop)) + + + (def-package! ocp-indent + ;; must be careful to always defer this, it has autoloads that adds hooks + ;; which we do not want if the executable can't be found + :defer t + :init + (defun +ocaml|init-ocp-indent () + "Run `ocp-setup-indent', so long as the ocp-indent binary exists." + (when (executable-find "ocp-indent") + (ocp-setup-indent))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-ocp-indent)) + + + (def-package! ocamlformat + :when (featurep! :editor format) + :commands ocamlformat + :init + (set-formatter! 'ocamlformat #'ocamlformat + :modes '(caml-mode tuareg-mode)) + ;; TODO Fix region-based formatting support + (defun +ocaml|init-ocamlformat () + (setq +format-with 'ocp-indent) + (when (and (executable-find "ocamlformat") + (locate-dominating-file default-directory ".ocamlformat")) + (setq +format-with 'ocamlformat))) + (add-hook 'tuareg-mode-hook #'+ocaml|init-ocamlformat))) diff --git a/modules/lang/ocaml/doctor.el b/modules/lang/ocaml/doctor.el index 0b3427f41..26ec17506 100644 --- a/modules/lang/ocaml/doctor.el +++ b/modules/lang/ocaml/doctor.el @@ -2,11 +2,11 @@ ;;; lang/ocaml/doctor.el (unless (executable-find "ocamlmerlin") - (warn! "Couldn't find ocamlmerlin. Lookup, completion and syntax checking won't work.")) + (warn! "Couldn't find ocamlmerlin. Lookup, completion and syntax checking won't work")) ;; Tuareg can still indent (unless (executable-find "ocp-indent") - (warn! "Couldn't find ocp-indent. Auto-indentation will be less precise.")) + (warn! "Couldn't find ocp-indent. Auto-indentation will be less precise")) (when (featurep! :feature eval) (unless (executable-find "utop") @@ -15,4 +15,8 @@ (unless (executable-find "dune") (warn! "Couldn't find dune. Won't be able to highlight dune files")) +(when (featurep! :editor format) + (unless (executable-find "ocamlformat") + (warn! "Couldn't find ocamlformat. Code-formatting will be unavailable"))) + ;; ocamlformat is optional, don't warn about it diff --git a/modules/lang/ocaml/packages.el b/modules/lang/ocaml/packages.el index 2d6931013..27af6197d 100644 --- a/modules/lang/ocaml/packages.el +++ b/modules/lang/ocaml/packages.el @@ -1,30 +1,32 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/ocaml/packages.el -(when (featurep! +opam-site-lisp) - (defvar +ocaml-elisp-dir - (when (executable-find "opam") - (let ((opam-share (ignore-errors (car (process-lines "opam" "config" "var" "share" "--safe"))))) - (when (and opam-share (file-directory-p opam-share)) - (expand-file-name "emacs/site-lisp" opam-share))))) - - (defmacro localpackage! (name) - `(package! ,name :recipe (:fetcher file :path ,+ocaml-elisp-dir))) - - (localpackage! opam-site-lisp)) - (package! tuareg) +(package! merlin) +(package! ocp-indent) (when (featurep! :feature syntax-checker) (package! flycheck-ocaml)) -(unless (featurep! +opam-site-lisp) - (package! merlin) - (package! ocp-indent) - (when (featurep! :feature eval) - (package! utop)) - (when (featurep! :editor format) - ;; by default quelpa generated a version 0pre0.20180929.192844, which got parsed into (0 -1 0 ...), which when compared with version nil (0) - ;; in package-installed-p always yielded false - (package! ocamlformat :recipe (:fetcher github :repo "ocaml-ppx/ocamlformat" :files ("emacs/*.el")))) - (package! dune :recipe (:fetcher github :repo "ocaml/dune" :files ("editor-integration/emacs/*.el")))) +(when (featurep! :feature eval) + (package! utop)) + +(when (featurep! :editor format) + ;; by default quelpa generated a version 0pre0.20180929.192844, which got + ;; parsed into (0 -1 0 ...), which when compared with version nil (0) in + ;; package-installed-p always yielded false + (package! ocamlformat :recipe (:fetcher github :repo "ocaml-ppx/ocamlformat" :files ("emacs/*.el")))) + +(package! dune :recipe (:fetcher github :repo "ocaml/dune" :files ("editor-integration/emacs/*.el"))) + + +;; (defvar +ocaml-elisp-dir +;; (when (executable-find "opam") +;; (let ((opam-share (ignore-errors (car (process-lines "opam" "config" "var" "share" "--safe"))))) +;; (when (and opam-share (file-directory-p opam-share)) +;; (expand-file-name "emacs/site-lisp" opam-share))))) +;; +;; (defmacro localpackage! (name) +;; `(package! ,name :recipe (:fetcher file :path ,+ocaml-elisp-dir))) +;; +;; (localpackage! opam-site-lisp) From 63e25b349d2d8c4491f85882361846e118bb1903 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 02:51:11 -0400 Subject: [PATCH 3343/4235] Silence undo-tree a little less destructively undo-tree-load-history was formerly advised with doom*shut-up, which uses the quiet! macro to suppress output. quiet! accomplishes this by temporarily redefining message to a no-op function. However, if a fatal error occurs while this binding is active, in some cases, message will remain redefined, perpetually silencing all output to the minibuffer. This tries to mitigate that, at least where undo-tree is concerned. Also sharp-quotes an unquoted function. --- core/core-editor.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 40775e60a..4def0117d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -241,7 +241,8 @@ savehist file." `(("." . ,(concat doom-cache-dir "undo-tree-hist/")))) (global-undo-tree-mode +1) - (advice-add #'undo-tree-load-history :around #'doom*shut-up) + (defun doom*shut-up-undo-tree (&rest _) (message "")) + (advice-add #'undo-tree-load-history :after #'doom*shut-up-undo-tree) ;; compress undo history with xz (defun doom*undo-tree-make-history-save-file-name (file) @@ -256,7 +257,7 @@ savehist file." (and (consp item) (stringp (car item)) (setcar item (substring-no-properties (car item)))))) - (advice-add 'undo-list-transfer-to-tree :before #'doom*strip-text-properties-from-undo-history) + (advice-add #'undo-list-transfer-to-tree :before #'doom*strip-text-properties-from-undo-history) (defun doom*compress-undo-tree-history (orig-fn &rest args) (cl-letf* ((jka-compr-verbose nil) From ae7fbf05c098b903b709ccd1417711b4aef34a5f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 13:53:32 -0400 Subject: [PATCH 3344/4235] init.example.el: fix swtft -> swift typo --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 69aa030f5..f935a5804 100644 --- a/init.example.el +++ b/init.example.el @@ -126,7 +126,7 @@ ;;scala ; java, but good (sh +fish) ; she sells (ba|z|fi)sh shells on the C xor ;;solidity ; do you need a blockchain? No. - ;;swtft ; who asked for emoji variables? + ;;swift ; who asked for emoji variables? ;;web ; the tubes ;;vala ; GObjective-C From a11650767267cfab4a7ee01212422db15790aa3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 14:02:02 -0400 Subject: [PATCH 3345/4235] Add tools/terraform to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index f935a5804..ee0f5da5d 100644 --- a/init.example.el +++ b/init.example.el @@ -75,6 +75,7 @@ ;;pdf ; pdf enhancements ;;prodigy ; FIXME managing external services & code builders ;;rgb ; creating color strings + ;;terraform ; infrastructure as code ;;tmux ; an API for interacting with tmux ;;upload ; map local to remote projects via ssh/ftp ;;wakatime From 5ceb64705ffe0741c24b686e525d51e5dbfff197 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 14:02:55 -0400 Subject: [PATCH 3346/4235] lang/ocaml: remove ocamlformat comment It doesn't apply anymore --- modules/lang/ocaml/doctor.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/ocaml/doctor.el b/modules/lang/ocaml/doctor.el index 26ec17506..7429c68c6 100644 --- a/modules/lang/ocaml/doctor.el +++ b/modules/lang/ocaml/doctor.el @@ -18,5 +18,3 @@ (when (featurep! :editor format) (unless (executable-find "ocamlformat") (warn! "Couldn't find ocamlformat. Code-formatting will be unavailable"))) - -;; ocamlformat is optional, don't warn about it From 3d6b30675c69d349d4fa7e395ebdbb81e1a1ba46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 17:28:21 -0400 Subject: [PATCH 3347/4235] lang/ruby: remove redundant add-hook --- modules/lang/ruby/config.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 1c55609ff..0cdf0949a 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -168,8 +168,3 @@ :n "a" #'minitest-verify-all :n "s" #'minitest-verify-single :n "v" #'minitest-verify)) - - -;; Evil integration -(when (featurep! :feature evil +everywhere) - (add-hook! 'rspec-mode-hook #'evil-normalize-keymaps)) From e3a0ad0b3311c2dbbd20f032b0865e42a918cce2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 17:32:41 -0400 Subject: [PATCH 3348/4235] set-pretty-symbols!: rename rest -> plist A more sensibile name. --- modules/ui/pretty-code/autoload.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 7d8ef4614..83d0f5b8d 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -58,7 +58,7 @@ correct width of the symbols instead of the width measured by `char-width'." (cons (car ligature-alist) acc))) ;;;###autodef -(defun set-pretty-symbols! (modes &rest rest) +(defun set-pretty-symbols! (modes &rest plist) "Associates string patterns with icons in certain major-modes. MODES is a major mode symbol or a list of them. @@ -88,17 +88,17 @@ Pretty symbols can be unset for emacs-lisp-mode with: (set-pretty-symbols! 'emacs-lisp-mode nil)" (declare (indent defun)) - (if (null (car-safe rest)) + (if (null (car-safe plist)) (delq (assq mode +pretty-code-symbols-alist) +pretty-code-symbols-alist) (let (results merge key) - (while rest - (pcase (setq key (pop rest)) - (:merge (setq merge (pop rest))) - (:alist (setq results (append (pop rest) results))) + (while plist + (pcase (setq key (pop plist)) + (:merge (setq merge (pop plist))) + (:alist (setq results (append (pop plist) results))) (_ (when-let* ((char (plist-get +pretty-code-symbols key))) - (push (cons (pop rest) char) results))))) + (push (cons (pop plist) char) results))))) (dolist (mode (doom-enlist modes)) (unless merge (delq (assq mode +pretty-code-symbols-alist) From f4d49acdc8d3445ca47f714c2c969d2ab27bdad0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 17:32:59 -0400 Subject: [PATCH 3349/4235] More descriptive signatures for set-file-template! And set-file-templates! --- modules/feature/file-templates/autoload.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 595b9f6e0..1d18419e6 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -32,14 +32,18 @@ these properties: If non-nil, ignore this template if this buffer isn't in a project. :ignore BOOL If non-nil, don't expand any template for this file and don't test any other - file template rule against this buffer." + file template rule against this buffer. + +\(fn PRED &key WHEN TRIGGER MODE PROJECT IGNORE)" (declare (indent defun)) (defer-until! (boundp '+file-templates-alist) (+file-templates--set pred plist))) ;;;###autodef (defun set-file-templates! (&rest templates) - "Like `set-file-templates!', but register many file templates at once." + "Like `set-file-templates!', but can register multiple file templates at once. + +\(fn &rest (PRED &key WHEN TRIGGER MODE PROJECT IGNORE))" (defer-until! (boundp '+file-templates-alist) (dolist (template templates) (+file-templates--set (car template) (cdr template))))) From eb1440caa9f7a577efb54ffbefb3acd89dbefa0a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 18:27:34 -0400 Subject: [PATCH 3350/4235] feature/evil: add evil-collection-resclient --- modules/feature/evil/+everywhere.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index b0b8db09f..17e377f00 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -131,6 +131,7 @@ variable for an explanation of the defaults (in comments). See racer realgud reftex + restclient rjsx-mode robe ruby-mode From 51190fa7716efa2e74857a1fbce9ef1b131a739a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 18:30:44 -0400 Subject: [PATCH 3351/4235] More descriptive signature for set-electric! And mention that electric-indent-local-mode is enabled by this in its docstring. --- modules/emacs/electric/autoload.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index c75d2fe0e..0b18f8d6e 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -2,8 +2,12 @@ ;;;###autodef (defun set-electric! (modes &rest plist) - "Declare :words (list of strings) or :chars (lists of chars) in MODES that -trigger electric indentation." + "Declare that WORDS (list of strings) or CHARS (lists of chars) should trigger +electric indentation. + +Enables `electric-indent-local-mode' in MODES. + +\(fn MODES &key WORDS CHARS)" (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) From 50b324b683558afaf417eb674b8a8171bd1b0c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Tue, 16 Oct 2018 23:30:47 +0100 Subject: [PATCH 3352/4235] lang/ocaml: always initialize merlin, but wait for a .merlin file for flycheck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Edwin Török --- modules/lang/ocaml/config.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 302c083a0..e25a7ff13 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -21,10 +21,8 @@ :defer t :init (defun +ocaml|init-merlin () - "Activate `merlin-mode' if the ocamlmerlin executable exists and the -current project possesses a .merlin file." - (when (and (projectile-locate-dominating-file default-directory ".merlin") - (executable-find "ocamlmerlin")) + "Activate `merlin-mode' if the ocamlmerlin executable exists." + (when (executable-find "ocamlmerlin") (merlin-mode))) (add-hook 'tuareg-mode-hook #'+ocaml|init-merlin) @@ -44,12 +42,15 @@ current project possesses a .merlin file." (def-package! flycheck-ocaml :when (featurep! :feature syntax-checker) - :after merlin - :config - ;; Disable Merlin's own error checking - (setq merlin-error-after-save nil) - ;; Enable Flycheck checker - (flycheck-ocaml-setup)) + :init + (defun +ocaml|init-flycheck () + "Activate `flycheck-ocaml` if the current project possesses a .merlin file." + (when (projectile-locate-dominating-file default-directory ".merlin") + ;; Disable Merlin's own error checking + (setq merlin-error-after-save nil) + ;; Enable Flycheck checker + (flycheck-ocaml-setup))) + (add-hook 'merlin-mode-hook #'+ocaml|init-flycheck)) (def-package! utop From cdd39b20a5742ae975cbb57b2877a0aa7e8f74d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Tue, 16 Oct 2018 23:35:52 +0100 Subject: [PATCH 3353/4235] lang/ocaml: add merlin-eldoc type and doc on hover display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This displays the type and documentation of thing under point and highlights occurrences automatically when idle. Could be achieved by appropriate use of keyboard shortcuts already set up by this module. However `merlin-eldoc` can also display the expected type of function call parameters, which merlin itself wouldn't. Signed-off-by: Edwin Török --- modules/lang/ocaml/config.el | 4 ++++ modules/lang/ocaml/packages.el | 1 + 2 files changed, 5 insertions(+) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index e25a7ff13..243ec5858 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -53,6 +53,10 @@ (add-hook 'merlin-mode-hook #'+ocaml|init-flycheck)) + (def-package! merlin-eldoc + :hook (merlin-mode . merlin-eldoc-setup)) + + (def-package! utop :when (featurep! :feature eval) :defer t ; loaded by hook below diff --git a/modules/lang/ocaml/packages.el b/modules/lang/ocaml/packages.el index 27af6197d..71128923f 100644 --- a/modules/lang/ocaml/packages.el +++ b/modules/lang/ocaml/packages.el @@ -3,6 +3,7 @@ (package! tuareg) (package! merlin) +(package! merlin-eldoc) (package! ocp-indent) (when (featurep! :feature syntax-checker) From a4a42d3141c445cf5a15cdbe8c83117d67870f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Wed, 17 Oct 2018 00:02:14 +0100 Subject: [PATCH 3354/4235] lang/ocaml: enable merlin-imenu and merlin-iedit (part of merlin) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit merlin-imenu works nicely with `SPC / i`. merlin-iedit is a refactoring tool that locates all occurences of an identifier in scope and you can use multiple cursors to edit. integration with evil-multiedit could be better. There is also a merlin-xref backend, but since we got the individual def/lookup/etc. already bound not sure if it is worth using it. Signed-off-by: Edwin Török --- modules/lang/ocaml/config.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 243ec5858..f44e2f1b2 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -57,6 +57,19 @@ :hook (merlin-mode . merlin-eldoc-setup)) + (def-package! merlin-iedit + :when (featurep! :editor multiple-cursors) + :hook (merlin-mode . merlin-use-merlin-imenu) + :config + (map! :map tuareg-mode-map + :v "R" #'merlin-iedit-occurrences)) + + + (def-package! merlin-imenu + :when (featurep! :emacs imenu) + :hook (merlin-mode . merlin-use-merlin-imenu)) + + (def-package! utop :when (featurep! :feature eval) :defer t ; loaded by hook below From a1ca5b2850248f6bd4c1f90464163f448ae2c277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Wed, 17 Oct 2018 00:13:20 +0100 Subject: [PATCH 3355/4235] lang/ocaml: update README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Edwin Török --- modules/lang/ocaml/README.org | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/modules/lang/ocaml/README.org b/modules/lang/ocaml/README.org index 53fa6db12..9154077b8 100644 --- a/modules/lang/ocaml/README.org +++ b/modules/lang/ocaml/README.org @@ -2,7 +2,8 @@ This module adds [[https://ocaml.org/][OCaml]] support, powered by [[https://github.com/ocaml/tuareg][tuareg-mode]]. -+ Code completion, look up documentation, and code navigation ([[https://github.com/ocaml/merlin/wiki/emacs-from-scratch][merlin]]) ++ Code completion, documentation look-up, code navigation and refactoring ([[https://github.com/ocaml/merlin/wiki/emacs-from-scratch][merlin]]) ++ Type, documentation and function argument display on idle ([[https://github.com/Khady/merlin-eldoc][merlin-eldoc]]) + REPL ([[https://github.com/ocaml-community/utop][utop]]) + Syntax-checking (~merlin~ with [[https://github.com/flycheck/flycheck-ocaml][flycheck-ocaml]]) + Auto-indentation ([[https://github.com/OCamlPro/ocp-indent][ocp-indent]]) @@ -52,25 +53,32 @@ opam install merlin utop ocp-indent dune ocamlformat + when =:feature syntax-checker= is enabled then =flycheck-ocaml= is activated to do on-the-fly syntax/type checking via =merlin=, otherwise this is only done when the file is saved. -+ spell checking is activated in comments if =:feature spellcheck= is actived -+ a REPL is provided if =utop= is installed and =:feature eval= is actived ++ spell checking is activated in comments if =:feature spellcheck= is active ++ a REPL is provided if =utop= is installed and =:feature eval= is active + if =:editor format= is enabled, the =ocamlformat= executable is available and there is an =.ocamlformat= file present then =format-all-buffer= is bound to =ocamlformat=, otherwise to =ocp-indent= ++ if =:editor multiple-cursors= is enabled then identifiers can be refactored + with =v R= and multiple cursors (this correctly matches identifier occurrences + according to scope, it is not purely a textual match) ++ if =:emacs imenu= is enabled then top level symbols (modules, type, functions, etc.) can + be looked up using =SPC / i= Run =make install= to install all packages, and =make doctor= to diagnose missing tools. * Appendix ** Commands - | command | key / ex command | description | - |------------------------------+------------------+------------------------------------| - | =merlin-type-enclosing= | =SPC m t= | display type under point | - | =tuareg-find-alternate-file= | =SPC m a= | switch between =.ml= and =.mli= | - | =merlin-locate= | =gd= | lookup definition | - | =merlin-occurences= | =SPC c D= | lookup references | - | =merlin-document= | =K= | lookup documentation | - | =utop= | =SPC o r= | open =utop= as REPL | - | =utop-eval-region= | =SPC c e= | evaluate selected region in =utop= | + | command | key / ex command | description | + |------------------------------+------------------+-----------------------------------------------------------| + | =merlin-type-enclosing= | =SPC m t= | display type under point | + | =tuareg-find-alternate-file= | =SPC m a= | switch between =.ml= and =.mli= | + | =merlin-locate= | =gd= | lookup definition | + | =merlin-occurences= | =SPC c D= | lookup references | + | =merlin-document= | =K= | lookup documentation | + | =merlin-imenu= | =SPC / i= | symbol lookup in file | + | =merlin-iedit-occurrences= | =v R= | visual refactor identifier under point (multiple cursors) | + | =utop= | =SPC o r= | open =utop= as REPL | + | =utop-eval-region= | =SPC c e= | evaluate selected region in =utop= | ** Hacks + =set-pretty-symbols!= is called with the full tuareg prettify symbol list, this From 56d7f70b2f1b778158dc5939b16168401a56cebe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Oct 2018 22:18:31 -0400 Subject: [PATCH 3356/4235] Make all-the-icons return empty string in tty #941 --- core/core-ui.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index d53775a6d..37f0c65d5 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -116,8 +116,9 @@ size.") all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) :init (defun doom*disable-all-the-icons-in-tty (orig-fn &rest args) - (when (display-graphic-p) - (apply orig-fn args))) + (if (display-graphic-p) + (apply orig-fn args) + "")) :config ;; all-the-icons doesn't work in the terminal, so we "disable" it. (dolist (fn '(all-the-icons-octicon all-the-icons-material From 9bb5b4ef7217af4a9107bf0a008090b5e85e484b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 00:21:18 -0400 Subject: [PATCH 3357/4235] tools/magit: +magit-hub-features = t Since magithub is "disabled" by default, if enabled it might be confusing that its features aren't all enabled (which is magithub's default behavior). --- modules/tools/magit/config.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 98e7bec6b..c924e559f 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -4,11 +4,10 @@ "Whether or not to enable magithub features for all projects by default. Must be set before `magithub' (and `magit') is loaded.") -(defvar +magit-hub-features - '(pull-request-merge commit-browse completion) +(defvar +magit-hub-features t "What features to initialize when `magithub' is loaded. Set this to `t' to -load everything. See `magithub-feature-list' to see what features are -available.") +load everything, and nil to load nothing. See `magithub-feature-list' to see +what features are available.") ;; From baa6f640253507b5a87bfc1333a8a049ff53407f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 01:24:26 -0400 Subject: [PATCH 3358/4235] lang/org: use correct todo keyword on M-RET Previously, new TODO headers created with M-RET or M-S-RET (bound to +org/insert-item) would use the first TODO keyword in org-todo-keywords in the new header. This wouldn't necessarily match the previous header. e.g. * [ ] Item 1 * TODO | This fix ensures new headers will preserve the correct header, even if the previous one is in a DONE state. * [ ] Item 1 * [ ] | --- modules/lang/org/autoload/org.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index f4f586cb1..4a8138c69 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -203,8 +203,9 @@ wrong places)." (save-excursion (insert "\n") (if (= level 1) (insert "\n"))))) - (when (org-element-property :todo-type context) - (org-todo 'todo)))) + (when-let* ((todo-keyword (org-element-property :todo-keyword context))) + (org-todo (or (get-text-property 0 'org-todo-head todo-keyword) + 'todo))))) (t (user-error "Not a valid list, heading or table"))) From 6c4bf1620861268d5e2c44f3796c008176c52bed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 11:41:30 -0400 Subject: [PATCH 3359/4235] config/default: +evil:fold-toggle -> +evil/fold-toggle The command was renamed a while ago. --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 7cbfee742..9d035cdc0 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -66,7 +66,7 @@ :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 + :nv "C-SPC" #'+evil/fold-toggle :gnvimr "M-v" #'clipboard-yank "C-x p" #'+popup/other From 11793be240ee90cd5f47fad8becb22dc025943f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 12:13:03 -0400 Subject: [PATCH 3360/4235] completion/helm: fix void-variable error #954 The grep backend assumes helm-projectile is available and references its variables, but in some cases, it won't be (e.g. if a search command is used early enough after startup). --- modules/completion/helm/autoload/helm.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 4bed42243..393459dc4 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -62,6 +62,7 @@ workspace." ;; (defun +helm--grep-source () + (require 'helm-projectile) (helm-build-async-source (capitalize (helm-grep-command t)) :header-name (lambda (_name) "Helm Projectile Grep (C-c ? Help)") :candidates-process #'helm-grep-collect-candidates From c6c3054fbbf8ae11e473f5d7d7c303d8f4802eac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 14:34:43 -0400 Subject: [PATCH 3361/4235] completion/ivy: update ivy-rich integration And remove unused/defunct code. Also fixes a `file-in-directory-p: Wrong type argument: stringp, nil` error when invoking counsel-recentf. --- modules/completion/ivy/autoload/ivy.el | 57 ++++++++------------------ modules/completion/ivy/config.el | 11 +++-- 2 files changed, 23 insertions(+), 45 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index cac15e279..e94be5b29 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -7,52 +7,27 @@ (and (not (eq buffer (current-buffer))) (+workspace-contains-buffer-p buffer)))) -(defun +ivy*rich-switch-buffer-buffer-name (str) - (propertize - (ivy-rich-pad str ivy-rich-switch-buffer-name-max-length) - 'face (cond ((string-match-p "^ *\\*" str) - 'font-lock-comment-face) - ((and buffer-file-truename - (not (file-in-directory-p buffer-file-truename (doom-project-root)))) - 'font-lock-doc-face) - (t nil)))) -(advice-add 'ivy-rich-switch-buffer-buffer-name :override #'+ivy*rich-switch-buffer-buffer-name) +;;;###autoload +(defun +ivy-rich-buffer-name (candidate) + "Display the buffer name. + +Displays buffers in other projects in `font-lock-doc-face', and +temporary/special buffers in `font-lock-comment-face'." + (with-current-buffer (get-buffer candidate) + (propertize candidate + 'face (cond ((string-match-p "^ *\\*" candidate) + 'font-lock-comment-face) + ((not buffer-file-name) nil) + ((not (file-in-directory-p + buffer-file-name + (or (doom-project-root) + default-directory))) + 'font-lock-doc-face))))) ;; ;; Library -;;;###autoload -(defun +ivy-projectile-find-file-transformer (str) - "Highlight entries that have been visited. This is the opposite of -`counsel-projectile-find-file'." - (cond ((get-file-buffer (projectile-expand-root str)) - (propertize str 'face '(:weight ultra-bold :slant italic))) - (t str))) - -;;;###autoload -(defun +ivy-recentf-transformer (str) - "Dim recentf entries that are not in the current project of the buffer you -started `counsel-recentf' from. Also uses `abbreviate-file-name'." - (let ((str (abbreviate-file-name str))) - (if (file-in-directory-p str (doom-project-root)) - str - (propertize str 'face 'ivy-virtual)))) - -;;;###autoload -(defun +ivy-buffer-transformer (str) - "Dim special buffers, buffers whose file aren't in the current buffer, and -virtual buffers. Uses `ivy-rich' under the hood." - (let ((buf (get-buffer str))) - (require 'ivy-rich) - (cond (buf (ivy-rich-switch-buffer-transformer str)) - ((and (eq ivy-virtual-abbreviate 'full) - ivy-rich-switch-buffer-align-virtual-buffer) - (ivy-rich-switch-buffer-virtual-buffer str)) - ((eq ivy-virtual-abbreviate 'full) - (propertize (abbreviate-file-name str) 'str 'ivy-virtual)) - (t (propertize str 'face 'ivy-virtual))))) - ;;;###autoload (defun +ivy/switch-workspace-buffer (&optional arg) "Switch to another buffer within the current workspace. diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index ac93170e7..1e9692cce 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -79,7 +79,13 @@ immediately runs it on the current candidate (ending the ivy session)." ;; Show more buffer information in other switch-buffer commands too (dolist (cmd '(+ivy/switch-workspace-buffer counsel-projectile-switch-to-buffer)) - (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer))) + (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer)) + ;; Use `+ivy-rich-buffer-name' to display buffer names + (let* ((plist (plist-get ivy-rich--display-transformers-list 'ivy-switch-buffer)) + (colplist (plist-get plist :columns)) + (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) + (when switch-buffer-alist + (setcar switch-buffer-alist '+ivy-rich-buffer-name)))) (def-package! counsel @@ -114,9 +120,6 @@ immediately runs it on the current candidate (ending the ivy session)." (add-to-list 'swiper-font-lock-exclude #'+doom-dashboard-mode nil #'eq) - ;; Dim recentf entries that are not in the current project. - (ivy-set-display-transformer #'counsel-recentf #'+ivy-recentf-transformer) - ;; Factories (defun +ivy-action-reloading (cmd) (lambda (x) From 5a442932d716c65a619957d76dc23ed9a32ad8e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 14:49:35 -0400 Subject: [PATCH 3362/4235] ui/doom-dashboard: reload dashboard in daemon frames Fixes an issue where creating a graphical frame from the daemon can cause the non-GUI version of the dashboard to show. --- modules/ui/doom-dashboard/config.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index c53a018f6..a53f0704e 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -200,7 +200,9 @@ PLIST can have the following properties: (add-hook 'persp-created-functions #'+doom-dashboard|record-project) (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project)) - (+doom-dashboard-reload t)) + (if (daemonp) + (add-hook 'after-make-frame-functions #'+doom-dashboard|reload-frame) + (+doom-dashboard-reload t))) (defun +doom-dashboard|reload-on-kill () "A `kill-buffer-query-functions' hook. If this isn't a dashboard buffer, move @@ -218,6 +220,11 @@ If this is the dashboard buffer, reload the dashboard." (let (+doom-dashboard-inhibit-refresh) (ignore-errors (+doom-dashboard-reload)))))) +(defun +doom-dashboard|reload-frame (_frame) + "Reload the dashboard after a brief pause. This is necessary for new frames, +whose dimensions may not be fully initialized by the time this is run." + (run-with-timer 0.1 nil #'+doom-dashboard-reload t)) + (defun +doom-dashboard|resize (&rest _) "Recenter the dashboard, and reset its margins and fringes." (let ((windows (get-buffer-window-list (doom-fallback-buffer) nil t))) From fda4734164168eee8c3cc9bfc78f66c7d714fba7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 15:01:03 -0400 Subject: [PATCH 3363/4235] lang/common-lisp: disable fuzzy/flex completions Fuzzy search is slower and less predictable, and is generally disabled by default across Doom (or gated behind variables/flags). --- modules/lang/common-lisp/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 4bb9ec9fd..d4134d8fc 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -7,7 +7,9 @@ (after! sly (setq sly-mrepl-history-file-name (concat doom-cache-dir "sly-mrepl-history") sly-kill-without-query-p t - sly-net-coding-system 'utf-8-unix) + sly-net-coding-system 'utf-8-unix + ;; Change this to `sly-flex-completions' for fuzzy completion + sly-complete-symbol-function 'sly-simple-completions) (set-popup-rules! '(("^\\*sly-mrepl" :vslot 2 :quit nil :ttl nil) From 99b7b7f74021a728b1892a2094371de8ad67d239 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 16:17:36 -0400 Subject: [PATCH 3364/4235] lang/org: add inline base64/http(s) image support Adds inline image preview support for http/https links, as well as base64 encode image support with the img protocol. e.g. Examples: [[http://domain.com/some/image.png]] [[https://raw.githubusercontent.com/hlissner/doom-emacs/screenshots/company.png]] [[img:iVBORw0KGgoAAAANSUhEUgAAACUAAAAuCAAAAACKMo8cAA...]] --- modules/lang/org/+attach.el | 22 ++++++++++++++++++++++ modules/lang/org/autoload/org.el | 6 ++++-- modules/lang/org/packages.el | 3 ++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index eee6c0223..1eeee2618 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -63,6 +63,28 @@ (advice-add #'org-download--fullname :filter-return #'+org-attach*download-fullname)) +(def-package! org-yt + :after org + :config + (defun +org-inline-data-image (_protocol link _description) + "Interpret LINK as base64-encoded image data." + (base64-decode-string link)) + + (defun +org-image-link (protocol link _description) + "Interpret LINK as base64-encoded image data." + (when (image-type-from-file-name link) + (let ((buf (url-retrieve-synchronously (concat protocol ":" link)))) + ;; TODO Better error handling + (cl-assert buf nil "Download of image \"%s\" failed." link) + (with-current-buffer buf + (goto-char (point-min)) + (re-search-forward "\r?\n\r?\n") + (buffer-substring-no-properties (point) (point-max)))))) + + (org-link-set-parameters "http" :image-data-fun #'+org-image-link) + (org-link-set-parameters "https" :image-data-fun #'+org-image-link) + (org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image)) + ;; ;; Bootstrap diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 4a8138c69..0931c6b26 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -119,8 +119,10 @@ If on a: (org-toggle-latex-fragment)) (`link - (let ((path (org-element-property :path (org-element-lineage context '(link) t)))) - (if (and path (image-type-from-file-name path)) + (let* ((lineage (org-element-lineage context '(link) t)) + (path (org-element-property :path lineage))) + (if (or (equal (org-element-property :type lineage) "img") + (and path (image-type-from-file-name path))) (+org/refresh-inline-images) (org-open-at-point)))) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index c3d5abedd..bb784e0eb 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -15,7 +15,8 @@ (package! org-pdfview)) (when (featurep! +attach) - (package! org-download)) + (package! org-download) + (package! org-yt :recipe (:fetcher github :repo "TobiasZawada/org-yt"))) (when (featurep! +babel) (package! ob-mongo) From 09f9e12638500bc130c36f696c2c85851c18b6c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Oct 2018 22:27:41 -0400 Subject: [PATCH 3365/4235] Fix evil-open-above in auto-filled comments If comment-auto-fill-only-comments is enabled, evil-open-above (O) can break comments, e.g. in haskell -- 1 :. 2 :. 3 :. Nil -- |a -- Becomes -- 1 :. 2 :. 3 :. Nil -- | -- a -- Reported by @ar1a --- modules/feature/evil/autoload/advice.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index 8f9a97158..114ff4192 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -8,7 +8,8 @@ (funcall orig-fn count) (cl-letf (((symbol-function 'evil-insert-newline-below) (lambda () - (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (let ((pos (save-excursion (beginning-of-line-text) (point))) + comment-auto-fill-only-comments) (evil-narrow-to-field (evil-move-end-of-line) (require 'smartparens) @@ -31,7 +32,8 @@ (funcall orig-fn count) (cl-letf (((symbol-function 'evil-insert-newline-above) (lambda () - (let ((pos (save-excursion (beginning-of-line-text) (point)))) + (let ((pos (save-excursion (beginning-of-line-text) (point))) + comment-auto-fill-only-comments) (evil-narrow-to-field (require 'smartparens) (if (save-excursion (nth 4 (sp--syntax-ppss pos))) From 2ca2050c6d5c3f8e4527581eddacaa80a5419fe9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 12:17:30 -0400 Subject: [PATCH 3366/4235] feature/evil: fix o/O indentation in haskell-mode Refactors +evil*insert-newline-*-and-respect-comments advice. This also fixes an issue where o uses haskell's line indenter in haskell-mode, which is naive. Instead, we use haskell-indentation-newline-and-indent, which is smarter. This is a dirty dirty hack. May Nyarlathotep have mercy on our souls. Reported by @ar1a --- modules/feature/evil/autoload/advice.el | 84 +++++++++++++------------ 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index 114ff4192..1ee8a4f3a 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -1,5 +1,47 @@ ;;; feature/evil/autoload/advice.el -*- lexical-binding: t; -*- +(defun +evil--insert-newline (&optional above noextranewline) + (let ((pos (save-excursion (beginning-of-line-text) (point))) + comment-auto-fill-only-comments) + (require 'smartparens) + (evil-narrow-to-field + (if above + (if (save-excursion (nth 4 (sp--syntax-ppss pos))) + (evil-save-goal-column + (setq evil-auto-indent nil) + (goto-char pos) + (let ((ws (abs (skip-chars-backward " \t")))) + ;; FIXME oh god why + (save-excursion + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line)) + (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) + (eq (char-after) ?/)) + (insert "*")) + (insert + (make-string (max 0 (+ ws (skip-chars-backward " \t"))) + 32))) + (insert (make-string (max 1 ws) 32)))) + (evil-move-beginning-of-line) + (insert (if use-hard-newlines hard-newline "\n")) + (forward-line -1) + (back-to-indentation)) + (evil-move-end-of-line) + (cond ((sp-point-in-comment pos) + (setq evil-auto-indent nil) + (if comment-line-break-function + (funcall comment-line-break-function) + (comment-indent-new-line))) + ;; Find a better way to do this + ((and (eq major-mode 'haskell-mode) + (fboundp 'haskell-indentation-newline-and-indent)) + (setq evil-auto-indent nil) + (haskell-indentation-newline-and-indent)) + (t + (insert (if use-hard-newlines hard-newline "\n")) + (back-to-indentation))))))) + ;;;###autoload (defun +evil*insert-newline-below-and-respect-comments (orig-fn count) (if (or (not +evil-want-o/O-to-continue-comments) @@ -7,20 +49,7 @@ (evil-insert-state-p)) (funcall orig-fn count) (cl-letf (((symbol-function 'evil-insert-newline-below) - (lambda () - (let ((pos (save-excursion (beginning-of-line-text) (point))) - comment-auto-fill-only-comments) - (evil-narrow-to-field - (evil-move-end-of-line) - (require 'smartparens) - (cond ((sp-point-in-comment pos) - (setq evil-auto-indent nil) - (if comment-line-break-function - (funcall comment-line-break-function) - (comment-indent-new-line))) - (t - (insert (if use-hard-newlines hard-newline "\n")) - (back-to-indentation)))))))) + (lambda () (+evil--insert-newline)))) (let ((evil-auto-indent evil-auto-indent)) (funcall orig-fn count))))) @@ -31,32 +60,7 @@ (evil-insert-state-p)) (funcall orig-fn count) (cl-letf (((symbol-function 'evil-insert-newline-above) - (lambda () - (let ((pos (save-excursion (beginning-of-line-text) (point))) - comment-auto-fill-only-comments) - (evil-narrow-to-field - (require 'smartparens) - (if (save-excursion (nth 4 (sp--syntax-ppss pos))) - (evil-save-goal-column - (setq evil-auto-indent nil) - (goto-char pos) - (let ((ws (abs (skip-chars-backward " \t")))) - ;; FIXME oh god why - (save-excursion - (if comment-line-break-function - (funcall comment-line-break-function) - (comment-indent-new-line)) - (when (and (derived-mode-p 'c-mode 'c++-mode 'objc-mode 'java-mode 'js2-mode) - (eq (char-after) ?/)) - (insert "*")) - (insert - (make-string (max 0 (+ ws (skip-chars-backward " \t"))) - 32))) - (insert (make-string (max 1 ws) 32)))) - (evil-move-beginning-of-line) - (insert (if use-hard-newlines hard-newline "\n")) - (forward-line -1) - (back-to-indentation))))))) + (lambda () (+evil--insert-newline 'above)))) (let ((evil-auto-indent evil-auto-indent)) (funcall orig-fn count))))) From ecaa8fc7cddd344ebb5c389523cbf43759e60652 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 12:50:39 -0400 Subject: [PATCH 3367/4235] lang/org: move custom links into new hook function --- modules/lang/org/config.el | 88 +++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index aad01f167..0b7efa70c 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -73,7 +73,8 @@ +org|setup-agenda +org|setup-keybinds +org|setup-hacks - +org|setup-pretty-code)) + +org|setup-pretty-code + +org|setup-custom-links)) (add-hook! 'org-mode-hook #'(doom|disable-line-numbers ; org doesn't really need em @@ -174,6 +175,48 @@ unfold to point on startup." :src_block "#+BEGIN_SRC" :src_block_end "#+END_SRC")) +(defun +org|setup-custom-links () + "Set up custom org links." + (setq org-link-abbrev-alist + '(("github" . "https://github.com/%s") + ("youtube" . "https://youtube.com/watch?v=%s") + ("google" . "https://google.com/search?q=") + ("gimages" . "https://google.com/images?q=%s") + ("gmap" . "https://maps.google.com/maps?q=%s") + ("duckduckgo" . "https://duckduckgo.com/?q=%s") + ("wolfram" . "https://wolframalpha.com/input/?i=%s") + ("doom-repo" . "https://github.com/hlissner/doom-emacs/%s"))) + + (defun +org--relpath (path root) + (if (and buffer-file-name (file-in-directory-p buffer-file-name root)) + (file-relative-name path) + path)) + + ;; highlight broken links + (org-link-set-parameters + "file" + :face (lambda (path) + (if (or (file-remote-p path) + (file-exists-p path)) + 'org-link + 'error))) + + (eval-when-compile + (defmacro def-org-file-link! (key dir) + `(org-link-set-parameters + ,key + :complete (lambda () (+org--relpath (+org-link-read-file ,key ,dir) ,dir)) + :follow (lambda (link) (find-file (expand-file-name link ,dir))) + :face (lambda (link) + (if (file-exists-p (expand-file-name link ,dir)) + 'org-link + 'error))))) + + (def-org-file-link! "org" org-directory) + (def-org-file-link! "doom" doom-emacs-dir) + (def-org-file-link! "doom-docs" doom-docs-dir) + (def-org-file-link! "doom-modules" doom-modules-dir)) + (defun +org|setup-ui () "Configures the UI for `org-mode'." (setq-default @@ -236,48 +279,7 @@ unfold to point on startup." (face-attribute (or (cadr (assq 'default face-remapping-alist)) 'default) :background nil t)))) - (add-hook 'doom-load-theme-hook #'+org|update-latex-preview-background-color) - - ;; Custom links - (setq org-link-abbrev-alist - '(("github" . "https://github.com/%s") - ("youtube" . "https://youtube.com/watch?v=%s") - ("google" . "https://google.com/search?q=") - ("gimages" . "https://google.com/images?q=%s") - ("gmap" . "https://maps.google.com/maps?q=%s") - ("duckduckgo" . "https://duckduckgo.com/?q=%s") - ("wolfram" . "https://wolframalpha.com/input/?i=%s") - ("doom-repo" . "https://github.com/hlissner/doom-emacs/%s"))) - - (defun +org--relpath (path root) - (if (and buffer-file-name (file-in-directory-p buffer-file-name root)) - (file-relative-name path) - path)) - - ;; highlight broken links - (org-link-set-parameters - "file" - :face (lambda (path) - (if (or (file-remote-p path) - (file-exists-p path)) - 'org-link - 'error))) - - (eval-when-compile - (defmacro def-org-file-link! (key dir) - `(org-link-set-parameters - ,key - :complete (lambda () (+org--relpath (+org-link-read-file ,key ,dir) ,dir)) - :follow (lambda (link) (find-file (expand-file-name link ,dir))) - :face (lambda (link) - (if (file-exists-p (expand-file-name link ,dir)) - 'org-link - 'error))))) - - (def-org-file-link! "org" org-directory) - (def-org-file-link! "doom" doom-emacs-dir) - (def-org-file-link! "doom-docs" doom-docs-dir) - (def-org-file-link! "doom-modules" doom-modules-dir)) + (add-hook 'doom-load-theme-hook #'+org|update-latex-preview-background-color)) (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies From b2927955e775466cedc01e8a17751a594bb630bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 12:51:35 -0400 Subject: [PATCH 3368/4235] lang/org: move org-yt out of +attach in config.el --- modules/lang/org/+attach.el | 22 ---------------------- modules/lang/org/config.el | 24 +++++++++++++++++++++++- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index 1eeee2618..eee6c0223 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -63,28 +63,6 @@ (advice-add #'org-download--fullname :filter-return #'+org-attach*download-fullname)) -(def-package! org-yt - :after org - :config - (defun +org-inline-data-image (_protocol link _description) - "Interpret LINK as base64-encoded image data." - (base64-decode-string link)) - - (defun +org-image-link (protocol link _description) - "Interpret LINK as base64-encoded image data." - (when (image-type-from-file-name link) - (let ((buf (url-retrieve-synchronously (concat protocol ":" link)))) - ;; TODO Better error handling - (cl-assert buf nil "Download of image \"%s\" failed." link) - (with-current-buffer buf - (goto-char (point-min)) - (re-search-forward "\r?\n\r?\n") - (buffer-substring-no-properties (point) (point-max)))))) - - (org-link-set-parameters "http" :image-data-fun #'+org-image-link) - (org-link-set-parameters "https" :image-data-fun #'+org-image-link) - (org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image)) - ;; ;; Bootstrap diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0b7efa70c..5f4098c72 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -61,7 +61,29 @@ ;; org links to pdf files are opened in pdf-view-mode (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (_file link) (org-pdfview-open link)))) ;; support for links to specific pages - (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link)))))) + (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link)))))) + +(def-package! org-yt + :after org + :config + (defun +org-inline-data-image (_protocol link _description) + "Interpret LINK as base64-encoded image data." + (base64-decode-string link)) + + (defun +org-image-link (protocol link _description) + "Interpret LINK as base64-encoded image data." + (when (image-type-from-file-name link) + (let ((buf (url-retrieve-synchronously (concat protocol ":" link)))) + ;; TODO Better error handling + (cl-assert buf nil "Download of image \"%s\" failed." link) + (with-current-buffer buf + (goto-char (point-min)) + (re-search-forward "\r?\n\r?\n") + (buffer-substring-no-properties (point) (point-max)))))) + + (org-link-set-parameters "http" :image-data-fun #'+org-image-link) + (org-link-set-parameters "https" :image-data-fun #'+org-image-link) + (org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image)) ;; From 936f13744b85878a82d2be8e66cfdc159298085e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 12:54:37 -0400 Subject: [PATCH 3369/4235] lang/org: improve error handling for remote image previews --- modules/lang/org/config.el | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 5f4098c72..b42ceb1d4 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -73,13 +73,13 @@ (defun +org-image-link (protocol link _description) "Interpret LINK as base64-encoded image data." (when (image-type-from-file-name link) - (let ((buf (url-retrieve-synchronously (concat protocol ":" link)))) - ;; TODO Better error handling - (cl-assert buf nil "Download of image \"%s\" failed." link) - (with-current-buffer buf - (goto-char (point-min)) - (re-search-forward "\r?\n\r?\n") - (buffer-substring-no-properties (point) (point-max)))))) + (if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link)))) + (with-current-buffer buf + (goto-char (point-min)) + (re-search-forward "\r?\n\r?\n" nil t) + (buffer-substring-no-properties (point) (point-max))) + (message "Download of image \"%s\" failed" link) + nil))) (org-link-set-parameters "http" :image-data-fun #'+org-image-link) (org-link-set-parameters "https" :image-data-fun #'+org-image-link) From e8b68872595ad39654be6efde73947dff0b8f35c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 13:11:28 -0400 Subject: [PATCH 3370/4235] lang/rust: remove company-racer Racer provides completion-at-point integration, which makes company-racer redundant (and it conflicts with company-capf). --- modules/lang/rust/config.el | 6 ------ modules/lang/rust/packages.el | 3 --- 2 files changed, 9 deletions(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 60e34f15e..960cb7289 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -23,12 +23,6 @@ :documentation #'racer-describe)) -(def-package! company-racer - :when (featurep! :completion company) - :after racer - :config (set-company-backend! 'rust-mode '(company-racer))) - - (def-package! flycheck-rust :when (featurep! :feature syntax-checker) :after rust-mode diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el index cf4244060..12fd7c646 100644 --- a/modules/lang/rust/packages.el +++ b/modules/lang/rust/packages.el @@ -8,6 +8,3 @@ (when (featurep! :feature syntax-checker) (package! flycheck-rust)) - -(when (featurep! :completion company) - (package! company-racer)) From 97f8594a71d9bac27b9b5147ad541be097d045de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 13:13:35 -0400 Subject: [PATCH 3371/4235] ui/modeline: refresh +modeline-buffer-state often This fixes issues where the buffer's modified state isn't reflected properly in the mode-line, at the expense of a little (but acceptable loss of) efficiency. --- modules/ui/modeline/config.el | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index ebdc6ae40..42cb59644 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -402,22 +402,7 @@ Meant for `+modeline-buffer-path-function'." ;; ;; Segments -(defun +modeline|update-on-change () - (+modeline--set-+modeline-buffer-state) - (remove-hook 'post-command-hook #'+modeline|update-on-change t)) -(defun +modeline|start-update-on-change () - (add-hook 'post-command-hook #'+modeline|update-on-change nil t)) -(add-hook 'first-change-hook #'+modeline|start-update-on-change) - -(advice-add #'undo :after #'+modeline--set-+modeline-buffer-state) -(advice-add #'undo-tree-undo :after #'+modeline--set-+modeline-buffer-state) - (def-modeline-segment! +modeline-buffer-state - :on-hooks (find-file-hook - read-only-mode-hook - after-change-functions - after-save-hook - after-revert-hook) (let* ((base (buffer-base-buffer)) (icon (cond (buffer-read-only (all-the-icons-octicon From 005a07b416554941185cf4b0426ab05310f4629c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 18 Oct 2018 19:41:29 -0400 Subject: [PATCH 3372/4235] +evil:apply-macro: fix operator & fail gracefully Formly, this would fail silently. This has been rewritten to let you know if no macro is available at a register. It will also inform you how many times the macro was executed. Also fixes g@ not invoking the operator state. --- modules/feature/evil/autoload/evil.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 39aef130c..37988b8b2 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -122,7 +122,6 @@ integration." ;;;###autoload (autoload '+evil:apply-macro "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:apply-macro (beg end) "Apply macro to each line." - :motion nil :move-point nil (interactive "") (let ((register (or evil-this-register (read-char))) @@ -137,9 +136,14 @@ integration." (setq macro (evil-get-register evil-last-register t))) ((setq macro (evil-get-register register t) evil-last-register register))) + (unless macro + (user-error "No macro recorded in %c register" register)) (evil-change-state 'normal) (evil-with-single-undo - (apply-macro-to-region-lines beg end macro)))) + (let ((lines (count-lines beg end))) + (message "Applied macro in %c register %d times" register lines) + (apply-macro-to-region-lines beg end macro) + (message "Applied macro in %c register %d times...DONE" register lines))))) ;;;###autoload (autoload '+evil:retab "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:retab (&optional beg end) From 09603c54446770453bd320a6a5140d8c1d2b68b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 11:48:47 -0400 Subject: [PATCH 3373/4235] +format-region-p = nil Should be a boolean in the first place; this fixes custom formatters that use it like a boolean. --- modules/editor/format/autoload/format.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 23042b1de..67c5b05e5 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -1,8 +1,8 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- -(defvar +format-region-p 'buffer - "A symbol representing whether the buffer or a region of it is being -formatted. Can be 'buffer or 'region.") +(defvar +format-region-p nil + "Is non-nil if currently reformatting a selected region, rather than the whole +buffer.") ;;;###autoload (autoload 'format-all-probe "format-all") From 847983e278ccf9408f325bb0a0e0c9cb32a1956c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 12:07:17 -0400 Subject: [PATCH 3374/4235] Fix bin/doom hanging after generating autoloads Emacs occasionally hangs when polling for the emacs server (with server-running-p). Since this is used for such a trivial feature (to decide whether or not to display the "you need to restart" message), I removed it. Now it always shows that message (if the autoload files have changed). --- core/cli/autoloads.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index 33150e75f..6ab127f2e 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -34,15 +34,17 @@ it exists." (message "Deleted old %s" (file-name-nondirectory file)))) (defun doom--warn-refresh-session () - (message "Detected a running Emacs session.\n") - (message "Restart Emacs or use `M-x doom/reload' for changes to take effect.")) + (print! (bold (green "\nFinished!"))) + (message "If you have a running Emacs Session, you will need to restart it or") + (message "reload Doom for changes to take effect:\n") + (when (fboundp '+workspace/restart-emacs-then-restore) + (message " M-x +workspace/restart-emacs-then-restore")) + (message " M-x restart-emacs") + (message " M-x doom/reload")) (defun doom--do-load (&rest files) (if (and noninteractive (not (daemonp))) - (progn - (require 'server) - (when (server-running-p) - (add-hook 'kill-emacs-hook #'doom--warn-refresh-session))) + (add-hook 'kill-emacs-hook #'doom--warn-refresh-session) (dolist (file files) (load-file (byte-compile-dest-file file))))) From 8e67e591d6add31eac41acd45a0c6c88bc61f8de Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 12:53:25 -0400 Subject: [PATCH 3375/4235] lang/org: don't conditionally install org-yt Forgot to update packages.el in b292795. --- modules/lang/org/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index bb784e0eb..834231ddb 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -6,6 +6,7 @@ (package! org :ignore t) ; ignore org from ELPA (package! org-bullets :recipe (:fetcher github :repo "Kaligule/org-bullets")) +(package! org-yt :recipe (:fetcher github :repo "TobiasZawada/org-yt")) (package! toc-org) (when (featurep! :feature evil) @@ -15,8 +16,7 @@ (package! org-pdfview)) (when (featurep! +attach) - (package! org-download) - (package! org-yt :recipe (:fetcher github :repo "TobiasZawada/org-yt"))) + (package! org-download)) (when (featurep! +babel) (package! ob-mongo) From e0f7ba19cdf72b8a909c49883057c5a76de07be3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 15:43:24 -0400 Subject: [PATCH 3376/4235] lang/org: use correct todo on RET Improves on baa6f640. This fixes RET cycling between different keyword sets. --- modules/lang/org/autoload/org.el | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 0931c6b26..df69c5123 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -19,6 +19,19 @@ current file). Only scans first 2048 bytes of the document." (+org--get-property name)) (+org--get-property name bound))) +;;;###autoload +(defun +org-get-todo-keywords-for (keyword) + "TODO" + (when keyword + (cl-loop for (type . keyword-spec) in org-todo-keywords + for keywords = (mapcar (lambda (x) (if (string-match "^\\([^(]+\\)(" x) + (match-string 1 x) + x)) + keyword-spec) + if (eq type 'sequence) + if (member keyword keywords) + return keywords))) + ;; ;; Modes @@ -72,7 +85,10 @@ If on a: (`headline (cond ((org-element-property :todo-type context) (org-todo - (if (eq (org-element-property :todo-type context) 'done) 'todo 'done))) + (if (eq (org-element-property :todo-type context) 'done) + (or (car (+org-get-todo-keywords-for (org-element-property :todo-keyword context))) + 'todo) + 'done))) ((string= "ARCHIVE" (car-safe (org-get-tags))) (org-force-cycle-archived)) (t @@ -206,7 +222,7 @@ wrong places)." (insert "\n") (if (= level 1) (insert "\n"))))) (when-let* ((todo-keyword (org-element-property :todo-keyword context))) - (org-todo (or (get-text-property 0 'org-todo-head todo-keyword) + (org-todo (or (car (+org-get-todo-keywords-for todo-keyword)) 'todo))))) (t (user-error "Not a valid list, heading or table"))) From ae99f52b99785512d0fb7bd79d574b5e75675908 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 17:46:30 -0400 Subject: [PATCH 3377/4235] completion/ivy: re-enable counsel-projectile See ddf107a. --- modules/completion/ivy/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 1e9692cce..5efd8b30e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -157,7 +157,6 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel-projectile - :disabled t :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init From ab95ae1975d4c2af98ce23f480c71b53dacc7a08 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 21:58:41 -0400 Subject: [PATCH 3378/4235] feature/eval: minor refactor Now that I've "backported" display-line-numbers to Emacs 25, it isn't necessary to conditionally enable nlinum-mode. Also, use after! isntead of def-package!; this usage is equivalent, and after! imposes less overhead. --- modules/feature/eval/config.el | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 994a8cd94..9a1066a6a 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -8,12 +8,7 @@ ;; ;; Packages -(def-package! quickrun - :defer t - :init - (unless (boundp 'display-line-numbers) - (add-hook 'quickrun--mode-hook #'nlinum-mode)) - :config +(after! quickrun (setq quickrun-focus-p nil) (set-popup-rule! "^\\*quickrun" :size 0.3 :ttl 0) From 54749d04e63cc69f84756ff90aa66e57210b2f54 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Oct 2018 23:27:58 -0400 Subject: [PATCH 3379/4235] Have :P modifier throw error when not in a project If it returns nil, it will throw a stringp error otherwise. --- modules/feature/evil/autoload/advice.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index 1ee8a4f3a..c56b87518 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -133,8 +133,11 @@ more information on modifiers." (unless global 1)))) path)) ("P" - (let ((default-directory (file-name-directory (expand-file-name path)))) - (abbreviate-file-name (doom-project-root)))) + (let* ((default-directory (file-name-directory (expand-file-name path))) + (project-root (doom-project-root))) + (unless project-root + (user-error "Not in a project")) + (abbreviate-file-name project-root))) (_ path)) ""))) ;; strip trailing slash, if applicable From 1c5080315a15e8090b17990bebf6b36dd04bd6dc Mon Sep 17 00:00:00 2001 From: Chen Hou-wu Date: Mon, 22 Oct 2018 00:04:46 +0800 Subject: [PATCH 3380/4235] turn off fci when window is narrow than fill column --- modules/ui/fci/config.el | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index 77da05dd8..1d268c207 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -21,6 +21,23 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") ;; more important to me, so... (add-hook 'org-mode-hook #'turn-off-fci-mode) + ;; turn off fci if the window is narrow than fill column + (defun fci-conditional (window) + (let ((fci-enabled (symbol-value 'fci-mode)) + (fci-column (if fci-rule-column fci-rule-column fill-column))) + (with-selected-window window + (if (and (eq fci-enabled nil) + (< fci-column + (+ (window-width) (window-hscroll)))) + (turn-on-fci-mode) + (turn-off-fci-mode))))) + + (defun fci-width-workaround (&rest _) + (walk-windows #'fci-conditional 'no-minibuf)) + + (add-hook 'window-size-change-functions 'fci-width-workaround) + (add-hook 'window-configuration-change-hook 'fci-width-workaround) + (defun +fci|set-color () "Automatically change `fci-rule-color' based on `+fci-rule-color-function's return value. To disable this, either set `+fci-rule-color-function' to nil or From 9337c3f8c367964e28e09ad74e02425fd75e7d15 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Oct 2018 17:53:23 -0400 Subject: [PATCH 3381/4235] feature/lookup: fix OTHER-WINDOW arg For +lookup/definition, +lookup/references and +lookup/documentation. --- modules/feature/lookup/autoload/lookup.el | 39 ++++++++++++++--------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index acd7c4395..d10fbedfc 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -87,21 +87,30 @@ properties: ((require 'xref nil t) (xref-backend-identifier-at-point (xref-find-backend))))) -(defun +lookup--jump-to (prop identifier) +(defun +lookup--jump-to (prop identifier &optional other-window) (cl-loop with origin = (point-marker) - for fn in (plist-get (list :definition +lookup-definition-functions - :references +lookup-references-functions - :documentation +lookup-documentation-functions - :file +lookup-file-functions) - prop) + for fn + in (plist-get (list :definition +lookup-definition-functions + :references +lookup-references-functions + :documentation +lookup-documentation-functions + :file +lookup-file-functions) + prop) for cmd = (or (command-remapping fn) fn) if (condition-case e - (or (if (commandp cmd) - (call-interactively cmd) - (funcall cmd identifier)) - (/= (point-marker) origin)) - ('error (ignore (message "%s" e)))) - return it)) + (save-window-excursion + (when (or (if (commandp cmd) + (call-interactively cmd) + (funcall cmd identifier)) + (/= (point-marker) origin)) + (point-marker))) + (error (ignore (message "%s" e)))) + return + (progn + (funcall (if other-window + #'pop-to-buffer + #'pop-to-buffer-same-window) + (marker-buffer it)) + (goto-char it)))) (defun +lookup--file-search (identifier) (unless identifier @@ -220,7 +229,7 @@ evil-mode is active." (cond ((null identifier) (user-error "Nothing under point")) ((and +lookup-definition-functions - (+lookup--jump-to :definition identifier))) + (+lookup--jump-to :definition identifier other-window))) ((error "Couldn't find the definition of '%s'" identifier)))) @@ -236,7 +245,7 @@ search otherwise." (cond ((null identifier) (user-error "Nothing under point")) ((and +lookup-references-functions - (+lookup--jump-to :references identifier))) + (+lookup--jump-to :references identifier other-window))) ((error "Couldn't find references of '%s'" identifier)))) @@ -254,7 +263,7 @@ Goes down a list of possible backends: (cond ((null identifier) (user-error "Nothing under point")) ((and +lookup-documentation-functions - (+lookup--jump-to :documentation identifier))) + (+lookup--jump-to :documentation identifier other-window))) ((user-error "Couldn't find documentation for '%s'" identifier)))) From 915467cb1380263a7c7f2ff06c5cd0e9b3f31038 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Oct 2018 17:54:15 -0400 Subject: [PATCH 3382/4235] feature/lookup: update dumb-jump integration dumb-jump-go now returns a results plist, so our cl-letf hack is no longer necessary. --- modules/feature/lookup/autoload/lookup.el | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index d10fbedfc..545e4d081 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -143,19 +143,7 @@ reduce false positives. This backend prefers \"just working\" over accuracy." (when (require 'dumb-jump nil t) ;; dumb-jump doesn't tell us if it succeeded or not - (let (successful) - (cl-letf* ((old-fn (symbol-function 'dumb-jump-get-results)) - ((symbol-function 'dumb-jump-get-results) - (lambda (&optional prompt) - (let* ((plist (funcall old-fn prompt)) - (results (plist-get plist :results))) - (when (and results (> (length results) 0)) - (setq successful t)) - plist)))) - (if other-window - (dumb-jump-go-other-window) - (dumb-jump-go)) - successful)))) + (plist-get (dumb-jump-go) :results))) (defun +lookup-project-search-backend (identifier) "Conducts a simple project text search for IDENTIFIER. From 0d902e8cf1ee2f6f3eb5b324e74a0ad08590ea76 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Oct 2018 20:01:09 -0400 Subject: [PATCH 3383/4235] bin/doom: demote missing -p path error to warning The error would prevent bin/doom quickstart from working with a custom private directory. Instead, just warn that it doesn't exist. Fixes #974 --- bin/doom | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/doom b/bin/doom index 23d6e916b..7b8780f7a 100755 --- a/bin/doom +++ b/bin/doom @@ -55,10 +55,11 @@ (message "Insecure mode on")) ((or "-p" "--private") (setq doom-private-dir (expand-file-name (concat (pop args) "/"))) - (or (file-directory-p doom-private-dir) - (error "%s does not exist" doom-private-dir)) (setenv "DOOMDIR" doom-private-dir) - (message "DOOMDIR changed to %s" doom-private-dir)) + (message "DOOMDIR changed to %s" doom-private-dir) + (or (file-directory-p doom-private-dir) + (message "Warning: %s does not exist" + (abbreviate-file-name doom-private-dir)))) ((or "-e" "--emacsd") (setq emacs-dir (expand-file-name (concat (pop args) "/"))) (message "Emacs directory changed to %s" emacs-dir)) From 9599ca3cf2e4be410a780d56bcc1d05dd6c7ae4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 22 Oct 2018 22:16:27 -0400 Subject: [PATCH 3384/4235] feature/lookup: fix missing other-window args For +lookup/references & +lookup/documentation --- modules/feature/lookup/autoload/lookup.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 545e4d081..51532f8aa 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -222,14 +222,15 @@ evil-mode is active." ((error "Couldn't find the definition of '%s'" identifier)))) ;;;###autoload -(defun +lookup/references (identifier) +(defun +lookup/references (identifier &optional other-window) "Show a list of usages of IDENTIFIER (defaults to the symbol at point) Tries each function in `+lookup-references-functions' until one changes the point and/or current buffer. Falls back to a naive ripgrep/the_silver_searcher search otherwise." (interactive - (list (+lookup--symbol-or-region))) + (list (+lookup--symbol-or-region) + current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) ((and +lookup-references-functions @@ -238,7 +239,7 @@ search otherwise." ((error "Couldn't find references of '%s'" identifier)))) ;;;###autoload -(defun +lookup/documentation (identifier) +(defun +lookup/documentation (identifier &optional other-window) "Show documentation for IDENTIFIER (defaults to symbol at point or selection. Goes down a list of possible backends: @@ -247,7 +248,8 @@ Goes down a list of possible backends: 2. If the +docsets flag is active for :feature lookup, use `+lookup/in-docsets' 3. Fall back to an online search, with `+lookup/online'" (interactive - (list (+lookup--symbol-or-region))) + (list (+lookup--symbol-or-region) + current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) ((and +lookup-documentation-functions From f9d6ee49ee032ec20edad9b649389cb8214165e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Oct 2018 01:07:25 -0400 Subject: [PATCH 3385/4235] lang/haskell: fix evil keybinds for intero/dante --- modules/lang/haskell/+dante.el | 2 ++ modules/lang/haskell/+intero.el | 2 ++ 2 files changed, 4 insertions(+) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index e52f49c2f..5362bbd31 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -17,6 +17,8 @@ (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))) + (when (featurep 'evil) + (add-hook 'dante-mode-hook #'evil-normalize-keymaps)) (map! :map dante-mode-map :localleader :n "t" #'dante-type-at diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 8d796726d..585b73ac6 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -19,6 +19,8 @@ This is necessary because `intero-mode' doesn't do its own error checks." (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'intero '(warning . haskell-hlint))) + (when (featurep! :feature evil) + (add-hook 'intero-mode-hook #'evil-normalize-keymaps)) (map! :map intero-mode-map :localleader :n "t" #'intero-type-at From 0665d10377c58d6631e1445e4076e11915dbd0cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Oct 2018 01:08:31 -0400 Subject: [PATCH 3386/4235] lang/ruby: remove dtrt-indent fix This was merged upstream --- modules/lang/ruby/config.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0cdf0949a..9db3e7fd6 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -30,10 +30,6 @@ (add-to-list 'company-dabbrev-code-modes 'enh-ruby-mode nil #'eq) (add-to-list 'company-dabbrev-code-modes 'ruby-mode nil #'eq)) - (after! dtrt-indent - ;; `dtrt-indent' supports ruby-mode. Make it aware of enh-ruby-mode - (add-to-list 'dtrt-indent-hook-mapping-list '(enh-ruby-mode ruby enh-ruby-indent-level))) - ;; so class and module pairs work (setq-hook! (ruby-mode enh-ruby-mode) sp-max-pair-length 6) From e77c4f2406c62f80f8b8e0c568e13406be90ec6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Oct 2018 01:09:17 -0400 Subject: [PATCH 3387/4235] app/email: minor refactor --- modules/app/email/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 0ed9596a5..ebcabf5b2 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -96,16 +96,18 @@ (add-hook 'mu4e-compose-mode-hook #'flyspell-mode)) ;; Wrap text in messages - (add-hook! 'mu4e-view-mode-hook - (setq-local truncate-lines nil)) + (setq-hook! 'mu4e-view-mode-hook truncate-lines nil) (when (fboundp 'imagemagick-register-types) (imagemagick-register-types)) - (after! evil - (dolist (mode '(mu4e-main-mode mu4e-view-mode mu4e-headers-mode - mu4e-compose-mode mu4e~update-mail-mode)) - (evil-set-initial-state mode 'normal)))) + (set-evil-initial-state! + '(mu4e-main-mode + mu4e-view-mode + mu4e-headers-mode + mu4e-compose-mode + mu4e~update-mail-mode) + 'normal)) (def-package! mu4e-maildirs-extension From 86305f21755f035d368be0320a85cc4577a05748 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 24 Oct 2018 01:14:35 -0400 Subject: [PATCH 3388/4235] lang/haskell: just detect evil Instead of detect the feature/evil module. This is more versatile. --- modules/lang/haskell/+intero.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 585b73ac6..7ecf65e57 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -19,7 +19,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'intero '(warning . haskell-hlint))) - (when (featurep! :feature evil) + (when (featurep 'evil) (add-hook 'intero-mode-hook #'evil-normalize-keymaps)) (map! :map intero-mode-map :localleader From f43e64e505ea82679787ec0c38facaaade84391e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 25 Oct 2018 13:42:20 -0400 Subject: [PATCH 3389/4235] Add ns-auto-titlebar package for MacOS This fixes mismatching frame title and frame coloring, as well as auto-sets the ns-appearance parameter depending on your theme. --- core/core-os.el | 14 +++++++++----- core/packages.el | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index e0723f6a7..2ada973de 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -34,7 +34,15 @@ ;; Don't open files from the workspace in a new frame ns-pop-up-frames nil) + ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) + (when (or (daemonp) (not (display-graphic-p))) + (add-hook 'doom-post-init-hook #'osx-clipboard-mode)) + (when (or (daemonp) (display-graphic-p)) + ;; Syncs ns frame parameters with theme (and fixes mismatching text + ;; colr in the frame title) + (require 'ns-auto-titlebar nil t) + ;; A known problem with GUI Emacs on MacOS (or daemons started via ;; launchctl or brew services): it runs in an isolated ;; environment, so envvars will be wrong. That includes the PATH @@ -48,11 +56,7 @@ exec-path-from-shell-debug doom-debug-mode exec-path-from-shell-variables (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) - (exec-path-from-shell-initialize))) - - ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) - (when (or (daemonp) (not (display-graphic-p))) - (add-hook 'doom-post-init-hook #'osx-clipboard-mode))) + (exec-path-from-shell-initialize)))) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! diff --git a/core/packages.el b/core/packages.el index d49ab3d04..c41aeed79 100644 --- a/core/packages.el +++ b/core/packages.el @@ -4,7 +4,8 @@ ;; core-os.el (when IS-MAC (package! exec-path-from-shell) - (package! osx-clipboard)) + (package! osx-clipboard) + (package! ns-auto-titlebar)) ;; core-ui.el (package! all-the-icons) From 6dc3cddf19deec85f3cd54b4464715dc15115454 Mon Sep 17 00:00:00 2001 From: The-BigDaddy Date: Sat, 27 Oct 2018 16:44:12 -0500 Subject: [PATCH 3390/4235] added :editor lispyville --- modules/editor/lispyville/README.org | 33 +++++++++++++++++++++++++++ modules/editor/lispyville/config.el | 25 ++++++++++++++++++++ modules/editor/lispyville/packages.el | 5 ++++ 3 files changed, 63 insertions(+) create mode 100644 modules/editor/lispyville/README.org create mode 100644 modules/editor/lispyville/config.el create mode 100644 modules/editor/lispyville/packages.el diff --git a/modules/editor/lispyville/README.org b/modules/editor/lispyville/README.org new file mode 100644 index 000000000..84c5f9d95 --- /dev/null +++ b/modules/editor/lispyville/README.org @@ -0,0 +1,33 @@ +#+TITLE: :editor lispyville + +This modules adds [[https://github.com/noctuid/lispyville][lispyville]] key functionality in Lisp languages. + +This includes: + +- Common Lisp +- Emacs Lisp +- Scheme +- Racket +- [[http://docs.hylang.org/en/stable/][Hy]] +- [[http://lfe.io/][LFE]] +- Clojure + +The default key themes that are set are as follows: + +#+BEGIN_SRC emacs-lisp +(lispyville-set-key-theme + '((operators normal) + c-w + (prettify insert) + (atom-movement normal visual) + slurp/barf-lispy + (wrap normal insert) + additional + additional-insert + (additional-wrap normal insert) + (escape insert))) +#+END_SRC + +See noctuid's [[https://github.com/noctuid/lispyville/blob/master/README.org][README]] for more info on specific keybindings (starting [[https://github.com/noctuid/lispyville#operators-key-theme][here]]) of +each key theme. Think of ~lispyville-set-key-theme~ as adding +~parinfer-extensions~ via ~(setq parinfer-extensions '(blah blah blah))~. diff --git a/modules/editor/lispyville/config.el b/modules/editor/lispyville/config.el new file mode 100644 index 000000000..74e448e71 --- /dev/null +++ b/modules/editor/lispyville/config.el @@ -0,0 +1,25 @@ +;;; editor/lispyville/config.el -*- lexical-binding: t; -*- + +(def-package! lispyville + :when (featurep! :feature evil) + :init + (lispyville-set-key-theme + '((operators normal) + c-w + (prettify insert) + (atom-movement normal visual) + slurp/barf-lispy + (wrap normal insert) + additional + additional-insert + (additional-wrap normal insert) + (escape insert)) + :hook ((common-lisp-mode . lispyville-mode) + (emacs-lisp-mode . lispyville-mode) + (scheme-mode . lispyville-mode) + (racket-mode . lispyville-mode) + (hy-mode . lispyville-mode) + (lfe-mode . lispyville-mode) + (clojure-mode . lispyville-mode)) + :config + (add-hook 'lispyville-mode-hook #'turn-off-smartparens-mode))) diff --git a/modules/editor/lispyville/packages.el b/modules/editor/lispyville/packages.el new file mode 100644 index 000000000..de5773587 --- /dev/null +++ b/modules/editor/lispyville/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/lispyville/packages.el + +(when (featurep! :feature evil) + (package! lispyville)) From c2392039f0f2efe9f6f5a25d9bba755d0501c8d7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 29 Oct 2018 02:31:51 -0400 Subject: [PATCH 3391/4235] counsel-describe-face -> counsel-faces counsel-faces displays useful information alongside each face. --- modules/completion/ivy/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 5efd8b30e..533348e68 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -94,7 +94,7 @@ immediately runs it on the current candidate (ending the ivy session)." (define-key! 'global [remap apropos] #'counsel-apropos [remap bookmark-jump] #'counsel-bookmark - [remap describe-face] #'counsel-describe-face + [remap describe-face] #'counsel-faces [remap describe-function] #'counsel-describe-function [remap describe-variable] #'counsel-describe-variable [remap execute-extended-command] #'counsel-M-x From db9bc3848df042787a5ef600cfeca0cf57f03453 Mon Sep 17 00:00:00 2001 From: Quentin Le Guennec Date: Sat, 27 Oct 2018 00:00:13 +0200 Subject: [PATCH 3392/4235] feature/workspaces: Fix +workspace-delete to match docstring --- .../feature/workspaces/autoload/workspaces.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 1c96a7143..ebd1ffc0c 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -172,15 +172,17 @@ success, nil otherwise." (persp-rename new-name (+workspace-get name))) ;;;###autoload -(defun +workspace-delete (name &optional inhibit-kill-p) - "Delete the workspace denoted by NAME, which can be the name of a perspective +(defun +workspace-delete (workspace &optional inhibit-kill-p) + "Delete the workspace denoted by WORKSPACE, which can be the name of a perspective or its hash table. If INHIBIT-KILL-P is non-nil, don't kill this workspace's buffers." - (when (+workspace--protected-p name) - (error "Can't delete '%s' workspace" name)) - (+workspace-get name) ; error checking - (persp-kill name inhibit-kill-p) - (not (+workspace-exists-p name))) + (unless (stringp workspace) + (setq workspace (persp-name workspace))) + (when (+workspace--protected-p workspace) + (error "Can't delete '%s' workspace" workspace)) + (+workspace-get workspace) ; error checking + (persp-kill workspace inhibit-kill-p) + (not (+workspace-exists-p workspace))) ;;;###autoload (defun +workspace-switch (name &optional auto-create-p) From 81cccbcc513420395df09b3141618678e5273e4b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Oct 2018 16:20:25 -0400 Subject: [PATCH 3393/4235] lang/org: only update parent statistics cookies This would formerly update _all_ statistics cookies in the org document, which can be terribly slow in large documents. This restricts that to just the parent headlines of the subtree the cursor is in. --- modules/lang/org/autoload/org.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index df69c5123..85d869c21 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -393,7 +393,8 @@ another level of headings on each invocation." (defun +org|update-cookies () "Update counts in headlines (aka \"cookies\")." (when (and buffer-file-name (file-exists-p buffer-file-name)) - (org-update-statistics-cookies t))) + (let (org-hierarchical-todo-statistics) + (org-update-parent-todo-statistics)))) ;;;###autoload (defun +org|yas-expand-maybe () From 4063b8d14abb365c975fd29ce7fd3b08210d32a1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 30 Oct 2018 16:21:54 -0400 Subject: [PATCH 3394/4235] ui/modeline: abbreviate $HOME in buffer id segment --- modules/ui/modeline/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 42cb59644..e25aa9fd0 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -284,7 +284,8 @@ e.g. project/src/lib/file.c" 'doom-modeline-buffer-project-root) (unless (equal "./" relative-dirs) (cons relative-dirs 'doom-modeline-buffer-path)))) - (list nil (cons (file-name-directory filename) 'doom-modeline-buffer-path))) + (list nil (cons (abbreviate-file-name (file-name-directory filename)) + 'doom-modeline-buffer-path))) (list (cons (file-name-nondirectory filename) 'doom-modeline-buffer-file))))) From 4029bd7dd0f94465687c053bdc82c775b6ae0ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edwin=20T=C3=B6r=C3=B6k?= Date: Tue, 30 Oct 2018 00:19:01 +0000 Subject: [PATCH 3395/4235] lang/ocaml: drop bad imenu initialization --- modules/lang/ocaml/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index f44e2f1b2..adc3347c7 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -59,7 +59,6 @@ (def-package! merlin-iedit :when (featurep! :editor multiple-cursors) - :hook (merlin-mode . merlin-use-merlin-imenu) :config (map! :map tuareg-mode-map :v "R" #'merlin-iedit-occurrences)) From 8085a55bcbb2976a861361e7084205a3908f16fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Oct 2018 14:45:51 -0400 Subject: [PATCH 3396/4235] ui/neotree: fix open/find-this-file commands #992 A not-so-recent update to projectile caused doom-project-root's signature to change (it can now return nil, if not in a project). This fixes +neotree/open and +neotree/find-this-file to account for this new behavior, by resorting to default-directory in the absence of a project. --- modules/ui/neotree/autoload.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/ui/neotree/autoload.el b/modules/ui/neotree/autoload.el index 0855c807a..cf53d5ac5 100644 --- a/modules/ui/neotree/autoload.el +++ b/modules/ui/neotree/autoload.el @@ -8,18 +8,19 @@ (defun +neotree/open () "Open the neotree window in the current project." (interactive) - (let ((project-root (doom-project-root))) - (require 'neotree) - (if (neo-global--window-exists-p) - (neotree-hide) - (neotree-dir project-root)))) + (require 'neotree) + (if (neo-global--window-exists-p) + (neotree-hide) + (neotree-dir (or (doom-project-root) + default-directory)))) ;;;###autoload (defun +neotree/find-this-file () "Open the neotree window in the current project, and find the current file." (interactive) (let ((path buffer-file-name) - (project-root (doom-project-root))) + (project-root (or (doom-project-root) + default-directory))) (require 'neotree) (cond ((and (neo-global--window-exists-p) (get-buffer-window neo-buffer-name t)) From 00d91661e239c110b8e1498f46246868ec294606 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Oct 2018 15:38:13 -0400 Subject: [PATCH 3397/4235] editor/lispyville: minor reformatting + Ensure lispyville is properly lazyloaded by deferring the call to lispyville-set-key-theme + Fix indentation on :hook entries --- modules/editor/lispyville/config.el | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/editor/lispyville/config.el b/modules/editor/lispyville/config.el index 74e448e71..b88994438 100644 --- a/modules/editor/lispyville/config.el +++ b/modules/editor/lispyville/config.el @@ -2,7 +2,15 @@ (def-package! lispyville :when (featurep! :feature evil) - :init + :hook ((common-lisp-mode . lispyville-mode) + (emacs-lisp-mode . lispyville-mode) + (scheme-mode . lispyville-mode) + (racket-mode . lispyville-mode) + (hy-mode . lispyville-mode) + (lfe-mode . lispyville-mode) + (clojure-mode . lispyville-mode)) + :config + (add-hook 'lispyville-mode-hook #'turn-off-smartparens-mode) (lispyville-set-key-theme '((operators normal) c-w @@ -13,13 +21,4 @@ additional additional-insert (additional-wrap normal insert) - (escape insert)) - :hook ((common-lisp-mode . lispyville-mode) - (emacs-lisp-mode . lispyville-mode) - (scheme-mode . lispyville-mode) - (racket-mode . lispyville-mode) - (hy-mode . lispyville-mode) - (lfe-mode . lispyville-mode) - (clojure-mode . lispyville-mode)) - :config - (add-hook 'lispyville-mode-hook #'turn-off-smartparens-mode))) + (escape insert)))) From 0af32e0c525e2ec498c118df10fa0226e28117e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 31 Oct 2018 16:07:22 -0400 Subject: [PATCH 3398/4235] ui/fci: conform to conventions; minor refactor --- modules/ui/fci/config.el | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index 1d268c207..c423d2f3c 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -22,9 +22,9 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") (add-hook 'org-mode-hook #'turn-off-fci-mode) ;; turn off fci if the window is narrow than fill column - (defun fci-conditional (window) + (defun +fci-toggle-maybe (window) (let ((fci-enabled (symbol-value 'fci-mode)) - (fci-column (if fci-rule-column fci-rule-column fill-column))) + (fci-column (or fci-rule-column fill-column))) (with-selected-window window (if (and (eq fci-enabled nil) (< fci-column @@ -32,11 +32,11 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") (turn-on-fci-mode) (turn-off-fci-mode))))) - (defun fci-width-workaround (&rest _) - (walk-windows #'fci-conditional 'no-minibuf)) + (defun +fci|width-workaround (&rest _) + (walk-windows #'+fci-toggle-maybe 'no-minibuf)) - (add-hook 'window-size-change-functions 'fci-width-workaround) - (add-hook 'window-configuration-change-hook 'fci-width-workaround) + (add-hook 'window-size-change-functions #'+fci|width-workaround) + (add-hook 'window-configuration-change-hook #'+fci|width-workaround) (defun +fci|set-color () "Automatically change `fci-rule-color' based on `+fci-rule-color-function's From 876660c28f7b51a26e7982e44b4cefff66b8bd3b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 1 Nov 2018 00:05:12 -0400 Subject: [PATCH 3399/4235] Revert #977 This width-workaround would simply toggle fci-mode on and off, every time window-size-change-functions and window-configuration-change-hook is triggered. --- modules/ui/fci/config.el | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el index c423d2f3c..77da05dd8 100644 --- a/modules/ui/fci/config.el +++ b/modules/ui/fci/config.el @@ -21,23 +21,6 @@ Changes to this variable do not take effect until `fci-mode' is restarted.") ;; more important to me, so... (add-hook 'org-mode-hook #'turn-off-fci-mode) - ;; turn off fci if the window is narrow than fill column - (defun +fci-toggle-maybe (window) - (let ((fci-enabled (symbol-value 'fci-mode)) - (fci-column (or fci-rule-column fill-column))) - (with-selected-window window - (if (and (eq fci-enabled nil) - (< fci-column - (+ (window-width) (window-hscroll)))) - (turn-on-fci-mode) - (turn-off-fci-mode))))) - - (defun +fci|width-workaround (&rest _) - (walk-windows #'+fci-toggle-maybe 'no-minibuf)) - - (add-hook 'window-size-change-functions #'+fci|width-workaround) - (add-hook 'window-configuration-change-hook #'+fci|width-workaround) - (defun +fci|set-color () "Automatically change `fci-rule-color' based on `+fci-rule-color-function's return value. To disable this, either set `+fci-rule-color-function' to nil or From faf5eea115b7beb77847fe34c3123713c42729bb Mon Sep 17 00:00:00 2001 From: Quentin Le Guennec Date: Thu, 1 Nov 2018 11:53:42 +0100 Subject: [PATCH 3400/4235] editor/lispyville: Add lispy smartparens being disabled in lispyville-mode, typing ( in insert state would not pair the paren --- .../editor/{lispyville => lispy}/README.org | 7 +++-- modules/editor/lispy/config.el | 28 +++++++++++++++++++ .../editor/{lispyville => lispy}/packages.el | 2 ++ modules/editor/lispyville/config.el | 24 ---------------- 4 files changed, 35 insertions(+), 26 deletions(-) rename modules/editor/{lispyville => lispy}/README.org (85%) create mode 100644 modules/editor/lispy/config.el rename modules/editor/{lispyville => lispy}/packages.el (87%) delete mode 100644 modules/editor/lispyville/config.el diff --git a/modules/editor/lispyville/README.org b/modules/editor/lispy/README.org similarity index 85% rename from modules/editor/lispyville/README.org rename to modules/editor/lispy/README.org index 84c5f9d95..a7d428860 100644 --- a/modules/editor/lispyville/README.org +++ b/modules/editor/lispy/README.org @@ -1,6 +1,6 @@ -#+TITLE: :editor lispyville +#+TITLE: :editor lispy -This modules adds [[https://github.com/noctuid/lispyville][lispyville]] key functionality in Lisp languages. +This modules adds [[https://github.com/noctuid/lispyville][lispy]] key functionality in Lisp languages. This includes: @@ -12,6 +12,9 @@ This includes: - [[http://lfe.io/][LFE]] - Clojure +If evil is enabled, lispyville would also be activated for every mode where +lispy is active + The default key themes that are set are as follows: #+BEGIN_SRC emacs-lisp diff --git a/modules/editor/lispy/config.el b/modules/editor/lispy/config.el new file mode 100644 index 000000000..4a5db3373 --- /dev/null +++ b/modules/editor/lispy/config.el @@ -0,0 +1,28 @@ +;;; editor/lispy/config.el -*- lexical-binding: t; -*- + +(def-package! lispy + :hook ((common-lisp-mode . lispy-mode) + (emacs-lisp-mode . lispy-mode) + (scheme-mode . lispy-mode) + (racket-mode . lispy-mode) + (hy-mode . lispy-mode) + (lfe-mode . lispy-mode) + (clojure-mode . lispy-mode)) + :config + (add-hook 'lispy-mode-hook #'turn-off-smartparens-mode)) + +(def-package! lispyville + :when (featurep! :feature evil) + :hook (lispy-mode . lispyville-mode) + :config + (lispyville-set-key-theme + '((operators normal) + c-w + (prettify insert) + (atom-movement normal visual) + slurp/barf-lispy + (wrap normal insert) + additional + additional-insert + (additional-wrap normal insert) + (escape insert)))) diff --git a/modules/editor/lispyville/packages.el b/modules/editor/lispy/packages.el similarity index 87% rename from modules/editor/lispyville/packages.el rename to modules/editor/lispy/packages.el index de5773587..953527d27 100644 --- a/modules/editor/lispyville/packages.el +++ b/modules/editor/lispy/packages.el @@ -1,5 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; editor/lispyville/packages.el +(package! lispy) + (when (featurep! :feature evil) (package! lispyville)) diff --git a/modules/editor/lispyville/config.el b/modules/editor/lispyville/config.el deleted file mode 100644 index b88994438..000000000 --- a/modules/editor/lispyville/config.el +++ /dev/null @@ -1,24 +0,0 @@ -;;; editor/lispyville/config.el -*- lexical-binding: t; -*- - -(def-package! lispyville - :when (featurep! :feature evil) - :hook ((common-lisp-mode . lispyville-mode) - (emacs-lisp-mode . lispyville-mode) - (scheme-mode . lispyville-mode) - (racket-mode . lispyville-mode) - (hy-mode . lispyville-mode) - (lfe-mode . lispyville-mode) - (clojure-mode . lispyville-mode)) - :config - (add-hook 'lispyville-mode-hook #'turn-off-smartparens-mode) - (lispyville-set-key-theme - '((operators normal) - c-w - (prettify insert) - (atom-movement normal visual) - slurp/barf-lispy - (wrap normal insert) - additional - additional-insert - (additional-wrap normal insert) - (escape insert)))) From 91b76d8437c4d417ac719fa22d49301aa01e90ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 2 Nov 2018 11:29:58 -0400 Subject: [PATCH 3401/4235] Move default snippets library to feature/snippets Removes the +snippets flag from config/default. The default snippets can be disabled by disabling the emacs-snippets package. --- init.example.el | 3 +-- modules/config/default/+bindings.el | 6 +++--- modules/config/default/autoload/default.el | 7 ------- modules/config/default/config.el | 8 -------- modules/config/default/packages.el | 8 -------- modules/feature/snippets/autoload/snippets.el | 19 +++++++++++++++++++ modules/feature/snippets/config.el | 5 +++++ modules/feature/snippets/packages.el | 4 ++++ 8 files changed, 32 insertions(+), 28 deletions(-) delete mode 100644 modules/config/default/packages.el diff --git a/init.example.el b/init.example.el index ee0f5da5d..cbecc46d0 100644 --- a/init.example.el +++ b/init.example.el @@ -156,5 +156,4 @@ ;; provides a Spacemacs-inspired keybinding scheme, a custom yasnippet ;; library, and additional ex commands for evil-mode. Use it as a ;; reference for your own modules. - (default +bindings +snippets +evil-commands)) - + (default +bindings +evil-commands)) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 9d035cdc0..1f4eaf539 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -766,9 +766,9 @@ (:desc "snippets" :prefix "s" :desc "New snippet" :n "n" #'yas-new-snippet :desc "Insert snippet" :nv "i" #'yas-insert-snippet - :desc "Find snippet" :n "s" #'+default/find-in-snippets - :desc "Find snippet for mode" :n "S" #'+default/browse-snippets - :desc "Find global snippet" :n "/" #'yas-visit-snippet-file + :desc "Jump to mode snippet" :n "/" #'yas-visit-snippet-file + :desc "Jump to snippet" :n "s" #'+snippets/find-file + :desc "Browse snippets" :n "S" #'+snippets/browse :desc "Reload snippets" :n "r" #'yas-reload-all)) (:desc "toggle" :prefix "t" diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 87e3277cd..81d673ab1 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -34,13 +34,6 @@ (defun +default/find-in-notes () (interactive) (doom-project-find-file org-directory)) -;;;###autoload -(defun +default/browse-snippets () - (interactive) (doom-project-browse +snippets-dir)) -;;;###autoload -(defun +default/find-in-snippets () - (interactive) (doom-project-find-file +snippets-dir)) - ;;;###autoload (defun +default/find-in-config () "Open a file somewhere in `doom-private-dir' via a fuzzy filename search." diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 16e745595..a3e032618 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -3,14 +3,6 @@ (if (featurep! +bindings) (load! "+bindings")) -;; -;; Packages - -(def-package! emacs-snippets - :if (featurep! +snippets) - :after yasnippet) - - ;; ;; Config diff --git a/modules/config/default/packages.el b/modules/config/default/packages.el deleted file mode 100644 index 87f8e83b6..000000000 --- a/modules/config/default/packages.el +++ /dev/null @@ -1,8 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; config/default/packages.el - -(when (featurep! +snippets) - (package! emacs-snippets - :recipe (:fetcher github - :repo "hlissner/emacs-snippets" - :files ("*")))) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index f58752a9e..9745e0ea9 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -101,3 +101,22 @@ buggy behavior when is pressed in an empty field." (if (symbol-value mode) (yas-activate-extra-mode mode) (yas-deactivate-extra-mode mode))) + + +;; +;; Commands + +;;;###autoload +(defun +snippets/browse (arg) + "TODO" + (interactive "P") + (doom-project-browse +snippets-dir)) + +;;;###autoload +(defun +snippets/find-file () + "TODO" + (interactive) + (if (file-directory-p +snippets-dir) + (doom-project-find-file +snippets-dir) + (yas-visit-snippet-file))) + diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index 4c4c3318b..c2f47b2a6 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -50,3 +50,8 @@ ;; `auto-yasnippet' (setq aya-persist-snippets-dir (concat doom-etc-dir "auto-snippets/")) + + +;; default snippets library +(def-package! emacs-snippets + :after yasnippet) diff --git a/modules/feature/snippets/packages.el b/modules/feature/snippets/packages.el index b02077c18..4ace1fb90 100644 --- a/modules/feature/snippets/packages.el +++ b/modules/feature/snippets/packages.el @@ -4,3 +4,7 @@ (package! yasnippet) (package! auto-yasnippet) +(package! emacs-snippets + :recipe (:fetcher github + :repo "hlissner/emacs-snippets" + :files ("*"))) From 6b2b5c225f1bb3b020da8d9d0c5522be9a81fa2f Mon Sep 17 00:00:00 2001 From: Niklas Carlsson Date: Sat, 3 Nov 2018 10:29:20 +0100 Subject: [PATCH 3402/4235] Close the ending quote in lispy-mode With this setting lispy closes the ending quote which is in alignment with how Doom treats quotes in other modes. --- modules/editor/lispy/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/editor/lispy/config.el b/modules/editor/lispy/config.el index 4a5db3373..0e32a7893 100644 --- a/modules/editor/lispy/config.el +++ b/modules/editor/lispy/config.el @@ -9,6 +9,7 @@ (lfe-mode . lispy-mode) (clojure-mode . lispy-mode)) :config + (setq lispy-close-quotes-at-end-p t) (add-hook 'lispy-mode-hook #'turn-off-smartparens-mode)) (def-package! lispyville From 90f30efa67a6535ee706400516e52268f66ebf45 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 4 Nov 2018 00:17:17 +1100 Subject: [PATCH 3403/4235] Add lispy to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index ee0f5da5d..b62941b19 100644 --- a/init.example.el +++ b/init.example.el @@ -51,6 +51,7 @@ multiple-cursors ; editing in many places at once ;;parinfer ; turn lisp into python, sort of rotate-text ; cycle region at point between text candidates + lispy ; vim for lisp, for people who dont like vim :emacs dired ; making dired pretty [functional] From b9b9c629af1c64092ed66ba5a2dbd92f6f25f9c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C3=98in=C3=A6s=20Myrseth?= Date: Mon, 5 Nov 2018 20:10:38 +0100 Subject: [PATCH 3404/4235] purescript: Properly register company backend --- modules/lang/purescript/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/purescript/config.el b/modules/lang/purescript/config.el index 4372a8743..2cf6fb038 100644 --- a/modules/lang/purescript/config.el +++ b/modules/lang/purescript/config.el @@ -16,5 +16,7 @@ (def-package! psc-ide - :hook (purescript-mode . psc-ide-mode)) - + :hook (purescript-mode . psc-ide-mode) + :config + (remove-hook 'company-backends 'company-psc-ide-backend) + (set-company-backend! 'purescript-mode 'company-psc-ide-backend)) From 34c490aae56695d809a3b70736569b88a8da53fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Nov 2018 19:22:03 -0500 Subject: [PATCH 3405/4235] lang/web: correct config file check for jekyll Jekyll looks for _config.(yml|toml), not config.yml. --- modules/lang/web/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/web/config.el b/modules/lang/web/config.el index 747435a50..973d8b424 100644 --- a/modules/lang/web/config.el +++ b/modules/lang/web/config.el @@ -24,7 +24,8 @@ (def-project-mode! +web-jekyll-mode :modes (web-mode js-mode coffee-mode css-mode haml-mode pug-mode) - :files (and "config.yml" (or "_layouts/" "_posts/")) + :files (and (or "_config.yml" "_config.toml") + (or "_layouts/" "_posts/")) :on-enter (when (eq major-mode 'web-mode) (web-mode-set-engine "django"))) From 9363ea8738f600d5dee0036dab8939d77c42ed22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 7 Nov 2018 19:24:16 -0500 Subject: [PATCH 3406/4235] Don't trigger flycheck on leaving insert state This is a bit overzealous (and can be slow where slow checkers/big projects are involved). Triggering it on ESC from normal mode (or C-g) should be enough. --- modules/feature/syntax-checker/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index e19a4e032..d05b5bb5e 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -13,8 +13,7 @@ (when flycheck-mode (ignore-errors (flycheck-buffer)) nil)) - (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) - (add-hook 'evil-insert-state-exit-hook #'+syntax-checkers|flycheck-buffer)) + (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t)) (global-flycheck-mode +1)) From 7d2d27abe630f06e592274bca3e79893722345d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 9 Nov 2018 13:35:59 -0500 Subject: [PATCH 3407/4235] Make +childframe, +auto & +fuzzy opt-in - +childframe is buggy on MacOS - +auto is slow in some modes - +fuzzy is slow with some ivy/helm commands --- init.example.el | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/init.example.el b/init.example.el index cbecc46d0..16f2709a1 100644 --- a/init.example.el +++ b/init.example.el @@ -10,18 +10,14 @@ +docsets) ; ...or in Dash docsets locally snippets ; my elves. They type so I don't have to spellcheck ; tasing you for misspelling mispelling - (syntax-checker ; tasing you for every semicolon you forget - +childframe) ; use childframes for error popups (Emacs 26+ only) + syntax-checker ; tasing you for every semicolon you forget workspaces ; tab emulation, persistence & separate workspaces :completion - (company ; the ultimate code completion backend - +auto) ; as-you-type code completion - (helm ; the *other* search engine for love and life - +fuzzy) ; enable fuzzy search backend for helm - ;;ido ; the other *other* search engine... - ;;(ivy ; a search engine for love and life - ;; +fuzzy) ; enable fuzzy search backend for ivy + company ; the ultimate code completion backend + helm ; the *other* search engine for love and life + ;;ido ; the other *other* search engine... + ;;ivy ; a search engine for love and life :ui ;;deft ; notational velocity for Emacs From 412063f452237894b295e7d8e6cabaa81f2257c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 12 Nov 2018 02:35:53 -0500 Subject: [PATCH 3408/4235] lang/web: fix 'pair was never defined' error Caused by recent change upstream, in smartparens --- modules/lang/web/+html.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 31db91490..610deca66 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -36,7 +36,7 @@ (defun +web-is-auto-close-style-3 (_id action _context) (and (eq action 'insert) (eq web-mode-auto-close-style 3))) - (sp-local-pair 'web-mode "<" nil :unless '(:add +web-is-auto-close-style-3)) + (sp-local-pair 'web-mode "<" ">" :unless '(:add +web-is-auto-close-style-3)) ;; let smartparens handle these (setq web-mode-enable-auto-quoting nil From 6ba406c617d00dfeed6c150312612ef8c4c7196d Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Mon, 12 Nov 2018 20:37:35 +0200 Subject: [PATCH 3409/4235] Change `magit-blame-addition` to `magit-blame` `magit-blame` is deprecated (as of Magit 2.90.0) --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 1f4eaf539..5b7afbcd1 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -627,7 +627,7 @@ :desc "Delete this file" :n "X" #'doom/delete-this-file) (:desc "git" :prefix "g" - :desc "Magit blame" :n "b" #'magit-blame + :desc "Magit blame" :n "b" #'magit-blame-addition :desc "Magit commit" :n "c" #'magit-commit :desc "Magit clone" :n "C" #'+magit/clone :desc "Magit dispatch" :n "d" #'magit-dispatch-popup From f822796443555c088a22045ff3f30c2f73589a6a Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 14 Nov 2018 07:22:39 +1100 Subject: [PATCH 3410/4235] Add rudimentary readme to parinfer --- modules/editor/parinfer/README.org | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 modules/editor/parinfer/README.org diff --git a/modules/editor/parinfer/README.org b/modules/editor/parinfer/README.org new file mode 100644 index 000000000..e079c708a --- /dev/null +++ b/modules/editor/parinfer/README.org @@ -0,0 +1,3 @@ +#+TITLE: :editor parinfer + +You can find out more about parinfer at https://shaunlebron.github.io/parinfer/ From 19539dacef1d37e187e4cfe9d57c14473e196bee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 13 Nov 2018 18:15:32 -0500 Subject: [PATCH 3411/4235] Alphabetize & disable lisp in init.example.el --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index b62941b19..36715fdf0 100644 --- a/init.example.el +++ b/init.example.el @@ -48,10 +48,10 @@ :editor ;;(format +onsave) ; automated prettiness + ;;lispy ; vim for lisp, for people who dont like vim multiple-cursors ; editing in many places at once ;;parinfer ; turn lisp into python, sort of rotate-text ; cycle region at point between text candidates - lispy ; vim for lisp, for people who dont like vim :emacs dired ; making dired pretty [functional] From a1e8fde75c556865772b274f265b7e18c9aa8bb0 Mon Sep 17 00:00:00 2001 From: Elijah Malaby Date: Tue, 13 Nov 2018 21:29:16 -0500 Subject: [PATCH 3412/4235] Removed :select nil from cider-repl popup rules --- modules/lang/clojure/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index c73514d42..4768bf219 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -6,7 +6,7 @@ (set-popup-rules! '(("^\\*cider-error*" :ignore t) - ("^\\*cider-repl" :quit nil :select nil) + ("^\\*cider-repl" :quit nil) ("^\\*cider-repl-history" :vslot 2 :ttl nil))) (def-package! cider From 80e53eee5dca531d45d53b14b07864bb90a7dd22 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 15 Nov 2018 00:54:22 -0500 Subject: [PATCH 3413/4235] lang/python: add homebrew miniconda3 path For `brew cask install miniconda` --- modules/lang/python/config.el | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index d4c694611..d3f78af61 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -161,11 +161,14 @@ :config ;; The location of your anaconda home will be guessed from the following: ;; - ;; + ANACONDA_HOME - ;; + ~/.anaconda3 + ;; + `conda-anaconda-home's default value: + ;; + ANACONDA_HOME + ;; + ~/.anaconda3 ;; + ~/.anaconda ;; + ~/.miniconda ;; + ~/usr/bin/anaconda3 + ;; + ~/usr/local/anaconda3 + ;; + ~/usr/local/miniconda3 ;; ;; If none of these work for you, you must set `conda-anaconda-home' ;; explicitly. Once set, run M-x `conda-env-activate' to switch between @@ -174,7 +177,8 @@ "~/.anaconda" "~/.miniconda" "/usr/bin/anaconda3" - "/usr/local/anaconda3") + "/usr/local/anaconda3" + "/usr/local/miniconda3") if (file-directory-p dir) return (setq conda-anaconda-home dir conda-env-home-directory dir)) From 7e02cbb17de1902f5572a4b51f79af26a8871eb7 Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Wed, 14 Nov 2018 22:33:18 -0800 Subject: [PATCH 3414/4235] lang/python: add miniconda3 path --- modules/lang/python/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index d3f78af61..3814e787a 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -176,6 +176,7 @@ (unless (cl-loop for dir in (list conda-anaconda-home "~/.anaconda" "~/.miniconda" + "~/.miniconda3" "/usr/bin/anaconda3" "/usr/local/anaconda3" "/usr/local/miniconda3") From ba497653589f67b2ffd85dfccc80f8669dd61cc4 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Thu, 22 Nov 2018 12:53:08 -0600 Subject: [PATCH 3415/4235] Initial pytest --- modules/lang/python/config.el | 12 ++++++++++++ modules/lang/python/packages.el | 1 + 2 files changed, 13 insertions(+) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 3814e787a..406c4b577 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -110,6 +110,18 @@ :n "O" #'nosetests-pdb-one :n "V" #'nosetests-pdb-module)) +(def-package! python-pytest + :commands pytest-mode + :preface (defvar pytest-mode-map (make-sparse-keymap)) + :init (associate! pytest-mode :match "/test_.+\\.py$" :modes (python-mode)) + (set-yas-minor-mode! 'pytest-mode) + (when (featurep 'evil) + (add-hook 'pytest-mode-hook #'evil-normalize-keymaps)) + + (map! :map nose-mode-map + :localleader + :prefix "t" + :n "r" #'nosetests-again)) ;; ;; Environment management diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index 1c30b8bf1..cfe418184 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -4,6 +4,7 @@ ;; requires: python setuptools (package! nose) +(package! python-pytest) (package! pip-requirements) ;; Environmet management From e9bdf89c73305f8a04e8d9cb7930a5de2a9e4180 Mon Sep 17 00:00:00 2001 From: Kazutoshi Noguchi Date: Fri, 23 Nov 2018 23:13:32 +0900 Subject: [PATCH 3416/4235] Fix 'SPC m b r' in go-mode. --- modules/lang/go/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 1e3fcc847..3ca9ab344 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -43,7 +43,7 @@ :n "ia" #'go-import-add :n "ir" #'go-remove-unused-imports) (:prefix "b" - :n "r" (λ! (compile "go run")) + :n "r" (λ! (compile "go run .")) :n "b" (λ! (compile "go build")) :n "c" (λ! (compile "go clean"))) (:prefix "t" From 2c0b0fac775150a479c13053695395ce2757a2a8 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Fri, 23 Nov 2018 11:06:03 -0600 Subject: [PATCH 3417/4235] Keybindings are added to python-mode-map --- modules/lang/python/config.el | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 406c4b577..0fc993815 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -111,17 +111,11 @@ :n "V" #'nosetests-pdb-module)) (def-package! python-pytest - :commands pytest-mode - :preface (defvar pytest-mode-map (make-sparse-keymap)) - :init (associate! pytest-mode :match "/test_.+\\.py$" :modes (python-mode)) - (set-yas-minor-mode! 'pytest-mode) - (when (featurep 'evil) - (add-hook 'pytest-mode-hook #'evil-normalize-keymaps)) - - (map! :map nose-mode-map + :config + (map! :map python-mode-map :localleader :prefix "t" - :n "r" #'nosetests-again)) + :nv "p" #'python-pytest-popup)) ;; ;; Environment management From 52f805ba621f2ce19a3b7b80f5046405fb434be8 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Fri, 23 Nov 2018 11:14:25 -0600 Subject: [PATCH 3418/4235] Add some extra keybindings --- modules/lang/python/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 0fc993815..c290b9058 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -115,6 +115,9 @@ (map! :map python-mode-map :localleader :prefix "t" + :nv "f" #'python-pytest-file + :nv "k" #'python-pytest-file-dwim + :nv "m" #'python-pytest-repeat :nv "p" #'python-pytest-popup)) ;; From 3b67338b4a03c9bf315e7f46e02eb059c98fe176 Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Tue, 27 Nov 2018 22:08:35 +0800 Subject: [PATCH 3419/4235] Don't scan frames other than current in popup This accidentally reuses windows in other frames, especially when there are multiple compliation buffers. --- modules/ui/popup/autoload/popup.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index a526c45fa..e9d941900 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -444,7 +444,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (lambda (window) (and (eq (window-parameter window 'window-side) side) (eq (window-parameter window 'window-vslot) vslot))) - nil t)) + nil)) (reversed (window--sides-reverse-on-frame-p (selected-frame))) (windows (cond ((window-live-p major) From ff5af788604f19cb4f5e0ac97871f47fd0215499 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Wed, 28 Nov 2018 18:18:42 -0600 Subject: [PATCH 3420/4235] Add MagitHub popup default binding --- modules/config/default/+bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 5b7afbcd1..0669bec74 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -635,6 +635,7 @@ :desc "Magit status" :n "g" #'magit-status :desc "Magit file delete" :n "x" #'magit-file-delete :desc "List gists" :n "G" #'+gist:list + :desc "MagitHub dispatch" :n "h" #'magithub-dispatch-popup :desc "Initialize repo" :n "i" #'magit-init :desc "Browse issues tracker" :n "I" #'+vc/git-browse-issues :desc "Magit buffer log" :n "l" #'magit-log-buffer-file From c3dc660b1b69b268a96c7ac201ffd94c4605b2a5 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 29 Nov 2018 23:22:07 +1100 Subject: [PATCH 3421/4235] Use fd for populating projectile cache --- modules/tools/magit/config.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index c924e559f..d04089366 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -47,7 +47,14 @@ what features are available.") ;; Don't replace the leader key ;; FIXME remove me when general.el is integrated (when doom-leader-key - (define-key magit-diff-mode-map (kbd doom-leader-key) nil))) + (define-key magit-diff-mode-map (kbd doom-leader-key) nil)) + + ;; If fd exists, use it for git and generic projects + ;; fd is a rust program that is significantly faster. It also respects + ;; .gitignore. This is recommended in the projectile docs + (when (executable-find "fd") + (setq projectile-git-command "fd . -0" + projectile-generic-command projectile-git-command))) (def-package! magit-todos :hook (magit-mode . magit-todos-mode) From e7141d2c9615e4065fe68d771bdb9439a318f5be Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 2 Dec 2018 00:06:46 +1100 Subject: [PATCH 3422/4235] use --type f with fd will show folders otherwise --- modules/tools/magit/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index d04089366..7b8a96d88 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -53,7 +53,7 @@ what features are available.") ;; fd is a rust program that is significantly faster. It also respects ;; .gitignore. This is recommended in the projectile docs (when (executable-find "fd") - (setq projectile-git-command "fd . -0" + (setq projectile-git-command "fd . --type f -0" projectile-generic-command projectile-git-command))) (def-package! magit-todos From fead537328cf828f711125b624376eb9227113ba Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sat, 1 Dec 2018 15:25:12 -0500 Subject: [PATCH 3423/4235] Fix: common-lisp module jump hydra conflict This hydra conflicts with Doom's popup windows in the case a jump creates a sly-xref-mode buffer. Use direct local leader bindings instead. --- modules/lang/common-lisp/autoload/hydras.el | 19 ------------------- modules/lang/common-lisp/config.el | 10 ++++++++-- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/modules/lang/common-lisp/autoload/hydras.el b/modules/lang/common-lisp/autoload/hydras.el index aa8ac79bd..3257353a9 100644 --- a/modules/lang/common-lisp/autoload/hydras.el +++ b/modules/lang/common-lisp/autoload/hydras.el @@ -1,24 +1,5 @@ ;;; lang/common-lisp/autoload/hydras.el -*- lexical-binding: t; -*- -;;;###autoload (autoload '+common-lisp/navigation/body "lang/common-lisp/autoload/hydras" nil nil) -(defhydra +common-lisp/navigation (:exit nil :hint nil :foreign-keys run) - " -^^Definitions ^^Compiler Notes ^^Stickers -^^^^^^───────────────────────────────────────────────────────────────────────────────────── -[_g_] Jump to definition [_n_] Next compiler note [_s_] Next sticker -[_G_] Jump to definition (other window) [_N_] Previous compiler note [_S_] Previous sticker -[_b_] Pop from definition -[_q_] Exit -" - ("g" sly-edit-definition) - ("G" sly-edit-definition-other-window) - ("b" sly-pop-find-definition-stack) - ("n" sly-next-note) - ("N" sly-previous-note) - ("s" sly-stickers-next-sticker) - ("S" sly-stickers-prev-sticker) - ("q" nil :exit t)) - ;;;###autoload (autoload '+common-lisp/macrostep/body "lang/common-lisp/autoload/hydras" nil nil) (defhydra +common-lisp/macrostep (:exit nil :hint nil :foreign-keys run) " diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index d4134d8fc..a498d621a 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -30,7 +30,6 @@ (sp-local-pair "'" "'" :actions nil) (sp-local-pair "`" "`" :actions nil)) - ;; (defun +common-lisp|cleanup-sly-maybe () "Kill processes and leftover buffers when killing the last sly buffer." (unless (cl-loop for buf in (delq (current-buffer) (buffer-list)) @@ -70,7 +69,14 @@ bin/doom while packages at compile-time (not a runtime though)." (map! :map sly-mode-map :localleader :n "'" #'sly - :n "g" #'+common-lisp/navigation/body + (:prefix "g" + :n "d" #'sly-edit-definition + :n "D" #'sly-edit-definition-other-window + :n "b" #'sly-pop-find-definition-stack + :n "n" #'sly-next-note + :n "N" #'sly-previous-note + :n "s" #'sly-stickers-next-sticker + :n "S" #'sly-stickers-prev-sticker) (:prefix "h" :n "a" #'sly-apropos :n "b" #'sly-who-binds From 3635e23be7254fea75e638f8c32de7c681659b41 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sat, 1 Dec 2018 15:26:44 -0500 Subject: [PATCH 3424/4235] Minor: common-lisp macro expander hydra as default It is usually the case that we want to easily step through the expansion of a macro inline, so prevent a modifier key press. --- modules/lang/common-lisp/config.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index a498d621a..73a3e659a 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -105,8 +105,8 @@ bin/doom while packages at compile-time (not a runtime though)." :n "F" #'sly-undefine-function :n "r" #'sly-eval-region) (:prefix "m" - :n "e" #'macrostep-expand - :n "E" #'+common-lisp/macrostep/body) + :n "e" #'+common-lisp/macrostep/body + :n "E" #'macrostep-expand) (:prefix "r" :n "c" #'sly-mrepl-clear-repl :n "q" #'sly-quit-lisp @@ -232,3 +232,7 @@ bin/doom while packages at compile-time (not a runtime though)." "gr" 'sly-recompile-xref "gR" 'sly-recompile-all-xrefs "r" 'sly-xref-retract))) + +(def-package! sly-repl-ansi-color + :config + (push 'sly-repl-ansi-color sly-contribs)) From 252286201634dfbca91007ca137cf9adddbe9a56 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sat, 1 Dec 2018 15:30:48 -0500 Subject: [PATCH 3425/4235] Feature: Enable sly-repl-ansi-color in common-lisp This gives ANSI color escape sequence support in the REPL, needed by some software. --- modules/lang/common-lisp/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/common-lisp/packages.el b/modules/lang/common-lisp/packages.el index 8541ea496..cc0549ea0 100644 --- a/modules/lang/common-lisp/packages.el +++ b/modules/lang/common-lisp/packages.el @@ -3,3 +3,4 @@ (package! sly) (package! sly-macrostep) +(package! sly-repl-ansi-color) From 89c1180b7336dbb99aeb69176e5631e71006b0be Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sun, 2 Dec 2018 00:42:15 -0500 Subject: [PATCH 3426/4235] Minor: lexicographically sort bindings Just so I can see what is bound already more easily. --- modules/lang/common-lisp/config.el | 112 ++++++++++++++--------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 73a3e659a..869de13ec 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -70,14 +70,16 @@ bin/doom while packages at compile-time (not a runtime though)." :localleader :n "'" #'sly (:prefix "g" + :n "b" #'sly-pop-find-definition-stack :n "d" #'sly-edit-definition :n "D" #'sly-edit-definition-other-window - :n "b" #'sly-pop-find-definition-stack :n "n" #'sly-next-note :n "N" #'sly-previous-note :n "s" #'sly-stickers-next-sticker :n "S" #'sly-stickers-prev-sticker) (:prefix "h" + :n "<" #'sly-who-calls + :n ">" #'sly-calls-who :n "a" #'sly-apropos :n "b" #'sly-who-binds :n "d" #'sly-disassemble-symbol @@ -87,9 +89,7 @@ bin/doom while packages at compile-time (not a runtime though)." :n "p" #'sly-apropos-package :n "r" #'sly-who-references :n "s" #'sly-who-specializes - :n "S" #'sly-who-sets - :n "<" #'sly-who-calls - :n ">" #'sly-calls-who) + :n "S" #'sly-who-sets) (:prefix "c" :n "c" #'sly-compile-file :n "C" #'sly-compile-and-load-file @@ -142,44 +142,18 @@ bin/doom while packages at compile-time (not a runtime though)." (evil-define-key 'normal sly-parent-map (kbd "C-t") #'sly-pop-find-definition-stack) (evil-define-key 'normal sly-db-mode-map - (kbd "RET") 'sly-db-default-action - (kbd "C-m") 'sly-db-default-action - [return] 'sly-db-default-action - [mouse-2] 'sly-db-default-action/mouse [follow-link] 'mouse-face - "\C-i" 'sly-db-cycle - "g?" 'describe-mode - "S" 'sly-db-show-source - "e" 'sly-db-eval-in-frame - "d" 'sly-db-pprint-eval-in-frame - "D" 'sly-db-disassemble - "i" 'sly-db-inspect-in-frame - "gj" 'sly-db-down - "gk" 'sly-db-up + [mouse-2] 'sly-db-default-action/mouse + [return] 'sly-db-default-action + (kbd "C-i") 'sly-db-cycle (kbd "C-j") 'sly-db-down (kbd "C-k") 'sly-db-up - "]" 'sly-db-details-down - "[" 'sly-db-details-up + (kbd "C-m") 'sly-db-default-action (kbd "C-S-j") 'sly-db-details-down (kbd "C-S-k") 'sly-db-details-up - "gg" 'sly-db-beginning-of-backtrace - "G" 'sly-db-end-of-backtrace - "t" 'sly-db-toggle-details - "gr" 'sly-db-restart-frame - "I" 'sly-db-invoke-restart-by-name - "R" 'sly-db-return-from-frame - "c" 'sly-db-continue - "s" 'sly-db-step - "n" 'sly-db-next - "o" 'sly-db-out - "b" 'sly-db-break-on-return - "a" 'sly-db-abort - "q" 'sly-db-quit - "A" 'sly-db-break-with-system-debugger - "B" 'sly-db-break-with-default-debugger - "P" 'sly-db-print-condition - "C" 'sly-db-inspect-condition - "g:" 'sly-interactive-eval + (kbd "RET") 'sly-db-default-action + "]" 'sly-db-details-down + "[" 'sly-db-details-up "0" 'sly-db-invoke-restart-0 "1" 'sly-db-invoke-restart-1 "2" 'sly-db-invoke-restart-2 @@ -189,46 +163,72 @@ bin/doom while packages at compile-time (not a runtime though)." "6" 'sly-db-invoke-restart-6 "7" 'sly-db-invoke-restart-7 "8" 'sly-db-invoke-restart-8 - "9" 'sly-db-invoke-restart-9) + "9" 'sly-db-invoke-restart-9 + "a" 'sly-db-abort + "A" 'sly-db-break-with-system-debugger + "b" 'sly-db-break-on-return + "B" 'sly-db-break-with-default-debugger + "c" 'sly-db-continue + "C" 'sly-db-inspect-condition + "d" 'sly-db-pprint-eval-in-frame + "D" 'sly-db-disassemble + "e" 'sly-db-eval-in-frame + "g:" 'sly-interactive-eval + "g?" 'describe-mode + "gg" 'sly-db-beginning-of-backtrace + "gj" 'sly-db-down + "gk" 'sly-db-up + "gr" 'sly-db-restart-frame + "G" 'sly-db-end-of-backtrace + "i" 'sly-db-inspect-in-frame + "I" 'sly-db-invoke-restart-by-name + "n" 'sly-db-next + "o" 'sly-db-out + "P" 'sly-db-print-condition + "q" 'sly-db-quit + "R" 'sly-db-return-from-frame + "s" 'sly-db-step + "S" 'sly-db-show-source + "t" 'sly-db-toggle-details) (evil-define-key 'normal sly-inspector-mode-map - [return] 'sly-inspector-operate-on-point - (kbd "C-m") 'sly-inspector-operate-on-point + [backtab] 'sly-inspector-previous-inspectable-object [mouse-1] 'sly-inspector-operate-on-click [mouse-2] 'sly-inspector-operate-on-click [mouse-6] 'sly-inspector-pop [mouse-7] 'sly-inspector-next - "gk" 'sly-inspector-pop + [return] 'sly-inspector-operate-on-point + [(shift tab)] 'sly-inspector-previous-inspectable-object + (kbd "C-i") 'sly-inspector-next-inspectable-object (kbd "C-k") 'sly-inspector-pop + (kbd "C-m") 'sly-inspector-operate-on-point + "." 'sly-inspector-show-source + "e" 'sly-inspector-eval "gj" 'sly-inspector-next + "gk" 'sly-inspector-pop + "gr" 'sly-inspector-reinspect + "gR" 'sly-inspector-fetch-all + "gv" 'sly-inspector-toggle-verbose "j" 'sly-inspector-next + "h" 'sly-inspector-history "k" 'sly-inspector-previous-inspectable-object "K" 'sly-inspector-describe "p" 'sly-inspector-pprint - "e" 'sly-inspector-eval - "h" 'sly-inspector-history - "gr" 'sly-inspector-reinspect - "gv" 'sly-inspector-toggle-verbose - "\C-i" 'sly-inspector-next-inspectable-object - [(shift tab)] 'sly-inspector-previous-inspectable-object ; Emacs translates S-TAB - [backtab] 'sly-inspector-previous-inspectable-object ; to BACKTAB on X. - "." 'sly-inspector-show-source - "gR" 'sly-inspector-fetch-all - "q" 'sly-inspector-quit) + "q" 'sly-inspector-quit (evil-define-key 'normal sly-mode-map (kbd "C-t") 'sly-pop-find-definition-stack) (evil-define-key 'normal sly-popup-buffer-mode-map - "q" 'quit-window - (kbd "C-t") 'sly-pop-find-definition-stack) + (kbd "C-t") 'sly-pop-find-definition-stack + "q" 'quit-window) (evil-define-key 'normal sly-xref-mode-map (kbd "RET") 'sly-goto-xref (kbd "S-") 'sly-goto-xref - "go" 'sly-show-xref - "gj" 'sly-xref-next-line - "gk" 'sly-xref-prev-line (kbd "C-j") 'sly-xref-next-line (kbd "C-k") 'sly-xref-prev-line "]" 'sly-xref-next-line "[" 'sly-xref-prev-line + "gj" 'sly-xref-next-line + "gk" 'sly-xref-prev-line + "go" 'sly-show-xref "gr" 'sly-recompile-xref "gR" 'sly-recompile-all-xrefs "r" 'sly-xref-retract))) From 261750c1585dbc6ef8e07e1bf620b9ad7f754be2 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sun, 2 Dec 2018 01:51:48 -0500 Subject: [PATCH 3427/4235] Fix: Improve common-lisp module bindings --- modules/lang/common-lisp/config.el | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 869de13ec..ff8cdc2fd 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -80,6 +80,8 @@ bin/doom while packages at compile-time (not a runtime though)." (:prefix "h" :n "<" #'sly-who-calls :n ">" #'sly-calls-who + :n "~" #'hyperspec-lookup-format + :n "#" #'hyperspec-lookup-reader-macro :n "a" #'sly-apropos :n "b" #'sly-who-binds :n "d" #'sly-disassemble-symbol @@ -96,14 +98,14 @@ bin/doom while packages at compile-time (not a runtime though)." :n "f" #'sly-compile-defun :n "l" #'sly-load-file :n "n" #'sly-remove-notes - :n "r" #'sly-compile-region) + :v "r" #'sly-compile-region) (:prefix "e" :n "b" #'sly-eval-buffer :n "e" #'sly-eval-last-expression :n "E" #'sly-eval-print-last-expression :n "f" #'sly-eval-defun :n "F" #'sly-undefine-function - :n "r" #'sly-eval-region) + :v "r" #'sly-eval-region) (:prefix "m" :n "e" #'+common-lisp/macrostep/body :n "E" #'macrostep-expand) @@ -124,8 +126,6 @@ bin/doom while packages at compile-time (not a runtime though)." :n "T" #'sly-toggle-fancy-trace :n "u" #'sly-untrace-all)) - ;; Since `evil-collection-slime' exists, but not `evil-collection-sly', we - ;; simply copy it (when (featurep! :feature evil +everywhere) (add-hook 'sly-mode-hook #'evil-normalize-keymaps) (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps) @@ -151,7 +151,6 @@ bin/doom while packages at compile-time (not a runtime though)." (kbd "C-m") 'sly-db-default-action (kbd "C-S-j") 'sly-db-details-down (kbd "C-S-k") 'sly-db-details-up - (kbd "RET") 'sly-db-default-action "]" 'sly-db-details-down "[" 'sly-db-details-up "0" 'sly-db-invoke-restart-0 @@ -188,7 +187,7 @@ bin/doom while packages at compile-time (not a runtime though)." "q" 'sly-db-quit "R" 'sly-db-return-from-frame "s" 'sly-db-step - "S" 'sly-db-show-source + "S" 'sly-db-show-frame-source "t" 'sly-db-toggle-details) (evil-define-key 'normal sly-inspector-mode-map [backtab] 'sly-inspector-previous-inspectable-object @@ -198,13 +197,15 @@ bin/doom while packages at compile-time (not a runtime though)." [mouse-7] 'sly-inspector-next [return] 'sly-inspector-operate-on-point [(shift tab)] 'sly-inspector-previous-inspectable-object + (kbd "") 'sly-mrepl-copy-part-to-repl (kbd "C-i") 'sly-inspector-next-inspectable-object (kbd "C-k") 'sly-inspector-pop (kbd "C-m") 'sly-inspector-operate-on-point "." 'sly-inspector-show-source + "D" 'sly-inspector-describe-inspectee "e" 'sly-inspector-eval + "gb" 'sly-inspector-pop "gj" 'sly-inspector-next - "gk" 'sly-inspector-pop "gr" 'sly-inspector-reinspect "gR" 'sly-inspector-fetch-all "gv" 'sly-inspector-toggle-verbose @@ -213,15 +214,15 @@ bin/doom while packages at compile-time (not a runtime though)." "k" 'sly-inspector-previous-inspectable-object "K" 'sly-inspector-describe "p" 'sly-inspector-pprint - "q" 'sly-inspector-quit + "q" 'sly-inspector-quit) (evil-define-key 'normal sly-mode-map (kbd "C-t") 'sly-pop-find-definition-stack) (evil-define-key 'normal sly-popup-buffer-mode-map (kbd "C-t") 'sly-pop-find-definition-stack "q" 'quit-window) (evil-define-key 'normal sly-xref-mode-map - (kbd "RET") 'sly-goto-xref - (kbd "S-") 'sly-goto-xref + [return] 'sly-goto-xref + (kbd "S-") 'sly-show-xref (kbd "C-j") 'sly-xref-next-line (kbd "C-k") 'sly-xref-prev-line "]" 'sly-xref-next-line From 9c96a2bab705732a47e4e87d3b2f31667fd78f25 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Sun, 2 Dec 2018 02:02:56 -0500 Subject: [PATCH 3428/4235] Fix: Prevent projectile from deleting important buffers --- core/core-projects.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 8034271c2..cefe87ac9 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -10,7 +10,8 @@ projectile-require-project-root t projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o") - projectile-ignored-projects '("~/" "/tmp")) + projectile-ignored-projects '("~/" "/tmp") + projectile-kill-buffers-filter 'kill-only-files) :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) From dcbcc4d1e765ea50d50fdb9d75378e4166472b71 Mon Sep 17 00:00:00 2001 From: Elijah Malaby Date: Sun, 2 Dec 2018 13:22:42 -0500 Subject: [PATCH 3429/4235] Added a popup rule to ignore proof general popups --- modules/lang/coq/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index eebd75636..7487ee9f2 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -6,6 +6,8 @@ (setq coq-mode-abbrev-table '()) (after! company-coq + (set-popup-rules! + '(("^\\*\\(response\\|goals\\)\\*" :ignore t))) (set-lookup-handlers! 'company-coq-mode :definition #'company-coq-jump-to-definition :references #'company-coq-grep-symbol From d063fff8a1fa46c2b15b3d5a5879ef234970f3ae Mon Sep 17 00:00:00 2001 From: Elijah Malaby Date: Sun, 2 Dec 2018 13:24:02 -0500 Subject: [PATCH 3430/4235] Fixed +popup--kill-buffer visibility check Now it checks all frames instead of only the current one. --- modules/ui/popup/autoload/popup.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index a526c45fa..6ae740c82 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -14,7 +14,7 @@ the buffer is visible, then set another timer and try again later." (when (buffer-live-p buffer) (let ((inhibit-quit t) (kill-buffer-hook (remq '+popup|kill-buffer-hook kill-buffer-hook))) - (cond ((get-buffer-window buffer) + (cond ((get-buffer-window buffer t) (with-current-buffer buffer (setq +popup--timer (run-at-time ttl nil #'+popup--kill-buffer buffer ttl)))) From 84af639fc345d87680470d0272854f6b74bbf092 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Dec 2018 22:23:57 -0500 Subject: [PATCH 3431/4235] set-popup-rules! -> set-popup-rule! Semantic refactor. Also adjusts regexp to use non-capturing group (for slight performance benefit). --- modules/lang/coq/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index 7487ee9f2..da7283ac6 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -6,8 +6,7 @@ (setq coq-mode-abbrev-table '()) (after! company-coq - (set-popup-rules! - '(("^\\*\\(response\\|goals\\)\\*" :ignore t))) + (set-popup-rule! "^\\*\\(?:response\\|goals\\)\\*" :ignore t) (set-lookup-handlers! 'company-coq-mode :definition #'company-coq-jump-to-definition :references #'company-coq-grep-symbol From 30fbb0d62f092b67c5d15e81512ef0bf125bc970 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 3 Dec 2018 23:15:40 -0500 Subject: [PATCH 3432/4235] Lazy-load python-pytest --- modules/lang/python/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index c290b9058..0f5077473 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -111,8 +111,9 @@ :n "V" #'nosetests-pdb-module)) (def-package! python-pytest - :config - (map! :map python-mode-map + :init + (map! :after python + :map python-mode-map :localleader :prefix "t" :nv "f" #'python-pytest-file From fe8b17d6da1ff94ab0ba4a60aa66dfdb04d67146 Mon Sep 17 00:00:00 2001 From: Aria Date: Tue, 4 Dec 2018 20:09:44 +1100 Subject: [PATCH 3433/4235] move projectile fd out of magit.el lol --- core/core-projects.el | 9 ++++++++- modules/tools/magit/config.el | 8 +------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 8034271c2..9ab29ef7e 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -52,7 +52,14 @@ "Don't traverse the file system if on a remote connection." (unless (file-remote-p default-directory) (funcall orig-fn file name))) - (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file)) + (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file) + + ;; If fd exists, use it for git and generic projects + ;; fd is a rust program that is significantly faster. It also respects + ;; .gitignore. This is recommended in the projectile docs + (when (executable-find "fd") + (setq projectile-git-command "fd . --type f -0" + projectile-generic-command projectile-git-command))) ;; diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 7b8a96d88..222b319ef 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -47,14 +47,8 @@ what features are available.") ;; Don't replace the leader key ;; FIXME remove me when general.el is integrated (when doom-leader-key - (define-key magit-diff-mode-map (kbd doom-leader-key) nil)) + (define-key magit-diff-mode-map (kbd doom-leader-key) nil))) - ;; If fd exists, use it for git and generic projects - ;; fd is a rust program that is significantly faster. It also respects - ;; .gitignore. This is recommended in the projectile docs - (when (executable-find "fd") - (setq projectile-git-command "fd . --type f -0" - projectile-generic-command projectile-git-command))) (def-package! magit-todos :hook (magit-mode . magit-todos-mode) From a5f9b8460ad93eb869685db87c2ea1b72d470eb6 Mon Sep 17 00:00:00 2001 From: Aria Date: Wed, 5 Dec 2018 15:21:53 +1100 Subject: [PATCH 3434/4235] setq auth-sources properly --- modules/config/default/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index a3e032618..1be81c827 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -7,7 +7,7 @@ ;; Config ;; Don't store authinfo in plain text! -(defvar auth-sources +(setq auth-sources (list (expand-file-name "authinfo.gpg" doom-etc-dir) "~/.authinfo.gpg")) From 9d374b3bfb5c0a284076c9409c102932b67a007a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 14:16:42 -0500 Subject: [PATCH 3435/4235] Fix "not in project" projectile error #1037 helm-projectile-find-file doesn't respect projectile-require-project-root by hard-coding it's no-project error handling into its helm-projectile-* functions. This means if you try to use helm-projectile-find-file in a non-project you get this error. So we use helm-find-files for non-projects instead. --- modules/completion/helm/autoload/helm.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 393459dc4..44c92f4ee 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -13,8 +13,9 @@ (interactive) (call-interactively (if (or (file-equal-p default-directory "~") - (when-let* ((proot (doom-project-root))) - (file-equal-p proot "~"))) + (if-let* ((proot (doom-project-root))) + (file-equal-p proot "~") + t)) #'helm-find-files #'helm-projectile-find-file))) From 553cee592104fcb14d42cd4c4f71bd74c808d6b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 14:22:14 -0500 Subject: [PATCH 3436/4235] lang/cc: remove naive cdb file check #1028 irony looks for compile_commands.json in several places, but +cc/reload-compile-db would error out if there it didn't exist at the project root. --- modules/lang/cc/autoload.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 060177709..cadfe4153 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -96,8 +96,6 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." (interactive) (unless (memq major-mode '(c-mode c++-mode objc-mode)) (user-error "Not a C/C++/ObjC buffer")) - (unless (project-file-exists-p! "compile_commands.json") - (user-error "No compile_commands.json file")) ;; first rtag (when (and (featurep 'rtags) rtags-enabled From 4455dc8baa349e7507aacd9f49355527b8cbd8f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 14:31:02 -0500 Subject: [PATCH 3437/4235] Extract ipython/jupyter arglist to variables Also fixes #1022 by removing default --pylab arg from +python/open-ipython-repl. --- modules/lang/python/autoload/python.el | 4 ++-- modules/lang/python/config.el | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 69766e881..796223ccd 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -27,7 +27,7 @@ "Open an IPython REPL." (interactive) (let ((python-shell-interpreter "ipython") - (python-shell-interpreter-args "-i --pylab --simple-prompt --no-color-info")) + (python-shell-interpreter-args +python-jupyter-repl-args)) (+python/repl))) ;;;###autoload @@ -36,7 +36,7 @@ (interactive) (add-to-list 'python-shell-completion-native-disabled-interpreters "jupyter") (let ((python-shell-interpreter "jupyter") - (python-shell-interpreter-args "console --simple-prompt")) + (python-shell-interpreter-args (format "console %s" +python-jupyter-repl-args))) (+python/repl))) (defun +python--extract-version (prefix str) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 0f5077473..23cadc948 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -3,6 +3,14 @@ (defconst +python-mode-line-indicator '("" +python--version) "Format for the python version/env indicator in the mode-line.") +(defvar +python-ipython-repl-args "-i --simple-prompt --no-color-info" + "CLI arguments to initialize ipython with when `+python/open-ipython-repl' is +called.") + +(defvar +python-jupyter-repl-args "--simple-prompt" + "CLI arguments to initialize 'jupiter console %s' with when +`+python/open-ipython-repl' is called.") + (defvar-local +python--version nil "The python version in the current buffer.") From 7b761a9b42a075dac134098611ff2a0367f6dba8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 19:01:17 -0500 Subject: [PATCH 3438/4235] Refactor feature deferral for (common|emacs)-lisp 'lisp-mode is now deferred, to make it easier to lazy-configure it --- core/core-lib.el | 20 ++++++++++++++++++++ modules/lang/common-lisp/config.el | 24 +++++++++++++++++------- modules/lang/emacs-lisp/config.el | 19 +------------------ 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 42b671be5..6ca4bab3b 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -141,6 +141,26 @@ serve as a predicated alternative to `after!'." (put ',fun 'permanent-local-hook t) (add-hook 'after-load-functions #',fun))))) +(defmacro defer-feature! (feature &optional mode) + "TODO" + (let ((advice-fn (intern (format "doom|defer-feature-%s" feature))) + (mode (or mode feature))) + `(progn + (delq ',feature features) + (advice-add #',mode :before #',advice-fn) + (defun ,advice-fn (&rest _) + ;; Some plugins (like yasnippet) run `lisp-mode' early, to parse some + ;; elisp. This would prematurely trigger this function. In these cases, + ;; `lisp-mode-hook' is let-bound to nil or its hooks are delayed, so if + ;; we see either, keep pretending elisp-mode isn't loaded. + (when (and ,(intern (format "%s-hook" mode)) + (not delay-mode-hooks)) + ;; Otherwise, announce to the world elisp-mode has been loaded, so + ;; `after!' handlers can respond and configure elisp-mode as + ;; expected. + (provide ',feature) + (advice-remove #',mode #',advice-fn)))))) + (defmacro after! (targets &rest body) "A smart wrapper around `with-eval-after-load'. Supresses warnings during compilation. This will no-op on features that have been disabled by the user." diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index ff8cdc2fd..fae642a74 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -1,7 +1,23 @@ ;;; lang/common-lisp/config.el -*- lexical-binding: t; -*- +;; `lisp-mode' is loaded at startup. In order to lazy load its config we need to +;; pretend it isn't loaded +(defer-feature! lisp-mode) + + +;; +;; packages + (defvar inferior-lisp-program "sbcl") -(add-hook 'lisp-mode-hook #'rainbow-delimiters-mode) + +(after! lisp-mode + (set-repl-handler! 'lisp-mode #'sly-mrepl) + (set-eval-handler! 'lisp-mode #'sly-eval-region) + (set-lookup-handlers! 'lisp-mode + :definition #'sly-edit-definition + :documentation #'sly-describe-symbol) + + (add-hook 'lisp-mode-hook #'rainbow-delimiters-mode)) (after! sly @@ -20,12 +36,6 @@ ;; These buffers are meant to be displayed with sufficient vertical space. (set-popup-rule! "^\\*sly-\\(db\\|inspector\\)" :ignore t) - (set-repl-handler! 'lisp-mode #'sly-mrepl) - (set-eval-handler! 'lisp-mode #'sly-eval-region) - (set-lookup-handlers! 'lisp-mode - :definition #'sly-edit-definition - :documentation #'sly-describe-symbol) - (sp-with-modes '(sly-mrepl-mode) (sp-local-pair "'" "'" :actions nil) (sp-local-pair "`" "`" :actions nil)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 9e875a81b..6d16fb904 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -3,26 +3,9 @@ (defvar +emacs-lisp-enable-extra-fontification t "If non-nil, highlight special forms, and defined functions and variables.") - -;; -;; elisp-mode deferral hack - ;; `elisp-mode' is loaded at startup. In order to lazy load its config we need ;; to pretend it isn't loaded -(delq 'elisp-mode features) -;; ...until the first time `emacs-lisp-mode' runs -(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init) - -(defun +emacs-lisp|init (&rest _) - ;; Some plugins (like yasnippet) run `emacs-lisp-mode' early, to parse some - ;; elisp. This would prematurely trigger this function. In these cases, - ;; `emacs-lisp-mode-hook' is let-bound to nil or its hooks are delayed, so if - ;; we see either, keep pretending elisp-mode isn't loaded. - (when (and emacs-lisp-mode-hook (not delay-mode-hooks)) - ;; Otherwise, announce to the world elisp-mode has been loaded, so `after!' - ;; handlers can respond and configure elisp-mode as expected. - (provide 'elisp-mode) - (advice-remove #'emacs-lisp-mode #'+emacs-lisp|init))) +(defer-feature! elisp-mode emacs-lisp-mode) ;; From 7c3cc3ed5fe868e56a44d4580573c022745b08b9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 19:17:40 -0500 Subject: [PATCH 3439/4235] Expand %:P relative to % instead of current buffer So ~/some/other/project/somefile.txt:P will resolve to ~/some/other/project, and not the project root of the current buffer. --- modules/feature/evil/autoload/advice.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index c56b87518..fc62bbcfd 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -133,8 +133,7 @@ more information on modifiers." (unless global 1)))) path)) ("P" - (let* ((default-directory (file-name-directory (expand-file-name path))) - (project-root (doom-project-root))) + (let ((project-root (doom-project-root (file-name-directory (expand-file-name path))))) (unless project-root (user-error "Not in a project")) (abbreviate-file-name project-root))) From 72bf089249d03b55f5cb1f0e636177cf34783095 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 19:19:27 -0500 Subject: [PATCH 3440/4235] Move evilified helpful keybinds to feature/evil So that they are available even if config/default isn't enabled. --- modules/config/default/+bindings.el | 6 +----- modules/feature/evil/+everywhere.el | 7 +++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 0669bec74..573874dcf 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -477,11 +477,7 @@ :map comint-mode-map [tab] #'company-complete)) (:map* (help-mode-map helpful-mode-map) - :n "o" #'ace-link-help - :n "q" #'quit-window - :n "Q" #'ivy-resume - :n "]l" #'forward-button - :n "[l" #'backward-button) + :n "Q" #'ivy-resume) (:after vc-annotate :map vc-annotate-mode-map diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 17e377f00..cca3472e8 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -184,6 +184,13 @@ variable for an explanation of the defaults (in comments). See (add-transient-hook! 'occur-mode (+evil-collection-init (if EMACS26+ 'replace "replace"))) +(after! helpful + (evil-define-key* 'normal helpful-mode-map + "o" #'ace-link-help + "q" #'quit-window + "]l" #'forward-button + "[l" #'backward-button)) + ;; Load the rest (dolist (mode evil-collection-mode-list) (dolist (req (or (cdr-safe mode) (list mode))) From 38d0d8801881e0df5f40ba46c59618189f91257f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 21:45:22 -0500 Subject: [PATCH 3441/4235] lang/common-lisp: lazyload sly-repl-ansi-color #1032 --- modules/lang/common-lisp/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index fae642a74..e4ff02331 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -244,6 +244,8 @@ bin/doom while packages at compile-time (not a runtime though)." "gR" 'sly-recompile-all-xrefs "r" 'sly-xref-retract))) + (def-package! sly-repl-ansi-color - :config - (push 'sly-repl-ansi-color sly-contribs)) + :defer t + :init + (add-to-list 'sly-contribs 'sly-repl-ansi-color nil #'eq)) From 408eecad8e0010c9275e7ea3a5dc57e4e3d0c643 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 21:45:40 -0500 Subject: [PATCH 3442/4235] lang/python: lazyload python-pytest #1026 --- modules/lang/python/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 23cadc948..5d31fa9a2 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -118,7 +118,9 @@ called.") :n "O" #'nosetests-pdb-one :n "V" #'nosetests-pdb-module)) + (def-package! python-pytest + :defer t :init (map! :after python :map python-mode-map @@ -129,6 +131,7 @@ called.") :nv "m" #'python-pytest-repeat :nv "p" #'python-pytest-popup)) + ;; ;; Environment management From 7214affc73608d0dca32a2714e86e0ed34cb60d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 22:07:33 -0500 Subject: [PATCH 3443/4235] tools/upload: set ssh-deploy vars sooner So that they don't overwrite file/dir local vars in some cases. --- modules/tools/upload/config.el | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/tools/upload/config.el b/modules/tools/upload/config.el index 7e2c19246..177ca4bf5 100644 --- a/modules/tools/upload/config.el +++ b/modules/tools/upload/config.el @@ -19,6 +19,10 @@ ssh-deploy-browse-remote-handler ssh-deploy-remote-changes-handler) :init + (setq ssh-deploy-revision-folder (concat doom-cache-dir "ssh-revisions/") + ssh-deploy-on-explicit-save t + ssh-deploy-automatically-detect-remote-changes nil) + ;; Make these safe as file-local variables (dolist (sym '((ssh-deploy-root-local . stringp) (ssh-deploy-root-remote . stringp) @@ -44,9 +48,4 @@ (setq ssh-deploy-root-local (doom-project-root))) (when ssh-deploy-automatically-detect-remote-changes (ssh-deploy-remote-changes-handler)))) - (add-hook 'find-file-hook #'+upload|init-find-file) - :config - (setq ssh-deploy-revision-folder (concat doom-cache-dir "ssh-revisions/") - ssh-deploy-on-explicit-save t - ssh-deploy-automatically-detect-remote-changes t)) - + (add-hook 'find-file-hook #'+upload|init-find-file)) From 5c294f5b01ba589f07cc49b6c7baab4c794324b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 22:08:30 -0500 Subject: [PATCH 3444/4235] =?UTF-8?q?ui/pretty-code:=20:src=5Fblock=5Fend?= =?UTF-8?q?=20=3D=20"=C2=BB"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In some cases, emacs fontification struggles with whitespace symbols. --- modules/ui/pretty-code/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 83d0f5b8d..1aafa4cc4 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -5,7 +5,7 @@ '(;; org :name "»" :src_block "»" - :src_block_end " " + :src_block_end "»" ;; Functional :lambda "λ" :def "ƒ" From 693711bf9cfe3ea169f8490eef070420b65526e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 22:10:02 -0500 Subject: [PATCH 3445/4235] ui/vc-gutter: git-gutter:window-width = 1 Hopefully fixes "jumpy gutter" when refreshing git-gutter in tty Emacs. --- modules/ui/vc-gutter/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index 1df3ba185..1a3979bcd 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -38,7 +38,7 @@ to the right fringe.") (setq-local git-gutter:init-function 'nil) (setq-local git-gutter:view-diff-function #'git-gutter:view-diff-infos) (setq-local git-gutter:clear-function #'git-gutter:clear-diff-infos) - (setq-local git-gutter:window-width nil)) + (setq-local git-gutter:window-width 1)) (git-gutter-mode +1))) (add-hook! (text-mode prog-mode conf-mode after-save) #'+version-control|git-gutter-maybe) From 33f2d5d321109cebf2d2f383604381cf5230b8eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 22:11:14 -0500 Subject: [PATCH 3446/4235] Upload load-order in doom!'s docstring --- core/core-modules.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 2c7fe893f..bee39dd97 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -269,12 +269,11 @@ The overall load order of Doom is as follows: ~/.emacs.d/init.el ~/.emacs.d/core/core.el - `doom-pre-init-hook' - ~/.doom.d/init.el - Module init.el files + $DOOMDIR/init.el + {$DOOMDIR,~/.emacs.d}/modules/*/*/init.el `doom-init-hook' - Module config.el files - ~/.doom.d/config.el + {$DOOMDIR,~/.emacs.d}/modules/*/*/config.el + $DOOMDIR/config.el `after-init-hook' `emacs-startup-hook' `doom-post-init-hook' (at end of `emacs-startup-hook') From db4e17d76d76fe9ba239994400b5b1e1253ee991 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 5 Dec 2018 22:28:37 -0500 Subject: [PATCH 3447/4235] Reindent auth-sources' value --- modules/config/default/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 1be81c827..5ddddc0c9 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -8,8 +8,8 @@ ;; Don't store authinfo in plain text! (setq auth-sources - (list (expand-file-name "authinfo.gpg" doom-etc-dir) - "~/.authinfo.gpg")) + (list (expand-file-name "authinfo.gpg" doom-etc-dir) + "~/.authinfo.gpg")) (after! epa (setq epa-file-encrypt-to From 1dc3e5289b84da3cbf04649dc454b49be421859e Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 6 Dec 2018 17:00:24 +1100 Subject: [PATCH 3448/4235] lang/elixir: add pretty-symbols --- modules/lang/elixir/config.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index cfa23f7b0..09d3a413b 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -15,6 +15,18 @@ :post-handlers '("||\n[i]")) (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) + (set-pretty-symbols! 'elixir-mode + ;; Functional + :def "def" + :lambda "fn" + :src_block "do" + :src_block_end "end" + ;; Flow + :not "!" + :in "in" :not-in "not in" + :and "and" :or "or" + :for "for" + :return "return" :yield "use") (def-package! alchemist-company :when (featurep! :completion company) From a11e78d710ab20828ffc67ce1fe869c690e4312f Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 6 Dec 2018 17:05:55 +1100 Subject: [PATCH 3449/4235] Change src_block_end to left arrows --- modules/ui/pretty-code/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 1aafa4cc4..59ab8bf5c 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -5,7 +5,7 @@ '(;; org :name "»" :src_block "»" - :src_block_end "»" + :src_block_end "«" ;; Functional :lambda "λ" :def "ƒ" From c2bce8cee453757dd0413757ba9686651b916761 Mon Sep 17 00:00:00 2001 From: Aria Date: Thu, 6 Dec 2018 17:09:00 +1100 Subject: [PATCH 3450/4235] lang/elixir: src_block{,_end} commented out --- modules/lang/elixir/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 09d3a413b..6792e97cc 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -19,8 +19,8 @@ ;; Functional :def "def" :lambda "fn" - :src_block "do" - :src_block_end "end" + ;; :src_block "do" + ;; :src_block_end "end" ;; Flow :not "!" :in "in" :not-in "not in" From 3249272da7d68ba6fc3f060b40b3a104a665d6ab Mon Sep 17 00:00:00 2001 From: Aria Edmonds <8436007+ar1a@users.noreply.github.com> Date: Thu, 6 Dec 2018 17:40:08 +1100 Subject: [PATCH 3451/4235] Fix popup link in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 60cb904a9..c9d504d69 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ If you'd like to support my efforts, I welcome contributions of any kind: [doom-my-commands]: modules/private/hlissner/+commands.el [doom-new-issue]: https://github.com/hlissner/doom-emacs/issues/new [doom-packages]: core/autoload/packages.el -[doom-popups]: core/core-popups.el +[doom-popups]: modules/ui/popup [doom-theme]: https://github.com/hlissner/emacs-doom-theme [company-mode]: https://github.com/company-mode/company-mode From b00ce82ef977fa6b8bc31395ec81b12120ec1a46 Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Wed, 5 Dec 2018 17:23:40 -0800 Subject: [PATCH 3452/4235] emacs/ranger: add ranger module to doom --- init.example.el | 1 + modules/config/default/+bindings.el | 4 +++ modules/emacs/ranger/autoload.el | 12 +++++++++ modules/emacs/ranger/config.el | 40 +++++++++++++++++++++++++++++ modules/emacs/ranger/packages.el | 6 +++++ 5 files changed, 63 insertions(+) create mode 100644 modules/emacs/ranger/autoload.el create mode 100644 modules/emacs/ranger/config.el create mode 100644 modules/emacs/ranger/packages.el diff --git a/init.example.el b/init.example.el index ad85bd8ba..d740412a6 100644 --- a/init.example.el +++ b/init.example.el @@ -51,6 +51,7 @@ :emacs dired ; making dired pretty [functional] + ;;ranger ; bringing the goodness of ranger to dired ediff ; comparing files in Emacs electric ; smarter, keyword-based electric-indent ;;eshell ; a consistent, cross-platform shell (WIP) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 573874dcf..73522ac04 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -698,6 +698,10 @@ :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl :desc "Dired" :n "-" #'dired-jump + (:when (featurep! :feature ranger) + :desc "Deer" :nm "j" #'deer + :desc "Ranger" :nm "J" #'ranger) + (:when (featurep! :ui neotree) :desc "Project sidebar" :n "p" #'+neotree/open :desc "Find file in project sidebar" :n "P" #'+neotree/find-this-file) diff --git a/modules/emacs/ranger/autoload.el b/modules/emacs/ranger/autoload.el new file mode 100644 index 000000000..c0fa0a6f5 --- /dev/null +++ b/modules/emacs/ranger/autoload.el @@ -0,0 +1,12 @@ +;;; private/ranger/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +my/dired-setup () + (setq dired-omit-verbose nil) + (make-local-variable 'dired-hide-details-hide-symlink-targets) + (setq dired-hide-details-hide-symlink-targets nil) + + ;; hide details by default + (dired-hide-details-mode t) + ;; omit the .. in dired + (dired-omit-mode t)) diff --git a/modules/emacs/ranger/config.el b/modules/emacs/ranger/config.el new file mode 100644 index 000000000..6d40952ab --- /dev/null +++ b/modules/emacs/ranger/config.el @@ -0,0 +1,40 @@ +;;; private/ranger/config.el -*- lexical-binding: t; -*- + +(def-package! dired + :hook (dired-mode . +my/dired-setup) + :config + ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq + ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning when + ;; not using GNU ls. We must look for `gls' after `exec-path-from-shell' was + ;; initialized to make sure that `gls' is in `exec-path' + (when IS-MAC + (let ((gls (executable-find "gls"))) + (if gls + (setq insert-directory-program gls) + (message "Please install `gls` using `brew instal coreutils`...")))) + (setq dired-listing-switches "-aBhl --group-directories-first")) + + +(def-package! ranger + :init + (setq ranger-override-dired t) + ;; set up image-dired to allow picture resize + (setq image-dired-dir (concat doom-cache-dir "image-dir")) + (unless (file-directory-p image-dired-dir) + (make-directory image-dired-dir)) + :config + (setq ranger-omit-regexp "^\.DS_Store$" + ranger-excluded-extensions '("mkv" "iso" "mp4") + ranger-deer-show-details nil + ranger-max-preview-size 10)) + + +(def-package! all-the-icons-dired + :defer t + :hook (dired-mode . all-the-icons-dired-mode)) + + +(def-package! font-lock+) + + +(def-package! dired-x) diff --git a/modules/emacs/ranger/packages.el b/modules/emacs/ranger/packages.el new file mode 100644 index 000000000..369233b18 --- /dev/null +++ b/modules/emacs/ranger/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; private/ranger/packages.el + +(package! ranger) +(package! all-the-icons-dired) +(package! font-lock+ :recipe (:fetcher github :repo "emacsmirror/font-lock-plus")) From 5698066c0adf86bb9171cf2819a0614f2ce9d0b1 Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Wed, 5 Dec 2018 23:15:23 -0800 Subject: [PATCH 3453/4235] emacs/ranger: check GUI for all-the-icons-dired-mode --- modules/emacs/ranger/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/emacs/ranger/config.el b/modules/emacs/ranger/config.el index 6d40952ab..18d5c4b36 100644 --- a/modules/emacs/ranger/config.el +++ b/modules/emacs/ranger/config.el @@ -31,7 +31,9 @@ (def-package! all-the-icons-dired :defer t - :hook (dired-mode . all-the-icons-dired-mode)) + :init + (when (display-graphic-p) + (add-hook! 'dired-mode-hook #'all-the-icons-dired-mode))) (def-package! font-lock+) From 6bd7b722819422a0f65e2498da5229aa1710491c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 15:51:59 -0500 Subject: [PATCH 3454/4235] Restore startup optimizations on after-init-hook Fixes an issue where tramp file handlers were overwritten because they were added to file-name-handler-alist at the end of after-init-hook. --- init.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.el b/init.el index 62500530d..3bab9f7e1 100644 --- a/init.el +++ b/init.el @@ -58,7 +58,7 @@ decrease this. If you experience stuttering, increase this.") ;; You get a minor speed up by nooping this. (setq file-name-handler-alist nil) ;; Not restoring these to their defaults will cause stuttering/freezes. - (add-hook 'emacs-startup-hook #'doom|restore-startup-optimizations)) + (add-hook 'after-init-hook #'doom|restore-startup-optimizations)) ;; Ensure Doom is running out of this file's directory From b5552eed3934b6b1ee1387f13a7c0c7fe99ed0fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 15:56:36 -0500 Subject: [PATCH 3455/4235] Improve predicate fn for byte-compile targets Will now avoid dotfiles and unit test files. --- core/cli/byte-compile.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index a08602908..be1a509eb 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -21,6 +21,12 @@ respectively.") ;; ;; Helpers +(defun doom--byte-compile-ignore-file-p (path) + (let ((filename (file-name-nondirectory path))) + (or (string-prefix-p "." filename) + (string-prefix-p "test-" filename) + (not (equal (file-name-extension path) "el"))))) + (defun doom-byte-compile (&optional modules recompile-p) "Byte compiles your emacs configuration. @@ -98,7 +104,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;; Assemble el files we want to compile; taking into account that ;; MODULES may be a list of MODULE/SUBMODULE strings from the command ;; line. - (let ((target-files (doom-files-in targets :depth 1 :match "\\.el$")) + (let ((target-files (doom-files-in targets :filter #'doom--byte-compile-ignore-file-p)) (load-path load-path) kill-emacs-hook kill-buffer-query-functions) (unless target-files From c56f802b4bd43e2f14f4c639fd0dadb685b46653 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 15:57:23 -0500 Subject: [PATCH 3456/4235] Update (if|when)-let* alias comments --- core/core-lib.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 6ca4bab3b..0a23b3146 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -7,11 +7,12 @@ (eval-and-compile (unless EMACS26+ (with-no-warnings - ;; if-let and when-let are deprecated in Emacs 26+ in favor of their - ;; if-let* variants, so we alias them for 25 users. + ;; if-let and when-let were moved to (if|when)-let* in Emacs 26+ so we + ;; alias them for 25 users. (defalias 'if-let* #'if-let) (defalias 'when-let* #'when-let)))) + ;; ;; Helpers From c71a73e43b753e2937045a97f7bf8c551aed33e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 15:58:35 -0500 Subject: [PATCH 3457/4235] feature/eval: split shrink-window & scroll-to-bof hook Easier to customize. --- modules/feature/eval/config.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/feature/eval/config.el b/modules/feature/eval/config.el index 9a1066a6a..b5c21ef7e 100644 --- a/modules/feature/eval/config.el +++ b/modules/feature/eval/config.el @@ -23,11 +23,16 @@ (advice-add #'quickrun :before #'+eval*quickrun-auto-close) (advice-add #'quickrun-region :before #'+eval*quickrun-auto-close) + (defun +eval|quickrun-shrink-window () + "Shrink the quickrun output window once code evaluation is complete." + (with-selected-window (get-buffer-window quickrun--buffer-name) + (let ((ignore-window-parameters t)) + (shrink-window-if-larger-than-buffer)))) + (add-hook 'quickrun-after-run-hook #'+eval|quickrun-shrink-window) + (defun +eval|quickrun-scroll-to-bof () "Ensures window is scrolled to BOF on invocation." (with-selected-window (get-buffer-window quickrun--buffer-name) - (goto-char (point-min)) - (let ((ignore-window-parameters t)) - (shrink-window-if-larger-than-buffer)))) + (goto-char (point-min)))) (add-hook 'quickrun-after-run-hook #'+eval|quickrun-scroll-to-bof)) From 745bd3238cc1dc81aafa69cb32dd0605ddd00527 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 16:01:10 -0500 Subject: [PATCH 3458/4235] Fix delete-other-windows from inside popups Occasionally, a window will lose its popup status, but not its special window parameters, forcing non-popups to be treated like popups when delete-other-windows is called. --- modules/ui/popup/autoload/popup.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 021bfc4e7..d12a44e62 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -72,11 +72,10 @@ the buffer is visible, then set another timer and try again later." buffer ttl)))))))))) (defun +popup--delete-other-windows (window) - "Called in lieu of `delete-other-windows' in popup windows. - -Raises WINDOW (assumed to be a popup), then deletes other windows." - (when-let* ((window (+popup/raise window))) - (delete-other-windows window)) + "Fixes `delete-other-windows' when used from a popup window." + (when-let* ((window (ignore-errors (+popup/raise window)))) + (let ((ignore-window-parameters t)) + (delete-other-windows window))) nil) (defun +popup--normalize-alist (alist) From b41e38dcf458a06b32b37b4614bde62425bfb906 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 17:50:32 -0500 Subject: [PATCH 3459/4235] Make RET respect popups in Buffer-menu --- modules/ui/popup/+hacks.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index e71826425..62644319d 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -32,6 +32,10 @@ ;; ;; External functions +;; `buff-menu' +(define-key Buffer-menu-mode-map (kbd "RET") #'Buffer-menu-other-window) + + ;; `company' (progn (defun +popup*dont-select-me (orig-fn &rest args) From 5c14fb42e0628b381c3b32d8a5af46975c072801 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 17:51:40 -0500 Subject: [PATCH 3460/4235] Add +popup/diagnose for debugging popup rules --- modules/ui/popup/autoload/popup.el | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index d12a44e62..b034c1ae8 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -390,6 +390,18 @@ the message buffer in a popup window." (+popup/close window 'force) (display-buffer-pop-up-window buffer nil))) +;;;###autoload +(defun +popup/diagnose () + "Reveal what popup rule will be used for the current buffer." + (interactive) + (or (cl-loop with bname = (buffer-name) + for (pred . action) in display-buffer-alist + if (and (functionp pred) (funcall pred bname action)) + return (cons pred action) + else if (and (stringp pred) (string-match-p pred bname)) + return (cons pred action)) + (message "No popup rule for this buffer"))) + ;; ;; Advice From 1610cd32b2c39070229fae44b8f925dce20f74e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 17:52:12 -0500 Subject: [PATCH 3461/4235] ui/popup: respect org-src-window-setup Added a new value for org-src-window-setup: 'popup-window Other values (like 'other-window) will revert to org's old behavior. Needs more testing. --- modules/ui/popup/+hacks.el | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index 62644319d..c888b548f 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -231,6 +231,7 @@ the command buffer." ;; `org' (after! org + (defvar +popup--disable-internal nil) ;; Org has a scorched-earth window management system I'm not fond of. i.e. it ;; kills all windows and monopolizes the frame. No thanks. We can do better ;; ourselves. @@ -247,12 +248,12 @@ the command buffer." (defun +popup*org-src-pop-to-buffer (orig-fn buffer context) "Hand off the src-block window to the popup system by using `display-buffer' instead of switch-to-buffer-*." - (if (and (eq org-src-window-setup 'other-window) + (if (and (eq org-src-window-setup 'popup-window) +popup-mode) (pop-to-buffer buffer) (funcall orig-fn buffer context))) (advice-add #'org-src-switch-to-buffer :around #'+popup*org-src-pop-to-buffer) - (setq org-src-window-setup 'other-window) + (setq org-src-window-setup 'popup-window) ;; Ensure todo, agenda, and other minor popups are delegated to the popup system. (defun +popup*org-pop-to-buffer (orig-fn buf &optional norecord) @@ -266,7 +267,22 @@ instead of switch-to-buffer-*." (setq org-agenda-window-setup 'other-window org-agenda-restore-windows-after-quit nil) ;; Don't monopolize frame! - (advice-add #'org-agenda :around #'+popup*suppress-delete-other-windows)) + (defun +popup*org-agenda-suppress-delete-other-windows (orig-fn &rest args) + (cond ((not +popup-mode) + (apply orig-fn args)) + ((eq org-agenda-window-setup 'popup-window) + (let (org-agenda-restore-windows-after-quit) + (cl-letf (((symbol-function 'delete-other-windows) + (symbol-function 'ignore))) + (apply orig-fn args)))) + ((memq org-agenda-window-setup '(current-window other-window)) + (with-popup-rules! nil + (cl-letf (((symbol-function 'delete-other-windows) + (symbol-function 'ignore))) + (apply orig-fn args)))) + ((with-popup-rules! nil + (apply orig-fn args))))) + (advice-add #'org-agenda-prepare-window :around #'+popup*org-agenda-suppress-delete-other-windows)) ;; `persp-mode' From 5e96b42cccb2961e681a57d2ddd5fb3828a6a05a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 6 Dec 2018 19:07:36 -0500 Subject: [PATCH 3462/4235] lang/latex: fix TeX-latex-mode error Caused because use-package is creating an autoload for TeX-latex-mode as if it were in the tex package, but it's in the latex package, instead. Since auctex already autoloads TeX-latex-mode, there's no need to set our own. --- modules/lang/latex/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index b6dbab64a..d7eec47bd 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -25,11 +25,12 @@ If no viewers are found, `latex-preview-pane' is used.") ;; ;; Packages -(def-package! tex - :mode ("\\.tex\\'" . TeX-latex-mode) - :config - (setq TeX-parse-self t ;; parse on load - TeX-auto-save t ;; parse on save +(add-to-list 'auto-mode-alist '("\\.tex\\'" . TeX-latex-mode)) + + +(after! tex + (setq TeX-parse-self t ; parse on load + TeX-auto-save t ; parse on save ;; use hidden dirs for auctex files TeX-auto-local ".auctex-auto" TeX-style-local ".auctex-style" From 67fa4b31ea13f19cb49c563ae10eca937caf543b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 7 Dec 2018 18:00:17 -0500 Subject: [PATCH 3463/4235] Restore =S gpg-sign option for magit Curiously, interactive rebasing seems to fail to sign commits without this option present in some cases. --- modules/tools/magit/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 222b319ef..25e992688 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -30,6 +30,9 @@ what features are available.") (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore t) + (magit-define-popup-option 'magit-rebase-popup + ?S "Sign using gpg" "--gpg-sign=" #'magit-read-gpg-secret-key) + ;; so magit buffers can be switched to (except for process buffers) (defun +magit-buffer-p (buf) (with-current-buffer buf From d6ad5942be03c657ca22c99617b707aaaf373867 Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Fri, 7 Dec 2018 22:27:03 -0800 Subject: [PATCH 3464/4235] emacs/dired: move ranger module to ranger feature in dired module --- init.example.el | 6 ++-- modules/config/default/+bindings.el | 2 +- modules/emacs/dired/config.el | 55 ++++++++++++++++++++++++++++- modules/emacs/dired/packages.el | 6 +++- modules/emacs/ranger/autoload.el | 12 ------- modules/emacs/ranger/config.el | 42 ---------------------- modules/emacs/ranger/packages.el | 6 ---- 7 files changed, 64 insertions(+), 65 deletions(-) delete mode 100644 modules/emacs/ranger/autoload.el delete mode 100644 modules/emacs/ranger/config.el delete mode 100644 modules/emacs/ranger/packages.el diff --git a/init.example.el b/init.example.el index d740412a6..f6baad4a3 100644 --- a/init.example.el +++ b/init.example.el @@ -50,8 +50,10 @@ rotate-text ; cycle region at point between text candidates :emacs - dired ; making dired pretty [functional] - ;;ranger ; bringing the goodness of ranger to dired + (dired ; making dired pretty [functional] + ;;+ranger ; bringing the goodness of ranger to dired + ;;+icons ; colorful icons for dired-mode + ) ediff ; comparing files in Emacs electric ; smarter, keyword-based electric-indent ;;eshell ; a consistent, cross-platform shell (WIP) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 73522ac04..7a56b75bd 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -698,7 +698,7 @@ :desc "REPL" :n "r" #'+eval/open-repl :v "r" #'+eval:repl :desc "Dired" :n "-" #'dired-jump - (:when (featurep! :feature ranger) + (:when (featurep! :emacs dired +ranger) :desc "Deer" :nm "j" #'deer :desc "Ranger" :nm "J" #'ranger) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 1bdafea03..8cc853a4c 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -17,6 +17,17 @@ image-dired-temp-image-file (concat image-dired-dir "temp-image") image-dired-temp-rotate-image-file (concat image-dired-dir "temp-rotate-image")) :config + ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq + ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning when + ;; not using GNU ls. We must look for `gls' after `exec-path-from-shell' was + ;; initialized to make sure that `gls' is in `exec-path' + (when IS-MAC + (let ((gls (executable-find "gls"))) + (if gls + (setq insert-directory-program gls) + (message "Please install `gls` using `brew instal coreutils`...")))) + (setq dired-listing-switches "-aBhl --group-directories-first") + (defun +dired|sort-directories-first () "List directories first in dired buffers." (save-excursion @@ -42,6 +53,7 @@ (def-package! dired-k + :unless (featurep! +ranger) :hook (dired-initial-position . dired-k) :hook (dired-after-readin . dired-k-no-revert) :config @@ -60,6 +72,47 @@ (advice-add #'dired-k--highlight :around #'+dired*dired-k-highlight)) +(def-package! ranger + :when (featurep! +ranger) + :init + (defun ranger/dired-setup () + (setq dired-omit-verbose nil) + (make-local-variable 'dired-hide-details-hide-symlink-targets) + (setq dired-hide-details-hide-symlink-targets nil) + ;; hide details by default + (dired-hide-details-mode t)) + (add-hook 'dired-mode-hook #'ranger/dired-setup) + + (setq ranger-override-dired t) + :config + ;; set up image-dired to allow picture resize + (setq image-dired-dir (concat doom-cache-dir "image-dir")) + (unless (file-directory-p image-dired-dir) + (make-directory image-dired-dir)) + + (setq ranger-omit-regexp "^\.DS_Store$" + ranger-excluded-extensions '("mkv" "iso" "mp4") + ranger-deer-show-details nil + ranger-max-preview-size 10)) + + +(def-package! all-the-icons-dired + :when (featurep! +icons) + :defer t + :init + (when (display-graphic-p) + (add-hook! 'dired-mode-hook #'all-the-icons-dired-mode))) + + +(def-package! font-lock+ + :when (featurep! +icons)) + + +(def-package! dired-x + :defer t + :commands dired-omit-mode + :hook (dired-mode . dired-omit-mode)) + ;; ;; Evil integration @@ -155,7 +208,7 @@ :n "r" #'dired-do-redisplay :n "m" #'dired-mark :n "t" #'dired-toggle-marks - :n "u" #'dired-unmark ; also "*u" + :n "u" #'dired-unmark ; also "*u" :n "W" #'browse-url-of-dired-file :n "x" #'dired-do-flagged-delete :n "gy" #'dired-show-file-type ;; FIXME: This could probably go on a better key. diff --git a/modules/emacs/dired/packages.el b/modules/emacs/dired/packages.el index c1ed6be70..63afa9aa9 100644 --- a/modules/emacs/dired/packages.el +++ b/modules/emacs/dired/packages.el @@ -2,4 +2,8 @@ ;;; emacs/dired/packages.el (package! dired-k) - +(when (featurep! +ranger) + (package! ranger)) +(when (featurep! +icons) + (package! all-the-icons-dired) + (package! font-lock+ :recipe (:fetcher github :repo "emacsmirror/font-lock-plus"))) diff --git a/modules/emacs/ranger/autoload.el b/modules/emacs/ranger/autoload.el deleted file mode 100644 index c0fa0a6f5..000000000 --- a/modules/emacs/ranger/autoload.el +++ /dev/null @@ -1,12 +0,0 @@ -;;; private/ranger/autoload.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +my/dired-setup () - (setq dired-omit-verbose nil) - (make-local-variable 'dired-hide-details-hide-symlink-targets) - (setq dired-hide-details-hide-symlink-targets nil) - - ;; hide details by default - (dired-hide-details-mode t) - ;; omit the .. in dired - (dired-omit-mode t)) diff --git a/modules/emacs/ranger/config.el b/modules/emacs/ranger/config.el deleted file mode 100644 index 18d5c4b36..000000000 --- a/modules/emacs/ranger/config.el +++ /dev/null @@ -1,42 +0,0 @@ -;;; private/ranger/config.el -*- lexical-binding: t; -*- - -(def-package! dired - :hook (dired-mode . +my/dired-setup) - :config - ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq - ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning when - ;; not using GNU ls. We must look for `gls' after `exec-path-from-shell' was - ;; initialized to make sure that `gls' is in `exec-path' - (when IS-MAC - (let ((gls (executable-find "gls"))) - (if gls - (setq insert-directory-program gls) - (message "Please install `gls` using `brew instal coreutils`...")))) - (setq dired-listing-switches "-aBhl --group-directories-first")) - - -(def-package! ranger - :init - (setq ranger-override-dired t) - ;; set up image-dired to allow picture resize - (setq image-dired-dir (concat doom-cache-dir "image-dir")) - (unless (file-directory-p image-dired-dir) - (make-directory image-dired-dir)) - :config - (setq ranger-omit-regexp "^\.DS_Store$" - ranger-excluded-extensions '("mkv" "iso" "mp4") - ranger-deer-show-details nil - ranger-max-preview-size 10)) - - -(def-package! all-the-icons-dired - :defer t - :init - (when (display-graphic-p) - (add-hook! 'dired-mode-hook #'all-the-icons-dired-mode))) - - -(def-package! font-lock+) - - -(def-package! dired-x) diff --git a/modules/emacs/ranger/packages.el b/modules/emacs/ranger/packages.el deleted file mode 100644 index 369233b18..000000000 --- a/modules/emacs/ranger/packages.el +++ /dev/null @@ -1,6 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; private/ranger/packages.el - -(package! ranger) -(package! all-the-icons-dired) -(package! font-lock+ :recipe (:fetcher github :repo "emacsmirror/font-lock-plus")) From d378fdbed03f47c17f87135eb42a999d4526e90f Mon Sep 17 00:00:00 2001 From: Aria Date: Sat, 8 Dec 2018 19:17:52 +1100 Subject: [PATCH 3465/4235] Clean up after swoop removal removed in 7f5e778b0c3abe14b2597f9b93fb399ff2335e62 --- modules/completion/helm/autoload/evil.el | 7 ------- modules/config/default/+evil-commands.el | 1 - 2 files changed, 8 deletions(-) diff --git a/modules/completion/helm/autoload/evil.el b/modules/completion/helm/autoload/evil.el index f7a0372c4..a5cfa3a25 100644 --- a/modules/completion/helm/autoload/evil.el +++ b/modules/completion/helm/autoload/evil.el @@ -1,13 +1,6 @@ ;;; completion/helm/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) -;;;###autoload (autoload '+helm:swoop "completion/helm/autoload/evil" nil t) -(evil-define-command +helm:swoop (&optional search bang) - "Invoke `swoop' with SEARCH. If BANG, do multiline search." - (interactive "") - (helm-swoop :$query search :$multiline bang)) - - ;; ;; Project searching diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el index 4b49f280f..88ef9fd6f 100644 --- a/modules/config/default/+evil-commands.el +++ b/modules/config/default/+evil-commands.el @@ -108,7 +108,6 @@ command from the current directory instead of the project root." (ex! "ptc[wd]" #'+helm:pt-from-cwd) (ex! "grep" #'+helm:grep) (ex! "grepc[wd]" #'+helm:grep-from-cwd) - (ex! "sw[oop]" #'+helm:swoop) ;; (ex! "todo" #'+helm:todo) TODO implement `+helm:todo' )) ;; Project tools From eedbbdd9c1f8447fd3b6bddc7ef31c13d03493fe Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Sat, 8 Dec 2018 21:52:24 -0800 Subject: [PATCH 3466/4235] emacs/dired: use all-the-icons font lock fix recipe --- core/packages.el | 4 +++- modules/emacs/dired/config.el | 10 ++-------- modules/emacs/dired/packages.el | 3 +-- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/core/packages.el b/core/packages.el index c41aeed79..344b0dbec 100644 --- a/core/packages.el +++ b/core/packages.el @@ -8,7 +8,9 @@ (package! ns-auto-titlebar)) ;; core-ui.el -(package! all-the-icons) +(package! all-the-icons + :recipe (:fetcher github :repo "ubolonton/all-the-icons.el" + :branch "font-lock-fix" :files (:defaults "data"))) (package! hide-mode-line) (package! highlight-indentation) (package! highlight-numbers) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 8cc853a4c..1e37c5f70 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -84,12 +84,11 @@ (add-hook 'dired-mode-hook #'ranger/dired-setup) (setq ranger-override-dired t) - :config ;; set up image-dired to allow picture resize (setq image-dired-dir (concat doom-cache-dir "image-dir")) (unless (file-directory-p image-dired-dir) (make-directory image-dired-dir)) - + :config (setq ranger-omit-regexp "^\.DS_Store$" ranger-excluded-extensions '("mkv" "iso" "mp4") ranger-deer-show-details nil @@ -100,12 +99,7 @@ :when (featurep! +icons) :defer t :init - (when (display-graphic-p) - (add-hook! 'dired-mode-hook #'all-the-icons-dired-mode))) - - -(def-package! font-lock+ - :when (featurep! +icons)) + (add-hook! 'dired-mode-hook #'all-the-icons-dired-mode)) (def-package! dired-x diff --git a/modules/emacs/dired/packages.el b/modules/emacs/dired/packages.el index 63afa9aa9..9bc49ca9a 100644 --- a/modules/emacs/dired/packages.el +++ b/modules/emacs/dired/packages.el @@ -5,5 +5,4 @@ (when (featurep! +ranger) (package! ranger)) (when (featurep! +icons) - (package! all-the-icons-dired) - (package! font-lock+ :recipe (:fetcher github :repo "emacsmirror/font-lock-plus"))) + (package! all-the-icons-dired)) From be531d4dcc42cb1a3ed9ffe90742d9d77a711657 Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Sat, 8 Dec 2018 22:34:27 -0800 Subject: [PATCH 3467/4235] emacs/dired: enable evil-window-map in motion state --- modules/config/default/+bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el index 7a56b75bd..363975d76 100644 --- a/modules/config/default/+bindings.el +++ b/modules/config/default/+bindings.el @@ -512,7 +512,7 @@ ;; C-u is used by evil :desc "Universal argument" :n "u" #'universal-argument - :desc "window" :n "w" evil-window-map + :desc "window" :nm "w" evil-window-map (:desc "previous..." :prefix "[" :desc "Text size" :nv "[" #'text-scale-decrease From 2d13dbe10a2bfdb536d158b1e42f3e1a7ab1c712 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Dec 2018 13:45:31 -0500 Subject: [PATCH 3468/4235] lang/org: fix ob-async support ob-async uses org-babel-load-languages to load babel packages in a child process, but packages entered into the org-babel-load-languages variable by Doom's lazy loader were misnamed. This caused load errors in the child process. The language-to-package resolution is now performed before it is entered into org-babel-load-languages. Additionally, ob-async will now be lazy loaded if it is available (and fail silently otherwise). --- modules/lang/org/+babel.el | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 42edd5c53..4336af32c 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -31,14 +31,12 @@ the first function to return non-nil.") "Load babel libraries as needed when babel blocks are executed." (when (funcall orig-fn info) (let* ((lang (nth 0 info)) - (lang (if (symbolp lang) lang (intern lang)))) + (lang (if (symbolp lang) lang (intern lang))) + (lang (or (cdr (assq lang +org-babel-mode-alist)) + lang))) (when (and (not (cdr (assq lang org-babel-load-languages))) (or (run-hook-with-args-until-success '+org-babel-load-functions lang) - (require - (intern (format "ob-%s" - (or (cdr (assq lang +org-babel-mode-alist)) - lang))) - nil t))) + (require (intern (format "ob-%s" lang)) nil t))) (add-to-list 'org-babel-load-languages (cons lang t))) t))) (advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library) @@ -52,7 +50,14 @@ the first function to return non-nil.") (cl-loop with fn = (if others #'not #'identity) for p in params if (funcall fn (eq (car p) key)) - collect p))) + collect p)) + + ;; org-async has its own agenda for lazy loading packages (in the child + ;; process), so we only need to make sure it's loaded. + (defun +org|load-async (&rest _) + "Load `ob-async', if it is available." + (require 'ob-async nil t)) + (add-hook '+org-babel-load-functions #'+org|load-async)) ;; From f4698d2f0ad9245f47bd6a2e84b63f72141383f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Dec 2018 13:48:55 -0500 Subject: [PATCH 3469/4235] Fix uncaught errors during incremental load --- core/core.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 8980f341c..c10ef9a44 100644 --- a/core/core.el +++ b/core/core.el @@ -354,8 +354,11 @@ intervals." (when req (when doom-debug-mode (message "Incrementally loading %s" req)) - (unless (require req nil t) - (message "Failed to load '%s' package incrementally" req)) + (condition-case e + (require req nil t) + (error + (message "Failed to load '%s' package incrementally, because: %s" + req e))) (when reqs (run-with-idle-timer doom-incremental-idle-timer nil #'doom-load-packages-incrementally From ced8f94830f2a822ff2b58b0c47ffe5f27e8a215 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Dec 2018 18:09:28 -0500 Subject: [PATCH 3470/4235] lang/org: improve ob-async lazy loading ob-async adds its own advice around org-babel-execute-src-block, which directly interferes with Doom's lazy loader for babel packages (sometimes bypassing it entirely). This ensures it can't do that. --- modules/lang/org/+babel.el | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 4336af32c..e7d490220 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -27,19 +27,22 @@ the first function to return non-nil.") org-src-window-setup 'current-window org-confirm-babel-evaluate nil) ; you don't need my permission - (defun +org*babel-lazy-load-library (orig-fn info) + (defun +org*babel-lazy-load-library (info) "Load babel libraries as needed when babel blocks are executed." - (when (funcall orig-fn info) - (let* ((lang (nth 0 info)) - (lang (if (symbolp lang) lang (intern lang))) - (lang (or (cdr (assq lang +org-babel-mode-alist)) - lang))) - (when (and (not (cdr (assq lang org-babel-load-languages))) - (or (run-hook-with-args-until-success '+org-babel-load-functions lang) - (require (intern (format "ob-%s" lang)) nil t))) - (add-to-list 'org-babel-load-languages (cons lang t))) - t))) - (advice-add #'org-babel-confirm-evaluate :around #'+org*babel-lazy-load-library) + (let* ((lang (nth 0 info)) + (lang (if (symbolp lang) lang (intern lang))) + (lang (or (cdr (assq lang +org-babel-mode-alist)) + lang))) + (when (and (not (cdr (assq lang org-babel-load-languages))) + (or (run-hook-with-args-until-success '+org-babel-load-functions lang) + (require (intern (format "ob-%s" lang)) nil t))) + (when (assq :async (nth 2 info)) + ;; ob-async has its own agenda for lazy loading packages (in the + ;; child process), so we only need to make sure it's loaded. + (require 'ob-async nil t)) + (add-to-list 'org-babel-load-languages (cons lang t))) + t)) + (advice-add #'org-babel-confirm-evaluate :after-while #'+org*babel-lazy-load-library) ;; I prefer C-c C-c over C-c ' (define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) @@ -50,14 +53,7 @@ the first function to return non-nil.") (cl-loop with fn = (if others #'not #'identity) for p in params if (funcall fn (eq (car p) key)) - collect p)) - - ;; org-async has its own agenda for lazy loading packages (in the child - ;; process), so we only need to make sure it's loaded. - (defun +org|load-async (&rest _) - "Load `ob-async', if it is available." - (require 'ob-async nil t)) - (add-hook '+org-babel-load-functions #'+org|load-async)) + collect p))) ;; From a37d199862711c50e7b51947bbd2ee77462855ed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 10 Dec 2018 20:31:31 -0500 Subject: [PATCH 3471/4235] lang/org: add ob-async --- modules/lang/org/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 834231ddb..92d2b33ad 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -19,6 +19,7 @@ (package! org-download)) (when (featurep! +babel) + (package! ob-async) (package! ob-mongo) (package! ob-sql-mode) (package! ob-translate) From a89a2aa70c267d3fbf1be967621913543ab8a078 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 11 Dec 2018 18:59:30 -0500 Subject: [PATCH 3472/4235] completion/{helm,ivy}: fix stringp error Cause by the expectation that doom-project-root would never return nil (which was changed to return nil if not in a valid project, due to an update upstream, in projectile). --- modules/completion/helm/autoload/helm.el | 2 +- modules/completion/ivy/autoload/ivy.el | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 44c92f4ee..e7d6376f5 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -122,7 +122,7 @@ order. (declare (indent defun)) (require 'helm-ag) (helm-ag--init-state) - (let* ((project-root (doom-project-root)) + (let* ((project-root (or (doom-project-root) default-directory)) (directory (or in project-root)) (default-directory directory) (helm-ag--default-directory directory) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index e94be5b29..2b97608ed 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -218,7 +218,7 @@ order. :recursive BOOL Whether or not to search files recursively from the base directory." (declare (indent defun)) - (let* ((project-root (doom-project-root)) + (let* ((project-root (or (doom-project-root) default-directory)) (directory (or in project-root)) (default-directory directory) (engine (or engine @@ -243,8 +243,7 @@ order. "./") ((equal directory project-root) (projectile-project-name)) - (t - (file-relative-name directory project-root)))))) + ((file-relative-name directory project-root)))))) (require 'counsel) (let ((counsel-more-chars-alist (if query '((t . 1)) counsel-more-chars-alist))) From ce38a80cf81909b66a4f50ddac2396c49a7c4e0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 13 Dec 2018 15:40:53 -0500 Subject: [PATCH 3473/4235] emacs/dired: refactor #1038 + Removed ranger/dired-setup hook and performed its config globally + Lazy-loaded ranger + Removed unnecessary `:defer t`s (redundant with :commands and :hook) and `:commands` (redundant with :hook) + Set image-dired-dir before trying to create it, to give users an opportunity to modify it before it is created + Use sharp quotes consistently for keybind commands --- modules/emacs/dired/config.el | 70 +++++++++++++++++------------------ 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 1e37c5f70..8933dd30f 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -17,17 +17,18 @@ image-dired-temp-image-file (concat image-dired-dir "temp-image") image-dired-temp-rotate-image-file (concat image-dired-dir "temp-rotate-image")) :config - ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq - ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning when - ;; not using GNU ls. We must look for `gls' after `exec-path-from-shell' was - ;; initialized to make sure that `gls' is in `exec-path' - (when IS-MAC - (let ((gls (executable-find "gls"))) - (if gls - (setq insert-directory-program gls) - (message "Please install `gls` using `brew instal coreutils`...")))) (setq dired-listing-switches "-aBhl --group-directories-first") + (when IS-MAC + ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq + ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning + ;; when not using GNU ls. We must look for `gls' after + ;; `exec-path-from-shell' was initialized to make sure that `gls' is in + ;; `exec-path' + (if-let* ((gls (executable-find "gls"))) + (setq insert-directory-program gls) + (message "Cannot find `gls`. Install it using `brew install coreutils`"))) + (defun +dired|sort-directories-first () "List directories first in dired buffers." (save-excursion @@ -74,39 +75,34 @@ (def-package! ranger :when (featurep! +ranger) + :after dired :init - (defun ranger/dired-setup () - (setq dired-omit-verbose nil) - (make-local-variable 'dired-hide-details-hide-symlink-targets) - (setq dired-hide-details-hide-symlink-targets nil) - ;; hide details by default - (dired-hide-details-mode t)) - (add-hook 'dired-mode-hook #'ranger/dired-setup) - - (setq ranger-override-dired t) ;; set up image-dired to allow picture resize (setq image-dired-dir (concat doom-cache-dir "image-dir")) + :config (unless (file-directory-p image-dired-dir) (make-directory image-dired-dir)) - :config - (setq ranger-omit-regexp "^\.DS_Store$" + + (set-popup-rule! "^\\*ranger" :ignore t) + + (setq ranger-override-dired t + ranger-cleanup-on-disable t + ranger-omit-regexp "^\.DS_Store$" ranger-excluded-extensions '("mkv" "iso" "mp4") ranger-deer-show-details nil - ranger-max-preview-size 10)) + ranger-max-preview-size 10 + dired-omit-verbose nil)) (def-package! all-the-icons-dired :when (featurep! +icons) - :defer t - :init - (add-hook! 'dired-mode-hook #'all-the-icons-dired-mode)) + :hook (dired-mode . all-the-icons-dired-mode)) (def-package! dired-x - :defer t - :commands dired-omit-mode :hook (dired-mode . dired-omit-mode)) + ;; ;; Evil integration @@ -116,8 +112,8 @@ :n "q" #'quit-window :m "j" #'dired-next-line :m "k" #'dired-previous-line - :n [mouse-2] 'dired-mouse-find-file-other-window - :n [follow-link] 'mouse-face + :n [mouse-2] #'dired-mouse-find-file-other-window + :n [follow-link] #'mouse-face ;; Commands to mark or flag certain categories of files :n "#" #'dired-flag-auto-save-files :n "." #'dired-clean-directory @@ -224,26 +220,26 @@ :n "<" #'dired-prev-dirline :n ">" #'dired-next-dirline :n "^" #'dired-up-directory - :n [?\S-\ ] 'dired-previous-line - :n [remap next-line] 'dired-next-line - :n [remap previous-line] 'dired-previous-line + :n [?\S-\ ] #'dired-previous-line + :n [remap next-line] #'dired-next-line + :n [remap previous-line] #'dired-previous-line ;; hiding :n "g$" #'dired-hide-subdir ;; FIXME: This can probably live on a better binding. :n "M-$" #'dired-hide-all :n "(" #'dired-hide-details-mode ;; isearch - :n "M-s a C-s" 'dired-do-isearch + :n "M-s a C-s" #'dired-do-isearch :n "M-s a M-C-s" #'dired-do-isearch-regexp - :n "M-s f C-s" 'dired-isearch-filenames + :n "M-s f C-s" #'dired-isearch-filenames :n "M-s f M-C-s" #'dired-isearch-filenames-regexp ;; misc - :n [remap read-only-mode] 'dired-toggle-read-only + :n [remap read-only-mode] #'dired-toggle-read-only ;; `toggle-read-only' is an obsolete alias for `read-only-mode' - :n [remap toggle-read-only] 'dired-toggle-read-only + :n [remap toggle-read-only] #'dired-toggle-read-only :n "g?" #'dired-summary :n "" #'dired-unmark-backward - :n [remap undo] 'dired-undo - :n [remap advertised-undo] 'dired-undo + :n [remap undo] #'dired-undo + :n [remap advertised-undo] #'dired-undo ;; thumbnail manipulation (image-dired) :n "C-t d" #'image-dired-display-thumbs :n "C-t t" #'image-dired-tag-files From 56a2c15c44dd470ce4755ebc89ba11b1927fe091 Mon Sep 17 00:00:00 2001 From: wanghao Date: Tue, 18 Dec 2018 13:29:56 +0800 Subject: [PATCH 3474/4235] add rust key bingding description --- modules/lang/rust/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 960cb7289..6f18a25ea 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -8,10 +8,10 @@ (map! :map rust-mode-map :localleader :prefix "b" - :n "b" (λ! (compile "cargo build --color always")) - :n "c" (λ! (compile "cargo check --color always")) - :n "r" (λ! (compile "cargo run --color always")) - :n "t" (λ! (compile "cargo test --color always")))) + :desc "cargo build" :n "b" (λ! (compile "cargo build --color always")) + :desc "cargo check" :n "c" (λ! (compile "cargo check --color always")) + :desc "cargo run" :n "r" (λ! (compile "cargo run --color always")) + :desc "cargo test" :n "t" (λ! (compile "cargo test --color always")))) (def-package! racer From 4daa9271a01719c147dafb550f0eb5707bd461e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 03:30:04 -0500 Subject: [PATCH 3475/4235] Introduce general.el & rewrite map! + Now uses an overriding keymap for leader keys, so that it is always available, even outside of normal/visual states. In insert/emacs states, or in sessions where evil is absent, an alternative prefix is used for leader/localleader keys. See these variables: + doom-leader-prefix + doom-leader-alt-prefix + doom-localleader-prefix + doom-localleader-alt-prefix + Keybinds now support alternative prefixes through the new :alt-prefix property. This is useful for non-evil users and non-normal evil states. By default, this is M-SPC (leader) and M-SPC m (localleader). + Removed +evil-commands flag from config/default (moved to feature/evil/+commands.el). + config/default/+bindings.el has been split into config/default/+{evil,emacs}-bindings.el, which one is loaded depends on whether evil is present or not. The latter is blank, but will soon be populated with a keybinding scheme for non-evil users (perhaps inspired by #641). + The define-key! macro has been replaced; it is now an alias for general-def. + Added unmap! as an alias for general-unbind. + The following modifier key conventions are now enforced for consistency, across all OSes: alt/option = meta windows/command = super It used to be alt/option = alt windows/command = meta Many of the default keybinds have been updated to reflect this switch, but it is likely to affect personal meta/super keybinds! The map! macro has also been rewritten to use general-define-key. Here is what has been changed: + map! no longer works with characters, e.g. (map! ?x #'do-something) is no longer supported. Keys must be kbd-able strings like "C-c x" or vectors like [?C-c ?x]. + The :map and :map* properties are now the same thing. If specified keymaps aren't defined when binding keys, it is automatically deferred. + The way you bind local keybinds has changed: ;; Don't do this (map! :l "a" #'func-a :l "b" #'func-b) ;; Do this (map! :map 'local "a" #'func-a "b" #'func-b) + map! now supports the following new blocks: + (:if COND THEN-FORM ELSE-FORM...) + (:alt-prefix PREFIX KEYS...) -- this prefix will be used for non-normal evil states. Equivalent to :non-normal-prefix in general. + The way you declare a which-key label for a prefix key has changed: ;; before (map! :desc "label" :prefix "a" ...) ;; now (map! :prefix ("a" . "label") ...) + It used to be that map! supported binding a key to a key sequence, like so: (map! "a" [?x]) ; pressing a is like pressing x This functionality was removed *temporarily* while I figure out the implementation. Addresses: #448, #814, #860 Mentioned in: #940 --- core/core-editor.el | 10 +- core/core-keybinds.el | 437 +++++----- core/core-lib.el | 28 - core/core-os.el | 19 +- core/packages.el | 1 + core/test/test-core-keybinds.el | 266 ++++++ init.example.el | 2 +- modules/app/irc/config.el | 22 +- modules/completion/helm/config.el | 35 +- modules/completion/ivy/config.el | 119 ++- modules/config/default/+bindings.el | 879 -------------------- modules/config/default/+emacs-bindings.el | 3 + modules/config/default/+evil-bindings.el | 890 +++++++++++++++++++++ modules/config/default/+evil-commands.el | 137 ---- modules/config/default/autoload/default.el | 11 + modules/config/default/config.el | 55 +- modules/emacs/eshell/config.el | 51 +- modules/feature/eval/autoload/eval.el | 9 + modules/feature/evil/config.el | 2 + modules/lang/emacs-lisp/config.el | 6 +- modules/lang/latex/+ref.el | 2 +- modules/lang/markdown/config.el | 52 +- modules/lang/rest/config.el | 2 +- modules/tools/ein/config.el | 7 +- modules/tools/magit/config.el | 17 +- modules/ui/doom-dashboard/config.el | 55 +- 26 files changed, 1616 insertions(+), 1501 deletions(-) create mode 100644 core/test/test-core-keybinds.el delete mode 100644 modules/config/default/+bindings.el create mode 100644 modules/config/default/+emacs-bindings.el create mode 100644 modules/config/default/+evil-bindings.el delete mode 100644 modules/config/default/+evil-commands.el diff --git a/core/core-editor.el b/core/core-editor.el index 4def0117d..859013d97 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -289,11 +289,11 @@ savehist file." ;; `helpful' --- a better *help* buffer -(define-key! 'global - [remap describe-function] #'helpful-callable - [remap describe-command] #'helpful-command - [remap describe-variable] #'helpful-variable - [remap describe-key] #'helpful-key) +(let ((map (current-global-map))) + (define-key map [remap describe-function] #'helpful-callable) + (define-key map [remap describe-command] #'helpful-command) + (define-key map [remap describe-variable] #'helpful-variable) + (define-key map [remap describe-key] #'helpful-key)) (def-package! ws-butler diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 9e0e1b927..1e4e05db9 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -5,21 +5,21 @@ ;; never loaded, then evil bindings set with `map!' will be ignored. (defvar doom-leader-key "SPC" - "The leader prefix key, for global commands.") + "The leader prefix key for Evil users.") + +(defvar doom-leader-alt-key "M-SPC" + "An alternative leader prefix key, used for Insert and Emacs states, and for +non-evil users.") (defvar doom-localleader-key "SPC m" "The localleader prefix key, for major-mode specific commands.") -(defvar doom-evil-state-alist - '((?n . normal) - (?v . visual) - (?i . insert) - (?e . emacs) - (?o . operator) - (?m . motion) - (?r . replace) - (?g . global)) - "A list of cons cells that map a letter to a evil state symbol.") +(defvar doom-localleader-alt-key "M-SPC m" + "The localleader prefix key, for major-mode specific commands.") + +(defvar doom-leader-map (make-sparse-keymap) + "An overriding keymap for keys.") + ;; (defvar doom-escape-hook nil @@ -45,6 +45,50 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; +;; General + +(require 'general) + +;; Convenience aliases +(defalias 'define-key! #'general-def) +(defalias 'unmap! #'general-unbind) + +;; +(define-prefix-command 'doom-leader 'doom-leader-map) +(define-key doom-leader-map [override-state] 'all) +(general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader) +(general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader) + +(defun general-leader-define-key (_state _keymap key def orig-def _kargs) + (let (general-implicit-kbd) + (general-define-key + :keymaps 'doom-leader-map + :wk-full-keys nil + key orig-def))) + +;; +(defun general-localleader-define-key (state keymap key _def orig-def kargs) + (unless keymap + (signal 'wrong-type-argument (list 'keymapp keymap))) + (let (general-implicit-kbd) + (apply #'general-define-key + :major-modes t + :keymaps keymap + (append + ;; :non-normal-prefix isn't respected when evil is absent, so this + ;; is necessary: + (if (featurep 'evil) + (list :states '(normal visual motion) + :prefix doom-localleader-key + :non-normal-prefix doom-localleader-alt-key) + (list :prefix doom-localleader-alt-key)) + (list key orig-def) + nil)))) + + +;; +;; Packages + (def-package! which-key :defer 1 :after-call pre-command-hook @@ -68,18 +112,16 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; -(defun doom--keybind-register (key desc &optional modes) - "Register a description for KEY with `which-key' in MODES. - - KEYS should be a string in kbd format. - DESC should be a string describing what KEY does. - MODES should be a list of major mode symbols." - (after! which-key - (if modes - (dolist (mode modes) - (which-key-add-major-mode-key-based-replacements mode key desc)) - (which-key-add-key-based-replacements key desc)))) - +(defvar doom-evil-state-alist + '((?n . normal) + (?v . visual) + (?i . insert) + (?e . emacs) + (?o . operator) + (?m . motion) + (?r . replace) + (?g . global)) + "A list of cons cells that map a letter to a evil state symbol.") (defun doom--keyword-to-states (keyword) "Convert a KEYWORD into a list of evil state symbols. @@ -95,202 +137,197 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (put :after 'lisp-indent-function 'defun) (put :desc 'lisp-indent-function 'defun) (put :leader 'lisp-indent-function 'defun) -(put :local 'lisp-indent-function 'defun) (put :localleader 'lisp-indent-function 'defun) (put :map 'lisp-indent-function 'defun) -(put :map* 'lisp-indent-function 'defun) +(put :keymap 'lisp-indent-function 'defun) (put :mode 'lisp-indent-function 'defun) (put :prefix 'lisp-indent-function 'defun) -(put :textobj 'lisp-indent-function 'defun) +(put :alt-prefix 'lisp-indent-function 'defun) (put :unless 'lisp-indent-function 'defun) +(put :if 'lisp-indent-function 'defun) (put :when 'lisp-indent-function 'defun) ;; specials -(defvar doom--keymaps nil) -(defvar doom--prefix nil) -(defvar doom--defer nil) -(defvar doom--local nil) +(defvar doom--map-forms nil) +(defvar doom--map-batch-forms nil) +(defvar doom--map-state '(:dummy t)) +(defvar doom--map-parent-state nil) +(defvar doom--map-evil-p nil) +(after! evil (setq doom--map-evil-p t)) +(defun doom--map-process (rest) + (let (doom--map-state + doom--map-forms + desc) + (while rest + (let ((key (pop rest))) + (cond ((listp key) + (doom--map-nested nil key)) + + ((keywordp key) + (pcase key + (:leader + (doom--map-set :definer '(quote leader))) + (:localleader + (doom--map-set :definer '(quote localleader))) + (:after + (doom--map-nested (list 'after! (pop rest)) rest) + (setq rest nil)) + (:desc + (setq desc (pop rest))) + ((or :map :map* :keymap) + (doom--map-set :keymaps `(quote ,(doom-enlist (pop rest))))) + (:mode + (push (cl-loop for m in (doom-enlist (pop rest)) + collect (intern (concat (symbol-name m) "-map"))) + rest) + (push :map rest)) + ((or :if :when :unless) + (doom--map-nested (list (intern (doom-keyword-name key)) (pop rest)) rest) + (setq rest nil)) + (:prefix + (cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest)) + (doom--map-set :prefix prefix) + (when (stringp desc) + (setq rest (append (list :desc desc "" nil) rest))))) + (:alt-prefix + (cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest)) + (doom--map-set :non-normal-prefix prefix) + (when (stringp desc) + (setq rest (append (list :desc desc "" nil) rest))))) + (:textobj + (let* ((key (pop rest)) + (inner (pop rest)) + (outer (pop rest))) + (push `(map! (:map evil-inner-text-objects-map ,key ,inner) + (:map evil-outer-text-objects-map ,key ,outer)) + doom--map-forms))) + (_ + (condition-case e + (doom--map-def (pop rest) (pop rest) (doom--keyword-to-states key) desc) + (error + (error "Not a valid `map!' property: %s" key)))))) + + ((doom--map-def key (pop rest) nil desc))))) + + (doom--map-commit) + (macroexp-progn (nreverse (delq nil doom--map-forms))))) + +(defun doom--map-append-keys (prop) + (let ((a (plist-get doom--map-parent-state prop)) + (b (plist-get doom--map-state prop))) + (if (and a b) + `(general--concat t ,a ,b) + (or a b)))) + +(defun doom--map-nested (wrapper rest) + (doom--map-commit) + (let ((doom--map-parent-state (copy-seq (append doom--map-state doom--map-parent-state nil)))) + (push (if wrapper + (append wrapper (list (doom--map-process rest))) + (doom--map-process rest)) + doom--map-forms))) + +(defun doom--map-set (prop &optional value inhibit-commit) + (unless (or inhibit-commit + (equal (plist-get doom--map-state prop) value)) + (doom--map-commit)) + (setq doom--map-state (plist-put doom--map-state prop value))) + +(defun doom--map-def (key def &optional states desc) + (when (or (memq 'global states) (null states)) + (setq states (delq 'global states)) + (push 'nil states)) + (dolist (state states) + (when desc + (setq def + (if (and (equal key "") + (null def)) + `(quote (nil :which-key ,desc)) + `(list ,@(plist-put (general--normalize-extended-def def) + :which-key desc))))) + (push key (alist-get state doom--map-batch-forms)) + (push def (alist-get state doom--map-batch-forms)))) + +(defun doom--map-commit () + (when doom--map-batch-forms + (cl-loop with attrs = (doom--map-state) + for (state . defs) in doom--map-batch-forms + if (or doom--map-evil-p (not state)) + collect `(general-define-key ,@(if state `(:states ',state)) ,@attrs ,@(nreverse defs)) + into forms + finally do (push (macroexp-progn forms) doom--map-forms)) + (setq doom--map-batch-forms nil))) + +(defun doom--map-state () + (let ((plist + (append (list :prefix (doom--map-append-keys :prefix) + :non-normal-prefix (doom--map-append-keys :non-normal-prefix) + :definer (plist-get doom--map-parent-state :definer) + :keymaps + (append (plist-get doom--map-parent-state :keymaps) + (plist-get doom--map-state :keymaps) + nil)) + doom--map-state + nil)) + newplist) + (while plist + (let ((key (pop plist)) + (val (pop plist))) + (when (and val (not (plist-member newplist key))) + (push val newplist) + (push key newplist)))) + newplist)) + +;; (defmacro map! (&rest rest) - "A nightmare of a key-binding macro that will use `evil-define-key*', -`define-key', `local-set-key' and `global-set-key' depending on context and -plist key flags (and whether evil is loaded or not). It was designed to make -binding multiple keys more concise, like in vim. + "A convenience macro for defining keybinds, powered by `general'. -If evil isn't loaded, it will ignore evil-specific bindings. +If evil isn't loaded, evil-specific bindings are ignored. States - :n normal - :v visual - :i insert - :e emacs - :o operator - :m motion - :r replace + :n normal + :v visual + :i insert + :e emacs + :o operator + :m motion + :r replace + :g global (will work without evil) - These can be combined (order doesn't matter), e.g. :nvi will apply to - normal, visual and insert mode. The state resets after the following - key=>def pair. + These can be combined in any order, e.g. :nvi will apply to normal, visual and + insert mode. The state resets after the following key=>def pair. If states are + omitted the keybind will be global (no emacs state; this is different from + evil's Emacs state and will work in the absence of `evil-mode'). - If states are omitted the keybind will be global. +Properties + :leader [...] an alias for (:prefix doom-leader-key ...) + :localleader [...] bind to localleader; requires a keymap + :mode [MODE(s)] [...] inner keybinds are applied to major MODE(s) + :map [KEYMAP(s)] [...] inner keybinds are applied to KEYMAP(S) + :keymap [KEYMAP(s)] [...] same as :map + :prefix [PREFIX] [...] set keybind prefix for following keys + :alt-prefix [PREFIX] [...] use non-normal-prefix for following keys + :after [FEATURE] [...] apply keybinds when [FEATURE] loads + :textobj KEY INNER-FN OUTER-FN define a text object keybind pair + :if [CONDITION] [...] + :when [CONDITION] [...] + :unless [CONDITION] [...] - This can be customized with `doom-evil-state-alist'. - - :textobj is a special state that takes a key and two commands, one for the - inner binding, another for the outer. - -Flags - (:leader [...]) an alias for (:prefix doom-leader-key ...) - (:localleader [...]) an alias for (:prefix doom-localleader-key ...) - (:mode [MODE(s)] [...]) inner keybinds are applied to major MODE(s) - (:map [KEYMAP(s)] [...]) inner keybinds are applied to KEYMAP(S) - (:map* [KEYMAP(s)] [...]) same as :map, but deferred - (:prefix [PREFIX] [...]) assign prefix to all inner keybindings - (:after [FEATURE] [...]) apply keybinds when [FEATURE] loads - (:local [...]) make bindings buffer local; incompatible with keymaps! - -Conditional keybinds - (:when [CONDITION] [...]) - (:unless [CONDITION] [...]) + Any of the above properties may be nested, so that they only apply to a + certain group of keybinds. Example - (map! :map magit-mode-map - :m \"C-r\" 'do-something ; assign C-r in motion state - :nv \"q\" 'magit-mode-quit-window ; assign to 'q' in normal and visual states - \"C-x C-r\" 'a-global-keybind + (map! :map magit-mode-map + :m \"C-r\" 'do-something ; C-r in motion state + :nv \"q\" 'magit-mode-quit-window ; q in normal+visual states + \"C-x C-r\" 'a-global-keybind + :g \"C-x C-r\" 'another-global-keybind ; same as above - (:when IS-MAC - :n \"M-s\" 'some-fn - :i \"M-o\" (lambda (interactive) (message \"Hi\"))))" - (let ((doom--keymaps doom--keymaps) - (doom--prefix doom--prefix) - (doom--defer doom--defer) - (doom--local doom--local) - key def states forms desc modes) - (while rest - (setq key (pop rest)) - (cond - ;; it's a sub expr - ((listp key) - (push (macroexpand `(map! ,@key)) forms)) - - ;; it's a flag - ((keywordp key) - (cond ((eq key :leader) - (push 'doom-leader-key rest) - (setq key :prefix - desc "")) - ((eq key :localleader) - (push 'doom-localleader-key rest) - (setq key :prefix - desc ""))) - (pcase key - (:when (push `(if ,(pop rest) ,(macroexpand `(map! ,@rest))) forms) (setq rest '())) - (:unless (push `(if (not ,(pop rest)) ,(macroexpand `(map! ,@rest))) forms) (setq rest '())) - (:after (push `(after! ,(pop rest) ,(macroexpand `(map! ,@rest))) forms) (setq rest '())) - (:desc (setq desc (pop rest))) - ((or :map :map*) - (setq doom--keymaps (doom-enlist (pop rest)) - doom--defer (eq key :map*))) - (:mode - (setq modes (doom-enlist (pop rest))) - (unless doom--keymaps - (setq doom--keymaps - (cl-loop for m in modes - collect (intern (format "%s-map" (symbol-name m))))))) - (:textobj - (let* ((key (pop rest)) - (inner (pop rest)) - (outer (pop rest))) - (push (macroexpand `(map! (:map evil-inner-text-objects-map ,key ,inner) - (:map evil-outer-text-objects-map ,key ,outer))) - forms))) - (:prefix - (let ((def (pop rest))) - (setq doom--prefix - `(vconcat ,doom--prefix - ,(if (or (stringp def) - (and (symbolp def) - (stringp (symbol-value def)))) - `(kbd ,def) - def))) - (when desc - (push `(doom--keybind-register ,(key-description (eval doom--prefix)) - ,desc ',modes) - forms) - (setq desc nil)))) - (:local - (setq doom--local t)) - (_ ; might be a state doom--prefix - (setq states (doom--keyword-to-states key))))) - - ;; It's a key-def pair - ((or (stringp key) - (characterp key) - (vectorp key) - (symbolp key)) - (unwind-protect - (catch 'skip - (when (symbolp key) - (setq key `(kbd ,key))) - (when (stringp key) - (setq key (kbd key))) - (when doom--prefix - (setq key (append doom--prefix (list key)))) - (unless (> (length rest) 0) - (user-error "map! has no definition for %s key" key)) - (setq def (pop rest)) - (when (or (vectorp def) - (stringp def)) - (setq def - `(lambda () (interactive) - (setq unread-command-events - (nconc (mapcar (lambda (ev) (cons t ev)) - (listify-key-sequence - ,(cond ((vectorp def) def) - ((stringp def) (kbd def))))) - unread-command-events))))) - (when desc - (push `(doom--keybind-register ,(key-description (eval key)) - ,desc ',modes) - forms)) - (cond ((and doom--local doom--keymaps) - (push `(lwarn 'doom-map :warning - "Can't local bind '%s' key to a keymap; skipped" - ,key) - forms) - (throw 'skip 'local)) - ((and doom--keymaps states) - (dolist (keymap doom--keymaps) - (when (memq 'global states) - (push `(define-key ,keymap ,key ,def) forms)) - (when (featurep 'evil) - (when-let* ((states (delq 'global states))) - (push `(,(if doom--defer #'evil-define-key #'evil-define-key*) - ',states ,keymap ,key ,def) - forms))))) - (states - (dolist (state states) - (if (eq state 'global) - (push `(global-set-key ,key ,def) forms) - (when (featurep 'evil) - (push (if doom--local - `(evil-local-set-key ',state ,key ,def) - `(evil-define-key* ',state 'global ,key ,def)) - forms))))) - (doom--keymaps - (dolist (keymap doom--keymaps) - (push `(define-key ,keymap ,key ,def) forms))) - (t - (push `(,(if doom--local #'local-set-key #'global-set-key) - ,key ,def) - forms)))) - (setq states '() - doom--local nil - desc nil))) - - (t (user-error "Invalid key %s" key)))) - `(progn ,@(nreverse forms)))) + (:when IS-MAC + :n \"M-s\" 'some-fn + :i \"M-o\" (lambda (interactive) (message \"Hi\"))))" + (doom--map-process rest)) (provide 'core-keybinds) ;;; core-keybinds.el ends here diff --git a/core/core-lib.el b/core/core-lib.el index 0a23b3146..88f89a3da 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -369,34 +369,6 @@ For example: ,(doom--resolve-path-forms spec '--directory--)) (doom--resolve-path-forms spec))) -(defmacro define-key! (keymaps key def &rest rest) - "Like `define-key', but accepts a variable number of KEYMAPS and/or KEY+DEFs. - -KEYMAPS can also be (or contain) 'global or 'local, to make this equivalent to -using `global-set-key' and `local-set-key'. - -KEY is a key string or vector. It is *not* piped through `kbd'." - (declare (indent defun)) - (or (cl-evenp (length rest)) - (signal 'wrong-number-of-arguments (list 'evenp (length rest)))) - (if (and (listp keymaps) - (not (eq (car-safe keymaps) 'quote))) - `(dolist (map (list ,@keymaps)) - ,(macroexpand `(define-key! map ,key ,def ,@rest))) - (when (eq (car-safe keymaps) 'quote) - (pcase (cadr keymaps) - (`global (setq keymaps '(current-global-map))) - (`local (setq keymaps '(current-local-map))) - (x (error "%s is not a valid keymap" x)))) - `(let ((map ,keymaps)) - (define-key map ,key ,def) - ,@(let (forms) - (while rest - (let ((key (pop rest)) - (def (pop rest))) - (push `(define-key map ,key ,def) forms))) - (nreverse forms))))) - (defmacro load! (filename &optional path noerror) "Load a file relative to the current executing file (`load-file-name'). diff --git a/core/core-os.el b/core/core-os.el index 2ada973de..ada518047 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -20,9 +20,13 @@ (when (featurep 'exec-path-from-shell) `(exec-path-from-shell-copy-envs ,@vars))) +;; key conventions: +;; alt/option = meta +;; windows/command = super + (cond (IS-MAC - (setq mac-command-modifier 'meta - mac-option-modifier 'alt + (setq mac-command-modifier 'super + mac-option-modifier 'meta ;; sane trackpad/mouse scroll settings mac-redisplay-dont-reset-vscroll t mac-mouse-wheel-smooth-scroll nil @@ -60,11 +64,16 @@ (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! - x-underline-at-descent-line t)) ; draw underline lower + x-underline-at-descent-line t ; draw underline lower + x-alt-keysym 'meta)) (IS-WINDOWS - (setq w32-get-true-file-attributes nil) ; fix file io slowdowns - )) + (setq w32-get-true-file-attributes nil ; fix file io slowdowns + ;; map window keys to super + w32-pass-lwindow-to-system nil + w32-lwindow-modifier 'super + w32-pass-rwindow-to-system nil + w32-rwindow-modifier 'super))) (provide 'core-os) ;;; core-os.el ends here diff --git a/core/packages.el b/core/packages.el index 344b0dbec..72a218963 100644 --- a/core/packages.el +++ b/core/packages.el @@ -41,6 +41,7 @@ (package! projectile) ;; core-keybinds.el +(package! general) (package! which-key) (package! hydra) diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el new file mode 100644 index 000000000..a3be4dc20 --- /dev/null +++ b/core/test/test-core-keybinds.el @@ -0,0 +1,266 @@ +;; -*- no-byte-compile: t; -*- +;;; core/test/test-core-keybinds.el + + +(describe "core/keybinds" + (describe "map!" + :var (doom--map-evil-p doom-map-states) + (before-each + (setq doom--map-evil-p t + doom-map-states '((:n . normal) + (:v . visual) + (:i . insert) + (:e . emacs) + (:o . operator) + (:m . motion) + (:r . replace)))) + + (describe "Single keybinds" + (it "binds a global key" + (expect (macroexpand '(map! "C-." #'a)) + :to-equal '(general-define-key "C-." #'a))) + + (it "binds a key in one evil state" + (dolist (state doom-map-states) + (expect (macroexpand `(map! ,(car state) "C-." #'a)) + :to-equal `(general-define-key :states ',(cdr state) "C-." #'a)))) + + (it "binds a key in multiple evil states" + (expect (cdr (macroexpand `(map! :nvi "C-." #'a))) + :to-have-same-items-as + '((general-define-key :states 'normal "C-." #'a) + (general-define-key :states 'visual "C-." #'a) + (general-define-key :states 'insert "C-." #'a)))) + + (it "binds evil keybinds together with global keybinds" + (expect (macroexpand '(map! :ng "C-." #'a)) + :to-equal + '(progn + (general-define-key :states 'normal "C-." #'a) + (general-define-key "C-." #'a))))) + + (describe "Multiple keybinds" + (it "binds global keys and preserves order" + (expect (macroexpand '(map! "C-." #'a + "C-," #'b + "C-/" #'c)) + :to-equal '(general-define-key "C-." #'a + "C-," #'b + "C-/" #'c))) + + (it "binds multiple keybinds in an evil state and preserve order" + (dolist (state doom-map-states) + (expect (macroexpand `(map! ,(car state) "a" #'a + ,(car state) "b" #'b + ,(car state) "c" #'c)) + :to-equal + `(general-define-key :states ',(cdr state) + "a" #'a + "b" #'b + "c" #'c)))) + + (it "binds multiple keybinds in different evil states" + (expect (cdr (macroexpand `(map! :n "a" #'a + :n "b" #'b + :n "e" #'e + :v "c" #'c + :i "d" #'d))) + :to-have-same-items-as + `((general-define-key :states 'insert "d" #'d) + (general-define-key :states 'visual "c" #'c) + (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) + + (it "groups multi-state keybinds while preserving same-group key order" + (expect (cdr (macroexpand `(map! :n "a" #'a + :v "c" #'c + :n "b" #'b + :i "d" #'d + :n "e" #'e))) + :to-have-same-items-as + `((general-define-key :states 'insert "d" #'d) + (general-define-key :states 'visual "c" #'c) + (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) + + (it "binds multiple keybinds in multiple evil states" + (expect (cdr (macroexpand `(map! :nvi "a" #'a + :nvi "b" #'b + :nvi "c" #'c))) + :to-have-same-items-as + '((general-define-key :states 'normal "a" #'a "b" #'b "c" #'c) + (general-define-key :states 'visual "a" #'a "b" #'b "c" #'c) + (general-define-key :states 'insert "a" #'a "b" #'b "c" #'c))))) + + (describe "Nested keybinds" + (it "binds global keys" + (expect (macroexpand '(map! "C-." #'a + ("C-a" #'b) + ("C-x" #'c))) + :to-equal '(progn + (general-define-key "C-." #'a) + (general-define-key "C-a" #'b) + (general-define-key "C-x" #'c)))) + + (it "binds nested evil keybinds" + (expect (macroexpand '(map! :n "C-." #'a + (:n "C-a" #'b) + (:n "C-x" #'c))) + :to-equal + '(progn + (general-define-key :states 'normal "C-." #'a) + (general-define-key :states 'normal "C-a" #'b) + (general-define-key :states 'normal "C-x" #'c)))) + + (it "binds global keybinds in between evil keybinds" + (expect (cdr (macroexpand-1 '(map! :n "a" #'a + "b" #'b + :i "c" #'c))) + :to-have-same-items-as + '((general-define-key :states 'insert "c" #'c) + (general-define-key "b" #'b) + (general-define-key :states 'normal "a" #'a))))) + + ;; + (describe "Properties" + (describe ":after" + (it "wraps `general-define-key' in a `after!' block" + (dolist (form '((map! :after helm "a" #'a "b" #'b) + (map! (:after helm "a" #'a "b" #'b)))) + (expect (macroexpand-1 form) + :to-equal + '(after! helm (general-define-key "a" #'a "b" #'b)))) + (expect (macroexpand-1 '(map! "a" #'a (:after helm "b" #'b "c" #'c))) + :to-equal + '(progn + (general-define-key "a" #'a) + (after! helm + (general-define-key "b" #'b "c" #'c)))) + (expect (macroexpand-1 '(map! (:after helm "b" #'b "c" #'c) "a" #'a)) + :to-equal + '(progn + (after! helm + (general-define-key "b" #'b "c" #'c)) + (general-define-key "a" #'a)))) + + (it "nests `after!' blocks" + (expect (macroexpand-1 '(map! :after x "a" #'a + (:after y "b" #'b + (:after z "c" #'c)))) + :to-equal + '(after! x (progn (general-define-key "a" #'a) + (after! y (progn (general-define-key "b" #'b) + (after! z (general-define-key "c" #'c)))))))) + + (it "nests `after!' blocks in other nested blocks" + (expect (macroexpand-1 '(map! :after x "a" #'a + (:when t "b" #'b + (:after z "c" #'c)))) + :to-equal + '(after! x + (progn + (general-define-key "a" #'a) + (when t + (progn + (general-define-key "b" #'b) + (after! z (general-define-key "c" #'c))))))))) + + (describe ":desc" + (it "add a :which-key property to a keybind's DEF" + (expect (macroexpand-1 '(map! :desc "A" "a" #'a)) + :to-equal `(general-define-key "a" (list :def #'a :which-key "A"))))) + + (describe ":if/:when/:unless" + (it "wraps keys in a conditional block" + (dolist (prop '(:if :when :unless)) + (let ((prop-fn (intern (doom-keyword-name prop)))) + (expect (macroexpand-1 `(map! ,prop t "a" #'a "b" #'b)) + :to-equal `(,prop-fn t (general-define-key "a" #'a "b" #'b))) + (expect (macroexpand-1 `(map! (,prop t "a" #'a "b" #'b))) + :to-equal `(,prop-fn t (general-define-key "a" #'a "b" #'b)))))) + + (it "nests conditional blocks" + (expect (macroexpand-1 '(map! (:when t "a" #'a (:when t "b" #'b)))) + :to-equal '(when t + (progn (general-define-key "a" #'a) + (when t (general-define-key "b" #'b))))))) + + (describe ":leader" + (it "uses leader definer" + (expect (macroexpand-1 '(map! :leader "a" #'a "b" #'b)) + :to-equal '(general-define-key :definer 'leader "a" #'a "b" #'b))) + + (it "it persists for nested keys" + (expect (cdr (macroexpand-1 '(map! :leader "a" #'a ("b" #'b)))) + :to-equal '((general-define-key :definer 'leader "a" #'a) + (general-define-key :definer 'leader "b" #'b))))) + + (describe ":localleader" + (it "uses localleader definer" + (expect (macroexpand-1 '(map! :localleader "a" #'a "b" #'b)) + :to-equal '(general-define-key :definer 'localleader "a" #'a "b" #'b))) + + (it "it persists for nested keys" + (expect (cdr (macroexpand-1 '(map! :localleader "a" #'a ("b" #'b)))) + :to-equal '((general-define-key :definer 'localleader "a" #'a) + (general-define-key :definer 'localleader "b" #'b))))) + + (describe ":map/:keymap" + (it "specifies a single keymap for keys" + (expect (macroexpand-1 '(map! :map emacs-lisp-mode-map "a" #'a)) + :to-equal + '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a))) + + (it "specifies multiple keymap for keys" + (expect (macroexpand-1 '(map! :map (lisp-mode-map emacs-lisp-mode-map) "a" #'a)) + :to-equal + '(general-define-key :keymaps '(lisp-mode-map emacs-lisp-mode-map) "a" #'a)))) + + (describe ":mode" + (it "appends -map to MODE" + (expect (macroexpand-1 '(map! :mode emacs-lisp-mode "a" #'a)) + :to-equal + '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a)))) + + (describe ":prefix" + (it "specifies a prefix for all keys" + (expect (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y "z" #'z)) + :to-equal + '(general-define-key :prefix "a" "x" #'x "y" #'y "z" #'z))) + + (it "overwrites previous inline :prefix properties" + (expect (cdr (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y :prefix "b" "z" #'z))) + :to-equal + '((general-define-key :prefix "a" "x" #'x "y" #'y) + (general-define-key :prefix "b" "z" #'z)))) + + (it "accumulates keys when nested" + (expect (cdr (macroexpand-1 '(map! (:prefix "a" "x" #'x (:prefix "b" "x" #'x))))) + :to-equal + `((general-define-key :prefix "a" "x" #'x) + (general-define-key :prefix (general--concat t "a" "b") + "x" #'x))))) + + (describe ":alt-prefix" + (it "specifies a prefix for all keys" + (expect (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z)) + :to-equal + '(general-define-key :non-normal-prefix "a" "x" #'x "y" #'y "z" #'z))) + + (it "overwrites previous inline :alt-prefix properties" + (expect (cdr (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z))) + :to-equal + '((general-define-key :non-normal-prefix "a" "x" #'x "y" #'y) + (general-define-key :non-normal-prefix "b" "z" #'z)))) + + (it "accumulates keys when nested" + (expect (cdr (macroexpand-1 '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x))))) + :to-equal + `((general-define-key :non-normal-prefix "a" "x" #'x) + (general-define-key :non-normal-prefix (general--concat t "a" "b") + "x" #'x))))) + + (describe ":textobj" + (it "defines keys in evil-{inner,outer}-text-objects-map" + (expect (macroexpand-1 '(map! :textobj "a" #'inner #'outer)) + :to-equal + '(map! (:map evil-inner-text-objects-map "a" #'inner) + (:map evil-outer-text-objects-map "a" #'outer)))))))) diff --git a/init.example.el b/init.example.el index f6baad4a3..b32fa440a 100644 --- a/init.example.el +++ b/init.example.el @@ -156,4 +156,4 @@ ;; provides a Spacemacs-inspired keybinding scheme, a custom yasnippet ;; library, and additional ex commands for evil-mode. Use it as a ;; reference for your own modules. - (default +bindings +evil-commands)) + (default +bindings)) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index f76dbeec2..3aec7eb78 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -122,19 +122,15 @@ playback.") (add-hook 'circe-chat-mode-hook #'solaire-mode)) (map! :localleader - (:map circe-mode-map - :n "a" #'tracking-next-buffer - :n "j" #'circe-command-JOIN - :n "m" #'+irc/send-message - :n "p" #'circe-command-PART - :n "Q" #'+irc/quit - :n "R" #'circe-reconnect - - (:when (featurep! :completion ivy) - :n "c" #'+irc/ivy-jump-to-channel)) - - (:map circe-channel-mode-map - :n "n" #'circe-command-NAMES))) + :map circe-mode-map + "a" #'tracking-next-buffer + "j" #'circe-command-JOIN + "m" #'+irc/send-message + "p" #'circe-command-PART + "Q" #'+irc/quit + "R" #'circe-reconnect + :when (featurep! :completion ivy) + "c" #'+irc/ivy-jump-to-channel)) (def-package! circe-color-nicks diff --git a/modules/completion/helm/config.el b/modules/completion/helm/config.el index afca72d1a..32441b5cc 100644 --- a/modules/completion/helm/config.el +++ b/modules/completion/helm/config.el @@ -34,25 +34,25 @@ be negative.") ;; Packages (def-package! helm-mode - :defer 1 + :defer t :after-call pre-command-hook :init - (define-key! 'global - [remap apropos] #'helm-apropos - [remap find-library] #'helm-locate-library - [remap bookmark-jump] #'helm-bookmarks - [remap execute-extended-command] #'helm-M-x - [remap find-file] #'helm-find-files - [remap imenu-anywhere] #'helm-imenu-anywhere - [remap imenu] #'helm-semantic-or-imenu - [remap noop-show-kill-ring] #'helm-show-kill-ring - [remap persp-switch-to-buffer] #'+helm/workspace-mini - [remap switch-to-buffer] #'helm-buffers-list - [remap projectile-find-file] #'+helm/projectile-find-file - [remap projectile-recentf] #'helm-projectile-recentf - [remap projectile-switch-project] #'helm-projectile-switch-project - [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer - [remap recentf-open-files] #'helm-recentf) + (map! [remap apropos] #'helm-apropos + [remap find-library] #'helm-locate-library + [remap bookmark-jump] #'helm-bookmarks + [remap execute-extended-command] #'helm-M-x + [remap find-file] #'helm-find-files + [remap imenu-anywhere] #'helm-imenu-anywhere + [remap imenu] #'helm-semantic-or-imenu + [remap noop-show-kill-ring] #'helm-show-kill-ring + [remap persp-switch-to-buffer] #'+helm/workspace-mini + [remap switch-to-buffer] #'helm-buffers-list + [remap projectile-find-file] #'+helm/projectile-find-file + [remap projectile-recentf] #'helm-projectile-recentf + [remap projectile-switch-project] #'helm-projectile-switch-project + [remap projectile-switch-to-buffer] #'helm-projectile-switch-to-buffer + [remap recentf-open-files] #'helm-recentf + [remap yank-pop] #'helm-show-kill-ring) :config (helm-mode +1) ;; helm is too heavy for `find-file-at-point' @@ -179,4 +179,5 @@ be negative.") (after! swiper-helm (setq swiper-helm-display-function (lambda (buf &optional _resume) (pop-to-buffer buf))) + (global-set-key [remap swiper] #'swiper-helm) (add-to-list 'swiper-font-lock-exclude #'+doom-dashboard-mode nil #'eq)) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 533348e68..b13c673b9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -58,10 +58,9 @@ immediately runs it on the current candidate (ending the ivy session)." (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) - (define-key! 'global - [remap switch-to-buffer] #'ivy-switch-buffer - [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer - [remap imenu-anywhere] #'ivy-imenu-anywhere) + (map! [remap switch-to-buffer] #'ivy-switch-buffer + [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer + [remap imenu-anywhere] #'ivy-imenu-anywhere) (ivy-mode +1) @@ -91,21 +90,21 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! counsel :commands counsel-describe-face :init - (define-key! 'global - [remap apropos] #'counsel-apropos - [remap bookmark-jump] #'counsel-bookmark - [remap describe-face] #'counsel-faces - [remap describe-function] #'counsel-describe-function - [remap describe-variable] #'counsel-describe-variable - [remap execute-extended-command] #'counsel-M-x - [remap find-file] #'counsel-find-file - [remap find-library] #'counsel-find-library - [remap info-lookup-symbol] #'counsel-info-lookup-symbol - [remap imenu] #'counsel-imenu - [remap recentf-open-files] #'counsel-recentf - [remap org-capture] #'counsel-org-capture - [remap swiper] #'counsel-grep-or-swiper) - + (map! [remap apropos] #'counsel-apropos + [remap bookmark-jump] #'counsel-bookmark + [remap describe-face] #'counsel-faces + [remap describe-function] #'counsel-describe-function + [remap describe-variable] #'counsel-describe-variable + [remap execute-extended-command] #'counsel-M-x + [remap find-file] #'counsel-find-file + [remap find-library] #'counsel-find-library + [remap info-lookup-symbol] #'counsel-info-lookup-symbol + [remap imenu] #'counsel-imenu + [remap recentf-open-files] #'counsel-recentf + [remap org-capture] #'counsel-org-capture + [remap swiper] #'counsel-grep-or-swiper + [remap evil-ex-registers] #'counsel-evil-registers + [remap yank-pop] #'counsel-yank-pop) :config (set-popup-rule! "^\\*ivy-occur" :size 0.35 :ttl 0 :quit nil) @@ -160,13 +159,12 @@ immediately runs it on the current candidate (ending the ivy session)." :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init - (define-key! 'global - [remap projectile-find-file] #'+ivy/projectile-find-file - [remap projectile-find-dir] #'counsel-projectile-find-dir - [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer - [remap projectile-grep] #'counsel-projectile-grep - [remap projectile-ag] #'counsel-projectile-ag - [remap projectile-switch-project] #'counsel-projectile-switch-project) + (map! [remap projectile-find-file] #'+ivy/projectile-find-file + [remap projectile-find-dir] #'counsel-projectile-find-dir + [remap projectile-switch-to-buffer] #'counsel-projectile-switch-to-buffer + [remap projectile-grep] #'counsel-projectile-grep + [remap projectile-ag] #'counsel-projectile-ag + [remap projectile-switch-project] #'counsel-projectile-switch-project) :config ;; no highlighting visited files; slows down the filtering (ivy-set-display-transformer #'counsel-projectile-find-file nil)) @@ -232,43 +230,36 @@ immediately runs it on the current candidate (ending the ivy session)." (map! :when (featurep! :feature evil +everywhere) :after ivy + :map (ivy-occur-mode-map ivy-occur-grep-mode-map) + :m "j" #'ivy-occur-next-line + :m "k" #'ivy-occur-previous-line + :m "h" #'evil-backward-char + :m "l" #'evil-forward-char + :m "g" nil + :m "gg" #'evil-goto-first-line :map ivy-occur-mode-map - :n [mouse-1] #'ivy-occur-click - :n "" #'ivy-occur-press-and-switch - :m "j" #'ivy-occur-next-line - :m "k" #'ivy-occur-previous-line - :m "h" #'evil-backward-char - :m "l" #'evil-forward-char - :m "g" nil - :m "gg" #'evil-goto-first-line - :n "gf" #'ivy-occur-press - :n "ga" #'ivy-occur-read-action - :n "go" #'ivy-occur-dispatch - :n "gc" #'ivy-occur-toggle-calling - :n "gr" #'ivy-occur-revert-buffer - :n "q" #'quit-window - + :n [mouse-1] #'ivy-occur-click + :n [return] #'ivy-occur-press-and-switch + :n "gf" #'ivy-occur-press + :n "ga" #'ivy-occur-read-action + :n "go" #'ivy-occur-dispatch + :n "gc" #'ivy-occur-toggle-calling + :n "gr" #'ivy-occur-revert-buffer + :n "q" #'quit-window :map ivy-occur-grep-mode-map - :v "j" #'evil-next-line - :v "k" #'evil-previous-line - :n "D" #'ivy-occur-delete-candidate - :n "C-d" #'evil-scroll-down - :n "d" #'ivy-occur-delete-candidate - :n "C-x C-q" #'ivy-wgrep-change-to-wgrep-mode - :n "i" #'ivy-wgrep-change-to-wgrep-mode - :n "gd" #'ivy-occur-delete-candidate - :n [mouse-1] #'ivy-occur-click - :n "" #'ivy-occur-press-and-switch - :m "j" #'ivy-occur-next-line - :m "k" #'ivy-occur-previous-line - :m "h" #'evil-backward-char - :m "l" #'evil-forward-char - :m "g" nil - :m "gg" #'evil-goto-first-line - :n "gf" #'ivy-occur-press - :n "gr" #'ivy-occur-revert-buffer - :n "ga" #'ivy-occur-read-action - :n "go" #'ivy-occur-dispatch - :n "gc" #'ivy-occur-toggle-calling - ;; quit - :n "q" #'quit-window) + :v "j" #'evil-next-line + :v "k" #'evil-previous-line + :n "D" #'ivy-occur-delete-candidate + :n "C-d" #'evil-scroll-down + :n "d" #'ivy-occur-delete-candidate + :n "C-x C-q" #'ivy-wgrep-change-to-wgrep-mode + :n "i" #'ivy-wgrep-change-to-wgrep-mode + :n "gd" #'ivy-occur-delete-candidate + :n [mouse-1] #'ivy-occur-click + :n [return] #'ivy-occur-press-and-switch + :n "gf" #'ivy-occur-press + :n "gr" #'ivy-occur-revert-buffer + :n "ga" #'ivy-occur-read-action + :n "go" #'ivy-occur-dispatch + :n "gc" #'ivy-occur-toggle-calling + :n "q" #'quit-window) diff --git a/modules/config/default/+bindings.el b/modules/config/default/+bindings.el deleted file mode 100644 index 363975d76..000000000 --- a/modules/config/default/+bindings.el +++ /dev/null @@ -1,879 +0,0 @@ -;;; config/default/+bindings.el -*- lexical-binding: t; -*- - -;; This file defines a Spacemacs-esque keybinding scheme - -;; expand-region's prompt can't tell what key contract-region is bound to, so we -;; tell it explicitly. -(setq expand-region-contract-fast-key "V") - -;; -(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 - - ;; Swap RET/C-j in insert mode - :i [remap newline] #'newline-and-indent - :i "C-j" #'+default/newline - - ;; --- 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 - - ;; Text-scaling - :n "M-+" (λ! (text-scale-set 0)) - :n "M-=" #'text-scale-increase - :n "M--" #'text-scale-decrease - - ;; Simple window/frame navigation/manipulation - :n "C-`" #'+popup/toggle - :n "C-~" #'+popup/raise - :n "M-t" #'+workspace/new - :n "M-T" #'+workspace/display - :n "M-w" #'delete-window - :n "M-W" #'delete-frame - :n "C-M-f" #'toggle-frame-fullscreen - :n "M-n" #'evil-buffer-new - :n "M-N" #'make-frame - :n "M-1" (λ! (+workspace/switch-to 0)) - :n "M-2" (λ! (+workspace/switch-to 1)) - :n "M-3" (λ! (+workspace/switch-to 2)) - :n "M-4" (λ! (+workspace/switch-to 3)) - :n "M-5" (λ! (+workspace/switch-to 4)) - :n "M-6" (λ! (+workspace/switch-to 5)) - :n "M-7" (λ! (+workspace/switch-to 6)) - :n "M-8" (λ! (+workspace/switch-to 7)) - :n "M-9" (λ! (+workspace/switch-to 8)) - :n "M-0" #'+workspace/switch-to-last - - ;; Other sensible, textmate-esque global bindings - :n "M-r" #'+eval/buffer - :n "M-R" #'+eval/region-and-replace - :n "M-b" #'+default/compile - :n "M-a" #'mark-whole-buffer - :n "M-c" #'evil-yank - :n "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) - (:when (featurep! :completion helm) - :n "M-f" #'swiper-helm) - (:when (featurep! :completion ivy) - :n "M-f" #'swiper) - :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 - :gnvimr "M-v" #'clipboard-yank - - "C-x p" #'+popup/other - (:when IS-MAC - "M-`" #'other-frame) - - - ;; --- Personal vim-esque bindings ------------------ - :nv "K" #'+lookup/documentation - :n "zx" #'kill-this-buffer - :n "ZX" #'bury-buffer - :m "]a" #'evil-forward-arg - :m "[a" #'evil-backward-arg - :n "]b" #'next-buffer - :n "[b" #'previous-buffer - :m "]o" #'outline-next-visible-heading - :m "[o" #'outline-previous-visible-heading - :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left - :m "gt" #'+workspace/switch-right - :m "gT" #'+workspace/switch-left - :m "gd" #'+lookup/definition - :m "gD" #'+lookup/references - :n "gf" #'+lookup/file - :n "gQ" #'+format:region - :n "gp" #'+evil/reselect-paste - :v "gp" #'+evil/paste-preserve-register - :n "gr" #'+eval:region - :n "gR" #'+eval/buffer - :v "gR" #'+eval:replace-region - :nv "g-" #'+evil:narrow-buffer - :n "g=" #'widen - :v "@" #'+evil:apply-macro - :n "g@" #'+evil:apply-macro - ;; 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 - - :nv "C-a" #'evil-numbers/inc-at-pt - :nv "C-S-a" #'evil-numbers/dec-at-pt - - - ;; --- Plugin bindings ------------------------------ - ;; auto-yasnippet - :i [C-tab] #'aya-expand - :nv [C-tab] #'aya-create - - ;; company-mode (vim-like omnicompletion) - :i "C-@" #'+company/complete - :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 - :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-n" #'company-select-next - "C-p" #'company-select-previous - "C-j" #'company-select-next - "C-k" #'company-select-previous - "C-h" #'company-show-doc-buffer - "C-u" #'company-previous-page - "C-d" #'company-next-page - "C-s" #'company-filter-candidates - (:when (featurep! :completion helm) - "C-S-s" #'helm-company) - (:when (featurep! :completion ivy) - "C-S-s" #'counsel-company) - "C-SPC" #'company-complete-common - [tab] #'company-complete-common-or-cycle - [backtab] #'company-select-previous) - ;; Automatically applies to `company-filter-map' - (:map company-search-map - "C-n" #'company-select-next-or-abort - "C-p" #'company-select-previous-or-abort - "C-j" #'company-select-next-or-abort - "C-k" #'company-select-previous-or-abort - "C-s" (λ! (company-search-abort) (company-filter-candidates)) - [escape] #'company-search-abort)) - - ;; counsel - (:when (featurep! :completion ivy) - (: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)))) - - ;; easymotion - :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' - (:after evil-easymotion - :map evilem-map - "a" (evilem-create #'evil-forward-arg) - "A" (evilem-create #'evil-backward-arg) - "s" (evilem-create #'evil-snipe-repeat - :name 'evil-easymotion-snipe-forward - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))) - "S" (evilem-create #'evil-snipe-repeat - :name 'evil-easymotion-snipe-backward - :pre-hook (save-excursion (call-interactively #'evil-snipe-S)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))) - "SPC" #'avy-goto-char-timer - "/" (evilem-create #'evil-ex-search-next - :pre-hook (save-excursion (call-interactively #'evil-ex-search-forward)) - :bind ((evil-search-wrap))) - "?" (evilem-create #'evil-ex-search-previous - :pre-hook (save-excursion (call-interactively #'evil-ex-search-backward)) - :bind ((evil-search-wrap)))) - - ;; evil - (:after evil - :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr - :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 "k" #'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 - - (: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" #'other-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 - "O" #'doom/window-zoom - ;; Delete window - "c" #'+workspace/close-window-or-workspace - "C-C" #'ace-delete-window)) - - ;; 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 - :nv "j" #'evil-mc-make-cursor-move-next-line - :nv "k" #'evil-mc-make-cursor-move-prev-line) - (: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 - :map evil-snipe-parent-transient-map - ;; switch to evil-easymotion/avy after a snipe - "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 - (:after flyspell - ;; Press RET on misspelled words to correct them - (:map flyspell-mouse-map - "RET" #'flyspell-correct-word-generic - "" #'flyspell-correct-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 - [left] #'left-char - [right] #'right-char - "C-S-n" #'helm-next-source - "C-S-p" #'helm-previous-source - "C-j" #'helm-next-line - "C-k" #'helm-previous-line - "C-S-j" #'helm-next-source - "C-S-k" #'helm-previous-source - "C-f" #'helm-next-page - "C-S-f" #'helm-previous-page - "C-u" #'helm-delete-minibuffer-contents - "C-w" #'backward-kill-word - "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! - "C-s" #'helm-minibuffer-history - "C-b" #'backward-word - ;; Swap TAB and C-z - [tab] #'helm-execute-persistent-action - "C-z" #'helm-select-action) - (:after helm-files - :map (helm-find-files-map helm-read-file-map) - [M-return] #'helm-ff-run-switch-other-window - "C-w" #'helm-find-files-up-one-level) - (:after helm-ag - :map helm-ag-map - [backtab] #'helm-ag-edit - [left] nil - [right] nil) - (:after helm-locate - :map helm-generic-files-map - [M-return] #'helm-ff-run-switch-other-window) - (:after helm-buffers - :map helm-buffer-map - [M-return] #'helm-buffer-switch-other-window) - (:after helm-regexp - :map helm-moccur-map - [M-return] #'helm-moccur-run-goto-line-ow) - (:after helm-grep - :map helm-grep-map - [M-return] #'helm-grep-run-other-window-action)) - - ;; hl-todo - :m "]t" #'hl-todo-next - :m "[t" #'hl-todo-previous - - ;; ivy - (:after ivy - :map ivy-minibuffer-map - "C-SPC" #'ivy-call-and-recenter ; preview file - "C-l" #'ivy-alt-done - "M-z" #'undo - "M-v" #'yank - "C-v" #'yank) - - ;; 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 - - ;; swiper - (:after swiper - (:map swiper-map - [backtab] #'+ivy/wgrep-occur)) - - ;; 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 - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field) - (:map yas-minor-mode-map - :ig [tab] yas-maybe-expand - :v [tab] #'yas-insert-snippet)) - - - ;; --- Major mode bindings -------------------------- - (:after markdown-mode - (:map markdown-mode-map - ;; fix conflicts with private bindings - "" nil - "" nil - "" nil)) - - - ;; --- Built-in plugins ----------------------------- - (:when (featurep! :completion company) - (:after comint - ;; TAB auto-completion in term buffers - :map comint-mode-map [tab] #'company-complete)) - - (:map* (help-mode-map helpful-mode-map) - :n "Q" #'ivy-resume) - - (:after vc-annotate - :map vc-annotate-mode-map - [remap quit-window] #'kill-this-buffer)) - - -;; -;; - -(map! :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 - - ;; Most commonly used - :desc "Find file in project" :n "SPC" #'projectile-find-file - :desc "Browse files" :n "." #'find-file - :desc "Toggle last popup" :n "~" #'+popup/toggle - (:when (featurep! :completion ivy) - :desc "Resume last search" :n "'" #'ivy-resume) - (:when (featurep! :completion helm) - :desc "Resume last search" :n "'" #'helm-resume) - :desc "Blink cursor line" :n "DEL" #'+nav-flash/blink-cursor - :desc "Jump to bookmark" :n "RET" #'bookmark-jump - - (:when (featurep! :feature workspaces) - :desc "Switch workspace buffer" :n "," #'persp-switch-to-buffer - :desc "Switch buffer" :n "<" #'switch-to-buffer) - (:unless (featurep! :feature workspaces) - :desc "Switch buffer" :n "," #'switch-to-buffer) - - ;; C-u is used by evil - :desc "Universal argument" :n "u" #'universal-argument - :desc "window" :nm "w" evil-window-map - - (:desc "previous..." :prefix "[" - :desc "Text size" :nv "[" #'text-scale-decrease - :desc "Buffer" :nv "b" #'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 "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" #'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 "Spelling error" :nv "s" #'evil-next-flyspell-error - :desc "Spelling correction" :n "S" #'flyspell-correct-word-generic) - - (:desc "search" :prefix "/" - (:when (featurep! :completion ivy) - :desc "Buffer" :nv "b" #'swiper - :desc "Project" :nv "p" #'+ivy/project-search - :desc "Directory" :nv "d" #'+ivy/project-search-from-cwd) - (:when (featurep! :completion helm) - :desc "Buffer" :nv "b" #'swiper-helm - :desc "Project" :nv "p" #'+helm/project-search - :desc "Directory" :nv "d" #'+helm/project-search-from-cwd) - :desc "Symbols" :nv "i" #'imenu - :desc "Symbols across buffers" :nv "I" #'imenu-anywhere - :desc "Online providers" :nv "o" #'+lookup/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 a past 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 "Rename workspace" :n "r" #'+workspace/rename - :desc "Restore last session" :n "R" #'+workspace/load-last-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 - (:when (featurep! :feature workspaces) - :desc "Switch workspace buffer" :n "b" #'persp-switch-to-buffer - :desc "Switch buffer" :n "B" #'switch-to-buffer) - (:unless (featurep! :feature workspaces) - :desc "Switch buffer" :n "b" #'switch-to-buffer) - :desc "Kill buffer" :n "k" #'kill-this-buffer - :desc "Kill other buffers" :n "o" #'doom/kill-other-buffers - :desc "Toggle narrowing" :nv "-" #'doom/clone-and-narrow-buffer - :desc "Next buffer" :n "n" #'next-buffer - :desc "Previous buffer" :n "p" #'previous-buffer - :desc "Next buffer" :n "]" #'next-buffer - :desc "Previous buffer" :n "[" #'previous-buffer - :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 "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 "Format buffer/region" :n "f" #'+format/buffer - :v "f" #'+format/region - :desc "Build tasks" :nv "b" #'+eval/build - :desc "Jump to definition" :n "d" #'+lookup/definition - :desc "Jump to references" :n "D" #'+lookup/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 directory" :n "d" #'dired - :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 "Find file in private config" :n "p" #'+default/find-in-config - :desc "Browse private config" :n "P" #'+default/browse-config - :desc "Delete this file" :n "X" #'doom/delete-this-file) - - (:desc "git" :prefix "g" - :desc "Magit blame" :n "b" #'magit-blame-addition - :desc "Magit commit" :n "c" #'magit-commit - :desc "Magit clone" :n "C" #'+magit/clone - :desc "Magit dispatch" :n "d" #'magit-dispatch-popup - :desc "Magit find-file" :n "f" #'magit-find-file - :desc "Magit status" :n "g" #'magit-status - :desc "Magit file delete" :n "x" #'magit-file-delete - :desc "List gists" :n "G" #'+gist:list - :desc "MagitHub dispatch" :n "h" #'magithub-dispatch-popup - :desc "Initialize repo" :n "i" #'magit-init - :desc "Browse issues tracker" :n "I" #'+vc/git-browse-issues - :desc "Magit buffer log" :n "l" #'magit-log-buffer-file - :desc "List repositories" :n "L" #'magit-list-repositories - :desc "Browse remote" :n "o" #'+vc/git-browse - :desc "Magit push popup" :n "p" #'magit-push-popup - :desc "Magit pull popup" :n "P" #'magit-pull-popup - :desc "Git revert hunk" :n "r" #'git-gutter:revert-hunk - :desc "Git revert file" :n "R" #'vc-revert - :desc "Git stage hunk" :n "s" #'git-gutter:stage-hunk - :desc "Git stage file" :n "S" #'magit-stage-file - :desc "Git time machine" :n "t" #'git-timemachine-toggle - :desc "Git unstage file" :n "U" #'magit-unstage-file - :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 "Open Bug Report" :n "b" #'doom/open-bug-report - :desc "Describe char" :n "c" #'describe-char - :desc "Describe DOOM module" :n "d" #'doom/describe-module - :desc "Open Doom manual" :n "D" #'doom/open-manual - :desc "Open vanilla sandbox" :n "E" #'doom/open-vanilla-sandbox - :desc "Describe function" :n "f" #'describe-function - :desc "Describe face" :n "F" #'describe-face - :desc "Info" :n "i" #'info-lookup-symbol - :desc "Describe key" :n "k" #'describe-key - :desc "Find documentation" :n "K" #'+lookup/documentation - :desc "Find library" :n "l" #'find-library - :desc "Command log" :n "L" #'global-command-log-mode - :desc "View *Messages*" :n "m" #'view-echo-area-messages - :desc "Describe mode" :n "M" #'describe-mode - :desc "Toggle profiler" :n "p" #'doom/toggle-profiler - :desc "Reload theme" :n "r" #'doom/reload-theme - :desc "Reload private config" :n "R" #'doom/reload - :desc "Describe DOOM setting" :n "s" #'doom/describe-setters - :desc "Describe variable" :n "v" #'describe-variable - :desc "Print Doom version" :n "V" #'doom/version - :desc "Man pages" :n "w" #'+default/man-or-woman - :desc "Describe at point" :n "." #'helpful-at-point - :desc "What face" :n "'" #'doom/what-face - :desc "What minor modes" :n ";" #'doom/describe-active-minor-mode) - - (:desc "insert" :prefix "i" - (:when (featurep! :completion helm) - :desc "From kill-ring" :nv "y" #'helm-show-kill-ring) - (:when (featurep! :completion ivy) - :desc "From kill-ring" :nv "y" #'counsel-yank-pop - :desc "From evil registers" :nv "r" #'counsel-evil-registers) - :desc "From snippet" :nv "s" #'yas-insert-snippet) - - (:desc "notes" :prefix "n" - (:when (featurep! :ui deft) - :desc "Deft" :n "d" #'deft) - :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) - - (:desc "open" :prefix "o" - :desc "Org agenda" :n "a" #'org-agenda - :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 "Dired" :n "-" #'dired-jump - (:when (featurep! :emacs dired +ranger) - :desc "Deer" :nm "j" #'deer - :desc "Ranger" :nm "J" #'ranger) - - (:when (featurep! :ui neotree) - :desc "Project sidebar" :n "p" #'+neotree/open - :desc "Find file in project sidebar" :n "P" #'+neotree/find-this-file) - (:when (featurep! :ui treemacs) - :desc "Project sidebar" :n "p" #'+treemacs/toggle - :desc "Find file in project sidebar" :n "P" #'+treemacs/find-file) - :desc "Imenu sidebar" :nv "i" #'imenu-list-smart-toggle - :desc "Terminal" :n "t" #'+term/open - :desc "Terminal in popup" :n "T" #'+term/open-popup-in-project - :desc "Eshell" :n "e" #'+eshell/open - :desc "Eshell in popup" :n "E" #'+eshell/open-popup - - (:when (featurep! :collab floobits) - :desc "floobits" :prefix "f" - :n "c" #'floobits-clear-highlights - :n "f" #'floobits-follow-user - :n "j" #'floobits-join-workspace - :n "l" #'floobits-leave-workspace - :n "R" #'floobits-share-dir-private - :n "s" #'floobits-summon - :n "t" #'floobits-follow-mode-toggle - :n "U" #'floobits-share-dir-public) - - (:when (featurep! :tools macos) - :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) - - (:when (featurep! :tools docker) - :desc "Docker" :n "D" #'docker)) - - (: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 "Compile project" :n "c" #'projectile-compile-project - :desc "Find other file" :n "o" #'projectile-find-other-file - :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 "Invalidate cache" :n "x" #'projectile-invalidate-cache) - - (:desc "quit" :prefix "q" - :desc "Quit Emacs" :n "q" #'evil-quit-all - :desc "Save and quit" :n "Q" #'evil-save-and-quit - :desc "Quit (forget session)" :n "X" #'+workspace/kill-session-and-quit - :desc "Restart & restore Doom" :n "r" #'+workspace/restart-emacs-then-restore - :desc "Restart Doom" :n "R" #'restart-emacs) - - (:when (featurep! :tools upload) - (:desc "remote" :prefix "r" - :desc "Upload local" :n "u" #'ssh-deploy-upload-handler - :desc "Upload local (force)" :n "U" #'ssh-deploy-upload-handler-forced - :desc "Download remote" :n "d" #'ssh-deploy-download-handler - :desc "Diff local & remote" :n "D" #'ssh-deploy-diff-handler - :desc "Browse remote files" :n "." #'ssh-deploy-browse-remote-handler - :desc "Detect remote changes" :n ">" #'ssh-deploy-remote-changes-handler)) - - (:when (featurep! :feature snippets) - (:desc "snippets" :prefix "s" - :desc "New snippet" :n "n" #'yas-new-snippet - :desc "Insert snippet" :nv "i" #'yas-insert-snippet - :desc "Jump to mode snippet" :n "/" #'yas-visit-snippet-file - :desc "Jump to snippet" :n "s" #'+snippets/find-file - :desc "Browse snippets" :n "S" #'+snippets/browse - :desc "Reload snippets" :n "r" #'yas-reload-all)) - - (: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 "Frame fullscreen" :n "F" #'toggle-frame-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-mode - :desc "org-tree-slide mode" :n "p" #'+org-present/start)) - - -;; -;; Keybinding fixes - -;; This section is dedicated to "fixing" certain keys so that they behave -;; sensibly (and consistently with similar contexts). - -;; Make SPC u SPC u possible (#747) -(define-key universal-argument-map - (kbd (concat doom-leader-key " u")) #'universal-argument-more) - -;; Fix MacOS shift+tab -(when IS-MAC - (define-key input-decode-map [S-iso-lefttab] [backtab])) - -(defun +default|setup-input-decode-map () - (define-key input-decode-map (kbd "TAB") [tab])) -(add-hook 'tty-setup-hook #'+default|setup-input-decode-map) - -(after! tabulated-list - (define-key tabulated-list-mode-map "q" #'quit-window)) - -(when (featurep! :feature evil +everywhere) - (evil-define-key* 'insert 'global - ;; 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. - "\C-a" #'doom/backward-to-bol-or-indent - "\C-e" #'doom/forward-to-last-non-comment-or-eol - "\C-u" #'doom/backward-kill-to-bol-and-indent - ;; textmate-esque newline insertion - [M-return] #'evil-open-below - [S-M-return] #'evil-open-above - ;; Emacsien motions for insert mode - "\C-b" #'backward-word - "\C-f" #'forward-word - ;; textmate-esque deletion - [M-backspace] #'doom/backward-kill-to-bol-and-indent) - - (define-key! evil-ex-completion-map - "\C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history) - "\C-a" #'move-beginning-of-line - "\C-b" #'backward-word - "\C-f" #'forward-word) - - (after! man - (evil-define-key* 'normal Man-mode-map "q" #'kill-this-buffer)) - - (after! view - (define-key view-mode-map [escape] #'View-quit-all))) - -;; Restore common editing keys (and ESC) in minibuffer -(defun +default|fix-minibuffer-in-map (map) - (define-key! map - "\C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history) - "\C-a" #'move-beginning-of-line - "\C-w" #'backward-kill-word - "\C-u" #'backward-kill-sentence - "\C-b" #'backward-word - "\C-f" #'forward-word - "\C-z" (λ! (ignore-errors (call-interactively #'undo)))) - (when (featurep! :feature evil +everywhere) - (define-key! map - [escape] #'abort-recursive-edit - "\C-r" #'evil-paste-from-register - "\C-j" #'next-line - "\C-k" #'previous-line - (kbd "C-S-j") #'scroll-up-command - (kbd "C-S-k") #'scroll-down-command))) - -(mapc #'+default|fix-minibuffer-in-map - (list minibuffer-local-map - minibuffer-local-ns-map - minibuffer-local-completion-map - minibuffer-local-must-match-map - minibuffer-local-isearch-map - read-expression-map)) - -(after! ivy (+default|fix-minibuffer-in-map ivy-minibuffer-map)) - -(after! man - (evil-define-key* 'normal Man-mode-map "q" #'kill-this-buffer)) - - -;; Evil-collection fixes -(setq evil-collection-key-blacklist - (list "C-j" "C-k" "gd" "gf" "K" "[" "]" "gz" - doom-leader-key doom-localleader-key)) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el new file mode 100644 index 000000000..fea63ab5e --- /dev/null +++ b/modules/config/default/+emacs-bindings.el @@ -0,0 +1,3 @@ +;;; config/default/+emacs-bindings.el -*- lexical-binding: t; -*- + +;; TODO diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el new file mode 100644 index 000000000..41a1bfff2 --- /dev/null +++ b/modules/config/default/+evil-bindings.el @@ -0,0 +1,890 @@ +;;; config/default/+bindings.el -*- lexical-binding: t; -*- + +;; This file defines a Spacemacs-esque keybinding scheme + +;; expand-region's prompt can't tell what key contract-region is bound to, so we +;; tell it explicitly. +(setq expand-region-contract-fast-key "V") + + +;; +;; Global keybindings + +(map! (:map 'override + ;; Make M-x more accessible + "s-x" 'execute-extended-command + "M-x" 'execute-extended-command + ;; A little sandbox to run code in + "s-;" 'eval-expression) + + [remap evil-jump-to-tag] #'projectile-find-tag + [remap find-tag] #'projectile-find-tag + + :i [remap newline] #'newline-and-indent + :i "C-j" #'+default/newline + + :n "s-+" (λ! (text-scale-set 0)) + :n "s-=" #'text-scale-increase + :n "s--" #'text-scale-decrease + + ;; Simple window/frame navigation/manipulation + :n "s-w" #'delete-window + :n "s-W" #'delete-frame + :n "C-S-f" #'toggle-frame-fullscreen + :n "s-n" #'+default/new-buffer + :n "s-N" #'make-frame + + ;; Textmate-esque bindings + :n "s-R" #'+eval/region-and-replace + :n "s-a" #'mark-whole-buffer + :n "s-b" #'+default/compile + :n "s-c" #'evil-yank + :n "s-f" #'swiper + :n "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) + + ;; expand-region + :v "v" #'er/expand-region + :v "C-v" #'er/contract-region + + ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because it + ;; imposes some other functionality and overhead we don't need) + :g "s-z" #'undo + :g "s-s" #'save-buffer + :g "s-c" #'yank + :g "s-v" #'copy-region-as-kill + :v "s-v" (if (featurep 'evil) #'evil-yank #'yank) + + :nv "C-SPC" #'+evil/fold-toggle) + + +;; +;; Built-in plugins + +(map! :after vc-annotate + :map vc-annotate-mode-map + [remap quit-window #'kill-this-buffer]) + + +;; +;; Module keybinds + +;;; :feature +(map! (:when (featurep! :feature debugger) + :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 + :n "c" #'realgud:cmd-continue + :m "n" #'realgud:cmd-next + :m "b" #'realgud:cmd-break + :m "B" #'realgud:cmd-clear) + + (:when (featurep! :feature eval) + :g "s-r" #'+eval/buffer + :nv "gr" #'+eval:region + :n "gR" #'+eval/buffer + :v "gR" #'+eval:replace-region) + + (:when (featurep! :feature evil) + :m "]a" #'evil-forward-arg + :m "[a" #'evil-backward-arg + :m "]o" #'outline-next-visible-heading + :m "[o" #'outline-previous-visible-heading + :n "]b" #'next-buffer + :n "[b" #'previous-buffer + :n "zx" #'kill-this-buffer + :n "ZX" #'bury-buffer + :n "gp" #'+evil/reselect-paste + :nv "g=" #'widen + :nv "g-" #'+evil:narrow-buffer + :nv "g@" #'+evil:apply-macro + :nv "gc" #'evil-commentary + :nv "gx" #'evil-exchange + :nv "C-a" #'evil-numbers/inc-at-pt + :nv "C-S-a" #'evil-numbers/dec-at-pt + :nv [tab] #'+evil/matchit-or-toggle-fold + :v "gp" #'+evil/paste-preserve-register + :v "@" #'+evil:apply-macro + ;; repeat in visual mode (FIXME buggy) + :v "." #'+evil:apply-macro + ;; don't leave visual mode after shifting + :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv + + ;; window management (prefix "C-w") + (:map evil-window-map + ;; Navigation + "C-h" #'evil-window-left + "C-j" #'evil-window-down + "C-k" #'evil-window-up + "C-l" #'evil-window-right + "C-w" #'other-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 + "O" #'doom/window-zoom + ;; Delete window + "c" #'+workspace/close-window-or-workspace + "C-C" #'ace-delete-window) + + ;; Plugins + ;; evil-easymotion + :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' + (:after evil-easymotion + :map evilem-map + "a" (evilem-create #'evil-forward-arg) + "A" (evilem-create #'evil-backward-arg) + "s" (evilem-create #'evil-snipe-repeat + :name 'evil-easymotion-snipe-forward + :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))) + "S" (evilem-create #'evil-snipe-repeat + :name 'evil-easymotion-snipe-backward + :pre-hook (save-excursion (call-interactively #'evil-snipe-S)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))) + "SPC" #'avy-goto-char-timer + "/" (evilem-create #'evil-ex-search-next + :pre-hook (save-excursion (call-interactively #'evil-ex-search-forward)) + :bind ((evil-search-wrap))) + "?" (evilem-create #'evil-ex-search-previous + :pre-hook (save-excursion (call-interactively #'evil-ex-search-backward)) + :bind ((evil-search-wrap)))) + + ;; text object plugins + :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr + :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 "k" #'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 + + ;; evil-snipe + (:after evil-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 + :g "S" #'evil-Surround-edit) + + (:when (featurep! :feature lookup) + :nv "K" #'+lookup/documentation + :nv "gd" #'+lookup/definition + :nv "gD" #'+lookup/references + :nv "gf" #'+lookup/file) + + (:when (featurep! :feature snippets) + ;; auto-yasnippet + :i [C-tab] #'aya-expand + :nv [C-tab] #'aya-create + ;; 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 + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field) + :ie yas-minor-mode-map [tab] yas-maybe-expand + :v yas-minor-mode-map [tab] #'yas-insert-snippet)) + + (:when (featurep! :feature spellcheck) + :m "]S" #'flyspell-correct-word-generic + :m "[S" #'flyspell-correct-previous-word-generic + (:map flyspell-mouse-map + "RET" #'flyspell-correct-word-generic + [mouse-1] #'flyspell-correct-word-generic)) + + (:when (featurep! :completion syntax-checker) + :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)) + + (:when (featurep! :feature workspaces) + :n "s-t" #'+workspace/new + :n "s-T" #'+workspace/display + :n "s-1" (λ! (+workspace/switch-to 0)) + :n "s-2" (λ! (+workspace/switch-to 1)) + :n "s-3" (λ! (+workspace/switch-to 2)) + :n "s-4" (λ! (+workspace/switch-to 3)) + :n "s-5" (λ! (+workspace/switch-to 4)) + :n "s-6" (λ! (+workspace/switch-to 5)) + :n "s-7" (λ! (+workspace/switch-to 6)) + :n "s-8" (λ! (+workspace/switch-to 7)) + :n "s-9" (λ! (+workspace/switch-to 8)) + :n "s-0" #'+workspace/switch-to-last + :n "gt" #'+workspace/switch-right + :n "gT" #'+workspace/switch-left + :n "]w" #'+workspace/switch-right + :n "[w" #'+workspace/switch-left)) + +;;; :completion +(map! (:when (featurep! :completion company) + :i "C-@" #'+company/complete + :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 + :i "C-p" #'+company/dabbrev-code-previous) + (:after company + (:map company-active-map + "C-w" nil ; don't interfere with `evil-delete-backward-word' + "C-n" #'company-select-next + "C-p" #'company-select-previous + "C-j" #'company-select-next + "C-k" #'company-select-previous + "C-h" #'company-show-doc-buffer + "C-u" #'company-previous-page + "C-d" #'company-next-page + "C-s" #'company-filter-candidates + "C-S-s" `(,(cond ((featurep! :completion helm) #'helm-company) + ((featurep! :completion ivy) #'counsel-company))) + "C-SPC" #'company-complete-common + [tab] #'company-complete-common-or-cycle + [backtab] #'company-select-previous) + (:map company-search-map ; applies to `company-filter-map' too + "C-n" #'company-select-next-or-abort + "C-p" #'company-select-previous-or-abort + "C-j" #'company-select-next-or-abort + "C-k" #'company-select-previous-or-abort + "C-s" (λ! (company-search-abort) (company-filter-candidates)) + [escape] #'company-search-abort) + ;; TAB auto-completion in term buffers + :map comint-mode-map [tab] #'company-complete)) + + (:when (featurep! :completion ivy) + (:map (help-mode-map helpful-mode-map) + :n "Q" #'ivy-resume) + (:after ivy + :map ivy-minibuffer-map + "C-SPC" #'ivy-call-and-recenter ; preview file + "C-l" #'ivy-alt-done + "s-z" #'undo + "s-v" #'yank + "C-v" #'yank) + (:after counsel + :map counsel-ag-map + [backtab] #'+ivy/wgrep-occur ; search/replace on results + "C-SPC" #'ivy-call-and-recenter ; preview + "s-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action)) + (:after swiper + :map swiper-map + [backtab] #'+ivy/wgrep-occur)) + + (:when (featurep! :completion helm) + (:after helm + (:map helm-map + [left] #'left-char + [right] #'right-char + "C-S-n" #'helm-next-source + "C-S-p" #'helm-previous-source + "C-j" #'helm-next-line + "C-k" #'helm-previous-line + "C-S-j" #'helm-next-source + "C-S-k" #'helm-previous-source + "C-f" #'helm-next-page + "C-S-f" #'helm-previous-page + "C-u" #'helm-delete-minibuffer-contents + "C-w" #'backward-kill-word + "C-r" #'evil-paste-from-register ; Evil registers in helm! Glorious! + "C-s" #'helm-minibuffer-history + "C-b" #'backward-word + ;; Swap TAB and C-z + [tab] #'helm-execute-persistent-action + "C-z" #'helm-select-action) + (:after swiper-helm + :map swiper-helm-keymap [backtab] #'helm-ag-edit) + (:after helm-ag + :map helm-ag-map + "C--" #'+helm-do-ag-decrease-context + "C-=" #'+helm-do-ag-increase-context + [backtab] #'helm-ag-edit + [left] nil + [right] nil) + (:after helm-files + :map (helm-find-files-map helm-read-file-map) + [M-return] #'helm-ff-run-switch-other-window + "C-w" #'helm-find-files-up-one-level) + (:after helm-locate + :map helm-generic-files-map [M-return] #'helm-ff-run-switch-other-window) + (:after helm-buffers + :map helm-buffer-map [M-return] #'helm-buffer-switch-other-window) + (:after helm-regexp + :map helm-moccur-map [M-return] #'helm-moccur-run-goto-line-ow) + (:after helm-grep + :map helm-grep-map [M-return] #'helm-grep-run-other-window-action)))) + +;;; :ui +(map! (:when (featurep! :ui hl-todo) + :m "]t" #'hl-todo-next + :m "[t" #'hl-todo-previous) + + (:when (featurep! :ui 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) + + (:when (featurep! :ui popup) + :n "C-`" #'+popup/toggle + :n "C-~" #'+popup/raise + :g "C-x p" #'+popup/other) + + (:when (featurep! :ui vc-gutter) + :m "]d" #'git-gutter:next-hunk + :m "[d" #'git-gutter:previous-hunk)) + +;;; :editor +(map! (:when (featurep! :editor format) + :n "gQ" #'+format:region) + + (:when (featurep! :editor multiple-cursors) + ;; evil-mc + (:prefix "gz" + :nv "d" #'evil-mc-make-and-goto-next-match + :nv "D" #'evil-mc-make-and-goto-prev-match + :nv "j" #'evil-mc-make-cursor-move-next-line + :nv "k" #'evil-mc-make-cursor-move-prev-line + :nv "m" #'evil-mc-make-all-cursors + :nv "n" #'evil-mc-make-and-goto-next-cursor + :nv "N" #'evil-mc-make-and-goto-last-cursor + :nv "p" #'evil-mc-make-and-goto-prev-cursor + :nv "P" #'evil-mc-make-and-goto-first-cursor + :nv "t" #'+evil/mc-toggle-cursors + :nv "u" #'evil-mc-undo-all-cursors + :nv "z" #'+evil/mc-make-cursor-here) + (: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))) + + (:when (featurep! :editor rotate-text) + :n "!" #'rotate-text)) + +;;; :emacs +(map! (:when (featurep! :emacs vc) + :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)) + +;;; :tools +(map! (:when (featurep! :tools magit) + :after evil-magit + ;; fix conflicts with private bindings + :map (magit-status-mode-map magit-revision-mode-map) + "C-j" nil + "C-k" nil) + + (:when (featurep! :tools 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)) + +;;; :lang +(map! (:when (featurep! :lang markdown) + :after markdown-mode + :map markdown-mode-map + ;; fix conflicts with private bindings + "" nil + "" nil + "" nil)) + + +;; +;; + +(map! :leader + :desc "Ex Command" ";" #'evil-ex + :desc "M-x" ":" #'execute-extended-command + :desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer + :desc "Org Capture" "X" #'org-capture + + ;; C-u is used by evil + :desc "Universal argument" "u" #'universal-argument + :desc "Window management" "w" #'evil-window-map + + :desc "Toggle last popup" "~" #'+popup/toggle + :desc "Find file" "." #'find-file + :desc "Switch to buffer" "," #'switch-to-buffer + + :desc "Resume last search" "'" + (cond ((featurep! :completion ivy) #'ivy-resume) + ((featurep! :completion helm) #'helm-resume)) + + :desc "Find file in project" "SPC" #'projectile-find-file + :desc "Blink cursor line" "DEL" #'+nav-flash/blink-cursor + :desc "Jump to bookmark" "RET" #'bookmark-jump + + ;; Prefixed key groups + (:prefix ("/" . "search") + :desc "Jump to symbol across buffers" "I" #'imenu-anywhere + :desc "Search buffer" "b" #'swiper + :desc "Search current directory" "d" #'+ivy/project-search-from-cwd + :desc "Jump to symbol" "i" #'imenu + :desc "Jump to link" "l" #'ace-link + :desc "Look up online" "o" #'+lookup/online-select + :desc "Search project" "p" #'+ivy/project-search) + + (:prefix ("]" . "next") + :desc "Increase text size" "[" #'text-scale-decrease + :desc "Next buffer" "b" #'previous-buffer + :desc "Next diff Hunk" "d" #'git-gutter:previous-hunk + :desc "Next todo" "t" #'hl-todo-previous + :desc "Next error" "e" #'previous-error + :desc "Next workspace" "w" #'+workspace/switch-left + :desc "Next spelling error" "s" #'evil-prev-flyspell-error + :desc "Next spelling correction" "S" #'flyspell-correct-previous-word-generic) + + (:prefix ("[" . "previous") + :desc "Text size" "]" #'text-scale-increase + :desc "Buffer" "b" #'next-buffer + :desc "Diff Hunk" "d" #'git-gutter:next-hunk + :desc "Todo" "t" #'hl-todo-next + :desc "Error" "e" #'next-error + :desc "Workspace" "w" #'+workspace/switch-right + :desc "Spelling error" "s" #'evil-next-flyspell-error + :desc "Spelling correction" "S" #'flyspell-correct-word-generic) + + (:when (featurep! :feature workspaces) + (:prefix ("TAB" . "workspace") + :desc "Display tab bar" "TAB" #'+workspace/display + :desc "New workspace" "n" #'+workspace/new + :desc "Load workspace from file" "l" #'+workspace/load + :desc "Load a past session" "L" #'+workspace/load-session + :desc "Save workspace to file" "s" #'+workspace/save + :desc "Autosave current session" "S" #'+workspace/save-session + :desc "Switch workspace" "." #'+workspace/switch-to + :desc "Delete session" "x" #'+workspace/kill-session + :desc "Delete this workspace" "d" #'+workspace/delete + :desc "Rename workspace" "r" #'+workspace/rename + :desc "Restore last session" "R" #'+workspace/load-last-session + :desc "Next workspace" "]" #'+workspace/switch-right + :desc "Previous workspace" "[" #'+workspace/switch-left + :desc "Switch to 1st workspace" "1" (λ! (+workspace/switch-to 0)) + :desc "Switch to 2nd workspace" "2" (λ! (+workspace/switch-to 1)) + :desc "Switch to 3rd workspace" "3" (λ! (+workspace/switch-to 2)) + :desc "Switch to 4th workspace" "4" (λ! (+workspace/switch-to 3)) + :desc "Switch to 5th workspace" "5" (λ! (+workspace/switch-to 4)) + :desc "Switch to 6th workspace" "6" (λ! (+workspace/switch-to 5)) + :desc "Switch to 7th workspace" "7" (λ! (+workspace/switch-to 6)) + :desc "Switch to 8th workspace" "8" (λ! (+workspace/switch-to 7)) + :desc "Switch to 9th workspace" "9" (λ! (+workspace/switch-to 8)) + :desc "Switch to last workspace" "0" #'+workspace/switch-to-last)) + + (:prefix ("b" . "buffer") + :desc "Toggle narrowing" "-" #'doom/clone-and-narrow-buffer + :desc "New empty buffer" "N" #'evil-buffer-new + :desc "Sudo edit this file" "S" #'doom/sudo-this-file + :desc "Previous buffer" "[" #'previous-buffer + :desc "Next buffer" "]" #'next-buffer + :desc "Switch buffer" "b" #'switch-to-buffer + :desc "Kill buffer" "k" #'kill-this-buffer + :desc "Next buffer" "n" #'next-buffer + :desc "Kill other buffers" "o" #'doom/kill-other-buffers + :desc "Previous buffer" "p" #'previous-buffer + :desc "Save buffer" "s" #'save-buffer + :desc "Pop scratch buffer" "x" #'doom/open-scratch-buffer + :desc "Bury buffer" "z" #'bury-buffer) + + (:prefix ("c" . "code") + :desc "Jump to references" "D" #'+lookup/references + :desc "Evaluate & replace region" "E" #'+eval:replace-region + :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines + :desc "Build tasks" "b" #'+eval/build + :desc "Jump to definition" "d" #'+lookup/definition + :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region + :desc "Format buffer/region" "f" #'+format/region-or-buffer + :desc "Open REPL" "r" #'+eval/open-repl + :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace + :desc "List errors" "x" #'flycheck-list-errors) + + (:prefix ("f" . "file") + :desc "Find file" "." #'find-file + :desc "Find file in project" "/" #'projectile-find-file + :desc "Sudo find file" ">" #'doom/sudo-find-file + :desc "Find file from here" "?" #'counsel-file-jump + :desc "Browse emacs.d" "E" #'+default/browse-emacsd + :desc "Browse private config" "P" #'+default/browse-config + :desc "Recent project files" "R" #'projectile-recentf + :desc "Delete this file" "X" #'doom/delete-this-file + :desc "Find other file" "a" #'projectile-find-other-file + :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig + :desc "Find directory" "d" #'dired + :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd + :desc "Find file in private config" "p" #'+default/find-in-config + :desc "Recent files" "r" #'recentf-open-files + :desc "Save file" "s" #'save-buffer + :desc "Yank filename" "y" #'+default/yank-buffer-filename) + + (:prefix ("g" . "git") + (:when (featurep! :ui vc-gutter) + :desc "Git revert hunk" "r" #'git-gutter:revert-hunk + :desc "Git stage hunk" "s" #'git-gutter:stage-hunk + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Next hunk" "]" #'git-gutter:next-hunk + :desc "Previous hunk" "[" #'git-gutter:previous-hunk) + (:when (featurep! :emacs vc) + :desc "Browse issues tracker" "I" #'+vc/git-browse-issues + :desc "Browse remote" "o" #'+vc/git-browse + :desc "Git revert file" "R" #'vc-revert) + (:when (featurep! :tools magit) + :desc "Magit blame" "b" #'magit-blame-addition + :desc "Magit commit" "c" #'magit-commit + :desc "Magit clone" "C" #'+magit/clone + :desc "Magit dispatch" "d" #'magit-dispatch-popup + :desc "Magit find-file" "f" #'magit-find-file + :desc "Magit status" "g" #'magit-status + :desc "Magit file delete" "x" #'magit-file-delete + :desc "MagitHub dispatch" "h" #'magithub-dispatch-popup + :desc "Initialize repo" "i" #'magit-init + :desc "Magit buffer log" "l" #'magit-log-buffer-file + :desc "List repositories" "L" #'magit-list-repositories + :desc "Git stage file" "S" #'magit-stage-file + :desc "Git unstage file" "U" #'magit-unstage-file + :desc "Magit push popup" "p" #'magit-push-popup + :desc "Magit pull popup" "P" #'magit-pull-popup) + (:when (featurep! :tools gist) + :desc "List gists" "G" #'+gist:list)) + + (:prefix ("h" . "help") + :desc "What face" "'" #'doom/what-face + :desc "Describe at point" "." #'helpful-at-point + :desc "Describe active minor modes" ";" #'doom/describe-active-minor-mode + :desc "Open Doom manual" "D" #'doom/open-manual + :desc "Open vanilla sandbox" "E" #'doom/open-vanilla-sandbox + :desc "Describe face" "F" #'describe-face + :desc "Find documentation" "K" #'+lookup/documentation + :desc "Command log" "L" #'global-command-log-mode + :desc "Describe mode" "M" #'describe-mode + :desc "Reload private config" "R" #'doom/reload + :desc "Print Doom version" "V" #'doom/version + :desc "Apropos" "a" #'apropos + :desc "Open Bug Report" "b" #'doom/open-bug-report + :desc "Describe char" "c" #'describe-char + :desc "Describe DOOM module" "d" #'doom/describe-module + :desc "Describe function" "f" #'describe-function + :desc "Emacs help map" "h" help-map + :desc "Info" "i" #'info-lookup-symbol + :desc "Describe key" "k" #'describe-key + :desc "Find library" "l" #'find-library + :desc "View *Messages*" "m" #'view-echo-area-messages + :desc "Toggle profiler" "p" #'doom/toggle-profiler + :desc "Reload theme" "r" #'doom/reload-theme + :desc "Describe DOOM setting" "s" #'doom/describe-setters + :desc "Describe variable" "v" #'describe-variable + :desc "Man pages" "w" #'+default/man-or-woman) + + (:prefix ("i" . "insert") + :desc "Insert from clipboard" "y" #'yank-pop + :desc "Insert from evil register" "r" #'evil-ex-registers + :desc "Insert snippet" "s" #'yas-insert-snippet) + + (:prefix ("n" . "notes") + "d" (if (featurep! :ui deft) #'deft) + "n" '(+default/find-in-notes :wk "Find file in notes") + "N" '(+default/browse-notes :wk "Browse notes") + "x" '(org-capture :wk "Org capture")) + + (:prefix ("o" . "open") + :desc "Org agenda" "a" #'org-agenda + :desc "Default browser" "b" #'browse-url-of-file + :desc "Debugger" "d" #'+debug/open + :desc "REPL" "r" #'+eval/open-repl + :desc "Dired" "-" #'dired-jump + (:when (featurep! :ui neotree) + :desc "Project sidebar" "p" #'+neotree/open + :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) + (:when (featurep! :ui treemacs) + :desc "Project sidebar" "p" #'+treemacs/toggle + :desc "Find file in project sidebar" "P" #'+treemacs/find-file) + (:when (featurep! :emacs imenu) + :desc "Imenu sidebar" "i" #'imenu-list-smart-toggle) + (:when (featurep! :emacs term) + :desc "Terminal" "t" #'+term/open + :desc "Terminal in popup" "T" #'+term/open-popup-in-project) + (:when (featurep! :emacs eshell) + :desc "Eshell" "e" #'+eshell/open + :desc "Eshell in popup" "E" #'+eshell/open-popup) + (:when (featurep! :collab floobits) + (:prefix ("f" . "floobits") + "c" #'floobits-clear-highlights + "f" #'floobits-follow-user + "j" #'floobits-join-workspace + "l" #'floobits-leave-workspace + "R" #'floobits-share-dir-private + "s" #'floobits-summon + "t" #'floobits-follow-mode-toggle + "U" #'floobits-share-dir-public)) + (:when (featurep! :tools macos) + :desc "Reveal in Finder" "o" #'+macos/reveal-in-finder + :desc "Reveal project in Finder" "O" #'+macos/reveal-project-in-finder + :desc "Send to Transmit" "u" #'+macos/send-to-transmit + :desc "Send project to Transmit" "U" #'+macos/send-project-to-transmit + :desc "Send to Launchbar" "l" #'+macos/send-to-launchbar + :desc "Send project to Launchbar" "L" #'+macos/send-project-to-launchbar) + (:when (featurep! :tools docker) + :desc "Docker" "D" #'docker)) + + ;; (:prefix ("p" . "project") + ;; "." '(+default/browse-project :wk "Browse project") + ;; "/" '(projectile-find-file :wk "Find file in project") + ;; "!" '(projectile-run-shell-command-in-root :wk "Run cmd in project root") + ;; "c" '(projectile-compile-project :wk "Compile project") + ;; "o" '(projectile-find-other-file :wk "Find other file") + ;; "p" '(projectile-switch-project :wk "Switch project") + ;; "r" '(projectile-recentf :wk "Recent project files") + ;; "t" '(+ivy/tasks :wk "List project tasks") + ;; "x" '(projectile-invalidate-cache :wk "Invalidate cache")) + + ;; (:prefix ("q" . "quit/restart") + ;; "q" '(evil-quit-all :wk "Quit Emacs") + ;; "Q" '(evil-save-and-quit :wk "Save and quit Emacs") + ;; "X" '(+workspace/kill-session-and-quit :wk "Quit Emacs & forget session") + ;; "r" '(+workspace/restart-emacs-then-restore :wk "Restart & restore Emacs") + ;; "R" '(restart-emacs :wk "Restart Emacs")) + + ;; (:when (featurep! :tools upload) + ;; (:prefix ("r" . "remote") + ;; "u" '(ssh-deploy-upload-handler :wk "Upload local") + ;; "U" '(ssh-deploy-upload-handler-forced :wk "Upload local (force)") + ;; "d" '(ssh-deploy-download-handler :wk "Download remote") + ;; "D" '(ssh-deploy-diff-handler :wk "Diff local & remote") + ;; "." '(ssh-deploy-browse-remote-handler :wk "Browse remote files") + ;; ">" '(ssh-deploy-remote-changes-handler :wk "Detect remote changes"))) + + ;; (:when (featurep! :feature snippets) + ;; (:prefix ("s" . "snippets") + ;; "n" '(yas-new-snippet :wk "New snippet") + ;; "i" '(yas-insert-snippet :wk "Insert snippet") + ;; "/" '(yas-visit-snippet-file :wk "Jump to mode snippet") + ;; "s" '(+snippets/find-file :wk "Jump to snippet") + ;; "S" '(+snippets/browse :wk "Browse snippets") + ;; "r" '(yas-reload-all :wk "Reload snippets"))) + + ;; (:prefix ("t" . "toggle") + ;; "s" '(flyspell-mode :wk "Flyspell") + ;; "f" '(flycheck-mode :wk "Flycheck") + ;; "l" '(doom/toggle-line-numbers :wk "Line numbers") + ;; "F" '(toggle-frame-fullscreen :wk "Frame fullscreen") + ;; "i" '(highlight-indentation-mode :wk "Indent guides") + ;; "I" '(highlight-indentation-current-column-mode :wk "Indent guides (column)") + ;; "h" '(+impatient-mode/toggle :wk "Impatient mode") + ;; "b" '(doom-big-font-mode :wk "Big mode") + ;; "g" '(evil-goggles-mode :wk "Evil goggles") + ;; "p" '(+org-present/start :wk "org-tree-slide mode")) + ) + + +;; +;; Keybinding fixes + +;; This section is dedicated to "fixing" certain keys so that they behave +;; sensibly (and consistently with similar contexts). + +;; Make SPC u SPC u [...] possible (#747) +(define-key universal-argument-map + (kbd (concat doom-leader-key " u")) #'universal-argument-more) + +(when IS-MAC + ;; Fix MacOS shift+tab + (define-key input-decode-map [S-iso-lefttab] [backtab]) + ;; Fix frame-switching on MacOS + (global-set-key "M-`" #'other-frame)) + +(defun +default|setup-input-decode-map () + (define-key input-decode-map (kbd "TAB") [tab])) +(add-hook 'tty-setup-hook #'+default|setup-input-decode-map) + +(after! tabulated-list + (define-key tabulated-list-mode-map "q" #'quit-window)) + +(when (featurep! :feature evil +everywhere) + ;; Evil-collection fixes + (setq evil-collection-key-blacklist + (list "C-j" "C-k" "gd" "gf" "K" "[" "]" "gz" + doom-leader-key doom-localleader-key)) + + (define-key! 'insert + ;; 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. + "C-a" #'doom/backward-to-bol-or-indent + "C-e" #'doom/forward-to-last-non-comment-or-eol + "C-u" #'doom/backward-kill-to-bol-and-indent + ;; textmate-esque newline insertion + [s-return] #'evil-open-below + [S-s-return] #'evil-open-above + ;; Emacsien motions for insert mode + "C-b" #'backward-word + "C-f" #'forward-word + ;; textmate-esque deletion + [s-backspace] #'doom/backward-kill-to-bol-and-indent) + + (define-key! evil-ex-completion-map + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history) + "C-a" #'move-beginning-of-line + "C-b" #'backward-word + "C-f" #'forward-word) + + (define-key! view-mode-map :package 'view [escape] #'View-quit-all) + + (define-key! 'normal Man-mode-map :package 'man "q" #'kill-this-buffer)) + +;; Restore common editing keys (and ESC) in minibuffer +(let ((maps `(minibuffer-local-map + minibuffer-local-ns-map + minibuffer-local-completion-map + minibuffer-local-must-match-map + minibuffer-local-isearch-map + read-expression-map + ,@(if (featurep! :completion ivy) '(ivy-minibuffer-map))))) + (define-key! :keymaps maps + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history) + "C-a" #'move-beginning-of-line + "C-w" #'backward-kill-word + "C-u" #'backward-kill-sentence + "C-b" #'backward-word + "C-f" #'forward-word + "C-z" (λ! (ignore-errors (call-interactively #'undo)))) + (when (featurep! :feature evil +everywhere) + (define-key! :keymaps maps + [escape] #'abort-recursive-edit + "C-r" #'evil-paste-from-register + "C-j" #'next-line + "C-k" #'previous-line + "C-S-j" #'scroll-up-command + "C-S-k" #'scroll-down-command))) + + +;; +;; Universal motion repeating keys + +(defvar +default-repeat-forward-key ";") +(defvar +default-repeat-backward-key ",") + +(defmacro do-repeat! (command next-func prev-func) + "Makes ; and , the universal repeat-keys in evil-mode. These keys can be +customized by changing `+default-repeat-forward-key' and +`+default-repeat-backward-key'." + (let ((fn-sym (intern (format "+default*repeat-%s" (doom-unquote command))))) + `(progn + (defun ,fn-sym (&rest _) + (define-key! 'motion + +default-repeat-forward-key #',next-func + +default-repeat-backward-key #',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 +(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) + +;; */# +(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) diff --git a/modules/config/default/+evil-commands.el b/modules/config/default/+evil-commands.el deleted file mode 100644 index 88ef9fd6f..000000000 --- a/modules/config/default/+evil-commands.el +++ /dev/null @@ -1,137 +0,0 @@ -;;; config/default/+evil-commands.el -*- lexical-binding: t; -*- -;;;###if (featurep! :feature evil) - -(defalias 'ex! 'evil-ex-define-cmd) - -(evil-define-command doom:cleanup-session (bang) - (interactive "") - (doom/cleanup-session bang)) - -(evil-define-operator doom:open-scratch-buffer (bang) - (interactive "") - (doom/open-scratch-buffer bang)) - -(evil-define-command doom:pwd (bang) - "Display the current working directory. If BANG, copy it to your clipboard." - (interactive "") - (if (not bang) - (pwd) - (kill-new default-directory) - (message "Copied to clipboard"))) - -(evil-define-command doom:make (command &optional from-pwd) - "Run the current project Makefile's COMMAND. If FROM-PWD (bang), run the make -command from the current directory instead of the project root." - (interactive "") - (let ((default-directory (if from-pwd default-directory (doom-project-root t)))) - (compile (or (if command (evil-ex-replace-special-filenames command)) - (eval compile-command))))) - -(evil-define-command doom:reverse-lines (beg end) - "Reverse lines between BEG and END." - (interactive "") - (reverse-region beg end)) - - -;; -;; Commands - -;;; these are defined in feature/evil -;;(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! "ral[ign]" #'+evil:align-right) -(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) -(ex! "rev[erse]" #'doom:reverse-lines) -;; External resources -;; TODO (ex! "db" #'doom:db) -;; TODO (ex! "dbu[se]" #'doom:db-select) -;; TODO (ex! "go[ogle]" #'doom:google-search) -(ex! "lo[okup]" #'+lookup:online) -(ex! "dash" #'+lookup:dash) -(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! "pad" #'doom:open-scratch-buffer) -;; GIT -(ex! "gist" #'+gist:send) ; send current buffer/region to gist -(ex! "gistl" #'+gist:list) ; list gists by user -(ex! "gbrowse" #'+vc:git-browse) ; show file in github/gitlab -(ex! "gissues" #'+vc/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) -(ex! "pwd" #'doom:pwd) -(cond ((featurep! :completion ivy) - (ex! "ag" #'+ivy:ag) - (ex! "agc[wd]" #'+ivy:ag-from-cwd) - (ex! "rg" #'+ivy:rg) - (ex! "rgc[wd]" #'+ivy:rg-from-cwd) - (ex! "pt" #'+ivy:pt) - (ex! "ptc[wd]" #'+ivy:pt-from-cwd) - (ex! "grep" #'+ivy:grep) - (ex! "grepc[wd]" #'+ivy:grep-from-cwd) - (ex! "sw[iper]" #'+ivy:swiper) - (ex! "todo" #'+ivy:todo)) - ((featurep! :completion helm) - (ex! "ag" #'+helm:ag) - (ex! "agc[wd]" #'+helm:ag-from-cwd) - (ex! "rg" #'+helm:rg) - (ex! "rgc[wd]" #'+helm:rg-from-cwd) - (ex! "pt" #'+helm:pt) - (ex! "ptc[wd]" #'+helm:pt-from-cwd) - (ex! "grep" #'+helm:grep) - (ex! "grepc[wd]" #'+helm:grep-from-cwd) - ;; (ex! "todo" #'+helm:todo) TODO implement `+helm:todo' - )) -;; Project tools -(ex! "mak[e]" #'doom:make) -(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) - diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 81d673ab1..966872055 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -73,3 +73,14 @@ If ARG (universal argument), runs `compile' from the current directory." ;;;###autoload (defalias '+default/newline #'newline) + +;;;###autoload +(defun +default/new-buffer () + "TODO" + (interactive) + (if (featurep! 'evil) + (call-interactively #'evil-buffer-new) + (let ((buffer (generate-new-buffer "*new*"))) + (set-window-buffer nil buffer) + (with-current-buffer buffer + (funcall (default-value 'major-mode)))))) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 5ddddc0c9..4d74aa7f8 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -1,11 +1,5 @@ ;;; config/default/config.el -*- lexical-binding: t; -*- -(if (featurep! +bindings) (load! "+bindings")) - - -;; -;; Config - ;; Don't store authinfo in plain text! (setq auth-sources (list (expand-file-name "authinfo.gpg" doom-etc-dir) @@ -86,47 +80,10 @@ (advice-add #'newline-and-indent :around #'doom*newline-indent-and-continue-comments)) -(when (featurep 'evil) - (when (featurep! +evil-commands) - (load! "+evil-commands")) +;; +;; Doom's keybinding scheme - (when (featurep! +bindings) - (defvar +default-repeat-forward-key ";") - (defvar +default-repeat-backward-key ",") - - (eval-when-compile - (defmacro do-repeat! (command next-func prev-func) - "Makes ; and , the universal repeat-keys in evil-mode. These keys can be -customized by changing `+default-repeat-forward-key' and -`+default-repeat-backward-key'." - (let ((fn-sym (intern (format "+evil*repeat-%s" (doom-unquote command))))) - `(progn - (defun ,fn-sym (&rest _) - (define-key! evil-motion-state-map - +default-repeat-forward-key #',next-func - +default-repeat-backward-key #',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 - (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) - - ;; */# - (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))) +(when (featurep! +bindings) + (if (featurep 'evil) + (load! "+evil-bindings") + (load! "+emacs-bindings"))) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 1fb2194b1..7d1691dcd 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -123,33 +123,30 @@ You should use `det-eshell-alias!' to change this.") (defun +eshell|init-keymap () "Setup eshell keybindings. This must be done in a hook because eshell-mode redefines its keys every time `eshell-mode' is enabled." - (when (featurep 'evil) - (evil-define-key* 'normal eshell-mode-map - [return] #'+eshell/goto-end-of-prompt - "c" #'+eshell/evil-change - "C" #'+eshell/evil-change-line - "d" #'+eshell/evil-delete - "D" #'+eshell/evil-delete-line) - (evil-define-key* 'insert eshell-mode-map - [tab] #'+eshell/pcomplete - "\C-j" #'evil-window-down - "\C-k" #'evil-window-up - "\C-h" #'evil-window-left - "\C-l" #'evil-window-right - "\C-d" #'+eshell/quit-or-delete-char - "\C-p" #'eshell-previous-input - "\C-n" #'eshell-next-input)) - (define-key! eshell-mode-map - (kbd "C-s") #'+eshell/search-history - (kbd "C-c s") #'+eshell/split-below - (kbd "C-c v") #'+eshell/split-right - (kbd "C-c x") #'+eshell/kill-and-close - [remap split-window-below] #'+eshell/split-below - [remap split-window-right] #'+eshell/split-right - [remap doom/backward-to-bol-or-indent] #'eshell-bol - [remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input - [remap evil-window-split] #'+eshell/split-below - [remap evil-window-vsplit] #'+eshell/split-right)) + (map! :map eshell-mode-map + :n [return] #'+eshell/goto-end-of-prompt + :n "c" #'+eshell/evil-change + :n "C" #'+eshell/evil-change-line + :n "d" #'+eshell/evil-delete + :n "D" #'+eshell/evil-delete-line + :i [tab] #'+eshell/pcomplete + :i "C-j" #'evil-window-down + :i "C-k" #'evil-window-up + :i "C-h" #'evil-window-left + :i "C-l" #'evil-window-right + :i "C-d" #'+eshell/quit-or-delete-char + :i "C-p" #'eshell-previous-input + :i "C-n" #'eshell-next-input + "C-s" #'+eshell/search-history + "C-c s" #'+eshell/split-below + "C-c v" #'+eshell/split-right + "C-c x" #'+eshell/kill-and-close + [remap split-window-below] #'+eshell/split-below + [remap split-window-right] #'+eshell/split-right + [remap doom/backward-to-bol-or-indent] #'eshell-bol + [remap doom/backward-kill-to-bol-and-indent] #'eshell-kill-input + [remap evil-window-split] #'+eshell/split-below + [remap evil-window-vsplit] #'+eshell/split-right)) (add-hook 'eshell-first-time-mode-hook #'+eshell|init-keymap)) diff --git a/modules/feature/eval/autoload/eval.el b/modules/feature/eval/autoload/eval.el index 75006b142..2a1738cd9 100644 --- a/modules/feature/eval/autoload/eval.el +++ b/modules/feature/eval/autoload/eval.el @@ -17,6 +17,15 @@ (funcall runner beg end) (quickrun-region beg end)))) +;;;###autoload +(defun +eval/buffer-or-region () + "Evaluate the whole buffer." + (interactive) + (call-interactively + (if (use-region-p) + #'+eval/region + #'+eval/buffer))) + ;;;###autoload (defun +eval/region-and-replace (beg end) "Evaluation a region between BEG and END, and replace it with the result." diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index fd56b336d..3af427662 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -39,6 +39,8 @@ line with a linewise comment.") evil-want-keybinding (not (featurep! +everywhere))) :config + (load! "+commands") + (add-hook 'doom-post-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 6d16fb904..5c02080df 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -62,7 +62,11 @@ (add-hook! 'emacs-lisp-mode-hook #'(rainbow-delimiters-mode highlight-quoted-mode)) ;; Recenter window after following definition - (advice-add #'elisp-def :after #'doom*recenter)) + (advice-add #'elisp-def :after #'doom*recenter) + + (map! :localleader + :map emacs-lisp-mode-map + "e" #'macrostep-expand)) ;; diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 83460ca8f..75136a077 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -24,7 +24,7 @@ :localleader :n ";" 'reftex-toc) (add-hook! 'reftex-toc-mode-hook (reftex-toc-rescan) - (map! :local + (map! :map 'local :e "j" #'next-line :e "k" #'previous-line :e "q" #'kill-buffer-and-window diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index e71ec63e6..ef0a43f9e 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -23,35 +23,31 @@ (add-hook 'markdown-mode-hook #'+markdown|set-fill-column-and-line-spacing) (add-hook 'markdown-mode-hook #'auto-fill-mode) - (define-key! markdown-mode-map - [remap find-file-at-point] #'markdown-follow-thing-at-point - (kbd "M-*") #'markdown-insert-list-item - (kbd "M-b") #'markdown-insert-bold - (kbd "M-i") #'markdown-insert-italic - (kbd "M-`") #'+markdown/insert-del) - (when (featurep! :feature evil +everywhere) - (evil-define-key* 'motion markdown-mode-map - "gj" #'markdown-next-visible-heading - "gk" #'markdown-previous-visible-heading - ;; TODO: Make context sensitive - "]h" #'markdown-next-visible-heading - "[h" #'markdown-previous-visible-heading - "[p" #'markdown-promote - "]p" #'markdown-demote - "[l" #'markdown-previous-link - "]l" #'markdown-next-link) - (evil-define-key* 'insert markdown-mode-map - (kbd "M--") #'markdown-insert-hr) - (evil-define-key* 'normal markdown-mode-map - (kbd "M-r") #'browse-url-of-file)) (map! :map markdown-mode-map - :localleader - :nv "o" #'markdown-open - :nv "b" #'markdown-preview - (:prefix "i" - :nv "t" #'markdown-toc-generate-toc - :nv "i" #'markdown-insert-image - :nv "l" #'markdown-insert-link))) + [remap find-file-at-point] #'markdown-follow-thing-at-point + "M-*" #'markdown-insert-list-item + "M-b" #'markdown-insert-bold + "M-i" #'markdown-insert-italic + "M-`" #'+markdown/insert-del + (:when (featurep! :feature evil +everywhere) + :m "gj" #'markdown-next-visible-heading + :m "gk" #'markdown-previous-visible-heading + ;; TODO: Make context sensitive + :m "]h" #'markdown-next-visible-heading + :m "[h" #'markdown-previous-visible-heading + :m "[p" #'markdown-promote + :m "]p" #'markdown-demote + :m "[l" #'markdown-previous-link + :m "]l" #'markdown-next-link + :i "M--" #'markdown-insert-hr + :n "M-r" #'browse-url-of-file) + (:localleader + "o" #'markdown-open + "b" #'markdown-preview + (:prefix "i" + "t" #'markdown-toc-generate-toc + "i" #'markdown-insert-image + "l" #'markdown-insert-link)))) (def-package! pandoc-mode :when (featurep! +pandoc) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index a9ad7b7e7..014840039 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -15,7 +15,7 @@ (apply orig-fn args))) (advice-add #'restclient-http-do :around #'+rest*permit-self-signed-ssl) - (map! :mode restclient-mode + (map! :map restclient-mode-map :n [return] #'+rest/dwim-at-point :n "za" #'restclient-toggle-body-visibility :n "zm" #'+rest/fold-all diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index e9b2f0412..ab3f6d409 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -37,6 +37,7 @@ (string-match-p "^\\*ein: .*" (buffer-name buf))) (add-to-list 'doom-real-buffer-functions #'+ein-buffer-p nil #'eq) - ;; Ace-link on notebook list buffers - (after! ein-notebooklist - (define-key ein:notebooklist-mode-map "o" #'+ein/ace-link-ein))) + (map! :map ein:notebook-mode-map + "M-s" #'ein:notebook-save-notebook-command + :map ein:notebooklist-mode-map + "o" #'+ein/ace-link-ein)) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 25e992688..928680797 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -45,12 +45,7 @@ what features are available.") #'hide-mode-line-mode) ;; properly kill leftover magit buffers on quit - (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) - - ;; Don't replace the leader key - ;; FIXME remove me when general.el is integrated - (when doom-leader-key - (define-key magit-diff-mode-map (kbd doom-leader-key) nil))) + (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) (def-package! magit-todos @@ -94,11 +89,7 @@ what features are available.") (setq evil-magit-state 'normal evil-magit-use-z-for-folds t) :config - (define-key! magit-mode-map ; replaced by z1, z2, z3, etc - (kbd "M-1") nil - (kbd "M-2") nil - (kbd "M-3") nil - (kbd "M-4") nil) + (unmap! magit-mode-map "M-1" "M-2" "M-3" "M-4") ; replaced by z1, z2, z3, etc (evil-define-key* '(normal visual) magit-mode-map "zz" #'evil-scroll-line-to-center "%" #'magit-gitflow-popup) @@ -108,6 +99,4 @@ what features are available.") (cdr key))) (evil-define-key* evil-magit-state git-rebase-mode-map "gj" #'git-rebase-move-line-down - "gk" #'git-rebase-move-line-up)) - (define-key! (magit-mode-map magit-blame-read-only-mode-map) - (kbd doom-leader-key) nil)) + "gk" #'git-rebase-move-line-up))) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a53f0704e..d108a111c 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -138,39 +138,38 @@ PLIST can have the following properties: [remap backward-button] #'+doom-dashboard/backward-button "n" #'forward-button "p" #'backward-button - "\C-n" #'forward-button - "\C-p" #'backward-button + "C-n" #'forward-button + "C-p" #'backward-button [down] #'forward-button [up] #'backward-button [tab] #'forward-button [backtab] #'backward-button) -(when (featurep 'evil) - (evil-define-key* 'normal +doom-dashboard-mode-map - "j" #'forward-button - "k" #'backward-button - "n" #'forward-button - "p" #'backward-button - "\C-n" #'forward-button - "\C-p" #'backward-button - [down] #'forward-button - [up] #'backward-button - [tab] #'forward-button - [backtab] #'backward-button) - (define-key! +doom-dashboard-mode-map - [left-margin mouse-1] #'ignore - [remap evil-next-visual-line] #'forward-button - [remap evil-previous-visual-line] #'backward-button - [remap evil-delete] #'ignore - [remap evil-delete-line] #'ignore - [remap evil-insert] #'ignore - [remap evil-append] #'ignore - [remap evil-replace] #'ignore - [remap evil-replace-state] #'ignore - [remap evil-change] #'ignore - [remap evil-change-line] #'ignore - [remap evil-visual-char] #'ignore - [remap evil-visual-line] #'ignore)) +(map! :when (featurep 'evil) + :map +doom-dashboard-mode-map + :n "j" #'forward-button + :n "k" #'backward-button + :n "n" #'forward-button + :n "p" #'backward-button + :n "C-n" #'forward-button + :n "C-p" #'backward-button + :n [down] #'forward-button + :n [up] #'backward-button + :n [tab] #'forward-button + :n [backtab] #'backward-button + [left-margin mouse-1] #'ignore + [remap evil-next-visual-line] #'forward-button + [remap evil-previous-visual-line] #'backward-button + [remap evil-delete] #'ignore + [remap evil-delete-line] #'ignore + [remap evil-insert] #'ignore + [remap evil-append] #'ignore + [remap evil-replace] #'ignore + [remap evil-replace-state] #'ignore + [remap evil-change] #'ignore + [remap evil-change-line] #'ignore + [remap evil-visual-char] #'ignore + [remap evil-visual-line] #'ignore) ;; From 674ad9837d9d334153aa2580a455eca1d4190291 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 03:55:32 -0500 Subject: [PATCH 3476/4235] Update after! docstring --- core/core-lib.el | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 88f89a3da..86bf7cf60 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -163,8 +163,32 @@ serve as a predicated alternative to `after!'." (advice-remove #',mode #',advice-fn)))))) (defmacro after! (targets &rest body) - "A smart wrapper around `with-eval-after-load'. Supresses warnings during -compilation. This will no-op on features that have been disabled by the user." + "A smart wrapper around `with-eval-after-load' that: + +1. Suppresses warnings at compile-time +2. No-ops for TARGETS that are disabled by the user (via `package!') +3. Supports compound TARGETS statements (see below) + +BODY is evaluated once TARGETS are loaded. TARGETS can either be: + +- An unquoted package symbol (the name of a package) + + (after! helm ...) + +- An unquoted list of package symbols + + (after! (magit git-gutter) ...) + +- An unquoted, nested list of compound package lists, using :or/:any and/or :and/:all + + (after! (:or package-a package-b ...) ...) + (after! (:and package-a package-b ...) ...) + (after! (:and package-a (:or package-b package-c) ...) ...) + + Note that: + - :or and :any are equivalent + - :and and :all are equivalent + - If these are omitted, :and is assumed." (declare (indent defun) (debug t)) (unless (and (symbolp targets) (memq targets (bound-and-true-p doom-disabled-packages))) From 3dd34abe61e62d14955211e449e6be789f241f3f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 03:56:05 -0500 Subject: [PATCH 3477/4235] Remove hide-undefined-binds advice for which-key Before general.el was introduced to Doom, commands were bound to keys whether or not their containing modules were enabled. This was out of laziness and readability. I intend to change this, as such it is no longer necessary to hide unavailable keybinds from which-key. --- core/core-ui.el | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 37f0c65d5..5f2ac22d4 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -154,14 +154,6 @@ size.") ;; take Emacs 26 line numbers into account (+ (if EMACS26+ 6 0) fill-column)) -(defun doom*hide-undefined-which-key-binds (bindings) - (cl-loop for bind in bindings - if (or (member (cdr bind) '("Prefix Command" "??")) - (fboundp (intern (cdr bind)))) - collect bind)) -(advice-add #'which-key--get-current-bindings :filter-return #'doom*hide-undefined-which-key-binds) -(advice-add #'which-key--get-keymap-bindings :filter-return #'doom*hide-undefined-which-key-binds) - ;; ;; Built-in packages From d6cb0ec5f528800ad50d5476038ae3552554d91c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 04:01:17 -0500 Subject: [PATCH 3478/4235] General cleanup & minor refactoring --- core/core-os.el | 3 ++- modules/emacs/dired/config.el | 2 +- modules/lang/elixir/config.el | 4 +++- modules/lang/haskell/autoload.el | 1 - modules/lang/latex/config.el | 2 +- modules/lang/org/+babel.el | 4 ++-- modules/lang/sh/config.el | 2 +- modules/tools/ein/config.el | 4 ++-- 8 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index ada518047..b0f254903 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -35,7 +35,8 @@ ;; Curse Lion and its sudden but inevitable fullscreen mode! ;; NOTE Meaningless to railwaycat's emacs-mac build ns-use-native-fullscreen nil - ;; Don't open files from the workspace in a new frame + ;; Visit files opened outside of Emacs in existing frame, rather + ;; than a new one ns-pop-up-frames nil) ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 8933dd30f..2d568e71d 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -47,7 +47,7 @@ (when (and (not (file-exists-p parent-directory)) (y-or-n-p (format "Directory `%s' does not exist! Create it?" parent-directory))) (make-directory parent-directory t)))) - (push #'+dired|create-non-existent-directory find-file-not-found-functions) + (add-to-list 'find-file-not-found-functions '+dired|create-non-existent-directory nil #'eq) ;; Kill buffer when quitting dired buffers (define-key dired-mode-map [remap quit-window] (λ! (quit-window t)))) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 6792e97cc..f57442ad0 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -3,7 +3,8 @@ (def-package! elixir-mode :defer t :init - ;; disable default smartparens config + ;; Disable default smartparens config; there are too many, they're intrusive + ;; and we only want a subset of them (defined below). (provide 'smartparens-elixir) :config ;; ...and only complete the basics @@ -15,6 +16,7 @@ :post-handlers '("||\n[i]")) (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) + (set-pretty-symbols! 'elixir-mode ;; Functional :def "def" diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el index 9b66e1ae5..f286d0eaa 100644 --- a/modules/lang/haskell/autoload.el +++ b/modules/lang/haskell/autoload.el @@ -12,4 +12,3 @@ "Opens a Haskell REPL." (interactive "P") (display-buffer (+haskell-repl-buffer arg))) - diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index d7eec47bd..f405b20db 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -77,7 +77,7 @@ If no viewers are found, `latex-preview-pane' is used.") "\\Bigl\\{" "\\Biggl\\{" "\\lfloor" "\\lceil" "\\langle" "\\lVert" "\\lvert" "`")) - (sp-local-pair modes open nil :actions nil)) + (sp-local-pair modes open nil :actions :rem)) (sp-local-pair modes "``" nil :unless '(:add sp-in-math-p))))) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index e7d490220..fb4bdb118 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -44,7 +44,7 @@ the first function to return non-nil.") t)) (advice-add #'org-babel-confirm-evaluate :after-while #'+org*babel-lazy-load-library) - ;; I prefer C-c C-c over C-c ' + ;; I prefer C-c C-c over C-c ' (more consistent) (define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) ;; `org-babel-get-header' was removed from org in 9.0. Quite a few babel @@ -69,7 +69,7 @@ the first function to return non-nil.") (setq ob-ipython-resources-dir ".ob-ipython-resrc") (defun +org|babel-load-ipython (lang) - (and (string-match-p "^jupyter-" (symbol-name lang)) + (and (string-prefix-p "jupyter-" (symbol-name lang)) (require 'ob-ipython nil t))) (add-hook '+org-babel-load-functions #'+org|babel-load-ipython) :config diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index b61562948..f6ae743b7 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -45,7 +45,7 @@ (add-hook 'sh-mode-hook #'rainbow-delimiters-mode) ;; autoclose backticks - (sp-local-pair 'sh-mode "`" nil :unless '(sp-point-before-word-p sp-point-before-same-p)) + (sp-local-pair 'sh-mode "`" "`" :unless '(sp-point-before-word-p sp-point-before-same-p)) ;; sh-mode has file extensions checks for other shells, but not zsh, so... (defun +sh|detect-zsh () diff --git a/modules/tools/ein/config.el b/modules/tools/ein/config.el index ab3f6d409..c986cfd71 100644 --- a/modules/tools/ein/config.el +++ b/modules/tools/ein/config.el @@ -24,8 +24,8 @@ ;; Code completion with company (setq ein:completion-backend 'ein:use-company-backend) (set-company-backend! '(ein:notebook-multilang-mode - ein:notebook-python-mode - ein:notebook-plain-mode) + ein:notebook-python-mode + ein:notebook-plain-mode) 'ein:company-backend)) (after! ein-jupyter From 5331a28533d1050f4fbc669dce7082f5313b2ee4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 04:01:30 -0500 Subject: [PATCH 3479/4235] set-pretty-symbols!: fix void-variable mode error Occurs when unsetting pretty symbols for a mode with (set-pretty-symbols! 'some-mode nil), because of a forgotten loop and let-var. --- modules/ui/pretty-code/autoload.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/pretty-code/autoload.el b/modules/ui/pretty-code/autoload.el index 59ab8bf5c..4ad18fe69 100644 --- a/modules/ui/pretty-code/autoload.el +++ b/modules/ui/pretty-code/autoload.el @@ -89,8 +89,9 @@ Pretty symbols can be unset for emacs-lisp-mode with: (set-pretty-symbols! 'emacs-lisp-mode nil)" (declare (indent defun)) (if (null (car-safe plist)) - (delq (assq mode +pretty-code-symbols-alist) - +pretty-code-symbols-alist) + (dolist (mode (doom-enlist modes)) + (delq (assq mode +pretty-code-symbols-alist) + +pretty-code-symbols-alist)) (let (results merge key) (while plist (pcase (setq key (pop plist)) From 65290d3d2f0cd6d45a6d77c92475648ca0d5dbe4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 04:36:51 -0500 Subject: [PATCH 3480/4235] app/irc: re-nest keybinds And restore missing circe-command-NAMES keybind. --- modules/app/irc/config.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 3aec7eb78..f72bb8abb 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -122,15 +122,17 @@ playback.") (add-hook 'circe-chat-mode-hook #'solaire-mode)) (map! :localleader - :map circe-mode-map - "a" #'tracking-next-buffer - "j" #'circe-command-JOIN - "m" #'+irc/send-message - "p" #'circe-command-PART - "Q" #'+irc/quit - "R" #'circe-reconnect - :when (featurep! :completion ivy) - "c" #'+irc/ivy-jump-to-channel)) + (:map circe-mode-map + "a" #'tracking-next-buffer + "j" #'circe-command-JOIN + "m" #'+irc/send-message + "p" #'circe-command-PART + "Q" #'+irc/quit + "R" #'circe-reconnect + (:when (featurep! :completion ivy) + "c" #'+irc/ivy-jump-to-channel)) + (:map circe-channel-mode-map + "n" #'circe-command-NAMES))) (def-package! circe-color-nicks From 64e633df0d7dc80cf722ae07eb95cf2912585ec6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 04:43:48 -0500 Subject: [PATCH 3481/4235] Add feature/evil/+commands.el --- modules/feature/evil/+commands.el | 162 ++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 modules/feature/evil/+commands.el diff --git a/modules/feature/evil/+commands.el b/modules/feature/evil/+commands.el new file mode 100644 index 000000000..2c29ace0a --- /dev/null +++ b/modules/feature/evil/+commands.el @@ -0,0 +1,162 @@ +;;; feature/evil/+commands.el -*- lexical-binding: t; -*- + +(evil-define-command +evil:cleanup-session (bang) + (interactive "") + (doom/cleanup-session bang)) + +(evil-define-operator +evil:open-scratch-buffer (bang) + (interactive "") + (doom/open-scratch-buffer bang)) + +(evil-define-command +evil:pwd (bang) + "Display the current working directory. If BANG, copy it to your clipboard." + (interactive "") + (if (not bang) + (pwd) + (kill-new default-directory) + (message "Copied to clipboard"))) + +(evil-define-command +evil:make (arguments &optional bang) + "Run make with ARGUMENTS. +If BANG is non-nil, open compilation output in a comint buffer. + +If BANG, then run ARGUMENTS as a full command. This command understands vim file +modifiers (like %:p:h). See `+evil*resolve-vim-path' for details." + (interactive "") + (+evil:compile (format "make %s" + (evil-ex-replace-special-filenames + arguments)) + bang)) + +(evil-define-command +evil:compile (arguments &optional bang) + "Run `compile-command' with ARGUMENTS. +If BANG is non-nil, open compilation output in a comint buffer. + +This command understands vim file modifiers (like %:p:h). See +`+evil*resolve-vim-path' for details." + (interactive "") + (compile (evil-ex-replace-special-filenames + (format "%s %s" + (eval compile-command) + arguments)) + bang)) + +(evil-define-command +evil:reverse-lines (beg end) + "Reverse lines between BEG and END." + (interactive "") + (reverse-region beg end)) + + +;; +;; Commands + +;;; these are defined in feature/evil +;;(evil-ex-define-cmd "al[ign]" #'+evil:align) +;;(evil-ex-define-cmd "g[lobal]" #'+evil:global) + +;;; Custom commands +;; Editing +(evil-ex-define-cmd "@" #'+evil:macro-on-all-lines) ; TODO Test me +(evil-ex-define-cmd "al[ign]" #'+evil:align) +(evil-ex-define-cmd "ral[ign]" #'+evil:align-right) +(evil-ex-define-cmd "enhtml" #'+web:encode-html-entities) +(evil-ex-define-cmd "dehtml" #'+web:decode-html-entities) +(evil-ex-define-cmd "mc" #'+evil:mc) +(evil-ex-define-cmd "iedit" #'evil-multiedit-ex-match) +(evil-ex-define-cmd "na[rrow]" #'+evil:narrow-buffer) +(evil-ex-define-cmd "retab" #'+evil:retab) +(evil-ex-define-cmd "rev[erse]" #'+evil:reverse-lines) + +;;; External resources +;; TODO (evil-ex-define-cmd "db" #'doom:db) +;; TODO (evil-ex-define-cmd "dbu[se]" #'doom:db-select) +;; TODO (evil-ex-define-cmd "go[ogle]" #'doom:google-search) +(evil-ex-define-cmd "lo[okup]" #'+lookup:online) +(evil-ex-define-cmd "dash" #'+lookup:dash) +(evil-ex-define-cmd "http" #'httpd-start) ; start http server +(evil-ex-define-cmd "repl" #'+eval:repl) ; invoke or send to repl + +;; TODO (evil-ex-define-cmd "rx" 'doom:regex) ; open re-builder +(evil-ex-define-cmd "sh[ell]" #'+eshell:run) +(evil-ex-define-cmd "t[mux]" #'+tmux:run) ; send to tmux +(evil-ex-define-cmd "tcd" #'+tmux:cd-here) ; cd to default-directory in tmux +(evil-ex-define-cmd "pad" #'+evil:open-scratch-buffer) + +;;; GIT +(evil-ex-define-cmd "gist" #'+gist:send) ; send current buffer/region to gist +(evil-ex-define-cmd "gistl" #'+gist:list) ; list gists by user +(evil-ex-define-cmd "gbrowse" #'+vc:git-browse) ; show file in github/gitlab +(evil-ex-define-cmd "gissues" #'+vc/git-browse-issues) ; show github issues +(evil-ex-define-cmd "git" #'magit-status) ; open magit status window +(evil-ex-define-cmd "gstage" #'magit-stage) +(evil-ex-define-cmd "gunstage" #'magit-unstage) +(evil-ex-define-cmd "gblame" #'magit-blame) +(evil-ex-define-cmd "grevert" #'git-gutter:revert-hunk) + +;;; Dealing with buffers +(evil-ex-define-cmd "clean[up]" #'+evil:cleanup-session) +(evil-ex-define-cmd "k[ill]" #'doom/kill-this-buffer) +(evil-ex-define-cmd "k[ill]all" #'+default:kill-all-buffers) +(evil-ex-define-cmd "k[ill]m" #'+default:kill-matching-buffers) +(evil-ex-define-cmd "k[ill]o" #'doom/kill-other-buffers) +(evil-ex-define-cmd "l[ast]" #'doom/popup-restore) +(evil-ex-define-cmd "m[sg]" #'view-echo-area-messages) +(evil-ex-define-cmd "pop[up]" #'doom/popup-this-buffer) + +;;; Project navigation +(evil-ex-define-cmd "a" #'projectile-find-other-file) +(evil-ex-define-cmd "cd" #'+default:cd) +(evil-ex-define-cmd "pwd" #'+evil:pwd) + +(cond ((featurep! :completion ivy) + (evil-ex-define-cmd "ag" #'+ivy:ag) + (evil-ex-define-cmd "agc[wd]" #'+ivy:ag-from-cwd) + (evil-ex-define-cmd "rg" #'+ivy:rg) + (evil-ex-define-cmd "rgc[wd]" #'+ivy:rg-from-cwd) + (evil-ex-define-cmd "pt" #'+ivy:pt) + (evil-ex-define-cmd "ptc[wd]" #'+ivy:pt-from-cwd) + (evil-ex-define-cmd "grep" #'+ivy:grep) + (evil-ex-define-cmd "grepc[wd]" #'+ivy:grep-from-cwd) + (evil-ex-define-cmd "sw[iper]" #'+ivy:swiper) + (evil-ex-define-cmd "todo" #'+ivy:todo)) + + ((featurep! :completion helm) + (evil-ex-define-cmd "ag" #'+helm:ag) + (evil-ex-define-cmd "agc[wd]" #'+helm:ag-from-cwd) + (evil-ex-define-cmd "rg" #'+helm:rg) + (evil-ex-define-cmd "rgc[wd]" #'+helm:rg-from-cwd) + (evil-ex-define-cmd "pt" #'+helm:pt) + (evil-ex-define-cmd "ptc[wd]" #'+helm:pt-from-cwd) + (evil-ex-define-cmd "grep" #'+helm:grep) + (evil-ex-define-cmd "grepc[wd]" #'+helm:grep-from-cwd) + ;; (evil-ex-define-cmd "todo" #'+helm:todo) TODO implement `+helm:todo' + )) + +;;; Project tools +(evil-ex-define-cmd "compile" #'+evil:compile) +(evil-ex-define-cmd "mak[e]" #'+evil:make) +(evil-ex-define-cmd "debug" #'+debug/run) +(evil-ex-define-cmd "er[rors]" #'flycheck-list-errors) + +;;; File operations +(evil-ex-define-cmd "cp" #'+evil:copy-this-file) +(evil-ex-define-cmd "mv" #'+evil:move-this-file) +(evil-ex-define-cmd "rm" #'+evil:delete-this-file) + +;;; Sessions/tabs +(evil-ex-define-cmd "sclear" #'+workspace/kill-session) +(evil-ex-define-cmd "sl[oad]" #'+workspace:load-session) +(evil-ex-define-cmd "ss[ave]" #'+workspace:save-session) +(evil-ex-define-cmd "tabc[lose]" #'+workspace:delete) +(evil-ex-define-cmd "tabclear" #'doom/kill-all-buffers) +(evil-ex-define-cmd "tabl[ast]" #'+workspace/switch-to-last) +(evil-ex-define-cmd "tabload" #'+workspace:load) +(evil-ex-define-cmd "tabn[ew]" #'+workspace:new) +(evil-ex-define-cmd "tabn[ext]" #'+workspace:switch-next) +(evil-ex-define-cmd "tabp[rev]" #'+workspace:switch-previous) +(evil-ex-define-cmd "tabr[ename]" #'+workspace:rename) +(evil-ex-define-cmd "tabs" #'+workspace/display) +(evil-ex-define-cmd "tabsave" #'+workspace:save) + +;;; Org-mode +(evil-ex-define-cmd "cap" #'org-capture) From 5e33fefd74bf69dac65d0fadc67f8a977fcebcac Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 05:20:02 -0500 Subject: [PATCH 3482/4235] Fix malformed map! yasnippet keybinds Causing breaking errors. --- modules/config/default/+evil-bindings.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 41a1bfff2..ac52165c5 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -207,8 +207,9 @@ "" #'+snippets/delete-to-start-of-field [backspace] #'+snippets/delete-backward-char [delete] #'+snippets/delete-forward-char-or-field) - :ie yas-minor-mode-map [tab] yas-maybe-expand - :v yas-minor-mode-map [tab] #'yas-insert-snippet)) + (:map yas-minor-mode-map + :ie [tab] yas-maybe-expand + :v [tab] #'yas-insert-snippet))) (:when (featurep! :feature spellcheck) :m "]S" #'flyspell-correct-word-generic From 4d3587c8d081fbca6028398c5f679fd314b95bf4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 05:20:43 -0500 Subject: [PATCH 3483/4235] Fix void-variable list error in multi-state binds Caused by overzealous re-setting of a variable in a loop, when it should only be set once. --- core/core-keybinds.el | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 1e4e05db9..0a2ea8650 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -238,14 +238,17 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (when (or (memq 'global states) (null states)) (setq states (delq 'global states)) (push 'nil states)) - (dolist (state states) + (if (and (listp def) + (memq (car-safe (doom-unquote def)) '(:def :ignore :keymap))) + (setq def `(quote ,(plist-put (general--normalize-extended-def (doom-unquote def)) + :which-key desc))) (when desc - (setq def - (if (and (equal key "") - (null def)) - `(quote (nil :which-key ,desc)) - `(list ,@(plist-put (general--normalize-extended-def def) - :which-key desc))))) + (setq def `(list ,@(cond ((and (equal key "") + (null def)) + `(nil :which-key ,desc)) + ((plist-put (general--normalize-extended-def def) + :which-key desc))))))) + (dolist (state states) (push key (alist-get state doom--map-batch-forms)) (push def (alist-get state doom--map-batch-forms)))) From 43fa39eaf1aee913257315e8fc6b24afa2b7a8a3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 05:29:57 -0500 Subject: [PATCH 3484/4235] config/default: restore q, p, r, s, t leader groups --- modules/config/default/+evil-bindings.el | 87 ++++++++++++------------ 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ac52165c5..752b611c6 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -712,54 +712,53 @@ (:when (featurep! :tools docker) :desc "Docker" "D" #'docker)) - ;; (:prefix ("p" . "project") - ;; "." '(+default/browse-project :wk "Browse project") - ;; "/" '(projectile-find-file :wk "Find file in project") - ;; "!" '(projectile-run-shell-command-in-root :wk "Run cmd in project root") - ;; "c" '(projectile-compile-project :wk "Compile project") - ;; "o" '(projectile-find-other-file :wk "Find other file") - ;; "p" '(projectile-switch-project :wk "Switch project") - ;; "r" '(projectile-recentf :wk "Recent project files") - ;; "t" '(+ivy/tasks :wk "List project tasks") - ;; "x" '(projectile-invalidate-cache :wk "Invalidate cache")) + (:prefix ("p" . "project") + :desc "Browse project" "." #'+default/browse-project + :desc "Find file in project" "/" #'projectile-find-file + :desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root + :desc "Compile project" "c" #'projectile-compile-project + :desc "Find other file" "o" #'projectile-find-other-file + :desc "Switch project" "p" #'projectile-switch-project + :desc "Recent project files" "r" #'projectile-recentf + :desc "List project tasks" "t" #'+ivy/tasks + :desc "Invalidate cache" "x" #'projectile-invalidate-cache) - ;; (:prefix ("q" . "quit/restart") - ;; "q" '(evil-quit-all :wk "Quit Emacs") - ;; "Q" '(evil-save-and-quit :wk "Save and quit Emacs") - ;; "X" '(+workspace/kill-session-and-quit :wk "Quit Emacs & forget session") - ;; "r" '(+workspace/restart-emacs-then-restore :wk "Restart & restore Emacs") - ;; "R" '(restart-emacs :wk "Restart Emacs")) + (:prefix ("q" . "quit/restart") + :desc "Quit Emacs" "q" #'evil-quit-all + :desc "Save and quit Emacs" "Q" #'evil-save-and-quit + :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit + :desc "Restart & restore Emacs" "r" #'+workspace/restart-emacs-then-restore + :desc "Restart Emacs" "R" #'restart-emacs) - ;; (:when (featurep! :tools upload) - ;; (:prefix ("r" . "remote") - ;; "u" '(ssh-deploy-upload-handler :wk "Upload local") - ;; "U" '(ssh-deploy-upload-handler-forced :wk "Upload local (force)") - ;; "d" '(ssh-deploy-download-handler :wk "Download remote") - ;; "D" '(ssh-deploy-diff-handler :wk "Diff local & remote") - ;; "." '(ssh-deploy-browse-remote-handler :wk "Browse remote files") - ;; ">" '(ssh-deploy-remote-changes-handler :wk "Detect remote changes"))) + (:when (featurep! :tools upload) + (:prefix ("r" . "remote") + :desc "Upload local" "u" #'ssh-deploy-upload-handler + :desc "Upload local (force)" "U" #'ssh-deploy-upload-handler-forced + :desc "Download remote" "d" #'ssh-deploy-download-handler + :desc "Diff local & remote" "D" #'ssh-deploy-diff-handler + :desc "Browse remote files" "." #'ssh-deploy-browse-remote-handler + :desc "Detect remote changes" ">" #'ssh-deploy-remote-changes-handler)) - ;; (:when (featurep! :feature snippets) - ;; (:prefix ("s" . "snippets") - ;; "n" '(yas-new-snippet :wk "New snippet") - ;; "i" '(yas-insert-snippet :wk "Insert snippet") - ;; "/" '(yas-visit-snippet-file :wk "Jump to mode snippet") - ;; "s" '(+snippets/find-file :wk "Jump to snippet") - ;; "S" '(+snippets/browse :wk "Browse snippets") - ;; "r" '(yas-reload-all :wk "Reload snippets"))) + (:when (featurep! :feature snippets) + (:prefix ("s" . "snippets") + :desc "New snippet" "n" #'yas-new-snippet + :desc "Insert snippet" "i" #'yas-insert-snippet + :desc "Jump to mode snippet" "/" #'yas-visit-snippet-file + :desc "Jump to snippet" "s" #'+snippets/find-file + :desc "Browse snippets" "S" #'+snippets/browse + :desc "Reload snippets" "r" #'yas-reload-all)) - ;; (:prefix ("t" . "toggle") - ;; "s" '(flyspell-mode :wk "Flyspell") - ;; "f" '(flycheck-mode :wk "Flycheck") - ;; "l" '(doom/toggle-line-numbers :wk "Line numbers") - ;; "F" '(toggle-frame-fullscreen :wk "Frame fullscreen") - ;; "i" '(highlight-indentation-mode :wk "Indent guides") - ;; "I" '(highlight-indentation-current-column-mode :wk "Indent guides (column)") - ;; "h" '(+impatient-mode/toggle :wk "Impatient mode") - ;; "b" '(doom-big-font-mode :wk "Big mode") - ;; "g" '(evil-goggles-mode :wk "Evil goggles") - ;; "p" '(+org-present/start :wk "org-tree-slide mode")) - ) + (:prefix ("t" . "toggle") + :desc "Flyspell" "s" #'flyspell-mode + :desc "Flycheck" "f" #'flycheck-mode + :desc "Line numbers" "l" #'doom/toggle-line-numbers + :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen + :desc "Indent guides" "i" #'highlight-indentation-mode + :desc "Indent guides (column)" "I" #'highlight-indentation-current-column-mode + :desc "Impatient mode" "h" #'+impatient-mode/toggle + :desc "Big mode" "b" #'doom-big-font-mode + :desc "Evil goggles" "g" #'evil-goggles-mode + :desc "org-tree-slide mode" "p" #'+org-present/start)) ;; From 4a69fb5d2988ba983911c5aec73abe836b3086e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 14:23:11 -0500 Subject: [PATCH 3485/4235] Fix non-prefix key error on MacOS kbd is necessary for global-set-key, otherwise it reads M-` as three keys M, - and `, and M is already bound to self-insert-command, so it cannot be used as a prefix. --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 752b611c6..cd8fcc9f6 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -775,7 +775,7 @@ ;; Fix MacOS shift+tab (define-key input-decode-map [S-iso-lefttab] [backtab]) ;; Fix frame-switching on MacOS - (global-set-key "M-`" #'other-frame)) + (global-set-key (kbd "M-`") #'other-frame)) (defun +default|setup-input-decode-map () (define-key input-decode-map (kbd "TAB") [tab])) From a124497f4e3b6b1dba23cb55349047e74b2ceaf2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 14:30:29 -0500 Subject: [PATCH 3486/4235] find-file-visit-truename = t --- core/core.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core.el b/core/core.el index c10ef9a44..43eb9adbd 100644 --- a/core/core.el +++ b/core/core.el @@ -221,6 +221,7 @@ and `doom-exit-window-hook'." autoload-compute-prefixes nil debug-on-error doom-debug-mode ffap-machine-p-known 'reject ; don't ping things that look like domain names + find-file-visit-truename t ; resolve symlinks when opening files idle-update-delay 2 ; update ui less often ;; be quiet at startup; don't load or display anything unnecessary inhibit-startup-message t From fc24c3bff2f61771d64420d2a0c9c7b5fd78d501 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 16:40:46 -0500 Subject: [PATCH 3487/4235] Fix #1056: S key in insert/emacs state A keybind intended for operator mode was bound globally. --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index cd8fcc9f6..692988fd4 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -185,7 +185,7 @@ ;; evil-surround :v "S" #'evil-surround-region :o "s" #'evil-surround-edit - :g "S" #'evil-Surround-edit) + :o "S" #'evil-Surround-edit) (:when (featurep! :feature lookup) :nv "K" #'+lookup/documentation From d222327d240ddf259b1e3478b9f2a80c2c7cf65d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 16:48:42 -0500 Subject: [PATCH 3488/4235] Reformat SPC n keys Used to be in general-define-key format, now in canonical map! format. --- modules/config/default/+evil-bindings.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 692988fd4..165ad808a 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -667,10 +667,10 @@ :desc "Insert snippet" "s" #'yas-insert-snippet) (:prefix ("n" . "notes") - "d" (if (featurep! :ui deft) #'deft) - "n" '(+default/find-in-notes :wk "Find file in notes") - "N" '(+default/browse-notes :wk "Browse notes") - "x" '(org-capture :wk "Org capture")) + :desc "Open deft" "d" #'deft + :desc "Find file in notes" "n" #'+default/find-in-notes + :desc "Browse notes" "N" #'+default/browse-notes + :desc "Org capture" "x" #'org-capture) (:prefix ("o" . "open") :desc "Org agenda" "a" #'org-agenda From 604a41527f599b10be7268c55cc89ea3268fdfcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 16:50:01 -0500 Subject: [PATCH 3489/4235] Use general custom definers rather than :definer The former approach was the cause for a huge increase in startup time (adding ~0.4s) when :leader and :localleader were used. This is because general-define-key was called for every key-def pair. This new approach batches these calls, which has decreased the performance impact by at least 80%. --- core/core-keybinds.el | 50 +++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 0a2ea8650..68d5f789e 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -59,31 +59,24 @@ If any hook returns non-nil, all hooks after it are ignored.") (general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader) (general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader) -(defun general-leader-define-key (_state _keymap key def orig-def _kargs) - (let (general-implicit-kbd) - (general-define-key - :keymaps 'doom-leader-map - :wk-full-keys nil - key orig-def))) +(general-create-definer define-leader-key! + :wk-full-keys nil + :keymaps 'doom-leader-map) ;; -(defun general-localleader-define-key (state keymap key _def orig-def kargs) - (unless keymap - (signal 'wrong-type-argument (list 'keymapp keymap))) - (let (general-implicit-kbd) - (apply #'general-define-key - :major-modes t - :keymaps keymap - (append - ;; :non-normal-prefix isn't respected when evil is absent, so this - ;; is necessary: - (if (featurep 'evil) - (list :states '(normal visual motion) - :prefix doom-localleader-key - :non-normal-prefix doom-localleader-alt-key) - (list :prefix doom-localleader-alt-key)) - (list key orig-def) - nil)))) +(general-create-definer define-localleader-key! + :major-modes t + :keymaps 'local + :prefix doom-localleader-alt-key) + +;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's +;; emacs state), we must redefine `define-localleader-key!' once evil is loaded +(after! evil + (general-create-definer define-localleader-key! + :major-modes t + :keymaps 'local + :prefix doom-localleader-key + :non-normal-prefix doom-localleader-alt-key)) ;; @@ -149,6 +142,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See ;; specials (defvar doom--map-forms nil) +(defvar doom--map-fn 'general-define-key) (defvar doom--map-batch-forms nil) (defvar doom--map-state '(:dummy t)) (defvar doom--map-parent-state nil) @@ -156,7 +150,8 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (after! evil (setq doom--map-evil-p t)) (defun doom--map-process (rest) - (let (doom--map-state + (let ((doom--map-fn doom--map-fn) + doom--map-state doom--map-forms desc) (while rest @@ -167,9 +162,9 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See ((keywordp key) (pcase key (:leader - (doom--map-set :definer '(quote leader))) + (setq doom--map-fn 'define-leader-key!)) (:localleader - (doom--map-set :definer '(quote localleader))) + (setq doom--map-fn 'define-localleader-key!)) (:after (doom--map-nested (list 'after! (pop rest)) rest) (setq rest nil)) @@ -257,7 +252,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (cl-loop with attrs = (doom--map-state) for (state . defs) in doom--map-batch-forms if (or doom--map-evil-p (not state)) - collect `(general-define-key ,@(if state `(:states ',state)) ,@attrs ,@(nreverse defs)) + collect `(,doom--map-fn ,@(if state `(:states ',state)) ,@attrs ,@(nreverse defs)) into forms finally do (push (macroexp-progn forms) doom--map-forms)) (setq doom--map-batch-forms nil))) @@ -266,7 +261,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (let ((plist (append (list :prefix (doom--map-append-keys :prefix) :non-normal-prefix (doom--map-append-keys :non-normal-prefix) - :definer (plist-get doom--map-parent-state :definer) :keymaps (append (plist-get doom--map-parent-state :keymaps) (plist-get doom--map-state :keymaps) From a29163740df95880fa33990206ccb0559cc06517 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 17:00:06 -0500 Subject: [PATCH 3490/4235] GIT_ASKPASS=git-gui--askpass for GUI Emacs+Windows --- core/core-os.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-os.el b/core/core-os.el index b0f254903..2279e2491 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -74,7 +74,9 @@ w32-pass-lwindow-to-system nil w32-lwindow-modifier 'super w32-pass-rwindow-to-system nil - w32-rwindow-modifier 'super))) + w32-rwindow-modifier 'super) + (when (display-graphic-p) + (setenv "GIT_ASKPASS" "git-gui--askpass")))) (provide 'core-os) ;;; core-os.el ends here From 954b0f9c5dbf2aff66938f429fc8e8dd35a4efd8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 17:01:00 -0500 Subject: [PATCH 3491/4235] Minor tweaks to map! calls for correctness + :map arguments shouldn't be quoted + :localleader keys default to all states in the absence of state modifiers. This is preferred, rather than restricting their use to normal state. + :map* is deprecated (there is no difference between it and :map) --- modules/config/default/+evil-bindings.el | 2 +- modules/lang/web/+css.el | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 165ad808a..8cace9da1 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -10,7 +10,7 @@ ;; ;; Global keybindings -(map! (:map 'override +(map! (:map override ;; Make M-x more accessible "s-x" 'execute-extended-command "M-x" 'execute-extended-command diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 04a0ed3fc..fc7d45e75 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -3,9 +3,9 @@ ;; An improved newline+continue comment function (setq-hook! css-mode comment-indent-function #'+css/comment-indent-new-line) -(map! :map* (css-mode-map scss-mode-map less-css-mode-map) +(map! :map (css-mode-map scss-mode-map less-css-mode-map) :localleader - :n "rb" #'+css/toggle-inline-or-block) + "rb" #'+css/toggle-inline-or-block) (after! (:any css-mode sass-mode) (set-docsets! '(css-mode scss-mode sass-mode) @@ -24,12 +24,12 @@ (unless EMACS26+ ;; css-mode's built in completion is superior in 26+ (set-company-backend! '(css-mode scss-mode) 'company-css)) - (map! :map scss-mode-map :localleader :n "b" #'+css/scss-build)) + (map! :map scss-mode-map :localleader "b" #'+css/scss-build)) (after! sass-mode (set-company-backend! 'sass-mode 'company-css) - (map! :map sass-mode-map :localleader :n "b" #'+css/sass-build)) + (map! :map sass-mode-map :localleader "b" #'+css/sass-build)) ;; @@ -40,16 +40,16 @@ :commands counsel-css :hook (css-mode . counsel-css-imenu-setup) :init - (map! :map* (css-mode-map scss-mode-map less-css-mode-map) - :localleader :n ";" #'counsel-css)) + (map! :map (css-mode-map scss-mode-map less-css-mode-map) + :localleader ";" #'counsel-css)) (def-package! helm-css-scss :when (featurep! :completion helm) :defer t :init - (map! :map* (css-mode-map scss-mode-map less-css-mode-map) - :localleader :n ";" #'helm-css-scss) + (map! :map (css-mode-map scss-mode-map less-css-mode-map) + :localleader ";" #'helm-css-scss) :config (setq helm-css-scss-split-direction #'split-window-vertically helm-css-scss-split-with-multiple-windows t)) From 4383531b323bb9e4bea7f73bdc6f39288930cc42 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 17:11:20 -0500 Subject: [PATCH 3492/4235] Ensure gerneral-implicit-kbd=t in map! Also updates map! tests (TODO: abstract all those cdr-caddr's!) --- core/core-keybinds.el | 3 +- core/test/test-core-keybinds.el | 131 ++++++++++++++++---------------- 2 files changed, 67 insertions(+), 67 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 68d5f789e..b53c21d94 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -324,7 +324,8 @@ Example (:when IS-MAC :n \"M-s\" 'some-fn :i \"M-o\" (lambda (interactive) (message \"Hi\"))))" - (doom--map-process rest)) + `(let ((general-implicit-kbd t)) + ,(doom--map-process rest))) (provide 'core-keybinds) ;;; core-keybinds.el ends here diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index a3be4dc20..9e46762da 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -1,7 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core-keybinds.el - (describe "core/keybinds" (describe "map!" :var (doom--map-evil-p doom-map-states) @@ -17,23 +16,23 @@ (describe "Single keybinds" (it "binds a global key" - (expect (macroexpand '(map! "C-." #'a)) + (expect (caddr (macroexpand '(map! "C-." #'a))) :to-equal '(general-define-key "C-." #'a))) (it "binds a key in one evil state" (dolist (state doom-map-states) - (expect (macroexpand `(map! ,(car state) "C-." #'a)) + (expect (caddr (macroexpand `(map! ,(car state) "C-." #'a))) :to-equal `(general-define-key :states ',(cdr state) "C-." #'a)))) (it "binds a key in multiple evil states" - (expect (cdr (macroexpand `(map! :nvi "C-." #'a))) + (expect (cdr (caddr (macroexpand `(map! :nvi "C-." #'a)))) :to-have-same-items-as '((general-define-key :states 'normal "C-." #'a) (general-define-key :states 'visual "C-." #'a) (general-define-key :states 'insert "C-." #'a)))) (it "binds evil keybinds together with global keybinds" - (expect (macroexpand '(map! :ng "C-." #'a)) + (expect (caddr (macroexpand '(map! :ng "C-." #'a))) :to-equal '(progn (general-define-key :states 'normal "C-." #'a) @@ -41,18 +40,18 @@ (describe "Multiple keybinds" (it "binds global keys and preserves order" - (expect (macroexpand '(map! "C-." #'a - "C-," #'b - "C-/" #'c)) + (expect (caddr (macroexpand '(map! "C-." #'a + "C-," #'b + "C-/" #'c))) :to-equal '(general-define-key "C-." #'a "C-," #'b "C-/" #'c))) (it "binds multiple keybinds in an evil state and preserve order" (dolist (state doom-map-states) - (expect (macroexpand `(map! ,(car state) "a" #'a - ,(car state) "b" #'b - ,(car state) "c" #'c)) + (expect (caddr (macroexpand `(map! ,(car state) "a" #'a + ,(car state) "b" #'b + ,(car state) "c" #'c))) :to-equal `(general-define-key :states ',(cdr state) "a" #'a @@ -60,31 +59,31 @@ "c" #'c)))) (it "binds multiple keybinds in different evil states" - (expect (cdr (macroexpand `(map! :n "a" #'a - :n "b" #'b - :n "e" #'e - :v "c" #'c - :i "d" #'d))) + (expect (cdr (caddr (macroexpand `(map! :n "a" #'a + :n "b" #'b + :n "e" #'e + :v "c" #'c + :i "d" #'d)))) :to-have-same-items-as `((general-define-key :states 'insert "d" #'d) (general-define-key :states 'visual "c" #'c) (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) (it "groups multi-state keybinds while preserving same-group key order" - (expect (cdr (macroexpand `(map! :n "a" #'a - :v "c" #'c - :n "b" #'b - :i "d" #'d - :n "e" #'e))) + (expect (cdr (caddr (macroexpand `(map! :n "a" #'a + :v "c" #'c + :n "b" #'b + :i "d" #'d + :n "e" #'e)))) :to-have-same-items-as `((general-define-key :states 'insert "d" #'d) (general-define-key :states 'visual "c" #'c) (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) (it "binds multiple keybinds in multiple evil states" - (expect (cdr (macroexpand `(map! :nvi "a" #'a - :nvi "b" #'b - :nvi "c" #'c))) + (expect (cdr (caddr (macroexpand `(map! :nvi "a" #'a + :nvi "b" #'b + :nvi "c" #'c)))) :to-have-same-items-as '((general-define-key :states 'normal "a" #'a "b" #'b "c" #'c) (general-define-key :states 'visual "a" #'a "b" #'b "c" #'c) @@ -92,18 +91,18 @@ (describe "Nested keybinds" (it "binds global keys" - (expect (macroexpand '(map! "C-." #'a - ("C-a" #'b) - ("C-x" #'c))) + (expect (caddr (macroexpand '(map! "C-." #'a + ("C-a" #'b) + ("C-x" #'c)))) :to-equal '(progn (general-define-key "C-." #'a) (general-define-key "C-a" #'b) (general-define-key "C-x" #'c)))) (it "binds nested evil keybinds" - (expect (macroexpand '(map! :n "C-." #'a - (:n "C-a" #'b) - (:n "C-x" #'c))) + (expect (caddr (macroexpand '(map! :n "C-." #'a + (:n "C-a" #'b) + (:n "C-x" #'c)))) :to-equal '(progn (general-define-key :states 'normal "C-." #'a) @@ -111,9 +110,9 @@ (general-define-key :states 'normal "C-x" #'c)))) (it "binds global keybinds in between evil keybinds" - (expect (cdr (macroexpand-1 '(map! :n "a" #'a - "b" #'b - :i "c" #'c))) + (expect (cdr (caddr (macroexpand-1 '(map! :n "a" #'a + "b" #'b + :i "c" #'c)))) :to-have-same-items-as '((general-define-key :states 'insert "c" #'c) (general-define-key "b" #'b) @@ -125,16 +124,16 @@ (it "wraps `general-define-key' in a `after!' block" (dolist (form '((map! :after helm "a" #'a "b" #'b) (map! (:after helm "a" #'a "b" #'b)))) - (expect (macroexpand-1 form) + (expect (caddr (macroexpand-1 form)) :to-equal '(after! helm (general-define-key "a" #'a "b" #'b)))) - (expect (macroexpand-1 '(map! "a" #'a (:after helm "b" #'b "c" #'c))) + (expect (caddr (macroexpand-1 '(map! "a" #'a (:after helm "b" #'b "c" #'c)))) :to-equal '(progn (general-define-key "a" #'a) (after! helm (general-define-key "b" #'b "c" #'c)))) - (expect (macroexpand-1 '(map! (:after helm "b" #'b "c" #'c) "a" #'a)) + (expect (caddr (macroexpand-1 '(map! (:after helm "b" #'b "c" #'c) "a" #'a))) :to-equal '(progn (after! helm @@ -142,18 +141,18 @@ (general-define-key "a" #'a)))) (it "nests `after!' blocks" - (expect (macroexpand-1 '(map! :after x "a" #'a - (:after y "b" #'b - (:after z "c" #'c)))) + (expect (caddr (macroexpand-1 '(map! :after x "a" #'a + (:after y "b" #'b + (:after z "c" #'c))))) :to-equal '(after! x (progn (general-define-key "a" #'a) (after! y (progn (general-define-key "b" #'b) (after! z (general-define-key "c" #'c)))))))) (it "nests `after!' blocks in other nested blocks" - (expect (macroexpand-1 '(map! :after x "a" #'a - (:when t "b" #'b - (:after z "c" #'c)))) + (expect (caddr (macroexpand-1 '(map! :after x "a" #'a + (:when t "b" #'b + (:after z "c" #'c))))) :to-equal '(after! x (progn @@ -165,75 +164,75 @@ (describe ":desc" (it "add a :which-key property to a keybind's DEF" - (expect (macroexpand-1 '(map! :desc "A" "a" #'a)) + (expect (caddr (macroexpand-1 '(map! :desc "A" "a" #'a))) :to-equal `(general-define-key "a" (list :def #'a :which-key "A"))))) (describe ":if/:when/:unless" (it "wraps keys in a conditional block" (dolist (prop '(:if :when :unless)) (let ((prop-fn (intern (doom-keyword-name prop)))) - (expect (macroexpand-1 `(map! ,prop t "a" #'a "b" #'b)) + (expect (caddr (macroexpand-1 `(map! ,prop t "a" #'a "b" #'b))) :to-equal `(,prop-fn t (general-define-key "a" #'a "b" #'b))) - (expect (macroexpand-1 `(map! (,prop t "a" #'a "b" #'b))) + (expect (caddr (macroexpand-1 `(map! (,prop t "a" #'a "b" #'b)))) :to-equal `(,prop-fn t (general-define-key "a" #'a "b" #'b)))))) (it "nests conditional blocks" - (expect (macroexpand-1 '(map! (:when t "a" #'a (:when t "b" #'b)))) + (expect (caddr (macroexpand-1 '(map! (:when t "a" #'a (:when t "b" #'b))))) :to-equal '(when t (progn (general-define-key "a" #'a) (when t (general-define-key "b" #'b))))))) (describe ":leader" (it "uses leader definer" - (expect (macroexpand-1 '(map! :leader "a" #'a "b" #'b)) - :to-equal '(general-define-key :definer 'leader "a" #'a "b" #'b))) + (expect (caddr (macroexpand-1 '(map! :leader "a" #'a "b" #'b))) + :to-equal '(define-leader-key! "a" #'a "b" #'b))) (it "it persists for nested keys" - (expect (cdr (macroexpand-1 '(map! :leader "a" #'a ("b" #'b)))) - :to-equal '((general-define-key :definer 'leader "a" #'a) - (general-define-key :definer 'leader "b" #'b))))) + (expect (cdr (caddr (macroexpand-1 '(map! :leader "a" #'a ("b" #'b))))) + :to-equal '((define-leader-key! "a" #'a) + (define-leader-key! "b" #'b))))) (describe ":localleader" (it "uses localleader definer" - (expect (macroexpand-1 '(map! :localleader "a" #'a "b" #'b)) - :to-equal '(general-define-key :definer 'localleader "a" #'a "b" #'b))) + (expect (caddr (macroexpand-1 '(map! :localleader "a" #'a "b" #'b))) + :to-equal '(define-localleader-key! "a" #'a "b" #'b))) (it "it persists for nested keys" - (expect (cdr (macroexpand-1 '(map! :localleader "a" #'a ("b" #'b)))) - :to-equal '((general-define-key :definer 'localleader "a" #'a) - (general-define-key :definer 'localleader "b" #'b))))) + (expect (cdr (caddr (macroexpand-1 '(map! :localleader "a" #'a ("b" #'b))))) + :to-equal '((define-localleader-key! "a" #'a) + (define-localleader-key! "b" #'b))))) (describe ":map/:keymap" (it "specifies a single keymap for keys" - (expect (macroexpand-1 '(map! :map emacs-lisp-mode-map "a" #'a)) + (expect (caddr (macroexpand-1 '(map! :map emacs-lisp-mode-map "a" #'a))) :to-equal '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a))) (it "specifies multiple keymap for keys" - (expect (macroexpand-1 '(map! :map (lisp-mode-map emacs-lisp-mode-map) "a" #'a)) + (expect (caddr (macroexpand-1 '(map! :map (lisp-mode-map emacs-lisp-mode-map) "a" #'a))) :to-equal '(general-define-key :keymaps '(lisp-mode-map emacs-lisp-mode-map) "a" #'a)))) (describe ":mode" (it "appends -map to MODE" - (expect (macroexpand-1 '(map! :mode emacs-lisp-mode "a" #'a)) + (expect (caddr (macroexpand-1 '(map! :mode emacs-lisp-mode "a" #'a))) :to-equal '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a)))) (describe ":prefix" (it "specifies a prefix for all keys" - (expect (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y "z" #'z)) + (expect (caddr (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y "z" #'z))) :to-equal '(general-define-key :prefix "a" "x" #'x "y" #'y "z" #'z))) (it "overwrites previous inline :prefix properties" - (expect (cdr (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y :prefix "b" "z" #'z))) + (expect (cdr (caddr (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y :prefix "b" "z" #'z)))) :to-equal '((general-define-key :prefix "a" "x" #'x "y" #'y) (general-define-key :prefix "b" "z" #'z)))) (it "accumulates keys when nested" - (expect (cdr (macroexpand-1 '(map! (:prefix "a" "x" #'x (:prefix "b" "x" #'x))))) + (expect (cdr (caddr (macroexpand-1 '(map! (:prefix "a" "x" #'x (:prefix "b" "x" #'x)))))) :to-equal `((general-define-key :prefix "a" "x" #'x) (general-define-key :prefix (general--concat t "a" "b") @@ -241,18 +240,18 @@ (describe ":alt-prefix" (it "specifies a prefix for all keys" - (expect (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z)) + (expect (caddr (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z))) :to-equal '(general-define-key :non-normal-prefix "a" "x" #'x "y" #'y "z" #'z))) (it "overwrites previous inline :alt-prefix properties" - (expect (cdr (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z))) + (expect (cdr (caddr (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z)))) :to-equal '((general-define-key :non-normal-prefix "a" "x" #'x "y" #'y) (general-define-key :non-normal-prefix "b" "z" #'z)))) (it "accumulates keys when nested" - (expect (cdr (macroexpand-1 '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x))))) + (expect (cdr (caddr (macroexpand-1 '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x)))))) :to-equal `((general-define-key :non-normal-prefix "a" "x" #'x) (general-define-key :non-normal-prefix (general--concat t "a" "b") @@ -260,7 +259,7 @@ (describe ":textobj" (it "defines keys in evil-{inner,outer}-text-objects-map" - (expect (macroexpand-1 '(map! :textobj "a" #'inner #'outer)) + (expect (caddr (macroexpand-1 '(map! :textobj "a" #'inner #'outer))) :to-equal '(map! (:map evil-inner-text-objects-map "a" #'inner) (:map evil-outer-text-objects-map "a" #'outer)))))))) From 5447927e6aa69a76f44cf90a1e37b3cde4ca2eea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 19:30:00 -0500 Subject: [PATCH 3493/4235] Refactor map! tests --- core/test/test-core-keybinds.el | 278 +++++++++++++++++--------------- 1 file changed, 145 insertions(+), 133 deletions(-) diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index 9e46762da..c66dc3a92 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -1,6 +1,11 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core-keybinds.el +(buttercup-define-matcher :to-bind (src result) + ;; TODO Add expect messages + (equal (caddr (macroexpand-1 (funcall src))) + (funcall result))) + (describe "core/keybinds" (describe "map!" :var (doom--map-evil-p doom-map-states) @@ -16,144 +21,143 @@ (describe "Single keybinds" (it "binds a global key" - (expect (caddr (macroexpand '(map! "C-." #'a))) - :to-equal '(general-define-key "C-." #'a))) + (expect '(map! "C-." #'a) :to-bind '(general-define-key "C-." #'a))) (it "binds a key in one evil state" (dolist (state doom-map-states) - (expect (caddr (macroexpand `(map! ,(car state) "C-." #'a))) - :to-equal `(general-define-key :states ',(cdr state) "C-." #'a)))) + (expect `(map! ,(car state) "C-." #'a) + :to-bind `(general-define-key :states ',(cdr state) "C-." #'a)))) (it "binds a key in multiple evil states" - (expect (cdr (caddr (macroexpand `(map! :nvi "C-." #'a)))) - :to-have-same-items-as - '((general-define-key :states 'normal "C-." #'a) - (general-define-key :states 'visual "C-." #'a) - (general-define-key :states 'insert "C-." #'a)))) + (expect `(map! :nvi "C-." #'a) + :to-bind + '(progn (general-define-key :states 'insert "C-." #'a) + (general-define-key :states 'visual "C-." #'a) + (general-define-key :states 'normal "C-." #'a)))) (it "binds evil keybinds together with global keybinds" - (expect (caddr (macroexpand '(map! :ng "C-." #'a))) - :to-equal + (expect '(map! :ng "C-." #'a) + :to-bind '(progn (general-define-key :states 'normal "C-." #'a) (general-define-key "C-." #'a))))) (describe "Multiple keybinds" (it "binds global keys and preserves order" - (expect (caddr (macroexpand '(map! "C-." #'a - "C-," #'b - "C-/" #'c))) - :to-equal '(general-define-key "C-." #'a - "C-," #'b - "C-/" #'c))) + (expect '(map! "C-." #'a "C-," #'b "C-/" #'c) + :to-bind + '(general-define-key "C-." #'a "C-," #'b "C-/" #'c))) (it "binds multiple keybinds in an evil state and preserve order" (dolist (state doom-map-states) - (expect (caddr (macroexpand `(map! ,(car state) "a" #'a - ,(car state) "b" #'b - ,(car state) "c" #'c))) - :to-equal + (expect `(map! ,(car state) "a" #'a + ,(car state) "b" #'b + ,(car state) "c" #'c) + :to-bind `(general-define-key :states ',(cdr state) "a" #'a "b" #'b "c" #'c)))) (it "binds multiple keybinds in different evil states" - (expect (cdr (caddr (macroexpand `(map! :n "a" #'a - :n "b" #'b - :n "e" #'e - :v "c" #'c - :i "d" #'d)))) - :to-have-same-items-as - `((general-define-key :states 'insert "d" #'d) - (general-define-key :states 'visual "c" #'c) - (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) + (expect `(map! :n "a" #'a + :n "b" #'b + :n "e" #'e + :v "c" #'c + :i "d" #'d) + :to-bind + `(progn (general-define-key :states 'insert "d" #'d) + (general-define-key :states 'visual "c" #'c) + (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) (it "groups multi-state keybinds while preserving same-group key order" - (expect (cdr (caddr (macroexpand `(map! :n "a" #'a - :v "c" #'c - :n "b" #'b - :i "d" #'d - :n "e" #'e)))) - :to-have-same-items-as - `((general-define-key :states 'insert "d" #'d) - (general-define-key :states 'visual "c" #'c) - (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) + (expect `(map! :n "a" #'a + :v "c" #'c + :n "b" #'b + :i "d" #'d + :n "e" #'e) + :to-bind + `(progn (general-define-key :states 'insert "d" #'d) + (general-define-key :states 'visual "c" #'c) + (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) (it "binds multiple keybinds in multiple evil states" - (expect (cdr (caddr (macroexpand `(map! :nvi "a" #'a - :nvi "b" #'b - :nvi "c" #'c)))) - :to-have-same-items-as - '((general-define-key :states 'normal "a" #'a "b" #'b "c" #'c) - (general-define-key :states 'visual "a" #'a "b" #'b "c" #'c) - (general-define-key :states 'insert "a" #'a "b" #'b "c" #'c))))) + (expect `(map! :nvi "a" #'a + :nvi "b" #'b + :nvi "c" #'c) + :to-bind + '(progn (general-define-key :states 'insert "a" #'a "b" #'b "c" #'c) + (general-define-key :states 'visual "a" #'a "b" #'b "c" #'c) + (general-define-key :states 'normal "a" #'a "b" #'b "c" #'c))))) (describe "Nested keybinds" (it "binds global keys" - (expect (caddr (macroexpand '(map! "C-." #'a - ("C-a" #'b) - ("C-x" #'c)))) - :to-equal '(progn - (general-define-key "C-." #'a) - (general-define-key "C-a" #'b) - (general-define-key "C-x" #'c)))) + (expect '(map! "C-." #'a + ("C-a" #'b) + ("C-x" #'c)) + :to-bind + '(progn + (general-define-key "C-." #'a) + (general-define-key "C-a" #'b) + (general-define-key "C-x" #'c)))) (it "binds nested evil keybinds" - (expect (caddr (macroexpand '(map! :n "C-." #'a - (:n "C-a" #'b) - (:n "C-x" #'c)))) - :to-equal + (expect '(map! :n "C-." #'a + (:n "C-a" #'b) + (:n "C-x" #'c)) + :to-bind '(progn (general-define-key :states 'normal "C-." #'a) (general-define-key :states 'normal "C-a" #'b) (general-define-key :states 'normal "C-x" #'c)))) (it "binds global keybinds in between evil keybinds" - (expect (cdr (caddr (macroexpand-1 '(map! :n "a" #'a - "b" #'b - :i "c" #'c)))) - :to-have-same-items-as - '((general-define-key :states 'insert "c" #'c) - (general-define-key "b" #'b) - (general-define-key :states 'normal "a" #'a))))) + (expect '(map! :n "a" #'a + "b" #'b + :n "c" #'c) + :to-bind + '(progn (general-define-key "b" #'b) + (general-define-key :states 'normal "a" #'a "c" #'c))))) ;; (describe "Properties" (describe ":after" (it "wraps `general-define-key' in a `after!' block" - (dolist (form '((map! :after helm "a" #'a "b" #'b) + (dolist (form '((map! :after helm "a" #'a "b" #'b) (map! (:after helm "a" #'a "b" #'b)))) - (expect (caddr (macroexpand-1 form)) - :to-equal - '(after! helm (general-define-key "a" #'a "b" #'b)))) - (expect (caddr (macroexpand-1 '(map! "a" #'a (:after helm "b" #'b "c" #'c)))) - :to-equal + (expect form :to-bind '(after! helm (general-define-key "a" #'a "b" #'b)))) + (expect '(map! "a" #'a (:after helm "b" #'b "c" #'c)) + :to-bind '(progn (general-define-key "a" #'a) (after! helm (general-define-key "b" #'b "c" #'c)))) - (expect (caddr (macroexpand-1 '(map! (:after helm "b" #'b "c" #'c) "a" #'a))) - :to-equal + (expect '(map! (:after helm "b" #'b "c" #'c) "a" #'a) + :to-bind '(progn (after! helm (general-define-key "b" #'b "c" #'c)) (general-define-key "a" #'a)))) (it "nests `after!' blocks" - (expect (caddr (macroexpand-1 '(map! :after x "a" #'a - (:after y "b" #'b - (:after z "c" #'c))))) - :to-equal - '(after! x (progn (general-define-key "a" #'a) - (after! y (progn (general-define-key "b" #'b) - (after! z (general-define-key "c" #'c)))))))) + (expect '(map! :after x "a" #'a + (:after y "b" #'b + (:after z "c" #'c))) + :to-bind + '(after! x + (progn + (general-define-key "a" #'a) + (after! y + (progn + (general-define-key "b" #'b) + (after! z + (general-define-key "c" #'c)))))))) (it "nests `after!' blocks in other nested blocks" - (expect (caddr (macroexpand-1 '(map! :after x "a" #'a - (:when t "b" #'b - (:after z "c" #'c))))) - :to-equal + (expect '(map! :after x "a" #'a + (:when t "b" #'b + (:after z "c" #'c))) + :to-bind '(after! x (progn (general-define-key "a" #'a) @@ -164,102 +168,110 @@ (describe ":desc" (it "add a :which-key property to a keybind's DEF" - (expect (caddr (macroexpand-1 '(map! :desc "A" "a" #'a))) - :to-equal `(general-define-key "a" (list :def #'a :which-key "A"))))) + (expect '(map! :desc "A" "a" #'a) + :to-bind + `(general-define-key "a" (list :def #'a :which-key "A"))))) (describe ":if/:when/:unless" (it "wraps keys in a conditional block" (dolist (prop '(:if :when :unless)) (let ((prop-fn (intern (doom-keyword-name prop)))) - (expect (caddr (macroexpand-1 `(map! ,prop t "a" #'a "b" #'b))) - :to-equal `(,prop-fn t (general-define-key "a" #'a "b" #'b))) - (expect (caddr (macroexpand-1 `(map! (,prop t "a" #'a "b" #'b)))) - :to-equal `(,prop-fn t (general-define-key "a" #'a "b" #'b)))))) + (expect `(map! ,prop t "a" #'a "b" #'b) + :to-bind + `(,prop-fn t (general-define-key "a" #'a "b" #'b))) + (expect `(map! (,prop t "a" #'a "b" #'b)) + :to-bind + `(,prop-fn t (general-define-key "a" #'a "b" #'b)))))) (it "nests conditional blocks" - (expect (caddr (macroexpand-1 '(map! (:when t "a" #'a (:when t "b" #'b))))) - :to-equal '(when t - (progn (general-define-key "a" #'a) - (when t (general-define-key "b" #'b))))))) + (expect '(map! (:when t "a" #'a (:when t "b" #'b))) + :to-bind + '(when t + (progn (general-define-key "a" #'a) + (when t (general-define-key "b" #'b))))))) (describe ":leader" (it "uses leader definer" - (expect (caddr (macroexpand-1 '(map! :leader "a" #'a "b" #'b))) - :to-equal '(define-leader-key! "a" #'a "b" #'b))) + (expect '(map! :leader "a" #'a "b" #'b) + :to-bind + '(define-leader-key! "a" #'a "b" #'b))) (it "it persists for nested keys" - (expect (cdr (caddr (macroexpand-1 '(map! :leader "a" #'a ("b" #'b))))) - :to-equal '((define-leader-key! "a" #'a) - (define-leader-key! "b" #'b))))) + (expect '(map! :leader "a" #'a ("b" #'b)) + :to-bind + '(progn (define-leader-key! "a" #'a) + (define-leader-key! "b" #'b))))) (describe ":localleader" (it "uses localleader definer" - (expect (caddr (macroexpand-1 '(map! :localleader "a" #'a "b" #'b))) - :to-equal '(define-localleader-key! "a" #'a "b" #'b))) + (expect '(map! :localleader "a" #'a "b" #'b) + :to-bind + '(define-localleader-key! "a" #'a "b" #'b))) (it "it persists for nested keys" - (expect (cdr (caddr (macroexpand-1 '(map! :localleader "a" #'a ("b" #'b))))) - :to-equal '((define-localleader-key! "a" #'a) - (define-localleader-key! "b" #'b))))) + (expect '(map! :localleader "a" #'a ("b" #'b)) + :to-bind + '(progn (define-localleader-key! "a" #'a) + (define-localleader-key! "b" #'b))))) (describe ":map/:keymap" (it "specifies a single keymap for keys" - (expect (caddr (macroexpand-1 '(map! :map emacs-lisp-mode-map "a" #'a))) - :to-equal + (expect '(map! :map emacs-lisp-mode-map "a" #'a) + :to-bind '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a))) (it "specifies multiple keymap for keys" - (expect (caddr (macroexpand-1 '(map! :map (lisp-mode-map emacs-lisp-mode-map) "a" #'a))) - :to-equal + (expect '(map! :map (lisp-mode-map emacs-lisp-mode-map) "a" #'a) + :to-bind '(general-define-key :keymaps '(lisp-mode-map emacs-lisp-mode-map) "a" #'a)))) (describe ":mode" (it "appends -map to MODE" - (expect (caddr (macroexpand-1 '(map! :mode emacs-lisp-mode "a" #'a))) - :to-equal + (expect '(map! :mode emacs-lisp-mode "a" #'a) + :to-bind '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a)))) (describe ":prefix" (it "specifies a prefix for all keys" - (expect (caddr (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y "z" #'z))) - :to-equal + (expect '(map! :prefix "a" "x" #'x "y" #'y "z" #'z) + :to-bind '(general-define-key :prefix "a" "x" #'x "y" #'y "z" #'z))) (it "overwrites previous inline :prefix properties" - (expect (cdr (caddr (macroexpand-1 '(map! :prefix "a" "x" #'x "y" #'y :prefix "b" "z" #'z)))) - :to-equal - '((general-define-key :prefix "a" "x" #'x "y" #'y) - (general-define-key :prefix "b" "z" #'z)))) + (expect '(map! :prefix "a" "x" #'x "y" #'y :prefix "b" "z" #'z) + :to-bind + '(progn (general-define-key :prefix "a" "x" #'x "y" #'y) + (general-define-key :prefix "b" "z" #'z)))) (it "accumulates keys when nested" - (expect (cdr (caddr (macroexpand-1 '(map! (:prefix "a" "x" #'x (:prefix "b" "x" #'x)))))) - :to-equal - `((general-define-key :prefix "a" "x" #'x) - (general-define-key :prefix (general--concat t "a" "b") - "x" #'x))))) + (expect '(map! (:prefix "a" "x" #'x (:prefix "b" "x" #'x))) + :to-bind + `(progn (general-define-key :prefix "a" "x" #'x) + (general-define-key :prefix (general--concat t "a" "b") + "x" #'x))))) (describe ":alt-prefix" (it "specifies a prefix for all keys" - (expect (caddr (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z))) - :to-equal + (expect '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z) + :to-bind '(general-define-key :non-normal-prefix "a" "x" #'x "y" #'y "z" #'z))) (it "overwrites previous inline :alt-prefix properties" - (expect (cdr (caddr (macroexpand-1 '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z)))) - :to-equal - '((general-define-key :non-normal-prefix "a" "x" #'x "y" #'y) - (general-define-key :non-normal-prefix "b" "z" #'z)))) + (expect '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z) + :to-bind + '(progn (general-define-key :non-normal-prefix "a" "x" #'x "y" #'y) + (general-define-key :non-normal-prefix "b" "z" #'z)))) (it "accumulates keys when nested" - (expect (cdr (caddr (macroexpand-1 '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x)))))) - :to-equal - `((general-define-key :non-normal-prefix "a" "x" #'x) - (general-define-key :non-normal-prefix (general--concat t "a" "b") - "x" #'x))))) + (expect '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x))) + :to-bind + `(progn (general-define-key :non-normal-prefix "a" "x" #'x) + (general-define-key :non-normal-prefix (general--concat t "a" "b") + "x" #'x))))) (describe ":textobj" (it "defines keys in evil-{inner,outer}-text-objects-map" - (expect (caddr (macroexpand-1 '(map! :textobj "a" #'inner #'outer))) - :to-equal + (expect '(map! :textobj "a" #'inner #'outer) + :to-bind '(map! (:map evil-inner-text-objects-map "a" #'inner) (:map evil-outer-text-objects-map "a" #'outer)))))))) From 91474c98ee781dbfb9dd76b01c7ab9e39985231d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 19:33:20 -0500 Subject: [PATCH 3494/4235] Fix localleader binds hijacking SPC in insert mode --- core/core-keybinds.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index b53c21d94..461c7f854 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -73,6 +73,7 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; emacs state), we must redefine `define-localleader-key!' once evil is loaded (after! evil (general-create-definer define-localleader-key! + :states (cdr general-describe-evil-states) :major-modes t :keymaps 'local :prefix doom-localleader-key From 032bde6aa22b666d5227096b97e4b0454f346fcf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 19:34:56 -0500 Subject: [PATCH 3495/4235] Fix malformed keybind remapping --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8cace9da1..ae24eb88c 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -62,7 +62,7 @@ (map! :after vc-annotate :map vc-annotate-mode-map - [remap quit-window #'kill-this-buffer]) + [remap quit-window] #'kill-this-buffer) ;; From 02624251c1619a931ae99f777a60313dbb60050b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 20:07:18 -0500 Subject: [PATCH 3496/4235] lang/rust: update keybinds for new map! --- modules/lang/rust/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 6f18a25ea..41348e9cd 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -8,10 +8,10 @@ (map! :map rust-mode-map :localleader :prefix "b" - :desc "cargo build" :n "b" (λ! (compile "cargo build --color always")) - :desc "cargo check" :n "c" (λ! (compile "cargo check --color always")) - :desc "cargo run" :n "r" (λ! (compile "cargo run --color always")) - :desc "cargo test" :n "t" (λ! (compile "cargo test --color always")))) + :desc "cargo build" "b" (λ! (compile "cargo build --color always")) + :desc "cargo check" "c" (λ! (compile "cargo check --color always")) + :desc "cargo run" "r" (λ! (compile "cargo run --color always")) + :desc "cargo test" "t" (λ! (compile "cargo test --color always")))) (def-package! racer From f35837755c46b758442e510861af9c24bf086189 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 22 Dec 2018 20:18:14 -0500 Subject: [PATCH 3497/4235] Disable tools/editorconfig by default --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index b32fa440a..57f9ec90a 100644 --- a/init.example.el +++ b/init.example.el @@ -65,7 +65,7 @@ :tools ;;ansible ;;docker - editorconfig ; let someone else argue about tabs vs spaces + ;;editorconfig ; let someone else argue about tabs vs spaces ;;ein ; tame Jupyter notebooks with emacs ;;gist ; interacting with github gists ;;macos ; MacOS-specific commands From 0efa915164c15e8b8dd42c082e13611d662e554c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 00:10:18 -0500 Subject: [PATCH 3498/4235] Fix :leader/:localleader targeting preceding keys This fixes an issue where even the keys preceding :leader/:localleader were registered as leader/localleader keys. --- core/core-keybinds.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 461c7f854..4409f562f 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -163,8 +163,10 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See ((keywordp key) (pcase key (:leader + (doom--map-commit) (setq doom--map-fn 'define-leader-key!)) (:localleader + (doom--map-commit) (setq doom--map-fn 'define-localleader-key!)) (:after (doom--map-nested (list 'after! (pop rest)) rest) From 451c16b8eed755c875b4894c7c605f0bcbffb405 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 00:25:51 -0500 Subject: [PATCH 3499/4235] Revise :after-call & :defer-incrementally comments Now implicitly adds the current package to :defer-incrementally's list of packages. --- core/core-editor.el | 4 ++-- core/core-modules.el | 34 +++++++++++++++++++++++++++------- modules/tools/magit/config.el | 2 +- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 859013d97..5a1c339ef 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -97,7 +97,7 @@ fundamental-mode) for performance sake." (def-package! savehist ;; persist variables across sessions - :defer-incrementally (custom savehist) + :defer-incrementally (custom) :after-call post-command-hook :config (setq savehist-file (concat doom-cache-dir "savehist") @@ -129,7 +129,7 @@ savehist file." (def-package! recentf ;; Keep track of recently opened files - :defer-incrementally (easymenu tree-widget timer recentf) + :defer-incrementally (easymenu tree-widget timer) :after-call after-find-file :commands recentf-open-files :config diff --git a/core/core-modules.el b/core/core-modules.el index bee39dd97..97e886ecb 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -191,14 +191,34 @@ non-nil, return paths of possible modules, activated or otherwise." use-package-minimum-reported-time (if doom-debug-mode 0 0.1) use-package-expand-minimally (not noninteractive)) -;; Adds the :after-call custom keyword to `use-package' (and consequently, -;; `def-package!'). :after-call takes a symbol or list of symbols. These symbols -;; can be functions or hook variables. +;; Adds two new keywords to `use-package' (and consequently, `def-package!'), +;; they are: ;; -;; (use-package X :after-call find-file-hook) +;; :after-call SYMBOL|LIST +;; Takes a symbol or list of symbols representing functions or hook variables. +;; The first time any of these functions or hooks are executed, the package is +;; loaded. e.g. ;; -;; This will load X on the first invokation of `find-file-hook' (then it will -;; remove itself from the hook/function). +;; (def-package! projectile +;; :after-call (pre-command-hook after-find-file dired-before-readin-hook) +;; ...) +;; +;; :defer-incrementally SYMBOL|LIST|t +;; Takes a symbol or list of symbols representing packages that will be loaded +;; incrementally at startup before this one. This is helpful for large +;; packages like magit or org, which load a lot of dependencies on first load. +;; This lets you load them piece-meal, one at a time, during idle periods, so +;; that when you finally do need the package, it'll loads much quicker. e.g. +;; +;; (def-package! magit +;; ;; You do not need to include magit in this list! +;; :defer-incrementally (dash f s with-editor git-commit package) +;; ...) +;; +;; (def-package! x +;; ;; This is equivalent to :defer-incrementally (x) +;; :defer-incrementally t +;; ...) (defvar doom--deferred-packages-alist '(t)) (after! use-package-core (add-to-list 'use-package-deferring-keywords :defer-incrementally nil #'eq) @@ -215,7 +235,7 @@ non-nil, return paths of possible modules, activated or otherwise." `((doom-load-packages-incrementally ',(if (equal targets '(t)) (list name) - targets))) + (append targets (list name))))) (use-package-process-keywords name rest state))) (defalias 'use-package-normalize/:after-call 'use-package-normalize-symlist) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 928680797..97af76ff2 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -15,7 +15,7 @@ what features are available.") (def-package! magit :commands magit-file-delete - :defer-incrementally (dash f s with-editor git-commit package magit) + :defer-incrementally (dash f s with-editor git-commit package) :init (setq magit-auto-revert-mode nil) ; we already use `global-auto-revert-mode' :config From 715c189608d5fdf08f2158c94a7bb2df8c7498df Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Dec 2018 16:53:45 +1100 Subject: [PATCH 3500/4235] Bind SPC-/-p to +helm/project-search if using helm --- modules/config/default/+evil-bindings.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ae24eb88c..b0c4b2126 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -510,7 +510,9 @@ :desc "Jump to symbol" "i" #'imenu :desc "Jump to link" "l" #'ace-link :desc "Look up online" "o" #'+lookup/online-select - :desc "Search project" "p" #'+ivy/project-search) + :desc "Search project" "p" + (cond ((featurep! :completion ivy) #'+ivy/project-search) + ((featurep! :completion helm) #'+helm/project-search))) (:prefix ("]" . "next") :desc "Increase text size" "[" #'text-scale-decrease @@ -720,7 +722,7 @@ :desc "Find other file" "o" #'projectile-find-other-file :desc "Switch project" "p" #'projectile-switch-project :desc "Recent project files" "r" #'projectile-recentf - :desc "List project tasks" "t" #'+ivy/tasks + :desc "List project tasks" "t" #'+ivy/tasks ; TODO: Add +helm/tasks :desc "Invalidate cache" "x" #'projectile-invalidate-cache) (:prefix ("q" . "quit/restart") From 45bb7256cbea456e035ebf19b901744df1c0f0a0 Mon Sep 17 00:00:00 2001 From: Aria Date: Sun, 23 Dec 2018 18:43:16 +1100 Subject: [PATCH 3501/4235] Bind SPC-/-d to helm too --- modules/config/default/+evil-bindings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index b0c4b2126..aa862020a 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -506,7 +506,9 @@ (:prefix ("/" . "search") :desc "Jump to symbol across buffers" "I" #'imenu-anywhere :desc "Search buffer" "b" #'swiper - :desc "Search current directory" "d" #'+ivy/project-search-from-cwd + :desc "Search current directory" "d" + (cond ((featurep! :completion helm) #'+helm/project-search-from-cwd) + ((featurep! :completion ivy) #'+ivy/project-search-from-cwd)) :desc "Jump to symbol" "i" #'imenu :desc "Jump to link" "l" #'ace-link :desc "Look up online" "o" #'+lookup/online-select From 29f119ad4d33caa6fcf810ab881bcfe727e5b14a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 16:01:37 -0500 Subject: [PATCH 3502/4235] Hook +javascript-npm-mode into typescript-mode This way typescript projects will be aware of node_modules. --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 1f68e3865..367c07407 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -228,7 +228,7 @@ ;; Projects (def-project-mode! +javascript-npm-mode - :modes (html-mode css-mode web-mode js2-mode rjsx-mode json-mode markdown-mode) + :modes (html-mode css-mode web-mode typescript-mode js2-mode rjsx-mode json-mode markdown-mode) :when (locate-dominating-file default-directory "package.json") :add-hooks (+javascript|add-node-modules-path npm-mode)) From 5ad0b749a1f11aba7ae73bff516e33f2c56713bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 23:12:10 -0500 Subject: [PATCH 3503/4235] Refactor map! & tests This resolves issues with :leader/:localleader keys not working when evil states are specified. Evil states are now ignored. Also, some of map!'s internals have been optimized to yield a ~10% improvement in macro expansion time. --- core/core-keybinds.el | 67 +++++++++++----------- core/test/test-core-keybinds.el | 99 +++++++++++++++++---------------- 2 files changed, 86 insertions(+), 80 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 4409f562f..2c1f4b5bb 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -53,17 +53,23 @@ If any hook returns non-nil, all hooks after it are ignored.") (defalias 'define-key! #'general-def) (defalias 'unmap! #'general-unbind) -;; +;; leader/localleader keys (define-prefix-command 'doom-leader 'doom-leader-map) (define-key doom-leader-map [override-state] 'all) -(general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader) + +(global-set-key (kbd doom-leader-alt-key) 'doom-leader) (general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader) +(general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader) -(general-create-definer define-leader-key! - :wk-full-keys nil - :keymaps 'doom-leader-map) +;; We avoid `general-create-definer' to ensure that :states, :wk-full-keys and +;; :keymaps cannot be overwritten. +(defmacro define-leader-key! (&rest args) + `(general-define-key + :states nil + :wk-full-keys nil + :keymaps 'doom-leader-map + ,@args)) -;; (general-create-definer define-localleader-key! :major-modes t :keymaps 'local @@ -215,47 +221,48 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (let ((a (plist-get doom--map-parent-state prop)) (b (plist-get doom--map-state prop))) (if (and a b) - `(general--concat t ,a ,b) + `(general--concat nil ,a ,b) (or a b)))) (defun doom--map-nested (wrapper rest) (doom--map-commit) - (let ((doom--map-parent-state (copy-seq (append doom--map-state doom--map-parent-state nil)))) + (let ((doom--map-parent-state (append doom--map-state doom--map-parent-state nil))) (push (if wrapper (append wrapper (list (doom--map-process rest))) (doom--map-process rest)) doom--map-forms))) -(defun doom--map-set (prop &optional value inhibit-commit) - (unless (or inhibit-commit - (equal (plist-get doom--map-state prop) value)) +(defun doom--map-set (prop &optional value) + (unless (equal (plist-get doom--map-state prop) value) (doom--map-commit)) (setq doom--map-state (plist-put doom--map-state prop value))) (defun doom--map-def (key def &optional states desc) - (when (or (memq 'global states) (null states)) - (setq states (delq 'global states)) - (push 'nil states)) - (if (and (listp def) - (memq (car-safe (doom-unquote def)) '(:def :ignore :keymap))) - (setq def `(quote ,(plist-put (general--normalize-extended-def (doom-unquote def)) - :which-key desc))) - (when desc - (setq def `(list ,@(cond ((and (equal key "") - (null def)) - `(nil :which-key ,desc)) - ((plist-put (general--normalize-extended-def def) - :which-key desc))))))) + (when (or (memq 'global states) + (null states)) + (setq states (cons 'nil (delq 'global states)))) + (when desc + (let (unquoted) + (cond ((and (listp def) + (keywordp (car-safe (setq unquoted (doom-unquote def))))) + (setq def (list 'quote (plist-put unquoted :which-key desc)))) + ((setq def (cons 'list + (if (and (equal key "") + (null def)) + `(nil :which-key ,desc) + (plist-put (general--normalize-extended-def def) + :which-key desc)))))))) (dolist (state states) - (push key (alist-get state doom--map-batch-forms)) - (push def (alist-get state doom--map-batch-forms)))) + (push (list key def) + (alist-get state doom--map-batch-forms)))) (defun doom--map-commit () (when doom--map-batch-forms (cl-loop with attrs = (doom--map-state) for (state . defs) in doom--map-batch-forms if (or doom--map-evil-p (not state)) - collect `(,doom--map-fn ,@(if state `(:states ',state)) ,@attrs ,@(nreverse defs)) + collect `(,doom--map-fn ,@(if state `(:states ',state)) ,@attrs + ,@(mapcan #'identity (nreverse defs))) into forms finally do (push (macroexp-progn forms) doom--map-forms)) (setq doom--map-batch-forms nil))) @@ -266,8 +273,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See :non-normal-prefix (doom--map-append-keys :non-normal-prefix) :keymaps (append (plist-get doom--map-parent-state :keymaps) - (plist-get doom--map-state :keymaps) - nil)) + (plist-get doom--map-state :keymaps))) doom--map-state nil)) newplist) @@ -327,8 +333,7 @@ Example (:when IS-MAC :n \"M-s\" 'some-fn :i \"M-o\" (lambda (interactive) (message \"Hi\"))))" - `(let ((general-implicit-kbd t)) - ,(doom--map-process rest))) + (doom--map-process rest)) (provide 'core-keybinds) ;;; core-keybinds.el ends here diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index c66dc3a92..ea6bac845 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -1,10 +1,12 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core-keybinds.el -(buttercup-define-matcher :to-bind (src result) - ;; TODO Add expect messages - (equal (caddr (macroexpand-1 (funcall src))) - (funcall result))) +(buttercup-define-matcher :to-expand-into (src result) + (let ((src (funcall src)) + (result (funcall result))) + (or (equal (macroexpand-1 src) result) + (error "'%s' expanded into '%s' instead of '%s'" + src (macroexpand-1 src) result)))) (describe "core/keybinds" (describe "map!" @@ -21,23 +23,24 @@ (describe "Single keybinds" (it "binds a global key" - (expect '(map! "C-." #'a) :to-bind '(general-define-key "C-." #'a))) + (expect '(map! "C-." #'a) :to-expand-into '(general-define-key "C-." #'a))) (it "binds a key in one evil state" (dolist (state doom-map-states) (expect `(map! ,(car state) "C-." #'a) - :to-bind `(general-define-key :states ',(cdr state) "C-." #'a)))) + :to-expand-into + `(general-define-key :states ',(cdr state) "C-." #'a)))) (it "binds a key in multiple evil states" (expect `(map! :nvi "C-." #'a) - :to-bind + :to-expand-into '(progn (general-define-key :states 'insert "C-." #'a) (general-define-key :states 'visual "C-." #'a) (general-define-key :states 'normal "C-." #'a)))) (it "binds evil keybinds together with global keybinds" (expect '(map! :ng "C-." #'a) - :to-bind + :to-expand-into '(progn (general-define-key :states 'normal "C-." #'a) (general-define-key "C-." #'a))))) @@ -45,7 +48,7 @@ (describe "Multiple keybinds" (it "binds global keys and preserves order" (expect '(map! "C-." #'a "C-," #'b "C-/" #'c) - :to-bind + :to-expand-into '(general-define-key "C-." #'a "C-," #'b "C-/" #'c))) (it "binds multiple keybinds in an evil state and preserve order" @@ -53,7 +56,7 @@ (expect `(map! ,(car state) "a" #'a ,(car state) "b" #'b ,(car state) "c" #'c) - :to-bind + :to-expand-into `(general-define-key :states ',(cdr state) "a" #'a "b" #'b @@ -65,7 +68,7 @@ :n "e" #'e :v "c" #'c :i "d" #'d) - :to-bind + :to-expand-into `(progn (general-define-key :states 'insert "d" #'d) (general-define-key :states 'visual "c" #'c) (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) @@ -76,7 +79,7 @@ :n "b" #'b :i "d" #'d :n "e" #'e) - :to-bind + :to-expand-into `(progn (general-define-key :states 'insert "d" #'d) (general-define-key :states 'visual "c" #'c) (general-define-key :states 'normal "a" #'a "b" #'b "e" #'e)))) @@ -85,7 +88,7 @@ (expect `(map! :nvi "a" #'a :nvi "b" #'b :nvi "c" #'c) - :to-bind + :to-expand-into '(progn (general-define-key :states 'insert "a" #'a "b" #'b "c" #'c) (general-define-key :states 'visual "a" #'a "b" #'b "c" #'c) (general-define-key :states 'normal "a" #'a "b" #'b "c" #'c))))) @@ -95,27 +98,25 @@ (expect '(map! "C-." #'a ("C-a" #'b) ("C-x" #'c)) - :to-bind - '(progn - (general-define-key "C-." #'a) - (general-define-key "C-a" #'b) - (general-define-key "C-x" #'c)))) + :to-expand-into + '(progn (general-define-key "C-." #'a) + (general-define-key "C-a" #'b) + (general-define-key "C-x" #'c)))) (it "binds nested evil keybinds" (expect '(map! :n "C-." #'a (:n "C-a" #'b) (:n "C-x" #'c)) - :to-bind - '(progn - (general-define-key :states 'normal "C-." #'a) - (general-define-key :states 'normal "C-a" #'b) - (general-define-key :states 'normal "C-x" #'c)))) + :to-expand-into + '(progn (general-define-key :states 'normal "C-." #'a) + (general-define-key :states 'normal "C-a" #'b) + (general-define-key :states 'normal "C-x" #'c)))) (it "binds global keybinds in between evil keybinds" (expect '(map! :n "a" #'a "b" #'b :n "c" #'c) - :to-bind + :to-expand-into '(progn (general-define-key "b" #'b) (general-define-key :states 'normal "a" #'a "c" #'c))))) @@ -125,15 +126,15 @@ (it "wraps `general-define-key' in a `after!' block" (dolist (form '((map! :after helm "a" #'a "b" #'b) (map! (:after helm "a" #'a "b" #'b)))) - (expect form :to-bind '(after! helm (general-define-key "a" #'a "b" #'b)))) + (expect form :to-expand-into '(after! helm (general-define-key "a" #'a "b" #'b)))) (expect '(map! "a" #'a (:after helm "b" #'b "c" #'c)) - :to-bind + :to-expand-into '(progn (general-define-key "a" #'a) (after! helm (general-define-key "b" #'b "c" #'c)))) (expect '(map! (:after helm "b" #'b "c" #'c) "a" #'a) - :to-bind + :to-expand-into '(progn (after! helm (general-define-key "b" #'b "c" #'c)) @@ -143,7 +144,7 @@ (expect '(map! :after x "a" #'a (:after y "b" #'b (:after z "c" #'c))) - :to-bind + :to-expand-into '(after! x (progn (general-define-key "a" #'a) @@ -157,7 +158,7 @@ (expect '(map! :after x "a" #'a (:when t "b" #'b (:after z "c" #'c))) - :to-bind + :to-expand-into '(after! x (progn (general-define-key "a" #'a) @@ -169,7 +170,7 @@ (describe ":desc" (it "add a :which-key property to a keybind's DEF" (expect '(map! :desc "A" "a" #'a) - :to-bind + :to-expand-into `(general-define-key "a" (list :def #'a :which-key "A"))))) (describe ":if/:when/:unless" @@ -177,15 +178,15 @@ (dolist (prop '(:if :when :unless)) (let ((prop-fn (intern (doom-keyword-name prop)))) (expect `(map! ,prop t "a" #'a "b" #'b) - :to-bind + :to-expand-into `(,prop-fn t (general-define-key "a" #'a "b" #'b))) (expect `(map! (,prop t "a" #'a "b" #'b)) - :to-bind + :to-expand-into `(,prop-fn t (general-define-key "a" #'a "b" #'b)))))) (it "nests conditional blocks" (expect '(map! (:when t "a" #'a (:when t "b" #'b))) - :to-bind + :to-expand-into '(when t (progn (general-define-key "a" #'a) (when t (general-define-key "b" #'b))))))) @@ -193,85 +194,85 @@ (describe ":leader" (it "uses leader definer" (expect '(map! :leader "a" #'a "b" #'b) - :to-bind + :to-expand-into '(define-leader-key! "a" #'a "b" #'b))) (it "it persists for nested keys" (expect '(map! :leader "a" #'a ("b" #'b)) - :to-bind + :to-expand-into '(progn (define-leader-key! "a" #'a) (define-leader-key! "b" #'b))))) (describe ":localleader" (it "uses localleader definer" (expect '(map! :localleader "a" #'a "b" #'b) - :to-bind + :to-expand-into '(define-localleader-key! "a" #'a "b" #'b))) (it "it persists for nested keys" (expect '(map! :localleader "a" #'a ("b" #'b)) - :to-bind + :to-expand-into '(progn (define-localleader-key! "a" #'a) (define-localleader-key! "b" #'b))))) (describe ":map/:keymap" (it "specifies a single keymap for keys" (expect '(map! :map emacs-lisp-mode-map "a" #'a) - :to-bind + :to-expand-into '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a))) (it "specifies multiple keymap for keys" (expect '(map! :map (lisp-mode-map emacs-lisp-mode-map) "a" #'a) - :to-bind + :to-expand-into '(general-define-key :keymaps '(lisp-mode-map emacs-lisp-mode-map) "a" #'a)))) (describe ":mode" (it "appends -map to MODE" (expect '(map! :mode emacs-lisp-mode "a" #'a) - :to-bind + :to-expand-into '(general-define-key :keymaps '(emacs-lisp-mode-map) "a" #'a)))) (describe ":prefix" (it "specifies a prefix for all keys" (expect '(map! :prefix "a" "x" #'x "y" #'y "z" #'z) - :to-bind + :to-expand-into '(general-define-key :prefix "a" "x" #'x "y" #'y "z" #'z))) (it "overwrites previous inline :prefix properties" (expect '(map! :prefix "a" "x" #'x "y" #'y :prefix "b" "z" #'z) - :to-bind + :to-expand-into '(progn (general-define-key :prefix "a" "x" #'x "y" #'y) (general-define-key :prefix "b" "z" #'z)))) (it "accumulates keys when nested" (expect '(map! (:prefix "a" "x" #'x (:prefix "b" "x" #'x))) - :to-bind + :to-expand-into `(progn (general-define-key :prefix "a" "x" #'x) - (general-define-key :prefix (general--concat t "a" "b") + (general-define-key :prefix (general--concat nil "a" "b") "x" #'x))))) (describe ":alt-prefix" (it "specifies a prefix for all keys" (expect '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z) - :to-bind + :to-expand-into '(general-define-key :non-normal-prefix "a" "x" #'x "y" #'y "z" #'z))) (it "overwrites previous inline :alt-prefix properties" (expect '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z) - :to-bind + :to-expand-into '(progn (general-define-key :non-normal-prefix "a" "x" #'x "y" #'y) (general-define-key :non-normal-prefix "b" "z" #'z)))) (it "accumulates keys when nested" (expect '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x))) - :to-bind + :to-expand-into `(progn (general-define-key :non-normal-prefix "a" "x" #'x) - (general-define-key :non-normal-prefix (general--concat t "a" "b") + (general-define-key :non-normal-prefix (general--concat nil "a" "b") "x" #'x))))) (describe ":textobj" (it "defines keys in evil-{inner,outer}-text-objects-map" (expect '(map! :textobj "a" #'inner #'outer) - :to-bind + :to-expand-into '(map! (:map evil-inner-text-objects-map "a" #'inner) (:map evil-outer-text-objects-map "a" #'outer)))))))) From 9936532ea383697db3814aa078224b0208d4dc86 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 23:16:03 -0500 Subject: [PATCH 3504/4235] Move auth-sources & mc/list-files ...to move appropriate locations. --- core/core.el | 4 +++- modules/config/default/config.el | 6 ++---- modules/editor/multiple-cursors/config.el | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/core.el b/core/core.el index 43eb9adbd..eb7c1d0aa 100644 --- a/core/core.el +++ b/core/core.el @@ -246,11 +246,13 @@ and `doom-exit-window-hook'." ;; compatibility fallbacks "gnutls-cli -p %p %h" "openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof") + ;; Don't store authinfo in plain text! + auth-sources (list (expand-file-name "authinfo.gpg" doom-etc-dir) + "~/.authinfo.gpg") ;; files abbrev-file-name (concat doom-local-dir "abbrev.el") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) - mc/list-file (concat doom-etc-dir "mc-lists.el") pcache-directory (concat doom-cache-dir "pcache/") request-storage-directory (concat doom-cache-dir "request") server-auth-dir (concat doom-cache-dir "server/") diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 4d74aa7f8..af738bf8b 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -1,9 +1,7 @@ ;;; config/default/config.el -*- lexical-binding: t; -*- -;; Don't store authinfo in plain text! -(setq auth-sources - (list (expand-file-name "authinfo.gpg" doom-etc-dir) - "~/.authinfo.gpg")) +;; +;; Reasonable defaults (after! epa (setq epa-file-encrypt-to diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 7fe19db89..9301e689b 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -55,6 +55,8 @@ (def-package! multiple-cursors :defer t :config + (setq mc/list-file (concat doom-etc-dir "mc-lists.el")) + ;; TODO multiple-cursors config for Emacs users? ;; mc doesn't play well with evil, this attempts to assuage some of its From 3f195614d94c7a46876ac4900db2a6ec15e375b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 23:54:27 -0500 Subject: [PATCH 3505/4235] Normalize :leader/:localleader keybinds Evil states no longer apply to them. Also removes x-alt-keysym. --- core/core-os.el | 7 +- modules/editor/parinfer/config.el | 4 +- modules/lang/agda/config.el | 47 +++++----- modules/lang/clojure/config.el | 113 ++++++++++++----------- modules/lang/common-lisp/config.el | 102 ++++++++++----------- modules/lang/csharp/config.el | 41 +++++---- modules/lang/data/config.el | 14 +-- modules/lang/emacs-lisp/config.el | 24 ++--- modules/lang/ess/config.el | 71 +++++++-------- modules/lang/go/autoload.el | 7 ++ modules/lang/go/config.el | 47 +++++----- modules/lang/haskell/+dante.el | 10 +-- modules/lang/haskell/+intero.el | 14 +-- modules/lang/haskell/config.el | 13 ++- modules/lang/idris/config.el | 22 ++--- modules/lang/java/+eclim.el | 44 ++++----- modules/lang/java/+meghanada.el | 20 ++--- modules/lang/javascript/config.el | 56 ++++++------ modules/lang/latex/+ref.el | 2 +- modules/lang/ledger/config.el | 51 +++++------ modules/lang/lua/config.el | 6 +- modules/lang/nim/config.el | 6 +- modules/lang/nix/config.el | 18 ++-- modules/lang/ocaml/config.el | 8 +- modules/lang/org/config.el | 139 +++++++++++++++-------------- modules/lang/php/config.el | 36 ++++---- modules/lang/python/config.el | 42 ++++----- modules/lang/racket/config.el | 54 +++++------ modules/lang/rest/config.el | 6 +- modules/lang/ruby/config.el | 86 +++++++++--------- modules/lang/web/+html.el | 100 ++++++++++----------- modules/tools/ansible/config.el | 6 +- modules/tools/terraform/config.el | 6 +- modules/ui/deft/config.el | 22 ++--- 34 files changed, 626 insertions(+), 618 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 2279e2491..6a45a20d6 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -65,15 +65,14 @@ (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! - x-underline-at-descent-line t ; draw underline lower - x-alt-keysym 'meta)) + x-underline-at-descent-line t)) ; draw underline lower (IS-WINDOWS (setq w32-get-true-file-attributes nil ; fix file io slowdowns - ;; map window keys to super + ;; map window keys to super (unreliable) w32-pass-lwindow-to-system nil - w32-lwindow-modifier 'super w32-pass-rwindow-to-system nil + w32-lwindow-modifier 'super w32-rwindow-modifier 'super) (when (display-graphic-p) (setenv "GIT_ASKPASS" "git-gui--askpass")))) diff --git a/modules/editor/parinfer/config.el b/modules/editor/parinfer/config.el index 42c35dc73..fc24cb37a 100644 --- a/modules/editor/parinfer/config.el +++ b/modules/editor/parinfer/config.el @@ -13,7 +13,7 @@ :config (map! :map parinfer-mode-map "\"" nil ; smartparens handles this - :i "" #'parinfer-smart-tab:dwim-right-or-complete + :i "" #'parinfer-smart-tab:dwim-right-or-complete :i "" #'parinfer-smart-tab:dwim-left :localleader - :nv "m" #'parinfer-toggle-mode)) + :desc "Toggle parinfer-mode" "m" #'parinfer-toggle-mode)) diff --git a/modules/lang/agda/config.el b/modules/lang/agda/config.el index dc21ae25c..0ad69349d 100644 --- a/modules/lang/agda/config.el +++ b/modules/lang/agda/config.el @@ -13,26 +13,27 @@ :config (map! :map agda2-mode-map :localleader - :n "?" #'agda2-show-goals - :n "." #'agda2-goal-and-context-and-inferred - :n "," #'agda2-goal-and-context - :n "=" #'agda2-show-constraints - :n "SPC" #'agda2-give - :n "a" #'agda2-auto - :n "c" #'agda2-make-case - :n "d" #'agda2-infer-type-maybe-toplevel - :n "e" #'agda2-show-context - :n "gG" #'agda2-go-back - :n "h" #'agda2-helper-function-type - :n "l" #'agda2-load - :n "n" #'agda2-compute-normalised-maybe-toplevel - :n "p" #'agda2-module-contents-maybe-toplevel - :n "r" #'agda2-refine - :n "s" #'agda2-solveAll - :n "t" #'agda2-goal-type - :n "w" #'agda2-why-in-scope-maybe-toplevel - :n "xc" #'agda2-compile - :n "xd" #'agda2-remove-annotations - :n "xh" #'agda2-display-implicit-arguments - :n "xq" #'agda2-quit - :n "xr" #'agda2-restart)) + "?" #'agda2-show-goals + "." #'agda2-goal-and-context-and-inferred + "," #'agda2-goal-and-context + "=" #'agda2-show-constraints + "SPC" #'agda2-give + "a" #'agda2-auto + "c" #'agda2-make-case + "d" #'agda2-infer-type-maybe-toplevel + "e" #'agda2-show-context + "gG" #'agda2-go-back + "h" #'agda2-helper-function-type + "l" #'agda2-load + "n" #'agda2-compute-normalised-maybe-toplevel + "p" #'agda2-module-contents-maybe-toplevel + "r" #'agda2-refine + "s" #'agda2-solveAll + "t" #'agda2-goal-type + "w" #'agda2-why-in-scope-maybe-toplevel + (:prefix "x" + "c" #'agda2-compile + "d" #'agda2-remove-annotations + "h" #'agda2-display-implicit-arguments + "q" #'agda2-quit + "r" #'agda2-restart))) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 4768bf219..792182d9e 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -44,64 +44,63 @@ cider-stacktrace-default-filters '(tooling dup)) ;; TODO: Add mode-local labels when general support is in. - (map! :localleader - (:map clojure-mode-map - :n "'" #'cider-jack-in - :n "\"" #'cider-jack-in-clojurescript) - (:map cider-mode-map - ;; eval - (:prefix "e" - :n "d" #'cider-eval-defun-at-point - :n "D" #'cider-insert-defun-in-repl - :n "e" #'cider-eval-last-sexp - :n "E" #'cider-insert-last-sexp-in-repl - :n "r" #'cider-eval-region - :n "R" #'cider-insert-region-in-repl - :n "u" #'cider-undef) - ;; go/jump - (:prefix "g" - :n "b" #'cider-pop-back - :n "g" #'cider-find-var - :n "n" #'cider-find-ns) - ;; help - (:prefix "h" - :n "n" #'cider-find-ns - :n "a" #'cider-apropos - :n "d" #'cider-doc - :n "g" #'cider-grimoire-web - :n "j" #'cider-javadoc) - ;; inspect - (:prefix "i" - :n "i" #'cider-inspect - :n "r" #'cider-inspect-last-result) - ;; macro - (:prefix "m" - :n "e" #'cider-macroexpand-1 - :n "E" #'cider-macroexpand-al) - ;; namespace - (:prefix "n" - :n "n" #'cider-browse-ns - :n "N" #'cider-browse-ns-all) - ;; repl - (:prefix "r" - :n "n" #'cider-repl-set-ns - :n "q" #'cider-quit - :n "r" #'cider-refresh - :n "R" #'cider-restart - :n "b" #'cider-switch-to-repl-buffer - :n "B" #'+clojure/cider-switch-to-repl-buffer-and-switch-ns - :n "c" #'cider-repl-clear-buffer))) + (map! (:localleader + (:map clojure-mode-map + "'" #'cider-jack-in + "\"" #'cider-jack-in-clojurescript) + (:map cider-mode-map + ;; eval + (:prefix "e" + "d" #'cider-eval-defun-at-point + "D" #'cider-insert-defun-in-repl + "e" #'cider-eval-last-sexp + "E" #'cider-insert-last-sexp-in-repl + "r" #'cider-eval-region + "R" #'cider-insert-region-in-repl + "u" #'cider-undef) + ;; go/jump + (:prefix "g" + "b" #'cider-pop-back + "g" #'cider-find-var + "n" #'cider-find-ns) + ;; help + (:prefix "h" + "n" #'cider-find-ns + "a" #'cider-apropos + "d" #'cider-doc + "g" #'cider-grimoire-web + "j" #'cider-javadoc) + ;; inspect + (:prefix "i" + "i" #'cider-inspect + "r" #'cider-inspect-last-result) + ;; macro + (:prefix "m" + "e" #'cider-macroexpand-1 + "E" #'cider-macroexpand-al) + ;; namespace + (:prefix "n" + "n" #'cider-browse-ns + "N" #'cider-browse-ns-all) + ;; repl + (:prefix "r" + "n" #'cider-repl-set-ns + "q" #'cider-quit + "r" #'cider-refresh + "R" #'cider-restart + "b" #'cider-switch-to-repl-buffer + "B" #'+clojure/cider-switch-to-repl-buffer-and-switch-ns + "c" #'cider-repl-clear-buffer))) - (when (featurep! :feature evil +everywhere) - (evil-define-key 'insert cider-repl-mode-map - [S-return] #'cider-repl-newline-and-indent) - (evil-define-key 'normal cider-repl-history-mode-map - "q" 'cider-repl-history-quit - [return] 'cider-repl-history-insert-and-quit - "l" 'cider-repl-history-occur - "s" 'cider-repl-history-search-forward - "r" 'cider-repl-history-search-backward - "U" 'cider-repl-history-undo-other-window))) + (:when (featurep! :feature evil +everywhere) + :map cider-repl-mode-map :i [S-return] #'cider-repl-newline-and-indent + :map cider-repl-history-mode-map + :i [return] #'cider-repl-history-insert-and-quit + :i "q" #'cider-repl-history-quit + :i "l" #'cider-repl-history-occur + :i "s" #'cider-repl-history-search-forward + :i "r" #'cider-repl-history-search-backward + :i "U" #'cider-repl-history-undo-other-window))) (def-package! clj-refactor :hook (clojure-mode . clj-refactor-mode) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index e4ff02331..2bef0db59 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -76,65 +76,65 @@ bin/doom while packages at compile-time (not a runtime though)." (advice-remove #'sly-check-version #'+common-lisp*refresh-sly-version)) (advice-add #'sly-check-version :before #'+common-lisp*refresh-sly-version) - (map! :map sly-mode-map - :localleader - :n "'" #'sly + (map! :localleader + :map sly-mode-map + "'" #'sly (:prefix "g" - :n "b" #'sly-pop-find-definition-stack - :n "d" #'sly-edit-definition - :n "D" #'sly-edit-definition-other-window - :n "n" #'sly-next-note - :n "N" #'sly-previous-note - :n "s" #'sly-stickers-next-sticker - :n "S" #'sly-stickers-prev-sticker) + "b" #'sly-pop-find-definition-stack + "d" #'sly-edit-definition + "D" #'sly-edit-definition-other-window + "n" #'sly-next-note + "N" #'sly-previous-note + "s" #'sly-stickers-next-sticker + "S" #'sly-stickers-prev-sticker) (:prefix "h" - :n "<" #'sly-who-calls - :n ">" #'sly-calls-who - :n "~" #'hyperspec-lookup-format - :n "#" #'hyperspec-lookup-reader-macro - :n "a" #'sly-apropos - :n "b" #'sly-who-binds - :n "d" #'sly-disassemble-symbol - :n "h" #'sly-describe-symbol - :n "H" #'sly-hyperspec-lookup - :n "m" #'sly-who-macroexpands - :n "p" #'sly-apropos-package - :n "r" #'sly-who-references - :n "s" #'sly-who-specializes - :n "S" #'sly-who-sets) + "<" #'sly-who-calls + ">" #'sly-calls-who + "~" #'hyperspec-lookup-format + "#" #'hyperspec-lookup-reader-macro + "a" #'sly-apropos + "b" #'sly-who-binds + "d" #'sly-disassemble-symbol + "h" #'sly-describe-symbol + "H" #'sly-hyperspec-lookup + "m" #'sly-who-macroexpands + "p" #'sly-apropos-package + "r" #'sly-who-references + "s" #'sly-who-specializes + "S" #'sly-who-sets) (:prefix "c" - :n "c" #'sly-compile-file - :n "C" #'sly-compile-and-load-file - :n "f" #'sly-compile-defun - :n "l" #'sly-load-file - :n "n" #'sly-remove-notes - :v "r" #'sly-compile-region) + "c" #'sly-compile-file + "C" #'sly-compile-and-load-file + "f" #'sly-compile-defun + "l" #'sly-load-file + "n" #'sly-remove-notes + "r" #'sly-compile-region) (:prefix "e" - :n "b" #'sly-eval-buffer - :n "e" #'sly-eval-last-expression - :n "E" #'sly-eval-print-last-expression - :n "f" #'sly-eval-defun - :n "F" #'sly-undefine-function - :v "r" #'sly-eval-region) + "b" #'sly-eval-buffer + "e" #'sly-eval-last-expression + "E" #'sly-eval-print-last-expression + "f" #'sly-eval-defun + "F" #'sly-undefine-function + "r" #'sly-eval-region) (:prefix "m" - :n "e" #'+common-lisp/macrostep/body - :n "E" #'macrostep-expand) + "e" #'+common-lisp/macrostep/body + "E" #'macrostep-expand) (:prefix "r" - :n "c" #'sly-mrepl-clear-repl - :n "q" #'sly-quit-lisp - :n "r" #'sly-restart-inferior-lisp - :n "s" #'sly-mrepl-sync) + "c" #'sly-mrepl-clear-repl + "q" #'sly-quit-lisp + "r" #'sly-restart-inferior-lisp + "s" #'sly-mrepl-sync) (:prefix "s" - :n "b" #'sly-stickers-toggle-break-on-stickers - :n "c" #'sly-stickers-clear-defun-stickers - :n "C" #'sly-stickers-clear-buffer-stickers - :n "f" #'sly-stickers-fetch - :n "r" #'sly-stickers-replay - :n "s" #'sly-stickers-dwim) + "b" #'sly-stickers-toggle-break-on-stickers + "c" #'sly-stickers-clear-defun-stickers + "C" #'sly-stickers-clear-buffer-stickers + "f" #'sly-stickers-fetch + "r" #'sly-stickers-replay + "s" #'sly-stickers-dwim) (:prefix "t" - :n "t" #'sly-toggle-trace-fdefinition - :n "T" #'sly-toggle-fancy-trace - :n "u" #'sly-untrace-all)) + "t" #'sly-toggle-trace-fdefinition + "T" #'sly-toggle-fancy-trace + "u" #'sly-untrace-all)) (when (featurep! :feature evil +everywhere) (add-hook 'sly-mode-hook #'evil-normalize-keymaps) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index b12521463..0e38143b1 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -25,30 +25,29 @@ :references #'omnisharp-find-usages :documentation #'omnisharp-current-type-documentation) - (map! :map omnisharp-mode-map - :localleader - :n "b" #'omnisharp-recompile + (map! :localleader + :map omnisharp-mode-map + "b" #'omnisharp-recompile (:prefix "r" - :n "i" #'omnisharp-fix-code-issue-at-point - :n "u" #'omnisharp-fix-usings - :n "r" #'omnisharp-rename - :n "a" #'omnisharp-show-last-auto-complete-result - :n "o" #'omnisharp-show-overloads-at-point) + "i" #'omnisharp-fix-code-issue-at-point + "u" #'omnisharp-fix-usings + "r" #'omnisharp-rename + "a" #'omnisharp-show-last-auto-complete-result + "o" #'omnisharp-show-overloads-at-point) (:prefix "f" - :n "u" #'omnisharp-find-usages - :n "i" #'omnisharp-find-implementations - :n "f" #'omnisharp-navigate-to-current-file-member - :n "m" #'omnisharp-navigate-to-solution-member - :n "M" #'omnisharp-navigate-to-solution-file-then-file-member - :n "F" #'omnisharp-navigate-to-solution-file - :n "r" #'omnisharp-navigate-to-region - :n "ti" #'omnisharp-current-type-information - :n "td" #'omnisharp-current-type-documentation) + "u" #'omnisharp-find-usages + "i" #'omnisharp-find-implementations + "f" #'omnisharp-navigate-to-current-file-member + "m" #'omnisharp-navigate-to-solution-member + "M" #'omnisharp-navigate-to-solution-file-then-file-member + "F" #'omnisharp-navigate-to-solution-file + "r" #'omnisharp-navigate-to-region + "ti" #'omnisharp-current-type-information + "td" #'omnisharp-current-type-documentation) (:prefix "t" - :n "r" (λ! (omnisharp-unit-test "fixture")) - :n "s" (λ! (omnisharp-unit-test "single")) - :n "a" (λ! (omnisharp-unit-test "all"))))) - + "r" (λ! (omnisharp-unit-test "fixture")) + "s" (λ! (omnisharp-unit-test "single")) + "a" (λ! (omnisharp-unit-test "all"))))) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 1a7378093..9c7f6c204 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -14,14 +14,14 @@ ;; `csv-mode' (map! :after csv-mode - :map csv-mode-map :localleader - :nvm "a" #'csv-align-fields - :nvm "u" #'csv-unalign-fields - :nvm "s" #'csv-sort-fields - :nvm "S" #'csv-sort-numeric-fields - :nvm "k" #'csv-kill-fields - :nvm "t" #'csv-transpose) + :map csv-mode-map + "a" #'csv-align-fields + "u" #'csv-unalign-fields + "s" #'csv-sort-fields + "S" #'csv-sort-numeric-fields + "k" #'csv-kill-fields + "t" #'csv-transpose) (def-package! graphql-mode :mode "\\.gql\\'") diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 5c02080df..3539f6279 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -81,21 +81,21 @@ (when (featurep! :feature evil) (after! macrostep (evil-define-key* 'normal macrostep-keymap - (kbd "RET") #'macrostep-expand - "e" #'macrostep-expand - "u" #'macrostep-collapse - "c" #'macrostep-collapse + [return] #'macrostep-expand + "e" #'macrostep-expand + "u" #'macrostep-collapse + "c" #'macrostep-collapse - [tab] #'macrostep-next-macro - "\C-n" #'macrostep-next-macro - "J" #'macrostep-next-macro + [tab] #'macrostep-next-macro + "\C-n" #'macrostep-next-macro + "J" #'macrostep-next-macro - [backtab] #'macrostep-prev-macro - "K" #'macrostep-prev-macro - "\C-p" #'macrostep-prev-macro + [backtab] #'macrostep-prev-macro + "K" #'macrostep-prev-macro + "\C-p" #'macrostep-prev-macro - "q" #'macrostep-collapse-all - "C" #'macrostep-collapse-all) + "q" #'macrostep-collapse-all + "C" #'macrostep-collapse-all) ;; `evil-normalize-keymaps' seems to be required for macrostep or it won't ;; apply for the very first invocation diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 901b65b16..201bda523 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -17,41 +17,42 @@ (set-repl-handler! 'ess-mode #'+ess/r-repl) (set-lookup-handlers! 'ess-mode :documentation #'ess-display-help-on-object) - (after! ess-help - (define-key! ess-doc-map - "h" #'ess-display-help-on-object - "p" #'ess-R-dv-pprint - "t" #'ess-R-dv-ctable) - (define-key! ess-doc-map - [s-return] #'ess-eval-line - [up] #'comint-next-input - [down] #'comint-previous-input)) - (map! :map ess-mode-map + (map! (:after ess-help + :map ess-doc-map + "h" #'ess-display-help-on-object + "p" #'ess-R-dv-pprint + "t" #'ess-R-dv-ctable + [C-return] #'ess-eval-line + [up] #'comint-next-input + [down] #'comint-previous-input) + :localleader - :nv "," #'ess-eval-region-or-function-or-paragraph-and-step - :n "'" #'R - :n "" #'ess-switch-to-inferior-or-script-buffer - :n "" #'ess-switch-process - :n ;; REPL - :n "B" #'ess-eval-buffer-and-go - :n "b" #'ess-eval-buffer - :nv "d" #'ess-eval-region-or-line-and-step - :n "D" #'ess-eval-function-or-paragraph-and-step - :n "L" #'ess-eval-line-and-go - :n "l" #'ess-eval-line - :nv "R" #'ess-eval-region-and-go - :nv "r" #'ess-eval-region - :n "F" #'ess-eval-function-and-go - :n "f" #'ess-eval-function + :map ess-mode-map + "," #'ess-eval-region-or-function-or-paragraph-and-step + "'" #'R + [tab] #'ess-switch-to-inferior-or-script-buffer + [backtab] #'ess-switch-process + ;; REPL + "B" #'ess-eval-buffer-and-go + "b" #'ess-eval-buffer + "d" #'ess-eval-region-or-line-and-step + "D" #'ess-eval-function-or-paragraph-and-step + "L" #'ess-eval-line-and-go + "l" #'ess-eval-line + "R" #'ess-eval-region-and-go + "r" #'ess-eval-region + "F" #'ess-eval-function-and-go + "f" #'ess-eval-function ;; predefined keymaps - :n "h" #'ess-doc-map - :n "x" #'ess-extra-map - :n "p" #'ess-r-package-dev-map - :n "v" #'ess-dev-map + "h" #'ess-doc-map + "x" #'ess-extra-map + "p" #'ess-r-package-dev-map + "v" #'ess-dev-map ;; noweb - :n "cC" #'ess-eval-chunk-and-go - :n "cc" #'ess-eval-chunk - :n "cd" #'ess-eval-chunk-and-step - :n "cm" #'ess-noweb-mark-chunk - :n "cp" #'ess-noweb-previous-chunk - :n "cn" #'ess-noweb-next-chunk)) + :prefix "c" + "C" #'ess-eval-chunk-and-go + "c" #'ess-eval-chunk + "d" #'ess-eval-chunk-and-step + "m" #'ess-noweb-mark-chunk + "p" #'ess-noweb-previous-chunk + "n" #'ess-noweb-next-chunk)) diff --git a/modules/lang/go/autoload.el b/modules/lang/go/autoload.el index 83bfb3d96..8ef830833 100644 --- a/modules/lang/go/autoload.el +++ b/modules/lang/go/autoload.el @@ -37,3 +37,10 @@ (+go--run-tests (concat "-run" "='" (match-string-no-properties 2) "'"))) (error "Must be in a _test.go file"))) +;;;###autoload +(defun +go/play-buffer-or-region (&optional beg end) + "TODO" + (interactive "r") + (if (use-region-p) + (go-play-region beg end) + (go-play-buffer))) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 3ca9ab344..c350d3fe1 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -24,33 +24,32 @@ (map! :map go-mode-map :localleader - :n "e" #'go-play-buffer - :v "e" #'go-play-region - :n "i" #'go-goto-imports ; Go to imports + "e" #'+go/play-buffer-or-region + "i" #'go-goto-imports ; Go to imports (:prefix "h" - :n "." #'godoc-at-point ; Lookup in godoc - :n "d" #'go-guru-describe ; Describe this - :n "v" #'go-guru-freevars ; List free variables - :n "i" #'go-guru-implements ; Implements relations for package types - :n "p" #'go-guru-peers ; List peers for channel - :n "P" #'go-guru-pointsto ; What does this point to - :n "r" #'go-guru-referrers ; List references to object - :n "e" #'go-guru-whicherrs ; Which errors - :n "w" #'go-guru-what ; What query - :n "c" #'go-guru-callers ; Show callers of this function - :n "C" #'go-guru-callees) ; Show callees of this function - (:prefix "r" - :n "ia" #'go-import-add - :n "ir" #'go-remove-unused-imports) + "." #'godoc-at-point ; Lookup in godoc + "d" #'go-guru-describe ; Describe this + "v" #'go-guru-freevars ; List free variables + "i" #'go-guru-implements ; Implements relations for package types + "p" #'go-guru-peers ; List peers for channel + "P" #'go-guru-pointsto ; What does this point to + "r" #'go-guru-referrers ; List references to object + "e" #'go-guru-whicherrs ; Which errors + "w" #'go-guru-what ; What query + "c" #'go-guru-callers ; Show callers of this function + "C" #'go-guru-callees) ; Show callees of this function + (:prefix "ri" + "a" #'go-import-add + "r" #'go-remove-unused-imports) (:prefix "b" - :n "r" (λ! (compile "go run .")) - :n "b" (λ! (compile "go build")) - :n "c" (λ! (compile "go clean"))) + :desc "go run ." "r" (λ! (compile "go run .")) + :desc "go build" "b" (λ! (compile "go build")) + :desc "go clean" "c" (λ! (compile "go clean"))) (:prefix "t" - :n "t" #'+go/test-rerun - :n "a" #'+go/test-all - :n "s" #'+go/test-single - :n "n" #'+go/test-nested))) + "t" #'+go/test-rerun + "a" #'+go/test-all + "s" #'+go/test-single + "n" #'+go/test-nested))) (def-package! gorepl-mode diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 5362bbd31..b4af5d773 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -21,8 +21,8 @@ (add-hook 'dante-mode-hook #'evil-normalize-keymaps)) (map! :map dante-mode-map :localleader - :n "t" #'dante-type-at - :n "i" #'dante-info - :n "l" #'haskell-process-load-or-reload - :n "e" #'dante-eval-block - :n "a" #'attrap-attrap)) + "t" #'dante-type-at + "i" #'dante-info + "l" #'haskell-process-load-or-reload + "e" #'dante-eval-block + "a" #'attrap-attrap)) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 7ecf65e57..9f6c3b4cf 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -21,10 +21,10 @@ This is necessary because `intero-mode' doesn't do its own error checks." (when (featurep 'evil) (add-hook 'intero-mode-hook #'evil-normalize-keymaps)) - (map! :map intero-mode-map - :localleader - :n "t" #'intero-type-at - :n "i" #'intero-info - :n "l" #'intero-repl-load - :nv "e" #'intero-repl-eval-region - :n "a" #'intero-apply-suggestions)) + (map! :localleader + :map intero-mode-map + "t" #'intero-type-at + "i" #'intero-info + "l" #'intero-repl-load + "e" #'intero-repl-eval-region + "a" #'intero-apply-suggestions)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 2a608cda9..ec1c8cbee 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -21,11 +21,10 @@ (add-to-list 'completion-ignored-extensions ".hi") - (map! :map haskell-mode-map - :localleader + (map! :localleader + :map haskell-mode-map ;; this is set to use cabal for dante users and stack for intero users: - :n "b" #'haskell-process-cabal-build - :n "c" #'haskell-cabal-visit-file - :v "h" #'haskell-hide-toggle - :nv "H" #'haskell-hide-toggle-all)) - + "b" #'haskell-process-cabal-build + "c" #'haskell-cabal-visit-file + "h" #'haskell-hide-toggle + "H" #'haskell-hide-toggle-all)) diff --git a/modules/lang/idris/config.el b/modules/lang/idris/config.el index 2f5b5b8cb..cd56fb071 100644 --- a/modules/lang/idris/config.el +++ b/modules/lang/idris/config.el @@ -6,14 +6,14 @@ (set-lookup-handlers! 'idris-mode :documentation #'idris-docs-at-point :file #'idris-load-file) - (map! :map idris-mode-map - :localleader - :n "r" #'idris-load-file - :n "t" #'idris-type-at-point - :n "d" #'idris-add-clause - :n "l" #'idris-make-lemma - :n "c" #'idris-case-split - :n "w" #'idris-make-with-block - :n "m" #'idris-add-missing - :n "p" #'idris-proof-search - :n "h" #'idris-docs-at-point)) + (map! :localleader + :map idris-mode-map + "r" #'idris-load-file + "t" #'idris-type-at-point + "d" #'idris-add-clause + "l" #'idris-make-lemma + "c" #'idris-case-split + "w" #'idris-make-with-block + "m" #'idris-add-missing + "p" #'idris-proof-search + "h" #'idris-docs-at-point)) diff --git a/modules/lang/java/+eclim.el b/modules/lang/java/+eclim.el index b96060cc2..df30de7bb 100644 --- a/modules/lang/java/+eclim.el +++ b/modules/lang/java/+eclim.el @@ -16,31 +16,31 @@ help-at-pt-timer-delay 0.1) (help-at-pt-set-timer) - (map! :map java-mode-map - :localleader + (map! :localleader + :map java-mode-map (:prefix "r" - :n "gc" #'eclim-java-constructor - :n "gg" #'eclim-java-generate-getter-and-setter - :n "oi" #'eclim-java-import-organize - :n "f" #'eclim-java-format - :n "r" #'eclim-java-refactor-rename-symbol-at-point) + "gc" #'eclim-java-constructor + "gg" #'eclim-java-generate-getter-and-setter + "oi" #'eclim-java-import-organize + "f" #'eclim-java-format + "r" #'eclim-java-refactor-rename-symbol-at-point) (:prefix "h" - :n "." #'eclim-java-show-documentation-for-current-element - :n "r" #'eclim-java-find-references - :n "c" #'eclim-java-call-hierarchy - :n "h" #'eclim-java-hierarchy - :n "p" #'eclim-problems - :n "r" #'meghanada-reference - :n "t" #'meghanada-typeinfo) + "." #'eclim-java-show-documentation-for-current-element + "r" #'eclim-java-find-references + "c" #'eclim-java-call-hierarchy + "h" #'eclim-java-hierarchy + "p" #'eclim-problems + "r" #'meghanada-reference + "t" #'meghanada-typeinfo) (:prefix "b" - :n "b" #'eclim-project-build - :n "c" #'eclim-project-create - :n "d" #'eclim-project-delete - :n "g" #'eclim-project-goto - :n "i" #'eclim-project-import - :n "k" #'eclim-project-close - :n "o" #'eclim-project-open - :n "u" #'eclim-project-update))) + "b" #'eclim-project-build + "c" #'eclim-project-create + "d" #'eclim-project-delete + "g" #'eclim-project-goto + "i" #'eclim-project-import + "k" #'eclim-project-close + "o" #'eclim-project-open + "u" #'eclim-project-update))) (def-package! company-emacs-eclim diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 9e533c141..0a0aa74f7 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -14,16 +14,16 @@ :definition #'meghanada-jump-declaration :references #'meghanada-reference) - (map! :map java-mode-map - :localleader + (map! :localleader + :map java-mode-map (:prefix "r" - :n "ia" #'meghanada-import-all - :n "io" #'meghanada-optimize-import - :n "l" #'meghanada-local-variable - :n "f" #'meghanada-code-beautify) + "ia" #'meghanada-import-all + "io" #'meghanada-optimize-import + "l" #'meghanada-local-variable + "f" #'meghanada-code-beautify) (:prefix "h" - :n "r" #'meghanada-reference - :n "t" #'meghanada-typeinfo) + "r" #'meghanada-reference + "t" #'meghanada-typeinfo) (:prefix "b" - :n "f" #'meghanada-compile-file - :n "p" #'meghanada-compile-project))) + "f" #'meghanada-compile-file + "p" #'meghanada-compile-project))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 367c07407..c01b837af 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -54,7 +54,7 @@ (map! :map js2-mode-map :localleader - :n "S" #'+javascript/skewer-this-buffer)) + "S" #'+javascript/skewer-this-buffer)) (def-package! rjsx-mode @@ -156,12 +156,12 @@ (add-hook! 'tide-mode-hook (add-hook 'kill-buffer-hook #'+javascript|cleanup-tide-processes nil t)) - (map! :map tide-mode-map - :localleader - :n "R" #'tide-restart-server - :n "f" #'tide-reformat - :n "rs" #'tide-rename-symbol - :n "roi" #'tide-organize-imports)) + (map! :localleader + :map tide-mode-map + "R" #'tide-restart-server + "f" #'tide-reformat + "rs" #'tide-rename-symbol + "roi" #'tide-organize-imports)) (def-package! xref-js2 @@ -189,39 +189,39 @@ ;; `skewer-mode' -(map! (:after skewer-mode +(map! :localleader + :prefix "s" + (:after skewer-mode :map skewer-mode-map - :localleader - :n "sE" #'skewer-eval-last-expression - :n "se" #'skewer-eval-defun - :n "sf" #'skewer-load-buffer) + "E" #'skewer-eval-last-expression + "e" #'skewer-eval-defun + "f" #'skewer-load-buffer) (:after skewer-css :map skewer-css-mode-map - :localleader - :n "se" #'skewer-css-eval-current-declaration - :n "sr" #'skewer-css-eval-current-rule - :n "sb" #'skewer-css-eval-buffer - :n "sc" #'skewer-css-clear-all) + "e" #'skewer-css-eval-current-declaration + "r" #'skewer-css-eval-current-rule + "b" #'skewer-css-eval-buffer + "c" #'skewer-css-clear-all) (:after skewer-html :map skewer-html-mode-map - :localleader - :n "se" #'skewer-html-eval-tag)) + "e" #'skewer-html-eval-tag)) ;; `npm-mode' (map! :after npm-mode - :map npm-mode-keymap :localleader - :n "nn" #'npm-mode-npm-init - :n "ni" #'npm-mode-npm-install - :n "ns" #'npm-mode-npm-install-save - :n "nd" #'npm-mode-npm-install-save-dev - :n "nu" #'npm-mode-npm-uninstall - :n "nl" #'npm-mode-npm-list - :n "nr" #'npm-mode-npm-run - :n "nv" #'npm-mode-visit-project-file) + :map npm-mode-keymap + :prefix "n" + "n" #'npm-mode-npm-init + "i" #'npm-mode-npm-install + "s" #'npm-mode-npm-install-save + "d" #'npm-mode-npm-install-save-dev + "u" #'npm-mode-npm-uninstall + "l" #'npm-mode-npm-list + "r" #'npm-mode-npm-run + "v" #'npm-mode-visit-project-file) ;; diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 75136a077..c4b19f251 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -21,7 +21,7 @@ (when +latex-bibtex-file (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (map! :map reftex-mode-map - :localleader :n ";" 'reftex-toc) + :localleader ";" 'reftex-toc) (add-hook! 'reftex-toc-mode-hook (reftex-toc-rescan) (map! :map 'local diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index 700d127da..a5ec20d0f 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -11,13 +11,13 @@ (advice-add #'ledger-check-version :around #'+ledger*check-version) ;; Restore leader key in ledger reports -(after! ledger-mode - (define-key! ledger-report-mode-map - (kbd "C-c C-c") #'ledger-report-edit-report - (kbd "C-c C-r") #'ledger-report-redo - (kbd "C-c C-s") #'ledger-report-save) - (define-key ledger-reconcile-mode-map - [tab] #'ledger-reconcile-toggle)) +(map! :after ledger-mode + :map ledger-report-mode-map + "C-c C-c" #'ledger-report-edit-report + "C-c C-r" #'ledger-report-redo + "C-c C-s" #'ledger-report-save + :map ledger-reconcile-mode-map + [tab] #'ledger-reconcile-toggle) (def-package! flycheck-ledger @@ -30,26 +30,27 @@ :hook (ledger-mode . evil-ledger-mode) :config (set-evil-initial-state! 'ledger-report-mode 'normal) - (evil-define-key* 'normal ledger-report-mode-map - "q" #'ledger-report-quit - "RET" #'ledger-report-edit-report - "gd" #'ledger-report-visit-source - "gr" #'ledger-report-redo) - (evil-define-key* 'motion ledger-mode-map - "]]" #'ledger-navigate-next-xact-or-directive - "[[" #'ledger-navigate-prev-xact-or-directive) - (map! :map ledger-mode-map + (map! :map ledger-report-mode-map + :n "q" #'ledger-report-quit + :n "RET" #'ledger-report-edit-report + :n "gd" #'ledger-report-visit-source + :n "gr" #'ledger-report-redo + :map ledger-mode-map + :m "]]" #'ledger-navigate-next-xact-or-directive + :m "[[" #'ledger-navigate-prev-xact-or-directive + :localleader - :n "a" #'ledger-add-transaction - :n "t" #'ledger-toggle-current - :n "d" #'ledger-delete-current-transaction - :n "r" #'ledger-report - :n "R" #'ledger-reconcile - :n "S" #'ledger-schedule-upcoming - :v "s" #'ledger-sort-region + :map ledger-mode-map + "a" #'ledger-add-transaction + "t" #'ledger-toggle-current + "d" #'ledger-delete-current-transaction + "r" #'ledger-report + "R" #'ledger-reconcile + "s" #'ledger-sort-region + "S" #'ledger-schedule-upcoming (:prefix "g" - :n "s" #'ledger-display-ledger-stats - :n "b" #'ledger-display-balance-at-point)) + "s" #'ledger-display-ledger-stats + "b" #'ledger-display-balance-at-point)) ;; Fix inaccurate keybind message (defun +ledger*fix-key-help (&rest _) (message "q to quit; gr to redo; RET to edit; C-c C-s to save")) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index a951c3067..5d0016ee9 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -22,6 +22,6 @@ :modes (lua-mode markdown-mode json-mode) :files (and "main.lua" "conf.lua") :on-load - (map! :map +lua-love-mode-map - :localleader - :n "b" #'+lua/run-love-game)) + (map! :localleader + :map +lua-love-mode-map + "b" #'+lua/run-love-game)) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index 22db62b9e..f5f960467 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -31,9 +31,9 @@ windows." (replace-regexp-in-string "[꞉* |<>\"?*]" "" path)) (advice-add #'nimsuggest--get-temp-file-name :filter-return #'doom*nimsuggest--get-temp-file-name)) - (map! :map nim-mode-map - :localleader - :n "b" #'nim-compile)) + (map! :localleader + :map nim-mode-map + "b" #'nim-compile)) (def-package! flycheck-nim diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index ca0ea6adc..805edff45 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -5,16 +5,16 @@ :config (set-company-backend! 'nix-mode 'company-nixos-options) - (map! :map nix-mode-map - :localleader - :n "f" #'nix-update-fetch - :n "p" #'nix-format-buffer - :n "r" #'nix-repl-show - :n "s" #'nix-shell - :n "b" #'nix-build - :n "u" #'nix-unpack + (map! :localleader + :map nix-mode-map + "f" #'nix-update-fetch + "p" #'nix-format-buffer + "r" #'nix-repl-show + "s" #'nix-shell + "b" #'nix-build + "u" #'nix-unpack (:when (featurep! :completion helm) - :n "o" #'helm-nixos-options))) + "o" #'helm-nixos-options))) (def-package! nix-drv-mode :mode "\\.drv\\'") diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index adc3347c7..f5a5df757 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -34,10 +34,10 @@ :config (setq merlin-completion-with-doc t) - (map! :map tuareg-mode-map - :localleader - :n "t" #'merlin-type-enclosing - :n "a" #'tuareg-find-alternate-file)) + (map! :localleader + :map tuareg-mode-map + "t" #'merlin-type-enclosing + "a" #'tuareg-find-alternate-file)) (def-package! flycheck-ocaml diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b42ceb1d4..0ba5e6a06 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -339,74 +339,77 @@ between the two." (advice-add #'evil-org-open-below :around #'+org*evil-org-open-below) ;; Undo keybinds in `evil-collection-outline' - (evil-define-key* 'normal outline-mode-map - "^" nil - [backtab] nil - "\M-j" nil "\M-k" nil - "\C-j" nil "\C-k" nil - "]" nil "[" nil) - (evil-define-key* 'insert evil-org-mode-map - ;; dedent with shift-tab in insert mode - [backtab] #'+org/dedent - ;; navigate table cells (from insert-mode) - "\C-l" #'+org/table-next-field - "\C-h" #'+org/table-previous-field - "\C-k" #'+org/table-previous-row - "\C-j" #'+org/table-next-row) - ;; expand tables or move fields - (evil-define-key* '(insert normal) evil-org-mode-map - (kbd "C-S-l") #'+org/table-append-field-or-shift-right - (kbd "C-S-h") #'+org/table-prepend-field-or-shift-left - (kbd "C-S-k") #'org-metaup - (kbd "C-S-j") #'org-metadown) - ;; more intuitive RET keybinds - (evil-define-key* 'insert evil-org-mode-map - [return] #'org-return-indent) - (evil-define-key* 'normal evil-org-mode-map - [return] #'+org/dwim-at-point) - (evil-define-key* '(insert normal) evil-org-mode-map - [M-return] (λ! (+org/insert-item 'below)) - [S-M-return] (λ! (+org/insert-item 'above))) - ;; more vim-esque org motion keys - (evil-define-key* 'motion evil-org-mode-map - "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) - "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) - "]h" #'org-next-visible-heading - "[h" #'org-previous-visible-heading - "]l" #'org-next-link - "[l" #'org-previous-link - "]s" #'org-babel-next-src-block - "[s" #'org-babel-previous-src-block - "^" #'evil-org-beginning-of-line - "0" (λ! (let (visual-line-mode) (org-beginning-of-line)))) - (evil-define-key* 'normal evil-org-mode-map - "gQ" #'org-fill-paragraph - ;; sensible vim-esque folding keybinds - "za" #'+org/toggle-fold - "zA" #'org-shifttab - "zc" #'+org/close-fold - "zC" #'outline-hide-subtree - "zm" #'+org/hide-next-fold-level - "zo" #'+org/open-fold - "zO" #'outline-show-subtree - "zr" #'+org/show-next-fold-level - "zR" #'outline-show-all) - ;; - (map! :map evil-org-mode-map - :localleader - :n "d" #'org-deadline - :n "t" #'org-todo - (:prefix "c" - :n "c" #'org-clock-in - :n "C" #'org-clock-out - :n "g" #'org-clock-goto - :n "G" (λ! (org-clock-goto 'select)) - :n "x" #'org-clock-cancel)) - (map! :map org-read-date-minibuffer-local-map - "C-h" (λ! (org-eval-in-calendar '(calendar-backward-day 1))) - "C-l" (λ! (org-eval-in-calendar '(calendar-forward-day 1))) - "C-k" (λ! (org-eval-in-calendar '(calendar-backward-week 1))) - "C-j" (λ! (org-eval-in-calendar '(calendar-forward-week 1))) + (map! :map outline-mode-map + :n "^" nil + :n [backtab] nil + :n "M-j" nil + :n "M-k" nil + :n "C-j" nil + :n "C-k" nil + :n "]" nil + :n "[" nil + + :map evil-org-mode-map + ;; dedent with shift-tab in insert mode + :i [backtab] #'+org/dedent + ;; navigate table cells (from insert-mode) + :i "C-l" #'+org/table-next-field + :i "C-h" #'+org/table-previous-field + :i "C-k" #'+org/table-previous-row + :i "C-j" #'+org/table-next-row + ;; expand tables or move fields + :ni "C-S-l" #'+org/table-append-field-or-shift-right + :ni "C-S-h" #'+org/table-prepend-field-or-shift-left + :ni "C-S-k" #'org-metaup + :ni "C-S-j" #'org-metadown + ;; more intuitive RET keybinds + :i [return] #'org-return-indent + :n [return] #'+org/dwim-at-point + :nv [C-return] (λ! (+org/insert-item 'below)) + :nv [S-C-return] (λ! (+org/insert-item 'below)) + (:when IS-MAC + ;; textmate-esque newline insertion + :nv [s-return] (λ! (+org/insert-item 'below)) + :nv [S-s-return] (λ! (+org/insert-item 'below))) + ;; more vim-esque org motion keys (not covered by evil-org-mode) + :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) + :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) + :m "]h" #'org-next-visible-heading + :m "[h" #'org-previous-visible-heading + :m "]l" #'org-next-link + :m "[l" #'org-previous-link + :m "]s" #'org-babel-next-src-block + :m "[s" #'org-babel-previous-src-block + :m "^" #'evil-org-beginning-of-line + :m "0" (λ! (let (visual-line-mode) (org-beginning-of-line))) + :n "gQ" #'org-fill-paragraph + ;; sensible vim-esque folding keybinds + :n "za" #'+org/toggle-fold + :n "zA" #'org-shifttab + :n "zc" #'+org/close-fold + :n "zC" #'outline-hide-subtree + :n "zm" #'+org/hide-next-fold-level + :n "zo" #'+org/open-fold + :n "zO" #'outline-show-subtree + :n "zr" #'+org/show-next-fold-level + :n "zR" #'outline-show-all + + ;; + (:localleader + "d" #'org-deadline + "t" #'org-todo + (:prefix "c" + "c" #'org-clock-in + "C" #'org-clock-out + "g" #'org-clock-goto + "G" (λ! (org-clock-goto 'select)) + "x" #'org-clock-cancel)) + + :map org-read-date-minibuffer-local-map + "C-h" (λ! (org-eval-in-calendar '(calendar-backward-day 1))) + "C-l" (λ! (org-eval-in-calendar '(calendar-forward-day 1))) + "C-k" (λ! (org-eval-in-calendar '(calendar-backward-week 1))) + "C-j" (λ! (org-eval-in-calendar '(calendar-forward-week 1))) "C-S-h" (λ! (org-eval-in-calendar '(calendar-backward-month 1))) "C-S-l" (λ! (org-eval-in-calendar '(calendar-forward-month 1))) "C-S-k" (λ! (org-eval-in-calendar '(calendar-backward-year 1))) diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index 90fa3be46..c14f73f6d 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -23,12 +23,12 @@ (sp-local-pair "" :post-handlers '(("| " "SPC" "=") ("||\n[i]" "RET") ("[d2]" "p"))) (sp-local-pair "" :post-handlers '(("| " "SPC") ("||\n[i]" "RET")))) - (map! :map php-mode-map - :localleader + (map! :localleader + :map php-mode-map :prefix "t" - :n "r" #'phpunit-current-project - :n "a" #'phpunit-current-class - :n "s" #'phpunit-current-test)) + "r" #'phpunit-current-project + "a" #'phpunit-current-class + "s" #'phpunit-current-test)) (def-package! phpactor @@ -53,26 +53,26 @@ default-directory))) (advice-add #'phpactor-get-working-dir :before #'+php*project-root) - (map! :map php-mode-map - :localleader + (map! :localleader + :map php-mode-map :prefix "r" - :n "cc" #'phpactor-copy-class - :n "mc" #'phpactor-move-class - :v "oi" #'phpactor-offset-info - :n "t" #'phpactor-transform - :n "ic" #'phpactor-import-class)) + "cc" #'phpactor-copy-class + "mc" #'phpactor-move-class + "oi" #'phpactor-offset-info + "t" #'phpactor-transform + "ic" #'phpactor-import-class)) (def-package! php-refactor-mode :hook php-mode :config - (map! :map php-refactor-mode-map - :localleader + (map! :localleader + :map php-refactor-mode-map :prefix "r" - :n "cv" #'php-refactor--convert-local-to-instance-variable - :n "u" #'php-refactor--optimize-use - :v "xm" #'php-refactor--extract-method - :n "rv" #'php-refactor--rename-local-variable)) + "cv" #'php-refactor--convert-local-to-instance-variable + "u" #'php-refactor--optimize-use + "xm" #'php-refactor--extract-method + "rv" #'php-refactor--rename-local-variable)) (def-package! php-extras diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 5d31fa9a2..681486b91 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -87,14 +87,14 @@ called.") (when (featurep 'evil) (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps)) - (map! :map anaconda-mode-map - :localleader + (map! :localleader + :map anaconda-mode-map :prefix "f" - :nv "d" #'anaconda-mode-find-definitions - :nv "h" #'anaconda-mode-show-doc - :nv "a" #'anaconda-mode-find-assignments - :nv "f" #'anaconda-mode-find-file - :nv "u" #'anaconda-mode-find-references)) + "d" #'anaconda-mode-find-definitions + "h" #'anaconda-mode-show-doc + "a" #'anaconda-mode-find-assignments + "f" #'anaconda-mode-find-file + "u" #'anaconda-mode-find-references)) (def-package! nose @@ -107,29 +107,29 @@ called.") (when (featurep 'evil) (add-hook 'nose-mode-hook #'evil-normalize-keymaps)) - (map! :map nose-mode-map - :localleader + (map! :localleader + :map nose-mode-map :prefix "t" - :n "r" #'nosetests-again - :n "a" #'nosetests-all - :n "s" #'nosetests-one - :n "v" #'nosetests-module - :n "A" #'nosetests-pdb-all - :n "O" #'nosetests-pdb-one - :n "V" #'nosetests-pdb-module)) + "r" #'nosetests-again + "a" #'nosetests-all + "s" #'nosetests-one + "v" #'nosetests-module + "A" #'nosetests-pdb-all + "O" #'nosetests-pdb-one + "V" #'nosetests-pdb-module)) (def-package! python-pytest :defer t :init (map! :after python - :map python-mode-map :localleader + :map python-mode-map :prefix "t" - :nv "f" #'python-pytest-file - :nv "k" #'python-pytest-file-dwim - :nv "m" #'python-pytest-repeat - :nv "p" #'python-pytest-popup)) + "f" #'python-pytest-file + "k" #'python-pytest-file-dwim + "m" #'python-pytest-repeat + "p" #'python-pytest-popup)) ;; diff --git a/modules/lang/racket/config.el b/modules/lang/racket/config.el index 6f86bc3f9..7359baebb 100644 --- a/modules/lang/racket/config.el +++ b/modules/lang/racket/config.el @@ -20,33 +20,33 @@ (add-hook! racket-mode #'(rainbow-delimiters-mode highlight-quoted-mode)) - (map! :map racket-mode-map - :localleader - :n "a" #'racket-align - :n "A" #'racket-unalign - :n "f" #'racket-fold-all-tests - :n "F" #'racket-unfold-all-tests - :n "h" #'racket-doc - :n "i" #'racket-unicode-input-method-enable - :n "l" #'racket-logger - :n "o" #'racket-profile - :n "p" #'racket-cycle-paren-shapes - :n "r" #'racket-run - :n "R" #'racket-run-and-switch-to-repl - :n "t" #'racket-test - :n "u" #'racket-backward-up-list - :n "y" #'racket-insert-lambda + (map! :localleader + :map racket-mode-map + "a" #'racket-align + "A" #'racket-unalign + "f" #'racket-fold-all-tests + "F" #'racket-unfold-all-tests + "h" #'racket-doc + "i" #'racket-unicode-input-method-enable + "l" #'racket-logger + "o" #'racket-profile + "p" #'racket-cycle-paren-shapes + "r" #'racket-run + "R" #'racket-run-and-switch-to-repl + "t" #'racket-test + "u" #'racket-backward-up-list + "y" #'racket-insert-lambda (:prefix "e" - :n "d" #'racket-expand-definition - :n "l" #'racket-expand-last-sexp - :n "r" #'racket-expand-region - :n "a" #'racket-expand-again) + "d" #'racket-expand-definition + "l" #'racket-expand-last-sexp + "r" #'racket-expand-region + "a" #'racket-expand-again) (:prefix "g" - :n "d" #'racket-visit-definition - :n "m" #'racket-visit-module - :n "r" #'racket-open-require-path - :n "b" #'racket-unvisit) + "d" #'racket-visit-definition + "m" #'racket-visit-module + "r" #'racket-open-require-path + "b" #'racket-unvisit) (:prefix "s" - :n "d" #'racket-send-definition - :n "l" #'racket-send-last-sexp - :n "r" #'racket-send-region))) + "d" #'racket-send-definition + "l" #'racket-send-last-sexp + "r" #'racket-send-region))) diff --git a/modules/lang/rest/config.el b/modules/lang/rest/config.el index 014840039..a9b3d67e2 100644 --- a/modules/lang/rest/config.el +++ b/modules/lang/rest/config.el @@ -22,9 +22,9 @@ :n "zr" #'outline-show-all :localleader - :n "e" #'restclient-http-send-current - :n "E" #'restclient-http-send-current-raw - :n "c" #'restclient-copy-curl-command)) + "e" #'restclient-http-send-current + "E" #'restclient-http-send-current-raw + "c" #'restclient-copy-curl-command)) (def-package! company-restclient diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 9db3e7fd6..16eb2cbff 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -51,17 +51,17 @@ :documentation #'robe-doc) (map! :localleader :map robe-mode-map - :n "'" #'robe-start + "'" #'robe-start ;; robe mode specific - :n "h" #'robe-doc - :n "rr" #'robe-rails-refresh + "h" #'robe-doc + "rr" #'robe-rails-refresh ;; inf-enh-ruby-mode :prefix "s" - :n "f" #'ruby-send-definition - :n "F" #'ruby-send-definition-and-go - :n "r" #'ruby-send-region - :n "R" #'ruby-send-region-and-go - :n "i" #'ruby-switch-to-inf)) + "f" #'ruby-send-definition + "F" #'ruby-send-definition-and-go + "r" #'ruby-send-region + "R" #'ruby-send-region-and-go + "i" #'ruby-switch-to-inf)) ;; NOTE Must be loaded before `robe-mode' @@ -72,12 +72,12 @@ (def-package! rubocop :hook (enh-ruby-mode . rubocop-mode) :config - (map! :map rubocop-mode-map - :localleader - :nv "f" #'rubocop-check-current-file - :nv "F" #'rubocop-autocorrect-current-file - :nv "p" #'rubocop-check-project - :nv "P" #'rubocop-autocorrect-project)) + (map! :localleader + :map rubocop-mode-map + "f" #'rubocop-check-current-file + "F" #'rubocop-autocorrect-current-file + "p" #'rubocop-check-project + "P" #'rubocop-autocorrect-project)) ;; @@ -91,10 +91,10 @@ :localleader :map enh-ruby-mode-map :prefix "k" - :n "k" #'rake - :n "r" #'rake-rerun - :n "R" #'rake-regenerate-cache - :n "f" #'rake-find-task)) + "k" #'rake + "r" #'rake-rerun + "R" #'rake-regenerate-cache + "f" #'rake-find-task)) (def-package! bundler :defer t @@ -103,12 +103,12 @@ :localleader :map enh-ruby-mode-map :prefix "b" - :n "c" #'bundle-check - :n "C" #'bundle-console - :n "i" #'bundle-install - :n "u" #'bundle-update - :n "e" #'bundle-exec - :n "o" #'bundle-open)) + "c" #'bundle-check + "C" #'bundle-console + "i" #'bundle-install + "u" #'bundle-update + "e" #'bundle-exec + "o" #'bundle-open)) ;; `rvm' (setq rspec-use-rvm t) @@ -136,20 +136,20 @@ (setq rspec-verifiable-mode-keymap (make-sparse-keymap) rspec-mode-keymap (make-sparse-keymap))) :config - (map! :map rspec-mode-map - :localleader + (map! :localleader + :map rspec-mode-map :prefix "t" - :n "r" #'rspec-rerun - :n "a" #'rspec-verify-all - :n "s" #'rspec-verify-single - :n "v" #'rspec-verify - :n "c" #'rspec-verify-continue - :n "e" #'rspec-toggle-example-pendingness - :n "f" #'rspec-verify-method - :n "l" #'rspec-run-last-failed - :n "m" #'rspec-verify-matching - :n "t" #'rspec-toggle-spec-and-target-find-example - :n "T" #'rspec-toggle-spec-and-target)) + "r" #'rspec-rerun + "a" #'rspec-verify-all + "s" #'rspec-verify-single + "v" #'rspec-verify + "c" #'rspec-verify-continue + "e" #'rspec-toggle-example-pendingness + "f" #'rspec-verify-method + "l" #'rspec-run-last-failed + "m" #'rspec-verify-matching + "t" #'rspec-toggle-spec-and-target-find-example + "T" #'rspec-toggle-spec-and-target)) (def-package! minitest @@ -157,10 +157,10 @@ :config (when (featurep! :feature evil) (add-hook 'minitest-mode-hook #'evil-normalize-keymaps)) - (map! :map minitest-mode-map - :localleader + (map! :localleader + :map minitest-mode-map :prefix "t" - :n "r" #'minitest-rerun - :n "a" #'minitest-verify-all - :n "s" #'minitest-verify-single - :n "v" #'minitest-verify)) + "r" #'minitest-rerun + "a" #'minitest-verify-all + "s" #'minitest-verify-single + "v" #'minitest-verify)) diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 610deca66..06d6cd721 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -61,67 +61,67 @@ (map! :map web-mode-map (:localleader - :desc "Rehighlight buffer" :n "h" #'web-mode-buffer-highlight - :desc "Indent buffer" :n "i" #'web-mode-buffer-indent + :desc "Rehighlight buffer" "h" #'web-mode-buffer-highlight + :desc "Indent buffer" "i" #'web-mode-buffer-indent (:prefix "a" - :n "b" #'web-mode-attribute-beginning - :n "e" #'web-mode-attribute-end - :n "i" #'web-mode-attribute-insert - :n "n" #'web-mode-attribute-next - :n "s" #'web-mode-attribute-select - :n "k" #'web-mode-attribute-kill - :n "p" #'web-mode-attribute-previous - :n "p" #'web-mode-attribute-transpose) + "b" #'web-mode-attribute-beginning + "e" #'web-mode-attribute-end + "i" #'web-mode-attribute-insert + "n" #'web-mode-attribute-next + "s" #'web-mode-attribute-select + "k" #'web-mode-attribute-kill + "p" #'web-mode-attribute-previous + "p" #'web-mode-attribute-transpose) (:prefix "b" - :n "b" #'web-mode-block-beginning - :n "c" #'web-mode-block-close - :n "e" #'web-mode-block-end - :n "k" #'web-mode-block-kill - :n "n" #'web-mode-block-next - :n "p" #'web-mode-block-previous - :n "s" #'web-mode-block-select) + "b" #'web-mode-block-beginning + "c" #'web-mode-block-close + "e" #'web-mode-block-end + "k" #'web-mode-block-kill + "n" #'web-mode-block-next + "p" #'web-mode-block-previous + "s" #'web-mode-block-select) (:prefix "d" - :n "a" #'web-mode-dom-apostrophes-replace - :n "d" #'web-mode-dom-errors-show - :n "e" #'web-mode-dom-entities-encode - :n "n" #'web-mode-dom-normalize - :n "q" #'web-mode-dom-quotes-replace - :n "t" #'web-mode-dom-traverse - :n "x" #'web-mode-dom-xpath) + "a" #'web-mode-dom-apostrophes-replace + "d" #'web-mode-dom-errors-show + "e" #'web-mode-dom-entities-encode + "n" #'web-mode-dom-normalize + "q" #'web-mode-dom-quotes-replace + "t" #'web-mode-dom-traverse + "x" #'web-mode-dom-xpath) (:prefix "e" - :n "/" #'web-mode-element-close - :n "a" #'web-mode-element-content-select - :n "b" #'web-mode-element-beginning - :n "c" #'web-mode-element-clone - :n "d" #'web-mode-element-child - :n "e" #'web-mode-element-end - :n "f" #'web-mode-element-children-fold-or-unfold - :n "i" #'web-mode-element-insert - :n "k" #'web-mode-element-kill - :n "m" #'web-mode-element-mute-blanks - :n "n" #'web-mode-element-next - :n "p" #'web-mode-element-previous - :n "r" #'web-mode-element-rename - :n "s" #'web-mode-element-select - :n "t" #'web-mode-element-transpose - :n "u" #'web-mode-element-parent - :n "v" #'web-mode-element-vanish - :n "w" #'web-mode-element-wrap) + "/" #'web-mode-element-close + "a" #'web-mode-element-content-select + "b" #'web-mode-element-beginning + "c" #'web-mode-element-clone + "d" #'web-mode-element-child + "e" #'web-mode-element-end + "f" #'web-mode-element-children-fold-or-unfold + "i" #'web-mode-element-insert + "k" #'web-mode-element-kill + "m" #'web-mode-element-mute-blanks + "n" #'web-mode-element-next + "p" #'web-mode-element-previous + "r" #'web-mode-element-rename + "s" #'web-mode-element-select + "t" #'web-mode-element-transpose + "u" #'web-mode-element-parent + "v" #'web-mode-element-vanish + "w" #'web-mode-element-wrap) (:prefix "t" - :n "a" #'web-mode-tag-attributes-sort - :n "b" #'web-mode-tag-beginning - :n "e" #'web-mode-tag-end - :n "m" #'web-mode-tag-match - :n "n" #'web-mode-tag-next - :n "p" #'web-mode-tag-previous - :n "s" #'web-mode-tag-select)) + "a" #'web-mode-tag-attributes-sort + "b" #'web-mode-tag-beginning + "e" #'web-mode-tag-end + "m" #'web-mode-tag-match + "n" #'web-mode-tag-next + "p" #'web-mode-tag-previous + "s" #'web-mode-tag-select)) - "M-/" #'web-mode-comment-or-uncomment + :g "M-/" #'web-mode-comment-or-uncomment :i "SPC" #'self-insert-command :n "za" #'web-mode-fold-or-unfold :nv "]a" #'web-mode-attribute-next diff --git a/modules/tools/ansible/config.el b/modules/tools/ansible/config.el index d44a4b8b3..cb75a6dda 100644 --- a/modules/tools/ansible/config.el +++ b/modules/tools/ansible/config.el @@ -9,9 +9,9 @@ ansible::task-label-face 'font-lock-doc-face) (map! :map ansible::key-map :localleader - :n "d" #'ansible::decrypt-buffer - :n "e" #'ansible::encrypt-buffer - :n "h" #'ansible-doc)) + :desc "Decrypt buffer" "d" #'ansible::decrypt-buffer + :desc "Encrypt buffer" "e" #'ansible::encrypt-buffer + :desc "Look up in Ansible docs" "h" #'ansible-doc)) (after! ansible-doc (set-evil-initial-state! '(ansible-doc-module-mode) 'emacs)) diff --git a/modules/tools/terraform/config.el b/modules/tools/terraform/config.el index e4523ca2e..89b0315fc 100644 --- a/modules/tools/terraform/config.el +++ b/modules/tools/terraform/config.el @@ -3,9 +3,9 @@ (map! :after terraform-mode :map terraform-mode-map :localleader - :n "a" (λ! (compile "terraform apply")) - :n "i" (λ! (compile "terraform init")) - :n "p" (λ! (compile "terraform plan"))) + :desc "terraform apply" "a" (λ! (compile "terraform apply")) + :desc "terraform init" "i" (λ! (compile "terraform init")) + :desc "terraform plan" "p" (λ! (compile "terraform plan"))) (def-package! company-terraform diff --git a/modules/ui/deft/config.el b/modules/ui/deft/config.el index bf05359ec..d1d0d24dc 100644 --- a/modules/ui/deft/config.el +++ b/modules/ui/deft/config.el @@ -19,14 +19,14 @@ (set-evil-initial-state! 'deft-mode 'insert) (map! :map deft-mode-map :localleader - :n "RET" #'deft-new-file-named - :n "a" #'deft-archive-file - :n "c" #'deft-filter-clear - :n "d" #'deft-delete-file - :n "f" #'deft-find-file - :n "g" #'deft-refresh - :n "l" #'deft-filter - :n "n" #'deft-new-file - :n "r" #'deft-rename-file - :n "s" #'deft-toggle-sort-method - :n "t" #'deft-toggle-incremental-search)) + "RET" #'deft-new-file-named + "a" #'deft-archive-file + "c" #'deft-filter-clear + "d" #'deft-delete-file + "f" #'deft-find-file + "g" #'deft-refresh + "l" #'deft-filter + "n" #'deft-new-file + "r" #'deft-rename-file + "s" #'deft-toggle-sort-method + "t" #'deft-toggle-incremental-search)) From f9b72545b7c4de25effc9e133deda27dd1cc1efe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 23:55:06 -0500 Subject: [PATCH 3506/4235] Replace def-org-file-link! with function A macro is overkill for this. --- modules/lang/org/config.el | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0ba5e6a06..3bbf5f3f9 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -223,21 +223,20 @@ unfold to point on startup." 'org-link 'error))) - (eval-when-compile - (defmacro def-org-file-link! (key dir) - `(org-link-set-parameters - ,key - :complete (lambda () (+org--relpath (+org-link-read-file ,key ,dir) ,dir)) - :follow (lambda (link) (find-file (expand-file-name link ,dir))) - :face (lambda (link) - (if (file-exists-p (expand-file-name link ,dir)) - 'org-link - 'error))))) + (defun +org-def-link (key dir) + (org-link-set-parameters + key + :complete (lambda () (+org--relpath (+org-link-read-file key dir) dir)) + :follow (lambda (link) (find-file (expand-file-name link dir))) + :face (lambda (link) + (if (file-exists-p (expand-file-name link dir)) + 'org-link + 'error)))) - (def-org-file-link! "org" org-directory) - (def-org-file-link! "doom" doom-emacs-dir) - (def-org-file-link! "doom-docs" doom-docs-dir) - (def-org-file-link! "doom-modules" doom-modules-dir)) + (+org-def-link "org" org-directory) + (+org-def-link "doom" doom-emacs-dir) + (+org-def-link "doom-docs" doom-docs-dir) + (+org-def-link "doom-modules" doom-modules-dir)) (defun +org|setup-ui () "Configures the UI for `org-mode'." From 9f2dff02fa8ed3c2162a38195e69aff1085933ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 23 Dec 2018 23:57:29 -0500 Subject: [PATCH 3507/4235] Rethink config/default & keybindings + Added +smartparens flag to config/default for default smartparens config. + Fixed +tng support for completion/company. + Removed super keybinds (for all but MacOS) + Moved "keybind fixes" to config/default/config.el (these should be universally available). + Replaced both +default-repeat-forward-key and +default-repeat-backward-key with +default-repeat-keys. If this variable is nil, the universal repeat motions won't be bound. --- init.example.el | 7 +- modules/completion/company/autoload.el | 6 + modules/completion/company/config.el | 9 +- modules/config/default/+evil-bindings.el | 323 +++++++++-------------- modules/config/default/config.el | 190 +++++++++---- 5 files changed, 276 insertions(+), 259 deletions(-) diff --git a/init.example.el b/init.example.el index 57f9ec90a..8789117f9 100644 --- a/init.example.el +++ b/init.example.el @@ -153,7 +153,6 @@ ;;literate ;; The default module sets reasonable defaults for Emacs. It also - ;; provides a Spacemacs-inspired keybinding scheme, a custom yasnippet - ;; library, and additional ex commands for evil-mode. Use it as a - ;; reference for your own modules. - (default +bindings)) + ;; provides a Spacemacs-inspired keybinding scheme and a smartparens + ;; config. Use it as a reference for your own modules. + (default +bindings +smartparens)) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 0ce0e9b3a..5dfcf0bd7 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -86,6 +86,12 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; ;; Commands +;;;###autoload +(defun +company-has-completion-p () + "Return non-nil if a completion candidate exists at point." + (and (company-manual-begin) + (= company-candidates-length 1))) + ;;;###autoload (defun +company/toggle-auto-completion () "Toggle as-you-type code completion." diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index cca1c43e9..99d2704f3 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -35,9 +35,12 @@ :config (add-to-list 'company-frontends 'company-tng-frontend) (define-key! company-active-map - [return] nil - [tab] #'company-select-next - [backtab] #'company-select-previous)) + "RET" nil + [return] nil + "TAB" #'company-select-next + [tab] #'company-select-next + "" #'company-select-previous + [backtab] #'company-select-previous)) ;; diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ae24eb88c..96082c9f7 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -6,6 +6,12 @@ ;; tell it explicitly. (setq expand-region-contract-fast-key "V") +;; Don't let evil-collection interfere with certain keys +(setq evil-collection-key-blacklist + (list "C-j" "C-k" "gd" "gf" "K" "[" "]" "gz" + doom-leader-key doom-localleader-key + doom-leader-alt-key doom-localleader-alt-key)) + ;; ;; Global keybindings @@ -20,49 +26,29 @@ [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag - :i [remap newline] #'newline-and-indent - :i "C-j" #'+default/newline + ;; Smart tab + :i [tab] (general-predicate-dispatch 'indent-for-tab-command + (and (featurep! :feature snippets) + (yas-maybe-expand-abbrev-key-filter 'yas-expand)) + 'yas-expand + (and (featurep! :completion company +tng) + (+company-has-completion-p)) + '+company/complete) - :n "s-+" (λ! (text-scale-set 0)) - :n "s-=" #'text-scale-increase - :n "s--" #'text-scale-decrease - - ;; Simple window/frame navigation/manipulation - :n "s-w" #'delete-window - :n "s-W" #'delete-frame - :n "C-S-f" #'toggle-frame-fullscreen - :n "s-n" #'+default/new-buffer - :n "s-N" #'make-frame - - ;; Textmate-esque bindings - :n "s-R" #'+eval/region-and-replace - :n "s-a" #'mark-whole-buffer - :n "s-b" #'+default/compile - :n "s-c" #'evil-yank - :n "s-f" #'swiper - :n "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) + ;; Smarter newlines + :i [remap newline] #'newline-and-indent ; auto-indent on newline + :i "C-j" #'+default/newline ; default behavior ;; expand-region - :v "v" #'er/expand-region - :v "C-v" #'er/contract-region + :v "v" #'er/expand-region + :v "C-v" #'er/contract-region - ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because it - ;; imposes some other functionality and overhead we don't need) - :g "s-z" #'undo - :g "s-s" #'save-buffer - :g "s-c" #'yank - :g "s-v" #'copy-region-as-kill - :v "s-v" (if (featurep 'evil) #'evil-yank #'yank) + (:after vc-annotate + :map vc-annotate-mode-map + [remap quit-window] #'kill-this-buffer) - :nv "C-SPC" #'+evil/fold-toggle) - - -;; -;; Built-in plugins - -(map! :after vc-annotate - :map vc-annotate-mode-map - [remap quit-window] #'kill-this-buffer) + ;; misc + :n "C-S-f" #'toggle-frame-fullscreen) ;; @@ -104,6 +90,7 @@ :nv "gx" #'evil-exchange :nv "C-a" #'evil-numbers/inc-at-pt :nv "C-S-a" #'evil-numbers/dec-at-pt + :nv "C-SPC" #'+evil/fold-toggle :nv [tab] #'+evil/matchit-or-toggle-fold :v "gp" #'+evil/paste-preserve-register :v "@" #'+evil:apply-macro @@ -183,9 +170,9 @@ (evil-snipe-enable-incremental-highlight)))))) ;; evil-surround - :v "S" #'evil-surround-region - :o "s" #'evil-surround-edit - :o "S" #'evil-Surround-edit) + :v "S" #'evil-surround-region + :o "s" #'evil-surround-edit + :o "S" #'evil-Surround-edit) (:when (featurep! :feature lookup) :nv "K" #'+lookup/documentation @@ -200,16 +187,15 @@ ;; 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 - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field) + "C-e" #'+snippets/goto-end-of-field + "C-a" #'+snippets/goto-start-of-field + [s-right] #'+snippets/goto-end-of-field + [s-left] #'+snippets/goto-start-of-field + [s-backspace] #'+snippets/delete-to-start-of-field + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map - :ie [tab] yas-maybe-expand - :v [tab] #'yas-insert-snippet))) + :v [tab] #'yas-insert-snippet))) (:when (featurep! :feature spellcheck) :m "]S" #'flyspell-correct-word-generic @@ -230,18 +216,6 @@ :n "RET" #'flycheck-error-list-goto-error)) (:when (featurep! :feature workspaces) - :n "s-t" #'+workspace/new - :n "s-T" #'+workspace/display - :n "s-1" (λ! (+workspace/switch-to 0)) - :n "s-2" (λ! (+workspace/switch-to 1)) - :n "s-3" (λ! (+workspace/switch-to 2)) - :n "s-4" (λ! (+workspace/switch-to 3)) - :n "s-5" (λ! (+workspace/switch-to 4)) - :n "s-6" (λ! (+workspace/switch-to 5)) - :n "s-7" (λ! (+workspace/switch-to 6)) - :n "s-8" (λ! (+workspace/switch-to 7)) - :n "s-9" (λ! (+workspace/switch-to 8)) - :n "s-0" #'+workspace/switch-to-last :n "gt" #'+workspace/switch-right :n "gT" #'+workspace/switch-left :n "]w" #'+workspace/switch-right @@ -249,18 +223,18 @@ ;;; :completion (map! (:when (featurep! :completion company) - :i "C-@" #'+company/complete - :i "C-SPC" #'+company/complete + :i "C-@" #'+company/complete + :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 - :i "C-p" #'+company/dabbrev-code-previous) + :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 + :i "C-p" #'+company/dabbrev-code-previous) (:after company (:map company-active-map "C-w" nil ; don't interfere with `evil-delete-backward-word' @@ -294,14 +268,12 @@ :map ivy-minibuffer-map "C-SPC" #'ivy-call-and-recenter ; preview file "C-l" #'ivy-alt-done - "s-z" #'undo - "s-v" #'yank "C-v" #'yank) (:after counsel :map counsel-ag-map - [backtab] #'+ivy/wgrep-occur ; search/replace on results "C-SPC" #'ivy-call-and-recenter ; preview - "s-RET" (+ivy-do-action! #'+ivy-git-grep-other-window-action)) + [backtab] #'+ivy/wgrep-occur ; search/replace on results + [C-return] (+ivy-do-action! #'+ivy-git-grep-other-window-action)) (:after swiper :map swiper-map [backtab] #'+ivy/wgrep-occur)) @@ -334,20 +306,24 @@ "C--" #'+helm-do-ag-decrease-context "C-=" #'+helm-do-ag-increase-context [backtab] #'helm-ag-edit - [left] nil - [right] nil) + [left] nil + [right] nil) (:after helm-files :map (helm-find-files-map helm-read-file-map) - [M-return] #'helm-ff-run-switch-other-window + [C-return] #'helm-ff-run-switch-other-window "C-w" #'helm-find-files-up-one-level) (:after helm-locate - :map helm-generic-files-map [M-return] #'helm-ff-run-switch-other-window) + :map helm-generic-files-map + [C-return] #'helm-ff-run-switch-other-window) (:after helm-buffers - :map helm-buffer-map [M-return] #'helm-buffer-switch-other-window) + :map helm-buffer-map + [C-return] #'helm-buffer-switch-other-window) (:after helm-regexp - :map helm-moccur-map [M-return] #'helm-moccur-run-goto-line-ow) + :map helm-moccur-map + [C-return] #'helm-moccur-run-goto-line-ow) (:after helm-grep - :map helm-grep-map [M-return] #'helm-grep-run-other-window-action)))) + :map helm-grep-map + [C-return] #'helm-grep-run-other-window-action)))) ;;; :ui (map! (:when (featurep! :ui hl-todo) @@ -359,7 +335,7 @@ :map neotree-mode-map :n "g" nil :n [tab] #'neotree-quick-look - :n "RET" #'neotree-enter + :n [return] #'neotree-enter :n [backspace] #'evil-window-prev :n "c" #'neotree-create-node :n "r" #'neotree-rename-node @@ -762,129 +738,78 @@ ;; -;; Keybinding fixes +;; Universal motion repeating keys -;; This section is dedicated to "fixing" certain keys so that they behave -;; sensibly (and consistently with similar contexts). +(defvar +default-repeat-keys (cons ";" ",") + "TODO") -;; Make SPC u SPC u [...] possible (#747) -(define-key universal-argument-map - (kbd (concat doom-leader-key " u")) #'universal-argument-more) +(when +default-repeat-keys + (defmacro do-repeat! (command next-func prev-func) + "Makes ; and , the universal repeat-keys in evil-mode. These keys can be +customized by changing `+default-repeat-forward-key' and +`+default-repeat-backward-key'." + (let ((fn-sym (intern (format "+default*repeat-%s" (doom-unquote command))))) + `(progn + (defun ,fn-sym (&rest _) + (define-key! 'motion + (car +default-repeat-keys) #',next-func + (cdr +default-repeat-keys) #',prev-func)) + (advice-add #',command :before #',fn-sym)))) -(when IS-MAC - ;; Fix MacOS shift+tab - (define-key input-decode-map [S-iso-lefttab] [backtab]) - ;; Fix frame-switching on MacOS - (global-set-key (kbd "M-`") #'other-frame)) + ;; 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) -(defun +default|setup-input-decode-map () - (define-key input-decode-map (kbd "TAB") [tab])) -(add-hook 'tty-setup-hook #'+default|setup-input-decode-map) + ;; f/F/t/T/s/S + (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! tabulated-list - (define-key tabulated-list-mode-map "q" #'quit-window)) - -(when (featurep! :feature evil +everywhere) - ;; Evil-collection fixes - (setq evil-collection-key-blacklist - (list "C-j" "C-k" "gd" "gf" "K" "[" "]" "gz" - doom-leader-key doom-localleader-key)) - - (define-key! 'insert - ;; 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. - "C-a" #'doom/backward-to-bol-or-indent - "C-e" #'doom/forward-to-last-non-comment-or-eol - "C-u" #'doom/backward-kill-to-bol-and-indent - ;; textmate-esque newline insertion - [s-return] #'evil-open-below - [S-s-return] #'evil-open-above - ;; Emacsien motions for insert mode - "C-b" #'backward-word - "C-f" #'forward-word - ;; textmate-esque deletion - [s-backspace] #'doom/backward-kill-to-bol-and-indent) - - (define-key! evil-ex-completion-map - "C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history) - "C-a" #'move-beginning-of-line - "C-b" #'backward-word - "C-f" #'forward-word) - - (define-key! view-mode-map :package 'view [escape] #'View-quit-all) - - (define-key! 'normal Man-mode-map :package 'man "q" #'kill-this-buffer)) - -;; Restore common editing keys (and ESC) in minibuffer -(let ((maps `(minibuffer-local-map - minibuffer-local-ns-map - minibuffer-local-completion-map - minibuffer-local-must-match-map - minibuffer-local-isearch-map - read-expression-map - ,@(if (featurep! :completion ivy) '(ivy-minibuffer-map))))) - (define-key! :keymaps maps - "C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history) - "C-a" #'move-beginning-of-line - "C-w" #'backward-kill-word - "C-u" #'backward-kill-sentence - "C-b" #'backward-word - "C-f" #'forward-word - "C-z" (λ! (ignore-errors (call-interactively #'undo)))) - (when (featurep! :feature evil +everywhere) - (define-key! :keymaps maps - [escape] #'abort-recursive-edit - "C-r" #'evil-paste-from-register - "C-j" #'next-line - "C-k" #'previous-line - "C-S-j" #'scroll-up-command - "C-S-k" #'scroll-down-command))) + ;; */# + (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)) ;; -;; Universal motion repeating keys +;; Universal evil integration -(defvar +default-repeat-forward-key ";") -(defvar +default-repeat-backward-key ",") +(when (featurep! :feature evil +everywhere) + ;; Restore C-a, C-e and C-u and make them 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+trailing whitespace before jumping to + ;; eol. C-u will act similarly to C-a. + (define-key! + "C-a" #'doom/backward-to-bol-or-indent + "C-e" #'doom/forward-to-last-non-comment-or-eol + "C-u" #'doom/backward-kill-to-bol-and-indent + "C-w" #'backward-kill-word) -(defmacro do-repeat! (command next-func prev-func) - "Makes ; and , the universal repeat-keys in evil-mode. These keys can be -customized by changing `+default-repeat-forward-key' and -`+default-repeat-backward-key'." - (let ((fn-sym (intern (format "+default*repeat-%s" (doom-unquote command))))) - `(progn - (defun ,fn-sym (&rest _) - (define-key! 'motion - +default-repeat-forward-key #',next-func - +default-repeat-backward-key #',prev-func)) - (advice-add #',command :before #',fn-sym)))) + (after! view + (define-key view-mode-map [escape] #'View-quit-all)) + (after! man + (define-key 'normal Man-mode-map "q" #'kill-this-buffer)) -;; 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) + ;; Minibuffer + (define-key! evil-ex-completion-map + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history)) -;; f/F/t/T/s/S -(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) - -;; */# -(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) + (define-key! :keymaps +default-minibuffer-maps + "C-r" #'evil-paste-from-register + ;; Scrolling lines + "C-j" #'next-line + "C-k" #'previous-line + "C-S-j" #'scroll-up-command + "C-S-k" #'scroll-down-command)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index af738bf8b..85f35fc7f 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -1,5 +1,16 @@ ;;; config/default/config.el -*- lexical-binding: t; -*- +(defvar +default-minibuffer-maps + `(minibuffer-local-map + minibuffer-local-ns-map + minibuffer-local-completion-map + minibuffer-local-must-match-map + minibuffer-local-isearch-map + read-expression-map + ,@(if (featurep! :completion ivy) '(ivy-minibuffer-map))) + "A list of all the keymaps used for the minibuffer.") + + ;; ;; Reasonable defaults @@ -16,72 +27,145 @@ epa-pinentry-mode 'loopback)) -;; disable :unless predicates with (sp-pair "'" nil :unless nil) -;; disable :post-handlers with (sp-pair "{" nil :post-handlers nil) -;; ...or specific :post-handlers with (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) -(after! smartparens - ;; Autopair quotes more conservatively; if I'm next to a word/before another - ;; quote, I likely don't want another pair. - (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)) +(when (featurep! +smartparens) + ;; disable :unless predicates with (sp-pair "'" nil :unless nil) + ;; disable :post-handlers with (sp-pair "{" nil :post-handlers nil) + ;; ...or specific :post-handlers with (sp-pair "{" nil :post-handlers '(:rem + ;; ("| " "SPC"))) + (after! smartparens + ;; Autopair quotes more conservatively; if I'm next to a word/before another + ;; quote, I likely don't want another pair. + (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)) - ;; Expand {|} => { | } - ;; Expand {|} => { - ;; | - ;; } - (dolist (brace '("(" "{" "[")) - (sp-pair brace nil - :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) - ;; I likely don't want a new pair if adjacent to a word or opening brace - :unless '(sp-point-before-word-p sp-point-before-same-p))) + ;; Expand {|} => { | } + ;; Expand {|} => { + ;; | + ;; } + (dolist (brace '("(" "{" "[")) + (sp-pair brace nil + :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) + ;; I likely don't want a new pair if adjacent to a word or opening brace + :unless '(sp-point-before-word-p sp-point-before-same-p))) - ;; Major-mode specific fixes - (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler)) + ;; Major-mode specific fixes + (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) - ;; Don't do square-bracket space-expansion where it doesn't make sense to - (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) - "[" nil :post-handlers '(:rem ("| " "SPC"))) + ;; Don't do square-bracket space-expansion where it doesn't make sense to + (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) + "[" nil :post-handlers '(:rem ("| " "SPC"))) - ;; Reasonable default pairs for comments - (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) - "" :actions '(insert) :post-handlers '(("| " "SPC"))) + ;; Reasonable default pairs for comments + (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) + "" :actions '(insert) :post-handlers '(("| " "SPC"))) - (sp-local-pair - '(js2-mode typescript-mode rjsx-mode rust-mode - c-mode c++-mode objc-mode java-mode php-mode - css-mode scss-mode less-css-mode stylus-mode) - "/*" "*/" - :actions '(insert) - :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") ("\n* ||\n*/[i][d-2]" "*"))) + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode + java-mode php-mode css-mode scss-mode less-css-mode stylus-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") ("\n* ||\n*/[i][d-2]" "*"))) - ;; Highjacks backspace to: - ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) - ;; b) delete space-indented `tab-width' steps at a time - ;; c) close empty multiline brace blocks in one step: - ;; { - ;; | - ;; } - ;; becomes {|} - ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work - ;; even after a backspace. - ;; e) properly delete smartparen pairs when they are encountered, without the - ;; need for strict mode. - ;; f) do none of this when inside a string - (advice-add #'delete-backward-char :override #'doom/delete-backward-char) + ;; Highjacks backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented `tab-width' steps at a time + ;; c) close empty multiline brace blocks in one step: + ;; { + ;; | + ;; } + ;; becomes {|} + ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work + ;; even after a backspace. + ;; e) properly delete smartparen pairs when they are encountered, without + ;; the need for strict mode. + ;; f) do none of this when inside a string + (advice-add #'delete-backward-char :override #'doom/delete-backward-char) - ;; Makes `newline-and-indent' smarter when dealing with comments - (advice-add #'newline-and-indent :around #'doom*newline-indent-and-continue-comments)) + ;; Makes `newline-and-indent' smarter when dealing with comments + (advice-add #'newline-and-indent :around #'doom*newline-indent-and-continue-comments))) + + +;; +;; Keybinding fixes + +;; This section is dedicated to "fixing" certain keys so that they behave +;; sensibly (and consistently with similar contexts). + +;; Make SPC u SPC u [...] possible (#747) +(map! :map universal-argument-map + :prefix doom-leader-key "u" #'universal-argument-more + :prefix doom-leader-alt-key "u" #'universal-argument-more) + +(defun +default|setup-input-decode-map () + "Ensure TAB and [tab] are treated the same in TTY Emacs." + (define-key input-decode-map (kbd "TAB") [tab])) +(add-hook 'tty-setup-hook #'+default|setup-input-decode-map) + +;; Restore CUA keys in minibuffer +(define-key! :keymaps +default-minibuffer-maps + [escape] #'abort-recursive-edit + "C-v" #'yank + "C-z" (λ! (ignore-errors (call-interactively #'undo))) + "C-a" #'move-beginning-of-line + "C-b" #'backward-word + ;; A Doom convention where C-s on popups and interactive searches will invoke + ;; ivy/helm for their superior filtering. + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history)) + +;; Consistently use q to quit windows +(after! tabulated-list + (define-key tabulated-list-mode-map "q" #'quit-window)) + +;; OS specific fixes +(when IS-MAC + ;; Fix MacOS shift+tab + (define-key input-decode-map [S-iso-lefttab] [backtab]) + + (define-key! + ;; Buffer-local font scaling + "s-+" (λ! (text-scale-set 0)) + "s-=" #'text-scale-increase + "s--" #'text-scale-decrease + ;; Fix frame-switching on MacOS + "s-`" #'other-frame + ;; Simple window/frame navigation/manipulation + "s-w" #'delete-window + "s-W" #'delete-frame + "s-n" #'+default/new-buffer + "s-N" #'make-frame + ;; Textmate-esque bindings + "s-a" #'mark-whole-buffer + "s-b" #'+default/compile + "s-f" #'swiper + "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) + ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because + ;; it imposes some other functionality and overhead we don't need) + "s-z" #'undo + "s-s" #'save-buffer + "s-c" (if (featurep 'evil) 'evil-yank 'copy-region-as-kill) + "s-v" #'yank + ;; textmate-esque newline insertion + [s-return] #'evil-open-below + [S-s-return] #'evil-open-above + ;; textmate-esque deletion + [s-backspace] #'doom/backward-kill-to-bol-and-indent)) ;; ;; Doom's keybinding scheme (when (featurep! +bindings) + ;; Ensure Emacsien motions are available + (map! "C-b" #'backward-word + "C-f" #'forward-word) + (if (featurep 'evil) (load! "+evil-bindings") (load! "+emacs-bindings"))) From 70a4db49d12f6ffa4f87a1feb4b55330b1410418 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 24 Dec 2018 02:43:32 -0500 Subject: [PATCH 3508/4235] lang/org: fix C-S-return & S-s-return keybinds --- modules/lang/org/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 3bbf5f3f9..9e44f0ef3 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -365,11 +365,11 @@ between the two." :i [return] #'org-return-indent :n [return] #'+org/dwim-at-point :nv [C-return] (λ! (+org/insert-item 'below)) - :nv [S-C-return] (λ! (+org/insert-item 'below)) + :nv [C-S-return] (λ! (+org/insert-item 'above)) (:when IS-MAC ;; textmate-esque newline insertion :nv [s-return] (λ! (+org/insert-item 'below)) - :nv [S-s-return] (λ! (+org/insert-item 'below))) + :nv [S-s-return] (λ! (+org/insert-item 'above))) ;; more vim-esque org motion keys (not covered by evil-org-mode) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) From 99d327c210942423dbaf93c29437d98e22d8bed9 Mon Sep 17 00:00:00 2001 From: Ivan Koz Date: Tue, 25 Dec 2018 02:36:36 +0400 Subject: [PATCH 3509/4235] Change .gitignore to exclude "modules/private" when attached as symlink. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bd575d0c3..fcc169df8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .local/ var/ -modules/private/ +modules/private .yas-compiled-snippets.el # folders created by Cask From d337e255d38f3044c64b1b67da5b5a4f3c94b81b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Dec 2018 02:29:29 -0500 Subject: [PATCH 3510/4235] Fix :leader/:localleader and :prefix Due to issues with preset prefixes in general definers and nested :prefix's supplied from a map! call not cooperating, many localleader keybinds were broken and causing errors. For :leader/:localleader keys, we now use :infix for sub-prefixes. However, with this change, the :alt-prefix property has been removed, as there is no simple way to support this without some major state gymnastics in map!. Fixes #1059 --- core/core-keybinds.el | 32 ++++++++++++++++---------------- core/test/test-core-keybinds.el | 19 ------------------- 2 files changed, 16 insertions(+), 35 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 2c1f4b5bb..317535eeb 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -72,7 +72,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (general-create-definer define-localleader-key! :major-modes t - :keymaps 'local + :wk-full-keys nil :prefix doom-localleader-alt-key) ;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's @@ -81,7 +81,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (general-create-definer define-localleader-key! :states (cdr general-describe-evil-states) :major-modes t - :keymaps 'local + :wk-full-keys nil :prefix doom-localleader-key :non-normal-prefix doom-localleader-alt-key)) @@ -149,7 +149,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See ;; specials (defvar doom--map-forms nil) -(defvar doom--map-fn 'general-define-key) +(defvar doom--map-fn nil) (defvar doom--map-batch-forms nil) (defvar doom--map-state '(:dummy t)) (defvar doom--map-parent-state nil) @@ -191,12 +191,8 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (setq rest nil)) (:prefix (cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest)) - (doom--map-set :prefix prefix) - (when (stringp desc) - (setq rest (append (list :desc desc "" nil) rest))))) - (:alt-prefix - (cl-destructuring-bind (prefix . desc) (doom-enlist (pop rest)) - (doom--map-set :non-normal-prefix prefix) + (doom--map-set (if doom--map-fn :infix :prefix) + prefix) (when (stringp desc) (setq rest (append (list :desc desc "" nil) rest))))) (:textobj @@ -210,9 +206,11 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (condition-case e (doom--map-def (pop rest) (pop rest) (doom--keyword-to-states key) desc) (error - (error "Not a valid `map!' property: %s" key)))))) + (error "Not a valid `map!' property: %s" key))) + (setq desc nil)))) - ((doom--map-def key (pop rest) nil desc))))) + ((doom--map-def key (pop rest) nil desc) + (setq desc nil))))) (doom--map-commit) (macroexp-progn (nreverse (delq nil doom--map-forms))))) @@ -226,7 +224,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (defun doom--map-nested (wrapper rest) (doom--map-commit) - (let ((doom--map-parent-state (append doom--map-state doom--map-parent-state nil))) + (let ((doom--map-parent-state (doom--map-state))) (push (if wrapper (append wrapper (list (doom--map-process rest))) (doom--map-process rest)) @@ -254,15 +252,17 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See :which-key desc)))))))) (dolist (state states) (push (list key def) - (alist-get state doom--map-batch-forms)))) + (alist-get state doom--map-batch-forms))) + t) (defun doom--map-commit () (when doom--map-batch-forms (cl-loop with attrs = (doom--map-state) for (state . defs) in doom--map-batch-forms if (or doom--map-evil-p (not state)) - collect `(,doom--map-fn ,@(if state `(:states ',state)) ,@attrs - ,@(mapcan #'identity (nreverse defs))) + collect `(,(or doom--map-fn 'general-define-key) + ,@(if state `(:states ',state)) ,@attrs + ,@(mapcan #'identity (nreverse defs))) into forms finally do (push (macroexp-progn forms) doom--map-forms)) (setq doom--map-batch-forms nil))) @@ -270,7 +270,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (defun doom--map-state () (let ((plist (append (list :prefix (doom--map-append-keys :prefix) - :non-normal-prefix (doom--map-append-keys :non-normal-prefix) + :infix (doom--map-append-keys :infix) :keymaps (append (plist-get doom--map-parent-state :keymaps) (plist-get doom--map-state :keymaps))) diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index ea6bac845..4a0c97774 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -251,25 +251,6 @@ (general-define-key :prefix (general--concat nil "a" "b") "x" #'x))))) - (describe ":alt-prefix" - (it "specifies a prefix for all keys" - (expect '(map! :alt-prefix "a" "x" #'x "y" #'y "z" #'z) - :to-expand-into - '(general-define-key :non-normal-prefix "a" "x" #'x "y" #'y "z" #'z))) - - (it "overwrites previous inline :alt-prefix properties" - (expect '(map! :alt-prefix "a" "x" #'x "y" #'y :alt-prefix "b" "z" #'z) - :to-expand-into - '(progn (general-define-key :non-normal-prefix "a" "x" #'x "y" #'y) - (general-define-key :non-normal-prefix "b" "z" #'z)))) - - (it "accumulates keys when nested" - (expect '(map! (:alt-prefix "a" "x" #'x (:alt-prefix "b" "x" #'x))) - :to-expand-into - `(progn (general-define-key :non-normal-prefix "a" "x" #'x) - (general-define-key :non-normal-prefix (general--concat nil "a" "b") - "x" #'x))))) - (describe ":textobj" (it "defines keys in evil-{inner,outer}-text-objects-map" (expect '(map! :textobj "a" #'inner #'outer) From 448f2e55e518da7c427bd6d353eee87f01b115d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Dec 2018 02:32:53 -0500 Subject: [PATCH 3511/4235] lang/org: update localleader keybinds To better suit the new map! --- modules/lang/org/config.el | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 9e44f0ef3..e47b79016 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -362,14 +362,14 @@ between the two." :ni "C-S-k" #'org-metaup :ni "C-S-j" #'org-metadown ;; more intuitive RET keybinds - :i [return] #'org-return-indent - :n [return] #'+org/dwim-at-point - :nv [C-return] (λ! (+org/insert-item 'below)) - :nv [C-S-return] (λ! (+org/insert-item 'above)) + :i [return] #'org-return-indent + :n [return] #'+org/dwim-at-point + :nvi [C-return] (λ! (+org/insert-item 'below)) + :nvi [C-S-return] (λ! (+org/insert-item 'above)) (:when IS-MAC ;; textmate-esque newline insertion - :nv [s-return] (λ! (+org/insert-item 'below)) - :nv [S-s-return] (λ! (+org/insert-item 'above))) + :nvi [s-return] (λ! (+org/insert-item 'below)) + :nvi [S-s-return] (λ! (+org/insert-item 'above))) ;; more vim-esque org motion keys (not covered by evil-org-mode) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) @@ -393,17 +393,6 @@ between the two." :n "zr" #'+org/show-next-fold-level :n "zR" #'outline-show-all - ;; - (:localleader - "d" #'org-deadline - "t" #'org-todo - (:prefix "c" - "c" #'org-clock-in - "C" #'org-clock-out - "g" #'org-clock-goto - "G" (λ! (org-clock-goto 'select)) - "x" #'org-clock-cancel)) - :map org-read-date-minibuffer-local-map "C-h" (λ! (org-eval-in-calendar '(calendar-backward-day 1))) "C-l" (λ! (org-eval-in-calendar '(calendar-forward-day 1))) @@ -412,7 +401,18 @@ between the two." "C-S-h" (λ! (org-eval-in-calendar '(calendar-backward-month 1))) "C-S-l" (λ! (org-eval-in-calendar '(calendar-forward-month 1))) "C-S-k" (λ! (org-eval-in-calendar '(calendar-backward-year 1))) - "C-S-j" (λ! (org-eval-in-calendar '(calendar-forward-year 1))))) + "C-S-j" (λ! (org-eval-in-calendar '(calendar-forward-year 1))) + + :localleader + :map org-mode-map + "d" #'org-deadline + "t" #'org-todo + (:prefix ("c" . "clock") + "c" #'org-clock-in + "C" #'org-clock-out + "g" #'org-clock-goto + "G" (λ! (org-clock-goto 'select)) + "x" #'org-clock-cancel))) (defun +org|setup-hacks () "Getting org to behave." From 9c2a1b1f61aeb069c706b56b143932eb061a4d7c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Dec 2018 02:45:10 -0500 Subject: [PATCH 3512/4235] config/default: TAB->[tab] for workspace keys --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 96082c9f7..ddac0f01f 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -509,7 +509,7 @@ :desc "Spelling correction" "S" #'flyspell-correct-word-generic) (:when (featurep! :feature workspaces) - (:prefix ("TAB" . "workspace") + (:prefix ([tab] . "workspace") :desc "Display tab bar" "TAB" #'+workspace/display :desc "New workspace" "n" #'+workspace/new :desc "Load workspace from file" "l" #'+workspace/load From c0c84eb99b3b536057428c0ee68f25a5a2da8b07 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Dec 2018 03:56:24 -0500 Subject: [PATCH 3513/4235] Fix M-SPC error with helm #1059 The global leader keybind was conflicting with a global M-SPC keybind in helm-map. This keybind should only be set in non-evil sessions, so we unset it if evil is found. --- core/core-keybinds.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 317535eeb..cc0de6122 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -58,8 +58,10 @@ If any hook returns non-nil, all hooks after it are ignored.") (define-key doom-leader-map [override-state] 'all) (global-set-key (kbd doom-leader-alt-key) 'doom-leader) -(general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader) -(general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader) +(after! evil + (global-set-key (kbd doom-leader-alt-key) nil) + (general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader) + (general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader)) ;; We avoid `general-create-definer' to ensure that :states, :wk-full-keys and ;; :keymaps cannot be overwritten. From 62f9c9827f5c2c80de74d55e12abc60fa06d3c7c Mon Sep 17 00:00:00 2001 From: Vladyslav M Date: Tue, 25 Dec 2018 11:18:03 +0200 Subject: [PATCH 3514/4235] config/default: fix `Wrong number of arguments: define-key` --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ddac0f01f..d631181bd 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -798,7 +798,7 @@ customized by changing `+default-repeat-forward-key' and (after! view (define-key view-mode-map [escape] #'View-quit-all)) (after! man - (define-key 'normal Man-mode-map "q" #'kill-this-buffer)) + (evil-define-key 'normal Man-mode-map "q" #'kill-this-buffer)) ;; Minibuffer (define-key! evil-ex-completion-map From 649d34244a9eb1c984d465be50c2dca2535c2f94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 25 Dec 2018 04:36:15 -0500 Subject: [PATCH 3515/4235] evil-define-key -> evil-define-key* --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index d631181bd..4995b63ba 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -798,7 +798,7 @@ customized by changing `+default-repeat-forward-key' and (after! view (define-key view-mode-map [escape] #'View-quit-all)) (after! man - (evil-define-key 'normal Man-mode-map "q" #'kill-this-buffer)) + (evil-define-key* 'normal Man-mode-map "q" #'kill-this-buffer)) ;; Minibuffer (define-key! evil-ex-completion-map From b7cfa90967dfd417777ec1738fda37aee4e71b0b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Dec 2018 00:55:19 -0500 Subject: [PATCH 3516/4235] Update map! docstring And remove all references to :alt-prefix --- core/core-keybinds.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index cc0de6122..3160b0bda 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -144,7 +144,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (put :keymap 'lisp-indent-function 'defun) (put :mode 'lisp-indent-function 'defun) (put :prefix 'lisp-indent-function 'defun) -(put :alt-prefix 'lisp-indent-function 'defun) (put :unless 'lisp-indent-function 'defun) (put :if 'lisp-indent-function 'defun) (put :when 'lisp-indent-function 'defun) @@ -301,7 +300,7 @@ States :o operator :m motion :r replace - :g global (will work without evil) + :g global (binds the key without evil `current-global-map') These can be combined in any order, e.g. :nvi will apply to normal, visual and insert mode. The state resets after the following key=>def pair. If states are @@ -315,7 +314,6 @@ Properties :map [KEYMAP(s)] [...] inner keybinds are applied to KEYMAP(S) :keymap [KEYMAP(s)] [...] same as :map :prefix [PREFIX] [...] set keybind prefix for following keys - :alt-prefix [PREFIX] [...] use non-normal-prefix for following keys :after [FEATURE] [...] apply keybinds when [FEATURE] loads :textobj KEY INNER-FN OUTER-FN define a text object keybind pair :if [CONDITION] [...] From cf5d7e3ba84323b0cdefb42f4e6329f4b23f91c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Wed, 26 Dec 2018 11:54:18 +0000 Subject: [PATCH 3517/4235] fix highlight-non-default-indentation --- core/core-ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 5f2ac22d4..7c5595028 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -446,9 +446,9 @@ instead). Meant for `kill-buffer-query-functions'." (set (make-local-variable 'whitespace-style) (if (or (bound-and-true-p whitespace-mode) (bound-and-true-p whitespace-newline-mode)) - (cl-union (if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) + (cl-union (if indent-tabs-mode '(spaces space-mark) '(tabs tab-mark)) whitespace-style) - `(face ,@(if indent-tabs-mode '(tabs tab-mark) '(spaces space-mark)) + `(face ,@(if indent-tabs-mode '(spaces space-mark) '(tabs tab-mark)) trailing-lines tail))) (whitespace-mode +1))) From 1c20e33e03de9f350ceed7b73dcdd3370236ba67 Mon Sep 17 00:00:00 2001 From: Andy McLeod Date: Wed, 26 Dec 2018 16:57:53 +0000 Subject: [PATCH 3518/4235] Add descriptions for go-mode map Makes the map for go-mode easier to discover. --- modules/lang/go/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index c350d3fe1..6bde94e93 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -26,7 +26,7 @@ :localleader "e" #'+go/play-buffer-or-region "i" #'go-goto-imports ; Go to imports - (:prefix "h" + (:prefix ("h" . "help") "." #'godoc-at-point ; Lookup in godoc "d" #'go-guru-describe ; Describe this "v" #'go-guru-freevars ; List free variables @@ -38,14 +38,14 @@ "w" #'go-guru-what ; What query "c" #'go-guru-callers ; Show callers of this function "C" #'go-guru-callees) ; Show callees of this function - (:prefix "ri" + (:prefix ("ri" . "imports") "a" #'go-import-add "r" #'go-remove-unused-imports) - (:prefix "b" + (:prefix ( "b" . "build") :desc "go run ." "r" (λ! (compile "go run .")) :desc "go build" "b" (λ! (compile "go build")) :desc "go clean" "c" (λ! (compile "go clean"))) - (:prefix "t" + (:prefix ("t" . "test") "t" #'+go/test-rerun "a" #'+go/test-all "s" #'+go/test-single From 3befcf934ed47f84a35614f9edc46eaae554ad79 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Dec 2018 14:53:08 -0500 Subject: [PATCH 3519/4235] Make +haskell-repl-buffer arg optional --- modules/lang/haskell/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el index f286d0eaa..d3c5edb17 100644 --- a/modules/lang/haskell/autoload.el +++ b/modules/lang/haskell/autoload.el @@ -1,7 +1,7 @@ ;;; lang/haskell/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +haskell-repl-buffer (arg) +(defun +haskell-repl-buffer (&optional arg) "Returns the appropriate Haskell REPL buffer." (if (featurep! +intero) (intero-repl-buffer arg) From e58c1ff89d2b479e1724dd0dba25d36186a6b39e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Dec 2018 15:01:28 -0500 Subject: [PATCH 3520/4235] Fix TAB in modes with their own keybind Like org-mode --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 922f408d5..5e295c331 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -27,7 +27,7 @@ [remap find-tag] #'projectile-find-tag ;; Smart tab - :i [tab] (general-predicate-dispatch 'indent-for-tab-command + :i [tab] (general-predicate-dispatch nil (and (featurep! :feature snippets) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) 'yas-expand From 6992e278840e9c857a6d95a148902969e5afb211 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 26 Dec 2018 17:36:44 -0500 Subject: [PATCH 3521/4235] ui/doom: use solaire-global-mode #1070 --- modules/ui/doom/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 7d294abd2..e5f4f8c51 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -49,7 +49,6 @@ (if (cdr rule) (solaire-mode-swap-bg)))) (add-hook 'doom-load-theme-hook #'+doom|solaire-mode-swap-bg-maybe t) :config - (add-hook 'change-major-mode-after-body-hook #'turn-on-solaire-mode) ;; fringe can become unstyled when deleting or focusing frames (add-hook 'focus-in-hook #'solaire-mode-reset) ;; Prevent color glitches when reloading either DOOM or loading a new theme @@ -72,4 +71,6 @@ (advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) (add-hook! '(minibuffer-setup-hook window-configuration-change-hook) - #'+doom|disable-fringes-in-minibuffer)) + #'+doom|disable-fringes-in-minibuffer) + + (solaire-global-mode +1)) From 69c277ffce61f1da2362597973c7a045f140b6f7 Mon Sep 17 00:00:00 2001 From: Alex Ragone Date: Thu, 27 Dec 2018 16:37:44 +1300 Subject: [PATCH 3522/4235] fix: disable verbose message for dired-omit To avoid endless spam in *Messages*, disable "Omitted 2 lines" every time a new dired buffer is opened. --- modules/emacs/dired/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 2d568e71d..ee76ffa66 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -100,7 +100,9 @@ (def-package! dired-x - :hook (dired-mode . dired-omit-mode)) + :hook (dired-mode . dired-omit-mode) + :config + (setq dired-omit-verbose nil)) ;; From 63a224f0e83a60fdef56395380d8b2fadc7c5852 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Dec 2018 00:06:06 -0500 Subject: [PATCH 3523/4235] Fix wrong which-key labels & leader key precedence This changes how leader keys are bound, to fix an issue where the wrong which-key label was assigned to the wrong keys, and cases where the leader key was being shadowed by other minor mode mappings. Unfortunately, this new method adds 10-20% to startup times. I'll address this in a future patch. For now, correctness is more important. Also fixes dashboard keybind detection. --- core/core-keybinds.el | 19 +++++++++++-------- modules/ui/doom-dashboard/config.el | 18 +++++++----------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 3160b0bda..e8f6cdb0f 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -55,21 +55,16 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; leader/localleader keys (define-prefix-command 'doom-leader 'doom-leader-map) -(define-key doom-leader-map [override-state] 'all) - -(global-set-key (kbd doom-leader-alt-key) 'doom-leader) -(after! evil - (global-set-key (kbd doom-leader-alt-key) nil) - (general-define-key :states '(emacs insert) doom-leader-alt-key 'doom-leader) - (general-define-key :states '(normal visual motion replace) doom-leader-key 'doom-leader)) +(defvar doom-leader-alist `((t . ,doom-leader-map))) +(add-to-list 'emulation-mode-map-alists 'doom-leader-alist) ;; We avoid `general-create-definer' to ensure that :states, :wk-full-keys and ;; :keymaps cannot be overwritten. (defmacro define-leader-key! (&rest args) `(general-define-key :states nil - :wk-full-keys nil :keymaps 'doom-leader-map + :prefix doom-leader-alt-key ,@args)) (general-create-definer define-localleader-key! @@ -80,6 +75,14 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's ;; emacs state), we must redefine `define-localleader-key!' once evil is loaded (after! evil + (defmacro define-leader-key! (&rest args) + `(general-define-key + :states '(normal visual motion insert) + :keymaps 'doom-leader-map + :prefix doom-leader-key + :non-normal-prefix doom-leader-alt-key + ,@args)) + (general-create-definer define-localleader-key! :states (cdr general-describe-evil-states) :major-modes t diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index d108a111c..abfcf4837 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -419,17 +419,13 @@ controlled by `+doom-dashboard-pwd-policy'." 'help-echo label) (format "%-37s" (buffer-string))) ;; Lookup command keys dynamically - (or (let ((maps (list global-map))) - (when (bound-and-true-p evil-normal-state-map) - (push evil-motion-state-map maps) - (push evil-normal-state-map maps)) - (when-let* ((key (where-is-internal action maps t))) - (propertize (with-temp-buffer - (save-excursion (insert (key-description key))) - (while (re-search-forward "<\\([^>]+\\)>" nil t) - (replace-match (upcase (substring (match-string 1) 0 3)))) - (buffer-string)) - 'face 'font-lock-constant-face))) + (or (when-let* ((key (where-is-internal action nil t))) + (propertize (with-temp-buffer + (save-excursion (insert (key-description key))) + (while (re-search-forward "<\\([^>]+\\)>" nil t) + (replace-match (upcase (substring (match-string 1) 0 3)))) + (buffer-string)) + 'face 'font-lock-constant-face)) "")))) (if (display-graphic-p) "\n\n" From 32e5e78b532702623a23c8414b11bce72a84306d Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Thu, 27 Dec 2018 19:29:56 +0800 Subject: [PATCH 3524/4235] fix wrong url of dotfiles repository --- modules/app/email/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/app/email/README.org b/modules/app/email/README.org index 0e4fd9728..a5ead06c7 100644 --- a/modules/app/email/README.org +++ b/modules/app/email/README.org @@ -36,7 +36,7 @@ sudo pacman --noconfirm --needed -S offlineimap mu * Dependencies You need to do the following: -1. Write a ~\~/.offlineimaprc~. Mine can be found [[https://github.com/hlissner/dotfiles/tree/master/shell/+mu][in my dotfiles repository]]. It is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely store my login credentials. +1. Write a ~\~/.offlineimaprc~. Mine can be found [[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely store my login credentials. 2. Download your email: ~offlineimap -o~ (may take a while) 3. Index it with mu: ~mu index --maildir ~/.mail~ From 5a8a3675101c86643204e3510851c706097b8187 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 27 Dec 2018 16:16:13 +0200 Subject: [PATCH 3525/4235] [tools/password-store] copy-user key in ivy-pass --- 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 a464569e9..073a4526c 100644 --- a/modules/tools/password-store/autoload.el +++ b/modules/tools/password-store/autoload.el @@ -126,7 +126,7 @@ fields in `+pass-url-fields' is used to find the url field." '+pass/ivy '(("o" password-store-copy "copy password") ("e" +pass/edit-entry "edit entry") - ("u" +pass/copy-login "copy username") + ("u" +pass/copy-user "copy username") ("b" +pass/copy-url "open url in browser") ("f" +pass/copy-field "get field")))) From 35bf785f758699d3813b44a28079369731ea1f02 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 27 Dec 2018 17:26:29 +0200 Subject: [PATCH 3526/4235] [config/default] Fix C-S-s in company minibuffer --- modules/config/default/+evil-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 5e295c331..256bfdb8b 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -246,8 +246,8 @@ "C-u" #'company-previous-page "C-d" #'company-next-page "C-s" #'company-filter-candidates - "C-S-s" `(,(cond ((featurep! :completion helm) #'helm-company) - ((featurep! :completion ivy) #'counsel-company))) + "C-S-s" (cond ((featurep! :completion helm) #'helm-company) + ((featurep! :completion ivy) #'counsel-company))) "C-SPC" #'company-complete-common [tab] #'company-complete-common-or-cycle [backtab] #'company-select-previous) From 87eee36e5f1f2ea80b1275da950f62b78c27913c Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 27 Dec 2018 17:33:56 +0200 Subject: [PATCH 3527/4235] [tools/magit] Add magit-forge --- modules/tools/magit/packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 38bcc3d37..5eac2f2a5 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -3,7 +3,9 @@ (when (package! magit) (package! magit-gitflow) - (package! magithub) + (if (featurep! +forge) + (package! forge) + (package! magithub)) (package! magit-todos) (when (featurep! :feature evil +everywhere) (package! evil-magit))) From 869758e8f5ed677a0f1ceec9a9fd275e1ce5905d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 27 Dec 2018 15:05:14 -0500 Subject: [PATCH 3528/4235] Remove extra parentheses #1075 --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 256bfdb8b..cf4022c00 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -247,7 +247,7 @@ "C-d" #'company-next-page "C-s" #'company-filter-candidates "C-S-s" (cond ((featurep! :completion helm) #'helm-company) - ((featurep! :completion ivy) #'counsel-company))) + ((featurep! :completion ivy) #'counsel-company)) "C-SPC" #'company-complete-common [tab] #'company-complete-common-or-cycle [backtab] #'company-select-previous) From 9a0da588d9a0d7db44ae26e06f582337a2aa8101 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Fri, 28 Dec 2018 03:31:03 +0200 Subject: [PATCH 3529/4235] Add helm to project tasks --- modules/config/default/+evil-bindings.el | 2 +- modules/config/default/autoload/default.el | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index cf4022c00..67c4d1daa 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -700,7 +700,7 @@ :desc "Find other file" "o" #'projectile-find-other-file :desc "Switch project" "p" #'projectile-switch-project :desc "Recent project files" "r" #'projectile-recentf - :desc "List project tasks" "t" #'+ivy/tasks ; TODO: Add +helm/tasks + :desc "List project tasks" "t" #'+default/project-tasks :desc "Invalidate cache" "x" #'projectile-invalidate-cache) (:prefix ("q" . "quit/restart") diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 966872055..6a917fe45 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -84,3 +84,8 @@ If ARG (universal argument), runs `compile' from the current directory." (set-window-buffer nil buffer) (with-current-buffer buffer (funcall (default-value 'major-mode)))))) + +;;;###autoload +(defun +default/project-tasks () + (cond ((featurep! :completion ivy) (+ivy/tasks) + (featurep! :completion helm) (+helm/tasks)))) From afee81dfdeb05ba6d8ef9b8a7b4c935a2ab17334 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Dec 2018 15:22:21 -0500 Subject: [PATCH 3530/4235] Fix define-leader-key! comment --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index e8f6cdb0f..e21d101f5 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -58,7 +58,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (defvar doom-leader-alist `((t . ,doom-leader-map))) (add-to-list 'emulation-mode-map-alists 'doom-leader-alist) -;; We avoid `general-create-definer' to ensure that :states, :wk-full-keys and +;; We avoid `general-create-definer' to ensure that :states, :prefix and ;; :keymaps cannot be overwritten. (defmacro define-leader-key! (&rest args) `(general-define-key From e3730520646f6f8fca2d6f3664bdb48c1dffb953 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Dec 2018 15:22:52 -0500 Subject: [PATCH 3531/4235] Restrict support to Emacs 25.3+ from now on 25.1-25.2 are no longer supported. --- core/core.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index eb7c1d0aa..52a299c74 100644 --- a/core/core.el +++ b/core/core.el @@ -1,8 +1,8 @@ ;;; core.el --- the heart of the beast -*- lexical-binding: t; -*- (eval-when-compile - (and (version< emacs-version "25") - (error "Detected Emacs %s. Doom only supports Emacs 25.1 and higher" + (and (version< emacs-version "25.3") + (error "Detected Emacs %s. Doom only supports Emacs 25.3 and higher" emacs-version))) (defvar doom-debug-mode (or (getenv "DEBUG") init-file-debug) From d87fba79448b9cb5c032a55c6f6b2ec59b1ea8ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Dec 2018 23:54:23 -0500 Subject: [PATCH 3532/4235] lang/javascript: remove screeps Moved it to my private config. This is more of a customization than something this module should offer support for. --- modules/lang/javascript/+screeps.el | 174 ---------------------------- modules/lang/javascript/config.el | 6 - 2 files changed, 180 deletions(-) delete mode 100644 modules/lang/javascript/+screeps.el diff --git a/modules/lang/javascript/+screeps.el b/modules/lang/javascript/+screeps.el deleted file mode 100644 index 179ebb54b..000000000 --- a/modules/lang/javascript/+screeps.el +++ /dev/null @@ -1,174 +0,0 @@ -;;; lang/javascript/+screeps.el -*- lexical-binding: t; -*- - -;; TODO Constants may be out-of-date - -(defconst screeps-objects - '("ConstructionSite" "Creep" "Flag" "Game" "Memory" "Mineral" "Nuke" - "OwnedStructure" "PathFinder" "RawMemory" "Resource" "Room" - "RoomObject" "RoomPosition" "Source" - - "Structure" "StructureController" "StructureExtension" - "StructureExtractor" "StructureKeeperLair" "StructureLab" - "StructureLink" "StructureNuker" "StructureObserver" - "StructurePortal" "StructurePowerBank" "StructurePowerSpawn" - "StructureRampart" "StructureRoad" "StructureSpawn" - "StructureStorage" "StructureTerminal" "StructureTower" - "StructureWall")) - -(defconst screeps-constants - '("OK" "ERR_NOT_OWNER" "ERR_NO_PATH" "ERR_NAME_EXISTS" "ERR_BUSY" - "ERR_NOT_FOUND" "ERR_NOT_ENOUGH_ENERGY" "ERR_NOT_ENOUGH_RESOURCES" - "ERR_INVALID_TARGET" "ERR_FULL" "ERR_NOT_IN_RANGE" - "ERR_INVALID_ARGS" "ERR_TIRED" "ERR_NO_BODYPART" - "ERR_NOT_ENOUGH_EXTENSIONS" "ERR_RCL_NOT_ENOUGH" - "ERR_GCL_NOT_ENOUGH" - - "FIND_EXIT_TOP" "FIND_EXIT_RIGHT" "FIND_EXIT_BOTTOM" - "FIND_EXIT_LEFT" "FIND_EXIT" "FIND_CREEPS" "FIND_MY_CREEPS" - "FIND_HOSTILE_CREEPS" "FIND_SOURCES_ACTIVE" "FIND_SOURCES" - "FIND_DROPPED_ENERGY" "FIND_DROPPED_RESOURCES" "FIND_STRUCTURES" - "FIND_MY_STRUCTURES" "FIND_HOSTILE_STRUCTURES" "FIND_FLAGS" - "FIND_CONSTRUCTION_SITES" "FIND_MY_SPAWNS" "FIND_HOSTILE_SPAWNS" - "FIND_MY_CONSTRUCTION_SITES" "FIND_HOSTILE_CONSTRUCTION_SITES" - "FIND_MINERALS" "FIND_NUKES" - - "TOP" "TOP_RIGHT" "RIGHT" "BOTTOM_RIGHT" "BOTTOM" "BOTTOM_LEFT" - "LEFT" "TOP_LEFT" - - "COLOR_RED" "COLOR_PURPLE" "COLOR_BLUE" "COLOR_CYAN" "COLOR_GREEN" - "COLOR_YELLOW" "COLOR_ORANGE" "COLOR_BROWN" "COLOR_GREY" - "COLOR_WHITE" - - "LOOK_CREEPS" "LOOK_ENERGY" "LOOK_RESOURCES" "LOOK_SOURCES" - "LOOK_MINERALS" "LOOK_STRUCTURES" "LOOK_FLAGS" - "LOOK_CONSTRUCTION_SITES" "LOOK_NUKES" "LOOK_TERRAIN" - - "OBSTACLE_OBJECT_TYPES" - - "MOVE" "WORK" "CARRY" "ATTACK" "RANGED_ATTACK" "TOUGH" "HEAL" - "CLAIM" - - "BODYPART_COST" - - "CREEP_LIFE_TIME" "CREEP_CLAIM_LIFE_TIME" "CREEP_CORPSE_RATE" - - "CARRY_CAPACITY" "HARVEST_POWER" "HARVEST_MINERAL_POWER" - "REPAIR_POWER" "DISMANTLE_POWER" "BUILD_POWER" "ATTACK_POWER" - "UPGRADE_CONTROLLER_POWER" "RANGED_ATTACK_POWER" "HEAL_POWER" - "RANGED_HEAL_POWER" "REPAIR_COST" "DISMANTLE_COST" - - "RAMPART_DECAY_AMOUNT" "RAMPART_DECAY_TIME" "RAMPART_HITS" - "RAMPART_HITS_MAX" - - "ENERGY_REGEN_TIME" "ENERGY_DECAY" - - "SPAWN_HITS" "SPAWN_ENERGY_START" "SPAWN_ENERGY_CAPACITY" - "CREEP_SPAWN_TIME" - - "SOURCE_ENERGY_CAPACITY" "SOURCE_ENERGY_NEUTRAL_CAPACITY" - "SOURCE_ENERGY_KEEPER_CAPACITY" - - "WALL_HITS" "WALL_HITS_MAX" - - "EXTENSION_HITS" "EXTENSION_ENERGY_CAPACITY" - - "ROAD_HITS" "ROAD_WEAROUT" "ROAD_DECAY_AMOUNT" "ROAD_DECAY_TIME" - - "LINK_HITS" "LINK_HITS_MAX" "LINK_CAPACITY" "LINK_COOLDOWN" - "LINK_LOSS_RATIO" - - "STORAGE_CAPACITY" "STORAGE_HITS" - - "STRUCTURE_SPAWN" "STRUCTURE_EXTENSION" "STRUCTURE_ROAD" - "STRUCTURE_WALL" "STRUCTURE_RAMPART" "STRUCTURE_KEEPER_LAIR" - "STRUCTURE_PORTAL" "STRUCTURE_CONTROLLER" "STRUCTURE_LINK" - "STRUCTURE_STORAGE" "STRUCTURE_TOWER" "STRUCTURE_OBSERVER" - "STRUCTURE_POWER_BANK" "STRUCTURE_POWER_SPAWN" "STRUCTURE_EXTRACTOR" - "STRUCTURE_LAB" "STRUCTURE_TERMINAL" "STRUCTURE_CONTAINER" - "STRUCTURE_NUKER" - - "CONSTRUCTION_COST" - "CONSTRUCTION_COST_ROAD_SWAMP_RATIO" - - "CONTROLLER_LEVELS" "CONTROLLER_STRUCTURES" "CONTROLLER_DOWNGRADE" - "CONTROLLER_CLAIM_DOWNGRADE" "CONTROLLER_RESERVE" - "CONTROLLER_RESERVE_MAX" "CONTROLLER_MAX_UPGRADE_PER_TICK" - "CONTROLLER_ATTACK_BLOCKED_UPGRADE" - - "TOWER_HITS" "TOWER_CAPACITY" "TOWER_ENERGY_COST" - "TOWER_POWER_ATTACK" "TOWER_POWER_HEAL" "TOWER_POWER_REPAIR" - "TOWER_OPTIMAL_RANGE" "TOWER_FALLOFF_RANGE" "TOWER_FALLOFF" - - "OBSERVER_HITS" "OBSERVER_RANGE" - - "POWER_BANK_HITS" "POWER_BANK_CAPACITY_MAX" - "POWER_BANK_CAPACITY_MIN" "POWER_BANK_CAPACITY_CRIT" - "POWER_BANK_DECAY" "POWER_BANK_HIT_BACK" - - "POWER_SPAWN_HITS" "POWER_SPAWN_ENERGY_CAPACITY" - "POWER_SPAWN_POWER_CAPACITY" "POWER_SPAWN_ENERGY_RATIO" - - "EXTRACTOR_HITS" - - "LAB_HITS" "LAB_MINERAL_CAPACITY" - "LAB_ENERGY_CAPACITY" "LAB_BOOST_ENERGY" "LAB_BOOST_MINERAL" - "LAB_COOLDOWN" - - "GCL_POW" "GCL_MULTIPLY" "GCL_NOVICE" - - "MODE_SIMULATION" "MODE_SURVIVAL" "MODE_WORLD" "MODE_ARENA" - - "TERRAIN_MASK_WALL" "TERRAIN_MASK_SWAMP" "TERRAIN_MASK_LAVA" - - "MAX_CONSTRUCTION_SITES" "MAX_CREEP_SIZE" - - "MINERAL_REGEN_TIME" "MINERAL_MIN_AMOUNT" "MINERAL_RANDOM_FACTOR" - - "TERMINAL_CAPACITY" "TERMINAL_HITS" "TERMINAL_SEND_COST" - "TERMINAL_MIN_SEND" - - "CONTAINER_HITS" "CONTAINER_CAPACITY" "CONTAINER_DECAY" - "CONTAINER_DECAY_TIME" "CONTAINER_DECAY_TIME_OWNED" - - "NUKER_HITS" "NUKER_COOLDOWN" "NUKER_ENERGY_CAPACITY" - "NUKER_GHODIUM_CAPACITY" "NUKE_LAND_TIME" "NUKE_RANGE" "NUKE_DAMAGE" - - "RESOURCE_ENERGY" "RESOURCE_POWER" - - "RESOURCE_HYDROGEN" "RESOURCE_OXYGEN" "RESOURCE_UTRIUM" - "RESOURCE_LEMERGIUM" "RESOURCE_KEANIUM" "RESOURCE_ZYNTHIUM" - "RESOURCE_CATALYST" "RESOURCE_GHODIUM" - - "RESOURCE_HYDROXIDE" "RESOURCE_ZYNTHIUM_KEANITE" - "RESOURCE_UTRIUM_LEMERGITE" - - "RESOURCE_UTRIUM_HYDRIDE" "RESOURCE_UTRIUM_OXIDE" - "RESOURCE_KEANIUM_HYDRIDE" "RESOURCE_KEANIUM_OXIDE" - "RESOURCE_LEMERGIUM_HYDRIDE" "RESOURCE_LEMERGIUM_OXIDE" - "RESOURCE_ZYNTHIUM_HYDRIDE" "RESOURCE_ZYNTHIUM_OXIDE" - "RESOURCE_GHODIUM_HYDRIDE" "RESOURCE_GHODIUM_OXIDE" - - "RESOURCE_UTRIUM_ACID" "RESOURCE_UTRIUM_ALKALIDE" - "RESOURCE_KEANIUM_ACID" "RESOURCE_KEANIUM_ALKALIDE" - "RESOURCE_LEMERGIUM_ACID" "RESOURCE_LEMERGIUM_ALKALIDE" - "RESOURCE_ZYNTHIUM_ACID" "RESOURCE_ZYNTHIUM_ALKALIDE" - "RESOURCE_GHODIUM_ACID" "RESOURCE_GHODIUM_ALKALIDE" - - "RESOURCE_CATALYZED_UTRIUM_ACID" - "RESOURCE_CATALYZED_UTRIUM_ALKALIDE" - "RESOURCE_CATALYZED_KEANIUM_ACID" - "RESOURCE_CATALYZED_KEANIUM_ALKALIDE" - "RESOURCE_CATALYZED_LEMERGIUM_ACID" - "RESOURCE_CATALYZED_LEMERGIUM_ALKALIDE" - "RESOURCE_CATALYZED_ZYNTHIUM_ACID" - "RESOURCE_CATALYZED_ZYNTHIUM_ALKALIDE" - "RESOURCE_CATALYZED_GHODIUM_ACID" - "RESOURCE_CATALYZED_GHODIUM_ALKALIDE" - - "REACTIONS" "BODYPARTS_ALL" "RESOURCES_ALL" "COLORS_ALL")) - -(defun +javascript|init-screeps-mode () - (when (eq major-mode 'js2-mode) - (push 'javascript-jshint flycheck-disabled-checkers) - (setq js2-additional-externs (append '("_") screeps-objects screeps-constants)))) - diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index c01b837af..f01e5b011 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -234,9 +234,3 @@ (def-project-mode! +javascript-gulp-mode :when (locate-dominating-file default-directory "gulpfile.js")) - -(def-project-mode! +javascript-screeps-mode - :match "/screeps\\(?:-ai\\)?/.+$" - :modes (+javascript-npm-mode) - :add-hooks (+javascript|init-screeps-mode) - :on-load (load! "+screeps")) From 937252af4e78c5fbfa82fa2a7b423c75b3c82b97 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 29 Dec 2018 00:09:17 -0500 Subject: [PATCH 3533/4235] lang/csharp: add +unity flag And group shader-mode & +csharp-unity-mode under it. --- modules/lang/csharp/config.el | 13 +++++++++---- modules/lang/csharp/packages.el | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 0e38143b1..5ba7960d7 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,9 +1,5 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- -;; `shader-mode' --- unity shaders -(add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) - - (def-package! omnisharp :hook (csharp-mode . omnisharp-mode) :commands omnisharp-install-server @@ -51,3 +47,12 @@ "r" (λ! (omnisharp-unit-test "fixture")) "s" (λ! (omnisharp-unit-test "single")) "a" (λ! (omnisharp-unit-test "all"))))) + + +(when (featurep! +unity) + ;; `shader-mode' --- unity shaders + (add-to-list 'auto-mode-alist '("\\.shader$" . shader-mode)) + + (def-project-mode! +csharp-unity-mode + :modes (csharp-mode shader-mode) + :files (and "Assets" "Library/MonoManager.asset" "Library/ScriptMapper"))) diff --git a/modules/lang/csharp/packages.el b/modules/lang/csharp/packages.el index 57ba0f02e..49b94bed4 100644 --- a/modules/lang/csharp/packages.el +++ b/modules/lang/csharp/packages.el @@ -3,5 +3,6 @@ (package! csharp-mode) (package! omnisharp) -(package! shader-mode) +(when (featurep! +unity) + (package! shader-mode)) From 747c040c0eb76deaf57a16495919ae7243021349 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 29 Dec 2018 20:56:12 -0500 Subject: [PATCH 3534/4235] default/config: explicitly use :states #1084 The 'motion alias didn't appear to be working. --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index cf4022c00..c099cab22 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -755,7 +755,7 @@ customized by changing `+default-repeat-forward-key' and (let ((fn-sym (intern (format "+default*repeat-%s" (doom-unquote command))))) `(progn (defun ,fn-sym (&rest _) - (define-key! 'motion + (define-key! :states 'motion (car +default-repeat-keys) #',next-func (cdr +default-repeat-keys) #',prev-func)) (advice-add #',command :before #',fn-sym)))) From c82f71e7fed6fc3dc326a152420f6901af411bfd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 29 Dec 2018 21:06:49 -0500 Subject: [PATCH 3535/4235] lang/haskell: disable subword-mode by default subword-mode is enabled by default for no other language, nor is it the default behavior in vim (and it affects evil word motions), so it should be opt-in. Mentioned in #1083 --- modules/lang/haskell/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index ec1c8cbee..28daa4e64 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -12,8 +12,7 @@ (when (featurep! :feature syntax-checker) (setq haskell-process-show-overlays nil)) ; flycheck makes this unnecessary (add-hook! 'haskell-mode-hook - #'(subword-mode ; improves text navigation with camelCase - haskell-collapse-mode ; support folding haskell code blocks + #'(haskell-collapse-mode ; support folding haskell code blocks interactive-haskell-mode)) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) From 2107e3caafb3856a3ecfd2b170162af568b5eeb8 Mon Sep 17 00:00:00 2001 From: fydai <37062708+fydai@users.noreply.github.com> Date: Sun, 30 Dec 2018 04:16:40 -0800 Subject: [PATCH 3536/4235] ui/vc-gutter: switch git-gutter order This change checks whether a file is remote before checking whether it's a version controlled repo, rather than the other way around. Gives a slight speed improvement to Tramp. --- modules/ui/vc-gutter/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index 1a3979bcd..9ee858511 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -25,9 +25,9 @@ to the right fringe.") (defun +version-control|git-gutter-maybe () "Enable `git-gutter-mode' in non-remote buffers." (when (and buffer-file-name - (vc-backend buffer-file-name) (or +vc-gutter-in-remote-files - (not (file-remote-p buffer-file-name)))) + (not (file-remote-p buffer-file-name))) + (vc-backend buffer-file-name)) (if (display-graphic-p) (progn (require 'git-gutter-fringe) From 6d10b9bbdf756a204b9555777cdc3db2ed9d44f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 31 Dec 2018 15:00:05 -0500 Subject: [PATCH 3537/4235] Revert to Meta, instead of Super Using meta is a little more flexible. Since there is no dedicated meta key on our keyboards (anymore), it can be remapped to another modifier by changing mac-command-modifier, x-meta-keysym, etc. without sacrificing super or alt keybinds. --- core/core-os.el | 15 ++---- modules/config/default/+evil-bindings.el | 30 ++++++----- modules/config/default/config.el | 63 +++++++++++++----------- 3 files changed, 55 insertions(+), 53 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 6a45a20d6..4ca91a5d8 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -20,13 +20,9 @@ (when (featurep 'exec-path-from-shell) `(exec-path-from-shell-copy-envs ,@vars))) -;; key conventions: -;; alt/option = meta -;; windows/command = super - (cond (IS-MAC - (setq mac-command-modifier 'super - mac-option-modifier 'meta + (setq mac-command-modifier 'meta + mac-option-modifier 'alt ;; sane trackpad/mouse scroll settings mac-redisplay-dont-reset-vscroll t mac-mouse-wheel-smooth-scroll nil @@ -68,12 +64,7 @@ x-underline-at-descent-line t)) ; draw underline lower (IS-WINDOWS - (setq w32-get-true-file-attributes nil ; fix file io slowdowns - ;; map window keys to super (unreliable) - w32-pass-lwindow-to-system nil - w32-pass-rwindow-to-system nil - w32-lwindow-modifier 'super - w32-rwindow-modifier 'super) + (setq w32-get-true-file-attributes nil) ; fix file io slowdowns (when (display-graphic-p) (setenv "GIT_ASKPASS" "git-gui--askpass")))) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index c099cab22..d53d50aa3 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -17,11 +17,9 @@ ;; Global keybindings (map! (:map override - ;; Make M-x more accessible - "s-x" 'execute-extended-command - "M-x" 'execute-extended-command ;; A little sandbox to run code in - "s-;" 'eval-expression) + "A-;" 'eval-expression + "M-;" 'eval-expression) [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag @@ -68,7 +66,7 @@ :m "B" #'realgud:cmd-clear) (:when (featurep! :feature eval) - :g "s-r" #'+eval/buffer + :g "M-r" #'+eval/buffer :nv "gr" #'+eval:region :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region) @@ -189,9 +187,9 @@ (:map yas-keymap "C-e" #'+snippets/goto-end-of-field "C-a" #'+snippets/goto-start-of-field - [s-right] #'+snippets/goto-end-of-field - [s-left] #'+snippets/goto-start-of-field - [s-backspace] #'+snippets/delete-to-start-of-field + [M-right] #'+snippets/goto-end-of-field + [M-left] #'+snippets/goto-start-of-field + [M-backspace] #'+snippets/delete-to-start-of-field [backspace] #'+snippets/delete-backward-char [delete] #'+snippets/delete-forward-char-or-field) (:map yas-minor-mode-map @@ -219,7 +217,17 @@ :n "gt" #'+workspace/switch-right :n "gT" #'+workspace/switch-left :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left)) + :n "[w" #'+workspace/switch-left + :g "M-1" (λ! (+workspace/switch-to 0)) + :g "M-2" (λ! (+workspace/switch-to 1)) + :g "M-3" (λ! (+workspace/switch-to 2)) + :g "M-4" (λ! (+workspace/switch-to 3)) + :g "M-5" (λ! (+workspace/switch-to 4)) + :g "M-6" (λ! (+workspace/switch-to 5)) + :g "M-7" (λ! (+workspace/switch-to 6)) + :g "M-8" (λ! (+workspace/switch-to 7)) + :g "M-9" (λ! (+workspace/switch-to 8)) + :g "M-0" #'+workspace/switch-to-last)) ;;; :completion (map! (:when (featurep! :completion company) @@ -448,9 +456,7 @@ :after markdown-mode :map markdown-mode-map ;; fix conflicts with private bindings - "" nil - "" nil - "" nil)) + [backspace] nil)) ;; diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 85f35fc7f..835cf66e4 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -127,35 +127,8 @@ (when IS-MAC ;; Fix MacOS shift+tab (define-key input-decode-map [S-iso-lefttab] [backtab]) - - (define-key! - ;; Buffer-local font scaling - "s-+" (λ! (text-scale-set 0)) - "s-=" #'text-scale-increase - "s--" #'text-scale-decrease - ;; Fix frame-switching on MacOS - "s-`" #'other-frame - ;; Simple window/frame navigation/manipulation - "s-w" #'delete-window - "s-W" #'delete-frame - "s-n" #'+default/new-buffer - "s-N" #'make-frame - ;; Textmate-esque bindings - "s-a" #'mark-whole-buffer - "s-b" #'+default/compile - "s-f" #'swiper - "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) - ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because - ;; it imposes some other functionality and overhead we don't need) - "s-z" #'undo - "s-s" #'save-buffer - "s-c" (if (featurep 'evil) 'evil-yank 'copy-region-as-kill) - "s-v" #'yank - ;; textmate-esque newline insertion - [s-return] #'evil-open-below - [S-s-return] #'evil-open-above - ;; textmate-esque deletion - [s-backspace] #'doom/backward-kill-to-bol-and-indent)) + ;; Fix frame-switching key on MacOS + (global-set-key (kbd "M-`") #'other-frame)) ;; @@ -166,6 +139,38 @@ (map! "C-b" #'backward-word "C-f" #'forward-word) + ;; Make M-x more accessible + (define-key! 'override + "M-x" #'execute-extended-command + "A-x" #'execute-extended-command) + + (define-key! + ;; Buffer-local font scaling + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease + ;; Simple window/frame navigation/manipulation + "M-w" #'delete-window + "M-W" #'delete-frame + "M-n" #'+default/new-buffer + "M-N" #'make-frame + ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because + ;; it imposes some other functionality and overhead we don't need) + "M-z" #'undo + "M-s" #'save-buffer + "M-c" (if (featurep 'evil) 'evil-yank 'copy-region-as-kill) + "M-v" #'yank + ;; Textmate-esque bindings + "M-a" #'mark-whole-buffer + "M-b" #'+default/compile + "M-f" #'swiper + "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) + ;; textmate-esque newline insertion + [M-return] #'evil-open-below + [M-S-return] #'evil-open-above + ;; textmate-esque deletion + [M-backspace] #'doom/backward-kill-to-bol-and-indent) + (if (featurep 'evil) (load! "+evil-bindings") (load! "+emacs-bindings"))) From 81394cf733bff09cc0362b49baa897e5991ed1ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 31 Dec 2018 15:18:45 -0500 Subject: [PATCH 3538/4235] Only prefer compiled theme on startup ...But not on doom/reload-theme or post-init load-theme calls. --- core/autoload/ui.el | 4 +++- core/core-ui.el | 22 +++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 168a5fa8f..2b6ee3f52 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -88,7 +88,9 @@ See `display-line-numbers' for what these values mean." (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) (when theme (mapc #'disable-theme custom-enabled-themes)) - (doom|init-theme) + (when (and doom-theme (not (memq doom-theme custom-enabled-themes))) + (let (doom--prefer-theme-elc) + (load-theme doom-theme t))) (doom|init-fonts))) ;;;###autoload diff --git a/core/core-ui.el b/core/core-ui.el index 7c5595028..9eca1a770 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -53,6 +53,10 @@ size.") (defvar doom-init-ui-hook nil "List of hooks to run when the UI has been initialized.") +(defvar doom--prefer-theme-elc nil + "If non-nil, `load-theme' will prefer the compiled theme (unlike its default +behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") + (setq-default ansi-color-for-comint-mode t bidi-display-reordering nil ; disable bidirectional text for tiny performance boost @@ -360,7 +364,8 @@ frame's window-system, the theme will be reloaded.") (defun doom|init-theme () "Set the theme and load the font, in that order." (when (and doom-theme (not (memq doom-theme custom-enabled-themes))) - (load-theme doom-theme t))) + (let ((doom--prefer-theme-elc t)) + (load-theme doom-theme t)))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and ;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. @@ -477,12 +482,15 @@ instead). Meant for `kill-buffer-query-functions'." (advice-add #'load-theme :around #'doom*disable-old-themes-first) (defun doom*prefer-compiled-theme (orig-fn &rest args) - "Make `load-theme' prioritize the byte-compiled theme (if it exists) for a -moderate boost in startup (or theme switch) time." - (cl-letf* ((old-locate-file (symbol-function 'locate-file)) - ((symbol-function 'locate-file) - (lambda (filename path &optional _suffixes predicate) - (funcall old-locate-file filename path '("c" "") predicate)))) + "Make `load-theme' prioritize the byte-compiled theme for a moderate boost in +startup (or theme switch) time, so long as `doom--prefer-theme-elc' is non-nil." + (if (or (null after-init-time) + doom--prefer-theme-elc) + (cl-letf* ((old-locate-file (symbol-function 'locate-file)) + ((symbol-function 'locate-file) + (lambda (filename path &optional _suffixes predicate) + (funcall old-locate-file filename path '("c" "") predicate)))) + (apply orig-fn args)) (apply orig-fn args))) (advice-add #'load-theme :around #'doom*prefer-compiled-theme) From 9f455edcdf893084c5389e79f2e5bf663fc052be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 31 Dec 2018 15:28:35 -0500 Subject: [PATCH 3539/4235] Add interactive form to +default/project-tasks It is required for key-bound commands. Also added a docstring. --- modules/config/default/autoload/default.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 6a917fe45..9d9bbd56f 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -87,5 +87,7 @@ If ARG (universal argument), runs `compile' from the current directory." ;;;###autoload (defun +default/project-tasks () + "Invokes `+ivy/tasks' or `+helm/tasks', depending on which is available." + (interactive) (cond ((featurep! :completion ivy) (+ivy/tasks) (featurep! :completion helm) (+helm/tasks)))) From 46499ec70fae2b311f7bafe986db4af1e9d020b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 31 Dec 2018 15:54:55 -0500 Subject: [PATCH 3540/4235] config/default: minor keybind refactor --- modules/config/default/+evil-bindings.el | 2 +- modules/config/default/config.el | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 865182ba7..027cb3ff6 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -25,7 +25,7 @@ [remap find-tag] #'projectile-find-tag ;; Smart tab - :i [tab] (general-predicate-dispatch nil + :i [tab] (general-predicate-dispatch nil ; fall back to nearest keymap (and (featurep! :feature snippets) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) 'yas-expand diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 835cf66e4..09e10fedc 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -135,16 +135,15 @@ ;; Doom's keybinding scheme (when (featurep! +bindings) - ;; Ensure Emacsien motions are available - (map! "C-b" #'backward-word - "C-f" #'forward-word) - ;; Make M-x more accessible (define-key! 'override "M-x" #'execute-extended-command "A-x" #'execute-extended-command) (define-key! + ;; Ensure Emacsien motions are available + "C-b" #'backward-word + "C-f" #'forward-word ;; Buffer-local font scaling "M-+" (λ! (text-scale-set 0)) "M-=" #'text-scale-increase From 6e57350277538b8be5b2ccf85c6d56528b7d4f4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 31 Dec 2018 15:57:06 -0500 Subject: [PATCH 3541/4235] lang/org: restore meta return keybinds --- modules/lang/org/config.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index e47b79016..1bfaecb67 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -364,12 +364,11 @@ between the two." ;; more intuitive RET keybinds :i [return] #'org-return-indent :n [return] #'+org/dwim-at-point + ;; textmate-esque newline insertion :nvi [C-return] (λ! (+org/insert-item 'below)) :nvi [C-S-return] (λ! (+org/insert-item 'above)) - (:when IS-MAC - ;; textmate-esque newline insertion - :nvi [s-return] (λ! (+org/insert-item 'below)) - :nvi [S-s-return] (λ! (+org/insert-item 'above))) + :nvi [M-return] (λ! (+org/insert-item 'below)) + :nvi [M-S-return] (λ! (+org/insert-item 'above)) ;; more vim-esque org motion keys (not covered by evil-org-mode) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) From 4036f3dad1d51d68adeb7c0e2a32fd7bceb45581 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 2 Jan 2019 15:16:05 +0100 Subject: [PATCH 3542/4235] pdf-tools: fixes for the new `modeline` module Sneak in a comment that addresses some TODOs. --- modules/tools/pdf/+modeline.el | 4 ++-- modules/tools/pdf/config.el | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/tools/pdf/+modeline.el b/modules/tools/pdf/+modeline.el index 916886aae..f3fe0532c 100644 --- a/modules/tools/pdf/+modeline.el +++ b/modules/tools/pdf/+modeline.el @@ -6,8 +6,8 @@ (if (featurep! :ui modeline) (def-modeline-format! '+pdf - '(+mode-line-bar " " +mode-line-buffer-id " " +pdf-pages) - '(+mode-line-major-mode +mode-line-vcs)) + '(+modeline-matches " " +modeline-buffer-id " " +pdf-pages) + '(+modeline-major-mode (vc-mode (" " +modeline-vcs)))) (def-modeline! '+pdf '(bar matches " " buffer-info " " +pdf-pages) '(major-mode vcs))) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index b4ce9e2d0..7ff08b179 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -34,8 +34,7 @@ (load! "+modeline")) ;; Handle PDF-tools related popups better (set-popup-rule! "^\\*Outline*" :side 'right :size 40 :select nil) - ;; TODO: Add additional important windows that should be handled differently - ;; TODO: These two next rules don't work (they should), investigate + ;; The next rules are not needed, they are defined in modules/ui/popups/+hacks.el ;; (set-popup-rule! "\\*Contents\\*" :side 'right :size 40) ;; (set-popup-rule! "* annots\\*$" :side 'left :size 40 :select nil) ) From 9628a74718b14d5cb19a365a516bccd18e24cc4e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 Jan 2019 13:17:26 -0500 Subject: [PATCH 3543/4235] Fix disable-packages! macro Now rolls out package! calls, rather than adjusting state directly. --- core/core-packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-packages.el b/core/core-packages.el index 438c524a3..e42f9cc15 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -234,7 +234,9 @@ packages at once. Only use this macro in a module's packages.el file." (doom--assert-stage-p 'packages #'disable-packages!) - `(setq doom-disabled-packages (append ',packages doom-disabled-packages))) + (macroexp-progn + (cl-loop for pkg in packages + collect `(package! ,pkg :disable t)))) (defmacro depends-on! (module submodule &optional flags) "Declares that this module depends on another. From d3882f539c26fe762863f96e7a0c53982906d5e7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 Jan 2019 13:18:19 -0500 Subject: [PATCH 3544/4235] Remove :if from map! It doesn't work as expected and would require too much work to support. --- core/core-keybinds.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index e21d101f5..112275842 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -148,7 +148,6 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (put :mode 'lisp-indent-function 'defun) (put :prefix 'lisp-indent-function 'defun) (put :unless 'lisp-indent-function 'defun) -(put :if 'lisp-indent-function 'defun) (put :when 'lisp-indent-function 'defun) ;; specials @@ -190,7 +189,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See collect (intern (concat (symbol-name m) "-map"))) rest) (push :map rest)) - ((or :if :when :unless) + ((or :when :unless) (doom--map-nested (list (intern (doom-keyword-name key)) (pop rest)) rest) (setq rest nil)) (:prefix From 8a7a684fc9bc08fa1c89e689bac4b8272ecdd0bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 Jan 2019 13:19:02 -0500 Subject: [PATCH 3545/4235] Restore SPC b b/SPC b B and SPC ,/SPC < keybinds Restores workspace-restricted buffer switching. --- modules/config/default/+evil-bindings.el | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 027cb3ff6..332ac74f0 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -474,7 +474,12 @@ :desc "Toggle last popup" "~" #'+popup/toggle :desc "Find file" "." #'find-file - :desc "Switch to buffer" "," #'switch-to-buffer + + (:when (featurep! :feature workspaces) + :desc "Switch workspace buffer" "," #'persp-switch-to-buffer + :desc "Switch buffer" "<" #'switch-to-buffer) + (:unless (featurep! :feature workspaces) + :desc "Switch buffer" "," #'switch-to-buffer) :desc "Resume last search" "'" (cond ((featurep! :completion ivy) #'ivy-resume) @@ -550,7 +555,11 @@ :desc "Sudo edit this file" "S" #'doom/sudo-this-file :desc "Previous buffer" "[" #'previous-buffer :desc "Next buffer" "]" #'next-buffer - :desc "Switch buffer" "b" #'switch-to-buffer + (:when (featurep! :feature workspaces) + :desc "Switch workspace buffer" "b" #'persp-switch-to-buffer + :desc "Switch buffer" "B" #'switch-to-buffer) + (:unless (featurep! :feature workspaces) + :desc "Switch buffer" "b" #'switch-to-buffer) :desc "Kill buffer" "k" #'kill-this-buffer :desc "Next buffer" "n" #'next-buffer :desc "Kill other buffers" "o" #'doom/kill-other-buffers From 78ebec77ce2896c6d13ad807b9414d70672e661d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 Jan 2019 13:56:13 -0500 Subject: [PATCH 3546/4235] Update packages after bin/doom upgrade --- core/cli/upgrade.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/cli/upgrade.el b/core/cli/upgrade.el index 09329cb87..cf7b55c73 100644 --- a/core/cli/upgrade.el +++ b/core/cli/upgrade.el @@ -67,6 +67,7 @@ (unless (equal (vc-git-working-revision doom-emacs-dir) rev) (error "Failed to checkout latest commit.\n\n%s" (buffer-string))) (doom-refresh 'force) + (doom-packages-update doom-auto-accept) (message "Done! Please restart Emacs for changes to take effect"))) (user-error (message "%s Aborting." (error-message-string e))) From 3923760c7ccbca9aec7050117b91797c5ded8e77 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 Jan 2019 14:11:02 -0500 Subject: [PATCH 3547/4235] Adjust compile-time state in package helper macros --- core/core-packages.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index e42f9cc15..94908abc4 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -226,7 +226,9 @@ packages at once. Only use this macro in a module's packages.el file." (doom--assert-stage-p 'packages #'packages!) - `(progn ,@(cl-loop for desc in packages collect `(package! ,@(doom-enlist desc))))) + (macroexp-progn + (cl-loop for desc in packages + collect (macroexpand `(package! ,@(doom-enlist desc)))))) (defmacro disable-packages! (&rest packages) "A convenience macro like `package!', but allows you to disable multiple @@ -236,7 +238,7 @@ Only use this macro in a module's packages.el file." (doom--assert-stage-p 'packages #'disable-packages!) (macroexp-progn (cl-loop for pkg in packages - collect `(package! ,pkg :disable t)))) + collect (macroexpand `(package! ,pkg :disable t))))) (defmacro depends-on! (module submodule &optional flags) "Declares that this module depends on another. From 5e3d4c3ba286f4b9ef5a59e502ff733673e38e46 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 2 Jan 2019 16:06:20 -0500 Subject: [PATCH 3548/4235] Update map! tests for removal of :if --- core/test/test-core-keybinds.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index 4a0c97774..294cc1ea7 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -173,9 +173,9 @@ :to-expand-into `(general-define-key "a" (list :def #'a :which-key "A"))))) - (describe ":if/:when/:unless" + (describe ":when/:unless" (it "wraps keys in a conditional block" - (dolist (prop '(:if :when :unless)) + (dolist (prop '(:when :unless)) (let ((prop-fn (intern (doom-keyword-name prop)))) (expect `(map! ,prop t "a" #'a "b" #'b) :to-expand-into From 570bbb99571f2cdd23064eabb3b6c94a6c5802d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:15:32 -0500 Subject: [PATCH 3549/4235] Rewrite project README --- README.md | 271 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 165 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index c9d504d69..7a2f9d8d4 100644 --- a/README.md +++ b/README.md @@ -1,137 +1,196 @@ +Main screenshot + +Current release + + build status (master) + + + build status (develop) + + + Discord Server + +

- Current release - build status (master) - build status (develop) - Chat on discord - Main screenshot + wiki  |  + screenshots  |  + faq  |  + troubleshooting  |  + changelog

- - - -

- Wiki | - Screenshots | - Troubleshooting | - FAQ | - Changelog -

+Quick start +----------- -- - - +```bash +git clone https://github.com/hlissner/doom-emacs ~/.emacs.d +~/.emacs.d/bin/doom quickstart +``` + +> Doom supports Emacs 25.3 and newer, but **Emacs 26.1 is recommended.** Doom +> works best on Linux & MacOS. Your mileage may vary on Windows. + + +Table of Contents +================== +- [What is Doom Emacs](#what-is-doom-emacs) + - [Doom's mantras](#dooms-mantras) + - [Feature highlights](#feature-highlights) +- [Getting Help](#getting-help) +- [Contributing](#contributing) + + +What is Doom Emacs +================== - + It is a story as old as time. A stubborn, shell-dwelling, and melodramatic vimmer -- envious of the features of modern text editors -- spirals into despair -before finally succumbing to the [dark side][evil-mode]. This is his config. +before succumbing to the [dark side][evil-mode]. This is his config. -Doom strives to be fast, fabulous and hacker friendly. It is tailored for -neckbeards with blue belts or better in command-line-fu, Elisp and git. +Doom is a configuration for [GNU Emacs](https://www.gnu.org/software/emacs/). It +can be used as framework for your own configuration, or as a resource for fellow +Emacs enthusiasts who want to learn more about our favorite OS. -> Doom **only** supports Emacs >= 25.1, and is tested on Arch Linux 4.7+ and -> MacOS 10.11. YMMV on other platforms. +Doom's mantras +-------------- +- **Gotta go fast.** Startup and runtime speed are high priorities; many + expensive, heavy-handed features and packages have been fine-tuned to that + end. +- **Hacker-friendly.** Doom caters to the command line denizen unafraid of + writing a little (or a lot of) code to tailor their editor. It also inherits + your shell configuration, warts 'n all, and expects frequent trips into the + terminal to manage Doom with its `bin/doom` utility. +- **Opinionated, but not stubborn.** Doom has _many_ opinions spread out across + its 120+ modules designed to iron out idiosynchrosies and provide a better and + more consistent baseline experience of Emacs and its plugins. However, they + mustn't ever compromise your ability to change, rewrite or disable any or all + of it, if you ask nicely. +- **Written to be read.** Doom's source ought to be self documenting and easy to + grok. Modules should be syntactically sweet and concise, and backend logic + should be explicit and abstraction-light. Where complexity arises, comments + and documentation shouldn't be far away. -- - - +Feature Highlights +------------------ +- A declarative [package management system][doom:packages] with a command line + interface that combines package.el, [use-package] and [quelpa], allowing you + to install packages from anywhere. +- A [popup management system][doom:popups] with customizable rules to dictate + how temporary/disposable buffers are displayed. +- A vim-centric (and optional) experience with [evil-mode], including ports of + several popular vim plugins, C-x omnicompletion and a slew of + [custom ex commands][doom:commands]. +- A Spacemacs-esque [keybinding scheme][doom:bindings], centered around leader + and localleader prefix keys (SPC and SPCm, by + default). +- Indentation detection and optional integration with [url:editorconfig]. Let + someone else argue about tabs vs ___***spaces***___. +- Code completion for many languages, powered by + [company-mode][url:company-mode] (some may have external dependencies). +- Project-awareness powered by [projectile][url:projectile], with tools and an + API to navigate and manage projects, as well as project/framework-specific + minor modes and snippets libraries (and the ability to define your own). +- Project search (and replace) utilities, powered by + [the_silver_searcher][url:ag], [ripgrep][url:rg], git-grep and + [wgrep][url:wgrep], with integration for [ivy][url:ivy] (the default) and + [url:helm]. +- Isolated and persistent workspaces powered by [persp-mode][url:persp-mode]. + Also substitutes as vim tabs. +- Inline/live code evaluation (using [quickrun][url:quickrun]), with REPL + support for a variety of languages. +- A jump-to-definition/references implementation for all languages that tries to + "just work," resorting to mode-specific functionality, before falling back on + [dump-jump][url:dumb-jump]. -## Quick start -```bash -git clone https://github.com/hlissner/doom-emacs ~/.emacs.d -cd ~/.emacs.d -make quickstart -``` +Troubleshooting +=============== -Don't forget to run `make` each time you modify init.el or update Doom! +Encountered strange behavior or an error? Here are some things to try before you +shoot off that bug report: -Visit the wiki for [a more detailed guide on installing, customizing and -grokking Doom][wiki]. +- Run `bin/doom refresh`. This ensures Doom is properly set up and its autoloads + files are up-to-date. +- If you have byte-compiled your config (with `bin/doom compile`), see if + `bin/doom clean` makes your issue go away. Never debug issues with a + byte-compiled config, it will only make your job harder. +- Run `bin/doom doctor` to detect common issues in your development environment. +- Search Doom's issue tracker for mention of any error messages you've received. +- [Visit our FAQ][docs:faq] to see if your issue is listed. -## Feature highlights +If all else fails, [file that bug report][github:new-issue]! Please include the +behavior you've observed, the behavior you expected, and any error message in +the \*Messages\* buffer (can be opened with SPC h m or `M-x +view-echo-area-messages`). It'd be a great help if you included a backtrace with +them as well. -+ A fast, organized and opinionated Emacs configuration with a command line - interface. -+ A custom, declarative [package management system][doom-packages] that combines - package.el, [use-package] and [quelpa], allowing you to manage packages from - the command line and install packages from sources other than ELPA. -+ A [popup management system][doom-popups] (powered by [shackle]) that minimizes - the presence and footprint of temporary and/or disposable buffers. -+ A vim-like experience with [evil-mode], including ports for several vim - plugins, C-x omnicompletion and a slew of [custom ex - commands][doom-my-commands]. -+ Integration with [editorconfig]. Let someone else argue about tabs and spaces. - (spaces, duh). -+ Code completion for many languages, powered by [company-mode] (some languages - may have external dependencies). -+ Project-awareness powered by [projectile], with tools and an API to navigate - and manage projects and their files. -+ Fast project search (and replace) utilities, powered by [the_silver_searcher], - [ripgrep] and [wgrep], with integration for [ivy] (the default), [helm] and - ido. -+ Isolated and persistent workspaces powered by [persp-mode]. Also substitutes - for vim tabs. -+ Inline/live code evaluation (using [quickrun]), including REPLs for a variety - of languages. +We've also got [a Discord server][url:discord]. Hop on! We can help! -## Troubleshooting -Found a problem? Here are some things to try: - -+ 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][wiki-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 all else has failed, [file a bug report][doom-new-issue]. - -## Contribute +Contributing +============ Doom (and my Emacs work in general) is a labor of love and incurable madness, -done on my spare time. It wasn't intended for public use, but I enjoy making -Doom a resource for others. +done on my spare time. If you'd like to support my work, I welcome +contributions: -If you'd like to support my efforts, I welcome contributions of any kind: - -+ I love pull requests and bug reports. Elisp pointers are especially welcome. - Seriously, don't hesitate to [tell me my Elisp-fu sucks][doom-new-issue]! -+ Talk to me about Emacs workflow, ideas or tooling. Or talk to me about - gamedev, or pixel art, or anime, or programming, or the weather, or band camp. - Whatever. I don't mind. Holler at henrik@lissner.net. +- I love pull requests and bug reports. Check out the [Contributing + Guidelines][docs:contributing] (WIP) to find out how you can help out. +- I welcome Elisp pointers! Don't hesitate to [tell me my Elisp-fu + sucks][github:new-issue] (but please tell me why). +- Hop on [our Discord server][url:discord] and say hi! Help others out, hang out + or talk to me about Emacs, or gamedev, or programming, machine learning, + physics, pixel art, anime, gaming -- anything you like. Nourish this lonely + soul! +- If you'd like to support my work financially, consider buying me a drink + through [liberapay][url:liberapay] or [paypal][url:paypal]. Donations are a + great help. My work here contends with full-time studies, my ventures in indie + gamedev, and my freelance work. -[wiki]: /../../wiki -[wiki-conventions]: /../../wiki/Conventions -[wiki-modules]: /../../wiki/Modules -[wiki-customization]: /../../wiki/Customization -[wiki-troubleshooting]: /../../wiki/FAQ#troubleshooting + + + + + + +[docs:faq]: /../../wiki/FAQ -[doom-my-bindings]: modules/private/hlissner/+bindings.el -[doom-my-commands]: modules/private/hlissner/+commands.el -[doom-new-issue]: https://github.com/hlissner/doom-emacs/issues/new -[doom-packages]: core/autoload/packages.el -[doom-popups]: modules/ui/popup -[doom-theme]: https://github.com/hlissner/emacs-doom-theme +[github:new-issue]: https://github.com/hlissner/doom-emacs/issues/new +[doom:bindings]: modules/config/default/+bindings.el +[doom:commands]: modules/config/default/+evil-commands.el +[doom:packages]: core/autoload/packages.el +[doom:popups]: modules/feature/popup/README.org -[company-mode]: https://github.com/company-mode/company-mode -[editorconfig]: http://editorconfig.org/ -[evil-mode]: https://github.com/emacs-evil/evil -[git-gutter-fringe]: https://github.com/syohex/emacs-git-gutter-fringe -[helm]: https://github.com/emacs-helm/helm -[ivy]: https://github.com/abo-abo/swiper -[persp-mode]: https://github.com/Bad-ptr/persp-mode.el -[projectile]: https://github.com/bbatsov/projectile -[quelpa]: https://github.com/quelpa/quelpa -[quickrun]: https://github.com/syohex/emacs-quickrun -[ripgrep]: https://github.com/BurntSushi/ripgrep -[shackle]: https://github.com/wasamasa/shackle -[the_silver_searcher]: https://github.com/ggreer/the_silver_searcher -[use-package]: https://github.com/jwiegley/use-package -[vim]: https://github.com/hlissner/.vim -[wgrep]: https://github.com/mhayashi1120/Emacs-wgrep +[url:discord]: https://discord.gg/bcZ6P3y +[url:liberapay]: https://liberapay.com/hlissner/donate +[url:paypal]: https://paypal.me/henriklissner/10 +[url:company-mode]: https://github.com/company-mode/company-mode +[url:doom-themes]: https://github.com/hlissner/emacs-doom-themes +[url:editorconfig]: http://editorconfig.org/ +[url:evil-mode]: https://github.com/emacs-evil/evil +[url:helm]: https://github.com/emacs-helm/helm +[url:ivy]: https://github.com/abo-abo/swiper +[url:persp-mode]: https://github.com/Bad-ptr/persp-mode.el +[url:projectile]: https://github.com/bbatsov/projectile +[url:quelpa]: https://github.com/quelpa/quelpa +[url:quickrun]: https://github.com/syohex/emacs-quickrun +[url:ripgrep]: https://github.com/BurntSushi/ripgrep +[url:the_silver_searcher]: https://github.com/ggreer/the_silver_searcher +[url:use-package]: https://github.com/jwiegley/use-package +[url:wgrep]: https://github.com/mhayashi1120/Emacs-wgrep From 59d37334e318cfee73e30b4fbf034419ad72fca8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:28:49 -0500 Subject: [PATCH 3550/4235] Move issue/PR templates to docs/ --- .github/ISSUE_TEMPLATE | 36 ------------------- docs/ISSUE_TEMPLATE.md | 30 ++++++++++++++++ .../PULL_REQUEST_TEMPLATE.md | 0 3 files changed, 30 insertions(+), 36 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE create mode 100644 docs/ISSUE_TEMPLATE.md rename .github/PULL_REQUEST_TEMPLATE => docs/PULL_REQUEST_TEMPLATE.md (100%) diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE deleted file mode 100644 index ed296fa16..000000000 --- a/.github/ISSUE_TEMPLATE +++ /dev/null @@ -1,36 +0,0 @@ -Please check off the following before submitting your issue: - -+ [ ] I ran `make clean && make` and restarted Emacs, but the issue persists. -+ [ ] I ran `make doctor` and it produced nothing conclusive. -+ [ ] [The troubleshooting section of the FAQ](/wiki/FAQ#troubleshooting) says - nothing about my issue. -+ [ ] I read the README.org files of any modules that are relevant (that I am - aware of). -+ [ ] I filled out the four fields in the template below. -+ [ ] I have deleted this checklist and message. - ---- - -### Observed behavior - -Describe what happened. - -### 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 `M-x doom/info` OR `DEBUG=1 make doctor` -``` -
diff --git a/docs/ISSUE_TEMPLATE.md b/docs/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..a09ea6ab4 --- /dev/null +++ b/docs/ISSUE_TEMPLATE.md @@ -0,0 +1,30 @@ ++ [ ] I've checked for duplicates of this issue. ++ [ ] `bin/doom clean` and `bin/doom refresh` (then restarting Emacs) did not + fix my issue. ++ [ ] I ran `make doctor` and it produced no leads. ++ [ ] My issue cannot be found [in the FAQ](/../../wiki/FAQ) ++ [ ] I filled out the four fields in the template below. ++ [ ] I have deleted this checklist and message. + +### Observed behavior + +(Describe what happened) + +### 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. +4. Fill in "system information" below. + +### System information + +
+Click to expand + +Replace this line with the output of `M-x doom/info` OR `~/.emacs.d/bin/doom info` +
diff --git a/.github/PULL_REQUEST_TEMPLATE b/docs/PULL_REQUEST_TEMPLATE.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE rename to docs/PULL_REQUEST_TEMPLATE.md From daa26a86ba97532aa6a10bb3669e135b33ea1801 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:29:57 -0500 Subject: [PATCH 3551/4235] completion/company: rewrite README --- modules/completion/company/README.org | 164 +++++++++++++++++++++----- 1 file changed, 132 insertions(+), 32 deletions(-) diff --git a/modules/completion/company/README.org b/modules/completion/company/README.org index f2a1bc6fc..48973f228 100644 --- a/modules/completion/company/README.org +++ b/modules/completion/company/README.org @@ -1,48 +1,148 @@ -#+TITLE: :completion company +#+TITLE: completion/company +#+DATE: February 19, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages -This module adds code-completion support, powered by [[https://github.com/company-mode/company-mode][company]]. +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] + - [[Code completion][Code completion]] + - [[Vim-esque omni-completion prefix (C-x)][Vim-esque omni-completion prefix (C-x)]] +- [[Configuration][Configuration]] + - [[Enable as-you-type code completion][Enable as-you-type code completion]] + - [[Enable company backend(s) in certain modes][Enable company backend(s) in certain modes]] +- [[Troubleshooting][Troubleshooting]] + - [[Code-completion doesn't pop up automatically.][Code-completion doesn't pop up automatically.]] + - [[X-mode doesn't have code completion support or requires extra setup.][X-mode doesn't have code completion support or requires extra setup.]] + - [[No backends (or the incorrect ones) have been registered for X-mode.][No backends (or the incorrect ones) have been registered for X-mode.]] -+ Uses ~company-quickhelp~ for documentation tooltips -+ Uses ~company-statistics~ to order results by usage frequency +* Description +This module provides code completion, powered by [[https://github.com/company-mode/company-mode][company-mode]]. It is required +for code completion in many of Doom's :lang modules. -[[/../screenshots/company.png]] +https://assets.doomemacs.org/completion/company/overlay.png -* Table of Contents :TOC: -- [[#install][Install]] -- [[#configure][Configure]] - - [[#auto-completion][Auto-completion]] -- [[#troubleshooting][Troubleshooting]] +** Module Flags ++ =+auto= Enables as-you-type completion. ++ =+childframe= Enables displaying completion candidates in a child frame, + rather than an overlay or tooltip (among with other UI enhancements). *This + requires GUI Emacs 26.1+.* -* Install -Some languages require additional setup, and some languages may have no -completion support at all. +** Plugins ++ [[https://github.com/company-mode/company-mode][company-mode]] ++ [[https://github.com/hlissner/emacs-company-dict][company-dict]] ++ [[https://github.com/raxod502/prescient.el][company-prescient]] ++ [[https://github.com/sebastiencs/company-box][company-box]] -Check the README.org in that language's module for details. +* Prerequisites +This module has no direct prerequisites. -* 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. +However, some major modes may require additional setup for code completion to +work in them. Some major modes may have no completion support at all. Check that +major mode's module's documentation for details. -To enable auto-completion you must: +* Features +** Code completion +Ccompletion must be triggered manually with the =C-SPC= key. If you want +as-you-type code completion, the ~+auto~ module flag will enable it. -1. Load ~company~, -2. and change ~company-idle-delay~ to a non-nil float (the default is 0.5) +| Keybind | Description | +|---------+------------------------------------------| +| =C-SPC= | Invoke code completion manually | +| =C-n= | Go to next candidate | +| =C-p= | Go to previous candidate | +| =C-j= | (evil) Go to next candidate | +| =C-k= | (evil) Go to previous candidate | +| =C-h= | Display documentation (if available) | +| =C-u= | Move to previous page of candidates | +| =C-d= | Move to next page of candidates | +| =C-s= | Filter candidates | +| =C-S-s= | Search candidates with helm/ivy | +| =C-SPC= | Complete common | +| =TAB= | Complete common or select next candidate | +| =S-TAB= | Select previous candidate | -For example: +** Vim-esque omni-completion prefix (C-x) +In the spirit of Vim's omni-completion, the following insert mode keybinds are +available to evil users to access specific company backends: + +| Keybind | Description | +|-----------+-----------------------------------| +| =C-x C-]= | Complete etags | +| =C-x C-f= | Complete file path | +| =C-x C-k= | Complete from dictionary/keyword | +| =C-x C-l= | Complete full line | +| =C-x C-o= | Invoke complete-at-point function | +| =C-x C-n= | Complete next symbol at point | +| =C-x C-p= | Complete previous symbol at point | +| =C-x C-s= | Complete snippet | +| =C-x s= | Complete spelling suggestions | + +* Configuration +** Enable as-you-type code completion +The =+auto= module flag enables this. You may customize ~company-idle-delay~ to +control how quickly the popup should appear. + +The ~+company/toggle-auto-completion~ command is also available to toggle this +interactively. + +** Enable company backend(s) in certain modes +The ~set-company-backend!~ function exists for setting ~company-backends~ +buffer-locally in MODES, which is either a major-mode symbol, a minor-mode +symbol, or a list of either. BACKENDS are prepended to ~company-backends~ for +those modes. #+BEGIN_SRC emacs-lisp -(require 'company) -(setq company-idle-delay 0.2 - company-minimum-prefix-length 3) +(after! js2-mode + (set-company-backend! 'js2-mode 'company-tide 'company-yasnippet)) + +(after! sh-script + (set-company-backend! 'sh-mode + '(company-shell :with company-yasnippet))) + +(after! cc-mode + (set-company-backend! 'c-mode + '(:separate company-irony-c-headers company-irony))) +#+END_SRC + +To unset the backends for a particular mode, pass ~nil~ to it: + +#+BEGIN_SRC emacs-lisp +(after! sh-script + (set-company-backend! 'sh-mode nil)) #+END_SRC * Troubleshooting -If completion isn't working for you, please consider the following before -posting a bug report: +If code completion isn't working for you, consider the following common causes +before you file a bug report: -+ 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. +** Code-completion doesn't pop up automatically. +This is by design. The expectation is that you invoke completion manually with +=C-SPC=. This was decided because code-completion backends can be slow, some +dreadfully so, and invoking them every time you move your cursor can add pauses +and delays while editing. + +If, despite that, you still want this functionality, use the =+auto= flag to +enable it. + +** X-mode doesn't have code completion support or requires extra setup. +There is no guarantee your language mode will have completion support. + +Some, like ~lua-mode~, don't have completion support in Emacs at all. Others may +requires additional setup to get code completion working. For instance, +~go-mode~ requires ~guru~ to be installed on your system, and ~enh-ruby-mode~ +requires that you have a Robe server running (~M-x robe-start~). + +Check the relevant module's documentation for this kind of information. + +** No backends (or the incorrect ones) have been registered for X-mode. +Doom expects every mode to have an explicit list of company-backends (and as +short a list as possible). This may mean you aren't getting all the completion +you want or any at all. + +Check the value of ~company-backends~ (=SPC h v company-backends=) from that +mode to see what backends are available. Check the [[*Assigning company backend(s) to modes][Configuration section]] for +details on changing what backends are available for that mode. From e4f2833f263496a2627559d06d3efa8d3d657bdd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:39:23 -0500 Subject: [PATCH 3552/4235] tools/ein: rewrite README --- modules/tools/ein/README.org | 50 +++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/modules/tools/ein/README.org b/modules/tools/ein/README.org index bd54c8474..7f1c3147a 100644 --- a/modules/tools/ein/README.org +++ b/modules/tools/ein/README.org @@ -1,20 +1,34 @@ -#+TITLE: :tools ein - -* EIN -- Emacs IPython Notebook - -Tool to work with Jupyter notebooks within emacs. +#+TITLE: tools/ein +#+DATE: April 11, 2018 +#+SINCE: v2.0 +#+STARTUP: inlineimages * Table of Contents :TOC: -- [[EIN -- Emacs IPython Notebook][EIN -- Emacs IPython Notebook]] -- [[Install][Install]] -- [[Usage][Usage]] +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] + - [[Interaction with a Jupyter server][Interaction with a Jupyter server]] - [[Configuration][Configuration]] + - [[Setting the default location of your notebooks][Setting the default location of your notebooks]] -* Install -Add =:tool ein= to your ~doom!~ call in your private ~init.el~. +* Description +Adds Jupyter notebook integration into emacs. -* Usage +** Module Flags +This module provides no flags. + +** Plugins ++ [[https://github.com/millejoh/emacs-ipython-notebook][ein]] + +* Prerequisites +This module has no prereqisites. + +* Features +** Interaction with a Jupyter server Three functions are available to start EIN: + 1. ~ein:jupyter-server-start~ --- Start a jupyter server within emacs 2. ~ein:notebooklist-login~ --- Login to an existing jupyter server 3. ~ein:notebooklist-open~ --- Open the list of jupyter notebooks @@ -25,15 +39,15 @@ When ~ein:jupyter-server-start~ is called, after successfully finishing, ~ein:notebooklist-login~ and ~ein:notebooklist-open~ will be automatically called. -When in the ~Notebook List~ buffer, the key ~o~ calls ~ace-link~ to speed up the +When in the ~Notebook List~ buffer, the key =o= calls ~ace-link~ to speed up the process of selecting links in the buffer. -If ~company-mode~ is enabled as a module, ~company-ein~ will be used for -completion purposes. +If ~company-mode~ is enabled as a module, ~company-ein~ will handle completion. * Configuration -Specify the default directory where EIN searches for notebooks using: - -~(set! :ein-notebook-dir "~/my-notebooks")~ - +** Setting the default location of your notebooks +Change ~+ein-notebook-dir~ to tell ein where to find your Jupityr notebooks. +#+BEGIN_SRC emacs-lisp +(setq +ein-notebook-dir "~/my-notebooks") +#+END_SRC From 415a542ce9203b7f6e9bbddd19a8b3a651371537 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:49:15 -0500 Subject: [PATCH 3553/4235] feature/evil: rewrite README --- modules/feature/evil/README.org | 144 +++++++++++++++++++++++--------- 1 file changed, 105 insertions(+), 39 deletions(-) diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index 4093c770a..b3b089d1d 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -1,61 +1,127 @@ -#+TITLE: :feature evil +#+TITLE: feature/evil +#+DATE: February 2, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] + - [[Hacks][Hacks]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] + - [[Ported vim plugins][Ported vim plugins]] + - [[Custom Text Objects][Custom Text Objects]] + - [[Custom Ex Commands][Custom Ex Commands]] + - [[A hybrid code-folding system][A hybrid code-folding system]] + - [[Differences from vim][Differences from vim]] +- [[Configuration][Configuration]] + - [[Removing evil-mode][Removing evil-mode]] + +* Description This holy module brings the vim experience to Emacs. -* Table of Contents :TOC: -- [[#removing-evil-mode][Removing evil-mode]] -- [[#features][Features]] - - [[#multiple-cursors][Multiple-cursors]] - - [[#a-hybrid-code-folding-system][A hybrid code-folding system]] - - [[#hacks][Hacks]] - - [[#differences-from-vim][Differences from vim]] +** Module Flags ++ =+everywhere= Enables evilified keybinds everywhere possible, utilizing the + ~evil-collection~ plugin. -* Removing evil-mode -See the [[https://github.com/hlissner/doom-emacs/wiki/FAQ#remove-vimevil-for-a-more-vanilla-emacs-experience][corresponding question in the FAQ]]. +** Plugins ++ [[https://github.com/emacs-evil/evil][evil]] ++ [[https://github.com/wcsmith/evil-args][evil-args]] ++ [[https://github.com/linktohack/evil-commentary][evil-commentary]] ++ [[https://github.com/PythonNut/evil-easymotion][evil-easymotion]] ++ [[https://github.com/cute-jumper/evil-embrace.el][evil-embrace]] ++ [[https://github.com/syl20bnr/evil-escape][evil-escape]] ++ [[https://github.com/Dewdrops/evil-exchange][evil-exchange]] ++ [[https://github.com/TheBB/evil-indent-plus][evil-indent-plus]] ++ [[https://github.com/redguardtoo/evil-matchit][evil-matchit]] ++ [[https://github.com/cofi/evil-numbers][evil-numbers]] ++ [[https://github.com/noctuid/evil-textobj-anyblock][evil-textobj-anyblock]] ++ [[https://github.com/hlissner/evil-snipe][evil-snipe]] ++ [[https://github.com/emacs-evil/evil-surround][evil-surround]] ++ [[https://github.com/alexmurray/evil-vimish-fold][evil-vimish-fold]] ++ [[https://github.com/bling/evil-visualstar][evil-visualstar]] ++ [[https://github.com/ninrod/exato][exato]] ++ [[https://github.com/emacs-evil/evil-collection][evil-collection]]* + +** Hacks ++ When a window is split, the new window will be focused. ++ The o/O keys will respect and continue commented lines (can be disabled by + setting ~+evil-want-o/O-to-continue-comments~ to ~nil~). ++ From visual mode, =*= and =#= will search for the current selection instead of + the word-at-point. ++ The ~:g[lobal]~ ex command has been modified to highlight matches + incrementally. ++ More of vim's filename modifiers are supported in ex commands (like ~:p~, + ~:p:h~ or ~:t~) than vanilla evil-mode offers. ++ A custom filename modifier is available in Doom: ~:P~, which expands to the + project root (throws an error if not in a project). + +* Prerequisites +This module has no external prerequisites. * 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. +** Ported vim plugins +The following vim plugins have been ported to evil: + +| Vim Plugin | Emacs Plugin | Keybind(s) | +|-----------------------+--------------------------------+---------------------| +| vim-commentary | evil-commentary | omap =gc= | +| vim-easymotion | evil-easymotion | omap =gs= | +| vim-seek or vim-sneak | evil-snipe | mmap =s=/=S= | +| vim-surround | evil-embrace and evil-surround | vmap =S=, omap =ys= | + +In other modules: ++ The tools/neotree & tools/treemacs modules contain a =NERDTree= equivalent. ++ The editor/multiple-cursors module contains: + + ~vim-multiedit~ => evil-multiedit + + ~vim-multiple-cursors~ => evil-mc + +** Custom Text Objects + A list of new text objects: + Blocks: ~B~ (from ~evil-textobj-anyblock~) + Args: ~a~ (from ~evil-args~) + Indentation: ~i~ / ~I~ / ~J~ (from ~evil-indent-plus~) -+ Incorporates vim functionality ported to evil: - + ~vim-commentary~ => ~evil-commentary~ - + ~vim-easymotion~ => ~evil-easymotion~ - + ~vim-multiedit~ => ~evil-multiedit~ - + ~vim-multiple-cursors~ => ~evil-mc~ & ~evil-multiedit~ - + ~vim-seek~ or ~vim-sneak~ => ~evil-snipe~ - + ~vim-surround~ => ~evil-embrace~ & ~evil-surround~ -+ =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~. - -The former lets you place "clone" cursors. The latter lets you interactively -edit many regions at once (like an interactive version of ~:%s~). +** Custom Ex Commands +| Ex Command | Description | +|----------------------+----------------------------------------------------------------------------------| +| ~:al[ign][!] REGEXP~ | Align text to the first match of REGEXP. If BANG, align all matches on each line | +| ~:mv[!] NEWPATH~ | Move the current file to NEWPATH | +| ~:cp[!] NEWPATH~ | Copy the current file to NEWPATH | +| ~:rm[!] [PATH]~ | Delete the current buffer's file and buffer | ** 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 ~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 -+ 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~). + =:g= will incrementally highlight buffer matches. +* Configuration +** Removing evil-mode +You must do two things to remove Evil: + +1. Remove =:feature evil= from =~/.doom.d/init.el=, +2. Run ~bin/doom refresh~ to clean up lingering dependencies and refresh yuor + autoloads files. +3. [OPTIONAL] You may want a new ~doom-leader-alt-key~ and + ~doom-localleader-alt-key~. By default, these are bound to =M-SPC= and =M-SPC + m=. + +#+begin_quote +Ignore ~doom-leader-key~ and ~doom-localleader-key~, they don't apply to +non-evil sessions. +#+end_quote + +Note that evil-specific configuration and keybinds (defined with ~map!~) will be +ignored without evil present (and stripped out when byte-compiling). + +Unfortunately, since Doom was designed by a vimmer, for vimmers, little +consideration into a keybinding scheme for vanilla Emacs users. From 5c9c59a7192e6022bc3ed53bb78445606f7127a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:51:34 -0500 Subject: [PATCH 3554/4235] feature/file-template: add README (WIP) --- modules/feature/file-templates/README.org | 79 +++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 modules/feature/file-templates/README.org diff --git a/modules/feature/file-templates/README.org b/modules/feature/file-templates/README.org new file mode 100644 index 000000000..8e47464eb --- /dev/null +++ b/modules/feature/file-templates/README.org @@ -0,0 +1,79 @@ +#+TITLE: feature/file-templates +#+DATE: February 11, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages + +* Table of Contents :TOC_2:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] +- [[Usage][Usage]] + - [[Inserting OSS licenses][Inserting OSS licenses]] +- [[Configuration][Configuration]] + - [[Registering a new file template][Registering a new file template]] + - [[Changing existing file templates][Changing existing file templates]] + - [[Adding new OSS licenses][Adding new OSS licenses]] +- [[Troubleshooting][Troubleshooting]] +- [[Appendix][Appendix]] + - [[API][API]] + - [[Commands][Commands]] + - [[Variables][Variables]] + +* Description +This module adds file templates for blank files, powered by yasnippet. + +** Module Flags +This module provides no flags. + +** Plugins +This module installs no plugins. + +* Prerequisites +This module has no prerequisites. + +* Usage +File templates are automatically expanded when opening empty files. + +They are also regular yasnippet snippets, which can be expanded by typing their +trigger and pressing =TAB=. By convention, the triggers for file templates are +prefixed with two underscores ~__~. + +** Inserting OSS licenses +A special command is available for inserting software licenses: ~M-x ++file-templates/insert-license~. + +#+begin_quote +Licenses with a ~-bp~ suffix are boilerplate templates; shorter versions meant +for comment headers in code. +#+end_quote + +* Configuration +** TODO Registering a new file template +** TODO Changing existing file templates +** Adding new OSS licenses +The ~+file-templates/insert-license~ command searches for snippets under +~text-mode~ that are named ~__license-ABC~, where ABC is the short name of the +license. e.g. ~__license-mit~. + +So long as these files exist, ~+file-templates/insert-license~ will recognize +them. + +* Troubleshooting +If a file template isn't expanding where you expect it to, run ~M-x ++file-templates/debug~. This will report to you what file template rule would +apply for the correct file. + +* Appendix +** API ++ ~set-file-template! PRED &rest PLIST~ ++ ~set-file-templates! &rest TEMPLATES~ + +** Commands ++ ~+file-templates/insert-license~ ++ ~+file-templates/debug~ + +** Variables ++ ~+file-templates-dir~ ++ ~+file-templates-default-trigger~ ++ ~+file-templates-alist~ From cc36f9608ec3cec9fd0f1c141a0429bbbc07b4bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:52:06 -0500 Subject: [PATCH 3555/4235] feature/snippet: reformat README (WIP) --- modules/feature/snippets/README.org | 40 +++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/modules/feature/snippets/README.org b/modules/feature/snippets/README.org index d22278f1b..7f28da666 100644 --- a/modules/feature/snippets/README.org +++ b/modules/feature/snippets/README.org @@ -1,12 +1,36 @@ -#+TITLE: :feature snippets - -This module adds snippets to Emacs, powered by yasnippet. +#+TITLE: feature/snippets +#+DATE: February 11, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages * Table of Contents :TOC: -- [[#install][Install]] +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] + - [[Hacks][Hacks]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] +- [[Configuration][Configuration]] +- [[Troubleshooting][Troubleshooting]] -* Install -There are no extra dependencies for this module. +* Description +This module adds snippets to Emacs, powered by yasnippet. -By default, =private/default= installs a snippet library tailored exclusively -for Doom Emacs. +** Module Flags +This module exposes no flags. + +** Plugins ++ [[https://github.com/joaotavora/yasnippet][yasnippet]] ++ [[https://github.com/abo-abo/auto-yasnippet][auto-yasnippet]] ++ [[https://github.com/hlissner/emacs-snippets][emacs-snippets]] + +** TODO Hacks + +* Prerequisites +This module has no external dependencies. + +* TODO Features + +* TODO Configuration + +* TODO Troubleshooting From fbf2a29ebea7ec6c114906daa61c108738cd5183 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:53:13 -0500 Subject: [PATCH 3556/4235] lang/go: reformat README (WIP) --- modules/lang/go/README.org | 49 ++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/modules/lang/go/README.org b/modules/lang/go/README.org index 827d0ce25..39f9c2832 100644 --- a/modules/lang/go/README.org +++ b/modules/lang/go/README.org @@ -1,5 +1,20 @@ -#+TITLE: :lang go +#+TITLE: lang/go +#+DATE: January 16, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages +* Table of Contents :TOC: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] + - [[Go][Go]] + - [[Dependencies][Dependencies]] +- [[Features][Features]] +- [[Configuration][Configuration]] +- [[Troubleshooting][Troubleshooting]] + +* Description This module adds [[https://golang.org][Go]] support. + Code completion (~gocode~) @@ -12,29 +27,28 @@ This module adds [[https://golang.org][Go]] support. + [[../../feature/file-templates/templates/go-mode][File templates]] + [[https://github.com/hlissner/emacs-snippets/tree/master/go-mode][Snippets]] -#+begin_quote -I have mixed feelings about Go. It's a decent compromise between C and higher-level languages, is pleasantly straight-forward and elegant, but lacks /native/ support for luxuries I miss from other languages, like generics, optional arguments, and function overloading. You've got to learn to love ~interface{}~. +** Module Flags +This module provides no flags. -Still, Go is a remarkably useful (and fast!) companion for a variety of small-to-medium backend web and CLI projects. -#+end_quote +** Plugins ++ [[https://github.com/dominikh/go-mode.el][go-mode]] ++ [[https://github.com/syohex/emacs-go-eldoc][go-eldoc]] ++ [[https://github.com/dominikh/go-mode.el][go-guru]] ++ [[https://github.com/manute/gorepl-mode][gorepl-mode]] ++ [[https://github.com/mdempsky/gocode][company-go]]* -* Table of Contents :TOC: -- [[#install][Install]] - - [[#go][Go]] - - [[#dependencies][Dependencies]] - -* Install +* Prerequisites ** Go To get started with Go, you need the ~go~ tool: *** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +#+BEGIN_SRC bash brew install go #+END_SRC *** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S go +#+BEGIN_SRC bash +sudo pacman -S go #+END_SRC ** Dependencies @@ -42,10 +56,10 @@ This module requires a valid ~GOPATH~, and the following Go packages: + ~gocode~ (for code completion & eldoc support) + ~godoc~ (for documentation lookup) -+ ~goimports~ (for auto-formatting code on save and fixing imports) + ~gorename~ (for extra refactoring commands) + ~gore~ (for the REPL) + ~guru~ (for code navigation & refactoring commands) ++ ~goimports~ (optional: for auto-formatting code on save & fixing imports) #+BEGIN_SRC sh export GOPATH=~/work/go @@ -58,3 +72,8 @@ go get -u golang.org/x/tools/cmd/gorename go get -u golang.org/x/tools/cmd/guru #+END_SRC +* TODO Features + +* TODO Configuration + +* TODO Troubleshooting From d7af119c0cd94c4155b99af053235b0b58e54517 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:54:02 -0500 Subject: [PATCH 3557/4235] ui/modeline: reformat README (WIP) --- modules/ui/modeline/README.org | 116 +++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/modules/ui/modeline/README.org b/modules/ui/modeline/README.org index e69de29bb..2b0c0f76b 100644 --- a/modules/ui/modeline/README.org +++ b/modules/ui/modeline/README.org @@ -0,0 +1,116 @@ +#+TITLE: ui/modeline +#+DATE: July 29, 2018 +#+SINCE: v2.0.9 +#+STARTUP: inlineimages + +* Table of Contents :TOC_2:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] +- [[Usage][Usage]] + - [[Hiding the modeline][Hiding the modeline]] + - [[Switching the modeline and header line][Switching the modeline and header line]] +- [[Configuration][Configuration]] + - [[Changing the default modeline][Changing the default modeline]] + - [[Activating a format][Activating a format]] + - [[Defining a modeline format][Defining a modeline format]] + - [[Defining a modeline segment][Defining a modeline segment]] + - [[Extracting Doom's modeline into your config][Extracting Doom's modeline into your config]] +- [[Troubleshooting][Troubleshooting]] + - [[Where are my minor modes?][Where are my minor modes?]] + - [[Icons in my modeline look strange][Icons in my modeline look strange]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] + - [[Autodefs][Autodefs]] + - [[Functions][Functions]] + - [[Variables][Variables]] + - [[Faces][Faces]] + - [[Modeline segments][Modeline segments]] + +* Description +This module provides an Atom-inspired, minimalistic modeline for Doom Emacs, as +well as an API for building your own. + ++ A match count panel (for ~evil-search~, ~iedit~ and ~evil-substitute~) ++ An indicator for recording a macro ++ Local python/ruby version in the major-mode ++ A customizable mode-line height (see ~+doom-modeline-height~) ++ An error/warning count segment for flycheck + +[[/../screenshots/ml.png]] +[[/../screenshots/ml-search.png]] +[[/../screenshots/ml-subst.png]] +[[/../screenshots/ml-macro.png]] +[[/../screenshots/ml-version.png]] +[[/../screenshots/ml-errors.png]] + +** Module Flags +This module provides no flags. + +** Plugins ++ [[https://github.com/syohex/emacs-anzu][anzu]] ++ [[https://github.com/syohex/emacs-evil-anzu][evil-anzu]] ++ [[https://gitlab.com/bennya/shrink-path.el][shrink-path]] + +* Prerequisites +This module has no prerequisites. + +* Usage +** TODO Hiding the modeline + +** TODO Switching the modeline and header line + +* Configuration +** TODO Changing the default modeline + +** TODO Activating a format + +** TODO Defining a modeline format + +** TODO Defining a modeline segment + +** TODO Extracting Doom's modeline into your config + +* Troubleshooting +** Where are my minor modes? +I rarely need to know what minor modes are active, so I removed them. ~M-x +doom/what-minor-mode~ was written to substitute for it. + +** TODO Icons in my modeline look strange + +* Appendix +** Commands +This module exposes no public commands. +** Autodefs ++ ~def-modeline-format! NAME LEFT &optional RIGHT~ ++ ~def-modeline-segment! NAME &rest REST~ ++ ~set-modeline! NAME &optional DEFAULT~ +** Functions ++ +modeline-file-path +** Variables ++ +modeline-width ++ +modeline-height ++ +modeline-buffer-path-function ++ +modeline-format-left ++ +modeline-format-rigth +** Faces ++ doom-modeline-buffer-path ++ doom-modeline-buffer-file ++ doom-modeline-buffer-modified ++ doom-modeline-buffer-major-mode ++ doom-modeline-highlight ++ doom-modeline-panel ++ doom-modeline-info ++ doom-modeline-warning ++ doom-modeline-urgent ++ doom-modeline-bar +** Modeline segments ++ +modeline-buffer-state ++ +modeline-buffer-id ++ +modeline-buffer-directory ++ +modeline-vcs ++ +modeline-encoding ++ +modeline-major-mode ++ +modeline-matches ++ +modeline-selection-info From 5274ab6368092a22cccef9adf32f8569302da65f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 01:58:43 -0500 Subject: [PATCH 3558/4235] feature/eval: rewrite README (WIP) --- modules/feature/eval/README.org | 105 ++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 38 deletions(-) diff --git a/modules/feature/eval/README.org b/modules/feature/eval/README.org index 851ea6a48..2dfa8fac8 100644 --- a/modules/feature/eval/README.org +++ b/modules/feature/eval/README.org @@ -1,52 +1,80 @@ -#+TITLE: :feature eval +#+TITLE: feature/eval +#+DATE: February 13, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages -This modules adds support for evaluating code from inside Emacs, including -REPLs. +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] + - [[Hacks][Hacks]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] + - [[Inline Code Evaluation][Inline Code Evaluation]] + - [[REPLs][REPLs]] +- [[Configuration][Configuration]] + - [[Register a REPL for a major-mode][Register a REPL for a major-mode]] + - [[Change how code is evaluated in a major mode][Change how code is evaluated in a major mode]] +- [[Troubleshooting][Troubleshooting]] -* Table of Contents :TOC: -- [[#install][Install]] -- [[#usage][Usage]] - - [[#repls][REPLs]] - - [[#code-evaluation][*Code Evaluation*]] -- [[#configuration][Configuration]] - - [[#repls-1][REPLs]] - - [[#code-evaluation-1][Code Evaluation]] +* Description +This modules adds inline code evaluation support to Emacs, and supplies a +universal interface for opening and interacting with REPLs. -* Install -This module has no external dependencies. However, specific languages may -require additional setup. +** Module Flags +This module has no flags. -Check the README.org in that language's module for details. +** Plugins ++ [[https://github.com/syohex/emacs-quickrun][quickrun]] -* 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 +** Hacks ++ Quickrun has been modified to: + + Use only one output window, in case of consecutive execution of code. + + The quickrun window will resize itself to fit its output, once the + underlying process is finished executing the code. -** *Code Evaluation* +* Prerequisites +This module has no direct prerequisites. + +However, specific languages may require additional setup. Check the +documentation of that language's module for details. + +* Features +** Inline 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). +Invoked via: ++ =SPC o r= or ~:repl~ will open a REPL in a popup window. =C-u SPC o r= or + ~:repl!~ will open a REPL in the current window. If a REPL is already open and + a selection is active, it will be sent to the REPL. ++ ~M-x +eval/open-repl~ ++ ~M-x +eval/send-region-to-repl~ while a selection (and REPL) is active + +* Configuration +** Register a REPL for a major-mode +REPLs are defined for most languages Doom supports. Check that language module's +README.org to see if it does (and if it requires additional setup). + +To use them, you may use ~M-x +eval/open-repl~, ~:repl~ (for evil users) or the +default binding: =SPC o r=. These will open a REPL in a popup window. + +#+begin_quote +You can simply call that mode's REPL command manually. e.g. ~M-x ielm~, but +#+end_quote 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 should be a command that opens a 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 () @@ -58,10 +86,10 @@ window. (bury-buffer buf) buf))))) -(set! :repl 'emacs-lisp-mode #'+emacs-lisp/repl) +(set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) #+END_SRC -** Code Evaluation +** Change how code is evaluated in a major mode 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, usually by sending text directly @@ -72,21 +100,22 @@ without support (like [[https://crystal-lang.org/][Crystal]]), or a language wit Here's how you define a "runner": #+BEGIN_SRC emacs-lisp -(set! :eval 'crystal-mode - '((:command . "crystal") - (:exec . "%c %s") - (:description . "Run Crystal script"))) +(set-eval-handler! 'crystal-mode + '((:command . "crystal") + (:exec . "%c %s") + (:description . "Run Crystal script"))) #+END_SRC A simpler version is simply to use the path to the binary: #+BEGIN_SRC emacs-lisp -(set! :eval 'groovy-mode "groovy") +(set-eval-handler! 'groovy-mode "groovy") #+END_SRC Or if you'd rather run an elisp command: #+BEGIN_SRC emacs-lisp -(set! :eval 'emacs-lisp-mode #'+emacs-lisp-eval) +(set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) #+END_SRC +* Troubleshooting From 8fb8971a8d16a93546d966084f4816e35fc42aab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:03:01 -0500 Subject: [PATCH 3559/4235] Remove CHANGELOG link from readme (temporarily) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7a2f9d8d4..7b719cff4 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ wiki  |  screenshots  |  faq  |  - troubleshooting  |  - changelog + troubleshooting +

- - - From 052de7799cb9f5b4bba839e3d2ea17068b9583dd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:04:49 -0500 Subject: [PATCH 3560/4235] Fix helm link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b719cff4..a772c6523 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ Feature Highlights - Project search (and replace) utilities, powered by [the_silver_searcher][url:ag], [ripgrep][url:rg], git-grep and [wgrep][url:wgrep], with integration for [ivy][url:ivy] (the default) and - [url:helm]. + [helm][url:helm]. - Isolated and persistent workspaces powered by [persp-mode][url:persp-mode]. Also substitutes as vim tabs. - Inline/live code evaluation (using [quickrun][url:quickrun]), with REPL From 970d23e932e14cb6aef1d0aa264577c3693fd7cb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:05:13 -0500 Subject: [PATCH 3561/4235] Fix editorconfig link in README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a772c6523..6b1ac9859 100644 --- a/README.md +++ b/README.md @@ -97,8 +97,9 @@ Feature Highlights - A Spacemacs-esque [keybinding scheme][doom:bindings], centered around leader and localleader prefix keys (SPC and SPCm, by default). -- Indentation detection and optional integration with [url:editorconfig]. Let - someone else argue about tabs vs ___***spaces***___. +- Indentation detection and optional integration with + [editorconfig][url:editorconfig]. Let someone else argue about tabs vs + ___***spaces***___. - Code completion for many languages, powered by [company-mode][url:company-mode] (some may have external dependencies). - Project-awareness powered by [projectile][url:projectile], with tools and an From 8800d58a7775b44ca94b01633e0c0b1e4679d75e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:05:57 -0500 Subject: [PATCH 3562/4235] Fix evil links in README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6b1ac9859..90fec667e 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ What is Doom Emacs It is a story as old as time. A stubborn, shell-dwelling, and melodramatic vimmer -- envious of the features of modern text editors -- spirals into despair -before succumbing to the [dark side][evil-mode]. This is his config. +before succumbing to the [dark side][url:evil-mode]. This is his config. Doom is a configuration for [GNU Emacs](https://www.gnu.org/software/emacs/). It can be used as framework for your own configuration, or as a resource for fellow @@ -91,9 +91,9 @@ Feature Highlights to install packages from anywhere. - A [popup management system][doom:popups] with customizable rules to dictate how temporary/disposable buffers are displayed. -- A vim-centric (and optional) experience with [evil-mode], including ports of - several popular vim plugins, C-x omnicompletion and a slew of - [custom ex commands][doom:commands]. +- A vim-centric (and optional) experience with [evil-mode][url:evil-mode], + including ports of several popular vim plugins, C-x omnicompletion + and a slew of [custom ex commands][doom:commands]. - A Spacemacs-esque [keybinding scheme][doom:bindings], centered around leader and localleader prefix keys (SPC and SPCm, by default). From b1aca7dbedcbdc2d2871b62bb0efaca124a93de3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:08:16 -0500 Subject: [PATCH 3563/4235] Map offlineimaprc+mbsyncrc to conf-mode #1091 --- modules/app/email/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index ebcabf5b2..53f539f2c 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -11,6 +11,9 @@ ;; ;; Packages +(add-to-list 'auto-mode-alist '("\\.\\(?:offlineimap\\|mbsync\\)rc\\'" . conf-mode)) + + (def-package! mu4e :commands (mu4e mu4e-compose-new) :init From fec0cb6b32213daede1ff64da68c4456b38de6b2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:12:50 -0500 Subject: [PATCH 3564/4235] completion/ivy: rewrite README (WIP) --- modules/completion/ivy/README.org | 322 +++++++++++++++++++----------- 1 file changed, 204 insertions(+), 118 deletions(-) diff --git a/modules/completion/ivy/README.org b/modules/completion/ivy/README.org index 974545c19..f4702a357 100644 --- a/modules/completion/ivy/README.org +++ b/modules/completion/ivy/README.org @@ -1,128 +1,57 @@ -#+TITLE: :completion ivy +#+TITLE: completion/ivy +#+DATE: February 13, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages -This module adds Ivy, a completion backend. +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] + - [[Hacks][Hacks]] +- [[Prerequisites][Prerequisites]] + - [[Install][Install]] + - [[MacOS][MacOS]] + - [[Arch Linux][Arch Linux]] +- [[Features][Features]] + - [[Jump-to-file project navigation][Jump-to-file project navigation]] + - [[Project search & replace][Project search & replace]] + - [[In-buffer searching][In-buffer searching]] + - [[Task lookup][Task lookup]] + - [[Ivy integration for various completing commands][Ivy integration for various completing commands]] + - [[General][General]] + - [[Jump to files, buffers or projects)][Jump to files, buffers or projects)]] + - [[Search][Search]] +- [[Configuration][Configuration]] + - [[Enable fuzzy/non-fuzzy search for specific commands][Enable fuzzy/non-fuzzy search for specific commands]] + - [[Change the position of the ivy childframe][Change the position of the ivy childframe]] +- [[Troubleshooting][Troubleshooting]] + +* Description +This module provides Ivy integration for a variety of Emacs commands, as well as +a unified interface for project search and replace, powered by ag, rg, pt, +git-grep & grep (whichever is available). #+begin_quote I prefer ivy over ido for its flexibility. I prefer ivy over helm because it's -lighter. +lighter, simpler and faster in many cases. #+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. -+ Ivy integration for ~M-x~, ~imenu~, ~recentf~ and others. -+ A powerful, interactive in-buffer search using ~swiper~. -+ Ivy-powered TODO/FIXME navigation +** Module Flags ++ =+fuzzy= Enables the fuzzy method for ivy searches. ++ =+childframe= Causes Ivy to display in a floating child frame, above Emacs. + *This requires GUI Emacs 26.1+* -* Table of Contents :TOC: -- [[#install][Install]] - - [[#macos][MacOS]] - - [[#arch-linux][Arch Linux]] -- [[#usage][Usage]] - - [[#project-search--replace][Project search & replace]] - - [[#jump-to-file-project-navigation][Jump-to-file project navigation]] - - [[#in-buffer-searching][In-buffer searching]] - - [[#task-lookup][Task lookup]] -- [[#appendix][Appendix]] - - [[#commands][Commands]] - - [[#hacks][Hacks]] - -* 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 (at the time of writing), that's where ~ag~ is -useful. - -** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") -brew install ripgrep the_silver_searcher -#+END_SRC - -** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S ripgrep the_silver_searcher -#+END_SRC - -* Usage -Here is some insight into how I use this module. - -** Project search & replace -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]] - -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. - -** Jump-to-file project navigation -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]~). - -[[/../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). - -[[/../screenshots/modules/completion/ivy/ivy-todo.gif]] - -* Appendix -** Commands -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 | -|-------------------------------------+------------------------+------------------------------------------------------------------| -| ~counsel-M-x~ | =M-x= | Smarter, smex-powered M-x | -| ~counsel-bookmark~ | =SPC RET= | Find bookmark | -| ~counsel-find-file~ | =SPC f .= or =SPC .= | Browse from current directory | -| ~counsel-projectile-find-file~ | =SPC f /= or =SPC SPC= | Find file in project | -| ~counsel-projectile-switch-project~ | =SPC p p= | Open another project | -| ~counsel-recentf~ | =SPC f r= | Find recently opened file | -| ~+ivy/switch-workspace-buffer~ | =SPC b b= | Jump to buffer in current workspace | -| ~ivy-switch-buffer~ | =SPC b B= | Jump to buffer across workspaces | -| ~+ivy:ag~ | ~:ag[!] [QUERY]~ | Search project (BANG = ignore gitignore) | -| ~+ivy:ag-cwd~ | ~:agcwd[!] [QUERY]~ | Search this directory (BANG = don't recurse into subdirectories) | -| ~+ivy:rg~ | ~:rg[!] [QUERY]~ | Search project (if BANG, ignore gitignore) | -| ~+ivy:rg-cwd~ | ~:rgcwd[!] [QUERY]~ | Search this directory (BANG = don't recurse into subdirectories) | -| ~+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: - -| key | description | -|-------------+--------------------------------------------------------------------------------| -| == | Perform search/replace on the search results (open occur buffer in wgrep mode) | -| =C-SPC= | Preview the current candidate | -| =M-RET= | Open the selected candidate in other-window | +** Plugins ++ [[https://github.com/abo-abo/swiper][ivy]] ++ [[https://github.com/abo-abo/swiper][counsel]] ++ [[https://github.com/ericdanan/counsel-projectile][counsel-projectile]] ++ [[https://github.com/abo-abo/swiper][swiper]] ++ [[https://github.com/abo-abo/swiper][ivy-hydra]] ++ [[https://github.com/yevgnen/ivy-rich][ivy-rich]] ++ [[https://github.com/mhayashi1120/Emacs-wgrep][wgrep]] ++ [[https://github.com/DarwinAwardWinner/amx][amx]] ++ [[https://github.com/lewang/flx][flx]]* (=+fuzzy=) ++ [[https://github.com/tumashu/ivy-posframe][ivy-posframe]]* (=+childframe=) ** Hacks + Functions with ivy/counsel equivalents have been globally remapped (like @@ -131,4 +60,161 @@ keybindings are available to you: + ~counsel-[arp]g~'s 3-character limit was reduced to 1 (mainly for the ex command) +* Prerequisites +This module optionally depends on one of: ++ [[https://github.com/BurntSushi/ripgrep][ripgrep]] (rg) ++ [[https://github.com/ggreer/the_silver_searcher][the_silver_searcher]] (ag) ++ [[https://github.com/monochromegane/the_platinum_searcher][the_platinum_searcher]] (pt) + +Ripgrep is recommended, but the order of its results aren't deterministic and it +doesn't support full PCRE (at the time of writing). The_silver_searcher is a +good alternative if either of these bother you. + +If none of these are installed, file search commands will use git-grep (falling +back to grep, otherwise). + +** Install +*** MacOS +#+BEGIN_SRC sh +brew install ripgrep the_silver_searcher +#+END_SRC + +*** Arch Linux +#+BEGIN_SRC sh :dir /sudo:: +sudo pacman --needed --noconfirm -S ripgrep the_silver_searcher +#+END_SRC + +* Features +Ivy and its ilk are large plugins. Covering everything about them is outside of +this documentation's scope, so only Doom-specific Ivy features are listed here: + +** Jump-to-file project navigation +Inspired by Sublime Text's jump-to-anywhere, CtrlP/Unite in Vim, and Textmate's +Command-T, this module provides similar functionality by bringing ~projectile~ +and ~ivy~ together. + +https://assets.doomemacs.org/completion/ivy/projectile.png + +| Keybind | Description | +|----------------------+-------------------------------------| +| =SPC f /=, =SPC SPC= | Jump to file in project | +| =SPC f .=, =SPC .= | Jump to file from current directory | + +** Project search & replace +This module provides interactive text search and replace using the first search +program available on your system (rg, ag, pt, git-grep or grep). + +| Keybind | Description | +|----------------------+-------------------------------------| +| =SPC / b=, =M-f= | Search the current buffer | +| =SPC / p= | Search project | +| =SPC / d= | Search this directory | +| =SPC p t= | List all TODO/FIXMEs in project | + +https://assets.doomemacs.org/completion/ivy/search.png + +The ~+ivy-project-search-engines~ variable is consulted to determine which +underlying program to check for (and in what order). It's default value is ~'(rg +ag pt)~. If none of these are available, it will resort to =git-grep= (falling +back to =grep= after that). + +To use a specific program, the following engine-specific commands are available +(but not bound to any key by default) for searching from the project root or the +current directory (recursively), respectively: + ++ ~+ivy/ag~ / ~+ivy/ag-from-cwd~ ++ ~+ivy/rg~ / ~+ivy/rg-from-cwd~ ++ ~+ivy/pt~ / ~+ivy/pt-from-cwd~ ++ ~+ivy/grep~ / ~+ivy/grep-from-cwd~ + +The universal argument (=SPC u= for evil users; =C-u= otherwise) changes the +behavior of these commands, instructing the underlying search engine to include +ignored files. + +This module also provides Ex Commands for evil users: + +| Ex command | Description | +|-----------------------+------------------------------------------------| +| ~:ag[!] [QUERY]~ | Search project w/ ag[fn:1] | +| ~:rg[!] [QUERY]~ | Search project w/ rg[fn:1] | +| ~:pt[!] [QUERY]~ | Search project w/ pt[fn:1] | +| ~:grep[!] [QUERY]~ | Search project w/ git-grep/grep[fn:1] | +| ~:agcwd[!] [QUERY]~ | Search this directory w/ the_silver_searcher | +| ~:rgcwd[!] [QUERY]~ | Search this directory w/ ripgrep | +| ~:ptcwd[!] [QUERY]~ | Search this directory w/ the_platinum_searcher | +| ~:grepcwd[!] [QUERY]~ | Search this directory w/ git-grep/grep | + +The optional BANG functions is equivalent to the universal argument for the +previous commands. + +----- + +While in a search (e.g. invoked from ~+ivy:ag~ or ~:rg~), these extra +keybindings are available to you: + +| Keybind | Description | +|---------+------------------------------------------------| +| =S-TAB= | Open a writable buffer of your search results | +| =C-SPC= | Preview the current candidate | +| =M-RET= | Open the selected candidate in other-window | + +Changes to the resulting wgrep buffer (opened by =S-TAB=) can be committed with +=C-c C-c= and aborted with =C-c C-k=. + +https://assets.doomemacs.org/completion/ivy/search-replace.png + +** In-buffer searching +The =swiper= package provides an interactive buffer search powered by ivy. It +can be invoked with: + ++ =SPC / b= ++ =M-f= ++ ~:sw[iper] [QUERY]~ + +https://assets.doomemacs.org/completion/ivy/swiper.png + +A wgrep buffer can be opened from swiper with =S-TAB=. + +** Task lookup +Some projects have TODO's and FIXME's littered across them. The ~+ivy/tasks~ +command allows you to search and jump to them. It can be invoked with: + ++ =SPC p t= (C-u = restrict search to current file) ++ ~:todo[!]~ (BANG = restrict search to current file) + +https://assets.doomemacs.org/completion/ivy/todo.png + +** Ivy integration for various completing commands +*** General +| Keybind | Description | +|----------------+---------------------------| +| =M-x=, =SPC := | Smarter, smex-powered M-x | +| =SPC '= | Resume last ivy session | + +*** Jump to files, buffers or projects) +| Keybind | Description | +|---------------------------------+---------------------------------------| +| =SPC RET= | Find bookmark | +| =SPC f .=, =SPC .= | Browse from current directory | +| =SPC f /=, =SPC p /=, =SPC SPC= | Find file in project | +| =SPC f r= | Find recently opened file | +| =SPC p p= | Open another project | +| =SPC b b=, =SPC ,= | Switch to buffer in current workspace | +| =SPC b B=, =SPC <= | Switch to buffer | + +*** Search +| Keybind | Description | +|------------------+------------------------------------------| +| =SPC / i= | Search for symbol in current buffer | +| =SPC / I= | Search for symbol in all similar buffers | +| =SPC / b=, =M-f= | Search the current buffer | +| =SPC / p= | Search project | +| =SPC / d= | Search this directory | +| =SPC p t= | List all TODO/FIXMEs in project | + +* Configuration +** TODO Enable fuzzy/non-fuzzy search for specific commands +** TODO Change the position of the ivy childframe + +* TODO Troubleshooting From a4cd5fafd8d2edb774993839bad01efba5f49e33 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 02:26:11 -0500 Subject: [PATCH 3565/4235] Don't unbind keys when passed a label to :prefix Fixes an issue where (map! :leader :prefix ("f" . "asdasdas") ...) Would unbind SPC f before adding your new keybinds. --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 112275842..082971d79 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -250,7 +250,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See ((setq def (cons 'list (if (and (equal key "") (null def)) - `(nil :which-key ,desc) + `(:ignore t :which-key ,desc) (plist-put (general--normalize-extended-def def) :which-key desc)))))))) (dolist (state states) From de2e41774f11a0b76a65c1daa9021d1ed3b3f556 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 2 Jan 2019 10:47:19 +0100 Subject: [PATCH 3566/4235] latex fix: enable spell checking correctly The varible `TeX-mode-local-vars-hook` is not called correctly as AucTeX reports that the major mode in a LaTeX file is `latex-mode`. Instead, let's use `latex-mode-local-vars-hook` to enable flyspell. This change enables disabling the feature of flyspell of immediately spellchecking a document with: `(setq-hook! 'TeX-mode-hook +spellcheck-immediately nil)` --- modules/lang/latex/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index f405b20db..45b29a792 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -66,7 +66,7 @@ If no viewers are found, `latex-preview-pane' is used.") ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) (when (featurep! :feature spellcheck) - (add-hook 'TeX-mode-local-vars-hook #'flyspell-mode)) + (add-hook 'latex-mode-local-vars-hook #'flyspell-mode)) ;; All these excess pairs dramatically slow down typing in latex buffers, so ;; we remove them. Let snippets do their job. (after! smartparens-latex From 7844115561a1583342359c488f4656210fd88fd0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 12:36:44 -0500 Subject: [PATCH 3567/4235] ui/modeline: don't show encoding if UTF-8 It's only important if the encoding is something we don't expect. --- modules/ui/modeline/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index e25aa9fd0..a7212ee61 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -503,8 +503,8 @@ Meant for `+modeline-buffer-path-function'." (cond ((eq category 'coding-category-undecided) "") ((or (eq category 'coding-category-utf-8) - (eq (plist-get sys :name) 'prefer-utf-8)) - "UTF-8 ") + (string-match-p "utf-8" (symbol-name (plist-get sys :name)))) + "") ((concat (upcase (symbol-name (plist-get sys :name))) " "))) 'help-echo (plist-get (coding-system-plist buffer-file-coding-system) :docstring))))) From 008fd7130fb34acdb0b34525b1c97120b6b80b1e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 3 Jan 2019 12:55:15 -0500 Subject: [PATCH 3568/4235] Rebind g=: widen in normal & narrow in visual mode --- modules/config/default/+evil-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 332ac74f0..be17cf668 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -81,8 +81,8 @@ :n "zx" #'kill-this-buffer :n "ZX" #'bury-buffer :n "gp" #'+evil/reselect-paste - :nv "g=" #'widen - :nv "g-" #'+evil:narrow-buffer + :n "g=" #'widen + :v "g=" #'+evil:narrow-buffer :nv "g@" #'+evil:apply-macro :nv "gc" #'evil-commentary :nv "gx" #'evil-exchange From 76c31dc623a86c7db9f0b01b2956d1744ab2b558 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 27 Dec 2018 17:33:56 +0200 Subject: [PATCH 3569/4235] [tools/magit] Add magit-forge --- modules/tools/magit/packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 38bcc3d37..5eac2f2a5 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -3,7 +3,9 @@ (when (package! magit) (package! magit-gitflow) - (package! magithub) + (if (featurep! +forge) + (package! forge) + (package! magithub)) (package! magit-todos) (when (featurep! :feature evil +everywhere) (package! evil-magit))) From 7c368d4f9aea4d582e4ff1a9fee539508cc20e52 Mon Sep 17 00:00:00 2001 From: "Adrian Parvin D. Ouano" Date: Fri, 4 Jan 2019 09:39:19 +0800 Subject: [PATCH 3570/4235] Add configuration for magit forge --- modules/tools/magit/config.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 97af76ff2..5250cbe6b 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -58,6 +58,7 @@ what features are available.") (def-package! magithub :after magit + :when (not (featurep! :tools magit +forge)) :preface ;; Magithub is not well-behaved, so this needs to be set early (setq magithub-dir (concat doom-etc-dir "magithub/")) @@ -100,3 +101,9 @@ what features are available.") (evil-define-key* evil-magit-state git-rebase-mode-map "gj" #'git-rebase-move-line-down "gk" #'git-rebase-move-line-up))) + +(def-package! forge + :when (featurep! :tools magit +forge) + :config + (map! :leader + :desc "Forge ""gF" #'forge-dispatch)) From 9b248f229931d537929bb70f75e5bf40999b16f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 4 Jan 2019 13:37:15 -0500 Subject: [PATCH 3571/4235] Fix v bind not switching to linewise visual After invoking expand-region. Also fixes expand-region reporting the old contraction key (V, when it should be C-v). --- modules/config/default/+evil-bindings.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index be17cf668..22c0e5f0b 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -4,7 +4,7 @@ ;; expand-region's prompt can't tell what key contract-region is bound to, so we ;; tell it explicitly. -(setq expand-region-contract-fast-key "V") +(setq expand-region-contract-fast-key "C-v") ;; Don't let evil-collection interfere with certain keys (setq evil-collection-key-blacklist @@ -38,7 +38,9 @@ :i "C-j" #'+default/newline ; default behavior ;; expand-region - :v "v" #'er/expand-region + :v "v" (general-predicate-dispatch 'er/expand-region + (eq (evil-visual-type) 'line) + 'evil-visual-char) :v "C-v" #'er/contract-region (:after vc-annotate From 379a45978caf532a48f3ac62e777ef05aa2c10d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 15:05:49 -0500 Subject: [PATCH 3572/4235] lang/clojure: remove :n from cjr-help-menu hydra They're ignored anyhow. --- modules/lang/clojure/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 792182d9e..8256614c7 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -107,7 +107,7 @@ :config (map! :map clj-refactor-map :localleader - :n "R" #'hydra-cljr-help-menu/body)) + "R" #'hydra-cljr-help-menu/body)) (def-package! flycheck-joker :when (featurep! :feature syntax-checker) From 2cc8a96a309ea77862b22be1805b07f5f47de07e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 15:18:58 -0500 Subject: [PATCH 3573/4235] config/default: restore M-t/m-T workspace keybinds --- modules/config/default/+evil-bindings.el | 30 +++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 22c0e5f0b..23df1f3bc 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -216,20 +216,22 @@ :n "RET" #'flycheck-error-list-goto-error)) (:when (featurep! :feature workspaces) - :n "gt" #'+workspace/switch-right - :n "gT" #'+workspace/switch-left - :n "]w" #'+workspace/switch-right - :n "[w" #'+workspace/switch-left - :g "M-1" (λ! (+workspace/switch-to 0)) - :g "M-2" (λ! (+workspace/switch-to 1)) - :g "M-3" (λ! (+workspace/switch-to 2)) - :g "M-4" (λ! (+workspace/switch-to 3)) - :g "M-5" (λ! (+workspace/switch-to 4)) - :g "M-6" (λ! (+workspace/switch-to 5)) - :g "M-7" (λ! (+workspace/switch-to 6)) - :g "M-8" (λ! (+workspace/switch-to 7)) - :g "M-9" (λ! (+workspace/switch-to 8)) - :g "M-0" #'+workspace/switch-to-last)) + :n "gt" #'+workspace/switch-right + :n "gT" #'+workspace/switch-left + :n "]w" #'+workspace/switch-right + :n "[w" #'+workspace/switch-left + :g "M-1" (λ! (+workspace/switch-to 0)) + :g "M-2" (λ! (+workspace/switch-to 1)) + :g "M-3" (λ! (+workspace/switch-to 2)) + :g "M-4" (λ! (+workspace/switch-to 3)) + :g "M-5" (λ! (+workspace/switch-to 4)) + :g "M-6" (λ! (+workspace/switch-to 5)) + :g "M-7" (λ! (+workspace/switch-to 6)) + :g "M-8" (λ! (+workspace/switch-to 7)) + :g "M-9" (λ! (+workspace/switch-to 8)) + :g "M-0" #'+workspace/switch-to-last + :g "M-t" #'+workspace/new + :g "M-T" #'+workspace/display)) ;;; :completion (map! (:when (featurep! :completion company) From 6a03b37dd3f1c4acff2a412c7431ac63f6d791c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 15:20:49 -0500 Subject: [PATCH 3574/4235] General refactor for comments & docstrings --- modules/completion/ivy/autoload/ivy.el | 2 +- modules/feature/evil/autoload/advice.el | 2 +- modules/ui/popup/+hacks.el | 24 +++++++++++++----------- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 2b97608ed..dc39f863c 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -185,7 +185,7 @@ search current file. See `+ivy-task-tags' to customize what this searches for." (defun +ivy/projectile-find-file () "A more sensible `counsel-projectile-find-file', which will revert to `counsel-find-file' if invoked from $HOME, `counsel-file-jump' if invoked from a -non-project, `projectile-find-file' if in a bug project (more than +non-project, `projectile-find-file' if in a big project (more than `ivy-sort-max-size' files), or `counsel-projectile-find-file' otherwise. The point of this is to avoid Emacs locking up indexing massive file trees." diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index fc62bbcfd..cd46546be 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -33,7 +33,7 @@ (if comment-line-break-function (funcall comment-line-break-function) (comment-indent-new-line))) - ;; Find a better way to do this + ;; TODO Find a better way to do this ((and (eq major-mode 'haskell-mode) (fboundp 'haskell-indentation-newline-and-indent)) (setq evil-auto-indent nil) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index c888b548f..e5abd14cb 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -63,8 +63,8 @@ ;; `evil' (progn (defun +popup*evil-command-window (hist cmd-key execute-fn) - "The evil command window has a mind of its own (uses `switch-to-buffer'). We -monkey patch it to use pop-to-buffer, and to remember the previous window." + "Monkey patch the evil command window to use `pop-to-buffer' instead of +`switch-to-buffer', allowing the popup manager to handle it." (when (eq major-mode 'evil-command-window-mode) (user-error "Cannot recursively open command line window")) (dolist (win (window-list)) @@ -153,8 +153,8 @@ the command buffer." ;; `helpful' (progn - ;; Open link in origin window (non-popup) instead of inside the popup window. - (defun +popup*helpful--navigate (button) + (defun +popup*helpful-open-in-origin-window (button) + "Open links in non-popup, originating window rather than helpful's window." (let ((path (substring-no-properties (button-get button 'path))) enable-local-variables origin) @@ -166,7 +166,7 @@ the command buffer." (setq origin (selected-window)) (recenter)) (select-window origin))) - (advice-add #'helpful--navigate :override #'+popup*helpful--navigate)) + (advice-add #'helpful--navigate :override #'+popup*helpful-open-in-origin-window)) ;; `helm' @@ -179,12 +179,14 @@ the command buffer." ((symbol-function 'org-completing-read) (lambda (&rest args) (when-let* ((win (get-buffer-window "*Org Links*"))) - ;; While helm opened as a popup, helm commands will mistaken - ;; the *Org Links* popup for the "originated window", and - ;; try to manipulate it, but since that is a popup too (as - ;; is a dedicated side window), Emacs errors and complains - ;; it can't do that. So we get rid of it. + ;; While helm is opened as a popup, it will mistaken the + ;; *Org Links* popup for the "originated window", and will + ;; target it for actions invoked by the user. However, since + ;; *Org Links* is a popup too (they're dedicated side + ;; windows), Emacs complains about being unable to split a + ;; side window. The simple fix: get rid of *Org Links*! (delete-window win) + ;; But it must exist for org to clean up later. (get-buffer-create "*Org Links*")) (apply old-org-completing-read args)))) (apply orig-fn args))) @@ -337,7 +339,7 @@ instead of switch-to-buffer-*." ;; `windmove' (progn - ;; Users should be about to hop into popups easily, but Elisp shouldn't. + ;; Users should be able to hop into popups easily, but Elisp shouldn't. (defun doom*ignore-window-parameters (orig-fn &rest args) "Allow *interactive* window moving commands to traverse popups." (cl-letf (((symbol-function #'windmove-find-other-window) From 4617e00b918791a0309519a8563361c2a6c6847b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 15:21:27 -0500 Subject: [PATCH 3575/4235] Autoload sp-point-in-{comment,string} Some commands (like doom/forward-to-last-non-comment-or-eol) can use this before smartparens has loaded. --- 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 5a1c339ef..b804ed81a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -156,7 +156,7 @@ savehist file." ;; Auto-close delimiters and blocks as you type. It's more powerful than that, ;; but that is all Doom uses it for. :after-call (doom-exit-buffer-hook after-find-file) - :commands (sp-pair sp-local-pair sp-with-modes) + :commands (sp-pair sp-local-pair sp-with-modes sp-point-in-comment sp-point-in-string) :config (require 'smartparens-config) (setq sp-highlight-pair-overlay nil From 232cb190ccd1f0ba99eece2e65d6572e4524b410 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 15:33:06 -0500 Subject: [PATCH 3576/4235] Mention alternative in docs for bin/doom upgrade --- core/cli/upgrade.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/cli/upgrade.el b/core/cli/upgrade.el index cf7b55c73..4a35094bf 100644 --- a/core/cli/upgrade.el +++ b/core/cli/upgrade.el @@ -1,7 +1,15 @@ ;;; core/cli/upgrade.el -*- lexical-binding: t; -*- (dispatcher! (upgrade up) (doom-upgrade) - "Checks out the latest Doom on this branch.") + "Checks out the latest Doom on this branch. + +Doing so is equivalent to: + + cd ~/.emacs.d + git pull + bin/doom clean + bin/doom refresh + bin/doom update") ;; From 19987df00a32cada1d20b544646b0416030038fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 16:04:38 -0500 Subject: [PATCH 3577/4235] Add IS-BSD constant Fixes dired gls support on BSD OSes (and not just MacOS). --- core/core.el | 1 + modules/emacs/dired/config.el | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 52a299c74..fe30fd189 100644 --- a/core/core.el +++ b/core/core.el @@ -22,6 +22,7 @@ line or use --debug-init to enable this.") (defconst IS-MAC (eq system-type 'darwin)) (defconst IS-LINUX (eq system-type 'gnu/linux)) (defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos))) +(defconst IS-BSD (or IS-MAC (eq system-type 'berkeley-unix))) ;; diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index ee76ffa66..eb5eb76fb 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -19,7 +19,7 @@ :config (setq dired-listing-switches "-aBhl --group-directories-first") - (when IS-MAC + (when IS-BSD ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning ;; when not using GNU ls. We must look for `gls' after @@ -27,7 +27,7 @@ ;; `exec-path' (if-let* ((gls (executable-find "gls"))) (setq insert-directory-program gls) - (message "Cannot find `gls`. Install it using `brew install coreutils`"))) + (message "Cannot find `gls` (GNU ls). Install coreutils via your system package manager"))) (defun +dired|sort-directories-first () "List directories first in dired buffers." From e8465bb5ffc537bb6693313ad7b6bc23219dfd6f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 16:30:00 -0500 Subject: [PATCH 3578/4235] app/irc: rewrite README --- modules/app/irc/README.org | 197 +++++++++++++++++++++---------------- 1 file changed, 112 insertions(+), 85 deletions(-) diff --git a/modules/app/irc/README.org b/modules/app/irc/README.org index 865b11c31..7eb017008 100644 --- a/modules/app/irc/README.org +++ b/modules/app/irc/README.org @@ -1,97 +1,39 @@ -#+TITLE: :app irc - -This module turns adds an IRC client to Emacs ([[https://github.com/jorgenschaefer/circe][~circe~)]] with native notifications ([[https://github.com/eqyiel/circe-notifications][circe-notifications]]). +#+TITLE: app/irc +#+DATE: June 11, 2017 +#+SINCE: v2.0.3 +#+STARTUP: inlineimages * Table of Contents :TOC: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] - [[Dependencies][Dependencies]] -- [[Configure][Configure]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] + - [[An IRC Client in Emacs][An IRC Client in Emacs]] +- [[Configuration][Configuration]] - [[Pass: the unix password manager][Pass: the unix password manager]] - [[Emacs' auth-source API][Emacs' auth-source API]] -- [[Appendix][Appendix]] - - [[Commands][Commands]] +- [[Troubleshooting][Troubleshooting]] + +* Description +This module turns adds an IRC client to Emacs with OS notifications. + +** Module Flags +This module provides no flags. + +** Plugins ++ [[https://github.com/jorgenschaefer/circe][circe]] ++ [[https://github.com/eqyiel/circe-notifications][circe-notifications]] * Dependencies -This module has no dependencies, besides =gnutls-cli= or =openssl= for secure connections. +This module requires =gnutls-cli= or =openssl= for secure connections. -* Configure -Use the ~:irc~ setting to configure IRC servers. Its second argument (a plist) takes the same arguments as ~circe-network-options~. - -#+BEGIN_SRC emacs-lisp :tangle no -(set! :irc "chat.freenode.net" - `(:tls t - :nick "doom" - :sasl-username "myusername" - :sasl-password "mypassword" - :channels ("#emacs"))) -#+END_SRC - -*It is a obviously a bad idea to store auth-details in plaintext,* so here are some ways to avoid that: - -** Pass: the unix password manager -[[https://www.passwordstore.org/][Pass]] is my tool of choice. I use it to manage my passwords. If you activate the [[/modules/tools/password-store/README.org][:tools password-store]] module you get an elisp API through which to access your password store. - -~:irc~'s plist can use functions instead of strings. ~+pass-get-user~ and ~+pass-get-secret~ can help here: - -#+BEGIN_SRC emacs-lisp :tangle no -(set! :irc "chat.freenode.net" - `(:tls t - :nick "doom" - :sasl-username ,(+pass-get-user "irc/freenode.net") - :sasl-password ,(+pass-get-secret "irc/freenode.net") - :channels ("#emacs"))) -#+END_SRC - -But wait, there's more! This stores your password in a public variable which could be accessed or appear in backtraces. Not good! So we go a step further: - -#+BEGIN_SRC emacs-lisp :tangle no -(set! :irc "chat.freenode.net" - `(:tls t - :nick "doom" - :sasl-username ,(+pass-get-user "irc/freenode.net") - :sasl-password (lambda (&rest _) (+pass-get-secret "irc/freenode.net")) - :channels ("#emacs"))) -#+END_SRC - -And you're good to go! - -Note that =+pass-get-user= tries to find your username by looking for the fields -listed in =+pass-user-fields= (by default =login=, =user==, =username== and =email=)=). -An example configuration looks like - -#+BEGIN_SRC txt :tangle no -mysecretpassword -username: myusername -#+END_SRC - -** Emacs' auth-source API -~auth-source~ is built into Emacs. As suggested [[https://github.com/jorgenschaefer/circe/wiki/Configuration#safer-password-management][in the circe wiki]], you can store (and retrieve) encrypted passwords with it. - -#+BEGIN_SRC emacs-lisp :tangle no -(setq auth-sources '("~/.authinfo.gpg")) - -(defun my-fetch-password (&rest params) - (require 'auth-source) - (let ((match (car (apply #'auth-source-search params)))) - (if match - (let ((secret (plist-get match :secret))) - (if (functionp secret) - (funcall secret) - secret)) - (error "Password not found for %S" params)))) - -(defun my-nickserv-password (server) - (my-fetch-password :user "forcer" :host "irc.freenode.net")) - -(set! :irc "chat.freenode.net" - '(:tls t - :nick "doom" - :sasl-password my-nickserver-password - :channels ("#emacs"))) -#+END_SRC - -* Appendix -** Commands +* Prerequisites +This module has no direct prerequisites. +* Features +** An IRC Client in Emacs To connect to IRC you can invoke the ~=irc~ function using =M-x= or your own custom keybinding. @@ -110,3 +52,88 @@ When in a circe buffer these keybindings will be available. | ~circe-command-PART~ | =SPC m p= | Part the current channel | | ~+irc/quit~ | =SPC m Q= | Kill the current circe session and workgroup | | ~circe-reconnect~ | =SPC m R= | Reconnect the current server | + +* Configuration +Use ~set-irc-server!~ to configure IRC servers. Its second argument (a plist) +takes the same arguments as ~circe-network-options~. + +#+BEGIN_SRC emacs-lisp :tangle no +(set-irc-server! "chat.freenode.net" + `(:tls t + :nick "doom" + :sasl-username "myusername" + :sasl-password "mypassword" + :channels ("#emacs"))) +#+END_SRC + +*It is a obviously a bad idea to store auth-details in plaintext,* so here are +some ways to avoid that: + +** Pass: the unix password manager +[[https://www.passwordstore.org/][Pass]] is my tool of choice. I use it to manage my passwords. If you activate the +[[../../../modules/tools/password-store/README.org][:tools password-store]] module you get an elisp API through which to access your +password store. + +~set-irc-server!~ accepts a plist can use functions instead of strings. +~+pass-get-user~ and ~+pass-get-secret~ can help here: + +#+BEGIN_SRC emacs-lisp :tangle no +(set-irc-server! "chat.freenode.net" + `(:tls t + :nick "doom" + :sasl-username ,(+pass-get-user "irc/freenode.net") + :sasl-password ,(+pass-get-secret "irc/freenode.net") + :channels ("#emacs"))) +#+END_SRC + +But wait, there's more! This stores your password in a public variable which +could be accessed or appear in backtraces. Not good! So we go a step further: + +#+BEGIN_SRC emacs-lisp :tangle no +(set-irc-server! "chat.freenode.net" + `(:tls t + :nick "doom" + :sasl-username ,(+pass-get-user "irc/freenode.net") + :sasl-password (lambda (&rest _) (+pass-get-secret "irc/freenode.net")) + :channels ("#emacs"))) +#+END_SRC + +And you're good to go! + +Note that =+pass-get-user= tries to find your username by looking for the fields +listed in =+pass-user-fields= (by default =login=, =user==, =username== and +=email=)=). An example configuration looks like + +#+BEGIN_SRC txt :tangle no +mysecretpassword +username: myusername +#+END_SRC + +** Emacs' auth-source API +~auth-source~ is built into Emacs. As suggested [[https://github.com/jorgenschaefer/circe/wiki/Configuration#safer-password-management][in the circe wiki]], you can store +(and retrieve) encrypted passwords with it. + +#+BEGIN_SRC emacs-lisp :tangle no +(setq auth-sources '("~/.authinfo.gpg")) + +(defun my-fetch-password (&rest params) + (require 'auth-source) + (let ((match (car (apply #'auth-source-search params)))) + (if match + (let ((secret (plist-get match :secret))) + (if (functionp secret) + (funcall secret) + secret)) + (error "Password not found for %S" params)))) + +(defun my-nickserv-password (server) + (my-fetch-password :user "forcer" :host "irc.freenode.net")) + +(set-irc-server! "chat.freenode.net" + '(:tls t + :nick "doom" + :sasl-password my-nickserver-password + :channels ("#emacs"))) +#+END_SRC + +* TODO Troubleshooting From d82745844b6ec6c6933b0156f193a8b099211412 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 16:50:08 -0500 Subject: [PATCH 3579/4235] app/email: rewrite README --- modules/app/email/README.org | 88 +++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/modules/app/email/README.org b/modules/app/email/README.org index a5ead06c7..0e4ddb6f7 100644 --- a/modules/app/email/README.org +++ b/modules/app/email/README.org @@ -1,42 +1,75 @@ -#+TITLE: :app email +#+TITLE: app/email +#+DATE: April 8, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages +* Table of Contents :TOC: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] + - [[MacOS][MacOS]] + - [[Arch Linux][Arch Linux]] +- [[Features][Features]] +- [[Configuration][Configuration]] + - [[offlineimap][offlineimap]] + - [[mbsync][mbsync]] + +* Description This module makes Emacs an email client, using ~mu4e~. #+begin_quote -I want to live in Emacs, but as we all know, living is incomplete without email. So I prayed to the text editor gods and they (I) answered. Emacs+evil's editing combined with org-mode for writing emails? /Yes please./ +I want to live in Emacs, but as we all know, living is incomplete without email. +So I prayed to the text editor gods and they (I) answered. Emacs+evil's editing +combined with org-mode for writing emails? /Yes please./ -It uses ~mu4e~ to read my email, but depends on ~offlineimap~ (to sync my email via IMAP) and ~mu~ (to index my mail into a format ~mu4e~ can understand). - -WARNING: my config is gmail/gsuite oriented, and since Google has its own opinions on the IMAP standard, it is unlikely to translate to other hosts. +It uses ~mu4e~ to read my email, but depends on ~offlineimap~ (to sync my email +via IMAP) and ~mu~ (to index my mail into a format ~mu4e~ can understand). #+end_quote -* Table of Contents :TOC: -- [[#install][Install]] - - [[#macos][MacOS]] - - [[#arch-linux][Arch Linux]] -- [[#dependencies][Dependencies]] +** Module Flags ++ ~+gmail~ Enables gmail-specific configuration. -* Install +** Plugins ++ [[https://github.com/agpchil/mu4e-maildirs-extension][mu4e-maildirs-extension]] + +* Prerequisites This module requires: -+ ~offlineimap~ (to sync mail with) ++ Either ~mbsync~ (default) or ~offlineimap~ (to sync mail with) + ~mu~ (to index your downloaded messages) ** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +#+BEGIN_SRC sh brew install mu --with-emacs +# And one of the following +brew install isync # mbsync brew install offlineimap #+END_SRC ** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --noconfirm --needed -S offlineimap mu +#+BEGIN_SRC sh +sudo pacman --noconfirm --needed -S mu +# And one of the following +sudo pacman -S isync # mbsync +sudo pacman -S offlineimap #+END_SRC -* Dependencies -You need to do the following: +* TODO Features -1. Write a ~\~/.offlineimaprc~. Mine can be found [[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely store my login credentials. +* Configuration +** offlineimap +This module uses =mbsync= by default. To change this, change ~+email-backend~: + +#+BEGIN_SRC emacs-lisp +(setq +email-backend 'offlineimap) +#+END_SRC + +Then you must set up offlineimap and index your mail: + +1. Write a ~\~/.offlineimaprc~. Mine can be found [[https://github.com/hlissner/dotfiles/tree/master/shell/mu][in my dotfiles repository]]. It + is configured to download mail to ~\~/.mail~. I use [[https://www.passwordstore.org/][unix pass]] to securely + store my login credentials. 2. Download your email: ~offlineimap -o~ (may take a while) 3. Index it with mu: ~mu index --maildir ~/.mail~ @@ -44,14 +77,15 @@ Then configure Emacs to use your email address: #+BEGIN_SRC emacs-lisp :tangle no ;; Each path is relative to `+email-mu4e-mail-path', which is ~/.mail by default -(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) +(set-email-account! "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) #+END_SRC +** TODO mbsync From fffee76f7a764182e6e65790a835bfea540275ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 16:55:01 -0500 Subject: [PATCH 3580/4235] feature/eval: update README (remove :repl) And use a simpler set-repl-handler! example. --- modules/feature/eval/README.org | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/modules/feature/eval/README.org b/modules/feature/eval/README.org index 2dfa8fac8..cfdad3535 100644 --- a/modules/feature/eval/README.org +++ b/modules/feature/eval/README.org @@ -67,26 +67,20 @@ default binding: =SPC o r=. These will open a REPL in a popup window. You can simply call that mode's REPL command manually. e.g. ~M-x ielm~, but #+end_quote -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: -~(set! :repl MAJOR-MODE FUNCTION)~ +~(set-repl-handler! MAJOR-MODE FUNCTION)~ -FUNCTION should be a command that opens a repl buffer. Any window changes are -ignored, then handed off to shackle (assuming shackle-mode is on) to display in -a popup window. +FUNCTION should return a repl buffer. Any window changes in this function are +ignored, then the REPL is opened in a popup window. #+BEGIN_SRC emacs-lisp -(defun +emacs-lisp/repl () +(defun +lua/repl () (interactive) - (pop-to-buffer - (or (get-buffer "*ielm*") - (progn (ielm) - (let ((buf (get-buffer "*ielm*"))) - (bury-buffer buf) - buf))))) + (lua-start-process "lua" "lua") + (pop-to-buffer lua-process-buffer)) -(set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) +(set-repl-handler! 'lua-mode #'+lua/repl) #+END_SRC ** Change how code is evaluated in a major mode From d02b601dd480534d59ab80d56f590f0abf74b98e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:04:40 -0500 Subject: [PATCH 3581/4235] feature/lookup: refactor set-lookup-handlers! docs --- modules/feature/lookup/autoload/lookup.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 51532f8aa..dd89fa4dd 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -10,9 +10,11 @@ This overwrites previously defined handlers for MODES. If used on minor modes, they are combined with handlers defined for other minor modes or the major mode it's activated in. -If the CAR of PLIST is nil, other properties are ignored and all existing jump -handlers for MODES are cleared. Otherwise, PLIST accepts the following -properties: +This can be passed nil as its second argument to unset handlers for MODES. e.g. + + (set-lookup-handlers! 'python-mode nil) + +Otherwise, these properties are available to be set: :definition FN Run when jumping to a symbol's definition. @@ -28,7 +30,9 @@ properties: Used by `+lookup/file'. :xref-backend FN Defines an xref backend for a major-mode. If you define :definition and - :references along with :xref-backend, those will have higher precedence." + :references along with :xref-backend, those will have higher precedence. + +\(fn MODE-OR-MODES &key DEFINITION REFERENCES DOCUMENTATION FILE XREF-BACKEND)" (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) From 9db39b024295c75f05df9abb10efd8cdc045b193 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:14:47 -0500 Subject: [PATCH 3582/4235] feature/lookup: remove unused set-docset! alias --- modules/feature/lookup/autoload/docsets.el | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index f8b8efbca..d6e24a31b 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -43,9 +43,6 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (:remove (cl-set-difference (alist-get mode +lookup-docset-alist) docsets)) (_ docsets))))))) -;;;###autodef -(defalias 'set-docset! #'set-docsets!) - ;; FIXME obsolete :docset ;;;###autoload (def-setting! :docset (modes &rest docsets) From 0502b9581e5acf2300ca0f6c46f1c515d1f1215d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:15:09 -0500 Subject: [PATCH 3583/4235] feature/lookup: reformat/revise README --- modules/feature/lookup/README.org | 95 +++++++++++++++++-------------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/modules/feature/lookup/README.org b/modules/feature/lookup/README.org index 9f7eebd78..d42b753f7 100644 --- a/modules/feature/lookup/README.org +++ b/modules/feature/lookup/README.org @@ -1,27 +1,43 @@ -#+TITLE: :feature lookup +#+TITLE: feature/lookup +#+DATE: January 4, 2018 +#+SINCE: v2.0.9 +#+STARTUP: inlineimages +* Table of Contents :TOC: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Install][Install]] + - [[Module flags][Module flags]] + - [[Dependencies][Dependencies]] +- [[Features][Features]] + - [[Jump to definition][Jump to definition]] + - [[Find references][Find references]] + - [[Look up documentation][Look up documentation]] + - [[Search a specific documentation backend][Search a specific documentation backend]] +- [[Configuration][Configuration]] + - [[Settings][Settings]] + - [[Open in eww instead of browser][Open in eww instead of browser]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] + +* Description Integrates with code navigation and documentation tools to help you quickly look up definitions, references and documentation. -+ Integration with devdocs.io -+ Integration with Dash.app docsets. + Jump-to-definition and find-references implementations that just work. + Powerful xref integration for languages that support it. ++ Documentation lookup for a variety of online sources (like devdocs.io, + stackoverflow or youtube). ++ Integration with Dash.app docsets. -* Table of Contents :TOC: -- [[#install][Install]] - - [[#module-flags][Module flags]] - - [[#dependencies][Dependencies]] -- [[#usage][Usage]] - - [[#jump-to-definition][Jump to definition]] - - [[#find-references][Find references]] - - [[#look-up-documentation][Look up documentation]] - - [[#search-a-specific-documentation-backend][Search a specific documentation backend]] -- [[#configuration][Configuration]] - - [[#settings][Settings]] - - [[#open-in-eww-instead-of-browser][Open in eww instead of browser]] -- [[#appendix][Appendix]] - - [[#commands][Commands]] +** Module Flags ++ ~+docsets~ Enable integration with Dash.app docsets. + +** Plugins ++ [[https://github.com/jacktasia/dumb-jump][dumb-jump]] ++ [[https://github.com/alexmurray/ivy-xref][ivy-xref]] or [[https://github.com/brotzeit/helm-xref][helm-xref]] ++ [[https://github.com/nathankot/counsel-dash][counsel-dash]] or [[https://github.com/areina/helm-dash][helm-dash]] * Install To enable the module add =:feature lookup= to your ~doom!~ block in @@ -31,17 +47,16 @@ To enable the module add =:feature lookup= to your ~doom!~ block in This module provides two flags: + ~+docsets~ Enables integration with Dash docsets. -+ ~+devdocs~ Enables integration with devdocs.io search. ** Dependencies This module has several soft dependencies: + ~the_silver_searcher~ and/or ~ripgrep~ as a last-resort fallback for jump-to-definition/find-references. -+ ~sqlite3~ for Dash docset support. ++ Optionally, ~sqlite3~ for Dash docset support. *** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +#+BEGIN_SRC sh brew install the_silver_searcher ripgrep # An older version of sqlite is included in MacOS. If it causes you problems (and @@ -53,11 +68,11 @@ export PATH="/usr/local/opt/sqlite/bin:$PATH" #+END_SRC *** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S sqlite the_silver_searcher ripgrep +#+BEGIN_SRC sh +sudo pacman -S sqlite the_silver_searcher ripgrep #+END_SRC -* Usage +* Features ** Jump to definition Use ~+lookup/definition~ (bound to =gd= in normal mode) to jump to the definition of the symbol at point @@ -112,9 +127,9 @@ You can perform a documentation lookup on any backends directly: * Configuration ** Settings -This module provides three settings: ~:lookup~, ~:docset~ and ~:devdocs~. +This module provides two setters: -*** ~:lookup MODES &rest PLIST~ +*** ~set-lookup-handlers! MODES &rest PLIST~ Defines a lookup target for major MODES (one major-mode symbol or a list thereof). PLIST accepts the following optional properties: @@ -124,6 +139,8 @@ thereof). PLIST accepts the following optional properties: current project. Used by ~+lookup/references~. + ~:documentation FN~ :: Run when looking up documentation for a symbol. Used by ~+lookup/documentation~. ++ ~:file FN~ :: Run when looking up the file for a symbol/string. Typically a + file path. Used by ~+lookup/file~. + ~:xref-backend FN~ :: Defines an xref backend for a major-mode. With this, :definition and :references are unnecessary. @@ -131,7 +148,7 @@ thereof). PLIST accepts the following optional properties: #+BEGIN_SRC emacs-lisp ;; For python-mode, anaconda-mode offers a backend for all three lookup ;; functions. We can register them like so: -(set! :lookup 'python-mode +(set-lookup-handlers! 'python-mode :definition #'anaconda-mode-find-definitions :references #'anaconda-mode-find-references :documentation #'anaconda-mode-show-doc) @@ -139,31 +156,21 @@ thereof). PLIST accepts the following optional properties: ;; If a language or plugin provides a custom xref backend available for it, use ;; that instead. It will provide the best jump-to-definition and find-references ;; experience. You can specify custom xref backends with: -(set! :lookup 'js2-mode :xref-backend #'xref-js2-xref-backend) +(set-lookup-handlers! 'js2-mode :xref-backend #'xref-js2-xref-backend) ;; NOTE: xref doesn't provide a :documentation backend. #+END_SRC -*** ~:docset MODES &rest DOCSETS~ -Registers a list of DOCSETS (strings) for MODES (either one major mode symbol or -a list of them). Used by ~+lookup/in-docsets~ and ~+lookup/documentation~. +*** ~set-docsets! MODES &rest DOCSETS~ +Registers DOCSETS (one string or list of strings) for MODES (one major mode +symbol or a list of them). It is used by ~+lookup/in-docsets~ and +~+lookup/documentation~. #+BEGIN_SRC emacs-lisp -(set! :docset 'js2-mode "JavaScript" "JQuery") +(set-docsets! 'js2-mode "JavaScript" "JQuery") ;; Add docsets to minor modes by starting DOCSETS with :add -(set! :docset 'rjsx-mode :add "React") +(set-docsets! 'rjsx-mode :add "React") ;; Or remove docsets from minor modes -(set! :docset 'nodejs-mode :remove "JQuery") -#+END_SRC - -*** ~:devdocs MODES DOCSET~ -Registers a devdocs DOCset (one string) to search when in MODES (either one -major mode symbol or a list). Used by ~+lookup/in-devdocs~ and -~+lookup/documentation~. With devdocs you can only search one docset at a time. - -#+BEGIN_SRC emacs-lisp -(set! :devdocs 'js2-mode "javascript") -;; works on minor modes too -(set! :devdocs 'rjsx-mode "react") +(set-docsets! 'nodejs-mode :remove "JQuery") #+END_SRC ** Open in eww instead of browser From c3c9c01bada16fcca62509b51d25367c9fca1759 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:45:42 -0500 Subject: [PATCH 3584/4235] lang/latex: rewrite README --- modules/lang/latex/README.org | 112 ++++++++++++++++------------------ 1 file changed, 53 insertions(+), 59 deletions(-) diff --git a/modules/lang/latex/README.org b/modules/lang/latex/README.org index 7bdc815e7..202c69c11 100644 --- a/modules/lang/latex/README.org +++ b/modules/lang/latex/README.org @@ -1,79 +1,73 @@ -#+TITLE: :lang latex +#+TITLE: lang/latex +#+DATE: January 16, 2017 +#+SINCE: v1.3 +#+STARTUP: inlineimages -* Module Description +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Features][Features]] +- [[Customization][Customization]] + - [[Specifying the location of a bibtex file & corresponding PDFs][Specifying the location of a bibtex file & corresponding PDFs]] + - [[Changing the PDFs viewer][Changing the PDFs viewer]] + +* Description Provide a helping hand when working with LaTeX documents. -** Feature: + Sane defaults + Fontification of many popular commands + Pretty indentation of wrapped lines using the ~adaptive-wrap~ package -+ Spell checking with ~flyschek~ ++ Spell checking with ~flycheck~ + Change PDF viewer to Okular or ~latex-preview-pane~ + Bibtex editor + Autocompletion using ~company-mode~ + Ivy or Helm for selecting bibliography + Compile your .tex code only once using LatexMk +** Module Flags ++ ~+latexmk~ Use LatexMk instead of LaTeX to compile documents. + +** Plugins ++ [[http://www.gnu.org/software/auctex/][auctex]] ++ [[http://elpa.gnu.org/packages/adaptive-wrap.html][adaptive-wrap]] ++ [[https://github.com/jsinglet/latex-preview-pane][latex-preview-pane]] ++ [[https://github.com/tom-tan/auctex-latexmk][auctex-latexmk]]* ++ [[https://github.com/alexeyr/company-auctex][company-auctex]]* ++ [[https://github.com/TheBB/company-reftex][company-reftex]]* ++ [[https://github.com/vspinu/company-math][company-math]]* ++ [[https://github.com/tmalsburg/helm-bibtex][ivy-bibtex]]* or [[https://github.com/tmalsburg/helm-bibtex][helm-bibtex]]* + +* TODO Features * Customization +** Specifying the location of a bibtex file & corresponding PDFs +The reftex and bibtex-completion packages have two variables that allow you to +specify where it should find your bibliography file(s) and their corresponding +PDFs: -** Custom Variables -Two custom variables state where AUCTeX will search for bibliography files and their corresponding PDFs. -Set these variables in your private configuration with: -#+BEGIN_SRC emacs_lisp -(set! :latex-bibtex-file "./your/bib/file.bib") -(set! :latex-bibtex-pdfs-dir "./dir/with/bib/pdfs/") -#+END_SRC -If the variables are not set, they are ignored. - -** Choose View Program -You have four options to choose from for the viewer of your PDF rendered files. -*** Okular -Use Okular as default PDF viewer. - -Activate with the flag '+okular' of the latex module in your private init.el. -#+BEGIN_SRC emacs_lisp -(latex +okular) +#+BEGIN_SRC emacs-lisp +(setq reftex-default-bibliography "/your/bib/file.bib") +;; Optionally specifying a location for the corresponding PDFs +(setq bibtex-completion-library-path (list "/your/bib/pdfs")) #+END_SRC -*** Skim -For Mac users. Use Skim to preview your PDFs. +** Changing the PDFs viewer +This module provides integration for four supported pdf viewers. They are -Activate with the flag '+skim' of the latex module in your private init.el. -#+BEGIN_SRC emacs_lisp -(latex +skim) ++ [[https://skim-app.sourceforge.io/][Skim.app]] (MacOS only) ++ Okular ++ Zathura ++ pdf-tools (requires =:tools pdf= module) + +They are searched for in this order. See ~+latex-viewers~ to change the order, +or remove tools from the search altogether. If you want to exclusively use one +tool, for instance: + +#+BEGIN_SRC emacs-lisp +(setq +latex-viewers '(zathura)) #+END_SRC -*** PDF Tools -Use the PDF Tools package to preview your PDFs. Requires the tools module ~pdf~ enabled in your configuration. -#+BEGIN_SRC emacs_lisp -(:tools pdf) -#+END_SRC - -Activate with the flag '+pdf-tools' of the latex module in your private init.el. -#+BEGIN_SRC emacs_lisp -(latex +pdf-tools=) -#+END_SRC - -*** Preview Pane -You may wish to use the old school package ~latex-preview-pane~ instead of the -other alternatives. ~latex-preview-pane~ uses a ~DocView~ instead. - -Activate with the flag '+preview-pane' of the latex module in your private init.el. -#+BEGIN_SRC emacs_lisp -(latex +preview-pane) -#+END_SRC - -** LatexMk -Use LatexMk instead of normal LaTeX to compile documents. LatexMk only needs to -run once to get all references, bibliography and other things right. - -Activate with the flag '+latexmk' of the latex module in init.el. -#+BEGIN_SRC emacs_lisp -(latex +latexmk) -#+END_SRC - -You can enable both a custom view program and LatexMk with a call such as: -#+BEGIN_SRC emacs_lisp -(latex +latexmk +okular) -#+END_SRC +If none of these tools are found, ~latex-preview-pane~ (uses ~DocView~ in Emacs) +is used as a fallback. You can use this exclusively by setting ~+latex-viewers~ +to ~nil~. From 9f249de56915dd2ec1a167c5e88875572ec03e34 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:46:37 -0500 Subject: [PATCH 3585/4235] lang/latex: remove +latex-bibtex-file An unnecessary layer of abstraction on top of two straight-forward variables, reftex-default-bibliography and bibtex-completion-bibliography. --- modules/lang/latex/+ref.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index c4b19f251..11deac57e 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -18,10 +18,9 @@ (?t . "\\textcite[]{%l}")) reftex-plug-into-AUCTeX t reftex-toc-split-windows-fraction 0.3) - (when +latex-bibtex-file - (setq reftex-default-bibliography (list (expand-file-name +latex-bibtex-file)))) (map! :map reftex-mode-map - :localleader ";" 'reftex-toc) + :localleader + ";" 'reftex-toc) (add-hook! 'reftex-toc-mode-hook (reftex-toc-rescan) (map! :map 'local @@ -36,7 +35,3 @@ bibtex-align-at-equal-sign t bibtex-text-indentation 20) (define-key bibtex-mode-map (kbd "C-c \\") #'bibtex-fill-entry)) - -(after! bibtex-completion - (when +latex-bibtex-file - (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file))))) From b56639e31b6599d9f23aedb6c3d5d485bb650c59 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:48:46 -0500 Subject: [PATCH 3586/4235] Remove deprecated set! & def-setting! macros --- core/core-modules.el | 51 ------------------- core/core-os.el | 6 --- modules/app/email/autoload/email.el | 6 --- modules/app/irc/autoload/settings.el | 7 --- modules/completion/company/autoload.el | 6 --- modules/editor/rotate-text/autoload.el | 6 --- modules/emacs/electric/autoload.el | 6 --- modules/feature/eval/autoload/settings.el | 12 ----- modules/feature/evil/autoload/evil.el | 6 --- modules/feature/file-templates/autoload.el | 12 ----- modules/feature/lookup/autoload/docsets.el | 6 --- modules/feature/lookup/autoload/lookup.el | 6 --- modules/feature/snippets/autoload/settings.el | 6 --- modules/lang/emacs-lisp/autoload.el | 1 - modules/tools/ein/autoload.el | 10 ---- modules/tools/prodigy/autoload.el | 7 --- modules/ui/popup/autoload/settings.el | 16 ------ 17 files changed, 170 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 97e886ecb..0e8db1500 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -414,56 +414,5 @@ omitted. eg. (featurep! +flag1)" (memq category (doom-module-get (car module-pair) (cdr module-pair) :flags))))) t)) - -;; -;; FIXME Cross-module configuration (deprecated) - -;; I needed a way to reliably cross-configure modules without littering my -;; modules with `after!' blocks or testing whether they were enabled, so I wrote -;; `set!'. If a setting doesn't exist at runtime, the `set!' call is ignored and -;; its arguments are left unevaluated (and entirely omitted when byte-compiled). - -(defmacro def-setting! (keyword arglist &optional docstring &rest forms) - "Define a setting. Like `defmacro', this should return a form to be executed -when called with `set!'. FORMS are not evaluated until `set!' calls it. - -See `doom/describe-setting' for a list of available settings. - -Do not use this for configuring Doom core." - (declare (indent defun) (doc-string 3)) - (or (keywordp keyword) - (signal 'wrong-type-argument (list 'keywordp keyword))) - (unless (stringp docstring) - (push docstring forms) - (setq docstring nil)) - (let ((alias (plist-get forms :obsolete))) - (when alias - (setq forms (plist-put forms :obsolete 'nil))) - `(fset ',(intern (format "doom--set%s" keyword)) - (lambda ,arglist - ,(if (and (not docstring) (fboundp alias)) - (documentation alias t) - docstring) - ,(when alias - `(declare (obsolete ,alias "2.1.0"))) - (prog1 (progn ,@forms) - ,(when alias - `(unless noninteractive - (message ,(format "The `%s' setting is deprecated, use `%s' instead" - keyword alias))))))))) - -(defmacro set! (keyword &rest values) - "Set an option defined by `def-setting!'. Skip if doesn't exist. See -`doom/describe-setting' for a list of available settings. - -VALUES doesn't get evaluated if the KEYWORD setting doesn't exist." - (declare (indent defun)) - (let ((fn (intern-soft (format "doom--set%s" keyword)))) - (if (and fn (fboundp fn)) - (apply fn values) - (when (or doom-debug-mode after-init-time) - (message "No setting found for %s" keyword) - nil)))) - (provide 'core-modules) ;;; core-modules.el ends here diff --git a/core/core-os.el b/core/core-os.el index 4ca91a5d8..cdaced36c 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -14,12 +14,6 @@ (defmacro set-env! (&rest _vars) "Inject VARS from your shell environment into Emacs.") -;; FIXME obsolete :env -(def-setting! :env (&rest vars) - :obsolete set-env! - (when (featurep 'exec-path-from-shell) - `(exec-path-from-shell-copy-envs ,@vars))) - (cond (IS-MAC (setq mac-command-modifier 'meta mac-option-modifier 'alt diff --git a/modules/app/email/autoload/email.el b/modules/app/email/autoload/email.el index a471fa181..5a468abc5 100644 --- a/modules/app/email/autoload/email.el +++ b/modules/app/email/autoload/email.el @@ -40,12 +40,6 @@ default/fallback account." (setq-default mu4e-context-current context)) context))) -;; FIXME obsolete :email -;;;###autoload -(def-setting! :email (label letvars &optional default-p) - :obsolete set-email-account! - `(set-email-acount! ,label ,letvars ,default-p)) - (defvar +email-workspace-name "*mu4e*" diff --git a/modules/app/irc/autoload/settings.el b/modules/app/irc/autoload/settings.el index 424a731cd..59615a760 100644 --- a/modules/app/irc/autoload/settings.el +++ b/modules/app/irc/autoload/settings.el @@ -7,10 +7,3 @@ See `circe-network-options' for details." (after! circe (push (cons server letvars) circe-network-options))) - -;; FIXME obsolete :irc -;;;###autoload -(def-setting! :irc (server letvars) - :obsolete set-irc-server! - `(after! circe - (push (cons ,server ,letvars) circe-network-options))) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 5dfcf0bd7..1d4c4a784 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -47,12 +47,6 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to (setf (alist-get mode +company-backend-alist) (cons type backends)))))) -;; FIXME obsolete :company-backend -;;;###autoload -(def-setting! :company-backend (modes &rest backends) - :obsolete set-company-backend! - `(set-company-backend! ,modes ,@backends)) - ;; ;; Library diff --git a/modules/editor/rotate-text/autoload.el b/modules/editor/rotate-text/autoload.el index d5247e656..f696ead51 100644 --- a/modules/editor/rotate-text/autoload.el +++ b/modules/editor/rotate-text/autoload.el @@ -17,9 +17,3 @@ (setq-local rotate-text-local-words words) (setq-local rotate-text-local-patterns patterns))) (add-hook (intern (format "%s-hook" mode)) fn-name)))) - -;; FIXME obsolete :rotate -;;;###autoload -(def-setting! :rotate (modes &rest plist) - :obsolete set-rotate-patterns! - `(set-rotate-patterns! ,modes ,@plist)) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 0b18f8d6e..3dbe4ec2f 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -22,9 +22,3 @@ Enables `electric-indent-local-mode' in MODES. (if chars (setq electric-indent-chars chars)) (if words (setq +electric-indent-words words))))) (add-hook hook fn)))))) - -;; FIXME obsolete :electric -;;;###autoload -(def-setting! :electric (modes &rest plist) - :obsolete set-electric! - `(set-electric! ,modes ,@plist)) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index b80af5d1a..d6fb3249f 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -20,12 +20,6 @@ command that will be called interactively." (dolist (mode (doom-enlist modes)) (setf (alist-get mode +eval-repls) command))) -;; FIXME obsolete :repl -;;;###autoload -(def-setting! :repl (mode command) - :obsolete set-repl-handler! - `(set-repl-handler! ,mode ,command)) - ;; ;; Evaluation @@ -62,9 +56,3 @@ command that will be called interactively." (or (cdr (assq mode quickrun--major-mode-alist)) (string-remove-suffix "-mode" (symbol-name mode))) command :mode mode))))) - -;; FIXME obsolete :eval -;;;###autoload -(def-setting! :eval (mode command) - :obsolete set-eval-handler! - `(set-eval-handler! ,mode ,command)) diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 37988b8b2..1da151300 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -11,12 +11,6 @@ (evil-set-initial-state mode state)) (evil-set-initial-state modes state)))) -;; FIXME obsolete :evil-state -;;;###autoload -(def-setting! :evil-state (modes state) - :obsolete set-evil-initial-state! - `(set-evil-initial-state! ,modes ,state)) - ;; ;; Commands diff --git a/modules/feature/file-templates/autoload.el b/modules/feature/file-templates/autoload.el index 1d18419e6..4bcd8a1ad 100644 --- a/modules/feature/file-templates/autoload.el +++ b/modules/feature/file-templates/autoload.el @@ -48,18 +48,6 @@ these properties: (dolist (template templates) (+file-templates--set (car template) (cdr template))))) -;; FIXME obsolete :file-template -;;;###autoload -(def-setting! :file-template (pred &rest plist) - :obsolete set-file-template! - `(set-file-template! ,pred ,@plist)) - -;; FIXME obsolete :file-templates -;;;###autoload -(def-setting! :file-templates (&rest templates) - :obsolete set-file-templates! - `(set-file-templates! ,@templates)) - ;; ;; Library diff --git a/modules/feature/lookup/autoload/docsets.el b/modules/feature/lookup/autoload/docsets.el index d6e24a31b..405541211 100644 --- a/modules/feature/lookup/autoload/docsets.el +++ b/modules/feature/lookup/autoload/docsets.el @@ -43,12 +43,6 @@ Used by `+lookup/in-docsets' and `+lookup/documentation'." (:remove (cl-set-difference (alist-get mode +lookup-docset-alist) docsets)) (_ docsets))))))) -;; FIXME obsolete :docset -;;;###autoload -(def-setting! :docset (modes &rest docsets) - :obsolete set-docset! - `(set-docsets! ,modes ,@docsets)) - ;; ;; Library diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index dd89fa4dd..8f115a4a4 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -60,12 +60,6 @@ Otherwise, these properties are available to be set: (add-hook 'xref-backend-functions xref-backend nil t)))))) (add-hook hook fn)))))) -;; FIXME obsolete :lookup -;;;###autoload -(def-setting! :lookup (modes &rest plist) - :obsolete set-lookup-handlers! - `(set-lookup-handlers! ,modes ,@plist)) - ;; ;; Library diff --git a/modules/feature/snippets/autoload/settings.el b/modules/feature/snippets/autoload/settings.el index adb9f36da..6bb99df22 100644 --- a/modules/feature/snippets/autoload/settings.el +++ b/modules/feature/snippets/autoload/settings.el @@ -8,9 +8,3 @@ can have its own snippets category, if the folder exists." (let ((fn (intern (format "+snippets|register-%s" mode)))) (fset fn (lambda () (yas-activate-extra-mode mode))) (add-hook (intern (format "%s-hook" mode)) fn)))) - -;; FIXME obsolete :yas-minor-mode -;;;###autoload -(def-setting! :yas-minor-mode (mode) - :obsolete set-yas-minor-mode! - `(set-yas-minor-mode! ,mode)) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 31800f138..482ace7c7 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -100,7 +100,6 @@ library/userland functions" '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index 5ddcbaae5..9d35fb093 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -1,15 +1,5 @@ ;;; tools/ein/autoload.el -*- lexical-binding: t; -*- -;; FIXME obsolete :ein-notebook-dir -;;;###autoload -(def-setting! :ein-notebook-dir (dir) - "Set the default directory from where to open Jupyter notebooks." - `(setq ein:jupyter-default-notebook-directory ,dir)) - - -;; -;; Library - (defun +ein--collect-ein-buffer-links () (let ((end (window-end)) points) diff --git a/modules/tools/prodigy/autoload.el b/modules/tools/prodigy/autoload.el index d33a3d79e..0c013df59 100644 --- a/modules/tools/prodigy/autoload.el +++ b/modules/tools/prodigy/autoload.el @@ -1,12 +1,5 @@ ;;; tools/prodigy/autoload.el -*- lexical-binding: t; -*- -;; FIXME obsolete :service -;;;###autoload -(def-setting! :service (&rest plist) - "TODO" - `(after! prodigy - (prodigy-define-service ,@plist))) - ;;;###autoload (defun +prodigy/create () "Interactively create a new prodigy service." diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 0148adda2..56a092f61 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -196,19 +196,3 @@ Example: (when (bound-and-true-p +popup-mode) (setq display-buffer-alist +popup--display-buffer-alist)) +popup--display-buffer-alist) - - -;; -;; Obsolete settings - -;; FIXME obsolete :popup -;;;###autoload -(def-setting! :popup (condition &optional alist parameters) - :obsolete set-popup-rule! - `(set-popup-rule! ,condition ,alist ,parameters)) - -;; FIXME obsolete :popups -;;;###autoload -(def-setting! :popups (&rest rulesets) - :obsolete set-popup-rules! - `(set-popup-rules! ,@rulesets)) From 681145e6b5cef963faea7d670a7c2694e7337d6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:49:04 -0500 Subject: [PATCH 3587/4235] Defer tide-mode init until file exists This ensures that tide-mode won't activate for file-less JS buffers, which are error prone. But once the file is saved, it will consider activating itself. --- modules/lang/javascript/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index f01e5b011..92d6c33a3 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -126,9 +126,11 @@ ;; Don't let hard errors stop the user from opening js files. (defun +javascript|init-tide () "Enable `tide-mode' if node is available." - (if (executable-find "node") - (tide-setup) - (message "Couldn't find `node', aborting tide server"))) + (cond ((not buffer-file-name) + (add-hook 'after-save-hook #'+javascript|init-tide nil t)) + ((executable-find "node") + (tide-setup)) + ((message "Couldn't find `node', aborting tide server")))) (add-hook! (js2-mode typescript-mode) #'+javascript|init-tide) (defun +javascript|init-tide-in-web-mode () From 93c537e6a75f1e9f2ffe98cce73d902222184f2d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:53:11 -0500 Subject: [PATCH 3588/4235] Revise C-a/C-e/C-u/C-w/C-b/C-f keybinds + C-b/C-f/C-w/C-u are from vim, and so will only be set for evil users. + C-a/C-e exists in both vim and Emacs, so we make them smarter for both users. --- modules/config/default/+evil-bindings.el | 16 +++++++--------- modules/config/default/config.el | 9 ++++++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 23df1f3bc..b706e112d 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -808,15 +808,13 @@ customized by changing `+default-repeat-forward-key' and ;; Universal evil integration (when (featurep! :feature evil +everywhere) - ;; Restore C-a, C-e and C-u and make them 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+trailing whitespace before jumping to - ;; eol. C-u will act similarly to C-a. - (define-key! - "C-a" #'doom/backward-to-bol-or-indent - "C-e" #'doom/forward-to-last-non-comment-or-eol - "C-u" #'doom/backward-kill-to-bol-and-indent - "C-w" #'backward-kill-word) + ;; Have C-u behave similarly to `doom/backward-to-bol-or-indent'. + ;; NOTE SPC u replaces C-u as the universal argument. + (map! :gi "C-u" #'doom/backward-kill-to-bol-and-indent + :gi "C-w" #'backward-kill-word + ;; Vimmish ex motion keys + :gi "C-b" #'backward-word + :gi "C-f" #'forward-word) (after! view (define-key view-mode-map [escape] #'View-quit-all)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 09e10fedc..7c8f6e82b 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -141,9 +141,6 @@ "A-x" #'execute-extended-command) (define-key! - ;; Ensure Emacsien motions are available - "C-b" #'backward-word - "C-f" #'forward-word ;; Buffer-local font scaling "M-+" (λ! (text-scale-set 0)) "M-=" #'text-scale-increase @@ -170,6 +167,12 @@ ;; textmate-esque deletion [M-backspace] #'doom/backward-kill-to-bol-and-indent) + ;; Smarter C-a/C-e for both Emacs and Evil. 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+trailing whitespace before jumping to eol. + (map! :gi "C-a" #'doom/backward-to-bol-or-indent + :gi "C-e" #'doom/forward-to-last-non-comment-or-eol) + (if (featurep 'evil) (load! "+evil-bindings") (load! "+emacs-bindings"))) From 634238782b18e9b189b72e60e18efdeacfb5c035 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 17:54:09 -0500 Subject: [PATCH 3589/4235] Sharp-quote keybinds Conventions? Conventions. --- modules/config/default/+evil-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index b706e112d..8836ef25c 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -18,8 +18,8 @@ (map! (:map override ;; A little sandbox to run code in - "A-;" 'eval-expression - "M-;" 'eval-expression) + "A-;" #'eval-expression + "M-;" #'eval-expression) [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag From 9916025d5c1fa6ce05aed883af96580179c2a2f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 19:46:14 -0500 Subject: [PATCH 3590/4235] lang/cc: rewrite README --- modules/lang/cc/README.org | 82 ++++++++++++++++++++++++-------------- 1 file changed, 52 insertions(+), 30 deletions(-) diff --git a/modules/lang/cc/README.org b/modules/lang/cc/README.org index ecb9d6f88..58cc39de8 100644 --- a/modules/lang/cc/README.org +++ b/modules/lang/cc/README.org @@ -1,5 +1,21 @@ -#+TITLE: :lang cc +#+TITLE: lang/cc +#+DATE: January 16, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] + - [[irony-server][irony-server]] + - [[MacOS][MacOS]] + - [[Arch Linux][Arch Linux]] + - [[rtags][rtags]] +- [[Configure][Configure]] + - [[Project compile settings][Project compile settings]] + +* Description This module adds support for the C-family of languages: C, C++, and Objective-C. + Code completion (~company-irony~) @@ -10,34 +26,44 @@ This module adds support for the C-family of languages: C, C++, and Objective-C. + 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 a C++ feature or three. +** Module Flags ++ ~+irony~ Enable Irony as a backend for code completion, syntax checking, and + eldoc support. This must be disabled to use LSP or another backend. ++ ~+rtags~ Enable rtags integration. A daemon will be spawned the first time you + open a C/C++/ObjC buffer, if one hasn't already. -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 +** Plugins ++ [[https://github.com/Kitware/CMake][cmake-mode]] ++ [[https://github.com/chachi/cuda-mode][cuda-mode]] ++ [[https://github.com/liblit/demangle-mode][demangle-mode]] ++ [[https://github.com/jart/disaster][disaster]] ++ [[https://github.com/ludwigpacifici/modern-cpp-font-lock][modern-cpp-font-lock]] ++ [[https://github.com/salmanebah/opencl-mode][opencl-mode]] ++ [[https://github.com/jimhourihan/glsl-mode][glsl-mode]]* ++ [[https://github.com/guidoschmidt/company-glsl][gompany-glsl]]* ++ [[https://github.com/Sarcasm/irony-mode][irony]]* ++ [[https://github.com/ikirill/irony-eldoc][irony-eldoc]]* ++ [[https://github.com/Sarcasm/flycheck-irony][flycheck-irony]]* ++ [[https://github.com/Sarcasm/company-irony][company-irony]]* ++ [[https://github.com/hotpxl/company-irony-c-headers][company-irony-c-headers]]* ++ [[https://github.com/Andersbakken/rtags][rtags]]* ++ [[https://github.com/Andersbakken/rtags][ivy-rtags]] or [[https://github.com/Andersbakken/rtags][helm-rtags]]* -* Table of Contents :TOC: -- [[#install][Install]] - - [[#irony-server][irony-server]] - - [[#rtags][rtags]] -- [[#configure][Configure]] - - [[#compile-settings][Compile settings]] +* Prerequisites +This module requires -* Install -This module requires: - -+ irony-server -+ rtags ++ irony-server (if ~+irony~ is enabled) ++ rtags (if ~+rtags~ is enabled) ** irony-server Irony powers the code completion, eldoc and syntax checking systems. +After installing its dependencies, run ~M-x irony-install-server~ in Emacs. + *** MacOS Due to linking issues, MacOS users must compile irony-server manually: -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") +#+BEGIN_SRC sh brew install cmake brew install llvm # 1gb+ installation! May take a while! @@ -60,18 +86,16 @@ rm -rf irony-mode #+END_SRC *** Arch Linux -#+BEGIN_SRC sh :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S clang cmake +#+BEGIN_SRC sh +pacman -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. +Code navigation requires an [[https://github.com/Andersbakken/rtags][rtags]] server (~rdm~) installed. 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: +isn't already running). If you prefer to run it yourself: #+BEGIN_SRC sh rdm & @@ -79,7 +103,7 @@ rc -J $PROJECT_ROOT # loads PROJECT_ROOT's compile_commands.json #+END_SRC * Configure -** Compile settings +** Project compile settings By default, a set of default compile settings are defined in ~+cc-default-compiler-options~ for C, C++ and Objective C. Irony, rtags and flycheck will fall back to these. @@ -87,7 +111,7 @@ 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]]: +There are [[https://sarcasm.github.io/notes/dev/compilation-database.html][many ways to generate one]]. I use [[http://www.cmake.org/][CMake]] or [[https://github.com/rizsotto/Bear][bear]]: #+BEGIN_SRC sh # For CMake projects @@ -98,7 +122,5 @@ 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 e275c375fc82c086874e6431da7628acf61676bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jan 2019 20:02:22 -0500 Subject: [PATCH 3591/4235] tools/wakatime: add README --- modules/tools/wakatime/README.org | 35 +++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 modules/tools/wakatime/README.org diff --git a/modules/tools/wakatime/README.org b/modules/tools/wakatime/README.org new file mode 100644 index 000000000..2427fee03 --- /dev/null +++ b/modules/tools/wakatime/README.org @@ -0,0 +1,35 @@ +#+TITLE: tools/wakatime +#+DATE: June 7, 2018 +#+SINCE: v2.0.4 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] +- [[Configuration][Configuration]] + - [[Obfuscate project file names][Obfuscate project file names]] + +* Description +This module integrates [[https://wakatime.com][wakatime]] into Emacs. + +** Module Flags +This module provides no flags. + +** Plugins ++ wakatime-mode + +* Prerequisites +This module requires an account and API key from wakatime.com. + +Run ~M-x +wakatime/setup~ to set things up. + +* Configuration +** Obfuscate project file names +#+BEGIN_SRC emacs-lisp +(setq +wakatime-hide-filenames t) +#+END_SRC + +This will hide what files and folders you're working in from prying eyes on your +profile. From 25b9a90c12cf54ae776fd0457ed41d953db3478c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 7 Jan 2019 04:57:54 -0500 Subject: [PATCH 3592/4235] Fix localleader keys in replace state #1097 --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 082971d79..e6f3151b1 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -84,7 +84,7 @@ If any hook returns non-nil, all hooks after it are ignored.") ,@args)) (general-create-definer define-localleader-key! - :states (cdr general-describe-evil-states) + :states '(normal visual motion insert) :major-modes t :wk-full-keys nil :prefix doom-localleader-key From e02cde119561b88e68d217d0c02463e07de287a9 Mon Sep 17 00:00:00 2001 From: mbger Date: Mon, 7 Jan 2019 19:28:59 +0100 Subject: [PATCH 3593/4235] :lang cc Add known issues section for macOS --- modules/lang/cc/README.org | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/modules/lang/cc/README.org b/modules/lang/cc/README.org index 58cc39de8..4097e8e09 100644 --- a/modules/lang/cc/README.org +++ b/modules/lang/cc/README.org @@ -14,6 +14,7 @@ - [[rtags][rtags]] - [[Configure][Configure]] - [[Project compile settings][Project compile settings]] + - [[Known issues with bear on macOS][Known issues with bear on macOS]] * Description This module adds support for the C-family of languages: C, C++, and Objective-C. @@ -124,3 +125,42 @@ bear make Use ~M-x +cc/reload-compile-db~ to reload your compile db in an already-open C/C++/ObjC buffer. +** Known issues with bear on macOS +MacOS' [[https://support.apple.com/en-us/HT204899][System Integrity Protection (SIP)]] might interfere with bear if ~make~ is +under ~/usr/bin/~ which results in an empty compilation database. + +From the bear [[https://github.com/rizsotto/Bear#empty-compilation-database-on-os-x-captain-or-fedora][readme]]: + +#+begin_quote +Security extension/modes on different operating systems might disable library +preloads. This case Bear behaves normally, but the result compilation database +will be empty. (Please make sure it's not the case when reporting bugs.) Notable +examples for enabled security modes are: OS X 10.11 (check with csrutil status | +grep 'System Integrity Protection'), and Fedora, CentOS, RHEL (check with +sestatus | grep 'SELinux status'). + +Workaround could be to disable the security feature while running Bear. (This +might involve reboot of your computer, so might be heavy workaround.) Another +option if the build tool is not installed under certain directories. Or use +tools which are using compiler wrappers. (It injects a fake compiler which does +record the compiler invocation and calls the real compiler too.) An example for +such tool might be scan-build. The build system shall respect CC and CXX +environment variables. +#+end_quote + +A workaround might be to install ~make~ via Homebrew which puts ~gmake~ +under ~/usr/local/~. + +#+BEGIN_SRC sh +brew install make +#+END_SRC + +#+BEGIN_SRC sh +make clean +bear gmake +#+END_SRC + +Additional info: + ++ [[https://github.com/rizsotto/Bear/issues/158][Empty compilation database with compiler in /usr/local]] ++ [[https://github.com/rizsotto/Bear/issues/152][Workaround for 'Empty compilation database on OS X Captain]] From 6f0d01a29e78fdde54057d229f201b55b79ff4d6 Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Thu, 3 Jan 2019 15:37:06 -0600 Subject: [PATCH 3594/4235] pdf: remove doom-leader-key from define-key! This is no longer needed now that doom uses general.el. --- modules/tools/pdf/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 7ff08b179..f178f7bd2 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -7,8 +7,7 @@ (pdf-tools-install)) (define-key! pdf-view-mode-map - "q" #'kill-this-buffer - (kbd doom-leader-key) nil) + "q" #'kill-this-buffer) (when (featurep! :feature evil +everywhere) (evil-define-key* 'normal pdf-view-mode-map From 37cb0e178cf136379c2bdb0e6c1c321ea149224a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 00:33:38 -0500 Subject: [PATCH 3595/4235] Make set-lookup-handlers! additive Consecutive calls to set-lookup-handlers! would redefine *all* lookup handlers, unsetting unspecified ones, so you were forced to redefine all handlers, even if you only wanted to change one. No more. Its side effects are now additive. Also adds :async handler support, however, due to their nature, they cannot fall back to other handlers (there's no reliable way to detect they worked or not). To get around this, write a blocking wrapper around the old async method and register it as a non-async handler. --- modules/feature/lookup/autoload/lookup.el | 104 ++++++++++++++-------- modules/lang/javascript/config.el | 2 +- 2 files changed, 66 insertions(+), 40 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 8f115a4a4..6ff84bd29 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -2,6 +2,8 @@ (defvar +lookup--last-provider nil) +(defvar +lookup--handler-alist nil) + ;;;###autodef (defun set-lookup-handlers! (modes &rest plist) "Define a jump target for major MODES. @@ -31,22 +33,42 @@ Otherwise, these properties are available to be set: :xref-backend FN Defines an xref backend for a major-mode. If you define :definition and :references along with :xref-backend, those will have higher precedence. +:async BOOL + Indicates that the supplied handlers *after* this property are asynchronous. + Note: async handlers do not fall back to the default handlers, due to their + nature. To get around this, you must write specialized wrappers to wait for + the async response and return 'fallback. -\(fn MODE-OR-MODES &key DEFINITION REFERENCES DOCUMENTATION FILE XREF-BACKEND)" +\(fn MODE-OR-MODES &key ASYNC DEFINITION REFERENCES DOCUMENTATION FILE XREF-BACKEND)" (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) (fn (intern (format "+lookup|init-%s" mode)))) (cond ((null (car plist)) (remove-hook hook fn) + (setq +lookup--handler-alist + (delq (assq mode +lookup--handler-alist) + +lookup--handler-alist)) (unintern fn nil)) - ((fset fn + ((let ((old-plist (cdr (assq mode +lookup--handler-alist))) + async) + (while plist + (let ((prop (pop plist)) + (fns (pop plist))) + (if (eq prop :async) + (setq async t) + (dolist (fn (doom-enlist fns)) + (put fn '+lookup-async async)) + (setq old-plist (plist-put old-plist prop fns))))) + (setq plist old-plist) + (setf (alist-get mode +lookup--handler-alist) plist)) + (fset fn (lambda () (when (or (eq major-mode mode) (and (boundp mode) (symbol-value mode))) (cl-destructuring-bind - (&key definition references documentation file xref-backend) + (&key definition references documentation file xref-backend async) plist (when definition (add-hook '+lookup-definition-functions definition nil t)) @@ -86,29 +108,39 @@ Otherwise, these properties are available to be set: (xref-backend-identifier-at-point (xref-find-backend))))) (defun +lookup--jump-to (prop identifier &optional other-window) - (cl-loop with origin = (point-marker) - for fn - in (plist-get (list :definition +lookup-definition-functions - :references +lookup-references-functions - :documentation +lookup-documentation-functions - :file +lookup-file-functions) - prop) - for cmd = (or (command-remapping fn) fn) - if (condition-case e - (save-window-excursion - (when (or (if (commandp cmd) - (call-interactively cmd) - (funcall cmd identifier)) - (/= (point-marker) origin)) - (point-marker))) - (error (ignore (message "%s" e)))) - return - (progn - (funcall (if other-window - #'pop-to-buffer - #'pop-to-buffer-same-window) - (marker-buffer it)) - (goto-char it)))) + ;; TODO Refactor me + (let ((origin (point-marker))) + (cl-loop for fn + in (plist-get (list :definition +lookup-definition-functions + :references +lookup-references-functions + :documentation +lookup-documentation-functions + :file +lookup-file-functions) + prop) + for cmd = (or (command-remapping fn) fn) + if (get fn '+lookup-async) + return + (progn + (when other-window + ;; If async, we can't catch the window change or destination buffer + ;; reliably, so we set up the new window ahead of time. + (switch-to-buffer-other-window (current-buffer)) + (goto-char (marker-position origin))) + (call-interactively fn)) + if (condition-case e + (save-window-excursion + (when (or (if (commandp cmd) + (call-interactively cmd) + (funcall cmd identifier)) + (/= (point-marker) origin)) + (point-marker))) + (error (ignore (message "%s" e)))) + return + (progn + (funcall (if other-window + #'switch-to-buffer-other-window + #'switch-to-buffer) + (marker-buffer it)) + (goto-char it))))) (defun +lookup--file-search (identifier) (unless identifier @@ -214,8 +246,7 @@ evil-mode is active." current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) - ((and +lookup-definition-functions - (+lookup--jump-to :definition identifier other-window))) + ((+lookup--jump-to :definition identifier other-window)) ((error "Couldn't find the definition of '%s'" identifier)))) @@ -231,8 +262,7 @@ search otherwise." current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) - ((and +lookup-references-functions - (+lookup--jump-to :references identifier other-window))) + ((+lookup--jump-to :references identifier other-window)) ((error "Couldn't find references of '%s'" identifier)))) @@ -240,18 +270,15 @@ search otherwise." (defun +lookup/documentation (identifier &optional other-window) "Show documentation for IDENTIFIER (defaults to symbol at point or selection. -Goes down a list of possible backends: - -1. The :documentation spec defined with by `set-lookup-handlers!' -2. If the +docsets flag is active for :feature lookup, use `+lookup/in-docsets' -3. Fall back to an online search, with `+lookup/online'" +First attempts the :documentation handler specified with `set-lookup-handlers!' +for the current mode/buffer (if any), then falls back to the backends in +`+lookup-documentation-functions'." (interactive (list (+lookup--symbol-or-region) current-prefix-arg)) (cond ((null identifier) (user-error "Nothing under point")) - ((and +lookup-documentation-functions - (+lookup--jump-to :documentation identifier other-window))) + ((+lookup--jump-to :documentation identifier other-window)) ((user-error "Couldn't find documentation for '%s'" identifier)))) @@ -279,8 +306,7 @@ Otherwise, falls back on `find-file-at-point'." ((ffap-url-p path) (find-file-at-point path)) - ((not (and +lookup-file-functions - (+lookup--jump-to :file path))) + ((not (+lookup--jump-to :file path)) (let ((fullpath (expand-file-name path))) (when (and buffer-file-name (file-equal-p fullpath buffer-file-name)) (user-error "Already here")) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 92d6c33a3..e71b88505 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -148,7 +148,7 @@ (setq-default company-backends (delq 'company-tide (default-value 'company-backends)))) (set-company-backend! 'tide-mode 'company-tide) ;; navigation - (set-lookup-handlers! 'tide-mode + (set-lookup-handlers! 'tide-mode :async t :definition #'tide-jump-to-definition :references #'tide-references :documentation #'tide-documentation-at-point) From 7645f843acc34674693717f70c1807ef82c17a1c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 00:37:53 -0500 Subject: [PATCH 3596/4235] lang/javascript: mode-name = JS2 A shorter name looks nicer in the modeline. --- modules/lang/javascript/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index e71b88505..d93d1bd7f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -47,7 +47,9 @@ (add-hook 'js2-mode-hook #'rainbow-delimiters-mode) ;; Indent switch-case another step - (setq-hook! 'js2-mode-hook js-switch-indent-offset js2-basic-offset) + (setq-hook! 'js2-mode-hook + js-switch-indent-offset js2-basic-offset + mode-name "JS2") (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/repl) From d3fd9f3754770611faa2fe929f4152876703764d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 00:38:22 -0500 Subject: [PATCH 3597/4235] Update Doom module README file template --- .../templates/org-mode/__doom-readme | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/modules/feature/file-templates/templates/org-mode/__doom-readme b/modules/feature/file-templates/templates/org-mode/__doom-readme index 8a6f23a5d..8e8af8fa6 100644 --- a/modules/feature/file-templates/templates/org-mode/__doom-readme +++ b/modules/feature/file-templates/templates/org-mode/__doom-readme @@ -1,25 +1,33 @@ # -*- mode: snippet -*- # name: Doom module readme # -- -#+TITLE: ${1:`(if (string-match "modules/\\([^/]+\\)/\\([^/]+\\)/.+" buffer-file-name) - (format ":%s %s" - (match-string 1 buffer-file-name) - (match-string 2 buffer-file-name)) - "")`} - -${2:A short summary about what this module does.} +#+TITLE: ${1:`(if (string-match "modules/\\([^/]+\\)/\\([^/]+\\)/.+" buffer-file-name) + (format "%s/%s" + (match-string 1 buffer-file-name) + (match-string 2 buffer-file-name)) + "")`} +#+DATE: `(format (format-time-string "%B %%s, %Y") (string-to-number (format-time-string "%d")))` +#+SINCE: ${2:{replace with next tagged release version}} +#+STARTUP: inlineimages -${3:If necessary, include a longer description below it that goes into more detail. This may be as long as you like. +* Table of Contents :TOC_3:noexport: + +* Description +${3:A summary of what this module does.} + If possible, include a brief list of feature highlights here + Like code completion, syntax checking or available snippets + Include links to packages & external things where possible -* Table of Contents :TOC: - -* Module Flags +** Module Flags This module provides no flags. +** Plugins +{A list of linked plugins} + +** Hacks +{A list of internal modifications to included packages} + * Prerequisites This module has no prereqisites. @@ -29,10 +37,6 @@ An in-depth list of features, how to use them, and their dependencies. * Configuration How to configure this module, including common problems and how to address them. -* Appendix -** Commands -+ A list or table of public commands (and their keybinds) and functions that this module exposes. -+ A brief description of how to use them -** Hacks -+ Include a list of ways this module changes default behavior +* Troubleshooting +Common issues and their solution, or places to look for help. $0 \ No newline at end of file From ceb06e19488bd92dc87b25efa356cdc17801dda2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 00:38:46 -0500 Subject: [PATCH 3598/4235] Fix C-style doc comment pair expansion Some major modes rely on external parsers for correct indentation, like js2-mode or enh-ruby-mode. They don't properly indent the closing comment pair (*/), so we do it manually. --- modules/config/default/config.el | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 7c8f6e82b..ede24a339 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -64,12 +64,20 @@ (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) "" :actions '(insert) :post-handlers '(("| " "SPC"))) + ;; Expand C-style doc comment blocks + (defun +default-expand-doc-comment-block (&rest _ignored) + (let ((indent (current-indentation))) + (newline-and-indent) + (save-excursion + (newline) + (insert (make-string indent 32) " */") + (delete-char 2)))) (sp-local-pair '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode - java-mode php-mode css-mode scss-mode less-css-mode stylus-mode) + java-mode php-mode css-mode scss-mode less-css-mode stylus-mode) "/*" "*/" :actions '(insert) - :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") ("\n* ||\n*/[i][d-2]" "*"))) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) ;; Highjacks backspace to: ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) From 30eaf8fd031bf89568f511ec23cad6b5b221d07e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 20:38:17 -0500 Subject: [PATCH 3599/4235] Fix "cannot split parent or side window" errors Hopefully addresses a common issue where helm actions will operate on the wrong window (a popup, typically, which is a dedicated side window; Emacs doesn't let you split side windows). This comes with a side effect: trying to split a popup will cause a non-popup window nearby to be split instead. Popups really aren't supposed to be split (interactively) in any case. --- modules/ui/popup/autoload/popup.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index b034c1ae8..db06ec5a9 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -102,6 +102,15 @@ the buffer is visible, then set another timer and try again later." parameters) alist))) +(defun +popup--split-window (window size side) + "Ensure a non-dedicated/popup window is selected when splitting a window." + (cl-loop for win in (delq nil (cons window (window-list))) + unless (or (+popup-window-p win) + (window-minibuffer-p win)) + return (setq window win)) + (let ((ignore-window-parameters t)) + (split-window window size side))) + ;;;###autoload (defun +popup--init (window &optional alist) "Initializes a popup window. Run any time a popup is opened. It sets the @@ -115,6 +124,7 @@ and enables `+popup-buffer-mode'." (dolist (param (cdr (assq 'window-parameters alist))) (set-window-parameter window (car param) (cdr param)))) (set-window-parameter window 'popup t) + (set-window-parameter window 'split-window #'+popup--split-window) (set-window-parameter window 'delete-window #'+popup--delete-window) (set-window-parameter window 'delete-other-windows #'+popup--delete-other-windows) (set-window-dedicated-p window 'popup) From fbb0297eb10bd56e046ce0a6043c5956fbeac65a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 20:40:26 -0500 Subject: [PATCH 3600/4235] ui/treemacs: remove leader key fix These aren't necessary now that the leader keymap has high precedence. --- modules/ui/treemacs/config.el | 82 +---------------------------------- 1 file changed, 1 insertion(+), 81 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 861800fc9..e8a2df738 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -47,87 +47,7 @@ There are 2 possible values: (def-package! treemacs-evil :when (featurep! :feature evil +everywhere) - :after treemacs - :config - ;; FIXME Remove this when general.el is in - (set-evil-initial-state! 'treemacs-mode 'normal) - (map! :map treemacs-mode-map - :n "?" #'treemacs-helpful-hydra - :n [mouse-1] #'treemacs-leftclick-action - :n [double-mouse-1] #'treemacs-doubleclick-action - :n [tab] #'treemacs-TAB-action - :n [?\t] #'treemacs-TAB-action - :n [return] #'treemacs-RET-action - :n "RET" #'treemacs-RET-action - :n "r" #'treemacs-refresh - :n "d" #'treemacs-delete - :n "cf" #'treemacs-create-file - :n "cd" #'treemacs-create-dir - :n "R" #'treemacs-rename - :n "u" #'treemacs-goto-parent-node - :n "q" #'bury-buffer - :n "Q" #'treemacs-kill-buffer - :n "ov" #'treemacs-visit-node-vertical-split - :n "oh" #'treemacs-visit-node-horizontal-split - :n "oo" #'treemacs-visit-node-no-split - :n "oaa" #'treemacs-visit-node-ace - :n "oah" #'treemacs-visit-node-ace-horizontal-split - :n "oav" #'treemacs-visit-node-ace-vertical-split - :n "ox" #'treemacs-visit-node-in-external-application - :n "P" #'treemacs-peek - :n "n" #'treemacs-next-line - :n "p" #'treemacs-previous-line - :n "M-N" #'treemacs-next-line-other-window - :n "M-P" #'treemacs-previous-line-other-window - :n "" #'treemacs-previous-page-other-window - :n "" #'treemacs-next-page-other-window - :n "M-n" #'treemacs-next-neighbour - :n "M-p" #'treemacs-previous-neighbour - :n "th" #'treemacs-toggle-show-dotfiles - :n "tw" #'treemacs-toggle-fixed-width - :n "tv" #'treemacs-fringe-indicator-mode - :n "tg" #'treemacs-git-mode - :n "tf" #'treemacs-follow-mode - :n "ta" #'treemacs-filewatch-mode - :n "w" #'treemacs-set-width - :n "yy" #'treemacs-copy-path-at-point - :n "yr" #'treemacs-copy-project-root - :n "s" #'treemacs-resort - :n "b" #'treemacs-add-bookmark - :n "C-p r" #'treemacs-rename-project - :n "C-p a" #'treemacs-add-project-to-workspace - :n "C-p d" #'treemacs-remove-project-from-workspace - :n "C-p c c" #'treemacs-collapse-project - :n "C-p c o" #'treemacs-collapse-other-projects - :n "C-p c a" #'treemacs-collapse-all-projects - :n "" #'treemacs-collapse-all-projects - :n "C-j" #'treemacs-next-project - :n "C-k" #'treemacs-previous-project - :n "h" #'treemacs-root-up - :n "l" #'treemacs-root-down - :n [escape] #'delete-window - :n "j" #'treemacs-next-line - :n "k" #'treemacs-previous-line - :n "M-j" #'treemacs-next-neighbour - :n "M-k" #'treemacs-previous-neighbour - :n "M-J" #'treemacs-next-line-other-window - :n "M-K" #'treemacs-previous-line-other-window - :n "th" #'treemacs-toggle-show-dotfiles - :n "tw" #'treemacs-toggle-fixed-width - :n "tv" #'treemacs-fringe-indicator-mode - :n "tf" #'treemacs-follow-mode - :n "ta" #'treemacs-filewatch-mode - :n "tg" #'treemacs-git-mode - :n "w" #'treemacs-set-width - :n "b" #'treemacs-add-bookmark - :n "?" #'treemacs-helpful-hydra - :n "RET" #'treemacs-RET-action - :n "yr" #'treemacs-copy-project-root - :n "yy" #'treemacs-copy-path-at-point - :n "gr" #'treemacs-refresh - :n [down-mouse-1] #'ignore - :n "h" #'treemacs-root-up - :n "l" #'treemacs-root-down)) + :after treemacs) (def-package! treemacs-projectile From 069c196330e188bbf68ce121f4bf6d91978d90c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 20:54:03 -0500 Subject: [PATCH 3601/4235] Appease byte-compiler senpai Please notice me --- core/core-keybinds.el | 2 +- modules/feature/evil/autoload/advice.el | 2 +- modules/lang/org/autoload/org.el | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index e6f3151b1..6cfe25317 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -206,7 +206,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (:map evil-outer-text-objects-map ,key ,outer)) doom--map-forms))) (_ - (condition-case e + (condition-case _ (doom--map-def (pop rest) (pop rest) (doom--keyword-to-states key) desc) (error (error "Not a valid `map!' property: %s" key))) diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index cd46546be..f831c2608 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -1,6 +1,6 @@ ;;; feature/evil/autoload/advice.el -*- lexical-binding: t; -*- -(defun +evil--insert-newline (&optional above noextranewline) +(defun +evil--insert-newline (&optional above _noextranewline) (let ((pos (save-excursion (beginning-of-line-text) (point))) comment-auto-fill-only-comments) (require 'smartparens) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 85d869c21..e5172b047 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -44,7 +44,7 @@ current file). Only scans first 2048 bytes of the document." :group 'evil-org (setq org-hide-emphasis-markers +org-pretty-mode) (org-toggle-pretty-entities) - (org-with-silent-modifications + (with-silent-modifications ;; In case the above un-align tables (org-table-map-tables 'org-table-align t))) From 4b2dbe42a5a472d5836293727eebc672b54e5f1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 8 Jan 2019 21:49:43 -0500 Subject: [PATCH 3602/4235] Fix popup :slot property It was broken by the new split-window parameter set on popup windows. --- modules/ui/popup/autoload/popup.el | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index db06ec5a9..695f93c8d 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -1,5 +1,7 @@ ;;; ui/popup/autoload/popup.el -*- lexical-binding: t; -*- +(defvar +popup--internal nil) + (defun +popup--remember (windows) "Remember WINDOWS (a list of windows) for later restoration." (cl-assert (cl-every #'windowp windows) t) @@ -104,10 +106,12 @@ the buffer is visible, then set another timer and try again later." (defun +popup--split-window (window size side) "Ensure a non-dedicated/popup window is selected when splitting a window." - (cl-loop for win in (delq nil (cons window (window-list))) - unless (or (+popup-window-p win) - (window-minibuffer-p win)) - return (setq window win)) + (unless +popup--internal + (cl-loop for win + in (cons (or window (selected-window)) + (window-list nil 0 window)) + unless (+popup-window-p win) + return (setq window win))) (let ((ignore-window-parameters t)) (split-window window size side))) @@ -545,12 +549,14 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (or (and next-window ;; Make new window before `next-window'. (let ((next-side (if left-or-right 'above 'left)) + (+popup--internal t) (window-combination-resize 'side)) (setq window (ignore-errors (split-window next-window nil next-side))))) (and prev-window ;; Make new window after `prev-window'. (let ((prev-side (if left-or-right 'below 'right)) + (+popup--internal t) (window-combination-resize 'side)) (setq window (ignore-errors (split-window prev-window nil prev-side)))))) From 5d4dec996ff73c6e722626e9cbd5c295721451a8 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Wed, 9 Jan 2019 14:06:02 +0100 Subject: [PATCH 3603/4235] org: let ob-async ignore ob-ipython ipython implements its own `async` keyword. As ob-async is loaded now by default, we need to explicitly tell ob-async not to touch ob-ipython blocks. --- modules/lang/org/+babel.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index fb4bdb118..f78d10a6b 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -93,4 +93,8 @@ the first function to return non-nil.") ;; retina resolution image hack (when (eq window-system 'ns) - (advice-add 'ob-ipython--write-base64-string :around #'+org*ob-ipython--write-base64-string))) + (advice-add 'ob-ipython--write-base64-string :around #'+org*ob-ipython--write-base64-string)) + + ;; ipython has its own async keyword, disable ipython in ob-async. + (after! ob-async + (add-to-list 'ob-async-no-async-languages-alist "ipython"))) From 0a7717786ce873f336e9f370b05e01bf2aa1e661 Mon Sep 17 00:00:00 2001 From: Kenneth Zhao Date: Thu, 10 Jan 2019 11:45:32 +0800 Subject: [PATCH 3604/4235] Fix an issue where doom-leader-alt-key and doom-localleader-alt-key does not work in emacs mode --- core/core-keybinds.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 6cfe25317..369e90183 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -77,14 +77,14 @@ If any hook returns non-nil, all hooks after it are ignored.") (after! evil (defmacro define-leader-key! (&rest args) `(general-define-key - :states '(normal visual motion insert) + :states '(normal visual motion insert emacs) :keymaps 'doom-leader-map :prefix doom-leader-key :non-normal-prefix doom-leader-alt-key ,@args)) (general-create-definer define-localleader-key! - :states '(normal visual motion insert) + :states '(normal visual motion insert emacs) :major-modes t :wk-full-keys nil :prefix doom-localleader-key From 0d3c8e3d9a4cba438f674c5a71cd2e4e1bf18d23 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 10 Jan 2019 13:09:14 +0200 Subject: [PATCH 3605/4235] Fix def-package for magit/forge - add :after magit - fix space position after "Forge" --- modules/tools/magit/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 5250cbe6b..ae010b33e 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -104,6 +104,7 @@ what features are available.") (def-package! forge :when (featurep! :tools magit +forge) + :after magit :config (map! :leader - :desc "Forge ""gF" #'forge-dispatch)) + :desc "Forge" "gF" #'forge-dispatch)) From b796ad76cc22e8173aca3f410eb5e593f53e9d60 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 10 Jan 2019 13:15:54 +0200 Subject: [PATCH 3606/4235] Move Forge leader binding to magit/+evil-bindings --- modules/tools/magit/+evil-bindings.el | 4 ++++ modules/tools/magit/config.el | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 modules/tools/magit/+evil-bindings.el diff --git a/modules/tools/magit/+evil-bindings.el b/modules/tools/magit/+evil-bindings.el new file mode 100644 index 000000000..bc5763023 --- /dev/null +++ b/modules/tools/magit/+evil-bindings.el @@ -0,0 +1,4 @@ +;;; tools/magit/+evil-bindings.el -*- lexical-binding: t; -*- + +(map! :leader + :desc "Forge" "gF" #'forge-dispatch) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index ae010b33e..a5a7b068d 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -104,7 +104,7 @@ what features are available.") (def-package! forge :when (featurep! :tools magit +forge) - :after magit - :config - (map! :leader - :desc "Forge" "gF" #'forge-dispatch)) + :after magit) + +(when (featurep! :feature evil) + (load! "+evil-bindings")) From b0b666b8f57144be83c355a242aac11c5bcd19f3 Mon Sep 17 00:00:00 2001 From: Undead Kernel Date: Wed, 2 Jan 2019 23:43:11 +0100 Subject: [PATCH 3607/4235] bindings: default set of bindings for emacs users --- modules/config/default/+emacs-bindings.el | 257 +++++++++++++++++++++- modules/config/default/+evil-bindings.el | 37 ++++ modules/config/default/config.el | 38 +--- 3 files changed, 294 insertions(+), 38 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index fea63ab5e..c2b8680b1 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -1,3 +1,258 @@ ;;; config/default/+emacs-bindings.el -*- lexical-binding: t; -*- -;; TODO +;; Sensible deafult key bindings for non-evil users + +;; persp-mode and projectile in different prefixes +(setq persp-keymap-prefix (kbd "C-c e")) +(after! projectile + (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)) + +(which-key-add-key-based-replacements "C-c !" "checking") +(which-key-add-key-based-replacements "C-c e" "perspective") +(which-key-add-key-based-replacements "C-c p" "projectile") + +;; Prefix key to invoke doom related commands +(setq doom-leader-alt-key "C-c") + +(map! + ;; Text scaling + "C-+" (λ! (text-scale-set 0)) + "C-=" #'text-scale-increase + "C--" #'text-scale-decrease + ;; Editor related bindings + "C-a" #'doom/backward-to-bol-or-indent + [remap newline] #'newline-and-indent + "C-j" #'+default/newline + "C-S-s" #'swiper + ;; Buffer related bindings + "C-x b" #'persp-switch-to-buffer + "C-x C-b" #'ibuffer-list-buffers + "C-x B" #'switch-to-buffer + "C-x k" #'doom/kill-this-buffer-in-all-windows + ;; Popup bindigns + "C-x p" #'+popup/other + "C-`" #'+popup/toggle + "C-~" #'+popup/raise + ;; Doom emacs bindings + (:leader + (:prefix ("d" . "doom") + :desc "Dashboard" "d" #'+doom-dashboard/open + :desc "Recent files" "f" #'recentf-open-files + (:when (featurep! :ui neotree) + :desc "Open neotree" "n" #'+neotree/open + :desc "File in neotree" "N" #'neotree/find-this-file) + (:when (featurep! :ui treemacs) + :desc "Toggle treemacs" "n" #'+treemacs/toggle + :desc "File in treemacs" "N" #'+treemacs/find-file) + :desc "Popup other" "o" #'+popup/other + :desc "Popup toggle" "t" #'+popup/toggle + :desc "Popup close" "c" #'+popup/close + :desc "Popup close all" "C" #'+popup/close-all + :desc "Popup raise" "r" #'+popup/raise + :desc "Popup restore" "R" #'+popup/restore + :desc "Scratch buffer" "s" #'doom/open-scratch-buffer + :desc "Switch to scratch buffer" "S" #'doom/switch-to-scratch-buffer + :desc "Sudo this file" "u" #'doom/sudo-this-file + :desc "Sudo find file" "U" #'doom/sudo-find-file + :desc "Eshell popup" "e" #'+eshell/open-popup + :desc "Eshell open" "E" #'+eshell/open + :desc "Reload Private Config" "R" #'doom/reload) + ;; Org related bindings + "o" nil ; we need to unbind it first as Org claims this + (:prefix ("o". "org") + :desc "Do what I mean" "o" #'+org/dwim-at-point + :desc "Sync org caldav" "s" #'org-caldav-sync + (:prefix ("a" . "org agenda") + :desc "Agenda" "a" #'org-agenda + :desc "Todo list" "t" #'org-todo-list + :desc "Tags view" "m" #'org-tags-view + :desc "View search" "v" #'org-search-view) + :desc "Capture" "c" #'org-capture + :desc "Goto capture" "C" (λ! (require 'org-capture) (call-interactively #'org-capture-goto-target)) + :desc "Switch org buffers" "b" #'org-switchb + (:prefix ("e" . "org export") + :desc "Export beamer to latex" "l b" #'org-beamer-export-to-latex + :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex + :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf) + :desc "Link store" "l" #'org-store-link) + ;; Snippets + "&" nil ; yasnippet creates this prefix, we use a different one + (:prefix ("s" . "snippets") + :desc "New snippet" "n" #'yas-new-snippet + :desc "Insert snippet" "i" #'yas-insert-snippet + :desc "Find global snippet" "/" #'yas-visit-snippet-file + :desc "Reload snippets" "r" #'yas-reload-all + :desc "Create Temp Template" "c" #'aya-create + :desc "Use Temp Template" "e" #'aya-expand) + ;; Version control bindings + (:prefix ("v" . "versioning") + :desc "Browse issues tracker" "i" #'+vc/git-browse-issues + :desc "Browse remote" "o" #'+vc/git-browse + :desc "Diff current file" "d" #'magit-diff-buffer-file + :desc "Git revert hunk" "r" #'git-gutter:revert-hunk + :desc "Git stage file" "S" #'magit-stage-file + :desc "Git stage hunk" "s" #'git-gutter:stage-hunk + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Git unstage file" "U" #'magit-unstage-file + :desc "Initialize repo" "I" #'magit-init + :desc "List repositories" "L" #'magit-list-repositories + :desc "Magit blame" "b" #'magit-blame-addition + :desc "Magit buffer log" "l" #'magit-log-buffer-file + :desc "Magit commit" "c" #'magit-commit-create + :desc "Magit status" "g" #'magit-status + :desc "Next hunk" "]" #'git-gutter:next-hunk + :desc "Previous hunk" "[" #'git-gutter:previous-hunk) + ;; Worspace and window management bindings + (:prefix ("w". "workspaces") + :desc "Autosave session" "a" #'+workspace/save-session + :desc "Display workspaces" "d" #'+workspace/display + :desc "Rename workspace" "r" #'+workspace/rename + :desc "Create workspace" "c" #'+workspace/new + :desc "Delete workspace" "k" #'+workspace/delete + :desc "Save session" "s" (λ! (let ((current-prefix-arg '(4))) (call-interactively #'+workspace/save-session))) + :desc "Save workspace" "S" #'+workspace/save + :desc "Load session" "l" #'+workspace/load-session + :desc "Load last autosaved session" "L" #'+workspace/load-last-session + :desc "Kill other buffers" "o" #'doom/kill-other-buffers + :desc "Undo window config" "u" #'winner-undo + :desc "Redo window config" "U" #'winner-redo + :desc "Switch to left workspace" "p" #'+workspace/switch-left + :desc "Switch to right workspace" "n" #'+workspace/switch-right + :desc "Switch to workspace 1" "1" (λ! (+workspace/switch-to 0)) + :desc "Switch to workspace 2" "2" (λ! (+workspace/switch-to 1)) + :desc "Switch to workspace 3" "3" (λ! (+workspace/switch-to 2)) + :desc "Switch to workspace 4" "4" (λ! (+workspace/switch-to 3)) + :desc "Switch to workspace 5" "5" (λ! (+workspace/switch-to 4)) + :desc "Switch to workspace 6" "6" (λ! (+workspace/switch-to 5)) + :desc "Switch to workspace 7" "7" (λ! (+workspace/switch-to 6)) + :desc "Switch to workspace 8" "8" (λ! (+workspace/switch-to 7)) + :desc "Switch to workspace 9" "9" (λ! (+workspace/switch-to 8)) + :desc "Switch to last workspace" "0" #'+workspace/switch-to-last) + ;; Multiple Cursors + (:when (featurep! :editor multiple-cursors) + (:prefix ("m" . "multiple cursors") + :desc "Edit lines" "l" #'mc/edit-lines + :desc "Mark next" "n" #'mc/mark-next-like-this + :desc "Unmark next" "N" #'mc/unmark-next-like-this + :desc "Mark previous" "p" #'mc/mark-previous-like-this + :desc "Unmark previous" "P" #'mc/unmark-previous-like-this + :desc "Mark all" "t" #'mc/mark-all-like-this + :desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim + :desc "Edit line endings" "e" #'mc/edit-ends-of-lines + :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines + :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair + :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun + :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click))) + + ;; Plugins + + ;; misc plugins + "" #'+neotree/open + "C-=" #'er/expand-region + ;; smartparens + (:after smartparens + (:map smartparens-mode-map + "C-M-a" #'sp-beginning-of-sexp + "C-M-e" #'sp-end-of-sexp + "C-M-f" #'sp-forward-sexp + "C-M-b" #'sp-backward-sexp + "C-M-d" #'sp-splice-sexp + "C-M-k" #'sp-kill-sexp + "C-M-t" #'sp-transpose-sexp + "C-" #'sp-forward-slurp-sexp + "M-" #'sp-forward-barf-sexp + "C-" #'sp-backward-slurp-sexp + "M-" #'sp-backward-barf-sexp)) + ;; company mode + "C-;" #'+company/complete + ;; Counsel + (:when (featurep! :completion ivy) + (: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)) + "C-h b" #'counsel-descbinds + "C-M-y" #'counsel-yank-pop + "C-h F" #'counsel-faces + "C-h p" #'counsel-package + "C-h a" #'counsel-apropos + "C-h V" #'counsel-set-variable + "C-'" #'counsel-imenu)) + ;; repl toggle + "C-c C-z" #'+eval/open-repl + ;; company mode + (:after company + (:map company-active-map + "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" #'company-search-candidates + "M-s" #'company-filter-candidates + "" #'company-complete-common-or-cycle + [tab] #'company-complete-common-or-cycle + [backtab] #'company-select-previous + "C-RET" #'counsel-company) + (:map company-search-map + "C-n" #'company-search-repeat-forward + "C-p" #'company-search-repeat-backward + "C-s" (λ! (company-search-abort) (company-filter-candidates)))) + ;; neotree bindings + (:after neotree + :map neotree-mode-map + "q" #'neotree-hide + [return] #'neotree-enter + "RET" #'neotree-enter + "SPC" #'neotree-quick-look + "v" #'neotree-enter-vertical-split + "s" #'neotree-enter-horizontal-split + "c" #'neotree-create-node + "D" #'neotree-delete-node + "g" #'neotree-refresh + "r" #'neotree-rename-node + "R" #'neotree-refresh + "h" #'+neotree/collapse-or-up + "l" #'+neotree/expand-or-open + "n" #'neotree-next-line + "p" #'neotree-previous-line + "N" #'neotree-select-next-sibling-node + "P" #'neotree-select-previous-sibling-node) + ;; help and info + (:after help-mode + (:map help-mode-map + "o" #'ace-link-help + ">" #'help-go-forward + "<" #'help-go-back)) + (:after helpful-mode + (:map helpful-mode-map + "o" #'ace-link-help)) + (:after info + (:map Info-mode-map + "o" #'ace-link-info)) + ;; yasnippet + (:after yasnippet + ;; keymap while editing an inserted snippet + (:map yas-keymap + "C-e" #'snippets/goto-end-of-field + "C-a" #'snippets/goto-start-of-field + "" #'yas-prev-field + "" #'+snippets/delete-to-start-of-field + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field)) + ;; flycheck + (:after flycheck + (:map flycheck-error-list-mode-map + "C-n" #'flycheck-error-list-next-error + "C-p" #'flycheck-error-list-previous-error + "RET" #'flycheck-error-list-goto-error)) + ;; ivy + (:after ivy + (:map ivy-minibuffer-map + "TAB" #'ivy-alt-done + "C-g" #'keyboard-escape-quit)) + ;; ein notebokks + (:after ein:notebook-multilang + (:map ein:notebook-multilang-mode-map + "C-c h" #'+ein/hydra/body))) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8836ef25c..9dcf34431 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -12,10 +12,47 @@ doom-leader-key doom-localleader-key doom-leader-alt-key doom-localleader-alt-key)) +;; OS specific fixes +(when IS-MAC + ;; Fix frame-switching key on MacOS + (global-set-key (kbd "M-`") #'other-frame)) ;; ;; Global keybindings +(define-key! + ;; Buffer-local font scaling + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease + ;; Simple window/frame navigation/manipulation + "M-w" #'delete-window + "M-W" #'delete-frame + "M-n" #'+default/new-buffer + "M-N" #'make-frame + ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because + ;; it imposes some other functionality and overhead we don't need) + "M-z" #'undo + "M-s" #'save-buffer + "M-c" (if (featurep 'evil) 'evil-yank 'copy-region-as-kill) + "M-v" #'yank + ;; Textmate-esque bindings + "M-a" #'mark-whole-buffer + "M-b" #'+default/compile + "M-f" #'swiper + "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) + ;; textmate-esque newline insertion + [M-return] #'evil-open-below + [M-S-return] #'evil-open-above + ;; textmate-esque deletion + [M-backspace] #'doom/backward-kill-to-bol-and-indent) + +;; Smarter C-a/C-e for both Emacs and Evil. 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+trailing whitespace before jumping to eol. +(map! :gi "C-a" #'doom/backward-to-bol-or-indent + :gi "C-e" #'doom/forward-to-last-non-comment-or-eol) + (map! (:map override ;; A little sandbox to run code in "A-;" #'eval-expression diff --git a/modules/config/default/config.el b/modules/config/default/config.el index ede24a339..f5b21abf3 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -134,10 +134,7 @@ ;; OS specific fixes (when IS-MAC ;; Fix MacOS shift+tab - (define-key input-decode-map [S-iso-lefttab] [backtab]) - ;; Fix frame-switching key on MacOS - (global-set-key (kbd "M-`") #'other-frame)) - + (define-key input-decode-map [S-iso-lefttab] [backtab])) ;; ;; Doom's keybinding scheme @@ -148,39 +145,6 @@ "M-x" #'execute-extended-command "A-x" #'execute-extended-command) - (define-key! - ;; Buffer-local font scaling - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease - ;; Simple window/frame navigation/manipulation - "M-w" #'delete-window - "M-W" #'delete-frame - "M-n" #'+default/new-buffer - "M-N" #'make-frame - ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because - ;; it imposes some other functionality and overhead we don't need) - "M-z" #'undo - "M-s" #'save-buffer - "M-c" (if (featurep 'evil) 'evil-yank 'copy-region-as-kill) - "M-v" #'yank - ;; Textmate-esque bindings - "M-a" #'mark-whole-buffer - "M-b" #'+default/compile - "M-f" #'swiper - "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) - ;; textmate-esque newline insertion - [M-return] #'evil-open-below - [M-S-return] #'evil-open-above - ;; textmate-esque deletion - [M-backspace] #'doom/backward-kill-to-bol-and-indent) - - ;; Smarter C-a/C-e for both Emacs and Evil. 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+trailing whitespace before jumping to eol. - (map! :gi "C-a" #'doom/backward-to-bol-or-indent - :gi "C-e" #'doom/forward-to-last-non-comment-or-eol) - (if (featurep 'evil) (load! "+evil-bindings") (load! "+emacs-bindings"))) From 5ac21091d7bbdbdc9d06b81ddc8e1cdbaeb44c15 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 13:14:14 +0100 Subject: [PATCH 3608/4235] bindings: add an alt localleader --- modules/config/default/+emacs-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index c2b8680b1..aa12c3121 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -13,6 +13,7 @@ ;; Prefix key to invoke doom related commands (setq doom-leader-alt-key "C-c") +(setq doom-localleader-alt-key "C-c l") (map! ;; Text scaling From 1aca8aa3782625ba5951dbc11933cb67bba8b580 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 13:14:43 +0100 Subject: [PATCH 3609/4235] bindings: move and add more text size bindings --- modules/config/default/+emacs-bindings.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index aa12c3121..3439ec5ce 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -17,9 +17,12 @@ (map! ;; Text scaling - "C-+" (λ! (text-scale-set 0)) - "C-=" #'text-scale-increase - "C--" #'text-scale-decrease + "" #'text-scale-increase + "" #'text-scale-decrease + "" (λ! (text-scale-set 0)) + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease ;; Editor related bindings "C-a" #'doom/backward-to-bol-or-indent [remap newline] #'newline-and-indent From c8f6c81455f301ba95fa758e69e6316d90d04a94 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 13:15:10 +0100 Subject: [PATCH 3610/4235] bindings: workspace switch-to --- modules/config/default/+emacs-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 3439ec5ce..9a0c7d4b6 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -122,6 +122,7 @@ :desc "Redo window config" "U" #'winner-redo :desc "Switch to left workspace" "p" #'+workspace/switch-left :desc "Switch to right workspace" "n" #'+workspace/switch-right + :desc "Switch to" "w" #'+workspace/switch-to :desc "Switch to workspace 1" "1" (λ! (+workspace/switch-to 0)) :desc "Switch to workspace 2" "2" (λ! (+workspace/switch-to 1)) :desc "Switch to workspace 3" "3" (λ! (+workspace/switch-to 2)) From d3aa611f8503bc341c6bbeb702fc555db4f45003 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 13:15:33 +0100 Subject: [PATCH 3611/4235] bindings: app bindings (twitter, email, irc) --- modules/config/default/+emacs-bindings.el | 26 ++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 9a0c7d4b6..e4b3d101d 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -147,7 +147,31 @@ :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun - :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click))) + :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click)) + + ;; APPs + + ;; Email + (:when (featurep! :app email) + (:prefix ("M" . "email") + :desc "Open email app" "m" #'=email + :desc "Compose email" "c" #'+email/compose)) + ;; IRC + (:when (featurep! :app irc) + (:prefix ("I" . "irc") + :desc "Open irc app" "i" #'=irc + :desc "Quit irc" "q" #'+irc/quit + :desc "Reconnect all" "r" #'circle-reconnect-all + :desc "Send message" "s" #'+irc/send-message + (when (featurep! :completion ivy) + :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) + ;; Twitter + (:when (featurep! :app twitter) + (:prefix ("T" . "twitter") + :desc "Open twitter app" "t" #'=twitter + :desc "Quit twitter" "q" #'+twitter/quit + :desc "Rerender twits" "r" #'+twitter/rerender-all + :desc "Ace link" "l" #'+twitter/ace-link))) ;; Plugins From 40851db96bffb311c16ecc4cb5b68b4bdbd69a6d Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 13:16:29 +0100 Subject: [PATCH 3612/4235] bindings: neotree or treemacs with f9 --- modules/config/default/+emacs-bindings.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index e4b3d101d..087157588 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -176,7 +176,10 @@ ;; Plugins ;; misc plugins - "" #'+neotree/open + (:when (featurep! :ui neotree) + "" #'+neotree/open) + (:when (featurep! :ui treemacs) + "" #'+treemacs) "C-=" #'er/expand-region ;; smartparens (:after smartparens From e910e1279f11f665c0860c01721ed0855964d055 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 13:16:59 +0100 Subject: [PATCH 3613/4235] bindings: er/contract-region --- modules/config/default/+emacs-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 087157588..3c41c394e 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -181,6 +181,7 @@ (:when (featurep! :ui treemacs) "" #'+treemacs) "C-=" #'er/expand-region + "C--" #'er/contract-region ;; smartparens (:after smartparens (:map smartparens-mode-map From 6a557516797796c060892b42d4abcf949f2ee2ee Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 14:24:17 +0100 Subject: [PATCH 3614/4235] bindings: correctly detect if syntax-checker is on --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8836ef25c..858eeb0d6 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -204,7 +204,7 @@ "RET" #'flyspell-correct-word-generic [mouse-1] #'flyspell-correct-word-generic)) - (:when (featurep! :completion syntax-checker) + (:when (featurep! :feature syntax-checker) :m "]e" #'next-error :m "[e" #'previous-error (:after flycheck From 8dfe5476015c2d39649cb7afd18aca482f86480b Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 14:40:42 +0100 Subject: [PATCH 3615/4235] bindings: swiper and resume for ivy and helm --- modules/config/default/+emacs-bindings.el | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 3c41c394e..a1821edec 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -26,8 +26,13 @@ ;; Editor related bindings "C-a" #'doom/backward-to-bol-or-indent [remap newline] #'newline-and-indent - "C-j" #'+default/newline - "C-S-s" #'swiper + "C-j" #'+default/newline + (:when (featurep! :completion ivy) + "C-S-s" #'swiper + "C-S-r" #'ivy-resume) + (:when (featurep! :completion helm) + "C-S-s" #'swiper-helm + "C-S-r" #'helm-resume) ;; Buffer related bindings "C-x b" #'persp-switch-to-buffer "C-x C-b" #'ibuffer-list-buffers From 14317dcaa494b6c3c22a35d6cd40056fa4f09410 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Thu, 10 Jan 2019 16:36:32 +0100 Subject: [PATCH 3616/4235] bindings: quit menu --- modules/config/default/+emacs-bindings.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index a1821edec..ae33c4dac 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -84,6 +84,14 @@ :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf) :desc "Link store" "l" #'org-store-link) + ;; Quit/Restart + (:prefix ("q" . "quit/restart") + :desc "Quit Emacs" "q" #'kill-emacs + :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal + (:when (featurep! :feature workspaces) + :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit + :desc "Restart & restore Emacs" "r" #'+workspace/restart-emacs-then-restore) + :desc "Restart Emacs" "R" #'restart-emacs) ;; Snippets "&" nil ; yasnippet creates this prefix, we use a different one (:prefix ("s" . "snippets") From 31a0ad5b95b6de2285fd3099ba175ddd9d40a69d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 10 Jan 2019 15:44:42 -0500 Subject: [PATCH 3617/4235] Move doom--condition-case! to core/cli/packages The only place it is being used --- core/autoload/packages.el | 13 ------------- core/cli/packages.el | 13 +++++++++++++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 1afd7a85d..922f6e0c0 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -13,19 +13,6 @@ nil t) table)))) -(defmacro doom--condition-case! (&rest body) - `(condition-case-unless-debug e - (progn ,@body) - ('user-error - (print! (bold (red " NOTICE: %s")) e)) - ('file-error - (print! (bold (red " FILE ERROR: %s")) (error-message-string e)) - (print! " Trying again...") - (quiet! (doom-refresh-packages-maybe t)) - ,@body) - ('error - (print! (bold (red " FATAL ERROR: %s\n Run again with the -d flag for details")) e)))) - (defun doom--refresh-pkg-cache () "Clear the cache for `doom-refresh-packages-maybe'." (setq doom--refreshed-p nil) diff --git a/core/cli/packages.el b/core/cli/packages.el index be9592de4..2c1e630da 100644 --- a/core/cli/packages.el +++ b/core/cli/packages.el @@ -14,6 +14,19 @@ ;; ;; Helpers +(defmacro doom--condition-case! (&rest body) + `(condition-case-unless-debug e + (progn ,@body) + ('user-error + (print! (bold (red " NOTICE: %s")) e)) + ('file-error + (print! (bold (red " FILE ERROR: %s")) (error-message-string e)) + (print! " Trying again...") + (quiet! (doom-refresh-packages-maybe t)) + ,@body) + ('error + (print! (bold (red " FATAL ERROR: %s\n Run again with the -d flag for details")) e)))) + (defsubst doom--do (fn) (doom-reload-doom-autoloads) (when (funcall fn doom-auto-accept) From 4a56eb2b000c402133072fd5e8c9e7f039f1c358 Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Fri, 11 Jan 2019 08:48:20 +0100 Subject: [PATCH 3618/4235] bindings: incorrect :when keyword fix --- modules/config/default/+emacs-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index ae33c4dac..7fccbc568 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -176,7 +176,7 @@ :desc "Quit irc" "q" #'+irc/quit :desc "Reconnect all" "r" #'circle-reconnect-all :desc "Send message" "s" #'+irc/send-message - (when (featurep! :completion ivy) + (:when (featurep! :completion ivy) :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) ;; Twitter (:when (featurep! :app twitter) From 5287c480928077ce2ed760e7c59aa2494e2528b9 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Fri, 11 Jan 2019 15:00:24 +0200 Subject: [PATCH 3619/4235] Move Forge binding to config/default/+evil-bindings --- modules/config/default/+evil-bindings.el | 4 +++- modules/tools/magit/+evil-bindings.el | 4 ---- modules/tools/magit/config.el | 3 --- 3 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 modules/tools/magit/+evil-bindings.el diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index be17cf668..714960e82 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -624,7 +624,9 @@ :desc "Git stage file" "S" #'magit-stage-file :desc "Git unstage file" "U" #'magit-unstage-file :desc "Magit push popup" "p" #'magit-push-popup - :desc "Magit pull popup" "P" #'magit-pull-popup) + :desc "Magit pull popup" "P" #'magit-pull-popup + (:when (featurep! :tools magit +forge) + :desc "Forge dispatch" "F" #'forge-dispatch)) (:when (featurep! :tools gist) :desc "List gists" "G" #'+gist:list)) diff --git a/modules/tools/magit/+evil-bindings.el b/modules/tools/magit/+evil-bindings.el deleted file mode 100644 index bc5763023..000000000 --- a/modules/tools/magit/+evil-bindings.el +++ /dev/null @@ -1,4 +0,0 @@ -;;; tools/magit/+evil-bindings.el -*- lexical-binding: t; -*- - -(map! :leader - :desc "Forge" "gF" #'forge-dispatch) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index a5a7b068d..02eade6f3 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -105,6 +105,3 @@ what features are available.") (def-package! forge :when (featurep! :tools magit +forge) :after magit) - -(when (featurep! :feature evil) - (load! "+evil-bindings")) From 00ce44a733a27937d42aa514cbcff5af921b724e Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Fri, 11 Jan 2019 15:09:21 +0100 Subject: [PATCH 3620/4235] bindings: CUA bindings only in evil --- modules/config/default/+evil-bindings.el | 11 +++++++++++ modules/config/default/config.el | 10 ++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 9dcf34431..f6d8d8185 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -17,6 +17,17 @@ ;; Fix frame-switching key on MacOS (global-set-key (kbd "M-`") #'other-frame)) +;; +;; Minibuffer keybindings + +;; CUA keys in minibuffer +(define-key! :keymaps +default-minibuffer-maps + [escape] #'abort-recursive-edit + "C-v" #'yank + "C-z" (λ! (ignore-errors (call-interactively #'undo))) + "C-a" #'move-beginning-of-line + "C-b" #'backward-word) + ;; ;; Global keybindings diff --git a/modules/config/default/config.el b/modules/config/default/config.el index f5b21abf3..1717ae924 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -114,15 +114,9 @@ (define-key input-decode-map (kbd "TAB") [tab])) (add-hook 'tty-setup-hook #'+default|setup-input-decode-map) -;; Restore CUA keys in minibuffer +;; A Doom convention where C-s on popups and interactive searches will invoke +;; ivy/helm for their superior filtering. (define-key! :keymaps +default-minibuffer-maps - [escape] #'abort-recursive-edit - "C-v" #'yank - "C-z" (λ! (ignore-errors (call-interactively #'undo))) - "C-a" #'move-beginning-of-line - "C-b" #'backward-word - ;; A Doom convention where C-s on popups and interactive searches will invoke - ;; ivy/helm for their superior filtering. "C-s" (if (featurep! :completion ivy) #'counsel-minibuffer-history #'helm-minibuffer-history)) From 7ce8fe4c22d59ac12dce935a3980b4280e44eb0b Mon Sep 17 00:00:00 2001 From: Undead Kernel Date: Sat, 12 Jan 2019 11:04:12 +0100 Subject: [PATCH 3621/4235] bindings: fix typo (circle -> circe) --- modules/config/default/+emacs-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 7fccbc568..5886b3a91 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -174,7 +174,7 @@ (:prefix ("I" . "irc") :desc "Open irc app" "i" #'=irc :desc "Quit irc" "q" #'+irc/quit - :desc "Reconnect all" "r" #'circle-reconnect-all + :desc "Reconnect all" "r" #'circe-reconnect-all :desc "Send message" "s" #'+irc/send-message (:when (featurep! :completion ivy) :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) From 957aa9c63e38db985b6a6bc6a83e4784a55f6077 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 Jan 2019 00:49:58 -0500 Subject: [PATCH 3622/4235] lang/cc: make ffap aware of irony include paths --- modules/lang/cc/autoload.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index cadfe4153..7735b3c6a 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -145,9 +145,23 @@ compilation dbs." (unless (irony-cdb-autosetup-compile-options) (irony-cdb--update-compile-options (append (delq nil (cdr-safe (assq major-mode +cc-default-compiler-options))) + (list (locate-dominating-file (or buffer-file-name default-directory) + "include")) (cl-loop for path in +cc-default-include-paths nconc (list "-I" path))) - (doom-project-root))))) + (doom-project-root))) + ;; Make ffap aware of include paths + (when irony--working-directory + (require 'ffap) + (make-local-variable 'ffap-c-path) + (make-local-variable 'ffap-c++-path) + (cl-loop for opt in irony--compile-options + if (string-match "^-I\\(.+\\)" opt) + do (add-to-list (pcase major-mode + (`c-mode 'ffap-c-path) + (`c++-mode 'ffap-c++-path)) + (expand-file-name (match-string 1 opt) + irony--working-directory)))))) ;;;###autoload (defun +cc|cleanup-rtags () From d7f10cbcbd22bbac38157b11ca33e89fdfd5d641 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 Jan 2019 00:50:33 -0500 Subject: [PATCH 3623/4235] lang/cc: fix brace-list argument block indentation Should be fn({ ... }) Instead of fn({ ... }) --- 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 07b69cf87..d51450c2a 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -83,7 +83,6 @@ compilation database is present in the project.") (arglist-cont-nonempty)) (c-cleanup-list brace-else-brace) (c-offsets-alist - (statement-block-intro . +) (knr-argdecl-intro . 0) (substatement-open . 0) (substatement-label . 0) @@ -92,6 +91,8 @@ compilation database is present in the project.") ;; align args with open brace OR don't indent at all (if open ;; brace is at eolp and close brace is after arg with no trailing ;; comma) + (brace-list-intro . 0) + (brace-list-close . -) (arglist-intro . +) (arglist-close +cc-lineup-arglist-close 0) ;; don't over-indent lambda blocks From 500519fe00684ee61837b5d2d0131fd1152f32ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 Jan 2019 00:51:25 -0500 Subject: [PATCH 3624/4235] Increase flycheck delay in insert mode Otherwise it can interrupt your typing. --- modules/feature/syntax-checker/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index d05b5bb5e..8326c2d32 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -13,7 +13,10 @@ (when flycheck-mode (ignore-errors (flycheck-buffer)) nil)) - (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t)) + (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) + + (setq-hook! 'evil-insert-state-entry-hook flycheck-idle-change-delay 1.75) + (setq-hook! 'evil-insert-state-exit-hook flycheck-idle-change-delay 0.5)) (global-flycheck-mode +1)) From d80802d3c94f8d442657e79bf7805bf0bd556593 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 Jan 2019 00:52:31 -0500 Subject: [PATCH 3625/4235] doom/cleanup-session: don't kill processes by default --- core/autoload/buffers.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 324fcd6f4..46241d4ff 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -267,7 +267,7 @@ that belong to the current project." (unless project-p (delete-other-windows)) (switch-to-buffer (doom-fallback-buffer)) - (doom/cleanup-session (if project-p (doom-project-buffer-list)))) + (doom/cleanup-session nil (if project-p (doom-project-buffer-list)))) ;;;###autoload (defun doom/kill-other-buffers (&optional project-p) @@ -299,17 +299,18 @@ project." (message "Killed %s buffers" n)))) ;;;###autoload -(defun doom/cleanup-session (&optional buffer-list) +(defun doom/cleanup-session (arg &optional buffer-list) "Clean up buried buries and orphaned processes in the current workspace. If ALL-P (universal argument), clean them up globally." - (interactive) + (interactive "P") (let ((buffers (doom-buried-buffers buffer-list)) (n 0)) (dolist (buf buffers) (unless (buffer-modified-p buf) (kill-buffer buf) (cl-incf n))) - (setq n (+ n (doom/cleanup-buffer-processes))) + (when arg + (setq n (+ n (doom/cleanup-buffer-processes)))) (dolist (hook doom-cleanup-hook) (let ((m (funcall hook))) (when (integerp m) From b7de17aecd9c89302cf85b11f6bfb1b7096d90d8 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Mon, 14 Jan 2019 19:54:17 -0500 Subject: [PATCH 3626/4235] common-lisp module sly-db-quit fix The `q` binding for `sly-popup-buffer-mode-map` was overriding `sly-db-mode`'s binding, causing lots of issues. --- modules/lang/common-lisp/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 2bef0db59..3c4ae3f9b 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -228,8 +228,7 @@ bin/doom while packages at compile-time (not a runtime though)." (evil-define-key 'normal sly-mode-map (kbd "C-t") 'sly-pop-find-definition-stack) (evil-define-key 'normal sly-popup-buffer-mode-map - (kbd "C-t") 'sly-pop-find-definition-stack - "q" 'quit-window) + (kbd "C-t") 'sly-pop-find-definition-stack) (evil-define-key 'normal sly-xref-mode-map [return] 'sly-goto-xref (kbd "S-") 'sly-show-xref From ddc0c1fc21f95a4c17a78053f95cfd0f171e8a4b Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Mon, 14 Jan 2019 20:07:41 -0500 Subject: [PATCH 3627/4235] common-lisp module: Fix sly-db button binding --- modules/lang/common-lisp/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 2bef0db59..f65349015 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -154,7 +154,6 @@ bin/doom while packages at compile-time (not a runtime though)." (evil-define-key 'normal sly-db-mode-map [follow-link] 'mouse-face [mouse-2] 'sly-db-default-action/mouse - [return] 'sly-db-default-action (kbd "C-i") 'sly-db-cycle (kbd "C-j") 'sly-db-down (kbd "C-k") 'sly-db-up From a183fcddf59a1fa5b2a2bd3d903b481a15618b9c Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Mon, 14 Jan 2019 20:48:03 -0500 Subject: [PATCH 3628/4235] common-lisp module: Added keybind to quit sly-xref-mode windows --- modules/lang/common-lisp/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 2bef0db59..528288c38 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -242,6 +242,7 @@ bin/doom while packages at compile-time (not a runtime though)." "go" 'sly-show-xref "gr" 'sly-recompile-xref "gR" 'sly-recompile-all-xrefs + "q" 'quit-window "r" 'sly-xref-retract))) From aaee04e2570bfd329ee0f56bc7c2606396c39395 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 14 Jan 2019 21:24:52 -0500 Subject: [PATCH 3629/4235] Remove unused doom-leader prefix command --- core/core-keybinds.el | 1 - 1 file changed, 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 6cfe25317..1fa670ee1 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -54,7 +54,6 @@ If any hook returns non-nil, all hooks after it are ignored.") (defalias 'unmap! #'general-unbind) ;; leader/localleader keys -(define-prefix-command 'doom-leader 'doom-leader-map) (defvar doom-leader-alist `((t . ,doom-leader-map))) (add-to-list 'emulation-mode-map-alists 'doom-leader-alist) From 81e8fafa18dd32a6f3a1b1b5155da3bd9360f0b5 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Fri, 18 Jan 2019 19:40:09 +1100 Subject: [PATCH 3630/4235] Improve projectile-git-command When indexing it ignores hidden files, which is especially annoying for dotfiles where everything starts with a dot. If you just have -H it'll index .git too though, so we exclude that --- core/core-projects.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index d8b426867..3e2059379 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -59,7 +59,7 @@ ;; fd is a rust program that is significantly faster. It also respects ;; .gitignore. This is recommended in the projectile docs (when (executable-find "fd") - (setq projectile-git-command "fd . --type f -0" + (setq projectile-git-command "fd . --type f -0 -H -E .git" projectile-generic-command projectile-git-command))) From d68ecb763688efb417e1ca9b303b05d4d3e165af Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Mon, 21 Jan 2019 06:21:09 +1100 Subject: [PATCH 3631/4235] lang/haskell: fix dante completion --- modules/lang/haskell/+dante.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index b4af5d773..7ae27e319 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -17,6 +17,8 @@ (when (featurep! :feature syntax-checker) (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))) + (set-company-backend! 'dante-mode #'dante-company) + (when (featurep 'evil) (add-hook 'dante-mode-hook #'evil-normalize-keymaps)) (map! :map dante-mode-map From 7251b50b353b34698c53e5ad9a462646fa84d536 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 20 Jan 2019 14:22:45 -0500 Subject: [PATCH 3632/4235] Make bear-macos issue a sub-tree Since it is directly relevant to the project-compile-settings section. --- modules/lang/cc/README.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/cc/README.org b/modules/lang/cc/README.org index 4097e8e09..d08a988a7 100644 --- a/modules/lang/cc/README.org +++ b/modules/lang/cc/README.org @@ -14,7 +14,7 @@ - [[rtags][rtags]] - [[Configure][Configure]] - [[Project compile settings][Project compile settings]] - - [[Known issues with bear on macOS][Known issues with bear on macOS]] + - [[Known issues with bear on macOS][Known issues with bear on macOS]] * Description This module adds support for the C-family of languages: C, C++, and Objective-C. @@ -125,7 +125,8 @@ bear make Use ~M-x +cc/reload-compile-db~ to reload your compile db in an already-open C/C++/ObjC buffer. -** Known issues with bear on macOS + +*** Known issues with bear on macOS MacOS' [[https://support.apple.com/en-us/HT204899][System Integrity Protection (SIP)]] might interfere with bear if ~make~ is under ~/usr/bin/~ which results in an empty compilation database. @@ -161,6 +162,5 @@ bear gmake #+END_SRC Additional info: - + [[https://github.com/rizsotto/Bear/issues/158][Empty compilation database with compiler in /usr/local]] + [[https://github.com/rizsotto/Bear/issues/152][Workaround for 'Empty compilation database on OS X Captain]] From 4bc5fac0b211e94c6ebbcc352971f73b37bd6dfe Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Mon, 21 Jan 2019 11:01:52 +0100 Subject: [PATCH 3633/4235] bindings: Mimic MAC window changes withing emacs The binding applies for evil and non-evil users alike. --- modules/config/default/+evil-bindings.el | 5 ----- modules/config/default/config.el | 4 +++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index f6d8d8185..1ee8102c6 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -12,11 +12,6 @@ doom-leader-key doom-localleader-key doom-leader-alt-key doom-localleader-alt-key)) -;; OS specific fixes -(when IS-MAC - ;; Fix frame-switching key on MacOS - (global-set-key (kbd "M-`") #'other-frame)) - ;; ;; Minibuffer keybindings diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 1717ae924..428156a16 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -128,7 +128,9 @@ ;; OS specific fixes (when IS-MAC ;; Fix MacOS shift+tab - (define-key input-decode-map [S-iso-lefttab] [backtab])) + (define-key input-decode-map [S-iso-lefttab] [backtab]) + ;; Fix frame-switching key on MacOS + (global-set-key (kbd "M-`") #'other-frame)) ;; ;; Doom's keybinding scheme From cbd91a4d3ec13418eb2b23fd0787abb363e972ef Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Mon, 21 Jan 2019 11:15:39 +0100 Subject: [PATCH 3634/4235] bindings: standardize movement to the start or end --- modules/config/default/+evil-bindings.el | 6 ------ modules/config/default/config.el | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 1ee8102c6..1f2426bf2 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -53,12 +53,6 @@ ;; textmate-esque deletion [M-backspace] #'doom/backward-kill-to-bol-and-indent) -;; Smarter C-a/C-e for both Emacs and Evil. 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+trailing whitespace before jumping to eol. -(map! :gi "C-a" #'doom/backward-to-bol-or-indent - :gi "C-e" #'doom/forward-to-last-non-comment-or-eol) - (map! (:map override ;; A little sandbox to run code in "A-;" #'eval-expression diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 428156a16..7b9cb00b7 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -141,6 +141,12 @@ "M-x" #'execute-extended-command "A-x" #'execute-extended-command) + ;; Smarter C-a/C-e for both Emacs and Evil. 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+trailing whitespace before jumping to eol. + (map! :gi "C-a" #'doom/backward-to-bol-or-indent + :gi "C-e" #'doom/forward-to-last-non-comment-or-eol) + (if (featurep 'evil) (load! "+evil-bindings") (load! "+emacs-bindings"))) From 99e916348a8339adad5d0fa955937bd55ef8a738 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 03:44:21 -0500 Subject: [PATCH 3635/4235] lang/java: fix java namespace resolution #1098 Now uses slightly more sophisticated namespace resolution when populating the *.java file template. --- .../templates/java-mode/.yas-setup.el | 14 +++---- modules/lang/java/autoload.el | 39 +++++++++++++++++++ modules/lang/java/config.el | 21 ++++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/modules/feature/file-templates/templates/java-mode/.yas-setup.el b/modules/feature/file-templates/templates/java-mode/.yas-setup.el index f4143072e..b00feed7e 100644 --- a/modules/feature/file-templates/templates/java-mode/.yas-setup.el +++ b/modules/feature/file-templates/templates/java-mode/.yas-setup.el @@ -1,11 +1,9 @@ (defun yas-java-project-package () - (if (eq major-mode 'java-mode) - (s-chop-suffix "." (s-replace "/" "." (f-dirname (f-relative (buffer-file-name) - (concat (narf/project-root) "/src/"))))) - "")) + (or (and (eq major-mode 'java-mode) + (+java-current-package)) + "")) (defun yas-java-class-name () - (if (eq major-mode 'java-mode) - (f-no-ext (f-base (buffer-file-name))) - "")) - + (or (and (eq major-mode 'java-mode) + (+java-current-class)) + "")) diff --git a/modules/lang/java/autoload.el b/modules/lang/java/autoload.el index fa1689503..45c27aa1e 100644 --- a/modules/lang/java/autoload.el +++ b/modules/lang/java/autoload.el @@ -30,3 +30,42 @@ (android-mode +1) (doom/set-build-command "./gradlew %s" "build.gradle"))) +;;;###autoload +(defun +java-current-package () + "Converts the current file's path into a namespace. + +For example: ~/some/project/src/net/lissner/game/MyClass.java +Is converted to: net.lissner.game + +It does this by ignoring everything before the nearest package root (see +`+java-project-package-roots' to control what this function considers a package +root)." + (unless (eq major-mode 'java-mode) + (user-error "Not in a java-mode buffer")) + (let* ((project-root (file-truename (doom-project-root))) + (file-path (file-name-sans-extension + (file-truename (or buffer-file-name + default-directory)))) + (src-root (cl-loop for root in +java-project-package-roots + if (and (stringp root) + (locate-dominating-file file-path root)) + return (file-name-directory (file-relative-name file-path (expand-file-name root it))) + if (and (integerp root) + (> root 0) + (let* ((parts (split-string (file-relative-name file-path project-root) "/")) + (fixed-parts (reverse (nbutlast (reverse parts) root)))) + (when fixed-parts + (string-join fixed-parts "/")))) + return it))) + (when src-root + (string-remove-suffix "." (replace-regexp-in-string "/" "." src-root))))) + +;;;###autoload +(defun +java-current-class () + "Get the class name for the current file." + (unless (eq major-mode 'java-mode) + (user-error "Not in a java-mode buffer")) + (unless buffer-file-name + (user-error "This buffer has no filepath; cannot guess its class name")) + (or (file-name-sans-extension (file-name-base (buffer-file-name))) + "ClassName")) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 9e42b0b62..5e1e07d5b 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -1,5 +1,26 @@ ;;; lang/java/config.el -*- lexical-binding: t; -*- +(defvar +java-project-package-roots (list "java/" "test/" "main/" "src/" 1) + "A list of relative directories (strings) or depths (integer) used by +`+java-current-package' to delimit the namespace from the current buffer's full +file path. Each root is tried in sequence until one is found. + +If a directory is encountered in the file path, everything before it (including +it) will be ignored when converting the path into a namespace. + +An integer depth is how many directories to pop off the start of the relative +file path (relative to the project root). e.g. + +Say the absolute path is ~/some/project/src/java/net/lissner/game/MyClass.java +The project root is ~/some/project +If the depth is 1, the first directory in src/java/net/lissner/game/MyClass.java + is removed: java.net.lissner.game. +If the depth is 2, the first two directories are removed: net.lissner.game.") + + +;; +;; java-mode + (add-hook 'java-mode-hook #'rainbow-delimiters-mode) (cond ((featurep! +meghanada) (load! "+meghanada")) From efa577dec2a71f5d7fa791a1c5bf5858d425b1ab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 03:48:10 -0500 Subject: [PATCH 3636/4235] Improve error-handling in doom/update-package --- core/autoload/packages.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 922f6e0c0..ec93895bc 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -427,12 +427,15 @@ calls." (declare (interactive-only t)) (interactive (let* ((packages (doom-get-outdated-packages)) - (package (if packages - (completing-read "Update package: " - (mapcar #'car packages) - nil t) - (user-error "All packages are up to date")))) - (list (cdr (assq (car (assoc package package-alist)) packages))))) + (selection (if packages + (completing-read "Update package: " + (mapcar #'car packages) + nil t) + (user-error "All packages are up to date"))) + (name (car (assoc selection package-alist)))) + (unless name + (user-error "'%s' is already up-to-date" selection)) + (list (cdr (assq name packages))))) (doom-initialize-packages) (cl-destructuring-bind (package old-version new-version) pkg (if-let* ((desc (doom-package-outdated-p package))) From 096ca1e4ccfd877fde1211d89706f074953815ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 17:51:12 -0500 Subject: [PATCH 3637/4235] Remove redundant "C-a" keybind --- modules/config/default/+emacs-bindings.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 5886b3a91..ae95f1abb 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -24,7 +24,6 @@ "M-=" #'text-scale-increase "M--" #'text-scale-decrease ;; Editor related bindings - "C-a" #'doom/backward-to-bol-or-indent [remap newline] #'newline-and-indent "C-j" #'+default/newline (:when (featurep! :completion ivy) From 8e4635bdc86e32d6d7d1d158244fa3d826a245f4 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Tue, 22 Jan 2019 10:43:20 +1100 Subject: [PATCH 3638/4235] set nix-indent-function to #'nix-indent-line --- modules/lang/nix/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/nix/config.el b/modules/lang/nix/config.el index 805edff45..e4f5ee0c1 100644 --- a/modules/lang/nix/config.el +++ b/modules/lang/nix/config.el @@ -5,6 +5,8 @@ :config (set-company-backend! 'nix-mode 'company-nixos-options) + (setq nix-indent-function #'nix-indent-line) + (map! :localleader :map nix-mode-map "f" #'nix-update-fetch From 03f4a91c934afe9052d549a7a5ef757b2dc56add Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 21 Jan 2019 16:10:27 -0800 Subject: [PATCH 3639/4235] email: move some gmail specific settings to gmail.el --- modules/app/email/+gmail.el | 9 ++++++++- modules/app/email/config.el | 5 +++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/app/email/+gmail.el b/modules/app/email/+gmail.el index 3f44d8cd7..6dbbf924c 100644 --- a/modules/app/email/+gmail.el +++ b/modules/app/email/+gmail.el @@ -2,7 +2,14 @@ (after! mu4e ;; don't save message to Sent Messages, Gmail/IMAP takes care of this - (setq mu4e-sent-messages-behavior 'delete) + (setq mu4e-sent-messages-behavior 'delete + + ;; don't need to run cleanup after indexing for gmail + mu4e-index-cleanup nil + + ;; because gmail uses labels as folders we can use lazy check since + ;; messages don't really "move" + mu4e-index-lazy-check t) ;; In my workflow, emails won't be moved at all. Only their flags/labels are ;; changed. Se we redefine the trash and refile marks not to do any moving. diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 53f539f2c..f0b69ff4a 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -33,8 +33,6 @@ mu4e-compose-format-flowed t ; visual-line-mode + auto-fill upon sending mu4e-view-show-addresses t mu4e-sent-messages-behavior 'sent - mu4e-index-cleanup nil - mu4e-index-lazy-check t mu4e-hide-index-messages t ;; try to show images mu4e-view-show-images t @@ -62,6 +60,9 @@ (:from . 25) (:subject))) + ;; set mail user agent + (setq mail-user-agent 'mu4e-user-agent) + ;; Use fancy icons (setq mu4e-headers-has-child-prefix '("+" . "") mu4e-headers-empty-parent-prefix '("-" . "") From 8a0098ee52cdb7b790400e52fa0739f5da053793 Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 21 Jan 2019 17:12:59 -0800 Subject: [PATCH 3640/4235] irc: add +circe-buffer-p This allows us to list the circe buffers as real when they are added to the +irc--workspace-name. --- modules/app/irc/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index f72bb8abb..e83f8611b 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -117,6 +117,14 @@ playback.") '((text-properties . (face circe-fool-face lui-do-not-track t))))) (add-hook 'circe-message-option-functions #'+irc|circe-message-option-bot) + (defun +circe-buffer-p (buf) + "Return non-nil if BUF is a `circe-mode' buffer." + (with-current-buffer buf + (and (derived-mode-p 'circe-mode) + (eq (safe-persp-name (get-current-persp)) + +irc--workspace-name)))) + (add-hook 'doom-real-buffer-functions #'+circe-buffer-p) + (after! solaire-mode ;; distinguish chat/channel buffers from server buffers. (add-hook 'circe-chat-mode-hook #'solaire-mode)) From 7f205130af5134b8b830662fd0de20fb3b58abe5 Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 21 Jan 2019 17:13:52 -0800 Subject: [PATCH 3641/4235] irc: add +irc|add-circe-buffer-to-persp A convenience function that prevents a new circe buffer (e.g. a new message pop up) from being added automatically to whichever is current workspace and instead adds it to the irc workspace. --- modules/app/irc/config.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index e83f8611b..354977cab 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -125,6 +125,19 @@ playback.") +irc--workspace-name)))) (add-hook 'doom-real-buffer-functions #'+circe-buffer-p) + (defun +irc|add-circe-buffer-to-persp () + (let ((persp (get-current-persp)) + (buf (current-buffer))) + ;; only add a new circe buffer to the irc workspace when we're in another + ;; workspace + (unless (eq (safe-persp-name persp) +irc--workspace-name) + ;; add new circe buffers to the persp containing circe buffers + (persp-add-buffer buf + (persp-get-by-name +irc--workspace-name)) + ;; remove new buffer from accidental workspace + (persp-remove-buffer buf persp)))) + (add-hook 'circe-mode-hook #'+irc|add-circe-buffer-to-persp) + (after! solaire-mode ;; distinguish chat/channel buffers from server buffers. (add-hook 'circe-chat-mode-hook #'solaire-mode)) From ffc9e0f48e159be35d81d00739440616196aa6db Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 21 Jan 2019 17:17:24 -0800 Subject: [PATCH 3642/4235] irc: enable tracking last read message --- modules/app/irc/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 354977cab..53b68fedc 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -207,6 +207,9 @@ after prompt marker." (add-hook! 'lui-mode-hook (add-hook 'evil-insert-state-entry-hook #'+irc|evil-insert nil t)) + ;; enable a horizontal line marking the last read message + (add-hook 'lui-mode-hook #'enable-lui-track-bar) + (mapc (lambda (cmd) (push cmd +irc-scroll-to-bottom-on-commands)) '(evil-paste-after evil-paste-before evil-open-above evil-open-below))) From 274d9a6c0cad50b0263ff8ddefc3fd31f88c1cf6 Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 21 Jan 2019 17:20:22 -0800 Subject: [PATCH 3643/4235] irc: add +irc/tracking-next-buffer This way the user won't accidentally switch to the next unread buffer in the wrong workspacee and end up in a weird state. --- modules/app/irc/README.org | 18 +++++++++--------- modules/app/irc/config.el | 8 +++++++- modules/config/default/+emacs-bindings.el | 9 +++++---- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/modules/app/irc/README.org b/modules/app/irc/README.org index 7eb017008..d4cb00367 100644 --- a/modules/app/irc/README.org +++ b/modules/app/irc/README.org @@ -43,15 +43,15 @@ custom keybinding. When in a circe buffer these keybindings will be available. -| command | key | description | -|------------------------+-----------+----------------------------------------------| -| ~tracking-next-buffer~ | =SPC m a= | Switch to the next active buffer | -| ~circe-command-JOIN~ | =SPC m j= | Join a channel | -| ~+irc/send-message~ | =SPC m m= | Send a private message | -| ~circe-command-NAMES~ | =SPC m n= | List the names of the current channel | -| ~circe-command-PART~ | =SPC m p= | Part the current channel | -| ~+irc/quit~ | =SPC m Q= | Kill the current circe session and workgroup | -| ~circe-reconnect~ | =SPC m R= | Reconnect the current server | +| command | key | description | +|-----------------------------+-----------+----------------------------------------------| +| ~+irc/tracking-next-buffer~ | =SPC m a= | Switch to the next active buffer | +| ~circe-command-JOIN~ | =SPC m j= | Join a channel | +| ~+irc/send-message~ | =SPC m m= | Send a private message | +| ~circe-command-NAMES~ | =SPC m n= | List the names of the current channel | +| ~circe-command-PART~ | =SPC m p= | Part the current channel | +| ~+irc/quit~ | =SPC m Q= | Kill the current circe session and workgroup | +| ~circe-reconnect~ | =SPC m R= | Reconnect the current server | * Configuration Use ~set-irc-server!~ to configure IRC servers. Its second argument (a plist) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 53b68fedc..108faa9cc 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -138,13 +138,19 @@ playback.") (persp-remove-buffer buf persp)))) (add-hook 'circe-mode-hook #'+irc|add-circe-buffer-to-persp) + (defun +irc/tracking-next-buffer () + "Dissables switching to an unread buffer unless in the irc workspace." + (interactive) + (when (derived-mode-p 'circe-mode) + (tracking-next-buffer))) + (after! solaire-mode ;; distinguish chat/channel buffers from server buffers. (add-hook 'circe-chat-mode-hook #'solaire-mode)) (map! :localleader (:map circe-mode-map - "a" #'tracking-next-buffer + "a" #'+irc/tracking-next-buffer "j" #'circe-command-JOIN "m" #'+irc/send-message "p" #'circe-command-PART diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 5886b3a91..eecc03708 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -172,10 +172,11 @@ ;; IRC (:when (featurep! :app irc) (:prefix ("I" . "irc") - :desc "Open irc app" "i" #'=irc - :desc "Quit irc" "q" #'+irc/quit - :desc "Reconnect all" "r" #'circe-reconnect-all - :desc "Send message" "s" #'+irc/send-message + :desc "Open irc app" "i" #'=irc + :desc "Next unread buffer" "a" #'+irc/tracking-next-buffer + :desc "Quit irc" "q" #'+irc/quit + :desc "Reconnect all" "r" #'circe-reconnect-all + :desc "Send message" "s" #'+irc/send-message (:when (featurep! :completion ivy) :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) ;; Twitter From 17c17594574d45575c29d7bc5c66ff56829ad6e0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 21:18:49 -0500 Subject: [PATCH 3644/4235] Revise smartparens doc comments --- modules/config/default/config.el | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 7b9cb00b7..7f6c9a765 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -28,13 +28,13 @@ (when (featurep! +smartparens) - ;; disable :unless predicates with (sp-pair "'" nil :unless nil) - ;; disable :post-handlers with (sp-pair "{" nil :post-handlers nil) - ;; ...or specific :post-handlers with (sp-pair "{" nil :post-handlers '(:rem - ;; ("| " "SPC"))) + ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) + ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) + ;; or specific :post-handlers with: + ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) (after! smartparens ;; Autopair quotes more conservatively; if I'm next to a word/before another - ;; quote, I likely don't want another pair. + ;; quote, I likely don't want to open a new pair. (let ((unless-list '(sp-point-before-word-p sp-point-after-word-p sp-point-before-same-p))) @@ -60,11 +60,13 @@ (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) "[" nil :post-handlers '(:rem ("| " "SPC"))) - ;; Reasonable default pairs for comments + ;; Reasonable default pairs for HTML-style comments (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) "" :actions '(insert) :post-handlers '(("| " "SPC"))) - ;; Expand C-style doc comment blocks + ;; Expand C-style doc comment blocks. Must be done manually because some of + ;; these languages use specialized (and deferred) parsers, whose state we + ;; can't access while smartparens is doing its thing. (defun +default-expand-doc-comment-block (&rest _ignored) (let ((indent (current-indentation))) (newline-and-indent) @@ -94,7 +96,7 @@ ;; f) do none of this when inside a string (advice-add #'delete-backward-char :override #'doom/delete-backward-char) - ;; Makes `newline-and-indent' smarter when dealing with comments + ;; Makes `newline-and-indent' continue comments (and more reliably) (advice-add #'newline-and-indent :around #'doom*newline-indent-and-continue-comments))) From 3694b0d4111554244c0bed7d786d6d4d6035f8a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:07:31 -0500 Subject: [PATCH 3645/4235] Standardize M-RET/M-S-RET as an "add new item" key --- modules/config/default/autoload/default.el | 19 +++++++++++++++++++ modules/config/default/config.el | 6 +++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 9d9bbd56f..c84a295fa 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -91,3 +91,22 @@ If ARG (universal argument), runs `compile' from the current directory." (interactive) (cond ((featurep! :completion ivy) (+ivy/tasks) (featurep! :completion helm) (+helm/tasks)))) + +;;;###autoload +(defun +default/newline-above () + "Insert an indented new line before the current one." + (interactive) + (if (featurep 'evil) + (call-interactively 'evil-open-above) + (beginning-of-line) + (save-excursion (newline)) + (indent-according-to-mode))) + +;;;###autoload +(defun +default/newline-below () + "Insert an indented new line after the current one." + (interactive) + (if (featurep 'evil) + (call-interactively 'evil-open-below) + (end-of-line) + (newline-and-indent))) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 7f6c9a765..df3fb9c8b 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -147,7 +147,11 @@ ;; Pressing it again will send you to the true bol. Same goes for C-e, except ;; it will ignore comments+trailing whitespace before jumping to eol. (map! :gi "C-a" #'doom/backward-to-bol-or-indent - :gi "C-e" #'doom/forward-to-last-non-comment-or-eol) + :gi "C-e" #'doom/forward-to-last-non-comment-or-eol + ;; Standardize the behavior of M-RET/M-S-RET as a "add new item + ;; below/above" key. + :gi [M-return] #'+default/newline-below + :gi [M-S-return] #'+default/newline-above) (if (featurep 'evil) (load! "+evil-bindings") From 139ef469563afa19a1931232c514c1ee56f8253a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:07:53 -0500 Subject: [PATCH 3646/4235] Also bind s-x to execute-extended-command Makes M-x harder to miss (in the case where you use multiple computers with different modifier layouts on their keyboards). --- modules/config/default/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index df3fb9c8b..1ca56b1b5 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -138,10 +138,11 @@ ;; Doom's keybinding scheme (when (featurep! +bindings) - ;; Make M-x more accessible + ;; Make M-x harder to miss (define-key! 'override - "M-x" #'execute-extended-command - "A-x" #'execute-extended-command) + "M-x" #'execute-extended-command + "A-x" #'execute-extended-command + "s-x" #'execute-extended-command) ;; Smarter C-a/C-e for both Emacs and Evil. C-a will jump to indentation. ;; Pressing it again will send you to the true bol. Same goes for C-e, except From 1f523dfdd6a0de3b82fcce4ab7a3df14d3ae6ef9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:09:02 -0500 Subject: [PATCH 3647/4235] Replace global meta keybinds w/ super fixes on Mac These super keybinds are exclusively to repair conventional behavior for CMD OS keys. --- modules/config/default/+evil-bindings.el | 27 ------------------------ modules/config/default/config.el | 26 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index bd6ff4059..8bfbb26f2 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -26,33 +26,6 @@ ;; ;; Global keybindings -(define-key! - ;; Buffer-local font scaling - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease - ;; Simple window/frame navigation/manipulation - "M-w" #'delete-window - "M-W" #'delete-frame - "M-n" #'+default/new-buffer - "M-N" #'make-frame - ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because - ;; it imposes some other functionality and overhead we don't need) - "M-z" #'undo - "M-s" #'save-buffer - "M-c" (if (featurep 'evil) 'evil-yank 'copy-region-as-kill) - "M-v" #'yank - ;; Textmate-esque bindings - "M-a" #'mark-whole-buffer - "M-b" #'+default/compile - "M-f" #'swiper - "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) - ;; textmate-esque newline insertion - [M-return] #'evil-open-below - [M-S-return] #'evil-open-above - ;; textmate-esque deletion - [M-backspace] #'doom/backward-kill-to-bol-and-indent) - (map! (:map override ;; A little sandbox to run code in "A-;" #'eval-expression diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 1ca56b1b5..cab5e16d9 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -131,8 +131,30 @@ (when IS-MAC ;; Fix MacOS shift+tab (define-key input-decode-map [S-iso-lefttab] [backtab]) - ;; Fix frame-switching key on MacOS - (global-set-key (kbd "M-`") #'other-frame)) + ;; Fix conventional OS keys in Emacs + (map! "s-`" #'other-frame ; fix frame-switching + ;; fix OS window/frame navigation/manipulation keys + "s-w" #'delete-window + "s-W" #'delete-frame + "s-n" #'+default/new-buffer + "s-N" #'make-frame + "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) + ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because + ;; it imposes some other functionality and overhead we don't need) + "s-z" #'undo + "s-c" (if (featurep 'evil) #'evil-yank #'copy-region-as-kill) + "s-v" #'yank + "s-s" #'save-buffer + ;; Buffer-local font scaling + "s-+" (λ! (text-scale-set 0)) + "s-=" #'text-scale-increase + "s--" #'text-scale-decrease + ;; Conventional text-editing keys + "s-a" #'mark-whole-buffer + :gi [s-return] #'+default/newline-below + :gi [s-S-return] #'+default/newline-above + :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent)) + ;; ;; Doom's keybinding scheme From aa13c9a4d31dfe102e61057012b10bb07821f265 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:09:49 -0500 Subject: [PATCH 3648/4235] Group CUA minibuffer keys --- modules/config/default/+evil-bindings.el | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8bfbb26f2..92ff1321d 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -12,16 +12,6 @@ doom-leader-key doom-localleader-key doom-leader-alt-key doom-localleader-alt-key)) -;; -;; Minibuffer keybindings - -;; CUA keys in minibuffer -(define-key! :keymaps +default-minibuffer-maps - [escape] #'abort-recursive-edit - "C-v" #'yank - "C-z" (λ! (ignore-errors (call-interactively #'undo))) - "C-a" #'move-beginning-of-line - "C-b" #'backward-word) ;; ;; Global keybindings @@ -838,6 +828,11 @@ customized by changing `+default-repeat-forward-key' and #'helm-minibuffer-history)) (define-key! :keymaps +default-minibuffer-maps + [escape] #'abort-recursive-edit + "C-v" #'yank + "C-z" (λ! (ignore-errors (call-interactively #'undo))) + "C-a" #'move-beginning-of-line + "C-b" #'backward-word "C-r" #'evil-paste-from-register ;; Scrolling lines "C-j" #'next-line From ebf9e6c7e813bb60e8ab5d6f7c961e1c8036dd2f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:10:07 -0500 Subject: [PATCH 3649/4235] SPC ; => eval-expression --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 92ff1321d..a59fbf406 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -467,7 +467,7 @@ ;; (map! :leader - :desc "Ex Command" ";" #'evil-ex + :desc "Eval expression" ";" #'eval-expression :desc "M-x" ":" #'execute-extended-command :desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer :desc "Org Capture" "X" #'org-capture From 89311f567ebfd0f13e0d870c0b586a5a7b9addcd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:10:18 -0500 Subject: [PATCH 3650/4235] Add docstring to +default-repeat-keys And switch order of M-;/A-; to match sort order for M-x/A-x/s-; binds in config.el. --- modules/config/default/+evil-bindings.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index a59fbf406..1f320f49a 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -18,8 +18,8 @@ (map! (:map override ;; A little sandbox to run code in - "A-;" #'eval-expression - "M-;" #'eval-expression) + "M-;" #'eval-expression + "A-;" #'eval-expression) [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag @@ -764,7 +764,10 @@ ;; Universal motion repeating keys (defvar +default-repeat-keys (cons ";" ",") - "TODO") + "The keys to use for repeating motions. + +This is a cons cell whose CAR is the key for repeating a motion forward, and +whose CDR is for repeating backward. They should both be kbd-able strings.") (when +default-repeat-keys (defmacro do-repeat! (command next-func prev-func) From b6718715fedb42e35b3f785bd5240f1753654a6c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:13:39 -0500 Subject: [PATCH 3651/4235] Fix doom-big-font-mode when no frame exists It must still be appended to emacs-startup-hook. If it's run any earlier, doom|init-fonts will overwrite it. Reported by @ar1a. --- core/autoload/ui.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 2b6ee3f52..28ac10180 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -180,7 +180,12 @@ Uses `doom-big-font' when enabled." (user-error "`doom-big-font' must be set to a valid font")) (unless doom-font (user-error "`doom-font' must be set to a valid font")) - (set-frame-font (if doom-big-font-mode - doom-big-font - doom-font) - t t)) + (let ((doom-font (if doom-big-font-mode + doom-big-font + doom-font))) + (setf (alist-get 'font default-frame-alist) + (cond ((null doom-font)) + ((stringp doom-font) doom-font) + ((fontp doom-font) (font-xlfd-name doom-font)) + ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))) + (set-frame-font doom-font t t))) From 786d90a85fe5b8a5931af80f57cc8e6dee9c5041 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:18:38 -0500 Subject: [PATCH 3652/4235] Revert flycheck-idle-change-delay delay to default ...when exiting insert mode. --- modules/feature/syntax-checker/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/feature/syntax-checker/config.el b/modules/feature/syntax-checker/config.el index 8326c2d32..56714c1bd 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/feature/syntax-checker/config.el @@ -15,8 +15,10 @@ nil)) (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) - (setq-hook! 'evil-insert-state-entry-hook flycheck-idle-change-delay 1.75) - (setq-hook! 'evil-insert-state-exit-hook flycheck-idle-change-delay 0.5)) + (setq-hook! 'evil-insert-state-entry-hook + flycheck-idle-change-delay 1.75) + (setq-hook! 'evil-insert-state-exit-hook + flycheck-idle-change-delay (default-value 'flycheck-idle-change-delay))) (global-flycheck-mode +1)) From bd8f33df525206e5edddca0b07919d0ed5b3ba04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:27:03 -0500 Subject: [PATCH 3653/4235] tools/magit: :when+not => :unless Minor refactor --- modules/tools/magit/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 02eade6f3..fb88b1014 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -58,7 +58,7 @@ what features are available.") (def-package! magithub :after magit - :when (not (featurep! :tools magit +forge)) + :unless (featurep! :tools magit +forge) :preface ;; Magithub is not well-behaved, so this needs to be set early (setq magithub-dir (concat doom-etc-dir "magithub/")) From 24b4d24d18d7f1e61f40be73484244e763141795 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 21 Jan 2019 22:35:49 -0500 Subject: [PATCH 3654/4235] Fix #1127: errant entry in org-structure-template-alist Caused an error when org-insert-structure-template is called in org-mode. --- modules/lang/org/+present.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index 6c99391d4..ae054aa1d 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -11,6 +11,10 @@ (def-package! ox-reveal :defer t + :init + ;; Fix #1127, where ox-reveal adds an errant entry to + ;; `org-structure-template-alist' + (setq org-reveal-note-key-char nil) :config (setq org-reveal-root "https://cdn.jsdelivr.net/npm/reveal.js@3/" org-reveal-mathjax t)) From a32c5f78690cb00262d5f05b40bba33935dbf66e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 04:10:57 -0500 Subject: [PATCH 3655/4235] Move macos super key fixes to meta And add Option motion keybinds. --- modules/config/default/config.el | 41 ++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index cab5e16d9..83507b5f4 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -132,28 +132,33 @@ ;; Fix MacOS shift+tab (define-key input-decode-map [S-iso-lefttab] [backtab]) ;; Fix conventional OS keys in Emacs - (map! "s-`" #'other-frame ; fix frame-switching + (map! "M-`" #'other-frame ; fix frame-switching ;; fix OS window/frame navigation/manipulation keys - "s-w" #'delete-window - "s-W" #'delete-frame - "s-n" #'+default/new-buffer - "s-N" #'make-frame - "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) + "M-w" #'delete-window + "M-W" #'delete-frame + "M-n" #'+default/new-buffer + "M-N" #'make-frame + "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because ;; it imposes some other functionality and overhead we don't need) - "s-z" #'undo - "s-c" (if (featurep 'evil) #'evil-yank #'copy-region-as-kill) - "s-v" #'yank - "s-s" #'save-buffer + "M-z" #'undo + "M-c" (if (featurep 'evil) #'evil-yank #'copy-region-as-kill) + "M-v" #'yank + "M-s" #'save-buffer ;; Buffer-local font scaling - "s-+" (λ! (text-scale-set 0)) - "s-=" #'text-scale-increase - "s--" #'text-scale-decrease - ;; Conventional text-editing keys - "s-a" #'mark-whole-buffer - :gi [s-return] #'+default/newline-below - :gi [s-S-return] #'+default/newline-above - :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent)) + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease + ;; Conventional text-editing keys & motions + "M-a" #'mark-whole-buffer + :gi [M-return] #'+default/newline-below + :gi [M-S-return] #'+default/newline-above + :gi [M-backspace] #'doom/backward-kill-to-bol-and-indent + :gi [M-left] #'doom/backward-to-bol-or-indent + :gi [M-right] #'doom/forward-to-last-non-comment-or-eol + :gi [A-backspace] #'backward-kill-word + :gi [A-left] #'backward-word + :gi [A-right] #'forward-word)) ;; From fe44a3c435c7df52488e72aa131ce1b71372304f Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Tue, 22 Jan 2019 13:56:34 -0800 Subject: [PATCH 3656/4235] irc: remap tracking-next-buffer to +irc/tracking-next-buffer This prevents default keybindings from using `tracking-next-buffer' so that a user doesn't accidentally end up in a weird mixed workspace. --- modules/app/irc/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 108faa9cc..0edb517ab 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -143,6 +143,7 @@ playback.") (interactive) (when (derived-mode-p 'circe-mode) (tracking-next-buffer))) + (global-set-key [remap tracking-next-buffer] #'+irc/tracking-next-buffer) (after! solaire-mode ;; distinguish chat/channel buffers from server buffers. From 4b129cb17d0e13202dedbdd06c830ad05cf21509 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 14:56:38 -0500 Subject: [PATCH 3657/4235] Fix rg/ag in eshell #1122 Arguments aren't implicitly passed to aliases. --- modules/emacs/eshell/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 7d1691dcd..7612d941b 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -22,8 +22,8 @@ buffer.") '(("q" "exit") ; built-in ("f" "find-file $1") ("bd" "eshell-up $1") ; `eshell-up' - ("rg" "rg --color=always") - ("ag" "ag --color=always") + ("rg" "rg --color=always $*") + ("ag" "ag --color=always $*") ("l" "ls -lh") ("ll" "ls -lah") ("clear" "clear-scrollback")) ; more sensible than default From f45073880b540c96878330eca27187282236ccfb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 16:22:07 -0500 Subject: [PATCH 3658/4235] Use new company-box-show-single-candidate option And remove old hack since sebastiencs/company-box#40 was merged. --- modules/completion/company/config.el | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 99d2704f3..c8415601c 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -57,7 +57,8 @@ :when (and EMACS26+ (featurep! +childframe)) :hook (company-mode . company-box-mode) :config - (setq company-box-backends-colors nil + (setq company-box-show-single-candidate t + company-box-backends-colors nil company-box-max-candidates 50 company-box-icons-yasnippet (all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-green) company-box-icons-unknown (all-the-icons-material "find_in_page" :height 0.8 :face 'all-the-icons-purple) @@ -91,18 +92,7 @@ (22 . ,(all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) ; struct (23 . ,(all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) ; event (24 . ,(all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) ; operator - (25 . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)))) - - ;; Until sebastiencs/company-box#40 is merged - (defun +company*box-frontend-even-if-single (command) - (cond ((or (eq command 'hide) - (equal company-candidates-length 0)) - (company-box-hide)) - ((eq command 'update) - (company-box-show)) - ((eq command 'post-command) - (company-box--post-command)))) - (advice-add #'company-box-frontend :override #'+company*box-frontend-even-if-single)) + (25 . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red))))) (def-package! company-dict From f264a9bc6ef6c0cce813d736617bea6521bd3d47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 18:03:22 -0500 Subject: [PATCH 3659/4235] Back to command = super, option = meta on MacOS On MacOS, command used to be 'meta, which Emacs (and many packages) use for many keybinds. I don't want to pollute the command key, so it is now meta (as is the Emacs default). The MacOS keybind fixes have been moved back to super. --- core/core-os.el | 4 +-- modules/config/default/+evil-bindings.el | 3 +- modules/config/default/config.el | 44 ++++++++++++------------ 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index cdaced36c..a7fd04298 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -15,8 +15,8 @@ "Inject VARS from your shell environment into Emacs.") (cond (IS-MAC - (setq mac-command-modifier 'meta - mac-option-modifier 'alt + (setq mac-command-modifier 'super + mac-option-modifier 'meta ;; sane trackpad/mouse scroll settings mac-redisplay-dont-reset-vscroll t mac-mouse-wheel-smooth-scroll nil diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 1f320f49a..de2ccf508 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -19,7 +19,8 @@ (map! (:map override ;; A little sandbox to run code in "M-;" #'eval-expression - "A-;" #'eval-expression) + "A-;" #'eval-expression + (:when IS-MAC "s-;" #'eval-expression)) [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 83507b5f4..08415884c 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -132,33 +132,33 @@ ;; Fix MacOS shift+tab (define-key input-decode-map [S-iso-lefttab] [backtab]) ;; Fix conventional OS keys in Emacs - (map! "M-`" #'other-frame ; fix frame-switching + (map! "s-`" #'other-frame ; fix frame-switching ;; fix OS window/frame navigation/manipulation keys - "M-w" #'delete-window - "M-W" #'delete-frame - "M-n" #'+default/new-buffer - "M-N" #'make-frame - "M-q" (if (daemonp) #'delete-frame #'evil-quit-all) + "s-w" #'delete-window + "s-W" #'delete-frame + "s-n" #'+default/new-buffer + "s-N" #'make-frame + "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because ;; it imposes some other functionality and overhead we don't need) - "M-z" #'undo - "M-c" (if (featurep 'evil) #'evil-yank #'copy-region-as-kill) - "M-v" #'yank - "M-s" #'save-buffer + "s-z" #'undo + "s-c" (if (featurep 'evil) #'evil-yank #'copy-region-as-kill) + "s-v" #'yank + "s-s" #'save-buffer ;; Buffer-local font scaling - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease + "s-+" (λ! (text-scale-set 0)) + "s-=" #'text-scale-increase + "s--" #'text-scale-decrease ;; Conventional text-editing keys & motions - "M-a" #'mark-whole-buffer - :gi [M-return] #'+default/newline-below - :gi [M-S-return] #'+default/newline-above - :gi [M-backspace] #'doom/backward-kill-to-bol-and-indent - :gi [M-left] #'doom/backward-to-bol-or-indent - :gi [M-right] #'doom/forward-to-last-non-comment-or-eol - :gi [A-backspace] #'backward-kill-word - :gi [A-left] #'backward-word - :gi [A-right] #'forward-word)) + "s-a" #'mark-whole-buffer + :gi [s-return] #'+default/newline-below + :gi [s-S-return] #'+default/newline-above + :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent + :gi [s-left] #'doom/backward-to-bol-or-indent + :gi [s-right] #'doom/forward-to-last-non-comment-or-eol + :gi [M-backspace] #'backward-kill-word + :gi [M-left] #'backward-word + :gi [M-right] #'forward-word)) ;; From 082bdfe865ed37fa847fac071f4a7f2bbfaba5f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 18:50:38 -0500 Subject: [PATCH 3660/4235] Add C-RET/C-S-RET aliases for M-RET/M-S-RET --- modules/config/default/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 08415884c..d79334a9e 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -179,7 +179,9 @@ ;; Standardize the behavior of M-RET/M-S-RET as a "add new item ;; below/above" key. :gi [M-return] #'+default/newline-below - :gi [M-S-return] #'+default/newline-above) + :gi [M-S-return] #'+default/newline-above + :gi [C-return] #'+default/newline-below + :gi [C-S-return] #'+default/newline-above) (if (featurep 'evil) (load! "+evil-bindings") From a337c1bd4ea39c6d1c87488e01bf7c1b4091ea65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 18:51:45 -0500 Subject: [PATCH 3661/4235] lang/org: generalize newline keys To make them available to both emacs/evil users. --- modules/lang/org/config.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 1bfaecb67..dc8b54d3d 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -318,11 +318,16 @@ between the two." (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) (add-hook 'doom-delete-backward-functions #'+org|delete-backward-char-and-realign-table-maybe) - (define-key! org-mode-map - (kbd "C-c C-S-l") #'+org/remove-link - (kbd "C-c C-i") #'org-toggle-inline-images - [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line - [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) + (map! :map org-mode-map + ;; textmate-esque newline insertion + :gi [C-return] (λ! (+org/insert-item 'below)) + :gi [C-S-return] (λ! (+org/insert-item 'above)) + :gi [M-return] (λ! (+org/insert-item 'below)) + :gi [M-S-return] (λ! (+org/insert-item 'above)) + "C-c C-S-l" #'+org/remove-link + "C-c C-i" #'org-toggle-inline-images + [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line + [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) (defun +org|setup-evil (&rest args) ;; In case this hook is used in an advice on `evil-org-set-key-theme', this @@ -364,11 +369,6 @@ between the two." ;; more intuitive RET keybinds :i [return] #'org-return-indent :n [return] #'+org/dwim-at-point - ;; textmate-esque newline insertion - :nvi [C-return] (λ! (+org/insert-item 'below)) - :nvi [C-S-return] (λ! (+org/insert-item 'above)) - :nvi [M-return] (λ! (+org/insert-item 'below)) - :nvi [M-S-return] (λ! (+org/insert-item 'above)) ;; more vim-esque org motion keys (not covered by evil-org-mode) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) From 36a97b28aab2725bc12ce5865e97de09a4460964 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 22 Jan 2019 19:28:10 -0500 Subject: [PATCH 3662/4235] Fix flickering PDFs in pdf-view-mode #1107 --- modules/tools/pdf/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index f178f7bd2..681cb29f2 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -36,4 +36,5 @@ ;; The next rules are not needed, they are defined in modules/ui/popups/+hacks.el ;; (set-popup-rule! "\\*Contents\\*" :side 'right :size 40) ;; (set-popup-rule! "* annots\\*$" :side 'left :size 40 :select nil) - ) + ;; Fix #1107: flickering pdfs when evil-mode is enabled + (setq-hook! 'pdf-view-mode-hook evil-normal-state-cursor (list nil))) From fa5bebc13a45faf865cc1cf7298f916dde09601a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 23 Jan 2019 14:41:44 -0500 Subject: [PATCH 3663/4235] tools/magit: fix ivy's sorting with magit #1131 By default, magit-completing-read-function is set to magit-builtin-completing-read, which already includes ivy support. --- modules/tools/magit/config.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 97af76ff2..c6ce4e960 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -19,11 +19,7 @@ what features are available.") :init (setq magit-auto-revert-mode nil) ; we already use `global-auto-revert-mode' :config - (setq magit-completing-read-function - (if (featurep! :completion ivy) - #'ivy-completing-read - #'magit-builtin-completing-read) - magit-revision-show-gravatars '("^Author: " . "^Commit: ") + (setq magit-revision-show-gravatars '("^Author: " . "^Commit: ") magit-diff-refine-hunk t ; show word-granularity on selected hunk magit-display-buffer-function #'+magit-display-buffer magit-popup-display-buffer-action '((+magit-display-popup-buffer))) From 5c1edde613b14c114bbc2ccb42ef0686c7b40972 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 23 Jan 2019 15:54:12 -0500 Subject: [PATCH 3664/4235] app/irc: general refactor --- modules/app/irc/autoload/irc.el | 7 ++++ modules/app/irc/config.el | 39 ++++++++--------------- modules/config/default/+emacs-bindings.el | 2 +- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/modules/app/irc/autoload/irc.el b/modules/app/irc/autoload/irc.el index a630fb61d..47d0f95f5 100644 --- a/modules/app/irc/autoload/irc.el +++ b/modules/app/irc/autoload/irc.el @@ -84,3 +84,10 @@ argument) is non-nil only show channels in current server." (defun +irc--ivy-switch-to-buffer-action (buffer) (when (stringp buffer) (ivy--switch-buffer-action (string-trim-left buffer)))) + +;;;###autoload +(defun +irc/tracking-next-buffer () + "Dissables switching to an unread buffer unless in the irc workspace." + (interactive) + (when (derived-mode-p 'circe-mode) + (tracking-next-buffer))) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 0edb517ab..a89f6163c 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -96,9 +96,6 @@ playback.") (run-hooks '+irc-disconnect-hook)) (advice-add 'circe--irc-conn-disconnected :after #'+irc*circe-disconnect-hook) - ;; Let `+irc/quit' and `circe' handle buffer cleanup - (define-key circe-mode-map [remap kill-buffer] #'bury-buffer) - (defun +irc*circe-truncate-nicks () "Truncate long nicknames in chat output non-destructively." (when-let* ((beg (text-property-any (point-min) (point-max) 'lui-format-argument 'nick))) @@ -111,12 +108,6 @@ playback.") +irc-truncate-nick-char))))) (add-hook 'lui-pre-output-hook #'+irc*circe-truncate-nicks) - (defun +irc|circe-message-option-bot (nick &rest ignored) - "Fontify known bots and mark them to not be tracked." - (when (member nick +irc-bot-list) - '((text-properties . (face circe-fool-face lui-do-not-track t))))) - (add-hook 'circe-message-option-functions #'+irc|circe-message-option-bot) - (defun +circe-buffer-p (buf) "Return non-nil if BUF is a `circe-mode' buffer." (with-current-buffer buf @@ -125,33 +116,31 @@ playback.") +irc--workspace-name)))) (add-hook 'doom-real-buffer-functions #'+circe-buffer-p) + (defun +irc|circe-message-option-bot (nick &rest ignored) + "Fontify known bots and mark them to not be tracked." + (when (member nick +irc-bot-list) + '((text-properties . (face circe-fool-face lui-do-not-track t))))) + (add-hook 'circe-message-option-functions #'+irc|circe-message-option-bot) + (defun +irc|add-circe-buffer-to-persp () (let ((persp (get-current-persp)) (buf (current-buffer))) - ;; only add a new circe buffer to the irc workspace when we're in another - ;; workspace + ;; Add a new circe buffer to irc workspace when we're in another workspace (unless (eq (safe-persp-name persp) +irc--workspace-name) - ;; add new circe buffers to the persp containing circe buffers - (persp-add-buffer buf - (persp-get-by-name +irc--workspace-name)) - ;; remove new buffer from accidental workspace + ;; Add new circe buffers to the persp containing circe buffers + (persp-add-buffer buf (persp-get-by-name +irc--workspace-name)) + ;; Remove new buffer from accidental workspace (persp-remove-buffer buf persp)))) (add-hook 'circe-mode-hook #'+irc|add-circe-buffer-to-persp) - (defun +irc/tracking-next-buffer () - "Dissables switching to an unread buffer unless in the irc workspace." - (interactive) - (when (derived-mode-p 'circe-mode) - (tracking-next-buffer))) + ;; Let `+irc/quit' and `circe' handle buffer cleanup + (define-key circe-mode-map [remap kill-buffer] #'bury-buffer) + ;; Fail gracefully if not in a circe buffer (global-set-key [remap tracking-next-buffer] #'+irc/tracking-next-buffer) - (after! solaire-mode - ;; distinguish chat/channel buffers from server buffers. - (add-hook 'circe-chat-mode-hook #'solaire-mode)) - (map! :localleader (:map circe-mode-map - "a" #'+irc/tracking-next-buffer + "a" #'tracking-next-buffer "j" #'circe-command-JOIN "m" #'+irc/send-message "p" #'circe-command-PART diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 0edd2786e..3dcc0b2a7 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -172,7 +172,7 @@ (:when (featurep! :app irc) (:prefix ("I" . "irc") :desc "Open irc app" "i" #'=irc - :desc "Next unread buffer" "a" #'+irc/tracking-next-buffer + :desc "Next unread buffer" "a" #'tracking-next-buffer :desc "Quit irc" "q" #'+irc/quit :desc "Reconnect all" "r" #'circe-reconnect-all :desc "Send message" "s" #'+irc/send-message From 2e8329e6b6b3a548fa2c5d0b61b685bbca654de0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 23 Jan 2019 16:07:09 -0500 Subject: [PATCH 3665/4235] Fix error message with async lookup handlers Even if they succeeded. Mentioned in #716 --- modules/feature/lookup/autoload/lookup.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 6ff84bd29..da2b4fc25 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -125,7 +125,8 @@ Otherwise, these properties are available to be set: ;; reliably, so we set up the new window ahead of time. (switch-to-buffer-other-window (current-buffer)) (goto-char (marker-position origin))) - (call-interactively fn)) + (call-interactively fn) + t) if (condition-case e (save-window-excursion (when (or (if (commandp cmd) From e00ea2c3065df83e61150e162542b0abee498f4a Mon Sep 17 00:00:00 2001 From: Ting Zhou Date: Wed, 23 Jan 2019 14:18:31 -0800 Subject: [PATCH 3666/4235] ui/treemacs: assgin treemacs--last-error-persist-file --- modules/ui/treemacs/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index e8a2df738..7d4a9a614 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -10,7 +10,8 @@ treemacs-show-hidden-files t treemacs-goto-tag-strategy 'refetch-index treemacs-display-in-side-window t - treemacs-persist-file (concat doom-cache-dir "treemacs-persist")) + treemacs-persist-file (concat doom-cache-dir "treemacs-persist") + treemacs--last-error-persist-file (concat doom-cache-dir "treemacs-persist-at-last-error")) (after! treemacs From a3694edb1530d7296d74c0efb52e143b8462b2cb Mon Sep 17 00:00:00 2001 From: Luigy Leon Date: Thu, 24 Jan 2019 02:13:16 -0500 Subject: [PATCH 3667/4235] Fix doom/update-package --- core/autoload/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index ec93895bc..3a7558bda 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -432,10 +432,10 @@ calls." (mapcar #'car packages) nil t) (user-error "All packages are up to date"))) - (name (car (assoc selection package-alist)))) + (name (car (assoc (intern selection) package-alist)))) (unless name (user-error "'%s' is already up-to-date" selection)) - (list (cdr (assq name packages))))) + (list (assq name packages)))) (doom-initialize-packages) (cl-destructuring-bind (package old-version new-version) pkg (if-let* ((desc (doom-package-outdated-p package))) From 7ca2b42d2bfa911051820448b3b4e59682672488 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 25 Jan 2019 03:10:28 -0500 Subject: [PATCH 3668/4235] lang/lua: set default indent = tab-width Because it's original default was 3. Madness. --- modules/lang/lua/config.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index 5d0016ee9..ee123bbde 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -4,7 +4,14 @@ (provide 'smartparens-lua) -(after! lua-mode +;; +;; Major modes + +(def-package! lua-mode + :init + ;; lua-indent-level defaults to 3 otherwise. Madness. + (setq lua-indent-level tab-width) + :config (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) (set-repl-handler! 'lua-mode #'+lua/repl) From 5b44d3fa6122ad7bae3b1977f5f42d45daf9d401 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Sat, 26 Jan 2019 12:16:56 +0200 Subject: [PATCH 3669/4235] Set forge-database-file in doom-etc-dir Suggested by @luigy --- modules/tools/magit/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index fb88b1014..7e06e350f 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -104,4 +104,6 @@ what features are available.") (def-package! forge :when (featurep! :tools magit +forge) - :after magit) + :after magit + :init + (setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite"))) From 6750c84af5874a9b61ebdec64e54d095bac17c8e Mon Sep 17 00:00:00 2001 From: Ivan Kryvoruchko Date: Sat, 26 Jan 2019 14:47:55 +0200 Subject: [PATCH 3670/4235] Add descriptions for clojure-mode map --- modules/lang/clojure/config.el | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 8256614c7..5e05810bb 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -43,14 +43,12 @@ cider-repl-wrap-history nil cider-stacktrace-default-filters '(tooling dup)) - ;; TODO: Add mode-local labels when general support is in. (map! (:localleader (:map clojure-mode-map "'" #'cider-jack-in - "\"" #'cider-jack-in-clojurescript) - (:map cider-mode-map - ;; eval - (:prefix "e" + "\"" #'cider-jack-in-clojurescript + + (:prefix ("e" . "eval") "d" #'cider-eval-defun-at-point "D" #'cider-insert-defun-in-repl "e" #'cider-eval-last-sexp @@ -58,32 +56,26 @@ "r" #'cider-eval-region "R" #'cider-insert-region-in-repl "u" #'cider-undef) - ;; go/jump - (:prefix "g" + (:prefix ("g" . "go/jump") "b" #'cider-pop-back "g" #'cider-find-var "n" #'cider-find-ns) - ;; help - (:prefix "h" + (:prefix ("h" . "help") "n" #'cider-find-ns "a" #'cider-apropos "d" #'cider-doc "g" #'cider-grimoire-web "j" #'cider-javadoc) - ;; inspect - (:prefix "i" + (:prefix ("i" . "inspect") "i" #'cider-inspect "r" #'cider-inspect-last-result) - ;; macro - (:prefix "m" + (:prefix ("m" . "macro") "e" #'cider-macroexpand-1 "E" #'cider-macroexpand-al) - ;; namespace - (:prefix "n" + (:prefix ("n" . "namespace") "n" #'cider-browse-ns "N" #'cider-browse-ns-all) - ;; repl - (:prefix "r" + (:prefix ("r" . "repl") "n" #'cider-repl-set-ns "q" #'cider-quit "r" #'cider-refresh @@ -105,9 +97,9 @@ (def-package! clj-refactor :hook (clojure-mode . clj-refactor-mode) :config - (map! :map clj-refactor-map + (map! :map clojure-mode-map :localleader - "R" #'hydra-cljr-help-menu/body)) + :desc "refactor" "R" #'hydra-cljr-help-menu/body)) (def-package! flycheck-joker :when (featurep! :feature syntax-checker) From bab37d30472c06908f80de7c36d990c90bbb3c7a Mon Sep 17 00:00:00 2001 From: Ivan Kryvoruchko Date: Sat, 26 Jan 2019 15:34:32 +0200 Subject: [PATCH 3671/4235] Fix Clojure def/doc lookup handlers, add references one --- modules/lang/clojure/config.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 8256614c7..bc74480bb 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -18,8 +18,8 @@ (set-repl-handler! 'clojure-mode #'+clojure/repl) (set-eval-handler! 'clojure-mode #'cider-eval-region) (set-lookup-handlers! 'clojure-mode - :definition #'cider-browse-ns-find-at-point - :documentation #'cider-browse-ns-doc-at-point) + :definition #'cider-find-dwim + :documentation #'cider-doc) (add-hook 'cider-mode-hook #'eldoc-mode) :config (setq nrepl-hide-special-buffers t @@ -104,6 +104,9 @@ (def-package! clj-refactor :hook (clojure-mode . clj-refactor-mode) + :init + (set-lookup-handlers! 'clojure-mode + :references #'cljr-find-usages) :config (map! :map clj-refactor-map :localleader From 424c358786b11ae6ee5609164fee1e0085baec48 Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Sun, 27 Jan 2019 03:45:29 +0800 Subject: [PATCH 3672/4235] Add vterm layer vterm layer uses emacs-libvterm for terminal support --- init.example.el | 1 + modules/config/default/+evil-bindings.el | 3 ++ modules/emacs/vterm/autoload.el | 29 +++++++++++++ modules/emacs/vterm/config.el | 27 ++++++++++++ modules/emacs/vterm/doctor.el | 13 ++++++ modules/emacs/vterm/packages.el | 4 ++ modules/emacs/vterm/readme.org | 55 ++++++++++++++++++++++++ modules/ui/popup/config.el | 2 + 8 files changed, 134 insertions(+) create mode 100644 modules/emacs/vterm/autoload.el create mode 100644 modules/emacs/vterm/config.el create mode 100644 modules/emacs/vterm/doctor.el create mode 100644 modules/emacs/vterm/packages.el create mode 100644 modules/emacs/vterm/readme.org diff --git a/init.example.el b/init.example.el index 8789117f9..aecc8e67c 100644 --- a/init.example.el +++ b/init.example.el @@ -60,6 +60,7 @@ hideshow ; basic code-folding support imenu ; an imenu sidebar and searchable code index ;;term ; terminals in Emacs + ;;vterm ; another terminals in Emacs vc ; version-control and Emacs, sitting in a tree :tools diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index de2ccf508..b072979d3 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -689,6 +689,9 @@ (:when (featurep! :emacs term) :desc "Terminal" "t" #'+term/open :desc "Terminal in popup" "T" #'+term/open-popup-in-project) + (:when (featurep! :emacs vterm) + :desc "Terminal" "t" #'+vterm/open + :desc "Terminal in popup" "T" #'+vterm/open-popup-in-project) (:when (featurep! :emacs eshell) :desc "Eshell" "e" #'+eshell/open :desc "Eshell in popup" "E" #'+eshell/open-popup) diff --git a/modules/emacs/vterm/autoload.el b/modules/emacs/vterm/autoload.el new file mode 100644 index 000000000..4d3f7311d --- /dev/null +++ b/modules/emacs/vterm/autoload.el @@ -0,0 +1,29 @@ +;;; emacs/vterm/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +vterm/open (arg) + "Open a terminal buffer in the current window. If ARG (universal argument) is +non-nil, cd into the current project's root." + (interactive "P") + (let ((default-directory + (if arg + (or (doom-project-root) default-directory) + default-directory))) + (switch-to-buffer (save-window-excursion (vterm))))) + +;;;###autoload +(defun +vterm/open-popup (arg) + "Open a terminal popup window. If ARG (universal argument) is +non-nil, cd into the current project's root." + (interactive "P") + (let ((default-directory + (if arg + (or (doom-project-root) default-directory) + default-directory))) + (pop-to-buffer (save-window-excursion (vterm))))) + +;;;###autoload +(defun +vterm/open-popup-in-project () + "Open a terminal popup window in the root of the current project." + (interactive) + (+vterm/open-popup t)) diff --git a/modules/emacs/vterm/config.el b/modules/emacs/vterm/config.el new file mode 100644 index 000000000..32bc953ba --- /dev/null +++ b/modules/emacs/vterm/config.el @@ -0,0 +1,27 @@ +;;; emacs/vterm/config.el -*- lexical-binding: t; -*- + +(def-package! vterm + :load-path (lambda () (list (concat doom-packages-dir "/quelpa/build/vterm"))) + :init + (unless (file-executable-p (concat + (file-name-directory (locate-library "vterm")) + "vterm-module.so")) + ;; let vterm compile `vterm-modules.so' + (setq-default vterm-install t)) + :when (and (string-match-p "MODULES" system-configuration-features) + (display-graphic-p)) + :config + (set-env! "SHELL") + (add-hook 'vterm-mode-hook #'doom|mark-buffer-as-real) + ;; Automatically kill buffer when vterm exits. + (setq-default vterm-exit-functions #'kill-buffer) + (when (featurep! :feature evil) + (evil-set-initial-state 'vterm-mode 'insert) + ;; Those keys are commonly needed by terminals. + (evil-define-key 'insert vterm-mode-map + (kbd "C-d") #'vterm--self-insert) + ;; Go back to normal state but don't move cursor backwards. + ;; Moving cursor backwards is the default Vim behavior but + ;; it is not appropriate in some cases like terminals. + (add-hook 'vterm-mode-hook #'(lambda () + (setq-local evil-move-cursor-back nil))))) diff --git a/modules/emacs/vterm/doctor.el b/modules/emacs/vterm/doctor.el new file mode 100644 index 000000000..8f8837fc8 --- /dev/null +++ b/modules/emacs/vterm/doctor.el @@ -0,0 +1,13 @@ +;;; emacs/vterm/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "vterm-ctrl") + (warn! "Couldn't find libvterm library. Please install it on your system")) + +(unless (executable-find "make") + (warn! "Couldn't find make command. Please install it on your system")) + +(unless (executable-find "cmake") + (warn! "Couldn't find cmake command. Please install it on your system")) + +(unless (string-match-p "MODULES" system-configuration-features) + (error! "You have to compile emacs with MODULES support")) diff --git a/modules/emacs/vterm/packages.el b/modules/emacs/vterm/packages.el new file mode 100644 index 000000000..f584b6c74 --- /dev/null +++ b/modules/emacs/vterm/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; emacs/vterm/packages.el + +(package! vterm :recipe (:fetcher github :repo "akermu/emacs-libvterm")) diff --git a/modules/emacs/vterm/readme.org b/modules/emacs/vterm/readme.org new file mode 100644 index 000000000..3a8b13ba8 --- /dev/null +++ b/modules/emacs/vterm/readme.org @@ -0,0 +1,55 @@ +#+TITLE: emacs/vterm +#+DATE: January 16, 2019 +#+SINCE: {replace with next tagged release version} +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] +- [[Prerequisites][Prerequisites]] + - [[Emacs requirement][Emacs requirement]] + - [[Compiler requirement][Compiler requirement]] + - [[System requirement][System requirement]] + +* Description +An [[https://github.com/akermu/emacs-libvterm][emacs-libvterm]] module. + +* Prerequisites + +** Emacs requirement + +You have to compile emacs with =--with-modules= option. + +Lookat the =system-configuration-options= variable to see if your emacs has this option. + +** Compiler requirement + +Your system need to have =make= =cmake= and a c compiler to compile +=libvterm-module=, Emacs will automatically compile the module for you. + +You can also put your pre-compiled =vterm-module.so= to your vterm installation +folder, which is usually =~/.emacs.d/.local/packages/quelpa/build/vterm/=, +and make sure =vterm-module.so= file is executable, instead of let emacs compile +it for you. + +** System requirement + +You need to have =libvterm= installed in your system. + +On Ubuntu or Debian: + +#+BEGIN_SRC sh +sudo apt install libvterm-dev +#+END_SRC + +On ArchLinux or Manjaro: + +#+BEGIN_SRC sh +sudo pacman -S libvterm +#+END_SRC + +On macOS: + +#+BEGIN_SRC sh +brew install libvterm +#+END_SRC + diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index cb49d1e8d..088912b1c 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -144,6 +144,8 @@ prevent the popup(s) from messing up the UI (or vice versa)." :size 0.45 :vslot -3 :ttl 0 :quit t :select t) ("^\\*doom \\(?:term\\|eshell\\)" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) + ("^vterm" + :size 0.25 :vslot -4 :select t :quit nil :ttl 0) ("^\\*doom:" :vslot -5 :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) ("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" From 451989813faca334ec952b2a7f050381636b086f Mon Sep 17 00:00:00 2001 From: Bastien Versini Date: Sat, 26 Jan 2019 23:08:39 +0100 Subject: [PATCH 3673/4235] Fix description for increase/decrease font size --- modules/config/default/+evil-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index de2ccf508..1ce8b45c6 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -509,7 +509,7 @@ ((featurep! :completion helm) #'+helm/project-search))) (:prefix ("]" . "next") - :desc "Increase text size" "[" #'text-scale-decrease + :desc "Decrease text size" "[" #'text-scale-decrease :desc "Next buffer" "b" #'previous-buffer :desc "Next diff Hunk" "d" #'git-gutter:previous-hunk :desc "Next todo" "t" #'hl-todo-previous @@ -519,7 +519,7 @@ :desc "Next spelling correction" "S" #'flyspell-correct-previous-word-generic) (:prefix ("[" . "previous") - :desc "Text size" "]" #'text-scale-increase + :desc "Increase text size" "]" #'text-scale-increase :desc "Buffer" "b" #'next-buffer :desc "Diff Hunk" "d" #'git-gutter:next-hunk :desc "Todo" "t" #'hl-todo-next From 5baaf08246ae8c5bece4231f20b82d08aa29b2bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 Jan 2019 19:54:55 -0500 Subject: [PATCH 3674/4235] Move evil-mc library to editor/multiple-cursors --- modules/config/default/+evil-bindings.el | 4 ++-- .../multiple-cursors}/autoload/evil-mc.el | 13 +++++++------ modules/editor/multiple-cursors/config.el | 9 +++++++-- modules/feature/evil/+commands.el | 2 +- modules/feature/evil/config.el | 2 -- 5 files changed, 17 insertions(+), 13 deletions(-) rename modules/{feature/evil => editor/multiple-cursors}/autoload/evil-mc.el (81%) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index de2ccf508..f94a8a0b8 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -395,9 +395,9 @@ :nv "N" #'evil-mc-make-and-goto-last-cursor :nv "p" #'evil-mc-make-and-goto-prev-cursor :nv "P" #'evil-mc-make-and-goto-first-cursor - :nv "t" #'+evil/mc-toggle-cursors + :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors :nv "u" #'evil-mc-undo-all-cursors - :nv "z" #'+evil/mc-make-cursor-here) + :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here) (:after evil-mc :map evil-mc-key-map :nv "C-n" #'evil-mc-make-and-goto-next-cursor diff --git a/modules/feature/evil/autoload/evil-mc.el b/modules/editor/multiple-cursors/autoload/evil-mc.el similarity index 81% rename from modules/feature/evil/autoload/evil-mc.el rename to modules/editor/multiple-cursors/autoload/evil-mc.el index c874a7b48..c83f1d52d 100644 --- a/modules/feature/evil/autoload/evil-mc.el +++ b/modules/editor/multiple-cursors/autoload/evil-mc.el @@ -1,7 +1,8 @@ -;;; feature/evil/autoload/evil-mc.el -*- lexical-binding: t; -*- +;;; editor/multiple-cursors/autoload/evil-mc.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) ;;;###autoload -(defun +evil/mc-toggle-cursors () +(defun +multiple-cursors/evil-mc-toggle-cursors () "Toggle frozen state of evil-mc cursors." (interactive) (setq evil-mc-frozen (not (and (evil-mc-has-cursors-p) @@ -10,8 +11,8 @@ (message "evil-mc paused") (message "evil-mc resumed"))) -;;;###autoload (autoload '+evil/mc-make-cursor-here "feature/evil/autoload/evil-mc" nil t) -(evil-define-command +evil/mc-make-cursor-here () +;;;###autoload (autoload '+multiple-cursors/evil-mc-make-cursor-here "editor/multiple-cursors/autoload/evil-mc" nil t) +(evil-define-command +multiple-cursors/evil-mc-make-cursor-here () "Create a cursor at point. If in visual block or line mode, then create cursors on each line of the selection, on the column of the cursor. Otherwise pauses cursors." @@ -43,8 +44,8 @@ pauses cursors." ;; I assume I don't want the cursors to move yet (evil-mc-make-cursor-here)))) -;;;###autoload (autoload '+evil:mc "feature/evil/autoload/evil-mc" nil t) -(evil-define-command +evil:mc (beg end type pattern &optional bang) +;;;###autoload (autoload '+multiple-cursors:evil-mc "editor/multiple-cursors/autoload/evil-mc" nil t) +(evil-define-command +multiple-cursors:evil-mc (beg end type pattern &optional bang) "Create mc cursors at each match of PATTERN within BEG and END, and leave the cursor at the final match. If BANG, then treat PATTERN as literal." :move-point nil diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 9301e689b..319c46edb 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -47,9 +47,14 @@ t)) (add-hook 'doom-escape-hook #'+multiple-cursors|escape-multiple-cursors) - ;; + ;; Forward declare these so that ex completion and evil-mc support is + ;; recognized before the autoloaded functions are loaded. (evil-add-command-properties '+evil:align :evil-mc t) - (evil-add-command-properties '+evil:mc :evil-mc t)) + (evil-set-command-properties '+multiple-cursors:evil-mc + :move-point nil + :ex-arg 'global-match + :ex-bang t + :evil-mc t)) (def-package! multiple-cursors diff --git a/modules/feature/evil/+commands.el b/modules/feature/evil/+commands.el index 2c29ace0a..10151fb8f 100644 --- a/modules/feature/evil/+commands.el +++ b/modules/feature/evil/+commands.el @@ -61,7 +61,7 @@ This command understands vim file modifiers (like %:p:h). See (evil-ex-define-cmd "ral[ign]" #'+evil:align-right) (evil-ex-define-cmd "enhtml" #'+web:encode-html-entities) (evil-ex-define-cmd "dehtml" #'+web:decode-html-entities) -(evil-ex-define-cmd "mc" #'+evil:mc) +(evil-ex-define-cmd "mc" #'+multiple-cursors:evil-mc) (evil-ex-define-cmd "iedit" #'evil-multiedit-ex-match) (evil-ex-define-cmd "na[rrow]" #'+evil:narrow-buffer) (evil-ex-define-cmd "retab" #'+evil:retab) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 3af427662..f88fa1a86 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -166,8 +166,6 @@ line with a linewise comment.") ;; functions aren't loaded yet. (evil-set-command-properties '+evil:align :move-point t :ex-arg 'buffer-match :ex-bang t :keep-visual t :suppress-operator t) - (evil-set-command-properties - '+evil:mc :move-point nil :ex-arg 'global-match :ex-bang t) ;; `evil-collection' (when (featurep! +everywhere) From b085dd81804a2526f8a2245f3eccef707f5fdbed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 Jan 2019 19:55:36 -0500 Subject: [PATCH 3675/4235] Refactor out redundant hook --- modules/editor/multiple-cursors/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 319c46edb..425916126 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -33,8 +33,7 @@ (add-to-list 'evil-mc-custom-known-commands '(evil-escape (:default . evil-mc-execute-default-evil-normal-state))) ;; Activate evil-mc cursors upon switching to insert mode - (defun +evil-mc|resume-cursors () (setq evil-mc-frozen nil)) - (add-hook 'evil-insert-state-entry-hook #'+evil-mc|resume-cursors) + (add-hook 'evil-insert-state-entry-hook #'evil-mc-resume-cursors) ;; disable evil-escape in evil-mc; causes unwanted text on invocation (add-to-list 'evil-mc-incompatible-minor-modes 'evil-escape-mode nil #'eq) From 6da148e92838cfa1c14b2da7e72df10c669e1f8e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 Jan 2019 20:17:37 -0500 Subject: [PATCH 3676/4235] Fix s-q on macos for non-evil users There's no guarantee evil-quit-all will be defined. --- modules/config/default/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index d79334a9e..6e275feb1 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -138,7 +138,7 @@ "s-W" #'delete-frame "s-n" #'+default/new-buffer "s-N" #'make-frame - "s-q" (if (daemonp) #'delete-frame #'evil-quit-all) + "s-q" (if (daemonp) #'delete-frame #'save-buffers-kill-terminal) ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because ;; it imposes some other functionality and overhead we don't need) "s-z" #'undo From e9d09d17dafbb9885d110385dc3a9de8769a46b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 28 Jan 2019 21:00:41 -0500 Subject: [PATCH 3677/4235] Remove s-x / s-; keybinds --- modules/config/default/+evil-bindings.el | 3 +-- modules/config/default/config.el | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index f94a8a0b8..165e80b19 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -19,8 +19,7 @@ (map! (:map override ;; A little sandbox to run code in "M-;" #'eval-expression - "A-;" #'eval-expression - (:when IS-MAC "s-;" #'eval-expression)) + "A-;" #'eval-expression) [remap evil-jump-to-tag] #'projectile-find-tag [remap find-tag] #'projectile-find-tag diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 6e275feb1..bb715147d 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -168,8 +168,7 @@ ;; Make M-x harder to miss (define-key! 'override "M-x" #'execute-extended-command - "A-x" #'execute-extended-command - "s-x" #'execute-extended-command) + "A-x" #'execute-extended-command) ;; Smarter C-a/C-e for both Emacs and Evil. C-a will jump to indentation. ;; Pressing it again will send you to the true bol. Same goes for C-e, except From febad24a1d68bd5abb491b1fad0bf291cb8c0b0e Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 28 Jan 2019 14:23:12 -0800 Subject: [PATCH 3678/4235] bindings: add some more macos behaviors --- modules/config/default/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index bb715147d..03a99e17a 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -139,9 +139,14 @@ "s-n" #'+default/new-buffer "s-N" #'make-frame "s-q" (if (daemonp) #'delete-frame #'save-buffers-kill-terminal) + "C-s-f" #'toggle-frame-fullscreen + ;; Restore somewhat common navigation + "s-l" #'goto-line ;; Restore OS undo, save, copy, & paste keys (without cua-mode, because ;; it imposes some other functionality and overhead we don't need) + "s-f" #'swiper "s-z" #'undo + "s-Z" #'redo "s-c" (if (featurep 'evil) #'evil-yank #'copy-region-as-kill) "s-v" #'yank "s-s" #'save-buffer From 11b4a3502a42c36ecbb5ab6f6b88ed47f85a5830 Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Mon, 28 Jan 2019 15:14:09 -0800 Subject: [PATCH 3679/4235] bindings: add common comment toggle This is fairly common in most editors so let's make lives easier. --- core/autoload/editor.el | 10 ++++++++++ modules/config/default/config.el | 1 + 2 files changed, 11 insertions(+) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 5c896b702..45335b37a 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -270,6 +270,16 @@ Respects `require-final-newline'." (when (looking-at "\n+") (replace-match ""))) +;;;###autoload +(defun doom/toggle-comment-region-or-line () + "Comments or uncomments the whole region or if no region is +selected, then the current line." + (interactive) + (let (beg end) + (if (region-active-p) + (setq beg (region-beginning) end (region-end)) + (setq beg (line-beginning-position) end (line-end-position))) + (comment-or-uncomment-region beg end))) ;; ;; Advice diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 03a99e17a..eb3446fc1 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -156,6 +156,7 @@ "s--" #'text-scale-decrease ;; Conventional text-editing keys & motions "s-a" #'mark-whole-buffer + "s-/" #'doom/toggle-comment-region-or-line :gi [s-return] #'+default/newline-below :gi [s-S-return] #'+default/newline-above :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent From 8b867c780dea74120275ee4b5ad8b6f30f9512bd Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Tue, 29 Jan 2019 20:43:15 +0800 Subject: [PATCH 3680/4235] use add-hook instead of setq we can support multipule hook functions with `add-hook` --- modules/emacs/vterm/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/emacs/vterm/config.el b/modules/emacs/vterm/config.el index 32bc953ba..65cd5ed75 100644 --- a/modules/emacs/vterm/config.el +++ b/modules/emacs/vterm/config.el @@ -14,7 +14,8 @@ (set-env! "SHELL") (add-hook 'vterm-mode-hook #'doom|mark-buffer-as-real) ;; Automatically kill buffer when vterm exits. - (setq-default vterm-exit-functions #'kill-buffer) + (add-hook 'vterm-exit-functions #'(lambda (buffer) + (when buffer (kill-buffer buffer)))) (when (featurep! :feature evil) (evil-set-initial-state 'vterm-mode 'insert) ;; Those keys are commonly needed by terminals. From b0c84384a4cca16191003d4666fecf824ea792fb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 29 Jan 2019 18:57:45 -0500 Subject: [PATCH 3681/4235] Fix = +treemacs/toggle for non-evil users --- modules/config/default/+emacs-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 3dcc0b2a7..2688a976a 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -192,7 +192,7 @@ (:when (featurep! :ui neotree) "" #'+neotree/open) (:when (featurep! :ui treemacs) - "" #'+treemacs) + "" #'+treemacs/toggle) "C-=" #'er/expand-region "C--" #'er/contract-region ;; smartparens From 0a43819a44f11ed90df8862457fb209afcb2a5f8 Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Fri, 1 Feb 2019 22:34:49 +0800 Subject: [PATCH 3682/4235] bypass more keybindings to vterm --- modules/emacs/vterm/config.el | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/emacs/vterm/config.el b/modules/emacs/vterm/config.el index 65cd5ed75..221e7cdb8 100644 --- a/modules/emacs/vterm/config.el +++ b/modules/emacs/vterm/config.el @@ -20,7 +20,25 @@ (evil-set-initial-state 'vterm-mode 'insert) ;; Those keys are commonly needed by terminals. (evil-define-key 'insert vterm-mode-map - (kbd "C-d") #'vterm--self-insert) + (kbd "C-a") #'vterm--self-insert + (kbd "C-b") #'vterm--self-insert ; Should not be necessary. + (kbd "C-d") #'vterm--self-insert + (kbd "C-e") #'vterm--self-insert + (kbd "C-f") #'vterm--self-insert ; Should not be necessary. + (kbd "C-k") #'vterm--self-insert + (kbd "C-l") #'vterm--self-insert ; Should not be necessary. + (kbd "C-n") #'vterm--self-insert + (kbd "C-o") #'vterm--self-insert + (kbd "C-p") #'vterm--self-insert + (kbd "C-q") #'vterm--self-insert ; Should not be necessary. + (kbd "C-r") #'vterm--self-insert + (kbd "C-s") #'vterm--self-insert ; Should not be necessary. + (kbd "C-t") #'vterm--self-insert + (kbd "C-u") #'vterm--self-insert ; Should not be necessary. + (kbd "C-v") #'vterm--self-insert ; Should not be necessary. + (kbd "C-w") #'vterm--self-insert + (kbd "C-y") #'vterm--self-insert + (kbd "C-z") #'vterm--self-insert) ;; Go back to normal state but don't move cursor backwards. ;; Moving cursor backwards is the default Vim behavior but ;; it is not appropriate in some cases like terminals. From 4132be420896fe075523fec08edaa5d79ad8ca70 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 30 Jan 2019 17:23:00 -0500 Subject: [PATCH 3683/4235] org-agenda-window-setup = popup-window This is a custom setting that allows org agenda windows to be managed by Doom's popup manager. --- modules/ui/popup/+hacks.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index e5abd14cb..deebf9b06 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -266,14 +266,15 @@ instead of switch-to-buffer-*." (advice-add #'org-switch-to-buffer-other-window :around #'+popup*org-pop-to-buffer) ;; `org-agenda' - (setq org-agenda-window-setup 'other-window + (setq org-agenda-window-setup 'popup-window org-agenda-restore-windows-after-quit nil) - ;; Don't monopolize frame! + ;; Don't monopolize the frame! (defun +popup*org-agenda-suppress-delete-other-windows (orig-fn &rest args) (cond ((not +popup-mode) (apply orig-fn args)) ((eq org-agenda-window-setup 'popup-window) - (let (org-agenda-restore-windows-after-quit) + (let ((org-agenda-window-setup 'other-window) + org-agenda-restore-windows-after-quit) (cl-letf (((symbol-function 'delete-other-windows) (symbol-function 'ignore))) (apply orig-fn args)))) From 4a94599b1979720acfd78967ded3b5637e693d3e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 Jan 2019 16:17:17 -0500 Subject: [PATCH 3684/4235] Fix TAB fallthrough if yas-minor-mode is disabled yas-expand will error out if yas-minor-mode is disabled, preventing TAB from falling through to the next action. --- modules/config/default/+evil-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index abbf65db9..18418fd91 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -27,6 +27,7 @@ ;; Smart tab :i [tab] (general-predicate-dispatch nil ; fall back to nearest keymap (and (featurep! :feature snippets) + (bound-and-true-p yas-minor-mode) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) 'yas-expand (and (featurep! :completion company +tng) From 951b2be7d1efdba38898de7209a4459b81edc60b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 31 Jan 2019 20:24:03 -0500 Subject: [PATCH 3685/4235] Enable magit-todos-mode globally Rather than treat it like it's a minor mode. --- modules/tools/magit/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index c6ce4e960..e8827323f 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -45,11 +45,12 @@ what features are available.") (def-package! magit-todos - :hook (magit-mode . magit-todos-mode) + :after magit :config (setq magit-todos-require-colon nil) (define-key magit-todos-section-map "j" nil) - (advice-add #'magit-todos-mode :around #'doom*shut-up)) + (advice-add #'magit-todos-mode :around #'doom*shut-up) + (magit-todos-mode +1)) (def-package! magithub From 99fd8b4e1ba7f23b1306a07eb2c6e23ce5f39198 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Feb 2019 16:08:00 -0500 Subject: [PATCH 3686/4235] O'byte-compiler Who forbade the obsolete, Hooks, functions; adieu. (And an unused argument too) --- modules/config/default/+evil-bindings.el | 2 +- modules/editor/format/autoload/format.el | 2 +- modules/feature/snippets/autoload/snippets.el | 2 +- modules/tools/editorconfig/config.el | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 18418fd91..d682e2f15 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -616,7 +616,7 @@ :desc "Git revert file" "R" #'vc-revert) (:when (featurep! :tools magit) :desc "Magit blame" "b" #'magit-blame-addition - :desc "Magit commit" "c" #'magit-commit + :desc "Magit commit" "c" #'magit-commit-create :desc "Magit clone" "C" #'+magit/clone :desc "Magit dispatch" "d" #'magit-dispatch-popup :desc "Magit find-file" "f" #'magit-find-file diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 67c5b05e5..8152cdcd6 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -201,7 +201,7 @@ snippets or single lines." (save-restriction (narrow-to-region beg end) (let ((+format-region-p t)) - (call-interactively #'+format/buffer)))) + (+format/buffer arg)))) ;;;###autoload (defun +format/region-or-buffer (beg end &optional arg) diff --git a/modules/feature/snippets/autoload/snippets.el b/modules/feature/snippets/autoload/snippets.el index 9745e0ea9..35f3b8ee9 100644 --- a/modules/feature/snippets/autoload/snippets.el +++ b/modules/feature/snippets/autoload/snippets.el @@ -107,7 +107,7 @@ buggy behavior when is pressed in an empty field." ;; Commands ;;;###autoload -(defun +snippets/browse (arg) +(defun +snippets/browse (_arg) "TODO" (interactive "P") (doom-project-browse +snippets-dir)) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index cafa04c5a..6c74a7a1d 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -49,7 +49,7 @@ extension, try to guess one." (when (and (equal (gethash 'trim_trailing_whitespace props) "true") (bound-and-true-p ws-butler-mode)) (ws-butler-mode -1))) - (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-ws-butler-maybe) + (add-hook 'editorconfig-after-apply-functions #'+editorconfig|disable-ws-butler-maybe) (defun +editorconfig|disable-indent-detection (props) "Inhibit `dtrt-indent' if an explicit indent_style and indent_size is @@ -57,7 +57,7 @@ specified by editorconfig." (when (or (gethash 'indent_style props) (gethash 'indent_size props)) (setq doom-inhibit-indent-detection t))) - (add-hook 'editorconfig-custom-hooks #'+editorconfig|disable-indent-detection) + (add-hook 'editorconfig-after-apply-functions #'+editorconfig|disable-indent-detection) ;; Editorconfig makes indentation too rigid in Lisp modes, so tell ;; editorconfig to ignore indentation there. The dynamic indentation support From b461c99d868265f52b1d6549827fd1bbd4b3c738 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Feb 2019 18:51:55 -0500 Subject: [PATCH 3687/4235] lang/org: fix C-RET/s-RET in org-mode #1146 --- modules/lang/org/config.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index dc8b54d3d..b9d31bbe8 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -320,10 +320,11 @@ between the two." (map! :map org-mode-map ;; textmate-esque newline insertion - :gi [C-return] (λ! (+org/insert-item 'below)) - :gi [C-S-return] (λ! (+org/insert-item 'above)) - :gi [M-return] (λ! (+org/insert-item 'below)) - :gi [M-S-return] (λ! (+org/insert-item 'above)) + :gni [C-return] (λ! (+org/insert-item 'below)) + :gni [C-S-return] (λ! (+org/insert-item 'above)) + (:when IS-MAC + :gni [s-return] (λ! (+org/insert-item 'below)) + :gni [s-S-return] (λ! (+org/insert-item 'above))) "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line From 3fd1548da538eb8885d2f4f796cefd91e9b9b74b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Feb 2019 18:54:13 -0500 Subject: [PATCH 3688/4235] Set treemacs--last-error-persist-file later #1151 Because treemacs--last-error-persist-file is defined with defconst, its default value will overwrite our custom one once the treemacs-persistence package is loaded. --- modules/ui/treemacs/config.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 7d4a9a614..63100b734 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -10,8 +10,10 @@ treemacs-show-hidden-files t treemacs-goto-tag-strategy 'refetch-index treemacs-display-in-side-window t - treemacs-persist-file (concat doom-cache-dir "treemacs-persist") - treemacs--last-error-persist-file (concat doom-cache-dir "treemacs-persist-at-last-error")) + treemacs-persist-file (concat doom-cache-dir "treemacs-persist")) + +(after! treemacs-persistence + (setq treemacs--last-error-persist-file (concat doom-cache-dir "treemacs-persist-at-last-error"))) (after! treemacs From 1676cc56e314053ffc4205e175f151e56905a678 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Feb 2019 18:56:07 -0500 Subject: [PATCH 3689/4235] config/default: standardize C/M/s-RET behavior Also enable these to work from normal mode. Mentioned in #1146 --- modules/config/default/config.el | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index eb3446fc1..c3e2b9c2a 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -157,14 +157,14 @@ ;; Conventional text-editing keys & motions "s-a" #'mark-whole-buffer "s-/" #'doom/toggle-comment-region-or-line - :gi [s-return] #'+default/newline-below - :gi [s-S-return] #'+default/newline-above - :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent - :gi [s-left] #'doom/backward-to-bol-or-indent - :gi [s-right] #'doom/forward-to-last-non-comment-or-eol - :gi [M-backspace] #'backward-kill-word - :gi [M-left] #'backward-word - :gi [M-right] #'forward-word)) + :gni [s-return] #'+default/newline-below + :gni [s-S-return] #'+default/newline-above + :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent + :gi [s-left] #'doom/backward-to-bol-or-indent + :gi [s-right] #'doom/forward-to-last-non-comment-or-eol + :gi [M-backspace] #'backward-kill-word + :gi [M-left] #'backward-word + :gi [M-right] #'forward-word)) ;; @@ -183,10 +183,10 @@ :gi "C-e" #'doom/forward-to-last-non-comment-or-eol ;; Standardize the behavior of M-RET/M-S-RET as a "add new item ;; below/above" key. - :gi [M-return] #'+default/newline-below - :gi [M-S-return] #'+default/newline-above - :gi [C-return] #'+default/newline-below - :gi [C-S-return] #'+default/newline-above) + :gni [M-return] #'+default/newline-below + :gni [M-S-return] #'+default/newline-above + :gni [C-return] #'+default/newline-below + :gni [C-S-return] #'+default/newline-above) (if (featurep 'evil) (load! "+evil-bindings") From 478d80379dbd497081b18f0bebc0d032e464c4b1 Mon Sep 17 00:00:00 2001 From: Niklas Carlsson Date: Tue, 5 Feb 2019 10:29:02 +0100 Subject: [PATCH 3690/4235] Harmonize next/previous The description of next and previous was not aligned with the actual functions that was being called. This patch aligns them. --- modules/config/default/+evil-bindings.el | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index d682e2f15..8f84290f1 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -510,23 +510,23 @@ (:prefix ("]" . "next") :desc "Decrease text size" "[" #'text-scale-decrease - :desc "Next buffer" "b" #'previous-buffer - :desc "Next diff Hunk" "d" #'git-gutter:previous-hunk - :desc "Next todo" "t" #'hl-todo-previous - :desc "Next error" "e" #'previous-error + :desc "Next buffer" "b" #'next-buffer + :desc "Next diff Hunk" "d" #'git-gutter:next-hunk + :desc "Next todo" "t" #'hl-todo-next + :desc "Next error" "e" #'next-error :desc "Next workspace" "w" #'+workspace/switch-left :desc "Next spelling error" "s" #'evil-prev-flyspell-error - :desc "Next spelling correction" "S" #'flyspell-correct-previous-word-generic) + :desc "Next spelling correction" "S" #'flyspell-correct-next-word-generic) (:prefix ("[" . "previous") - :desc "Increase text size" "]" #'text-scale-increase - :desc "Buffer" "b" #'next-buffer - :desc "Diff Hunk" "d" #'git-gutter:next-hunk - :desc "Todo" "t" #'hl-todo-next - :desc "Error" "e" #'next-error - :desc "Workspace" "w" #'+workspace/switch-right - :desc "Spelling error" "s" #'evil-next-flyspell-error - :desc "Spelling correction" "S" #'flyspell-correct-word-generic) + :desc "Increase text size" "]" #'text-scale-increase + :desc "Previous buffer" "b" #'previous-buffer + :desc "Previous diff Hunk" "d" #'git-gutter:previous-hunk + :desc "Previous todo" "t" #'hl-todo-previous + :desc "Previous error" "e" #'previous-error + :desc "Previous workspace" "w" #'+workspace/switch-right + :desc "Previous spelling error" "s" #'evil-previous-flyspell-error + :desc "Previous spelling correction" "S" #'flyspell-correct-word-generic) (:when (featurep! :feature workspaces) (:prefix ([tab] . "workspace") From fa564e33b9aed66200d0323e877148cbdb55daab Mon Sep 17 00:00:00 2001 From: Niklas Carlsson Date: Tue, 5 Feb 2019 10:52:45 +0100 Subject: [PATCH 3691/4235] Update text and workspaces as well These have a left/right and increase/behaviour. --- modules/config/default/+evil-bindings.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8f84290f1..bc1042bdc 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -509,22 +509,22 @@ ((featurep! :completion helm) #'+helm/project-search))) (:prefix ("]" . "next") - :desc "Decrease text size" "[" #'text-scale-decrease + :desc "Increase text size" "]" #'text-scale-increase :desc "Next buffer" "b" #'next-buffer :desc "Next diff Hunk" "d" #'git-gutter:next-hunk :desc "Next todo" "t" #'hl-todo-next :desc "Next error" "e" #'next-error - :desc "Next workspace" "w" #'+workspace/switch-left + :desc "Next workspace" "w" #'+workspace/switch-right :desc "Next spelling error" "s" #'evil-prev-flyspell-error :desc "Next spelling correction" "S" #'flyspell-correct-next-word-generic) (:prefix ("[" . "previous") - :desc "Increase text size" "]" #'text-scale-increase + :desc "Decrease text size" "[" #'text-scale-decrease :desc "Previous buffer" "b" #'previous-buffer :desc "Previous diff Hunk" "d" #'git-gutter:previous-hunk :desc "Previous todo" "t" #'hl-todo-previous :desc "Previous error" "e" #'previous-error - :desc "Previous workspace" "w" #'+workspace/switch-right + :desc "Previous workspace" "w" #'+workspace/switch-left :desc "Previous spelling error" "s" #'evil-previous-flyspell-error :desc "Previous spelling correction" "S" #'flyspell-correct-word-generic) From 1ea507e56cd086a70cec838f409698687ac75cd8 Mon Sep 17 00:00:00 2001 From: Niklas Carlsson Date: Tue, 5 Feb 2019 10:56:55 +0100 Subject: [PATCH 3692/4235] Align flyspell as well --- modules/config/default/+evil-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index bc1042bdc..93ee54acc 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -515,7 +515,7 @@ :desc "Next todo" "t" #'hl-todo-next :desc "Next error" "e" #'next-error :desc "Next workspace" "w" #'+workspace/switch-right - :desc "Next spelling error" "s" #'evil-prev-flyspell-error + :desc "Next spelling error" "s" #'evil-next-flyspell-error :desc "Next spelling correction" "S" #'flyspell-correct-next-word-generic) (:prefix ("[" . "previous") @@ -525,7 +525,7 @@ :desc "Previous todo" "t" #'hl-todo-previous :desc "Previous error" "e" #'previous-error :desc "Previous workspace" "w" #'+workspace/switch-left - :desc "Previous spelling error" "s" #'evil-previous-flyspell-error + :desc "Previous spelling error" "s" #'evil-prev-flyspell-error :desc "Previous spelling correction" "S" #'flyspell-correct-word-generic) (:when (featurep! :feature workspaces) From 30fad8b08b3e7e1e805ed616aa959dd556ecf3cb Mon Sep 17 00:00:00 2001 From: Sean Farley Date: Tue, 5 Feb 2019 11:06:21 -0800 Subject: [PATCH 3693/4235] irc: fix lui track bar not being enabled It seemed I mistakenly put this in an `evil` block and didn't notice. --- modules/app/irc/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index a89f6163c..901d45d59 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -203,9 +203,6 @@ after prompt marker." (add-hook! 'lui-mode-hook (add-hook 'evil-insert-state-entry-hook #'+irc|evil-insert nil t)) - ;; enable a horizontal line marking the last read message - (add-hook 'lui-mode-hook #'enable-lui-track-bar) - (mapc (lambda (cmd) (push cmd +irc-scroll-to-bottom-on-commands)) '(evil-paste-after evil-paste-before evil-open-above evil-open-below))) @@ -229,6 +226,9 @@ Courtesy of esh-mode.el" (add-hook! 'lui-mode-hook (add-hook 'pre-command-hook #'+irc|preinput-scroll-to-bottom nil t)) + ;; enable a horizontal line marking the last read message + (add-hook! 'lui-mode-hook #'enable-lui-track-bar) + (defun +irc|init-lui-margins () (setq lui-time-stamp-position 'right-margin lui-time-stamp-format +irc-time-stamp-format From faf217b0dec6a9fd8d557e1fd956741d12a64a25 Mon Sep 17 00:00:00 2001 From: Edmund Miller Date: Wed, 6 Feb 2019 19:56:22 -0600 Subject: [PATCH 3694/4235] Require solidity packages They're on Melpa individually for whatever reason though they're in the solidity-mode repo. --- modules/lang/solidity/packages.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/solidity/packages.el b/modules/lang/solidity/packages.el index fa8c36556..7d6e78ff5 100644 --- a/modules/lang/solidity/packages.el +++ b/modules/lang/solidity/packages.el @@ -2,3 +2,5 @@ ;;; lang/solidity/packages.el (package! solidity-mode) +(package! company-solidity) +(package! solidity-flycheck) From c166f075a3791bc0d2bbc71b6ad9d0bf6477c7a5 Mon Sep 17 00:00:00 2001 From: James Conroy-Finn Date: Sun, 10 Feb 2019 21:57:47 +0000 Subject: [PATCH 3695/4235] Add missing variable name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This enables compilation of the Ruby module where previously the following error would cause a breaking error. ../../../lang/ruby/autoload.el:48:45:Error: &rest without variable name ✕ Failed to compile modules/lang/ruby/autoload.el --- modules/lang/ruby/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index 879e3ca4b..cc2b21323 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -45,7 +45,7 @@ started it." (+ruby-version)))) ;;;###autoload -(defun +ruby|update-version-in-all-buffers (&rest ) +(defun +ruby|update-version-in-all-buffers (&rest _) "Update `+ruby--version' in all `enh-ruby-mode' buffers." (dolist (buffer (doom-buffers-in-mode 'enh-ruby-mode)) (setq +ruby-version-cache (clrhash +ruby-version-cache)) From c13fd6eddc8822e9949b8c380fd036e863c9248a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Feb 2019 02:11:21 -0500 Subject: [PATCH 3696/4235] lang/org: fix C/s-RET keybinds for evil users --- modules/lang/org/config.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b9d31bbe8..6dbcfba64 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -320,11 +320,11 @@ between the two." (map! :map org-mode-map ;; textmate-esque newline insertion - :gni [C-return] (λ! (+org/insert-item 'below)) - :gni [C-S-return] (λ! (+org/insert-item 'above)) + [C-return] (λ! (+org/insert-item 'below)) + [C-S-return] (λ! (+org/insert-item 'above)) (:when IS-MAC - :gni [s-return] (λ! (+org/insert-item 'below)) - :gni [s-S-return] (λ! (+org/insert-item 'above))) + [s-return] (λ! (+org/insert-item 'below)) + [s-S-return] (λ! (+org/insert-item 'above))) "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line @@ -355,6 +355,11 @@ between the two." :n "[" nil :map evil-org-mode-map + :ni [C-return] (λ! (+org/insert-item 'below)) + :ni [C-S-return] (λ! (+org/insert-item 'above)) + (:when IS-MAC + :ni [s-return] (λ! (+org/insert-item 'below)) + :ni [s-S-return] (λ! (+org/insert-item 'above))) ;; dedent with shift-tab in insert mode :i [backtab] #'+org/dedent ;; navigate table cells (from insert-mode) From 01a166d5f0212842df503fc2288bff9b595a38f9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Feb 2019 14:42:28 -0500 Subject: [PATCH 3697/4235] lang/rust: fix async docs lookup handler #1155 --- modules/lang/rust/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 41348e9cd..39ebcb0f0 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -18,7 +18,7 @@ :after rust-mode :config (add-hook 'rust-mode-hook #'racer-mode) - (set-lookup-handlers! 'rust-mode + (set-lookup-handlers! 'rust-mode :async t :definition #'racer-find-definition :documentation #'racer-describe)) From fb8a378d72c6568789cedd8e4120dbdd90ba9956 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Feb 2019 15:20:21 -0500 Subject: [PATCH 3698/4235] app/irc: fix =irc nooping without preset networks #1121 =irc would do nothing if no networks were pre-set with set-irc-server!. --- modules/app/irc/autoload/irc.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/app/irc/autoload/irc.el b/modules/app/irc/autoload/irc.el index 47d0f95f5..98846bb40 100644 --- a/modules/app/irc/autoload/irc.el +++ b/modules/app/irc/autoload/irc.el @@ -23,8 +23,10 @@ workspace for it." (if (+workspace-exists-p +irc--workspace-name) (+workspace-switch +irc--workspace-name) (and (+irc-setup-wconf inhibit-workspace) - (cl-loop for network in circe-network-options - collect (circe (car network)))))) + (if circe-network-options + (cl-loop for network in circe-network-options + collect (circe (car network))) + (quiet! (call-interactively #'circe)))))) ;;;###autoload (defun +irc/connect (&optional inhibit-workspace) From c033bfaca2ec8750b3b300bc96fc1ead5fe05344 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Feb 2019 00:26:43 -0500 Subject: [PATCH 3699/4235] Fix mixed-pitch affecting all buffers Both solaire-mode and mixed-pitch-mode use face-remap to do their thang. We ensure the order by ensuring activation order. --- modules/ui/doom/config.el | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index e5f4f8c51..59edd4386 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -73,4 +73,13 @@ (add-hook! '(minibuffer-setup-hook window-configuration-change-hook) #'+doom|disable-fringes-in-minibuffer) - (solaire-global-mode +1)) + (solaire-global-mode +1) + + ;; Fix incompatibility with the mixed-pitch package which causes all buffers + ;; to be affected (by `mixed-pitch-mode') + (defun +doom*fix-mixed-pitch-mode (&optional arg) + (when (and mixed-pitch-mode (not arg)) + (mixed-pitch-mode -1)) + (solaire-mode -1) + (turn-on-solaire-mode)) + (advice-add #'mixed-pitch-mode :before #'+doom*fix-mixed-pitch-mode)) From d79817edeb6952887c369942bb8c7c46756088fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Feb 2019 00:47:15 -0500 Subject: [PATCH 3700/4235] Fix unbalanced parens in +default/project-tasks --- modules/config/default/autoload/default.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index c84a295fa..1479e70a4 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -89,8 +89,8 @@ If ARG (universal argument), runs `compile' from the current directory." (defun +default/project-tasks () "Invokes `+ivy/tasks' or `+helm/tasks', depending on which is available." (interactive) - (cond ((featurep! :completion ivy) (+ivy/tasks) - (featurep! :completion helm) (+helm/tasks)))) + (cond ((featurep! :completion ivy) (+ivy/tasks)) + ((featurep! :completion helm) (+helm/tasks)))) ;;;###autoload (defun +default/newline-above () From d46c2582d0d0c870878834bc28d442dc16390f66 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Feb 2019 00:51:07 -0500 Subject: [PATCH 3701/4235] Fix 'not an evil-paste' error on SPC i y #1095 yank-pop and evil-paste-pop are picky little buggers, we need our own delegate. --- modules/config/default/+evil-bindings.el | 2 +- modules/config/default/autoload/default.el | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 93ee54acc..5f8fb166c 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -662,7 +662,7 @@ :desc "Man pages" "w" #'+default/man-or-woman) (:prefix ("i" . "insert") - :desc "Insert from clipboard" "y" #'yank-pop + :desc "Insert from clipboard" "y" #'+default/yank-pop :desc "Insert from evil register" "r" #'evil-ex-registers :desc "Insert snippet" "s" #'yas-insert-snippet) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 1479e70a4..7f46bf68c 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -110,3 +110,12 @@ If ARG (universal argument), runs `compile' from the current directory." (call-interactively 'evil-open-below) (end-of-line) (newline-and-indent))) + +;;;###autoload +(defun +default/yank-pop () + "Interactively select what text to insert from the kill ring." + (interactive) + (call-interactively + (cond ((fboundp 'counsel-yank-pop) #'counsel-yank-pop) + ((fboundp 'helm-show-kill-ring) #'helm-show-kill-ring) + ((error "No kill-ring search backend available. Enable ivy or helm!"))))) From 0e8af0e6d2b4740c47d31784410c6381e113b5bc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Feb 2019 00:53:03 -0500 Subject: [PATCH 3702/4235] Integrate evil jumplist into xref #1161 Rather than use xref-pop-marker-stack, evil users can now use the jumplist to jump from and to xref calls (with C-o/C-i). --- modules/feature/evil/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index f88fa1a86..72ce0b371 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -128,13 +128,15 @@ line with a linewise comment.") (advice-add #'evil-window-split :override #'+evil*window-split) (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) + ;; Integrate evil's jump-list into some navigational commands (defun +evil*set-jump (orig-fn &rest args) "Set a jump point and ensure ORIG-FN doesn't set any new jump points." - (evil-set-jump) + (evil-set-jump (if (markerp (car args)) (car args))) (let ((evil--jumps-jumping t)) (apply orig-fn args))) (advice-add #'counsel-git-grep-action :around #'+evil*set-jump) (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) + (advice-add #'xref-push-marker-stack :around #'+evil*set-jump) ;; In evil, registers 2-9 are buffer-local. In vim, they're global, so... (defun +evil*make-numbered-markers-global (orig-fn char) From ba0ccc1d349eb0c6647b1e670d4433b633ec1771 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Feb 2019 15:31:20 -0500 Subject: [PATCH 3703/4235] tools/magit: cleanup magit concurrently A quick attempt to make +magit/quit faster. --- modules/tools/magit/autoload.el | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 0c61fa12e..a3b1d12b5 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -48,6 +48,13 @@ ;; ;; Commands +(defun +magit--refresh-vc-in-buffer (buffer) + (with-current-buffer buffer + (when (fboundp 'vc-refresh-state) + (vc-refresh-state)) + (when (fboundp '+version-control|update-git-gutter) + (+version-control|update-git-gutter)))) + ;;;###autoload (defun +magit/quit (&optional _kill-buffer) "Clean up magit buffers after quitting `magit-status' and refresh version @@ -61,12 +68,13 @@ control in buffers." (eq major-mode 'magit-status-mode))) (window-list)))) (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) - (dolist (buffer (buffer-list)) - (with-current-buffer buffer - (when (fboundp 'vc-refresh-state) - (vc-refresh-state)) - (when (fboundp '+version-control|update-git-gutter) - (+version-control|update-git-gutter)))))) + (let ((buffers (doom-buffer-list))) + (if (not (fboundp 'make-thread)) + (mapc #'+magit--refresh-vc-in-buffer buffers) + (mapc #'+magit--refresh-vc-in-buffer (doom-visible-buffers buffers)) + ;; TODO Partition buffer list + (dolist (buffer (doom-buried-buffers buffers)) + (make-thread (lambda () (+magit--refresh-vc-in-buffer buffer)))))))) (defun +magit--kill-buffer (buf) "TODO" From 02a3f815a331673b48c2e38b5de588fdf899813a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Feb 2019 20:03:03 -0500 Subject: [PATCH 3704/4235] Disable evil-escape in term-mode #1156 Causes unintended escape characters to be inserted into the term buffer. --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 72ce0b371..1ad6ee1b7 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -255,7 +255,7 @@ line with a linewise comment.") :commands (evil-escape evil-escape-mode evil-escape-pre-command-hook) :init (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) - evil-escape-excluded-major-modes '(neotree-mode treemacs-mode) + evil-escape-excluded-major-modes '(neotree-mode treemacs-mode term-mode) evil-escape-key-sequence "jk" evil-escape-delay 0.25) (add-hook 'pre-command-hook #'evil-escape-pre-command-hook) From 60df01714efe09a30693c023b718647be58fcee8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Feb 2019 20:06:51 -0500 Subject: [PATCH 3705/4235] lang/cc: more type safety when reading compile options #1168 It was possible that +cc-default-compiler-options and/or irony--compile-options could contain a nil, causing stringp type errors. --- modules/lang/cc/autoload.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 7735b3c6a..c354e84de 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -144,11 +144,15 @@ 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-default-compiler-options))) - (list (locate-dominating-file (or buffer-file-name default-directory) - "include")) - (cl-loop for path in +cc-default-include-paths - nconc (list "-I" path))) + (delq nil + (append (cdr-safe (assq major-mode +cc-default-compiler-options)) + (cl-loop with path = (or buffer-file-name default-directory) + for dir in '("include" "includes") + if (projectile-locate-dominating-file path dir) + collect it) + (cl-loop for path in +cc-default-include-paths + if (stringp path) + nconc (list "-I" path)))) (doom-project-root))) ;; Make ffap aware of include paths (when irony--working-directory @@ -156,7 +160,8 @@ compilation dbs." (make-local-variable 'ffap-c-path) (make-local-variable 'ffap-c++-path) (cl-loop for opt in irony--compile-options - if (string-match "^-I\\(.+\\)" opt) + if (and (stringp opt) + (string-match "^-I\\(.+\\)" opt)) do (add-to-list (pcase major-mode (`c-mode 'ffap-c-path) (`c++-mode 'ffap-c++-path)) From 2054f6b35a99a3bcdd2f21bfd8f5ad9264c39ba8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Feb 2019 00:39:21 -0500 Subject: [PATCH 3706/4235] lang/php: include composer files with phpactor --- modules/lang/php/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/php/packages.el b/modules/lang/php/packages.el index 6324ca750..b7f9da3bd 100644 --- a/modules/lang/php/packages.el +++ b/modules/lang/php/packages.el @@ -5,7 +5,7 @@ (package! php-extras :recipe (:fetcher github :repo "arnested/php-extras")) (package! php-mode) (package! php-refactor-mode) -(package! phpactor :recipe (:fetcher github :repo "emacs-php/phpactor.el" :files ("*.el"))) +(package! phpactor :recipe (:fetcher github :repo "emacs-php/phpactor.el" :files ("*"))) (package! phpunit) (when (featurep! +hack) From 33ef90343e156f1123d6616a00ff7458018ab8f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Feb 2019 23:47:29 -0500 Subject: [PATCH 3707/4235] Revert to stable version of magit, temporarily Magit introduced some breaking changes in a recent commit that breaks evil-magit and magithub. Magithub appears to be migrating to forge, so until evil-magit has updated and I've properly replaced magithub with forge, we'll use an earlier version of magit instead. --- modules/tools/magit/config.el | 1 + modules/tools/magit/packages.el | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 2bf658fdd..882a637bd 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -99,6 +99,7 @@ what features are available.") "gj" #'git-rebase-move-line-down "gk" #'git-rebase-move-line-up))) + (def-package! forge :when (featurep! :tools magit +forge) :after magit diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 5eac2f2a5..93d158c0c 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,7 +1,14 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -(when (package! magit) +;; Magit introduced some breaking changes in a recent commit that breaks +;; evil-magit and magithub. +;; TODO Once those packages have updated, we'll go back to tracking magit HEAD +(when (package! magit :recipe + (:fetcher github + :repo "magit/magit" + :commit "78114e6425d5e7d6eaa7712c845f28694aa7faeb" + :files ("lisp/magit" "lisp/magit*.el" "lisp/git-rebase.el"))) (package! magit-gitflow) (if (featurep! +forge) (package! forge) From a246a905654e1e02188a8f878c4d6985622669e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 19:38:49 -0500 Subject: [PATCH 3708/4235] lang/ess: fix repl & doc lookup in ESS R/Julia Also moves history files into doom-cache-dir --- modules/lang/ess/autoload.el | 12 ++++++++---- modules/lang/ess/config.el | 16 +++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/modules/lang/ess/autoload.el b/modules/lang/ess/autoload.el index 22452a13c..05575a7b1 100644 --- a/modules/lang/ess/autoload.el +++ b/modules/lang/ess/autoload.el @@ -1,7 +1,11 @@ ;;; lang/ess/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +ess/r-repl () - "Open the R REPL." - (interactive) - (inferior-ess nil nil t)) +(defun +ess-repl-buffer (&optional start-args) + "Returns an R/Julia REPL buffer." + (interactive "P") + (pcase major-mode + ('ess-r-mode (run-ess-r start-args)) + ((or 'julia-mode 'ess-julia-mode) (run-julia start-args)) + (_ (inferior-ess nil nil t))) + (current-buffer)) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 201bda523..7c26c5e79 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -10,12 +10,14 @@ (setq ess-offset-continued 'straight ess-expression-offset 2 ess-nuke-trailing-whitespace-p t - ess-default-style 'DEFAULT) + ess-default-style 'DEFAULT + ess-history-directory (expand-file-name "ess-history/" doom-cache-dir)) (add-hook 'ess-mode-hook #'display-line-numbers-mode) - (set-repl-handler! 'ess-mode #'+ess/r-repl) - (set-lookup-handlers! 'ess-mode :documentation #'ess-display-help-on-object) + (set-repl-handler! '(ess-r-mode ess-julia-mode) #'+ess-repl-buffer) + (set-lookup-handlers! '(ess-r-mode ess-julia-mode) + :documentation #'ess-display-help-on-object) (map! (:after ess-help :map ess-doc-map @@ -44,10 +46,10 @@ "F" #'ess-eval-function-and-go "f" #'ess-eval-function ;; predefined keymaps - "h" #'ess-doc-map - "x" #'ess-extra-map - "p" #'ess-r-package-dev-map - "v" #'ess-dev-map + "h" ess-doc-map + "x" ess-extra-map + "p" ess-r-package-dev-map + "v" ess-dev-map ;; noweb :prefix "c" "C" #'ess-eval-chunk-and-go From 4c4c0a451ff2b617c5e9b89733b81ab7de3c8bc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 19:40:43 -0500 Subject: [PATCH 3709/4235] lang/ess: remove redundant line-number display hook `display-line-numbers-mode` is already in prog-mode-hook and ess-mode is derived from prog-mode. --- modules/lang/ess/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 7c26c5e79..420e000d5 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -13,8 +13,6 @@ ess-default-style 'DEFAULT ess-history-directory (expand-file-name "ess-history/" doom-cache-dir)) - (add-hook 'ess-mode-hook #'display-line-numbers-mode) - (set-repl-handler! '(ess-r-mode ess-julia-mode) #'+ess-repl-buffer) (set-lookup-handlers! '(ess-r-mode ess-julia-mode) :documentation #'ess-display-help-on-object) From 0edeafadcf3c91f605ced5c15f5a624077f32a6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 19:42:36 -0500 Subject: [PATCH 3710/4235] lang/julia: operator highlights for ess-julia-mode And adjust REPL handler to return the repl buffer. --- modules/lang/julia/autoload.el | 5 ++-- modules/lang/julia/config.el | 42 +++++++++++++++++----------------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/modules/lang/julia/autoload.el b/modules/lang/julia/autoload.el index e74ff2d3a..b999631ad 100644 --- a/modules/lang/julia/autoload.el +++ b/modules/lang/julia/autoload.el @@ -9,6 +9,5 @@ (apply #'make-comint-in-buffer "Julia" "*Julia*" julia-program julia-arguments)) (pop-to-buffer buffer) (with-current-buffer buffer - (inferior-julia-mode)))) - - + (inferior-julia-mode)) + buffer)) diff --git a/modules/lang/julia/config.el b/modules/lang/julia/config.el index 06d706ba2..385b49b7a 100644 --- a/modules/lang/julia/config.el +++ b/modules/lang/julia/config.el @@ -7,24 +7,24 @@ ;; Borrow matlab.el's fontification of math operators ;; From - (font-lock-add-keywords - 'julia-mode - `((,(let ((OR "\\|")) - (concat "\\(" ;; stolen `matlab.el' operators first - "[<>!]=?" OR - "\\.[/*^']" OR - "==" OR - "=>" OR - "\\" OR - "[-+*\\/^&|$]=?" OR ;; this has to come before next (updating operators) - "[-!^&|*+\\/~:]" OR - ;; more extra julia operators follow - "[%$]" OR - ;; bitwise operators - ">>>" OR ">>" OR "<<" OR - ">>>=" OR ">>" OR "<<" OR - ;; comparison - "[<>!]=?" OR - "\\)")) - 1 font-lock-type-face)))) - + (dolist (mode '(julia-mode ess-julia-mode)) + (font-lock-add-keywords + mode + `((,(let ((OR "\\|")) + (concat "\\(" ;; stolen `matlab.el' operators first + "[<>!]=?" OR + "\\.[/*^']" OR + "==" OR + "=>" OR + "\\" OR + "[-+*\\/^&|$]=?" OR ;; this has to come before next (updating operators) + "[-!^&|*+\\/~:]" OR + ;; more extra julia operators follow + "[%$]" OR + ;; bitwise operators + ">>>" OR ">>" OR "<<" OR + ">>>=" OR ">>" OR "<<" OR + ;; comparison + "[<>!]=?" OR + "\\)")) + 1 font-lock-type-face))))) From c5cd97d3cc65b948534c80cd0b7c8769f95132c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 19:53:15 -0500 Subject: [PATCH 3711/4235] Fix breaking change in window--display-buffer This change is present in later builds of Emacs 27, where window--display-buffer no longer has a 5th argument. --- modules/ui/popup/autoload/popup.el | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 695f93c8d..44b9e2185 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -456,7 +456,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (slot (or (cdr (assq 'slot alist)) 0)) (vslot (or (cdr (assq 'vslot alist)) 0)) (left-or-right (memq side '(left right))) - (dedicated (or display-buffer-mark-dedicated 'popup))) + (display-buffer-mark-dedicated (or display-buffer-mark-dedicated 'popup))) (cond ((not (memq side '(top bottom left right))) (error "Invalid side %s specified" side)) @@ -544,7 +544,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (with-current-buffer buffer (setq window--sides-shown t)) (window--display-buffer - buffer this-window 'reuse alist dedicated)) + buffer this-window 'reuse alist)) (and (or (not max-slots) (< slots max-slots)) (or (and next-window ;; Make new window before `next-window'. @@ -564,7 +564,7 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (with-current-buffer buffer (setq window--sides-shown t)) (window--display-buffer - buffer window 'window alist dedicated)) + buffer window 'window alist)) (and best-window ;; Reuse `best-window'. (progn @@ -573,12 +573,22 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set (with-current-buffer buffer (setq window--sides-shown t)) (window--display-buffer - buffer best-window 'reuse alist dedicated))))))))) + buffer best-window 'reuse alist))))))))) ;; ;; Emacs backwards compatibility +(unless EMACS27+ + (defun +popup*set-window-dedicated (window) + "Ensure `window--dispaly-buffer' respects `display-buffer-mark-dedicated'. + +This was not so until recent Emacs 27 builds, where it causes breaking errors. +This advice ensures backwards compatibility for Emacs <= 26 users." + (when (and (windowp window) display-buffer-mark-dedicated) + (set-window-dedicated-p window display-buffer-mark-dedicated))) + (advice-add #'window--display-buffer :filter-return #'+popup*set-window-dedicated)) + (unless EMACS26+ (defvar window-sides-reversed nil) From 9558b5e7938cb6034b1e76b080c1f6c166588f6c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 20:03:57 -0500 Subject: [PATCH 3712/4235] copy-seq -> copy-sequence It's a possibility that the copy-seq alias doesn't exist in certain builds of Emacs. Better safe than sorry. --- 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 f4676ac9a..1d8c5d885 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -62,7 +62,7 @@ ready to be pasted in a bug report on github." (or (ignore-errors (require 'use-package) (cl-loop for (name . plist) in (doom-get-packages :private t) - if (use-package-plist-delete (copy-seq plist) :private) + if (use-package-plist-delete (copy-sequence plist) :private) collect (format "%s" (cons name it)) else collect (symbol-name name))) From 2d0f250241e18906c3d0395d59155a8150a30143 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 20:24:35 -0500 Subject: [PATCH 3713/4235] lang/ess: fix keymaps prefixes They may not be loaded when bound. --- modules/lang/ess/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 420e000d5..4626ca4dd 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -44,10 +44,10 @@ "F" #'ess-eval-function-and-go "f" #'ess-eval-function ;; predefined keymaps - "h" ess-doc-map - "x" ess-extra-map - "p" ess-r-package-dev-map - "v" ess-dev-map + "h" 'ess-doc-map + "x" 'ess-extra-map + "p" 'ess-r-package-dev-map + "v" 'ess-dev-map ;; noweb :prefix "c" "C" #'ess-eval-chunk-and-go From 81e30dc13c1bcc8e20633ee0b5a29a80c33f58b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Feb 2019 20:32:37 -0500 Subject: [PATCH 3714/4235] lang/ess: add basic evil support to ess-help-mode --- modules/lang/ess/config.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 4626ca4dd..42d337541 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -17,7 +17,20 @@ (set-lookup-handlers! '(ess-r-mode ess-julia-mode) :documentation #'ess-display-help-on-object) + (set-evil-initial-state! 'ess-r-help-mode 'normal) + (set-eval-handler! 'ess-help-mode #'ess-eval-region-and-go) + (set-eval-handler! 'ess-r-help-mode #'ess-eval-region-and-go) + (map! (:after ess-help + :map ess-help-mode-map + :n "q" #'kill-this-buffer + :n "Q" #'ess-kill-buffer-and-go + :n "K" #'ess-display-help-on-object + :n "go" #'ess-display-help-in-browser + :n "gO" #'ess-display-help-apropos + :n "gv" #'ess-display-vignettes + :m "]]" #'ess-skip-to-next-section + :m "[[" #'ess-skip-to-previous-section :map ess-doc-map "h" #'ess-display-help-on-object "p" #'ess-R-dv-pprint From 93132e43c19bdbe671a6e8cc9eef663b5fb70da8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 01:16:09 -0500 Subject: [PATCH 3715/4235] Fix window--display-buffer advice #1173 Forgot to have the :filter-return advice return the window (whoops!) --- modules/ui/popup/autoload/popup.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 44b9e2185..4c7002225 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -586,7 +586,8 @@ Accepts the same arguments as `display-buffer-in-side-window'. You must set This was not so until recent Emacs 27 builds, where it causes breaking errors. This advice ensures backwards compatibility for Emacs <= 26 users." (when (and (windowp window) display-buffer-mark-dedicated) - (set-window-dedicated-p window display-buffer-mark-dedicated))) + (set-window-dedicated-p window display-buffer-mark-dedicated)) + window) (advice-add #'window--display-buffer :filter-return #'+popup*set-window-dedicated)) (unless EMACS26+ From 1e864df8cd157130a973f552b2a73529e4365ece Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Sun, 17 Feb 2019 00:04:51 +0800 Subject: [PATCH 3716/4235] move vterm's popup rule to vterm layer --- modules/emacs/vterm/config.el | 2 ++ modules/ui/popup/config.el | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/emacs/vterm/config.el b/modules/emacs/vterm/config.el index 221e7cdb8..83f5eac5e 100644 --- a/modules/emacs/vterm/config.el +++ b/modules/emacs/vterm/config.el @@ -16,6 +16,8 @@ ;; Automatically kill buffer when vterm exits. (add-hook 'vterm-exit-functions #'(lambda (buffer) (when buffer (kill-buffer buffer)))) + (when (featurep! :ui popup +defaults) + (set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0)) (when (featurep! :feature evil) (evil-set-initial-state 'vterm-mode 'insert) ;; Those keys are commonly needed by terminals. diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 088912b1c..cb49d1e8d 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -144,8 +144,6 @@ prevent the popup(s) from messing up the UI (or vice versa)." :size 0.45 :vslot -3 :ttl 0 :quit t :select t) ("^\\*doom \\(?:term\\|eshell\\)" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) - ("^vterm" - :size 0.25 :vslot -4 :select t :quit nil :ttl 0) ("^\\*doom:" :vslot -5 :size 0.35 :size bottom :autosave t :select t :modeline t :quit nil) ("^\\*\\(?:\\(?:Pp E\\|doom e\\)val\\)" From d6496fc1683c33ad7de23201b57a782330460d7a Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Sun, 17 Feb 2019 00:03:36 +0800 Subject: [PATCH 3717/4235] rename vterm from :emacs to :tools --- init.example.el | 2 +- modules/{emacs => tools}/vterm/autoload.el | 2 +- modules/{emacs => tools}/vterm/config.el | 2 +- modules/{emacs => tools}/vterm/doctor.el | 2 +- modules/{emacs => tools}/vterm/packages.el | 2 +- modules/{emacs => tools}/vterm/readme.org | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename modules/{emacs => tools}/vterm/autoload.el (94%) rename modules/{emacs => tools}/vterm/config.el (97%) rename modules/{emacs => tools}/vterm/doctor.el (89%) rename modules/{emacs => tools}/vterm/packages.el (78%) rename modules/{emacs => tools}/vterm/readme.org (98%) diff --git a/init.example.el b/init.example.el index aecc8e67c..093fb033a 100644 --- a/init.example.el +++ b/init.example.el @@ -60,7 +60,6 @@ hideshow ; basic code-folding support imenu ; an imenu sidebar and searchable code index ;;term ; terminals in Emacs - ;;vterm ; another terminals in Emacs vc ; version-control and Emacs, sitting in a tree :tools @@ -80,6 +79,7 @@ ;;tmux ; an API for interacting with tmux ;;upload ; map local to remote projects via ssh/ftp ;;wakatime + ;;vterm ; another terminals in Emacs :lang ;;assembly ; assembly for fun or debugging diff --git a/modules/emacs/vterm/autoload.el b/modules/tools/vterm/autoload.el similarity index 94% rename from modules/emacs/vterm/autoload.el rename to modules/tools/vterm/autoload.el index 4d3f7311d..52f663a73 100644 --- a/modules/emacs/vterm/autoload.el +++ b/modules/tools/vterm/autoload.el @@ -1,4 +1,4 @@ -;;; emacs/vterm/autoload.el -*- lexical-binding: t; -*- +;;; tools/vterm/autoload.el -*- lexical-binding: t; -*- ;;;###autoload (defun +vterm/open (arg) diff --git a/modules/emacs/vterm/config.el b/modules/tools/vterm/config.el similarity index 97% rename from modules/emacs/vterm/config.el rename to modules/tools/vterm/config.el index 83f5eac5e..61ced658c 100644 --- a/modules/emacs/vterm/config.el +++ b/modules/tools/vterm/config.el @@ -1,4 +1,4 @@ -;;; emacs/vterm/config.el -*- lexical-binding: t; -*- +;;; tools/vterm/config.el -*- lexical-binding: t; -*- (def-package! vterm :load-path (lambda () (list (concat doom-packages-dir "/quelpa/build/vterm"))) diff --git a/modules/emacs/vterm/doctor.el b/modules/tools/vterm/doctor.el similarity index 89% rename from modules/emacs/vterm/doctor.el rename to modules/tools/vterm/doctor.el index 8f8837fc8..8d9a04b33 100644 --- a/modules/emacs/vterm/doctor.el +++ b/modules/tools/vterm/doctor.el @@ -1,4 +1,4 @@ -;;; emacs/vterm/doctor.el -*- lexical-binding: t; -*- +;;; tools/vterm/doctor.el -*- lexical-binding: t; -*- (unless (executable-find "vterm-ctrl") (warn! "Couldn't find libvterm library. Please install it on your system")) diff --git a/modules/emacs/vterm/packages.el b/modules/tools/vterm/packages.el similarity index 78% rename from modules/emacs/vterm/packages.el rename to modules/tools/vterm/packages.el index f584b6c74..9e6a8a837 100644 --- a/modules/emacs/vterm/packages.el +++ b/modules/tools/vterm/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- -;;; emacs/vterm/packages.el +;;; tools/vterm/packages.el (package! vterm :recipe (:fetcher github :repo "akermu/emacs-libvterm")) diff --git a/modules/emacs/vterm/readme.org b/modules/tools/vterm/readme.org similarity index 98% rename from modules/emacs/vterm/readme.org rename to modules/tools/vterm/readme.org index 3a8b13ba8..7cc22e34a 100644 --- a/modules/emacs/vterm/readme.org +++ b/modules/tools/vterm/readme.org @@ -1,4 +1,4 @@ -#+TITLE: emacs/vterm +#+TITLE: tools/vterm #+DATE: January 16, 2019 #+SINCE: {replace with next tagged release version} #+STARTUP: inlineimages From b8da259d908f28d6a97b4ef44127b72e17d4f11d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 13:12:28 -0500 Subject: [PATCH 3718/4235] app/email: trim maildirs config maildir-expanded-prefix and maildir-default-prefix were already set to their defaults, and the action-text change seemed arbitrary. Indirectly fixes #1175 --- modules/app/email/config.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/app/email/config.el b/modules/app/email/config.el index f0b69ff4a..4a59d9648 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -118,11 +118,7 @@ :after mu4e :config (mu4e-maildirs-extension) - (setq mu4e-maildirs-extension-title nil - ;; mu4e-maildirs-extension-ignored-regex "^*~*" - mu4e-maildirs-extension-action-text "\t[g] Update mail and index\n" - mu4e-maildirs-extension-maildir-expanded-prefix "-" - mu4e-maildirs-extension-maildir-default-prefix "|")) + (setq mu4e-maildirs-extension-title nil)) (def-package! org-mu4e From ffcfde71d92a758fb11ed5a44b66485592a6e11e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 16:54:26 -0500 Subject: [PATCH 3719/4235] tools/magit: replace magithub with forge #1174 And we're back to using the latest version of magit, which should resolve void-function and void-variable errors that we were avioding in 33ef9034. --- modules/tools/magit/config.el | 72 +++++++++++---------------------- modules/tools/magit/packages.el | 13 +----- 2 files changed, 26 insertions(+), 59 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 882a637bd..a09d3bbe1 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -1,34 +1,27 @@ ;;; tools/magit/config.el -*- lexical-binding: t; -*- -(defvar +magit-hub-enable-by-default nil - "Whether or not to enable magithub features for all projects by default. Must -be set before `magithub' (and `magit') is loaded.") - -(defvar +magit-hub-features t - "What features to initialize when `magithub' is loaded. Set this to `t' to -load everything, and nil to load nothing. See `magithub-feature-list' to see -what features are available.") - - ;; ;; Packages (def-package! magit :commands magit-file-delete - :defer-incrementally (dash f s with-editor git-commit package) + :defer-incrementally (dash f s with-editor git-commit package eieio lv transient) :init (setq magit-auto-revert-mode nil) ; we already use `global-auto-revert-mode' :config - (setq magit-revision-show-gravatars '("^Author: " . "^Commit: ") - magit-diff-refine-hunk t ; show word-granularity on selected hunk - magit-display-buffer-function #'+magit-display-buffer + (setq transient-default-level 5 + transient-levels-file (concat doom-etc-dir "transient/levels") + transient-values-file (concat doom-etc-dir "transient/values") + transient-history-file (concat doom-etc-dir "transient/history") + magit-revision-show-gravatars '("^Author: " . "^Commit: ") + magit-diff-refine-hunk t) ; show granular diffs in selected hunk + + ;; Leave it to `+magit-display-buffer' and `+magit-display-popup-buffer' to + ;; manage popup windows. + (setq magit-display-buffer-function #'+magit-display-buffer magit-popup-display-buffer-action '((+magit-display-popup-buffer))) - (set-popup-rule! "^\\(?:\\*magit\\|magit:\\)" :ignore t) - (magit-define-popup-option 'magit-rebase-popup - ?S "Sign using gpg" "--gpg-sign=" #'magit-read-gpg-secret-key) - ;; so magit buffers can be switched to (except for process buffers) (defun +magit-buffer-p (buf) (with-current-buffer buf @@ -44,6 +37,19 @@ what features are available.") (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) +(def-package! forge + ;; we defer loading even further because forge's dependencies will try to + ;; compile emacsql, which is a slow and blocking operation. + :after-call magit-status + :init + (setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite")) + :config + ;; All forge list modes are derived from `forge-topic-list-mode' + (map! :map forge-topic-list-mode-map :n "q" #'kill-this-buffer) + (set-popup-rule! "^\\*?[0-9]+:\\(?:new-\\|[0-9]+$\\)" :size 0.45 :modeline t :ttl 0 :quit nil) + (set-popup-rule! "^\\*\\(?:[^/]+/[^ ]+ #[0-9]+\\*$\\|Issues\\|Pull-Requests\\|forge\\)" :ignore t)) + + (def-package! magit-todos :after magit :config @@ -53,29 +59,6 @@ what features are available.") (magit-todos-mode +1)) -(def-package! magithub - :after magit - :unless (featurep! :tools magit +forge) - :preface - ;; Magithub is not well-behaved, so this needs to be set early - (setq magithub-dir (concat doom-etc-dir "magithub/")) - :init - (setq magithub-clone-default-directory "~/" - magithub-preferred-remote-method 'clone_url) - :config - (unless +magit-hub-enable-by-default - ;; Disable magit by default. Can be enabled through magithub settings popup, - ;; or setting `+magit-hub-enable-by-default'. - (advice-add #'magithub-enabled-p :override #'+magit*hub-enabled-p) - ;; I don't use `magithub-settings--simple' to redefine this because it - ;; changes the order of settings. Obnoxious, but the alternative is even - ;; more so. - (advice-add #'magithub-settings--format-magithub.enabled - :override #'+magit*hub-settings--format-magithub.enabled)) - (when +magit-hub-features - (magithub-feature-autoinject +magit-hub-features))) - - (def-package! magit-gitflow :hook (magit-mode . turn-on-magit-gitflow)) @@ -98,10 +81,3 @@ what features are available.") (evil-define-key* evil-magit-state git-rebase-mode-map "gj" #'git-rebase-move-line-down "gk" #'git-rebase-move-line-up))) - - -(def-package! forge - :when (featurep! :tools magit +forge) - :after magit - :init - (setq forge-database-file (concat doom-etc-dir "forge/forge-database.sqlite"))) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index 93d158c0c..c02d5dcc7 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,18 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -;; Magit introduced some breaking changes in a recent commit that breaks -;; evil-magit and magithub. -;; TODO Once those packages have updated, we'll go back to tracking magit HEAD -(when (package! magit :recipe - (:fetcher github - :repo "magit/magit" - :commit "78114e6425d5e7d6eaa7712c845f28694aa7faeb" - :files ("lisp/magit" "lisp/magit*.el" "lisp/git-rebase.el"))) +(when (package! magit) + (package! forge) (package! magit-gitflow) - (if (featurep! +forge) - (package! forge) - (package! magithub)) (package! magit-todos) (when (featurep! :feature evil +everywhere) (package! evil-magit))) From 5b48c21762cec6878462c868551b19e2afb0e53c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 17:00:31 -0500 Subject: [PATCH 3720/4235] app/irc: fix & improve feedback from =irc #1121 Hopefully prevents =irc from nooping. --- modules/app/irc/autoload/irc.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/app/irc/autoload/irc.el b/modules/app/irc/autoload/irc.el index 98846bb40..442f05b77 100644 --- a/modules/app/irc/autoload/irc.el +++ b/modules/app/irc/autoload/irc.el @@ -20,13 +20,17 @@ If INHIBIT-WORKSPACE (the universal argument) is non-nil, don't spawn a new workspace for it." (interactive "P") - (if (+workspace-exists-p +irc--workspace-name) - (+workspace-switch +irc--workspace-name) - (and (+irc-setup-wconf inhibit-workspace) - (if circe-network-options - (cl-loop for network in circe-network-options - collect (circe (car network))) - (quiet! (call-interactively #'circe)))))) + (cond ((and (featurep! :feature workspaces) + (+workspace-exists-p +irc--workspace-name)) + (+workspace-switch +irc--workspace-name)) + ((not (+irc-setup-wconf inhibit-workspace)) + (user-error "Couldn't start up a workspace for IRC"))) + (if (doom-buffers-in-mode 'circe-mode (buffer-list) t) + (message "Circe buffers are already open") + (if circe-network-options + (cl-loop for network in circe-network-options + collect (circe (car network))) + (call-interactively #'circe)))) ;;;###autoload (defun +irc/connect (&optional inhibit-workspace) From a72a0e6a62d9405784429527649e1ed3fa91334a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 18:08:26 -0500 Subject: [PATCH 3721/4235] Replace magithub with forge Should also fix void-function/void-variable errors caused by evil-magit depending on the newer version of magit (#1174). Also introduces a redesign of the SPC g prefix. --- modules/config/default/+emacs-bindings.el | 4 +- modules/config/default/+evil-bindings.el | 72 ++++++++++++++--------- modules/emacs/vc/autoload/evil.el | 4 +- modules/emacs/vc/autoload/vc.el | 17 +----- modules/feature/evil/+commands.el | 6 +- 5 files changed, 52 insertions(+), 51 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 2688a976a..ea0ef4ee9 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -102,8 +102,8 @@ :desc "Use Temp Template" "e" #'aya-expand) ;; Version control bindings (:prefix ("v" . "versioning") - :desc "Browse issues tracker" "i" #'+vc/git-browse-issues - :desc "Browse remote" "o" #'+vc/git-browse + :desc "Browse issues tracker" "i" #'forge-browse-issues + :desc "Browse remote" "o" #'forge-browse-remote :desc "Diff current file" "d" #'magit-diff-buffer-file :desc "Git revert hunk" "r" #'git-gutter:revert-hunk :desc "Git stage file" "S" #'magit-stage-file diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index c40766a95..6a9c7650c 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -604,36 +604,52 @@ :desc "Yank filename" "y" #'+default/yank-buffer-filename) (:prefix ("g" . "git") + :desc "Git revert file" "R" #'vc-revert (:when (featurep! :ui vc-gutter) - :desc "Git revert hunk" "r" #'git-gutter:revert-hunk - :desc "Git stage hunk" "s" #'git-gutter:stage-hunk - :desc "Git time machine" "t" #'git-timemachine-toggle - :desc "Next hunk" "]" #'git-gutter:next-hunk - :desc "Previous hunk" "[" #'git-gutter:previous-hunk) - (:when (featurep! :emacs vc) - :desc "Browse issues tracker" "I" #'+vc/git-browse-issues - :desc "Browse remote" "o" #'+vc/git-browse - :desc "Git revert file" "R" #'vc-revert) + :desc "Git revert hunk" "r" #'git-gutter:revert-hunk + :desc "Git stage hunk" "s" #'git-gutter:stage-hunk + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Jump to next hunk" "]" #'git-gutter:next-hunk + :desc "Jump to previous hunk" "[" #'git-gutter:previous-hunk) (:when (featurep! :tools magit) - :desc "Magit blame" "b" #'magit-blame-addition - :desc "Magit commit" "c" #'magit-commit-create - :desc "Magit clone" "C" #'+magit/clone - :desc "Magit dispatch" "d" #'magit-dispatch-popup - :desc "Magit find-file" "f" #'magit-find-file - :desc "Magit status" "g" #'magit-status - :desc "Magit file delete" "x" #'magit-file-delete - :desc "MagitHub dispatch" "h" #'magithub-dispatch-popup - :desc "Initialize repo" "i" #'magit-init - :desc "Magit buffer log" "l" #'magit-log-buffer-file - :desc "List repositories" "L" #'magit-list-repositories - :desc "Git stage file" "S" #'magit-stage-file - :desc "Git unstage file" "U" #'magit-unstage-file - :desc "Magit push popup" "p" #'magit-push-popup - :desc "Magit pull popup" "P" #'magit-pull-popup - (:when (featurep! :tools magit +forge) - :desc "Forge dispatch" "F" #'forge-dispatch)) - (:when (featurep! :tools gist) - :desc "List gists" "G" #'+gist:list)) + :desc "Magit dispatch" "/" #'magit-dispatch + :desc "Forge dispatch" "'" #'forge-dispatch + :desc "Magit status" "g" #'magit-status + :desc "Magit file delete" "x" #'magit-file-delete + :desc "Magit blame" "B" #'magit-blame-addition + :desc "Magit clone" "C" #'+magit/clone + :desc "Magit fetch" "F" #'magit-fetch + :desc "Magit buffer log" "L" #'magit-log + :desc "Git stage file" "S" #'magit-stage-file + :desc "Git unstage file" "U" #'magit-unstage-file + (:prefix ("f" . "find") + :desc "Find file" "f" #'magit-find-file + :desc "Find gitconfig file" "g" #'magit-find-git-config-file + :desc "Find commit" "c" #'magit-show-commit + :desc "Find issue" "i" #'forge-visit-issue + :desc "Find pull request" "p" #'forge-visit-pullreq) + (:prefix ("o" . "open in browser") + :desc "Browse region or line" "." #'+vc/git-browse-region-or-line + :desc "Browse remote" "r" #'forge-browse-remote + :desc "Browse commit" "c" #'forge-browse-commit + :desc "Browse an issue" "i" #'forge-browse-issue + :desc "Browse a pull request" "p" #'forge-browse-pullreq + :desc "Browse issues" "I" #'forge-browse-issues + :desc "Browse pull requests" "P" #'forge-browse-pullreqs) + (:prefix ("l" . "list") + (:when (featurep! :tools gist) + :desc "List gists" "g" #'+gist:list) + :desc "List repositories" "r" #'magit-list-repositories + :desc "List submodules" "s" #'magit-list-submodules + :desc "List issues" "i" #'forge-list-issues + :desc "List pull requests" "p" #'forge-list-pullreqs + :desc "List notifications" "n" #'forge-list-notifications) + (:prefix ("c" . "create") + :desc "Initialize repo" "r" #'magit-init + :desc "Clone repo" "R" #'+magit/clone + :desc "Commit" "c" #'magit-commit-create + :desc "Issue" "i" #'forge-create-issue + :desc "Pull request" "p" #'forge-create-pullreq))) (:prefix ("h" . "help") :desc "What face" "'" #'doom/what-face diff --git a/modules/emacs/vc/autoload/evil.el b/modules/emacs/vc/autoload/evil.el index 15bcc1b1e..7803f94c9 100644 --- a/modules/emacs/vc/autoload/evil.el +++ b/modules/emacs/vc/autoload/evil.el @@ -3,6 +3,6 @@ ;;;###autoload (autoload '+vc:git-browse "emacs/vc/autoload/evil" nil t) (evil-define-command +vc:git-browse (bang) - "Ex interface to `+vc/git-browse'." + "Ex interface to `+vc/git-browse-region-or-line'." (interactive "") - (+vc/git-browse bang)) + (+vc/git-browse-region-or-line bang)) diff --git a/modules/emacs/vc/autoload/vc.el b/modules/emacs/vc/autoload/vc.el index 8994a7dad..e2efb9bdc 100644 --- a/modules/emacs/vc/autoload/vc.el +++ b/modules/emacs/vc/autoload/vc.el @@ -13,7 +13,7 @@ (defvar git-link-open-in-browser) ;;;###autoload -(defun +vc/git-browse (arg) +(defun +vc/git-browse-region-or-line (&optional arg) "Open the website for the current version controlled file. Fallback to repository root." (interactive "P") @@ -23,21 +23,6 @@ repository root." (let ((git-link-open-in-browser (not arg))) (git-link (git-link--select-remote) beg end)))) -;;;###autoload -(defun +vc/git-browse-issues (arg) - "Open the issues page for current repo." - (interactive "P") - (let ((url (format "%s/issues" (+vc-git-root-url)))) - (if arg - (message "%s" (kill-new url)) - (browse-url url)))) - -;;;###autoload -(defun +vc/git-browse-pulls () - "Open the pull requests page for current repo." - (interactive) - (browse-url (format "%s/pulls" (+vc-git-root-url)))) - ;;;###autoload (defun +vc*update-header-line (revision) "Show revision details in the header-line, instead of the minibuffer. diff --git a/modules/feature/evil/+commands.el b/modules/feature/evil/+commands.el index 10151fb8f..bfe2b4342 100644 --- a/modules/feature/evil/+commands.el +++ b/modules/feature/evil/+commands.el @@ -85,9 +85,9 @@ This command understands vim file modifiers (like %:p:h). See ;;; GIT (evil-ex-define-cmd "gist" #'+gist:send) ; send current buffer/region to gist (evil-ex-define-cmd "gistl" #'+gist:list) ; list gists by user -(evil-ex-define-cmd "gbrowse" #'+vc:git-browse) ; show file in github/gitlab -(evil-ex-define-cmd "gissues" #'+vc/git-browse-issues) ; show github issues -(evil-ex-define-cmd "git" #'magit-status) ; open magit status window +(evil-ex-define-cmd "gbrowse" #'+vc:git-browse) ; show file/region in github/gitlab +(evil-ex-define-cmd "gissues" #'forge-browse-issues) ; show github issues +(evil-ex-define-cmd "git" #'magit-status) ; open magit status window (evil-ex-define-cmd "gstage" #'magit-stage) (evil-ex-define-cmd "gunstage" #'magit-unstage) (evil-ex-define-cmd "gblame" #'magit-blame) From 3b1305b66fceb1bd64617548cb89c024b2dc4a0e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 19:03:36 -0500 Subject: [PATCH 3722/4235] lang/lua: lazy load lua-mode --- modules/lang/lua/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index ee123bbde..e1c536878 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -8,6 +8,7 @@ ;; Major modes (def-package! lua-mode + :defer t :init ;; lua-indent-level defaults to 3 otherwise. Madness. (setq lua-indent-level tab-width) From 66131747d3330e5bc9007fd7e1ea47ebcf075199 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Feb 2019 19:04:45 -0500 Subject: [PATCH 3723/4235] Update evil-collection-mode-list --- modules/feature/evil/+everywhere.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index cca3472e8..31abcf6a1 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -24,7 +24,6 @@ comint company custom - dired eldoc elisp-mode ert @@ -68,6 +67,8 @@ variable for an explanation of the defaults (in comments). See diff-mode dired doc-view + ebib + edbi edebug ediff eglot @@ -89,9 +90,11 @@ variable for an explanation of the defaults (in comments). See git-timemachine go-mode grep - help guix + hackernews helm + help + helpful ibuffer image image-dired @@ -139,6 +142,7 @@ variable for an explanation of the defaults (in comments). See simple slime (term term ansi-term multi-term) + tetris tide transmission typescript-mode @@ -148,9 +152,10 @@ variable for an explanation of the defaults (in comments). See vdiff view vlf - which-key + w3m wdired wgrep + which-key woman xref youtube-dl @@ -187,7 +192,6 @@ variable for an explanation of the defaults (in comments). See (after! helpful (evil-define-key* 'normal helpful-mode-map "o" #'ace-link-help - "q" #'quit-window "]l" #'forward-button "[l" #'backward-button)) From e6debe55f1b2bee1eda62405c6911197feee8362 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Feb 2019 14:44:23 -0500 Subject: [PATCH 3724/4235] Switch to main repo for all-the-icons The font-lock-fix branch was merged. --- core/packages.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/packages.el b/core/packages.el index 72a218963..0e16d3e3f 100644 --- a/core/packages.el +++ b/core/packages.el @@ -8,9 +8,7 @@ (package! ns-auto-titlebar)) ;; core-ui.el -(package! all-the-icons - :recipe (:fetcher github :repo "ubolonton/all-the-icons.el" - :branch "font-lock-fix" :files (:defaults "data"))) +(package! all-the-icons) (package! hide-mode-line) (package! highlight-indentation) (package! highlight-numbers) From 3dcd253f71e32664f0636eb79a1f8177eb3b1f78 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Feb 2019 18:49:22 -0500 Subject: [PATCH 3725/4235] Remove emacs/ediff & move to core-ui --- core/core-ui.el | 20 +++++++++++++++++++- init.example.el | 1 - modules/emacs/ediff/config.el | 17 ----------------- 3 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 modules/emacs/ediff/config.el diff --git a/core/core-ui.el b/core/core-ui.el index 9eca1a770..d0fe3ba96 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -162,7 +162,25 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") ;; ;; Built-in packages -(def-package! hl-line ; built-in +(def-package! ediff + :defer t + :init + (setq ediff-diff-options "-w" ; turn off whitespace checking + ediff-split-window-function #'split-window-horizontally + ediff-window-setup-function #'ediff-setup-windows-plain) + :config + ;; Restore window config after quitting ediff + (defun doom|ediff-save-wconf () + (setq +ediff--saved-wconf (current-window-configuration))) + (add-hook 'ediff-before-setup-hook #'doom|ediff-save-wconf) + + (defun doom|ediff-restore-wconf () + (set-window-configuration +ediff--saved-wconf)) + (add-hook 'ediff-quit-hook #'doom|ediff-restore-wconf 'append) + (add-hook 'ediff-suspend-hook #'doom|ediff-restore-wconf 'append)) + + +(def-package! hl-line ;; Highlights the current line :hook ((prog-mode text-mode conf-mode) . hl-line-mode) :config diff --git a/init.example.el b/init.example.el index 8789117f9..7d6afa03f 100644 --- a/init.example.el +++ b/init.example.el @@ -54,7 +54,6 @@ ;;+ranger ; bringing the goodness of ranger to dired ;;+icons ; colorful icons for dired-mode ) - ediff ; comparing files in Emacs electric ; smarter, keyword-based electric-indent ;;eshell ; a consistent, cross-platform shell (WIP) hideshow ; basic code-folding support diff --git a/modules/emacs/ediff/config.el b/modules/emacs/ediff/config.el deleted file mode 100644 index cc9130e27..000000000 --- a/modules/emacs/ediff/config.el +++ /dev/null @@ -1,17 +0,0 @@ -;;; emacs/ediff/config.el -*- lexical-binding: t; -*- - -;; `ediff' -(setq ediff-diff-options "-w" ; turn off whitespace checking - ediff-split-window-function #'split-window-horizontally - ediff-window-setup-function #'ediff-setup-windows-plain) - -;; Restore window config after quitting ediff -(defvar +ediff--saved-wconf nil) - -(defun +ediff|save-wconf () - (setq +ediff--saved-wconf (current-window-configuration))) -(defun +ediff|restore-wconf () - (set-window-configuration +ediff--saved-wconf)) - -(add-hook 'ediff-before-setup-hook #'+ediff|save-wconf) -(add-hook! :append '(ediff-quit-hook ediff-suspend-hook) #'+ediff|restore-wconf) From e0519098d98fb114660fbc092972d711b6864853 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Feb 2019 22:12:52 -0500 Subject: [PATCH 3726/4235] (Almost) always highlight non-default indentation The purpose of this is to highlight indentation characters that betray your indent-tabs-mode setting. i.e. If you're using tab indentation, highlight space indentation. If you're using spaces, highlight tab characters. --- core/core-ui.el | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index d0fe3ba96..9a2b0ee58 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -459,19 +459,23 @@ instead). Meant for `kill-buffer-query-functions'." (not (eq (current-buffer) (doom-fallback-buffer)))) (defun doom|highlight-non-default-indentation () - "Highlight whitespace that doesn't match your `indent-tabs-mode' setting." + "Highlight whitespace that doesn't match your `indent-tabs-mode' setting. + +e.g. If you indent with spaces by default, tabs will be highlighted. If you +indent with tabs, spaces at BOL are highlighted. + +Does nothing if `whitespace-mode' is already active or the current major mode is +derived from `special-mode'." (unless (or (bound-and-true-p global-whitespace-mode) (bound-and-true-p whitespace-mode) - (eq indent-tabs-mode (default-value 'indent-tabs-mode)) (eq major-mode 'fundamental-mode) (derived-mode-p 'special-mode)) (require 'whitespace) (set (make-local-variable 'whitespace-style) - (if (or (bound-and-true-p whitespace-mode) - (bound-and-true-p whitespace-newline-mode)) - (cl-union (if indent-tabs-mode '(spaces space-mark) '(tabs tab-mark)) + (if (bound-and-true-p whitespace-newline-mode) + (cl-union (if indent-tabs-mode '(indentation) '(tabs tab-mark)) whitespace-style) - `(face ,@(if indent-tabs-mode '(spaces space-mark) '(tabs tab-mark)) + `(face ,@(if indent-tabs-mode '(indentation) '(tabs tab-mark)) trailing-lines tail))) (whitespace-mode +1))) From 7d0caf3efdeb8f3c1aa002e42c88e8284eb7a370 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 00:01:58 -0500 Subject: [PATCH 3727/4235] New editor/fold module Extracted from feature/evil and emacs/hideshow. --- core/core-modules.el | 7 +- init.example.el | 2 +- modules/config/default/+evil-bindings.el | 11 ++- modules/editor/fold/README.org | 32 ++++++++ .../folds.el => editor/fold/autoload/evil.el} | 71 +++++++----------- .../fold/autoload/fold.el} | 38 +++++----- modules/editor/fold/config.el | 73 +++++++++++++++++++ modules/editor/fold/packages.el | 5 ++ modules/emacs/hideshow/config.el | 38 ---------- modules/feature/evil/config.el | 28 ------- modules/feature/evil/packages.el | 1 - 11 files changed, 169 insertions(+), 137 deletions(-) create mode 100644 modules/editor/fold/README.org rename modules/{feature/evil/autoload/folds.el => editor/fold/autoload/evil.el} (70%) rename modules/{emacs/hideshow/autoload.el => editor/fold/autoload/fold.el} (63%) create mode 100644 modules/editor/fold/config.el create mode 100644 modules/editor/fold/packages.el delete mode 100644 modules/emacs/hideshow/config.el diff --git a/core/core-modules.el b/core/core-modules.el index 0e8db1500..11248578f 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -12,9 +12,10 @@ "A list of module root directories. Order determines priority.") (defconst doom-obsolete-modules - '((:tools (rotate-text (:editor rotate-text))) - (:emacs (electric-indent (:emacs electric))) - (:feature (version-control (:emacs vc) (:ui vc-gutter)))) + '((:feature (version-control (:emacs vc) (:ui vc-gutter))) + (:tools (rotate-text (:editor rotate-text))) + (:emacs (electric-indent (:emacs electric)) + (hideshow (:editor fold)))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . MODULES). E.g. diff --git a/init.example.el b/init.example.el index 7d6afa03f..bbcb124b9 100644 --- a/init.example.el +++ b/init.example.el @@ -43,6 +43,7 @@ window-select ; visually switch windows :editor + fold ; (nigh) universal code folding ;;(format +onsave) ; automated prettiness ;;lispy ; vim for lisp, for people who dont like vim multiple-cursors ; editing in many places at once @@ -56,7 +57,6 @@ ) electric ; smarter, keyword-based electric-indent ;;eshell ; a consistent, cross-platform shell (WIP) - hideshow ; basic code-folding support imenu ; an imenu sidebar and searchable code index ;;term ; terminals in Emacs vc ; version-control and Emacs, sitting in a tree diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 6a9c7650c..76ab8c82b 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -33,6 +33,16 @@ (and (featurep! :completion company +tng) (+company-has-completion-p)) '+company/complete) + :nv [tab] (general-predicate-dispatch nil + (derived-mode-p 'magit-mode) + 'magit-section-toggle + (derived-mode-p 'deadgrep-mode) + 'deadgrep-toggle-file-results + (and (featurep! :editor fold) + (save-excursion (end-of-line) (invisible-p (point)))) + '+fold/toggle + (fboundp 'evilmi-jump-items) + 'evilmi-jump-items) ;; Smarter newlines :i [remap newline] #'newline-and-indent ; auto-indent on newline @@ -92,7 +102,6 @@ :nv "C-a" #'evil-numbers/inc-at-pt :nv "C-S-a" #'evil-numbers/dec-at-pt :nv "C-SPC" #'+evil/fold-toggle - :nv [tab] #'+evil/matchit-or-toggle-fold :v "gp" #'+evil/paste-preserve-register :v "@" #'+evil:apply-macro ;; repeat in visual mode (FIXME buggy) diff --git a/modules/editor/fold/README.org b/modules/editor/fold/README.org new file mode 100644 index 000000000..55c93ff78 --- /dev/null +++ b/modules/editor/fold/README.org @@ -0,0 +1,32 @@ +#+TITLE: editor/fold +#+DATE: February 17, 2019 +#+SINCE: v2.1 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[Description][Description]] + - [[Module Flags][Module Flags]] + - [[Plugins][Plugins]] +- [[Prerequisites][Prerequisites]] +- [[Features][Features]] +- [[Configuration][Configuration]] +- [[Troubleshooting][Troubleshooting]] + +* Description +This module marries hideshow, vimish-fold and outline-minor-mode to bring you +marker, indent and syntax-based code folding for as many languages as possible. + +** Module Flags +This module provides no flags. + +** Plugins ++ evil-vimish-fold* + +* Prerequisites +This module has no prerequisites. + +* TODO Features + +* TODO Configuration + +* TODO Troubleshooting diff --git a/modules/feature/evil/autoload/folds.el b/modules/editor/fold/autoload/evil.el similarity index 70% rename from modules/feature/evil/autoload/folds.el rename to modules/editor/fold/autoload/evil.el index cbbf53009..c6190807b 100644 --- a/modules/feature/evil/autoload/folds.el +++ b/modules/editor/fold/autoload/evil.el @@ -1,4 +1,5 @@ -;;; feature/evil/autoload/folds.el -*- lexical-binding: t; -*- +;;; editor/fold/autoload/evil.el -*- lexical-binding: t; -*- +;;;###if (featurep! :feature evil) (require 'hideshow) @@ -9,17 +10,17 @@ ;; ;; So this is my effort to combine them. -(defun +evil--vimish-fold-p () +(defun +fold--vimish-fold-p () (and (featurep 'vimish-fold) (cl-some #'vimish-fold--vimish-overlay-p (overlays-at (point))))) -(defun +evil--outline-fold-p () +(defun +fold--outline-fold-p () (and (or (bound-and-true-p outline-minor-mode) (derived-mode-p 'outline-mode)) (outline-on-heading-p))) -(defun +evil--hideshow-fold-p () +(defun +fold--hideshow-fold-p () (hs-minor-mode +1) (save-excursion (ignore-errors @@ -30,52 +31,52 @@ ;; ;; Code folding -(defmacro +evil-from-eol (&rest body) +(defmacro +fold-from-eol (&rest body) "Perform action after moving to the end of the line." `(save-excursion (end-of-line) ,@body)) ;;;###autoload -(defun +evil/fold-toggle () +(defun +fold/toggle () "Toggle the fold at point. Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion - (cond ((+evil--vimish-fold-p) (vimish-fold-toggle)) - ((+evil--hideshow-fold-p) (+evil-from-eol (hs-toggle-hiding))) - ((+evil--outline-fold-p) + (cond ((+fold--vimish-fold-p) (vimish-fold-toggle)) + ((+fold--hideshow-fold-p) (+fold-from-eol (hs-toggle-hiding))) + ((+fold--outline-fold-p) (cl-letf (((symbol-function #'outline-hide-subtree) (symbol-function #'outline-hide-entry))) (outline-toggle-children)))))) ;;;###autoload -(defun +evil/fold-open () +(defun +fold/open () "Open the folded region at point. Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion - (cond ((+evil--vimish-fold-p) (vimish-fold-unfold)) - ((+evil--hideshow-fold-p) (+evil-from-eol (hs-show-block))) - ((+evil--outline-fold-p) + (cond ((+fold--vimish-fold-p) (vimish-fold-unfold)) + ((+fold--hideshow-fold-p) (+fold-from-eol (hs-show-block))) + ((+fold--outline-fold-p) (outline-show-children) (outline-show-entry))))) ;;;###autoload -(defun +evil/fold-close () +(defun +fold/close () "Close the folded region at point. Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion - (cond ((+evil--vimish-fold-p) (vimish-fold-refold)) - ((+evil--hideshow-fold-p) (+evil-from-eol (hs-hide-block))) - ((+evil--outline-fold-p) (outline-hide-subtree))))) + (cond ((+fold--vimish-fold-p) (vimish-fold-refold)) + ((+fold--hideshow-fold-p) (+fold-from-eol (hs-hide-block))) + ((+fold--outline-fold-p) (outline-hide-subtree))))) ;;;###autoload -(defun +evil/fold-open-all (&optional level) +(defun +fold/open-all (&optional level) "Open folds at LEVEL (or all folds if LEVEL is nil)." (interactive (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) @@ -92,7 +93,7 @@ Targets `vimmish-fold', `hideshow' and `outline' folds." (outline-show-all))))) ;;;###autoload -(defun +evil/fold-close-all (&optional level) +(defun +fold/close-all (&optional level) "Close folds at LEVEL (or all folds if LEVEL is nil)." (interactive (list (if current-prefix-arg (prefix-numeric-value current-prefix-arg)))) @@ -104,7 +105,7 @@ Targets `vimmish-fold', `hideshow' and `outline' folds." (hs-hide-level-recursive (1- level) (point-min) (point-max)) (hs-hide-all))))) -(defun +evil--invisible-points (count) +(defun +fold--invisible-points (count) (let (points) (save-excursion (catch 'abort @@ -121,14 +122,14 @@ Targets `vimmish-fold', `hideshow' and `outline' folds." points)) ;;;###autoload -(defun +evil/fold-next (count) +(defun +fold/next (count) "Jump to the next vimish fold, outline heading or folded region." (interactive "p") (cl-loop with orig-pt = (point) for fn in (list (lambda () (when hs-block-start-regexp - (car (+evil--invisible-points count)))) + (car (+fold--invisible-points count)))) (lambda () (if (> count 0) (evil-vimish-fold/next-fold count) @@ -143,29 +144,7 @@ Targets `vimmish-fold', `hideshow' and `outline' folds." (goto-char orig-pt)))) ;;;###autoload -(defun +evil/fold-previous (count) +(defun +fold/previous (count) "Jump to the previous vimish fold, outline heading or folded region." (interactive "p") - (+evil/fold-next (- count))) - - -;; -;; Misc - -;;;###autoload -(defun +evil/matchit-or-toggle-fold () - "Do what I mean. - -If in a magit-status buffer, use `magit-section-toggle'. -If on a folded element, unfold it. -Otherwise, jump to the matching delimiter with `evilmi-jump-items'." - (interactive) - (ignore-errors - (call-interactively - (cond ((derived-mode-p 'magit-mode) - #'magit-section-toggle) - ((derived-mode-p 'deadgrep-mode) - #'deadgrep-toggle-file-results) - ((+evil-from-eol (invisible-p (point))) - #'+evil/fold-toggle) - (#'evilmi-jump-items))))) + (+fold/next (- count))) diff --git a/modules/emacs/hideshow/autoload.el b/modules/editor/fold/autoload/fold.el similarity index 63% rename from modules/emacs/hideshow/autoload.el rename to modules/editor/fold/autoload/fold.el index a2bc009e5..e631c31c5 100644 --- a/modules/emacs/hideshow/autoload.el +++ b/modules/editor/fold/autoload/fold.el @@ -1,32 +1,32 @@ -;;; emacs/hideshow/autoload.el -*- lexical-binding: t; -*- +;;; editor/fold/autoload/fold.el -*- lexical-binding: t; -*- -(defface +hideshow-folded-face +(defface +fold-hideshow-folded-face `((t (:inherit font-lock-comment-face :weight light))) "Face to hightlight `hideshow' overlays." :group 'doom-themes) ;;;###autoload -(defun +hideshow*ensure-mode (&rest _) +(defun +fold-hideshow*ensure-mode (&rest _) "Ensure hs-minor-mode is enabled." (unless (bound-and-true-p hs-minor-mode) (hs-minor-mode +1))) ;;;###autoload -(defun +hideshow-haml-forward-sexp (arg) +(defun +fold-hideshow-haml-forward-sexp (arg) (haml-forward-sexp arg) (move-beginning-of-line 1)) ;;;###autoload -(defun +hideshow-forward-block-by-indent (_arg) +(defun +fold-hideshow-forward-block-by-indent (_arg) (let ((start (current-indentation))) (forward-line) (unless (= start (current-indentation)) - (let ((range (+hideshow-indent-range))) + (let ((range (+fold-hideshow-indent-range))) (goto-char (cadr range)) (end-of-line))))) ;;;###autoload -(defun +hideshow-set-up-overlay (ov) +(defun +fold-hideshow-set-up-overlay (ov) (when (eq 'code (overlay-get ov 'hs)) (when (featurep 'vimish-fold) (overlay-put @@ -36,22 +36,22 @@ 'empty-line 'vimish-fold-fringe)))) (overlay-put - ov 'display (propertize " [...] " 'face '+hideshow-folded-face)))) + ov 'display (propertize " [...] " 'face '+fold-hideshow-folded-face)))) ;; ;; Indentation detection -(defun +hideshow--empty-line-p () +(defun +fold--hideshow-empty-line-p () (string= "" (string-trim (thing-at-point 'line)))) -(defun +hideshow--geq-or-empty-p () - (or (+hideshow--empty-line-p) (>= (current-indentation) base))) +(defun +fold--hideshow-geq-or-empty-p () + (or (+fold--hideshow-empty-line-p) (>= (current-indentation) base))) -(defun +hideshow--g-or-empty-p () - (or (+hideshow--empty-line-p) (> (current-indentation) base))) +(defun +fold--hideshow-g-or-empty-p () + (or (+fold--hideshow-empty-line-p) (> (current-indentation) base))) -(defun +hideshow--seek (start direction before skip predicate) +(defun +fold--hideshow-seek (start direction before skip predicate) "Seeks forward (if direction is 1) or backward (if direction is -1) from start, until predicate fails. If before is nil, it will return the first line where predicate fails, otherwise it returns the last line where predicate holds." @@ -70,7 +70,7 @@ the last line where predicate holds." (unless before (setq pt (point-at-bol))))) pt))) -(defun +hideshow-indent-range (&optional point) +(defun +fold-hideshow-indent-range (&optional point) "Return the point at the begin and end of the text block with the same (or greater) indentation. If `point' is supplied and non-nil it will return the begin and end of the block surrounding point." @@ -80,8 +80,8 @@ begin and end of the block surrounding point." (let ((base (current-indentation)) (begin (point)) (end (point))) - (setq begin (+hideshow--seek begin -1 t nil #'+hideshow--geq-or-empty-p) - begin (+hideshow--seek begin 1 nil nil #'+hideshow--g-or-empty-p) - end (+hideshow--seek end 1 t nil #'+hideshow--geq-or-empty-p) - end (+hideshow--seek end -1 nil nil #'+hideshow--empty-line-p)) + (setq begin (+fold--hideshow-seek begin -1 t nil #'+fold--hideshow-geq-or-empty-p) + begin (+fold--hideshow-seek begin 1 nil nil #'+fold--hideshow-g-or-empty-p) + end (+fold--hideshow-seek end 1 t nil #'+fold--hideshow-geq-or-empty-p) + end (+fold--hideshow-seek end -1 nil nil #'+fold--hideshow-empty-line-p)) (list begin end base)))) diff --git a/modules/editor/fold/config.el b/modules/editor/fold/config.el new file mode 100644 index 000000000..f14221525 --- /dev/null +++ b/modules/editor/fold/config.el @@ -0,0 +1,73 @@ +;;; editor/fold/config.el -*- lexical-binding: t; -*- + +(when (featurep! :feature evil) + ;; Add vimish-fold, outline-mode & hideshow support to folding commands + (define-key! 'global + [remap evil-toggle-fold] #'+fold/toggle + [remap evil-close-fold] #'+fold/close + [remap evil-open-fold] #'+fold/open + [remap evil-open-fold-rec] #'+fold/open + [remap evil-close-folds] #'+fold/close-all + [remap evil-open-folds] #'+fold/open-all) + (evil-define-key* 'motion 'global + "zj" #'+fold/next + "zk" #'+fold/previous)) + + +;; +;; Packages + +(def-package! hideshow ; built-in + :defer t + :init + ;; Ensure `hs-minor-mode' is active when triggering these commands + (advice-add #'hs-toggle-hiding :before #'+fold-hideshow*ensure-mode) + (advice-add #'hs-hide-block :before #'+fold-hideshow*ensure-mode) + (advice-add #'hs-hide-level :before #'+fold-hideshow*ensure-mode) + (advice-add #'hs-show-all :before #'+fold-hideshow*ensure-mode) + (advice-add #'hs-hide-all :before #'+fold-hideshow*ensure-mode) + :config + (setq hs-hide-comments-when-hiding-all nil + ;; Nicer code-folding overlays (with fringe indicators) + hs-set-up-overlay #'+fold-hideshow-set-up-overlay) + + ;; extra folding support for more languages + (unless (assq 't hs-special-modes-alist) + (setq hs-special-modes-alist + (append + '((vimrc-mode "{{{" "}}}" "\"") + (yaml-mode "\\s-*\\_<\\(?:[^:]+\\)\\_>" + "" + "#" + +fold-hideshow-forward-block-by-indent nil) + (haml-mode "[#.%]" "\n" "/" +fold-hideshow-haml-forward-sexp nil) + (ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]" + "end\\|[]}]" + "#\\|=begin" + ruby-forward-sexp) + (enh-ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]" + "end\\|[]}]" + "#\\|=begin" + enh-ruby-forward-sexp nil) + (matlab-mode "if\\|switch\\|case\\|otherwise\\|while\\|for\\|try\\|catch" + "end" + nil (lambda (_arg) (matlab-forward-sexp)))) + hs-special-modes-alist + '((t)))))) + + +(def-package! evil-vimish-fold + :when (featurep! :feature evil) + :commands (evil-vimish-fold/next-fold evil-vimish-fold/previous-fold + evil-vimish-fold/delete evil-vimish-fold/delete-all + evil-vimish-fold/create evil-vimish-fold/create-line) + :init + (setq vimish-fold-dir (concat doom-cache-dir "vimish-fold/") + vimish-fold-indication-mode 'right-fringe) + (evil-define-key* 'motion 'global + "zf" #'evil-vimish-fold/create + "zF" #'evil-vimish-fold/create-line + "zd" #'vimish-fold-delete + "zE" #'vimish-fold-delete-all) + :config + (vimish-fold-global-mode +1)) diff --git a/modules/editor/fold/packages.el b/modules/editor/fold/packages.el new file mode 100644 index 000000000..40b63a215 --- /dev/null +++ b/modules/editor/fold/packages.el @@ -0,0 +1,5 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/fold/packages.el + +(when (featurep! :feature evil) + (package! evil-vimish-fold)) diff --git a/modules/emacs/hideshow/config.el b/modules/emacs/hideshow/config.el deleted file mode 100644 index b68fb1157..000000000 --- a/modules/emacs/hideshow/config.el +++ /dev/null @@ -1,38 +0,0 @@ -;;; emacs/hideshow/config.el -*- lexical-binding: t; -*- - -(after! hideshow ; built-in - (setq hs-hide-comments-when-hiding-all nil - ;; Nicer code-folding overlays (with fringe indicators) - hs-set-up-overlay #'+hideshow-set-up-overlay) - - ;; extra folding support for more languages - (unless (assq 't hs-special-modes-alist) - (setq hs-special-modes-alist - (append - '((vimrc-mode "{{{" "}}}" "\"") - (yaml-mode "\\s-*\\_<\\(?:[^:]+\\)\\_>" - "" - "#" - +hideshow-forward-block-by-indent nil) - (haml-mode "[#.%]" "\n" "/" +hideshow-haml-forward-sexp nil) - (ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]" - "end\\|[]}]" - "#\\|=begin" - ruby-forward-sexp) - (enh-ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]" - "end\\|[]}]" - "#\\|=begin" - enh-ruby-forward-sexp nil) - (matlab-mode "if\\|switch\\|case\\|otherwise\\|while\\|for\\|try\\|catch" - "end" - nil (lambda (_arg) (matlab-forward-sexp)))) - hs-special-modes-alist - '((t)))))) - - -;; Ensure `hs-minor-mode' is active when triggering these commands -(advice-add #'hs-toggle-hiding :before #'+hideshow*ensure-mode) -(advice-add #'hs-hide-block :before #'+hideshow*ensure-mode) -(advice-add #'hs-hide-level :before #'+hideshow*ensure-mode) -(advice-add #'hs-show-all :before #'+hideshow*ensure-mode) -(advice-add #'hs-hide-all :before #'+hideshow*ensure-mode) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 1ad6ee1b7..48cbcb6d4 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -75,18 +75,6 @@ line with a linewise comment.") ;; `evil-delete' in wgrep buffers. (define-key wgrep-mode-map [remap evil-delete] #'+evil-delete)) - ;; Add vimish-fold, outline-mode & hideshow support to folding commands - (define-key! 'global - [remap evil-toggle-fold] #'+evil/fold-toggle - [remap evil-close-fold] #'+evil/fold-close - [remap evil-open-fold] #'+evil/fold-open - [remap evil-open-fold-rec] #'+evil/fold-open - [remap evil-close-folds] #'+evil/fold-close-all - [remap evil-open-folds] #'+evil/fold-open-all) - (evil-define-key* 'motion 'global - "zj" #'+evil/fold-next - "zk" #'+evil/fold-previous) - (defun +evil|disable-highlights () "Disable ex search buffer highlights." (when (evil-ex-hl-active-p 'evil-ex-search) @@ -323,22 +311,6 @@ the new algorithm is confusing, like in python or ruby." :config (global-evil-surround-mode 1)) -(def-package! evil-vimish-fold - :commands (evil-vimish-fold/next-fold evil-vimish-fold/previous-fold - evil-vimish-fold/delete evil-vimish-fold/delete-all - evil-vimish-fold/create evil-vimish-fold/create-line) - :init - (setq vimish-fold-dir (concat doom-cache-dir "vimish-fold/") - vimish-fold-indication-mode 'right-fringe) - (evil-define-key* 'motion 'global - "zf" #'evil-vimish-fold/create - "zF" #'evil-vimish-fold/create-line - "zd" #'vimish-fold-delete - "zE" #'vimish-fold-delete-all) - :config - (vimish-fold-global-mode +1)) - - ;; Without `evil-visualstar', * and # grab the word at point and search, no ;; matter what mode you're in. I want to be able to visually select a region and ;; search for other occurrences of it. diff --git a/modules/feature/evil/packages.el b/modules/feature/evil/packages.el index d0973bd8b..050378306 100644 --- a/modules/feature/evil/packages.el +++ b/modules/feature/evil/packages.el @@ -14,7 +14,6 @@ (package! evil-textobj-anyblock) (package! evil-snipe) (package! evil-surround) -(package! evil-vimish-fold) (package! evil-visualstar) (package! exato) From ec55884aaefc9db8e4051e9c6fcc9c7a0c83edf1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 00:09:57 -0500 Subject: [PATCH 3728/4235] General, minor reformatting & refactor --- core/core-editor.el | 7 ++++--- init.example.el | 2 +- modules/lang/clojure/config.el | 3 ++- modules/tools/magit/config.el | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index b804ed81a..189ca880b 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -72,15 +72,16 @@ fundamental-mode) for performance sake." ;; -;; Built-in plugins +;; Extra file extensions to support (push '("/LICENSE\\'" . text-mode) auto-mode-alist) -(electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. + +;; +;; Built-in plugins (def-package! server :when (display-graphic-p) - :defer 1 :after-call (pre-command-hook after-find-file) :config (when-let* ((name (getenv "EMACS_SERVER_NAME"))) diff --git a/init.example.el b/init.example.el index bbcb124b9..c72d6b6e1 100644 --- a/init.example.el +++ b/init.example.el @@ -68,8 +68,8 @@ ;;ein ; tame Jupyter notebooks with emacs ;;gist ; interacting with github gists ;;macos ; MacOS-specific commands - ;;make ; run make tasks from Emacs ;;magit ; a git porcelain for Emacs + ;;make ; run make tasks from Emacs ;;password-store ; password manager for nerds ;;pdf ; pdf enhancements ;;prodigy ; FIXME managing external services & code builders diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 1e79a20f4..5ddf6850c 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -85,7 +85,8 @@ "c" #'cider-repl-clear-buffer))) (:when (featurep! :feature evil +everywhere) - :map cider-repl-mode-map :i [S-return] #'cider-repl-newline-and-indent + :map cider-repl-mode-map + :i [S-return] #'cider-repl-newline-and-indent :map cider-repl-history-mode-map :i [return] #'cider-repl-history-insert-and-quit :i "q" #'cider-repl-history-quit diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index a09d3bbe1..0060dd2fb 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -38,7 +38,7 @@ (def-package! forge - ;; we defer loading even further because forge's dependencies will try to + ;; We defer loading even further because forge's dependencies will try to ;; compile emacsql, which is a slow and blocking operation. :after-call magit-status :init From 6956525f794fac5f0d04dd90a22c7d52bff0c4f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 00:52:29 -0500 Subject: [PATCH 3729/4235] I silenced the byte compiler, what happened next will blow your mind Top 10 incredible ways to silence the byte compiler The byte compiler just wouldn't shut up. You wouldn't believe what happened next. 40 hot singles in your area are waiting for the byte compiler to shut up. 20 INSANE life hacks to put an end to the byte compiler's tyranny. (DEFINITELY NOT CLICKBAIT) --- modules/editor/multiple-cursors/config.el | 4 +--- modules/tools/magit/config.el | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 425916126..8f70046f3 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -56,9 +56,7 @@ :evil-mc t)) -(def-package! multiple-cursors - :defer t - :config +(after! multiple-cursors (setq mc/list-file (concat doom-etc-dir "mc-lists.el")) ;; TODO multiple-cursors config for Emacs users? diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 0060dd2fb..5550cf5d2 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -76,8 +76,8 @@ "%" #'magit-gitflow-popup) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) - (setcar (assoc (car key) evil-magit-rebase-commands-w-descriptions) - (cdr key))) + (when-let* ((desc (assoc (car key) evil-magit-rebase-commands-w-descriptions))) + (setcar desc (cdr key)))) (evil-define-key* evil-magit-state git-rebase-mode-map "gj" #'git-rebase-move-line-down "gk" #'git-rebase-move-line-up))) From 4437d80133b55b18041da26dd1571df274b3e49d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 01:58:50 -0500 Subject: [PATCH 3730/4235] Add dos2unix & unix2dos conversion commands --- core/autoload/editor.el | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 45335b37a..5fe041437 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -281,6 +281,19 @@ selected, then the current line." (setq beg (line-beginning-position) end (line-end-position))) (comment-or-uncomment-region beg end))) +;;;###autoload +(defun doom/dos2unix () + "Convert the current buffer to a Unix file encoding." + (interactive) + (set-buffer-file-coding-system 'undecided-unix nil)) + +;;;###autoload +(defun doom/unix2dos () + "Convert the current buffer to a DOS file encoding." + (interactive) + (set-buffer-file-coding-system 'undecided-dos nil)) + + ;; ;; Advice From 94b16cba6c56c89e541cf7e4b51cf7cc8a40fbe7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 01:56:38 -0500 Subject: [PATCH 3731/4235] Standardize REPL commands & improve SPC o r - SPC o r now prompts for a REPL to open when none was found for the current buffer. - REPL handlers must now follow the naming convention "*/open*-repl". e.g. +python/open-ipython-repl, +emacs-lisp/open-repl, etc. - +eval/open-repl has been split in two: - +eval/open-repl-other-window - +eval/open-repl-same-window --- modules/config/default/+evil-bindings.el | 13 +++--- modules/feature/eval/README.org | 12 +++--- modules/feature/eval/autoload/evil.el | 2 +- modules/feature/eval/autoload/repl.el | 52 ++++++++++++++++++----- modules/feature/eval/autoload/settings.el | 2 +- modules/lang/emacs-lisp/autoload.el | 2 +- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/haskell/autoload.el | 14 +++--- modules/lang/haskell/config.el | 2 +- modules/lang/javascript/README.org | 2 +- modules/lang/javascript/autoload.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/lua/autoload.el | 2 +- modules/lang/lua/config.el | 2 +- modules/lang/python/autoload/python.el | 6 +-- modules/lang/python/config.el | 2 +- modules/lang/sh/README.org | 12 +++--- modules/lang/sh/autoload.el | 2 +- modules/lang/sh/config.el | 2 +- 19 files changed, 83 insertions(+), 52 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 76ab8c82b..5fcc83fe9 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -590,7 +590,7 @@ :desc "Jump to definition" "d" #'+lookup/definition :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region :desc "Format buffer/region" "f" #'+format/region-or-buffer - :desc "Open REPL" "r" #'+eval/open-repl + :desc "Open REPL" "r" #'+eval/open-repl-other-window :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace :desc "List errors" "x" #'flycheck-list-errors) @@ -700,11 +700,12 @@ :desc "Org capture" "x" #'org-capture) (:prefix ("o" . "open") - :desc "Org agenda" "a" #'org-agenda - :desc "Default browser" "b" #'browse-url-of-file - :desc "Debugger" "d" #'+debug/open - :desc "REPL" "r" #'+eval/open-repl - :desc "Dired" "-" #'dired-jump + :desc "Org agenda" "a" #'org-agenda + :desc "Default browser" "b" #'browse-url-of-file + :desc "Debugger" "d" #'+debug/open + :desc "REPL" "r" #'+eval/open-repl-other-window + :desc "REPL (same window)" "R" #'+eval/open-repl-same-window + :desc "Dired" "-" #'dired-jump (:when (featurep! :ui neotree) :desc "Project sidebar" "p" #'+neotree/open :desc "Find file in project sidebar" "P" #'+neotree/find-this-file) diff --git a/modules/feature/eval/README.org b/modules/feature/eval/README.org index cfdad3535..f52e6c1a3 100644 --- a/modules/feature/eval/README.org +++ b/modules/feature/eval/README.org @@ -52,7 +52,8 @@ Invoked via: + =SPC o r= or ~:repl~ will open a REPL in a popup window. =C-u SPC o r= or ~:repl!~ will open a REPL in the current window. If a REPL is already open and a selection is active, it will be sent to the REPL. -+ ~M-x +eval/open-repl~ ++ ~M-x +eval/open-repl-other-window~ ++ ~M-x +eval/open-repl-same-window~ + ~M-x +eval/send-region-to-repl~ while a selection (and REPL) is active * Configuration @@ -60,8 +61,9 @@ Invoked via: REPLs are defined for most languages Doom supports. Check that language module's README.org to see if it does (and if it requires additional setup). -To use them, you may use ~M-x +eval/open-repl~, ~:repl~ (for evil users) or the -default binding: =SPC o r=. These will open a REPL in a popup window. +To use them, you may use ~M-x +eval/open-repl-other-window~, ~M-x ++eval/open-repl-same-window~, ~:repl~ (for evil users) or the default binding: +=SPC o r=. These will open a REPL in a popup window. #+begin_quote You can simply call that mode's REPL command manually. e.g. ~M-x ielm~, but @@ -75,12 +77,12 @@ FUNCTION should return a repl buffer. Any window changes in this function are ignored, then the REPL is opened in a popup window. #+BEGIN_SRC emacs-lisp -(defun +lua/repl () +(defun +lua/open-repl () (interactive) (lua-start-process "lua" "lua") (pop-to-buffer lua-process-buffer)) -(set-repl-handler! 'lua-mode #'+lua/repl) +(set-repl-handler! 'lua-mode #'+lua/open-repl) #+END_SRC ** Change how code is evaluated in a major mode diff --git a/modules/feature/eval/autoload/evil.el b/modules/feature/eval/autoload/evil.el index aa76f73f1..279b41e32 100644 --- a/modules/feature/eval/autoload/evil.el +++ b/modules/feature/eval/autoload/evil.el @@ -19,5 +19,5 @@ :move-point nil (interactive "") (if (evil-normal-state-p) - (+eval/open-repl bang) + (+eval/open-repl-other-window bang) (+eval/send-region-to-repl beg end bang))) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 3bb2335d2..3bc558b8a 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -6,7 +6,7 @@ (define-minor-mode +eval-repl-mode "A minor mode for REPL buffers.") -(defun +eval--ensure-in-repl-buffer (&optional command same-window-p) +(defun +eval--ensure-in-repl-buffer (&optional command other-window-p) (maphash (lambda (key buffer) (unless (buffer-live-p buffer) (remhash key +eval-repl-buffers))) @@ -16,7 +16,7 @@ (buffer (gethash key +eval-repl-buffers))) (cl-check-type buffer (or buffer null)) (unless (eq buffer (current-buffer)) - (funcall (if same-window-p #'switch-to-buffer #'pop-to-buffer) + (funcall (if other-window-p #'pop-to-buffer #'switch-to-buffer) (if (buffer-live-p buffer) buffer (setq buffer @@ -36,19 +36,51 @@ (point-max))) buffer))) +(defun +eval-open-repl (prompt-p other-window-p) + (let ((command (cdr (assq major-mode +eval-repls)))) + (when (or (not command) prompt-p) + (let* ((choices (or (cl-loop for sym being the symbols + for sym-name = (symbol-name sym) + if (string-match "^\\(?:\\+\\)?\\([^/]+\\)/open-\\(?:\\(.+\\)-\\)?repl$" sym-name) + collect + (format "%s (%s)" + (match-string-no-properties 1 sym-name) + (or (match-string-no-properties 2 sym-name) "default"))) + (user-error "There are no known available REPLs"))) + (choice (or (completing-read "Open a REPL for: " choices) + (user-error "Aborting"))) + (choice-split (split-string choice " " t)) + (module (car choice-split)) + (repl (substring (cadr choice-split) 1 -1))) + (setq command + (intern-soft + (format "+%s/open-%srepl" module + (if (string= repl "default") + "" + repl)))))) + (unless (commandp command) + (error "Couldn't find a valid REPL for %s" major-mode)) + (when (+eval--ensure-in-repl-buffer command other-window-p) + (when (bound-and-true-p evil-mode) + (call-interactively #'evil-append-line)) + t))) + ;;;###autoload -(defun +eval/open-repl (&optional same-window-p) +(defun +eval/open-repl-same-window (&optional arg) "Opens (or reopens) the REPL associated with the current major-mode and place the cursor at the prompt. -If SAME-WINDOW-P is non-nil, open REPL in current window." +If ARG (universal argument), prompt for a specific REPL to open." (interactive "P") - (if-let* ((command (cdr (assq major-mode +eval-repls)))) - (when (+eval--ensure-in-repl-buffer command same-window-p) - (when (bound-and-true-p evil-mode) - (call-interactively #'evil-append-line)) - t) - (user-error "No REPL is defined for %s" major-mode))) + (+eval-open-repl arg)) + +;;;###autoload +(defun +eval/open-repl-other-window (&optional arg) + "Does `+eval/open-repl', but in a popup window. + +If ARG (universal argument), prompt for a specific REPL to open." + (interactive "P") + (+eval-open-repl arg t)) ;;;###autoload (defun +eval/send-region-to-repl (beg end &optional auto-execute-p) diff --git a/modules/feature/eval/autoload/settings.el b/modules/feature/eval/autoload/settings.el index d6fb3249f..0cf618514 100644 --- a/modules/feature/eval/autoload/settings.el +++ b/modules/feature/eval/autoload/settings.el @@ -6,7 +6,7 @@ ;;;###autoload (defvar +eval-repls nil "An alist mapping major modes to plists that describe REPLs. Used by -`+eval/open-repl' and filled with the `:repl' setting.") +`+eval/open-repl-other-window' and filled with the `:repl' setting.") ;;;###autodef (defun set-repl-handler! (modes command) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 482ace7c7..0a21cc4cf 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -79,7 +79,7 @@ library/userland functions" ;; Commands ;;;###autoload -(defun +emacs-lisp/repl () +(defun +emacs-lisp/open-repl () "Open the Emacs Lisp REPL (`ielm')." (interactive) (pop-to-buffer diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 3539f6279..856a9cb61 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -14,7 +14,7 @@ (add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) (after! elisp-mode - (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) + (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/open-repl) (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set-lookup-handlers! 'emacs-lisp-mode :definition #'elisp-def diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el index d3c5edb17..d3c36a20b 100644 --- a/modules/lang/haskell/autoload.el +++ b/modules/lang/haskell/autoload.el @@ -1,14 +1,10 @@ ;;; lang/haskell/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +haskell-repl-buffer (&optional arg) - "Returns the appropriate Haskell REPL buffer." - (if (featurep! +intero) - (intero-repl-buffer arg) - (haskell-session-interactive-buffer (haskell-session)))) - -;;;###autoload -(defun +haskell/repl (&optional arg) +(defun +haskell/open-repl (&optional arg) "Opens a Haskell REPL." (interactive "P") - (display-buffer (+haskell-repl-buffer arg))) + (display-buffer + (if (featurep! +intero) + (intero-repl-buffer arg) + (haskell-session-interactive-buffer (haskell-session))))) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 28daa4e64..836475a33 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -16,7 +16,7 @@ interactive-haskell-mode)) (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) - (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell-repl-buffer) + (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell/open-repl) (add-to-list 'completion-ignored-extensions ".hi") diff --git a/modules/lang/javascript/README.org b/modules/lang/javascript/README.org index e184bbb0e..2bb3f4b6c 100644 --- a/modules/lang/javascript/README.org +++ b/modules/lang/javascript/README.org @@ -34,5 +34,5 @@ sudo pacman --needed --noconfirm -S nodejs npm ** Commands | command | key / ex command | description | |----------------------------------+------------------+------------------------------------------------------------| -| ~+javascript/repl~ | =:repl= | Open the NodeJS REPL (or send the current selection to it) | +| ~+javascript/open-repl~ | =:repl= | Open the NodeJS REPL (or send the current selection to it) | | ~+javascript/skewer-this-buffer~ | =SPC m S= | Attaches a browser to the current buffer | diff --git a/modules/lang/javascript/autoload.el b/modules/lang/javascript/autoload.el index 260767c10..330aef52a 100644 --- a/modules/lang/javascript/autoload.el +++ b/modules/lang/javascript/autoload.el @@ -36,7 +36,7 @@ ignore the cache." ;; Commands ;;;###autoload -(defun +javascript/repl () +(defun +javascript/open-repl () "Open a Javascript REPL. Meaning either `skewer-repl', if any of the skewer-*-mode's are enabled, or `nodejs-repl' otherwise." (interactive) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d93d1bd7f..d125e96e3 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -52,7 +52,7 @@ mode-name "JS2") (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) - (set-repl-handler! 'js2-mode #'+javascript/repl) + (set-repl-handler! 'js2-mode #'+javascript/open-repl) (map! :map js2-mode-map :localleader diff --git a/modules/lang/lua/autoload.el b/modules/lang/lua/autoload.el index d244c2000..0100d1808 100644 --- a/modules/lang/lua/autoload.el +++ b/modules/lang/lua/autoload.el @@ -1,7 +1,7 @@ ;;; lang/lua/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +lua/repl () +(defun +lua/open-repl () "Open Lua REPL." (interactive) (lua-start-process "lua" "lua") diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index e1c536878..ea6882fa1 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -15,7 +15,7 @@ :config (set-lookup-handlers! 'lua-mode :documentation 'lua-search-documentation) (set-electric! 'lua-mode :words '("else" "end")) - (set-repl-handler! 'lua-mode #'+lua/repl) + (set-repl-handler! 'lua-mode #'+lua/open-repl) (set-company-backend! 'lua-mode '(company-lua company-yasnippet))) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 796223ccd..af9d19724 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -4,7 +4,7 @@ "TODO") ;;;###autoload -(defun +python/repl () +(defun +python/open-repl () "Open the Python REPL." (interactive) (unless python-shell-interpreter @@ -28,7 +28,7 @@ (interactive) (let ((python-shell-interpreter "ipython") (python-shell-interpreter-args +python-jupyter-repl-args)) - (+python/repl))) + (+python/open-repl))) ;;;###autoload (defun +python/open-jupyter-repl () @@ -37,7 +37,7 @@ (add-to-list 'python-shell-completion-native-disabled-interpreters "jupyter") (let ((python-shell-interpreter "jupyter") (python-shell-interpreter-args (format "console %s" +python-jupyter-repl-args))) - (+python/repl))) + (+python/open-repl))) (defun +python--extract-version (prefix str) (when str diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 681486b91..30bac7222 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -26,7 +26,7 @@ called.") :config (set-env! "PYTHONPATH" "PYENV_ROOT" "ANACONDA_HOME") (set-electric! 'python-mode :chars '(?:)) - (set-repl-handler! 'python-mode #'+python/repl) + (set-repl-handler! 'python-mode #'+python/open-repl) (set-pretty-symbols! 'python-mode ;; Functional diff --git a/modules/lang/sh/README.org b/modules/lang/sh/README.org index 8ee01d3d9..5bfd3c502 100644 --- a/modules/lang/sh/README.org +++ b/modules/lang/sh/README.org @@ -8,15 +8,15 @@ This module adds support for shell scripting languages. + REPL support * Table of Contents :TOC: -- [[#install][Install]] -- [[#appendix][Appendix]] - - [[#commands][Commands]] +- [[Install][Install]] +- [[Appendix][Appendix]] + - [[Commands][Commands]] * Install This module has no dependencies. * Appendix ** Commands -| command | key / ex command | description | -|------------+------------------+-------------------------------------------------------| -| ~+sh/repl~ | =:repl= | Open a terminal (or send the current selection to it) | +| command | key / ex command | description | +|-----------------+------------------+-------------------------------------------------------| +| ~+sh/open-repl~ | =:repl= | Open a terminal (or send the current selection to it) | diff --git a/modules/lang/sh/autoload.el b/modules/lang/sh/autoload.el index ad78ecc4b..886cfcad1 100644 --- a/modules/lang/sh/autoload.el +++ b/modules/lang/sh/autoload.el @@ -27,7 +27,7 @@ (defvar sh-shell-file) ;;;###autoload -(defun +sh/repl () +(defun +sh/open-repl () "Open a shell REPL." (let* ((dest-sh (symbol-name sh-shell)) (sh-shell-file dest-sh)) diff --git a/modules/lang/sh/config.el b/modules/lang/sh/config.el index f6ae743b7..d71f81662 100644 --- a/modules/lang/sh/config.el +++ b/modules/lang/sh/config.el @@ -15,7 +15,7 @@ :mode ("/bspwmrc\\'" . sh-mode) :config (set-electric! 'sh-mode :words '("else" "elif" "fi" "done" "then" "do" "esac" ";;")) - (set-repl-handler! 'sh-mode #'+sh/repl) + (set-repl-handler! 'sh-mode #'+sh/open-repl) (setq sh-indent-after-continuation 'always) From 5e0385ed6b70efdd28b73466badf16bac987cf48 Mon Sep 17 00:00:00 2001 From: Luigy Leon Date: Mon, 18 Feb 2019 11:38:55 -0500 Subject: [PATCH 3732/4235] Add transient quit bindings this adds back the dismiss behavior of "popups" that was lost from the magit-popup -> transient update --- modules/config/default/+evil-bindings.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 5fcc83fe9..24a7a3502 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -445,11 +445,14 @@ ;;; :tools (map! (:when (featurep! :tools magit) - :after evil-magit - ;; fix conflicts with private bindings - :map (magit-status-mode-map magit-revision-mode-map) - "C-j" nil - "C-k" nil) + (:after evil-magit + ;; fix conflicts with private bindings + :map (magit-status-mode-map magit-revision-mode-map) + "C-j" nil + "C-k" nil) + (:map transient-map + [escape] #'transient-quit-one + "q" #'transient-quit-one)) (:when (featurep! :tools gist) :after gist From 9dd88e59244e72213d6a480f5b0be2bc4bea67a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 15:36:44 -0500 Subject: [PATCH 3733/4235] Move c electric disabler to config/default Because it is tied to the smartparens config, and we'll want this behavior to extend to all C-derived modes (like csharp and php modes). --- modules/config/default/config.el | 10 ++++++++++ modules/lang/cc/config.el | 10 +--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index c3e2b9c2a..67e431eae 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -64,6 +64,16 @@ (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) "" :actions '(insert) :post-handlers '(("| " "SPC"))) + ;; Disable electric keys in C modes because it interferes with smartparens + ;; and custom bindings. We'll do it ourselves (mostly). + (after! cc-mode + (c-toggle-electric-state -1) + (c-toggle-auto-newline -1) + (setq c-tab-always-indent nil + c-electric-flag nil) + (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) + (define-key c-mode-base-map key nil))) + ;; Expand C-style doc comment blocks. Must be done manually because some of ;; these languages use specialized (and deferred) parsers, whose state we ;; can't access while smartparens is doing its thing. diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index d51450c2a..9d5fe1b19 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -106,24 +106,16 @@ compilation database is present in the project.") c-style-alist)) ;;; Keybindings - ;; Disable electric keys because it interferes with smartparens and custom - ;; bindings. We'll do it ourselves (mostly). - (c-toggle-electric-state -1) - (c-toggle-auto-newline -1) - (setq c-tab-always-indent nil - c-electric-flag nil) - (dolist (key '("#" "}" "/" "*" ";" "," ":" "(" ")" "\177")) - (define-key c-mode-base-map key nil)) ;; Smartparens and cc-mode both try to autoclose angle-brackets intelligently. ;; The result isn't very intelligent (causes redundant characters), so just do ;; it ourselves. (define-key! c++-mode-map "<" nil ">" nil) - ;; ...and leave it to smartparens (sp-with-modes '(c++-mode objc-mode) (sp-local-pair "<" ">" :when '(+cc-sp-point-is-template-p +cc-sp-point-after-include-p) :post-handlers '(("| " "SPC")))) + (sp-with-modes '(c-mode c++-mode objc-mode java-mode) (sp-local-pair "/*!" "*/" :post-handlers '(("||\n[i]" "RET") ("[d-1]< | " "SPC"))))) From ed0a4bc5ca1c45e95f8a3c3b1b5f14dd8434c03b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 15:38:26 -0500 Subject: [PATCH 3734/4235] lang/csharp: add electric/autopairing behavior --- modules/config/default/config.el | 3 ++- modules/lang/csharp/config.el | 12 ++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 67e431eae..b562f8768 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -86,7 +86,8 @@ (delete-char 2)))) (sp-local-pair '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode - java-mode php-mode css-mode scss-mode less-css-mode stylus-mode) + csharp-mode java-mode php-mode css-mode scss-mode less-css-mode + stylus-mode) "/*" "*/" :actions '(insert) :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 5ba7960d7..cb20b4ed7 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -14,24 +14,29 @@ (add-hook! csharp-mode (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) + (set-electric! 'csharp-mode :chars '(?\n ?\})) (set-company-backend! 'csharp-mode 'company-omnisharp) - + (set-rotate-patterns! 'csharp-mode + :symbols '(("public" "protected" "private") + ("class" "struct"))) (set-lookup-handlers! 'csharp-mode :definition #'omnisharp-go-to-definition :references #'omnisharp-find-usages :documentation #'omnisharp-current-type-documentation) + (sp-local-pair 'csharp-mode "<" ">" + :when '(+csharp-sp-point-in-type-p) + :post-handlers '(("| " "SPC"))) + (map! :localleader :map omnisharp-mode-map "b" #'omnisharp-recompile - (:prefix "r" "i" #'omnisharp-fix-code-issue-at-point "u" #'omnisharp-fix-usings "r" #'omnisharp-rename "a" #'omnisharp-show-last-auto-complete-result "o" #'omnisharp-show-overloads-at-point) - (:prefix "f" "u" #'omnisharp-find-usages "i" #'omnisharp-find-implementations @@ -42,7 +47,6 @@ "r" #'omnisharp-navigate-to-region "ti" #'omnisharp-current-type-information "td" #'omnisharp-current-type-documentation) - (:prefix "t" "r" (λ! (omnisharp-unit-test "fixture")) "s" (λ! (omnisharp-unit-test "single")) From cee851f55bb95132aa7e763f3d56c0b350dbd3c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 15:39:08 -0500 Subject: [PATCH 3735/4235] Only activate whitespace-mode in editable buffers Otherwise whitespace-mode will disrupt fontification in special buffers, like helm and elfeed buffers. Indirectly addresses #1179 --- core/core-ui.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/core-ui.el b/core/core-ui.el index 9a2b0ee58..5af0bdffd 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -469,7 +469,9 @@ derived from `special-mode'." (unless (or (bound-and-true-p global-whitespace-mode) (bound-and-true-p whitespace-mode) (eq major-mode 'fundamental-mode) - (derived-mode-p 'special-mode)) + (eq (get major-mode 'mode-class) 'special) + (derived-mode-p 'special-mode) + buffer-read-only) (require 'whitespace) (set (make-local-variable 'whitespace-style) (if (bound-and-true-p whitespace-newline-mode) From e01781a3d9eed58aea8d5a090e0a62b3f80614e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 17:40:57 -0500 Subject: [PATCH 3736/4235] lang/csharp: minor refactor Ensure csharp-mode specific config can work without omnisharp. --- modules/lang/csharp/config.el | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index cb20b4ed7..59c4dc869 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -1,5 +1,17 @@ ;;; lang/csharp/config.el -*- lexical-binding: t; -*- +(after! csharp-mode + (add-hook 'csharp-mode-hook #'rainbow-delimiters-mode) + + (set-electric! 'csharp-mode :chars '(?\n ?\})) + (set-rotate-patterns! 'csharp-mode + :symbols '(("public" "protected" "private") + ("class" "struct"))) + (sp-local-pair 'csharp-mode "<" ">" + :when '(+csharp-sp-point-in-type-p) + :post-handlers '(("| " "SPC")))) + + (def-package! omnisharp :hook (csharp-mode . omnisharp-mode) :commands omnisharp-install-server @@ -14,20 +26,12 @@ (add-hook! csharp-mode (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) - (set-electric! 'csharp-mode :chars '(?\n ?\})) (set-company-backend! 'csharp-mode 'company-omnisharp) - (set-rotate-patterns! 'csharp-mode - :symbols '(("public" "protected" "private") - ("class" "struct"))) (set-lookup-handlers! 'csharp-mode :definition #'omnisharp-go-to-definition :references #'omnisharp-find-usages :documentation #'omnisharp-current-type-documentation) - (sp-local-pair 'csharp-mode "<" ">" - :when '(+csharp-sp-point-in-type-p) - :post-handlers '(("| " "SPC"))) - (map! :localleader :map omnisharp-mode-map "b" #'omnisharp-recompile From 883fcffc97d0d19495474269a62ed397ea15a01c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 17:42:21 -0500 Subject: [PATCH 3737/4235] lang/csharp: use omnisharp cleanup hook --- modules/lang/csharp/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/csharp/config.el b/modules/lang/csharp/config.el index 59c4dc869..cb8e40aae 100644 --- a/modules/lang/csharp/config.el +++ b/modules/lang/csharp/config.el @@ -24,7 +24,7 @@ (unless (doom-buffers-in-mode 'csharp-mode (buffer-list)) (omnisharp-stop-server))) (add-hook! csharp-mode - (add-hook 'kill-buffer-hook #'omnisharp-stop-server nil t)) + (add-hook 'kill-buffer-hook #'+csharp|cleanup-omnisharp-server nil t)) (set-company-backend! 'csharp-mode 'company-omnisharp) (set-lookup-handlers! 'csharp-mode From ecfe52f71cc604407c5ef15e8a2f73845af9d2c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 18:25:57 -0500 Subject: [PATCH 3738/4235] Fix +magit/clone to no longer use magithub --- modules/tools/magit/autoload.el | 49 ++++++++++++++++----------------- modules/tools/magit/config.el | 5 ++++ 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index a3b1d12b5..451b64e30 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -92,33 +92,30 @@ control in buffers." "History for `+magit/clone' prompt.") ;;;###autoload (defun +magit/clone (url-or-repo dir) - "Delegates to `magit-clone' or `magithub-clone' depending on the repo url -format." + "Like `magit-clone', but supports additional formats on top of absolute URLs: + ++ USER/REPO: assumes {`+magit-default-clone-url'}/USER/REPO ++ REPO: assumes {`+magit-default-clone-url'}/{USER}/REPO, where {USER} is + ascertained from your global gitconfig." (interactive - (progn - (require 'magithub) - (let* ((user (ghubp-username)) - (repo (read-from-minibuffer - "Clone repository (user/repo or url): " - (if user (concat user "/")) - nil nil '+magit-clone-history)) - (name (car (last (split-string repo "/" t))))) - (list repo - (read-directory-name - "Destination: " - magithub-clone-default-directory - name nil name))))) - (require 'magithub) - (if (string-match "^\\([^/]+\\)/\\([^/]+\\)$" url-or-repo) - (let ((repo `((owner (login . ,(match-string 1 url-or-repo))) - (name . ,(match-string 2 url-or-repo))))) - (and (or (magithub-request - (ghubp-get-repos-owner-repo repo)) - (let-alist repo - (user-error "Repository %s/%s does not exist" - .owner.login .name))) - (magithub-clone repo dir))) - (magit-clone url-or-repo dir))) + (let* ((user (ghub--username (ghub--host))) + (repo (read-from-minibuffer + "Clone repository (user/repo or url): " + (if user (concat user "/")) + nil nil '+magit-clone-history)) + (name (car (last (split-string repo "/" t))))) + (list repo + (read-directory-name + "Destination: " + magit-clone-default-directory + name nil name)))) + (magit-clone + (cond ((string-match-p "^[^/]+$" url-or-repo) + (format +magit-default-clone-url (ghub--username (ghub--host)) url-or-repo)) + ((string-match-p "^\\([^/]+\\)/\\([^/]+\\)/?$" url-or-repo) + (apply #'format +magit-default-clone-url (split-string url-or-repo "/" t))) + (url-or-repo)) + dir)) ;; diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 5550cf5d2..bccf6162d 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -1,5 +1,10 @@ ;;; tools/magit/config.el -*- lexical-binding: t; -*- +(defvar +magit-default-clone-url "https://github.com/%s/%s" + "The default location for `+magit/clone' to clone relative URLs from. +It is passed a user and repository name.") + + ;; ;; Packages From c79a99254531e8609a9a84d8c7b974da318f8255 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 18:49:02 -0500 Subject: [PATCH 3739/4235] Include all files with vterm package They are needed to compile vterm-module.so --- modules/tools/vterm/packages.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/tools/vterm/packages.el b/modules/tools/vterm/packages.el index 9e6a8a837..c0d33a1d5 100644 --- a/modules/tools/vterm/packages.el +++ b/modules/tools/vterm/packages.el @@ -1,4 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/vterm/packages.el -(package! vterm :recipe (:fetcher github :repo "akermu/emacs-libvterm")) +(package! vterm :recipe + (:fetcher github + :repo "akermu/emacs-libvterm" + :files ("*"))) From 002914c912297ca0a117199c1381862384d72e97 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 18:50:02 -0500 Subject: [PATCH 3740/4235] Update SPC o t/T keybind predicate Since :emacs vterm was moved to :tools --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index b072979d3..406c39c9c 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -689,7 +689,7 @@ (:when (featurep! :emacs term) :desc "Terminal" "t" #'+term/open :desc "Terminal in popup" "T" #'+term/open-popup-in-project) - (:when (featurep! :emacs vterm) + (:when (featurep! :tools vterm) :desc "Terminal" "t" #'+vterm/open :desc "Terminal in popup" "T" #'+vterm/open-popup-in-project) (:when (featurep! :emacs eshell) From 483f2a492c53f425d21bc54eee4890d59ff57424 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 18:56:20 -0500 Subject: [PATCH 3741/4235] Lazy-load vterm & refactor config --- modules/tools/vterm/config.el | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/modules/tools/vterm/config.el b/modules/tools/vterm/config.el index 61ced658c..ab89ee5ee 100644 --- a/modules/tools/vterm/config.el +++ b/modules/tools/vterm/config.el @@ -1,27 +1,25 @@ ;;; tools/vterm/config.el -*- lexical-binding: t; -*- (def-package! vterm - :load-path (lambda () (list (concat doom-packages-dir "/quelpa/build/vterm"))) - :init - (unless (file-executable-p (concat - (file-name-directory (locate-library "vterm")) - "vterm-module.so")) - ;; let vterm compile `vterm-modules.so' - (setq-default vterm-install t)) - :when (and (string-match-p "MODULES" system-configuration-features) - (display-graphic-p)) + :when (fboundp 'module-load) + :defer t + :init (setq vterm-install t) :config (set-env! "SHELL") + (set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) + (add-hook 'vterm-mode-hook #'doom|mark-buffer-as-real) ;; Automatically kill buffer when vterm exits. - (add-hook 'vterm-exit-functions #'(lambda (buffer) - (when buffer (kill-buffer buffer)))) - (when (featurep! :ui popup +defaults) - (set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0)) + (add-to-list 'vterm-exit-functions (lambda (buffer) (if buffer (kill-buffer buffer)))) + (when (featurep! :feature evil) (evil-set-initial-state 'vterm-mode 'insert) + ;; Go back to normal state but don't move cursor backwards. Moving cursor + ;; backwards is the default Vim behavior but it is not appropriate in some + ;; cases like terminals. + (setq-hook! 'vterm-mode-hook evil-move-cursor-back nil) ;; Those keys are commonly needed by terminals. - (evil-define-key 'insert vterm-mode-map + (evil-define-key* 'insert vterm-mode-map (kbd "C-a") #'vterm--self-insert (kbd "C-b") #'vterm--self-insert ; Should not be necessary. (kbd "C-d") #'vterm--self-insert @@ -40,9 +38,4 @@ (kbd "C-v") #'vterm--self-insert ; Should not be necessary. (kbd "C-w") #'vterm--self-insert (kbd "C-y") #'vterm--self-insert - (kbd "C-z") #'vterm--self-insert) - ;; Go back to normal state but don't move cursor backwards. - ;; Moving cursor backwards is the default Vim behavior but - ;; it is not appropriate in some cases like terminals. - (add-hook 'vterm-mode-hook #'(lambda () - (setq-local evil-move-cursor-back nil))))) + (kbd "C-z") #'vterm--self-insert))) From 7f1c275d6264486b6d7886cc9e6c1348f1bc7e2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 20:13:37 -0500 Subject: [PATCH 3742/4235] +magit/clone: fix void-function ghub--username --- modules/tools/magit/autoload.el | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 451b64e30..5da8b6882 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -98,19 +98,22 @@ control in buffers." + REPO: assumes {`+magit-default-clone-url'}/{USER}/REPO, where {USER} is ascertained from your global gitconfig." (interactive - (let* ((user (ghub--username (ghub--host))) - (repo (read-from-minibuffer - "Clone repository (user/repo or url): " - (if user (concat user "/")) - nil nil '+magit-clone-history)) - (name (car (last (split-string repo "/" t))))) - (list repo - (read-directory-name - "Destination: " - magit-clone-default-directory - name nil name)))) + (progn + (require 'ghub) + (let* ((user (ghub--username (ghub--host))) + (repo (read-from-minibuffer + "Clone repository (user/repo or url): " + (if user (concat user "/")) + nil nil '+magit-clone-history)) + (name (car (last (split-string repo "/" t))))) + (list repo + (read-directory-name + "Destination: " + magit-clone-default-directory + name nil name))))) (magit-clone (cond ((string-match-p "^[^/]+$" url-or-repo) + (require 'ghub) (format +magit-default-clone-url (ghub--username (ghub--host)) url-or-repo)) ((string-match-p "^\\([^/]+\\)/\\([^/]+\\)/?$" url-or-repo) (apply #'format +magit-default-clone-url (split-string url-or-repo "/" t))) From d6d67ac568d963a63e06da60e00e7b424505ae5a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Feb 2019 20:17:19 -0500 Subject: [PATCH 3743/4235] Force ace-window not to ignore treemacs #1177 --- modules/ui/treemacs/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 63100b734..176100df7 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -45,7 +45,10 @@ There are 2 possible values: (treemacs-follow-mode -1) (treemacs-filewatch-mode t) (when (memq +treemacs-use-git-mode '(simple extended)) - (treemacs-git-mode +treemacs-use-git-mode))) + (treemacs-git-mode +treemacs-use-git-mode)) + + (after! ace-window + (setq aw-ignored-buffers (delq 'treemacs-mode aw-ignored-buffers)))) (def-package! treemacs-evil From 3d99ae8562e0a61eeb5a938fb13d7dded5780f66 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 01:28:07 -0500 Subject: [PATCH 3744/4235] lang/csharp: include +chsarp-sp-point-in-type-p --- modules/lang/csharp/autoload.el | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 modules/lang/csharp/autoload.el diff --git a/modules/lang/csharp/autoload.el b/modules/lang/csharp/autoload.el new file mode 100644 index 000000000..0cdedf0bd --- /dev/null +++ b/modules/lang/csharp/autoload.el @@ -0,0 +1,10 @@ +;;; lang/csharp/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +csharp-sp-point-in-type-p (id action context) + "Return t if point is in the right place for C# angle-brackets." + (and (sp-in-code-p id action context) + (cond ((eq action 'insert) + (sp-point-after-word-p id action context)) + ((eq action 'autoskip) + (/= (char-before) 32))))) From adfc06f3dd384288a88d8751685acf77130fa1c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 01:28:43 -0500 Subject: [PATCH 3745/4235] Add no-other-window in popup criteria This allows +popup-window-p to recognize popup windows created by plugins (like treemacs). --- modules/ui/popup/autoload/popup.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 4c7002225..5529a4ae1 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -160,7 +160,8 @@ and enables `+popup-buffer-mode'." (let ((window (or window (selected-window)))) (and (windowp window) (window-live-p window) - (window-parameter window 'popup) + (or (window-parameter window 'popup) + (window-parameter window 'no-other-window)) window)))) ;;;###autoload From 43975d3cd4f0e10b5a3d1e794c95035bdabebd6c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 15:01:19 -0500 Subject: [PATCH 3746/4235] lang/data: remove vimrc-mode This package/mode isn't "data". Relevant to #973 --- modules/lang/data/config.el | 3 --- modules/lang/data/packages.el | 1 - 2 files changed, 4 deletions(-) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index 9c7f6c204..d97901bc1 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -31,9 +31,6 @@ :config (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))) -(def-package! vimrc-mode - :mode "\\.?vimperatorrc\\'") - ;; ;; Frameworks diff --git a/modules/lang/data/packages.el b/modules/lang/data/packages.el index 2f57bdb10..a8ccfae9e 100644 --- a/modules/lang/data/packages.el +++ b/modules/lang/data/packages.el @@ -4,7 +4,6 @@ (package! graphql-mode) (package! json-mode) (package! toml-mode) -(package! vimrc-mode) (package! yaml-mode) (package! csv-mode) (package! dhall-mode) From c82faf7f10ada519fca9983d8d245aecc092e309 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 15:03:14 -0500 Subject: [PATCH 3747/4235] General reformatting & minor refactors --- core/autoload/packages.el | 2 +- core/core-keybinds.el | 4 ++-- core/core-ui.el | 2 +- modules/lang/data/config.el | 2 +- modules/ui/window-select/config.el | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 3a7558bda..1e0e12756 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -372,7 +372,7 @@ package.el as appropriate." (cl-check-type name symbol) (doom-initialize-packages) (unless (package-installed-p name) - (user-error "%s isn't installed" name)) + (error "%s isn't installed" name)) (when (doom-package-different-backend-p name) (user-error "%s's backend has changed and must be uninstalled first" name)) (when (or force-p (doom-package-outdated-p name)) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index e6951dbff..acbfe37eb 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -76,14 +76,14 @@ If any hook returns non-nil, all hooks after it are ignored.") (after! evil (defmacro define-leader-key! (&rest args) `(general-define-key - :states '(normal visual motion insert emacs) + :states '(normal visual motion emacs) :keymaps 'doom-leader-map :prefix doom-leader-key :non-normal-prefix doom-leader-alt-key ,@args)) (general-create-definer define-localleader-key! - :states '(normal visual motion insert emacs) + :states '(normal visual motion emacs) :major-modes t :wk-full-keys nil :prefix doom-localleader-key diff --git a/core/core-ui.el b/core/core-ui.el index 5af0bdffd..125310083 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -251,7 +251,7 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") (setq whitespace-line-column nil whitespace-style '(face indentation tabs tab-mark spaces space-mark newline newline-mark - trailing lines-tail) + trailing lines-tail) whitespace-display-mappings '((tab-mark ?\t [?› ?\t]) (newline-mark ?\n [?¬ ?\n]) diff --git a/modules/lang/data/config.el b/modules/lang/data/config.el index d97901bc1..c18fb15a9 100644 --- a/modules/lang/data/config.el +++ b/modules/lang/data/config.el @@ -27,7 +27,7 @@ :mode "\\.gql\\'") (def-package! json-mode - :mode "\\.js\\(?:on\\|[hl]int\\(rc\\)?\\)\\'" + :mode "\\.js\\(?:on\\|[hl]int\\(?:rc\\)?\\)\\'" :config (set-electric! 'json-mode :chars '(?\n ?: ?{ ?}))) diff --git a/modules/ui/window-select/config.el b/modules/ui/window-select/config.el index 3989310e3..3bc5c032c 100644 --- a/modules/ui/window-select/config.el +++ b/modules/ui/window-select/config.el @@ -4,7 +4,7 @@ :when (featurep! +switch-window) :defer t :init - (define-key global-map [remap other-window] #'switch-window) + (global-set-key [remap other-window] #'switch-window) :config (setq switch-window-shortcut-style 'qwerty switch-window-qwerty-shortcuts '("a" "s" "d" "f" "g" "h" "j" "k" "l"))) @@ -14,7 +14,7 @@ :unless (featurep! +switch-window) :defer t :init - (define-key global-map [remap other-window] #'ace-window) + (global-set-key [remap other-window] #'ace-window) :config (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l) aw-scope 'frame From f1c13337cc1303708669dd62f827238c964e1dd0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 18:05:56 -0500 Subject: [PATCH 3748/4235] Fix snippet expansion on TAB in visual mode Overzealous dispatcher was overriding yas-insert-snippet. --- modules/config/default/+evil-bindings.el | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 24a7a3502..ce4f7edbd 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -33,16 +33,27 @@ (and (featurep! :completion company +tng) (+company-has-completion-p)) '+company/complete) - :nv [tab] (general-predicate-dispatch nil - (derived-mode-p 'magit-mode) - 'magit-section-toggle - (derived-mode-p 'deadgrep-mode) - 'deadgrep-toggle-file-results - (and (featurep! :editor fold) - (save-excursion (end-of-line) (invisible-p (point)))) - '+fold/toggle - (fboundp 'evilmi-jump-items) - 'evilmi-jump-items) + :n [tab] (general-predicate-dispatch nil + (derived-mode-p 'magit-mode) + 'magit-section-toggle + (derived-mode-p 'deadgrep-mode) + 'deadgrep-toggle-file-results + (and (featurep! :editor fold) + (save-excursion (end-of-line) (invisible-p (point)))) + '+fold/toggle + (fboundp 'evilmi-jump-items) + 'evilmi-jump-items) + :v [tab] (general-predicate-dispatch nil + (and (bound-and-true-p yas-minor-mode) + (or (eq evil-visual-selection 'line) + (and (fboundp 'evilmi-jump-items) + (save-excursion + (/= (point) + (progn (evilmi-jump-items nil) + (point))))))) + 'yas-insert-snippet + (fboundp 'evilmi-jump-items) + 'evilmi-jump-items) ;; Smarter newlines :i [remap newline] #'newline-and-indent ; auto-indent on newline @@ -203,9 +214,7 @@ [M-left] #'+snippets/goto-start-of-field [M-backspace] #'+snippets/delete-to-start-of-field [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field) - (:map yas-minor-mode-map - :v [tab] #'yas-insert-snippet))) + [delete] #'+snippets/delete-forward-char-or-field))) (:when (featurep! :feature spellcheck) :m "]S" #'flyspell-correct-word-generic From bacf4c7a6a191f1282a4c44df2893f6ee367cea8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 18:06:28 -0500 Subject: [PATCH 3749/4235] Fix C-SPC fold toggling keybind +evil/fold-toggle was replaced with +fold/toggle --- modules/config/default/+evil-bindings.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ce4f7edbd..22c21e429 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -112,7 +112,6 @@ :nv "gx" #'evil-exchange :nv "C-a" #'evil-numbers/inc-at-pt :nv "C-S-a" #'evil-numbers/dec-at-pt - :nv "C-SPC" #'+evil/fold-toggle :v "gp" #'+evil/paste-preserve-register :v "@" #'+evil:apply-macro ;; repeat in visual mode (FIXME buggy) @@ -398,7 +397,10 @@ :m "[d" #'git-gutter:previous-hunk)) ;;; :editor -(map! (:when (featurep! :editor format) +(map! (:when (featurep! :editor fold) + :nv "C-SPC" #'+fold/toggle) + + (:when (featurep! :editor format) :n "gQ" #'+format:region) (:when (featurep! :editor multiple-cursors) From b4b85569b486848109dd7db277135802f60c2f9e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 19 Feb 2019 19:05:49 -0500 Subject: [PATCH 3750/4235] lang/org: expand snippet on TAB in visual mode --- modules/lang/org/autoload/org.el | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index e5172b047..00c7d706c 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -400,12 +400,15 @@ another level of headings on each invocation." (defun +org|yas-expand-maybe () "Tries to expand a yasnippet snippet, if one is available. Made for `org-tab-first-hook'." - (when (and (or (not (bound-and-true-p evil-mode)) - (eq evil-state 'insert)) - (bound-and-true-p yas-minor-mode) - (yas--templates-for-key-at-point)) - (call-interactively #'yas-expand) - t)) + (when (bound-and-true-p yas-minor-mode) + (cond ((and (or (not (bound-and-true-p evil-mode)) + (eq evil-state 'insert)) + (yas--templates-for-key-at-point)) + (call-interactively #'yas-expand) + t) + ((use-region-p) + (call-interactively #'yas-insert-snippet) + t)))) ;;;###autoload (defun +org|cycle-only-current-subtree (&optional arg) From 8e1010a2ba8b495f01f4b95484b8f33a4bed6826 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Feb 2019 00:25:03 -0500 Subject: [PATCH 3751/4235] Fix C-a/C-b in evil-ex minibuffer --- modules/config/default/+evil-bindings.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 22c21e429..dea361968 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -869,6 +869,8 @@ customized by changing `+default-repeat-forward-key' and ;; Minibuffer (define-key! evil-ex-completion-map + "C-a" #'move-beginning-of-line + "C-b" #'backward-word "C-s" (if (featurep! :completion ivy) #'counsel-minibuffer-history #'helm-minibuffer-history)) From 6f32ac371bd120aa39fe147ab31e048bf981012b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Feb 2019 01:28:19 -0500 Subject: [PATCH 3752/4235] Highlight non-standard whitespace in file buffers Prevents whitespace-mode from being enabled in special buffers (like circe). --- core/core-ui.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 125310083..a7c745a93 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -464,14 +464,13 @@ instead). Meant for `kill-buffer-query-functions'." e.g. If you indent with spaces by default, tabs will be highlighted. If you indent with tabs, spaces at BOL are highlighted. -Does nothing if `whitespace-mode' is already active or the current major mode is -derived from `special-mode'." +Does nothing if `whitespace-mode' is already active or the current buffer is +read-only or not file-visiting." (unless (or (bound-and-true-p global-whitespace-mode) (bound-and-true-p whitespace-mode) (eq major-mode 'fundamental-mode) - (eq (get major-mode 'mode-class) 'special) - (derived-mode-p 'special-mode) - buffer-read-only) + buffer-read-only + (null buffer-file-name)) (require 'whitespace) (set (make-local-variable 'whitespace-style) (if (bound-and-true-p whitespace-newline-mode) From 7ec46c4d957dfdf3d7fc3d628795c08ded5c8029 Mon Sep 17 00:00:00 2001 From: Shanavas M Date: Wed, 20 Feb 2019 13:14:14 +0530 Subject: [PATCH 3753/4235] Add port to circe network config Fixes #1121 --- modules/app/irc/README.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/app/irc/README.org b/modules/app/irc/README.org index d4cb00367..0ac15e5df 100644 --- a/modules/app/irc/README.org +++ b/modules/app/irc/README.org @@ -92,6 +92,7 @@ could be accessed or appear in backtraces. Not good! So we go a step further: #+BEGIN_SRC emacs-lisp :tangle no (set-irc-server! "chat.freenode.net" `(:tls t + :port 6697 :nick "doom" :sasl-username ,(+pass-get-user "irc/freenode.net") :sasl-password (lambda (&rest _) (+pass-get-secret "irc/freenode.net")) @@ -131,6 +132,7 @@ username: myusername (set-irc-server! "chat.freenode.net" '(:tls t + :port 6697 :nick "doom" :sasl-password my-nickserver-password :channels ("#emacs"))) From 9567b1f97fb640d7c70eda48067e3cada9ce6e81 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Feb 2019 14:45:18 -0500 Subject: [PATCH 3754/4235] Move ESC keybind for transient to tools/magit --- modules/config/default/+evil-bindings.el | 3 +-- modules/tools/magit/config.el | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index dea361968..4ddb344b5 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -462,8 +462,7 @@ "C-j" nil "C-k" nil) (:map transient-map - [escape] #'transient-quit-one - "q" #'transient-quit-one)) + "q" #'transient-quit-one)) (:when (featurep! :tools gist) :after gist diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index bccf6162d..483b65bb8 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -39,7 +39,10 @@ It is passed a user and repository name.") #'hide-mode-line-mode) ;; properly kill leftover magit buffers on quit - (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit)) + (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) + + ;; Close transient with ESC + (define-key transient-map [escape] #'transient-quit-one)) (def-package! forge From 09bdbd1bdd97fd1d2d43c5d7d943be8701b6e408 Mon Sep 17 00:00:00 2001 From: Luigy Leon Date: Wed, 20 Feb 2019 22:59:11 -0500 Subject: [PATCH 3755/4235] lang/haskell: only require intero when flag is set --- modules/lang/haskell/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index 9259b2e45..ec400afaf 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -6,5 +6,5 @@ (cond ((featurep! +dante) (package! dante) (package! attrap)) - ((package! intero))) - + ((featurep! +intero) + (package! intero))) From 16b7c58da9706d8a9c61e8e080bd882ec575fbac Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Thu, 21 Feb 2019 23:22:04 +0800 Subject: [PATCH 3756/4235] use fboundp instead of string-match-p --- modules/tools/vterm/doctor.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/vterm/doctor.el b/modules/tools/vterm/doctor.el index 8d9a04b33..8b9429d0c 100644 --- a/modules/tools/vterm/doctor.el +++ b/modules/tools/vterm/doctor.el @@ -9,5 +9,5 @@ (unless (executable-find "cmake") (warn! "Couldn't find cmake command. Please install it on your system")) -(unless (string-match-p "MODULES" system-configuration-features) - (error! "You have to compile emacs with MODULES support")) +(unless (fboundp 'module-load) + (warn! "You have to compile emacs with MODULES support")) From df19747ca2ee990de7169688f5b833df1e9d5c49 Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Thu, 21 Feb 2019 23:33:21 +0800 Subject: [PATCH 3757/4235] change warning messages --- modules/tools/vterm/doctor.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/tools/vterm/doctor.el b/modules/tools/vterm/doctor.el index 8b9429d0c..866c4b62d 100644 --- a/modules/tools/vterm/doctor.el +++ b/modules/tools/vterm/doctor.el @@ -1,13 +1,13 @@ ;;; tools/vterm/doctor.el -*- lexical-binding: t; -*- (unless (executable-find "vterm-ctrl") - (warn! "Couldn't find libvterm library. Please install it on your system")) + (warn! "Couldn't find libvterm. Vterm module won't compile.")) (unless (executable-find "make") - (warn! "Couldn't find make command. Please install it on your system")) + (warn! "Couldn't find make command. Vterm module won't compile.")) (unless (executable-find "cmake") - (warn! "Couldn't find cmake command. Please install it on your system")) + (warn! "Couldn't find cmake command. Vterm module won't compile")) (unless (fboundp 'module-load) - (warn! "You have to compile emacs with MODULES support")) + (warn! "Your emacs don't have MODULES support. Vterm module won't work.")) From 4ac096a55d5791c90a2903cdfd7e72997de0446b Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Thu, 21 Feb 2019 23:55:08 +0800 Subject: [PATCH 3758/4235] Rewrite readme --- modules/tools/vterm/readme.org | 62 ++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/modules/tools/vterm/readme.org b/modules/tools/vterm/readme.org index 7cc22e34a..b1f48b587 100644 --- a/modules/tools/vterm/readme.org +++ b/modules/tools/vterm/readme.org @@ -7,8 +7,8 @@ - [[Description][Description]] - [[Prerequisites][Prerequisites]] - [[Emacs requirement][Emacs requirement]] - - [[Compiler requirement][Compiler requirement]] - [[System requirement][System requirement]] + - [[Module requirement][Module requirement]] * Description An [[https://github.com/akermu/emacs-libvterm][emacs-libvterm]] module. @@ -19,17 +19,19 @@ An [[https://github.com/akermu/emacs-libvterm][emacs-libvterm]] module. You have to compile emacs with =--with-modules= option. -Lookat the =system-configuration-options= variable to see if your emacs has this option. +Check the =system-configuration-options= variable to see if your emacs has this +option. -** Compiler requirement - -Your system need to have =make= =cmake= and a c compiler to compile -=libvterm-module=, Emacs will automatically compile the module for you. - -You can also put your pre-compiled =vterm-module.so= to your vterm installation -folder, which is usually =~/.emacs.d/.local/packages/quelpa/build/vterm/=, -and make sure =vterm-module.so= file is executable, instead of let emacs compile -it for you. +- On Archlinux or Manjaro, if you install emacs with pacman, this option is + enabled. +- On macOS: + - If you use [[https://emacsformacosx.com/][Emacs For Mac OS X]], this option is enabled. + - If you use [[https://github.com/d12frosted/homebrew-emacs-plus][emacs-plus]], this option is enabled by default. + - If you use [[https://github.com/railwaycat/homebrew-emacsmacport][emacs-mac]], this options is *not* enabled by default. You may have + to reinstall emacs with the option: + #+BEGIN_SRC sh + brew install emacs-mac --with-modules + #+END_SRC ** System requirement @@ -53,3 +55,41 @@ On macOS: brew install libvterm #+END_SRC + +** Module requirement + +You have to compile and install the requied module =vterm-module.so=. + +In order to compile it you need to have: + +- Compilation tools. This include =make=, =cmake= and a c compiler such as + =gcc=. +- Internet connection, because =cmake= will automatically download some requied + libraries from the internet. + +There are several ways to install the module: + +1. The first time you use vterm inside emacs, emacs will automatically compile + and install the module if it cannot find an executable =vterm-module.so= + file. + + *WARNING*: Emacs will hang during the compilation. It may take a while. + +2. A fully byte-compile will cause emacs to automatically compile and install + the module if it cannot find an executable =vterm-module.so= file. + +3. You can compile and install the module yourself. Go to the vterm installation + directory, which is usually + =~/.emacs.d/.local/packages/elpa/vterm-=, and run the following: + + #+BEGIN_SRC sh + mkdir -p build + cd build + cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo .. + make + #+END_SRC + +4. You can also compile the module at other place, and install the compiled + =vterm-module.so= file to your vterm installation folder, which is usually + =~/.emacs.d/.local/packages/elpa/vterm-/=. Also make sure the module + file is executable. From f0048be7f84c41e8199eacb3975299d632a49034 Mon Sep 17 00:00:00 2001 From: SteamedFish Date: Fri, 22 Feb 2019 00:58:31 +0800 Subject: [PATCH 3759/4235] More specific about "use vterm" use the command to trigger vterm instead of a general "use vterm" --- modules/tools/vterm/readme.org | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/tools/vterm/readme.org b/modules/tools/vterm/readme.org index b1f48b587..077e6a668 100644 --- a/modules/tools/vterm/readme.org +++ b/modules/tools/vterm/readme.org @@ -69,9 +69,8 @@ In order to compile it you need to have: There are several ways to install the module: -1. The first time you use vterm inside emacs, emacs will automatically compile - and install the module if it cannot find an executable =vterm-module.so= - file. +1. You can use =M-x vterm-module-compile= to let emacs automatically compile and + install the module. *WARNING*: Emacs will hang during the compilation. It may take a while. From 11d7ae070a54c4192a1a3d34cd2e43153615d7d9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Feb 2019 02:30:36 -0500 Subject: [PATCH 3760/4235] Add async-byte-compile-log-file setting to core.el --- core/core.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core.el b/core/core.el index fe30fd189..81a39d93b 100644 --- a/core/core.el +++ b/core/core.el @@ -252,6 +252,7 @@ and `doom-exit-window-hook'." "~/.authinfo.gpg") ;; files abbrev-file-name (concat doom-local-dir "abbrev.el") + async-byte-compile-log-file (concat doom-etc-dir "async-bytecomp.log") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) pcache-directory (concat doom-cache-dir "pcache/") From d7308799f6983db16fa52f6abbcf9fe7ac94834b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Feb 2019 15:40:20 -0500 Subject: [PATCH 3761/4235] Remove -z flag from ag/rg commands No guarantee the user has the associated decompression libraries installed. I'll implement feature detection for these later. --- modules/completion/ivy/config.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index b13c673b9..e171d4957 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -111,11 +111,10 @@ immediately runs it on the current candidate (ending the ivy session)." (setq counsel-find-file-ignore-regexp "\\(?:^[#.]\\)\\|\\(?:[#~]$\\)\\|\\(?:^Icon?\\)" counsel-describe-function-function #'helpful-callable counsel-describe-variable-function #'helpful-variable - ;; Add smart-casing and compressed archive searching (-zS) to default - ;; command arguments: - counsel-rg-base-command "rg -zS --no-heading --line-number --color never %s ." - counsel-ag-base-command "ag -zS --nocolor --nogroup %s" - counsel-pt-base-command "pt -zS --nocolor --nogroup -e %s") + ;; Add smart-casing (-S) to default command arguments: + counsel-rg-base-command "rg -S --no-heading --line-number --color never %s ." + counsel-ag-base-command "ag -S --nocolor --nogroup %s" + counsel-pt-base-command "pt -S --nocolor --nogroup -e %s") (add-to-list 'swiper-font-lock-exclude #'+doom-dashboard-mode nil #'eq) From cb923eadcc33a3667db0d3d5d2876dfbb4d482ae Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Feb 2019 16:08:27 -0500 Subject: [PATCH 3762/4235] Add basic LSP support Still needs to be documented, but includes support for the following languages: + C/C++/ObjC + Go + Java + Javascript + OCaml + PHP + Python + Ruby + Scala + Swift + HTML/CSS Relevant to #460, #716, #1186 --- init.example.el | 1 + modules/lang/cc/config.el | 23 ++++++++++++++++-- modules/lang/cc/packages.el | 29 +++++++++++------------ modules/lang/go/config.el | 7 ++++-- modules/lang/java/+lsp.el | 10 ++++++++ modules/lang/java/config.el | 3 ++- modules/lang/java/packages.el | 2 ++ modules/lang/javascript/config.el | 5 ++++ modules/lang/javascript/packages.el | 14 +++++++---- modules/lang/ocaml/config.el | 36 +++++++++++++++-------------- modules/lang/php/config.el | 9 +++++--- modules/lang/php/packages.el | 3 ++- modules/lang/python/config.el | 4 ++++ modules/lang/python/packages.el | 3 ++- modules/lang/ruby/config.el | 4 ++++ modules/lang/rust/config.el | 5 +++- modules/lang/scala/config.el | 11 ++++++++- modules/lang/scala/packages.el | 5 +++- modules/lang/swift/config.el | 11 +++++++-- modules/lang/swift/packages.el | 11 +++++---- modules/lang/web/+css.el | 4 ++++ modules/lang/web/+html.el | 4 ++++ modules/tools/lsp/autoload.el | 7 ++++++ modules/tools/lsp/config.el | 21 +++++++++++++++++ modules/tools/lsp/packages.el | 7 ++++++ 25 files changed, 182 insertions(+), 57 deletions(-) create mode 100644 modules/lang/java/+lsp.el create mode 100644 modules/tools/lsp/autoload.el create mode 100644 modules/tools/lsp/config.el create mode 100644 modules/tools/lsp/packages.el diff --git a/init.example.el b/init.example.el index c72d6b6e1..65c7cc9b8 100644 --- a/init.example.el +++ b/init.example.el @@ -67,6 +67,7 @@ ;;editorconfig ; let someone else argue about tabs vs spaces ;;ein ; tame Jupyter notebooks with emacs ;;gist ; interacting with github gists + ;;lsp ;;macos ; MacOS-specific commands ;;magit ; a git porcelain for Emacs ;;make ; run make tasks from Emacs diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 9d5fe1b19..53488b288 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -125,7 +125,7 @@ compilation database is present in the project.") (def-package! irony - :when (featurep! +irony) + :unless (featurep! +lsp) :commands (irony-install-server irony-mode) :preface (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) @@ -181,7 +181,7 @@ compilation database is present in the project.") ;; Rtags Support (def-package! rtags - :when (featurep! +rtags) + :unless (featurep! +lsp) :commands rtags-executable-find :preface (setq rtags-install-path (concat doom-etc-dir "rtags/")) @@ -219,3 +219,22 @@ compilation database is present in the project.") (when (featurep 'evil) (add-hook 'rtags-jump-hook #'evil-set-jump)) (add-hook 'rtags-after-find-file-hook #'recenter)) + + +;; +;; LSP + +(def-package! cquery + :when (featurep! +lsp) + :hook ((c-mode c++-mode objc-mode) . +lsp|init-cquery) + :config + (defun +lsp|init-cquery () + (setq-local company-transformers nil) + (setq-local company-lsp-cache-candidates nil) + (condition-case nil + (lsp) + (user-error nil))) + (setq cquery-extra-init-params + '(:index (:comments 2) + :cacheFormat "msgpack" + :completion (:detailedLabel t)))) diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el index 776b58a3c..cdb6d85d5 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -12,18 +12,17 @@ (when (featurep! :completion company) (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")))) -(when (featurep! +irony) - (package! irony) - (package! irony-eldoc) - (when (featurep! :feature syntax-checker) - (package! flycheck-irony)) - (when (featurep! :completion company) - (package! company-irony) - (package! company-irony-c-headers))) - -(when (featurep! +rtags) - (package! rtags) - (when (featurep! :completion ivy) - (package! ivy-rtags)) - (when (featurep! :completion helm) - (package! helm-rtags))) +(if (featurep! +lsp) + (package! cquery) + (when (package! irony) + (package! irony-eldoc) + (when (featurep! :feature syntax-checker) + (package! flycheck-irony)) + (when (featurep! :completion company) + (package! company-irony) + (package! company-irony-c-headers))) + (when (package! rtags) + (when (featurep! :completion ivy) + (package! ivy-rtags)) + (when (featurep! :completion helm) + (package! helm-rtags)))) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 6bde94e93..0952be4e8 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -20,7 +20,9 @@ "gofmt" "goimports")))) - (add-hook 'go-mode-hook #'go-eldoc-setup) + (if (featurep! +lsp) + (add-hook 'go-mode-hook #'+lsp|init) + (add-hook 'go-mode-hook #'go-eldoc-setup)) (map! :map go-mode-map :localleader @@ -57,7 +59,8 @@ (def-package! company-go - :when (featurep! :completion company) + :when (and (featurep! :completion company) + (not (featurep! +lsp))) :after go-mode :config (set-company-backend! 'go-mode 'company-go) diff --git a/modules/lang/java/+lsp.el b/modules/lang/java/+lsp.el new file mode 100644 index 000000000..88898614d --- /dev/null +++ b/modules/lang/java/+lsp.el @@ -0,0 +1,10 @@ +;;; lang/java/+lsp.el -*- lexical-binding: t; -*- +;;;###if (featurep! +lsp) + +(def-package! lsp-java + :after-call java-mode + :init (add-hook 'java-mode-hook #'+lsp|init) + :config + ;; TODO keybinds + ;; TODO treemacs integration (?) + ) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 5e1e07d5b..955651aaf 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -23,7 +23,8 @@ If the depth is 2, the first two directories are removed: net.lissner.game.") (add-hook 'java-mode-hook #'rainbow-delimiters-mode) -(cond ((featurep! +meghanada) (load! "+meghanada")) +(cond ((featurep! +lsp) (load! "+lsp")) + ((featurep! +meghanada) (load! "+meghanada")) ;; TODO lang/java +lsp (lsp-java?) ;; ((featurep! +lsp) (load! "+lsp")) ) diff --git a/modules/lang/java/packages.el b/modules/lang/java/packages.el index 03deb4911..c9a0014a2 100644 --- a/modules/lang/java/packages.el +++ b/modules/lang/java/packages.el @@ -12,3 +12,5 @@ (when (featurep! :completion company) (package! company-emacs-eclim))) +(when (featurep! +lsp) + (package! lsp-java)) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d125e96e3..31b4804e5 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -122,7 +122,12 @@ ;; ;; Tools +(when (featurep! +lsp) + (add-hook! (js2-mode rjsx-mode typescript-mode) #'+lsp|init)) + + (def-package! tide + :unless (featurep! +lsp) :defer t :init ;; Don't let hard errors stop the user from opening js files. diff --git a/modules/lang/javascript/packages.el b/modules/lang/javascript/packages.el index e281c0b8f..c7474537c 100644 --- a/modules/lang/javascript/packages.el +++ b/modules/lang/javascript/packages.el @@ -1,17 +1,21 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/javascript/packages.el +;; major modes (package! coffee-mode) -(package! eslintd-fix) (package! js2-mode) +(package! rjsx-mode) +(package! typescript-mode) + +;; tools +(package! eslintd-fix) (package! js2-refactor) (package! nodejs-repl) -(package! rjsx-mode) -(package! skewer-mode) -(package! tide) -(package! typescript-mode) (package! npm-mode) +(package! skewer-mode) (when (featurep! :feature lookup) (package! xref-js2)) +(unless (featurep! +lsp) + (package! tide)) diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index f5a5df757..87445332c 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -1,5 +1,9 @@ ;;; lang/ocaml/config.el -*- lexical-binding: t; -*- +(when (featurep! +lsp) + (add-hook! (tuareg-mode reason-mode) #'+lsp|init)) + + (after! tuareg ;; tuareg-mode has the prettify symbols itself (set-pretty-symbols! 'tuareg-mode :alist @@ -18,6 +22,7 @@ (def-package! merlin + :unless (featurep! +lsp) :defer t :init (defun +ocaml|init-merlin () @@ -37,7 +42,20 @@ (map! :localleader :map tuareg-mode-map "t" #'merlin-type-enclosing - "a" #'tuareg-find-alternate-file)) + "a" #'tuareg-find-alternate-file) + + (def-package! merlin-eldoc + :hook (merlin-mode . merlin-eldoc-setup)) + + (def-package! merlin-iedit + :when (featurep! :editor multiple-cursors) + :config + (map! :map tuareg-mode-map + :v "R" #'merlin-iedit-occurrences)) + + (def-package! merlin-imenu + :when (featurep! :emacs imenu) + :hook (merlin-mode . merlin-use-merlin-imenu))) (def-package! flycheck-ocaml @@ -53,22 +71,6 @@ (add-hook 'merlin-mode-hook #'+ocaml|init-flycheck)) - (def-package! merlin-eldoc - :hook (merlin-mode . merlin-eldoc-setup)) - - - (def-package! merlin-iedit - :when (featurep! :editor multiple-cursors) - :config - (map! :map tuareg-mode-map - :v "R" #'merlin-iedit-occurrences)) - - - (def-package! merlin-imenu - :when (featurep! :emacs imenu) - :hook (merlin-mode . merlin-use-merlin-imenu)) - - (def-package! utop :when (featurep! :feature eval) :defer t ; loaded by hook below diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index c14f73f6d..b3e8ae1d8 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -12,9 +12,11 @@ (set-lookup-handlers! 'php-mode :documentation #'php-search-documentation) (set-formatter! 'php-mode #'php-cs-fixer-fix) - ;; `+php-company-backend' uses `company-phpactor', `php-extras-company' or - ;; `company-dabbrev-code', in that order. - (set-company-backend! 'php-mode '+php-company-backend 'company-dabbrev-code) + (if (featurep! +lsp) + (add-hook 'php-mode-hook #'+lsp|init) + ;; `+php-company-backend' uses `company-phpactor', `php-extras-company' or + ;; `company-dabbrev-code', in that order. + (set-company-backend! 'php-mode '+php-company-backend 'company-dabbrev-code)) ;; Use the smallest `sp-max-pair-length' for optimum `smartparens' performance (setq-hook! 'php-mode-hook sp-max-pair-length 5) @@ -32,6 +34,7 @@ (def-package! phpactor + :unless (featurep! +lsp) :after php-mode :config (set-lookup-handlers! 'php-mode diff --git a/modules/lang/php/packages.el b/modules/lang/php/packages.el index b7f9da3bd..61f3ce303 100644 --- a/modules/lang/php/packages.el +++ b/modules/lang/php/packages.el @@ -5,9 +5,10 @@ (package! php-extras :recipe (:fetcher github :repo "arnested/php-extras")) (package! php-mode) (package! php-refactor-mode) -(package! phpactor :recipe (:fetcher github :repo "emacs-php/phpactor.el" :files ("*"))) (package! phpunit) (when (featurep! +hack) (package! hack-mode :recipe (:fetcher github :repo "hhvm/hack-mode"))) +(unless (featurep! +lsp) + (package! phpactor :recipe (:fetcher github :repo "emacs-php/phpactor.el" :files ("*")))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 30bac7222..717725a4e 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -46,6 +46,9 @@ called.") :for "for" :return "return" :yield "yield") + (when (featurep! +lsp) + (add-hook 'python-mode-hook #'+lsp|init)) + (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens (sp-local-pair 'python-mode "'" nil :unless '(sp-point-before-word-p @@ -63,6 +66,7 @@ called.") (def-package! anaconda-mode + :unless (featurep! +lsp) :hook python-mode :init (setq anaconda-mode-installation-directory (concat doom-etc-dir "anaconda/") diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index cfe418184..f492a90d9 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -17,6 +17,7 @@ (package! conda)) ;; Programming environment -(when (package! anaconda-mode) +(unless (featurep! +lsp) + (package! anaconda-mode) (when (featurep! :completion company) (package! company-anaconda))) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 16eb2cbff..cb391bd37 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -26,6 +26,9 @@ (set-electric! '(ruby-mode enh-ruby-mode) :words '("else" "end" "elsif")) (set-repl-handler! '(ruby-mode enh-ruby-mode) #'inf-ruby) + (when (featurep! +lsp) + (add-hook 'enh-ruby-mode-hook #'+lsp|init)) + (after! company-dabbrev-code (add-to-list 'company-dabbrev-code-modes 'enh-ruby-mode nil #'eq) (add-to-list 'company-dabbrev-code-modes 'ruby-mode nil #'eq)) @@ -42,6 +45,7 @@ (def-package! robe + :unless (featurep! +lsp) :hook (enh-ruby-mode . robe-mode) :config (set-repl-handler! 'enh-ruby-mode #'robe-start) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 39ebcb0f0..ff32dd429 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -5,6 +5,9 @@ (set-docsets! 'rust-mode "Rust") (setq rust-indent-method-chain t) + (when (featurep! +lsp) + (add-hook 'rust-mode-hook #'+lsp|init)) + (map! :map rust-mode-map :localleader :prefix "b" @@ -15,6 +18,7 @@ (def-package! racer + :unless (featurep! +lsp) :after rust-mode :config (add-hook 'rust-mode-hook #'racer-mode) @@ -27,4 +31,3 @@ :when (featurep! :feature syntax-checker) :after rust-mode :config (add-hook 'rust-mode-hook #'flycheck-rust-setup)) - diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index 29f5ae5f1..96870e0b5 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -6,7 +6,10 @@ (add-to-list 'dtrt-indent-hook-mapping-list '(scala-mode c/c++/java scala-indent:step)))) -(after! ensime +(def-package! ensime + :unless (featurep! +lsp) + :defer t + :config (setq ensime-startup-snapshot-notification nil ensime-startup-notification nil ensime-eldoc-hints 'all @@ -23,3 +26,9 @@ (def-package! sbt-mode :after scala-mode :config (set-repl-handler! 'scala-mode #'run-scala)) + + +(def-package! lsp-scala + :when (featurep! +lsp) + :after scala-mode + :init (add-hook 'scala-mode-hook #'+lsp|init)) diff --git a/modules/lang/scala/packages.el b/modules/lang/scala/packages.el index c458f6851..83207fe79 100644 --- a/modules/lang/scala/packages.el +++ b/modules/lang/scala/packages.el @@ -1,6 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/scala/packages.el -(package! ensime) (package! sbt-mode) (package! scala-mode) + +(if (featurep! +lsp) + (package! lsp-scala) + (package! ensime)) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index 6925ab766..a41d85306 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -5,14 +5,21 @@ (def-package! flycheck-swift - :when (featurep! :feature syntax-checker) + :when (and (featurep! :feature syntax-checker) + (not (featurep! +lsp))) :after swift-mode :config (flycheck-swift-setup)) (def-package! company-sourcekit - :when (featurep! :completion company) + :when (and (featurep! :completion company) + (not (featurep! +lsp))) :after swift-mode :config (set-company-backend! 'swift-mode '(company-sourcekit company-yasnippet))) + +(def-package! lsp-sourcekit + :when (featurep! +lsp) + :after swift-mode + :init (add-hook 'swift-mode-hook #'+lsp|init)) diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el index 73e74da91..baec9033f 100644 --- a/modules/lang/swift/packages.el +++ b/modules/lang/swift/packages.el @@ -3,8 +3,9 @@ (package! swift-mode) -(when (featurep! :completion company) - (package! company-sourcekit)) - -(when (featurep! :feature syntax-checker) - (package! flycheck-swift)) +(if (featurep! +lsp) + (package! lsp-sourcekit) + (when (featurep! :completion company) + (package! company-sourcekit)) + (when (featurep! :feature syntax-checker) + (package! flycheck-swift))) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index fc7d45e75..2c9ea541e 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -35,6 +35,10 @@ ;; ;; Tools +(when (featurep! +lsp) + (add-hook! (css-mode sass-mode less-css-mode) #'+lsp|init)) + + (def-package! counsel-css :when (featurep! :completion ivy) :commands counsel-css diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index 06d6cd721..e11894818 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -139,3 +139,7 @@ (set-company-backend! 'web-mode 'company-web-html)) (after! slim-mode (set-company-backend! 'slim-mode 'company-web-slim)) + + +(when (featurep! +lsp) + (add-hook! (html-mode web-mode) #'+lsp|init)) diff --git a/modules/tools/lsp/autoload.el b/modules/tools/lsp/autoload.el new file mode 100644 index 000000000..c13d9efd7 --- /dev/null +++ b/modules/tools/lsp/autoload.el @@ -0,0 +1,7 @@ +;;; feature/lsp/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +lsp|init () + "Enable LSP as late as possible, to allow users to customize it via file or +dir local variables." + (add-hook 'hack-local-variables-hook #'lsp nil t)) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el new file mode 100644 index 000000000..e2e690289 --- /dev/null +++ b/modules/tools/lsp/config.el @@ -0,0 +1,21 @@ +;;; tools/lsp/config.el -*- lexical-binding: t; -*- + +(def-package! lsp-ui + :hook (lsp-mode . lsp-ui-mode) + :config + (setq lsp-prefer-flymake nil + lsp-ui-doc-max-height 8 + lsp-ui-doc-max-width 35 + lsp-ui-sideline-ignore-duplicate t) + (define-key! lsp-ui-mode-map + [remap xref-find-definitions] #'lsp-ui-peek-find-definitions + [remap xref-find-references] #'lsp-ui-peek-find-references) + (set-lookup-handlers! 'lsp-ui-mode + :definition #'lsp-ui-peek-find-definitions + :references #'lsp-ui-peek-find-references)) + +(def-package! company-lsp + :when (featurep! :completion company) + :after lsp-mode + :config + (set-company-backend! 'lsp-mode 'company-lsp)) diff --git a/modules/tools/lsp/packages.el b/modules/tools/lsp/packages.el new file mode 100644 index 000000000..efcc53bd1 --- /dev/null +++ b/modules/tools/lsp/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/lsp/packages.el + +(package! lsp-mode) +(package! lsp-ui) +(when (featurep! :completion company) + (package! company-lsp)) From e56a9580d7485f76b48c2ccf9ec00a55d22340d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Feb 2019 16:14:10 -0500 Subject: [PATCH 3763/4235] tools/magit: don't close magit with ESC --- modules/tools/magit/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 483b65bb8..d474bfca4 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -82,6 +82,8 @@ It is passed a user and repository name.") (evil-define-key* '(normal visual) magit-mode-map "zz" #'evil-scroll-line-to-center "%" #'magit-gitflow-popup) + ;; Don't use ESC to close magit + (evil-define-key* 'normal magit-mode-map [escape] nil) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (when-let* ((desc (assoc (car key) evil-magit-rebase-commands-w-descriptions))) From afae6e4f1d050182cf8180b546f6503af3057249 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Feb 2019 17:46:18 -0500 Subject: [PATCH 3764/4235] Remove doom/toggle-comment-region-or-line Replaced with simpler keybinds. --- core/autoload/editor.el | 11 ----------- modules/config/default/config.el | 4 +++- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 5fe041437..90c8d4b3b 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -270,17 +270,6 @@ Respects `require-final-newline'." (when (looking-at "\n+") (replace-match ""))) -;;;###autoload -(defun doom/toggle-comment-region-or-line () - "Comments or uncomments the whole region or if no region is -selected, then the current line." - (interactive) - (let (beg end) - (if (region-active-p) - (setq beg (region-beginning) end (region-end)) - (setq beg (line-beginning-position) end (line-end-position))) - (comment-or-uncomment-region beg end))) - ;;;###autoload (defun doom/dos2unix () "Convert the current buffer to a Unix file encoding." diff --git a/modules/config/default/config.el b/modules/config/default/config.el index b562f8768..8b8946860 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -167,7 +167,9 @@ "s--" #'text-scale-decrease ;; Conventional text-editing keys & motions "s-a" #'mark-whole-buffer - "s-/" #'doom/toggle-comment-region-or-line + :g "s-/" (λ! (save-excursion (comment-line 1))) + :n "s-/" #'evil-commentary-line + :v "s-/" #'evil-commentary :gni [s-return] #'+default/newline-below :gni [s-S-return] #'+default/newline-above :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent From 499877fcff31139ef0604d69a72f82165e95a578 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Feb 2019 19:11:07 -0500 Subject: [PATCH 3765/4235] lang/haskell: restore modified flag after flycheck Dante quietly saves the current buffer (without triggering save hooks) before invoking flycheck, unexpectedly leaving the buffer in an unmodified state. This is annoying if we depend on save hooks to do work on the buffer (like reformatting), so we restore a (false) modified state. --- modules/lang/haskell/+dante.el | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 7ae27e319..8b1f3cb82 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -19,6 +19,16 @@ (set-company-backend! 'dante-mode #'dante-company) + (defun +haskell*restore-modified-state (orig-fn &rest args) + "Dante quietly saves the current buffer (without triggering save hooks) before +invoking flycheck, unexpectedly leaving the buffer in an unmodified state. This +is annoying if we depend on save hooks to do work on the buffer (like +reformatting), so we restore a (false) modified state." + (let ((modified-p (buffer-modified-p))) + (apply orig-fn args) + (if modified-p (set-buffer-modified-p t)))) + (advice-add #'dante-async-load-current-buffer :around #'+haskell*restore-modified-state) + (when (featurep 'evil) (add-hook 'dante-mode-hook #'evil-normalize-keymaps)) (map! :map dante-mode-map From 69ed1a4a99182faea6c3cf23dfebb1fa62e7298c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Feb 2019 00:20:29 -0500 Subject: [PATCH 3766/4235] feature/{syntax-checker,spellcheck} -> tools/fly{check,spell} --- core/core-modules.el | 4 +- init.example.el | 4 +- modules/app/email/config.el | 2 +- modules/app/irc/config.el | 2 +- modules/config/default/+evil-bindings.el | 4 +- modules/feature/spellcheck/config.el | 40 ----------- modules/lang/cc/config.el | 2 +- modules/lang/cc/packages.el | 2 +- modules/lang/clojure/config.el | 2 +- modules/lang/clojure/packages.el | 2 +- modules/lang/crystal/config.el | 2 +- modules/lang/elixir/config.el | 2 +- modules/lang/elixir/packages.el | 2 +- modules/lang/elm/config.el | 2 +- modules/lang/elm/packages.el | 2 +- modules/lang/emacs-lisp/config.el | 2 +- modules/lang/emacs-lisp/packages.el | 2 +- modules/lang/erlang/config.el | 2 +- modules/lang/erlang/packages.el | 2 +- modules/lang/haskell/+dante.el | 2 +- modules/lang/haskell/+intero.el | 2 +- modules/lang/haskell/config.el | 2 +- modules/lang/java/+meghanada.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/latex/config.el | 2 +- modules/lang/ledger/config.el | 2 +- modules/lang/ledger/packages.el | 2 +- modules/lang/nim/config.el | 2 +- modules/lang/nim/packages.el | 2 +- modules/lang/ocaml/README.org | 8 +-- modules/lang/ocaml/config.el | 4 +- modules/lang/ocaml/packages.el | 2 +- modules/lang/perl/config.el | 2 +- modules/lang/perl/packages.el | 2 +- modules/lang/plantuml/config.el | 2 +- modules/lang/plantuml/packages.el | 2 +- modules/lang/rust/config.el | 2 +- modules/lang/rust/packages.el | 2 +- modules/lang/solidity/config.el | 2 +- modules/lang/swift/config.el | 2 +- modules/lang/swift/packages.el | 2 +- .../flycheck}/autoload.el | 22 +++--- .../flycheck}/config.el | 27 +++++--- .../flycheck}/packages.el | 2 +- modules/tools/flyspell/config.el | 69 +++++++++++++++++++ .../spellcheck => tools/flyspell}/packages.el | 3 +- 46 files changed, 147 insertions(+), 110 deletions(-) delete mode 100644 modules/feature/spellcheck/config.el rename modules/{feature/syntax-checker => tools/flycheck}/autoload.el (67%) rename modules/{feature/syntax-checker => tools/flycheck}/config.el (60%) rename modules/{feature/syntax-checker => tools/flycheck}/packages.el (80%) create mode 100644 modules/tools/flyspell/config.el rename modules/{feature/spellcheck => tools/flyspell}/packages.el (87%) diff --git a/core/core-modules.el b/core/core-modules.el index 11248578f..3007460cc 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -12,7 +12,9 @@ "A list of module root directories. Order determines priority.") (defconst doom-obsolete-modules - '((:feature (version-control (:emacs vc) (:ui vc-gutter))) + '((:feature (version-control (:emacs vc) (:ui vc-gutter)) + (spellcheck (:tools flyspell)) + (syntax-checker (:tools flycheck))) (:tools (rotate-text (:editor rotate-text))) (:emacs (electric-indent (:emacs electric)) (hideshow (:editor fold)))) diff --git a/init.example.el b/init.example.el index 38c9b35a0..08180c997 100644 --- a/init.example.el +++ b/init.example.el @@ -9,8 +9,6 @@ (lookup ; helps you navigate your code and documentation +docsets) ; ...or in Dash docsets locally snippets ; my elves. They type so I don't have to - spellcheck ; tasing you for misspelling mispelling - syntax-checker ; tasing you for every semicolon you forget workspaces ; tab emulation, persistence & separate workspaces :completion @@ -66,6 +64,8 @@ ;;docker ;;editorconfig ; let someone else argue about tabs vs spaces ;;ein ; tame Jupyter notebooks with emacs + flycheck ; tasing you for every semicolon you forget + ;;flyspell ; tasing you for misspelling mispelling ;;gist ; interacting with github gists ;;lsp ;;macos ; MacOS-specific commands diff --git a/modules/app/email/config.el b/modules/app/email/config.el index 4a59d9648..3b8f4b556 100644 --- a/modules/app/email/config.el +++ b/modules/app/email/config.el @@ -96,7 +96,7 @@ (defun +email*refresh (&rest _) (mu4e-headers-rerun-search)) (advice-add #'mu4e-mark-execute-all :after #'+email*refresh) - (when (featurep! :feature spellcheck) + (when (featurep! :tools flyspell) (add-hook 'mu4e-compose-mode-hook #'flyspell-mode)) ;; Wrap text in messages diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 901d45d59..34be5d598 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -190,7 +190,7 @@ playback.") (define-key lui-mode-map "\C-u" #'lui-kill-to-beginning-of-line) (setq lui-fill-type nil) - (when (featurep! :feature spellcheck) + (when (featurep! :tools flyspell) (setq lui-flyspell-p t)) (after! evil diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index e625846b2..dd216510a 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -215,14 +215,14 @@ [backspace] #'+snippets/delete-backward-char [delete] #'+snippets/delete-forward-char-or-field))) - (:when (featurep! :feature spellcheck) + (:when (featurep! :tools flyspell) :m "]S" #'flyspell-correct-word-generic :m "[S" #'flyspell-correct-previous-word-generic (:map flyspell-mouse-map "RET" #'flyspell-correct-word-generic [mouse-1] #'flyspell-correct-word-generic)) - (:when (featurep! :feature syntax-checker) + (:when (featurep! :tools flycheck) :m "]e" #'next-error :m "[e" #'previous-error (:after flycheck diff --git a/modules/feature/spellcheck/config.el b/modules/feature/spellcheck/config.el deleted file mode 100644 index 40cb910f5..000000000 --- a/modules/feature/spellcheck/config.el +++ /dev/null @@ -1,40 +0,0 @@ -;;; feature/spellcheck/config.el -*- lexical-binding: t; -*- - -(defvar-local +spellcheck-immediately t - "If non-nil, spellcheck the current buffer upon starting `flyspell-mode'. - -Since spellchecking can be slow in some buffers, this can be disabled with: - - (setq-hook! 'TeX-mode-hook +spellcheck-immediately nil)") - -;; `ispell' -(setq ispell-dictionary "english" - ispell-list-command "--list" - ispell-extr-args '("--dont-tex-check-comments")) - -(after! ispell - (when (equal (file-name-base ispell-program-name) "aspell") - (add-to-list 'ispell-extra-args "--sug-mode=ultra"))) - - -(def-package! flyspell ; built-in - :defer t - :init (add-hook 'flyspell-mode-hook #'+spellcheck|immediately) - :config - (defun +spellcheck|immediately () - "Spellcheck the buffer when `flyspell-mode' is enabled." - (when (and flyspell-mode +spellcheck-immediately) - (flyspell-buffer)))) - - -(def-package! flyspell-correct - :commands (flyspell-correct-word-generic - flyspell-correct-previous-word-generic) - :config - (cond ((featurep! :completion helm) - (require 'flyspell-correct-helm)) - ((featurep! :completion ivy) - (require 'flyspell-correct-ivy)) - ((require 'flyspell-correct-popup) - (setq flyspell-popup-correct-delay 0.8) - (define-key popup-menu-keymap [escape] #'keyboard-quit)))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 53488b288..f0535061c 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -146,7 +146,7 @@ compilation database is present in the project.") :hook (irony-mode . irony-eldoc)) (def-package! flycheck-irony - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :config (flycheck-irony-setup)) (def-package! company-irony diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el index cdb6d85d5..d0213da5c 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -16,7 +16,7 @@ (package! cquery) (when (package! irony) (package! irony-eldoc) - (when (featurep! :feature syntax-checker) + (when (featurep! :tools flycheck) (package! flycheck-irony)) (when (featurep! :completion company) (package! company-irony) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 5ddf6850c..ab6d8823b 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -106,5 +106,5 @@ :desc "refactor" "R" #'hydra-cljr-help-menu/body)) (def-package! flycheck-joker - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after flycheck)) diff --git a/modules/lang/clojure/packages.el b/modules/lang/clojure/packages.el index 1f62de5fc..e289c1e81 100644 --- a/modules/lang/clojure/packages.el +++ b/modules/lang/clojure/packages.el @@ -4,5 +4,5 @@ (package! cider) (package! clj-refactor) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-joker)) diff --git a/modules/lang/crystal/config.el b/modules/lang/crystal/config.el index ac221d42a..dc38bc408 100644 --- a/modules/lang/crystal/config.el +++ b/modules/lang/crystal/config.el @@ -13,7 +13,7 @@ (def-package! flycheck-crystal - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after crystal-mode) diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index f57442ad0..718dd46e8 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -43,7 +43,7 @@ (remove-hook 'alchemist-iex-mode-hook fn))) (def-package! flycheck-credo - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :config (flycheck-credo-setup))) diff --git a/modules/lang/elixir/packages.el b/modules/lang/elixir/packages.el index f55347979..a50e54ce7 100644 --- a/modules/lang/elixir/packages.el +++ b/modules/lang/elixir/packages.el @@ -4,5 +4,5 @@ ;; +elixir.el (package! elixir-mode) (package! alchemist) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-credo)) diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 572d97cc0..3899a89f9 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -19,7 +19,7 @@ (def-package! flycheck-elm - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after elm-mode :config (add-to-list 'flycheck-checkers 'elm nil #'eq)) diff --git a/modules/lang/elm/packages.el b/modules/lang/elm/packages.el index 78ee898fd..23bf4d45d 100644 --- a/modules/lang/elm/packages.el +++ b/modules/lang/elm/packages.el @@ -2,6 +2,6 @@ ;;; lang/elm/packages.el (package! elm-mode) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-elm)) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 856a9cb61..a67312d0c 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -107,7 +107,7 @@ (def-package! flycheck-cask - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :defer t :init (add-hook! 'emacs-lisp-mode-hook diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index 12a4d1f24..8bbf4dd3b 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -7,5 +7,5 @@ (package! overseer) (package! elisp-def) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-cask)) diff --git a/modules/lang/erlang/config.el b/modules/lang/erlang/config.el index 1f4a062b8..fbc17bc31 100644 --- a/modules/lang/erlang/config.el +++ b/modules/lang/erlang/config.el @@ -9,7 +9,7 @@ (def-package! flycheck-rebar3 - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after flycheck :config (flycheck-rebar3-setup)) diff --git a/modules/lang/erlang/packages.el b/modules/lang/erlang/packages.el index 79e5b8f65..00a871c99 100644 --- a/modules/lang/erlang/packages.el +++ b/modules/lang/erlang/packages.el @@ -3,7 +3,7 @@ (package! erlang) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-rebar3)) (when (featurep! :completion ivy) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 8b1f3cb82..44908bc9a 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -14,7 +14,7 @@ "-fdefer-typed-holes" "-fdefer-type-errors")) :config - (when (featurep! :feature syntax-checker) + (when (featurep! :tools flycheck) (flycheck-add-next-checker 'haskell-dante '(warning . haskell-hlint))) (set-company-backend! 'dante-mode #'dante-company) diff --git a/modules/lang/haskell/+intero.el b/modules/lang/haskell/+intero.el index 9f6c3b4cf..1ba04599d 100644 --- a/modules/lang/haskell/+intero.el +++ b/modules/lang/haskell/+intero.el @@ -16,7 +16,7 @@ This is necessary because `intero-mode' doesn't do its own error checks." (setq haskell-compile-cabal-build-command "stack build --fast") (set-lookup-handlers! 'intero-mode :definition #'intero-goto-definition) (set-company-backend! 'intero-mode 'intero-company) - (when (featurep! :feature syntax-checker) + (when (featurep! :tools flycheck) (flycheck-add-next-checker 'intero '(warning . haskell-hlint))) (when (featurep 'evil) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index 836475a33..aedfce663 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -9,7 +9,7 @@ (after! haskell-mode (setq haskell-process-suggest-remove-import-lines t ; warnings for redundant imports etc haskell-process-auto-import-loaded-modules t) - (when (featurep! :feature syntax-checker) + (when (featurep! :tools flycheck) (setq haskell-process-show-overlays nil)) ; flycheck makes this unnecessary (add-hook! 'haskell-mode-hook #'(haskell-collapse-mode ; support folding haskell code blocks diff --git a/modules/lang/java/+meghanada.el b/modules/lang/java/+meghanada.el index 0a0aa74f7..e422deb9b 100644 --- a/modules/lang/java/+meghanada.el +++ b/modules/lang/java/+meghanada.el @@ -6,7 +6,7 @@ :init (setq meghanada-server-install-dir (concat doom-etc-dir "meghanada-server/") meghanada-use-company (featurep! :completion company) - meghanada-use-flycheck (featurep! :feature syntax-checker) + meghanada-use-flycheck (featurep! :tools flycheck) meghanada-use-eldoc t meghanada-use-auto-start t) :config diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 31b4804e5..e77d90987 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -73,7 +73,7 @@ (add-to-list 'magic-mode-alist '(+javascript-jsx-file-p . rjsx-mode)) :config (set-electric! 'rjsx-mode :chars '(?\} ?\) ?. ?>)) - (when (featurep! :feature syntax-checker) + (when (featurep! :tools flycheck) (add-hook! 'rjsx-mode-hook ;; jshint doesn't know how to deal with jsx (push 'javascript-jshint flycheck-disabled-checkers))) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 45b29a792..b5ffb5ada 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -65,7 +65,7 @@ If no viewers are found, `latex-preview-pane' is used.") 'local)) ;; Enable rainbow mode after applying styles to the buffer (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) - (when (featurep! :feature spellcheck) + (when (featurep! :tools flyspell) (add-hook 'latex-mode-local-vars-hook #'flyspell-mode)) ;; All these excess pairs dramatically slow down typing in latex buffers, so ;; we remove them. Let snippets do their job. diff --git a/modules/lang/ledger/config.el b/modules/lang/ledger/config.el index a5ec20d0f..26fd8c4b8 100644 --- a/modules/lang/ledger/config.el +++ b/modules/lang/ledger/config.el @@ -21,7 +21,7 @@ (def-package! flycheck-ledger - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after ledger-mode) diff --git a/modules/lang/ledger/packages.el b/modules/lang/ledger/packages.el index b58a40382..4661ee7a8 100644 --- a/modules/lang/ledger/packages.el +++ b/modules/lang/ledger/packages.el @@ -6,5 +6,5 @@ (when (featurep! :feature evil) (package! evil-ledger)) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-ledger)) diff --git a/modules/lang/nim/config.el b/modules/lang/nim/config.el index f5f960467..2f6680694 100644 --- a/modules/lang/nim/config.el +++ b/modules/lang/nim/config.el @@ -37,6 +37,6 @@ windows." (def-package! flycheck-nim - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after nim-mode) diff --git a/modules/lang/nim/packages.el b/modules/lang/nim/packages.el index f8453e807..ba994148a 100644 --- a/modules/lang/nim/packages.el +++ b/modules/lang/nim/packages.el @@ -5,5 +5,5 @@ (package! nim-mode) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-nim)) diff --git a/modules/lang/ocaml/README.org b/modules/lang/ocaml/README.org index 9154077b8..1ba199387 100644 --- a/modules/lang/ocaml/README.org +++ b/modules/lang/ocaml/README.org @@ -50,10 +50,10 @@ opam install merlin utop ocp-indent dune ocamlformat * Configuration + if =:completion company= is enabled then autocomplete is provided by =merlin= -+ when =:feature syntax-checker= is enabled then =flycheck-ocaml= is activated - to do on-the-fly syntax/type checking via =merlin=, otherwise this is only - done when the file is saved. -+ spell checking is activated in comments if =:feature spellcheck= is active ++ when =:tools flycheck= is enabled then =flycheck-ocaml= is activated to do + on-the-fly syntax/type checking via =merlin=, otherwise this is only done when + the file is saved. ++ spell checking is activated in comments if =:tools flyspell= is active + a REPL is provided if =utop= is installed and =:feature eval= is active + if =:editor format= is enabled, the =ocamlformat= executable is available and there is an =.ocamlformat= file present then =format-all-buffer= is bound to diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 87445332c..9a4a173b3 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -17,7 +17,7 @@ (tuareg-opam-update-env (tuareg-opam-current-compiler)) ;; Spell-check comments - (when (featurep! :feature spellcheck) + (when (featurep! :tools flyspell) (add-hook 'tuareg-mode-local-vars-hook #'flyspell-prog-mode)) @@ -59,7 +59,7 @@ (def-package! flycheck-ocaml - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :init (defun +ocaml|init-flycheck () "Activate `flycheck-ocaml` if the current project possesses a .merlin file." diff --git a/modules/lang/ocaml/packages.el b/modules/lang/ocaml/packages.el index 71128923f..748274499 100644 --- a/modules/lang/ocaml/packages.el +++ b/modules/lang/ocaml/packages.el @@ -6,7 +6,7 @@ (package! merlin-eldoc) (package! ocp-indent) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-ocaml)) (when (featurep! :feature eval) diff --git a/modules/lang/perl/config.el b/modules/lang/perl/config.el index 9a7f4ad1b..e0768b554 100644 --- a/modules/lang/perl/config.el +++ b/modules/lang/perl/config.el @@ -6,5 +6,5 @@ (def-package! flycheck-perl6 - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after perl6-mode) diff --git a/modules/lang/perl/packages.el b/modules/lang/perl/packages.el index a87fd4b8e..e00de4f19 100644 --- a/modules/lang/perl/packages.el +++ b/modules/lang/perl/packages.el @@ -3,5 +3,5 @@ (package! perl6-mode) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-perl6)) diff --git a/modules/lang/plantuml/config.el b/modules/lang/plantuml/config.el index 04001c496..f32ba72b1 100644 --- a/modules/lang/plantuml/config.el +++ b/modules/lang/plantuml/config.el @@ -10,6 +10,6 @@ (def-package! flycheck-plantuml - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after plantuml-mode :config (flycheck-plantuml-setup)) diff --git a/modules/lang/plantuml/packages.el b/modules/lang/plantuml/packages.el index f83696e6c..0335841a7 100644 --- a/modules/lang/plantuml/packages.el +++ b/modules/lang/plantuml/packages.el @@ -2,5 +2,5 @@ ;;; lang/plantuml/packages.el (package! plantuml-mode) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-plantuml)) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index ff32dd429..67eac44f8 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -28,6 +28,6 @@ (def-package! flycheck-rust - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after rust-mode :config (add-hook 'rust-mode-hook #'flycheck-rust-setup)) diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el index 12fd7c646..5e8f2f2d1 100644 --- a/modules/lang/rust/packages.el +++ b/modules/lang/rust/packages.el @@ -6,5 +6,5 @@ (package! racer) (package! rust-mode) -(when (featurep! :feature syntax-checker) +(when (featurep! :tools flycheck) (package! flycheck-rust)) diff --git a/modules/lang/solidity/config.el b/modules/lang/solidity/config.el index 0157c37fd..6a4cf3efb 100644 --- a/modules/lang/solidity/config.el +++ b/modules/lang/solidity/config.el @@ -8,7 +8,7 @@ (def-package! solidity-flycheck ; included with solidity-mode - :when (featurep! :feature syntax-checker) + :when (featurep! :tools flycheck) :after solidity-mode :config (setq flycheck-solidity-solc-addstd-contracts t) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index a41d85306..ec566c392 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -5,7 +5,7 @@ (def-package! flycheck-swift - :when (and (featurep! :feature syntax-checker) + :when (and (featurep! :tools flycheck) (not (featurep! +lsp))) :after swift-mode :config (flycheck-swift-setup)) diff --git a/modules/lang/swift/packages.el b/modules/lang/swift/packages.el index baec9033f..6dd3244f0 100644 --- a/modules/lang/swift/packages.el +++ b/modules/lang/swift/packages.el @@ -7,5 +7,5 @@ (package! lsp-sourcekit) (when (featurep! :completion company) (package! company-sourcekit)) - (when (featurep! :feature syntax-checker) + (when (featurep! :tools flycheck) (package! flycheck-swift))) diff --git a/modules/feature/syntax-checker/autoload.el b/modules/tools/flycheck/autoload.el similarity index 67% rename from modules/feature/syntax-checker/autoload.el rename to modules/tools/flycheck/autoload.el index d0f6b9de2..ccbaa1c94 100644 --- a/modules/feature/syntax-checker/autoload.el +++ b/modules/tools/flycheck/autoload.el @@ -1,6 +1,6 @@ -;;; feature/syntax-checker/autoload.el -*- lexical-binding: t; -*- +;;; tools/flycheck/autoload.el -*- lexical-binding: t; -*- -(defun +syntax-checker-show-popup (errors) +(defun +flycheck-show-popup (errors) "TODO" (if (and EMACS26+ (featurep! +childframe) @@ -8,13 +8,13 @@ (flycheck-posframe-show-posframe errors) (flycheck-popup-tip-show-popup errors))) -(defun +syntax-checker-cleanup-popup () +(defun +flycheck-cleanup-popup () "TODO" (when (display-graphic-p) (flycheck-popup-tip-delete-popup))) ;;;###autoload -(define-minor-mode +syntax-checker-popup-mode +(define-minor-mode +flycheck-popup-mode "TODO" :lighter nil :group 'doom @@ -23,22 +23,22 @@ (cond ;; Use our display function and remember the old one but only if we haven't ;; yet configured it, to avoid activating twice. - ((and +syntax-checker-popup-mode + ((and +flycheck-popup-mode (not (eq flycheck-display-errors-function - #'+syntax-checker-show-popup))) + #'+flycheck-show-popup))) (setq flycheck-popup-tip-old-display-function flycheck-display-errors-function flycheck-display-errors-function - #'+syntax-checker-show-popup) + #'+flycheck-show-popup) (dolist (hook hooks) - (add-hook hook #'+syntax-checker-cleanup-popup nil t))) + (add-hook hook #'+flycheck-cleanup-popup nil t))) ;; Reset the display function and remove ourselves from all hooks but only ;; if the mode is still active. - ((and (not +syntax-checker-popup-mode) + ((and (not +flycheck-popup-mode) (eq flycheck-display-errors-function - #'+syntax-checker-show-popup)) + #'+flycheck-show-popup)) (setq flycheck-display-errors-function flycheck-popup-tip-old-display-function flycheck-popup-tip-old-display-function nil) (dolist (hook hooks) - (remove-hook hook '+syntax-checker-cleanup-popup t)))))) + (remove-hook hook '+flycheck-cleanup-popup t)))))) diff --git a/modules/feature/syntax-checker/config.el b/modules/tools/flycheck/config.el similarity index 60% rename from modules/feature/syntax-checker/config.el rename to modules/tools/flycheck/config.el index 56714c1bd..0d1cf2af8 100644 --- a/modules/feature/syntax-checker/config.el +++ b/modules/tools/flycheck/config.el @@ -1,20 +1,27 @@ -;;; feature/syntax-checker/config.el -*- lexical-binding: t; -*- +;;; tools/flycheck/config.el -*- lexical-binding: t; -*- + +(defvar +flycheck-on-escape t + "If non-nil, flycheck will recheck the current buffer when pressing ESC/C-g.") + + +;; +;; Packages (def-package! flycheck :commands (flycheck-list-errors flycheck-buffer) :after-call (doom-enter-buffer-hook after-find-file) :config ;; Emacs feels snappier without checks on newline - (setq flycheck-check-syntax-automatically '(save idle-change mode-enabled)) + (setq flycheck-check-syntax-automatically (delq 'new-line flycheck-check-syntax-automatically)) + + (defun +flycheck|buffer () + "Flycheck buffer on ESC in normal mode." + (when (and flycheck-mode +flycheck-on-escape) + (ignore-errors (flycheck-buffer)) + nil)) + (add-hook 'doom-escape-hook #'+flycheck|buffer t) (after! evil - (defun +syntax-checkers|flycheck-buffer () - "Flycheck buffer on ESC in normal mode." - (when flycheck-mode - (ignore-errors (flycheck-buffer)) - nil)) - (add-hook 'doom-escape-hook #'+syntax-checkers|flycheck-buffer t) - (setq-hook! 'evil-insert-state-entry-hook flycheck-idle-change-delay 1.75) (setq-hook! 'evil-insert-state-exit-hook @@ -25,7 +32,7 @@ (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) - :init (add-hook 'flycheck-mode-hook #'+syntax-checker-popup-mode) + :init (add-hook 'flycheck-mode-hook #'+flycheck-popup-mode) :config (setq flycheck-popup-tip-error-prefix "✕ ")) diff --git a/modules/feature/syntax-checker/packages.el b/modules/tools/flycheck/packages.el similarity index 80% rename from modules/feature/syntax-checker/packages.el rename to modules/tools/flycheck/packages.el index f7144267c..e5e2f0885 100644 --- a/modules/feature/syntax-checker/packages.el +++ b/modules/tools/flycheck/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; feature/syntax-checker/packages.el +;;; tools/flycheck/packages.el (package! flycheck) (package! flycheck-popup-tip) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el new file mode 100644 index 000000000..2b6958c5e --- /dev/null +++ b/modules/tools/flyspell/config.el @@ -0,0 +1,69 @@ +;;; tools/flyspell/config.el -*- lexical-binding: t; -*- + +(defvar-local +flyspell-immediately t + "If non-nil, spellcheck the current buffer upon starting `flyspell-mode'. + +Since spellchecking can be slow in some buffers, this can be disabled with: + + (setq-hook! 'TeX-mode-hook +flyspell-immediately nil)") + + +;; +;; Packages + +(after! ispell + (setq-default ispell-dictionary "english") + + (cond ((executable-find "aspell") + (setq ispell-program-name "aspell" + ispell-extra-args '("--sug-mode=ultra" "--run-together")) + + (setq-hook! 'text-mode-hook + ispell-extra-args (remove "--run-together" ispell-extra-args))) + + ((executable-find "hunspell") + (setq ispell-program-name "hunspell" + ;; Don't use `ispell-cmd-args', it isn't respected with hunspell. + ;; Hack ispell-local-dictionary-alist instead. + ispell-dictionary-alist + `((,ispell-local-dictionary + "[[:alpha:]]" + "[^[:alpha:]]" + "[']" + nil + ("-d" ,ispell-local-dictionary) + nil + utf-8))))) + + (add-to-list 'ispell-extra-args "--dont-tex-check-comments") + + (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) + (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) + (ispell-kill-ispell t) + (apply orig-fun args) + (ispell-kill-ispell t))) + (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) + (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) + + +;; `flyspell' (built-in) +(setq flyspell-issue-welcome-flag nil) + +(defun +flyspell|immediately () + "Spellcheck the buffer when `flyspell-mode' is enabled." + (when (and flyspell-mode +flyspell-immediately) + (flyspell-buffer))) +(add-hook 'flyspell-mode-hook #'+flyspell|immediately) + + +(def-package! flyspell-correct + :commands (flyspell-correct-word-generic + flyspell-correct-previous-word-generic) + :config + (cond ((featurep! :completion helm) + (require 'flyspell-correct-helm)) + ((featurep! :completion ivy) + (require 'flyspell-correct-ivy)) + ((require 'flyspell-correct-popup) + (setq flyspell-popup-correct-delay 0.8) + (define-key popup-menu-keymap [escape] #'keyboard-quit)))) diff --git a/modules/feature/spellcheck/packages.el b/modules/tools/flyspell/packages.el similarity index 87% rename from modules/feature/spellcheck/packages.el rename to modules/tools/flyspell/packages.el index 87e8bd828..efb81d804 100644 --- a/modules/feature/spellcheck/packages.el +++ b/modules/tools/flyspell/packages.el @@ -1,5 +1,5 @@ ;; -*- no-byte-compile: t; -*- -;;; feature/spellcheck/packages.el +;;; tools/flyspell/packages.el (package! flyspell-correct) (cond ((featurep! :completion ivy) @@ -7,4 +7,3 @@ ((featurep! :completion helm) (package! flyspell-correct-helm)) ((package! flyspell-correct-popup))) - From acddf6a0478db810aa6932d88edf8cb71a8cf38a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Feb 2019 00:22:43 -0500 Subject: [PATCH 3767/4235] Move delete-backward-char & newline-and-indent advice To config/default; the only place it is used. --- core/autoload/editor.el | 116 --------------------- modules/config/default/autoload/default.el | 111 ++++++++++++++++++++ modules/config/default/config.el | 4 +- 3 files changed, 113 insertions(+), 118 deletions(-) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 90c8d4b3b..380a6e4a1 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -115,104 +115,6 @@ afterwards, kill line to beginning of line." (unless empty-line-p (indent-according-to-mode)))) -;;;###autoload -(defun doom/backward-delete-whitespace-to-column () - "Delete back to the previous column of whitespace, or as much whitespace as -possible, or just one char if that's not possible." - (interactive) - (let* ((context (ignore-errors (sp-get-thing))) - (op (plist-get context :op)) - (cl (plist-get context :cl)) - open-len close-len) - (cond ;; When in strings (sp acts weird with quotes; this is the fix) - ;; Also, skip closing delimiters - ((and op cl - (string= op cl) - (and (string= (char-to-string (or (char-before) 0)) op) - (setq open-len (length op))) - (and (string= (char-to-string (or (char-after) 0)) cl) - (setq close-len (length cl)))) - (delete-char (- open-len)) - (delete-char close-len)) - - ;; Delete up to the nearest tab column IF only whitespace between - ;; point and bol. - ((and (not indent-tabs-mode) - (not (bolp)) - (not (sp-point-in-string)) - (save-excursion (>= (- (skip-chars-backward " \t")) tab-width))) - (let ((movement (% (current-column) tab-width))) - (when (= movement 0) - (setq movement tab-width)) - (delete-char (- movement))) - (unless (memq (char-before) (list ?\n ?\ )) - (insert " "))) - - ;; Otherwise do a regular delete - (t (delete-char -1))))) - -;;;###autoload -(defun doom/delete-backward-char (n &optional killflag) - "Same as `delete-backward-char', but preforms these additional checks: - -+ If point is surrounded by (balanced) whitespace and a brace delimiter ({} [] - ()), delete a space on either side of the cursor. -+ If point is at BOL and surrounded by braces on adjacent lines, collapse - newlines: - { - | - } => {|} -+ Otherwise, resort to `doom/backward-delete-whitespace-to-column'. -+ Resorts to `delete-char' if n > 1" - (interactive "p\nP") - (or (integerp n) - (signal 'wrong-type-argument (list 'integerp n))) - (cond ((and (use-region-p) - delete-active-region - (= n 1)) - ;; If a region is active, kill or delete it. - (if (eq delete-active-region 'kill) - (kill-region (region-beginning) (region-end) 'region) - (funcall region-extract-function 'delete-only))) - ;; In Overwrite mode, maybe untabify while deleting - ((null (or (null overwrite-mode) - (<= n 0) - (memq (char-before) '(?\t ?\n)) - (eobp) - (eq (char-after) ?\n))) - (let ((ocol (current-column))) - (delete-char (- n) killflag) - (save-excursion - (insert-char ?\s (- ocol (current-column)) nil)))) - ;; - ((and (= n 1) (bound-and-true-p smartparens-mode)) - (cond ((and (memq (char-before) (list ?\ ?\t)) - (save-excursion - (and (> (- (skip-chars-backward " \t" (line-beginning-position))) 0) - (bolp)))) - (doom/backward-delete-whitespace-to-column)) - ((let* ((pair (ignore-errors (sp-get-thing))) - (op (plist-get pair :op)) - (cl (plist-get pair :cl)) - (beg (plist-get pair :beg)) - (end (plist-get pair :end))) - (cond ((and end beg (= end (+ beg (length op) (length cl)))) - (sp-backward-delete-char 1)) - ((doom-surrounded-p pair 'inline 'balanced) - (delete-char -1 killflag) - (delete-char 1) - (when (= (point) (+ (length cl) beg)) - (sp-backward-delete-char 1) - (sp-insert-pair op))) - ((and (bolp) (doom-surrounded-p pair nil 'balanced)) - (delete-region beg end) - (sp-insert-pair op) - t) - ((run-hook-with-args-until-success 'doom-delete-backward-functions)) - ((doom/backward-delete-whitespace-to-column))))))) - ;; Otherwise, do simple deletion. - ((delete-char (- n) killflag)))) - ;;;###autoload (defun doom/retab (arg &optional beg end) "Converts tabs-to-spaces or spaces-to-tabs within BEG and END (defaults to @@ -283,24 +185,6 @@ Respects `require-final-newline'." (set-buffer-file-coding-system 'undecided-dos nil)) -;; -;; Advice - -;;;###autoload -(defun doom*newline-indent-and-continue-comments (_orig-fn) - "Inserts a newline and possibly indents it. Also continues comments if -executed from a commented line; handling special cases for certain languages -with weak native support." - (interactive) - (cond ((sp-point-in-string) (newline)) - ((and (sp-point-in-comment) - comment-line-break-function) - (funcall comment-line-break-function)) - (t - (newline nil t) - (indent-according-to-mode)))) - - ;; ;; Hooks diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 7f46bf68c..654f40f41 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -119,3 +119,114 @@ If ARG (universal argument), runs `compile' from the current directory." (cond ((fboundp 'counsel-yank-pop) #'counsel-yank-pop) ((fboundp 'helm-show-kill-ring) #'helm-show-kill-ring) ((error "No kill-ring search backend available. Enable ivy or helm!"))))) + +;;;###autoload +(defun +default*newline-indent-and-continue-comments (_orig-fn) + "Inserts a newline and possibly indents it. Also continues comments if +executed from a commented line; handling special cases for certain languages +with weak native support." + (interactive) + (cond ((sp-point-in-string) (newline)) + ((and (sp-point-in-comment) + comment-line-break-function) + (funcall comment-line-break-function)) + (t + (newline nil t) + (indent-according-to-mode)))) + +(defun doom--backward-delete-whitespace-to-column () + "Delete back to the previous column of whitespace, or as much whitespace as +possible, or just one char if that's not possible." + (interactive) + (let* ((context (ignore-errors (sp-get-thing))) + (op (plist-get context :op)) + (cl (plist-get context :cl)) + open-len close-len) + (cond ;; When in strings (sp acts weird with quotes; this is the fix) + ;; Also, skip closing delimiters + ((and op cl + (string= op cl) + (and (string= (char-to-string (or (char-before) 0)) op) + (setq open-len (length op))) + (and (string= (char-to-string (or (char-after) 0)) cl) + (setq close-len (length cl)))) + (delete-char (- open-len)) + (delete-char close-len)) + + ;; Delete up to the nearest tab column IF only whitespace between + ;; point and bol. + ((and (not indent-tabs-mode) + (not (bolp)) + (not (sp-point-in-string)) + (save-excursion (>= (- (skip-chars-backward " \t")) tab-width))) + (let ((movement (% (current-column) tab-width))) + (when (= movement 0) + (setq movement tab-width)) + (delete-char (- movement))) + (unless (memq (char-before) (list ?\n ?\ )) + (insert " "))) + + ;; Otherwise do a regular delete + ((delete-char -1))))) + +;;;###autoload +(defun +default*delete-backward-char (n &optional killflag) + "Same as `delete-backward-char', but preforms these additional checks: + ++ If point is surrounded by (balanced) whitespace and a brace delimiter ({} [] + ()), delete a space on either side of the cursor. ++ If point is at BOL and surrounded by braces on adjacent lines, collapse + newlines: + { + | + } => {|} ++ Otherwise, resort to `doom--backward-delete-whitespace-to-column'. ++ Resorts to `delete-char' if n > 1" + (interactive "p\nP") + (or (integerp n) + (signal 'wrong-type-argument (list 'integerp n))) + (cond ((and (use-region-p) + delete-active-region + (= n 1)) + ;; If a region is active, kill or delete it. + (if (eq delete-active-region 'kill) + (kill-region (region-beginning) (region-end) 'region) + (funcall region-extract-function 'delete-only))) + ;; In Overwrite mode, maybe untabify while deleting + ((null (or (null overwrite-mode) + (<= n 0) + (memq (char-before) '(?\t ?\n)) + (eobp) + (eq (char-after) ?\n))) + (let ((ocol (current-column))) + (delete-char (- n) killflag) + (save-excursion + (insert-char ?\s (- ocol (current-column)) nil)))) + ;; + ((and (= n 1) (bound-and-true-p smartparens-mode)) + (cond ((and (memq (char-before) (list ?\ ?\t)) + (save-excursion + (and (/= (skip-chars-backward " \t" (line-beginning-position)) 0) + (bolp)))) + (doom--backward-delete-whitespace-to-column)) + ((let* ((pair (ignore-errors (sp-get-thing))) + (op (plist-get pair :op)) + (cl (plist-get pair :cl)) + (beg (plist-get pair :beg)) + (end (plist-get pair :end))) + (cond ((and end beg (= end (+ beg (length op) (length cl)))) + (sp-backward-delete-char 1)) + ((doom-surrounded-p pair 'inline 'balanced) + (delete-char -1 killflag) + (delete-char 1) + (when (= (point) (+ (length cl) beg)) + (sp-backward-delete-char 1) + (sp-insert-pair op))) + ((and (bolp) (doom-surrounded-p pair nil 'balanced)) + (delete-region beg end) + (sp-insert-pair op) + t) + ((run-hook-with-args-until-success 'doom-delete-backward-functions)) + ((doom--backward-delete-whitespace-to-column))))))) + ;; Otherwise, do simple deletion. + ((delete-char (- n) killflag)))) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 8b8946860..c1263ac10 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -105,10 +105,10 @@ ;; e) properly delete smartparen pairs when they are encountered, without ;; the need for strict mode. ;; f) do none of this when inside a string - (advice-add #'delete-backward-char :override #'doom/delete-backward-char) + (advice-add #'delete-backward-char :override #'+default*delete-backward-char) ;; Makes `newline-and-indent' continue comments (and more reliably) - (advice-add #'newline-and-indent :around #'doom*newline-indent-and-continue-comments))) + (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) ;; From b8be64f3b5ee8d556e1167b67c2355f24ced63b5 Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 23 Feb 2019 03:20:45 +1100 Subject: [PATCH 3768/4235] Add haskell lsp mode --- modules/lang/haskell/+lsp.el | 8 ++++++++ modules/lang/haskell/config.el | 3 ++- modules/lang/haskell/packages.el | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 modules/lang/haskell/+lsp.el diff --git a/modules/lang/haskell/+lsp.el b/modules/lang/haskell/+lsp.el new file mode 100644 index 000000000..d963d3e83 --- /dev/null +++ b/modules/lang/haskell/+lsp.el @@ -0,0 +1,8 @@ +;;; lang/haskell/+lsp.el -*- lexical-binding: t; -*- + +(def-package! lsp-haskell + :after haskell-mode + :init (add-hook 'haskell-mode-hook #'lsp) + :config + ;; Does some strange indentation if it pastes in the snippet + (setq company-lsp-enable-snippet nil)) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index aedfce663..a62a64d87 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -1,7 +1,8 @@ ;;; lang/haskell/config.el -*- lexical-binding: t; -*- (cond ((featurep! +intero) (load! "+intero")) - ((featurep! +dante) (load! "+dante"))) + ((featurep! +dante) (load! "+dante")) + ((featurep! +lsp) (load! "+lsp"))) ;; ;; Common packages diff --git a/modules/lang/haskell/packages.el b/modules/lang/haskell/packages.el index ec400afaf..b2fd48e5e 100644 --- a/modules/lang/haskell/packages.el +++ b/modules/lang/haskell/packages.el @@ -7,4 +7,6 @@ (package! dante) (package! attrap)) ((featurep! +intero) - (package! intero))) + (package! intero)) + ((featurep! +lsp) + (package! lsp-haskell))) From 861856df8d5352efc1183ca55d9ab6dfa0776ac4 Mon Sep 17 00:00:00 2001 From: Ryan Schmukler Date: Fri, 14 Dec 2018 18:14:21 -0500 Subject: [PATCH 3769/4235] fix: restore +ivy-buffer-icons config var This commit restores the functionality of the `+ivy-buffer-icons` variable. I tested it in both childframe and regular mode. --- modules/completion/ivy/config.el | 56 +++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e171d4957..1c7aba4c2 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -73,7 +73,7 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-rich - :hook (ivy-mode . ivy-rich-mode) + :after ivy :config ;; Show more buffer information in other switch-buffer commands too (dolist (cmd '(+ivy/switch-workspace-buffer @@ -130,6 +130,52 @@ immediately runs it on the current candidate (ending the ivy session)." (target (read-file-name (format "%s %s to:" prompt source)))) (funcall cmd source target 1)))) + (when +ivy-buffer-icons + (defun +ivy-reload-icons () + (setq ivy-rich--display-transformers-list + (plist-put ivy-rich--display-transformers-list + 'ivy-switch-buffer + '(:columns + ((all-the-icons-icon-for-file (:width 2 :align right)) + ; return the icon for the file + (+ivy-rich-buffer-name (:width 30)) + ; return the candidate itself + (ivy-rich-switch-buffer-size (:width 7)) + ; return the buffer size + (ivy-rich-switch-buffer-indicators + (:width 4 :face error :align right)) + ; return the buffer indicators + (ivy-rich-switch-buffer-major-mode + (:width 12 :face warning)) + ; return the major mode info + (ivy-rich-switch-buffer-project + (:width 15 :face success)) + ; return project name using `projectile' + (ivy-rich-switch-buffer-path + (:width (lambda (x) + (ivy-rich-switch-buffer-shorten-path + x + (ivy-rich-minibuffer-width 0.3)))))) + ; return file path relative to project + ; root or `default-directory' if project + ; is nil + :predicate + (lambda (cand) (get-buffer cand))))) + (setq ivy-rich--display-transformers-list + (plist-put ivy-rich--display-transformers-list + 'counsel-projectile-find-file + '(:columns + ((all-the-icons-icon-for-file (:width 2 :align right)) + (ivy-rich-candidate))))) + (setq ivy-rich--display-transformers-list + (plist-put ivy-rich--display-transformers-list + 'counsel-projectile-switch-project + '(:columns + (((lambda (_) (all-the-icons-octicon "file-directory")) + (:width 2 :align right)) + (ivy-rich-candidate))))) + (ivy-rich-set-display-transformer))) + ;; Configure `counsel-find-file' (ivy-add-actions 'counsel-find-file @@ -153,7 +199,6 @@ immediately runs it on the current candidate (ending the ivy session)." 'counsel-ag ; also applies to `counsel-rg' & `counsel-pt' '(("O" +ivy-git-grep-other-window-action "open in other window")))) - (def-package! counsel-projectile :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) @@ -166,7 +211,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap projectile-switch-project] #'counsel-projectile-switch-project) :config ;; no highlighting visited files; slows down the filtering - (ivy-set-display-transformer #'counsel-projectile-find-file nil)) + (ivy-set-display-transformer #'counsel-projectile-find-file nil) + (when +ivy-buffer-icons (+ivy-reload-icons))) (def-package! wgrep @@ -205,7 +251,9 @@ immediately runs it on the current candidate (ending the ivy session)." ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-ag counsel-grep counsel-git-grep)) - (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) + (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback)) + + (when +ivy-buffer-icons (+ivy-reload-icons))) (def-package! flx From a070343e2205354681e8474207b218bcfc57b05d Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Sat, 23 Feb 2019 15:15:38 +1100 Subject: [PATCH 3770/4235] haskell +lsp: change lsp to +lsp|init --- modules/lang/haskell/+lsp.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+lsp.el b/modules/lang/haskell/+lsp.el index d963d3e83..80bcec789 100644 --- a/modules/lang/haskell/+lsp.el +++ b/modules/lang/haskell/+lsp.el @@ -2,7 +2,7 @@ (def-package! lsp-haskell :after haskell-mode - :init (add-hook 'haskell-mode-hook #'lsp) + :init (add-hook 'haskell-mode-hook #'+lsp|init) :config ;; Does some strange indentation if it pastes in the snippet (setq company-lsp-enable-snippet nil)) From 07d54abb9dde11cd93c7f87af6cd108fd95e0568 Mon Sep 17 00:00:00 2001 From: iovxw Date: Sat, 23 Feb 2019 14:05:12 +0800 Subject: [PATCH 3771/4235] lang/rust: disable racer when +lsp --- modules/lang/rust/packages.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/rust/packages.el b/modules/lang/rust/packages.el index 5e8f2f2d1..96421d159 100644 --- a/modules/lang/rust/packages.el +++ b/modules/lang/rust/packages.el @@ -3,8 +3,10 @@ ;; requires rust cargo racer -(package! racer) (package! rust-mode) (when (featurep! :tools flycheck) (package! flycheck-rust)) + +(unless (featurep! +lsp) + (package! racer)) From e479e835349e68ced3cea485713dca6564fa115e Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Sat, 23 Feb 2019 23:52:31 +1000 Subject: [PATCH 3772/4235] Fix wrong function names in non-evil yas-keymap --- modules/config/default/+emacs-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index ea0ef4ee9..92a46fb2f 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -281,8 +281,8 @@ (:after yasnippet ;; keymap while editing an inserted snippet (:map yas-keymap - "C-e" #'snippets/goto-end-of-field - "C-a" #'snippets/goto-start-of-field + "C-e" #'+snippets/goto-end-of-field + "C-a" #'+snippets/goto-start-of-field "" #'yas-prev-field "" #'+snippets/delete-to-start-of-field [backspace] #'+snippets/delete-backward-char From 5da216a1c54b13177eaf9a1d27a773d029bbe2de Mon Sep 17 00:00:00 2001 From: xhcoding Date: Sun, 24 Feb 2019 17:44:06 +0800 Subject: [PATCH 3773/4235] Add: sumatrapdf as pdf viewer on Windows --- modules/lang/latex/+viewers.el | 4 ++++ modules/lang/latex/config.el | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index 28dc06322..447d189f3 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -8,6 +8,10 @@ (file-exists-p! (or "/Applications/Skim.app" "~/Applications/Skim.app"))) (add-to-list 'TeX-view-program-selection '(output-pdf "Skim")))) + (`sumatrapdf + (when (and IS-WINDOWS + (executable-find "SumatraPDF")) + (add-to-list 'TeX-view-program-selection '(output-pdf "SumatraPDF")))) (`okular (when (executable-find "okular") diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index b5ffb5ada..5a1c9921a 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -11,7 +11,7 @@ enabling unicode symbols in math regions. This requires the unicode-math latex package to be installed.") -(defvar +latex-viewers `(skim zathura okular pdf-tools) +(defvar +latex-viewers `(skim sumatrapdf zathura okular pdf-tools) "A list of enabled latex viewers to use, in this order. If they don't exist, they will be ignored. Recognized viewers are skim, zathura, okular and pdf-tools. From a39f366f6a558fa210b77276566762de3f30b0f6 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Sun, 24 Feb 2019 22:07:23 +1000 Subject: [PATCH 3774/4235] Fix wrong function name for non-evil repl --- modules/config/default/+emacs-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 92a46fb2f..9bfb19cbf 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -226,7 +226,7 @@ "C-h V" #'counsel-set-variable "C-'" #'counsel-imenu)) ;; repl toggle - "C-c C-z" #'+eval/open-repl + "C-c C-z" #'+eval/open-repl-other-window ;; company mode (:after company (:map company-active-map From e3f338b9347b03a698aa3764b9c40c7c3dbc1ade Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Feb 2019 01:48:59 -0500 Subject: [PATCH 3775/4235] Fix package file-missing errors at compile-time --- core/core-modules.el | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 3007460cc..88b7bbafc 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -335,10 +335,16 @@ to least)." (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) - "This is a thin wrapper around `use-package'." - `(use-package ,name - ,@(if (memq name doom-disabled-packages) `(:disabled t)) - ,@plist)) + "This is a thin wrapper around `use-package'. It is ignored if the NAME +package is disabled." + (unless (or (memq name doom-disabled-packages) + ;; At compile-time, use-package will forcibly load its package to + ;; prevent compile-time errors. However, Doom users can + ;; intentionally disable packages, resulting if file-missing + ;; package errors, so we preform this check at compile time: + (and (bound-and-true-p byte-compile-current-file) + (not (locate-library (symbol-name name))))) + `(use-package ,name ,@plist))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. From 024f383a0857887c934f5972e426c34321f5d89a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Feb 2019 02:07:44 -0500 Subject: [PATCH 3776/4235] lang/org: add full link at point display to eldoc --- modules/lang/org/autoload/org.el | 7 +++++++ modules/lang/org/config.el | 2 ++ 2 files changed, 9 insertions(+) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 00c7d706c..66cc3f5b8 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -463,3 +463,10 @@ an effect when `evil-org-special-o/O' has `item' in it (not the default)." (backward-char 1) (evil-append nil)))) (funcall orig-fn count))) + +;;;###autoload +(defun +org*display-link-in-eldoc (orig-fn &rest args) + "Display the link at point in eldoc." + (or (when-let* ((link (org-element-property :raw-link (org-element-context)))) + (format "Link: %s" link)) + (apply orig-fn args))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 6dbcfba64..3ba70a053 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -287,6 +287,8 @@ unfold to point on startup." org-preview-latex-image-directory (concat doom-cache-dir "org-latex/") org-format-latex-options (plist-put org-format-latex-options :scale 1.5)) + (advice-add #'org-eldoc-documentation-function :around #'+org*display-link-in-eldoc) + ;; Don't do automatic indent detection in org files (add-to-list 'doom-detect-indentation-excluded-modes 'org-mode nil #'eq) From 51129567d90af78614c02ff97aeb03781b0e7d80 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:46:34 -0500 Subject: [PATCH 3777/4235] Mention $DOOMDIR/init.el in leader key docstrings They need to be changed as soon as possible, otherwise leader keybinds done before the change will use the old leader key. --- core/core-keybinds.el | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index acbfe37eb..082d7bb1d 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -5,17 +5,26 @@ ;; never loaded, then evil bindings set with `map!' will be ignored. (defvar doom-leader-key "SPC" - "The leader prefix key for Evil users.") + "The leader prefix key for Evil users. + +This needs to be changed from $DOOMDIR/init.el.") (defvar doom-leader-alt-key "M-SPC" "An alternative leader prefix key, used for Insert and Emacs states, and for -non-evil users.") +non-evil users. + +This needs to be changed from $DOOMDIR/init.el.") (defvar doom-localleader-key "SPC m" - "The localleader prefix key, for major-mode specific commands.") + "The localleader prefix key, for major-mode specific commands. + +This needs to be changed from $DOOMDIR/init.el.") (defvar doom-localleader-alt-key "M-SPC m" - "The localleader prefix key, for major-mode specific commands.") + "The localleader prefix key, for major-mode specific commands. Used for Insert +and Emacs states, and for non-evil users. + +This needs to be changed from $DOOMDIR/init.el.") (defvar doom-leader-map (make-sparse-keymap) "An overriding keymap for keys.") From 5e24c93d4c7e39c6da53e087ddb7df5f714535f7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:49:12 -0500 Subject: [PATCH 3778/4235] tools/lsp: move lsp-session-file to doom-etc-dir --- modules/tools/lsp/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index e2e690289..4d97ee48d 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -1,5 +1,8 @@ ;;; tools/lsp/config.el -*- lexical-binding: t; -*- +(setq lsp-session-file (concat doom-etc-dir "lsp-session")) + + (def-package! lsp-ui :hook (lsp-mode . lsp-ui-mode) :config @@ -14,6 +17,7 @@ :definition #'lsp-ui-peek-find-definitions :references #'lsp-ui-peek-find-references)) + (def-package! company-lsp :when (featurep! :completion company) :after lsp-mode From 899c4b8117095571438e54059baa55ffb253fa00 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:52:36 -0500 Subject: [PATCH 3779/4235] Disable +flycheck-popup-mode in lsp-ui-mode #1192 As its redundant with lsp-ui's sideline feature. --- modules/tools/flycheck/autoload.el | 8 ++++++++ modules/tools/flycheck/config.el | 7 +++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/modules/tools/flycheck/autoload.el b/modules/tools/flycheck/autoload.el index ccbaa1c94..0d4e3e54e 100644 --- a/modules/tools/flycheck/autoload.el +++ b/modules/tools/flycheck/autoload.el @@ -42,3 +42,11 @@ flycheck-popup-tip-old-display-function nil) (dolist (hook hooks) (remove-hook hook '+flycheck-cleanup-popup t)))))) + +;;;###autoload +(defun +flycheck|disable-popup-mode-for-lsp () + "Disable `+flycheck-popup-mode' if `lsp-ui-mode' and `lsp-ui-sideline-enable' +are non-nil." + (when (and (bound-and-true-p lsp-ui-mode) + lsp-ui-sideline-enable) + (+flycheck-popup-mode -1))) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index 0d1cf2af8..610b42c3f 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -32,8 +32,11 @@ (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) - :init (add-hook 'flycheck-mode-hook #'+flycheck-popup-mode) - :config (setq flycheck-popup-tip-error-prefix "✕ ")) + :init + (add-hook 'flycheck-mode-hook #'+flycheck-popup-mode) + (add-hook '+flycheck-popup-mode-hook #'+flycheck|disable-popup-mode-for-lsp) + :config + (setq flycheck-popup-tip-error-prefix "✕ ")) (def-package! flycheck-posframe From 8604c0bbad2ba9a64814a0605e77e1796361538e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:55:07 -0500 Subject: [PATCH 3780/4235] Use the default face for vterm's bg/fg --- modules/tools/vterm/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/tools/vterm/config.el b/modules/tools/vterm/config.el index ab89ee5ee..e3a8751f9 100644 --- a/modules/tools/vterm/config.el +++ b/modules/tools/vterm/config.el @@ -12,6 +12,14 @@ ;; Automatically kill buffer when vterm exits. (add-to-list 'vterm-exit-functions (lambda (buffer) (if buffer (kill-buffer buffer)))) + (defun +vterm|use-emacs-theme-colors () + "Unset the black and white colors so that vterm's background and foreground +inherit from the `default' face." + (make-local-variable 'ansi-color-names-vector) + (setf (elt ansi-color-names-vector 0) nil) + (setf (elt ansi-color-names-vector 7) nil)) + (add-hook 'vterm-mode-hook #'+vterm|use-emacs-theme-colors) + (when (featurep! :feature evil) (evil-set-initial-state 'vterm-mode 'insert) ;; Go back to normal state but don't move cursor backwards. Moving cursor From 0872b29767846808873e104db3d3ff9cdc4687f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:55:57 -0500 Subject: [PATCH 3781/4235] Ensure doom--current-module is set When evaluating elisp code through feature/eval's commands (e.g. gr/gR). --- modules/lang/emacs-lisp/autoload.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 0a21cc4cf..8368b6b53 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -9,7 +9,8 @@ to a pop up buffer." (require 'pp) (let ((result - (let ((debug-on-error t)) + (let ((debug-on-error t) + (doom--current-module (doom-module-from-path buffer-file-name))) (eval (read (concat "(progn " (buffer-substring-no-properties beg end) From 4aaeeb509ce215777834849ab4c50a5ae6d7b97a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:57:01 -0500 Subject: [PATCH 3782/4235] Auto-determine ns-appearance parameter on MacOS This is experimental. It will adapt the frame titlebar's theme depending on the background of the loaded theme. --- core/core-os.el | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/core/core-os.el b/core/core-os.el index a7fd04298..945a57874 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -51,7 +51,21 @@ exec-path-from-shell-debug doom-debug-mode exec-path-from-shell-variables (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) - (exec-path-from-shell-initialize)))) + (exec-path-from-shell-initialize))) + + (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t)) + (defun +doom|determine-ns-appearance () + (let ((appearance (cl-destructuring-bind (r g b) (doom-name-to-rgb "#E5E9F0") + (if (> (+ (* r 0.2126) + (* g 0.7152) + (* b 0.0722)) + 0.45) + 'light + 'dark)))) + (setf (alist-get 'ns-appearance default-frame-alist) appearance) + (dolist (frame (frame-list)) + (set-frame-parameter frame 'ns-appearance appearance)))) + (add-hook 'doom-load-theme-hook #'+doom|determine-ns-appearance)) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! From 7c5eefee3e2a5c529a042fd917a51f469eb485f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 13:58:56 -0500 Subject: [PATCH 3783/4235] General, minor refactoring --- core/autoload/debug.el | 2 +- core/autoload/editor.el | 2 +- modules/app/calendar/config.el | 3 +-- modules/feature/lookup/packages.el | 2 +- modules/lang/emacs-lisp/config.el | 6 +++--- modules/lang/latex/+viewers.el | 11 +++++------ 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 1d8c5d885..de27982f5 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -115,7 +115,7 @@ markdown and copies it to your clipboard, ready to be pasted into bug reports!" branch and commit." (interactive) (require 'vc-git) - (print! "Doom v%s (Emacs v%s)\nBranch: %s\nCommit: %s." + (print! "Doom v%s (Emacs v%s)\nBranch: %s\nCommit: %s" doom-version emacs-version (or (vc-git--symbolic-ref doom-core-dir) diff --git a/core/autoload/editor.el b/core/autoload/editor.el index 380a6e4a1..527c28384 100644 --- a/core/autoload/editor.el +++ b/core/autoload/editor.el @@ -108,7 +108,7 @@ afterwards, kill line to beginning of line." (interactive) (let ((empty-line-p (save-excursion (beginning-of-line) (looking-at-p "[ \t]*$")))) - (funcall (if (featurep 'evil) + (funcall (if (fboundp 'evil-delete) #'evil-delete #'delete-region) (point-at-bol) (point)) diff --git a/modules/app/calendar/config.el b/modules/app/calendar/config.el index c1c9b0a43..197ed9f55 100644 --- a/modules/app/calendar/config.el +++ b/modules/app/calendar/config.el @@ -28,8 +28,7 @@ (define-key cfw:calendar-mode-map "q" #'+calendar/quit) - (when (featurep 'solaire-mode) - (add-hook 'cfw:calendar-mode-hook #'solaire-mode)) + (add-hook 'cfw:calendar-mode-hook #'doom|mark-buffer-as-real) (add-hook 'cfw:calendar-mode-hook 'hide-mode-line-mode) (advice-add #'cfw:render-button :override #'+calendar*cfw:render-button)) diff --git a/modules/feature/lookup/packages.el b/modules/feature/lookup/packages.el index 67e05165f..c127ebbfc 100644 --- a/modules/feature/lookup/packages.el +++ b/modules/feature/lookup/packages.el @@ -5,7 +5,7 @@ ;; be loaded before it is byte-compiled during installation. To ensure this, we ;; declare helm before dumb-jump. (when (featurep! :completion helm) - (depends-on! :completion helm)) + (package! helm)) ;; (package! dumb-jump) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index a67312d0c..02579ba42 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -11,9 +11,9 @@ ;; ;; Config -(add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) - -(after! elisp-mode +(def-package! elisp-mode + :mode ("\\.Cask\\'" . emacs-lisp-mode) + :config (set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/open-repl) (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set-lookup-handlers! 'emacs-lisp-mode diff --git a/modules/lang/latex/+viewers.el b/modules/lang/latex/+viewers.el index 28dc06322..5a237f11d 100644 --- a/modules/lang/latex/+viewers.el +++ b/modules/lang/latex/+viewers.el @@ -1,6 +1,6 @@ ;;; lang/latex/+viewers.el -*- lexical-binding: t; -*- -(cl-block 'viewer +(catch 'found-viewer (dolist (viewer +latex-viewers) (if (pcase viewer (`skim @@ -29,7 +29,7 @@ ;; Update PDF buffers after successful LaTeX runs (add-hook 'TeX-after-compilation-finished-function #'TeX-revert-document-buffer)))) - (cl-return-from 'viewer))) + (throw 'found-viewer t))) ;; fall back to latex-preview-pane (add-to-list 'TeX-view-program-list '("preview-pane" latex-preview-pane-mode)) @@ -40,7 +40,6 @@ (setq latex-preview-pane-multifile-mode 'auctex) (define-key! doc-view-mode-map - (kbd "ESC") #'delete-window - "q" #'delete-window - "k" (λ! (quit-window) (delete-window)))) - + "ESC" #'delete-window + "q" #'delete-window + "k" (λ! (quit-window) (delete-window)))) From 2e3cf80ffc4a7fca8802024dd9eb199f7484c7c7 Mon Sep 17 00:00:00 2001 From: Luigy Leon Date: Sun, 24 Feb 2019 18:39:31 -0500 Subject: [PATCH 3784/4235] Bind C-l to ivy-done in counsel-ag-map to make it more consistent with ivy-minibuffer-map --- modules/config/default/+evil-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index dd216510a..ab3de041b 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -302,6 +302,7 @@ (:after counsel :map counsel-ag-map "C-SPC" #'ivy-call-and-recenter ; preview + "C-l" #'ivy-done [backtab] #'+ivy/wgrep-occur ; search/replace on results [C-return] (+ivy-do-action! #'+ivy-git-grep-other-window-action)) (:after swiper From 1758266ce4720e431c7af52951982fbaad7d9310 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 20:40:16 -0500 Subject: [PATCH 3785/4235] Fix doom/describe-setters --- core/autoload/help.el | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 75d4d1a69..793a114f3 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -80,19 +80,18 @@ ;; TODO Could be cleaner (refactor me!) (cl-loop with maxwidth = (apply #'max (mapcar #'length (mapcar #'symbol-name settings))) for def in (sort settings #'string-lessp) - if (or (get def 'doom-module) - (doom-module-from-path (symbol-file def))) + if (get def 'doom-module) collect (format (format "%%-%ds%%s" (+ maxwidth 4)) def (propertize (format "%s %s" (car it) (cdr it)) 'face 'font-lock-comment-face)) - else if (file-in-directory-p (symbol-file def) doom-core-dir) + else if (and (string-match-p "^set-.+!$" (symbol-name def)) + (symbol-file def) + (file-in-directory-p (symbol-file def) doom-core-dir)) collect (format (format "%%-%ds%%s" (+ maxwidth 4)) - def (propertize (format "%s %s" :core (file-name-sans-extension (file-relative-name (symbol-file def) doom-core-dir))) - 'face 'font-lock-comment-face)) - else - collect (symbol-name def)) + def (propertize (format "core/%s.el" (file-name-sans-extension (file-relative-name (symbol-file def) doom-core-dir))) + 'face 'font-lock-comment-face))) nil t (when (and (symbolp sym) (string-match-p "!$" (symbol-name sym))) From 6fd34cd10f813f09024b0bf2641dd19af0b1f6d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 20:59:29 -0500 Subject: [PATCH 3786/4235] Revise documentation for defer-feature! macro --- core/core-lib.el | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 86bf7cf60..90431d559 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -143,20 +143,25 @@ serve as a predicated alternative to `after!'." (add-hook 'after-load-functions #',fun))))) (defmacro defer-feature! (feature &optional mode) - "TODO" + "Pretend FEATURE hasn't been loaded yet, until FEATURE-hook is triggered. + +Some packages (like `elisp-mode' and `lisp-mode') are loaded immediately at +startup, which will prematurely trigger `after!' (and `with-eval-after-load') +blocks. To get around this we make Emacs believe FEATURE hasn't been loaded yet, +then wait until FEATURE-hook (or MODE-hook, if MODE is provided) is triggered to +reverse this and trigger `after!' blocks at a more reasonable time." (let ((advice-fn (intern (format "doom|defer-feature-%s" feature))) (mode (or mode feature))) `(progn - (delq ',feature features) + (setq features (delq ',feature features)) (advice-add #',mode :before #',advice-fn) (defun ,advice-fn (&rest _) - ;; Some plugins (like yasnippet) run `lisp-mode' early, to parse some - ;; elisp. This would prematurely trigger this function. In these cases, - ;; `lisp-mode-hook' is let-bound to nil or its hooks are delayed, so if - ;; we see either, keep pretending elisp-mode isn't loaded. + ;; Some plugins (like yasnippet) will invoke a mode early, e.g. to + ;; parse some code. This would prematurely trigger this function. This + ;; checks for that: (when (and ,(intern (format "%s-hook" mode)) (not delay-mode-hooks)) - ;; Otherwise, announce to the world elisp-mode has been loaded, so + ;; Otherwise, announce to the world this package has been loaded, so ;; `after!' handlers can respond and configure elisp-mode as ;; expected. (provide ',feature) From 4ccbc9c7df657d3c24c81319795ced1129a15212 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 21:00:19 -0500 Subject: [PATCH 3787/4235] Update major-mode=>module alist for help commands --- core/autoload/help.el | 95 ++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 793a114f3..5aee16ed1 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -1,45 +1,67 @@ ;;; core/autoload/help.el -*- lexical-binding: t; -*- (defvar doom--module-mode-alist - '((c-mode :lang cc) - (c++-mode :lang cc) - (objc++-mode :lang cc) - (java-mode :lang java) - (csharp-mode :lang csharp) - (clojure-mode :lang clojure) + '((dockerfile-mode :tools docker) + (haxor-mode :lang assembly) + (mips-mode :lang assembly) + (nasm-mode :lang assembly) + (c-mode :lang cc) + (c++-mode :lang cc) + (objc++-mode :lang cc) + (crystal-mode :lang crystal) + (lisp-mode :lang common-lisp) + (csharp-mode :lang csharp) + (clojure-mode :lang clojure) + (graphql-mode :lang data) + (toml-mode :lang data) + (json-mode :lang data) + (yaml-mode :lang data) + (csv-mode :lang data) + (dhall-mode :lang data) + (erlang-mode :lang erlang) + (elixir-mode :lang elixir) + (elm-mode :lang elm) (emacs-lisp-mode :lang emacs-lisp) - (go-mode :lang go) - (haskell-mode :lang haskell) - (js2-mode :lang javascript) - (julia-mode :lang julia) - (latex-mode :lang latex) - (LaTeX-mode :lang latex) - (ledger-mode :lang ledger) - (lua-mode :lang lua) - (markdown-mode :lang markdown) - (gfm-mode :lang markdown) - (ocaml-mode :lang ocaml) - (org-mode :lang org) - (perl-mode :lang perl) - (php-mode :lang php) - (hack-mode :lang php) - (plantuml-mode :lang plantuml) + (ess-r-mode :lang ess) + (ess-julia-mode :lang ess) + (go-mode :lang go) + (haskell-mode :lang haskell) + (hy-mode :lang hy) + (java-mode :lang java) + (js2-mode :lang javascript) + (rjsx-mode :lang javascript) + (typescript-mode :lang javascript) + (coffee-mode :lang javascript) + (julia-mode :lang julia) + (latex-mode :lang latex) + (LaTeX-mode :lang latex) + (ledger-mode :lang ledger) + (lua-mode :lang lua) + (markdown-mode :lang markdown) + (gfm-mode :lang markdown) + (nim-mode :lang nim) + (nix-mode :lang nix) + (taureg-mode :lang ocaml) + (org-mode :lang org) + (perl-mode :lang perl) + (php-mode :lang php) + (hack-mode :lang php) + (plantuml-mode :lang plantuml) (purescript-mode :lang purescript) - (python-mode :lang python) + (python-mode :lang python) (restclient-mode :lang rest) - (ruby-mode :lang ruby) - (enh-ruby-mode :lang ruby) - (rust-mode :lang rust) - (scala-mode :lang scala) - (sh-mode :lang sh) - (swift-mode :lang swift) - (typescript-mode :lang typescript) - (web-mode :lang web) - (css-mode :lang web) - (scss-mode :lang web) - (sass-mode :lang web) - (less-css-mode :lang web) - (stylus-mode :lang web)) + (ruby-mode :lang ruby) + (enh-ruby-mode :lang ruby) + (rust-mode :lang rust) + (scala-mode :lang scala) + (sh-mode :lang sh) + (swift-mode :lang swift) + (web-mode :lang web) + (css-mode :lang web) + (scss-mode :lang web) + (sass-mode :lang web) + (less-css-mode :lang web) + (stylus-mode :lang web)) "TODO") @@ -54,7 +76,6 @@ collect mode)) - ;; ;; Commands From f5a18d37510a9da8acbfdf14988935a3b11fdc12 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 21:00:46 -0500 Subject: [PATCH 3788/4235] +python|adjust-mode-line -> +python|init-mode-line To be consistent with other initializer hooks. --- modules/lang/python/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 717725a4e..5e7ce2110 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -58,9 +58,9 @@ called.") (setq-hook! 'python-mode-hook tab-width python-indent-offset) ;; Add python/pipenv version string to the major mode in the modeline - (defun +python|adjust-mode-line () + (defun +python|init-mode-line () (setq mode-name +python-mode-line-indicator)) - (add-hook 'python-mode-hook #'+python|adjust-mode-line) + (add-hook 'python-mode-hook #'+python|init-mode-line) (add-hook 'python-mode-hook #'+python|update-version)) From 8de36a3b5a5edaa61f5dde6fdb5c32a6e9678b60 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 22:23:24 -0500 Subject: [PATCH 3789/4235] +ruby|adjust-mode-line -> +ruby|init-mode-line To be consistent with other initializer hooks. --- modules/lang/ruby/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index cb391bd37..009927d4f 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -37,9 +37,9 @@ (setq-hook! (ruby-mode enh-ruby-mode) sp-max-pair-length 6) ;; Add ruby version string to the major mode in the modeline - (defun +ruby|adjust-mode-line () + (defun +ruby|init-mode-line () (setq mode-name +ruby-mode-line-indicator)) - (add-hook 'enh-ruby-mode-hook #'+ruby|adjust-mode-line) + (add-hook 'enh-ruby-mode-hook #'+ruby|init-mode-line) (add-hook 'enh-ruby-mode-hook #'+ruby|update-version)) From b7228fdfad2ac70bd8cc2c42a064c7d0df718263 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Feb 2019 22:24:57 -0500 Subject: [PATCH 3790/4235] Default to ivy, rather than helm As an ivy user, I maintain the ivy module more actively. Also, my former misgivings with ivy have mostly be resolved. --- init.example.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.example.el b/init.example.el index 08180c997..30d0c4b63 100644 --- a/init.example.el +++ b/init.example.el @@ -13,9 +13,9 @@ :completion company ; the ultimate code completion backend - helm ; the *other* search engine for love and life + ;;helm ; the *other* search engine for love and life ;;ido ; the other *other* search engine... - ;;ivy ; a search engine for love and life + ivy ; a search engine for love and life :ui ;;deft ; notational velocity for Emacs From fed0a51f9efe322308b1b5f6148c86215ccecef3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Feb 2019 00:26:08 -0500 Subject: [PATCH 3791/4235] Fix ns-auto-titlebar not correctly being activated Makes +doom|determine-ns-appearance redundant. --- core/core-os.el | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 945a57874..4723f6183 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -36,7 +36,8 @@ (when (or (daemonp) (display-graphic-p)) ;; Syncs ns frame parameters with theme (and fixes mismatching text ;; colr in the frame title) - (require 'ns-auto-titlebar nil t) + (when (require 'ns-auto-titlebar nil t) + (add-hook 'doom-load-theme-hook #'ns-auto-titlebar-mode)) ;; A known problem with GUI Emacs on MacOS (or daemons started via ;; launchctl or brew services): it runs in an isolated @@ -51,21 +52,7 @@ exec-path-from-shell-debug doom-debug-mode exec-path-from-shell-variables (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) - (exec-path-from-shell-initialize))) - - (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t)) - (defun +doom|determine-ns-appearance () - (let ((appearance (cl-destructuring-bind (r g b) (doom-name-to-rgb "#E5E9F0") - (if (> (+ (* r 0.2126) - (* g 0.7152) - (* b 0.0722)) - 0.45) - 'light - 'dark)))) - (setf (alist-get 'ns-appearance default-frame-alist) appearance) - (dolist (frame (frame-list)) - (set-frame-parameter frame 'ns-appearance appearance)))) - (add-hook 'doom-load-theme-hook #'+doom|determine-ns-appearance)) + (exec-path-from-shell-initialize)))) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! From 35a1038ee9f491810bf312ea723f9e334c8c65a9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Feb 2019 01:37:46 -0500 Subject: [PATCH 3792/4235] Update license year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 93b8e4bb1..02b93bee4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016-2018 Henrik Lissner. +Copyright (c) 2016-2019 Henrik Lissner. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the From faa43676360b63504ce774026f86cf876806b6e2 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Mon, 25 Feb 2019 00:22:36 +1000 Subject: [PATCH 3793/4235] Improved switch-to-buffer-other-window for ivy --- modules/completion/ivy/autoload/ivy.el | 10 +++++++++- modules/completion/ivy/config.el | 4 +++- modules/config/default/+emacs-bindings.el | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index dc39f863c..322f66801 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -34,7 +34,9 @@ temporary/special buffers in `font-lock-comment-face'." If ARG (universal argument), open selection in other-window." (interactive "P") - (ivy-read "Switch to workspace buffer: " + (ivy-read (if arg + "Switch to workspace buffer in other window: " + "Switch to workspace buffer: ") 'internal-complete-buffer :predicate #'+ivy--is-workspace-or-other-buffer-p :action (if arg @@ -44,6 +46,12 @@ If ARG (universal argument), open selection in other-window." :keymap ivy-switch-buffer-map :caller #'+ivy/switch-workspace-buffer)) +;;;###autoload +(defun +ivy/switch-workspace-buffer-other-window (&optional arg) + "Switch the other window to a buffer within the current workspace." + (interactive) + (+ivy/switch-workspace-buffer t)) + (defun +ivy--tasks-candidates (tasks) "Generate a list of task tags (specified by `+ivy-task-tags') for `+ivy/tasks'." diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e171d4957..cca0f2969 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -76,7 +76,9 @@ immediately runs it on the current candidate (ending the ivy session)." :hook (ivy-mode . ivy-rich-mode) :config ;; Show more buffer information in other switch-buffer commands too - (dolist (cmd '(+ivy/switch-workspace-buffer + (dolist (cmd '(ivy-switch-buffer-other-window + +ivy/switch-workspace-buffer + +ivy/switch-workspace-buffer-other-window counsel-projectile-switch-to-buffer)) (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer)) ;; Use `+ivy-rich-buffer-name' to display buffer names diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 9bfb19cbf..221e634b0 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -34,8 +34,11 @@ "C-S-r" #'helm-resume) ;; Buffer related bindings "C-x b" #'persp-switch-to-buffer + (:when (featurep! :completion ivy) + "C-x 4 b" #'+ivy/switch-workspace-buffer-other-window) "C-x C-b" #'ibuffer-list-buffers "C-x B" #'switch-to-buffer + "C-x 4 B" #'switch-to-buffer-other-window "C-x k" #'doom/kill-this-buffer-in-all-windows ;; Popup bindigns "C-x p" #'+popup/other From cd997383daeedf2644e583e3f8be0115c7f4b6c3 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Mon, 25 Feb 2019 00:33:40 +1000 Subject: [PATCH 3794/4235] Replace cquery with ccls for C/C++ LSP support --- modules/lang/cc/config.el | 19 +++++++++---------- modules/lang/cc/packages.el | 2 +- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index f0535061c..ecd4a96a3 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -224,17 +224,16 @@ compilation database is present in the project.") ;; ;; LSP -(def-package! cquery +(def-package! ccls :when (featurep! +lsp) - :hook ((c-mode c++-mode objc-mode) . +lsp|init-cquery) + :hook ((c-mode c++-mode objc-mode) . +lsp|init-ccls) :config - (defun +lsp|init-cquery () + (defun +lsp|init-ccls () (setq-local company-transformers nil) + (setq-local company-lsp-async t) (setq-local company-lsp-cache-candidates nil) - (condition-case nil - (lsp) - (user-error nil))) - (setq cquery-extra-init-params - '(:index (:comments 2) - :cacheFormat "msgpack" - :completion (:detailedLabel t)))) + (lsp)) + (after! projectile + (add-to-list 'projectile-globally-ignored-directories ".ccls-cache") + (add-to-list 'projectile-project-root-files-bottom-up ".ccls-root") + (add-to-list 'projectile-project-root-files-top-down-recurring "compile_commands.json"))) diff --git a/modules/lang/cc/packages.el b/modules/lang/cc/packages.el index d0213da5c..5a73da2f9 100644 --- a/modules/lang/cc/packages.el +++ b/modules/lang/cc/packages.el @@ -13,7 +13,7 @@ (package! company-glsl :recipe (:fetcher github :repo "Kaali/company-glsl")))) (if (featurep! +lsp) - (package! cquery) + (package! ccls) (when (package! irony) (package! irony-eldoc) (when (featurep! :tools flycheck) From 69a6e60f84e578b4b5a5c6efa693010c3a51fe7a Mon Sep 17 00:00:00 2001 From: Aria Edmonds Date: Tue, 26 Feb 2019 02:18:37 +1100 Subject: [PATCH 3795/4235] lang/haskell +lsp: enable snippet completion --- modules/lang/haskell/+lsp.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+lsp.el b/modules/lang/haskell/+lsp.el index 80bcec789..a958773fe 100644 --- a/modules/lang/haskell/+lsp.el +++ b/modules/lang/haskell/+lsp.el @@ -5,4 +5,4 @@ :init (add-hook 'haskell-mode-hook #'+lsp|init) :config ;; Does some strange indentation if it pastes in the snippet - (setq company-lsp-enable-snippet nil)) + (setq yas-indent-line 'fixed)) From 9c085c0553450084a96f7c4ccf83c90d63331ca8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Feb 2019 22:26:13 -0500 Subject: [PATCH 3796/4235] Set yas-indent-line only in haskell-mode --- modules/lang/haskell/+lsp.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/haskell/+lsp.el b/modules/lang/haskell/+lsp.el index a958773fe..7a718ca70 100644 --- a/modules/lang/haskell/+lsp.el +++ b/modules/lang/haskell/+lsp.el @@ -5,4 +5,4 @@ :init (add-hook 'haskell-mode-hook #'+lsp|init) :config ;; Does some strange indentation if it pastes in the snippet - (setq yas-indent-line 'fixed)) + (setq-hook! 'haskell-mode-hook yas-indent-line 'fixed)) From 2d3937ac1f8d7c096e734f8ba9cd048a1b9bb4e7 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Tue, 26 Feb 2019 10:26:19 +1000 Subject: [PATCH 3797/4235] Restore C/C++ default-header-file-mode support --- modules/lang/cc/autoload.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index c354e84de..0aba0b2dc 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -70,9 +70,9 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." "\\|[-+] ([a-zA-Z0-9_]+)" "\\)"))) (objc-mode)) - ((fboundp 'c-or-c++-mode) ; introduced in Emacs 26.1 - (c-or-c++-mode)) - ((+cc--re-search-for ; TODO Remove this along with Emacs 25 support + ;; NOTE c-or-c++-mode was introduced in Emacs 26.1, but it doesn't + ;; support specification of a default/fallback mode + ((+cc--re-search-for (let ((id "[a-zA-Z0-9_]+") (ws "[ \t\r]+") (ws-maybe "[ \t\r]*")) (concat "^" ws-maybe "\\(?:" "using" ws "\\(?:namespace" ws "std;\\|std::\\)" From 6e4e11ebb8f2158bdcfe7b55a553bed5cfe68113 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Tue, 26 Feb 2019 12:39:43 +1000 Subject: [PATCH 3798/4235] Remove C/C++ tab-always-indent override --- modules/config/default/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index c1263ac10..1fcfe7c4d 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -69,8 +69,7 @@ (after! cc-mode (c-toggle-electric-state -1) (c-toggle-auto-newline -1) - (setq c-tab-always-indent nil - c-electric-flag nil) + (setq c-electric-flag nil) (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) (define-key c-mode-base-map key nil))) From 15dd5870ea5c0f157529679a2ad9337fcd31e1a5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Feb 2019 20:16:41 -0500 Subject: [PATCH 3799/4235] Fix uniquify+persp-mode compatibility Uniquify would rename buffers across workspaces, causing "sticky" buffers when switch between workspaces with buffers that have the same base name. --- 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 a7c745a93..db69767c1 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -86,7 +86,7 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") resize-mini-windows 'grow-only ; Minibuffer resizing show-help-function nil ; hide :help-echo text split-width-threshold 160 ; favor horizontal splits - uniquify-buffer-name-style 'forward + uniquify-buffer-name-style nil ; custom modeline will show file paths anyway use-dialog-box nil ; always avoid GUI visible-cursor nil x-stretch-cursor nil From 1b43ea50f07ef7e4f96abf648c1c189a5278ad21 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 13:21:16 -0500 Subject: [PATCH 3800/4235] Revise SPC f keybinds - SPC f . -> counsel-file-jump or find-file - SPC f > -> doom/browse-in-other-projects - SPC f / -> projectile-find-file - SPC f ? -> doom/find-file-in-other-project - Moved doom/sudo-find-file to SPC f S This change was made to accommodate the new doom/browse-in-other-projects and doom/find-file-in-other-project commands, which make it easy to jump to files in other known projects. --- core/autoload/projects.el | 22 ++++++++++++++++++++++ modules/config/default/+evil-bindings.el | 7 ++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index bc1c911b0..9d5e76848 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -33,6 +33,28 @@ they are absolute." (dolist (fn projectile-project-root-files-functions) (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) +;;;###autoload +(defun doom/find-file-in-other-project (project-root) + "Preforms `projectile-find-file' in a known project of your choosing." + (interactive + (list + (completing-read "Find file in project: " (projectile-relevant-known-projects) + nil nil nil nil (doom-project-root)))) + (unless (file-directory-p project-root) + (error "Project directory '%s' doesn't exist" project-root)) + (doom-project-find-file project-root)) + +;;;###autoload +(defun doom/browse-in-other-project (project-root) + "Preforms `find-file' in a known project of your choosing." + (interactive + (list + (completing-read "Browse in project: " (projectile-relevant-known-projects) + nil nil nil nil (doom-project-root)))) + (unless (file-directory-p project-root) + (error "Project directory '%s' doesn't exist" project-root)) + (doom-project-browse project-root)) + ;; ;; Library diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ab3de041b..35b3f8afe 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -609,10 +609,10 @@ :desc "List errors" "x" #'flycheck-list-errors) (:prefix ("f" . "file") - :desc "Find file" "." #'find-file + :desc "Find file from here" "." (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file) + :desc "Find file in other project" ">" #'doom/browse-in-other-project :desc "Find file in project" "/" #'projectile-find-file - :desc "Sudo find file" ">" #'doom/sudo-find-file - :desc "Find file from here" "?" #'counsel-file-jump + :desc "Find file in other project" "?" #'doom/find-file-in-other-project :desc "Browse emacs.d" "E" #'+default/browse-emacsd :desc "Browse private config" "P" #'+default/browse-config :desc "Recent project files" "R" #'projectile-recentf @@ -624,6 +624,7 @@ :desc "Find file in private config" "p" #'+default/find-in-config :desc "Recent files" "r" #'recentf-open-files :desc "Save file" "s" #'save-buffer + :desc "Sudo find file" "S" #'doom/sudo-find-file :desc "Yank filename" "y" #'+default/yank-buffer-filename) (:prefix ("g" . "git") From d83ba452ef6e779adfebe8ba0c579adc7afc0b36 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 13:23:42 -0500 Subject: [PATCH 3801/4235] Refactor +cc-c-c++-objc-mode Improve docstring and a minor correction to C++ detection regexp. --- modules/lang/cc/autoload.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 0aba0b2dc..4eb371b1a 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -56,7 +56,16 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." ;;;###autoload (defun +cc-c-c++-objc-mode () - "Sets either `c-mode', `objc-mode' or `c++-mode', whichever is appropriate." + "Uses heuristics to detect `c-mode', `objc-mode' or `c++-mode'. + +1. Checks if there are nearby cpp/cc/m/mm files with the same name. +2. Checks for ObjC and C++-specific keywords and libraries. +3. Falls back to `+cc-default-header-file-mode', if set. +4. Otherwise, activates `c-mode'. + +This is meant to replace `c-or-c++-mode' (introduced in Emacs 26.1), which +doesn't support specification of the fallback mode and whose heuristics are +simpler." (let ((base (file-name-sans-extension (buffer-file-name (buffer-base-buffer))))) (cond ((file-exists-p! (or (concat base ".cpp") (concat base ".cc"))) @@ -70,13 +79,11 @@ preceded by the opening brace or a comma (disregarding whitespace in between)." "\\|[-+] ([a-zA-Z0-9_]+)" "\\)"))) (objc-mode)) - ;; NOTE c-or-c++-mode was introduced in Emacs 26.1, but it doesn't - ;; support specification of a default/fallback mode ((+cc--re-search-for (let ((id "[a-zA-Z0-9_]+") (ws "[ \t\r]+") (ws-maybe "[ \t\r]*")) (concat "^" ws-maybe "\\(?:" - "using" ws "\\(?:namespace" ws "std;\\|std::\\)" - "\\|" "namespace" "\\(:?" ws id "\\)?" ws-maybe "{" + "using" ws "\\(?:namespace" ws "std;\\|std::\\)" + "\\|" "namespace" "\\(?:" ws id "\\)?" ws-maybe "{" "\\|" "class" ws id ws-maybe "[:{\n]" "\\|" "template" ws-maybe "<.*>" "\\|" "#include" ws-maybe "<\\(?:string\\|iostream\\|map\\)>" From db2949ff32da66780b18b1de6ceecc690c53210c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 16:46:26 -0500 Subject: [PATCH 3802/4235] Improve flyspell support + Make flyspell more selective about what to scan in markdown buffers. + Don't mark duplicates when proseline or langtool are present. + Add set-flyspell-predicate! for seeing mode-specific word predicates. --- modules/lang/markdown/autoload.el | 20 ++++++++++++++++++++ modules/lang/markdown/config.el | 2 ++ modules/tools/flyspell/autoload.el | 16 ++++++++++++++++ modules/tools/flyspell/config.el | 25 +++++++++++++++++++------ 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 modules/tools/flyspell/autoload.el diff --git a/modules/lang/markdown/autoload.el b/modules/lang/markdown/autoload.el index e7ef946c7..0bbbf0feb 100644 --- a/modules/lang/markdown/autoload.el +++ b/modules/lang/markdown/autoload.el @@ -20,3 +20,23 @@ (if (thing-at-point-looking-at +markdown--regex-del) (markdown-unwrap-thing-at-point nil 2 4) (markdown-wrap-or-insert delim delim 'word nil nil))))) + +;;;###autoload +(defun +markdown-flyspell-word-p () + "Return t if point is on a word that should be spell checked. + +Return nil if on a link url, markup, html, or references." + (let ((faces (doom-enlist (get-text-property (point) 'face)))) + (or (and (memq 'font-lock-comment-face faces) + (memq 'markdown-code-face faces)) + (not (cl-loop with unsafe-faces = '(markdown-reference-face + markdown-url-face + markdown-markup-face + markdown-comment-face + markdown-html-attr-name-face + markdown-html-attr-value-face + markdown-html-tag-name-face + markdown-code-face) + for face in faces + if (memq face unsafe-faces) + return t))))) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index ef0a43f9e..e64f7d753 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -17,6 +17,8 @@ markdown-gfm-uppercase-checkbox t) ; for compat with org-mode :config + (set-flyspell-predicate! '(markdown-mode gfm-mode) #'+markdown-flyspell-word-p) + (defun +markdown|set-fill-column-and-line-spacing () (setq-local line-spacing 2) (setq-local fill-column 80)) diff --git a/modules/tools/flyspell/autoload.el b/modules/tools/flyspell/autoload.el new file mode 100644 index 000000000..5b214bee4 --- /dev/null +++ b/modules/tools/flyspell/autoload.el @@ -0,0 +1,16 @@ +;;; tools/flyspell/autoload.el -*- lexical-binding: t; -*- + +(defvar +flyspell--predicate-alist nil + "TODO") + +;;;###autodef +(defun set-flyspell-predicate! (modes predicate) + "TODO" + (dolist (mode (doom-enlist modes) +flyspell--predicate-alist) + (add-to-list '+flyspell--predicate-alist (cons mode predicate)))) + +;;;###autoload +(defun +flyspell|init-predicate () + "TODO" + (when-let* ((pred (assq major-mode +flyspell--predicate-alist))) + (setq-local flyspell-generic-check-word-predicate (cdr pred)))) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index 2b6958c5e..ab3030bcc 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -47,13 +47,26 @@ Since spellchecking can be slow in some buffers, this can be disabled with: ;; `flyspell' (built-in) -(setq flyspell-issue-welcome-flag nil) +(progn + (setq flyspell-issue-welcome-flag nil) -(defun +flyspell|immediately () - "Spellcheck the buffer when `flyspell-mode' is enabled." - (when (and flyspell-mode +flyspell-immediately) - (flyspell-buffer))) -(add-hook 'flyspell-mode-hook #'+flyspell|immediately) + (defun +flyspell|inhibit-duplicate-detection-maybe () + "Don't mark duplicates when style/grammar linters are present. +e.g. proselint and langtool." + (when (or (executable-find "proselint") + (featurep 'langtool)) + (setq-local flyspell-mark-duplications-flag nil))) + (add-hook 'flyspell-mode-hook #'+flyspell|inhibit-duplicate-detection-maybe) + + (defun +flyspell|immediately () + "Spellcheck the buffer when `flyspell-mode' is enabled." + (when (and flyspell-mode +flyspell-immediately) + (flyspell-buffer))) + (add-hook 'flyspell-mode-hook #'+flyspell|immediately) + + ;; Ensure mode-local predicates declared with `set-flyspell-predicate!' are + ;; used in their respective major modes. + (add-hook 'flyspell-mode-hook #'+flyspell|init-predicate)) (def-package! flyspell-correct From 594df649131dc6dd0953d8c914eacc12a01ffcf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 16:54:32 -0500 Subject: [PATCH 3803/4235] Smarter RET in normal mode over flyspell regions Will now trigger flyspell-correct-word-generic --- modules/config/default/+evil-bindings.el | 6 ++++++ modules/tools/flyspell/autoload.el | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 35b3f8afe..1021d8644 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -55,6 +55,12 @@ (fboundp 'evilmi-jump-items) 'evilmi-jump-items) + ;; Smarter RET in normal mode + :n "RET" (general-predicate-dispatch nil + (and (bound-and-true-p flyspell-mode) + (+flyspell-correction-at-point-p)) + 'flyspell-correct-word-generic) + ;; Smarter newlines :i [remap newline] #'newline-and-indent ; auto-indent on newline :i "C-j" #'+default/newline ; default behavior diff --git a/modules/tools/flyspell/autoload.el b/modules/tools/flyspell/autoload.el index 5b214bee4..139b98061 100644 --- a/modules/tools/flyspell/autoload.el +++ b/modules/tools/flyspell/autoload.el @@ -14,3 +14,10 @@ "TODO" (when-let* ((pred (assq major-mode +flyspell--predicate-alist))) (setq-local flyspell-generic-check-word-predicate (cdr pred)))) + +;;;###autoload +(defun +flyspell-correction-at-point-p (&optional point) + "TODO" + (cl-loop for ov in (overlays-at (or point (point))) + if (overlay-get ov 'flyspell-overlay) + return t)) From de4b18a2dcd74dd1f78c80405938f2e67f41d30e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 16:57:14 -0500 Subject: [PATCH 3804/4235] feature/lookup: refactor backend dispatcher Hopefully improves compatibility with async handlers. Still a WIP. --- modules/feature/lookup/autoload/lookup.el | 87 ++++++++++------------- 1 file changed, 39 insertions(+), 48 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index da2b4fc25..f69e8c344 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -84,7 +84,7 @@ Otherwise, these properties are available to be set: ;; -;; Library +;; Helpers ;; Helpers (defun +lookup--online-provider (&optional force-p namespace) @@ -107,52 +107,44 @@ Otherwise, these properties are available to be set: ((require 'xref nil t) (xref-backend-identifier-at-point (xref-find-backend))))) -(defun +lookup--jump-to (prop identifier &optional other-window) - ;; TODO Refactor me - (let ((origin (point-marker))) - (cl-loop for fn - in (plist-get (list :definition +lookup-definition-functions - :references +lookup-references-functions - :documentation +lookup-documentation-functions - :file +lookup-file-functions) - prop) - for cmd = (or (command-remapping fn) fn) - if (get fn '+lookup-async) - return - (progn - (when other-window - ;; If async, we can't catch the window change or destination buffer - ;; reliably, so we set up the new window ahead of time. - (switch-to-buffer-other-window (current-buffer)) - (goto-char (marker-position origin))) - (call-interactively fn) - t) - if (condition-case e - (save-window-excursion - (when (or (if (commandp cmd) - (call-interactively cmd) - (funcall cmd identifier)) - (/= (point-marker) origin)) - (point-marker))) - (error (ignore (message "%s" e)))) - return - (progn - (funcall (if other-window - #'switch-to-buffer-other-window - #'switch-to-buffer) - (marker-buffer it)) - (goto-char it))))) +(defun +lookup--run-hooks (hook identifier origin &optional other-window) + (condition-case-unless-debug e + (if (get hook '+lookup-async) + (progn + (when other-window + ;; If async, we can't catch the window change or destination buffer + ;; reliably, so we set up the new window ahead of time. + (switch-to-buffer-other-window (current-buffer)) + (goto-char (marker-position origin))) + (call-interactively hook) + t) + (save-window-excursion + (when (or (if (commandp hook) + (call-interactively hook) + (funcall hook identifier)) + (/= (point-marker) origin)) + (point-marker)))) + ((error user-error) + (message "%s" e) + nil))) -(defun +lookup--file-search (identifier) - (unless identifier - (let ((query (rxt-quote-pcre identifier))) - (ignore-errors - (cond ((featurep! :completion ivy) - (+ivy-file-search nil :query query) - t) - ((featurep! :completion helm) - (+helm-file-search nil :query query) - t)))))) +(defun +lookup--jump-to (prop identifier &optional other-window) + (let ((ret (run-hook-wrapped + (plist-get (list :definition '+lookup-definition-functions + :references '+lookup-references-functions + :documentation '+lookup-documentation-functions + :file '+lookup-file-functions) + prop) + '+lookup--run-hooks + identifier (point-marker) other-window))) + (cond ((null ret) + (message "Could not find '%s'" identifier)) + ((markerp ret) + (funcall (if other-window + #'switch-to-buffer-other-window + #'switch-to-buffer) + (marker-buffer ret)) + (goto-char ret))))) ;; @@ -196,8 +188,7 @@ falling back to git-grep)." (defun +lookup-evil-goto-definition-backend (identifier) "Uses `evil-goto-definition' to conduct a text search for IDENTIFIER in the current buffer." - (and (featurep 'evil) - evil-mode + (and (fboundp 'evil-goto-definition) (ignore-errors (cl-destructuring-bind (beg . end) (bounds-of-thing-at-point 'symbol) From 4c35618044f1658318cd5d1b6094090b0e35a875 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 17:29:40 -0500 Subject: [PATCH 3805/4235] Improve version check for line-numbers polyfill Since there are early versions of Emacs [26.0, 26.1) that don't have the new line numbers library. --- core/autoload/line-numbers.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/line-numbers.el b/core/autoload/line-numbers.el index 10862f1fd..a926c0a2b 100644 --- a/core/autoload/line-numbers.el +++ b/core/autoload/line-numbers.el @@ -1,5 +1,5 @@ ;;; core/autoload/line-numbers.el -*- lexical-binding: t; -*- -;;;###if (not EMACS26+) +;;;###if (version< emacs-version "26.1") ;; This was lifted out of the display-line-numbers library in Emacs 26.1 and ;; modified to use nlinum for Emacs 25.x users. It should be removed should From 11a528be043c98c11832f4afeb4d3ba171872c07 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 18:05:48 -0500 Subject: [PATCH 3806/4235] Fix infinite recursion in +flycheck|disable-popup-mode-for-lsp --- modules/tools/flycheck/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index 610b42c3f..0c080c363 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -34,7 +34,7 @@ :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) :init (add-hook 'flycheck-mode-hook #'+flycheck-popup-mode) - (add-hook '+flycheck-popup-mode-hook #'+flycheck|disable-popup-mode-for-lsp) + (add-hook 'lsp-ui-mode-hook #'+flycheck|disable-popup-mode-for-lsp) :config (setq flycheck-popup-tip-error-prefix "✕ ")) From 7361e05582e3ee13dd8ca55a5ddaa02d85470b65 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 18:25:52 -0500 Subject: [PATCH 3807/4235] tools/flycheck: refactor popup-tip minor mode Less code, fewer problems. --- modules/tools/flycheck/autoload.el | 50 +++++++----------------------- modules/tools/flycheck/config.el | 11 ++++--- 2 files changed, 18 insertions(+), 43 deletions(-) diff --git a/modules/tools/flycheck/autoload.el b/modules/tools/flycheck/autoload.el index 0d4e3e54e..bfc65a51f 100644 --- a/modules/tools/flycheck/autoload.el +++ b/modules/tools/flycheck/autoload.el @@ -1,52 +1,24 @@ ;;; tools/flycheck/autoload.el -*- lexical-binding: t; -*- -(defun +flycheck-show-popup (errors) - "TODO" - (if (and EMACS26+ - (featurep! +childframe) - (display-graphic-p)) - (flycheck-posframe-show-posframe errors) - (flycheck-popup-tip-show-popup errors))) - -(defun +flycheck-cleanup-popup () +;;;###autoload +(defun +flycheck*popup-tip-delete-popup (orig-fn) "TODO" (when (display-graphic-p) - (flycheck-popup-tip-delete-popup))) + (funcall orig-fn))) ;;;###autoload -(define-minor-mode +flycheck-popup-mode +(defun +flycheck*popup-tip-show-popup (orig-fn errors) "TODO" - :lighter nil - :group 'doom - (require 'flycheck-popup-tip) - (let ((hooks '(post-command-hook focus-out-hook))) - (cond - ;; Use our display function and remember the old one but only if we haven't - ;; yet configured it, to avoid activating twice. - ((and +flycheck-popup-mode - (not (eq flycheck-display-errors-function - #'+flycheck-show-popup))) - (setq flycheck-popup-tip-old-display-function - flycheck-display-errors-function - flycheck-display-errors-function - #'+flycheck-show-popup) - (dolist (hook hooks) - (add-hook hook #'+flycheck-cleanup-popup nil t))) - ;; Reset the display function and remove ourselves from all hooks but only - ;; if the mode is still active. - ((and (not +flycheck-popup-mode) - (eq flycheck-display-errors-function - #'+flycheck-show-popup)) - (setq flycheck-display-errors-function - flycheck-popup-tip-old-display-function - flycheck-popup-tip-old-display-function nil) - (dolist (hook hooks) - (remove-hook hook '+flycheck-cleanup-popup t)))))) + (if (and EMACS26+ + (featurep 'flycheck-posframe) + (display-graphic-p)) + (flycheck-posframe-show-posframe errors) + (funcall orig-fn errors))) ;;;###autoload -(defun +flycheck|disable-popup-mode-for-lsp () +(defun +flycheck|disable-popup-tip-for-lsp () "Disable `+flycheck-popup-mode' if `lsp-ui-mode' and `lsp-ui-sideline-enable' are non-nil." (when (and (bound-and-true-p lsp-ui-mode) lsp-ui-sideline-enable) - (+flycheck-popup-mode -1))) + (flycheck-popup-tip-mode -1))) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index 0c080c363..c3983261a 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -32,11 +32,14 @@ (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) - :init - (add-hook 'flycheck-mode-hook #'+flycheck-popup-mode) - (add-hook 'lsp-ui-mode-hook #'+flycheck|disable-popup-mode-for-lsp) + :hook (flycheck-mode . flycheck-popup-tip-mode) + :init (add-hook 'lsp-ui-mode-hook #'+flycheck|disable-popup-tip-for-lsp) :config - (setq flycheck-popup-tip-error-prefix "✕ ")) + (setq flycheck-popup-tip-error-prefix "✕ ") + ;; Allow `flycheck-posframe' or `flycheck-popup-tip' to co-exist + ;; interchangibly, depending on the display device (terminal or GUI Emacs). + (advice-add #'flycheck-popup-tip-show-popup :around #'+flycheck*popup-tip-show-popup) + (advice-add #'flycheck-popup-tip-delete-popup :around #'+flycheck*popup-tip-delete-popup)) (def-package! flycheck-posframe From 3e8598169580990ef4445c9ea1429881ba15f77a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 21:30:51 -0500 Subject: [PATCH 3808/4235] Add process-menu-mode-map keybinds for evil --- modules/feature/evil/+everywhere.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 31abcf6a1..d60bf722c 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -195,6 +195,10 @@ variable for an explanation of the defaults (in comments). See "]l" #'forward-button "[l" #'backward-button)) +(evil-define-key* 'normal process-menu-mode-map + "q" #'kill-this-buffer + "d" #'process-menu-delete-process) + ;; Load the rest (dolist (mode evil-collection-mode-list) (dolist (req (or (cdr-safe mode) (list mode))) From 9b7d95f43ae13ae077ac483541778a0a8295fed3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 22:56:32 -0500 Subject: [PATCH 3809/4235] Remove doom-cleanup-hook & doom/cleanup-session These weren't reliable, often times buggy or overzealous about killing buffers and processes. Best to do it manually or come up with a better solution. --- core/autoload/buffers.el | 45 ++-------------------------- modules/feature/evil/+commands.el | 5 ---- modules/feature/workspaces/config.el | 2 -- modules/lang/cc/config.el | 1 - modules/ui/popup/config.el | 2 -- 5 files changed, 2 insertions(+), 53 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 46241d4ff..8daf0b908 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -34,11 +34,6 @@ See `doom-real-buffer-p' for more information.") "The name of the buffer to fall back to if no other buffers exist (will create it if it doesn't exist).") -;;;###autoload -(defvar doom-cleanup-hook () - "A list of hooks run when `doom/cleanup-session' is run, meant to clean up -leftover buffers and processes.") - ;; ;; Functions @@ -264,10 +259,11 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." If PROJECT-P (universal argument), don't close windows and only kill buffers that belong to the current project." (interactive "P") + (save-some-buffers) (unless project-p (delete-other-windows)) (switch-to-buffer (doom-fallback-buffer)) - (doom/cleanup-session nil (if project-p (doom-project-buffer-list)))) + (mapc #'kill-buffer (if project-p (doom-project-buffer-list) (doom-buffer-list)))) ;;;###autoload (defun doom/kill-other-buffers (&optional project-p) @@ -297,40 +293,3 @@ project." (n (doom-kill-matching-buffers pattern buffers))) (when (called-interactively-p 'interactive) (message "Killed %s buffers" n)))) - -;;;###autoload -(defun doom/cleanup-session (arg &optional buffer-list) - "Clean up buried buries and orphaned processes in the current workspace. If -ALL-P (universal argument), clean them up globally." - (interactive "P") - (let ((buffers (doom-buried-buffers buffer-list)) - (n 0)) - (dolist (buf buffers) - (unless (buffer-modified-p buf) - (kill-buffer buf) - (cl-incf n))) - (when arg - (setq n (+ n (doom/cleanup-buffer-processes)))) - (dolist (hook doom-cleanup-hook) - (let ((m (funcall hook))) - (when (integerp m) - (setq n (+ n m))))) - (message "Cleaned up %s buffers" n) - n)) - -;;;###autoload -(defun doom/cleanup-buffer-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)) diff --git a/modules/feature/evil/+commands.el b/modules/feature/evil/+commands.el index bfe2b4342..017171807 100644 --- a/modules/feature/evil/+commands.el +++ b/modules/feature/evil/+commands.el @@ -1,9 +1,5 @@ ;;; feature/evil/+commands.el -*- lexical-binding: t; -*- -(evil-define-command +evil:cleanup-session (bang) - (interactive "") - (doom/cleanup-session bang)) - (evil-define-operator +evil:open-scratch-buffer (bang) (interactive "") (doom/open-scratch-buffer bang)) @@ -94,7 +90,6 @@ This command understands vim file modifiers (like %:p:h). See (evil-ex-define-cmd "grevert" #'git-gutter:revert-hunk) ;;; Dealing with buffers -(evil-ex-define-cmd "clean[up]" #'+evil:cleanup-session) (evil-ex-define-cmd "k[ill]" #'doom/kill-this-buffer) (evil-ex-define-cmd "k[ill]all" #'+default:kill-all-buffers) (evil-ex-define-cmd "k[ill]m" #'+default:kill-matching-buffers) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index a42f7e62e..ff26bb85b 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -102,8 +102,6 @@ Uses `+workspaces-main' to determine the name of the main workspace." (advice-add #'persp-asave-on-exit :around #'+workspaces*autosave-real-buffers) - (add-hook 'doom-cleanup-hook #'+workspaces|cleanup-unassociated-buffers) - ;; Ensure buffers we've opened/switched to are auto-added to the current ;; perspective (setq persp-add-buffer-on-find-file t diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index ecd4a96a3..57632cb1c 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -210,7 +210,6 @@ compilation database is present in the project.") :definition #'rtags-find-symbol-at-point :references #'rtags-find-references-at-point) - (add-hook 'doom-cleanup-hook #'+cc|cleanup-rtags) (add-hook! 'kill-emacs-hook (ignore-errors (rtags-cancel-process))) ;; Use rtags-imenu instead of imenu/counsel-imenu diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index cb49d1e8d..0f4ab07f7 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -56,7 +56,6 @@ adjustment.") :keymap +popup-mode-map (cond (+popup-mode (add-hook 'doom-escape-hook #'+popup|close-on-escape t) - (add-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq +popup--old-display-buffer-alist display-buffer-alist display-buffer-alist +popup--display-buffer-alist window--sides-inhibit-check t) @@ -64,7 +63,6 @@ adjustment.") (push (cons prop 'writable) window-persistent-parameters))) (t (remove-hook 'doom-escape-hook #'+popup|close-on-escape) - (remove-hook 'doom-cleanup-hook #'+popup|cleanup-rules) (setq display-buffer-alist +popup--old-display-buffer-alist window--sides-inhibit-check nil) (+popup|cleanup-rules) From 5ee4f03ce700f0522d061962e233c234b5fdd589 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 22:57:34 -0500 Subject: [PATCH 3810/4235] tools/lsp: no prompt for project root & autokill servers --- modules/tools/lsp/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index 4d97ee48d..590606c12 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -1,6 +1,8 @@ ;;; tools/lsp/config.el -*- lexical-binding: t; -*- -(setq lsp-session-file (concat doom-etc-dir "lsp-session")) +(setq lsp-session-file (concat doom-etc-dir "lsp-session") + lsp-auto-guess-root t + lsp-keep-workspace-alive nil) (def-package! lsp-ui From 80d62aaaeff55a3c6579e915b1cdab037c5f3492 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 22:58:47 -0500 Subject: [PATCH 3811/4235] Fix electric indentation in c modes #510 #1206 --- 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 57632cb1c..48806c1bc 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -43,7 +43,7 @@ compilation database is present in the project.") (add-to-list 'auto-mode-alist '("\\.h\\'" . +cc-c-c++-objc-mode)) :config - (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\})) + (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\} ?\{)) (set-docsets! 'c-mode "C") (set-docsets! 'c++-mode "C++" "Boost") @@ -71,6 +71,8 @@ compilation database is present in the project.") (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) (add-hook! '(c-mode-hook c++-mode-hook) #'+cc|fontify-constants) + (setq-hook! 'c-mode-common-hook electric-indent-inhibit nil) + ;; Custom style, based off of linux (unless (assoc "doom" c-style-alist) (push '("doom" From 609e577ce76e3c043aaf84b6cbb457ecbe733e94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 22:59:40 -0500 Subject: [PATCH 3812/4235] Refactor evil keybinds; remove SPC {],[} prefixes These were redundant with the ],[ motion keys. --- modules/config/default/+evil-bindings.el | 228 +++++++++++------------ 1 file changed, 105 insertions(+), 123 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 1021d8644..3b75ca111 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -76,7 +76,106 @@ [remap quit-window] #'kill-this-buffer) ;; misc - :n "C-S-f" #'toggle-frame-fullscreen) + :n "C-S-f" #'toggle-frame-fullscreen + + ;; Global evil keybinds + :m "]a" #'evil-forward-arg + :m "[a" #'evil-backward-arg + :m "]o" #'outline-next-visible-heading + :m "[o" #'outline-previous-visible-heading + :n "]b" #'next-buffer + :n "[b" #'previous-buffer + :n "zx" #'kill-this-buffer + :n "ZX" #'bury-buffer + :n "gp" #'+evil/reselect-paste + :n "g=" #'widen + :v "g=" #'+evil:narrow-buffer + :nv "g@" #'+evil:apply-macro + :nv "gc" #'evil-commentary + :nv "gx" #'evil-exchange + :nv "C-a" #'evil-numbers/inc-at-pt + :nv "C-S-a" #'evil-numbers/dec-at-pt + :v "gp" #'+evil/paste-preserve-register + :v "@" #'+evil:apply-macro + ;; repeat in visual mode (FIXME buggy) + :v "." #'+evil:apply-macro + ;; don't leave visual mode after shifting + :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv + + ;; window management (prefix "C-w") + (:map evil-window-map + ;; Navigation + "C-h" #'evil-window-left + "C-j" #'evil-window-down + "C-k" #'evil-window-up + "C-l" #'evil-window-right + "C-w" #'other-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 + "O" #'doom/window-zoom + ;; Delete window + "c" #'+workspace/close-window-or-workspace + "C-C" #'ace-delete-window) + + ;; Plugins + ;; evil-easymotion + :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' + (:after evil-easymotion + :map evilem-map + "a" (evilem-create #'evil-forward-arg) + "A" (evilem-create #'evil-backward-arg) + "s" (evilem-create #'evil-snipe-repeat + :name 'evil-easymotion-snipe-forward + :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))) + "S" (evilem-create #'evil-snipe-repeat + :name 'evil-easymotion-snipe-backward + :pre-hook (save-excursion (call-interactively #'evil-snipe-S)) + :bind ((evil-snipe-scope 'buffer) + (evil-snipe-enable-highlight) + (evil-snipe-enable-incremental-highlight))) + "SPC" #'avy-goto-char-timer + "/" (evilem-create #'evil-ex-search-next + :pre-hook (save-excursion (call-interactively #'evil-ex-search-forward)) + :bind ((evil-search-wrap))) + "?" (evilem-create #'evil-ex-search-previous + :pre-hook (save-excursion (call-interactively #'evil-ex-search-backward)) + :bind ((evil-search-wrap)))) + + ;; text object plugins + :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr + :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 "k" #'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 + + ;; evil-snipe + (:after evil-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) ;; @@ -101,105 +200,6 @@ :n "gR" #'+eval/buffer :v "gR" #'+eval:replace-region) - (:when (featurep! :feature evil) - :m "]a" #'evil-forward-arg - :m "[a" #'evil-backward-arg - :m "]o" #'outline-next-visible-heading - :m "[o" #'outline-previous-visible-heading - :n "]b" #'next-buffer - :n "[b" #'previous-buffer - :n "zx" #'kill-this-buffer - :n "ZX" #'bury-buffer - :n "gp" #'+evil/reselect-paste - :n "g=" #'widen - :v "g=" #'+evil:narrow-buffer - :nv "g@" #'+evil:apply-macro - :nv "gc" #'evil-commentary - :nv "gx" #'evil-exchange - :nv "C-a" #'evil-numbers/inc-at-pt - :nv "C-S-a" #'evil-numbers/dec-at-pt - :v "gp" #'+evil/paste-preserve-register - :v "@" #'+evil:apply-macro - ;; repeat in visual mode (FIXME buggy) - :v "." #'+evil:apply-macro - ;; don't leave visual mode after shifting - :v "<" #'+evil/visual-dedent ; vnoremap < " #'+evil/visual-indent ; vnoremap > >gv - - ;; window management (prefix "C-w") - (:map evil-window-map - ;; Navigation - "C-h" #'evil-window-left - "C-j" #'evil-window-down - "C-k" #'evil-window-up - "C-l" #'evil-window-right - "C-w" #'other-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 - "O" #'doom/window-zoom - ;; Delete window - "c" #'+workspace/close-window-or-workspace - "C-C" #'ace-delete-window) - - ;; Plugins - ;; evil-easymotion - :m "gs" #'+evil/easymotion ; lazy-load `evil-easymotion' - (:after evil-easymotion - :map evilem-map - "a" (evilem-create #'evil-forward-arg) - "A" (evilem-create #'evil-backward-arg) - "s" (evilem-create #'evil-snipe-repeat - :name 'evil-easymotion-snipe-forward - :pre-hook (save-excursion (call-interactively #'evil-snipe-s)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))) - "S" (evilem-create #'evil-snipe-repeat - :name 'evil-easymotion-snipe-backward - :pre-hook (save-excursion (call-interactively #'evil-snipe-S)) - :bind ((evil-snipe-scope 'buffer) - (evil-snipe-enable-highlight) - (evil-snipe-enable-incremental-highlight))) - "SPC" #'avy-goto-char-timer - "/" (evilem-create #'evil-ex-search-next - :pre-hook (save-excursion (call-interactively #'evil-ex-search-forward)) - :bind ((evil-search-wrap))) - "?" (evilem-create #'evil-ex-search-previous - :pre-hook (save-excursion (call-interactively #'evil-ex-search-backward)) - :bind ((evil-search-wrap)))) - - ;; text object plugins - :textobj "x" #'evil-inner-xml-attr #'evil-outer-xml-attr - :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 "k" #'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 - - ;; evil-snipe - (:after evil-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) - (:when (featurep! :feature lookup) :nv "K" #'+lookup/documentation :nv "gd" #'+lookup/definition @@ -222,6 +222,8 @@ [delete] #'+snippets/delete-forward-char-or-field))) (:when (featurep! :tools flyspell) + :m "]s" #'evil-next-flyspell-error + :m "[s" #'evil-prev-flyspell-error :m "]S" #'flyspell-correct-word-generic :m "[S" #'flyspell-correct-previous-word-generic (:map flyspell-mouse-map @@ -528,35 +530,15 @@ :desc "Jump to symbol across buffers" "I" #'imenu-anywhere :desc "Search buffer" "b" #'swiper :desc "Search current directory" "d" - (cond ((featurep! :completion helm) #'+helm/project-search-from-cwd) - ((featurep! :completion ivy) #'+ivy/project-search-from-cwd)) + (cond ((featurep! :completion ivy) #'+ivy/project-search-from-cwd) + ((featurep! :completion helm) #'+helm/project-search-from-cwd)) :desc "Jump to symbol" "i" #'imenu :desc "Jump to link" "l" #'ace-link :desc "Look up online" "o" #'+lookup/online-select :desc "Search project" "p" - (cond ((featurep! :completion ivy) #'+ivy/project-search) + (cond ((featurep! :completion ivy) #'+ivy/project-search) ((featurep! :completion helm) #'+helm/project-search))) - (:prefix ("]" . "next") - :desc "Increase text size" "]" #'text-scale-increase - :desc "Next buffer" "b" #'next-buffer - :desc "Next diff Hunk" "d" #'git-gutter:next-hunk - :desc "Next todo" "t" #'hl-todo-next - :desc "Next error" "e" #'next-error - :desc "Next workspace" "w" #'+workspace/switch-right - :desc "Next spelling error" "s" #'evil-next-flyspell-error - :desc "Next spelling correction" "S" #'flyspell-correct-next-word-generic) - - (:prefix ("[" . "previous") - :desc "Decrease text size" "[" #'text-scale-decrease - :desc "Previous buffer" "b" #'previous-buffer - :desc "Previous diff Hunk" "d" #'git-gutter:previous-hunk - :desc "Previous todo" "t" #'hl-todo-previous - :desc "Previous error" "e" #'previous-error - :desc "Previous workspace" "w" #'+workspace/switch-left - :desc "Previous spelling error" "s" #'evil-prev-flyspell-error - :desc "Previous spelling correction" "S" #'flyspell-correct-word-generic) - (:when (featurep! :feature workspaces) (:prefix ([tab] . "workspace") :desc "Display tab bar" "TAB" #'+workspace/display From c85565cfefdd1194d36149c25a2b74d29c5bc2f1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 23:02:13 -0500 Subject: [PATCH 3813/4235] ui/modeline: add multiple cursors segment --- modules/ui/modeline/config.el | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index a7212ee61..2c0da1d02 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -582,6 +582,29 @@ Meant for `+modeline-buffer-path-function'." length)) 'face (if (active) 'doom-modeline-panel)))) +(defun +doom-ml-octicon (icon &optional text face voffset padding) + "Displays an octicon ICON with FACE, followed by TEXT. Uses +`all-the-icons-octicon' to fetch the icon." + (let ((padding-str (if padding (propertize (make-string padding ? ) 'face face)))) + (concat padding-str + (when icon + (all-the-icons-octicon icon :face face :height 1.1 :v-adjust (or voffset -0.2))) + (if text (propertize (concat " " text) 'face face)) + padding-str))) + +(defsubst +modeline--multiple-cursors () + "Show the number of multiple cursors." + (cond ((bound-and-true-p multiple-cursors-mode) + (propertize + (concat " mc " (eval (cadadr mc/mode-line)) " ") + 'face (if (active) 'doom-modeline-panel))) + ((bound-and-true-p evil-mc-cursor-list) + (+doom-ml-octicon (if evil-mc-frozen "pin" "pencil") + (number-to-string (length evil-mc-cursor-list)) + (if (active) 'doom-modeline-panel) + 0 + 1)))) + (def-modeline-segment! +modeline-matches "Displays: 1. the currently recording macro, 2. A current/total for the current search term (with anzu), 3. The number of substitutions being conducted @@ -590,6 +613,7 @@ with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." (+modeline--anzu) (+modeline--evil-substitute) (+modeline--iedit) + (+modeline--multiple-cursors) " "))) (or (and (not (equal meta " ")) meta) (if buffer-file-name " %I ")))) @@ -717,7 +741,10 @@ icons." (setq-default mode-line-format '("" +modeline-bar-start +modeline-format-left +modeline--rest +modeline-bar-end)) -;; -(set-modeline! :main t) +;; Set the default modeline as late as possible, giving users a chance to change +;; the above formats. +(add-hook! 'after-init-hook (set-modeline! :main t)) + +;; Set special modelines for special buffers (add-hook! '+doom-dashboard-mode-hook (set-modeline! :project)) (add-hook! 'doom-scratch-buffer-hook (set-modeline! :special)) From 1f633589470ab743cc0defefaa7363564a7120f1 Mon Sep 17 00:00:00 2001 From: Shanavas M Date: Wed, 27 Feb 2019 12:49:33 +0530 Subject: [PATCH 3814/4235] Use configured variables for rtags binary names --- modules/lang/cc/autoload.el | 2 +- modules/lang/cc/config.el | 2 +- modules/lang/cc/doctor.el | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 4eb371b1a..3aabe17fe 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -106,7 +106,7 @@ simpler." ;; first rtag (when (and (featurep 'rtags) rtags-enabled - (executable-find "rc")) + (executable-find rtags-rc-binary-name)) (with-temp-buffer (message "Reloaded compile commands for rtags daemon") (rtags-call-rc :silent t "-J" (or (doom-project-root) default-directory)))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 48806c1bc..fa7cfe58e 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -191,7 +191,7 @@ compilation database is present in the project.") (defun +cc|init-rtags () "Start an rtags server in c-mode and c++-mode buffers." (when (and (memq major-mode '(c-mode c++-mode)) - (rtags-executable-find "rdm")) + (rtags-executable-find rtags-rdm-binary-name)) (rtags-start-process-unless-running))) (add-hook 'c-mode-common-hook #'+cc|init-rtags) :config diff --git a/modules/lang/cc/doctor.el b/modules/lang/cc/doctor.el index 5f9799ecf..bb1d22c3e 100644 --- a/modules/lang/cc/doctor.el +++ b/modules/lang/cc/doctor.el @@ -1,10 +1,11 @@ ;; -*- lexical-binding: t; no-byte-compile: t; -*- ;;; lang/cc/doctor.el -;; rtags -(let ((bins (cl-remove-if #'executable-find '("rdm" "rc")))) - (when (/= (length bins) 0) - (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins))) +(when (require 'rtags nil t) + ;; rtags + (let ((bins (cl-remove-if #'executable-find `(,rtags-rdm-binary-name ,rtags-rc-binary-name)))) + (when (/= (length bins) 0) + (warn! "Couldn't find the rtag client and/or server programs %s. Disabling rtags support" bins)))) ;; irony server (when (require 'irony nil t) From c3a6d38da4e5cf61e5f6cdb508bb0bd05145bfcc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Feb 2019 03:13:11 -0500 Subject: [PATCH 3815/4235] Fix void-variable rtags-rdm-binary-name error --- 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 fa7cfe58e..d377d4502 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -191,6 +191,7 @@ compilation database is present in the project.") (defun +cc|init-rtags () "Start an rtags server in c-mode and c++-mode buffers." (when (and (memq major-mode '(c-mode c++-mode)) + (require 'rtags nil t) (rtags-executable-find rtags-rdm-binary-name)) (rtags-start-process-unless-running))) (add-hook 'c-mode-common-hook #'+cc|init-rtags) From 574dae14261d7666d99b5bea73d8d1442fbd8268 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Feb 2019 23:31:30 -0500 Subject: [PATCH 3816/4235] Isolate builtin org at compile time Attempts to address the elusive "invalid-function org-preserve-local-variables" error mentioned in: #1116 #1169, and This error is otherwise avoided by running `bin/doom compile :plugins` --- modules/lang/org/packages.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index 92d2b33ad..a69d34e8b 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -3,7 +3,14 @@ ;; Installs a cutting-edge version of org-mode (package! org-plus-contrib) -(package! org :ignore t) ; ignore org from ELPA + +;; Prevent built-in Org from playing into the byte-compilation of +;; `org-plus-contrib'. +(when-let* ((orglib (locate-library "org" nil doom-site-load-path))) + (setq load-path (delete (substring (file-name-directory orglib) 0 -1) + load-path))) +;; Ignore org on ELPA, if possible +(package! org :ignore t) (package! org-bullets :recipe (:fetcher github :repo "Kaligule/org-bullets")) (package! org-yt :recipe (:fetcher github :repo "TobiasZawada/org-yt")) From d0533fe99cf30c54ea0cd9006c1ee6f46d55e5f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Feb 2019 03:06:16 -0500 Subject: [PATCH 3817/4235] Fix lookup commands erroring when successful Because message returns non-nil, and +lookup--jump-to needs to return nil when it fails. --- modules/feature/lookup/autoload/lookup.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index f69e8c344..fb20121ee 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -138,7 +138,8 @@ Otherwise, these properties are available to be set: '+lookup--run-hooks identifier (point-marker) other-window))) (cond ((null ret) - (message "Could not find '%s'" identifier)) + (message "Could not find '%s'" identifier) + nil) ((markerp ret) (funcall (if other-window #'switch-to-buffer-other-window From aa9c4f63edcd9d9f609f61530fcb53226fcac8b7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Feb 2019 14:43:24 -0500 Subject: [PATCH 3818/4235] Fix :cd #1208 --- modules/config/default/autoload/evil.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el index a813659a1..8d5a1d54a 100644 --- a/modules/config/default/autoload/evil.el +++ b/modules/config/default/autoload/evil.el @@ -16,10 +16,11 @@ (evil-line-move (- (* 6 (or count 1)))))) ;;;###autoload (autoload '+default:cd "config/default/autoload/evil" nil t) -(evil-define-command +default:cd () +(evil-define-command +default:cd (path) "Change `default-directory' with `cd'." (interactive "") - (cd input)) + (cd path) + (message "Changed directory to '%s'" (abbreviate-file-name (expand-file-name path)))) ;;;###autoload (autoload '+default:kill-all-buffers "config/default/autoload/evil" nil t) (evil-define-command +default:kill-all-buffers (&optional bang) From 6fc7b8c1c434b78e7827357cd848c72b2c6f10e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Feb 2019 15:21:04 -0500 Subject: [PATCH 3819/4235] Better electric-indent uninhibiter Will now work in C modes as well as Csharp, Java and Python; possibly others that forcibly set electric-indent-inhibit. --- modules/emacs/electric/autoload.el | 1 + modules/lang/cc/config.el | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 3dbe4ec2f..2a457a0da 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -17,6 +17,7 @@ Enables `electric-indent-local-mode' in MODES. (unintern fn nil)) ((fset fn (lambda () + (setq-local electric-indent-inhibit nil) (cl-destructuring-bind (&key chars words) plist (electric-indent-local-mode +1) (if chars (setq electric-indent-chars chars)) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index d377d4502..035dea19a 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -71,8 +71,6 @@ compilation database is present in the project.") (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) (add-hook! '(c-mode-hook c++-mode-hook) #'+cc|fontify-constants) - (setq-hook! 'c-mode-common-hook electric-indent-inhibit nil) - ;; Custom style, based off of linux (unless (assoc "doom" c-style-alist) (push '("doom" From 99904c0e056876b813ff5b4adf27401a73bdea72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Feb 2019 15:57:52 -0500 Subject: [PATCH 3820/4235] Recenter window after lookup commands --- modules/feature/lookup/autoload/lookup.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index fb20121ee..b2e2890db 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -145,7 +145,9 @@ Otherwise, these properties are available to be set: #'switch-to-buffer-other-window #'switch-to-buffer) (marker-buffer ret)) - (goto-char ret))))) + (goto-char ret) + (recenter) + t)))) ;; From eb4450e99c16bfa47f00e9c42758120662efa7ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 27 Feb 2019 21:49:11 -0500 Subject: [PATCH 3821/4235] lang/java: remove finished TODO --- modules/lang/java/config.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/lang/java/config.el b/modules/lang/java/config.el index 955651aaf..f0fc35743 100644 --- a/modules/lang/java/config.el +++ b/modules/lang/java/config.el @@ -23,11 +23,8 @@ If the depth is 2, the first two directories are removed: net.lissner.game.") (add-hook 'java-mode-hook #'rainbow-delimiters-mode) -(cond ((featurep! +lsp) (load! "+lsp")) - ((featurep! +meghanada) (load! "+meghanada")) - ;; TODO lang/java +lsp (lsp-java?) - ;; ((featurep! +lsp) (load! "+lsp")) - ) +(cond ((featurep! +lsp) (load! "+lsp")) + ((featurep! +meghanada) (load! "+meghanada"))) ;; From fbce94cd20254d000a65ebfe3c71a2d9bda58f69 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 03:21:40 -0500 Subject: [PATCH 3822/4235] Remove select-enable-{clipboard,primary} #1008 select-enable-clipboard is already `t` by default and select-enable-primary disturbs non-evil yanking behavior. --- core/core-os.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 4723f6183..2bcc2fb91 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -1,10 +1,7 @@ ;;; core-os.el -*- lexical-binding: t; -*- ;; clipboard -(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING) - ;; Use a shared clipboard - select-enable-clipboard t - select-enable-primary t) +(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) ;; stop copying each visual state move to the clipboard: ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on From 812c8349701c16c7ec7a890b5337670edafa542e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 04:10:35 -0500 Subject: [PATCH 3823/4235] lang/python: fix ipython repl & change args type +python-ipython-repl-args and +python-jupyter-repl-args are now lists, rather than strings. --- modules/lang/python/autoload/python.el | 4 ++-- modules/lang/python/config.el | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index af9d19724..635df2f07 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -27,7 +27,7 @@ "Open an IPython REPL." (interactive) (let ((python-shell-interpreter "ipython") - (python-shell-interpreter-args +python-jupyter-repl-args)) + (python-shell-interpreter-args (string-join +python-ipython-repl-args " "))) (+python/open-repl))) ;;;###autoload @@ -36,7 +36,7 @@ (interactive) (add-to-list 'python-shell-completion-native-disabled-interpreters "jupyter") (let ((python-shell-interpreter "jupyter") - (python-shell-interpreter-args (format "console %s" +python-jupyter-repl-args))) + (python-shell-interpreter-args (format "console %s" (string-join +python-jupyter-repl-args " ")))) (+python/open-repl))) (defun +python--extract-version (prefix str) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 5e7ce2110..529b69ddd 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -3,11 +3,11 @@ (defconst +python-mode-line-indicator '("" +python--version) "Format for the python version/env indicator in the mode-line.") -(defvar +python-ipython-repl-args "-i --simple-prompt --no-color-info" +(defvar +python-ipython-repl-args '("-i" "--simple-prompt" "--no-color-info") "CLI arguments to initialize ipython with when `+python/open-ipython-repl' is called.") -(defvar +python-jupyter-repl-args "--simple-prompt" +(defvar +python-jupyter-repl-args '("--simple-prompt") "CLI arguments to initialize 'jupiter console %s' with when `+python/open-ipython-repl' is called.") From b871d400e5003f3af0be8d5edd3e290d50d6d375 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 05:01:04 -0500 Subject: [PATCH 3824/4235] tools/flycheck: simplify popup-tip advice Relevant to #1209 --- modules/tools/flycheck/autoload.el | 31 ++++++++++-------------------- modules/tools/flycheck/config.el | 12 +++--------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/modules/tools/flycheck/autoload.el b/modules/tools/flycheck/autoload.el index bfc65a51f..cc8167c4e 100644 --- a/modules/tools/flycheck/autoload.el +++ b/modules/tools/flycheck/autoload.el @@ -1,24 +1,13 @@ ;;; tools/flycheck/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +flycheck*popup-tip-delete-popup (orig-fn) - "TODO" - (when (display-graphic-p) - (funcall orig-fn))) - -;;;###autoload -(defun +flycheck*popup-tip-show-popup (orig-fn errors) - "TODO" - (if (and EMACS26+ - (featurep 'flycheck-posframe) - (display-graphic-p)) - (flycheck-posframe-show-posframe errors) - (funcall orig-fn errors))) - -;;;###autoload -(defun +flycheck|disable-popup-tip-for-lsp () - "Disable `+flycheck-popup-mode' if `lsp-ui-mode' and `lsp-ui-sideline-enable' -are non-nil." - (when (and (bound-and-true-p lsp-ui-mode) - lsp-ui-sideline-enable) - (flycheck-popup-tip-mode -1))) +(defun +flycheck|init-popups () + "Activate `flycheck-posframe-mode' if available and in GUI Emacs. +Activate `flycheck-popup-tip-mode' otherwise. +Do nothing if `lsp-ui-mode' is active and `lsp-ui-sideline-enable' is non-nil." + (unless (and (bound-and-true-p lsp-ui-mode) + lsp-ui-sideline-enable) + (if (and (fboundp 'flycheck-posframe-mode) + (display-graphic-p)) + (flycheck-posframe-mode +1) + (flycheck-popup-tip-mode +1)))) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index c3983261a..9aab8aef1 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -32,19 +32,13 @@ (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) - :hook (flycheck-mode . flycheck-popup-tip-mode) - :init (add-hook 'lsp-ui-mode-hook #'+flycheck|disable-popup-tip-for-lsp) - :config - (setq flycheck-popup-tip-error-prefix "✕ ") - ;; Allow `flycheck-posframe' or `flycheck-popup-tip' to co-exist - ;; interchangibly, depending on the display device (terminal or GUI Emacs). - (advice-add #'flycheck-popup-tip-show-popup :around #'+flycheck*popup-tip-show-popup) - (advice-add #'flycheck-popup-tip-delete-popup :around #'+flycheck*popup-tip-delete-popup)) + :init (add-hook 'flycheck-mode-hook #'+flycheck|init-popups) + :config (setq flycheck-popup-tip-error-prefix "✕ ")) (def-package! flycheck-posframe :when (and EMACS26+ (featurep! +childframe)) - :commands flycheck-posframe-show-posframe + :init (add-hook 'flycheck-mode-hook #'+flycheck|init-popups) :config (setq flycheck-posframe-warning-prefix "⚠ " flycheck-posframe-info-prefix "··· " From 94a57f695ecc4000f0311d6b91070ff098694b9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 05:01:40 -0500 Subject: [PATCH 3825/4235] Fix LSP restart prompt when killing Emacs --- modules/tools/lsp/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index 590606c12..723c4dfd2 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -4,6 +4,9 @@ lsp-auto-guess-root t lsp-keep-workspace-alive nil) +;; Don't prompt to restart LSP servers while quitting Emacs +(add-hook! 'kill-emacs-hook (setq lsp-restart 'ignore)) + (def-package! lsp-ui :hook (lsp-mode . lsp-ui-mode) From ab797994071a447c6241749f066f669a12bd342b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 14:01:22 -0500 Subject: [PATCH 3826/4235] app/email: add :keep-visual prop on mu4e commands #975 --- modules/app/email/autoload/evil.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/app/email/autoload/evil.el b/modules/app/email/autoload/evil.el index d7b64c9c6..9cc24ea77 100644 --- a/modules/app/email/autoload/evil.el +++ b/modules/app/email/autoload/evil.el @@ -19,3 +19,9 @@ (goto-char beg) (dotimes (_ (count-lines beg end)) (mu4e-headers-mark-and-next command)))) + +;;;###autoload +(after! evil + ;; Fix #975 for mu4e commands, so they can move cursor in visual line mode + (evil-set-command-property 'mu4e-compose-goto-bottom :keep-visual t) + (evil-set-command-property 'mu4e-compose-goto-top :keep-visual t)) From cf07bac3839ba58245bab1558c45701b1340c7b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 14:18:12 -0500 Subject: [PATCH 3827/4235] Fix persisted workspace storing broken posframes #1017 Not confident this is the best solution, but it will work for now. --- modules/completion/ivy/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index cca0f2969..bc1232bf8 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -205,6 +205,10 @@ immediately runs it on the current candidate (ending the ivy session)." ;; default to posframe display function (setf (alist-get t ivy-display-functions-alist) #'+ivy-display-at-frame-center-near-bottom) + ;; Fix #1017: stop session persistence from restoring a broken posframe + (defun +workspace|delete-all-posframes (&rest _) (posframe-delete-all)) + (add-hook 'persp-after-load-state-functions #'+workspace|delete-all-posframes) + ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-ag counsel-grep counsel-git-grep)) (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) From ad837e6d131e2dd9e55d096aee024e0f30e0f984 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 14:30:40 -0500 Subject: [PATCH 3828/4235] Move evil ex commands to feature/evil These commands aren't used by config/default anyway, and +default:multi-{next,previous}-line were moved to my private config. Also fixes #1208 (:cd without args will now CD to $HOME). --- modules/config/default/autoload/evil.el | 38 ------------------------- modules/feature/evil/+commands.el | 26 +++++++++++++++-- 2 files changed, 23 insertions(+), 41 deletions(-) delete mode 100644 modules/config/default/autoload/evil.el diff --git a/modules/config/default/autoload/evil.el b/modules/config/default/autoload/evil.el deleted file mode 100644 index 8d5a1d54a..000000000 --- a/modules/config/default/autoload/evil.el +++ /dev/null @@ -1,38 +0,0 @@ -;; config/default/autoload/evil.el -*- lexical-binding: t; -*- -;;;###if (featurep! :feature evil) - -;;;###autoload (autoload '+default:multi-next-line "config/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 'magit-mode)))) - (evil-line-move (* 6 (or count 1))))) - -;;;###autoload (autoload '+default:multi-previous-line "config/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 'magit-mode)))) - (evil-line-move (- (* 6 (or count 1)))))) - -;;;###autoload (autoload '+default:cd "config/default/autoload/evil" nil t) -(evil-define-command +default:cd (path) - "Change `default-directory' with `cd'." - (interactive "") - (cd path) - (message "Changed directory to '%s'" (abbreviate-file-name (expand-file-name path)))) - -;;;###autoload (autoload '+default:kill-all-buffers "config/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 "config/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/feature/evil/+commands.el b/modules/feature/evil/+commands.el index 017171807..bb6f6a17a 100644 --- a/modules/feature/evil/+commands.el +++ b/modules/feature/evil/+commands.el @@ -42,6 +42,26 @@ This command understands vim file modifiers (like %:p:h). See (interactive "") (reverse-region beg end)) +(evil-define-command +evil:cd (&optional path) + "Change `default-directory' with `cd'." + (interactive "") + (let ((path (or path "~"))) + (cd path) + (message "Changed directory to '%s'" (abbreviate-file-name (expand-file-name path))))) + +(evil-define-command +evil:kill-all-buffers (&optional bang) + "Kill all buffers. If BANG, kill current session too." + (interactive "") + (if (and bang (fboundp '+workspace/kill-session)) + (+workspace/kill-session) + (doom/kill-all-buffers))) + +(evil-define-command +evil: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)) + ;; ;; Commands @@ -91,8 +111,8 @@ This command understands vim file modifiers (like %:p:h). See ;;; Dealing with buffers (evil-ex-define-cmd "k[ill]" #'doom/kill-this-buffer) -(evil-ex-define-cmd "k[ill]all" #'+default:kill-all-buffers) -(evil-ex-define-cmd "k[ill]m" #'+default:kill-matching-buffers) +(evil-ex-define-cmd "k[ill]all" #'+evil:kill-all-buffers) +(evil-ex-define-cmd "k[ill]m" #'+evil:kill-matching-buffers) (evil-ex-define-cmd "k[ill]o" #'doom/kill-other-buffers) (evil-ex-define-cmd "l[ast]" #'doom/popup-restore) (evil-ex-define-cmd "m[sg]" #'view-echo-area-messages) @@ -100,7 +120,7 @@ This command understands vim file modifiers (like %:p:h). See ;;; Project navigation (evil-ex-define-cmd "a" #'projectile-find-other-file) -(evil-ex-define-cmd "cd" #'+default:cd) +(evil-ex-define-cmd "cd" #'+evil:cd) (evil-ex-define-cmd "pwd" #'+evil:pwd) (cond ((featurep! :completion ivy) From 5f5874c1fc549cc85ca6159a1b0374cabcd088af Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Feb 2019 18:26:13 -0500 Subject: [PATCH 3829/4235] Fix evil-embrace race condition at startup #345 The previous config would wait for evil-surround to load before adding evil-embrace's hooks. --- modules/feature/evil/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 48cbcb6d4..b5b3097b7 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -186,7 +186,6 @@ line with a linewise comment.") (def-package! evil-embrace - :after evil-surround :commands (embrace-add-pair embrace-add-pair-regexp) :hook (LaTeX-mode . embrace-LaTeX-mode-hook) :hook (org-mode . embrace-org-mode-hook) @@ -198,9 +197,10 @@ line with a linewise comment.") (embrace-add-pair-regexp ?f "([^ ]+ " ")" #'+evil--embrace-elisp-fn)) (add-hook! (org-mode LaTeX-mode) (embrace-add-pair-regexp ?l "\\[a-z]+{" "}" #'+evil--embrace-latex)) + (after! evil-surround + (evil-embrace-enable-evil-surround-integration)) :config (setq evil-embrace-show-help-p nil) - (evil-embrace-enable-evil-surround-integration) (defun +evil--embrace-get-pair (char) (if-let* ((pair (cdr-safe (assoc (string-to-char char) evil-surround-pairs-alist)))) From 61645bb9ca960ea07fe3b8a66066fe5a7b73d829 Mon Sep 17 00:00:00 2001 From: Huy Duong Date: Fri, 1 Mar 2019 09:35:28 +0700 Subject: [PATCH 3830/4235] Bind some rspec functions for ruby and enh-ruby mode Some rspec-mode's functions can be used under any Ruby source files. So adding some localleader bindings for them. Signed-off-by: Huy Duong --- modules/lang/ruby/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 009927d4f..6d2ac5a7b 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -141,20 +141,21 @@ rspec-mode-keymap (make-sparse-keymap))) :config (map! :localleader - :map rspec-mode-map + :mode (ruby-mode enh-ruby-mode rspec-mode) :prefix "t" "r" #'rspec-rerun "a" #'rspec-verify-all - "s" #'rspec-verify-single "v" #'rspec-verify "c" #'rspec-verify-continue - "e" #'rspec-toggle-example-pendingness "f" #'rspec-verify-method "l" #'rspec-run-last-failed "m" #'rspec-verify-matching "t" #'rspec-toggle-spec-and-target-find-example - "T" #'rspec-toggle-spec-and-target)) - + "T" #'rspec-toggle-spec-and-target + :mode rspec-mode + :prefix "t" + "s" #'rspec-verify-single + "e" #'rspec-toggle-example-pendingness)) (def-package! minitest :defer t From cedadb3233668582e92186464de74055449fe98b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 00:44:45 -0500 Subject: [PATCH 3831/4235] Enable magit by default #1052 Co-authored-by: Aria Edmonds --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 30d0c4b63..d45312a35 100644 --- a/init.example.el +++ b/init.example.el @@ -69,7 +69,7 @@ ;;gist ; interacting with github gists ;;lsp ;;macos ; MacOS-specific commands - ;;magit ; a git porcelain for Emacs + magit ; a git porcelain for Emacs ;;make ; run make tasks from Emacs ;;password-store ; password manager for nerds ;;pdf ; pdf enhancements From 1f3c41a8acd9433603f4e3418e1074d943b6ae0d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 03:56:10 -0500 Subject: [PATCH 3832/4235] Revert ab797994 #226 These were merged into evil-collection-mu4e. --- modules/app/email/autoload/evil.el | 6 ------ 1 file changed, 6 deletions(-) diff --git a/modules/app/email/autoload/evil.el b/modules/app/email/autoload/evil.el index 9cc24ea77..d7b64c9c6 100644 --- a/modules/app/email/autoload/evil.el +++ b/modules/app/email/autoload/evil.el @@ -19,9 +19,3 @@ (goto-char beg) (dotimes (_ (count-lines beg end)) (mu4e-headers-mark-and-next command)))) - -;;;###autoload -(after! evil - ;; Fix #975 for mu4e commands, so they can move cursor in visual line mode - (evil-set-command-property 'mu4e-compose-goto-bottom :keep-visual t) - (evil-set-command-property 'mu4e-compose-goto-top :keep-visual t)) From 868bd15abefdca72236bfae9970771903e710264 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 14:25:18 -0500 Subject: [PATCH 3833/4235] Fix undeferred flycheck-posframe Accidentally eager-loaded it. Whoops! --- modules/tools/flycheck/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index 9aab8aef1..adc034cb4 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -38,6 +38,7 @@ (def-package! flycheck-posframe :when (and EMACS26+ (featurep! +childframe)) + :defer t :init (add-hook 'flycheck-mode-hook #'+flycheck|init-popups) :config (setq flycheck-posframe-warning-prefix "⚠ " From 8832737671282ec09a58b6fb94eda7673dabe394 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 15:12:27 -0500 Subject: [PATCH 3834/4235] Adopt seagle0128/doom-modeline for :ui modeline And remove obsolete :ui doom-modeline module. Relevant to: #136, #921 --- core/core-modules.el | 3 +- init.example.el | 3 +- modules/lang/python/autoload/python.el | 53 -- modules/lang/python/config.el | 37 +- modules/lang/ruby/autoload.el | 38 -- modules/lang/ruby/config.el | 16 +- modules/tools/pdf/+modeline.el | 20 - modules/tools/pdf/config.el | 3 - modules/ui/doom-modeline/README.org | 52 -- modules/ui/doom-modeline/autoload.el | 19 - modules/ui/doom-modeline/config.el | 830 ----------------------- modules/ui/doom-modeline/packages.el | 20 - modules/ui/modeline/autoload.el | 35 + modules/ui/modeline/autoload/modeline.el | 19 - modules/ui/modeline/autoload/settings.el | 104 --- modules/ui/modeline/config.el | 767 +-------------------- modules/ui/modeline/packages.el | 15 +- 17 files changed, 90 insertions(+), 1944 deletions(-) delete mode 100644 modules/tools/pdf/+modeline.el delete mode 100644 modules/ui/doom-modeline/README.org delete mode 100644 modules/ui/doom-modeline/autoload.el delete mode 100644 modules/ui/doom-modeline/config.el delete mode 100644 modules/ui/doom-modeline/packages.el create mode 100644 modules/ui/modeline/autoload.el delete mode 100644 modules/ui/modeline/autoload/modeline.el delete mode 100644 modules/ui/modeline/autoload/settings.el diff --git a/core/core-modules.el b/core/core-modules.el index 88b7bbafc..34997dd7d 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -17,7 +17,8 @@ (syntax-checker (:tools flycheck))) (:tools (rotate-text (:editor rotate-text))) (:emacs (electric-indent (:emacs electric)) - (hideshow (:editor fold)))) + (hideshow (:editor fold))) + (:ui (doom-modeline (:ui modeline)))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . MODULES). E.g. diff --git a/init.example.el b/init.example.el index d45312a35..79782f582 100644 --- a/init.example.el +++ b/init.example.el @@ -21,12 +21,11 @@ ;;deft ; notational velocity for Emacs doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs - doom-modeline ; a snazzy Atom-inspired mode-line doom-quit ; DOOM quit-message prompts when you quit Emacs evil-goggles ; display visual hints when editing in evil ;;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags - ;;modeline ; snazzy, Atom-inspired modeline, plus API + modeline ; snazzy, Atom-inspired modeline, plus API nav-flash ; blink the current line after jumping ;;neotree ; a project drawer, like NERDTree for vim treemacs ; a project drawer, like neotree but cooler diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 635df2f07..27ed691a3 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -1,8 +1,5 @@ ;;; lang/python/autoload/python.el -*- lexical-binding: t; -*- -(defvar +python-version-cache (make-hash-table :test 'equal) - "TODO") - ;;;###autoload (defun +python/open-repl () "Open the Python REPL." @@ -38,53 +35,3 @@ (let ((python-shell-interpreter "jupyter") (python-shell-interpreter-args (format "console %s" (string-join +python-jupyter-repl-args " ")))) (+python/open-repl))) - -(defun +python--extract-version (prefix str) - (when str - (format "%s%s" prefix (cadr (split-string str " "))))) - -;;;###autoload -(defun +python-version () - "Return the currently installed version of python on your system or active in -the current pipenv. - -This is not necessarily aware of env management tools like virtualenv, pyenv or -pipenv, unless those tools have modified the PATH that Emacs picked up when you -started it." - (condition-case _ - (if-let* ((proot (and (fboundp 'pipenv-project-p) - (pipenv-project-p)))) - (let* ((default-directory proot) - (v (car (process-lines "pipenv" "run" "python" "--version")))) - (puthash proot - (+python--extract-version "Pipenv " v) - +python-version-cache)) - (puthash (or (doom-project-root) default-directory) - (+python--extract-version - "Python " - (car (process-lines python-shell-interpreter "--version"))) - +python-version-cache)) - (error "Python"))) - - -;; -;; Hooks - -;;;###autoload -(defun +python|update-version (&rest _) - "Update `+python--version' by consulting `+python-version' function." - (setq +python--version - (or (gethash (or (and (fboundp 'pipenv-project-p) - (pipenv-project-p)) - (doom-project-root) - default-directory) - +python-version-cache) - (+python-version)))) - -;;;###autoload -(defun +python|update-version-in-all-buffers (&rest _) - "Update `+python-version' in all buffers in `python-mode'." - (dolist (buffer (doom-buffers-in-mode 'python-mode)) - (setq +python-version-cache (clrhash +python-version-cache)) - (with-current-buffer buffer - (+python|update-version)))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 529b69ddd..8ec9fe931 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -11,9 +11,6 @@ called.") "CLI arguments to initialize 'jupiter console %s' with when `+python/open-ipython-repl' is called.") -(defvar-local +python--version nil - "The python version in the current buffer.") - ;; ;; Packages @@ -55,14 +52,7 @@ called.") sp-point-after-word-p sp-point-before-same-p)) - (setq-hook! 'python-mode-hook tab-width python-indent-offset) - - ;; Add python/pipenv version string to the major mode in the modeline - (defun +python|init-mode-line () - (setq mode-name +python-mode-line-indicator)) - (add-hook 'python-mode-hook #'+python|init-mode-line) - - (add-hook 'python-mode-hook #'+python|update-version)) + (setq-hook! 'python-mode-hook tab-width python-indent-offset)) (def-package! anaconda-mode @@ -152,9 +142,9 @@ called.") (format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin) "%c %o %s %a"))) (:description . "Run Python script"))) - - (advice-add #'pipenv-activate :after-while #'+python|update-version-in-all-buffers) - (advice-add #'pipenv-deactivate :after-while #'+python|update-version-in-all-buffers)) + (when (featurep! :ui modeline) + (advice-add #'pipenv-activate :after-while #'+modeline|update-env-in-all-windows) + (advice-add #'pipenv-deactivate :after-while #'+modeline|update-env-in-all-windows))) (def-package! pyenv-mode @@ -164,8 +154,9 @@ called.") (pyenv-mode +1) (when (executable-find "pyenv") (add-to-list 'exec-path (expand-file-name "shims" (or (getenv "PYENV_ROOT") "~/.pyenv")))) - (advice-add #'pyenv-mode-set :after #'+python|update-version-in-all-buffers) - (advice-add #'pyenv-mode-unset :after #'+python|update-version-in-all-buffers)) + (when (featurep! :ui modeline) + (advice-add #'pyenv-mode-set :after #'+modeline|update-env-in-all-windows) + (advice-add #'pyenv-mode-unset :after #'+modeline|update-env-in-all-windows))) (def-package! pyvenv @@ -173,9 +164,10 @@ called.") :after python :config (defun +python-current-pyvenv () pyvenv-virtual-env-name) - (add-hook 'pyvenv-post-activate-hooks #'+python|update-version-in-all-buffers) - (add-hook 'pyvenv-post-deactivate-hooks #'+python|update-version-in-all-buffers) - (add-to-list '+python-mode-line-indicator + (when (featurep! :ui modeline) + (add-hook 'pyvenv-post-activate-hooks #'+modeline|update-env-in-all-windows) + (add-hook 'pyvenv-post-deactivate-hooks #'+modeline|update-env-in-all-windows)) + (add-to-list 'global-mode-string '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) 'append)) @@ -214,8 +206,9 @@ called.") (conda-env-initialize-interactive-shells) (after! eshell (conda-env-initialize-eshell)) - (add-hook 'conda-postactivate-hook #'+python|update-version-in-all-buffers) - (add-hook 'conda-postdeactivate-hook #'+python|update-version-in-all-buffers) - (add-to-list '+python-mode-line-indicator + (when (featurep! :ui modeline) + (add-hook 'conda-postactivate-hook #'+modeline|update-env-in-all-windows) + (add-hook 'conda-postdeactivate-hook #'+modeline|update-env-in-all-windows)) + (add-to-list 'global-mode-string '(conda-env-current-name (" conda:" conda-env-current-name)) 'append)) diff --git a/modules/lang/ruby/autoload.el b/modules/lang/ruby/autoload.el index cc2b21323..8f9519283 100644 --- a/modules/lang/ruby/autoload.el +++ b/modules/lang/ruby/autoload.el @@ -1,8 +1,5 @@ ;;; lang/ruby/autoload.el -*- lexical-binding: t; -*- -(defvar +ruby-version-cache (make-hash-table :test 'equal) - "TODO") - ;;;###autoload (defun +ruby|cleanup-robe-servers () "Clean up dangling inf robe processes if there are no more `enh-ruby-mode' @@ -16,38 +13,3 @@ buffers open." (when (processp process) (kill-process (get-buffer-process inf-buffer)) (kill-buffer inf-buffer))))))) - -;;;###autoload -(defun +ruby-version () - "Return the currently installed version of ruby on your system (the first -ruby executable found in your PATH). - -This is not necessarily aware of env management tools like virtualenv, pyenv or -pipenv, unless those tools have modified the PATH that Emacs picked up when you -started it." - (condition-case _ - (let ((version-str (car (process-lines "ruby" "--version")))) - (puthash (or (doom-project-root) default-directory) - (format "Ruby %s" (cadr (split-string version-str " "))) - +ruby-version-cache)) - (error "Ruby"))) - - -;; -;; Hooks - -;;;###autoload -(defun +ruby|update-version (&rest _) - "Update `+ruby--version' by consulting `+ruby-version' function." - (setq +ruby--version - (or (gethash (or (doom-project-root) default-directory) - +ruby-version-cache) - (+ruby-version)))) - -;;;###autoload -(defun +ruby|update-version-in-all-buffers (&rest _) - "Update `+ruby--version' in all `enh-ruby-mode' buffers." - (dolist (buffer (doom-buffers-in-mode 'enh-ruby-mode)) - (setq +ruby-version-cache (clrhash +ruby-version-cache)) - (with-current-buffer buffer - (+ruby|update-version)))) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 009927d4f..82392619b 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -1,12 +1,5 @@ ;;; lang/ruby/config.el -*- lexical-binding: t; -*- -(defvar +ruby-mode-line-indicator '("" +ruby--version) - "Format for the ruby version/env indicator in the mode-line.") - -(defvar-local +ruby--version nil - "The ruby version in the current buffer.") - - ;; ;; Packages @@ -34,14 +27,7 @@ (add-to-list 'company-dabbrev-code-modes 'ruby-mode nil #'eq)) ;; so class and module pairs work - (setq-hook! (ruby-mode enh-ruby-mode) sp-max-pair-length 6) - - ;; Add ruby version string to the major mode in the modeline - (defun +ruby|init-mode-line () - (setq mode-name +ruby-mode-line-indicator)) - (add-hook 'enh-ruby-mode-hook #'+ruby|init-mode-line) - - (add-hook 'enh-ruby-mode-hook #'+ruby|update-version)) + (setq-hook! (ruby-mode enh-ruby-mode) sp-max-pair-length 6)) (def-package! robe diff --git a/modules/tools/pdf/+modeline.el b/modules/tools/pdf/+modeline.el deleted file mode 100644 index f3fe0532c..000000000 --- a/modules/tools/pdf/+modeline.el +++ /dev/null @@ -1,20 +0,0 @@ -;;; tools/pdf/+modeline.el -*- lexical-binding: t; -*- - -(def-modeline-segment! +pdf-pages - "Current and total page indicator for PDF documents." - (format "P %d/%d" (pdf-view-current-page) (pdf-cache-number-of-pages))) - -(if (featurep! :ui modeline) - (def-modeline-format! '+pdf - '(+modeline-matches " " +modeline-buffer-id " " +pdf-pages) - '(+modeline-major-mode (vc-mode (" " +modeline-vcs)))) - (def-modeline! '+pdf - '(bar matches " " buffer-info " " +pdf-pages) - '(major-mode vcs))) - -(defun +pdf|init-modeline () - (funcall (if (featurep! :ui modeline) - #'set-modeline! - #'doom-set-modeline) - '+pdf)) -(add-hook 'pdf-tools-enabled-hook #'+pdf|init-modeline) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index 681cb29f2..a10e9a5e3 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -28,9 +28,6 @@ (setq-default pdf-view-display-size 'fit-page) ;; Turn off cua so copy works (add-hook! 'pdf-view-mode-hook (cua-mode 0)) - ;; Custom modeline that removes useless info and adds page numbers - (when (or (featurep! :ui doom-modeline) (featurep! :ui modeline)) - (load! "+modeline")) ;; Handle PDF-tools related popups better (set-popup-rule! "^\\*Outline*" :side 'right :size 40 :select nil) ;; The next rules are not needed, they are defined in modules/ui/popups/+hacks.el diff --git a/modules/ui/doom-modeline/README.org b/modules/ui/doom-modeline/README.org deleted file mode 100644 index 28590ef8f..000000000 --- a/modules/ui/doom-modeline/README.org +++ /dev/null @@ -1,52 +0,0 @@ -#+TITLE: :ui doom-modeline - -This module customizes the Emacs mode-line. - -The DOOM modeline was designed for minimalism, and offers: - -+ A match count panel (for ~evil-search~, ~iedit~ and ~evil-substitute~) -+ An indicator for recording a macro -+ Local python/ruby version in the major-mode -+ A customizable mode-line height (see ~+doom-modeline-height~) -+ An error/warning count segment for flycheck - -[[/../screenshots/ml.png]] -[[/../screenshots/ml-search.png]] -[[/../screenshots/ml-subst.png]] -[[/../screenshots/ml-macro.png]] -[[/../screenshots/ml-version.png]] -[[/../screenshots/ml-errors.png]] - -* Table of Contents :TOC: -- [[#install][Install]] -- [[#extracting-my-modeline][Extracting my modeline]] -- [[#troubleshooting][Troubleshooting]] - - [[#where-are-my-minor-modes][Where are my minor modes?]] - -* Install -This module requires the fonts included with ~all-the-icons~ to be installed. - -Run ~M-x all-the-icons-install-fonts~ to do so. - -* Extracting my modeline -Some might want my modeline without the DOOM config altogether. I've tried to make this easier for you, but there are a few things you'll need to do: - -+ Ensure [[https://github.com/bbatsov/projectile][projectile]] and [[https://github.com/domtronn/all-the-icons.el][all-the-icons]] are installed. -+ Ensure ~projectile-mode~ is enabled. -+ Ensure the fonts included with ~all-the-icons~ are installed (~M-x all-the-icons-install-fonts~). -+ Replace ~def-package!~ calls with ~use-package~. -+ Replace ~doom-project-root~ calls with ~projectile-project-root~. -+ The ~+doom-modeline--make-xpm~ function is memoized with the ~def-memoized!~ macro. Change ~def-memoized!~ to ~defun~. -+ Copy the ~add-hook!~ macro definition from [[/core/core-lib.el][core/core-lib.el]]. -+ Copy the following macros and functions from [[/core/core-ui.el][core/core-ui.el]]: - + ~def-modeline-segment!~ - + ~def-modeline!~ - + ~doom--prepare-modeline-segments~ - + ~doom-modeline~ - + ~doom-set-modeline~ - -That /should/ be everything. As I have never used this out of my config I can't guarantee immediate success, but I'd be happy to help you out if you file an issue. - -* Troubleshooting -** Where are my minor modes? -I didn't need it, so I removed it. Run ~M-x doom/what-minor-mode~ to investigate what minor modes are currently active. diff --git a/modules/ui/doom-modeline/autoload.el b/modules/ui/doom-modeline/autoload.el deleted file mode 100644 index 1c188ef9f..000000000 --- a/modules/ui/doom-modeline/autoload.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; ui/doom-modeline/autoload.el -*- lexical-binding: t; -*- - -(defvar +doom-modeline--old-bar-height nil) -;;;###autoload -(defun +doom-modeline|resize-for-big-font () - "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was -made to be added to `doom-big-font-mode-hook'." - (unless +doom-modeline--old-bar-height - (setq +doom-modeline--old-bar-height +doom-modeline-height)) - (let ((default-height +doom-modeline--old-bar-height)) - (if doom-big-font-mode - (let* ((font-size (font-get doom-font :size)) - (big-size (font-get doom-big-font :size)) - (ratio (/ (float big-size) font-size))) - (setq +doom-modeline-height (ceiling (* default-height ratio 0.75)))) - (setq +doom-modeline-height default-height)) - ;; already has a variable watcher in Emacs 26+ - (unless EMACS26+ (+doom-modeline|refresh-bars)))) - diff --git a/modules/ui/doom-modeline/config.el b/modules/ui/doom-modeline/config.el deleted file mode 100644 index f5f8d708f..000000000 --- a/modules/ui/doom-modeline/config.el +++ /dev/null @@ -1,830 +0,0 @@ -;;; ui/doom-modeline/config.el -*- lexical-binding: t; -*- - -;; We handle this ourselves -(setq projectile-dynamic-mode-line nil) - - -;; -;; Modeline library - -(defvar doom--modeline-fn-alist ()) -(defvar doom--modeline-var-alist ()) - -(defmacro def-modeline-segment! (name &rest body) - "Defines a modeline segment and byte compiles it." - (declare (indent defun) (doc-string 2)) - (let ((sym (intern (format "doom-modeline-segment--%s" name))) - (docstring (if (stringp (car body)) - (pop body) - (format "%s modeline segment" name)))) - (cond ((and (symbolp (car body)) - (not (cdr body))) - (add-to-list 'doom--modeline-var-alist (cons name (car body))) - `(add-to-list 'doom--modeline-var-alist (cons ',name ',(car body)))) - (t - (add-to-list 'doom--modeline-fn-alist (cons name sym)) - `(progn - (fset ',sym (lambda () ,docstring ,@body)) - (add-to-list 'doom--modeline-fn-alist (cons ',name ',sym)) - ,(unless (bound-and-true-p byte-compile-current-file) - `(let (byte-compile-warnings) - (byte-compile #',sym)))))))) - -(defun doom--prepare-modeline-segments (segments) - (let (forms it) - (dolist (seg segments) - (cond ((stringp seg) - (push seg forms)) - ((symbolp seg) - (cond ((setq it (cdr (assq seg doom--modeline-fn-alist))) - (push (list it) forms)) - ((setq it (cdr (assq seg doom--modeline-var-alist))) - (push it forms)) - ((error "%s is not a defined segment" seg)))) - ((error "%s is not a valid segment" seg)))) - (nreverse forms))) - -(defun def-modeline! (name lhs &optional rhs) - "Defines a modeline format and byte-compiles it. NAME is a symbol to identify -it (used by `doom-modeline' for retrieval). LHS and RHS are lists of symbols of -modeline segments defined with `def-modeline-segment!'. - -Example: - (def-modeline! 'minimal - '(bar matches \" \" buffer-info) - '(media-info major-mode)) - (doom-set-modeline 'minimal t)" - (let ((sym (intern (format "doom-modeline-format--%s" name))) - (lhs-forms (doom--prepare-modeline-segments lhs)) - (rhs-forms (doom--prepare-modeline-segments rhs))) - (defalias sym - (lambda () - (let ((lhs (eval `(list ,@lhs-forms) t)) - (rhs (eval `(list ,@rhs-forms) t))) - (let ((rhs-str (format-mode-line rhs))) - (list lhs - (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(+ 1 (string-width rhs-str)))))) - rhs-str)))) - (concat "Modeline:\n" - (format " %s\n %s" - (prin1-to-string lhs) - (prin1-to-string rhs)))))) - -(defun doom-modeline (key) - "Returns a mode-line configuration associated with KEY (a symbol). Throws an -error if it doesn't exist." - (let ((fn (intern-soft (format "doom-modeline-format--%s" key)))) - (when (functionp fn) - `(:eval (,fn))))) - -(defun doom-set-modeline (key &optional default) - "Set the modeline format. Does nothing if the modeline KEY doesn't exist. If -DEFAULT is non-nil, set the default mode-line for all buffers." - (when-let* ((modeline (doom-modeline key))) - (setf (if default - (default-value 'mode-line-format) - (buffer-local-value 'mode-line-format (current-buffer))) - (list "%e" modeline)))) - - -;; -;; Custom faces - -(defgroup +doom-modeline nil - "TODO" - :group 'faces) - -(defface doom-modeline-buffer-path - '((t (:inherit (mode-line-emphasis bold)))) - "Face used for the dirname part of the buffer path." - :group '+doom-modeline) - -(defface doom-modeline-buffer-file - '((t (:inherit (mode-line-buffer-id bold)))) - "Face used for the filename part of the mode-line buffer path." - :group '+doom-modeline) - -(defface doom-modeline-buffer-modified - '((t (:inherit (error bold) :background nil))) - "Face used for the 'unsaved' symbol in the mode-line." - :group '+doom-modeline) - -(defface doom-modeline-buffer-major-mode - '((t (:inherit (mode-line-emphasis bold)))) - "Face used for the major-mode segment in the mode-line." - :group '+doom-modeline) - -(defface doom-modeline-highlight - '((t (:inherit mode-line-emphasis))) - "Face for bright segments of the mode-line." - :group '+doom-modeline) - -(defface doom-modeline-panel - '((t (:inherit mode-line-highlight))) - "Face for 'X out of Y' segments, such as `+doom-modeline--anzu', `+doom-modeline--evil-substitute' and -`iedit'" - :group '+doom-modeline) - -(defface doom-modeline-info - `((t (:inherit (success bold)))) - "Face for info-level messages in the modeline. Used by `*vc'." - :group '+doom-modeline) - -(defface doom-modeline-warning - `((t (:inherit (warning bold)))) - "Face for warnings in the modeline. Used by `*flycheck'" - :group '+doom-modeline) - -(defface doom-modeline-urgent - `((t (:inherit (error bold)))) - "Face for errors in the modeline. Used by `*flycheck'" - :group '+doom-modeline) - -;; Bar -(defface doom-modeline-bar '((t (:inherit highlight))) - "The face used for the left-most bar on the mode-line of an active window." - :group '+doom-modeline) - -(defface doom-modeline-eldoc-bar '((t (:inherit shadow))) - "The face used for the left-most bar on the mode-line when eldoc-eval is -active." - :group '+doom-modeline) - -(defface doom-modeline-inactive-bar '((t (:inherit warning :inverse-video t))) - "The face used for the left-most bar on the mode-line of an inactive window." - :group '+doom-modeline) - - -;; -;; Packages - -;; anzu and evil-anzu expose current/total state that can be displayed in the -;; mode-line. -(def-package! anzu - :after-call isearch-mode - :config - (setq anzu-cons-mode-line-p nil - anzu-minimum-input-length 1 - anzu-search-threshold 250) - (global-anzu-mode +1) - - (defun +doom-modeline*fix-anzu-count (positions here) - (cl-loop for (start . end) in positions - collect t into before - when (and (>= here start) (<= here end)) - return (length before) - finally return 0)) - (advice-add #'anzu--where-is-here :override #'+doom-modeline*fix-anzu-count) - - ;; Avoid anzu conflicts across buffers - (mapc #'make-variable-buffer-local - '(anzu--total-matched anzu--current-position anzu--state - anzu--cached-count anzu--cached-positions anzu--last-command - anzu--last-isearch-string anzu--overflow-p)) - ;; Ensure anzu state is cleared when searches & iedit are done - (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook 'doom-escape-hook #'anzu--reset-status t) - (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) - - -(def-package! evil-anzu - :when (featurep! :feature evil) - :after-call (evil-ex-start-search evil-ex-start-word-search)) - - -;; fish-style modeline -(def-package! shrink-path - :commands (shrink-path-prompt shrink-path-file-mixed)) - - -;; Keep `+doom-modeline-current-window' up-to-date -(defvar +doom-modeline-current-window (frame-selected-window)) -(defun +doom-modeline|set-selected-window (&rest _) - "Sets `+doom-modeline-current-window' appropriately" - (when-let* ((win (frame-selected-window))) - (unless (minibuffer-window-active-p win) - (setq +doom-modeline-current-window win) - (force-mode-line-update)))) - -(defun +doom-modeline|unset-selected-window () - (setq +doom-modeline-current-window nil) - (force-mode-line-update)) - -(add-hook 'window-configuration-change-hook #'+doom-modeline|set-selected-window) -(add-hook 'doom-enter-window-hook #'+doom-modeline|set-selected-window) -(with-no-warnings - (cond ((not (boundp 'after-focus-change-function)) - (add-hook 'focus-in-hook #'+doom-modeline|set-selected-window) - (add-hook 'focus-out-hook #'+doom-modeline|unset-selected-window)) - ((defun +doom-modeline|refresh-frame () - (setq +doom-modeline-current-window nil) - (cl-loop for frame in (frame-list) - if (eq (frame-focus-state frame) t) - return (setq +doom-modeline-current-window (frame-selected-window frame))) - (force-mode-line-update)) - (add-function :after after-focus-change-function #'+doom-modeline|refresh-frame)))) - - -;; -;; Variables - -(defvar +doom-modeline-height 23 - "How tall the mode-line should be (only respected in GUI emacs).") - -(defvar +doom-modeline-bar-width 3 - "How wide the mode-line bar should be (only respected in GUI emacs).") - -(defvar +doom-modeline-buffer-file-name-style 'truncate-upto-project - "Determines the style used by `+doom-modeline-buffer-file-name'. - -Given ~/Projects/FOSS/emacs/lisp/comint.el -truncate-upto-project => ~/P/F/emacs/lisp/comint.el -truncate-upto-root => ~/P/F/e/lisp/comint.el -truncate-all => ~/P/F/e/l/comint.el -relative-from-project => emacs/lisp/comint.el -relative-to-project => lisp/comint.el -file-name => comint.el") - -;; externs -(defvar anzu--state nil) -(defvar evil-mode nil) -(defvar evil-state nil) -(defvar evil-visual-selection nil) -(defvar iedit-mode nil) -(defvar all-the-icons-scale-factor) -(defvar all-the-icons-default-adjust) - - -;; -;; Modeline helpers - -(defun active () - (eq (selected-window) +doom-modeline-current-window)) - -(defun +doom-modeline--make-xpm (face width height) - "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." - (propertize - " " 'display - (let ((data (make-list height (make-list width 1))) - (color (or (face-background face nil t) "None"))) - (ignore-errors - (create-image - (concat - (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," - (length (car data)) - (length data) - color - color) - (apply #'concat - (cl-loop with idx = 0 - with len = (length data) - for dl in data - do (cl-incf idx) - collect - (concat "\"" - (cl-loop for d in dl - if (= d 0) collect (string-to-char " ") - else collect (string-to-char ".")) - (if (eq idx len) "\"};" "\",\n"))))) - 'xpm t :ascent 'center))))) - -(defun +doom-modeline-buffer-file-name () - "Propertized `buffer-file-name' based on `+doom-modeline-buffer-file-name-style'." - (let ((buffer-file-name (or (buffer-file-name (buffer-base-buffer)) ""))) - (unless buffer-file-truename - (setq buffer-file-truename (file-truename buffer-file-name))) - (propertize - (pcase +doom-modeline-buffer-file-name-style - (`truncate-upto-project - (+doom-modeline--buffer-file-name buffer-file-name buffer-file-truename 'shrink)) - (`truncate-upto-root - (+doom-modeline--buffer-file-name-truncate buffer-file-name buffer-file-truename)) - (`truncate-all - (+doom-modeline--buffer-file-name-truncate buffer-file-name buffer-file-truename t)) - (`relative-to-project - (+doom-modeline--buffer-file-name-relative buffer-file-name buffer-file-truename)) - (`relative-from-project - (+doom-modeline--buffer-file-name-relative buffer-file-name buffer-file-truename 'include-project)) - (`file-name - (propertize (file-name-nondirectory buffer-file-name) - 'face - (let ((face (or (and (buffer-modified-p) - 'doom-modeline-buffer-modified) - (and (active) - 'doom-modeline-buffer-file)))) - (when face `(:inherit ,face)))))) - 'help-echo buffer-file-truename))) - -(defun +doom-modeline--buffer-file-name-truncate (file-path true-file-path &optional truncate-tail) - "Propertized `buffer-file-name' that truncates every dir along path. -If TRUNCATE-TAIL is t also truncate the parent directory of the file." - (let ((dirs (shrink-path-prompt (file-name-directory true-file-path))) - (active (active))) - (if (null dirs) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) - (let ((dirname (car dirs)) - (basename (cdr dirs)) - (dir-faces (or modified-faces (if active 'doom-modeline-project-root-dir))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (concat (propertize (concat dirname - (if truncate-tail (substring basename 0 1) basename) - "/") - 'face (if dir-faces `(:inherit ,dir-faces))) - (propertize (file-name-nondirectory file-path) - 'face (if file-faces `(:inherit ,file-faces))))))))) - -(defun +doom-modeline--buffer-file-name-relative (_file-path true-file-path &optional include-project) - "Propertized `buffer-file-name' showing directories relative to project's root only." - (let ((root (or (doom-project-root) default-directory)) - (active (active))) - (if (null root) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (let* ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified)) - (relative-dirs (file-relative-name (file-name-directory true-file-path) - (if include-project (concat root "../") root))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (if (equal "./" relative-dirs) (setq relative-dirs "")) - (concat (propertize relative-dirs 'face (if relative-faces `(:inherit ,relative-faces))) - (propertize (file-name-nondirectory true-file-path) - 'face (if file-faces `(:inherit ,file-faces)))))))) - -(defun +doom-modeline--buffer-file-name (file-path _true-file-path &optional truncate-project-root-parent) - "Propertized `buffer-file-name'. -If TRUNCATE-PROJECT-ROOT-PARENT is t space will be saved by truncating it down -fish-shell style. - -Example: -~/Projects/FOSS/emacs/lisp/comint.el => ~/P/F/emacs/lisp/comint.el" - (let* ((project-root (or (doom-project-root) default-directory)) - (file-name-split (shrink-path-file-mixed project-root - (file-name-directory file-path) - file-path)) - (active (active))) - (if (null file-name-split) - (propertize "%b" 'face (if active 'doom-modeline-buffer-file)) - (pcase-let ((`(,root-path-parent ,project ,relative-path ,file-path) file-name-split)) - (let ((modified-faces (if (buffer-modified-p) 'doom-modeline-buffer-modified))) - (let ((sp-faces (or modified-faces (if active 'font-lock-comment-face))) - (project-faces (or modified-faces (if active 'font-lock-string-face))) - (relative-faces (or modified-faces (if active 'doom-modeline-buffer-path))) - (file-faces (or modified-faces (if active 'doom-modeline-buffer-file)))) - (let ((sp-props `(,@(if sp-faces `(:inherit ,sp-faces)) ,@(if active '(:weight bold)))) - (project-props `(,@(if project-faces `(:inherit ,project-faces)) ,@(if active '(:weight bold)))) - (relative-props `(,@(if relative-faces `(:inherit ,relative-faces)))) - (file-props `(,@(if file-faces `(:inherit ,file-faces))))) - (concat (propertize (if truncate-project-root-parent - root-path-parent - (abbreviate-file-name project-root)) - 'face sp-props) - (propertize (concat project "/") 'face project-props) - (if relative-path (propertize relative-path 'face relative-props)) - (propertize file-path 'face file-props))))))))) - - -;; -;; buffer information - -(def-modeline-segment! buffer-default-directory - "Displays `default-directory'. This is for special buffers like the scratch -buffer where knowing the current project directory is important." - (let ((face (if (active) 'doom-modeline-buffer-path))) - (concat (if (display-graphic-p) " ") - (all-the-icons-octicon - "file-directory" - :face face - :v-adjust -0.05 - :height 1.25) - (propertize (concat " " (abbreviate-file-name default-directory)) - 'face face)))) - -(def-modeline-segment! buffer-info - "Combined information about the current buffer, including the current working -directory, the file name, and its state (modified, read-only or non-existent)." - (concat (cond (buffer-read-only - (concat (all-the-icons-octicon - "lock" - :face 'doom-modeline-warning - :v-adjust -0.05) - " ")) - ((buffer-modified-p) - (concat (all-the-icons-faicon - "floppy-o" - :face 'doom-modeline-buffer-modified - :v-adjust -0.0575) - " ")) - ((and buffer-file-name - (not (file-exists-p buffer-file-name))) - (concat (all-the-icons-octicon - "circle-slash" - :face 'doom-modeline-urgent - :v-adjust -0.05) - " ")) - ((buffer-narrowed-p) - (concat (all-the-icons-octicon - "fold" - :face 'doom-modeline-warning - :v-adjust -0.05) - " "))) - (if buffer-file-name - (+doom-modeline-buffer-file-name) - "%b"))) - -(def-modeline-segment! buffer-info-simple - "Display only the current buffer's name, but with fontification." - (propertize - "%b" - 'face (cond ((and buffer-file-name (buffer-modified-p)) - 'doom-modeline-buffer-modified) - ((active) 'doom-modeline-buffer-file)))) - -;; (defvar +doom-modeline--encoding nil) -;; (def-modeline-segment! buffer-encoding -;; "TODO" -;; +doom-modeline--encoding) - -;; (add-variable-watcher -;; 'buffer-file-coding-system -;; (lambda (_sym val op _where) -;; (when (eq op 'set) -;; (setq +doom-modeline--encoding -;; (concat (pcase (coding-system-eol-type val) -;; (0 "LF ") -;; (1 "CRLF ") -;; (2 "CR ")) -;; (let ((sys (coding-system-plist val))) -;; (if (memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) -;; "UTF-8" -;; (upcase (symbol-name (plist-get sys :name))))) -;; " "))))) - -(def-modeline-segment! buffer-encoding - "Displays the encoding and eol style of the buffer the same way Atom does." - (concat (pcase (coding-system-eol-type buffer-file-coding-system) - (0 "LF ") - (1 "CRLF ") - (2 "CR ")) - (let ((sys (coding-system-plist buffer-file-coding-system))) - (cond ((memq (plist-get sys :category) '(coding-category-undecided coding-category-utf-8)) - "UTF-8") - (t (upcase (symbol-name (plist-get sys :name)))))) - " ")) - - -;; -;; major-mode - -(def-modeline-segment! major-mode - "The major mode, including process, environment and text-scale info." - (propertize - (concat (format-mode-line mode-name) - (when (stringp mode-line-process) - mode-line-process) - (and (boundp 'text-scale-mode-amount) - (/= text-scale-mode-amount 0) - (format " (%+d)" text-scale-mode-amount))) - 'face (if (active) 'doom-modeline-buffer-major-mode))) - - -;; -;; vcs - -(defvar-local +doom-modeline--vcs nil) -(defun +doom-modeline--update-vcs () - (setq +doom-modeline--vcs - (when (and vc-mode buffer-file-name) - (let* ((backend (vc-backend buffer-file-name)) - (state (vc-state buffer-file-name backend))) - (let ((face 'mode-line-inactive) - (active (active)) - (all-the-icons-default-adjust -0.1)) - (concat " " - (cond ((memq state '(edited added)) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05)) - ((eq state 'needs-merge) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon "git-merge" :face face)) - ((eq state 'needs-update) - (if active (setq face 'doom-modeline-warning)) - (all-the-icons-octicon "arrow-down" :face face)) - ((memq state '(removed conflict unregistered)) - (if active (setq face 'doom-modeline-urgent)) - (all-the-icons-octicon "alert" :face face)) - (t - (if active (setq face 'font-lock-doc-face)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05))) - " " - (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face)) - " ")))))) -(add-hook 'after-revert-hook #'+doom-modeline--update-vcs) -(add-hook 'after-save-hook #'+doom-modeline--update-vcs) -(add-hook 'find-file-hook #'+doom-modeline--update-vcs t) -(advice-add #'vc-refresh-state :after #'+doom-modeline--update-vcs) - -(def-modeline-segment! vcs - "Displays the current branch, colored based on its state." - +doom-modeline--vcs) - - -;; -;; flycheck - -(defvar +doom-modeline-vspc - (propertize " " 'face 'variable-pitch) - "TODO") - -(defun +doom-ml-icon (icon &optional text face voffset) - "Displays an octicon ICON with FACE, followed by TEXT. Uses -`all-the-icons-octicon' to fetch the icon." - (concat (if vc-mode " " " ") - (when icon - (concat - (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) - (if text +doom-modeline-vspc))) - (if text (propertize text 'face face)) - (if vc-mode " " " "))) - -(defvar-local +doom-modeline--flycheck nil) -(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) -(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) - -(defun +doom-modeline|update-flycheck-segment (&optional status) - (setq +doom-modeline--flycheck - (pcase status - ('finished (if flycheck-current-errors - (let-alist (flycheck-count-errors flycheck-current-errors) - (let ((sum (+ (or .error 0) (or .warning 0)))) - (+doom-ml-icon "do_not_disturb_alt" - (number-to-string sum) - (if .error 'doom-modeline-urgent 'doom-modeline-warning) - -0.25))) - (+doom-ml-icon "check" nil 'doom-modeline-info))) - ('running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) - ('no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) - ('errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) - ('interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face))))) - -(def-modeline-segment! flycheck - "Displays color-coded flycheck error status in the current buffer with pretty -icons." - +doom-modeline--flycheck) - - -;; -;; selection-info - -(defsubst doom-column (pos) - (save-excursion (goto-char pos) - (current-column))) - -(defvar-local +doom-modeline-enable-word-count nil - "If non-nil, a word count will be added to the selection-info modeline -segment.") - -(defun +doom-modeline|enable-word-count () (setq +doom-modeline-enable-word-count t)) -(add-hook 'text-mode-hook #'+doom-modeline|enable-word-count) - -(def-modeline-segment! selection-info - "Information about the current selection, such as how many characters and -lines are selected, or the NxM dimensions of a block selection." - (when (and (active) (or mark-active (eq evil-state 'visual))) - (cl-destructuring-bind (beg . end) - (if (eq evil-state 'visual) - (cons evil-visual-beginning evil-visual-end) - (cons (region-beginning) (region-end))) - (propertize - (let ((lines (count-lines beg (min end (point-max))))) - (concat (cond ((or (bound-and-true-p rectangle-mark-mode) - (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column end) - (doom-column beg))))) - (format "%dx%dB" lines cols))) - ((eq evil-visual-selection 'line) - (format "%dL" lines)) - ((> lines 1) - (format "%dC %dL" (- end beg) lines)) - ((format "%dC" (- end beg)))) - (when +doom-modeline-enable-word-count - (format " %dW" (count-words beg end))))) - 'face 'doom-modeline-highlight)))) - - -;; -;; matches (anzu, evil-substitute, iedit, macro) - -(defun +doom-modeline--macro-recording () - "Display current Emacs or evil macro being recorded." - (when (and (active) (or defining-kbd-macro executing-kbd-macro)) - (let ((sep (propertize " " 'face 'doom-modeline-panel))) - (concat sep - (propertize (if (bound-and-true-p evil-this-macro) - (char-to-string evil-this-macro) - "Macro") - 'face 'doom-modeline-panel) - sep - (all-the-icons-octicon "triangle-right" - :face 'doom-modeline-panel - :v-adjust -0.05) - sep)))) - -(defsubst +doom-modeline--anzu () - "Show the match index and total number thereof. Requires `anzu', also -`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." - (when (and anzu--state (not iedit-mode)) - (propertize - (let ((here anzu--current-position) - (total anzu--total-matched)) - (cond ((eq anzu--state 'replace-query) - (format " %d replace " total)) - ((eq anzu--state 'replace) - (format " %d/%d " here total)) - (anzu--overflow-p - (format " %s+ " total)) - (t - (format " %s/%d " here total)))) - 'face (if (active) 'doom-modeline-panel)))) - -(defsubst +doom-modeline--evil-substitute () - "Show number of matches for evil-ex substitutions and highlights in real time." - (when (and evil-mode - (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) - (assq 'evil-ex-global-match evil-ex-active-highlights-alist) - (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) - (propertize - (let ((range (if evil-ex-range - (cons (car evil-ex-range) (cadr evil-ex-range)) - (cons (line-beginning-position) (line-end-position)))) - (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) - (if pattern - (format " %s matches " (how-many pattern (car range) (cdr range))) - " - ")) - 'face (if (active) 'doom-modeline-panel)))) - -(defun doom-themes--overlay-sort (a b) - (< (overlay-start a) (overlay-start b))) - -(defsubst +doom-modeline--iedit () - "Show the number of iedit regions matches + what match you're on." - (when (and iedit-mode iedit-occurrences-overlays) - (propertize - (let ((this-oc (or (let ((inhibit-message t)) - (iedit-find-current-occurrence-overlay)) - (progn (iedit-prev-occurrence) - (iedit-find-current-occurrence-overlay)))) - (length (length iedit-occurrences-overlays))) - (format " %s/%d " - (if this-oc - (- length - (length (memq this-oc (sort (append iedit-occurrences-overlays nil) - #'doom-themes--overlay-sort))) - -1) - "-") - length)) - 'face (if (active) 'doom-modeline-panel)))) - -(def-modeline-segment! matches - "Displays: 1. the currently recording macro, 2. A current/total for the -current search term (with anzu), 3. The number of substitutions being conducted -with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." - (let ((meta (concat (+doom-modeline--macro-recording) - (+doom-modeline--anzu) - (+doom-modeline--evil-substitute) - (+doom-modeline--iedit)))) - (or (and (not (equal meta "")) meta) - (if buffer-file-name " %I ")))) - - -;; -;; media-info - -(def-modeline-segment! media-info - "Metadata regarding the current file, such as dimensions for images." - ;; TODO Include other information - (cond ((eq major-mode 'image-mode) - (cl-destructuring-bind (width . height) - (image-size (image-get-display-property) :pixels) - (format " %dx%d " width height))))) - - -;; -;; bar - -(defvar +doom-modeline--bar-active nil) -(defvar +doom-modeline--bar-inactive nil) -(def-modeline-segment! bar - "The bar regulates the height of the mode-line in GUI Emacs. -Returns \"\" to not break --no-window-system." - (if window-system - (if (active) - +doom-modeline--bar-active - +doom-modeline--bar-inactive) - "")) - -(when EMACS26+ - (add-variable-watcher - '+doom-modeline-height - (lambda (_sym val op _where) - (when (and (eq op 'set) (integerp val)) - (+doom-modeline|refresh-bars +doom-modeline-bar-width val)))) - - (add-variable-watcher - '+doom-modeline-bar-width - (lambda (_sym val op _where) - (when (and (eq op 'set) (integerp val)) - (+doom-modeline|refresh-bars val +doom-modeline-height)))) - - (add-hook 'doom-big-font-mode-hook #'+doom-modeline|resize-for-big-font)) - - -;; -;; Mode lines - -(def-modeline! 'main - '(bar matches " " buffer-info " %l:%c %p " selection-info) - '(buffer-encoding major-mode vcs flycheck)) - -(def-modeline! 'minimal - '(bar matches " " buffer-info) - '(media-info major-mode)) - -(def-modeline! 'special - '(bar matches " " buffer-info-simple " %l:%c %p " selection-info) - '(buffer-encoding major-mode flycheck)) - -(def-modeline! 'project - '(bar buffer-default-directory) - '(major-mode)) - -(def-modeline! 'media - '(bar " %b ") - '(media-info major-mode)) - - -;; -;; Hooks - -(defun +doom-modeline|refresh-bars (&optional width height) - (setq +doom-modeline--bar-active - (+doom-modeline--make-xpm 'doom-modeline-bar - (or width +doom-modeline-bar-width) - (or height +doom-modeline-height)) - +doom-modeline--bar-inactive - (+doom-modeline--make-xpm 'doom-modeline-inactive-bar - (or width +doom-modeline-bar-width) - (or height +doom-modeline-height)))) - -(defun +doom-modeline|init () - ;; Create bars - (+doom-modeline|refresh-bars) - (unless after-init-time - ;; These buffers are already created and don't get modelines. For the love - ;; of Emacs, someone give the man a modeline! - (dolist (bname '("*scratch*" "*Messages*")) - (with-current-buffer bname - (doom-set-modeline 'main))))) - -(defun +doom-modeline|set-special-modeline () - (doom-set-modeline 'special)) - -(defun +doom-modeline|set-media-modeline () - (doom-set-modeline 'media)) - -(defun +doom-modeline|set-project-modeline () - (doom-set-modeline 'project)) - - -;; -;; Bootstrap - -(doom-set-modeline 'main t) ; set default modeline - -(add-hook 'doom-load-theme-hook #'+doom-modeline|init) -(add-hook 'doom-scratch-buffer-hook #'+doom-modeline|set-special-modeline) -(add-hook '+doom-dashboard-mode-hook #'+doom-modeline|set-project-modeline) - -(add-hook 'image-mode-hook #'+doom-modeline|set-media-modeline) -(add-hook 'circe-mode-hook #'+doom-modeline|set-special-modeline) - -;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) -(defvar +doom-modeline-remap-face-cookie nil) -(defun +doom-modeline|focus () - (when +doom-modeline-remap-face-cookie - (require 'face-remap) - (face-remap-remove-relative +doom-modeline-remap-face-cookie))) -(defun +doom-modeline|unfocus () - (setq +doom-modeline-remap-face-cookie (face-remap-add-relative 'mode-line 'mode-line-inactive))) - -(add-hook 'focus-in-hook #'+doom-modeline|focus) -(add-hook 'focus-out-hook #'+doom-modeline|unfocus) diff --git a/modules/ui/doom-modeline/packages.el b/modules/ui/doom-modeline/packages.el deleted file mode 100644 index 72f5044df..000000000 --- a/modules/ui/doom-modeline/packages.el +++ /dev/null @@ -1,20 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ui/doom-modeline/packages.el - -;;; These are the invisible dependencies -;; Required -;;(require 'evil) -;;(require 'projectile) -;;(require 'all-the-icons) - -;; Optional -;;(require 'flycheck) -;;(require 'iedit) -;;(require 'evil-multiedit) - -(package! anzu) - -(when (featurep! :feature evil) - (package! evil-anzu)) - -(package! shrink-path) diff --git a/modules/ui/modeline/autoload.el b/modules/ui/modeline/autoload.el new file mode 100644 index 000000000..0c0a8a955 --- /dev/null +++ b/modules/ui/modeline/autoload.el @@ -0,0 +1,35 @@ +;;; ui/modeline/autoload/modeline.el -*- lexical-binding: t; -*- + +;;;###autodef +(defalias 'def-modeline-format! 'doom-modeline-def-segment) + +;;;###autodef +(defalias 'def-modeline-segment! 'doom-modeline-def-modeline) + +;;;###autodef +(defalias 'set-modeline! 'doom-modeline-set-modeline) + + +(defvar +modeline--old-bar-height nil) +;;;###autoload +(defun +modeline|resize-for-big-font () + "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was +made to be added to `doom-big-font-mode-hook'." + (unless +modeline--old-bar-height + (setq +modeline--old-bar-height doom-modeline-height)) + (let ((default-height +modeline--old-bar-height)) + (if doom-big-font-mode + (let* ((font-size (font-get doom-font :size)) + (big-size (font-get doom-big-font :size)) + (ratio (/ (float big-size) font-size))) + (setq doom-modeline-height (ceiling (* default-height ratio 0.75)))) + (setq doom-modeline-height default-height)) + ;; already has a variable watcher in Emacs 26+ + (unless EMACS26+ (doom-modeline-refresh-bars)))) + +;;;###autoload +(defun +modeline|update-env-in-all-windows (&rest _) + "" + (dolist (window (window-list)) + (with-selected-window window + (doom-modeline-update-env)))) diff --git a/modules/ui/modeline/autoload/modeline.el b/modules/ui/modeline/autoload/modeline.el deleted file mode 100644 index ef9d21a59..000000000 --- a/modules/ui/modeline/autoload/modeline.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; ui/modeline/autoload/modeline.el -*- lexical-binding: t; -*- - -;; (defvar +modeline--old-bar-height nil) -;; ;;;###autoload -;; (defun +modeline|resize-for-big-font () -;; "Adjust the modeline's height when `doom-big-font-mode' is enabled. This was -;; made to be added to `doom-big-font-mode-hook'." -;; (unless +modeline--old-bar-height -;; (setq +modeline--old-bar-height +doom-modeline-height)) -;; (let ((default-height +modeline--old-bar-height)) -;; (if doom-big-font-mode -;; (let* ((font-size (font-get doom-font :size)) -;; (big-size (font-get doom-big-font :size)) -;; (ratio (/ (float big-size) font-size))) -;; (setq +doom-modeline-height (ceiling (* default-height ratio 0.75)))) -;; (setq +doom-modeline-height default-height)) -;; ;; already has a variable watcher in Emacs 26+ -;; (unless EMACS26+ (+doom-modeline|refresh-bars)))) - diff --git a/modules/ui/modeline/autoload/settings.el b/modules/ui/modeline/autoload/settings.el deleted file mode 100644 index 3e0441aae..000000000 --- a/modules/ui/modeline/autoload/settings.el +++ /dev/null @@ -1,104 +0,0 @@ -;;; ui/modeline/autoload/settings.el -*- lexical-binding: t; -*- - -(defvar +modeline--alist nil) - -(defun +modeline--segment-active-p (segment xs) - (cond ((null xs) nil) - ((listp xs) - (or (+modeline--segment-active-p segment (car xs)) - (+modeline--segment-active-p segment (cdr xs)))) - ((eq xs segment)))) - -;;;###autoload -(defun +modeline-segment-active-p (segment) - (or (+modeline--segment-active-p segment +modeline-format-left) - (+modeline--segment-active-p segment +modeline-format-right))) - -;;;###autodef -(defun def-modeline-format! (name left &optional right) - "Define a preset modeline format by name. - -NAME is a symbol. The convention is to use keywords for global formats, like -:main or :project, but to use regular symbols for buffer-local formats, like -'twitter and 'pdf. - -LEFT and RIGHT are lists that assume the same structure as `mode-line-format', -and make up the mode-line in two parts, separated by variable-width space, to -keep them left and right aligned respectively." - (setf (alist-get name +modeline--alist) (list left right))) - -;;;###autodef -(defmacro def-modeline-segment! (name &rest rest) - "TODO" - (declare (doc-string 2)) - (let ((docstring (if (and (stringp (car rest)) (cdr rest)) (pop rest))) - body) - (macroexp-progn - (if (not (keywordp (car rest))) - (append `((defvar-local ,name nil ,docstring) - (put ',name 'risky-local-variable t)) - (if (or (stringp (car rest)) - (memq (car (car-safe rest)) '(:eval :propertize))) - `((setq-default ,name ,(car rest))) - (let ((fn (intern (format "+modeline--%s" name)))) - `((fset ',fn (lambda () ,@rest)) - (byte-compile ',fn) - (setq-default ,name (quote (:eval (,fn)))))))) - ;; isolate body - (setq body rest) - (while (keywordp (car body)) - (setq body (cddr body))) - ;; - (cl-destructuring-bind (&key init faces on-hooks on-set &allow-other-keys) - rest - (let ((realvar (if (and body faces) - (intern (format "+modeline--var-%s" name)) - name))) - (append (when body - (if (or on-hooks on-set) - (let ((setterfn (intern (format "+modeline--set-%s" name))) - (varsetterfn (intern (format "+modeline--setvar-%s" name)))) - (append `((fset ',setterfn - (lambda (&rest _) - (when (+modeline-segment-active-p ',name) - (setq-local ,realvar ,(macroexp-progn body))))) - (byte-compile ',setterfn)) - (mapcar (lambda (hook) `(add-hook ',hook #',setterfn)) - on-hooks) - (when on-set - `((fset ',varsetterfn - (lambda (sym val op where) - (and (eq op 'set) where - (with-current-buffer where - (set sym val) - (,setterfn))))) - ,@(mapcan (lambda (var) `((add-variable-watcher ',var #',varsetterfn))) - on-set))))) - (setq init `(quote (:eval ,(macroexp-progn body)))) - nil)) - (if (eq realvar name) - `((defvar-local ,name nil ,docstring) - (setq-default ,name ,init)) - `((defvar-local ,realvar ,init) - (defvar-local ,name nil ,docstring) - (setq-default - ,name '(:eval (cond ((active) ,realvar) - (,realvar (substring-no-properties ,realvar))))))) - `((put ',name 'risky-local-variable t))))))))) - -;;;###autodef -(defun set-modeline! (name &optional default) - "Replace the current buffer's modeline with a preset mode-line format defined -with `def-modeline-format!'. - -If DEFAULT is non-nil, make it the default mode-line for all buffers." - (cl-check-type name symbol) - (let ((modeline (cdr (assq name +modeline--alist)))) - (unless modeline - (error "The %s modeline format does not exist" name)) - (if default - (setq-default +modeline-format-left `("" ,@(car modeline)) - +modeline-format-right `("" ,@(cadr modeline))) - (setq +modeline-format-left `("" ,@(car modeline)) - +modeline-format-right `("" ,@(cadr modeline)))) - (force-mode-line-update))) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 2c0da1d02..121221daa 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -1,750 +1,53 @@ ;;; ui/modeline/config.el -*- lexical-binding: t; -*- -;; This mode-line is experimental, Emacs 26+ only, may have buggy and is likely -;; to change. It also isn't feature complete, compared to :ui doom-modeline, but -;; it will eventually replace it. -;; -;; However, it is at least ten times faster than the original modeline, and more -;; flexible, what with `+modeline-format-left', `+modeline-format-right', and a -;; more powerful API for defining modelines and modeline segments. +;; TODO Add themes (default, minimal, spacemacs, etc) -;;;; Benchmarks -;; (benchmark-run 1000 (format-mode-line mode-line-format)) -;; Old system: ~0.563 - 0.604 -;; New system: ~0.036 - 0.061 +(def-package! doom-modeline + :hook (doom-post-init . doom-modeline-mode) + :preface + ;; prevent flash of unstyled modeline at startup + (setq-default mode-line-format nil) + ;; We display project info in the modeline ourselves + (setq projectile-dynamic-mode-line nil) + :init + (setq doom-modeline-bar-width 3 + doom-modeline-github nil + doom-modeline-mu4e nil + doom-modeline-persp-name nil + doom-modeline-checker-simple-format nil + doom-modeline-minor-modes nil + doom-modeline-major-mode-icon nil + doom-modeline-buffer-file-name-style 'relative-from-project) -(defvar +modeline-width 3 - "How wide the mode-line bar should be (only respected in GUI emacs).") + (add-hook 'doom-modeline-mode-hook #'size-indication-mode) ; filesize in modeline + (add-hook 'doom-modeline-mode-hook #'column-number-mode) ; cursor column in modeline -(defvar +modeline-height 25 - "How tall the mode-line should be (only respected in GUI emacs).") + :config + (add-hook 'doom-big-font-mode-hook #'+modeline|resize-for-big-font) -(defvar +modeline-bar-at-end nil - "If non-nil, the bar is placed at the end, instead of at the beginning of the -modeline.") + (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) + (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) -(defvar +modeline-bar-invisible nil - "If non-nil, the bar is transparent, and only used to police the height of the -mode-line.") + ;; Remove unused segments & extra padding + (doom-modeline-def-modeline 'main + '(bar matches buffer-info remote-host buffer-position selection-info) + '(misc-info persp-name irc mu4e github debug input-method buffer-encoding lsp major-mode process vcs checker)) -(defvar +modeline-buffer-path-function #'+modeline-file-path-with-project - "A function that returns, in list form, components of the buffer file name -display in the mode-line. + (doom-modeline-def-modeline 'special + '(bar matches buffer-info-simple buffer-position selection-info) + '(misc-info persp-name debug input-method irc-buffers buffer-encoding lsp major-mode process checker)) -Each item should either be a string or a a cons cell whose CAR is the path -component and CDR is the name of a face. - -Currently available functions: - -+ `+modeline-file-path-with-project': project/src/lib/file.c -+ `+modeline-file-path-from-project': src/lib/file.c -+ `+modeline-file-path-truncated-with-project': project/s/l/file.c -+ `+modeline-file-path-truncated-upto-project': ~/w/project/src/lib/file.c -+ `+modeline-file-path-truncated-upto-project-root': ~/w/p/s/lib/file.c -+ `+modeline-file-path-truncated': ~/w/p/s/l/file.c -+ `+modeline-file-name': file.c") - -;; Convenience aliases -(defvaralias 'mode-line-format-left '+modeline-format-left) -(defvaralias 'mode-line-format-right '+modeline-format-right) -;; -(defvar-local +modeline-format-left () "TODO") -(defvar-local +modeline-format-right () "TODO") -(put '+modeline-format-left 'risky-local-variable t) -(put '+modeline-format-right 'risky-local-variable t) - -;; Otherwise appended segments will produce *Invalid* -(setq global-mode-string '("")) -;; We handle this ourselves -(setq projectile-dynamic-mode-line nil) - -;; -(defvar +modeline--vspc (propertize " " 'face 'variable-pitch)) - -;; externs -(defvar anzu--state nil) -(defvar evil-mode nil) -(defvar evil-state nil) -(defvar evil-visual-selection nil) -(defvar evil-visual-beginning nil) -(defvar evil-visual-end nil) -(defvar iedit-mode nil) -(defvar all-the-icons-scale-factor) -(defvar all-the-icons-default-adjust) + (doom-modeline-def-modeline 'project + '(bar buffer-default-directory) + '(misc-info mu4e github debug fancy-battery " " major-mode))) ;; -;; Custom faces - -(defgroup +modeline nil - "TODO" - :group 'faces) - -(defface doom-modeline-buffer-path - '((t (:inherit (mode-line-emphasis bold)))) - "Face used for the dirname part of the buffer path." - :group '+modeline) - -(defface doom-modeline-buffer-file - '((t (:inherit (mode-line-buffer-id bold)))) - "Face used for the filename part of the mode-line buffer path." - :group '+modeline) - -(defface doom-modeline-buffer-project-root - '((t (:inherit doom-modeline-buffer-path))) - "Face used for the project root at the beginning of the mode-line path." - :group '+modeline) - -(defface doom-modeline-buffer-modified '((t (:inherit (error bold) :background nil))) - "Face used for the 'unsaved' symbol in the mode-line." - :group '+modeline) - -(defface doom-modeline-buffer-major-mode '((t (:inherit (mode-line-emphasis bold)))) - "Face used for the major-mode segment in the mode-line." - :group '+modeline) - -(defface doom-modeline-highlight '((t (:inherit mode-line-emphasis))) - "Face for bright segments of the mode-line." - :group '+modeline) - -(defface doom-modeline-panel '((t (:inherit mode-line-highlight))) - "Face for 'X out of Y' segments, such as `+modeline--anzu', -`+modeline--evil-substitute' and `iedit'" - :group '+modeline) - -(defface doom-modeline-info `((t (:inherit (success bold)))) - "Face for info-level messages in the modeline. Used by `*vc'." - :group '+modeline) - -(defface doom-modeline-warning `((t (:inherit (warning bold)))) - "Face for warnings in the modeline. Used by `*flycheck'" - :group '+modeline) - -(defface doom-modeline-urgent `((t (:inherit (error bold)))) - "Face for errors in the modeline. Used by `*flycheck'" - :group '+modeline) - -(defface doom-modeline-bar '((t (:inherit highlight))) - "The face used for the left-most bar on the mode-line of an active window." - :group '+modeline) - - -;; -;; Packages +;; Extensions (def-package! anzu - :after-call isearch-mode - :config - (setq anzu-cons-mode-line-p nil - anzu-minimum-input-length 1 - anzu-search-threshold 250) - (global-anzu-mode +1) - - (defun +modeline*fix-anzu-count (positions here) - (cl-loop for (start . end) in positions - collect t into before - when (and (>= here start) (<= here end)) - return (length before) - finally return 0)) - (advice-add #'anzu--where-is-here :override #'+modeline*fix-anzu-count) - - ;; Avoid anzu conflicts across buffers - (mapc #'make-variable-buffer-local - '(anzu--total-matched anzu--current-position anzu--state - anzu--cached-count anzu--cached-positions anzu--last-command - anzu--last-isearch-string anzu--overflow-p)) - ;; Ensure anzu state is cleared when searches & iedit are done - (add-hook 'isearch-mode-end-hook #'anzu--reset-status t) - (add-hook 'doom-escape-hook #'anzu--reset-status t) - (add-hook 'iedit-mode-end-hook #'anzu--reset-status)) - + :after-call isearch-mode) (def-package! evil-anzu :when (featurep! :feature evil) :after-call (evil-ex-start-search evil-ex-start-word-search)) - - -;; -;; Hacks - -;; Keep `+modeline-current-window' up-to-date -(defvar +modeline-current-window (frame-selected-window)) - -(defun +modeline|set-selected-window (&rest _) - "Sets `+modeline-current-window' appropriately" - (when-let* ((win (frame-selected-window))) - (unless (minibuffer-window-active-p win) - (setq +modeline-current-window win) - (force-mode-line-update)))) - -(defun +modeline|unset-selected-window () - (setq +modeline-current-window nil) - (force-mode-line-update)) - -(add-hook 'window-configuration-change-hook #'+modeline|set-selected-window) -(add-hook 'doom-enter-window-hook #'+modeline|set-selected-window) -(if (not (boundp 'after-focus-change-function)) - (progn - (add-hook 'focus-in-hook #'+modeline|set-selected-window) - (add-hook 'focus-out-hook #'+modeline|unset-selected-window)) - (defun +modeline|refresh-frame () - (setq +modeline-current-window nil) - (cl-loop for frame in (frame-list) - if (eq (frame-focus-state frame) t) - return (setq +modeline-current-window (frame-selected-window frame))) - (force-mode-line-update t)) - (add-function :after after-focus-change-function #'+modeline|refresh-frame)) - -(defsubst active () - (eq (selected-window) +modeline-current-window)) - -;; Ensure modeline is inactive when Emacs is unfocused (and active otherwise) -(defvar +modeline-remap-face-cookies nil) - -(defun +modeline|focus-all-windows (&rest _) - (cl-loop for (buffer . cookie) in +modeline-remap-face-cookies - if (buffer-live-p buffer) - do (with-current-buffer buffer - (face-remap-remove-relative cookie)))) - -(defun +modeline|unfocus-all-windows (&rest _) - (setq +modeline-remap-face-cookies - (cl-loop for window in (window-list) - for buffer = (window-buffer window) - if (buffer-live-p buffer) - collect - (with-current-buffer buffer - (cons buffer - (face-remap-add-relative 'mode-line - 'mode-line-inactive)))))) - -(add-hook 'focus-in-hook #'+modeline|focus-all-windows) -(add-hook 'focus-out-hook #'+modeline|unfocus-all-windows) -(advice-add #'posframe-hide :after #'+modeline|focus-all-windows) -(advice-add #'posframe-delete :after #'+modeline|focus-all-windows) -(when (featurep! :completion helm) - (add-hook 'helm-before-initialize-hook #'+modeline|unfocus-all-windows) - (add-hook 'helm-cleanup-hook #'+modeline|focus-all-windows)) - - -;; -;; Helpers - -(defun +modeline--make-xpm (width height &optional color) - "Create an XPM bitmap. Inspired by `powerline''s `pl/make-xpm'." - (propertize - " " 'display - (let ((data (make-list height (make-list width 1))) - (color (or color "None"))) - (ignore-errors - (create-image - (concat - (format "/* XPM */\nstatic char * percent[] = {\n\"%i %i 2 1\",\n\". c %s\",\n\" c %s\"," - (length (car data)) (length data) color color) - (cl-loop with idx = 0 - with len = (length data) - for dl in data - do (cl-incf idx) - concat "\"" - concat (cl-loop for d in dl - if (= d 0) collect (string-to-char " ") - else collect (string-to-char ".")) - concat (if (eq idx len) "\"};" "\",\n"))) - 'xpm t :ascent 'center))))) - -(defun +modeline-build-path (path) - "Construct the file path for the `+modeline-buffer-id' segment using -`+mdoeline-buffer-path-function'. If the buffer has no `buffer-file-name', just -use `buffer-name'." - (let ((buffer-file-name (or path buffer-file-name))) - (if (or (eq major-mode 'dired-mode) - (null buffer-file-name)) - (propertize "%s" 'face 'doom-modeline-buffer-path) - (cl-loop for spec in (funcall +modeline-buffer-path-function) - if (stringp spec) concat spec - else if (not (null spec)) - concat (propertize (car spec) 'face (cdr spec)))))) - - -;; -;; Buffer file path styles - -(defun +modeline-file-path-with-project () - "Returns the unaltered buffer file path relative to the project root's -parent. - -e.g. project/src/lib/file.c" - (let* ((base (buffer-base-buffer)) - (filename (file-truename (buffer-file-name base)))) - (append (if (doom-project-p) - (let* ((project-root (doom-project-root)) - (relative-dirs (file-relative-name (file-name-directory filename) - (file-truename project-root)))) - (list (cons (concat (doom-project-name) "/") - 'doom-modeline-buffer-project-root) - (unless (equal "./" relative-dirs) - (cons relative-dirs 'doom-modeline-buffer-path)))) - (list nil (cons (abbreviate-file-name (file-name-directory filename)) - 'doom-modeline-buffer-path))) - (list (cons (file-name-nondirectory filename) - 'doom-modeline-buffer-file))))) - -(defun +modeline-file-path-from-project () - "Returns file path relative to the project root. - -e.g. src/lib/file.c - -Meant for `+modeline-buffer-path-function'." - (cdr (+modeline-file-path-with-project))) - -(defun +modeline-file-path-truncated-with-project () - "Returns file path relative to (and including) project root, with descendent -folders truncated. - -e.g. project/s/l/file.c - -Meant for `+modeline-buffer-path-function'." - (let* ((parts (+modeline-file-path-with-project)) - (dirs (car (nth 1 parts)))) - (setcar (nth 1 parts) - (shrink-path--dirs-internal dirs t)) - parts)) - -(defun +modeline-file-path-truncated-upto-project () - "Returns file path, truncating segments prior to the project. - -e.g. ~/w/project/src/lib/file.c - -Meant for `+modeline-buffer-path-function'." - (pcase-let - ((`(,root-parent ,root ,dir, file) - (let ((buffer-file-name (or buffer-file-name (buffer-file-name (buffer-base-buffer))))) - (shrink-path-file-mixed (or (doom-project-root) default-directory) - (file-name-directory buffer-file-name) - buffer-file-name)))) - (list (cons root-parent 'font-lock-comment-face) - (cons root 'doom-modeline-buffer-project-root) - (cons (concat "/" dir) 'doom-modeline-buffer-path) - (cons file 'doom-modeline-buffer-file)))) - -(defun +modeline-file-path-truncated-upto-project-root () - "Return file path, truncating segemnts prior to (and including) the project -root. - -e.g. ~/w/p/src/lib/file.c - -Meant for `+modeline-buffer-path-function'." - (let* ((parts (+modeline-file-path-truncated-upto-project)) - (root (car (nth 1 parts)))) - (setcar (nth 1 parts) - (let ((first (substring root 0 1))) - (if (equal first ".") - (substring root 0 2) - first))) - parts)) - -(defun +modeline-file-path-truncated () - "Return absolute file path with all directories truncated. - -e.g. ~/w/p/s/l/file.c - -Meant for `+modeline-buffer-path-function'." - (pcase-let ((`(,dir . ,file) - (shrink-path-prompt (buffer-file-name (buffer-base-buffer))))) - (list (cons dir 'doom-modeline-buffer-path) - (cons file 'doom-modeline-buffer-file)))) - -(defun +modeline-file-name () - "Return buffer name. - -e.g. file.c - -Meant for `+modeline-buffer-path-function'." - (list (cons "%b" 'doom-modeline-buffer-path))) - - -;; -;; Bars - -(defvar +modeline-bar-start nil "TODO") -(put '+modeline-bar-start 'risky-local-variable t) -(defvar +modeline-bar-end nil "TODO") -(put '+modeline-bar-end 'risky-local-variable t) - -(defvar +modeline-bar-active nil "TODO") -(defvar +modeline-bar-inactive nil "TODO") -(defun +modeline|setup-bars () - (setq +modeline-bar-active - (+modeline--make-xpm +modeline-width +modeline-height - (unless +modeline-bar-invisible - (face-background 'doom-modeline-bar nil t))) - +modeline-bar-inactive - (+modeline--make-xpm +modeline-width +modeline-height)) - (setq +modeline-bar-start nil - +modeline-bar-end nil) - (if +modeline-bar-at-end - (setq +modeline-bar-end '+modeline-bar) - (setq +modeline-bar-start '+modeline-bar))) -(add-hook 'doom-load-theme-hook #'+modeline|setup-bars) - -(defun +modeline|setup-bars-after-change (sym val op _where) - (when (eq op 'set) - (set sym val) - (+modeline|setup-bars))) -(add-variable-watcher '+modeline-width #'+modeline|setup-bars-after-change) -(add-variable-watcher '+modeline-height #'+modeline|setup-bars-after-change) -(add-variable-watcher '+modeline-bar-at-end #'+modeline|setup-bars-after-change) -(add-variable-watcher '+modeline-bar-invisible #'+modeline|setup-bars-after-change) - -(def-modeline-segment! +modeline-bar - (if (active) +modeline-bar-active +modeline-bar-inactive)) - - -;; -;; Segments - -(def-modeline-segment! +modeline-buffer-state - (let* ((base (buffer-base-buffer)) - (icon (cond (buffer-read-only - (all-the-icons-octicon - "lock" - :face 'doom-modeline-warning - :v-adjust -0.05)) - ((buffer-modified-p base) - (all-the-icons-faicon - "floppy-o" - :face 'doom-modeline-buffer-modified - :v-adjust -0.05)) - ((and (buffer-file-name base) - (not (file-exists-p (buffer-file-name base)))) - (all-the-icons-octicon - "circle-slash" - :face 'doom-modeline-urgent - :v-adjust -0.05))))) - (if icon (concat icon " ")))) - -(def-modeline-segment! +modeline-buffer-id - :on-hooks (find-file-hook after-save-hook after-revert-hook) - :init (propertize "%b" 'face 'doom-modeline-buffer-file) - :faces t - (let ((file-path (buffer-file-name (buffer-base-buffer)))) - (propertize (+modeline-build-path file-path) - 'help-echo file-path))) - -(def-modeline-segment! +modeline-buffer-directory - (let ((face (if (active) 'doom-modeline-buffer-path))) - (propertize - (concat (if (display-graphic-p) " ") - (all-the-icons-octicon - "file-directory" - :face face - :v-adjust -0.1 - :height 1.25) - " " - (propertize (abbreviate-file-name default-directory) - 'face face)) - 'help-echo default-directory))) - -(def-modeline-segment! +modeline-vcs - :on-set (vc-mode) - (when (and vc-mode buffer-file-name) - (let* ((backend (vc-backend buffer-file-name)) - (state (vc-state buffer-file-name backend))) - (let ((face 'mode-line-inactive) - (active (active)) - (all-the-icons-default-adjust -0.1)) - (concat (cond ((memq state '(edited added)) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05)) - ((eq state 'needs-merge) - (if active (setq face 'doom-modeline-info)) - (all-the-icons-octicon "git-merge" :face face)) - ((eq state 'needs-update) - (if active (setq face 'doom-modeline-warning)) - (all-the-icons-octicon "arrow-down" :face face)) - ((memq state '(removed conflict unregistered)) - (if active (setq face 'doom-modeline-urgent)) - (all-the-icons-octicon "alert" :face face)) - (t - (if active (setq face 'font-lock-doc-face)) - (all-the-icons-octicon - "git-compare" - :face face - :v-adjust -0.05))) - +modeline--vspc - (propertize (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2)) - 'face (if active face))))))) - -(def-modeline-segment! +modeline-indent-style - :on-hooks (after-revert-hook after-save-hook find-file-hook) - :on-set (indent-tabs-mode tab-width) - (propertize (format "%s%d " - (if indent-tabs-mode "⭾" "␣") - tab-width) - 'help-echo - (format "Indentation: %d %s wide" - tab-width - (if indent-tabs-mode "tabs" "spaces")))) - -(def-modeline-segment! +modeline-encoding - :on-hooks (after-revert-hook after-save-hook find-file-hook) - :on-set (buffer-file-coding-system) - (concat (pcase (coding-system-eol-type buffer-file-coding-system) - (0 (propertize "LF" 'help-echo "EOL convention: \\n (Unix)")) - (1 (propertize "CRLF" 'help-echo "EOL convention: \\r\\n (Windows, Symbian OS, etc)")) - (2 (propertize "CR" 'help-echo "EOL convention: \\r (pre-OSX MacOS)"))) - " " - (let* ((sys (coding-system-plist buffer-file-coding-system)) - (category (plist-get sys :category))) - (propertize - (cond ((eq category 'coding-category-undecided) - "") - ((or (eq category 'coding-category-utf-8) - (string-match-p "utf-8" (symbol-name (plist-get sys :name)))) - "") - ((concat (upcase (symbol-name (plist-get sys :name))) - " "))) - 'help-echo (plist-get (coding-system-plist buffer-file-coding-system) :docstring))))) - -(def-modeline-segment! +modeline-major-mode - (propertize (format-mode-line mode-name) - 'face (if (active) 'doom-modeline-buffer-major-mode))) - -(defun +modeline--macro-recording () - "Display current Emacs or evil macro being recorded." - (when (and (active) (or defining-kbd-macro executing-kbd-macro)) - (let ((sep (propertize " " 'face 'doom-modeline-panel))) - (concat sep - (propertize (if (bound-and-true-p evil-this-macro) - (char-to-string evil-this-macro) - "Macro") - 'face 'doom-modeline-panel) - sep - (all-the-icons-octicon "triangle-right" - :face 'doom-modeline-panel - :v-adjust -0.05) - sep)))) - -(defsubst +modeline--anzu () - "Show the match index and total number thereof. Requires `anzu', also -`evil-anzu' if using `evil-mode' for compatibility with `evil-search'." - (when (and anzu--state (not iedit-mode)) - (propertize - (let ((here anzu--current-position) - (total anzu--total-matched)) - (cond ((eq anzu--state 'replace-query) - (format " %d replace " total)) - ((eq anzu--state 'replace) - (format " %d/%d " here total)) - (anzu--overflow-p - (format " %s+ " total)) - ((format " %s/%d " here total)))) - 'face (if (active) 'doom-modeline-panel)))) - -(defsubst +modeline--evil-substitute () - "Show number of matches for evil-ex substitutions and highlights in real time." - (when (and evil-mode - (or (assq 'evil-ex-substitute evil-ex-active-highlights-alist) - (assq 'evil-ex-global-match evil-ex-active-highlights-alist) - (assq 'evil-ex-buffer-match evil-ex-active-highlights-alist))) - (propertize - (let ((range (if evil-ex-range - (cons (car evil-ex-range) (cadr evil-ex-range)) - (cons (line-beginning-position) (line-end-position)))) - (pattern (car-safe (evil-delimited-arguments evil-ex-argument 2)))) - (if pattern - (format " %s matches " (how-many pattern (car range) (cdr range))) - " - ")) - 'face (if (active) 'doom-modeline-panel)))) - -(defun doom-themes--overlay-sort (a b) - (< (overlay-start a) (overlay-start b))) - -(defsubst +modeline--iedit () - "Show the number of iedit regions matches + what match you're on." - (when (and iedit-mode iedit-occurrences-overlays) - (propertize - (let ((this-oc (or (let ((inhibit-message t)) - (iedit-find-current-occurrence-overlay)) - (progn (iedit-prev-occurrence) - (iedit-find-current-occurrence-overlay)))) - (length (length iedit-occurrences-overlays))) - (format " %s/%d " - (if this-oc - (- length - (length (memq this-oc (sort (append iedit-occurrences-overlays nil) - #'doom-themes--overlay-sort))) - -1) - "-") - length)) - 'face (if (active) 'doom-modeline-panel)))) - -(defun +doom-ml-octicon (icon &optional text face voffset padding) - "Displays an octicon ICON with FACE, followed by TEXT. Uses -`all-the-icons-octicon' to fetch the icon." - (let ((padding-str (if padding (propertize (make-string padding ? ) 'face face)))) - (concat padding-str - (when icon - (all-the-icons-octicon icon :face face :height 1.1 :v-adjust (or voffset -0.2))) - (if text (propertize (concat " " text) 'face face)) - padding-str))) - -(defsubst +modeline--multiple-cursors () - "Show the number of multiple cursors." - (cond ((bound-and-true-p multiple-cursors-mode) - (propertize - (concat " mc " (eval (cadadr mc/mode-line)) " ") - 'face (if (active) 'doom-modeline-panel))) - ((bound-and-true-p evil-mc-cursor-list) - (+doom-ml-octicon (if evil-mc-frozen "pin" "pencil") - (number-to-string (length evil-mc-cursor-list)) - (if (active) 'doom-modeline-panel) - 0 - 1)))) - -(def-modeline-segment! +modeline-matches - "Displays: 1. the currently recording macro, 2. A current/total for the -current search term (with anzu), 3. The number of substitutions being conducted -with `evil-ex-substitute', and/or 4. The number of active `iedit' regions." - (let ((meta (concat (+modeline--macro-recording) - (+modeline--anzu) - (+modeline--evil-substitute) - (+modeline--iedit) - (+modeline--multiple-cursors) - " "))) - (or (and (not (equal meta " ")) meta) - (if buffer-file-name " %I ")))) - -;; -(defsubst doom-column (pos) - (save-excursion (goto-char pos) - (current-column))) - -(defvar-local +modeline-enable-word-count nil - "If non-nil, a word count will be added to the selection-info modeline -segment.") - -(defun +modeline|enable-word-count () - (setq +modeline-enable-word-count t)) -(add-hook 'text-mode-hook #'+modeline|enable-word-count) - -(def-modeline-segment! +modeline-selection-info - (let ((beg (or evil-visual-beginning (region-beginning))) - (end (or evil-visual-end (region-end)))) - (propertize - (let ((lines (count-lines beg (min end (point-max))))) - (concat (cond ((or (bound-and-true-p rectangle-mark-mode) - (eq 'block evil-visual-selection)) - (let ((cols (abs (- (doom-column end) - (doom-column beg))))) - (format "%dx%dB" lines cols))) - ((eq evil-visual-selection 'line) - (format "%dL" lines)) - ((> lines 1) - (format "%dC %dL" (- end beg) lines)) - ((format "%dC" (- end beg)))) - (when +modeline-enable-word-count - (format " %dW" (count-words beg end))))) - 'face 'doom-modeline-highlight))) - -(defun +modeline|enable-selection-info () - (add-to-list '+modeline-format-left '+modeline-selection-info t #'eq)) -(defun +modeline|disable-selection-info () - (setq +modeline-format-left (delq '+modeline-selection-info +modeline-format-left))) -(cond ((featurep 'evil) - (add-hook 'evil-visual-state-entry-hook #'+modeline|enable-selection-info) - (add-hook 'evil-visual-state-exit-hook #'+modeline|disable-selection-info)) - ((add-hook 'activate-mark-hook #'+modeline|enable-selection-info) - (add-hook 'deactivate-mark-hook #'+modeline|disable-selection-info))) - -;; flycheck -(defun +doom-ml-icon (icon &optional text face voffset) - "Displays an octicon ICON with FACE, followed by TEXT. Uses -`all-the-icons-octicon' to fetch the icon." - (concat (when icon - (concat - (all-the-icons-material icon :face face :height 1.1 :v-adjust (or voffset -0.2)) - (if text +modeline--vspc))) - (if text (propertize text 'face face)))) - -(defun +modeline-flycheck-status (status) - (pcase status - (`finished (if flycheck-current-errors - (let-alist (flycheck-count-errors flycheck-current-errors) - (let ((sum (+ (or .error 0) (or .warning 0)))) - (+doom-ml-icon "do_not_disturb_alt" - (number-to-string sum) - (if .error 'doom-modeline-urgent 'doom-modeline-warning) - -0.25))) - (+doom-ml-icon "check" nil 'doom-modeline-info))) - (`running (+doom-ml-icon "access_time" nil 'font-lock-doc-face -0.25)) - ;; (`no-checker (+doom-ml-icon "sim_card_alert" "-" 'font-lock-doc-face)) - (`errored (+doom-ml-icon "sim_card_alert" "Error" 'doom-modeline-urgent)) - (`interrupted (+doom-ml-icon "pause" "Interrupted" 'font-lock-doc-face)))) - -(defun +doom-modeline|update-flycheck-segment (&optional status) - (setq +modeline-flycheck - (when-let* ((status-str (+modeline-flycheck-status status))) - (concat +modeline--vspc status-str " ")))) -(add-hook 'flycheck-mode-hook #'+doom-modeline|update-flycheck-segment) -(add-hook 'flycheck-status-changed-functions #'+doom-modeline|update-flycheck-segment) - -(def-modeline-segment! +modeline-flycheck - "Displays color-coded flycheck error status in the current buffer with pretty -icons." - :init nil) - - -;; -;; Preset modeline formats - -(def-modeline-format! :main - '(+modeline-matches " " - +modeline-buffer-state - +modeline-buffer-id - " %2l:%c %p ") - `(mode-line-misc-info - +modeline-indent-style - +modeline-encoding - +modeline-major-mode " " - (vc-mode (" " +modeline-vcs " ")) - mode-line-process - +modeline-flycheck)) - -(def-modeline-format! :minimal - '(+modeline-matches " " - +modeline-buffer-state - +modeline-buffer-id) - '(+modeline-major-mode)) - -(def-modeline-format! :special - '(+modeline-matches +modeline-buffer-state " %b " +modeline-buffer-position) - '(+modeline-encoding +modeline-major-mode mode-line-process)) - -(def-modeline-format! :project - '(+modeline-buffer-directory) - '(+modeline-major-mode)) - - -;; -(def-modeline-segment! +modeline--rest - (let ((rhs-str (format-mode-line +modeline-format-right))) - (list (propertize - " " 'display - `((space :align-to (- (+ right right-fringe right-margin) - ,(1+ (string-width rhs-str)))))) - rhs-str))) - -(setq-default mode-line-format '("" +modeline-bar-start +modeline-format-left +modeline--rest +modeline-bar-end)) - - -;; Set the default modeline as late as possible, giving users a chance to change -;; the above formats. -(add-hook! 'after-init-hook (set-modeline! :main t)) - -;; Set special modelines for special buffers -(add-hook! '+doom-dashboard-mode-hook (set-modeline! :project)) -(add-hook! 'doom-scratch-buffer-hook (set-modeline! :special)) diff --git a/modules/ui/modeline/packages.el b/modules/ui/modeline/packages.el index 9c484100f..5933333f4 100644 --- a/modules/ui/modeline/packages.el +++ b/modules/ui/modeline/packages.el @@ -1,20 +1,7 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/modeline/packages.el -;;; These are the invisible dependencies -;; Required -;;(require 'evil) -;;(require 'projectile) -;;(require 'all-the-icons) - -;; Optional -;;(require 'flycheck) -;;(require 'iedit) -;;(require 'evil-multiedit) - +(package! doom-modeline) (package! anzu) - (when (featurep! :feature evil) (package! evil-anzu)) - -(package! shrink-path) From 8903eebdc484b04aa0f1721c7dfa910c01567583 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 15:16:25 -0500 Subject: [PATCH 3835/4235] Change purpose of autodef cookie argument ;;;###autodef FORM FORM was used as a predicate for inclusion as an autodef. Now it is used as the replacement sexp in case the module is disabled. Oh, you don't know what autdefs are? Well let me explain (thanks for asking, by the way). An autdef'ed function, macro, or function alias is always available to be called, anywhere in Doom, even if its containing module is disabled. For instance: ;;;###autodef (defun say-hello! (name) ; the trailing ! denotes an autodef (message "Hello %s" name)) This makes it safe to call `do-something` without a check whether it exists (or if its module is enabled). When the module is enabled, an autoload entry is added to the Doom autoloads file: (autoload 'do-something "path/to/some/modules/autoloads") And it is autoloaded as normal when it is first used. However, if the module is disabled, then this is inserted instead: (defmacro do-something (&rest _)) This no-ops; it does nothing and doesn't evaluate its arguments. If FORM above was provided, that is used instead of a noop macro. It's a little smarter than simple substitution, but that's the gist of it. --- core/cli/autoloads.el | 69 +++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index 6ab127f2e..fd49c2da8 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -156,7 +156,7 @@ even if it doesn't need reloading!" forms) (while (re-search-forward "^;;;###autodef *\\([^\n]+\\)?\n" nil t) (let* ((sexp (sexp-at-point)) - (pred (match-string 1)) + (alt-sexp (match-string 1)) (type (car sexp)) (name (doom-unquote (cadr sexp))) (origin (cond ((doom-module-from-path path)) @@ -166,37 +166,39 @@ even if it doesn't need reloading!" `(:core . ,(intern (file-name-base path)))))) (doom-file-form `(put ',name 'doom-file ,(abbreviate-file-name path)))) - (cond ((memq type '(defun defmacro cl-defun cl-defmacro)) + (cond ((and (not member-p) alt-sexp) + (push (read alt-sexp) forms)) + + ((memq type '(defun defmacro cl-defun cl-defmacro)) (cl-destructuring-bind (_ name arglist &rest body) sexp (let ((docstring (if (stringp (car body)) (pop body) "No documentation."))) - (push (cond ((not (and member-p - (or (null pred) - (let ((load-file-name path)) - (eval (read pred) t))))) - (push doom-file-form forms) - (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" - origin docstring)) - (condition-case-unless-debug e - (append (list (pcase type - (`defun 'defmacro) - (`cl-defun `cl-defmacro) - (_ type)) - name arglist docstring) - (cl-loop for arg in arglist - if (and (symbolp arg) - (not (keywordp arg)) - (not (memq arg cl--lambda-list-keywords))) - collect arg into syms - else if (listp arg) - collect (car arg) into syms - finally return (if syms `((ignore ,@syms))))) - ('error - (message "Ignoring autodef %s (%s)" - name e) - nil))) - ((make-autoload sexp (abbreviate-file-name (file-name-sans-extension path))))) + (push (if member-p + (make-autoload sexp (abbreviate-file-name (file-name-sans-extension path))) + (push doom-file-form forms) + (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" + origin docstring)) + (condition-case-unless-debug e + (if alt-sexp + (read alt-sexp) + (append (list (pcase type + (`defun 'defmacro) + (`cl-defun `cl-defmacro) + (_ type)) + name arglist docstring) + (cl-loop for arg in arglist + if (and (symbolp arg) + (not (keywordp arg)) + (not (memq arg cl--lambda-list-keywords))) + collect arg into syms + else if (listp arg) + collect (car arg) into syms + finally return (if syms `((ignore ,@syms)))))) + ('error + (message "Ignoring autodef %s (%s)" + name e) + nil))) forms) (push `(put ',name 'doom-module ',origin) forms)))) @@ -204,19 +206,16 @@ even if it doesn't need reloading!" (cl-destructuring-bind (_type name target &optional docstring) sexp (let ((name (doom-unquote name)) (target (doom-unquote target))) - (unless (and member-p - (or (null pred) - (let ((load-file-name path)) - (eval (read pred) t)))) + (unless member-p + (setq docstring (format "THIS FUNCTION DOES NOTHING BECAUSE %s IS DISABLED\n\n%s" + origin docstring)) (setq target #'ignore)) (push doom-file-form forms) (push `(put ',name 'doom-module ',origin) forms) (push `(defalias ',name #',target ,docstring) forms)))) - ((and member-p - (or (null pred) - (eval (read pred) t))) + (member-p (push sexp forms))))) (if forms (concat (string-join (mapcar #'prin1-to-string (reverse forms)) "\n") From fb57f367e7a31f3af4984127bc1c0a485873f52e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 15:32:47 -0500 Subject: [PATCH 3836/4235] Enable delete-selection-mode & shift-select-mode This makes text insertion behave more like traditional editors. Delete-selection-mode allows selections to be replaced when yanking or inserting. This enables it by default for non-evil users and in insert mode for evil users. Also enables selecting text with shift. --- modules/config/default/config.el | 7 +++++++ modules/feature/evil/config.el | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 1fcfe7c4d..7ff96bccd 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -27,6 +27,13 @@ epa-pinentry-mode 'loopback)) +(if (not (featurep 'evil)) + (delete-selection-mode +1) + (defun turn-off-delete-selection-mode () (delete-selection-mode -1)) + (add-hook 'evil-insert-state-entry-hook #'delete-selection-mode) + (add-hook 'evil-insert-state-exit-hook #'turn-off-delete-selection-mode)) + + (when (featurep! +smartparens) ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index b5b3097b7..33a6c8820 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -27,8 +27,6 @@ line with a linewise comment.") evil-respect-visual-line-mode t ;; more vim-like behavior evil-symbol-word-search t - ;; don't activate mark on shift-click - shift-select-mode nil ;; cursor appearance evil-default-cursor '+evil-default-cursor evil-normal-state-cursor 'box From 21e01189b95b956ee12884d74447b80e41f4ee72 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 15:37:42 -0500 Subject: [PATCH 3837/4235] Properly keep cursor out of minibuffer prompt The prompt in the minibuffer is read-only. You are able to move the cursor into it before this fix. This also more effectively silences echo-area output when deleting text in the minibuffer. No more "Text is read-only" blocking what you're typing. --- core/core-ui.el | 26 ++++++++++++++------------ core/core.el | 2 -- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index db69767c1..6b35fea02 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -526,18 +526,20 @@ it to fix all that visual noise." frame))) (add-hook 'after-make-frame-functions #'doom|disable-whitespace-mode-in-childframes) -(defun doom*silence-motion-errors (orig-fn &rest args) - "Prevent disruptive motion errors taking over the minibuffer while we're in -it." - (if (not (minibufferp)) - (apply orig-fn args) - (ignore-errors (apply orig-fn args)) - (when (<= (point) (minibuffer-prompt-end)) - (goto-char (minibuffer-prompt-end))))) -(advice-add #'left-char :around #'doom*silence-motion-errors) -(advice-add #'right-char :around #'doom*silence-motion-errors) -(advice-add #'delete-backward-char :around #'doom*silence-motion-errors) -(advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) +;; Don't allow cursor to enter the prompt +(setq minibuffer-prompt-properties '(read-only t intangible t cursor-intangible t face minibuffer-prompt)) +(add-hook 'minibuffer-setup-hook #'cursor-intangible-mode) + +;; Don't display messages in the minibuffer when using the minibuffer +(defmacro doom-silence-motion-key (command key) + (let ((key-command (intern (format "doom/silent-%s" command)))) + `(progn + (defun ,key-command () + (interactive) + (ignore-errors (call-interactively ',command))) + (define-key minibuffer-local-map (kbd ,key) #',key-command)))) +(doom-silence-motion-key backward-delete-char "") +(doom-silence-motion-key delete-char "") ;; Switch to `doom-fallback-buffer' if on last real buffer (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) diff --git a/core/core.el b/core/core.el index 81a39d93b..e4e860990 100644 --- a/core/core.el +++ b/core/core.el @@ -230,8 +230,6 @@ and `doom-exit-window-hook'." inhibit-default-init t initial-major-mode 'fundamental-mode initial-scratch-message nil - ;; keep the point out of the minibuffer - minibuffer-prompt-properties '(read-only t point-entered minibuffer-avoid-prompt face minibuffer-prompt) ;; History & backup settings (save nothing, that's what git is for) auto-save-default nil create-lockfiles nil From 735ec58b36ed33e531aaa872b5ab7ad826ef36c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 1 Mar 2019 18:28:55 -0500 Subject: [PATCH 3838/4235] ui/doom-dashboard: show command at point in echo-area --- modules/ui/doom-dashboard/autoload.el | 11 +++++++++-- modules/ui/doom-dashboard/config.el | 15 ++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index 63a55b153..898ae8a4f 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -1,5 +1,10 @@ ;;; ui/doom-dashboard/autoload.el -*- lexical-binding: t; -*- +(defun +doom-dashboard--help-echo () + (when-let* ((btn (button-at (point))) + (msg (button-get btn 'help-echo))) + (message "%s" msg))) + ;;;###autoload (defun +doom-dashboard/open (frame) "Switch to the dashboard in the current window, of the current FRAME." @@ -12,10 +17,12 @@ (defun +doom-dashboard/forward-button (n) "Like `forward-button', but don't wrap." (interactive "p") - (forward-button n nil)) + (forward-button n nil) + (+doom-dashboard--help-echo)) ;;;###autoload (defun +doom-dashboard/backward-button (n) "Like `backward-button', but don't wrap." (interactive "p") - (backward-button n nil)) + (backward-button n nil) + (+doom-dashboard--help-echo)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index abfcf4837..d9cdc643b 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -416,16 +416,17 @@ controlled by `+doom-dashboard-pwd-policy'." #',action))) 'face (or face 'font-lock-keyword-face) 'follow-link t - 'help-echo label) + 'help-echo + (format "%s (%s)" label + (propertize (symbol-name action) 'face 'font-lock-constant-face))) (format "%-37s" (buffer-string))) ;; Lookup command keys dynamically (or (when-let* ((key (where-is-internal action nil t))) - (propertize (with-temp-buffer - (save-excursion (insert (key-description key))) - (while (re-search-forward "<\\([^>]+\\)>" nil t) - (replace-match (upcase (substring (match-string 1) 0 3)))) - (buffer-string)) - 'face 'font-lock-constant-face)) + (with-temp-buffer + (save-excursion (insert (key-description key))) + (while (re-search-forward "<\\([^>]+\\)>" nil t) + (replace-match (upcase (substring (match-string 1) 0 3)))) + (propertize (buffer-string) 'face 'font-lock-constant-face))) "")))) (if (display-graphic-p) "\n\n" From 8a90f29c91294a4e13b2653b1e651d36b64afc8c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:04:41 -0500 Subject: [PATCH 3839/4235] Make session persistence module agnostic They've been removed from feature/workspaces and moved into core/autoload/sessions, which falls back to desktop.el if persp-mode isn't present. This also offers a substantial speed up to restart+restoring and restoring sessions in general. Also fixes #1210, where the newly spawned frame after doom/restart wasn't focused. Introduces the following commands: - doom/restart - doom/restart-and-restore - doom/quickload-session - doom/quicksave-session - doom/load-session - doom/save-session - +workspace/restore-last-session (alias for doom/quickload-session) And removes - +workspace/load-session - +workspace/save-session - +workspace/load-last-session (renamed to +workspace/restore-last-session) - +workspace/restart-emacs-then-restore (replaced by doom/restart-and-restore) - :ss (ex command) - :sl (ex command) --- core/autoload/sessions.el | 121 ++++++++++++++++++ core/cli/autoloads.el | 5 +- core/core.el | 3 + modules/config/default/+emacs-bindings.el | 14 +- modules/config/default/+evil-bindings.el | 15 ++- modules/feature/workspaces/README.org | 4 +- modules/feature/workspaces/autoload/evil.el | 14 -- .../feature/workspaces/autoload/workspaces.el | 69 +--------- modules/feature/workspaces/config.el | 65 ++++------ modules/ui/doom-dashboard/config.el | 14 +- 10 files changed, 181 insertions(+), 143 deletions(-) create mode 100644 core/autoload/sessions.el diff --git a/core/autoload/sessions.el b/core/autoload/sessions.el new file mode 100644 index 000000000..af9a8dc24 --- /dev/null +++ b/core/autoload/sessions.el @@ -0,0 +1,121 @@ +;;; core/autoload/sessions.el -*- lexical-binding: t; -*- + +;; +;;; Helpers + +;;;###autoload +(defun doom-save-session (&optional file) + "TODO" + (setq file (expand-file-name (or file (doom-session-file)))) + (cond ((require 'persp-mode nil t) + (unless persp-mode (persp-mode +1)) + (setq persp-auto-save-opt 0) + (persp-save-state-to-file file)) + ((and (require 'frameset nil t) + (require 'restart-emacs nil t)) + (let ((frameset-filter-alist (append '((client . restart-emacs--record-tty-file)) + frameset-filter-alist)) + (desktop-base-file-name (file-name-nondirectory file)) + (desktop-dirname (file-name-directory file)) + (desktop-restore-eager t) + desktop-file-modtime) + (make-directory desktop-dirname t) + (desktop-save desktop-dirname t))) + ((error "No session backend to save session with")))) + +;;;###autoload +(defun doom-load-session (&optional file) + "TODO" + (setq file (expand-file-name (or file (doom-session-file)))) + (message "Attempting to load %s" file) + (cond ((require 'persp-mode nil t) + (unless persp-mode (persp-mode +1)) + (persp-load-state-from-file file)) + ((and (require 'frameset nil t) + (require 'restart-emacs nil t)) + (restart-emacs--restore-frames-using-desktop file)) + ((error "No session backend to load session with"))) + (select-frame-set-input-focus (selected-frame))) + +;;;###autoload +(defun doom-session-file () + "TODO" + (cond ((require 'persp-mode nil t) + (expand-file-name persp-auto-save-fname persp-save-dir)) + ((require 'desktop nil t) + (desktop-full-file-name)) + ((error "No session backend available")))) + + +;; +;;; Command line switch + +;;;###autoload +(defun doom-restore-session-handler (&rest _) + "TODO" + (doom-load-session)) + +;;;###autoload +(add-to-list 'command-switch-alist (cons "--restore" #'doom-restore-session-handler)) + + +;; +;;; Commands + +;;;###autoload +(defun doom/quickload-session () + "TODO" + (interactive) + (message "Restoring session...") + (doom-load-session) + (message "Session restored. Welcome back.")) + +;;;###autoload +(defun doom/quicksave-session () + "TODO" + (interactive) + (message "Saving session") + (doom-save-session) + (message "Saving session...DONE")) + +;;;###autoload +(defun doom/load-session (file) + "TODO" + (interactive + (let ((session-file (doom-session-file))) + (list (or (read-file-name "Session to restore: " + (file-name-directory session-file) + nil t + (file-name-nondirectory session-file)) + (user-error "No session selected. Aborting"))))) + (unless file + (error "No session file selected")) + (message "Loading '%s' session" file) + (doom-load-session file)) + +;;;###autoload +(defun doom/save-session (file) + "TODO" + (interactive + (let ((session-file (doom-session-file))) + (list (or (read-file-name "Save session to: " + (file-name-directory session-file) + nil nil + (file-name-nondirectory session-file)) + (user-error "No session selected. Aborting"))))) + (unless file + (error "No session file selected")) + (message "Saving '%s' session" file) + (doom-save-session file)) + +;;;###autoload +(defalias 'doom/restart #'restart-emacs) + +;;;###autoload +(defun doom/restart-and-restore (&optional debug) + "TODO" + (interactive "P") + (doom/quicksave-session) + (let (confirm-kill-emacs) + (restart-emacs + (delq nil (list (if debug "--debug-init") "--restore"))))) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index fd49c2da8..9b1c0d9b3 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -37,9 +37,8 @@ it exists." (print! (bold (green "\nFinished!"))) (message "If you have a running Emacs Session, you will need to restart it or") (message "reload Doom for changes to take effect:\n") - (when (fboundp '+workspace/restart-emacs-then-restore) - (message " M-x +workspace/restart-emacs-then-restore")) - (message " M-x restart-emacs") + (message " M-x doom/restart-and-restore") + (message " M-x doom/restart") (message " M-x doom/reload")) (defun doom--do-load (&rest files) diff --git a/core/core.el b/core/core.el index e4e860990..1b5344a7b 100644 --- a/core/core.el +++ b/core/core.el @@ -253,6 +253,9 @@ and `doom-exit-window-hook'." async-byte-compile-log-file (concat doom-etc-dir "async-bytecomp.log") auto-save-list-file-name (concat doom-cache-dir "autosave") backup-directory-alist (list (cons "." (concat doom-cache-dir "backup/"))) + desktop-dirname (concat doom-etc-dir "desktop") + desktop-base-file-name "autosave" + desktop-base-lock-name "autosave-lock" pcache-directory (concat doom-cache-dir "pcache/") request-storage-directory (concat doom-cache-dir "request") server-auth-dir (concat doom-cache-dir "server/") diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 221e634b0..198104fa8 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -91,9 +91,9 @@ :desc "Quit Emacs" "q" #'kill-emacs :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal (:when (featurep! :feature workspaces) - :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit - :desc "Restart & restore Emacs" "r" #'+workspace/restart-emacs-then-restore) - :desc "Restart Emacs" "R" #'restart-emacs) + :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit) + :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore + :desc "Restart Emacs" "R" #'doom/restart) ;; Snippets "&" nil ; yasnippet creates this prefix, we use a different one (:prefix ("s" . "snippets") @@ -123,15 +123,15 @@ :desc "Previous hunk" "[" #'git-gutter:previous-hunk) ;; Worspace and window management bindings (:prefix ("w". "workspaces") - :desc "Autosave session" "a" #'+workspace/save-session + :desc "Autosave session" "a" #'doom/quicksave-session :desc "Display workspaces" "d" #'+workspace/display :desc "Rename workspace" "r" #'+workspace/rename :desc "Create workspace" "c" #'+workspace/new :desc "Delete workspace" "k" #'+workspace/delete - :desc "Save session" "s" (λ! (let ((current-prefix-arg '(4))) (call-interactively #'+workspace/save-session))) + :desc "Save session" "s" #'doom/save-session :desc "Save workspace" "S" #'+workspace/save - :desc "Load session" "l" #'+workspace/load-session - :desc "Load last autosaved session" "L" #'+workspace/load-last-session + :desc "Load session" "l" #'doom/load-session + :desc "Load last autosaved session" "L" #'doom/quickload-session :desc "Kill other buffers" "o" #'doom/kill-other-buffers :desc "Undo window config" "u" #'winner-undo :desc "Redo window config" "U" #'winner-redo diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 3b75ca111..560faeb10 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -544,14 +544,12 @@ :desc "Display tab bar" "TAB" #'+workspace/display :desc "New workspace" "n" #'+workspace/new :desc "Load workspace from file" "l" #'+workspace/load - :desc "Load a past session" "L" #'+workspace/load-session :desc "Save workspace to file" "s" #'+workspace/save - :desc "Autosave current session" "S" #'+workspace/save-session :desc "Switch workspace" "." #'+workspace/switch-to :desc "Delete session" "x" #'+workspace/kill-session :desc "Delete this workspace" "d" #'+workspace/delete :desc "Rename workspace" "r" #'+workspace/rename - :desc "Restore last session" "R" #'+workspace/load-last-session + :desc "Restore last session" "R" #'+workspace/restore-last-session :desc "Next workspace" "]" #'+workspace/switch-right :desc "Previous workspace" "[" #'+workspace/switch-left :desc "Switch to 1st workspace" "1" (λ! (+workspace/switch-to 0)) @@ -757,12 +755,15 @@ :desc "List project tasks" "t" #'+default/project-tasks :desc "Invalidate cache" "x" #'projectile-invalidate-cache) - (:prefix ("q" . "quit/restart") + (:prefix ("q" . "session") :desc "Quit Emacs" "q" #'evil-quit-all :desc "Save and quit Emacs" "Q" #'evil-save-and-quit - :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit - :desc "Restart & restore Emacs" "r" #'+workspace/restart-emacs-then-restore - :desc "Restart Emacs" "R" #'restart-emacs) + :desc "Quick save current session" "s" #'doom/quicksave-session + :desc "Restore last session" "l" #'doom/quickload-session + :desc "Save session to file" "S" #'doom/save-session + :desc "Restore session from file" "L" #'doom/load-session + :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore + :desc "Restart Emacs" "R" #'doom/restart) (:when (featurep! :tools upload) (:prefix ("r" . "remote") diff --git a/modules/feature/workspaces/README.org b/modules/feature/workspaces/README.org index 29f8dec1a..877280479 100644 --- a/modules/feature/workspaces/README.org +++ b/modules/feature/workspaces/README.org @@ -61,9 +61,9 @@ in [[../../private/default/+evil-commands.el][private/default/+evil-commands.el] | ~+workspace/new~ | =SPC TAB n= | Create a new, blank workspace | | ~+workspace/display~ | =SPC TAB TAB= | Display open workspaces in the mode-line | | ~+workspace/load~ | =SPC TAB l= | Load a saved workspace into the current session | -| ~+workspace/load-session~ | =SPC TAB L= / =:sl[oad]= | Replace current session with a saved one | +| ~doom/quicksave-load~ | =SPC TAB L= / =:sl[oad]= | Replace current session with a saved one | | ~+workspace/save~ | =SPC TAB s= | Save the current workspace to a file | -| ~+workspace/save-session~ | =SPC TAB S= / =:ss[ave]= | Save current session | +| ~doom/quicksave-save~ | =SPC TAB S= / =:ss[ave]= | Save current session | | ~+workspace/switch-to~ | =SPC TAB .= | Switch to an open workspace | | ~+workspace/switch-left~ | =SPC TAB [= / =[ w= / =gT= | Switch to previous workspace | | ~+workspace/switch-right~ | =SPC TAB [= / =] w= / =gt= | Switch to next workspace | diff --git a/modules/feature/workspaces/autoload/evil.el b/modules/feature/workspaces/autoload/evil.el index 16f75c4e6..a18d06f74 100644 --- a/modules/feature/workspaces/autoload/evil.el +++ b/modules/feature/workspaces/autoload/evil.el @@ -1,20 +1,6 @@ ;;; feature/workspaces/autoload/evil.el -*- lexical-binding: t; -*- ;;;###if (featurep! :feature evil) -;;;###autoload (autoload '+workspace:save-session "feature/workspaces/autoload/evil" nil t) -(evil-define-command +workspace:save-session (&optional bang name) - "Ex wrapper around `+workspace/save-session'. If BANG, then autosave -(pointless if autosaving/loading is off). If NAME is nil, default to 'last'." - (interactive "") - (+workspace/save-session (if bang persp-auto-save-fname name))) - -;;;###autoload (autoload '+workspace:load-session "feature/workspaces/autoload/evil" nil t) -(evil-define-command +workspace:load-session (&optional bang name) - "Ex wrapper around `+workspace/load-session'. If BANG, then load last autosave -(pointless if autosaving/loading is off). If NAME is nil, defaults to 'last'." - (interactive "") - (+workspace/load-session (if bang persp-auto-save-fname name))) - ;;;###autoload (autoload '+workspace:save "feature/workspaces/autoload/evil" nil t) (evil-define-command +workspace:save (&optional name) "Ex wrapper around `+workspace/save-session'." diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index ebd1ffc0c..aa1f62e6f 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -112,14 +112,6 @@ Returns t if successful, nil otherwise." *persp-hash* (list name)) (+workspace-exists-p name)) -;;;###autoload -(defun +workspace-load-session (&optional name) - "Replace current session with the entire session named NAME. If NAME is nil, -use `persp-auto-save-fname'." - (mapc #'+workspace-delete (+workspace-list-names)) - (persp-load-state-from-file - (expand-file-name (or name persp-auto-save-fname) persp-save-dir))) - ;;;###autoload (defun +workspace-save (name) "Saves a single workspace (NAME) from the current session. Can be loaded again @@ -134,18 +126,6 @@ Returns t on success, nil otherwise." (and (member name (persp-list-persp-names-in-file fname)) t))) -;;;###autoload -(defun +workspace-save-session (&optional name) - "Save a whole session as NAME. If NAME is nil, use `persp-auto-save-fname'. -Return t on success, nil otherwise." - (let ((fname (expand-file-name (or name persp-auto-save-fname) - persp-save-dir))) - ;; disable auto-saving on kill-emacs if autosaving (i.e. name is nil) - (when (or (not name) - (string= name persp-auto-save-fname)) - (setq persp-auto-save-opt 0)) - (and (persp-save-state-to-file fname) t))) - ;;;###autoload (defun +workspace-new (name) "Create a new workspace named NAME. If one already exists, return nil. @@ -206,6 +186,9 @@ throws an error." ;; ;; Commands +;;;###autoload +(defalias '+workspace/restore-last-session #'doom/quickload-session) + ;;;###autoload (defun +workspace/load (name) "Load a workspace and switch to it. If called with C-u, try to reload the @@ -236,46 +219,6 @@ workspace." (+workspace-message (format "'%s' workspace saved" name) 'success) (+workspace-error (format "Couldn't save workspace %s" name)))) -;;;###autoload -(defun +workspace/load-session (&optional name) - "Load a session and switch to it. If called with C-u, try to load the last -session." - (interactive - (list - (unless current-prefix-arg - (completing-read - "Session to load: " - (directory-files persp-save-dir nil "^[^_.]") - nil t)))) - (condition-case ex - (let ((name (or name persp-auto-save-fname))) - (+workspace-load-session name) - (+workspace-message (format "'%s' workspace loaded" name) 'success)) - '(error (+workspace-error (cadr ex) t)))) - -;;;###autoload -(defun +workspace/load-last-session () - "Restore last session and switch to it." - (interactive) - (+workspace/load-session)) - -;;;###autoload -(defun +workspace/save-session (&optional name) - "Save the current session. If called with C-u, prompt you for the name to save -the session as." - (interactive - (list - (when current-prefix-arg - (completing-read - "Save session as: " - (directory-files persp-save-dir nil "^[^_.]"))))) - (condition-case-unless-debug ex - (let ((name (or name persp-auto-save-fname))) - (if (+workspace-save-session name) - (+workspace-message (format "Saved session as '%s'" name) 'success) - (error "Couldn't save session as '%s'" name))) - ('error (+workspace-error ex t)))) - ;;;###autoload (defun +workspace/rename (new-name) "Rename the current workspace." @@ -437,12 +380,6 @@ the next." (t (+workspace-error "Can't delete last workspace" t))))))) -;;;###autoload -(defun +workspace/restart-emacs-then-restore () - "Restarts Emacs, then restores the session." - (interactive) - (restart-emacs (list "--restore"))) - ;; ;; Tabs display in minibuffer diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index ff26bb85b..7bc243468 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -5,11 +5,6 @@ ;; it because it was unstable and slow; `persp-mode' is neither (and still ;; maintained). ;; -;; By default, sessions are autosaved, but not autoloaded. Use :ss or -;; `+workspace/save-session' to save, and :sl or `+workspace/load-session' to -;; load the last autosaved session. You can give sessions a custom name so they -;; can be loaded later. -;; ;; NOTE persp-mode requires `workgroups' for file persistence in Emacs 24.4. (defvar +workspaces-main "main" @@ -20,11 +15,6 @@ `counsel-projectile-switch-project'. This function must take one argument: the new project directory.") -;; FIXME actually use this for wconf bookmark system -(defvar +workspaces-data-file "_workspaces" - "The basename of the file to store single workspace perspectives. Will be -stored in `persp-save-dir'.") - (defvar +workspaces-on-switch-project-behavior 'non-empty "Controls the behavior of workspaces when switching to a new project. @@ -35,11 +25,10 @@ t Always create a new workspace for the project associated with it. nil Never create a new workspace on project switch.") -;; If emacs is passed --restore, restore the last session on startup. This is -;; used by the `+workspace/restart-emacs-then-restore' command. -(defun +workspaces-restore-last-session (&rest _) - (add-hook 'emacs-startup-hook #'+workspace/load-session :append)) -(add-to-list 'command-switch-alist (cons "--restore" #'+workspaces-restore-last-session)) +;; FIXME actually use this for wconf bookmark system +(defvar +workspaces-data-file "_workspaces" + "The basename of the file to store single workspace perspectives. Will be +stored in `persp-save-dir'.") ;; @@ -64,29 +53,29 @@ workspace. Also ensures that the *Warnings* buffer will be visible in main. Uses `+workspaces-main' to determine the name of the main workspace." (unless persp-mode - (persp-mode +1)) - (unless noninteractive - (let (persp-before-switch-functions persp-activated-functions) - (with-selected-frame frame - ;; The default perspective persp-mode creates (`persp-nil-name') is - ;; special and doesn't represent a real persp object, so buffers can't - ;; really be assigned to it, among other quirks. We create a *real* - ;; main workspace to fill this role. - (unless (persp-get-by-name +workspaces-main) - (persp-add-new +workspaces-main)) - ;; Switch to it if we aren't auto-loading the last session - (when (and (string= (safe-persp-name (get-current-persp)) persp-nil-name) - (= persp-auto-resume-time -1)) - (persp-frame-switch +workspaces-main frame) - ;; We want to know where we are in every new daemon frame - (when (daemonp) - (run-at-time 0.1 nil #'+workspace/display)) - ;; Fix #319: the warnings buffer gets swallowed by creating - ;; `+workspaces-main', so we display it manually, if it exists. - (when-let* ((warnings (get-buffer "*Warnings*"))) - (save-excursion - (display-buffer-in-side-window - warnings '((window-height . shrink-window-if-larger-than-buffer)))))))))) + (persp-mode +1) + (unless noninteractive + (let (persp-before-switch-functions persp-activated-functions) + (with-selected-frame frame + ;; The default perspective persp-mode creates (`persp-nil-name') is + ;; special and doesn't represent a real persp object, so buffers can't + ;; really be assigned to it, among other quirks. We create a *real* + ;; main workspace to fill this role. + (unless (persp-get-by-name +workspaces-main) + (persp-add-new +workspaces-main)) + ;; Switch to it if we aren't auto-loading the last session + (when (and (string= (safe-persp-name (get-current-persp)) persp-nil-name) + (= persp-auto-resume-time -1)) + (persp-frame-switch +workspaces-main frame) + ;; We want to know where we are in every new daemon frame + (when (daemonp) + (run-at-time 0.1 nil #'+workspace/display)) + ;; Fix #319: the warnings buffer gets swallowed by creating + ;; `+workspaces-main', so we display it manually, if it exists. + (when-let* ((warnings (get-buffer "*Warnings*"))) + (save-excursion + (display-buffer-in-side-window + warnings '((window-height . shrink-window-if-larger-than-buffer))))))))))) (add-hook 'doom-post-init-hook #'+workspaces|init t) :config diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index d9cdc643b..e684795b4 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -44,11 +44,12 @@ Possible values: (defvar +doom-dashboard-menu-sections '(("Reload last session" :icon (all-the-icons-octicon "history" :face 'font-lock-keyword-face) - :when (and (bound-and-true-p persp-mode) - (file-exists-p (expand-file-name persp-auto-save-fname - persp-save-dir))) + :when (cond ((require 'persp-mode nil t) + (file-exists-p (expand-file-name persp-auto-save-fname persp-save-dir))) + ((require 'desktop nil t) + (file-exists-p (desktop-full-file-name)))) :face (:inherit (font-lock-keyword-face bold)) - :action +workspace/load-last-session) + :action doom/quickload-session) ("Open org-agenda" :icon (all-the-icons-octicon "calendar" :face 'font-lock-keyword-face) :when (fboundp 'org-agenda) @@ -107,8 +108,9 @@ PLIST can have the following properties: initial-buffer-choice (when (or (daemonp) (not (cl-loop for arg in (cdr command-line-args) - if (and (string-match-p "^[^-]" arg) - (file-exists-p arg)) + if (or (equal arg "--restore") + (and (string-match-p "^[^-]" arg) + (file-exists-p arg))) return t))) #'+doom-dashboard-initial-buffer)) From 687496167a7b5d56bac2d7aaaa43cf945a69c3d3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:08:56 -0500 Subject: [PATCH 3840/4235] Fix void-function projectile-relevant-known-projects Thrown when using doom/find-file-in-other-project and doom/browse-in-other-project too soon. --- core/autoload/projects.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 9d5e76848..157bd17b7 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -1,5 +1,9 @@ ;;; core/autoload/projects.el -*- lexical-binding: t; -*- +;;;###autoload +(autoload 'projectile-relevant-known-projects "projectile") + + ;; ;; Macros From d46bb287ae8e7bdf446f7baba8c9db15d23310b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:12:48 -0500 Subject: [PATCH 3841/4235] General refactor of Doom core - Code reduction and refactor across the board (cull unneeded minor advise, hooks and hacks or update them) - Revise outdated comments and docstrings - Reorganize core autoload libraries - Remove large file check (Emacs already has a built-in one, which we augment to be even more performant when it does kick in) - helpful.el can now be disabled completely through package! --- core/autoload/cli.el | 21 -- core/autoload/config.el | 36 +++ core/autoload/{editor.el => text.el} | 26 +- core/autoload/ui.el | 24 ++ core/core-editor.el | 39 +-- core/core-projects.el | 8 +- core/core-ui.el | 341 +++++++++++++-------- core/core.el | 81 +---- modules/config/default/+evil-bindings.el | 4 +- modules/config/default/autoload/default.el | 12 - modules/ui/doom-dashboard/config.el | 2 +- 11 files changed, 296 insertions(+), 298 deletions(-) create mode 100644 core/autoload/config.el rename core/autoload/{editor.el => text.el} (86%) diff --git a/core/autoload/cli.el b/core/autoload/cli.el index 5ab0f66d0..5f2c371f5 100644 --- a/core/autoload/cli.el +++ b/core/autoload/cli.el @@ -43,24 +43,3 @@ "TODO" (interactive "P") (doom--run "refresh" yes)) - -;;;###autoload -(defun doom/reload (&optional force-p) - "Reloads your config. This is experimental! - -If called from a noninteractive session, this will try to communicate with a -live server (if one is found) to tell it to run this function. - -If called from an interactive session, tries to reload autoloads files (if -necessary), reinistalize doom (via `doom-initialize') and reloads your private -init.el and config.el. Then runs `doom-reload-hook'." - (interactive "P") - (require 'core-cli) - (doom-reload-autoloads force-p) - (setq load-path doom-site-load-path) - (let (doom-init-p) - (doom-initialize)) - (with-demoted-errors "PRIVATE CONFIG ERROR: %s" - (doom-initialize-modules 'force)) - (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) - (message "Finished!")) diff --git a/core/autoload/config.el b/core/autoload/config.el new file mode 100644 index 000000000..7d3a16604 --- /dev/null +++ b/core/autoload/config.el @@ -0,0 +1,36 @@ +;;; core/autoload/config.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun doom/open-private-config () + "TODO" + (interactive) + (unless (file-directory-p doom-private-dir) + (make-directory doom-private-dir t)) + (doom-project-browse doom-private-dir)) + +;;;###autoload +(defun doom/find-file-in-private-config () + "TODO" + (interactive) + (doom-project-find-file doom-private-dir)) + +;;;###autoload +(defun doom/reload (&optional force-p) + "Reloads your config. This is experimental! + +If called from a noninteractive session, this will try to communicate with a +live server (if one is found) to tell it to run this function. + +If called from an interactive session, tries to reload autoloads files (if +necessary), reinistalize doom (via `doom-initialize') and reloads your private +init.el and config.el. Then runs `doom-reload-hook'." + (interactive "P") + (require 'core-cli) + (doom-reload-autoloads force-p) + (setq load-path doom-site-load-path) + (let (doom-init-p) + (doom-initialize)) + (with-demoted-errors "PRIVATE CONFIG ERROR: %s" + (doom-initialize-modules 'force)) + (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) + (message "Finished!")) diff --git a/core/autoload/editor.el b/core/autoload/text.el similarity index 86% rename from core/autoload/editor.el rename to core/autoload/text.el index 527c28384..51486d559 100644 --- a/core/autoload/editor.el +++ b/core/autoload/text.el @@ -1,4 +1,4 @@ -;;; core/autoload/editor.el -*- lexical-binding: t; -*- +;;; core/autoload/text.el -*- lexical-binding: t; -*- ;;;###autoload (defun doom-surrounded-p (pair &optional inline balanced) @@ -132,30 +132,6 @@ opposite indentation style." (tabify beg end) (untabify beg end)))) -(defvar-local doom--buffer-narrowed-origin nil) -;;;###autoload -(defun doom/clone-and-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 "rP") - (cond ((or (region-active-p) - (and beg end)) - (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/delete-trailing-newlines () "Trim trailing newlines. diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 28ac10180..f163e8019 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -163,6 +163,30 @@ OPACITY is an integer between 0 to 100, inclusive." 100)))) (set-frame-parameter nil 'alpha opacity)) +(defvar-local doom--buffer-narrowed-origin nil) +;;;###autoload +(defun doom/clone-and-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 "rP") + (cond ((or (region-active-p) + (and beg end)) + (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)))) + ;; ;; Modes diff --git a/core/core-editor.el b/core/core-editor.el index 189ca880b..740281c20 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -21,7 +21,7 @@ successfully sets indent_style/indent_size.") detected.") (setq-default - large-file-warning-threshold 30000000 + large-file-warning-threshold 15000000 vc-follow-symlinks t ;; Save clipboard contents into kill-ring before replacing them save-interprogram-paste-before-kill t @@ -52,23 +52,14 @@ detected.") ;; Remove hscroll-margin in shells, otherwise it causes jumpiness (setq-hook! '(eshell-mode-hook term-mode-hook) hscroll-margin 0) -(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 -fundamental-mode) for performance sake." - (when (and (not (memq major-mode doom-large-file-modes-list)) - auto-mode-alist - (get-buffer-window)) - (when-let* ((size (nth 7 (file-attributes buffer-file-name)))) - (when (and (> size (* 1024 1024 doom-large-file-size)) - (y-or-n-p - (format (concat "%s is a large file, open literally to " - "avoid performance issues?") - (file-relative-name buffer-file-name)))) - (setq buffer-read-only t) - (buffer-disable-undo) - (fundamental-mode))))) -(add-hook 'find-file-hook #'doom|check-large-file) +(defun doom*optimize-literal-mode-for-large-files (buffer) + "TODO" + (with-current-buffer buffer + (when find-file-literally + (setq buffer-read-only t) + (buffer-disable-undo)) + buffer)) +(advice-add #'find-file-noselect-1 :filter-return #'doom*optimize-literal-mode-for-large-files) ;; @@ -290,11 +281,13 @@ savehist file." ;; `helpful' --- a better *help* buffer -(let ((map (current-global-map))) - (define-key map [remap describe-function] #'helpful-callable) - (define-key map [remap describe-command] #'helpful-command) - (define-key map [remap describe-variable] #'helpful-variable) - (define-key map [remap describe-key] #'helpful-key)) +(def-package! helpful + :defer t + :init + (global-set-key [remap describe-function] #'helpful-callable) + (global-set-key [remap describe-command] #'helpful-command) + (global-set-key [remap describe-variable] #'helpful-variable) + (global-set-key [remap describe-key] #'helpful-key)) (def-package! ws-butler diff --git a/core/core-projects.el b/core/core-projects.el index 3e2059379..ab2303507 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,7 +1,7 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile - :after-call (pre-command-hook after-find-file dired-before-readin-hook) + :after-call (after-find-file dired-before-readin-hook) :commands (projectile-project-root projectile-project-name projectile-project-p) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") @@ -94,9 +94,9 @@ state are passed in.") on-exit) "Define a project minor-mode named NAME (a symbol) and declare where and how it is activated. Project modes allow you to configure 'sub-modes' for -major-modes that are specific to a specific folder, certain project structure, -framework or arbitrary context you define. These project modes can have their -own settings, keymaps, hooks, snippets, etc. +major-modes that are specific to a folder, project structure, framework or +whatever arbitrary context you define. These project modes can have their own +settings, keymaps, hooks, snippets, etc. This creates NAME-hook and NAME-map as well. diff --git a/core/core-ui.el b/core/core-ui.el index 6b35fea02..1c8924ab2 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -1,9 +1,12 @@ ;;; core-ui.el -*- lexical-binding: t; -*- +;; +;;; Variables + (defvar doom-theme nil "A symbol representing the Emacs theme to load at startup. -This is changed when `load-theme' is used as well.") +This is changed by `load-theme'.") (defvar doom-font nil "The default font to use. @@ -50,9 +53,122 @@ size.") ;; +;;; Custom hooks + (defvar doom-init-ui-hook nil "List of hooks to run when the UI has been initialized.") +(defvar doom-load-theme-hook nil + "Hook run after the theme is loaded with `load-theme' or reloaded with +`doom/reload-theme'.") + +(defvar doom-exit-window-hook nil + "Hook run before `switch-window' or `switch-frame' are called. + +Also see `doom-enter-window-hook'.") + +(defvar doom-enter-window-hook nil + "Hook run after `switch-window' or `switch-frame' are called. + +Also see `doom-exit-window-hook'.") + +(defvar doom-exit-buffer-hook nil + "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-enter-buffer-hook'.") + +(defvar doom-enter-buffer-hook nil + "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are +called. The buffer to be switched to is current when these hooks run. + +Also see `doom-exit-buffer-hook'.") + +(defvar doom-inhibit-switch-buffer-hooks nil + "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'. +Do not set this directly.") +(defvar doom-inhibit-switch-window-hooks nil + "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'. +Do not set this directly.") + +(defun doom*switch-window-hooks (orig-fn window &optional norecord) + (if (or doom-inhibit-switch-window-hooks + (null window) + (eq window (selected-window)) + (window-minibuffer-p) + (window-minibuffer-p window)) + (funcall orig-fn window norecord) + (let ((doom-inhibit-switch-window-hooks t)) + (run-hooks 'doom-exit-window-hook) + (prog1 (funcall orig-fn window norecord) + (with-selected-window window + (run-hooks 'doom-enter-window-hook)))))) + +(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) + (if (or doom-inhibit-switch-buffer-hooks + (eq (get-buffer buffer-or-name) (current-buffer))) + (apply orig-fn buffer-or-name args) + (let ((doom-inhibit-switch-buffer-hooks t)) + (run-hooks 'doom-exit-buffer-hook) + (prog1 (apply orig-fn buffer-or-name args) + (when (buffer-live-p (get-buffer buffer-or-name)) + (with-current-buffer buffer-or-name + (run-hooks 'doom-enter-buffer-hook))))))) + +(defun doom|init-switch-hooks (&optional disable) + "Set up enter/exit hooks for windows and buffers. + +See `doom-enter-buffer-hook', `doom-enter-window-hook', `doom-exit-buffer-hook' +and `doom-exit-window-hook'." + (dolist (spec '((select-window . doom*switch-window-hooks) + (switch-to-buffer . doom*switch-buffer-hooks) + (display-buffer . doom*switch-buffer-hooks) + (pop-to-buffer . doom*switch-buffer-hooks))) + (if disable + (advice-remove (car spec) (cdr spec)) + (advice-add (car spec) :around (cdr spec))))) + +(defun doom*load-theme-hooks (theme &rest _) + "Set up `doom-load-theme-hook' to run after `load-theme' is called." + (setq doom-theme theme) + (run-hooks 'doom-load-theme-hook)) + +(defun doom|protect-visible-buffer () + "Don't kill the current buffer if it is visible in another window (bury it +instead). Meant for `kill-buffer-query-functions'." + (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) + (not (member (substring (buffer-name) 0 1) '(" " "*")))))) + +(defun doom|protect-fallback-buffer () + "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." + (not (eq (current-buffer) (doom-fallback-buffer)))) + +(defun doom|highlight-non-default-indentation () + "Highlight whitespace that doesn't match your `indent-tabs-mode' setting. + +e.g. If you indent with spaces by default, tabs will be highlighted. If you +indent with tabs, spaces at BOL are highlighted. + +Does nothing if `whitespace-mode' is already active or the current buffer is +read-only or not file-visiting." + (unless (or (bound-and-true-p global-whitespace-mode) + (bound-and-true-p whitespace-mode) + (eq major-mode 'fundamental-mode) + buffer-read-only + (null buffer-file-name)) + (require 'whitespace) + (set (make-local-variable 'whitespace-style) + (if (bound-and-true-p whitespace-newline-mode) + (cl-union (if indent-tabs-mode '(indentation) '(tabs tab-mark)) + whitespace-style) + `(face ,@(if indent-tabs-mode '(indentation) '(tabs tab-mark)) + trailing-lines tail))) + (whitespace-mode +1))) + + +;; +;;; General configuration + (defvar doom--prefer-theme-elc nil "If non-nil, `load-theme' will prefer the compiled theme (unlike its default behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") @@ -71,6 +187,7 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") display-line-numbers-width 3 enable-recursive-minibuffers nil frame-inhibit-implied-resize t + frame-title-format '("%b – Doom Emacs") ; simple name in frame title ;; remove continuation arrow on right fringe fringe-indicator-alist (delq (assq 'continuation fringe-indicator-alist) @@ -99,68 +216,41 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") ;; don't resize emacs in steps, it looks weird window-resize-pixelwise t frame-resize-pixelwise t) - ;; y/n instead of yes/no (fset #'yes-or-no-p #'y-or-n-p) - ;; Truly silence startup message (fset #'display-startup-echo-area-message #'ignore) +;; relegate tooltips to echo area only +(if (bound-and-true-p tooltip-mode) (tooltip-mode -1)) +;; enabled by default; no thanks, too distracting +(blink-cursor-mode -1) +;; Handle ansi codes in compilation buffer +(add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) +;; show typed keystrokes in minibuffer +(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) +(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) +(doom|enable-ui-keystrokes) +;; ...but hide them while isearch is active +(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) +(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) +;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. +(add-to-list 'default-frame-alist '(buffer-predicate . doom-buffer-frame-predicate)) +;; Prevent the glimpse of un-styled Emacs by setting these early. +(add-to-list 'default-frame-alist '(tool-bar-lines . 0)) +(add-to-list 'default-frame-alist '(menu-bar-lines . 0)) +(add-to-list 'default-frame-alist '(vertical-scroll-bars)) +;; prompts the user for confirmation when deleting a non-empty frame +(global-set-key [remap delete-frame] #'doom/delete-frame) ;; -;; Third party packages +;;; Built-in packages -;; `avy' -(setq avy-all-windows nil - avy-background t) +;; Disable these because whitespace should be customized programmatically +;; (through `whitespace-style'), and not through these commands. +(put 'whitespace-toggle-options 'disabled t) +(put 'global-whitespace-toggle-options 'disabled t) -;; `all-the-icons' -(def-package! all-the-icons - :commands (all-the-icons-octicon all-the-icons-faicon all-the-icons-fileicon - all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) - :init - (defun doom*disable-all-the-icons-in-tty (orig-fn &rest args) - (if (display-graphic-p) - (apply orig-fn args) - "")) - :config - ;; all-the-icons doesn't work in the terminal, so we "disable" it. - (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))) - -;; `hide-mode-line-mode' -(add-hook 'completion-list-mode-hook #'hide-mode-line-mode) -(add-hook 'Man-mode-hook #'hide-mode-line-mode) - -;; `highlight-numbers' --- better number literal fontification in code -(def-package! highlight-numbers - :hook ((prog-mode conf-mode) . highlight-numbers-mode) - :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) - -;; `highlight-escape-sequences' -(def-package! highlight-escape-sequences - :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) - -;; `rainbow-delimiters' --- helps us distinguish stacked delimiter pairs. -;; Especially in parentheses-drunk languages like Lisp. -(setq rainbow-delimiters-max-face-count 3) - -;; `restart-emacs' --- provides a simple mechanism for restarting Emacs and -;; daemons interactively. -(setq restart-emacs--args (list "--restore")) - -;; `visual-fill-column' --- for a distractions-free-like UI, that dynamically -;; resizes margins and can center a buffer. -(setq visual-fill-column-center-text t - visual-fill-column-width - ;; take Emacs 26 line numbers into account - (+ (if EMACS26+ 6 0) fill-column)) - - -;; -;; Built-in packages (def-package! ediff :defer t @@ -259,7 +349,55 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") ;; -;; Line numbers +;;; Third party packages + +;; `avy' +(setq avy-all-windows nil + avy-background t) + +;; `all-the-icons' +(def-package! all-the-icons + :commands (all-the-icons-octicon all-the-icons-faicon all-the-icons-fileicon + all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) + :init + (defun doom*disable-all-the-icons-in-tty (orig-fn &rest args) + (if (display-graphic-p) + (apply orig-fn args) + "")) + :config + ;; all-the-icons doesn't work in the terminal, so we "disable" it. + (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))) + +;; `hide-mode-line-mode' +(add-hook 'completion-list-mode-hook #'hide-mode-line-mode) +(add-hook 'Man-mode-hook #'hide-mode-line-mode) + +;; `highlight-numbers' --- better number literal fontification in code +(def-package! highlight-numbers + :hook ((prog-mode conf-mode) . highlight-numbers-mode) + :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) + +;; `highlight-escape-sequences' +(def-package! highlight-escape-sequences + :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) + +;; `rainbow-delimiters' --- helps us distinguish stacked delimiter pairs. +;; Especially in parentheses-drunk languages like Lisp. +(setq rainbow-delimiters-max-face-count 3) + +;; `visual-fill-column' --- for a distractions-free-like UI, that dynamically +;; resizes margins and can center a buffer. +(setq visual-fill-column-center-text t + visual-fill-column-width + ;; take Emacs 26 line numbers into account + (+ (if EMACS26+ 6 0) fill-column)) + + +;; +;;; Line numbers ;; line numbers in most modes (add-hook! (prog-mode text-mode conf-mode) #'display-line-numbers-mode) @@ -267,8 +405,7 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") (defun doom|enable-line-numbers () (display-line-numbers-mode +1)) (defun doom|disable-line-numbers () (display-line-numbers-mode -1)) -;; Emacs 26+ has native line number support, and will ignore nlinum. This is for -;; Emacs 25 users: +;; `nlinum' is used for Emacs 25 users, as Emacs 26+ has native line numbers. (def-package! nlinum ;; Line number column. A faster (or equivalent, in the worst case) line number ;; plugin than `linum-mode'. @@ -332,7 +469,7 @@ character that looks like a space that `whitespace-mode' won't affect.") (advice-add #'web-mode-fold-or-unfold :after #'nlinum-hl-do-generic-flush) ;; Changing fonts can leave nlinum line numbers in their original size; this ;; forces them to resize. - (advice-add #'set-frame-font :after #'nlinum-hl-flush-all-windows)) + (add-hook 'after-setting-font-hook #'nlinum-hl-flush-all-windows)) (def-package! nlinum-relative :unless EMACS26+ @@ -343,7 +480,7 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; -;; Theme & font +;;; Theme & font (defvar doom-last-window-system (if (daemonp) 'daemon initial-window-system) @@ -417,93 +554,27 @@ frame's window-system, the theme will be reloaded.") ;; -;; Bootstrap - -;; simple name in frame title -(setq frame-title-format '("%b – Doom Emacs")) - -;; relegate tooltips to echo area only -(if (boundp 'tooltip-mode) (tooltip-mode -1)) - -;; enabled by default; no thanks, too distracting -(blink-cursor-mode -1) - -;; Handle ansi codes in compilation buffer -(add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) - -;; show typed keystrokes in minibuffer -(defun doom|enable-ui-keystrokes () (setq echo-keystrokes 0.02)) -(defun doom|disable-ui-keystrokes () (setq echo-keystrokes 0)) -(doom|enable-ui-keystrokes) -;; ...but hide them while isearch is active -(add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) -(add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) - -;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. -(add-to-list 'default-frame-alist '(buffer-predicate . doom-buffer-frame-predicate)) -;; Prevent the glimpse of un-styled Emacs by setting these early. -(add-to-list 'default-frame-alist '(tool-bar-lines . 0)) -(add-to-list 'default-frame-alist '(menu-bar-lines . 0)) -(add-to-list 'default-frame-alist '(vertical-scroll-bars)) -;; prompts the user for confirmation when deleting a non-empty frame -(global-set-key [remap delete-frame] #'doom/delete-frame) - -(defun doom|protect-visible-buffer () - "Don't kill the current buffer if it is visible in another window (bury it -instead). Meant for `kill-buffer-query-functions'." - (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) - (not (member (substring (buffer-name) 0 1) '(" " "*")))))) - -(defun doom|protect-fallback-buffer () - "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." - (not (eq (current-buffer) (doom-fallback-buffer)))) - -(defun doom|highlight-non-default-indentation () - "Highlight whitespace that doesn't match your `indent-tabs-mode' setting. - -e.g. If you indent with spaces by default, tabs will be highlighted. If you -indent with tabs, spaces at BOL are highlighted. - -Does nothing if `whitespace-mode' is already active or the current buffer is -read-only or not file-visiting." - (unless (or (bound-and-true-p global-whitespace-mode) - (bound-and-true-p whitespace-mode) - (eq major-mode 'fundamental-mode) - buffer-read-only - (null buffer-file-name)) - (require 'whitespace) - (set (make-local-variable 'whitespace-style) - (if (bound-and-true-p whitespace-newline-mode) - (cl-union (if indent-tabs-mode '(indentation) '(tabs tab-mark)) - whitespace-style) - `(face ,@(if indent-tabs-mode '(indentation) '(tabs tab-mark)) - trailing-lines tail))) - (whitespace-mode +1))) +;;; Bootstrap (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." - (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil #'eq) - (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil #'eq) + (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil 'eq) + (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil 'eq) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) +(advice-add #'load-theme :after #'doom*load-theme-hooks) +(add-hook 'emacs-startup-hook #'doom|init-switch-hooks) (add-hook 'emacs-startup-hook #'doom|init-ui) ;; -;; Fixes/hacks +;;; Fixes/hacks ;; doesn't exist in terminal Emacs; we define it to prevent errors (unless (fboundp 'define-fringe-bitmap) (defun define-fringe-bitmap (&rest _))) -(defun doom*disable-old-themes-first (orig-fn &rest args) - (mapc #'disable-theme custom-enabled-themes) - (apply orig-fn args) - (when (fboundp 'powerline-reset) - (powerline-reset))) -(advice-add #'load-theme :around #'doom*disable-old-themes-first) - (defun doom*prefer-compiled-theme (orig-fn &rest args) "Make `load-theme' prioritize the byte-compiled theme for a moderate boost in startup (or theme switch) time, so long as `doom--prefer-theme-elc' is non-nil." @@ -517,6 +588,14 @@ startup (or theme switch) time, so long as `doom--prefer-theme-elc' is non-nil." (apply orig-fn args))) (advice-add #'load-theme :around #'doom*prefer-compiled-theme) +(after! whitespace + (defun doom*disable-whitespace-mode-in-childframes (orig-fn) + "`whitespace-mode' inundates child frames with whitspace markers, so disable +it to fix all that visual noise." + (unless (frame-parameter frame 'parent-frame) + (funcall orig-fn))) + (add-function :around whitespace-enable-predicate #'doom*disable-whitespace-mode-in-childframes)) + (defun doom|disable-whitespace-mode-in-childframes (frame) "`whitespace-mode' inundates child frames with whitspace markers, so disable it to fix all that visual noise." diff --git a/core/core.el b/core/core.el index 1b5344a7b..f208e06bb 100644 --- a/core/core.el +++ b/core/core.el @@ -125,82 +125,6 @@ else (except for `window-setup-hook').") (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload' is called.") -(defvar doom-load-theme-hook nil - "Hook run after the theme is loaded with `load-theme' or reloaded with -`doom/reload-theme'.") - -(defvar doom-exit-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. - -Also see `doom-enter-window-hook'.") - -(defvar doom-enter-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. - -Also see `doom-exit-window-hook'.") - -(defvar doom-exit-buffer-hook nil - "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-enter-buffer-hook'.") - -(defvar doom-enter-buffer-hook nil - "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-exit-buffer-hook'.") - -(defvar doom-inhibit-switch-buffer-hooks nil - "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'. -Do not set this directly.") -(defvar doom-inhibit-switch-window-hooks nil - "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'. -Do not set this directly.") - -(defun doom*switch-window-hooks (orig-fn window &optional norecord) - (if (or doom-inhibit-switch-window-hooks - (null window) - (eq window (selected-window)) - (window-minibuffer-p) - (window-minibuffer-p window)) - (funcall orig-fn window norecord) - (let ((doom-inhibit-switch-window-hooks t)) - (run-hooks 'doom-exit-window-hook) - (prog1 (funcall orig-fn window norecord) - (with-selected-window window - (run-hooks 'doom-enter-window-hook)))))) - -(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) - (if (or doom-inhibit-switch-buffer-hooks - (eq (get-buffer buffer-or-name) (current-buffer))) - (apply orig-fn buffer-or-name args) - (let ((doom-inhibit-switch-buffer-hooks t)) - (run-hooks 'doom-exit-buffer-hook) - (prog1 (apply orig-fn buffer-or-name args) - (when (buffer-live-p (get-buffer buffer-or-name)) - (with-current-buffer buffer-or-name - (run-hooks 'doom-enter-buffer-hook))))))) - -(defun doom|init-switch-hooks (&optional disable) - "Set up enter/exit hooks for windows and buffers. - -See `doom-enter-buffer-hook', `doom-enter-window-hook', `doom-exit-buffer-hook' -and `doom-exit-window-hook'." - (dolist (spec '((select-window . doom*switch-window-hooks) - (switch-to-buffer . doom*switch-buffer-hooks) - (display-buffer . doom*switch-buffer-hooks) - (pop-to-buffer . doom*switch-buffer-hooks))) - (if disable - (advice-remove (car spec) (cdr spec)) - (advice-add (car spec) :around (cdr spec))))) - -(defun doom*load-theme-hooks (theme &rest _) - "Set up `doom-load-theme-hook' to run after `load-theme' is called." - (setq doom-theme theme) - (run-hooks 'doom-load-theme-hook)) -(advice-add #'load-theme :after #'doom*load-theme-hooks) - ;; ;; Emacs core configuration @@ -342,7 +266,7 @@ If you want to disable incremental loading altogether, either remove Set this to nil to disable incremental loading.") -(defvar doom-incremental-idle-timer 1.5 +(defvar doom-incremental-idle-timer 1 "How long (in idle seconds) in between incrementally loading packages.") (defun doom-load-packages-incrementally (packages &optional now) @@ -516,8 +440,7 @@ to least)." (require 'core-os) (when (or force-load-core-p (not noninteractive)) - (add-hook! 'emacs-startup-hook - #'(doom|init-switch-hooks doom|display-benchmark)) + (add-hook 'emacs-startup-hook #'doom|display-benchmark) (require 'core-ui) (require 'core-editor) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 560faeb10..fd89702e1 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -600,14 +600,14 @@ :desc "Find file in project" "/" #'projectile-find-file :desc "Find file in other project" "?" #'doom/find-file-in-other-project :desc "Browse emacs.d" "E" #'+default/browse-emacsd - :desc "Browse private config" "P" #'+default/browse-config + :desc "Browse private config" "P" #'doom/open-private-config :desc "Recent project files" "R" #'projectile-recentf :desc "Delete this file" "X" #'doom/delete-this-file :desc "Find other file" "a" #'projectile-find-other-file :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig :desc "Find directory" "d" #'dired :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd - :desc "Find file in private config" "p" #'+default/find-in-config + :desc "Find file in private config" "p" #'doom/find-file-in-private-config :desc "Recent files" "r" #'recentf-open-files :desc "Save file" "s" #'save-buffer :desc "Sudo find file" "S" #'doom/sudo-find-file diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 654f40f41..8ee64bbea 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -34,18 +34,6 @@ (defun +default/find-in-notes () (interactive) (doom-project-find-file org-directory)) -;;;###autoload -(defun +default/find-in-config () - "Open a file somewhere in `doom-private-dir' via a fuzzy filename search." - (interactive) - (doom-project-find-file doom-private-dir)) - -;;;###autoload -(defun +default/browse-config () - "Browse the files in `doom-private-dir'." - (interactive) - (doom-project-browse doom-private-dir)) - ;;;###autoload (defun +default/compile (arg) "Runs `compile' from the root of the current project. diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index e684795b4..8bbbe9267 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -66,7 +66,7 @@ Possible values: ("Open private configuration" :icon (all-the-icons-octicon "tools" :face 'font-lock-keyword-face) :when (file-directory-p doom-private-dir) - :action +default/find-in-config) + :action doom/open-private-config) ("Open user manual" :icon (all-the-icons-octicon "book" :face 'font-lock-keyword-face) :when (file-exists-p (expand-file-name "index.org" doom-docs-dir)) From eb3c569e1d90818fd9aaffc1d572bdc50705ebb6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:33:54 -0500 Subject: [PATCH 3842/4235] Replace +lsp|init with lsp! autodef --- modules/lang/go/config.el | 2 +- modules/lang/haskell/+lsp.el | 2 +- modules/lang/java/+lsp.el | 2 +- modules/lang/javascript/config.el | 2 +- modules/lang/ocaml/config.el | 2 +- modules/lang/php/config.el | 2 +- modules/lang/python/config.el | 4 ++-- modules/lang/ruby/config.el | 2 +- modules/lang/rust/config.el | 2 +- modules/lang/scala/config.el | 2 +- modules/lang/swift/config.el | 2 +- modules/lang/web/+css.el | 2 +- modules/lang/web/+html.el | 2 +- modules/tools/lsp/autoload.el | 7 ++----- 14 files changed, 16 insertions(+), 19 deletions(-) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 0952be4e8..564aa4418 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -21,7 +21,7 @@ "goimports")))) (if (featurep! +lsp) - (add-hook 'go-mode-hook #'+lsp|init) + (add-hook 'go-mode-hook #'lsp!) (add-hook 'go-mode-hook #'go-eldoc-setup)) (map! :map go-mode-map diff --git a/modules/lang/haskell/+lsp.el b/modules/lang/haskell/+lsp.el index 7a718ca70..71967a30b 100644 --- a/modules/lang/haskell/+lsp.el +++ b/modules/lang/haskell/+lsp.el @@ -2,7 +2,7 @@ (def-package! lsp-haskell :after haskell-mode - :init (add-hook 'haskell-mode-hook #'+lsp|init) + :init (add-hook 'haskell-mode-hook #'lsp!) :config ;; Does some strange indentation if it pastes in the snippet (setq-hook! 'haskell-mode-hook yas-indent-line 'fixed)) diff --git a/modules/lang/java/+lsp.el b/modules/lang/java/+lsp.el index 88898614d..cd6f4c15a 100644 --- a/modules/lang/java/+lsp.el +++ b/modules/lang/java/+lsp.el @@ -3,7 +3,7 @@ (def-package! lsp-java :after-call java-mode - :init (add-hook 'java-mode-hook #'+lsp|init) + :init (add-hook 'java-mode-hook #'lsp!) :config ;; TODO keybinds ;; TODO treemacs integration (?) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index e77d90987..524f5057a 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -123,7 +123,7 @@ ;; Tools (when (featurep! +lsp) - (add-hook! (js2-mode rjsx-mode typescript-mode) #'+lsp|init)) + (add-hook! (js2-mode rjsx-mode typescript-mode) #'lsp!)) (def-package! tide diff --git a/modules/lang/ocaml/config.el b/modules/lang/ocaml/config.el index 9a4a173b3..db17fbdbb 100644 --- a/modules/lang/ocaml/config.el +++ b/modules/lang/ocaml/config.el @@ -1,7 +1,7 @@ ;;; lang/ocaml/config.el -*- lexical-binding: t; -*- (when (featurep! +lsp) - (add-hook! (tuareg-mode reason-mode) #'+lsp|init)) + (add-hook! (tuareg-mode reason-mode) #'lsp!)) (after! tuareg diff --git a/modules/lang/php/config.el b/modules/lang/php/config.el index b3e8ae1d8..bb09c887e 100644 --- a/modules/lang/php/config.el +++ b/modules/lang/php/config.el @@ -13,7 +13,7 @@ (set-formatter! 'php-mode #'php-cs-fixer-fix) (if (featurep! +lsp) - (add-hook 'php-mode-hook #'+lsp|init) + (add-hook 'php-mode-hook #'lsp!) ;; `+php-company-backend' uses `company-phpactor', `php-extras-company' or ;; `company-dabbrev-code', in that order. (set-company-backend! 'php-mode '+php-company-backend 'company-dabbrev-code)) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 8ec9fe931..a2f93456c 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -44,7 +44,7 @@ called.") :return "return" :yield "yield") (when (featurep! +lsp) - (add-hook 'python-mode-hook #'+lsp|init)) + (add-hook 'python-mode-hook #'lsp!)) (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens (sp-local-pair 'python-mode "'" nil @@ -57,7 +57,7 @@ called.") (def-package! anaconda-mode :unless (featurep! +lsp) - :hook python-mode + :hook python-mode-local-vars :init (setq anaconda-mode-installation-directory (concat doom-etc-dir "anaconda/") anaconda-mode-eldoc-as-single-line t) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 82392619b..150e27aeb 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -20,7 +20,7 @@ (set-repl-handler! '(ruby-mode enh-ruby-mode) #'inf-ruby) (when (featurep! +lsp) - (add-hook 'enh-ruby-mode-hook #'+lsp|init)) + (add-hook 'enh-ruby-mode-hook #'lsp!)) (after! company-dabbrev-code (add-to-list 'company-dabbrev-code-modes 'enh-ruby-mode nil #'eq) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 67eac44f8..8f3153e3e 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -6,7 +6,7 @@ (setq rust-indent-method-chain t) (when (featurep! +lsp) - (add-hook 'rust-mode-hook #'+lsp|init)) + (add-hook 'rust-mode-hook #'lsp!)) (map! :map rust-mode-map :localleader diff --git a/modules/lang/scala/config.el b/modules/lang/scala/config.el index 96870e0b5..ff3b9cb63 100644 --- a/modules/lang/scala/config.el +++ b/modules/lang/scala/config.el @@ -31,4 +31,4 @@ (def-package! lsp-scala :when (featurep! +lsp) :after scala-mode - :init (add-hook 'scala-mode-hook #'+lsp|init)) + :init (add-hook 'scala-mode-hook #'lsp!)) diff --git a/modules/lang/swift/config.el b/modules/lang/swift/config.el index ec566c392..0129d78ac 100644 --- a/modules/lang/swift/config.el +++ b/modules/lang/swift/config.el @@ -22,4 +22,4 @@ (def-package! lsp-sourcekit :when (featurep! +lsp) :after swift-mode - :init (add-hook 'swift-mode-hook #'+lsp|init)) + :init (add-hook 'swift-mode-hook #'lsp!)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 2c9ea541e..3d9635125 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -36,7 +36,7 @@ ;; Tools (when (featurep! +lsp) - (add-hook! (css-mode sass-mode less-css-mode) #'+lsp|init)) + (add-hook! (css-mode sass-mode less-css-mode) #'lsp!)) (def-package! counsel-css diff --git a/modules/lang/web/+html.el b/modules/lang/web/+html.el index e11894818..7b6bb02bb 100644 --- a/modules/lang/web/+html.el +++ b/modules/lang/web/+html.el @@ -142,4 +142,4 @@ (when (featurep! +lsp) - (add-hook! (html-mode web-mode) #'+lsp|init)) + (add-hook! (html-mode web-mode) #'lsp!)) diff --git a/modules/tools/lsp/autoload.el b/modules/tools/lsp/autoload.el index c13d9efd7..5dd061dba 100644 --- a/modules/tools/lsp/autoload.el +++ b/modules/tools/lsp/autoload.el @@ -1,7 +1,4 @@ ;;; feature/lsp/autoload.el -*- lexical-binding: t; -*- -;;;###autoload -(defun +lsp|init () - "Enable LSP as late as possible, to allow users to customize it via file or -dir local variables." - (add-hook 'hack-local-variables-hook #'lsp nil t)) +;;;###autodef +(defalias 'lsp! #'lsp) From da9c4802ebe2a833f36764cd66a35fa09702ff5e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:35:00 -0500 Subject: [PATCH 3843/4235] Fix wrong-number-of-args from +markdown/insert-del --- modules/lang/markdown/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/markdown/autoload.el b/modules/lang/markdown/autoload.el index 0bbbf0feb..f1c2c3904 100644 --- a/modules/lang/markdown/autoload.el +++ b/modules/lang/markdown/autoload.el @@ -11,7 +11,7 @@ (let ((delim "~~")) (if (markdown-use-region-p) ;; Active region - (cl-destructuring-bind (beg end) + (cl-destructuring-bind (beg . end) (markdown-unwrap-things-in-region (region-beginning) (region-end) +markdown--regex-del 2 4) From 6d3df42352f4aa6766b826af4803645b893326ca Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:36:53 -0500 Subject: [PATCH 3844/4235] More conservative electric-indent-local-mode Prevent them from propagating to derived modes (I'm looking at you c modes!) --- modules/emacs/electric/autoload.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/emacs/electric/autoload.el b/modules/emacs/electric/autoload.el index 2a457a0da..f4e33728b 100644 --- a/modules/emacs/electric/autoload.el +++ b/modules/emacs/electric/autoload.el @@ -17,9 +17,10 @@ Enables `electric-indent-local-mode' in MODES. (unintern fn nil)) ((fset fn (lambda () - (setq-local electric-indent-inhibit nil) - (cl-destructuring-bind (&key chars words) plist - (electric-indent-local-mode +1) - (if chars (setq electric-indent-chars chars)) - (if words (setq +electric-indent-words words))))) + (when (eq major-mode mode) + (setq-local electric-indent-inhibit nil) + (cl-destructuring-bind (&key chars words) plist + (electric-indent-local-mode +1) + (if chars (setq electric-indent-chars chars)) + (if words (setq +electric-indent-words words)))))) (add-hook hook fn)))))) From 6a8b968807b60b575cbcfe075d2476152c378036 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:38:18 -0500 Subject: [PATCH 3845/4235] Autopair HTML more conservatively --- modules/config/default/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 7ff96bccd..5c0bf9fae 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -69,7 +69,9 @@ ;; Reasonable default pairs for HTML-style comments (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) - "" :actions '(insert) :post-handlers '(("| " "SPC"))) + "" + :unless '(sp-point-before-word-p sp-point-before-same-p) + :actions '(insert) :post-handlers '(("| " "SPC"))) ;; Disable electric keys in C modes because it interferes with smartparens ;; and custom bindings. We'll do it ourselves (mostly). From e11ea611cf69888e5f1f05b6d57b73356eef81cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:38:54 -0500 Subject: [PATCH 3846/4235] Move company-dict-dir to DOOMDIR/dicts --- modules/completion/company/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index c8415601c..a87d20f37 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -98,6 +98,7 @@ (def-package! company-dict :defer t :config + (setq company-dict-dir (expand-file-name "dicts" doom-private-dir)) (defun +company|enable-project-dicts (mode &rest _) "Enable per-project dictionaries." (if (symbol-value mode) From 0bd576673c1d8436aab2f12b85aa87720bcae142 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:51:51 -0500 Subject: [PATCH 3847/4235] Refactor lang/cc + Fix ffap integration + Code reduction for irony, rtags and lsp init hooks + Use c-add-style instead of unless+push + Log that irony server isn't installed --- modules/lang/cc/autoload.el | 81 ++++++++++++++++++++++++------------- modules/lang/cc/config.el | 52 ++++++++++++++---------- 2 files changed, 83 insertions(+), 50 deletions(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index 3aabe17fe..c442c2028 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -93,6 +93,14 @@ simpler." (funcall +cc-default-header-file-mode)) ((c-mode))))) +(defun +cc-resolve-include-paths () + (cl-loop with path = (or buffer-file-name default-directory) + for dir in +cc-default-include-paths + if (file-name-absolute-p dir) + collect dir + else if (projectile-locate-dominating-file path dir) + collect (expand-file-name dir it))) + ;; ;; Commands @@ -139,8 +147,9 @@ simpler." ("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)) t))) +(defvar +cc--project-includes-alist nil) ;;;###autoload -(defun +cc|irony-init-compile-options () +(defun +cc|init-irony-compile-options () "Initialize compiler options for irony-mode. It searches for the nearest compilation database and initailizes it, otherwise falling back on `+cc-default-compiler-options' and `+cc-default-include-paths'. @@ -150,33 +159,47 @@ compilation dbs." (when (memq major-mode '(c-mode c++-mode objc-mode)) (require 'irony-cdb) (unless (irony-cdb-autosetup-compile-options) - (irony-cdb--update-compile-options - (delq nil - (append (cdr-safe (assq major-mode +cc-default-compiler-options)) - (cl-loop with path = (or buffer-file-name default-directory) - for dir in '("include" "includes") - if (projectile-locate-dominating-file path dir) - collect it) - (cl-loop for path in +cc-default-include-paths - if (stringp path) - nconc (list "-I" path)))) - (doom-project-root))) - ;; Make ffap aware of include paths - (when irony--working-directory - (require 'ffap) - (make-local-variable 'ffap-c-path) - (make-local-variable 'ffap-c++-path) - (cl-loop for opt in irony--compile-options - if (and (stringp opt) - (string-match "^-I\\(.+\\)" opt)) - do (add-to-list (pcase major-mode - (`c-mode 'ffap-c-path) - (`c++-mode 'ffap-c++-path)) - (expand-file-name (match-string 1 opt) - irony--working-directory)))))) + (let ((project-root (doom-project-root)) + (include-paths (+cc-resolve-include-paths))) + (setf (alist-get project-root +cc--project-includes-alist) + include-paths) + (irony-cdb--update-compile-options + (append (delq nil (cdr-safe (assq major-mode +cc-default-compiler-options))) + (cl-loop for path in include-paths + collect (format "-I%s" path))) + project-root))))) + +;; ;;;###autoload +;; (defun +cc|init-ccls-compile-options () +;; "TODO" +;; (when (memq major-mode '(c-mode c++-mode objc-mode)) +;; (when-let* ((include-paths (+cc-resolve-include-paths))) +;; (let ((args (delq nil (cdr-safe (assq major-mode +cc-default-compiler-options))))) +;; (setf (alist-get (or (lsp-workspace-root) +;; (lsp--suggest-project-root) +;; (doom-project-root)) +;; +cc--project-includes-alist) +;; include-paths) +;; (setq ccls-initialization-options +;; `(:clang (:extraArgs +;; [,@(cl-loop for path in include-paths +;; collect (format "-I%s" path))]))))))) ;;;###autoload -(defun +cc|cleanup-rtags () - "Kill rtags server(s) if there are no C/C++ buffers open." - (unless (doom-buffers-in-mode '(c-mode c++-mode) (buffer-list)) - (rtags-cancel-process))) +(defun +cc|init-ffap-integration () + "Takes the local project include paths and registers them with ffap. +This way, `find-file-at-point' (and `+lookup/file') will know where to find most +header files." + (when-let* ((project-root (or (bound-and-true-p irony--working-directory) + (and (featurep 'lsp) + (or (lsp-workspace-root) + (doom-project-root)))))) + (require 'ffap) + (make-local-variable 'ffap-c-path) + (make-local-variable 'ffap-c++-path) + (cl-loop for dir in (or (cdr (assoc project-root +cc--project-includes-alist)) + (+cc-resolve-include-paths)) + do (add-to-list (pcase major-mode + (`c-mode 'ffap-c-path) + (`c++-mode 'ffap-c++-path)) + (expand-file-name dir project-root))))) diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index 035dea19a..c53273bea 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -1,9 +1,13 @@ ;;; lang/cc/config.el --- c, c++, and obj-c -*- lexical-binding: t; -*- -(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 compilation -database.") +(defvar +cc-default-include-paths + (list "include" + "includes") + "A list of default relative paths which will be searched for up from the +current file, to be passed to irony as extra header search paths. Paths can be +absolute. This is ignored if your project has a compilation database. + +This is ignored by ccls.") (defvar +cc-default-header-file-mode 'c-mode "Fallback major mode for .h files if all other heuristics fail (in @@ -20,7 +24,9 @@ database.") "-stdlib=libc++"))) (objc-mode . nil)) "A list of default compiler options for the C family. These are ignored if a -compilation database is present in the project.") +compilation database is present in the project. + +This is ignored by ccls.") ;; @@ -42,6 +48,11 @@ compilation database is present in the project.") ;; Activate `c-mode', `c++-mode' or `objc-mode' depending on heuristics (add-to-list 'auto-mode-alist '("\\.h\\'" . +cc-c-c++-objc-mode)) + ;; Ensure find-file-at-point works in C modes, must be added before irony + ;; and/or lsp hooks are run. + (add-hook! (c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) + #'+cc|init-ffap-integration) + :config (set-electric! '(c-mode c++-mode objc-mode java-mode) :chars '(?\n ?\} ?\{)) (set-docsets! 'c-mode "C") @@ -69,12 +80,11 @@ compilation database is present in the project.") ;;; Better fontification (also see `modern-cpp-font-lock') (add-hook 'c-mode-common-hook #'rainbow-delimiters-mode) - (add-hook! '(c-mode-hook c++-mode-hook) #'+cc|fontify-constants) + (add-hook! (c-mode c++-mode) #'+cc|fontify-constants) ;; Custom style, based off of linux - (unless (assoc "doom" c-style-alist) - (push '("doom" - (c-basic-offset . tab-width) + (c-add-style + "doom" '((c-basic-offset . tab-width) (c-comment-only-line-offset . 0) (c-hanging-braces-alist (brace-list-open) (brace-entry-open) @@ -102,8 +112,7 @@ compilation database is present in the project.") ;; another level (access-label . -) (inclass +cc-c++-lineup-inclass +) - (label . 0))) - c-style-alist)) + (label . 0)))) ;;; Keybindings ;; Smartparens and cc-mode both try to autoclose angle-brackets intelligently. @@ -131,16 +140,17 @@ compilation database is present in the project.") (setq irony-server-install-prefix (concat doom-etc-dir "irony-server/")) :init (defun +cc|init-irony-mode () - (when (and (memq major-mode '(c-mode c++-mode objc-mode)) - (file-directory-p irony-server-install-prefix)) - (irony-mode +1))) - (add-hook 'c-mode-common-hook #'+cc|init-irony-mode) + (if (file-directory-p irony-server-install-prefix) + (irony-mode +1) + (message "Irony server isn't installed"))) + (add-hook! (c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) + #'+cc|init-irony-mode) :config (setq irony-cdb-search-directory-list '("." "build" "build-conda")) ;; Initialize compilation database, if present. Otherwise, fall back on ;; `+cc-default-compiler-options'. - (add-hook 'irony-mode-hook #'+cc|irony-init-compile-options) + (add-hook 'irony-mode-hook #'+cc|init-irony-compile-options) (def-package! irony-eldoc :hook (irony-mode . irony-eldoc)) @@ -188,11 +198,11 @@ compilation database is present in the project.") :init (defun +cc|init-rtags () "Start an rtags server in c-mode and c++-mode buffers." - (when (and (memq major-mode '(c-mode c++-mode)) - (require 'rtags nil t) + (when (and (require 'rtags nil t) (rtags-executable-find rtags-rdm-binary-name)) (rtags-start-process-unless-running))) - (add-hook 'c-mode-common-hook #'+cc|init-rtags) + (add-hook! (c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) + #'+cc|init-rtags) :config (setq rtags-autostart-diagnostics t rtags-use-bookmarks nil @@ -226,9 +236,9 @@ compilation database is present in the project.") (def-package! ccls :when (featurep! +lsp) - :hook ((c-mode c++-mode objc-mode) . +lsp|init-ccls) + :hook ((c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) . +cc|init-ccls) :config - (defun +lsp|init-ccls () + (defun +cc|init-ccls () (setq-local company-transformers nil) (setq-local company-lsp-async t) (setq-local company-lsp-cache-candidates nil) From 7c9e96da875a341a8f9c359e7b4159bc1f0e114c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:56:32 -0500 Subject: [PATCH 3848/4235] General module refactor --- modules/feature/evil/autoload/evil.el | 10 ++++++---- modules/lang/clojure/config.el | 12 ++++++------ modules/lang/coq/config.el | 3 +++ modules/lang/elixir/config.el | 24 ++++++++++++------------ modules/lang/elm/config.el | 2 +- modules/lang/emacs-lisp/config.el | 3 ++- modules/lang/erlang/config.el | 12 +++++------- modules/lang/ess/config.el | 1 + modules/lang/markdown/config.el | 16 ++++++++++------ modules/tools/flyspell/autoload.el | 1 + modules/tools/flyspell/config.el | 20 ++++++++++---------- modules/tools/flyspell/doctor.el | 4 ++++ modules/tools/pdf/config.el | 7 +------ modules/ui/modeline/autoload.el | 2 +- 14 files changed, 63 insertions(+), 54 deletions(-) create mode 100644 modules/tools/flyspell/doctor.el diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 1da151300..8eb6638ea 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -13,7 +13,7 @@ ;; -;; Commands +;;; Commands ;;;###autoload (defun +evil/visual-indent () @@ -111,7 +111,7 @@ integration." ;; -;; Evil commands/operators +;;; Evil commands/operators ;;;###autoload (autoload '+evil:apply-macro "feature/evil/autoload/evil" nil t) (evil-define-operator +evil:apply-macro (beg end) @@ -154,7 +154,8 @@ integration." (doom/clone-and-narrow-buffer beg end bang)) -;; --- custom arg handlers ---------------- +;; +;;; Custom arg handlers (defvar +evil--flag nil) @@ -241,7 +242,8 @@ the first match on each line)." -1 1 bang)) -;; --- wgrep ------------------------------ +;; +;;; wgrep ;;;###autoload (autoload '+evil-delete "feature/evil/autoload/evil" nil t) (evil-define-operator +evil-delete (beg end type register yank-handler) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index ab6d8823b..e20a8ed9e 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -4,16 +4,11 @@ (after! clojure-mode (add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) - (set-popup-rules! - '(("^\\*cider-error*" :ignore t) - ("^\\*cider-repl" :quit nil) - ("^\\*cider-repl-history" :vslot 2 :ttl nil))) - (def-package! cider ;; NOTE: if you don't have an org directory set (the dir doesn't exist), ;; cider jack in won't work. :commands (cider-jack-in cider-jack-in-clojurescript) - :hook (clojure-mode . cider-mode) + :hook (clojure-mode-local-vars . cider-mode) :init (set-repl-handler! 'clojure-mode #'+clojure/repl) (set-eval-handler! 'clojure-mode #'cider-eval-region) @@ -22,6 +17,11 @@ :documentation #'cider-doc) (add-hook 'cider-mode-hook #'eldoc-mode) :config + (set-popup-rules! + '(("^\\*cider-error*" :ignore t) + ("^\\*cider-repl" :quit nil) + ("^\\*cider-repl-history" :vslot 2 :ttl nil))) + (setq nrepl-hide-special-buffers t nrepl-log-messages nil cider-font-lock-dynamically '(macro core function var) diff --git a/modules/lang/coq/config.el b/modules/lang/coq/config.el index da7283ac6..8bfdcf90e 100644 --- a/modules/lang/coq/config.el +++ b/modules/lang/coq/config.el @@ -3,8 +3,11 @@ ;; `coq' (setq proof-electric-terminator-enable t) +;; We've replaced coq-mode abbrevs with yasnippet snippets (in the snippets +;; library included with Doom). (setq coq-mode-abbrev-table '()) + (after! company-coq (set-popup-rule! "^\\*\\(?:response\\|goals\\)\\*" :ignore t) (set-lookup-handlers! 'company-coq-mode diff --git a/modules/lang/elixir/config.el b/modules/lang/elixir/config.el index 718dd46e8..71c4973e0 100644 --- a/modules/lang/elixir/config.el +++ b/modules/lang/elixir/config.el @@ -3,20 +3,10 @@ (def-package! elixir-mode :defer t :init - ;; Disable default smartparens config; there are too many, they're intrusive - ;; and we only want a subset of them (defined below). + ;; Disable default smartparens config. There are too many pairs; we only want + ;; a subset of them (defined below). (provide 'smartparens-elixir) :config - ;; ...and only complete the basics - (after! smartparens - (sp-with-modes 'elixir-mode - (sp-local-pair "do" "end" - :when '(("RET" "")) - :unless '(sp-in-comment-p sp-in-string-p) - :post-handlers '("||\n[i]")) - (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) - (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) - (set-pretty-symbols! 'elixir-mode ;; Functional :def "def" @@ -30,6 +20,16 @@ :for "for" :return "return" :yield "use") + ;; ...and only complete the basics + (after! smartparens + (sp-with-modes 'elixir-mode + (sp-local-pair "do" "end" + :when '(("RET" "")) + :unless '(sp-in-comment-p sp-in-string-p) + :post-handlers '("||\n[i]")) + (sp-local-pair "do " " end" :unless '(sp-in-comment-p sp-in-string-p)) + (sp-local-pair "fn " " end" :unless '(sp-in-comment-p sp-in-string-p)))) + (def-package! alchemist-company :when (featurep! :completion company) :commands alchemist-company diff --git a/modules/lang/elm/config.el b/modules/lang/elm/config.el index 3899a89f9..b10dde8c1 100644 --- a/modules/lang/elm/config.el +++ b/modules/lang/elm/config.el @@ -5,6 +5,7 @@ (after! elm-mode (add-hook 'elm-mode-hook #'rainbow-delimiters-mode) + (set-company-backend! 'elm-mode 'company-elm) (set-repl-handler! 'elm-mode #'run-elm-interactive) (set-pretty-symbols! 'elm-mode @@ -22,4 +23,3 @@ :when (featurep! :tools flycheck) :after elm-mode :config (add-to-list 'flycheck-checkers 'elm nil #'eq)) - diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 02579ba42..ff38736ec 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -42,7 +42,8 @@ (add-hook! 'emacs-lisp-mode-hook #'(;; 3rd-party functionality - auto-compile-on-save-mode outline-minor-mode + auto-compile-on-save-mode + outline-minor-mode ;; initialization +emacs-lisp|extend-imenu)) diff --git a/modules/lang/erlang/config.el b/modules/lang/erlang/config.el index fbc17bc31..ed91e5229 100644 --- a/modules/lang/erlang/config.el +++ b/modules/lang/erlang/config.el @@ -1,11 +1,9 @@ -;;; private/erlang/config.el -*- lexical-binding: t; -*- +;;; lang/erlang/config.el -*- lexical-binding: t; -*- -(dolist (regexp '("\\.erlang$" - ;; rebar files - "/rebar\\.config\\(?:\\.script\\)?$" - ;; erlang configs - "/\\(?:app\\|sys\\)\\.config$")) - (add-to-list 'auto-mode-alist (cons regexp 'erlang-mode))) +(def-package! erlang + :mode ("\\.erlang$" . erlang-mode) + :mode ("/rebar\\.config\\(?:\\.script\\)?$" . erlang-mode) + :mode ("/\\(?:app\\|sys\\)\\.config$" . erlang-mode)) (def-package! flycheck-rebar3 diff --git a/modules/lang/ess/config.el b/modules/lang/ess/config.el index 42d337541..249c9264a 100644 --- a/modules/lang/ess/config.el +++ b/modules/lang/ess/config.el @@ -9,6 +9,7 @@ :config (setq ess-offset-continued 'straight ess-expression-offset 2 + ess-use-flymake (not (featurep! :tools flycheck)) ess-nuke-trailing-whitespace-p t ess-default-style 'DEFAULT ess-history-directory (expand-file-name "ess-history/" doom-cache-dir)) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index e64f7d753..c1093956a 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -3,9 +3,6 @@ (def-package! markdown-mode :mode ("/README\\(?:\\.\\(?:markdown\\|md\\)\\)?\\'" . gfm-mode) :init - (when (featurep! +pandoc) - (setq markdown-command "pandoc --from=markdown --to=html --standalone --mathjax --highlight-style=pygments")) - (setq markdown-enable-wiki-links t markdown-italic-underscore t markdown-asymmetric-header t @@ -17,7 +14,10 @@ markdown-gfm-uppercase-checkbox t) ; for compat with org-mode :config - (set-flyspell-predicate! '(markdown-mode gfm-mode) #'+markdown-flyspell-word-p) + (set-flyspell-predicate! '(markdown-mode gfm-mode) + #'+markdown-flyspell-word-p) + (set-lookup-handlers! '(markdown-mode gfm-mode) + :file #'markdown-follow-thing-at-point) (defun +markdown|set-fill-column-and-line-spacing () (setq-local line-spacing 2) @@ -25,8 +25,10 @@ (add-hook 'markdown-mode-hook #'+markdown|set-fill-column-and-line-spacing) (add-hook 'markdown-mode-hook #'auto-fill-mode) + (sp-with-modes '(markdown-mode gfm-mode) + (sp-local-pair "```" "```" :post-handlers '(:add ("||\n[i]" "RET")))) + (map! :map markdown-mode-map - [remap find-file-at-point] #'markdown-follow-thing-at-point "M-*" #'markdown-insert-list-item "M-b" #'markdown-insert-bold "M-i" #'markdown-insert-italic @@ -51,7 +53,9 @@ "i" #'markdown-insert-image "l" #'markdown-insert-link)))) + (def-package! pandoc-mode :when (featurep! +pandoc) :commands pandoc-mode - :hook (markdown-mode . conditionally-turn-on-pandoc)) + :hook (markdown-mode . conditionally-turn-on-pandoc) + :init (setq markdown-command "pandoc --from=markdown --to=html --standalone --mathjax --highlight-style=pygments")) diff --git a/modules/tools/flyspell/autoload.el b/modules/tools/flyspell/autoload.el index 139b98061..be7e25e1c 100644 --- a/modules/tools/flyspell/autoload.el +++ b/modules/tools/flyspell/autoload.el @@ -6,6 +6,7 @@ ;;;###autodef (defun set-flyspell-predicate! (modes predicate) "TODO" + (declare (indent defun)) (dolist (mode (doom-enlist modes) +flyspell--predicate-alist) (add-to-list '+flyspell--predicate-alist (cons mode predicate)))) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index ab3030bcc..b80c0e54b 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -19,7 +19,15 @@ Since spellchecking can be slow in some buffers, this can be disabled with: ispell-extra-args '("--sug-mode=ultra" "--run-together")) (setq-hook! 'text-mode-hook - ispell-extra-args (remove "--run-together" ispell-extra-args))) + ispell-extra-args (remove "--run-together" ispell-extra-args)) + + (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) + (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) + (ispell-kill-ispell t) + (apply orig-fun args) + (ispell-kill-ispell t))) + (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) + (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) ((executable-find "hunspell") (setq ispell-program-name "hunspell" @@ -35,15 +43,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: nil utf-8))))) - (add-to-list 'ispell-extra-args "--dont-tex-check-comments") - - (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) - (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) - (ispell-kill-ispell t) - (apply orig-fun args) - (ispell-kill-ispell t))) - (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) - (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) + (add-to-list 'ispell-extra-args "--dont-tex-check-comments")) ;; `flyspell' (built-in) diff --git a/modules/tools/flyspell/doctor.el b/modules/tools/flyspell/doctor.el new file mode 100644 index 000000000..9d1cb3286 --- /dev/null +++ b/modules/tools/flyspell/doctor.el @@ -0,0 +1,4 @@ + +(unless (or (executable-find "aspell") + (executable-find "hunspell")) + (warn! "Could not find aspell or hunspell. Flyspell will fall back to ispell, which may not work.")) diff --git a/modules/tools/pdf/config.el b/modules/tools/pdf/config.el index a10e9a5e3..2f22d3983 100644 --- a/modules/tools/pdf/config.el +++ b/modules/tools/pdf/config.el @@ -6,12 +6,7 @@ (unless noninteractive (pdf-tools-install)) - (define-key! pdf-view-mode-map - "q" #'kill-this-buffer) - - (when (featurep! :feature evil +everywhere) - (evil-define-key* 'normal pdf-view-mode-map - "q" #'kill-this-buffer)) + (map! :map pdf-view-mode-map :gn "q" #'kill-this-buffer) (defun +pdf|cleanup-windows () "Kill left-over annotation buffers when the document is killed." diff --git a/modules/ui/modeline/autoload.el b/modules/ui/modeline/autoload.el index 0c0a8a955..9994e6f8a 100644 --- a/modules/ui/modeline/autoload.el +++ b/modules/ui/modeline/autoload.el @@ -29,7 +29,7 @@ made to be added to `doom-big-font-mode-hook'." ;;;###autoload (defun +modeline|update-env-in-all-windows (&rest _) - "" + "TODO" (dolist (window (window-list)) (with-selected-window window (doom-modeline-update-env)))) From 9ed9daa79f7238667c2a5616d09865343c80edf8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:57:04 -0500 Subject: [PATCH 3849/4235] No longer disable line numbers in org-mode Now that doom-themes no longer imposes variable height heading fonts. However, if you use them yourself, you may want to disable line numbers there yourself via (add-hook 'org-mode-hook #'doom|disable-line-numbers) --- modules/lang/org/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 3ba70a053..c5a43719f 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -99,8 +99,7 @@ +org|setup-custom-links)) (add-hook! 'org-mode-hook - #'(doom|disable-line-numbers ; org doesn't really need em - org-bullets-mode ; "prettier" bullets + #'(org-bullets-mode ; "prettier" bullets org-indent-mode ; margin-based indentation toc-org-enable ; auto-table of contents auto-fill-mode ; line wrapping From 8a57d9b5fdf0dc71aa462669dfeeeba7b669ee47 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 01:57:54 -0500 Subject: [PATCH 3850/4235] lang/org: RET on TOC will now refresh the TOC --- modules/lang/org/autoload/org.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 66cc3f5b8..c74c10821 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -83,7 +83,11 @@ If on a: (org-toggle-checkbox (if (equal match "[ ]") '(16))))) (`headline - (cond ((org-element-property :todo-type context) + (cond ((and (fboundp 'toc-org-insert-toc) + (member "TOC" (org-get-tags))) + (toc-org-insert-toc) + (message "Updating table of contents")) + ((org-element-property :todo-type context) (org-todo (if (eq (org-element-property :todo-type context) 'done) (or (car (+org-get-todo-keywords-for (org-element-property :todo-keyword context))) From 7b2e80c711a70a56a28a64283f0f6c0097d0e859 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 02:02:13 -0500 Subject: [PATCH 3851/4235] Remove bash, zsh, fish from eshell-visual-commands It would affect non-interactive shell scripts run through these shells (like homebrew). --- modules/emacs/eshell/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 7612d941b..2665b6df9 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -107,7 +107,7 @@ You should use `det-eshell-alias!' to change this.") ;; Visual commands require a proper terminal. Eshell can't handle that, so ;; it delegates these commands to a term buffer. (after! em-term - (dolist (cmd '("tmux" "htop" "bash" "zsh" "fish" "vim" "nvim" "ncmpcpp")) + (dolist (cmd '("tmux" "htop" "vim" "nvim" "ncmpcpp")) (add-to-list 'eshell-visual-commands cmd))) (defun +eshell|init-aliases () From ce22e218538f870bd32fe47f8c01147450da22db Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 02:03:15 -0500 Subject: [PATCH 3852/4235] Refactor helm commands --- modules/completion/helm/autoload/helm.el | 31 ++++++++++++++++-------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index e7d6376f5..04cd60a1b 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -162,9 +162,10 @@ order. (string-join (delq nil (cdr command)) " ") (abbreviate-file-name directory)) helm-source-do-ag) - (cl-letf ((+helm-global-prompt prompt) - ((symbol-function 'helm-do-ag--helm) + (helm-attrset '+helm-command command helm-source-do-ag) + (cl-letf (((symbol-function 'helm-do-ag--helm) (lambda () (helm :sources '(helm-source-do-ag) + :prompt prompt :buffer "*helm-ag*" :keymap helm-do-ag-map :input query @@ -177,7 +178,7 @@ order. return (intern (format format tool)))) ;;;###autoload -(defun +helm/project-search (&optional all-files-p) +(defun +helm/project-search (&optional arg) "Performs a project search from the project root. Uses the first available search backend from `+helm-project-search-engines'. If @@ -186,10 +187,10 @@ ones, in the search." (interactive "P") (funcall (or (+helm--get-command "+helm/%s") #'+helm/grep) - (or all-files-p current-prefix-arg))) + arg)) ;;;###autoload -(defun +helm/project-search-from-cwd (&optional all-files-p) +(defun +helm/project-search-from-cwd (&optional arg) "Performs a project search recursively from the current directory. Uses the first available search backend from `+helm-project-search-engines'. If @@ -198,7 +199,7 @@ ones." (interactive "P") (funcall (or (+helm--get-command "+helm/%s-from-cwd") #'+helm/grep-from-cwd) - (or all-files-p current-prefix-arg))) + arg)) ;; Relative to project root @@ -213,21 +214,31 @@ ones." (dolist (engine `(,@(cl-remove-duplicates +helm-project-search-engines :from-end t) grep)) (defalias (intern (format "+helm/%s" engine)) - (lambda (all-files-p &optional query directory) + (lambda (arg &optional query directory) (interactive "P") - (+helm-file-search engine :query query :in directory :all-files all-files-p)) + (+helm-file-search engine + :query query + :in directory + :all-files (and (not (null arg)) + (listp arg)))) (format "Perform a project file search using %s. QUERY is a regexp. If omitted, the current selection is used. If no selection is active, the last known search is used. +ARG is the universal argument. If a number is passed through it, e.g. C-u 3, then + If ALL-FILES-P, search compressed and hidden files as well." engine)) (defalias (intern (format "+helm/%s-from-cwd" engine)) - (lambda (all-files-p &optional query) + (lambda (arg &optional query) (interactive "P") - (+helm-file-search engine :query query :in default-directory :all-files all-files-p)) + (+helm-file-search engine + :query query + :in default-directory + :all-files (and (not (null arg)) + (listp arg)))) (format "Perform a project file search from the current directory using %s. QUERY is a regexp. If omitted, the current selection is used. If no selection is From 50de8a07ddcc427c4c72f5c5e5f76c9d91287343 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 02:04:28 -0500 Subject: [PATCH 3853/4235] Reduce company+evil keymap conflicts #903 company-active-map and company-search-map were losing to global evil state keymaps, causing an odd issue with the insert keybind for C-j was overriding C-j (company-select-next) when company was active and completing. --- modules/completion/company/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index a87d20f37..2fc9f906c 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -18,6 +18,8 @@ company-echo-metadata-frontend)) :config (add-hook 'company-mode-hook #'+company|init-backends) + (when (featurep! :feature evil) + (add-hook 'company-mode-hook #'evil-normalize-keymaps)) (global-company-mode +1)) From 36fa02a03cd9541b9fc6c95038b0a803dce5239f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 02:11:53 -0500 Subject: [PATCH 3854/4235] Add modules/README.org A module listing with supported flags, links to documentation and brief descriptions (WIP). --- modules/README.org | 170 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 modules/README.org diff --git a/modules/README.org b/modules/README.org new file mode 100644 index 000000000..7a26494de --- /dev/null +++ b/modules/README.org @@ -0,0 +1,170 @@ +#+TITLE: Doom Modules + +* Table of Contents :TOC:noexport: +- [[#feature][:feature]] +- [[#completion][:completion]] +- [[#ui][:ui]] +- [[#editor][:editor]] +- [[#emacs][:emacs]] +- [[#tools][:tools]] +- [[#lang][:lang]] +- [[#app][:app]] +- [[#collab][:collab]] +- [[#config][:config]] + +* :feature +Broad modules that bring essential IDE functionality to Emacs. + ++ [[file:feature/debugger/README.org][debugger]]: A (nigh-)universal debugger in Emacs ++ [[file:feature/eval/README.org][eval]]: REPL & code evaluation support for a variety of languages ++ [[file:feature/evil/README.org][evil]] =+everywhere=: Vim in Emacs ++ [[file:feature/file-templates/README.org][file-templates]]: Auto-inserted templates in blank new files ++ [[file:feature/lookup/README.org][lookup]] =+docsets=: Universal jump-to & documentation lookup backend ++ [[file:feature/snippets/README.org][snippets]]: A templating system for Emacs for lazy typers (aka programmers) ++ [[file:feature/workspaces/README.org][workspaces]]: Isolated workspaces + +* :completion +Swappable completion modules for quickly narrowing down lists of candidates. + ++ [[file:completion/company/README.org][company]] =+auto +childframe=: The ultimate code completion backend ++ [[file:completion/helm/README.org][helm]] =+fuzzy +childframe=: *Another* search engine for love and life ++ [[file:completion/ido/README.org][ido]]: The /other/ *other* search engine for love and life ++ [[file:completion/ivy/README.org][ivy]] =+fuzzy +childframe=: /The/ search engine for love and life + +* :ui +Aesthetic modules that affect the Emacs interface or user experience. + ++ [[file:ui/deft/README.org][deft]]: ++ [[file:ui/doom/README.org][doom]]: ++ [[file:ui/doom-dashboard/README.org][doom-dashboard]]: ++ [[file:ui/doom-quit/README.org][doom-quit]]: ++ [[file:ui/evil-goggles/README.org][evil-goggles]]: ++ [[file:ui/fci/README.org][fci]]: ++ [[file:ui/hl-todo/README.org][hl-todo]]: ++ [[file:ui/modeline/README.org][modeline]]: ++ [[file:ui/nav-flash/README.org][nav-flash]]: ++ [[file:ui/neotree/README.org][neotree]]: ++ [[file:ui/treemacs/README.org][treemacs]]: ++ [[file:ui/popup/README.org][popup]] =+all +defaults=: Makes temporary/disposable windows less intrusive ++ [[file:ui/pretty-code/README.org][pretty-code]]: ++ [[file:ui/tabbar/README.org][tabbar]]: ++ [[file:ui/unicode/README.org][unicode]]: ++ [[file:ui/vc-gutter/README.org][vc-gutter]]: ++ [[file:ui/vi-tilde-fringe/README.org][vi-tilde-fringe]]: ++ [[file:ui/window-select/README.org][window-select]]: + +* :editor +Modules that affect and augment your ability to write and edit text. + ++ [[file:editor/fold/README.org][fold]]: universal code folding ++ [[file:editor/format/README.org][format]] =+onsave=: ++ [[file:editor/lispy/README.org][lispy]]: ++ [[file:editor/multiple-cursors/README.org][multiple-cursors]]: ++ [[file:editor/parinfer/README.org][parinfer]]: ++ [[file:editor/rotate-text/README.org][rotate-text]]: + +* :emacs +Modules that reconfigure packages or features built into Emacs + ++ [[file:emacs/dired/README.org][dired]] =+ranger +icons=: ++ [[file:emacs/electric/README.org][electric]]: ++ [[file:emacs/eshell/README.org][eshell]]: ++ [[file:emacs/imenu/README.org][imenu]]: ++ [[file:emacs/term/README.org][term]]: ++ [[file:emacs/vc/README.org][vc]]: + +* :tools +Small modules that give Emacs access to external tools & services. + ++ [[file:tools/ansible/README.org][ansible]]: ++ [[file:tools/docker/README.org][docker]]: ++ [[file:tools/editorconfig/README.org][editorconfig]]: ++ [[file:tools/ein/README.org][ein]]: ++ [[file:tools/flyspell/README.org][flyspell]]: Spell checking ++ [[file:tools/flycheck/README.org][flycheck]]: Live error/warning highlights ++ [[file:tools/gist/README.org][gist]]: ++ [[file:tools/lsp/README.org][lsp]]: ++ [[file:tools/macos/README.org][macos]]: ++ [[file:tools/make/README.org][make]]: ++ [[file:tools/magit/README.org][magit]]: ++ [[file:tools/password-store/README.org][password-store]]: ++ [[file:tools/pdf/README.org][pdf]]: ++ [[file:tools/prodigy/README.md][prodigy]]: ++ [[file:tools/rgb/README.org][rgb]]: ++ [[file:tools/terraform/README.org][terraform]]: ++ [[file:tools/tmux/README.org][tmux]]: ++ [[file:tools/upload/README.org][upload]]: ++ [[file:tools/wakatime/README.org][wakatime]]: ++ [[file:tools/vterm/README.org][vterm]]: + +* :lang +Modules that bring support for a language or group of languages to Emacs. + ++ [[file:lang/assembly/README.org][assembly]]: ++ [[file:lang/cc/README.org][cc]] =+lsp=: ++ [[file:lang/clojure/README.org][clojure]]: ++ [[file:lang/common-lisp/README.org][common-lisp]]: ++ [[file:lang/coq/README.org][coq]]: ++ [[file:lang/crystal/README.org][crystal]]: ++ [[file:lang/csharp/README.org][csharp]]: ++ [[file:lang/data/README.org][data]]: ++ [[file:lang/erlang/README.org][erlang]]: ++ [[file:lang/elixir/README.org][elixir]]: ++ [[file:lang/elm/README.org][elm]]: ++ [[file:lang/emacs-lisp/README.org][emacs-lisp]]: ++ [[file:lang/ess/README.org][ess]]: ++ [[file:lang/go/README.org][go]] =+lsp=: ++ [[file:lang/haskell/README.org][haskell]] =+intero +dante=: ++ [[file:lang/hy/README.org][hy]]: ++ [[file:lang/idris/README.org][idris]]: ++ [[file:lang/java/README.org][java]] =+meghanada=: ++ [[file:lang/javascript/README.org][javascript]] =+lsp=: ++ [[file:lang/julia/README.org][julia]]: ++ [[file:lang/latex/README.org][latex]]: ++ [[file:lang/ledger/README.org][ledger]]: ++ [[file:lang/lua/README.org][lua]]: ++ [[file:lang/markdown/README.org][markdown]]: ++ [[file:lang/nim/README.org][nim]]: ++ [[file:lang/nix/README.org][nix]]: ++ [[file:lang/ocaml/README.org][ocaml]] =+lsp=: ++ [[file:lang/org/README.org][org]] =+attach +babel +capture +export +present +ipython=: ++ [[file:lang/perl/README.org][perl]]: ++ [[file:lang/php/README.org][php]] =+lsp=: ++ [[file:lang/plantuml/README.org][plantuml]]: ++ [[file:lang/purescript/README.org][purescript]]: ++ [[file:lang/python/README.org][python]] =+lsp=: ++ [[file:lang/qt/README.org][qt]]: ++ [[file:lang/racket/README.org][racket]]: ++ [[file:lang/rest/README.org][rest]]: ++ [[file:lang/ruby/README.org][ruby]] =+lsp=: ++ [[file:lang/rust/README.org][rust]] =+lsp=: ++ [[file:lang/scala/README.org][scala]]: ++ [[file:lang/sh/README.org][sh]] =+fish +lsp=: ++ [[file:lang/solidity/README.org][solidity]]: ++ [[file:lang/swift/README.org][swift]]: ++ [[file:lang/web/README.org][web]] =+lsp=: ++ [[file:lang/vala/README.org][vala]]: + +* :app +Large, opinionated modules that transform and take over Emacs to serve + ++ [[file:app/calendar/README.org][calendar]]: ++ [[file:app/email/README.org][email]] =+gmail=: ++ [[file:app/irc/README.org][irc]]: ++ [[file:app/regex/README.org][regex]]: ++ [[file:app/rss/README.org][rss]] =+org=: ++ [[file:app/twitter/README.org][twitter]]: ++ [[file:app/write/README.org][write]] =+wordnut +langtool=: + +* :collab +Modules that enable collaborative programming over the internet. + ++ [[file:collab/floobits/README.org][floobits]]: ++ [[file:collab/impatient-mode/README.org][impatient-mode]]: + +* :config +Modules that configure Emacs one way or another, or focus on making it easier +for you to customize it yourself. + ++ [[file:config/literate/README.org][literate]]: ++ [[file:config/default/README.org][default]] =+bindings +smartparens=: From 80607ff0332e51c71b5dfb569371d1f0bfcb082a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 03:06:29 -0500 Subject: [PATCH 3855/4235] Confirm quit on doom/restart-and-restore --- core/autoload/sessions.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/autoload/sessions.el b/core/autoload/sessions.el index af9a8dc24..611e0096e 100644 --- a/core/autoload/sessions.el +++ b/core/autoload/sessions.el @@ -116,6 +116,5 @@ "TODO" (interactive "P") (doom/quicksave-session) - (let (confirm-kill-emacs) - (restart-emacs - (delq nil (list (if debug "--debug-init") "--restore"))))) + (restart-emacs + (delq nil (list (if debug "--debug-init") "--restore")))) From 84343f57aa44e7304c394333297b76c55ab65908 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 03:53:13 -0500 Subject: [PATCH 3856/4235] Refactor UTF-8 setters Some were redundant --- core/core.el | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/core.el b/core/core.el index f208e06bb..98da9abbb 100644 --- a/core/core.el +++ b/core/core.el @@ -132,12 +132,10 @@ else (except for `window-setup-hook').") ;; UTF-8 as the default coding system (when (fboundp 'set-charset-priority) (set-charset-priority 'unicode)) ; pretty -(prefer-coding-system 'utf-8) ; pretty -(set-terminal-coding-system 'utf-8) ; pretty -(set-keyboard-coding-system 'utf-8) ; pretty -(set-selection-coding-system 'utf-8) ; perdy -(setq locale-coding-system 'utf-8) ; please -(setq-default buffer-file-coding-system 'utf-8) ; with sugar on top +(prefer-coding-system 'utf-8) ; pretty +(setq selection-coding-system 'utf-8) ; pretty +(setq locale-coding-system 'utf-8) ; please +(if IS-WINDOWS (set-w32-system-coding-system 'utf-8)) ; with sugar on top (setq-default ad-redefinition-action 'accept ; silence advised function warnings From 3ea805cc94b01a5a95160121be2bbcc87d6ad224 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 03:54:04 -0500 Subject: [PATCH 3857/4235] Minor experimental startup optimizations Definitely premature optimization. --- core/core-os.el | 4 ++++ early-init.el | 3 +++ 2 files changed, 7 insertions(+) diff --git a/core/core-os.el b/core/core-os.el index 2bcc2fb91..52825051c 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -3,6 +3,10 @@ ;; clipboard (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) +;; fewer opts to process for systems that don't need them +(unless IS-MAC (setq command-line-ns-option-alist nil)) +(unless IS-LINUX (setq command-line-x-option-alist nil)) + ;; stop copying each visual state move to the clipboard: ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on ;; grokked from: http://stackoverflow.com/questions/15873346/elisp-rename-macro diff --git a/early-init.el b/early-init.el index d2eadd3c2..8365ba3a8 100644 --- a/early-init.el +++ b/early-init.el @@ -15,3 +15,6 @@ (add-to-list 'default-frame-alist '(tool-bar-lines . 0)) (add-to-list 'default-frame-alist '(menu-bar-lines . 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars)) + +;; One less file to load at startup +(setq site-run-file nil) From 1eb1933518cfec40e904eba6e6bbfd09b15079cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 03:55:15 -0500 Subject: [PATCH 3858/4235] Don't let packages modify command-switch-alist From their autoloads. --- core/core.el | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index 98da9abbb..f48a04487 100644 --- a/core/core.el +++ b/core/core.el @@ -431,10 +431,11 @@ to least)." ;; autoloads file and caches `load-path', `auto-mode-alist', ;; `Info-directory-list', `doom-disabled-packages' and ;; `package-activated-list'. A big reduction in startup time. - (unless (or force-p - (doom-initialize-autoloads doom-package-autoload-file) - noninteractive) - (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) + (let (command-switch-alist) + (unless (or force-p + (doom-initialize-autoloads doom-package-autoload-file) + noninteractive) + (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them")))) (require 'core-os) (when (or force-load-core-p (not noninteractive)) From ec0fe7808eb57655158bad88405f4e5abfb5d0eb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 12:38:15 -0500 Subject: [PATCH 3859/4235] Don't hardcode :weight bold into org-todo keywords It would undermine any attempt by users to disable bold fonts. --- modules/lang/org/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c5a43719f..0f42dae48 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -276,10 +276,10 @@ unfold to point on startup." (sequence "TODO(T)" "|" "DONE(D)") (sequence "NEXT(n)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)")) org-todo-keyword-faces - '(("[-]" :inherit font-lock-constant-face :weight bold) - ("[?]" :inherit warning :weight bold) - ("WAITING" :inherit default :weight bold) - ("LATER" :inherit warning :weight bold)) + '(("[-]" :inherit (font-lock-constant-face bold)) + ("[?]" :inherit (warning bold)) + ("WAITING" :inherit bold) + ("LATER" :inherit (warning bold))) org-use-sub-superscripts '{} ;; Scale up LaTeX previews a bit (default is too small) From 9f1a0ee81e13457f07e549de133cb335c2fd56d8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 12:48:08 -0500 Subject: [PATCH 3860/4235] ui/doom: remove mixed-pitch-mode compat hack Made obsolete by changes upstream in solaire-mode. --- modules/ui/doom/config.el | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 59edd4386..e5f4f8c51 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -73,13 +73,4 @@ (add-hook! '(minibuffer-setup-hook window-configuration-change-hook) #'+doom|disable-fringes-in-minibuffer) - (solaire-global-mode +1) - - ;; Fix incompatibility with the mixed-pitch package which causes all buffers - ;; to be affected (by `mixed-pitch-mode') - (defun +doom*fix-mixed-pitch-mode (&optional arg) - (when (and mixed-pitch-mode (not arg)) - (mixed-pitch-mode -1)) - (solaire-mode -1) - (turn-on-solaire-mode)) - (advice-add #'mixed-pitch-mode :before #'+doom*fix-mixed-pitch-mode)) + (solaire-global-mode +1)) From cc1aad8f2e48ff5a25ba19573c046fd4170e583b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 13:05:13 -0500 Subject: [PATCH 3861/4235] ui/modeline: fix mixed up autodef aliases --- modules/ui/modeline/autoload.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ui/modeline/autoload.el b/modules/ui/modeline/autoload.el index 9994e6f8a..8376936a9 100644 --- a/modules/ui/modeline/autoload.el +++ b/modules/ui/modeline/autoload.el @@ -1,13 +1,13 @@ ;;; ui/modeline/autoload/modeline.el -*- lexical-binding: t; -*- ;;;###autodef -(defalias 'def-modeline-format! 'doom-modeline-def-segment) +(defalias 'def-modeline-format! #'doom-modeline-def-modeline) ;;;###autodef -(defalias 'def-modeline-segment! 'doom-modeline-def-modeline) +(defalias 'def-modeline-segment! #'doom-modeline-def-segment) ;;;###autodef -(defalias 'set-modeline! 'doom-modeline-set-modeline) +(defalias 'set-modeline! #'doom-modeline-set-modeline) (defvar +modeline--old-bar-height nil) From c07f43bba349f275261d9fc7e274a1fac86ddafc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 2 Mar 2019 13:49:39 -0500 Subject: [PATCH 3862/4235] Remove --group-directories-first arg for bsd ls --- modules/emacs/dired/config.el | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index eb5eb76fb..55be920e9 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -17,17 +17,18 @@ image-dired-temp-image-file (concat image-dired-dir "temp-image") image-dired-temp-rotate-image-file (concat image-dired-dir "temp-rotate-image")) :config - (setq dired-listing-switches "-aBhl --group-directories-first") - - (when IS-BSD - ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq - ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning - ;; when not using GNU ls. We must look for `gls' after - ;; `exec-path-from-shell' was initialized to make sure that `gls' is in - ;; `exec-path' - (if-let* ((gls (executable-find "gls"))) - (setq insert-directory-program gls) - (message "Cannot find `gls` (GNU ls). Install coreutils via your system package manager"))) + (let ((args (list "-aBhl" "--group-directories-first"))) + (when IS-BSD + ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq + ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning + ;; when not using GNU ls. We must look for `gls' after + ;; `exec-path-from-shell' was initialized to make sure that `gls' is in + ;; `exec-path' + (if-let* ((gls (executable-find "gls"))) + (setq insert-directory-program gls) + (setq args (delete "--group-directories-first" args)) + (message "Cannot find `gls` (GNU ls). Install coreutils via your system package manager"))) + (setq dired-listing-switches (string-join args " "))) (defun +dired|sort-directories-first () "List directories first in dired buffers." From 78b4c784a6535e6c2adf252838a9dbf2b2522d08 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Mar 2019 01:26:30 -0500 Subject: [PATCH 3863/4235] Remap describe-symbol -> helpful-symbol --- core/core-editor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 740281c20..f05bb613a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -287,7 +287,8 @@ savehist file." (global-set-key [remap describe-function] #'helpful-callable) (global-set-key [remap describe-command] #'helpful-command) (global-set-key [remap describe-variable] #'helpful-variable) - (global-set-key [remap describe-key] #'helpful-key)) + (global-set-key [remap describe-key] #'helpful-key) + (global-set-key [remap describe-symbol] #'helpful-symbol)) (def-package! ws-butler From 66d23e39bb13e2f658f40eaab2faba35d5f1625a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Mar 2019 02:17:42 -0500 Subject: [PATCH 3864/4235] Fix doom/move-this-file not opening renamed file --- core/autoload/files.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/files.el b/core/autoload/files.el index 571863987..89a6d1128 100644 --- a/core/autoload/files.el +++ b/core/autoload/files.el @@ -184,9 +184,9 @@ file if it exists, without confirmation." (when (file-exists-p old-path) (delete-file old-path)) (kill-this-buffer) - (find-file new-path) (doom--forget-file old-path new-path) (doom--update-file new-path) + (find-file new-path) (message "File successfully moved to %s" dest)))) (`overwrite-self (error "Cannot overwrite self")) (`aborted (message "Aborted")) From 3873ab387577477bbecb699c8587ec3d89b414f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Mar 2019 02:18:02 -0500 Subject: [PATCH 3865/4235] lang/latex: use +latex-bibtex-file --- modules/lang/latex/+ref.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/lang/latex/+ref.el b/modules/lang/latex/+ref.el index 11deac57e..321337ef7 100644 --- a/modules/lang/latex/+ref.el +++ b/modules/lang/latex/+ref.el @@ -1,5 +1,10 @@ ;;; lang/latex/+ref.el -*- lexical-binding: t; -*- +(when (stringp +latex-bibtex-file) + (setq bibtex-completion-bibliography (list (expand-file-name +latex-bibtex-file)) + reftex-default-bibliography bibtex-completion-bibliography)) + + (def-package! reftex :hook (LaTeX-mode . reftex-mode) :config From 2e4feed1a47976dfb112e4cdba53091370190367 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Mar 2019 21:55:24 -0500 Subject: [PATCH 3866/4235] bin/doom: alias -h/--help to help command --- bin/doom | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index 7b8780f7a..92b66bd26 100755 --- a/bin/doom +++ b/bin/doom @@ -30,6 +30,7 @@ " doom run -p ~/.other.doom.d -e ~/.other.emacs.d -nw file.txt\n" "\n" (format! (bold "Options:\n")) + " -h --help\t\tSame as help command\n" " -d --debug\t\tTurns on doom-debug-mode (and debug-on-error)\n" " -e --emacsd DIR\tUse the emacs config at DIR (e.g. ~/.emacs.d)\n" " -i --insecure\t\tDisable TLS/SSL validation (not recommended)\n" @@ -46,7 +47,7 @@ (while (ignore-errors (string-prefix-p "-" (car args))) (pcase (pop args) ((or "-h" "--help") - (error "Did you mean 'doom help'?")) + (push "help" args)) ((or "-d" "--debug") (setenv "DEBUG" "1") (message "Debug mode on")) From 12ddc3c360c877a1def77856b246436f1f906f1c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 3 Mar 2019 21:58:32 -0500 Subject: [PATCH 3867/4235] ui/modeline: add indent segment --- modules/tools/editorconfig/config.el | 2 +- modules/ui/modeline/config.el | 29 +++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index 6c74a7a1d..b1d18a55f 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -56,7 +56,7 @@ extension, try to guess one." specified by editorconfig." (when (or (gethash 'indent_style props) (gethash 'indent_size props)) - (setq doom-inhibit-indent-detection t))) + (setq doom-inhibit-indent-detection 'editorconfig))) (add-hook 'editorconfig-after-apply-functions #'+editorconfig|disable-indent-detection) ;; Editorconfig makes indentation too rigid in Lisp modes, so tell diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 121221daa..0d93d0e5e 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -28,10 +28,37 @@ (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) + ;; Show indentation style in modeline. I'm not using + ;; `doom-modeline-def-segment' to prevent eager macro expansion from loading + ;; the package too soon. + (defun +modeline-indent-segment () + "indent modeline segment" + (propertize (format "%s%d" + (if indent-tabs-mode "⭾" "␣") + tab-width) + 'mouse-face 'mode-line-highlight + 'help-echo + (mapconcat #'identity + (list (format "Indentation style: %s (%d wide)" + (if indent-tabs-mode "tabs" "spaces") + tab-width) + (if (eq doom-inhibit-indent-detection 'editorconfig) + (propertize "✓ Editorconfig applied" 'face 'success) + (propertize "✘ Indentation auto-detection disabled" 'face 'warning)) + (when (bound-and-true-p ws-butler-mode) + (propertize "✓ ws-butler active (whitespace cleanup on save)" + 'face 'success)) + (when (bound-and-true-p dtrt-indent-original-indent) + (propertize (format "✓ Indentation auto-detected (original: %s)" + dtrt-indent-original-indent) + 'face 'success))) + " "))) + (add-to-list 'doom-modeline-fn-alist '(indent . +modeline-indent-segment)) + ;; Remove unused segments & extra padding (doom-modeline-def-modeline 'main '(bar matches buffer-info remote-host buffer-position selection-info) - '(misc-info persp-name irc mu4e github debug input-method buffer-encoding lsp major-mode process vcs checker)) + '(misc-info persp-name irc mu4e github debug indent input-method buffer-encoding lsp major-mode process vcs checker)) (doom-modeline-def-modeline 'special '(bar matches buffer-info-simple buffer-position selection-info) From 0534d85c5489688a1ca3bfb86d4a1119ccf3293b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 02:12:53 -0500 Subject: [PATCH 3868/4235] ui/treemacs: refactor Treemacs enables treemacs-filewatch-mode and treemacs-git-mode itself. Also removes settings that are the same as the defaults. --- modules/ui/treemacs/config.el | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 176100df7..d71b1136b 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -1,19 +1,16 @@ ;;; ui/treemacs/config.el -*- lexical-binding: t; -*- (setq treemacs-follow-after-init t - treemacs-width 35 - treemacs-position 'left treemacs-is-never-other-window t - treemacs-silent-refresh nil - treemacs-indentation 2 - treemacs-sorting 'alphabetic-desc - treemacs-show-hidden-files t - treemacs-goto-tag-strategy 'refetch-index - treemacs-display-in-side-window t + treemacs-sorting 'alphabetic-case-insensitive-desc treemacs-persist-file (concat doom-cache-dir "treemacs-persist")) (after! treemacs-persistence - (setq treemacs--last-error-persist-file (concat doom-cache-dir "treemacs-persist-at-last-error"))) + ;; This variable is defined with defconst, so we must wait to change it until + ;; it has loaded. + (setq treemacs--last-error-persist-file + (concat doom-cache-dir + "treemacs-persist-at-last-error"))) (after! treemacs @@ -23,29 +20,13 @@ :quit nil :ttl 0) - (defvar +treemacs-use-git-mode - (pcase (cons (not (null (executable-find "git"))) - (not (null (executable-find "python3")))) - (`(t . t) 'extended) - (`(t) 'simple)) - "Type of git integration for `treemacs-git-mode'. -There are 2 possible values: -1) simple, which highlights only files based on their git status, and is - slightly faster -2) extended, which highlights both files and directories, but requires python") - - (defvar treemacs-collapse-dirs - (if (executable-find "python3") 3 0)) - (defun +treemacs|improve-hl-line-contrast () "`hl-line' doesn't stand out enough in some themes." (face-remap-add-relative 'hl-line 'region)) (add-hook 'treemacs-mode-hook #'+treemacs|improve-hl-line-contrast) + ;; Don't follow the cursor (treemacs-follow-mode -1) - (treemacs-filewatch-mode t) - (when (memq +treemacs-use-git-mode '(simple extended)) - (treemacs-git-mode +treemacs-use-git-mode)) (after! ace-window (setq aw-ignored-buffers (delq 'treemacs-mode aw-ignored-buffers)))) From 7097739994db11db39c65e8fd7da57d617ee71c2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 04:45:18 -0500 Subject: [PATCH 3869/4235] ui/vc-gutter: remove commented diff-hl config --- modules/ui/vc-gutter/config.el | 67 -------------------------------- modules/ui/vc-gutter/packages.el | 1 - 2 files changed, 68 deletions(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index 9ee858511..f425dbf56 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -80,70 +80,3 @@ to the right fringe.") ;; A non-descript, left-pointing arrow (define-fringe-bitmap 'flycheck-fringe-bitmap-double-arrow [16 48 112 240 112 48 16] nil nil 'center)))) - - -;; (def-package! diff-hl -;; :defer t -;; :init -;; (defun +vc-gutter|init () -;; "Start `diff-hl-mode' if in a file-visiting and tracked buffer." -;; (when (and buffer-file-name -;; (vc-state buffer-file-name) -;; (or +vc-gutter-in-remote-files -;; (not (file-remote-p buffer-file-name)))) -;; (diff-hl-mode +1))) -;; (add-hook! (text-mode prog-mode conf-mode after-save) -;; #'+vc-gutter|init) -;; ;; standardize fringe size -;; (if (fboundp 'fringe-mode) (fringe-mode '4)) -;; :config -;; (setq vc-git-diff-switches '("--histogram")) -;; ;; Update diffs when it makes sense too, without being too slow -;; (if (not +vc-gutter-diff-unsaved-buffer) -;; (add-hook! '(doom-escape-hook focus-in-hook) #'diff-hl-update) -;; (diff-hl-flydiff-mode +1) -;; (add-hook! '(doom-escape-hook focus-in-hook) #'diff-hl-flydiff-update) -;; (when (featurep! :feature evil) -;; (when diff-hl-flydiff-timer -;; (cancel-timer diff-hl-flydiff-timer)) -;; (add-hook 'evil-insert-state-exit-hook #'diff-hl-flydiff-update))) -;; ;; Don't delete the current hunk's indicators while we're editing -;; (advice-remove #'diff-hl-overlay-modified #'ignore) -;; ;; Update diff-hl when magit refreshes -;; (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh) -;; ;; update git-gutter when using these commands -;; (advice-add #'magit-stage :after #'+version-control|update-git-gutter) -;; (advice-add #'magit-unstage :after #'+version-control|update-git-gutter) -;; (advice-add #'magit-stage-file :after #'+version-control|update-git-gutter) -;; (advice-add #'magit-unstage-file :after #'+version-control|update-git-gutter) -;; ;; Draw me like one of your French editors -;; (setq-default fringes-outside-margins t) -;; (cond ((or +vc-gutter-in-margin (not (display-graphic-p))) -;; (diff-hl-margin-mode) -;; (setq diff-hl-margin-symbols-alist -;; '((insert . "❙") (delete . "^") (change . "❙") -;; (unknown . "❙") (ignored . "❙")))) -;; (t -;; ;; Because diff-hl is in the left fringe -;; (setq flycheck-indication-mode 'right-fringe) -;; (defun +vc-gutter|setup-fringe-bitmaps () -;; "Define thin fringe bitmaps for maximum sexiness." -;; (define-fringe-bitmap 'diff-hl-bmp-top [224] nil nil '(center repeated)) -;; (define-fringe-bitmap 'diff-hl-bmp-middle [224] nil nil '(center repeated)) -;; (define-fringe-bitmap 'diff-hl-bmp-bottom [224] nil nil '(center repeated)) -;; (define-fringe-bitmap 'diff-hl-bmp-insert [224] nil nil '(center repeated)) -;; (define-fringe-bitmap 'diff-hl-bmp-single [224] nil nil '(center repeated)) -;; (define-fringe-bitmap 'diff-hl-bmp-delete [240 224 192 128] nil nil 'top)) -;; (defun +vc-gutter-type-at-pos (type _pos) -;; "Return the bitmap for `diff-hl' to use for change at point." -;; (pcase type -;; (`unknown 'question-mark) -;; (`delete 'diff-hl-bmp-delete) -;; (`change 'diff-hl-bmp-middle) -;; (`ignored 'diff-hl-bmp-i) -;; (x (intern (format "diff-hl-bmp-%s" x))))) -;; ;; Tweak the fringe bitmaps so we get long, elegant bars -;; (setq diff-hl-fringe-bmp-function #'+vc-gutter-type-at-pos -;; diff-hl-draw-borders nil) -;; (add-hook 'diff-hl-mode-hook #'+vc-gutter|setup-fringe-bitmaps)))) - diff --git a/modules/ui/vc-gutter/packages.el b/modules/ui/vc-gutter/packages.el index 921b14a94..a12b41b8f 100644 --- a/modules/ui/vc-gutter/packages.el +++ b/modules/ui/vc-gutter/packages.el @@ -2,4 +2,3 @@ ;;; ui/vc-gutter/packages.el (package! git-gutter-fringe) -;; (package! diff-hl) From 115d1990d49a6cc1df3158be1a89fb2af626b433 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 04:45:53 -0500 Subject: [PATCH 3870/4235] ui/treemacs: remove hl-line->region face remapping This causes more issues that solves. Perhaps something can be done upstream to make this line highlight brighter. Possibly addresses #957 --- modules/ui/treemacs/config.el | 5 ----- 1 file changed, 5 deletions(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index d71b1136b..1d90509c8 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -20,11 +20,6 @@ :quit nil :ttl 0) - (defun +treemacs|improve-hl-line-contrast () - "`hl-line' doesn't stand out enough in some themes." - (face-remap-add-relative 'hl-line 'region)) - (add-hook 'treemacs-mode-hook #'+treemacs|improve-hl-line-contrast) - ;; Don't follow the cursor (treemacs-follow-mode -1) From 99f65cba797395c59907ecb17ea2cc3db8e5ebbe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 04:46:40 -0500 Subject: [PATCH 3871/4235] Don't swap-bg for doom-molokai The lighter background should be used for file-visiting buffers, and darker for sidebars and such. --- modules/ui/doom/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index e5f4f8c51..333ebb516 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -3,7 +3,7 @@ (defvar +doom-solaire-themes '((doom-city-lights . t) (doom-dracula . t) - (doom-molokai . t) + (doom-molokai) (doom-nord . t) (doom-nord-light . t) (doom-nova) From f0ad9b75859157367bfec62b4c992c16cd289919 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 04:51:49 -0500 Subject: [PATCH 3872/4235] Ensure explicitly installed pkgs are user-selected --- core/autoload/packages.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 1e0e12756..52b11dc7a 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -362,6 +362,7 @@ example; the package name can be omitted)." (package-install name)) (if (not (package-installed-p name)) (doom--delete-package-files name) + (add-to-list 'package-selected-packages name nil 'eq) (setf (alist-get name doom-packages) plist) name))) From 0c891dc33e919fce554eb4a5c2d76962d6f0b009 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 04:55:31 -0500 Subject: [PATCH 3873/4235] lang/haskell: minor refactor & reformatting --- modules/lang/haskell/config.el | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/lang/haskell/config.el b/modules/lang/haskell/config.el index a62a64d87..6f8b016bd 100644 --- a/modules/lang/haskell/config.el +++ b/modules/lang/haskell/config.el @@ -4,21 +4,23 @@ ((featurep! +dante) (load! "+dante")) ((featurep! +lsp) (load! "+lsp"))) + ;; ;; Common packages (after! haskell-mode (setq haskell-process-suggest-remove-import-lines t ; warnings for redundant imports etc - haskell-process-auto-import-loaded-modules t) - (when (featurep! :tools flycheck) - (setq haskell-process-show-overlays nil)) ; flycheck makes this unnecessary - (add-hook! 'haskell-mode-hook - #'(haskell-collapse-mode ; support folding haskell code blocks - interactive-haskell-mode)) + haskell-process-auto-import-loaded-modules t + haskell-process-show-overlays (not (featurep! :tools flycheck))) ; redundant with flycheck + (set-lookup-handlers! 'haskell-mode :definition #'haskell-mode-jump-to-def-or-tag) (set-file-template! 'haskell-mode :trigger #'haskell-auto-insert-module-template :project t) (set-repl-handler! '(haskell-mode haskell-cabal-mode literate-haskell-mode) #'+haskell/open-repl) + (add-hook! 'haskell-mode-hook + #'(haskell-collapse-mode ; support folding haskell code blocks + interactive-haskell-mode)) + (add-to-list 'completion-ignored-extensions ".hi") (map! :localleader From b5dcfd96d37c65454827c5f12888390e9e88cbb0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 04:55:55 -0500 Subject: [PATCH 3874/4235] tools/flyspell: new flyspell-mode! autodef --- modules/tools/flyspell/autoload.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/tools/flyspell/autoload.el b/modules/tools/flyspell/autoload.el index be7e25e1c..4e6b162cf 100644 --- a/modules/tools/flyspell/autoload.el +++ b/modules/tools/flyspell/autoload.el @@ -1,5 +1,8 @@ ;;; tools/flyspell/autoload.el -*- lexical-binding: t; -*- +;;;###autodef +(defalias 'flyspell-mode! #'flyspell-mode) + (defvar +flyspell--predicate-alist nil "TODO") From d587d11653609127f676e4d4a44c879408ce4e1b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 11:57:14 -0500 Subject: [PATCH 3875/4235] Prevent false modified indicator in modeline Mentioned in seagle0128/doom-modeline#129 Remove advice when lewang/ws-butler#31 is merged --- modules/ui/modeline/config.el | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 0d93d0e5e..25dc9511d 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -66,7 +66,15 @@ (doom-modeline-def-modeline 'project '(bar buffer-default-directory) - '(misc-info mu4e github debug fancy-battery " " major-mode))) + '(misc-info mu4e github debug fancy-battery " " major-mode)) + + ;; Some functions modify the buffer, causing the modeline to show a false + ;; modified state, so we try to force them to behave. + (defun +modeline*inhibit-modification-hooks (orig-fn &rest args) + (with-silent-modifications (apply orig-fn args))) + (advice-add #'ws-butler-after-save :around #'+modeline*inhibit-modification-hooks) + (add-hook 'evil-insert-state-exit-hook #'doom-modeline-update-buffer-file-name) + (add-hook 'evil-insert-state-exit-hook #'doom-modeline-update-buffer-file-state-icon)) ;; From b98f34d1fdc99e8e385d89ae94f84b8c5b113dde Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 14:07:34 -0500 Subject: [PATCH 3876/4235] Add :killb & doom/kill-buried-buffers Also fix reported killed-buffer count when invoking kill commands interactively. --- core/autoload/buffers.el | 42 +++++++++++++++++++++++-------- modules/feature/evil/+commands.el | 1 + 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 8daf0b908..f077ccb65 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -263,7 +263,12 @@ that belong to the current project." (unless project-p (delete-other-windows)) (switch-to-buffer (doom-fallback-buffer)) - (mapc #'kill-buffer (if project-p (doom-project-buffer-list) (doom-buffer-list)))) + (let ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list)))) + (mapc #'kill-buffer buffers) + (when (called-interactively-p 'interactive) + (message "Killed %s buffers" + (- (length buffers) + (length (cl-remove-if-not #'buffer-live-p buffers))))))) ;;;###autoload (defun doom/kill-other-buffers (&optional project-p) @@ -272,13 +277,14 @@ that belong to the current project." If PROJECT-P (universal argument), kill only buffers that belong to the current project." (interactive "P") - (let ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list))) - (current-buffer (current-buffer))) - (dolist (buf buffers) - (unless (eq buf current-buffer) - (doom-kill-buffer-and-windows buf))) + (let ((buffers + (delq (current-buffer) + (if project-p (doom-project-buffer-list) (doom-buffer-list))))) + (mapc #'doom-kill-buffer-and-windows buffers) (when (called-interactively-p 'interactive) - (message "Killed %s buffers" (length buffers))))) + (message "Killed %s buffers" + (- (length buffers) + (length (cl-remove-if-not #'buffer-live-p buffers))))))) ;;;###autoload (defun doom/kill-matching-buffers (pattern &optional project-p) @@ -289,7 +295,23 @@ project." (interactive (list (read-regexp "Buffer pattern: ") current-prefix-arg)) - (let* ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list))) - (n (doom-kill-matching-buffers pattern buffers))) + (let* ((buffers (if project-p (doom-project-buffer-list) (doom-buffer-list)))) + (doom-kill-matching-buffers pattern buffers) (when (called-interactively-p 'interactive) - (message "Killed %s buffers" n)))) + (message "Killed %d buffer(s)" + (- (length buffers) + (length (cl-remove-if-not #'buffer-live-p buffers))))))) + +;;;###autoload +(defun doom/kill-buried-buffers (&optional project-p) + "Kill buffers that are buried. + +If PROJECT-P (universal argument), only kill buried buffers belonging to the +current project." + (interactive "P") + (let ((buffers (doom-buried-buffers (if project-p (doom-project-buffer-list))))) + (mapc #'kill-buffer buffers) + (when (called-interactively-p 'interactive) + (message "Killed %d buffer(s)" + (- (length buffers) + (length (cl-remove-if-not #'buffer-live-p buffers))))))) diff --git a/modules/feature/evil/+commands.el b/modules/feature/evil/+commands.el index bb6f6a17a..72ed9c464 100644 --- a/modules/feature/evil/+commands.el +++ b/modules/feature/evil/+commands.el @@ -114,6 +114,7 @@ buffers." (evil-ex-define-cmd "k[ill]all" #'+evil:kill-all-buffers) (evil-ex-define-cmd "k[ill]m" #'+evil:kill-matching-buffers) (evil-ex-define-cmd "k[ill]o" #'doom/kill-other-buffers) +(evil-ex-define-cmd "k[ill]b" #'doom/kill-buried-buffers) (evil-ex-define-cmd "l[ast]" #'doom/popup-restore) (evil-ex-define-cmd "m[sg]" #'view-echo-area-messages) (evil-ex-define-cmd "pop[up]" #'doom/popup-this-buffer) From 1a4db744e3be7f9dd0da02fa6d0a721c94860caa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 14:08:25 -0500 Subject: [PATCH 3877/4235] Half-revert d587d116 The evil-insert-state hooks were added upstream in doom-modeline. --- modules/ui/modeline/config.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 25dc9511d..6039006c7 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -72,9 +72,7 @@ ;; modified state, so we try to force them to behave. (defun +modeline*inhibit-modification-hooks (orig-fn &rest args) (with-silent-modifications (apply orig-fn args))) - (advice-add #'ws-butler-after-save :around #'+modeline*inhibit-modification-hooks) - (add-hook 'evil-insert-state-exit-hook #'doom-modeline-update-buffer-file-name) - (add-hook 'evil-insert-state-exit-hook #'doom-modeline-update-buffer-file-state-icon)) + (advice-add #'ws-butler-after-save :around #'+modeline*inhibit-modification-hooks)) ;; From 18017f74f1ed751f596f82c462a9f568e606132f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 14:23:12 -0500 Subject: [PATCH 3878/4235] feature/evil: update evil-embrace config - Add embrace support for ruby - Move helpers to autoloads file - Refactor anonymous hooks into functions --- modules/feature/evil/autoload/embrace.el | 33 +++++++++++++++++++ modules/feature/evil/config.el | 41 +++++------------------- 2 files changed, 41 insertions(+), 33 deletions(-) create mode 100644 modules/feature/evil/autoload/embrace.el diff --git a/modules/feature/evil/autoload/embrace.el b/modules/feature/evil/autoload/embrace.el new file mode 100644 index 000000000..82737b825 --- /dev/null +++ b/modules/feature/evil/autoload/embrace.el @@ -0,0 +1,33 @@ +;;; feature/evil/autoload/embrace.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +evil--embrace-get-pair (char) + (if-let* ((pair (cdr-safe (assoc (string-to-char char) evil-surround-pairs-alist)))) + pair + (if-let* ((pair (assoc-default char embrace--pairs-list))) + (if-let* ((real-pair (and (functionp (embrace-pair-struct-read-function pair)) + (funcall (embrace-pair-struct-read-function pair))))) + real-pair + (cons (embrace-pair-struct-left pair) (embrace-pair-struct-right pair))) + (cons char char)))) + +;;;###autoload +(defun +evil--embrace-escaped () + "Backslash-escaped surround character support for embrace." + (let ((char (read-char "\\"))) + (if (eq char 27) + (cons "" "") + (let ((pair (+evil--embrace-get-pair (string char))) + (text (if (sp-point-in-string) "\\\\%s" "\\%s"))) + (cons (format text (car pair)) + (format text (cdr pair))))))) + +;;;###autoload +(defun +evil--embrace-latex () + "LaTeX command support for embrace." + (cons (format "\\%s{" (read-string "\\")) "}")) + +;;;###autoload +(defun +evil--embrace-elisp-fn () + "Elisp function support for embrace." + (cons (format "(%s " (or (read-string "(") "")) ")")) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 33a6c8820..d8fea29b5 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -187,46 +187,21 @@ line with a linewise comment.") :commands (embrace-add-pair embrace-add-pair-regexp) :hook (LaTeX-mode . embrace-LaTeX-mode-hook) :hook (org-mode . embrace-org-mode-hook) + :hook ((ruby-mode enh-ruby-mode) . embrace-ruby-mode-hook) + :hook (emacs-lisp-mode . embrace-emacs-lisp-mode-hook) + :hook ((emacs-lisp-mode lisp-mode) . +evil|embrace-lisp-mode-hook) + :hook ((org-mode LaTeX-mode) . +evil|embrace-latex-mode-hook) :init - ;; Add extra pairs - (add-hook! emacs-lisp-mode - (embrace-add-pair ?\` "`" "'")) - (add-hook! (emacs-lisp-mode lisp-mode) - (embrace-add-pair-regexp ?f "([^ ]+ " ")" #'+evil--embrace-elisp-fn)) - (add-hook! (org-mode LaTeX-mode) - (embrace-add-pair-regexp ?l "\\[a-z]+{" "}" #'+evil--embrace-latex)) (after! evil-surround (evil-embrace-enable-evil-surround-integration)) :config (setq evil-embrace-show-help-p nil) - (defun +evil--embrace-get-pair (char) - (if-let* ((pair (cdr-safe (assoc (string-to-char char) evil-surround-pairs-alist)))) - pair - (if-let* ((pair (assoc-default char embrace--pairs-list))) - (if-let* ((real-pair (and (functionp (embrace-pair-struct-read-function pair)) - (funcall (embrace-pair-struct-read-function pair))))) - real-pair - (cons (embrace-pair-struct-left pair) (embrace-pair-struct-right pair))) - (cons char char)))) + (defun +evil|embrace-latex-mode-hook () + (embrace-add-pair-regexp ?l "\\[a-z]+{" "}" #'+evil--embrace-latex)) - (defun +evil--embrace-escaped () - "Backslash-escaped surround character support for embrace." - (let ((char (read-char "\\"))) - (if (eq char 27) - (cons "" "") - (let ((pair (+evil--embrace-get-pair (string char))) - (text (if (sp-point-in-string) "\\\\%s" "\\%s"))) - (cons (format text (car pair)) - (format text (cdr pair))))))) - - (defun +evil--embrace-latex () - "LaTeX command support for embrace." - (cons (format "\\%s{" (read-string "\\")) "}")) - - (defun +evil--embrace-elisp-fn () - "Elisp function support for embrace." - (cons (format "(%s " (or (read-string "(") "")) ")")) + (defun +evil|embrace-lisp-mode-hook () + (embrace-add-pair-regexp ?f "([^ ]+ " ")" #'+evil--embrace-elisp-fn)) ;; Add escaped-sequence support to embrace (setf (alist-get ?\\ (default-value 'embrace--pairs-list)) From 9266239a2f53cbd2c12abb0c4bf2a9b6cab3753e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 17:41:14 -0500 Subject: [PATCH 3879/4235] ui/modeline: correct & refactor indent segment Incorrectly displayed "auto-detection disabled" when it wasn't. --- modules/ui/modeline/config.el | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 6039006c7..3d15cf08d 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -38,21 +38,22 @@ tab-width) 'mouse-face 'mode-line-highlight 'help-echo - (mapconcat #'identity - (list (format "Indentation style: %s (%d wide)" - (if indent-tabs-mode "tabs" "spaces") - tab-width) - (if (eq doom-inhibit-indent-detection 'editorconfig) - (propertize "✓ Editorconfig applied" 'face 'success) - (propertize "✘ Indentation auto-detection disabled" 'face 'warning)) - (when (bound-and-true-p ws-butler-mode) - (propertize "✓ ws-butler active (whitespace cleanup on save)" - 'face 'success)) - (when (bound-and-true-p dtrt-indent-original-indent) - (propertize (format "✓ Indentation auto-detected (original: %s)" - dtrt-indent-original-indent) - 'face 'success))) - " "))) + (let ((subsegs + (list (format "Indentation style: %s (%d wide)" + (if indent-tabs-mode "tabs" "spaces") + tab-width) + (cond ((eq doom-inhibit-indent-detection 'editorconfig) + (propertize "✓ Editorconfig applied" 'face 'success)) + (doom-inhibit-indent-detection + (propertize "✘ Indentation auto-detection disabled" 'face 'warning)) + ((bound-and-true-p dtrt-indent-original-indent) + (propertize (format "✓ Indentation auto-detected (original: %s)" + dtrt-indent-original-indent) + 'face 'success))) + (when (bound-and-true-p ws-butler-mode) + (propertize "✓ ws-butler active (whitespace cleanup on save)" + 'face 'success))))) + (string-join (delq nil subsegs) " ")))) (add-to-list 'doom-modeline-fn-alist '(indent . +modeline-indent-segment)) ;; Remove unused segments & extra padding From f6cc2644b0431984111be254e6892dc918858e43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 18:38:25 -0500 Subject: [PATCH 3880/4235] New doom-log macro for debug-time logging doom-log won't interfere with the minibuffer if it's in use, and will report the originating module. Addresses #1215 --- core/autoload/packages.el | 3 +-- core/core-lib.el | 16 ++++++++++++++++ core/core-modules.el | 3 +-- core/core.el | 19 +++++++++---------- modules/editor/format/autoload/settings.el | 9 +++------ modules/feature/evil/+everywhere.el | 3 +-- modules/feature/lookup/autoload/lookup.el | 1 + 7 files changed, 32 insertions(+), 22 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 52b11dc7a..cde86e3f4 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -262,8 +262,7 @@ Used by `doom-packages-update'." ;; asynchronously. (let (futures) (dolist (pkg quelpa-pkgs) - (when doom-debug-mode - (message "New thread for: %s" pkg)) + (doom-log "New thread for: %s" pkg) (push (async-start `(lambda () (let ((gc-cons-threshold ,doom-gc-cons-upper-limit) diff --git a/core/core-lib.el b/core/core-lib.el index 90431d559..76380808c 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -102,6 +102,22 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (cl-check-type :test keyword) (substring (symbol-name keyword) 1)) +(defmacro doom-log (format-string &rest args) + "Log to *Messages* if `doom-debug-mode' is on. +Does not interrupt the minibuffer if it is in use, but still logs to *Messages*. +Accepts the same arguments as `message'." + (when doom-debug-mode + `(let ((inhibit-message (active-minibuffer-window))) + (message + ,(concat (propertize "DOOM " 'face 'font-lock-comment-face) + format-string + (when doom--current-module + (propertize (format " [%s/%s]" + (doom-keyword-name (car doom--current-module)) + (cdr doom--current-module)) + 'face 'warning))) + ,@args)))) + (defun FILE! () "Return the emacs lisp file this macro is called from." (cond ((bound-and-true-p byte-compile-current-file)) diff --git a/core/core-modules.el b/core/core-modules.el index 34997dd7d..5a4bbeae1 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -250,8 +250,7 @@ non-nil, return paths of possible modules, activated or otherwise." (use-package-concat `((fset ',fn (lambda (&rest _) - (when doom-debug-mode - (message "Loading deferred package %s from %s" ',name ',fn)) + (doom-log "Loading deferred package %s from %s" ',name ',fn) (condition-case e (require ',name) ((debug error) (message "Failed to load deferred package %s: %s" ',name e))) diff --git a/core/core.el b/core/core.el index f48a04487..005c650ce 100644 --- a/core/core.el +++ b/core/core.el @@ -264,7 +264,7 @@ If you want to disable incremental loading altogether, either remove Set this to nil to disable incremental loading.") -(defvar doom-incremental-idle-timer 1 +(defvar doom-incremental-idle-timer 1.5 "How long (in idle seconds) in between incrementally loading packages.") (defun doom-load-packages-incrementally (packages &optional now) @@ -280,17 +280,17 @@ intervals." (let* ((reqs (cl-delete-if #'featurep packages)) (req (ignore-errors (pop reqs)))) (when req - (when doom-debug-mode - (message "Incrementally loading %s" req)) + (doom-log "Incrementally loading %s" req) (condition-case e (require req nil t) - (error + ((error debug) (message "Failed to load '%s' package incrementally, because: %s" req e))) - (when reqs - (run-with-idle-timer doom-incremental-idle-timer - nil #'doom-load-packages-incrementally - reqs t)))))))) + (if reqs + (run-with-idle-timer doom-incremental-idle-timer + nil #'doom-load-packages-incrementally + reqs t) + (doom-log "Finished incremental loading")))))))) (defun doom|load-packages-incrementally () "Begin incrementally loading packages in `doom-incremental-packages'. @@ -314,8 +314,7 @@ If this is a daemon session, load them all immediately instead." issues easier. Meant to be used with `run-hook-wrapped'." - (when doom-debug-mode - (message "Running doom hook: %s" hook)) + (doom-log "Running doom hook: %s" hook) (condition-case e (funcall hook) ((debug error) diff --git a/modules/editor/format/autoload/settings.el b/modules/editor/format/autoload/settings.el index 31f0988b6..669a3f1a3 100644 --- a/modules/editor/format/autoload/settings.el +++ b/modules/editor/format/autoload/settings.el @@ -34,16 +34,14 @@ (insert input) (condition-case e (progn - (when doom-debug-mode - (message "formatter (commandp) %s" #',formatter)) + (doom-log "formatter (commandp) %s" #',formatter) (call-interactively #',formatter) (list nil "")) (error (list t (error-message-string e)))))))) (defun +format--make-function (formatter &rest _) `(progn - (when doom-debug-mode - (message "formatter (functionp) %s" #',formatter)) + (doom-log "formatter (functionp) %s" #',formatter) (format-all-buffer-thunk #',formatter))) (defun +format--make-shell-command (command ok-statuses error-regexp) @@ -66,8 +64,7 @@ ((stringp this) (push this subargs)))) (setq args (append subargs args))))))) - (when doom-debug-mode - (message "formatter (arglist) %s" args)) + (doom-log "formatter (arglist) %s" args) (if ,(and (or ok-statuses error-regexp) t) (apply #'format-all-buffer-hard ',ok-statuses ,error-regexp diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index d60bf722c..f52e31202 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -163,8 +163,7 @@ variable for an explanation of the defaults (in comments). See (defun +evil-collection-init (module) (unless (memq (or (car-safe module) module) +evil-collection-disabled-list) - (when doom-debug-mode - (message "Loaded evil-collection-%s" (or (car-safe module) module))) + (doom-log "Initialized evil-collection-%s" (or (car-safe module) module)) (with-demoted-errors "evil-collection error: %s" (evil-collection-init (list module))))) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index b2e2890db..a499ef112 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -108,6 +108,7 @@ Otherwise, these properties are available to be set: (xref-backend-identifier-at-point (xref-find-backend))))) (defun +lookup--run-hooks (hook identifier origin &optional other-window) + (doom-log "Looking up '%s' with '%s'" identifier hook) (condition-case-unless-debug e (if (get hook '+lookup-async) (progn From b054190820d0ed71add4d924568dce726c233f2b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 19:49:27 -0500 Subject: [PATCH 3881/4235] New doom/describe-packages command Replaces describe-packages and adds Doom module awareness to package documentation. --- core/autoload/help.el | 71 ++++++++++++++++++++++++ core/core-packages.el | 12 +++- modules/config/default/+evil-bindings.el | 1 + 3 files changed, 83 insertions(+), 1 deletion(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 5aee16ed1..e15463960 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -198,6 +198,77 @@ selection of all minor-modes, active or not." ((symbolp mode) mode) ((error "Expected a symbol/string, got a %s" (type-of mode)))))) +;;;###autoload +(global-set-key [remap describe-package] #'doom/describe-package) +;;;###autoload +(defun doom/describe-package (package) + "Like `describe-packages', but is Doom-aware. + +Includes information about where packages are defined and configured. + + If universal arg is set, only display packages that are installed/built-in +(excludes packages on MELPA/ELPA)." + (interactive + (list + (let* ((guess (or (function-called-at-point) + (symbol-at-point)))) + (require 'finder-inf nil t) + (require 'core-packages) + (doom-initialize-packages) + (let ((packages (append (mapcar #'car package-alist) + (unless current-prefix-arg + (mapcar #'car package-archive-contents)) + (mapcar #'car package--builtins)))) + (setq packages (sort packages #'string-lessp)) + (unless (memq guess packages) + (setq guess nil)) + (intern + (car + (split-string + (completing-read + (if guess + (format "Describe Doom package (default %s): " + guess) + "Describe Doom package: ") + (mapcar #'symbol-name packages) + nil t nil nil + (if guess (symbol-name guess))) " "))))))) + (describe-package package) + (with-current-buffer (help-buffer) + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (when (and (doom-package-installed-p package) + (re-search-forward "^ *Status: " nil t)) + (end-of-line) + (let ((indent (make-string (length (match-string 0)) ? ))) + (insert "\n" indent "Installed by the following Doom modules:\n") + (dolist (m (get package 'doom-module)) + (insert indent) + (insert-text-button + (string-trim (format " %s %s" (car m) (or (cdr m) ""))) + 'face 'link + 'follow-link t + 'action + `(lambda (_) + (let* ((category ,(car m)) + (module ',(cdr m)) + (dir (pcase category + (:core doom-core-dir) + (:private doom-private-dir) + (_ (doom-module-path category module))))) + (unless (file-directory-p dir) + (user-error "Module doesn't exist")) + (when (window-dedicated-p) + (other-window 1)) + (find-file dir)))) + (insert "\n")) + + (package--print-help-section "Source") + (pcase (doom-package-backend package) + (`elpa (insert "[M]ELPA")) + (`quelpa (insert (format "QUELPA %s" (prin1-to-string (doom-package-prop package :recipe))))) + (`emacs (insert "Built-in")))))))) + ;;;###autoload (defun doom/what-face (arg &optional pos) "Shows all faces and overlay faces at point. diff --git a/core/core-packages.el b/core/core-packages.el index 94908abc4..cedfd6b70 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -217,7 +217,17 @@ elsewhere." (macroexp-progn (append (if disable `((add-to-list 'doom-disabled-packages ',name nil #'eq))) (if pin `((setf (alist-get ',name package-pinned-packages) ,pin))) - `((setf (alist-get ',name doom-packages) ',plist) + `((let ((doom--current-module + (or doom--current-module + (let ((file (FILE!))) + (cond ((file-in-directory-p file doom-private-dir) + (cons :private (intern (file-name-base file)))) + ((file-in-directory-p file doom-core-dir) + (cons :core nil)))))) + (modules (get ',name 'doom-module))) + (cl-pushnew doom--current-module modules) + (put ',name 'doom-module modules)) + (setf (alist-get ',name doom-packages) ',plist) (not (memq ',name doom-disabled-packages))))))) (defmacro packages! (&rest packages) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index fd89702e1..a00bf4f56 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -684,6 +684,7 @@ :desc "Find library" "l" #'find-library :desc "View *Messages*" "m" #'view-echo-area-messages :desc "Toggle profiler" "p" #'doom/toggle-profiler + :desc "Describe package" "P" #'describe-package :desc "Reload theme" "r" #'doom/reload-theme :desc "Describe DOOM setting" "s" #'doom/describe-setters :desc "Describe variable" "v" #'describe-variable From 27822ef00642e881b1586f2ba16298c10e468eab Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 19:50:39 -0500 Subject: [PATCH 3882/4235] Change prefix arg behavior for +lookup/documentation Would formerly open documentation in "other window", but this doesn't make sense for this function (as it should always do this). Instead, it will be passed on to documentation handlers to do as they like with. --- modules/feature/lookup/autoload/lookup.el | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index a499ef112..038ff81b9 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -100,7 +100,8 @@ Otherwise, these properties are available to be set: provider)))) (defun +lookup--symbol-or-region (&optional initial) - (cond (initial) + (cond ((stringp initial) + initial) ((use-region-p) (buffer-substring-no-properties (region-beginning) (region-end))) @@ -117,12 +118,15 @@ Otherwise, these properties are available to be set: ;; reliably, so we set up the new window ahead of time. (switch-to-buffer-other-window (current-buffer)) (goto-char (marker-position origin))) - (call-interactively hook) + (if (commandp hook) + (call-interactively hook) + (funcall hook identifier)) t) (save-window-excursion (when (or (if (commandp hook) (call-interactively hook) (funcall hook identifier)) + (null origin) (/= (point-marker) origin)) (point-marker)))) ((error user-error) @@ -137,7 +141,9 @@ Otherwise, these properties are available to be set: :file '+lookup-file-functions) prop) '+lookup--run-hooks - identifier (point-marker) other-window))) + identifier + (point-marker) + other-window))) (cond ((null ret) (message "Could not find '%s'" identifier) nil) @@ -263,7 +269,7 @@ search otherwise." ((error "Couldn't find references of '%s'" identifier)))) ;;;###autoload -(defun +lookup/documentation (identifier &optional other-window) +(defun +lookup/documentation (identifier &optional arg) "Show documentation for IDENTIFIER (defaults to symbol at point or selection. First attempts the :documentation handler specified with `set-lookup-handlers!' @@ -272,9 +278,7 @@ for the current mode/buffer (if any), then falls back to the backends in (interactive (list (+lookup--symbol-or-region) current-prefix-arg)) - (cond ((null identifier) (user-error "Nothing under point")) - - ((+lookup--jump-to :documentation identifier other-window)) + (cond ((+lookup--jump-to :documentation identifier t)) ((user-error "Couldn't find documentation for '%s'" identifier)))) From c7aa41599d8f5ff1828d59535dc14433e2d2cfeb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 19:51:55 -0500 Subject: [PATCH 3883/4235] Add new emacs-lisp :documentation lookup handler Made to do-what-I-mean. Uses describe-symbol/helpful-symbol and falls back to apropos. --- modules/lang/emacs-lisp/autoload.el | 9 +++++++++ modules/lang/emacs-lisp/config.el | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 8368b6b53..0e9336490 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -122,3 +122,12 @@ library/userland functions" if (file-in-directory-p buffer-file-name dir) return t))) (flycheck-mode -1))) + +;;;###autoload +(defun +emacs-lisp-lookup-documentation (thing) + "Lookup THING with `helpful-symbol' if it's a symbol, apropos otherwise." + (cond ((not thing) + (call-interactively #'helpful-symbol)) + ((if-let* ((sym (intern-soft thing))) (helpful-symbol sym))) + ((apropos (format "^%s" thing))) + ((apropos thing)))) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index ff38736ec..f165d7ebd 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -18,7 +18,7 @@ (set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) (set-lookup-handlers! 'emacs-lisp-mode :definition #'elisp-def - :documentation #'info-lookup-symbol) + :documentation #'+emacs-lisp-lookup-documentation) (set-docsets! 'emacs-lisp-mode "Emacs Lisp") (set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") (set-rotate-patterns! 'emacs-lisp-mode From 96aa172071a7f82e673e1ef046b9e45eb1fd41a4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 19:52:56 -0500 Subject: [PATCH 3884/4235] Prevent overseer from being autoloading with elisp Now it'll only load when +emacs-lisp-ert-mode is active. --- modules/lang/emacs-lisp/config.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index f165d7ebd..189f44129 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -105,6 +105,7 @@ ;; `overseer' (autoload 'overseer-test "overseer" nil t) +(remove-hook 'emacs-lisp-mode-hook 'overseer-enable-mode) (def-package! flycheck-cask @@ -120,7 +121,8 @@ (def-project-mode! +emacs-lisp-ert-mode :modes (emacs-lisp-mode) - :match "/test[/-].+\\.el$") + :match "/test[/-].+\\.el$" + :add-hooks (overseer-enable-mode)) (associate! buttercup-minor-mode :modes (emacs-lisp-mode) From 843b29a4b5f96b47985a99aa60b84452eaac3416 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 19:54:03 -0500 Subject: [PATCH 3885/4235] Add node_modules to projectile ignored dirs --- modules/lang/javascript/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 524f5057a..e2980379d 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -54,6 +54,8 @@ (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/open-repl) + (add-to-list 'projectile-globally-ignored-directories "node_modules") + (map! :map js2-mode-map :localleader "S" #'+javascript/skewer-this-buffer)) From 05303c0fdb89da46d59252059f1fc4195794887f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 20:35:47 -0500 Subject: [PATCH 3886/4235] :boom: Rethink core hook order & naming - doom-post-init-hook was renamed doom-init-modules-hook - doom-init-hook was renamed doom-before-init-modules-hook - doom-init-modules-hook now runs before the user's config.el is run - Moved doom-init-ui-hook to run later (on window-setup-hook rather than emacs-startup-hook). Yield a modest improvement in startup times. --- core/core-modules.el | 11 +++++----- core/core-os.el | 2 +- core/core-ui.el | 33 ++++++++++++++++------------ core/core.el | 23 +++++++++---------- modules/feature/evil/config.el | 15 ++++++++----- modules/feature/workspaces/config.el | 2 +- modules/tools/wakatime/autoload.el | 2 +- modules/ui/modeline/config.el | 11 +++++----- modules/ui/unicode/autoload.el | 2 +- 9 files changed, 55 insertions(+), 46 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 5a4bbeae1..0b9c2cf83 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -51,19 +51,19 @@ non-nil." (doom--current-flags (plist-get plist :flags))) (load! "init" (plist-get plist :path) t))) doom-modules) - (run-hook-wrapped 'doom-init-hook #'doom-try-run-hook) + (run-hook-wrapped 'doom-before-init-modules-hook #'doom-try-run-hook) (unless noninteractive (maphash (lambda (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) (load! "config" (plist-get plist :path) t))) doom-modules) + (run-hook-wrapped 'doom-init-modules-hook #'doom-try-run-hook) (load! "config" doom-private-dir t) (unless custom-file (setq custom-file (concat doom-local-dir "custom.el"))) (when (stringp custom-file) - (load custom-file t t t)) - (run-hook-wrapped 'doom-post-init-hook #'doom-try-run-hook)))) + (load custom-file t t t))))) ;; @@ -294,12 +294,13 @@ The overall load order of Doom is as follows: ~/.emacs.d/core/core.el $DOOMDIR/init.el {$DOOMDIR,~/.emacs.d}/modules/*/*/init.el - `doom-init-hook' + `doom-before-init-modules-hook' {$DOOMDIR,~/.emacs.d}/modules/*/*/config.el + `doom-init-modules-hook' $DOOMDIR/config.el `after-init-hook' `emacs-startup-hook' - `doom-post-init-hook' (at end of `emacs-startup-hook') + `window-setup-hook' Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most diff --git a/core/core-os.el b/core/core-os.el index 52825051c..ff024fd6f 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -32,7 +32,7 @@ ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) (when (or (daemonp) (not (display-graphic-p))) - (add-hook 'doom-post-init-hook #'osx-clipboard-mode)) + (add-hook 'doom-init-modules-hook #'osx-clipboard-mode)) (when (or (daemonp) (display-graphic-p)) ;; Syncs ns frame parameters with theme (and fixes mismatching text diff --git a/core/core-ui.el b/core/core-ui.el index 1c8924ab2..416f51cd0 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -492,14 +492,13 @@ frame's window-system, the theme will be reloaded.") (condition-case e (progn (cond (doom-font - ;; We avoid `set-frame-font' for performance reasons. - ;; Manipulating `default-frame-alist' is effective enough. (add-to-list 'default-frame-alist (cons 'font (cond ((stringp doom-font) doom-font) ((fontp doom-font) (font-xlfd-name doom-font)) - ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))))) + ((signal 'wrong-type-argument (list '(fontp stringp) doom-font)))))) + (set-frame-font doom-font t t)) ((display-graphic-p) (setq doom-font (face-attribute 'default :font)))) (when doom-serif-font @@ -544,28 +543,34 @@ frame's window-system, the theme will be reloaded.") (setq doom-last-window-system nil) (doom|reload-theme-in-frame (selected-frame)))) -;; fonts -(add-hook 'doom-init-ui-hook #'doom|init-fonts) -;; themes -(unless (daemonp) - (add-hook 'doom-init-ui-hook #'doom|init-theme)) -(add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) -(add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) - ;; ;;; Bootstrap (defun doom|init-ui () "Initialize Doom's user interface by applying all its advice and hooks." + (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook) + (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil 'eq) (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil 'eq) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) - (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) + (add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) + (add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) + + ;; Set up `doom-enter-buffer-hook', `doom-exit-buffer-hook', + ;; `doom-enter-window-hook' and `doom-exit-window-hook' + (doom-init-switch-hooks)) + +;; Set fonts +(add-hook 'doom-init-ui-hook #'doom|init-fonts) +;; Apply themes +(unless (daemonp) + (add-hook 'doom-init-ui-hook #'doom|init-theme)) +;; Run `doom-load-theme-hook' (advice-add #'load-theme :after #'doom*load-theme-hooks) -(add-hook 'emacs-startup-hook #'doom|init-switch-hooks) -(add-hook 'emacs-startup-hook #'doom|init-ui) +;; Run `doom-init-ui-hook' +(add-hook 'window-setup-hook #'doom|init-ui) ;; diff --git a/core/core.el b/core/core.el index 005c650ce..9ec60a803 100644 --- a/core/core.el +++ b/core/core.el @@ -113,14 +113,13 @@ Doom was setup, which can cause problems.") ;; ;; Custom hooks -(defvar doom-init-hook nil - "Hooks run after all init.el files are loaded, including your private and all -module init.el files, but before their config.el files are loaded.") +(defvar doom-before-init-modules-hook nil + "A list of hooks to run before Doom's modules' config.el files are loaded, but +after their init.el files are loaded.") -(defvar doom-post-init-hook nil - "A list of hooks run when Doom is fully initialized. Fires near the end of -`emacs-startup-hook', as late as possible. Guaranteed to run after everything -else (except for `window-setup-hook').") +(defvar doom-init-modules-hook nil + "A list of hooks to run after Doom's modules' config.el files have loaded. +This includes the user's private module in `doom-private-dir'.") (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload' is called.") @@ -303,7 +302,7 @@ If this is a daemon session, load them all immediately instead." nil #'doom-load-packages-incrementally (cdr doom-incremental-packages) t)))) -(add-hook 'emacs-startup-hook #'doom|load-packages-incrementally) +(add-hook 'window-setup-hook #'doom|load-packages-incrementally) ;; @@ -399,12 +398,14 @@ The overall load order of Doom is as follows: ~/.emacs.d/core/core.el ~/.doom.d/init.el Module init.el files - `doom-init-hook' + `doom-before-init-modules-hook' Module config.el files ~/.doom.d/config.el - `doom-post-init-hook' + `doom-init-modules-hook' `after-init-hook' `emacs-startup-hook' + `doom-init-ui-hook' + `window-setup-hook' Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most @@ -438,7 +439,7 @@ to least)." (require 'core-os) (when (or force-load-core-p (not noninteractive)) - (add-hook 'emacs-startup-hook #'doom|display-benchmark) + (add-hook 'window-setup-hook #'doom|display-benchmark) (require 'core-ui) (require 'core-editor) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index d8fea29b5..13fff59ba 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -14,7 +14,9 @@ line with a linewise comment.") (defvar evil-want-Y-yank-to-eol t) (def-package! evil - :init + :hook (doom-init-modules . evil-mode) + :demand t + :preface (setq evil-want-visual-char-semi-exclusive t evil-magic t evil-echo-state t @@ -37,18 +39,16 @@ line with a linewise comment.") evil-want-keybinding (not (featurep! +everywhere))) :config - (load! "+commands") - - (add-hook 'doom-post-init-hook #'evil-mode) (evil-select-search-module 'evil-search-module 'evil-search) (put 'evil-define-key* 'lisp-indent-function 'defun) + ;; Done in a hook to ensure the popup rules load as late as possible (defun +evil|init-popup-rules () (set-popup-rules! '(("^\\*evil-registers" :size 0.3) ("^\\*Command Line" :size 8)))) - (add-hook 'doom-post-init-hook #'+evil|init-popup-rules) + (add-hook 'doom-init-modules-hook #'+evil|init-popup-rules) ;; Change the cursor color in emacs mode (defvar +evil--default-cursor-color @@ -157,7 +157,10 @@ line with a linewise comment.") ;; `evil-collection' (when (featurep! +everywhere) - (load! "+everywhere"))) + (load! "+everywhere")) + + ;; Custom evil ex commands + (load! "+commands")) ;; diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 7bc243468..cc261bfa0 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -77,7 +77,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (display-buffer-in-side-window warnings '((window-height . shrink-window-if-larger-than-buffer))))))))))) - (add-hook 'doom-post-init-hook #'+workspaces|init t) + (add-hook 'doom-init-modules-hook #'+workspaces|init t) :config (setq persp-autokill-buffer-on-remove 'kill-weak persp-nil-hidden t diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 4e9a81da7..73aaae385 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -7,7 +7,7 @@ "If non-nil, obfuscate files and only show what projects you're working on.") ;;;###autoload -(add-hook 'doom-post-init-hook #'+wakatime|delayed-autostart) +(add-hook 'doom-init-modules-hook #'+wakatime|delayed-autostart) ;;;###autoload (defun +wakatime/setup () diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 3d15cf08d..57ccbfff8 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -3,13 +3,13 @@ ;; TODO Add themes (default, minimal, spacemacs, etc) (def-package! doom-modeline - :hook (doom-post-init . doom-modeline-mode) - :preface + :hook (after-init . doom-modeline-mode) + :init ;; prevent flash of unstyled modeline at startup (setq-default mode-line-format nil) ;; We display project info in the modeline ourselves (setq projectile-dynamic-mode-line nil) - :init + ;; Set these early so they don't trigger variable watchers (setq doom-modeline-bar-width 3 doom-modeline-github nil doom-modeline-mu4e nil @@ -18,14 +18,13 @@ doom-modeline-minor-modes nil doom-modeline-major-mode-icon nil doom-modeline-buffer-file-name-style 'relative-from-project) - + :config (add-hook 'doom-modeline-mode-hook #'size-indication-mode) ; filesize in modeline (add-hook 'doom-modeline-mode-hook #'column-number-mode) ; cursor column in modeline - :config (add-hook 'doom-big-font-mode-hook #'+modeline|resize-for-big-font) - (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) + (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) ;; Show indentation style in modeline. I'm not using diff --git a/modules/ui/unicode/autoload.el b/modules/ui/unicode/autoload.el index 1af675c04..0be6bd27e 100644 --- a/modules/ui/unicode/autoload.el +++ b/modules/ui/unicode/autoload.el @@ -1,7 +1,7 @@ ;;; ui/unicode/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(add-hook 'doom-post-init-hook #'+unicode|init-fonts) +(add-hook 'doom-init-ui-hook #'+unicode|init-fonts) ;;;###autoload (defun +unicode|init-fonts () From f18e1c0ea16442efb84bc855344bc3f9eca08a56 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 20:37:55 -0500 Subject: [PATCH 3887/4235] Refactor switch {buffer,window} hooks --- core/core-ui.el | 19 +++++++------------ core/test/test-core.el | 4 ++-- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 416f51cd0..caec4a7ed 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -93,33 +93,28 @@ Do not set this directly.") (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks - (null window) + norecord (eq window (selected-window)) - (window-minibuffer-p) (window-minibuffer-p window)) (funcall orig-fn window norecord) (let ((doom-inhibit-switch-window-hooks t)) (run-hooks 'doom-exit-window-hook) (prog1 (funcall orig-fn window norecord) - (with-selected-window window - (run-hooks 'doom-enter-window-hook)))))) + (run-hooks 'doom-enter-window-hook))))) (defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) (if (or doom-inhibit-switch-buffer-hooks + (null buffer-or-name) + (if (eq orig-fn 'switch-to-buffer) (car args)) + (if (eq orig-fn 'pop-to-buffer) (nth 1 args)) (eq (get-buffer buffer-or-name) (current-buffer))) (apply orig-fn buffer-or-name args) (let ((doom-inhibit-switch-buffer-hooks t)) (run-hooks 'doom-exit-buffer-hook) (prog1 (apply orig-fn buffer-or-name args) - (when (buffer-live-p (get-buffer buffer-or-name)) - (with-current-buffer buffer-or-name - (run-hooks 'doom-enter-buffer-hook))))))) + (run-hooks 'doom-enter-buffer-hook))))) -(defun doom|init-switch-hooks (&optional disable) - "Set up enter/exit hooks for windows and buffers. - -See `doom-enter-buffer-hook', `doom-enter-window-hook', `doom-exit-buffer-hook' -and `doom-exit-window-hook'." +(defun doom-init-switch-hooks (&optional disable) (dolist (spec '((select-window . doom*switch-window-hooks) (switch-to-buffer . doom*switch-buffer-hooks) (display-buffer . doom*switch-buffer-hooks) diff --git a/core/test/test-core.el b/core/test/test-core.el index 068d9ff7f..ec920105e 100644 --- a/core/test/test-core.el +++ b/core/test/test-core.el @@ -63,9 +63,9 @@ b (get-buffer-create "b")) (spy-on 'before-hook) (spy-on 'after-hook) - (doom|init-switch-hooks)) + (doom-init-switch-hooks)) (after-each - (doom|init-switch-hooks 'disable) + (doom-init-switch-hooks 'disable) (kill-buffer a) (kill-buffer b)) From dd0d264a27432d4aa88f9bfb7e531b9e23434131 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 20:42:04 -0500 Subject: [PATCH 3888/4235] Refactor feature/evil - Defer evil-escape a little longer - Move advice to autoloads file Gotta go fast. --- modules/feature/evil/autoload/advice.el | 20 ++++++++++++++++++++ modules/feature/evil/config.el | 23 ++++------------------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/modules/feature/evil/autoload/advice.el b/modules/feature/evil/autoload/advice.el index f831c2608..ee16df71d 100644 --- a/modules/feature/evil/autoload/advice.el +++ b/modules/feature/evil/autoload/advice.el @@ -185,3 +185,23 @@ more information on modifiers." "Call `doom/escape' if `evil-force-normal-state' is called interactively." (when (called-interactively-p 'any) (call-interactively #'doom/escape))) + +;;;###autoload +(defun +evil*make-numbered-markers-global (orig-fn char) + (or (and (>= char ?2) (<= char ?9)) + (funcall orig-fn char))) + +;;;###autoload +(defun +evil*set-jump (orig-fn &rest args) + "Set a jump point and ensure ORIG-FN doesn't set any new jump points." + (evil-set-jump (if (markerp (car args)) (car args))) + (let ((evil--jumps-jumping t)) + (apply orig-fn args))) + +;;;###autoload +(defun +evil*fix-dabbrev-in-minibuffer () + "Make `try-expand-dabbrev' from `hippie-expand' work in minibuffer. See +`he-dabbrev-beg', so we need to redefine syntax for '/'." + (set-syntax-table (let* ((table (make-syntax-table))) + (modify-syntax-entry ?/ "." table) + table))) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 13fff59ba..d5974529b 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -102,12 +102,7 @@ line with a linewise comment.") ;; and one custom one: %:P (expand to the project root). (advice-add #'evil-ex-replace-special-filenames :override #'+evil*resolve-vim-path) - ;; make `try-expand-dabbrev' from `hippie-expand' work in minibuffer. See - ;; `he-dabbrev-beg', so we need to redefine syntax for '/' - (defun +evil*fix-dabbrev-in-minibuffer () - (set-syntax-table (let* ((table (make-syntax-table))) - (modify-syntax-entry ?/ "." table) - table))) + ;; make `try-expand-dabbrev' (from `hippie-expand') work in minibuffer (add-hook 'minibuffer-inactive-mode-hook #'+evil*fix-dabbrev-in-minibuffer) ;; Focus and recenter new splits @@ -115,19 +110,11 @@ line with a linewise comment.") (advice-add #'evil-window-vsplit :override #'+evil*window-vsplit) ;; Integrate evil's jump-list into some navigational commands - (defun +evil*set-jump (orig-fn &rest args) - "Set a jump point and ensure ORIG-FN doesn't set any new jump points." - (evil-set-jump (if (markerp (car args)) (car args))) - (let ((evil--jumps-jumping t)) - (apply orig-fn args))) (advice-add #'counsel-git-grep-action :around #'+evil*set-jump) (advice-add #'helm-ag--find-file-action :around #'+evil*set-jump) (advice-add #'xref-push-marker-stack :around #'+evil*set-jump) ;; In evil, registers 2-9 are buffer-local. In vim, they're global, so... - (defun +evil*make-numbered-markers-global (orig-fn char) - (or (and (>= char ?2) (<= char ?9)) - (funcall orig-fn char))) (advice-add #'evil-global-marker-p :around #'+evil*make-numbered-markers-global) ;; Make o/O continue comments (see `+evil-want-o/O-to-continue-comments') @@ -216,13 +203,13 @@ line with a linewise comment.") (def-package! evil-escape - :commands (evil-escape evil-escape-mode evil-escape-pre-command-hook) + :commands (evil-escape) + :after-call (evil-normal-state-exit-hook) :init (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) evil-escape-excluded-major-modes '(neotree-mode treemacs-mode term-mode) evil-escape-key-sequence "jk" evil-escape-delay 0.25) - (add-hook 'pre-command-hook #'evil-escape-pre-command-hook) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) :config ;; no `evil-escape' in minibuffer @@ -287,9 +274,7 @@ the new algorithm is confusing, like in python or ruby." :config (global-evil-surround-mode 1)) -;; Without `evil-visualstar', * and # grab the word at point and search, no -;; matter what mode you're in. I want to be able to visually select a region and -;; search for other occurrences of it. +;; Allows you to use the selection for * and # (def-package! evil-visualstar :commands (evil-visualstar/begin-search evil-visualstar/begin-search-forward From fbcb4e69730bfe35f4f3538ea83f30cff0ba6a98 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 20:44:35 -0500 Subject: [PATCH 3889/4235] Minor refactor across the board --- core/autoload/packages.el | 5 +++-- core/autoload/sessions.el | 3 +-- core/core-ui.el | 19 +++++++++---------- modules/config/default/+evil-bindings.el | 3 ++- modules/feature/snippets/config.el | 6 ++++-- modules/lang/latex/autoload.el | 5 ++--- modules/lang/latex/config.el | 7 +++---- 7 files changed, 24 insertions(+), 24 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index cde86e3f4..9b42497bc 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -40,8 +40,9 @@ ;;;###autoload (defun doom-package-backend (name &optional noerror) - "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." + "Get which backend the package NAME was installed with. Can either be elpa, +quelpa or emacs (built-in). Throws an error if NOERROR is nil and the package +isn't installed." (cl-check-type name symbol) (cond ((assq name quelpa-cache) 'quelpa) ((assq name package-alist) 'elpa) diff --git a/core/autoload/sessions.el b/core/autoload/sessions.el index 611e0096e..b617dedc5 100644 --- a/core/autoload/sessions.el +++ b/core/autoload/sessions.el @@ -34,8 +34,7 @@ ((and (require 'frameset nil t) (require 'restart-emacs nil t)) (restart-emacs--restore-frames-using-desktop file)) - ((error "No session backend to load session with"))) - (select-frame-set-input-focus (selected-frame))) + ((error "No session backend to load session with")))) ;;;###autoload (defun doom-session-file () diff --git a/core/core-ui.el b/core/core-ui.el index caec4a7ed..1134ecb33 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -51,6 +51,10 @@ Expects either a `font-spec', font object, a XFT font string or XLFD string. See It is recommended you don't set specify a font-size, as to inherit `doom-font's size.") +(defvar doom--prefer-theme-elc nil + "If non-nil, `load-theme' will prefer the compiled theme (unlike its default +behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") + ;; ;;; Custom hooks @@ -131,8 +135,8 @@ Do not set this directly.") (defun doom|protect-visible-buffer () "Don't kill the current buffer if it is visible in another window (bury it instead). Meant for `kill-buffer-query-functions'." - (not (and (delq (selected-window) (get-buffer-window-list nil nil t)) - (not (member (substring (buffer-name) 0 1) '(" " "*")))))) + (not (and (not (member (substring (buffer-name) 0 1) '(" " "*"))) + (delq (selected-window) (get-buffer-window-list nil nil t))))) (defun doom|protect-fallback-buffer () "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." @@ -164,10 +168,6 @@ read-only or not file-visiting." ;; ;;; General configuration -(defvar doom--prefer-theme-elc nil - "If non-nil, `load-theme' will prefer the compiled theme (unlike its default -behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") - (setq-default ansi-color-for-comint-mode t bidi-display-reordering nil ; disable bidirectional text for tiny performance boost @@ -305,9 +305,8 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") (def-package! winner ;; undo/redo changes to Emacs' window layout - :after-call doom-exit-window-hook - :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself - :config (winner-mode +1)) + :hook (doom-exit-window . winner-mode) + :preface (defvar winner-dont-bind-my-keys t)) ; I'll bind keys myself (def-package! paren @@ -471,7 +470,7 @@ character that looks like a space that `whitespace-mode' won't affect.") :defer t :config (setq nlinum-format " %d ") - (add-hook 'evil-mode #'nlinum-relative-setup-evil)) + (add-hook 'evil-mode-hook #'nlinum-relative-setup-evil)) ;; diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index a00bf4f56..46d736261 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -672,6 +672,7 @@ :desc "Command log" "L" #'global-command-log-mode :desc "Describe mode" "M" #'describe-mode :desc "Reload private config" "R" #'doom/reload + :desc "Describe symbol" "S" #'describe-symbol :desc "Print Doom version" "V" #'doom/version :desc "Apropos" "a" #'apropos :desc "Open Bug Report" "b" #'doom/open-bug-report @@ -679,7 +680,7 @@ :desc "Describe DOOM module" "d" #'doom/describe-module :desc "Describe function" "f" #'describe-function :desc "Emacs help map" "h" help-map - :desc "Info" "i" #'info-lookup-symbol + :desc "Lookup in manual" "i" #'info-lookup-symbol :desc "Describe key" "k" #'describe-key :desc "Find library" "l" #'find-library :desc "View *Messages*" "m" #'view-echo-area-messages diff --git a/modules/feature/snippets/config.el b/modules/feature/snippets/config.el index c2f47b2a6..50ce7fce7 100644 --- a/modules/feature/snippets/config.el +++ b/modules/feature/snippets/config.el @@ -21,13 +21,15 @@ :config (setq yas-verbosity (if doom-debug-mode 3 0) yas-also-auto-indent-first-line t - yas-triggers-in-field t) ; Allow nested snippets + yas-triggers-in-field t ; Allow nested snippets + ;; Remove default ~/.emacs.d/snippets + yas-snippet-dirs (delete yas--default-user-snippets-dir yas-snippet-dirs)) ;; Allow private snippets in DOOMDIR/snippets (add-to-list 'yas-snippet-dirs '+snippets-dir nil #'eq) ;; Remove GUI dropdown prompt (prefer ivy/helm) - (delq #'yas-dropdown-prompt yas-prompt-functions) + (setq yas-prompt-functions (delq 'yas-dropdown-prompt yas-prompt-functions)) ;; Prioritize private snippets in `+snippets-dir' over built-in ones if there ;; are multiple choices. (add-to-list 'yas-prompt-functions #'+snippets-prompt-private nil #'eq) diff --git a/modules/lang/latex/autoload.el b/modules/lang/latex/autoload.el index de168cdba..c63b7b6be 100644 --- a/modules/lang/latex/autoload.el +++ b/modules/lang/latex/autoload.el @@ -14,7 +14,7 @@ (let* ((offset LaTeX-indent-level) (contin (or (and (boundp '+latex-indent-level-item-continuation) +latex-indent-level-item-continuation) - (* 4 LaTeX-indent-level))) + (* 4 offset))) (re-beg "\\\\begin{") (re-end "\\\\end{") (re-env "\\(itemize\\|\\enumerate\\|description\\)") @@ -37,8 +37,7 @@ indent) ((looking-at "\\\\item") (+ offset indent)) - (t - (+ contin indent)))))) + ((+ contin indent)))))) ;;;###autoload (defun +latex-symbols-company-backend (command &optional arg &rest _ignored) diff --git a/modules/lang/latex/config.el b/modules/lang/latex/config.el index 5a1c9921a..82efbbecf 100644 --- a/modules/lang/latex/config.el +++ b/modules/lang/latex/config.el @@ -54,6 +54,8 @@ If no viewers are found, `latex-preview-pane' is used.") (add-hook 'TeX-mode-hook #'visual-line-mode) ;; Fold TeX macros (add-hook 'TeX-mode-hook #'TeX-fold-mode) + ;; Enable rainbow mode after applying styles to the buffer + (add-hook 'TeX-mode-hook #'rainbow-delimiters-mode) ;; display output of latex commands in popup (set-popup-rule! " output\\*$" :size 15) ;; Do not prompt for Master files, this allows auto-insert to add templates to @@ -63,10 +65,7 @@ If no viewers are found, `latex-preview-pane' is used.") (remove-hook 'find-file-hook (cl-find-if #'byte-code-function-p find-file-hook) 'local)) - ;; Enable rainbow mode after applying styles to the buffer - (add-hook 'TeX-update-style-hook #'rainbow-delimiters-mode) - (when (featurep! :tools flyspell) - (add-hook 'latex-mode-local-vars-hook #'flyspell-mode)) + (add-hook 'latex-mode-local-vars-hook #'flyspell-mode!) ;; All these excess pairs dramatically slow down typing in latex buffers, so ;; we remove them. Let snippets do their job. (after! smartparens-latex From 5bae67e2992bd15df8aae6da904d67e400d60f40 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 20:46:20 -0500 Subject: [PATCH 3890/4235] lang/python: remove +pyvenv flag The pyvenv package isn't going anywhere, it's just needed by pipenv.el (which surprisingly doesn't declare it as a dependency). --- modules/lang/python/config.el | 24 +++++++++++------------- modules/lang/python/packages.el | 3 +-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index a2f93456c..4da346a20 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -147,6 +147,17 @@ called.") (advice-add #'pipenv-deactivate :after-while #'+modeline|update-env-in-all-windows))) +(def-package! pyvenv + :after python + :config + (when (featurep! :ui modeline) + (add-hook 'pyvenv-post-activate-hooks #'+modeline|update-env-in-all-windows) + (add-hook 'pyvenv-post-deactivate-hooks #'+modeline|update-env-in-all-windows)) + (add-to-list 'global-mode-string + '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) + 'append)) + + (def-package! pyenv-mode :when (featurep! +pyenv) :after python @@ -159,19 +170,6 @@ called.") (advice-add #'pyenv-mode-unset :after #'+modeline|update-env-in-all-windows))) -(def-package! pyvenv - :when (featurep! +pyvenv) - :after python - :config - (defun +python-current-pyvenv () pyvenv-virtual-env-name) - (when (featurep! :ui modeline) - (add-hook 'pyvenv-post-activate-hooks #'+modeline|update-env-in-all-windows) - (add-hook 'pyvenv-post-deactivate-hooks #'+modeline|update-env-in-all-windows)) - (add-to-list 'global-mode-string - '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) - 'append)) - - (def-package! conda :when (featurep! +conda) :after python diff --git a/modules/lang/python/packages.el b/modules/lang/python/packages.el index f492a90d9..193f5d4bd 100644 --- a/modules/lang/python/packages.el +++ b/modules/lang/python/packages.el @@ -9,10 +9,9 @@ ;; Environmet management (package! pipenv) +(package! pyvenv) (when (featurep! +pyenv) (package! pyenv-mode)) -(when (featurep! +pyvenv) - (package! pyvenv)) (when (featurep! +conda) (package! conda)) From f515bf5931f9142f87c109a6acf7041bd2a6d2bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 4 Mar 2019 20:48:52 -0500 Subject: [PATCH 3891/4235] lang/python: fix conda/virtualenv modeline segment Reported by @ztlevi --- modules/lang/python/autoload/python.el | 23 ++++++++++++++++++++--- modules/lang/python/config.el | 10 ++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 27ed691a3..753f0f636 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -8,7 +8,7 @@ (user-error "`python-shell-interpreter' isn't set")) (pop-to-buffer (process-buffer - (if-let* ((pipenv (executable-find "pipenv")) + (if-let* ((pipenv (+python-executable-find "pipenv")) (pipenv-project (pipenv-project-p))) (let ((default-directory pipenv-project) (python-shell-interpreter-args @@ -23,7 +23,7 @@ (defun +python/open-ipython-repl () "Open an IPython REPL." (interactive) - (let ((python-shell-interpreter "ipython") + (let ((python-shell-interpreter (or (+python-executable-find "ipython") "ipython")) (python-shell-interpreter-args (string-join +python-ipython-repl-args " "))) (+python/open-repl))) @@ -32,6 +32,23 @@ "Open a Jupyter console." (interactive) (add-to-list 'python-shell-completion-native-disabled-interpreters "jupyter") - (let ((python-shell-interpreter "jupyter") + (let ((python-shell-interpreter (or (+python-executable-find "jupyter") "jupyter")) (python-shell-interpreter-args (format "console %s" (string-join +python-jupyter-repl-args " ")))) (+python/open-repl))) + +;;;###autoload +(defun +python-executable-find (exe) + "TODO" + (if (file-name-absolute-p exe) + (file-executable-p exe) + (let ((exe-root (format "bin/%s" exe))) + (cond ((when python-shell-virtualenv-root + (let ((bin (expand-file-name exe-root python-shell-virtualenv-root))) + (if (file-exists-p bin) bin)))) + ((when (bound-and-true-p conda-env-current-name) + (let ((bin (expand-file-name (concat conda-env-current-name "/" exe-root) + (conda-env-location)))) + (if (file-executable-p bin) bin)))) + ((when-let* ((bin (projectile-locate-dominating-file default-directory "bin/python"))) + (setq-local doom-modeline-python-executable (expand-file-name "bin/python" bin)))) + ((executable-find exe)))))) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 4da346a20..abd46e591 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -52,6 +52,16 @@ called.") sp-point-after-word-p sp-point-before-same-p)) + (defun +python|detect-local-python-executable () + (let ((path (+python-executable-find "python"))) + (when path + (make-local-variable 'exec-path) + (add-to-list 'exec-path path)) + (when (bound-and-true-p doom-modeline-mode) + (setq-local doom-modeline-python-executable + (or path python-shell-interpreter))))) + (add-hook 'python-mode-hook #'+python|detect-local-python-executable) + (setq-hook! 'python-mode-hook tab-width python-indent-offset)) From 6a4682f3f153adb9ebdf33af366451eb63e3768d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 00:04:30 -0500 Subject: [PATCH 3892/4235] Change doom/describe-module to browse module Instead of opening its README.org, which may or may not exist. --- core/autoload/help.el | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index e15463960..d5983606e 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -182,10 +182,7 @@ current file is in, or d) the module associated with the current major mode (see (cl-check-type module symbol) (or (doom-module-p category module) (error "'%s %s' isn't a valid module" category module)) - (let ((doc-path (doom-module-path category module "README.org"))) - (unless (file-exists-p doc-path) - (error "There is no documentation for this module (%s)" doc-path)) - (find-file doc-path))) + (doom-project-browse (doom-module-path category module))) ;;;###autoload (defun doom/describe-active-minor-mode (mode) From 75b366285f464e291fd61acc10454ff0dfbc4e37 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 00:11:57 -0500 Subject: [PATCH 3893/4235] lang/emacs-lisp: list package comments in imenu Lines with ;; `package-name` will be considered package markers. --- modules/lang/emacs-lisp/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 0e9336490..661d6d8ef 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -101,6 +101,7 @@ library/userland functions" '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) + ("Package" "^\\s-*;; `\\(\\_<[^ ()\n]+\\_>\\)'$" 1) ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) From cf5a398e0d39f1b43fe185b29dd89631dad75459 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 00:19:51 -0500 Subject: [PATCH 3894/4235] doom-log: include doom-debug-mode test in result Relevant to #1215 --- core/core-lib.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 76380808c..19525390f 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -106,8 +106,8 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." "Log to *Messages* if `doom-debug-mode' is on. Does not interrupt the minibuffer if it is in use, but still logs to *Messages*. Accepts the same arguments as `message'." - (when doom-debug-mode - `(let ((inhibit-message (active-minibuffer-window))) + `(when doom-debug-mode + (let ((inhibit-message (active-minibuffer-window))) (message ,(concat (propertize "DOOM " 'face 'font-lock-comment-face) format-string From cfa97470fcaa59e6d1d5a47bc5504384062bbe0b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 01:53:52 -0500 Subject: [PATCH 3895/4235] Add links to config files in describe-packages Also dims packages that aren't installed. --- core/autoload/help.el | 152 ++++++++++++++--------- core/core-lib.el | 4 +- core/core-modules.el | 14 ++- modules/config/default/+evil-bindings.el | 2 +- 4 files changed, 107 insertions(+), 65 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index d5983606e..700e13e57 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -130,6 +130,17 @@ (helpful-callable fn) (describe-function fn)))) +;;;###autoload +(defun doom/describe-active-minor-mode (mode) + "Get information on an active minor mode. Use `describe-minor-mode' for a +selection of all minor-modes, active or not." + (interactive + (list (completing-read "Minor mode: " (doom-active-minor-modes)))) + (describe-minor-mode-from-symbol + (cond ((stringp mode) (intern mode)) + ((symbolp mode) mode) + ((error "Expected a symbol/string, got a %s" (type-of mode)))))) + ;;;###autoload (defun doom/describe-module (category module) "Open the documentation of CATEGORY MODULE. @@ -184,27 +195,38 @@ current file is in, or d) the module associated with the current major mode (see (error "'%s %s' isn't a valid module" category module)) (doom-project-browse (doom-module-path category module))) -;;;###autoload -(defun doom/describe-active-minor-mode (mode) - "Get information on an active minor mode. Use `describe-minor-mode' for a -selection of all minor-modes, active or not." - (interactive - (list (completing-read "Minor mode: " (doom-active-minor-modes)))) - (describe-minor-mode-from-symbol - (cond ((stringp mode) (intern mode)) - ((symbolp mode) mode) - ((error "Expected a symbol/string, got a %s" (type-of mode)))))) +(defun doom--describe-package-insert-button (label path &optional regexp) + (declare (indent defun)) + (insert-text-button + (string-trim label) + 'face 'link + 'follow-link t + 'action + `(lambda (_) + (unless (file-exists-p ,path) + (user-error "Module doesn't exist")) + (when (window-dedicated-p) + (other-window 1)) + (let ((buffer (find-file ,path))) + (when ,(stringp regexp) + (with-current-buffer buffer + (goto-char (point-min)) + (if (re-search-forward ,regexp nil t) + (recenter) + (message "Couldn't find the config block")))))))) ;;;###autoload (global-set-key [remap describe-package] #'doom/describe-package) + +(defvar doom--describe-package-list-cache nil) ;;;###autoload (defun doom/describe-package (package) - "Like `describe-packages', but is Doom-aware. + "Like `describe-packages', but is Doom aware. -Includes information about where packages are defined and configured. +Only shows installed packages. Includes information about where packages are +defined and configured. - If universal arg is set, only display packages that are installed/built-in -(excludes packages on MELPA/ELPA)." +If prefix arg is prsent, refresh the cache." (interactive (list (let* ((guess (or (function-called-at-point) @@ -212,59 +234,65 @@ Includes information about where packages are defined and configured. (require 'finder-inf nil t) (require 'core-packages) (doom-initialize-packages) - (let ((packages (append (mapcar #'car package-alist) - (unless current-prefix-arg - (mapcar #'car package-archive-contents)) - (mapcar #'car package--builtins)))) - (setq packages (sort packages #'string-lessp)) + (let ((packages + (or (unless current-prefix-arg doom--describe-package-list-cache) + (cl-loop for pkg + in (cl-delete-duplicates + (sort (append (mapcar #'car package-alist) + (mapcar #'car package-archive-contents) + (mapcar #'car package--builtins)) + #'string-greaterp)) + if (assq pkg package-alist) + collect (symbol-name pkg) + else + collect (propertize (symbol-name pkg) 'face 'font-lock-comment-face))))) (unless (memq guess packages) (setq guess nil)) + (setq doom--describe-package-list-cache packages) (intern - (car - (split-string - (completing-read - (if guess - (format "Describe Doom package (default %s): " - guess) - "Describe Doom package: ") - (mapcar #'symbol-name packages) - nil t nil nil - (if guess (symbol-name guess))) " "))))))) + (completing-read + (if guess + (format "Describe package (default %s): " + guess) + "Describe package: ") + packages nil t nil nil + (if guess (symbol-name guess)))))))) (describe-package package) - (with-current-buffer (help-buffer) - (let ((inhibit-read-only t)) - (goto-char (point-min)) - (when (and (doom-package-installed-p package) - (re-search-forward "^ *Status: " nil t)) - (end-of-line) - (let ((indent (make-string (length (match-string 0)) ? ))) - (insert "\n" indent "Installed by the following Doom modules:\n") - (dolist (m (get package 'doom-module)) - (insert indent) - (insert-text-button - (string-trim (format " %s %s" (car m) (or (cdr m) ""))) - 'face 'link - 'follow-link t - 'action - `(lambda (_) - (let* ((category ,(car m)) - (module ',(cdr m)) - (dir (pcase category - (:core doom-core-dir) - (:private doom-private-dir) - (_ (doom-module-path category module))))) - (unless (file-directory-p dir) - (user-error "Module doesn't exist")) - (when (window-dedicated-p) - (other-window 1)) - (find-file dir)))) - (insert "\n")) + (save-excursion + (with-current-buffer (help-buffer) + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (when (and (doom-package-installed-p package) + (re-search-forward "^ *Status: " nil t)) + (end-of-line) + (let ((indent (make-string (length (match-string 0)) ? ))) + (insert "\n" indent "Installed by the following Doom modules:\n") + (dolist (m (get package 'doom-module)) + (insert indent) + (doom--describe-package-insert-button + (format " %s %s" (car m) (or (cdr m) "")) + (pcase (car m) + (:core doom-core-dir) + (:private doom-private-dir) + (category (doom-module-path category (cdr m))))) + (insert "\n")) - (package--print-help-section "Source") - (pcase (doom-package-backend package) - (`elpa (insert "[M]ELPA")) - (`quelpa (insert (format "QUELPA %s" (prin1-to-string (doom-package-prop package :recipe))))) - (`emacs (insert "Built-in")))))))) + (package--print-help-section "Source") + (pcase (doom-package-backend package) + (`elpa (insert "[M]ELPA")) + (`quelpa (insert (format "QUELPA %s" (prin1-to-string (doom-package-prop package :recipe))))) + (`emacs (insert "Built-in"))) + (insert "\n") + + (package--print-help-section "Configs") + (dolist (file (get package 'doom-files)) + (doom--describe-package-insert-button + (abbreviate-file-name file) + file + (format "\\((\\(:?after!\\|def-package!\\)[ \t\n]*%s\\|^[ \t]*;; `%s'$\\)" + package package)) + (insert "\n" indent)) + (delete-char -1))))))) ;;;###autoload (defun doom/what-face (arg &optional pos) diff --git a/core/core-lib.el b/core/core-lib.el index 19525390f..d52db7fd0 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -222,7 +222,9 @@ BODY is evaluated once TARGETS are loaded. TARGETS can either be: #'progn #'with-no-warnings) (if (symbolp targets) - `(with-eval-after-load ',targets ,@body) + `(progn + (doom-module-register-config ',targets ,(FILE!)) + (with-eval-after-load ',targets ,@body)) (pcase (car-safe targets) ((or :or :any) (macroexp-progn diff --git a/core/core-modules.el b/core/core-modules.el index 0b9c2cf83..551241525 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -171,6 +171,15 @@ non-nil, return paths of possible modules, activated or otherwise." collect (plist-get plist :path))) (list doom-private-dir))) +(defun doom-module-register-config (package file &optional append) + "TODO" + (let ((files (get package 'doom-files))) + (unless (member file files) + (if append + (setq files (append files (list file))) + (push file files)) + (put package 'doom-files files)))) + (defun doom-modules (&optional refresh-p) "Minimally initialize `doom-modules' (a hash table) and return it." (or (unless refresh-p doom-modules) @@ -345,7 +354,9 @@ package is disabled." ;; package errors, so we preform this check at compile time: (and (bound-and-true-p byte-compile-current-file) (not (locate-library (symbol-name name))))) - `(use-package ,name ,@plist))) + `(progn + (doom-module-register-config ',name ,(FILE!) t) + (use-package ,name ,@plist)))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. @@ -367,6 +378,7 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (error "'%s' isn't a valid hook for def-package-hook!" when)) `(progn (setq use-package-inject-hooks t) + (doom-module-register-config ',package ,(FILE!)) (add-hook! ',(intern (format "use-package--%s--%s-hook" package diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 46d736261..46044eade 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -685,7 +685,7 @@ :desc "Find library" "l" #'find-library :desc "View *Messages*" "m" #'view-echo-area-messages :desc "Toggle profiler" "p" #'doom/toggle-profiler - :desc "Describe package" "P" #'describe-package + :desc "Describe Doom package" "P" #'describe-package :desc "Reload theme" "r" #'doom/reload-theme :desc "Describe DOOM setting" "s" #'doom/describe-setters :desc "Describe variable" "v" #'describe-variable From c1beb39c5b81f97e49513ebf765ee505fec922fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 01:54:39 -0500 Subject: [PATCH 3896/4235] Rename doom/describe-setters -> doom/describe-autodefs --- core/autoload/help.el | 28 +++++++++++++----------- modules/config/default/+evil-bindings.el | 2 +- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 700e13e57..65832dc9c 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -80,11 +80,13 @@ ;; Commands ;;;###autoload -(define-obsolete-function-alias 'doom/describe-setting 'doom/describe-setters "2.1.0") +(defun doom/describe-autodefs (autodef) + "Open the documentation of Doom autodefs. -;;;###autoload -(defun doom/describe-setters (setting) - "Open the documentation of Doom functions and configuration macros." +What is an autodef? It's a function or macro that is always defined, even if its +containing module is disabled (in which case it will safely no-op). This +syntactic sugar lets you use them without needing to check if they are +available." (interactive (let* ((settings (cl-loop with case-fold-search = nil @@ -95,7 +97,7 @@ (string-match-p "[a-z]!$" sym-name)) collect sym)) (sym (symbol-at-point)) - (setting + (autodef (completing-read "Describe setter: " ;; TODO Could be cleaner (refactor me!) @@ -117,15 +119,15 @@ (when (and (symbolp sym) (string-match-p "!$" (symbol-name sym))) (symbol-name sym))))) - (list (and setting (car (split-string setting " ")))))) - (or (stringp setting) - (functionp setting) - (signal 'wrong-type-argument (list '(stringp functionp) setting))) - (let ((fn (if (functionp setting) - setting - (intern-soft setting)))) + (list (and autodef (car (split-string autodef " ")))))) + (or (stringp autodef) + (functionp autodef) + (signal 'wrong-type-argument (list '(stringp functionp) autodef))) + (let ((fn (if (functionp autodef) + autodef + (intern-soft autodef)))) (or (fboundp fn) - (error "'%s' is not a valid DOOM setting" setting)) + (error "'%s' is not a valid DOOM autodef" autodef)) (if (fboundp 'helpful-callable) (helpful-callable fn) (describe-function fn)))) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 46044eade..989aae419 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -665,6 +665,7 @@ :desc "What face" "'" #'doom/what-face :desc "Describe at point" "." #'helpful-at-point :desc "Describe active minor modes" ";" #'doom/describe-active-minor-mode + :desc "Describe Doom autodef" "A" #'doom/describe-autodefs :desc "Open Doom manual" "D" #'doom/open-manual :desc "Open vanilla sandbox" "E" #'doom/open-vanilla-sandbox :desc "Describe face" "F" #'describe-face @@ -687,7 +688,6 @@ :desc "Toggle profiler" "p" #'doom/toggle-profiler :desc "Describe Doom package" "P" #'describe-package :desc "Reload theme" "r" #'doom/reload-theme - :desc "Describe DOOM setting" "s" #'doom/describe-setters :desc "Describe variable" "v" #'describe-variable :desc "Man pages" "w" #'+default/man-or-woman) From 4f40e67e28ecf850dbb0ce4367554b0fc98bc5ea Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 01:59:05 -0500 Subject: [PATCH 3897/4235] Better regexp escaping for ivy project search --- modules/completion/ivy/autoload/ivy.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 322f66801..9ad5fde43 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -238,7 +238,7 @@ order. 'grep) (error "No search engine specified (is ag, rg, pt or git installed?)"))) (query - (or query + (or (if query (rxt-quote-pcre query)) (when (use-region-p) (let ((beg (or (bound-and-true-p evil-visual-beginning) (region-beginning))) (end (or (bound-and-true-p evil-visual-end) (region-end)))) From 35321e8b42cf0200ca8b5c97372ae0cfa5705565 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 02:30:14 -0500 Subject: [PATCH 3898/4235] Fix conda python version detection in first buffer Reported by @ztlevi --- modules/lang/python/autoload/python.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/autoload/python.el b/modules/lang/python/autoload/python.el index 753f0f636..84fcbcecd 100644 --- a/modules/lang/python/autoload/python.el +++ b/modules/lang/python/autoload/python.el @@ -45,7 +45,7 @@ (cond ((when python-shell-virtualenv-root (let ((bin (expand-file-name exe-root python-shell-virtualenv-root))) (if (file-exists-p bin) bin)))) - ((when (bound-and-true-p conda-env-current-name) + ((when (require 'conda nil t) (let ((bin (expand-file-name (concat conda-env-current-name "/" exe-root) (conda-env-location)))) (if (file-executable-p bin) bin)))) From 1ec9f5b2e9c173b447bac41e09c2142ac697045e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 03:01:59 -0500 Subject: [PATCH 3899/4235] Move hl-line-range-function fix to ui/doom Remapping the hl-line face is what causes the bug that this fix addresses. --- core/core-ui.el | 15 --------------- modules/ui/doom/config.el | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 1134ecb33..59c25a311 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -274,21 +274,6 @@ read-only or not file-visiting." (setq hl-line-sticky-flag nil global-hl-line-sticky-flag nil) - ;; On Emacs 26+, when point is on the last line, hl-line highlights bleed into - ;; the rest of the window after eob. This is the fix. - (when EMACS26+ - (defun doom--line-range () - (cons (line-beginning-position) - (cond ((let ((eol (line-end-position))) - (and (= eol (point-max)) - (/= eol (line-beginning-position)))) - (1- (line-end-position))) - ((or (eobp) - (= (line-end-position 2) (point-max))) - (line-end-position)) - ((line-beginning-position 2))))) - (setq hl-line-range-function #'doom--line-range)) - ;; Disable `hl-line' in evil-visual mode (temporarily). `hl-line' can make the ;; selection region harder to see while in evil visual mode. (after! evil diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 333ebb516..67f740e2b 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -58,6 +58,22 @@ ;; considered an unreal buffer, so solaire-mode must be restored. (add-hook 'org-capture-mode-hook #'turn-on-solaire-mode) + ;; On Emacs 26+, when point is on the last line and solaire-mode is remapping + ;; the hl-line face, hl-line's highlight bleeds into the rest of the window + ;; after eob. + (when EMACS26+ + (defun +doom--line-range () + (cons (line-beginning-position) + (cond ((let ((eol (line-end-position))) + (and (= eol (point-max)) + (/= eol (line-beginning-position)))) + (1- (line-end-position))) + ((or (eobp) + (= (line-end-position 2) (point-max))) + (line-end-position)) + ((line-beginning-position 2))))) + (setq hl-line-range-function #'+doom--line-range)) + ;; Because fringes can't be given a buffer-local face, they can look odd, so ;; we remove them in the minibuffer and which-key popups (they serve no ;; purpose there anyway). From 024e27b618d4b8ab72243c7b10a3d18439709d31 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 17:08:39 -0500 Subject: [PATCH 3900/4235] Add contingency plan for local-vars hooks They don't run if enable-local-variables is set to nil. --- core/core.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/core.el b/core/core.el index 9ec60a803..344949d54 100644 --- a/core/core.el +++ b/core/core.el @@ -237,6 +237,13 @@ original value of `symbol-file'." #'doom-try-run-hook)) (add-hook 'hack-local-variables-hook #'doom|run-local-var-hooks) +(defun doom|run-local-var-hooks-if-necessary () + "If `enable-local-variables' is disabled, then `hack-local-variables-hook' is +never triggered." + (unless enable-local-variables + (doom|run-local-var-hooks))) +(add-hook 'after-change-major-mode-hook #'doom|run-local-var-hooks-if-necessary) + ;; ;; Incremental lazy-loading From 9d30b411c282382cb358d480046d09409427290f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 18:37:50 -0500 Subject: [PATCH 3901/4235] lang/org: bind dwim-at-point to RET instead #1218 [return] is treated as a different key (with higher precedence in GUI Emacs), which means it overwrites RET behaviors bound elsewhere, like in config/default or minor mode maps (like evil-multiedit's). --- modules/lang/org/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0f42dae48..0e962491b 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -374,8 +374,8 @@ between the two." :ni "C-S-k" #'org-metaup :ni "C-S-j" #'org-metadown ;; more intuitive RET keybinds - :i [return] #'org-return-indent - :n [return] #'+org/dwim-at-point + :i "RET" #'org-return-indent + :n "RET" #'+org/dwim-at-point ;; more vim-esque org motion keys (not covered by evil-org-mode) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) From bf940da52ae72c0776ffca04780288b064e4591c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 19:16:08 -0500 Subject: [PATCH 3902/4235] Don't change projectile vars before it is loaded #1219 --- modules/lang/javascript/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index e2980379d..c31ae716f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -54,7 +54,8 @@ (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/open-repl) - (add-to-list 'projectile-globally-ignored-directories "node_modules") + (after! projectile + (add-to-list 'projectile-globally-ignored-directories "node_modules")) (map! :map js2-mode-map :localleader From e497df4a2883d01440e18715d0797f1491a51e95 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 19:23:50 -0500 Subject: [PATCH 3903/4235] Restore obsolete doom-(post-)?init hooks These will be removed later. --- core/core.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/core.el b/core/core.el index 344949d54..e1d4c5517 100644 --- a/core/core.el +++ b/core/core.el @@ -124,6 +124,9 @@ This includes the user's private module in `doom-private-dir'.") (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload' is called.") +(define-obsolete-variable-alias 'doom-post-init-hook 'doom-init-modules-hook "2.1.0") +(define-obsolete-variable-alias 'doom-init-hook 'doom-before-init-modules-hook "2.1.0") + ;; ;; Emacs core configuration From 46f7e6c7e6187205eca6c47b3adc6108795f6279 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Thu, 7 Mar 2019 01:18:11 +1000 Subject: [PATCH 3904/4235] Improve +ivy/switch-workspace-buffer Allow current buffer to be selected when switching other window, so you can quickly get a second window to the current buffer. Preselect the most recently selected buffer, so repeated C-x b RET will switch between your two most recent buffers. --- modules/completion/ivy/autoload/ivy.el | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 9ad5fde43..5078b975c 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -1,5 +1,11 @@ ;;; completion/ivy/autoload/ivy.el -*- lexical-binding: t; -*- +(defun +ivy--is-workspace-buffer-p (buffer) + (let ((buffer (car buffer))) + (when (stringp buffer) + (setq buffer (get-buffer buffer))) + (+workspace-contains-buffer-p buffer))) + (defun +ivy--is-workspace-or-other-buffer-p (buffer) (let ((buffer (car buffer))) (when (stringp buffer) @@ -38,16 +44,19 @@ If ARG (universal argument), open selection in other-window." "Switch to workspace buffer in other window: " "Switch to workspace buffer: ") 'internal-complete-buffer - :predicate #'+ivy--is-workspace-or-other-buffer-p + :predicate (if arg + #'+ivy--is-workspace-buffer-p + #'+ivy--is-workspace-or-other-buffer-p) :action (if arg #'ivy--switch-buffer-other-window-action #'ivy--switch-buffer-action) + :preselect (buffer-name (other-buffer (current-buffer))) :matcher #'ivy--switch-buffer-matcher :keymap ivy-switch-buffer-map :caller #'+ivy/switch-workspace-buffer)) ;;;###autoload -(defun +ivy/switch-workspace-buffer-other-window (&optional arg) +(defun +ivy/switch-workspace-buffer-other-window () "Switch the other window to a buffer within the current workspace." (interactive) (+ivy/switch-workspace-buffer t)) From be4bae4acf4bc1976b6309e1b1b225eebf39cc70 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Thu, 7 Mar 2019 01:34:44 +1000 Subject: [PATCH 3905/4235] Fix cc fontification for constants with numbers --- modules/lang/cc/autoload.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/cc/autoload.el b/modules/lang/cc/autoload.el index c442c2028..e50ea0665 100644 --- a/modules/lang/cc/autoload.el +++ b/modules/lang/cc/autoload.el @@ -143,7 +143,7 @@ simpler." "Better fontification for preprocessor constants" (when (memq major-mode '(c-mode c++-mode)) (font-lock-add-keywords - nil '(("\\<[A-Z]*_[A-Z_]+\\>" . font-lock-constant-face) + nil '(("\\<[A-Z]*_[0-9A-Z_]+\\>" . font-lock-constant-face) ("\\<[A-Z]\\{3,\\}\\>" . font-lock-constant-face)) t))) From c7a29ca0251fab77461736a1953c36480741c8e7 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Thu, 7 Mar 2019 11:07:45 +1000 Subject: [PATCH 3906/4235] Add optional support for switch-buffer previews When `+ivy-buffer-preview` is non-nil, our various switch-buffer functions will preview the current candidate buffer, like how `counsel-switch-buffer` works. When `ivy-use-virtual-buffers` is non-nil, virtual buffers are *not* previewed unless `+ivy-buffer-preview` is `'everything`. --- modules/completion/ivy/autoload/ivy.el | 73 ++++++++++++++++++++------ modules/completion/ivy/config.el | 19 ++++--- 2 files changed, 69 insertions(+), 23 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 5078b975c..987228eeb 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -6,7 +6,7 @@ (setq buffer (get-buffer buffer))) (+workspace-contains-buffer-p buffer))) -(defun +ivy--is-workspace-or-other-buffer-p (buffer) +(defun +ivy--is-workspace-other-buffer-p (buffer) (let ((buffer (car buffer))) (when (stringp buffer) (setq buffer (get-buffer buffer))) @@ -34,32 +34,71 @@ temporary/special buffers in `font-lock-comment-face'." ;; ;; Library +(defun +ivy--switch-buffer-preview () + (if (get-buffer (ivy-state-current ivy-last)) + (ivy-call) + (with-ivy-window + (switch-to-buffer (ivy-state-buffer ivy-last))))) + +(defun +ivy--switch-buffer (workspace other) + (let ((current (not other)) + prompt action filter update unwind) + (cond ((and workspace current) + (setq prompt "Switch to workspace buffer: " + action #'ivy--switch-buffer-action + filter #'+ivy--is-workspace-other-buffer-p)) + (workspace + (setq prompt "Switch to workspace buffer in other window: " + action #'ivy--switch-buffer-other-window-action + filter #'+ivy--is-workspace-buffer-p)) + (current + (setq prompt "Switch to buffer: " + action #'ivy--switch-buffer-action)) + (t + (setq prompt "Switch to buffer in other window: " + action #'ivy--switch-buffer-other-window-action))) + (when +ivy-buffer-preview + (cond ((not (and ivy-use-virtual-buffers + (eq +ivy-buffer-preview 'everything))) + (setq update #'+ivy--switch-buffer-preview)) + (t + (setq update #'counsel--switch-buffer-update-fn + unwind #'counsel--switch-buffer-unwind)))) + (ivy-read prompt 'internal-complete-buffer + :action action + :predicate filter + :update-fn update + :unwind unwind + :preselect (buffer-name (other-buffer (current-buffer))) + :matcher #'ivy--switch-buffer-matcher + :keymap ivy-switch-buffer-map + :caller #'+ivy--switch-buffer))) + ;;;###autoload (defun +ivy/switch-workspace-buffer (&optional arg) "Switch to another buffer within the current workspace. If ARG (universal argument), open selection in other-window." (interactive "P") - (ivy-read (if arg - "Switch to workspace buffer in other window: " - "Switch to workspace buffer: ") - 'internal-complete-buffer - :predicate (if arg - #'+ivy--is-workspace-buffer-p - #'+ivy--is-workspace-or-other-buffer-p) - :action (if arg - #'ivy--switch-buffer-other-window-action - #'ivy--switch-buffer-action) - :preselect (buffer-name (other-buffer (current-buffer))) - :matcher #'ivy--switch-buffer-matcher - :keymap ivy-switch-buffer-map - :caller #'+ivy/switch-workspace-buffer)) + (+ivy--switch-buffer t arg)) ;;;###autoload (defun +ivy/switch-workspace-buffer-other-window () - "Switch the other window to a buffer within the current workspace." + "Switch another window to a buffer within the current workspace." (interactive) - (+ivy/switch-workspace-buffer t)) + (+ivy--switch-buffer t t)) + +;;;###autoload +(defun +ivy/switch-buffer () + "Switch to another buffer." + (interactive) + (+ivy--switch-buffer nil nil)) + +;;;###autoload +(defun +ivy/switch-buffer-other-window () + "Switch to another buffer in another window." + (interactive) + (+ivy--switch-buffer nil t)) (defun +ivy--tasks-candidates (tasks) "Generate a list of task tags (specified by `+ivy-task-tags') for diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index bc1232bf8..a1ca0ff75 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -3,6 +3,13 @@ (defvar +ivy-buffer-icons nil "If non-nil, show buffer mode icons in `ivy-switch-buffer' and the like.") +(defvar +ivy-buffer-preview nil + "If non-nil, preview buffers while switching, à la `counsel-switch-buffer'. + +When nil, don't preview anything. +When non-nil, preview non-virtual buffers. +When 'everything, also preview virtual buffers") + (defvar +ivy-task-tags '(("TODO" . warning) ("FIXME" . error)) @@ -58,9 +65,11 @@ immediately runs it on the current candidate (ending the ivy session)." (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) - (map! [remap switch-to-buffer] #'ivy-switch-buffer - [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer - [remap imenu-anywhere] #'ivy-imenu-anywhere) + (map! :map ivy-mode-map + [remap switch-to-buffer] #'+ivy/switch-buffer + [remap switch-to-buffer-other-window] #'+ivy/switch-buffer-other-window + [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer + [remap imenu-anywhere] #'ivy-imenu-anywhere) (ivy-mode +1) @@ -76,9 +85,7 @@ immediately runs it on the current candidate (ending the ivy session)." :hook (ivy-mode . ivy-rich-mode) :config ;; Show more buffer information in other switch-buffer commands too - (dolist (cmd '(ivy-switch-buffer-other-window - +ivy/switch-workspace-buffer - +ivy/switch-workspace-buffer-other-window + (dolist (cmd '(+ivy--switch-buffer counsel-projectile-switch-to-buffer)) (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer)) ;; Use `+ivy-rich-buffer-name' to display buffer names From 4d649333a619d313a09eb82e433a602106ab9883 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 23:46:37 -0500 Subject: [PATCH 3907/4235] Add keybind: SPC h C-k -> describe-key-briefly --- modules/config/default/+evil-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 989aae419..bcdfa82e4 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -683,6 +683,7 @@ :desc "Emacs help map" "h" help-map :desc "Lookup in manual" "i" #'info-lookup-symbol :desc "Describe key" "k" #'describe-key + :desc "Describe key briefly" "C-k" #'describe-key-briefly :desc "Find library" "l" #'find-library :desc "View *Messages*" "m" #'view-echo-area-messages :desc "Toggle profiler" "p" #'doom/toggle-profiler From 884957bdc60b9538df1cf4508806e620886671d5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 5 Mar 2019 23:52:59 -0500 Subject: [PATCH 3908/4235] Refactor format! macro By removing the cl-flet call, we reduce the size of backtraces produced during bin/doom commands by a whopping 80%. Noice. Also renames doom-ansi-apply -> doom-color-apply --- core/autoload/message.el | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/core/autoload/message.el b/core/autoload/message.el index e00eb0236..fb3014bf1 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -32,7 +32,7 @@ "TODO") ;;;###autoload -(defun doom-ansi-apply (style text) +(defun doom-color-apply (style text) "Apply CODE to formatted MESSAGE with ARGS. CODE is derived from any of `doom-message-fg', `doom-message-bg' or `doom-message-fx'. @@ -53,19 +53,27 @@ Otherwise, it maps colors to a term-color-* face." `(:foreground ,(face-foreground (caddr (assq style doom-ansi-alist))))) ((cddr (assq style doom-ansi-alist))))))))) +(defun doom--short-color-replace (forms) + "Replace color-name functions with calls to `doom-color-apply'." + (cond ((null forms) nil) + ((listp forms) + (append (cond ((not (symbolp (car forms))) + (list (doom--short-color-replace (car forms)))) + ((assq (car forms) doom-ansi-alist) + `(doom-color-apply ',(car forms))) + ((eq (car forms) 'color) + (pop forms) + `(doom-color-apply ,(car forms))) + ((list (car forms)))) + (doom--short-color-replace (cdr forms)) + nil)) + (forms))) + ;;;###autoload (defmacro format! (message &rest args) "An alternative to `format' that understands (color ...) and converts them into faces or ANSI codes depending on the type of sesssion we're in." - `(cl-flet - (,@(mapcar (lambda (rule) `(,(car rule) - (lambda (message) - (doom-ansi-apply ',(car rule) message)))) - doom-ansi-alist) - (color - (lambda (code format) - (doom-ansi-apply code format)))) - (format ,message ,@args))) + `(format ,@(doom--short-color-replace `(,message ,@args)))) ;;;###autoload (defmacro print! (message &rest args) From a48417cf0de3b66ef80fe378f36856784a9ac5f1 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Fri, 8 Mar 2019 12:49:15 +1000 Subject: [PATCH 3909/4235] Only switch to dashboard when creating a new workspace --- modules/feature/workspaces/autoload/workspaces.el | 2 +- modules/feature/workspaces/config.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index aa1f62e6f..5f10c9695 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -507,7 +507,7 @@ This be hooked to `projectile-after-switch-project-hook'." (+workspace-message (format "Switched to '%s' in new workspace" new-name) 'success)) - (with-current-buffer (switch-to-buffer (doom-fallback-buffer)) + (with-current-buffer (doom-fallback-buffer) (setq default-directory +workspaces--project-dir) (message "Switched to '%s'" (doom-project-name +workspaces--project-dir))) (unless current-prefix-arg diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index cc261bfa0..32e15e33f 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -21,7 +21,7 @@ new project directory.") Can be one of the following: t Always create a new workspace for the project -'non-empty Only create a new workspace if the current one has no buffers +'non-empty Only create a new workspace if the current one already has buffers associated with it. nil Never create a new workspace on project switch.") From 0f0b0d720ba671d91d4730d7f5bf680564729cd5 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Fri, 8 Mar 2019 16:08:36 +1000 Subject: [PATCH 3910/4235] Tidy up +ivy-buffer-preview functionality Let-binding `ivy-use-virtual-buffers` is neater and more robust than the previous solution using some copy-pasta. Calling the unwind routine will become important once counsel is patched to restore buffer-list. --- modules/completion/ivy/autoload/ivy.el | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 987228eeb..e416c7160 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -35,10 +35,11 @@ temporary/special buffers in `font-lock-comment-face'." ;; Library (defun +ivy--switch-buffer-preview () - (if (get-buffer (ivy-state-current ivy-last)) - (ivy-call) - (with-ivy-window - (switch-to-buffer (ivy-state-buffer ivy-last))))) + (let (ivy-use-virtual-buffers) + (counsel--switch-buffer-update-fn))) + +(defalias '+ivy--switch-buffer-preview-all #'counsel--switch-buffer-update-fn) +(defalias '+ivy--switch-buffer-unwind #'counsel--switch-buffer-unwind) (defun +ivy--switch-buffer (workspace other) (let ((current (not other)) @@ -60,10 +61,11 @@ temporary/special buffers in `font-lock-comment-face'." (when +ivy-buffer-preview (cond ((not (and ivy-use-virtual-buffers (eq +ivy-buffer-preview 'everything))) - (setq update #'+ivy--switch-buffer-preview)) + (setq update #'+ivy--switch-buffer-preview + unwind #'+ivy--switch-buffer-unwind)) (t - (setq update #'counsel--switch-buffer-update-fn - unwind #'counsel--switch-buffer-unwind)))) + (setq update #'+ivy--switch-buffer-preview-all + unwind #'+ivy--switch-buffer-unwind)))) (ivy-read prompt 'internal-complete-buffer :action action :predicate filter From 4fbf7a2687530323cdab5ee36eda4d919c7c0d37 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 03:18:02 -0500 Subject: [PATCH 3911/4235] Remove expand-region package It was unused, and is redundant with evil's text object expansion keys. --- core/core-editor.el | 11 ----------- core/packages.el | 1 - modules/config/default/+evil-bindings.el | 10 ---------- 3 files changed, 22 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index f05bb613a..e758f814d 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -269,17 +269,6 @@ savehist file." command-log-mode-is-global t)) -(def-package! expand-region - :commands (er/contract-region er/mark-symbol er/mark-word) - :config - (defun doom*quit-expand-region () - "Properly abort an expand-region region." - (when (memq last-command '(er/expand-region er/contract-region)) - (er/contract-region 0))) - (advice-add #'evil-escape :before #'doom*quit-expand-region) - (advice-add #'doom/escape :before #'doom*quit-expand-region)) - - ;; `helpful' --- a better *help* buffer (def-package! helpful :defer t diff --git a/core/packages.el b/core/packages.el index 0e16d3e3f..fc86a5347 100644 --- a/core/packages.el +++ b/core/packages.el @@ -28,7 +28,6 @@ (package! avy) (package! command-log-mode) (package! dtrt-indent) -(package! expand-region) (package! helpful) (package! pcre2el) (package! smartparens) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index bcdfa82e4..6ffe5cb27 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -2,10 +2,6 @@ ;; This file defines a Spacemacs-esque keybinding scheme -;; expand-region's prompt can't tell what key contract-region is bound to, so we -;; tell it explicitly. -(setq expand-region-contract-fast-key "C-v") - ;; Don't let evil-collection interfere with certain keys (setq evil-collection-key-blacklist (list "C-j" "C-k" "gd" "gf" "K" "[" "]" "gz" @@ -65,12 +61,6 @@ :i [remap newline] #'newline-and-indent ; auto-indent on newline :i "C-j" #'+default/newline ; default behavior - ;; expand-region - :v "v" (general-predicate-dispatch 'er/expand-region - (eq (evil-visual-type) 'line) - 'evil-visual-char) - :v "C-v" #'er/contract-region - (:after vc-annotate :map vc-annotate-mode-map [remap quit-window] #'kill-this-buffer) From d94aa9b57c5cdbea8aee828aa97089f2217e9f50 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 17:21:38 -0500 Subject: [PATCH 3912/4235] Add xclip.el for tty clipboard support Needs more testing --- core/core-os.el | 11 +++++++---- core/packages.el | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index ff024fd6f..2f5046bbd 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -7,6 +7,13 @@ (unless IS-MAC (setq command-line-ns-option-alist nil)) (unless IS-LINUX (setq command-line-x-option-alist nil)) +;; Fix the clipboard in terminal or daemon Emacs (non-GUI) +(defun doom|init-clipboard-in-tty-emacs () + (if IS-MAC + (if (require 'osx-clipboard nil t) (osx-clipboard-mode)) + (if (require 'xclip nil t) (xclip-mode)))) +(add-hook 'tty-setup-hook #'doom|init-clipboard-in-tty-emacs) + ;; stop copying each visual state move to the clipboard: ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on ;; grokked from: http://stackoverflow.com/questions/15873346/elisp-rename-macro @@ -30,10 +37,6 @@ ;; than a new one ns-pop-up-frames nil) - ;; Fix the clipboard in terminal or daemon Emacs (non-GUI) - (when (or (daemonp) (not (display-graphic-p))) - (add-hook 'doom-init-modules-hook #'osx-clipboard-mode)) - (when (or (daemonp) (display-graphic-p)) ;; Syncs ns frame parameters with theme (and fixes mismatching text ;; colr in the frame title) diff --git a/core/packages.el b/core/packages.el index fc86a5347..d2f34a5ee 100644 --- a/core/packages.el +++ b/core/packages.el @@ -2,6 +2,7 @@ ;;; core/packages.el ;; core-os.el +(package! xclip) (when IS-MAC (package! exec-path-from-shell) (package! osx-clipboard) From 2d353b849c7b42f24b7b0ad4d8ea1d95b42eb6f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 17:39:46 -0500 Subject: [PATCH 3913/4235] Change file-exists-p! to return file if it exists --- core/core-lib.el | 49 ++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index d52db7fd0..6835a0846 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -23,23 +23,27 @@ For example (doom--resolve-path-forms - '(or \"some-file\" (and path-var \"/an/absolute/path\")) + '(or A (and B C)) \"~\") -Returns +Returns (approximately): - '(let ((_directory \"~\")) - (or (file-exists-p (expand-file-name \"some-file\" _directory)) - (and (file-exists-p (expand-file-name path-var _directory)) - (file-exists-p \"/an/absolute/path\")))) + '(let* ((_directory \"~\") + (A (expand-file-name A _directory)) + (B (expand-file-name B _directory)) + (C (expand-file-name C _directory))) + (or (and (file-exists-p A) A) + (and (if (file-exists-p B) B) + (if (file-exists-p C) C)))) This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." (declare (pure t) (side-effect-free t)) (cond ((stringp spec) - `(file-exists-p - ,(if (file-name-absolute-p spec) - spec - `(expand-file-name ,spec ,directory)))) + `(let ((--file-- ,(if (file-name-absolute-p spec) + spec + `(expand-file-name ,spec ,directory)))) + (and (file-exists-p --file--) + --file--))) ((and (listp spec) (memq (car spec) '(or and))) `(,(car spec) @@ -47,12 +51,14 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." collect (doom--resolve-path-forms i directory)))) ((or (symbolp spec) (listp spec)) - `(file-exists-p ,(if (and directory - (or (not (stringp directory)) - (file-name-absolute-p directory))) - `(expand-file-name ,spec ,directory) - spec))) - (t spec))) + `(let ((--file-- ,(if (and directory + (or (not (stringp directory)) + (file-name-absolute-p directory))) + `(expand-file-name ,spec ,directory) + spec))) + (and (file-exists-p --file--) + --file--))) + (spec))) (defun doom--resolve-hook-forms (hooks) (declare (pure t) (side-effect-free t)) @@ -400,16 +406,15 @@ The available conditions are: mode modes match files when))))) (defmacro file-exists-p! (spec &optional directory) - "Returns t if the files in SPEC all exist. + "Returns non-nil if the files in SPEC all exist. -SPEC can be a single file or a list of forms/files. It understands nested (and -...) and (or ...), as well. +Returns the last file found to meet the rules set by SPEC. SPEC can be a single +file or a list of forms/files. It understands nested (and ...) and (or ...), as +well. -DIRECTORY is where to look for the files in SPEC if they aren't absolute. This -doesn't apply to variables, however. +DIRECTORY is where to look for the files in SPEC if they aren't absolute. For example: - (file-exists-p! (or doom-core-dir \"~/.config\" \"some-file\") \"~\")" (if directory `(let ((--directory-- ,directory)) From 31688c921d2c05f6531ebcf336d1a812747abbc5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 18:18:51 -0500 Subject: [PATCH 3914/4235] Refactor doom-get-outdated-packages Partitions quelpa packages so there are 4 threads tops. --- core/autoload/packages.el | 76 +++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 9b42497bc..acc6f6db6 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -247,46 +247,46 @@ If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom-packages-update'." (doom-initialize-packages t) (doom-refresh-packages-maybe doom-debug-mode) - (require 'async) - (let (quelpa-pkgs elpa-pkgs) - ;; Separate quelpa from elpa packages - (dolist (pkg (mapcar #'car package-alist)) - (when (and (or (not (doom-package-prop pkg :freeze 'eval)) - include-frozen-p) - (not (doom-package-prop pkg :ignore 'eval)) - (not (doom-package-different-backend-p pkg))) - (push pkg - (if (eq (doom-package-backend pkg) 'quelpa) - quelpa-pkgs - elpa-pkgs)))) + (let-alist + (seq-group-by + #'doom-package-backend + (cl-loop for package in (mapcar #'car package-alist) + when (and (or (not (doom-package-prop package :freeze 'eval)) + include-frozen-p) + (not (doom-package-prop package :ignore 'eval)) + (not (doom-package-different-backend-p package))) + collect package)) ;; The bottleneck in this process is quelpa's version checks, so check them ;; asynchronously. - (let (futures) - (dolist (pkg quelpa-pkgs) - (doom-log "New thread for: %s" pkg) - (push (async-start - `(lambda () - (let ((gc-cons-threshold ,doom-gc-cons-upper-limit) - (doom-init-p t) - (noninteractive t) - (load-path ',load-path) - (package-alist ',package-alist) - (package-archive-contents ',package-archive-contents) - (package-selected-packages ',package-selected-packages) - (doom-packages ',doom-packages) - (doom-modules ',doom-modules) - (quelpa-cache ',quelpa-cache) - (user-emacs-directory ,user-emacs-directory) - doom-private-dir) - (load ,(expand-file-name "core.el" doom-core-dir)) - (load ,(expand-file-name "autoload/packages.el" doom-core-dir)) - (require 'package) - (require 'quelpa) - (doom-package-outdated-p ',pkg)))) - futures)) - (delq nil - (append (mapcar #'doom-package-outdated-p elpa-pkgs) - (mapcar #'async-get (reverse futures))))))) + (cl-loop with partitions = (/ (length .quelpa) 4) + for pkgs in (seq-partition .quelpa partitions) + do (doom-log "New thread for: %s" pkgs) + and collect + (async-start + `(lambda () + (let ((gc-cons-threshold ,doom-gc-cons-upper-limit) + (doom-init-p t) + (noninteractive t) + (load-path ',load-path) + (package-alist ',package-alist) + (package-archive-contents ',package-archive-contents) + (package-selected-packages ',package-selected-packages) + (doom-packages ',doom-packages) + (doom-modules ',doom-modules) + (quelpa-cache ',quelpa-cache) + (user-emacs-directory ,user-emacs-directory) + (packages ',pkgs) + doom-private-dir) + (load ,(expand-file-name "core.el" doom-core-dir)) + (load ,(expand-file-name "autoload/packages.el" doom-core-dir)) + (require 'package) + (require 'quelpa) + (cl-delete-if-not #'doom-package-outdated-p packages)))) + into futures + finally return + (delq nil + (append (mapcar #'doom-package-outdated-p .elpa) + (mapcan #'async-get futures)))))) ;;;###autoload (defun doom-get-orphaned-packages () From 8c701ef7d40805537f948bc89332b202d94c5e1e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 19:57:38 -0500 Subject: [PATCH 3915/4235] Fix void-variable error from ediff config --- core/core-ui.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 59c25a311..691e679d7 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -254,13 +254,15 @@ read-only or not file-visiting." ediff-split-window-function #'split-window-horizontally ediff-window-setup-function #'ediff-setup-windows-plain) :config + (defvar doom--ediff-saved-wconf nil) ;; Restore window config after quitting ediff (defun doom|ediff-save-wconf () - (setq +ediff--saved-wconf (current-window-configuration))) + (setq doom--ediff-saved-wconf (current-window-configuration))) (add-hook 'ediff-before-setup-hook #'doom|ediff-save-wconf) (defun doom|ediff-restore-wconf () - (set-window-configuration +ediff--saved-wconf)) + (when (window-configuration-p doom--ediff-saved-wconf) + (set-window-configuration doom--ediff-saved-wconf))) (add-hook 'ediff-quit-hook #'doom|ediff-restore-wconf 'append) (add-hook 'ediff-suspend-hook #'doom|ediff-restore-wconf 'append)) From 9b180fda9746be3fc3a50232631c357f874e287e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 21:16:07 -0500 Subject: [PATCH 3916/4235] Refactor doom-initialize & bootstrap in core.el --- core/cli/test.el | 76 ++++++++++++++++----------------- core/core-lib.el | 4 -- core/core.el | 49 +++++++++++---------- core/test/test-core-keybinds.el | 2 + core/test/test-core-lib.el | 2 + core/test/test-core-modules.el | 2 + core/test/test-core-ui.el | 2 + 7 files changed, 70 insertions(+), 67 deletions(-) diff --git a/core/cli/test.el b/core/cli/test.el index 6a6a36c25..3d44c34dd 100644 --- a/core/cli/test.el +++ b/core/cli/test.el @@ -16,46 +16,46 @@ If neither is available, run all tests in all enabled modules." ;; Core libraries aren't fully loaded in a noninteractive session, so we ;; reload it with `noninteractive' set to nil to force them to. (quiet! (doom-reload-autoloads)) - (doom-initialize 'force t) - (doom-initialize-modules 'force) - (let ((target-paths - ;; Convert targets into a list of string paths, pointing to the root - ;; directory of modules - (cond ((stringp (car modules)) ; command line - (save-match-data - (cl-loop for arg in modules - if (string= arg ":core") collect doom-core-dir - else if (string-match-p "/" arg) - nconc (mapcar (apply-partially #'expand-file-name arg) - doom-modules-dirs) - else - nconc (cl-loop for dir in doom-modules-dirs - for path = (expand-file-name arg dir) - if (file-directory-p path) - nconc (doom-files-in path :type 'dirs :depth 1 :full t)) - finally do (setq argv nil)))) + (let ((doom-modules (doom-modules)) + noninteractive) + (let ((target-paths + ;; Convert targets into a list of string paths, pointing to the root + ;; directory of modules + (cond ((stringp (car modules)) ; command line + (save-match-data + (cl-loop for arg in modules + if (string= arg ":core") collect doom-core-dir + else if (string-match-p "/" arg) + nconc (mapcar (apply-partially #'expand-file-name arg) + doom-modules-dirs) + else + nconc (cl-loop for dir in doom-modules-dirs + for path = (expand-file-name arg dir) + if (file-directory-p path) + nconc (doom-files-in path :type 'dirs :depth 1 :full t)) + finally do (setq argv nil)))) - (modules ; cons-cells given to MODULES - (cl-loop for (module . submodule) in modules - if (doom-module-locate-path module submodule) - collect it)) + (modules ; cons-cells given to MODULES + (cl-loop for (module . submodule) in modules + if (doom-module-locate-path module submodule) + collect it)) - ((append (list doom-core-dir) - (doom-module-load-path)))))) - ;; Load all the unit test files... - (require 'buttercup) - (mapc (lambda (file) (load file :noerror (not doom-debug-mode))) - (doom-files-in (mapcar (apply-partially #'expand-file-name "test/") - target-paths) - :match "\\.el$" :full t)) - ;; ... then run them - (when doom-debug-mode - (setq buttercup-stack-frame-style 'pretty)) - (let ((split-width-threshold 0) - (split-height-threshold 0) - (window-min-width 0) - (window-min-height 0)) - (buttercup-run)))) + ((append (list doom-core-dir) + (doom-module-load-path)))))) + ;; Load all the unit test files... + (require 'buttercup) + (mapc (lambda (file) (load file :noerror (not doom-debug-mode))) + (doom-files-in (mapcar (apply-partially #'expand-file-name "test/") + target-paths) + :match "\\.el$" :full t)) + ;; ... then run them + (when doom-debug-mode + (setq buttercup-stack-frame-style 'pretty)) + (let ((split-width-threshold 0) + (split-height-threshold 0) + (window-min-width 0) + (window-min-height 0)) + (buttercup-run))))) ;; diff --git a/core/core-lib.el b/core/core-lib.el index 6835a0846..c7fbbd85c 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,9 +1,5 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -;; Built-in packages we use a lot of -(require 'subr-x) -(require 'cl-lib) - (eval-and-compile (unless EMACS26+ (with-no-warnings diff --git a/core/core.el b/core/core.el index e1d4c5517..5ba1e1b19 100644 --- a/core/core.el +++ b/core/core.el @@ -388,11 +388,18 @@ If RETURN-P, return the message as a string instead of displaying it." ;; ;; Bootstrap functions -(defun doom-initialize (&optional force-p force-load-core-p) - "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). +(defun doom-initialize-autoloads (file) + "Tries to load FILE (an autoloads file). Return t on success, throws an error +in interactive sessions, nil otherwise (but logs a warning)." + (condition-case e + (load (file-name-sans-extension file) 'noerror 'nomessage) + ((debug error) + (if noninteractive + (message "Autoload file warning: %s -> %s" (car e) (error-message-string e)) + (signal 'doom-autoload-error (list (file-name-nondirectory file) e)))))) -Loads Doom core files if in an interactive session or FORCE-LOAD-CORE-P is -non-nil. +(defun doom-initialize (&optional force-p) + "Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil). The bootstrap process involves making sure 1) the essential directories exist, 2) the core packages are installed, 3) `doom-autoload-file' and @@ -420,6 +427,10 @@ The overall load order of Doom is as follows: Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." + ;; Built-in packages we use a lot of + (require 'subr-x) + (require 'cl-lib) + (when (or force-p (not doom-init-p)) (setq doom-init-p t) ; Prevent infinite recursion @@ -447,24 +458,16 @@ to least)." noninteractive) (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them")))) + (require 'core-lib) + (require 'core-modules) (require 'core-os) - (when (or force-load-core-p (not noninteractive)) + (if noninteractive + (require 'core-cli) (add-hook 'window-setup-hook #'doom|display-benchmark) - + (require 'core-keybinds) (require 'core-ui) - (require 'core-editor) (require 'core-projects) - (require 'core-keybinds))) - -(defun doom-initialize-autoloads (file) - "Tries to load FILE (an autoloads file). Return t on success, throws an error -in interactive sessions, nil otherwise (but logs a warning)." - (condition-case e - (load (file-name-sans-extension file) 'noerror 'nomessage) - ((debug error) - (if noninteractive - (message "Autoload file warning: %s -> %s" (car e) (error-message-string e)) - (signal 'doom-autoload-error (list (file-name-nondirectory file) e)))))) + (require 'core-editor))) ;; @@ -472,16 +475,12 @@ in interactive sessions, nil otherwise (but logs a warning)." (add-to-list 'load-path doom-core-dir) -(require 'core-lib) -(require 'core-modules) -(when noninteractive - (require 'core-cli)) -(after! package - (require 'core-packages)) - (doom-initialize noninteractive) (unless noninteractive (doom-initialize-modules)) +(after! package + (require 'core-packages) + (doom-initialize-packages)) (provide 'core) ;;; core.el ends here diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index 294cc1ea7..046f33ead 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -1,6 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core-keybinds.el +(require 'core-keybinds) + (buttercup-define-matcher :to-expand-into (src result) (let ((src (funcall src)) (result (funcall result))) diff --git a/core/test/test-core-lib.el b/core/test/test-core-lib.el index 761cd49a2..608fdb66e 100644 --- a/core/test/test-core-lib.el +++ b/core/test/test-core-lib.el @@ -1,6 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core-lib.el +(require 'core-lib) + (describe "core/lib" ;; --- Helpers ---------------------------- (describe "doom-unquote" diff --git a/core/test/test-core-modules.el b/core/test/test-core-modules.el index bd9aea708..a786ad2ea 100644 --- a/core/test/test-core-modules.el +++ b/core/test/test-core-modules.el @@ -1,4 +1,6 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-core-modules.el +;; (require 'core-modules) + (describe "core-modules") diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el index d3d3a1ecf..fec4d57c6 100644 --- a/core/test/test-core-ui.el +++ b/core/test/test-core-ui.el @@ -1,6 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; ../core/test/test-core-ui.el +(require 'core-ui) + (describe "core/ui" (describe "doom|protect-visible-buffer" :var (kill-buffer-query-functions wconf a b) From c0c4b897ead04b045dfa4a4b763bf9b8605c2b9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 00:11:45 -0500 Subject: [PATCH 3917/4235] lang/python: refactor python mode-line indication --- modules/lang/python/config.el | 40 ++++++++++----------------------- modules/ui/modeline/autoload.el | 14 ++++++++++-- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index abd46e591..572026117 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -1,8 +1,5 @@ ;;; lang/python/config.el -*- lexical-binding: t; -*- -(defconst +python-mode-line-indicator '("" +python--version) - "Format for the python version/env indicator in the mode-line.") - (defvar +python-ipython-repl-args '("-i" "--simple-prompt" "--no-color-info") "CLI arguments to initialize ipython with when `+python/open-ipython-repl' is called.") @@ -52,15 +49,9 @@ called.") sp-point-after-word-p sp-point-before-same-p)) - (defun +python|detect-local-python-executable () - (let ((path (+python-executable-find "python"))) - (when path - (make-local-variable 'exec-path) - (add-to-list 'exec-path path)) - (when (bound-and-true-p doom-modeline-mode) - (setq-local doom-modeline-python-executable - (or path python-shell-interpreter))))) - (add-hook 'python-mode-hook #'+python|detect-local-python-executable) + ;; Affects pyenv and conda + (advice-add #'pythonic-activate :after-while #'+modeline|update-env-in-all-windows) + (advice-add #'pythonic-deactivate :after #'+modeline|clear-env-in-all-windows) (setq-hook! 'python-mode-hook tab-width python-indent-offset)) @@ -151,20 +142,19 @@ called.") (_ (pipenv-project-p))) (format "PIPENV_MAX_DEPTH=9999 %s run %%c %%o %%s %%a" bin) "%c %o %s %a"))) - (:description . "Run Python script"))) - (when (featurep! :ui modeline) - (advice-add #'pipenv-activate :after-while #'+modeline|update-env-in-all-windows) - (advice-add #'pipenv-deactivate :after-while #'+modeline|update-env-in-all-windows))) + (:description . "Run Python script")))) (def-package! pyvenv :after python - :config + :init (when (featurep! :ui modeline) (add-hook 'pyvenv-post-activate-hooks #'+modeline|update-env-in-all-windows) - (add-hook 'pyvenv-post-deactivate-hooks #'+modeline|update-env-in-all-windows)) + (add-hook 'pyvenv-pre-deactivate-hooks #'+modeline|clear-env-in-all-windows)) + :config + (add-hook 'hack-local-variables-hook #'pyvenv-track-virtualenv) (add-to-list 'global-mode-string - '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name)) + '(pyvenv-virtual-env-name (" venv:" pyvenv-virtual-env-name " ")) 'append)) @@ -174,10 +164,7 @@ called.") :config (pyenv-mode +1) (when (executable-find "pyenv") - (add-to-list 'exec-path (expand-file-name "shims" (or (getenv "PYENV_ROOT") "~/.pyenv")))) - (when (featurep! :ui modeline) - (advice-add #'pyenv-mode-set :after #'+modeline|update-env-in-all-windows) - (advice-add #'pyenv-mode-unset :after #'+modeline|update-env-in-all-windows))) + (add-to-list 'exec-path (expand-file-name "shims" (or (getenv "PYENV_ROOT") "~/.pyenv"))))) (def-package! conda @@ -213,10 +200,7 @@ called.") ;; integration with term/eshell (conda-env-initialize-interactive-shells) (after! eshell (conda-env-initialize-eshell)) - - (when (featurep! :ui modeline) - (add-hook 'conda-postactivate-hook #'+modeline|update-env-in-all-windows) - (add-hook 'conda-postdeactivate-hook #'+modeline|update-env-in-all-windows)) + (add-to-list 'global-mode-string - '(conda-env-current-name (" conda:" conda-env-current-name)) + '(conda-env-current-name (" conda:" conda-env-current-name " ")) 'append)) diff --git a/modules/ui/modeline/autoload.el b/modules/ui/modeline/autoload.el index 8376936a9..3c7478a65 100644 --- a/modules/ui/modeline/autoload.el +++ b/modules/ui/modeline/autoload.el @@ -29,7 +29,17 @@ made to be added to `doom-big-font-mode-hook'." ;;;###autoload (defun +modeline|update-env-in-all-windows (&rest _) - "TODO" + "Update version strings in all buffers." (dolist (window (window-list)) (with-selected-window window - (doom-modeline-update-env)))) + (doom-modeline-update-env) + (force-mode-line-update)))) + +;;;###autoload +(defun +modeline|clear-env-in-all-windows (&rest _) + "Blank out version strings in all buffers." + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (setq doom-modeline-env--version + (bound-and-true-p doom-modeline-load-string)))) + (force-mode-line-update t)) From fa26dc1269b4872ed8b9a053b588c0a6d2deea88 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 00:15:15 -0500 Subject: [PATCH 3918/4235] Refactor lang/org --- modules/lang/org/+attach.el | 66 +++++---- modules/lang/org/+babel.el | 84 ++++++------ modules/lang/org/+capture.el | 104 +++++++------- modules/lang/org/+export.el | 49 ++++--- modules/lang/org/+present.el | 18 +-- modules/lang/org/autoload/org-link.el | 17 +++ modules/lang/org/config.el | 186 ++++++++++++-------------- 7 files changed, 253 insertions(+), 271 deletions(-) diff --git a/modules/lang/org/+attach.el b/modules/lang/org/+attach.el index eee6c0223..bade75ea5 100644 --- a/modules/lang/org/+attach.el +++ b/modules/lang/org/+attach.el @@ -1,7 +1,5 @@ ;;; lang/org/+attach.el -*- lexical-binding: t; -*- -(add-hook 'org-load-hook #'+org|init-attach) - ;; I believe Org's native attachment system is over-complicated and litters ;; files with metadata I don't want. So I wrote my own, which: ;; @@ -25,7 +23,37 @@ ;; -;; Packages +;;; Bootstrap + +(setq org-attach-directory (expand-file-name +org-attach-dir org-directory) + org-download-image-dir org-attach-directory + org-download-heading-lvl nil + org-download-timestamp "_%Y%m%d_%H%M%S") + +;; A shorter link to attachments +(add-to-list 'org-link-abbrev-alist (cons "attach" (abbreviate-file-name org-attach-directory))) + +(org-link-set-parameters + "attach" + :follow (lambda (link) (find-file (expand-file-name link org-attach-directory))) + :complete (lambda (&optional _arg) + (+org--relpath (+org-link-read-file "attach" org-attach-directory) + org-attach-directory)) + :face (lambda (link) + (if (file-exists-p (expand-file-name link org-attach-directory)) + 'org-link + 'error))) + +(after! projectile + (add-to-list 'projectile-globally-ignored-directories + (car (last (split-string +org-attach-dir "/" t))))) + +(after! recentf + (add-to-list 'recentf-exclude (format "%s.+$" (regexp-quote org-attach-directory)))) + + +;; +;;; Packages (def-package! org-download :commands (org-download-dnd org-download-dnd-base64) @@ -62,35 +90,3 @@ (advice-add #'org-download--dir-2 :override #'ignore) (advice-add #'org-download--fullname :filter-return #'+org-attach*download-fullname)) - - -;; -;; Bootstrap - -(defun +org|init-attach () - (setq org-attach-directory (expand-file-name +org-attach-dir org-directory)) - (setq-default org-download-image-dir org-attach-directory - org-download-heading-lvl nil - org-download-timestamp "_%Y%m%d_%H%M%S") - - ;; A shorter link to attachments - (add-to-list 'org-link-abbrev-alist (cons "attach" (abbreviate-file-name org-attach-directory))) - - (org-link-set-parameters - "attach" - :follow (lambda (link) (find-file (expand-file-name link org-attach-directory))) - :complete (lambda (&optional _arg) - (+org--relpath (+org-link-read-file "attach" org-attach-directory) - org-attach-directory)) - :face (lambda (link) - (if (file-exists-p (expand-file-name link org-attach-directory)) - 'org-link - 'error))) - - (after! projectile - (add-to-list 'projectile-globally-ignored-directories - (car (last (split-string +org-attach-dir "/" t))))) - - (after! recentf - (add-to-list 'recentf-exclude (format "%s.+$" (regexp-quote org-attach-directory))))) - diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index f78d10a6b..1495a063f 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -1,7 +1,5 @@ ;;; lang/org/+babel.el -*- lexical-binding: t; -*- -(add-hook 'org-load-hook #'+org|init-babel) - (defvar +org-babel-mode-alist '((cpp . C) (C++ . C) @@ -16,48 +14,51 @@ For example, with (fish . shell) will cause #+BEGIN_SRC fish to load ob-shell.el when executed.") (defvar +org-babel-load-functions () - "A list of functions for loading the current executing src block. They take -one argument (the language specified in the src block, as a string). Stops at -the first function to return non-nil.") - -(defun +org|init-babel () - (setq org-src-fontify-natively t ; make code pretty - org-src-preserve-indentation t ; use native major-mode indentation - org-src-tab-acts-natively t - org-src-window-setup 'current-window - org-confirm-babel-evaluate nil) ; you don't need my permission - - (defun +org*babel-lazy-load-library (info) - "Load babel libraries as needed when babel blocks are executed." - (let* ((lang (nth 0 info)) - (lang (if (symbolp lang) lang (intern lang))) - (lang (or (cdr (assq lang +org-babel-mode-alist)) - lang))) - (when (and (not (cdr (assq lang org-babel-load-languages))) - (or (run-hook-with-args-until-success '+org-babel-load-functions lang) - (require (intern (format "ob-%s" lang)) nil t))) - (when (assq :async (nth 2 info)) - ;; ob-async has its own agenda for lazy loading packages (in the - ;; child process), so we only need to make sure it's loaded. - (require 'ob-async nil t)) - (add-to-list 'org-babel-load-languages (cons lang t))) - t)) - (advice-add #'org-babel-confirm-evaluate :after-while #'+org*babel-lazy-load-library) - - ;; I prefer C-c C-c over C-c ' (more consistent) - (define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) - - ;; `org-babel-get-header' was removed from org in 9.0. Quite a few babel - ;; plugins use it, so until those plugins update, this polyfill will do: - (defun org-babel-get-header (params key &optional others) - (cl-loop with fn = (if others #'not #'identity) - for p in params - if (funcall fn (eq (car p) key)) - collect p))) + "A list of functions executed to load the current executing src block. They +take one argument (the language specified in the src block, as a string). Stops +at the first function to return non-nil.") ;; -;; Packages +;;; Bootstrap + +(setq org-src-fontify-natively t ; make code pretty + org-src-preserve-indentation t ; use native major-mode indentation + org-src-tab-acts-natively t + org-src-window-setup 'current-window + org-confirm-babel-evaluate nil) ; you don't need my permission + +(defun +org*babel-lazy-load-library (info) + "Load babel libraries lazily when babel blocks are executed." + (let* ((lang (nth 0 info)) + (lang (if (symbolp lang) lang (intern lang))) + (lang (or (cdr (assq lang +org-babel-mode-alist)) + lang))) + (when (and (not (cdr (assq lang org-babel-load-languages))) + (or (run-hook-with-args-until-success '+org-babel-load-functions lang) + (require (intern (format "ob-%s" lang)) nil t))) + (when (assq :async (nth 2 info)) + ;; ob-async has its own agenda for lazy loading packages (in the + ;; child process), so we only need to make sure it's loaded. + (require 'ob-async nil t)) + (add-to-list 'org-babel-load-languages (cons lang t))) + t)) +(advice-add #'org-babel-confirm-evaluate :after-while #'+org*babel-lazy-load-library) + +;; I prefer C-c C-c over C-c ' (more consistent) +(define-key org-src-mode-map (kbd "C-c C-c") #'org-edit-src-exit) + +;; `org-babel-get-header' was removed from org in 9.0. Quite a few babel +;; plugins use it, so until those plugins update, this polyfill will do: +(defun org-babel-get-header (params key &optional others) + (cl-loop with fn = (if others #'not #'identity) + for p in params + if (funcall fn (eq (car p) key)) + collect p)) + + +;; +;;; Packages (def-package! ob-ipython :when (featurep! +ipython) @@ -83,7 +84,6 @@ the first function to return non-nil.") ("\\*Python:.*" :slot 0 :side right :size 100 :select nil :quit nil :transient nil))) - ;; TODO Add more popup styles ;; advices for remote kernel and org-src-edit (advice-add 'org-babel-edit-prep:ipython :override #'+org*org-babel-edit-prep:ipython) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 3b8edc8c7..25372098d 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -1,7 +1,5 @@ ;;; lang/org/+capture.el -*- lexical-binding: t; -*- -(add-hook 'org-load-hook #'+org|init-capture) - ;; Sets up some reasonable defaults, as well as two `org-capture' workflows that ;; I like: ;; @@ -28,68 +26,62 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default It is used in Doom's default `org-capture-templates'.") -(defvar org-capture-templates - '(("t" "Personal todo" entry - (file+headline +org-capture-todo-file "Inbox") - "* [ ] %?\n%i\n%a" :prepend t :kill-buffer t) - ("n" "Personal notes" entry - (file+headline +org-capture-notes-file "Inbox") - "* %u %?\n%i\n%a" :prepend t :kill-buffer t) - - ;; Will use {project-root}/{todo,notes,changelog}.org, unless a - ;; {todo,notes,changelog}.org file is found in a parent directory. - ("p" "Templates for projects") - ("pt" "Project todo" entry ; {project-root}/todo.org - (file+headline +org-capture-project-todo-file "Inbox") - "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) - ("pn" "Project notes" entry ; {project-root}/notes.org - (file+headline +org-capture-project-notes-file "Inbox") - "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) - ("pc" "Project changelog" entry ; {project-root}/changelog.org - (file+headline +org-capture-project-notes-file "Unreleased") - "* TODO %?\n%i\n%a" :prepend t :kill-buffer t))) - - -(defvar org-default-notes-file nil) ; defined in org.el - ;; -(defun +org|init-capture () - (dolist (var '(+org-capture-todo-file - +org-capture-notes-file)) - (set var (expand-file-name (symbol-value var) org-directory))) - (unless org-default-notes-file - (setq org-default-notes-file +org-capture-notes-file)) +;;; Bootstrap - (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) +(setq org-capture-templates + '(("t" "Personal todo" entry + (file+headline +org-capture-todo-file "Inbox") + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) + ("n" "Personal notes" entry + (file+headline +org-capture-notes-file "Inbox") + "* %u %?\n%i\n%a" :prepend t :kill-buffer t) - (defun +org*expand-variable-paths (file) - "If a variable is used for a file path in `org-capture-template', it is used + ;; Will use {project-root}/{todo,notes,changelog}.org, unless a + ;; {todo,notes,changelog}.org file is found in a parent directory. + ("p" "Templates for projects") + ("pt" "Project todo" entry ; {project-root}/todo.org + (file+headline +org-capture-project-todo-file "Inbox") + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) + ("pn" "Project notes" entry ; {project-root}/notes.org + (file+headline +org-capture-project-notes-file "Inbox") + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t) + ("pc" "Project changelog" entry ; {project-root}/changelog.org + (file+headline +org-capture-project-notes-file "Unreleased") + "* TODO %?\n%i\n%a" :prepend t :kill-buffer t))) + +(defvaralias '+org-capture-notes-file 'org-default-notes-file) + +(add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) + +(defun +org*capture-expand-variable-file (file) + "If a variable is used for a file path in `org-capture-template', it is used as is, and expanded relative to `default-directory'. This changes it to be relative to `org-directory', unless it is an absolute path." - (if (and (symbolp file) (boundp file)) - (expand-file-name (symbol-value file) org-directory) - file)) - (advice-add #'org-capture-expand-file :filter-args #'+org*expand-variable-paths) + (if (and (symbolp file) (boundp file)) + (expand-file-name (symbol-value file) org-directory) + file)) +(advice-add #'org-capture-expand-file :filter-args #'+org*capture-expand-variable-file) - (defun +org*prevent-save-prompts-when-refiling (&rest _) - "Fix #462: when refiling from org-capture, Emacs prompts to kill the +(defun +org*prevent-save-prompts-when-refiling (&rest _) + "Fix #462: when refiling from org-capture, Emacs prompts to kill the underlying, modified buffer. This fixes that." - (when (bound-and-true-p org-capture-is-refiling) - (org-save-all-org-buffers))) - (advice-add 'org-refile :after #'+org*prevent-save-prompts-when-refiling) + (when (bound-and-true-p org-capture-is-refiling) + (org-save-all-org-buffers))) +(advice-add 'org-refile :after #'+org*prevent-save-prompts-when-refiling) - (defun +org|show-target-in-capture-header () - (setq header-line-format - (format "%s%s%s" - (propertize (abbreviate-file-name (buffer-file-name (buffer-base-buffer))) - 'face 'font-lock-string-face) - org-eldoc-breadcrumb-separator - header-line-format))) - (add-hook 'org-capture-mode-hook #'+org|show-target-in-capture-header) +(defun +org|show-target-in-capture-header () + (setq header-line-format + (format "%s%s%s" + (propertize (abbreviate-file-name (buffer-file-name (buffer-base-buffer))) + 'face 'font-lock-string-face) + org-eldoc-breadcrumb-separator + header-line-format))) +(add-hook 'org-capture-mode-hook #'+org|show-target-in-capture-header) - (when (featurep! :feature evil) - (add-hook 'org-capture-mode-hook #'evil-insert-state)) +(when (featurep! :feature evil) + (add-hook 'org-capture-mode-hook #'evil-insert-state)) - (when (featurep! :ui doom-dashboard) - (add-hook '+doom-dashboard-inhibit-functions #'+org-capture-frame-p))) +(when (featurep! :ui doom-dashboard) + (add-hook '+doom-dashboard-inhibit-functions #'+org-capture-frame-p)) diff --git a/modules/lang/org/+export.el b/modules/lang/org/+export.el index ac418cc66..1e93bfe48 100644 --- a/modules/lang/org/+export.el +++ b/modules/lang/org/+export.el @@ -1,7 +1,5 @@ ;;; lang/org/+export.el -*- lexical-binding: t; -*- -(add-hook 'org-load-hook #'+org|init-export) - ;; I don't have any beef with org's built-in export system, but I do wish it ;; would export to a central directory (by default), rather than ;; `default-directory'. This is because all my org files are usually in one @@ -14,30 +12,29 @@ path too.") ;; -(defun +org|init-export () - (setq org-export-backends '(ascii html latex md) - org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/")) +(setq org-export-backends '(ascii html latex md) + org-publish-timestamp-directory (concat doom-cache-dir "org-timestamps/")) - (when (and (executable-find "pandoc") - (require 'ox-pandoc nil t)) - (add-to-list 'org-export-backends 'pandoc nil #'eq) - (setq org-pandoc-options - '((standalone . t) - (mathjax . t) - (variable . "revealjs-url=https://cdn.jsdelivr.net/npm/reveal.js@3/")))) +(when (and (executable-find "pandoc") + (require 'ox-pandoc nil t)) + (add-to-list 'org-export-backends 'pandoc nil #'eq) + (setq org-pandoc-options + '((standalone . t) + (mathjax . t) + (variable . "revealjs-url=https://cdn.jsdelivr.net/npm/reveal.js@3/")))) - ;; Export to a central location by default or if target isn't in - ;; `org-directory'. - (defun +org*export-output-file-name (args) - "Return a centralized export location unless one is provided or the current +;; Export to a central location by default or if target isn't in +;; `org-directory'. +(defun +org*export-output-file-name (args) + "Return a centralized export location unless one is provided or the current file isn't in `org-directory'." - (when (and (not (nth 2 args)) - buffer-file-name - (file-in-directory-p buffer-file-name org-directory)) - (cl-destructuring-bind (extension &optional subtreep _pubdir) args - (let ((dir (expand-file-name +org-export-dir org-directory))) - (unless (file-directory-p dir) - (make-directory dir t)) - (setq args (list extension subtreep dir))))) - args) - (advice-add #'org-export-output-file-name :filter-args #'+org*export-output-file-name)) + (when (and (not (nth 2 args)) + buffer-file-name + (file-in-directory-p buffer-file-name org-directory)) + (cl-destructuring-bind (extension &optional subtreep _pubdir) args + (let ((dir (expand-file-name +org-export-dir org-directory))) + (unless (file-directory-p dir) + (make-directory dir t)) + (setq args (list extension subtreep dir))))) + args) +(advice-add #'org-export-output-file-name :filter-args #'+org*export-output-file-name) diff --git a/modules/lang/org/+present.el b/modules/lang/org/+present.el index ae054aa1d..bc6938a4f 100644 --- a/modules/lang/org/+present.el +++ b/modules/lang/org/+present.el @@ -1,7 +1,5 @@ ;;; lang/org/+present.el -*- lexical-binding: t; -*- -(add-hook 'org-load-hook #'+org|init-present) - (defvar +org-present-text-scale 7 "The `text-scale-amount' for `org-tree-slide-mode'.") @@ -10,7 +8,7 @@ ;; Packages (def-package! ox-reveal - :defer t + :after ox :init ;; Fix #1127, where ox-reveal adds an errant entry to ;; `org-structure-template-alist' @@ -34,18 +32,10 @@ :n [left] #'org-tree-slide-move-previous-tree) (add-hook! 'org-tree-slide-mode-after-narrow-hook - #'(+org-present|detect-slide +org-present|add-overlays org-display-inline-images)) + #'(+org-present|detect-slide + +org-present|add-overlays + org-display-inline-images)) (add-hook 'org-tree-slide-mode-hook #'+org-present|init-org-tree-window) (advice-add #'org-tree-slide--display-tree-with-narrow :around #'+org-present*narrow-to-subtree)) - - -(def-package! centered-window :commands centered-window-mode) - - -;; -;; Bootstrap - -(defun +org|init-present () - (require 'ox-reveal)) diff --git a/modules/lang/org/autoload/org-link.el b/modules/lang/org/autoload/org-link.el index 8d55ef8d0..62e37f7c0 100644 --- a/modules/lang/org/autoload/org-link.el +++ b/modules/lang/org/autoload/org-link.el @@ -13,3 +13,20 @@ (format "%s:%s" key (file-relative-name file dir)))) + +;;;###autoload +(defun +org-inline-data-image (_protocol link _description) + "Interpret LINK as base64-encoded image data." + (base64-decode-string link)) + +;;;###autoload +(defun +org-image-link (protocol link _description) + "Interpret LINK as base64-encoded image data." + (when (image-type-from-file-name link) + (if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link)))) + (with-current-buffer buf + (goto-char (point-min)) + (re-search-forward "\r?\n\r?\n" nil t) + (buffer-substring-no-properties (point) (point-max))) + (message "Download of image \"%s\" failed" link) + nil))) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0e962491b..025107d04 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -1,8 +1,5 @@ ;;; lang/org/config.el -*- lexical-binding: t; -*- -;; FIXME deprecated -(define-obsolete-variable-alias '+org-dir 'org-directory "2.1.0") - ;; Changed org defaults (should be set before org loads) (defvar org-directory "~/org/") (defvar org-modules @@ -17,25 +14,58 @@ ;; org-rmail )) -;; Sub-modules -(if (featurep! +attach) (load! "+attach")) -(if (featurep! +babel) (load! "+babel")) -(if (featurep! +capture) (load! "+capture")) -(if (featurep! +export) (load! "+export")) -(if (featurep! +present) (load! "+present")) -;; TODO (if (featurep! +publish) (load! "+publish")) -(doom-load-packages-incrementally - '(calendar find-func format-spec org-macs org-compat - org-faces org-entities org-list org-pcomplete org-src - org-footnote org-macro ob org org-agenda org-capture)) +;; +;;; Bootstrap + +(def-package! org + :defer-incrementally + (calendar find-func format-spec org-macs org-compat org-faces org-entities + org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda + org-capture) + :init + (add-hook! 'org-load-hook + #'(+org|setup-ui + +org|setup-popup-rules + +org|setup-agenda + +org|setup-keybinds + +org|setup-hacks + +org|setup-pretty-code + +org|setup-custom-links)) + + (add-hook! 'org-mode-hook + #'(org-bullets-mode ; "prettier" bullets + org-indent-mode ; margin-based indentation + toc-org-enable ; auto-table of contents + auto-fill-mode ; line wrapping + ;; `show-paren-mode' causes flickering with indentation margins made by + ;; `org-indent-mode', so we simply turn off show-paren-mode altogether." + doom|disable-show-paren-mode + + +org|enable-auto-reformat-tables + +org|enable-auto-update-cookies + +org|smartparens-compatibility-config + +org|unfold-to-2nd-level-or-point)) + + :config + ;; Sub-modules + (if (featurep! +attach) (load! "+attach")) + (if (featurep! +babel) (load! "+babel")) + (if (featurep! +capture) (load! "+capture")) + (if (featurep! +export) (load! "+export")) + (if (featurep! +present) (load! "+present"))) ;; -;; Packages +;;; Packages ;; `toc-org' -(setq toc-org-hrefify-default "org") +(setq toc-org-hrefify-default "gh") +(defun +org*unfold-toc (&rest _) + (save-excursion + (when (re-search-forward toc-org-toc-org-regexp (point-max) t) + (+org/open-fold)))) +(advice-add #'toc-org-insert-toc :before #'+org*unfold-toc) (def-package! evil-org :when (featurep! :feature evil +everywhere) @@ -43,7 +73,7 @@ :init (defvar evil-org-key-theme '(navigation insert textobjects)) (defvar evil-org-special-o/O '(table-row)) - (add-hook 'org-load-hook #'+org|setup-evil) + (add-hook 'org-load-hook #'+org|setup-evil-keybinds) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config ;; change `evil-org-key-theme' instead @@ -56,65 +86,34 @@ :when (featurep! :tools pdf) :commands (org-pdfview-open) :init - (after! org - (delete '("\\.pdf\\'" . default) org-file-apps) - ;; org links to pdf files are opened in pdf-view-mode - (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (_file link) (org-pdfview-open link)))) - ;; support for links to specific pages - (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link)))))) + (delete '("\\.pdf\\'" . default) org-file-apps) + ;; org links to pdf files are opened in pdf-view-mode + (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (_file link) (org-pdfview-open link)))) + ;; support for links to specific pages + (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link))))) -(def-package! org-yt - :after org +(def-package! org-crypt ; built-in + :commands org-encrypt-entries + :hook (org-reveal-start . org-decrypt-entry) + :init + (add-hook! 'org-mode-hook + (add-hook 'before-save-hook 'org-encrypt-entries nil t)) :config - (defun +org-inline-data-image (_protocol link _description) - "Interpret LINK as base64-encoded image data." - (base64-decode-string link)) + (setq org-tags-exclude-from-inheritance '("crypt") + org-crypt-key user-mail-address)) - (defun +org-image-link (protocol link _description) - "Interpret LINK as base64-encoded image data." - (when (image-type-from-file-name link) - (if-let* ((buf (url-retrieve-synchronously (concat protocol ":" link)))) - (with-current-buffer buf - (goto-char (point-min)) - (re-search-forward "\r?\n\r?\n" nil t) - (buffer-substring-no-properties (point) (point-max))) - (message "Download of image \"%s\" failed" link) - nil))) - - (org-link-set-parameters "http" :image-data-fun #'+org-image-link) - (org-link-set-parameters "https" :image-data-fun #'+org-image-link) - (org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image)) +(def-package! org-clock ; built-in + :commands org-clock-save + :hook (org-mode . org-clock-load) + :init + (setq org-clock-persist 'history + org-clock-persist-file (concat doom-etc-dir "org-clock-save.el")) + :config + (add-hook 'kill-emacs-hook #'org-clock-save)) ;; -;; Bootstrap - -(add-hook! 'org-load-hook - #'(+org|setup-ui - +org|setup-popup-rules - +org|setup-agenda - +org|setup-keybinds - +org|setup-hacks - +org|setup-pretty-code - +org|setup-custom-links)) - -(add-hook! 'org-mode-hook - #'(org-bullets-mode ; "prettier" bullets - org-indent-mode ; margin-based indentation - toc-org-enable ; auto-table of contents - auto-fill-mode ; line wrapping - ;; `show-paren-mode' causes flickering with indentation margins made by - ;; `org-indent-mode', so we simply turn off show-paren-mode altogether." - doom|disable-show-paren-mode - - +org|enable-auto-reformat-tables - +org|enable-auto-update-cookies - +org|smartparens-compatibility-config - +org|unfold-to-2nd-level-or-point)) - - -;; -;; `org-mode' hooks +;;; `org-mode' hooks (defun +org|unfold-to-2nd-level-or-point () "My version of the 'overview' #+STARTUP option: expand first-level headings. @@ -163,7 +162,7 @@ unfold to point on startup." ;; -;; `org-load' hooks +;;; `org-load' hooks (defun +org|setup-agenda () (unless org-agenda-files @@ -179,6 +178,7 @@ unfold to point on startup." org-agenda-start-on-weekday nil org-agenda-start-day "-3d")) + (defun +org|setup-popup-rules () "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." (set-popup-rules! @@ -189,6 +189,7 @@ unfold to point on startup." ("^\\*Org Src" :size 0.3 :quit nil :select t :autosave t :ttl nil) ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t :autosave t)))) + (defun +org|setup-pretty-code () "Setup the default pretty symbols for" (set-pretty-symbols! 'org-mode @@ -196,6 +197,7 @@ unfold to point on startup." :src_block "#+BEGIN_SRC" :src_block_end "#+END_SRC")) + (defun +org|setup-custom-links () "Set up custom org links." (setq org-link-abbrev-alist @@ -235,7 +237,14 @@ unfold to point on startup." (+org-def-link "org" org-directory) (+org-def-link "doom" doom-emacs-dir) (+org-def-link "doom-docs" doom-docs-dir) - (+org-def-link "doom-modules" doom-modules-dir)) + (+org-def-link "doom-modules" doom-modules-dir) + + (def-package! org-yt + :config + (org-link-set-parameters "http" :image-data-fun #'+org-image-link) + (org-link-set-parameters "https" :image-data-fun #'+org-image-link) + (org-link-set-parameters "img" :image-data-fun #'+org-inline-data-image))) + (defun +org|setup-ui () "Configures the UI for `org-mode'." @@ -272,8 +281,8 @@ unfold to point on startup." org-startup-with-inline-images nil org-tags-column 0 org-todo-keywords - '((sequence "[ ](t)" "[-](p)" "[?](m)" "|" "[X](d)") - (sequence "TODO(T)" "|" "DONE(D)") + '((sequence "TODO(t)" "|" "DONE(d)") + (sequence "[ ](T)" "[-](p)" "[?](m)" "|" "[X](D)") (sequence "NEXT(n)" "WAITING(w)" "LATER(l)" "|" "CANCELLED(c)")) org-todo-keyword-faces '(("[-]" :inherit (font-lock-constant-face bold)) @@ -303,6 +312,7 @@ unfold to point on startup." :background nil t)))) (add-hook 'doom-load-theme-hook #'+org|update-latex-preview-background-color)) + (defun +org|setup-keybinds () "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies between the two." @@ -331,7 +341,8 @@ between the two." [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) -(defun +org|setup-evil (&rest args) + +(defun +org|setup-evil-keybinds (&rest args) ;; In case this hook is used in an advice on `evil-org-set-key-theme', this ;; prevents recursive requires. (unless args (require 'evil-org)) @@ -420,6 +431,7 @@ between the two." "G" (λ! (org-clock-goto 'select)) "x" #'org-clock-cancel))) + (defun +org|setup-hacks () "Getting org to behave." ;; Don't open separate windows @@ -469,29 +481,7 @@ conditions where a window's buffer hasn't changed at the time this hook is run." ;; -;; Built-in libraries +;;; In case org has already been loaded (or you're running `doom/reload') -(def-package! org-crypt ; built-in - :commands org-encrypt-entries - :hook (org-reveal-start . org-decrypt-entry) - :init - (add-hook! 'org-mode-hook - (add-hook 'before-save-hook 'org-encrypt-entries nil t)) - :config - (setq org-tags-exclude-from-inheritance '("crypt") - org-crypt-key user-mail-address)) - -(def-package! org-clock - :commands org-clock-save - :hook (org-mode . org-clock-load) - :defer-incrementally t - :init - (setq org-clock-persist 'history - org-clock-persist-file (concat doom-etc-dir "org-clock-save.el")) - :config - (add-hook 'kill-emacs-hook #'org-clock-save)) - - -;; In case org has already been loaded (or you're running `doom/reload') (when (featurep 'org) (run-hooks 'org-load-hook)) From 8f2fb079481e12a18ab9271dd0d2b8e8b3878e93 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 00:18:52 -0500 Subject: [PATCH 3919/4235] Add advice-add! & advice-remove! helpers --- core/core-lib.el | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/core/core-lib.el b/core/core-lib.el index c7fbbd85c..15bad0a1b 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -356,6 +356,33 @@ Body forms can access the hook's arguments through the let-bound variable (push `(setq-local ,var ,val) forms))) (nreverse forms)))) +(defun advice-add! (symbols where functions) + "Variadic version of `advice-add'. + +SYMBOLS and FUNCTIONS can be lists of functions." + (let ((functions (if (functionp functions) + (list functions) + functions))) + (dolist (s (doom-enlist symbols)) + (dolist (f (doom-enlist functions)) + (advice-add s where f))))) + +(defun advice-remove! (symbols where-or-fns &optional functions) + "Variadic version of `advice-remove'. + +WHERE-OR-FNS is ignored if FUNCTIONS is provided. This lets you substitute +advice-add with advice-remove and evaluate them without having to modify every +statement." + (unless functions + (setq functions where-or-fns + where-or-fns nil)) + (let ((functions (if (functionp functions) + (list functions) + functions))) + (dolist (s (doom-enlist symbols)) + (dolist (f (doom-enlist functions)) + (advice-remove s f))))) + (cl-defmacro associate! (mode &key modes match files when) "Enables a minor mode if certain conditions are met. From a05b1877be253149cac64b67fb62ff2dadb55935 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 00:26:51 -0500 Subject: [PATCH 3920/4235] Rewrite switch-{buffer,window} hooks + Add doom-switch-frame-hook + Replace doom-{enter,exit}-{buffer,window}-hook with doom-switch-{buffer,window}-hook + New switch-buffer hooks run on buffer-list-update-hook rather than in select-window advice. + Blank our buffer-list-update-hook in some places to reduce how many times it gets triggered. --- core/autoload/buffers.el | 20 ++--- core/core-editor.el | 6 +- core/core-ui.el | 110 +++++++++++++-------------- core/test/test-core.el | 42 +++++----- modules/tools/editorconfig/config.el | 3 +- modules/tools/flycheck/config.el | 2 +- modules/tools/wakatime/autoload.el | 4 +- modules/ui/doom-dashboard/config.el | 8 +- modules/ui/nav-flash/config.el | 2 +- 9 files changed, 93 insertions(+), 104 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index f077ccb65..2d0002714 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -49,7 +49,8 @@ BUF should be skipped over by functions like `next-buffer' and `other-buffer'." (defun doom-fallback-buffer () "Returns the fallback buffer, creating it if necessary. By default this is the scratch buffer. See `doom-fallback-buffer-name' to change this." - (get-buffer-create doom-fallback-buffer-name)) + (let (buffer-list-update-hook) + (get-buffer-create doom-fallback-buffer-name))) ;;;###autoload (defalias 'doom-buffer-list #'buffer-list) @@ -219,14 +220,15 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (format "Buffer %s is modified; kill anyway?" buf)))) (message "Aborted") (set-buffer-modified-p nil) - (when (or ;; if there aren't more real buffers than visible buffers, - ;; then there are no real, non-visible buffers left. - (not (cl-set-difference (doom-real-buffer-list) - (doom-visible-buffers))) - ;; if we end up back where we start (or previous-buffer - ;; returns nil), we have nowhere left to go - (memq (previous-buffer) (list buf 'nil))) - (switch-to-buffer (doom-fallback-buffer))) + (let (buffer-list-update-hook) + (when (or ;; if there aren't more real buffers than visible buffers, + ;; then there are no real, non-visible buffers left. + (not (cl-set-difference (doom-real-buffer-list) + (doom-visible-buffers))) + ;; if we end up back where we start (or previous-buffer + ;; returns nil), we have nowhere left to go + (memq (previous-buffer) (list buf 'nil))) + (switch-to-buffer (doom-fallback-buffer)))) (kill-buffer buf))) ((funcall orig-fn))))) diff --git a/core/core-editor.el b/core/core-editor.el index e758f814d..0972e1856 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -147,7 +147,7 @@ savehist file." (def-package! smartparens ;; Auto-close delimiters and blocks as you type. It's more powerful than that, ;; but that is all Doom uses it for. - :after-call (doom-exit-buffer-hook after-find-file) + :after-call (doom-switch-buffer-hook after-find-file) :commands (sp-pair sp-local-pair sp-with-modes sp-point-in-comment sp-point-in-string) :config (require 'smartparens-config) @@ -220,9 +220,9 @@ savehist file." (advice-add #'dtrt-indent-mode :around #'doom*fix-broken-smie-modes)) -(def-package! undo-tree +(def-package! undo-tree ;; Branching & persistent undo - :after-call (doom-exit-buffer-hook after-find-file) + :after-call (doom-switch-buffer-hook after-find-file) :config (setq undo-tree-auto-save-history t ;; undo-in-region is known to cause undo history corruption, which can diff --git a/core/core-ui.el b/core/core-ui.el index 691e679d7..a32ffe90a 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -66,71 +66,60 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") "Hook run after the theme is loaded with `load-theme' or reloaded with `doom/reload-theme'.") -(defvar doom-exit-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. +(defvar doom-switch-buffer-hook nil + "TODO") -Also see `doom-enter-window-hook'.") +(defvar doom-switch-window-hook nil + "TODO") -(defvar doom-enter-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. - -Also see `doom-exit-window-hook'.") - -(defvar doom-exit-buffer-hook nil - "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-enter-buffer-hook'.") - -(defvar doom-enter-buffer-hook nil - "Hook run before `switch-to-buffer', `pop-to-buffer' or `display-buffer' are -called. The buffer to be switched to is current when these hooks run. - -Also see `doom-exit-buffer-hook'.") +(defvar doom-switch-frame-hook nil + "TODO") (defvar doom-inhibit-switch-buffer-hooks nil - "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'. -Do not set this directly.") + "Letvar for inhibiting `doom-switch-buffer-hook'. Do not set this directly.") (defvar doom-inhibit-switch-window-hooks nil - "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'. -Do not set this directly.") + "Letvar for inhibiting `doom-switch-window-hook'. Do not set this directly.") +(defvar doom-inhibit-switch-frame-hooks nil + "Letvar for inhibiting `doom-switch-frame-hook'. Do not set this directly.") -(defun doom*switch-window-hooks (orig-fn window &optional norecord) - (if (or doom-inhibit-switch-window-hooks - norecord - (eq window (selected-window)) - (window-minibuffer-p window)) - (funcall orig-fn window norecord) - (let ((doom-inhibit-switch-window-hooks t)) - (run-hooks 'doom-exit-window-hook) - (prog1 (funcall orig-fn window norecord) - (run-hooks 'doom-enter-window-hook))))) +(defvar doom--last-window nil) +(defvar doom--last-frame nil) -(defun doom*switch-buffer-hooks (orig-fn buffer-or-name &rest args) +(defun doom|run-switch-window-hooks () + (unless (or doom-inhibit-switch-buffer-hooks + (eq doom--last-window (selected-window)) + (minibufferp)) + (let ((doom-inhibit-switch-buffer-hooks t)) + (run-hooks 'doom-switch-window-hook) + (doom-log "Window switched to %s" (selected-window)) + (setq doom--last-window (selected-window))))) + +(defun doom|run-switch-frame-hooks (&rest _) + (let ((selected-frame (selected-frame))) + (unless (or doom-inhibit-switch-frame-hooks + (eq doom--last-frame (selected-frame)) + (frame-parameter nil 'parent-frame)) + (let ((doom-inhibit-switch-frame-hooks t)) + (run-hooks 'doom-switch-frame-hook) + (doom-log "Frame switched to %s" (selected-frame)) + (setq doom--last-frame (selected-frame)))))) + +(defun doom*run-switch-buffer-hooks (orig-fn buffer-or-name &rest args) (if (or doom-inhibit-switch-buffer-hooks - (null buffer-or-name) - (if (eq orig-fn 'switch-to-buffer) (car args)) - (if (eq orig-fn 'pop-to-buffer) (nth 1 args)) - (eq (get-buffer buffer-or-name) (current-buffer))) + (if (eq orig-fn 'switch-to-buffer) + (car args) ; norecord + (eq (get-buffer buffer-or-name) (current-buffer)))) (apply orig-fn buffer-or-name args) (let ((doom-inhibit-switch-buffer-hooks t)) - (run-hooks 'doom-exit-buffer-hook) + (doom-log "Buffer switched in %s" (selected-window)) (prog1 (apply orig-fn buffer-or-name args) - (run-hooks 'doom-enter-buffer-hook))))) + (run-hooks 'doom-switch-buffer-hook))))) -(defun doom-init-switch-hooks (&optional disable) - (dolist (spec '((select-window . doom*switch-window-hooks) - (switch-to-buffer . doom*switch-buffer-hooks) - (display-buffer . doom*switch-buffer-hooks) - (pop-to-buffer . doom*switch-buffer-hooks))) - (if disable - (advice-remove (car spec) (cdr spec)) - (advice-add (car spec) :around (cdr spec))))) - -(defun doom*load-theme-hooks (theme &rest _) +(defun doom*run-load-theme-hooks (theme &optional _no-confirm no-enable) "Set up `doom-load-theme-hook' to run after `load-theme' is called." - (setq doom-theme theme) - (run-hooks 'doom-load-theme-hook)) + (unless no-enable + (setq doom-theme theme) + (run-hooks 'doom-load-theme-hook))) (defun doom|protect-visible-buffer () "Don't kill the current buffer if it is visible in another window (bury it @@ -292,13 +281,14 @@ read-only or not file-visiting." (def-package! winner ;; undo/redo changes to Emacs' window layout - :hook (doom-exit-window . winner-mode) - :preface (defvar winner-dont-bind-my-keys t)) ; I'll bind keys myself + :after-call (after-find-file doom-switch-window-hook) + :preface (defvar winner-dont-bind-my-keys t) + :config (winner-mode +1)) ; I'll bind keys myself (def-package! paren ;; highlight matching delimiters - :after-call (after-find-file doom-exit-buffer-hook) + :after-call (after-find-file doom-switch-buffer-hook) :init (defun doom|disable-show-paren-mode () "Turn off `show-paren-mode' buffer-locally." @@ -539,9 +529,13 @@ frame's window-system, the theme will be reloaded.") (add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) (add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) - ;; Set up `doom-enter-buffer-hook', `doom-exit-buffer-hook', - ;; `doom-enter-window-hook' and `doom-exit-window-hook' - (doom-init-switch-hooks)) + ;; Initialize custom switch-{buffer,window,frame} hooks: + ;; + `doom-switch-buffer-hook' + ;; + `doom-switch-window-hook' + ;; + `doom-switch-frame-hook' + (add-hook 'buffer-list-update-hook #'doom|run-switch-window-hooks) + (add-hook 'focus-in-hook #'doom|run-switch-frame-hooks) + (advice-add! '(switch-to-buffer display-buffer) :around #'doom*run-switch-buffer-hooks)) ;; Set fonts (add-hook 'doom-init-ui-hook #'doom|init-fonts) diff --git a/core/test/test-core.el b/core/test/test-core.el index ec920105e..1a3fc80fc 100644 --- a/core/test/test-core.el +++ b/core/test/test-core.el @@ -61,43 +61,39 @@ (before-each (setq a (switch-to-buffer (get-buffer-create "a")) b (get-buffer-create "b")) - (spy-on 'before-hook) - (spy-on 'after-hook) - (doom-init-switch-hooks)) + (spy-on 'hook) + (add-hook 'buffer-list-update-hook #'doom|run-switch-window-hooks) + (add-hook 'focus-in-hook #'doom|run-switch-frame-hooks) + (advice-add! '(switch-to-buffer display-buffer) :around #'doom*run-switch-buffer-hooks)) (after-each - (doom-init-switch-hooks 'disable) + (remove-hook 'buffer-list-update-hook #'doom|run-switch-window-hooks) + (remove-hook 'focus-in-hook #'doom|run-switch-frame-hooks) + (advice-remove! '(switch-to-buffer display-buffer) #'doom*run-switch-buffer-hooks) (kill-buffer a) (kill-buffer b)) (describe "switch-buffer" - :var (doom-exit-buffer-hook - doom-enter-buffer-hook) + :var (doom-switch-buffer-hook) (before-each - (setq doom-exit-buffer-hook '(before-hook) - doom-enter-buffer-hook '(after-hook))) + (setq doom-switch-buffer-hook '(hook))) (after-each - (setq doom-exit-buffer-hook nil - doom-enter-buffer-hook nil)) + (setq doom-switch-buffer-hook nil)) (it "should trigger when switching buffers" (switch-to-buffer b) (switch-to-buffer a) (switch-to-buffer b) - (expect 'before-hook :to-have-been-called-times 3) - (expect 'after-hook :to-have-been-called-times 3)) + (expect 'hook :to-have-been-called-times 3)) (it "should trigger only once on the same buffer" (switch-to-buffer b) (switch-to-buffer b) (switch-to-buffer a) - (expect 'before-hook :to-have-been-called-times 2) - (expect 'after-hook :to-have-been-called-times 2))) + (expect 'hook :to-have-been-called-times 2))) (describe "switch-window" - :var (doom-exit-window-hook - doom-enter-window-hook - x y) + :var (doom-switch-window-hook x y) (before-each (delete-other-windows) (setq x (get-buffer-window a) @@ -105,21 +101,17 @@ (with-selected-window y (switch-to-buffer b)) (select-window x) - (spy-calls-reset 'before-hook) - (spy-calls-reset 'after-hook) - (setq doom-exit-window-hook '(before-hook) - doom-enter-window-hook '(after-hook))) + (spy-calls-reset 'hook) + (setq doom-switch-window-hook '(hook))) (it "should trigger when switching windows" (select-window y) (select-window x) (select-window y) - (expect 'before-hook :to-have-been-called-times 3) - (expect 'after-hook :to-have-been-called-times 3)) + (expect 'hook :to-have-been-called-times 3)) (it "should trigger only once on the same window" (select-window y) (select-window y) (select-window x) - (expect 'before-hook :to-have-been-called-times 2) - (expect 'after-hook :to-have-been-called-times 2)))))) + (expect 'hook :to-have-been-called-times 2)))))) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index b1d18a55f..cff636d44 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -18,8 +18,7 @@ ;; Handles whitespace (tabs/spaces) settings externally. This way projects can ;; specify their own formatting rules. (def-package! editorconfig - :defer 3 - :after-call (doom-enter-buffer-hook after-find-file) + :after-call (doom-switch-buffer-hook after-find-file) :config ;; Register missing indent variables (unless (assq 'mips-mode editorconfig-indentation-alist) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index adc034cb4..57c98bfda 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -9,7 +9,7 @@ (def-package! flycheck :commands (flycheck-list-errors flycheck-buffer) - :after-call (doom-enter-buffer-hook after-find-file) + :after-call (doom-switch-buffer-hook after-find-file) :config ;; Emacs feels snappier without checks on newline (setq flycheck-check-syntax-automatically (delq 'new-line flycheck-check-syntax-automatically)) diff --git a/modules/tools/wakatime/autoload.el b/modules/tools/wakatime/autoload.el index 73aaae385..e07702ab8 100644 --- a/modules/tools/wakatime/autoload.el +++ b/modules/tools/wakatime/autoload.el @@ -44,14 +44,14 @@ warning)." (make-directory +wakatime-home t))) (global-wakatime-mode +1)) ;; - (remove-hook 'doom-exit-buffer-hook #'+wakatime|autostart) + (remove-hook 'doom-switch-buffer-hook #'+wakatime|autostart) (advice-remove 'after-find-file #'+wakatime|autostart)) ;;;###autoload (defun +wakatime|delayed-autostart (&rest _) "Lazily initialize `wakatime-mode' until the next time you switch buffers or open a file." - (add-hook 'doom-exit-buffer-hook #'+wakatime|autostart) + (add-hook 'doom-switch-buffer-hook #'+wakatime|autostart) ;; this is necessary in case the user opens emacs with file arguments (advice-add 'after-find-file :before #'+wakatime|autostart)) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index 8bbbe9267..a0be1f422 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -196,7 +196,7 @@ PLIST can have the following properties: (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) (add-hook 'window-size-change-functions #'+doom-dashboard|resize) (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) - (add-hook 'doom-enter-buffer-hook #'+doom-dashboard|reload-on-kill) + (add-hook 'doom-switch-buffer-hook #'+doom-dashboard|reload-on-kill) ;; `persp-mode' integration: update `default-directory' when switching (add-hook 'persp-created-functions #'+doom-dashboard|record-project) (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) @@ -228,7 +228,8 @@ whose dimensions may not be fully initialized by the time this is run." (defun +doom-dashboard|resize (&rest _) "Recenter the dashboard, and reset its margins and fringes." - (let ((windows (get-buffer-window-list (doom-fallback-buffer) nil t))) + (let ((windows (get-buffer-window-list (doom-fallback-buffer) nil t)) + buffer-list-update-hook) (dolist (win windows) (set-window-start win 0) (set-window-fringes win 0 0) @@ -274,7 +275,8 @@ project (which may be different across perspective)." (defun +doom-dashboard-initial-buffer () "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (get-buffer-create +doom-dashboard-name)) + (let (buffer-list-update-hook) + (get-buffer-create +doom-dashboard-name))) (defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." diff --git a/modules/ui/nav-flash/config.el b/modules/ui/nav-flash/config.el index d59b7e2be..e84837bbb 100644 --- a/modules/ui/nav-flash/config.el +++ b/modules/ui/nav-flash/config.el @@ -11,7 +11,7 @@ ;; NOTE In :feature lookup `recenter' is hooked to a bunch of jumping ;; commands, which will trigger nav-flash. (add-hook! - '(doom-enter-window-hook + '(doom-switch-window-hook imenu-after-jump-hook evil-jumps-post-jump-hook counsel-grep-post-action-hook dumb-jump-after-jump-hook) #'+nav-flash|blink-cursor-maybe) From 44de995ca50999f0736d0ce009ff27e02c30249c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 19:34:03 -0500 Subject: [PATCH 3921/4235] config/default: change SPC h keymaps SPC h now maps to help-map to reduce redundancy. Some adjustments and additions were made to this map so all users (evil and vanilla) can benefit from Doom's extra help commands. --- core/autoload/help.el | 12 ++++- modules/config/default/+evil-bindings.el | 67 ++++++++++++------------ 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 65832dc9c..17d7fb036 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -337,4 +337,14 @@ whose car is the list of faces and cadr is the list of overlay faces." (defun doom/open-manual () "TODO" (interactive) - (find-file (expand-file-name "index.org" doom-docs-dir))) + (user-error "This command isn't implemented yet") + ;; (find-file (expand-file-name "index.org" doom-docs-dir)) + ) + +;;;###autoload +(defun doom/open-news () + "TODO" + (interactive) + (user-error "This command isn't implemented yet") + ;; (find-file (expand-file-name (concat "news/" doom-version) doom-docs-dir)) + ) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 6ffe5cb27..a4e03fe7a 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -165,7 +165,38 @@ ;; evil-surround :v "S" #'evil-surround-region :o "s" #'evil-surround-edit - :o "S" #'evil-Surround-edit) + :o "S" #'evil-Surround-edit + + ;; help + (:map help-map + "'" #'doom/what-face + "." #'helpful-at-point ; replaces `display-local-help' + "a" #'apropos ; replaces `apropos-command' + "A" #'doom/describe-autodefs + "B" #'doom/open-bug-report + "d" #'doom/describe-module ; replaces `apropos-documentation' b/c `apropos' covers this + "D" #'doom/open-manual + "E" #'doom/open-vanilla-sandbox + "F" #'describe-face ; replaces `Info-got-emacs-command-node' b/c redundant w/ helpful + "h" #'+lookup/documentation ; replaces `view-hello-file' b/c annoying + "L" #'global-command-log-mode ; replaces `describe-language-environment' b/c remapped to C-l + "C-l" #'describe-language-environment + "M" #'doom/describe-active-minor-mode + "C-m" #'info-emacs-manual + "n" #'doom/open-news ; replaces `view-emacs-news' b/c it's on C-n too + "O" #'+lookup/online + "p" #'doom/describe-package ; replaces `finder-by-keyword' + "P" #'find-library ; replaces `describe-package' b/c redundant w/ `doom/describe-package' + "t" #'doom/toggle-profiler ; replaces `help-with-tutorial' b/c not useful for evil users + "r" nil ; replaces `info-emacs-manual' b/c it's on C-m now + (:prefix ("r" . "reload") + "r" #'doom/reload + "t" #'doom/reload-theme + "p" #'doom/reload-packages + "f" #'doom/reload-font + "P" #'doom/reload-project) + "V" #'doom/version ; replaces `finder-by-keyword' + "W" #'+default/man-or-woman)) ;; @@ -496,7 +527,8 @@ ;; C-u is used by evil :desc "Universal argument" "u" #'universal-argument - :desc "Window management" "w" #'evil-window-map + :desc "window" "w" evil-window-map + :desc "help" "h" help-map :desc "Toggle last popup" "~" #'+popup/toggle :desc "Find file" "." #'find-file @@ -651,37 +683,6 @@ :desc "Issue" "i" #'forge-create-issue :desc "Pull request" "p" #'forge-create-pullreq))) - (:prefix ("h" . "help") - :desc "What face" "'" #'doom/what-face - :desc "Describe at point" "." #'helpful-at-point - :desc "Describe active minor modes" ";" #'doom/describe-active-minor-mode - :desc "Describe Doom autodef" "A" #'doom/describe-autodefs - :desc "Open Doom manual" "D" #'doom/open-manual - :desc "Open vanilla sandbox" "E" #'doom/open-vanilla-sandbox - :desc "Describe face" "F" #'describe-face - :desc "Find documentation" "K" #'+lookup/documentation - :desc "Command log" "L" #'global-command-log-mode - :desc "Describe mode" "M" #'describe-mode - :desc "Reload private config" "R" #'doom/reload - :desc "Describe symbol" "S" #'describe-symbol - :desc "Print Doom version" "V" #'doom/version - :desc "Apropos" "a" #'apropos - :desc "Open Bug Report" "b" #'doom/open-bug-report - :desc "Describe char" "c" #'describe-char - :desc "Describe DOOM module" "d" #'doom/describe-module - :desc "Describe function" "f" #'describe-function - :desc "Emacs help map" "h" help-map - :desc "Lookup in manual" "i" #'info-lookup-symbol - :desc "Describe key" "k" #'describe-key - :desc "Describe key briefly" "C-k" #'describe-key-briefly - :desc "Find library" "l" #'find-library - :desc "View *Messages*" "m" #'view-echo-area-messages - :desc "Toggle profiler" "p" #'doom/toggle-profiler - :desc "Describe Doom package" "P" #'describe-package - :desc "Reload theme" "r" #'doom/reload-theme - :desc "Describe variable" "v" #'describe-variable - :desc "Man pages" "w" #'+default/man-or-woman) - (:prefix ("i" . "insert") :desc "Insert from clipboard" "y" #'+default/yank-pop :desc "Insert from evil register" "r" #'evil-ex-registers From a4c0bc2738364b9d2be3ecdce53ec915959ad799 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 19:36:12 -0500 Subject: [PATCH 3922/4235] Optimize general integration Using general to bind leader keys was responsible for 40-50% of Doom's startup time. This change reduces that significantly, but not entirely. It may be better that the config/default module not use map!. It is a convenient macro, but general is a huge bottleneck. --- core/core-keybinds.el | 99 +++++++++++++++++++++++++++++++++---------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 082d7bb1d..f96549687 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -38,13 +38,13 @@ trigger `doom/escape'. If any hook returns non-nil, all hooks after it are ignored.") (defun doom/escape () - "Run the `doom-escape-hook'." + "Run `doom-escape-hook'." (interactive) (cond ((minibuffer-window-active-p (minibuffer-window)) ;; quit the minibuffer if open. (abort-recursive-edit)) ;; Run all escape hooks. If any returns non-nil, then stop there. - ((cl-find-if #'funcall doom-escape-hook)) + ((run-hook-with-args-until-success 'doom-escape-hook)) ;; don't abort macros ((or defining-kbd-macro executing-kbd-macro) nil) ;; Back to the default @@ -54,53 +54,106 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; -;; General +;;; General + leader/localleader keys (require 'general) - ;; Convenience aliases (defalias 'define-key! #'general-def) (defalias 'unmap! #'general-unbind) -;; leader/localleader keys -(defvar doom-leader-alist `((t . ,doom-leader-map))) -(add-to-list 'emulation-mode-map-alists 'doom-leader-alist) - -;; We avoid `general-create-definer' to ensure that :states, :prefix and +;; We avoid `general-create-definer' to ensure that :states, :wk-full-keys and ;; :keymaps cannot be overwritten. (defmacro define-leader-key! (&rest args) `(general-define-key :states nil + :wk-full-keys nil :keymaps 'doom-leader-map - :prefix doom-leader-alt-key ,@args)) (general-create-definer define-localleader-key! :major-modes t - :wk-full-keys nil :prefix doom-localleader-alt-key) -;; Because :non-normal-prefix doesn't work for non-evil sessions (only evil's -;; emacs state), we must redefine `define-localleader-key!' once evil is loaded +;; :non-normal-prefix doesn't apply to non-evil sessions (only evil's emacs +;; state), so we must redefine `define-localleader-key!' to behave differently +;; where evil is present. (after! evil - (defmacro define-leader-key! (&rest args) - `(general-define-key - :states '(normal visual motion emacs) - :keymaps 'doom-leader-map - :prefix doom-leader-key - :non-normal-prefix doom-leader-alt-key - ,@args)) - (general-create-definer define-localleader-key! :states '(normal visual motion emacs) :major-modes t - :wk-full-keys nil :prefix doom-localleader-key :non-normal-prefix doom-localleader-alt-key)) +;; We use a prefix commands instead of general's :prefix/:non-normal-prefix +;; properties because general is incredibly slow binding keys en mass with them +;; in conjunction with :states. This effectively doubled Doom's startup time. +(define-prefix-command 'doom/leader 'doom-leader-map) +(define-key doom-leader-map [override-state] 'all) + +(global-set-key (kbd doom-leader-alt-key) 'doom/leader) +(after! evil + (evil-define-key* '(emacs insert) 'global (kbd doom-leader-alt-key) 'doom/leader) + (evil-define-key* '(normal visual motion) 'global (kbd doom-leader-key) 'doom/leader)) + +;; ...However, this approach (along with :wk-full-keys in `define-leader-key!') +;; means that which-key is only informed of the key sequence *after* +;; `doom-leader-key'/`doom-leader-alt-key'. e.g. binding to `SPC f s' will +;; create a which-key label for any key that ends in 'f s'. +;; +;; TO get around that, we forcibly inject `doom-leader-key' and +;; `doom-leader-alt-key' into the which-key key replacement regexp for keybinds +;; created on `doom-leader-map'. This is a dirty hack, but I'd rather this than +;; general being responsible for 50% of Doom's startup time. +(defun doom*general-extended-def-:which-key (_state keymap key edef kargs) + (with-eval-after-load 'which-key + (let* ((wk (general--getf2 edef :which-key :wk)) + (major-modes (general--getf edef kargs :major-modes)) + (keymaps (plist-get kargs :keymaps)) + ;; index of keymap in :keymaps + (keymap-index (cl-dotimes (ind (length keymaps)) + (when (eq (nth ind keymaps) keymap) + (cl-return ind)))) + (mode (let ((mode (if (and major-modes (listp major-modes)) + (nth keymap-index major-modes) + major-modes))) + (if (eq mode t) + (general--remove-map keymap) + mode))) + (key (key-description key)) + (key-regexp (concat (if (general--getf edef kargs :wk-full-keys) + "\\`" + ;; Modification begin + (if (memq 'doom-leader-map keymaps) + (concat "\\`\\(?:" doom-leader-key "\\|" doom-leader-alt-key "\\) "))) + ;; Modification end + (regexp-quote key) + "\\'")) + (prefix (plist-get kargs :prefix)) + (binding (or (when (and (plist-get edef :def) + (not (plist-get edef :keymp))) + (plist-get edef :def)) + (when (and prefix (string= key prefix)) + (plist-get kargs :prefix-command)))) + (replacement (cond ((stringp wk) + (cons nil wk)) + (wk))) + (match/replacement + (cons + (cons (when (general--getf edef kargs :wk-match-keys) + key-regexp) + (when (and (general--getf edef kargs :wk-match-binding) + binding + (symbolp binding)) + (symbol-name binding))) + replacement))) + (general--add-which-key-replacement mode match/replacement) + (when (and (consp replacement) (not (functionp replacement))) + (general--add-which-key-title-prefix mode key (cdr replacement)))))) +(advice-add #'general-extended-def-:which-key :override #'doom*general-extended-def-:which-key) + ;; -;; Packages +;;; Packages (def-package! which-key :defer 1 From 917d89da8724dc2c14175b2410729ee875b6d6d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 19:39:45 -0500 Subject: [PATCH 3923/4235] Refactor module init hooks Also adds doom-after-init-modules-hook for consistency, which is an alias to after-init-hook until I decide if it's necessary for it to be independent. --- core/core-modules.el | 20 +++++++++++++++++++- core/core.el | 11 ----------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 551241525..908034a1e 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -33,7 +33,24 @@ A warning will be put out if these deprecated modules are used.") ;; -;; Bootstrap API +;;; Custom hooks + +(defvar doom-before-init-modules-hook nil + "A list of hooks to run before Doom's modules' config.el files are loaded, but +after their init.el files are loaded.") + +(defvar doom-init-modules-hook nil + "A list of hooks to run after Doom's modules' config.el files have loaded, but +before the user's private module.") + +(defvaralias 'doom-after-init-modules-hook 'after-init-hook) + +(define-obsolete-variable-alias 'doom-post-init-hook 'doom-init-modules-hook "2.1.0") +(define-obsolete-variable-alias 'doom-init-hook 'doom-before-init-modules-hook "2.1.0") + + +;; +;;; Bootstrap API (defun doom-initialize-modules (&optional force-p) "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy @@ -307,6 +324,7 @@ The overall load order of Doom is as follows: {$DOOMDIR,~/.emacs.d}/modules/*/*/config.el `doom-init-modules-hook' $DOOMDIR/config.el + `doom-after-init-modules-hook' `after-init-hook' `emacs-startup-hook' `window-setup-hook' diff --git a/core/core.el b/core/core.el index 5ba1e1b19..3022c6e54 100644 --- a/core/core.el +++ b/core/core.el @@ -113,20 +113,9 @@ Doom was setup, which can cause problems.") ;; ;; Custom hooks -(defvar doom-before-init-modules-hook nil - "A list of hooks to run before Doom's modules' config.el files are loaded, but -after their init.el files are loaded.") - -(defvar doom-init-modules-hook nil - "A list of hooks to run after Doom's modules' config.el files have loaded. -This includes the user's private module in `doom-private-dir'.") - (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload' is called.") -(define-obsolete-variable-alias 'doom-post-init-hook 'doom-init-modules-hook "2.1.0") -(define-obsolete-variable-alias 'doom-init-hook 'doom-before-init-modules-hook "2.1.0") - ;; ;; Emacs core configuration From 8e32f0da18243d17237b7777c6f298966b61df2e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 19:41:22 -0500 Subject: [PATCH 3924/4235] Rethink theme/font initialization order + Don't use set-frame-font. Causes issues for daemon users and is slower. + Revice init function docstrings + Load fonts a little earlier than themes May resolve an issue where fonts in daemon Emacs are too small on startup. Addresses #1223 --- core/core-ui.el | 52 ++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index a32ffe90a..b37eef231 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -459,7 +459,10 @@ character that looks like a space that `whitespace-mode' won't affect.") frame's window-system, the theme will be reloaded.") (defun doom|init-fonts () - "Initialize fonts." + "Loads fonts. + +Fonts are specified by `doom-font', `doom-variable-pitch-font', +`doom-serif-font' and `doom-unicode-font'." (condition-case e (progn (cond (doom-font @@ -468,8 +471,7 @@ frame's window-system, the theme will be reloaded.") (cons 'font (cond ((stringp doom-font) doom-font) ((fontp doom-font) (font-xlfd-name doom-font)) - ((signal 'wrong-type-argument (list '(fontp stringp) doom-font)))))) - (set-frame-font doom-font t t)) + ((signal 'wrong-type-argument (list '(fontp stringp) doom-font))))))) ((display-graphic-p) (setq doom-font (face-attribute 'default :font)))) (when doom-serif-font @@ -487,20 +489,27 @@ frame's window-system, the theme will be reloaded.") (signal 'doom-error e))))) (defun doom|init-theme () - "Set the theme and load the font, in that order." + "Load the theme specified by `doom-theme'." (when (and doom-theme (not (memq doom-theme custom-enabled-themes))) (let ((doom--prefer-theme-elc t)) (load-theme doom-theme t)))) -;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and -;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. -;; Attaching `doom|init-theme-in-frame' to `after-make-frame-functions' sorts -;; out daemon and emacsclient frames. -;; -;; There will still be issues with simultaneous gui and terminal (emacsclient) -;; frames, however. There's always `doom/reload-theme' if you need it! +(defun doom|reload-theme-maybe (_frame) + "Reloads the theme if the display device has changed." + (unless (cl-find doom-last-window-system (frame-list) :key #'framep-on-display) + (setq doom-last-window-system nil) + (doom|reload-theme-in-frame-maybe (selected-frame)))) + (defun doom|reload-theme-in-frame-maybe (frame) - "Reloads the theme in new daemon or tty frames." + "Reloads the theme if the display device has changed. + +Getting themes to remain consistent across GUI Emacs, terminal Emacs and daemon +Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. Attaching +`doom|reload-theme-in-frame-maybe' to `after-make-frame-functions' sorts out +daemon and emacsclient frames. + +There will still be issues with simultaneous gui and terminal (emacsclient) +frames, however. There's always `doom/reload-theme' if you need it!" (when (and doom-theme (framep frame) (not (eq doom-last-window-system (framep-on-display frame)))) @@ -508,12 +517,6 @@ frame's window-system, the theme will be reloaded.") (load-theme doom-theme t)) (setq doom-last-window-system (framep-on-display frame)))) -(defun doom|reload-theme-maybe (_frame) - "Reloads the theme after closing the last frame of a type." - (unless (cl-find doom-last-window-system (frame-list) :key #'framep-on-display) - (setq doom-last-window-system nil) - (doom|reload-theme-in-frame (selected-frame)))) - ;; ;;; Bootstrap @@ -526,6 +529,7 @@ frame's window-system, the theme will be reloaded.") (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil 'eq) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) + ;; Reload theme if the display device has changed (add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) (add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) @@ -537,14 +541,14 @@ frame's window-system, the theme will be reloaded.") (add-hook 'focus-in-hook #'doom|run-switch-frame-hooks) (advice-add! '(switch-to-buffer display-buffer) :around #'doom*run-switch-buffer-hooks)) -;; Set fonts -(add-hook 'doom-init-ui-hook #'doom|init-fonts) -;; Apply themes +;; Apply `doom-theme' (unless (daemonp) (add-hook 'doom-init-ui-hook #'doom|init-theme)) -;; Run `doom-load-theme-hook' -(advice-add #'load-theme :after #'doom*load-theme-hooks) -;; Run `doom-init-ui-hook' +;; Apply `doom-font' et co +(add-hook 'doom-after-init-modules-hook #'doom|init-fonts) +;; Setup `doom-load-theme-hook' +(advice-add #'load-theme :after #'doom*run-load-theme-hooks) + (add-hook 'window-setup-hook #'doom|init-ui) From 4055f667fb8176b26b9c4c013502ea45aec679d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 19:43:37 -0500 Subject: [PATCH 3925/4235] Defer doom|disable-whitespace-mode-in-childframes --- core/core-ui.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index b37eef231..52dd34660 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -578,16 +578,16 @@ startup (or theme switch) time, so long as `doom--prefer-theme-elc' is non-nil." it to fix all that visual noise." (unless (frame-parameter frame 'parent-frame) (funcall orig-fn))) - (add-function :around whitespace-enable-predicate #'doom*disable-whitespace-mode-in-childframes)) + (add-function :around whitespace-enable-predicate #'doom*disable-whitespace-mode-in-childframes) -(defun doom|disable-whitespace-mode-in-childframes (frame) - "`whitespace-mode' inundates child frames with whitspace markers, so disable + (defun doom|disable-whitespace-mode-in-childframes (frame) + "`whitespace-mode' inundates child frames with whitspace markers, so disable it to fix all that visual noise." - (when (frame-parameter frame 'parent-frame) - (with-selected-frame frame - (setq-local whitespace-style nil) - frame))) -(add-hook 'after-make-frame-functions #'doom|disable-whitespace-mode-in-childframes) + (when (frame-parameter frame 'parent-frame) + (with-selected-frame frame + (setq-local whitespace-style nil) + frame))) + (add-hook 'after-make-frame-functions #'doom|disable-whitespace-mode-in-childframes)) ;; Don't allow cursor to enter the prompt (setq minibuffer-prompt-properties '(read-only t intangible t cursor-intangible t face minibuffer-prompt)) From 8bfa5a30fd9a862214a5fdc37e067402888b8098 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:02:40 -0500 Subject: [PATCH 3926/4235] Fix lookup commands not aborting on C-g/ESC #1226 When aborting a lookup handler with C-g/ESC, Doom was convinced that it had failed legitimately, so tries the next. The expected behavior is that it abort the entire lookup operation. --- modules/feature/lookup/autoload/lookup.el | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 038ff81b9..4a6c2c9b1 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -134,7 +134,9 @@ Otherwise, these properties are available to be set: nil))) (defun +lookup--jump-to (prop identifier &optional other-window) - (let ((ret (run-hook-wrapped + (let ((ret + (condition-case e + (run-hook-wrapped (plist-get (list :definition '+lookup-definition-functions :references '+lookup-references-functions :documentation '+lookup-documentation-functions @@ -143,7 +145,8 @@ Otherwise, these properties are available to be set: '+lookup--run-hooks identifier (point-marker) - other-window))) + other-window) + (quit (user-error "Aborted %s lookup" prop))))) (cond ((null ret) (message "Could not find '%s'" identifier) nil) From a443d9ab0745708284efba8731064247c62869f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 6 Mar 2019 00:26:33 -0500 Subject: [PATCH 3927/4235] Refactor doom-initialize-packages & package API - Packages are initialized once, when package.el is first loaded, and must be updated manually via doom/reload-packages. - Package->module association is now stored in the package's PLIST under :modules. This is an internal property and cannot be explicitly set through `package!' - Add doom-package-list function - Rename doom-get-packages to doom-find-packages - Updated doom-find-packages' docstring - Added the :core filter to doom-find-packages - Simplified doom-initialize-packages - doom/reload calls doom/reload-packages if necessary. - Fix redundant properties in doom-packages - Remove tracking of after!, def-package! and def-package-hook! blocks. Replaced with doom-package-list being able to see all packages, even in disabled modules. - Add :built-in property to package! for dummy packages. This is important so that doom/describe-package can see built-in packages. --- core/autoload/config.el | 2 + core/autoload/debug.el | 2 +- core/autoload/packages.el | 218 ++++++++++++++++++----------- core/cli/autoloads.el | 6 +- core/core-lib.el | 4 +- core/core-modules.el | 14 +- core/core-packages.el | 125 +++++++---------- core/test/test-autoload-package.el | 18 +-- 8 files changed, 207 insertions(+), 182 deletions(-) diff --git a/core/autoload/config.el b/core/autoload/config.el index 7d3a16604..011904461 100644 --- a/core/autoload/config.el +++ b/core/autoload/config.el @@ -32,5 +32,7 @@ init.el and config.el. Then runs `doom-reload-hook'." (doom-initialize)) (with-demoted-errors "PRIVATE CONFIG ERROR: %s" (doom-initialize-modules 'force)) + (when (bound-and-true-p doom-packages) + (doom/reload-packages)) (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) (message "Finished!")) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index de27982f5..a5261d93d 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -61,7 +61,7 @@ ready to be pasted in a bug report on github." "n/a") (or (ignore-errors (require 'use-package) - (cl-loop for (name . plist) in (doom-get-packages :private t) + (cl-loop for (name . plist) in (doom-find-packages :private t) if (use-package-plist-delete (copy-sequence plist) :private) collect (format "%s" (cons name it)) else diff --git a/core/autoload/packages.el b/core/autoload/packages.el index acc6f6db6..df05868f2 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -97,7 +97,6 @@ list of the package." "Return t if a package named NAME (a symbol) has a new backend than what it was installed with. Returns nil otherwise, or if package isn't installed." (cl-check-type name symbol) - (doom-initialize-packages) (and (package-installed-p name) (let* ((plist (cdr (assq name doom-packages))) (old-backend (doom-package-backend name 'noerror)) @@ -109,7 +108,6 @@ was installed with. Returns nil otherwise, or if package isn't installed." "Return t if a package named NAME (a symbol) has a different recipe than it was installed with." (cl-check-type name symbol) - (doom-initialize-packages) (and (package-installed-p name) (when-let* ((quelpa-recipe (assq name quelpa-cache)) (doom-recipe (assq name doom-packages))) @@ -117,15 +115,16 @@ was installed with." (cdr (plist-get (cdr doom-recipe) :recipe))))))) ;;;###autoload -(cl-defun doom-get-packages (&key (installed 'any) - (private 'any) - (disabled 'any) - (pinned 'any) - (ignored 'any) - (sort t) - changed - backend - deps) +(cl-defun doom-find-packages (&key (installed 'any) + (private 'any) + (disabled 'any) + (pinned 'any) + (ignored 'any) + (core 'any) + sort + changed + backend + deps) "Retrieves a list of primary packages (i.e. non-dependencies). Each element is a cons cell, whose car is the package symbol and whose cdr is the quelpa recipe (if any). @@ -133,76 +132,134 @@ a cons cell, whose car is the package symbol and whose cdr is the quelpa recipe You can build a filtering criteria using one or more of the following properties: - :backend BACKEND - Can be 'quelpa, 'elpa or 'emacs - :installed BOOL - Only return installed packages (t) or uninstalled packages (nil) - :private BOOL - Only return private packages (t) or non-private packages (nil) - :disabled BOOL - Only return packages that are disabled (t) or otherwise (nil) - :ignored BOOL - Only return packages that are ignored (t) or otherwise (nil) + :backend 'quelpa|'elpa|'emacs|'any + Include packages installed through 'quelpa, 'elpa or 'emacs. 'any is the + wildcard. + :installed BOOL|'any + t = only include installed packages + nil = exclude installed packages + :private BOOL|'any + t = only include user-installed packages + nil = exclude user-installed packages + :core BOOL|'any + t = only include Doom core packages + nil = exclude Doom core packages + :disabled BOOL|'any + t = only include disabled packages + nil = exclude disabled packages + :ignored BOOL|'any + t = only include ignored packages + nil = exclude ignored packages :pinned BOOL|ARCHIVE Only return packages that are pinned (t), not pinned (nil) or pinned to a specific archive (stringp) :deps BOOL - Includes the package's dependencies (t). + Includes the package's dependencies (t) or not (nil). The resulting list is sorted unless :sort nil is passed to this function. Warning: this function is expensive, as it re-evaluates your all packages.el files." - (doom-initialize-packages) - (cl-remove-duplicates - (cl-loop with packages = (append (mapcar #'list doom-core-packages) - doom-packages) - for (sym . plist) - in (if sort - (cl-sort (copy-sequence packages) #'string-lessp :key #'car) - packages) - if (and (or (not backend) - (eq (doom-package-backend sym t) backend)) - (or (eq ignored 'any) - (let* ((form (plist-get plist :ignore)) - (value (eval form))) - (if ignored value (not value)))) - (or (eq disabled 'any) - (if disabled - (plist-get plist :disable) - (not (plist-get plist :disable)))) - (or (eq installed 'any) - (if installed - (doom-package-installed-p sym) - (not (doom-package-installed-p sym)))) - (or (eq private 'any) - (if private - (plist-get plist :private) - (not (plist-get plist :private)))) - (or (eq pinned 'any) - (cond ((eq pinned 't) - (plist-get plist :pin)) - ((null pinned) - (not (plist-get plist :pin))) - ((equal (plist-get plist :pin) pinned))))) - collect (cons sym plist) - and if (and deps (not (package-built-in-p sym))) - nconc - (cl-loop for pkg in (doom-get-dependencies-for sym 'recursive 'noerror) - if (or (eq installed 'any) - (if installed - (doom-package-installed-p pkg) - (not (doom-package-installed-p pkg)))) - collect (cons pkg (cdr (assq pkg doom-packages))))) - :key #'car)) + (cl-loop with packages = doom-packages + for (sym . plist) + in (if sort + (cl-sort (copy-sequence doom-packages) #'string-lessp :key #'car) + packages) + if (and (or (not backend) + (eq (doom-package-backend sym t) backend)) + (or (eq ignored 'any) + (let* ((form (plist-get plist :ignore)) + (value (eval form))) + (if ignored value (not value)))) + (or (eq disabled 'any) + (if disabled + (plist-get plist :disable) + (not (plist-get plist :disable)))) + (or (eq installed 'any) + (if installed + (doom-package-installed-p sym) + (not (doom-package-installed-p sym)))) + (or (eq private 'any) + (let ((modules (plist-get plist :modules))) + (if private + (assq :private modules) + (not (assq :private modules))))) + (or (eq core 'any) + (let ((modules (plist-get plist :modules))) + (if core + (assq :core modules) + (not (assq :core modules))))) + (or (eq pinned 'any) + (cond ((eq pinned 't) + (plist-get plist :pin)) + ((null pinned) + (not (plist-get plist :pin))) + ((equal (plist-get plist :pin) pinned))))) + collect (cons sym plist) + and if (and deps (not (package-built-in-p sym))) + nconc + (cl-loop for pkg in (doom-get-dependencies-for sym 'recursive 'noerror) + if (or (eq installed 'any) + (if installed + (doom-package-installed-p pkg) + (not (doom-package-installed-p pkg)))) + collect (cons pkg (cdr (assq pkg doom-packages)))))) + +;;;###autoload +(defun doom-package-list (&optional all-p) + "Retrieve a list of explicitly declared packages from enabled modules. + +This excludes core packages listed in `doom-core-packages'. + +If ALL-P, gather packages across all modules, including disabled ones." + (with-temp-buffer ; prevent buffer-local settings from propagating + (let ((noninteractive t) + (doom--stage 'packages) + (doom-modules (doom-modules)) + doom-packages + doom-disabled-packages + package-pinned-packages) + (cl-letf ((load-fn + (lambda (file &optional noerror) + (condition-case e + (if all-p + (setq doom-packages + (append (let (doom-packages) + (load file noerror t t) + doom-packages) + doom-packages)) + (load file noerror t t)) + ((debug error) + (signal 'doom-package-error + (list (or (doom-module-from-path file) + '(:private . packages)) + e))))))) + (funcall load-fn (expand-file-name "packages.el" doom-core-dir)) + (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) + ;; We load the private packages file twice to ensure disabled packages + ;; are seen ASAP, and a second time to ensure privately overridden + ;; packages are properly overwritten. + (funcall load-fn private-packages t) + (if all-p + (mapc load-fn (doom-files-in doom-modules-dir + :depth 2 + :full t + :match "/packages\\.el$")) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-path (car key) (cdr key) "packages.el") + for doom--current-module = key + do (funcall load-fn path t))) + (funcall load-fn private-packages t)) + (append (cl-loop for package in doom-core-packages + collect (list package :modules '((:core internal)))) + (nreverse doom-packages)))))) ;;;###autoload (defun doom-get-package-alist () "Returns a list of all desired packages, their dependencies and their desc objects, in the order of their `package! blocks.'" - (doom-initialize-packages) (cl-remove-duplicates - (cl-loop for name in (append doom-core-packages (mapcar #'car doom-packages)) + (cl-loop for name in (mapcar #'car doom-packages) if (assq name package-alist) nconc (cl-loop for dep in (package--get-deps name) if (assq dep package-alist) @@ -245,7 +302,6 @@ containing (PACKAGE-SYMBOL OLD-VERSION-LIST NEW-VERSION-LIST). If INCLUDE-FROZEN-P is non-nil, check frozen packages as well. Used by `doom-packages-update'." - (doom-initialize-packages t) (doom-refresh-packages-maybe doom-debug-mode) (let-alist (seq-group-by @@ -295,7 +351,7 @@ depended on. Used by `doom-packages-autoremove'." (let ((package-selected-packages - (mapcar #'car (doom-get-packages :ignored nil :disabled nil)))) + (mapcar #'car (doom-find-packages :ignored nil :disabled nil)))) (append (package--removable-packages) (cl-loop for pkg in package-selected-packages if (and (doom-package-different-backend-p pkg) @@ -303,22 +359,17 @@ Used by `doom-packages-autoremove'." collect pkg)))) ;;;###autoload -(defun doom-get-missing-packages (&optional include-ignored-p) +(defun doom-get-missing-packages () "Return a list of requested packages that aren't installed or built-in, but are enabled (with a `package!' directive). Each element is a list whose CAR is the package symbol, and whose CDR is a plist taken from that package's `package!' declaration. -If INCLUDE-IGNORED-P is non-nil, includes missing packages that are ignored, -i.e. they have an :ignore property. - Used by `doom-packages-install'." - (doom-initialize-packages) (cl-loop for (name . plist) - in (doom-get-packages :ignored (if include-ignored-p 'any) - :disabled nil - :deps t - :sort nil) + in (doom-find-packages :ignored nil + :disabled nil + :deps t) if (and (or (plist-get plist :pin) (not (package-built-in-p name))) (or (not (doom-package-installed-p name)) @@ -343,7 +394,6 @@ Used by `doom-packages-install'." "Installs package NAME with optional quelpa RECIPE (see `quelpa-recipe' for an example; the package name can be omitted)." (cl-check-type name symbol) - (doom-initialize-packages) (when (and (package-installed-p name) (not (package-built-in-p name))) (if (or (doom-package-different-backend-p name) @@ -371,7 +421,6 @@ example; the package name can be omitted)." "Updates package NAME (a symbol) if it is out of date, using quelpa or package.el as appropriate." (cl-check-type name symbol) - (doom-initialize-packages) (unless (package-installed-p name) (error "%s isn't installed" name)) (when (doom-package-different-backend-p name) @@ -402,7 +451,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'." (cl-check-type name symbol) - (doom-initialize-packages) (unless (package-installed-p name) (user-error "%s isn't installed" name)) (let ((inhibit-message (not doom-debug-mode)) @@ -420,6 +468,14 @@ package.el as appropriate." ;; ;; Interactive commands +;;;###autoload +(defun doom/reload-packages () + "Reload `doom-packages', `package' and `quelpa'." + (interactive) + (message "Reloading packages") + (doom-initialize-packages t) + (message "Reloading packages...DONE")) + ;;;###autoload (defun doom/update-package (pkg) "Prompts the user with a list of outdated packages and updates the selected @@ -437,7 +493,6 @@ calls." (unless name (user-error "'%s' is already up-to-date" selection)) (list (assq name packages)))) - (doom-initialize-packages) (cl-destructuring-bind (package old-version new-version) pkg (if-let* ((desc (doom-package-outdated-p package))) (let ((old-v-str (package-version-join old-version)) @@ -457,7 +512,6 @@ calls." ;;;###autoload (defun doom*package-delete (desc &rest _) "Update `quelpa-cache' upon a successful `package-delete'." - (doom-initialize-packages) (let ((name (package-desc-name desc))) (unless (package-installed-p name) (when-let* ((spec (assq name quelpa-cache))) diff --git a/core/cli/autoloads.el b/core/cli/autoloads.el index 9b1c0d9b3..84678d50e 100644 --- a/core/cli/autoloads.el +++ b/core/cli/autoloads.el @@ -318,7 +318,7 @@ modified." (prin1 `(setq load-path ',load-path auto-mode-alist ',auto-mode-alist Info-directory-list ',Info-directory-list - doom-disabled-packages ',doom-disabled-packages + doom-disabled-packages ',(mapcar #'car (doom-find-packages :disabled t)) package-activated-list ',package-activated-list) (current-buffer))) @@ -352,10 +352,10 @@ This should be run whenever your `doom!' block or update your packages." (with-temp-file doom-package-autoload-file (doom--generate-header 'doom-reload-package-autoloads) (save-excursion - ;; Cache the important and expensive-to-initialize state here. + ;; Cache important and expensive-to-initialize state here. (doom--generate-var-cache) (print! (green "✓ Cached package state")) - ;; Loop through packages and concatenate all their autoloads files. + ;; Concatenate the autoloads of all installed packages. (doom--generate-package-autoloads) (print! (green "✓ Package autoloads included"))) ;; Remove `load-path' and `auto-mode-alist' modifications (most of them, diff --git a/core/core-lib.el b/core/core-lib.el index 15bad0a1b..2de8110c9 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -224,9 +224,7 @@ BODY is evaluated once TARGETS are loaded. TARGETS can either be: #'progn #'with-no-warnings) (if (symbolp targets) - `(progn - (doom-module-register-config ',targets ,(FILE!)) - (with-eval-after-load ',targets ,@body)) + `(with-eval-after-load ',targets ,@body) (pcase (car-safe targets) ((or :or :any) (macroexp-progn diff --git a/core/core-modules.el b/core/core-modules.el index 908034a1e..dd84efbb1 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -188,15 +188,6 @@ non-nil, return paths of possible modules, activated or otherwise." collect (plist-get plist :path))) (list doom-private-dir))) -(defun doom-module-register-config (package file &optional append) - "TODO" - (let ((files (get package 'doom-files))) - (unless (member file files) - (if append - (setq files (append files (list file))) - (push file files)) - (put package 'doom-files files)))) - (defun doom-modules (&optional refresh-p) "Minimally initialize `doom-modules' (a hash table) and return it." (or (unless refresh-p doom-modules) @@ -372,9 +363,7 @@ package is disabled." ;; package errors, so we preform this check at compile time: (and (bound-and-true-p byte-compile-current-file) (not (locate-library (symbol-name name))))) - `(progn - (doom-module-register-config ',name ,(FILE!) t) - (use-package ,name ,@plist)))) + `(use-package ,name ,@plist))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. @@ -396,7 +385,6 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (error "'%s' isn't a valid hook for def-package-hook!" when)) `(progn (setq use-package-inject-hooks t) - (doom-module-register-config ',package ,(FILE!)) (add-hook! ',(intern (format "use-package--%s--%s-hook" package diff --git a/core/core-packages.el b/core/core-packages.el index cedfd6b70..eac7f293a 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -87,52 +87,27 @@ If FORCE-P is 'internal, only (re)populate `doom-packages'. Use this before any of package.el, quelpa or Doom's package management's API to ensure all the necessary package metadata is initialized and available for them." - (with-temp-buffer ; prevent buffer-local settings from propagating - (let ((load-prefer-newer t)) ; reduce stale code issues - ;; package.el and quelpa handle themselves if their state changes during - ;; the current session, but if you change an packages.el file in a module, - ;; there's no non-trivial way to detect that, so we give you a way to - ;; reload only doom-packages (by passing 'internal as FORCE-P). - (unless (eq force-p 'internal) - ;; `package-alist' - (when (or force-p (not (bound-and-true-p package-alist))) - (doom-ensure-packages-initialized 'force) - (setq load-path (cl-remove-if-not #'file-directory-p load-path))) - ;; `quelpa-cache' - (when (or force-p (not (bound-and-true-p quelpa-cache))) - ;; ensure un-byte-compiled version of quelpa is loaded - (unless (featurep 'quelpa) - (load (locate-library "quelpa.el") nil t t)) - (setq quelpa-initialized-p nil) - (or (quelpa-setup-p) - (error "Could not initialize quelpa")))) - ;; `doom-packages' - (when (or force-p (not doom-packages)) - (cl-flet - ((_load - (lambda (file &optional noerror) - (condition-case e - (load file noerror t t) - ((debug error) - (signal 'doom-package-error - (list (or (doom-module-from-path file) - '(:private . packages)) - e))))))) - (let ((doom-modules (doom-modules)) - (doom--stage 'packages) - (noninteractive t)) - (setq doom-packages nil) - (_load (expand-file-name "packages.el" doom-core-dir)) - ;; We load the private packages file twice to ensure disabled - ;; packages are seen ASAP, and a second time to ensure privately - ;; overridden packages are properly overwritten. - (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) - (_load private-packages t) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-path (car key) (cdr key) "packages.el") - do (let ((doom--current-module key)) (_load path t))) - (_load private-packages t) - (setq doom-packages (reverse doom-packages))))))))) + (let ((load-prefer-newer t)) ; reduce stale code issues + ;; package.el and quelpa handle themselves if their state changes during the + ;; current session, but if you change an packages.el file in a module, + ;; there's no non-trivial way to detect that, so to reload only + ;; doom-packages pass 'internal as FORCE-P or use `doom/reload-packages'. + (unless (eq force-p 'internal) + ;; `package-alist' + (when (or force-p (not (bound-and-true-p package-alist))) + (doom-ensure-packages-initialized 'force) + (setq load-path (cl-delete-if-not #'file-directory-p load-path))) + ;; `quelpa-cache' + (when (or force-p (not (bound-and-true-p quelpa-cache))) + ;; ensure un-byte-compiled version of quelpa is loaded + (unless (featurep 'quelpa) + (load (locate-library "quelpa.el") nil t t)) + (setq quelpa-initialized-p nil) + (or (quelpa-setup-p) + (error "Could not initialize quelpa")))) + ;; `doom-packages' + (when (or force-p (not doom-packages)) + (setq doom-packages (doom-package-list))))) ;; @@ -169,7 +144,7 @@ them." ;; ;; Module package macros -(cl-defmacro package! (name &rest plist &key recipe pin disable _ignore _freeze) +(cl-defmacro package! (name &rest plist &key built-in recipe pin disable _ignore _freeze) "Declares a package and how to install it (if applicable). This macro is declarative and does not load nor install packages. It is used to @@ -193,41 +168,49 @@ Accepts the following properties: Do not install this package. :freeze FORM Do not update this package if FORM is non-nil. + :built-in BOOL + Same as :ignore if the package is a built-in Emacs package. Returns t if package is successfully registered, and nil if it was disabled elsewhere." (declare (indent defun)) (doom--assert-stage-p 'packages #'package!) - (let ((plist (append plist (cdr (assq name doom-packages))))) + (let ((old-plist (cdr (assq name doom-packages)))) (when recipe (when (cl-evenp (length recipe)) (setq plist (plist-put plist :recipe (cons name recipe)))) (setq pin nil plist (plist-put plist :pin nil))) - (when (file-in-directory-p (FILE!) doom-private-dir) - (setq plist (plist-put plist :private t))) - (let (newplist) - (while plist - (unless (null (cadr plist)) - (push (cadr plist) newplist) - (push (car plist) newplist)) - (pop plist) - (pop plist)) - (setq plist newplist)) + (let ((module-list (plist-get old-plist :modules)) + (module (or doom--current-module + (let ((file (FILE!))) + (cond ((file-in-directory-p file doom-private-dir) + (list :private)) + ((file-in-directory-p file doom-core-dir) + (list :core)) + ((doom-module-from-path file))))))) + (doom-log "Registered package '%s'%s" + name (if recipe (format " with recipe %s" recipe) "")) + (unless (member module module-list) + (setq module-list (append module-list (list module) nil) + plist (plist-put plist :modules module-list)))) + (when (and built-in (locate-library (symbol-name name) nil doom-site-load-path)) + (doom-log "Ignoring built-in package '%s'" name) + (setq plist (plist-put plist :ignore t))) + (while plist + (unless (null (cadr plist)) + (setq old-plist (plist-put old-plist (car plist) (cadr plist)))) + (pop plist) + (pop plist)) + (setq plist old-plist) (macroexp-progn - (append (if disable `((add-to-list 'doom-disabled-packages ',name nil #'eq))) - (if pin `((setf (alist-get ',name package-pinned-packages) ,pin))) - `((let ((doom--current-module - (or doom--current-module - (let ((file (FILE!))) - (cond ((file-in-directory-p file doom-private-dir) - (cons :private (intern (file-name-base file)))) - ((file-in-directory-p file doom-core-dir) - (cons :core nil)))))) - (modules (get ',name 'doom-module))) - (cl-pushnew doom--current-module modules) - (put ',name 'doom-module modules)) - (setf (alist-get ',name doom-packages) ',plist) + (append (when disable + (doom-log "Disabling package '%s'" name) + `((add-to-list 'doom-disabled-packages ',name nil 'eq))) + (when pin + (doom-log "Pinning package '%s' to '%s'" name pin) + `((setf (alist-get ',name package-pinned-packages) ,pin))) + `((setf (alist-get ',name doom-packages) ',plist) (not (memq ',name doom-disabled-packages))))))) (defmacro packages! (&rest packages) diff --git a/core/test/test-autoload-package.el b/core/test/test-autoload-package.el index 32b4bd4d5..ac5c81534 100644 --- a/core/test/test-autoload-package.el +++ b/core/test/test-autoload-package.el @@ -55,8 +55,8 @@ (doom-missing-dummy) (doom-noquelpa-dummy) (doom-disabled-dummy :disable t) - (doom-private-dummy :private t) - (doom-disabled-private-dummy :private t :disable t) + (doom-private-dummy :modules ((:private))) + (doom-disabled-private-dummy :modules ((:private)) :disable t) (doom-quelpa-dummy :recipe (doom-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist"))) quelpa-cache '((doom-quelpa-dummy :fetcher github :repo "hlissner/does-not-exist") @@ -95,31 +95,31 @@ (spy-on #'doom-package-installed-p :and-call-fake #'package-installed-p)) (it "returns all packages" - (expect (mapcar #'car (doom-get-packages)) + (expect (mapcar #'car (doom-find-packages)) :to-have-same-items-as (mapcar #'car doom-packages))) (it "returns only disabled packages" - (expect (mapcar #'car (doom-get-packages :disabled t)) + (expect (mapcar #'car (doom-find-packages :disabled t)) :to-have-same-items-as '(doom-disabled-dummy doom-disabled-private-dummy))) (it "returns only non-disabled packages" - (expect (mapcar #'car (doom-get-packages :disabled nil)) + (expect (mapcar #'car (doom-find-packages :disabled nil)) :to-have-same-items-as '(doom-dummy doom-uptodate-dummy doom-quelpa-dummy doom-missing-dummy doom-noquelpa-dummy doom-private-dummy))) (it "returns only installed packages" - (expect (mapcar #'car (doom-get-packages :disabled nil :installed t)) + (expect (mapcar #'car (doom-find-packages :disabled nil :installed t)) :to-have-same-items-as '(doom-dummy doom-uptodate-dummy doom-quelpa-dummy doom-noquelpa-dummy))) (it "returns only non-installed packages" - (expect (mapcar #'car (doom-get-packages :disabled nil :installed nil)) + (expect (mapcar #'car (doom-find-packages :disabled nil :installed nil)) :to-have-same-items-as '(doom-missing-dummy doom-private-dummy))) (it "returns only private packages" - (expect (mapcar #'car (doom-get-packages :private t)) + (expect (mapcar #'car (doom-find-packages :private t)) :to-have-same-items-as '(doom-private-dummy doom-disabled-private-dummy))) (it "returns only disabled and private packages" - (expect (mapcar #'car (doom-get-packages :disabled t :private t)) + (expect (mapcar #'car (doom-find-packages :disabled t :private t)) :to-have-same-items-as '(doom-disabled-private-dummy)))) From 90a10931f7d3321346e202a05e1626373ac6389c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:12:38 -0500 Subject: [PATCH 3928/4235] lang/emacs-lisp: new +emacs-lisp-outline-regexp var --- modules/lang/emacs-lisp/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 189f44129..7d1baa578 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -3,6 +3,11 @@ (defvar +emacs-lisp-enable-extra-fontification t "If non-nil, highlight special forms, and defined functions and variables.") +(defvar +emacs-lisp-outline-regexp "[ \t]*;;;;* [^ \t\n]" + "Regexp to use for `outline-regexp' in `emacs-lisp-mode'. +This marks a foldable marker for `outline-minor-mode' in elisp buffers.") + + ;; `elisp-mode' is loaded at startup. In order to lazy load its config we need ;; to pretend it isn't loaded (defer-feature! elisp-mode emacs-lisp-mode) @@ -35,7 +40,7 @@ mode-name "Elisp" ;; Don't treat autoloads or sexp openers as outline headers, we have ;; hideshow for that. - outline-regexp ";;;;* [^ \t\n]") + outline-regexp +emacs-lisp-outline-regexp) ;; variable-width indentation is superior in elisp (add-to-list 'doom-detect-indentation-excluded-modes 'emacs-lisp-mode nil #'eq) From b9a036a96c5b3b8f8a2609e7390b7fc939252458 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:13:18 -0500 Subject: [PATCH 3929/4235] editor/fold: check outline-mode folds before hs b/c hideshow fold checks produce more false positives. --- modules/editor/fold/autoload/evil.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/editor/fold/autoload/evil.el b/modules/editor/fold/autoload/evil.el index c6190807b..3a16c060e 100644 --- a/modules/editor/fold/autoload/evil.el +++ b/modules/editor/fold/autoload/evil.el @@ -45,11 +45,11 @@ Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion (cond ((+fold--vimish-fold-p) (vimish-fold-toggle)) - ((+fold--hideshow-fold-p) (+fold-from-eol (hs-toggle-hiding))) ((+fold--outline-fold-p) (cl-letf (((symbol-function #'outline-hide-subtree) (symbol-function #'outline-hide-entry))) - (outline-toggle-children)))))) + (outline-toggle-children))) + ((+fold--hideshow-fold-p) (+fold-from-eol (hs-toggle-hiding)))))) ;;;###autoload (defun +fold/open () @@ -59,10 +59,10 @@ Targets `vimmish-fold', `hideshow' and `outline' folds." (interactive) (save-excursion (cond ((+fold--vimish-fold-p) (vimish-fold-unfold)) - ((+fold--hideshow-fold-p) (+fold-from-eol (hs-show-block))) ((+fold--outline-fold-p) (outline-show-children) - (outline-show-entry))))) + (outline-show-entry)) + ((+fold--hideshow-fold-p) (+fold-from-eol (hs-show-block)))))) ;;;###autoload (defun +fold/close () From 1f23eecdc877d3ece2330fb8ac4fbbe30c00e5a0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:17:43 -0500 Subject: [PATCH 3930/4235] (Try to) homogenize TAB/RET/ESC keybinds Map them to \t/^M/^[, rather than [tab], [return] and [escape]. --- modules/completion/company/config.el | 3 -- modules/config/default/+evil-bindings.el | 66 +++++++++++------------- modules/config/default/config.el | 8 +-- modules/tools/magit/config.el | 1 + 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 2fc9f906c..350b84d83 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -38,10 +38,7 @@ (add-to-list 'company-frontends 'company-tng-frontend) (define-key! company-active-map "RET" nil - [return] nil "TAB" #'company-select-next - [tab] #'company-select-next - "" #'company-select-previous [backtab] #'company-select-previous)) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index a4e03fe7a..22669d694 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -21,7 +21,7 @@ [remap find-tag] #'projectile-find-tag ;; Smart tab - :i [tab] (general-predicate-dispatch nil ; fall back to nearest keymap + :i "TAB" (general-predicate-dispatch nil ; fall back to nearest keymap (and (featurep! :feature snippets) (bound-and-true-p yas-minor-mode) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) @@ -29,17 +29,13 @@ (and (featurep! :completion company +tng) (+company-has-completion-p)) '+company/complete) - :n [tab] (general-predicate-dispatch nil - (derived-mode-p 'magit-mode) - 'magit-section-toggle - (derived-mode-p 'deadgrep-mode) - 'deadgrep-toggle-file-results + :n "TAB" (general-predicate-dispatch nil (and (featurep! :editor fold) (save-excursion (end-of-line) (invisible-p (point)))) '+fold/toggle (fboundp 'evilmi-jump-items) 'evilmi-jump-items) - :v [tab] (general-predicate-dispatch nil + :v "TAB" (general-predicate-dispatch nil (and (bound-and-true-p yas-minor-mode) (or (eq evil-visual-selection 'line) (and (fboundp 'evilmi-jump-items) @@ -308,7 +304,7 @@ "C-S-s" (cond ((featurep! :completion helm) #'helm-company) ((featurep! :completion ivy) #'counsel-company)) "C-SPC" #'company-complete-common - [tab] #'company-complete-common-or-cycle + "TAB" #'company-complete-common-or-cycle [backtab] #'company-select-previous) (:map company-search-map ; applies to `company-filter-map' too "C-n" #'company-select-next-or-abort @@ -316,9 +312,9 @@ "C-j" #'company-select-next-or-abort "C-k" #'company-select-previous-or-abort "C-s" (λ! (company-search-abort) (company-filter-candidates)) - [escape] #'company-search-abort) + "ESC" #'company-search-abort) ;; TAB auto-completion in term buffers - :map comint-mode-map [tab] #'company-complete)) + :map comint-mode-map "TAB" #'company-complete)) (:when (featurep! :completion ivy) (:map (help-mode-map helpful-mode-map) @@ -357,7 +353,7 @@ "C-s" #'helm-minibuffer-history "C-b" #'backward-word ;; Swap TAB and C-z - [tab] #'helm-execute-persistent-action + "TAB" #'helm-execute-persistent-action "C-z" #'helm-select-action) (:after swiper-helm :map swiper-helm-keymap [backtab] #'helm-ag-edit) @@ -393,29 +389,29 @@ (:when (featurep! :ui neotree) :after neotree :map neotree-mode-map - :n "g" nil - :n [tab] #'neotree-quick-look - :n [return] #'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) + :n "g" nil + :n "TAB" #'neotree-quick-look + :n "RET" #'neotree-enter + :n "DEL" #'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) (:when (featurep! :ui popup) :n "C-`" #'+popup/toggle @@ -562,7 +558,7 @@ ((featurep! :completion helm) #'+helm/project-search))) (:when (featurep! :feature workspaces) - (:prefix ([tab] . "workspace") + (:prefix ("TAB" . "workspace") :desc "Display tab bar" "TAB" #'+workspace/display :desc "New workspace" "n" #'+workspace/new :desc "Load workspace from file" "l" #'+workspace/load diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 5c0bf9fae..fd7177cbb 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -132,7 +132,9 @@ (defun +default|setup-input-decode-map () "Ensure TAB and [tab] are treated the same in TTY Emacs." - (define-key input-decode-map (kbd "TAB") [tab])) + (define-key input-decode-map [tab] (kbd "TAB")) + (define-key input-decode-map [return] (kbd "RET")) + (define-key input-decode-map [escape] (kbd "ESC"))) (add-hook 'tty-setup-hook #'+default|setup-input-decode-map) ;; A Doom convention where C-s on popups and interactive searches will invoke @@ -178,8 +180,8 @@ :g "s-/" (λ! (save-excursion (comment-line 1))) :n "s-/" #'evil-commentary-line :v "s-/" #'evil-commentary - :gni [s-return] #'+default/newline-below - :gni [s-S-return] #'+default/newline-above + :gni "s-RET" #'+default/newline-below + :gni "s-S-RET" #'+default/newline-above :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent :gi [s-left] #'doom/backward-to-bol-or-indent :gi [s-right] #'doom/forward-to-last-non-comment-or-eol diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index d474bfca4..0403ad138 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -84,6 +84,7 @@ It is passed a user and repository name.") "%" #'magit-gitflow-popup) ;; Don't use ESC to close magit (evil-define-key* 'normal magit-mode-map [escape] nil) + (evil-define-key* 'normal magit-status-mode-map (kbd "TAB") #'magit-section-toggle) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (when-let* ((desc (assoc (car key) evil-magit-rebase-commands-w-descriptions))) From 8f733c2ab5cd1d38f918a1cd36aa1c4b3b5ddd6a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:19:17 -0500 Subject: [PATCH 3931/4235] Don't kill magit with ESC --- modules/tools/magit/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 0403ad138..7aebf0d2f 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -83,7 +83,6 @@ It is passed a user and repository name.") "zz" #'evil-scroll-line-to-center "%" #'magit-gitflow-popup) ;; Don't use ESC to close magit - (evil-define-key* 'normal magit-mode-map [escape] nil) (evil-define-key* 'normal magit-status-mode-map (kbd "TAB") #'magit-section-toggle) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) From 748b1976762c22654121e41762e3c30b1770f8b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:21:58 -0500 Subject: [PATCH 3932/4235] Minor, general refactors --- core/core-editor.el | 11 ++++++----- core/core-lib.el | 9 +++++---- core/core-modules.el | 7 +++---- modules/config/default/config.el | 4 ++-- modules/ui/modeline/config.el | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 0972e1856..f21104a58 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -273,11 +273,12 @@ savehist file." (def-package! helpful :defer t :init - (global-set-key [remap describe-function] #'helpful-callable) - (global-set-key [remap describe-command] #'helpful-command) - (global-set-key [remap describe-variable] #'helpful-variable) - (global-set-key [remap describe-key] #'helpful-key) - (global-set-key [remap describe-symbol] #'helpful-symbol)) + (define-key! + [remap describe-function] #'helpful-callable + [remap describe-command] #'helpful-command + [remap describe-variable] #'helpful-variable + [remap describe-key] #'helpful-key + [remap describe-symbol] #'helpful-symbol)) (def-package! ws-butler diff --git a/core/core-lib.el b/core/core-lib.el index 2de8110c9..1deb4ae74 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -114,10 +114,11 @@ Accepts the same arguments as `message'." ,(concat (propertize "DOOM " 'face 'font-lock-comment-face) format-string (when doom--current-module - (propertize (format " [%s/%s]" - (doom-keyword-name (car doom--current-module)) - (cdr doom--current-module)) - 'face 'warning))) + (propertize + (format " [%s/%s]" + (doom-keyword-name (car doom--current-module)) + (cdr doom--current-module)) + 'face 'warning))) ,@args)))) (defun FILE! () diff --git a/core/core-modules.el b/core/core-modules.el index dd84efbb1..85844bc14 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -84,7 +84,7 @@ non-nil." ;; -;; Module API +;;; Module API (defun doom-module-p (category module) "Returns t if CATEGORY MODULE is enabled (ie. present in `doom-modules')." @@ -194,7 +194,6 @@ non-nil, return paths of possible modules, activated or otherwise." (let ((noninteractive t) doom-modules doom-init-modules-p) - (message "Initializing modules") (load! "init" doom-private-dir t) (or doom-modules (make-hash-table :test 'equal @@ -203,7 +202,7 @@ non-nil, return paths of possible modules, activated or otherwise." ;; -;; Use-package modifications +;;; Use-package modifications (autoload 'use-package "use-package-core" nil nil t) @@ -292,7 +291,7 @@ non-nil, return paths of possible modules, activated or otherwise." ;; -;; Module config macros +;;; Module config macros (defmacro doom! (&rest modules) "Bootstraps DOOM Emacs and its modules. diff --git a/modules/config/default/config.el b/modules/config/default/config.el index fd7177cbb..4ab92c141 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -29,9 +29,9 @@ (if (not (featurep 'evil)) (delete-selection-mode +1) - (defun turn-off-delete-selection-mode () (delete-selection-mode -1)) + (defun +default|disable-delete-selection-mode () (delete-selection-mode -1)) (add-hook 'evil-insert-state-entry-hook #'delete-selection-mode) - (add-hook 'evil-insert-state-exit-hook #'turn-off-delete-selection-mode)) + (add-hook 'evil-insert-state-exit-hook #'+default|disable-delete-selection-mode)) (when (featurep! +smartparens) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 57ccbfff8..709904ec7 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -35,6 +35,7 @@ (propertize (format "%s%d" (if indent-tabs-mode "⭾" "␣") tab-width) + 'face (if (doom-modeline--active) 'mode-line 'mode-line-inactive) 'mouse-face 'mode-line-highlight 'help-echo (let ((subsegs From f2b8280b2a0f5c925a48b7cb037090fbc13b77c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:24:16 -0500 Subject: [PATCH 3933/4235] Add +default/search-from-cwd & +default/search-project --- modules/config/default/+evil-bindings.el | 8 ++---- modules/config/default/autoload/default.el | 31 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 22669d694..7871c269e 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -547,15 +547,11 @@ (:prefix ("/" . "search") :desc "Jump to symbol across buffers" "I" #'imenu-anywhere :desc "Search buffer" "b" #'swiper - :desc "Search current directory" "d" - (cond ((featurep! :completion ivy) #'+ivy/project-search-from-cwd) - ((featurep! :completion helm) #'+helm/project-search-from-cwd)) + :desc "Search current directory" "d" #'+default/search-from-cwd :desc "Jump to symbol" "i" #'imenu :desc "Jump to link" "l" #'ace-link :desc "Look up online" "o" #'+lookup/online-select - :desc "Search project" "p" - (cond ((featurep! :completion ivy) #'+ivy/project-search) - ((featurep! :completion helm) #'+helm/project-search))) + :desc "Search project" "p" #'+default/search-project) (:when (featurep! :feature workspaces) (:prefix ("TAB" . "workspace") diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 8ee64bbea..dcdce7fb3 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -218,3 +218,34 @@ possible, or just one char if that's not possible." ((doom--backward-delete-whitespace-to-column))))))) ;; Otherwise, do simple deletion. ((delete-char (- n) killflag)))) + +;;;###autoload +(defun +default/search-from-cwd (&optional arg) + "Conduct a text search in files under the current folder. +If prefix ARG is set, prompt for a directory to search from." + (interactive "P") + (let ((default-directory + (if arg + (read-directory-name "Switch to project: " default-directory) + default-directory))) + (call-interactively + (cond ((featurep! :completion ivy) #'+ivy/project-search-from-cwd) + ((featurep! :completion helm) #'+helm/project-search-from-cwd) + (#'projectile-grep))))) + +;;;###autoload +(defun +default/search-project (&optional arg) + "Conduct a text search in files under the project root. +If prefix ARG is set, prompt for a project to search from." + (interactive "P") + (let ((default-directory + (if arg + (if-let* ((projects (projectile-relevant-known-projects))) + (completing-read "Switch to project: " projects + nil t nil nil (doom-project-root)) + (user-error "There are no known projects")) + default-directory))) + (call-interactively + (cond ((featurep! :completion ivy) #'+ivy/project-search) + ((featurep! :completion helm) #'+helm/project-search) + (#'rgrep))))) From cec2b4e9bc9a3f10e5b7afd38c5a836fc68e4739 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 7 Mar 2019 23:26:38 -0500 Subject: [PATCH 3934/4235] Add doom/toggle-debug-mode command --- core/autoload/debug.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index a5261d93d..03e763be1 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -320,3 +320,9 @@ If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." ;;;###autoload (advice-add #'esup :override #'doom/profile-emacs) + +;;;###autoload +(defun doom/toggle-debug-mode () + "Enable `debug-on-error' and `doom-debug-mode' for verbose logging." + (interactive) + (setq doom-debug-mode doom-debug-on-error)) From 5ab58a7eafb06d7694e0ba27b9a26cb371bc0979 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Mar 2019 06:13:07 -0500 Subject: [PATCH 3935/4235] Load subr-x & cl-lib sooner --- core/core.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/core.el b/core/core.el index 3022c6e54..bc3543db7 100644 --- a/core/core.el +++ b/core/core.el @@ -416,10 +416,6 @@ The overall load order of Doom is as follows: Module load order is determined by your `doom!' block. See `doom-modules-dirs' for a list of all recognized module trees. Order defines precedence (from most to least)." - ;; Built-in packages we use a lot of - (require 'subr-x) - (require 'cl-lib) - (when (or force-p (not doom-init-p)) (setq doom-init-p t) ; Prevent infinite recursion @@ -462,6 +458,10 @@ to least)." ;; ;; Bootstrap Doom +(eval-and-compile + (require 'subr-x) + (require 'cl-lib)) + (add-to-list 'load-path doom-core-dir) (doom-initialize noninteractive) From c9e7d2731792a8412a8f8a91723859fed747ca7f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Mar 2019 14:23:42 -0500 Subject: [PATCH 3936/4235] Set leader keys later #1233 Setting them too soon means the user can't change them. --- core/core-keybinds.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index f96549687..d8ce923ff 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -90,10 +90,15 @@ If any hook returns non-nil, all hooks after it are ignored.") (define-prefix-command 'doom/leader 'doom-leader-map) (define-key doom-leader-map [override-state] 'all) -(global-set-key (kbd doom-leader-alt-key) 'doom/leader) -(after! evil - (evil-define-key* '(emacs insert) 'global (kbd doom-leader-alt-key) 'doom/leader) - (evil-define-key* '(normal visual motion) 'global (kbd doom-leader-key) 'doom/leader)) +;; Bind `doom-leader-key' and `doom-leader-alt-key' as late as possible to give +;; the user more changes to modify them. +(defun doom|init-leader-keys () + "Bind `doom-leader-key' and `doom-leader-alt-key'." + (global-set-key (kbd doom-leader-alt-key) 'doom/leader) + (when (featurep 'evil) + (evil-define-key* '(emacs insert) 'global (kbd doom-leader-alt-key) 'doom/leader) + (evil-define-key* '(normal visual motion) 'global (kbd doom-leader-key) 'doom/leader))) +(add-hook 'doom-after-init-modules-hook #'doom|init-leader-keys) ;; ...However, this approach (along with :wk-full-keys in `define-leader-key!') ;; means that which-key is only informed of the key sequence *after* From b9bbc95f1b8b14aa82d39f684ba623bc242411fb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Mar 2019 14:25:07 -0500 Subject: [PATCH 3937/4235] Fix void-variable org-file-apps error #1232 Snuck in during fa26dc12 --- modules/lang/org/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 025107d04..c3b042bd5 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -86,11 +86,12 @@ :when (featurep! :tools pdf) :commands (org-pdfview-open) :init - (delete '("\\.pdf\\'" . default) org-file-apps) - ;; org links to pdf files are opened in pdf-view-mode - (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (_file link) (org-pdfview-open link)))) - ;; support for links to specific pages - (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link))))) + (after! org + (delete '("\\.pdf\\'" . default) org-file-apps) + ;; org links to pdf files are opened in pdf-view-mode + (add-to-list 'org-file-apps '("\\.pdf\\'" . (lambda (_file link) (org-pdfview-open link)))) + ;; support for links to specific pages + (add-to-list 'org-file-apps '("\\.pdf::\\([[:digit:]]+\\)\\'" . (lambda (_file link) (org-pdfview-open link)))))) (def-package! org-crypt ; built-in :commands org-encrypt-entries From 062652ec116465040fc9ea899e42f61de72582b8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Mar 2019 14:52:04 -0500 Subject: [PATCH 3938/4235] lang/org: Fix defvaralias warning; revise docstrings --- modules/lang/org/+capture.el | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index 25372098d..af5725549 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -10,21 +10,25 @@ ;; vimperator, dmenu or a global keybinding. (defvar +org-capture-todo-file "todo.org" - "The path to your personal todo file. - -Is relative to `org-directory', unless it is absolute. Is used in Doom's default -`org-capture-templates'.") - -(defvar +org-capture-notes-file "notes.org" - "The path to your personal notes file. + "Default target for todo entries. Is relative to `org-directory', unless it is absolute. Is used in Doom's default `org-capture-templates'.") (defvar +org-capture-changelog-file "changelog.org" - "The filename to use for project changelog files. + "Default target for changelog entries. -It is used in Doom's default `org-capture-templates'.") +Is relative to `org-directory' unless it is absolute. Is used in Doom's default +`org-capture-templates'.") + +(defvaralias '+org-capture-notes-file 'org-default-notes-file + "Default target for storing notes. + +Used as a fall back file for org-capture.el, for templates that do not specify a +target file. + +Is relative to `org-directory', unless it is absolute. Is used in Doom's default +`org-capture-templates'.") ;; @@ -40,6 +44,8 @@ It is used in Doom's default `org-capture-templates'.") ;; Will use {project-root}/{todo,notes,changelog}.org, unless a ;; {todo,notes,changelog}.org file is found in a parent directory. + ;; Uses the basename from `+org-capture-todo-file', + ;; `+org-capture-changelog-file' and `+org-capture-notes-file'. ("p" "Templates for projects") ("pt" "Project todo" entry ; {project-root}/todo.org (file+headline +org-capture-project-todo-file "Inbox") @@ -51,8 +57,6 @@ It is used in Doom's default `org-capture-templates'.") (file+headline +org-capture-project-notes-file "Unreleased") "* TODO %?\n%i\n%a" :prepend t :kill-buffer t))) -(defvaralias '+org-capture-notes-file 'org-default-notes-file) - (add-hook 'org-capture-after-finalize-hook #'+org-capture|cleanup-frame) (defun +org*capture-expand-variable-file (file) From ee6e4a8b5cc37da2333d5efa91b087a55a99f754 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Mar 2019 17:58:58 -0500 Subject: [PATCH 3939/4235] Fix ivy--queue-exhibit: void-function nil error Until Yevgnen/ivy-rich#51 is merged --- modules/completion/ivy/config.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index a1ca0ff75..c7b1b8b7b 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -93,7 +93,17 @@ immediately runs it on the current candidate (ending the ivy session)." (colplist (plist-get plist :columns)) (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) (when switch-buffer-alist - (setcar switch-buffer-alist '+ivy-rich-buffer-name)))) + (setcar switch-buffer-alist '+ivy-rich-buffer-name))) + + (defun +ivy*rich-counsel-function-docstring (candidate) + (let ((doc (replace-regexp-in-string + ":\\(\\(before\\|after\\)\\(-\\(whilte\\|until\\)\\)?\\|around\\|override\\|\\(filter-\\(args\\|return\\)\\)\\) advice:[ ]*‘.+?’[\r\n]+" + "" + (or (ignore-errors (documentation (intern-soft candidate))) "")))) + (if (string-match "^\\(.+\\)\\([\r\n]\\)?" doc) + (setq doc (match-string 1 doc)) + ""))) + (advice-add #'ivy-rich-counsel-function-docstring :override #'+ivy*rich-counsel-function-docstring)) (def-package! counsel From e0ed8669afe5b313e64cf52787f6248bc2502914 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 8 Mar 2019 18:06:35 -0500 Subject: [PATCH 3940/4235] Move (if|when)-let* shims to core.el Fix void-functon when-let* errors at startup for Emacs 25.* users. --- core/core-lib.el | 13 ++----------- core/core.el | 8 +++++++- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 1deb4ae74..9fc5ee0aa 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -1,16 +1,7 @@ ;;; core-lib.el -*- lexical-binding: t; -*- -(eval-and-compile - (unless EMACS26+ - (with-no-warnings - ;; if-let and when-let were moved to (if|when)-let* in Emacs 26+ so we - ;; alias them for 25 users. - (defalias 'if-let* #'if-let) - (defalias 'when-let* #'when-let)))) - - ;; -;; Helpers +;;; Helpers (defun doom--resolve-path-forms (spec &optional directory) "Converts a simple nested series of or/and forms into a series of @@ -78,7 +69,7 @@ This is used by `associate!', `file-exists-p!' and `project-file-exists-p!'." ;; -;; Public library +;;; Public library (defun doom-unquote (exp) "Return EXP unquoted." diff --git a/core/core.el b/core/core.el index bc3543db7..1ab53ce60 100644 --- a/core/core.el +++ b/core/core.el @@ -460,7 +460,13 @@ to least)." (eval-and-compile (require 'subr-x) - (require 'cl-lib)) + (require 'cl-lib) + (unless EMACS26+ + (with-no-warnings + ;; if-let and when-let were moved to (if|when)-let* in Emacs 26+ so we + ;; alias them for 25 users. + (defalias 'if-let* #'if-let) + (defalias 'when-let* #'when-let)))) (add-to-list 'load-path doom-core-dir) From 8e866bb37f3bff6e6e8f0e8f2489ddb32e7dfb3c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 01:48:30 -0500 Subject: [PATCH 3941/4235] Improve leader key initialization And ensure leader key always has precedence. Indirectly fixes #1234 --- core/core-keybinds.el | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index d8ce923ff..8bb6d458b 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -29,6 +29,8 @@ This needs to be changed from $DOOMDIR/init.el.") (defvar doom-leader-map (make-sparse-keymap) "An overriding keymap for keys.") +(defvar doom--which-key-leader-regexp nil) + ;; (defvar doom-escape-hook nil @@ -94,10 +96,19 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; the user more changes to modify them. (defun doom|init-leader-keys () "Bind `doom-leader-key' and `doom-leader-alt-key'." - (global-set-key (kbd doom-leader-alt-key) 'doom/leader) - (when (featurep 'evil) - (evil-define-key* '(emacs insert) 'global (kbd doom-leader-alt-key) 'doom/leader) - (evil-define-key* '(normal visual motion) 'global (kbd doom-leader-key) 'doom/leader))) + (let ((map general-override-mode-map)) + (if (not (featurep 'evil)) + (define-key map (kbd doom-leader-alt-key) 'doom/leader) + (evil-define-key* '(normal visual motion) map (kbd doom-leader-key) 'doom/leader) + (evil-define-key* '(emacs insert) map (kbd doom-leader-alt-key) 'doom/leader))) + (setq doom--which-key-leader-regexp + (concat "\\(?:" + (let ((where (where-is-internal 'doom/leader + (list (current-global-map))))) + (cond (where (mapconcat #'key-description where "\\|")) + ((stringp doom-leader-alt-key) (regexp-quote doom-leader-alt-key)) + ((regexp-quote (key-description doom-leader-alt-key))))) + "\\)"))) (add-hook 'doom-after-init-modules-hook #'doom|init-leader-keys) ;; ...However, this approach (along with :wk-full-keys in `define-leader-key!') @@ -129,7 +140,7 @@ If any hook returns non-nil, all hooks after it are ignored.") "\\`" ;; Modification begin (if (memq 'doom-leader-map keymaps) - (concat "\\`\\(?:" doom-leader-key "\\|" doom-leader-alt-key "\\) "))) + (concat "\\`" doom--which-key-leader-regexp " "))) ;; Modification end (regexp-quote key) "\\'")) From 9758aae389d246bbee6fbae7ee0d2b476a988325 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 01:50:24 -0500 Subject: [PATCH 3942/4235] config/default: move help keybinds out of +bindings These ought to be available to all users, whether or not they want the rest of Doom's keybinds. --- modules/config/default/+evil-bindings.el | 33 +------------------- modules/config/default/config.el | 39 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 7871c269e..01f3956d8 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -161,38 +161,7 @@ ;; evil-surround :v "S" #'evil-surround-region :o "s" #'evil-surround-edit - :o "S" #'evil-Surround-edit - - ;; help - (:map help-map - "'" #'doom/what-face - "." #'helpful-at-point ; replaces `display-local-help' - "a" #'apropos ; replaces `apropos-command' - "A" #'doom/describe-autodefs - "B" #'doom/open-bug-report - "d" #'doom/describe-module ; replaces `apropos-documentation' b/c `apropos' covers this - "D" #'doom/open-manual - "E" #'doom/open-vanilla-sandbox - "F" #'describe-face ; replaces `Info-got-emacs-command-node' b/c redundant w/ helpful - "h" #'+lookup/documentation ; replaces `view-hello-file' b/c annoying - "L" #'global-command-log-mode ; replaces `describe-language-environment' b/c remapped to C-l - "C-l" #'describe-language-environment - "M" #'doom/describe-active-minor-mode - "C-m" #'info-emacs-manual - "n" #'doom/open-news ; replaces `view-emacs-news' b/c it's on C-n too - "O" #'+lookup/online - "p" #'doom/describe-package ; replaces `finder-by-keyword' - "P" #'find-library ; replaces `describe-package' b/c redundant w/ `doom/describe-package' - "t" #'doom/toggle-profiler ; replaces `help-with-tutorial' b/c not useful for evil users - "r" nil ; replaces `info-emacs-manual' b/c it's on C-m now - (:prefix ("r" . "reload") - "r" #'doom/reload - "t" #'doom/reload-theme - "p" #'doom/reload-packages - "f" #'doom/reload-font - "P" #'doom/reload-project) - "V" #'doom/version ; replaces `finder-by-keyword' - "W" #'+default/man-or-woman)) + :o "S" #'evil-Surround-edit) ;; diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 4ab92c141..f457fb69d 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -193,6 +193,45 @@ ;; ;; Doom's keybinding scheme +;; Custom help keys -- these aren't under `+bindings' because they ought to be +;; universal. +(map! :map help-map + "'" #'doom/what-face + "a" #'apropos ; replaces `apropos-command' + "A" #'doom/describe-autodefs + "B" #'doom/open-bug-report + "d" #'doom/describe-module ; replaces `apropos-documentation' b/c `apropos' covers this + "D" #'doom/open-manual + "E" #'doom/open-vanilla-sandbox + "F" #'describe-face ; replaces `Info-got-emacs-command-node' b/c redundant w/ helpful + "h" #'helpful-at-point ; replaces `view-hello-file' b/c annoying + "L" #'global-command-log-mode ; replaces `describe-language-environment' b/c remapped to C-l + "C-l" #'describe-language-environment + "M" #'doom/describe-active-minor-mode + "C-m" #'info-emacs-manual + "n" #'doom/open-news ; replaces `view-emacs-news' b/c it's on C-n too + "O" #'+lookup/online + "p" #'doom/describe-package ; replaces `finder-by-keyword' + "P" #'find-library ; replaces `describe-package' b/c redundant w/ `doom/describe-package' + "t" #'doom/toggle-profiler ; replaces `help-with-tutorial' b/c not useful for evil users + "r" nil ; replaces `info-emacs-manual' b/c it's on C-m now + (:prefix "r" + "r" #'doom/reload + "t" #'doom/reload-theme + "p" #'doom/reload-packages + "f" #'doom/reload-font + "P" #'doom/reload-project) + "V" #'set-variable + "C-v" #'doom/version + "W" #'+default/man-or-woman) + +(after! which-key + (which-key-add-key-based-replacements "C-h r" "reload") + (when (featurep 'evil) + (which-key-add-key-based-replacements (concat doom-leader-key " r") "reload") + (which-key-add-key-based-replacements (concat doom-leader-alt-key " r") "reload"))) + + (when (featurep! +bindings) ;; Make M-x harder to miss (define-key! 'override From d5ba685817c4b7991abd4c1fb63af1fbe525f863 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 02:38:44 -0500 Subject: [PATCH 3943/4235] Don't overwrite C-i in GUI Emacs --- modules/config/default/+evil-bindings.el | 6 +++--- modules/tools/magit/config.el | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 01f3956d8..d4caaf18f 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -21,7 +21,7 @@ [remap find-tag] #'projectile-find-tag ;; Smart tab - :i "TAB" (general-predicate-dispatch nil ; fall back to nearest keymap + :i [tab] (general-predicate-dispatch nil ; fall back to nearest keymap (and (featurep! :feature snippets) (bound-and-true-p yas-minor-mode) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) @@ -29,13 +29,13 @@ (and (featurep! :completion company +tng) (+company-has-completion-p)) '+company/complete) - :n "TAB" (general-predicate-dispatch nil + :n [tab] (general-predicate-dispatch nil (and (featurep! :editor fold) (save-excursion (end-of-line) (invisible-p (point)))) '+fold/toggle (fboundp 'evilmi-jump-items) 'evilmi-jump-items) - :v "TAB" (general-predicate-dispatch nil + :v [tab] (general-predicate-dispatch nil (and (bound-and-true-p yas-minor-mode) (or (eq evil-visual-selection 'line) (and (fboundp 'evilmi-jump-items) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 7aebf0d2f..9bff04917 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -83,7 +83,7 @@ It is passed a user and repository name.") "zz" #'evil-scroll-line-to-center "%" #'magit-gitflow-popup) ;; Don't use ESC to close magit - (evil-define-key* 'normal magit-status-mode-map (kbd "TAB") #'magit-section-toggle) + (evil-define-key* 'normal magit-status-mode-map [tab] #'magit-section-toggle) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (when-let* ((desc (assoc (car key) evil-magit-rebase-commands-w-descriptions))) From 442bd7cfb9784a2bcb64c7db8db6f675aeff3443 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 02:40:11 -0500 Subject: [PATCH 3944/4235] Only apply prefix arg fix to evil leaders --- modules/config/default/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index f457fb69d..dceb73ddc 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -126,9 +126,10 @@ ;; sensibly (and consistently with similar contexts). ;; Make SPC u SPC u [...] possible (#747) -(map! :map universal-argument-map - :prefix doom-leader-key "u" #'universal-argument-more - :prefix doom-leader-alt-key "u" #'universal-argument-more) +(when (featurep 'evil) + (map! :map universal-argument-map + :prefix doom-leader-key "u" #'universal-argument-more + :prefix doom-leader-alt-key "u" #'universal-argument-more)) (defun +default|setup-input-decode-map () "Ensure TAB and [tab] are treated the same in TTY Emacs." From 54d1c0dd56bbd4a768ba1da98b43dfca5a0ecba3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 02:42:03 -0500 Subject: [PATCH 3945/4235] Minor, general refactors --- core/core-projects.el | 4 ++++ modules/completion/ivy/config.el | 4 ++-- modules/config/default/+evil-bindings.el | 3 --- modules/config/default/config.el | 4 ++-- modules/feature/evil/autoload/evil.el | 8 ++++---- modules/lang/emacs-lisp/autoload.el | 8 ++++---- modules/lang/emacs-lisp/config.el | 2 +- modules/ui/doom-dashboard/config.el | 6 +++++- 8 files changed, 22 insertions(+), 17 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index ab2303507..9af5b90a1 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -18,6 +18,10 @@ (add-hook 'find-file-hook #'doom|init-project-mode) (projectile-mode +1) + (define-key! + [remap evil-jump-to-tag] #'projectile-find-tag + [remap find-tag] #'projectile-find-tag) + ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index c7b1b8b7b..e4e8363cf 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -77,8 +77,8 @@ immediately runs it on the current candidate (ending the ivy session)." :commands (ivy-dispatching-done-hydra ivy--matcher-desc) :init (define-key! ivy-minibuffer-map - "\C-o" #'+ivy-coo-hydra/body - (kbd "M-o") #'ivy-dispatching-done-hydra))) + "C-o" #'+ivy-coo-hydra/body + "M-o" #'ivy-dispatching-done-hydra))) (def-package! ivy-rich diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index d4caaf18f..ae0f578a0 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -17,9 +17,6 @@ "M-;" #'eval-expression "A-;" #'eval-expression) - [remap evil-jump-to-tag] #'projectile-find-tag - [remap find-tag] #'projectile-find-tag - ;; Smart tab :i [tab] (general-predicate-dispatch nil ; fall back to nearest keymap (and (featurep! :feature snippets) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index dceb73ddc..bbc4660b5 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -131,12 +131,12 @@ :prefix doom-leader-key "u" #'universal-argument-more :prefix doom-leader-alt-key "u" #'universal-argument-more)) -(defun +default|setup-input-decode-map () +(defun +default|init-input-decode-map () "Ensure TAB and [tab] are treated the same in TTY Emacs." (define-key input-decode-map [tab] (kbd "TAB")) (define-key input-decode-map [return] (kbd "RET")) (define-key input-decode-map [escape] (kbd "ESC"))) -(add-hook 'tty-setup-hook #'+default|setup-input-decode-map) +(add-hook 'tty-setup-hook #'+default|init-input-decode-map) ;; A Doom convention where C-s on popups and interactive searches will invoke ;; ivy/helm for their superior filtering. diff --git a/modules/feature/evil/autoload/evil.el b/modules/feature/evil/autoload/evil.el index 8eb6638ea..cac9a022e 100644 --- a/modules/feature/evil/autoload/evil.el +++ b/modules/feature/evil/autoload/evil.el @@ -50,10 +50,10 @@ (call-interactively #'evil-paste-after))) (defun +evil--window-swap (direction) - "Move current window to the next window in DIRECTION. If there are no windows -there and there is only one window, split in that direction and place this -window there. If there are no windows and this isn't the only window, use -evil-window-move-* (e.g. `evil-window-move-far-left')" + "Move current window to the next window in DIRECTION. +If there are no windows there and there is only one window, split in that +direction and place this window there. If there are no windows and this isn't +the only window, use evil-window-move-* (e.g. `evil-window-move-far-left')." (when (window-dedicated-p) (user-error "Cannot swap a dedicated window")) (let* ((this-window (selected-window)) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 661d6d8ef..b3f6f37dd 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -98,17 +98,17 @@ library/userland functions" (defun +emacs-lisp|extend-imenu () "Improve imenu support with better expression regexps and Doom-specific forms." (setq imenu-generic-expression - '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) + '(("Evil commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) - ("Package" "^\\s-*;; `\\(\\_<[^ ()\n]+\\_>\\)'$" 1) + ("Package" "^\\s-*;;;###package\\s-+\\(\\_<[^ ()\n]+\\_>\\)$" 1) ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) - ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) + ("Modeline segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) - ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) + ("Inline functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\|var\\(?:-local\\)?\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7d1baa578..c741fa931 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -60,7 +60,7 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") (font-lock-add-keywords 'emacs-lisp-mode (append `(;; custom Doom cookies - ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t))) + ("^;;;###\\(autodef\\|if\\|package\\)[ \n]" (1 font-lock-warning-face t))) ;; highlight defined, special variables & functions (when +emacs-lisp-enable-extra-fontification `((+emacs-lisp-highlight-vars-and-faces . +emacs-lisp--face))))) diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index a0be1f422..f06158d7c 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -429,7 +429,11 @@ controlled by `+doom-dashboard-pwd-policy'." (with-temp-buffer (save-excursion (insert (key-description key))) (while (re-search-forward "<\\([^>]+\\)>" nil t) - (replace-match (upcase (substring (match-string 1) 0 3)))) + (let ((str (match-string 1))) + (replace-match + (upcase (if (< (length str) 3) + str + (substring str 0 3)))))) (propertize (buffer-string) 'face 'font-lock-constant-face))) "")))) (if (display-graphic-p) From 419c3ba1e69c0e1fa9c30eac6b0bc235ff65b535 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 02:43:07 -0500 Subject: [PATCH 3946/4235] feature/evil: recenter window after / * or # --- core/core-editor.el | 2 +- modules/feature/evil/config.el | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index f21104a58..61a1bfa2f 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -37,7 +37,7 @@ detected.") hscroll-margin 2 hscroll-step 1 scroll-conservatively 1001 - scroll-margin 0 + scroll-margin 2 scroll-preserve-screen-position t ;; Whitespace (see `editorconfig') indent-tabs-mode nil diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index d5974529b..471f97899 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -121,6 +121,15 @@ line with a linewise comment.") (advice-add #'evil-open-above :around #'+evil*insert-newline-above-and-respect-comments) (advice-add #'evil-open-below :around #'+evil*insert-newline-below-and-respect-comments) + ;; Recenter screen after most searches + (advice-add! '(evil-visualstar/begin-search-forward + evil-visualstar/begin-search-backward + evil-ex-search-word-backward + evil-ex-search-word-backward + evil-ex-search-forward + evil-ex-search-backward) + :after #'doom*recenter) + ;; --- custom interactive codes ----------- ;; These arg types will highlight matches in the current buffer (evil-ex-define-argument-type buffer-match :runner +evil-ex-buffer-match) From b6fcd59a0156f9540214635843cdeb7a81354858 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 03:23:10 -0500 Subject: [PATCH 3947/4235] completion/ivy: remap describe-bindings & set-variable --- modules/completion/ivy/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e4e8363cf..e3389b867 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -114,6 +114,8 @@ immediately runs it on the current candidate (ending the ivy session)." [remap describe-face] #'counsel-faces [remap describe-function] #'counsel-describe-function [remap describe-variable] #'counsel-describe-variable + [remap describe-bindings] #'counsel-descbinds + [remap set-variable] #'counsel-set-variable [remap execute-extended-command] #'counsel-M-x [remap find-file] #'counsel-find-file [remap find-library] #'counsel-find-library From 1a6f0c2f1d83815d24ccebdcc7e050e58ff3f76c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 03:28:00 -0500 Subject: [PATCH 3948/4235] :boom: Redesign vanilla Emacs keybind scheme The leader keys have been redesigned a) for consistency, b) to reduce collisions with packages, and c) to improve command coverage. However, much of it still comes from a vim user, so it needs more testing. --- modules/config/default/+emacs-bindings.el | 629 ++++++++++++---------- modules/feature/eval/autoload/eval.el | 8 + 2 files changed, 344 insertions(+), 293 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 198104fa8..e77c7eb68 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -1,307 +1,350 @@ ;;; config/default/+emacs-bindings.el -*- lexical-binding: t; -*- ;; Sensible deafult key bindings for non-evil users +(setq doom-leader-alt-key "C-c" + doom-localleader-alt-key "C-c l") ;; persp-mode and projectile in different prefixes -(setq persp-keymap-prefix (kbd "C-c e")) +(setq persp-keymap-prefix (kbd "C-c w")) (after! projectile (define-key projectile-mode-map (kbd "C-c p") 'projectile-command-map)) -(which-key-add-key-based-replacements "C-c !" "checking") -(which-key-add-key-based-replacements "C-c e" "perspective") -(which-key-add-key-based-replacements "C-c p" "projectile") +(after! which-key + (which-key-add-key-based-replacements "C-c !" "checking") + (which-key-add-key-based-replacements "C-c l" "")) -;; Prefix key to invoke doom related commands -(setq doom-leader-alt-key "C-c") -(setq doom-localleader-alt-key "C-c l") -(map! - ;; Text scaling - "" #'text-scale-increase - "" #'text-scale-decrease - "" (λ! (text-scale-set 0)) - "M-+" (λ! (text-scale-set 0)) - "M-=" #'text-scale-increase - "M--" #'text-scale-decrease - ;; Editor related bindings - [remap newline] #'newline-and-indent - "C-j" #'+default/newline - (:when (featurep! :completion ivy) - "C-S-s" #'swiper - "C-S-r" #'ivy-resume) - (:when (featurep! :completion helm) - "C-S-s" #'swiper-helm - "C-S-r" #'helm-resume) - ;; Buffer related bindings - "C-x b" #'persp-switch-to-buffer - (:when (featurep! :completion ivy) - "C-x 4 b" #'+ivy/switch-workspace-buffer-other-window) - "C-x C-b" #'ibuffer-list-buffers - "C-x B" #'switch-to-buffer - "C-x 4 B" #'switch-to-buffer-other-window - "C-x k" #'doom/kill-this-buffer-in-all-windows - ;; Popup bindigns - "C-x p" #'+popup/other - "C-`" #'+popup/toggle - "C-~" #'+popup/raise - ;; Doom emacs bindings - (:leader - (:prefix ("d" . "doom") - :desc "Dashboard" "d" #'+doom-dashboard/open - :desc "Recent files" "f" #'recentf-open-files - (:when (featurep! :ui neotree) - :desc "Open neotree" "n" #'+neotree/open - :desc "File in neotree" "N" #'neotree/find-this-file) - (:when (featurep! :ui treemacs) - :desc "Toggle treemacs" "n" #'+treemacs/toggle - :desc "File in treemacs" "N" #'+treemacs/find-file) - :desc "Popup other" "o" #'+popup/other - :desc "Popup toggle" "t" #'+popup/toggle - :desc "Popup close" "c" #'+popup/close - :desc "Popup close all" "C" #'+popup/close-all - :desc "Popup raise" "r" #'+popup/raise - :desc "Popup restore" "R" #'+popup/restore - :desc "Scratch buffer" "s" #'doom/open-scratch-buffer - :desc "Switch to scratch buffer" "S" #'doom/switch-to-scratch-buffer - :desc "Sudo this file" "u" #'doom/sudo-this-file - :desc "Sudo find file" "U" #'doom/sudo-find-file - :desc "Eshell popup" "e" #'+eshell/open-popup - :desc "Eshell open" "E" #'+eshell/open - :desc "Reload Private Config" "R" #'doom/reload) - ;; Org related bindings - "o" nil ; we need to unbind it first as Org claims this - (:prefix ("o". "org") - :desc "Do what I mean" "o" #'+org/dwim-at-point - :desc "Sync org caldav" "s" #'org-caldav-sync - (:prefix ("a" . "org agenda") - :desc "Agenda" "a" #'org-agenda - :desc "Todo list" "t" #'org-todo-list - :desc "Tags view" "m" #'org-tags-view - :desc "View search" "v" #'org-search-view) - :desc "Capture" "c" #'org-capture - :desc "Goto capture" "C" (λ! (require 'org-capture) (call-interactively #'org-capture-goto-target)) - :desc "Switch org buffers" "b" #'org-switchb - (:prefix ("e" . "org export") - :desc "Export beamer to latex" "l b" #'org-beamer-export-to-latex - :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex - :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf) - :desc "Link store" "l" #'org-store-link) - ;; Quit/Restart - (:prefix ("q" . "quit/restart") - :desc "Quit Emacs" "q" #'kill-emacs - :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal - (:when (featurep! :feature workspaces) - :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit) - :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore - :desc "Restart Emacs" "R" #'doom/restart) - ;; Snippets - "&" nil ; yasnippet creates this prefix, we use a different one - (:prefix ("s" . "snippets") - :desc "New snippet" "n" #'yas-new-snippet - :desc "Insert snippet" "i" #'yas-insert-snippet - :desc "Find global snippet" "/" #'yas-visit-snippet-file - :desc "Reload snippets" "r" #'yas-reload-all - :desc "Create Temp Template" "c" #'aya-create - :desc "Use Temp Template" "e" #'aya-expand) - ;; Version control bindings - (:prefix ("v" . "versioning") - :desc "Browse issues tracker" "i" #'forge-browse-issues - :desc "Browse remote" "o" #'forge-browse-remote - :desc "Diff current file" "d" #'magit-diff-buffer-file - :desc "Git revert hunk" "r" #'git-gutter:revert-hunk - :desc "Git stage file" "S" #'magit-stage-file - :desc "Git stage hunk" "s" #'git-gutter:stage-hunk - :desc "Git time machine" "t" #'git-timemachine-toggle - :desc "Git unstage file" "U" #'magit-unstage-file - :desc "Initialize repo" "I" #'magit-init - :desc "List repositories" "L" #'magit-list-repositories - :desc "Magit blame" "b" #'magit-blame-addition - :desc "Magit buffer log" "l" #'magit-log-buffer-file - :desc "Magit commit" "c" #'magit-commit-create - :desc "Magit status" "g" #'magit-status - :desc "Next hunk" "]" #'git-gutter:next-hunk - :desc "Previous hunk" "[" #'git-gutter:previous-hunk) - ;; Worspace and window management bindings - (:prefix ("w". "workspaces") - :desc "Autosave session" "a" #'doom/quicksave-session - :desc "Display workspaces" "d" #'+workspace/display - :desc "Rename workspace" "r" #'+workspace/rename - :desc "Create workspace" "c" #'+workspace/new - :desc "Delete workspace" "k" #'+workspace/delete - :desc "Save session" "s" #'doom/save-session - :desc "Save workspace" "S" #'+workspace/save - :desc "Load session" "l" #'doom/load-session - :desc "Load last autosaved session" "L" #'doom/quickload-session - :desc "Kill other buffers" "o" #'doom/kill-other-buffers - :desc "Undo window config" "u" #'winner-undo - :desc "Redo window config" "U" #'winner-redo - :desc "Switch to left workspace" "p" #'+workspace/switch-left - :desc "Switch to right workspace" "n" #'+workspace/switch-right - :desc "Switch to" "w" #'+workspace/switch-to - :desc "Switch to workspace 1" "1" (λ! (+workspace/switch-to 0)) - :desc "Switch to workspace 2" "2" (λ! (+workspace/switch-to 1)) - :desc "Switch to workspace 3" "3" (λ! (+workspace/switch-to 2)) - :desc "Switch to workspace 4" "4" (λ! (+workspace/switch-to 3)) - :desc "Switch to workspace 5" "5" (λ! (+workspace/switch-to 4)) - :desc "Switch to workspace 6" "6" (λ! (+workspace/switch-to 5)) - :desc "Switch to workspace 7" "7" (λ! (+workspace/switch-to 6)) - :desc "Switch to workspace 8" "8" (λ! (+workspace/switch-to 7)) - :desc "Switch to workspace 9" "9" (λ! (+workspace/switch-to 8)) - :desc "Switch to last workspace" "0" #'+workspace/switch-to-last) - ;; Multiple Cursors - (:when (featurep! :editor multiple-cursors) - (:prefix ("m" . "multiple cursors") - :desc "Edit lines" "l" #'mc/edit-lines - :desc "Mark next" "n" #'mc/mark-next-like-this - :desc "Unmark next" "N" #'mc/unmark-next-like-this - :desc "Mark previous" "p" #'mc/mark-previous-like-this - :desc "Unmark previous" "P" #'mc/unmark-previous-like-this - :desc "Mark all" "t" #'mc/mark-all-like-this - :desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim - :desc "Edit line endings" "e" #'mc/edit-ends-of-lines - :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines - :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair - :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun - :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click)) +;; +;;; Global keybinds - ;; APPs +(map! "C-'" #'imenu + ;; Text scaling + "" #'text-scale-increase + "" #'text-scale-decrease + "" (λ! (text-scale-set 0)) + "M-+" (λ! (text-scale-set 0)) + "M-=" #'text-scale-increase + "M--" #'text-scale-decrease + ;; Editor related bindings + [remap newline] #'newline-and-indent + "C-j" #'+default/newline + (:when (featurep! :completion ivy) + "C-S-s" #'swiper + "C-S-r" #'ivy-resume) + (:when (featurep! :completion helm) + "C-S-s" #'swiper-helm + "C-S-r" #'helm-resume) + ;; Buffer related bindings + "C-x b" #'persp-switch-to-buffer + (:when (featurep! :completion ivy) + "C-x 4 b" #'+ivy/switch-workspace-buffer-other-window) + "C-x C-b" #'ibuffer-list-buffers + "C-x B" #'switch-to-buffer + "C-x 4 B" #'switch-to-buffer-other-window + "C-x k" #'doom/kill-this-buffer-in-all-windows + ;; Popup bindigns + "C-x p" #'+popup/other + "C-`" #'+popup/toggle + "C-~" #'+popup/raise) - ;; Email - (:when (featurep! :app email) - (:prefix ("M" . "email") - :desc "Open email app" "m" #'=email - :desc "Compose email" "c" #'+email/compose)) - ;; IRC - (:when (featurep! :app irc) - (:prefix ("I" . "irc") - :desc "Open irc app" "i" #'=irc - :desc "Next unread buffer" "a" #'tracking-next-buffer - :desc "Quit irc" "q" #'+irc/quit - :desc "Reconnect all" "r" #'circe-reconnect-all - :desc "Send message" "s" #'+irc/send-message - (:when (featurep! :completion ivy) - :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) - ;; Twitter - (:when (featurep! :app twitter) - (:prefix ("T" . "twitter") - :desc "Open twitter app" "t" #'=twitter - :desc "Quit twitter" "q" #'+twitter/quit - :desc "Rerender twits" "r" #'+twitter/rerender-all - :desc "Ace link" "l" #'+twitter/ace-link))) - ;; Plugins +;; +;;; Leader keys - ;; misc plugins - (:when (featurep! :ui neotree) - "" #'+neotree/open) - (:when (featurep! :ui treemacs) - "" #'+treemacs/toggle) - "C-=" #'er/expand-region - "C--" #'er/contract-region - ;; smartparens - (:after smartparens - (:map smartparens-mode-map - "C-M-a" #'sp-beginning-of-sexp - "C-M-e" #'sp-end-of-sexp - "C-M-f" #'sp-forward-sexp - "C-M-b" #'sp-backward-sexp - "C-M-d" #'sp-splice-sexp - "C-M-k" #'sp-kill-sexp - "C-M-t" #'sp-transpose-sexp - "C-" #'sp-forward-slurp-sexp - "M-" #'sp-forward-barf-sexp - "C-" #'sp-backward-slurp-sexp - "M-" #'sp-backward-barf-sexp)) - ;; company mode - "C-;" #'+company/complete - ;; Counsel - (:when (featurep! :completion ivy) - (: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)) - "C-h b" #'counsel-descbinds - "C-M-y" #'counsel-yank-pop - "C-h F" #'counsel-faces - "C-h p" #'counsel-package - "C-h a" #'counsel-apropos - "C-h V" #'counsel-set-variable - "C-'" #'counsel-imenu)) - ;; repl toggle - "C-c C-z" #'+eval/open-repl-other-window - ;; company mode - (:after company - (:map company-active-map - "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" #'company-search-candidates - "M-s" #'company-filter-candidates - "" #'company-complete-common-or-cycle - [tab] #'company-complete-common-or-cycle - [backtab] #'company-select-previous - "C-RET" #'counsel-company) - (:map company-search-map - "C-n" #'company-search-repeat-forward - "C-p" #'company-search-repeat-backward - "C-s" (λ! (company-search-abort) (company-filter-candidates)))) - ;; neotree bindings - (:after neotree - :map neotree-mode-map - "q" #'neotree-hide - [return] #'neotree-enter - "RET" #'neotree-enter - "SPC" #'neotree-quick-look - "v" #'neotree-enter-vertical-split - "s" #'neotree-enter-horizontal-split - "c" #'neotree-create-node - "D" #'neotree-delete-node - "g" #'neotree-refresh - "r" #'neotree-rename-node - "R" #'neotree-refresh - "h" #'+neotree/collapse-or-up - "l" #'+neotree/expand-or-open - "n" #'neotree-next-line - "p" #'neotree-previous-line - "N" #'neotree-select-next-sibling-node - "P" #'neotree-select-previous-sibling-node) - ;; help and info - (:after help-mode - (:map help-mode-map - "o" #'ace-link-help - ">" #'help-go-forward - "<" #'help-go-back)) - (:after helpful-mode - (:map helpful-mode-map - "o" #'ace-link-help)) - (:after info - (:map Info-mode-map - "o" #'ace-link-info)) - ;; yasnippet - (:after yasnippet - ;; keymap while editing an inserted snippet - (:map yas-keymap - "C-e" #'+snippets/goto-end-of-field - "C-a" #'+snippets/goto-start-of-field - "" #'yas-prev-field - "" #'+snippets/delete-to-start-of-field - [backspace] #'+snippets/delete-backward-char - [delete] #'+snippets/delete-forward-char-or-field)) - ;; flycheck - (:after flycheck - (:map flycheck-error-list-mode-map - "C-n" #'flycheck-error-list-next-error - "C-p" #'flycheck-error-list-previous-error - "RET" #'flycheck-error-list-goto-error)) - ;; ivy - (:after ivy - (:map ivy-minibuffer-map - "TAB" #'ivy-alt-done - "C-g" #'keyboard-escape-quit)) - ;; ein notebokks - (:after ein:notebook-multilang - (:map ein:notebook-multilang-mode-map - "C-c h" #'+ein/hydra/body))) +(map! :leader + :desc "Find file in project" "C-f" #'projectile-find-file + :desc "Evaluate line/region" "e" #'+eval/line-or-region + :desc "Pop up scratch buffer" "x" #'doom/open-to-scratch-buffer + :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer + + (:when (featurep! :emacs term) + :desc "Terminal" "`" #'+term/open + :desc "Terminal in popup" "~" #'+term/open-popup-in-project) + (:when (featurep! :tools vterm) + :desc "Terminal" "`" #'+vterm/open + :desc "Terminal in popup" "~" #'+vterm/open-popup-in-project) + (:when (featurep! :emacs eshell) + :desc "Eshell" "`" #'+eshell/open + :desc "Eshell in popup" "~" #'+eshell/open-popup) + + ;; Add labels to prefixes defined elsewhere + :desc "project" "p" nil + + (:prefix ("f" . "file") + :desc "Find other file" "a" #'projectile-find-other-file + :desc "Browse private config" "c" #'doom/open-private-config + :desc "Find file in private config" "C" #'doom/find-file-in-private-config + :desc "Open project editorconfig" "." #'editorconfig-find-current-editorconfig + :desc "Find directory" "d" #'dired + :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd + :desc "Browse emacs.d" "E" #'+default/browse-emacsd + :desc "Find file from here" "f" (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file) + :desc "Find file in other project" "F" #'doom/browse-in-other-project + :desc "Find file in project" "p" #'projectile-find-file + :desc "Find file in other project" "P" #'doom/find-file-in-other-project + :desc "Recent files" "r" #'recentf-open-files + :desc "Recent project files" "R" #'projectile-recentf + :desc "Sudo this file" "s" #'doom/sudo-this-file + :desc "Sudo find file" "S" #'doom/sudo-find-file + :desc "Delete this file" "X" #'doom/delete-this-file + :desc "Yank filename" "y" #'+default/yank-buffer-filename) + + "o" nil ; we need to unbind it first as Org claims this + (:prefix ("o". "org") + :desc "Do what I mean" "o" #'+org/dwim-at-point + :desc "Sync org caldav" "s" #'org-caldav-sync + (:prefix ("a" . "org agenda") + :desc "Agenda" "a" #'org-agenda + :desc "Todo list" "t" #'org-todo-list + :desc "Tags view" "m" #'org-tags-view + :desc "View search" "v" #'org-search-view) + :desc "Capture" "c" #'org-capture + :desc "Goto capture" "C" (λ! (require 'org-capture) (call-interactively #'org-capture-goto-target)) + :desc "Switch org buffers" "b" #'org-switchb + (:prefix ("e" . "org export") + :desc "Export beamer to latex" "l b" #'org-beamer-export-to-latex + :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex + :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf) + :desc "Link store" "l" #'org-store-link) + + (:prefix ("q" . "quit/restart") + :desc "Quit Emacs" "q" #'kill-emacs + :desc "Save and quit Emacs" "Q" #'save-buffers-kill-terminal + (:when (featurep! :feature workspaces) + :desc "Quit Emacs & forget session" "X" #'+workspace/kill-session-and-quit) + :desc "Restart & restore Emacs" "r" #'doom/restart-and-restore + :desc "Restart Emacs" "R" #'doom/restart) + + (:prefix ("&" . "snippets") + :desc "New snippet" "n" #'yas-new-snippet + :desc "Insert snippet" "i" #'yas-insert-snippet + :desc "Find global snippet" "/" #'yas-visit-snippet-file + :desc "Reload snippets" "r" #'yas-reload-all + :desc "Create Temp Template" "c" #'aya-create + :desc "Use Temp Template" "e" #'aya-expand) + + (:prefix ("v" . "versioning") + :desc "Git revert file" "R" #'vc-revert + (:when (featurep! :ui vc-gutter) + :desc "Git revert hunk" "r" #'git-gutter:revert-hunk + :desc "Git stage hunk" "s" #'git-gutter:stage-hunk + :desc "Git time machine" "t" #'git-timemachine-toggle + :desc "Jump to next hunk" "n" #'git-gutter:next-hunk + :desc "Jump to previous hunk" "p" #'git-gutter:previous-hunk) + (:when (featurep! :tools magit) + :desc "Magit dispatch" "/" #'magit-dispatch + :desc "Forge dispatch" "'" #'forge-dispatch + :desc "Magit status" "g" #'magit-status + :desc "Magit file delete" "x" #'magit-file-delete + :desc "Magit blame" "B" #'magit-blame-addition + :desc "Magit clone" "C" #'+magit/clone + :desc "Magit fetch" "F" #'magit-fetch + :desc "Magit buffer log" "L" #'magit-log + :desc "Git stage file" "S" #'magit-stage-file + :desc "Git unstage file" "U" #'magit-unstage-file + (:prefix ("f" . "find") + :desc "Find file" "f" #'magit-find-file + :desc "Find gitconfig file" "g" #'magit-find-git-config-file + :desc "Find commit" "c" #'magit-show-commit + :desc "Find issue" "i" #'forge-visit-issue + :desc "Find pull request" "p" #'forge-visit-pullreq) + (:prefix ("o" . "open in browser") + :desc "Browse region or line" "." #'+vc/git-browse-region-or-line + :desc "Browse remote" "r" #'forge-browse-remote + :desc "Browse commit" "c" #'forge-browse-commit + :desc "Browse an issue" "i" #'forge-browse-issue + :desc "Browse a pull request" "p" #'forge-browse-pullreq + :desc "Browse issues" "I" #'forge-browse-issues + :desc "Browse pull requests" "P" #'forge-browse-pullreqs) + (:prefix ("l" . "list") + (:when (featurep! :tools gist) + :desc "List gists" "g" #'+gist:list) + :desc "List repositories" "r" #'magit-list-repositories + :desc "List submodules" "s" #'magit-list-submodules + :desc "List issues" "i" #'forge-list-issues + :desc "List pull requests" "p" #'forge-list-pullreqs + :desc "List notifications" "n" #'forge-list-notifications) + (:prefix ("c" . "create") + :desc "Initialize repo" "r" #'magit-init + :desc "Clone repo" "R" #'+magit/clone + :desc "Commit" "c" #'magit-commit-create + :desc "Issue" "i" #'forge-create-issue + :desc "Pull request" "p" #'forge-create-pullreq))) + + (:prefix ("w" . "workspaces/windows") + :desc "Autosave session" "a" #'doom/quicksave-session + :desc "Display workspaces" "d" #'+workspace/display + :desc "Rename workspace" "r" #'+workspace/rename + :desc "Create workspace" "c" #'+workspace/new + :desc "Delete workspace" "k" #'+workspace/delete + :desc "Save session" "s" #'doom/save-session + :desc "Save workspace" "S" #'+workspace/save + :desc "Load session" "l" #'doom/load-session + :desc "Load last autosaved session" "L" #'doom/quickload-session + :desc "Kill other buffers" "o" #'doom/kill-other-buffers + :desc "Undo window config" "u" #'winner-undo + :desc "Redo window config" "U" #'winner-redo + :desc "Switch to left workspace" "p" #'+workspace/switch-left + :desc "Switch to right workspace" "n" #'+workspace/switch-right + :desc "Switch to" "w" #'+workspace/switch-to + :desc "Switch to workspace 1" "1" (λ! (+workspace/switch-to 0)) + :desc "Switch to workspace 2" "2" (λ! (+workspace/switch-to 1)) + :desc "Switch to workspace 3" "3" (λ! (+workspace/switch-to 2)) + :desc "Switch to workspace 4" "4" (λ! (+workspace/switch-to 3)) + :desc "Switch to workspace 5" "5" (λ! (+workspace/switch-to 4)) + :desc "Switch to workspace 6" "6" (λ! (+workspace/switch-to 5)) + :desc "Switch to workspace 7" "7" (λ! (+workspace/switch-to 6)) + :desc "Switch to workspace 8" "8" (λ! (+workspace/switch-to 7)) + :desc "Switch to workspace 9" "9" (λ! (+workspace/switch-to 8)) + :desc "Switch to last workspace" "0" #'+workspace/switch-to-last) + + (:when (featurep! :editor multiple-cursors) + (:prefix ("m" . "multiple cursors") + :desc "Edit lines" "l" #'mc/edit-lines + :desc "Mark next" "n" #'mc/mark-next-like-this + :desc "Unmark next" "N" #'mc/unmark-next-like-this + :desc "Mark previous" "p" #'mc/mark-previous-like-this + :desc "Unmark previous" "P" #'mc/unmark-previous-like-this + :desc "Mark all" "t" #'mc/mark-all-like-this + :desc "Mark all DWIM" "m" #'mc/mark-all-like-this-dwim + :desc "Edit line endings" "e" #'mc/edit-ends-of-lines + :desc "Edit line starts" "a" #'mc/edit-beginnings-of-lines + :desc "Mark tag" "s" #'mc/mark-sgml-tag-pair + :desc "Mark in defun" "d" #'mc/mark-all-like-this-in-defun + :desc "Add cursor w/mouse" "" #'mc/add-cursor-on-click)) + + ;; APPs + (:when (featurep! :app email) + (:prefix ("M" . "email") + :desc "Open email app" "M" #'=email + :desc "Compose email" "c" #'+email/compose)) + + (:when (featurep! :app irc) + (:prefix ("I" . "irc") + :desc "Open irc app" "I" #'=irc + :desc "Next unread buffer" "a" #'tracking-next-buffer + :desc "Quit irc" "q" #'+irc/quit + :desc "Reconnect all" "r" #'circe-reconnect-all + :desc "Send message" "s" #'+irc/send-message + (:when (featurep! :completion ivy) + :desc "Jump to channel" "j" #'irc/ivy-jump-to-channel))) + + (:when (featurep! :app twitter) + (:prefix ("T" . "twitter") + :desc "Open twitter app" "T" #'=twitter + :desc "Quit twitter" "q" #'+twitter/quit + :desc "Rerender twits" "r" #'+twitter/rerender-all + :desc "Ace link" "l" #'+twitter/ace-link))) + + +;; +;;; Plugins + +(map! "C-=" #'er/expand-region + "C--" #'er/contract-region + (:when (featurep! :ui neotree) + "" #'+neotree/open + "" #'+neotree/find-this-file) + (:when (featurep! :ui treemacs) + "" #'+treemacs/open + "" #'+treemacs/find-file) + ;; smartparens + (:after smartparens + :map smartparens-mode-map + "C-M-a" #'sp-beginning-of-sexp + "C-M-e" #'sp-end-of-sexp + "C-M-f" #'sp-forward-sexp + "C-M-b" #'sp-backward-sexp + "C-M-d" #'sp-splice-sexp + "C-M-k" #'sp-kill-sexp + "C-M-t" #'sp-transpose-sexp + "C-" #'sp-forward-slurp-sexp + "M-" #'sp-forward-barf-sexp + "C-" #'sp-backward-slurp-sexp + "M-" #'sp-backward-barf-sexp) + ;; company mode + "C-;" #'+company/complete + ;; Counsel + (:when (featurep! :completion ivy) + (: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)) + "C-M-y" #'counsel-yank-pop) + ;; repl toggle + "C-c C-z" #'+eval/open-repl-other-window + ;; company mode + (:after company + :map company-active-map + "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" #'company-search-candidates + "M-s" #'company-filter-candidates + "" #'company-complete-common-or-cycle + [tab] #'company-complete-common-or-cycle + [backtab] #'company-select-previous + "C-RET" #'counsel-company + :map company-search-map + "C-n" #'company-search-repeat-forward + "C-p" #'company-search-repeat-backward + "C-s" (λ! (company-search-abort) (company-filter-candidates))) + ;; neotree bindings + (:after neotree + :map neotree-mode-map + "q" #'neotree-hide + "RET" #'neotree-enter + "SPC" #'neotree-quick-look + "v" #'neotree-enter-vertical-split + "s" #'neotree-enter-horizontal-split + "c" #'neotree-create-node + "D" #'neotree-delete-node + "g" #'neotree-refresh + "r" #'neotree-rename-node + "R" #'neotree-refresh + "h" #'+neotree/collapse-or-up + "l" #'+neotree/expand-or-open + "n" #'neotree-next-line + "p" #'neotree-previous-line + "N" #'neotree-select-next-sibling-node + "P" #'neotree-select-previous-sibling-node) + ;; help and info + (:after help-mode + :map help-mode-map + "o" #'ace-link-help + ">" #'help-go-forward + "<" #'help-go-back) + (:after helpful-mode + :map helpful-mode-map + "o" #'ace-link-help) + (:after info + :map Info-mode-map + "o" #'ace-link-info) + ;; yasnippet + (:after yasnippet + ;; keymap while editing an inserted snippet + :map yas-keymap + "C-e" #'+snippets/goto-end-of-field + "C-a" #'+snippets/goto-start-of-field + "" #'yas-prev-field + "" #'+snippets/delete-to-start-of-field + [backspace] #'+snippets/delete-backward-char + [delete] #'+snippets/delete-forward-char-or-field) + ;; flycheck + (:after flycheck + :map flycheck-error-list-mode-map + "C-n" #'flycheck-error-list-next-error + "C-p" #'flycheck-error-list-previous-error + "RET" #'flycheck-error-list-goto-error) + ;; ivy + (:after ivy + :map ivy-minibuffer-map + "TAB" #'ivy-alt-done + "C-g" #'keyboard-escape-quit) + ;; ein notebokks + (:after ein:notebook-multilang + :map ein:notebook-multilang-mode-map + "C-c h" #'+ein/hydra/body)) diff --git a/modules/feature/eval/autoload/eval.el b/modules/feature/eval/autoload/eval.el index 2a1738cd9..d7f8df29c 100644 --- a/modules/feature/eval/autoload/eval.el +++ b/modules/feature/eval/autoload/eval.el @@ -17,6 +17,14 @@ (funcall runner beg end) (quickrun-region beg end)))) +;;;###autoload +(defun +eval/line-or-region () + "Evaluate the current line or selected region." + (interactive) + (if (use-region-p) + (call-interactively #'+eval/region) + (+eval/region (line-beginning-position) (line-end-position)))) + ;;;###autoload (defun +eval/buffer-or-region () "Evaluate the whole buffer." From 66d75936fc82424b088906b38b375a26c848f300 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 03:41:26 -0500 Subject: [PATCH 3949/4235] config/default: split into evil/emacs files Done to better facilitate a non-evil config. - Adds winum (and enables support for it in doom-modeline) - Adds expand-region (#1231) - Uses default smartparens config for non-evil users (WIP) --- modules/config/default/+emacs.el | 32 +++++++ modules/config/default/+evil.el | 109 ++++++++++++++++++++++++ modules/config/default/config.el | 130 ++++------------------------- modules/config/default/packages.el | 6 ++ modules/ui/modeline/config.el | 6 +- 5 files changed, 168 insertions(+), 115 deletions(-) create mode 100644 modules/config/default/+emacs.el create mode 100644 modules/config/default/+evil.el create mode 100644 modules/config/default/packages.el diff --git a/modules/config/default/+emacs.el b/modules/config/default/+emacs.el new file mode 100644 index 000000000..c9188f3d5 --- /dev/null +++ b/modules/config/default/+emacs.el @@ -0,0 +1,32 @@ +;;; config/default/+emacs.el -*- lexical-binding: t; -*- + +(require 'projectile) ; we need its keybinds immediately + + +;; +;;; Reasonable defaults + +(setq shift-select-mode t) +(delete-selection-mode +1) + +(def-package! expand-region + :commands (er/contract-region er/mark-symbol er/mark-word) + :config + (defun doom*quit-expand-region () + "Properly abort an expand-region region." + (when (memq last-command '(er/expand-region er/contract-region)) + (er/contract-region 0))) + (advice-add #'evil-escape :before #'doom*quit-expand-region) + (advice-add #'doom/escape :before #'doom*quit-expand-region)) + + +(def-package! winum + :after-call (doom-switch-window-hook) + :config (winum-mode +1)) + + +;; +;;; Keybinds + +(when (featurep! +bindings) + (load! "+emacs-bindings")) diff --git a/modules/config/default/+evil.el b/modules/config/default/+evil.el new file mode 100644 index 000000000..5d624abed --- /dev/null +++ b/modules/config/default/+evil.el @@ -0,0 +1,109 @@ +;;; config/default/+evil.el -*- lexical-binding: t; -*- + +(defun +default|disable-delete-selection-mode () + (delete-selection-mode -1)) +(add-hook 'evil-insert-state-entry-hook #'delete-selection-mode) +(add-hook 'evil-insert-state-exit-hook #'+default|disable-delete-selection-mode) + + +;; +;;; Smartparens config + +(when (featurep! +smartparens) + ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) + ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) + ;; or specific :post-handlers with: + ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) + (after! smartparens + ;; Autopair quotes more conservatively; if I'm next to a word/before another + ;; quote, I likely don't want to open a new pair. + (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)) + + ;; Expand {|} => { | } + ;; Expand {|} => { + ;; | + ;; } + (dolist (brace '("(" "{" "[")) + (sp-pair brace nil + :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) + ;; I likely don't want a new pair if adjacent to a word or opening brace + :unless '(sp-point-before-word-p sp-point-before-same-p))) + + ;; Major-mode specific fixes + (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) + + ;; Don't do square-bracket space-expansion where it doesn't make sense to + (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) + "[" nil :post-handlers '(:rem ("| " "SPC"))) + + ;; Reasonable default pairs for HTML-style comments + (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) + "" + :unless '(sp-point-before-word-p sp-point-before-same-p) + :actions '(insert) :post-handlers '(("| " "SPC"))) + + ;; Disable electric keys in C modes because it interferes with smartparens + ;; and custom bindings. We'll do it ourselves (mostly). + (after! cc-mode + (c-toggle-electric-state -1) + (c-toggle-auto-newline -1) + (setq c-electric-flag nil) + (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) + (define-key c-mode-base-map key nil))) + + ;; Expand C-style doc comment blocks. Must be done manually because some of + ;; these languages use specialized (and deferred) parsers, whose state we + ;; can't access while smartparens is doing its thing. + (defun +default-expand-doc-comment-block (&rest _ignored) + (let ((indent (current-indentation))) + (newline-and-indent) + (save-excursion + (newline) + (insert (make-string indent 32) " */") + (delete-char 2)))) + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode + csharp-mode java-mode php-mode css-mode scss-mode less-css-mode + stylus-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) + + ;; Highjacks backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented `tab-width' steps at a time + ;; c) close empty multiline brace blocks in one step: + ;; { + ;; | + ;; } + ;; becomes {|} + ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work + ;; even after a backspace. + ;; e) properly delete smartparen pairs when they are encountered, without + ;; the need for strict mode. + ;; f) do none of this when inside a string + (advice-add #'delete-backward-char :override #'+default*delete-backward-char) + + ;; Makes `newline-and-indent' continue comments (and more reliably) + (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) + + +;; +;;; Keybindings + +;; This section is dedicated to "fixing" certain keys so that they behave +;; sensibly (and consistently with similar contexts). + +;; Make SPC u SPC u [...] possible (#747) +(map! :map universal-argument-map + :prefix doom-leader-key "u" #'universal-argument-more + :prefix doom-leader-alt-key "u" #'universal-argument-more) + +(when (featurep! +bindings) + (load! "+evil-bindings")) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index bbc4660b5..4ae830bee 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -12,7 +12,7 @@ ;; -;; Reasonable defaults +;;; Reasonable defaults (after! epa (setq epa-file-encrypt-to @@ -27,110 +27,12 @@ epa-pinentry-mode 'loopback)) -(if (not (featurep 'evil)) - (delete-selection-mode +1) - (defun +default|disable-delete-selection-mode () (delete-selection-mode -1)) - (add-hook 'evil-insert-state-entry-hook #'delete-selection-mode) - (add-hook 'evil-insert-state-exit-hook #'+default|disable-delete-selection-mode)) - - -(when (featurep! +smartparens) - ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) - ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) - ;; or specific :post-handlers with: - ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) - (after! smartparens - ;; Autopair quotes more conservatively; if I'm next to a word/before another - ;; quote, I likely don't want to open a new pair. - (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)) - - ;; Expand {|} => { | } - ;; Expand {|} => { - ;; | - ;; } - (dolist (brace '("(" "{" "[")) - (sp-pair brace nil - :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) - ;; I likely don't want a new pair if adjacent to a word or opening brace - :unless '(sp-point-before-word-p sp-point-before-same-p))) - - ;; Major-mode specific fixes - (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler)) - - ;; Don't do square-bracket space-expansion where it doesn't make sense to - (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) - "[" nil :post-handlers '(:rem ("| " "SPC"))) - - ;; Reasonable default pairs for HTML-style comments - (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) - "" - :unless '(sp-point-before-word-p sp-point-before-same-p) - :actions '(insert) :post-handlers '(("| " "SPC"))) - - ;; Disable electric keys in C modes because it interferes with smartparens - ;; and custom bindings. We'll do it ourselves (mostly). - (after! cc-mode - (c-toggle-electric-state -1) - (c-toggle-auto-newline -1) - (setq c-electric-flag nil) - (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) - (define-key c-mode-base-map key nil))) - - ;; Expand C-style doc comment blocks. Must be done manually because some of - ;; these languages use specialized (and deferred) parsers, whose state we - ;; can't access while smartparens is doing its thing. - (defun +default-expand-doc-comment-block (&rest _ignored) - (let ((indent (current-indentation))) - (newline-and-indent) - (save-excursion - (newline) - (insert (make-string indent 32) " */") - (delete-char 2)))) - (sp-local-pair - '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode - csharp-mode java-mode php-mode css-mode scss-mode less-css-mode - stylus-mode) - "/*" "*/" - :actions '(insert) - :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) - - ;; Highjacks backspace to: - ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) - ;; b) delete space-indented `tab-width' steps at a time - ;; c) close empty multiline brace blocks in one step: - ;; { - ;; | - ;; } - ;; becomes {|} - ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work - ;; even after a backspace. - ;; e) properly delete smartparen pairs when they are encountered, without - ;; the need for strict mode. - ;; f) do none of this when inside a string - (advice-add #'delete-backward-char :override #'+default*delete-backward-char) - - ;; Makes `newline-and-indent' continue comments (and more reliably) - (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) - - ;; -;; Keybinding fixes +;;; Keybinding fixes ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). -;; Make SPC u SPC u [...] possible (#747) -(when (featurep 'evil) - (map! :map universal-argument-map - :prefix doom-leader-key "u" #'universal-argument-more - :prefix doom-leader-alt-key "u" #'universal-argument-more)) - (defun +default|init-input-decode-map () "Ensure TAB and [tab] are treated the same in TTY Emacs." (define-key input-decode-map [tab] (kbd "TAB")) @@ -138,13 +40,6 @@ (define-key input-decode-map [escape] (kbd "ESC"))) (add-hook 'tty-setup-hook #'+default|init-input-decode-map) -;; A Doom convention where C-s on popups and interactive searches will invoke -;; ivy/helm for their superior filtering. -(define-key! :keymaps +default-minibuffer-maps - "C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history)) - ;; Consistently use q to quit windows (after! tabulated-list (define-key tabulated-list-mode-map "q" #'quit-window)) @@ -192,7 +87,7 @@ ;; -;; Doom's keybinding scheme +;;; Keybind schemes ;; Custom help keys -- these aren't under `+bindings' because they ought to be ;; universal. @@ -239,6 +134,13 @@ "M-x" #'execute-extended-command "A-x" #'execute-extended-command) + ;; A Doom convention where C-s on popups and interactive searches will invoke + ;; ivy/helm for their superior filtering. + (define-key! :keymaps +default-minibuffer-maps + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history)) + ;; Smarter C-a/C-e for both Emacs and Evil. 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+trailing whitespace before jumping to eol. @@ -249,8 +151,12 @@ :gni [M-return] #'+default/newline-below :gni [M-S-return] #'+default/newline-above :gni [C-return] #'+default/newline-below - :gni [C-S-return] #'+default/newline-above) + :gni [C-S-return] #'+default/newline-above)) - (if (featurep 'evil) - (load! "+evil-bindings") - (load! "+emacs-bindings"))) + +;; +;;; Bootstrap configs + +(if (featurep 'evil) + (load! "+evil") + (load! "+emacs")) diff --git a/modules/config/default/packages.el b/modules/config/default/packages.el new file mode 100644 index 000000000..54cfa79b1 --- /dev/null +++ b/modules/config/default/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; config/default/packages.el + +(unless (featurep! :feature evil) + (package! winum) + (package! expand-region)) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 709904ec7..b12726dcb 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -58,15 +58,15 @@ ;; Remove unused segments & extra padding (doom-modeline-def-modeline 'main - '(bar matches buffer-info remote-host buffer-position selection-info) + '(bar window-number matches buffer-info remote-host buffer-position selection-info) '(misc-info persp-name irc mu4e github debug indent input-method buffer-encoding lsp major-mode process vcs checker)) (doom-modeline-def-modeline 'special - '(bar matches buffer-info-simple buffer-position selection-info) + '(bar window-number matches buffer-info-simple buffer-position selection-info) '(misc-info persp-name debug input-method irc-buffers buffer-encoding lsp major-mode process checker)) (doom-modeline-def-modeline 'project - '(bar buffer-default-directory) + '(bar window-number buffer-default-directory) '(misc-info mu4e github debug fancy-battery " " major-mode)) ;; Some functions modify the buffer, causing the modeline to show a false From bb9cbfecc91e6aaa280f58d987fd6991b436e873 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 03:53:38 -0500 Subject: [PATCH 3950/4235] Improve interactive bin/doom commands #1220 Now prints to a buffer rather than in echo-area. Still experimental however. --- core/autoload/cli.el | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/core/autoload/cli.el b/core/autoload/cli.el index 5f2c371f5..1bbe44f1c 100644 --- a/core/autoload/cli.el +++ b/core/autoload/cli.el @@ -3,17 +3,40 @@ (require 'core-cli) (defun doom--run (command &optional yes) - (let ((default-directory doom-emacs-dir) - (doom-auto-accept yes)) - (let ((compilation-buffer-name-function (lambda (_) "*bin/doom*"))) - (compile (format "bin/doom %s" command) t)) - (while compilation-in-progress - (sit-for 1)) - (when (y-or-n-p "Reload Doom config?") - (doom/reload)) - (message "Done"))) + (let* ((default-directory doom-emacs-dir) + (doom-auto-accept yes) + (buf (get-buffer-create " *bin/doom*")) + (wconf (current-window-configuration)) + (noninteractive t) + (ignore-window-parameters t) + (standard-output + (lambda (char) + (with-current-buffer buf + (insert char) + (when (memq char '(?\n ?\r)) + (ansi-color-apply-on-region (line-beginning-position -1) (line-end-position)) + (redisplay)))))) + (delete-other-windows) + (switch-to-buffer buf) + (redisplay) + (cl-letf (((symbol-function 'message) + (lambda (message &rest args) + (princ (apply #'format message args)) + (terpri)))) + (doom-dispatch command nil)) + (print! (green "Done!")) + (redisplay) + (when (y-or-n-p "Return to your work?") + (set-window-configuration wconf) + (kill-buffer buf)))) +;;;###autoload +(defun doom//autoloads (&optional yes) + "TODO" + (interactive "P") + (doom--run "autoloads" yes)) + ;;;###autoload (defun doom//update (&optional yes) "TODO" From ca9a2c8c1758d7d316622753d5fa593cd22ab870 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 04:28:25 -0500 Subject: [PATCH 3951/4235] Refactor interactiove bin/doom commands #1220 --- core/autoload/cli.el | 26 ++++++++++++-------------- core/autoload/message.el | 7 ++----- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/core/autoload/cli.el b/core/autoload/cli.el index 1bbe44f1c..166f68747 100644 --- a/core/autoload/cli.el +++ b/core/autoload/cli.el @@ -7,8 +7,8 @@ (doom-auto-accept yes) (buf (get-buffer-create " *bin/doom*")) (wconf (current-window-configuration)) - (noninteractive t) (ignore-window-parameters t) + (noninteractive t) (standard-output (lambda (char) (with-current-buffer buf @@ -16,19 +16,17 @@ (when (memq char '(?\n ?\r)) (ansi-color-apply-on-region (line-beginning-position -1) (line-end-position)) (redisplay)))))) - (delete-other-windows) - (switch-to-buffer buf) - (redisplay) - (cl-letf (((symbol-function 'message) - (lambda (message &rest args) - (princ (apply #'format message args)) - (terpri)))) - (doom-dispatch command nil)) - (print! (green "Done!")) - (redisplay) - (when (y-or-n-p "Return to your work?") - (set-window-configuration wconf) - (kill-buffer buf)))) + (doom-initialize t) + (setq doom-modules (doom-modules)) + (doom-initialize-modules t) + (doom-initialize-packages t) + (with-current-buffer (switch-to-buffer buf) + (erase-buffer) + (require 'package) + (redisplay) + (doom-dispatch command nil) + (print! (green "\nDone!")))) + (message (format! (green "Done!")))) ;;;###autoload diff --git a/core/autoload/message.el b/core/autoload/message.el index fb3014bf1..340e98954 100644 --- a/core/autoload/message.el +++ b/core/autoload/message.el @@ -87,8 +87,5 @@ Can be colored using (color ...) blocks: (print! (green \"Great %s!\") \"success\") Uses faces in interactive sessions and ANSI codes otherwise." - `(if (not noninteractive) - (message (format! ,message ,@args)) - ;; princ prints to stdout, message to stderr - (princ (format! ,message ,@args)) - (terpri))) + `(progn (princ (format! ,message ,@args)) + (terpri))) From cec93933d09122edc24418a12778e9cb100cf13f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 04:38:22 -0500 Subject: [PATCH 3952/4235] Revert ee6e4a8b Fix was merged upstream: Yevgnen/ivy-rich#51 --- modules/completion/ivy/config.el | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e3389b867..e07c7db23 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -93,17 +93,7 @@ immediately runs it on the current candidate (ending the ivy session)." (colplist (plist-get plist :columns)) (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) (when switch-buffer-alist - (setcar switch-buffer-alist '+ivy-rich-buffer-name))) - - (defun +ivy*rich-counsel-function-docstring (candidate) - (let ((doc (replace-regexp-in-string - ":\\(\\(before\\|after\\)\\(-\\(whilte\\|until\\)\\)?\\|around\\|override\\|\\(filter-\\(args\\|return\\)\\)\\) advice:[ ]*‘.+?’[\r\n]+" - "" - (or (ignore-errors (documentation (intern-soft candidate))) "")))) - (if (string-match "^\\(.+\\)\\([\r\n]\\)?" doc) - (setq doc (match-string 1 doc)) - ""))) - (advice-add #'ivy-rich-counsel-function-docstring :override #'+ivy*rich-counsel-function-docstring)) + (setcar switch-buffer-alist '+ivy-rich-buffer-name)))) (def-package! counsel From 681d0f1a2a2e70b45b192bbbec1e4ab78e88a378 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 04:51:31 -0500 Subject: [PATCH 3953/4235] Improve vanilla sandbox Can now launch four different sessions: 1. Vanilla Emacs 2. Vanilla Doom (only Doom core) 3. Doom core + modules - private config 4. A full Doom session (load everything) --- core/autoload/debug.el | 89 +++++++++++++++++++++++++--------- core/templates/VANILLA_SANDBOX | 14 ++++-- 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 03e763be1..d2e0e03a0 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -139,25 +139,38 @@ pasting into a bug report or discord." (defvar doom--sandbox-init-doom-p nil) -(defun doom--run-vanilla-sandbox (&optional load-doom-p) +(defun doom--run-vanilla-sandbox (&optional mode) (interactive) (let ((contents (buffer-string)) (file (make-temp-file "doom-sandbox-"))) + (require 'package) (with-temp-file file (insert (prin1-to-string - `(cond (,load-doom-p - (setq doom-private-dir "/tmp/does/not/exist" - doom-modules ,doom-modules) - (load ,user-init-file)) - ((setq package--init-file-ensured t - package-user-dir ,package-user-dir - package-archives ',package-archives - user-emacs-directory ,doom-emacs-dir) - (package-initialize)))) + (macroexp-progn + (append `((setq debug-on-error t + package--init-file-ensured t + package-user-dir ,package-user-dir + package-archives ',package-archives + user-emacs-directory ,doom-emacs-dir + doom-modules ,doom-modules)) + (pcase mode + (`vanilla-doom+ ; Doom core + modules - private config + `((setq doom-private-dir "/tmp/does/not/exist") + (load-file ,user-init-file) + (doom|run-all-startup-hooks))) + (`vanilla-doom ; only Doom core + `((setq doom-private-dir "/tmp/does/not/exist" + doom-init-modules-p t) + (load-file ,user-init-file) + (doom|run-all-startup-hooks))) + (`vanilla ; nothing loaded + `((package-initialize))))))) "\n(unwind-protect (progn\n" contents "\n)\n" (format "(delete-file %S))" file))) - (let ((args (list "-Q" "-l" file))) + (let ((args (if (eq mode 'doom) + (list "-l" file) + (list "-Q" "-l" file)))) (require 'restart-emacs) (condition-case e (cond ((display-graphic-p) @@ -174,30 +187,58 @@ pasting into a bug report or discord." (delete-file file) (signal (car e) (cdr e))))))) -(defun doom--run-vanilla-doom-sandbox () - (interactive) - (doom--run-vanilla-sandbox t)) +(fset 'doom--run-vanilla-emacs (lambda! (doom--run-vanilla-sandbox 'vanilla))) +(fset 'doom--run-vanilla-doom (lambda! (doom--run-vanilla-sandbox 'vanilla-doom))) +(fset 'doom--run-vanilla-doom+ (lambda! (doom--run-vanilla-sandbox 'vanilla-doom+))) +(fset 'doom--run-full-doom (lambda! (doom--run-vanilla-sandbox 'doom))) + +(defvar doom-sandbox-emacs-lisp-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-c C-c") #'doom--run-vanilla-emacs) + (define-key map (kbd "C-c C-d") #'doom--run-vanilla-doom) + (define-key map (kbd "C-c C-p") #'doom--run-vanilla-doom+) + (define-key map (kbd "C-c C-f") #'doom--run-full-doom) + (define-key map (kbd "C-c C-k") #'kill-this-buffer) + map)) + +(define-derived-mode doom-sandbox-emacs-lisp-mode emacs-lisp-mode "Sandbox Elisp" + "TODO") ;;;###autoload (defun doom/open-vanilla-sandbox () - "Open an Emacs Lisp buffer destinated to run in a blank Emacs session (and -optionally load only Doom and its modules, without your private config). + "Open the Emacs Lisp sandbox. -This provides a testbed for debugging code without Doom (or your private config) -standing in the way, and without sacrificing access to installed packages." +This is a test bed for running Emacs Lisp in an instance of Emacs with varying +amounts of Doom loaded, including: + + a) vanilla Emacs (nothing loaded), + b) vanilla Doom (only Doom core) and + c) Doom + modules - your private config. + +This is done without sacrificing access to installed packages. Use the sandbox +to reproduce bugs and determine if Doom is to blame." (interactive) (let* ((buffer-name "*doom:vanilla-sandbox*") (exists (get-buffer buffer-name)) (buf (get-buffer-create buffer-name))) (with-current-buffer buf - (emacs-lisp-mode) - (local-set-key (kbd "C-c C-c") #'doom--run-vanilla-sandbox) - (local-set-key (kbd "C-c C-d") #'doom--run-vanilla-doom-sandbox) - (local-set-key (kbd "C-c C-k") #'kill-this-buffer) - (setq header-line-format "C-c C-c to run the session / C-c C-d to run it with vanilla Doom loaded / C-c C-k to abort it") + (doom-sandbox-emacs-lisp-mode) + (setq header-line-format + (concat "C-c C-c = vanilla Emacs" + " / " + "C-c C-d = Doom core" + " / " + "C-c C-p = Doom core + modules - private config" + " / " + "C-c C-f = Full Doom" + " / " + "C-c C-k to abort")) (setq-local default-directory doom-emacs-dir) (unless (buffer-live-p exists) - (doom-template-insert "VANILLA_SANDBOX")) + (doom-template-insert "VANILLA_SANDBOX") + (let ((contents (substitute-command-keys (buffer-string)))) + (erase-buffer) + (insert contents "\n"))) (goto-char (point-max))) (pop-to-buffer buf))) diff --git a/core/templates/VANILLA_SANDBOX b/core/templates/VANILLA_SANDBOX index 520d8c49c..f9fe77dcc 100644 --- a/core/templates/VANILLA_SANDBOX +++ b/core/templates/VANILLA_SANDBOX @@ -1,6 +1,12 @@ ;; Welcome to the vanilla sandbox! ;; -;; This is a test bed for running Emacs Lisp in either a vanilla Emacs session -;; free of Doom's clutches (C-c C-c), or in a vanilla Doom session free of your -;; private config (C-c C-d). - +;; This is a test bed for running Emacs Lisp in an instance of Emacs with varying +;; amounts of Doom loaded: +;; +;; a) vanilla Emacs (nothing loaded) \\[doom--run-vanilla-emacs] +;; b) vanilla Doom (only Doom core) \\[doom--run-vanilla-doom] +;; c) Doom + modules - your private config \\[doom--run-vanilla-doom+] +;; d) Doom (normal) \\[doom--run-full-doom] +;; +;; This is done without sacrificing access to installed packages. Use the sandbox +;; to reproduce bugs and determine if Doom is to blame. From 17714c2c6364ac78c9421d0de930cd1674c545fa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 14:14:40 -0500 Subject: [PATCH 3954/4235] Refactor Doom use-package extensions --- core/core-modules.el | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 85844bc14..f5503421d 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -241,13 +241,15 @@ non-nil, return paths of possible modules, activated or otherwise." ;; ...) (defvar doom--deferred-packages-alist '(t)) (after! use-package-core - (add-to-list 'use-package-deferring-keywords :defer-incrementally nil #'eq) - (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) + ;; :ensure and :pin don't work well with Doom, so we forcibly remove them. + (dolist (keyword '(:ensure :pin)) + (setq use-package-keywords (delq keyword use-package-keywords))) - (setq use-package-keywords - (use-package-list-insert :defer-incrementally use-package-keywords :after)) - (setq use-package-keywords - (use-package-list-insert :after-call use-package-keywords :after)) + ;; Insert new deferring keywords + (dolist (keyword '(:defer-incrementally :after-call)) + (add-to-list 'use-package-deferring-keywords keyword nil #'eq) + (setq use-package-keywords + (use-package-list-insert keyword use-package-keywords :after))) (defalias 'use-package-normalize/:defer-incrementally 'use-package-normalize-symlist) (defun use-package-handler/:defer-incrementally (name _keyword targets rest state) @@ -274,8 +276,9 @@ non-nil, return paths of possible modules, activated or otherwise." (if (functionp hook) (advice-remove hook #',fn) (remove-hook hook #',fn))) - (delq (assq ',name doom--deferred-packages-alist) - doom--deferred-packages-alist) + (setq doom--deferred-packages-alist + (delq (assq ',name doom--deferred-packages-alist) + doom--deferred-packages-alist)) (fmakunbound ',fn)))) (let (forms) (dolist (hook hooks forms) From b0bc1d925f878dc756dbc5bc1e75efdc12717af5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 15:06:45 -0500 Subject: [PATCH 3955/4235] Minor refactors; revise docstrings+comments --- core/core-keybinds.el | 41 ++++++++++++----- core/core-modules.el | 58 +++++++++++++----------- modules/config/default/+evil-bindings.el | 3 +- 3 files changed, 63 insertions(+), 39 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 8bb6d458b..3c71cfb27 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -2,7 +2,8 @@ ;; A centralized keybinds system, integrated with `which-key' to preview ;; available keybindings. All built into one powerful macro: `map!'. If evil is -;; never loaded, then evil bindings set with `map!' will be ignored. +;; never loaded, then evil bindings set with `map!' are ignored (i.e. omitted +;; entirely for performance reasons). (defvar doom-leader-key "SPC" "The leader prefix key for Evil users. @@ -33,6 +34,22 @@ This needs to be changed from $DOOMDIR/init.el.") ;; +;;; Universal, non-nuclear escape + +;; `keyboard-quit' is too much of a nuclear option. I wanted an ESC/C-g to +;; do-what-I-mean. It serves four purposes (in order): +;; +;; 1. Quit active states; e.g. highlights, searches, snippets, iedit, +;; multiple-cursors, recording macros, etc. +;; 2. Close popup windows remotely (if it is allowed to) +;; 3. Refresh buffer indicators, like git-gutter and flycheck +;; 4. Or fall back to `keyboard-quit' +;; +;; And it should do these things incrementally, rather than all at once. And it +;; shouldn't interfere with recording macros or the minibuffer. This may require +;; you press ESC/C-g two or three times on some occasions to reach +;; `keyboard-quit', but this is much more intuitive. + (defvar doom-escape-hook nil "A hook run after C-g is pressed (or ESC in normal mode, for evil users). Both trigger `doom/escape'. @@ -88,12 +105,12 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; We use a prefix commands instead of general's :prefix/:non-normal-prefix ;; properties because general is incredibly slow binding keys en mass with them -;; in conjunction with :states. This effectively doubled Doom's startup time. +;; in conjunction with :states -- an effective doubling of Doom's startup time! (define-prefix-command 'doom/leader 'doom-leader-map) (define-key doom-leader-map [override-state] 'all) ;; Bind `doom-leader-key' and `doom-leader-alt-key' as late as possible to give -;; the user more changes to modify them. +;; the user a chance to modify them. (defun doom|init-leader-keys () "Bind `doom-leader-key' and `doom-leader-alt-key'." (let ((map general-override-mode-map)) @@ -111,15 +128,15 @@ If any hook returns non-nil, all hooks after it are ignored.") "\\)"))) (add-hook 'doom-after-init-modules-hook #'doom|init-leader-keys) -;; ...However, this approach (along with :wk-full-keys in `define-leader-key!') -;; means that which-key is only informed of the key sequence *after* -;; `doom-leader-key'/`doom-leader-alt-key'. e.g. binding to `SPC f s' will -;; create a which-key label for any key that ends in 'f s'. +;; However, the prefix command approach (along with :wk-full-keys in +;; `define-leader-key!') means that which-key is only informed of the key +;; sequence minus `doom-leader-key'/`doom-leader-alt-key'. e.g. binding to `SPC +;; f s' creates a wildcard label for any key that ends in 'f s'. ;; -;; TO get around that, we forcibly inject `doom-leader-key' and -;; `doom-leader-alt-key' into the which-key key replacement regexp for keybinds -;; created on `doom-leader-map'. This is a dirty hack, but I'd rather this than -;; general being responsible for 50% of Doom's startup time. +;; So we forcibly inject `doom-leader-key' and `doom-leader-alt-key' into the +;; which-key key replacement regexp for keybinds created on `doom-leader-map'. +;; This is a dirty hack, but I'd rather this than general being responsible for +;; 50% of Doom's startup time. (defun doom*general-extended-def-:which-key (_state keymap key edef kargs) (with-eval-after-load 'which-key (let* ((wk (general--getf2 edef :which-key :wk)) @@ -194,6 +211,8 @@ If any hook returns non-nil, all hooks after it are ignored.") ;; +;;; `map!' macro + (defvar doom-evil-state-alist '((?n . normal) (?v . visual) diff --git a/core/core-modules.el b/core/core-modules.el index f5503421d..0542a0225 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -211,34 +211,13 @@ non-nil, return paths of possible modules, activated or otherwise." use-package-minimum-reported-time (if doom-debug-mode 0 0.1) use-package-expand-minimally (not noninteractive)) -;; Adds two new keywords to `use-package' (and consequently, `def-package!'), -;; they are: +;; Adds two new keywords to `use-package' (and consequently, `def-package!') to +;; expand its lazy-loading capabilities. They are: ;; ;; :after-call SYMBOL|LIST -;; Takes a symbol or list of symbols representing functions or hook variables. -;; The first time any of these functions or hooks are executed, the package is -;; loaded. e.g. -;; -;; (def-package! projectile -;; :after-call (pre-command-hook after-find-file dired-before-readin-hook) -;; ...) -;; ;; :defer-incrementally SYMBOL|LIST|t -;; Takes a symbol or list of symbols representing packages that will be loaded -;; incrementally at startup before this one. This is helpful for large -;; packages like magit or org, which load a lot of dependencies on first load. -;; This lets you load them piece-meal, one at a time, during idle periods, so -;; that when you finally do need the package, it'll loads much quicker. e.g. ;; -;; (def-package! magit -;; ;; You do not need to include magit in this list! -;; :defer-incrementally (dash f s with-editor git-commit package) -;; ...) -;; -;; (def-package! x -;; ;; This is equivalent to :defer-incrementally (x) -;; :defer-incrementally t -;; ...) +;; Check out `def-package!'s documentation for more about these two. (defvar doom--deferred-packages-alist '(t)) (after! use-package-core ;; :ensure and :pin don't work well with Doom, so we forcibly remove them. @@ -356,8 +335,35 @@ to least)." (defvar doom-disabled-packages) (defmacro def-package! (name &rest plist) - "This is a thin wrapper around `use-package'. It is ignored if the NAME -package is disabled." + "This is a thin wrapper around `use-package'. + +It is ignored if the NAME package is disabled. + +Supports two special properties over `use-package': + +:after-call SYMBOL|LIST + Takes a symbol or list of symbols representing functions or hook variables. + The first time any of these functions or hooks are executed, the package is + loaded. e.g. + + (def-package! projectile + :after-call (pre-command-hook after-find-file dired-before-readin-hook) + ...) + +:defer-incrementally SYMBOL|LIST|t + Takes a symbol or list of symbols representing packages that will be loaded + incrementally at startup before this one. This is helpful for large packages + like magit or org, which load a lot of dependencies on first load. This lets + you load them piece-meal during idle periods, so that when you finally do need + the package, it'll load quicker. e.g. + + NAME is implicitly added if this property is present and non-nil. No need to + specify it. A value of `t' implies NAME, e.g. + + (def-package! x + ;; This is equivalent to :defer-incrementally (x) + :defer-incrementally t + ...)" (unless (or (memq name doom-disabled-packages) ;; At compile-time, use-package will forcibly load its package to ;; prevent compile-time errors. However, Doom users can diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ae0f578a0..d4f6267b7 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -495,11 +495,10 @@ :desc "Toggle last popup" "~" #'+popup/toggle :desc "Find file" "." #'find-file + :desc "Switch buffer" "," #'switch-to-buffer (:when (featurep! :feature workspaces) :desc "Switch workspace buffer" "," #'persp-switch-to-buffer :desc "Switch buffer" "<" #'switch-to-buffer) - (:unless (featurep! :feature workspaces) - :desc "Switch buffer" "," #'switch-to-buffer) :desc "Resume last search" "'" (cond ((featurep! :completion ivy) #'ivy-resume) From f02e7faefb94c22d2fe28b38719e53de8f6f36c6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 9 Mar 2019 16:54:54 -0500 Subject: [PATCH 3956/4235] emacs/dired: ranger-show-literal = nil --- modules/emacs/dired/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 55be920e9..052bfcf66 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -92,6 +92,7 @@ ranger-excluded-extensions '("mkv" "iso" "mp4") ranger-deer-show-details nil ranger-max-preview-size 10 + ranger-show-literal nil dired-omit-verbose nil)) From c3a9828fa31dd95ea8286457a6c835ff65548c27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Mar 2019 08:10:59 -0400 Subject: [PATCH 3957/4235] Allow doom-package-list to scrape *all* packages Even ones that are conditional. This does mean its plist is unevaluated, however. --- core/autoload/packages.el | 96 ++++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index df05868f2..f03a54073 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -205,54 +205,66 @@ files." (not (doom-package-installed-p pkg)))) collect (cons pkg (cdr (assq pkg doom-packages)))))) +(defun doom--read-module-packages-file (file &optional raw noerror) + (with-temp-buffer ; prevent buffer-local settings from propagating + (condition-case e + (if (not raw) + (load file noerror t t) + (when (file-readable-p file) + (insert-file-contents file) + (while (re-search-forward "(package! " nil t) + (save-excursion + (goto-char (match-beginning 0)) + (cl-destructuring-bind (name . plist) (cdr (sexp-at-point)) + (push (cons name + (plist-put plist :modules + (cond ((file-in-directory-p file doom-private-dir) + (list :private)) + ((file-in-directory-p file doom-core-dir) + (list :core)) + ((doom-module-from-path file))))) + doom-packages)))))) + ((debug error) + (signal 'doom-package-error + (list (or (doom-module-from-path file) + '(:private . packages)) + e)))))) + ;;;###autoload (defun doom-package-list (&optional all-p) "Retrieve a list of explicitly declared packages from enabled modules. This excludes core packages listed in `doom-core-packages'. -If ALL-P, gather packages across all modules, including disabled ones." - (with-temp-buffer ; prevent buffer-local settings from propagating - (let ((noninteractive t) - (doom--stage 'packages) - (doom-modules (doom-modules)) - doom-packages - doom-disabled-packages - package-pinned-packages) - (cl-letf ((load-fn - (lambda (file &optional noerror) - (condition-case e - (if all-p - (setq doom-packages - (append (let (doom-packages) - (load file noerror t t) - doom-packages) - doom-packages)) - (load file noerror t t)) - ((debug error) - (signal 'doom-package-error - (list (or (doom-module-from-path file) - '(:private . packages)) - e))))))) - (funcall load-fn (expand-file-name "packages.el" doom-core-dir)) - (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) - ;; We load the private packages file twice to ensure disabled packages - ;; are seen ASAP, and a second time to ensure privately overridden - ;; packages are properly overwritten. - (funcall load-fn private-packages t) - (if all-p - (mapc load-fn (doom-files-in doom-modules-dir - :depth 2 - :full t - :match "/packages\\.el$")) - (cl-loop for key being the hash-keys of doom-modules - for path = (doom-module-path (car key) (cdr key) "packages.el") - for doom--current-module = key - do (funcall load-fn path t))) - (funcall load-fn private-packages t)) - (append (cl-loop for package in doom-core-packages - collect (list package :modules '((:core internal)))) - (nreverse doom-packages)))))) +If ALL-P, gather packages unconditionally across all modules, including disabled +ones." + (let ((noninteractive t) + (doom--stage 'packages) + (doom-modules (doom-modules)) + doom-packages + doom-disabled-packages + package-pinned-packages) + (doom--read-module-packages-file (expand-file-name "packages.el" doom-core-dir) all-p) + (let ((private-packages (expand-file-name "packages.el" doom-private-dir))) + (unless all-p + ;; We load the private packages file twice to ensure disabled packages + ;; are seen ASAP, and a second time to ensure privately overridden + ;; packages are properly overwritten. + (doom--read-module-packages-file private-packages nil t)) + (if all-p + (mapc #'doom--read-module-packages-file + (doom-files-in doom-modules-dir + :depth 2 + :full t + :match "/packages\\.el$")) + (cl-loop for key being the hash-keys of doom-modules + for path = (doom-module-path (car key) (cdr key) "packages.el") + for doom--current-module = key + do (doom--read-module-packages-file path nil t))) + (doom--read-module-packages-file private-packages all-p t)) + (append (cl-loop for package in doom-core-packages + collect (list package :modules '((:core internal)))) + (nreverse doom-packages)))) ;;;###autoload (defun doom-get-package-alist () From df26502f0104d627946800340bbb64f4fa3afe05 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Mar 2019 08:12:04 -0400 Subject: [PATCH 3958/4235] Avoid general in core Future proofing against changes in load order. --- core/core-projects.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 9af5b90a1..6e293efc8 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -18,9 +18,8 @@ (add-hook 'find-file-hook #'doom|init-project-mode) (projectile-mode +1) - (define-key! - [remap evil-jump-to-tag] #'projectile-find-tag - [remap find-tag] #'projectile-find-tag) + (global-set-key [remap evil-jump-to-tag] #'projectile-find-tag) + (global-set-key [remap find-tag] #'projectile-find-tag) ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) From a258995db94470c027e49c073c090faae25f72f2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Mar 2019 08:15:46 -0400 Subject: [PATCH 3959/4235] Set arglist to add-hook!/remove-hook! macros More sensible eldoc support. --- core/core-lib.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 9fc5ee0aa..7f71cad74 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -294,7 +294,9 @@ Examples: (add-hook! :append :local (one-mode second-mode) (setq v 5) (setq a 2)) Body forms can access the hook's arguments through the let-bound variable -`args'." +`args'. + +\(fn [:append :local] HOOKS FUNCTIONS)" (declare (indent defun) (debug t)) (let ((hook-fn 'add-hook) append-p local-p) @@ -325,7 +327,9 @@ Body forms can access the hook's arguments through the let-bound variable (defmacro remove-hook! (&rest args) "Convenience macro for `remove-hook'. Takes the same arguments as -`add-hook!'." +`add-hook!'. + +\(fn [:append :local] HOOKS FUNCTIONS)" (declare (indent defun) (debug t)) `(add-hook! :remove ,@args)) From f065ddfdaaa6a1e87a4cc775c2d84f053610e268 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Sun, 10 Mar 2019 22:56:53 +1000 Subject: [PATCH 3960/4235] Fix doom/toggle-debug-mode Previously this would error due to undefined `doom-debug-on-error` variable. Now behaves like a minor-mode function to toggle both `doom-debug-mode` and `debug-on-error`. --- core/autoload/debug.el | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index d2e0e03a0..06c8164e8 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -363,7 +363,12 @@ If INIT-FILE is non-nil, profile that instead of USER-INIT-FILE." (advice-add #'esup :override #'doom/profile-emacs) ;;;###autoload -(defun doom/toggle-debug-mode () - "Enable `debug-on-error' and `doom-debug-mode' for verbose logging." - (interactive) - (setq doom-debug-mode doom-debug-on-error)) +(defun doom/toggle-debug-mode (&optional arg) + "Toggle `debug-on-error' and `doom-debug-mode' for verbose logging." + (interactive (list (or current-prefix-arg 'toggle))) + (let ((value + (cond ((eq arg 'toggle) (not doom-debug-mode)) + ((> (prefix-numeric-value arg) 0))))) + (setq doom-debug-mode value + debug-on-error value) + (message "Debug mode %s" (if value "on" "off")))) From ea14407c16acb9a929b5dd4103a17da27ed4568b Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Sun, 10 Mar 2019 23:01:52 +1000 Subject: [PATCH 3961/4235] Fix ace-link-help binding in helpful-mode --- modules/config/default/+emacs-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index e77c7eb68..71e901edb 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -317,7 +317,7 @@ "o" #'ace-link-help ">" #'help-go-forward "<" #'help-go-back) - (:after helpful-mode + (:after helpful :map helpful-mode-map "o" #'ace-link-help) (:after info From 0a30b4ee4ba8b79b4eae60e6d1f135a7a763f18e Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Mon, 11 Mar 2019 00:16:57 +1000 Subject: [PATCH 3962/4235] Add elisp-demos to lang/emacs-lisp module This is an extremely useful package which adds little examples to the help docs for a massive number of elisp functions. https://github.com/xuchunyang/elisp-demos --- modules/lang/emacs-lisp/config.el | 6 ++++++ modules/lang/emacs-lisp/packages.el | 1 + 2 files changed, 7 insertions(+) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index c741fa931..7d383fc97 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -121,6 +121,12 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") (add-hook 'flycheck-mode-hook #'flycheck-cask-setup nil t))) +(def-package! elisp-demos + :commands elisp-demos-advice-helpful-update + :init + (advice-add 'helpful-update :after #'elisp-demos-advice-helpful-update)) + + ;; ;; Project modes diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index 8bbf4dd3b..4509683e1 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -6,6 +6,7 @@ (package! macrostep) (package! overseer) (package! elisp-def) +(package! elisp-demos) (when (featurep! :tools flycheck) (package! flycheck-cask)) From 8392c9dcf6bfd0686bac275216e06bfddd60472d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 12:39:38 -0400 Subject: [PATCH 3963/4235] Add new :ui indent-guides module Replaces old highlight-indentation-mode with new highlight-indent-guides plugin. --- core/packages.el | 1 - init.example.el | 1 + modules/config/default/+evil-bindings.el | 3 +-- modules/ui/indent-guides/config.el | 13 +++++++++++++ modules/ui/indent-guides/packages.el | 4 ++++ 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 modules/ui/indent-guides/config.el create mode 100644 modules/ui/indent-guides/packages.el diff --git a/core/packages.el b/core/packages.el index d2f34a5ee..e13d240d2 100644 --- a/core/packages.el +++ b/core/packages.el @@ -11,7 +11,6 @@ ;; core-ui.el (package! all-the-icons) (package! hide-mode-line) -(package! highlight-indentation) (package! highlight-numbers) (package! highlight-escape-sequences :recipe (:fetcher github :repo "hlissner/highlight-escape-sequences")) diff --git a/init.example.el b/init.example.el index 79782f582..b20b54386 100644 --- a/init.example.el +++ b/init.example.el @@ -25,6 +25,7 @@ evil-goggles ; display visual hints when editing in evil ;;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags + indent-guides ; highlighted indent columns modeline ; snazzy, Atom-inspired modeline, plus API nav-flash ; blink the current line after jumping ;;neotree ; a project drawer, like NERDTree for vim diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index d4f6267b7..03512a7ad 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -739,8 +739,7 @@ :desc "Flycheck" "f" #'flycheck-mode :desc "Line numbers" "l" #'doom/toggle-line-numbers :desc "Frame fullscreen" "F" #'toggle-frame-fullscreen - :desc "Indent guides" "i" #'highlight-indentation-mode - :desc "Indent guides (column)" "I" #'highlight-indentation-current-column-mode + :desc "Indent guides" "i" #'highlight-indent-guides-mode :desc "Impatient mode" "h" #'+impatient-mode/toggle :desc "Big mode" "b" #'doom-big-font-mode :desc "Evil goggles" "g" #'evil-goggles-mode diff --git a/modules/ui/indent-guides/config.el b/modules/ui/indent-guides/config.el new file mode 100644 index 000000000..bb7d4c776 --- /dev/null +++ b/modules/ui/indent-guides/config.el @@ -0,0 +1,13 @@ +;;; ui/indent-guides/config.el -*- lexical-binding: t; -*- + +(def-package! highlight-indent-guides + :hook ((prog-mode text-mode conf-mode) . highlight-indent-guides-mode) + :config + (setq highlight-indent-guides-method 'character + highlight-indent-guides-responsive 'top) + + ;; Don't display first level of indentation + (defun +indent-guides-for-all-but-first-column (level responsive display) + (unless (< level 1) + (highlight-indent-guides--highlighter-default level responsive display))) + (setq highlight-indent-guides-highlighter-function #'+indent-guides-for-all-but-first-column)) diff --git a/modules/ui/indent-guides/packages.el b/modules/ui/indent-guides/packages.el new file mode 100644 index 000000000..210c00e9d --- /dev/null +++ b/modules/ui/indent-guides/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/indent-guides/packages.el + +(package! highlight-indent-guides) From f0013083c03961182fa924262a16ca6ff4887f45 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 12:54:16 -0400 Subject: [PATCH 3964/4235] Restore minimal modeline in magit With process indicator --- modules/tools/magit/config.el | 4 ---- modules/ui/modeline/config.el | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 9bff04917..6ae496461 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -34,10 +34,6 @@ It is passed a user and repository name.") (not (eq major-mode 'magit-process-mode))))) (add-to-list 'doom-real-buffer-functions #'+magit-buffer-p nil #'eq) - ;; modeline isn't helpful in magit - (add-hook! '(magit-mode-hook magit-popup-mode-hook) - #'hide-mode-line-mode) - ;; properly kill leftover magit buffers on quit (define-key magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index b12726dcb..f45dffc9a 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -26,6 +26,7 @@ (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) + (add-hook 'magit-mode-hook #'doom-modeline-set-project-modeline) ;; Show indentation style in modeline. I'm not using ;; `doom-modeline-def-segment' to prevent eager macro expansion from loading @@ -67,7 +68,7 @@ (doom-modeline-def-modeline 'project '(bar window-number buffer-default-directory) - '(misc-info mu4e github debug fancy-battery " " major-mode)) + '(misc-info mu4e github debug fancy-battery " " major-mode process)) ;; Some functions modify the buffer, causing the modeline to show a false ;; modified state, so we try to force them to behave. From 16f7bad26691ec73848b4814d7c4bb5218833bf0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 12:58:53 -0400 Subject: [PATCH 3965/4235] Hide magit modeline more selectively --- modules/ui/modeline/config.el | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index f45dffc9a..26b94c4c3 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -26,7 +26,13 @@ (add-hook 'doom-load-theme-hook #'doom-modeline-refresh-bars) (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) - (add-hook 'magit-mode-hook #'doom-modeline-set-project-modeline) + + ;; Magit -- modeline only where it's useful + (defun +modeline|hide-in-non-status-buffer () + (if (eq major-mode 'magit-status-mode) + (doom-modeline-set-project-modeline) + (hide-mode-line-mode))) + (add-hook 'magit-mode-hook #'+modeline|hide-in-non-status-buffer) ;; Show indentation style in modeline. I'm not using ;; `doom-modeline-def-segment' to prevent eager macro expansion from loading From dadcd29f279d161e566469d2be9f8ca691d5d747 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 13:06:46 -0400 Subject: [PATCH 3966/4235] Refactor leader key initialization Ensures general-override-mode is enabled and labels are correctly registered to all (visible) leader keys. Relevant to #1240 --- core/core-keybinds.el | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 3c71cfb27..0664af462 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -117,15 +117,17 @@ If any hook returns non-nil, all hooks after it are ignored.") (if (not (featurep 'evil)) (define-key map (kbd doom-leader-alt-key) 'doom/leader) (evil-define-key* '(normal visual motion) map (kbd doom-leader-key) 'doom/leader) - (evil-define-key* '(emacs insert) map (kbd doom-leader-alt-key) 'doom/leader))) - (setq doom--which-key-leader-regexp - (concat "\\(?:" - (let ((where (where-is-internal 'doom/leader - (list (current-global-map))))) - (cond (where (mapconcat #'key-description where "\\|")) - ((stringp doom-leader-alt-key) (regexp-quote doom-leader-alt-key)) - ((regexp-quote (key-description doom-leader-alt-key))))) - "\\)"))) + (evil-define-key* '(emacs insert) map (kbd doom-leader-alt-key) 'doom/leader)) + (general-override-mode +1)) + (unless (stringp doom-which-key-leader-prefix-regexp) + (setq doom-which-key-leader-prefix-regexp + (concat "\\(?:" + (cl-loop for key in (append (list doom-leader-key doom-leader-alt-key) + (where-is-internal 'doom/leader)) + if (stringp key) collect key into keys + else collect (key-description key) into keys + finally return (string-join keys "\\|")) + "\\)")))) (add-hook 'doom-after-init-modules-hook #'doom|init-leader-keys) ;; However, the prefix command approach (along with :wk-full-keys in From f332ba61116c087dd1704e3f2caf97f629756165 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 13:10:42 -0400 Subject: [PATCH 3967/4235] Define doom-which-key-leader-prefix-regexp --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 0664af462..3a05435df 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -30,7 +30,7 @@ This needs to be changed from $DOOMDIR/init.el.") (defvar doom-leader-map (make-sparse-keymap) "An overriding keymap for keys.") -(defvar doom--which-key-leader-regexp nil) +(defvar doom-which-key-leader-prefix-regexp nil) ;; From dbff052c8a6381d1c6161f745f35e1e0d3ad3301 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 13:16:51 -0400 Subject: [PATCH 3968/4235] Use doom-which-key-leader-prefix-regexp Curse your sudden but inevitable betrayal, impatience. --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 3a05435df..d9766e049 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -159,7 +159,7 @@ If any hook returns non-nil, all hooks after it are ignored.") "\\`" ;; Modification begin (if (memq 'doom-leader-map keymaps) - (concat "\\`" doom--which-key-leader-regexp " "))) + (concat "\\`" doom-which-key-leader-prefix-regexp " "))) ;; Modification end (regexp-quote key) "\\'")) From cdd65874506afb41b8d8cf7947915ed11949cea0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 13:19:25 -0400 Subject: [PATCH 3969/4235] lang/markdown: only bind meta keys in insert mode Fixes #1241 --- modules/lang/markdown/config.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index c1093956a..aca6c7333 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -29,10 +29,10 @@ (sp-local-pair "```" "```" :post-handlers '(:add ("||\n[i]" "RET")))) (map! :map markdown-mode-map - "M-*" #'markdown-insert-list-item - "M-b" #'markdown-insert-bold - "M-i" #'markdown-insert-italic - "M-`" #'+markdown/insert-del + :i "M-*" #'markdown-insert-list-item + :i "M-b" #'markdown-insert-bold + :i "M-i" #'markdown-insert-italic + :i "M-`" #'+markdown/insert-del (:when (featurep! :feature evil +everywhere) :m "gj" #'markdown-next-visible-heading :m "gk" #'markdown-previous-visible-heading From c5c3bdaa612e1b6c7646da5cb99e8fa910b20fd8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 16:46:55 -0400 Subject: [PATCH 3970/4235] ui/indent-guides: set variables sooner So you don't need after! to change them. --- modules/ui/indent-guides/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/indent-guides/config.el b/modules/ui/indent-guides/config.el index bb7d4c776..bd6261dcf 100644 --- a/modules/ui/indent-guides/config.el +++ b/modules/ui/indent-guides/config.el @@ -2,10 +2,10 @@ (def-package! highlight-indent-guides :hook ((prog-mode text-mode conf-mode) . highlight-indent-guides-mode) - :config + :init (setq highlight-indent-guides-method 'character highlight-indent-guides-responsive 'top) - + :config ;; Don't display first level of indentation (defun +indent-guides-for-all-but-first-column (level responsive display) (unless (< level 1) From 0cfab2e507386a530ed26a9f0af1f5aac4396a4a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 18:31:16 -0400 Subject: [PATCH 3971/4235] Disable indent guides by default It's hard on the fontifier and slows Emacs down tremendously. --- init.example.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index b20b54386..beeddd51d 100644 --- a/init.example.el +++ b/init.example.el @@ -25,7 +25,7 @@ evil-goggles ; display visual hints when editing in evil ;;fci ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags - indent-guides ; highlighted indent columns + ;;indent-guides ; highlighted indent columns modeline ; snazzy, Atom-inspired modeline, plus API nav-flash ; blink the current line after jumping ;;neotree ; a project drawer, like NERDTree for vim From 867f94e23a9cb8e527152827e6e341ccde03b428 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 18:46:52 -0400 Subject: [PATCH 3972/4235] Refactor doom-get-outdated-packages May address #1235 --- core/autoload/packages.el | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index f03a54073..085daadcc 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -327,9 +327,9 @@ Used by `doom-packages-update'." ;; The bottleneck in this process is quelpa's version checks, so check them ;; asynchronously. (cl-loop with partitions = (/ (length .quelpa) 4) - for pkgs in (seq-partition .quelpa partitions) - do (doom-log "New thread for: %s" pkgs) - and collect + for package-list in (seq-partition .quelpa partitions) + do (doom-log "New thread for: %s" package-list) + collect (async-start `(lambda () (let ((gc-cons-threshold ,doom-gc-cons-upper-limit) @@ -343,18 +343,17 @@ Used by `doom-packages-update'." (doom-modules ',doom-modules) (quelpa-cache ',quelpa-cache) (user-emacs-directory ,user-emacs-directory) - (packages ',pkgs) doom-private-dir) (load ,(expand-file-name "core.el" doom-core-dir)) (load ,(expand-file-name "autoload/packages.el" doom-core-dir)) (require 'package) (require 'quelpa) - (cl-delete-if-not #'doom-package-outdated-p packages)))) + (cl-remove-if-not #'doom-package-outdated-p ',package-list)))) into futures finally return - (delq nil - (append (mapcar #'doom-package-outdated-p .elpa) - (mapcan #'async-get futures)))))) + (append (delq nil (mapcar #'doom-package-outdated-p .elpa)) + (mapcan #'async-get futures) + nil)))) ;;;###autoload (defun doom-get-orphaned-packages () From fe28c40371c686b716706465d518bcf454cc2298 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 19:11:10 -0400 Subject: [PATCH 3973/4235] Fix void-variable frame error w/ whitespace-mode Fixes #1242 --- 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 52dd34660..5b448b49c 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -576,7 +576,7 @@ startup (or theme switch) time, so long as `doom--prefer-theme-elc' is non-nil." (defun doom*disable-whitespace-mode-in-childframes (orig-fn) "`whitespace-mode' inundates child frames with whitspace markers, so disable it to fix all that visual noise." - (unless (frame-parameter frame 'parent-frame) + (unless (frame-parameter nil 'parent-frame) (funcall orig-fn))) (add-function :around whitespace-enable-predicate #'doom*disable-whitespace-mode-in-childframes) From 2860633f9106dd91ab78649cb7c5f0188aff134a Mon Sep 17 00:00:00 2001 From: Huy Duong Date: Tue, 12 Mar 2019 09:21:56 +0700 Subject: [PATCH 3974/4235] Improve rspec key bindings Signed-off-by: Huy Duong --- modules/lang/ruby/config.el | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 6d2ac5a7b..bc510eed8 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -141,10 +141,11 @@ rspec-mode-keymap (make-sparse-keymap))) :config (map! :localleader - :mode (ruby-mode enh-ruby-mode rspec-mode) :prefix "t" - "r" #'rspec-rerun + :map (rspec-verifiable-mode-map rspec-dired-mode-map) "a" #'rspec-verify-all + "r" #'rspec-rerun + :map rspec-verifiable-mode-map "v" #'rspec-verify "c" #'rspec-verify-continue "f" #'rspec-verify-method @@ -152,10 +153,12 @@ "m" #'rspec-verify-matching "t" #'rspec-toggle-spec-and-target-find-example "T" #'rspec-toggle-spec-and-target - :mode rspec-mode - :prefix "t" + :map rspec-mode-map "s" #'rspec-verify-single - "e" #'rspec-toggle-example-pendingness)) + "e" #'rspec-toggle-example-pendingness + :map rspec-dired-mode-map + "v" #'rspec-dired-verify + "s" #'rspec-dired-verify-single)) (def-package! minitest :defer t From 3f282829bf971e3b6d6dec053a8723a70a98a508 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 11 Mar 2019 23:50:11 -0400 Subject: [PATCH 3975/4235] Remove describe-symbol -> helpful-symbol remapping helpful-symbol isn't a drop-in replacement for describe-symbol. --- core/core-editor.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 61a1bfa2f..d9511af01 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -277,8 +277,7 @@ savehist file." [remap describe-function] #'helpful-callable [remap describe-command] #'helpful-command [remap describe-variable] #'helpful-variable - [remap describe-key] #'helpful-key - [remap describe-symbol] #'helpful-symbol)) + [remap describe-key] #'helpful-key)) (def-package! ws-butler From 7b4afa32e4a17536cce53d278031a305b8878765 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Tue, 12 Mar 2019 14:21:41 +1000 Subject: [PATCH 3976/4235] Improvements to apropos and describe-symbol Patch the apropos button types so they call helpful instead of the built-in describe functions. Also add some bindings to apropos-mode-map so it behaves like other help modes. Add `doom/describe-symbol` function, which shows documentation for callable and variable symbols. If a symbol is both a variable and a callable, it dispatches to apropos. This gives a better workflow than `helpful-symbol`, which annoyingly prompts the user. Remap `describe-symbol` to `doom/describe-symbol`, and update `+emacs-lisp-lookup-documentation` to call it also. --- core/autoload/help.el | 15 +++++++++++++++ core/core-editor.el | 22 ++++++++++++++++++++-- modules/config/default/+emacs-bindings.el | 5 +++++ modules/lang/emacs-lisp/autoload.el | 11 +++++------ 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 17d7fb036..da41b919b 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -296,6 +296,21 @@ If prefix arg is prsent, refresh the cache." (insert "\n" indent)) (delete-char -1))))))) +;;;###autoload +(defun doom/describe-symbol (symbol) + "Show help for SYMBOL, a variable, function or macro." + (interactive + (list (helpful--read-symbol "Symbol: " #'helpful--bound-p))) + (let* ((sym (intern-soft symbol)) + (bound (boundp sym)) + (fbound (fboundp sym))) + (cond ((and sym bound (not fbound)) + (helpful-variable sym)) + ((and sym fbound (not bound)) + (helpful-callable sym)) + ((apropos (format "^%s\$" symbol))) + ((apropos (format "%s" symbol)))))) + ;;;###autoload (defun doom/what-face (arg &optional pos) "Shows all faces and overlay faces at point. diff --git a/core/core-editor.el b/core/core-editor.el index d9511af01..ef2ef81be 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -271,13 +271,31 @@ savehist file." ;; `helpful' --- a better *help* buffer (def-package! helpful - :defer t + :commands (helpful-callable + helpful-command + helpful-variable + helpful-key + helpful--read-symbol) :init (define-key! [remap describe-function] #'helpful-callable [remap describe-command] #'helpful-command [remap describe-variable] #'helpful-variable - [remap describe-key] #'helpful-key)) + [remap describe-key] #'helpful-key + [remap describe-symbol] #'doom/describe-symbol) + + (after! apropos + ;; patch apropos buttons to call helpful instead of help + (dolist (fun-bt '(apropos-function apropos-macro apropos-command)) + (button-type-put + fun-bt 'action + (lambda (button) + (helpful-callable (button-get button 'apropos-symbol))))) + (dolist (var-bt '(apropos-variable apropos-user-option)) + (button-type-put + var-bt 'action + (lambda (button) + (helpful-variable (button-get button 'apropos-symbol))))))) (def-package! ws-butler diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index e77c7eb68..bb609782d 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -320,6 +320,11 @@ (:after helpful-mode :map helpful-mode-map "o" #'ace-link-help) + (:after apropos + :map apropos-mode-map + "o" #'ace-link-help + "n" #'forward-button + "p" #'backward-button) (:after info :map Info-mode-map "o" #'ace-link-info) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index b3f6f37dd..d96a87505 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -126,9 +126,8 @@ library/userland functions" ;;;###autoload (defun +emacs-lisp-lookup-documentation (thing) - "Lookup THING with `helpful-symbol' if it's a symbol, apropos otherwise." - (cond ((not thing) - (call-interactively #'helpful-symbol)) - ((if-let* ((sym (intern-soft thing))) (helpful-symbol sym))) - ((apropos (format "^%s" thing))) - ((apropos thing)))) + "Lookup THING with `helpful-variable' if it's a variable, `helpful-callable' +if it's callable, `apropos' otherwise." + (if (not thing) + (call-interactively #'doom/describe-symbol) + (doom/describe-symbol thing))) From 979c201bf159340584b9f701761ceb38569b601f Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Tue, 12 Mar 2019 23:20:28 +1000 Subject: [PATCH 3977/4235] Fix latest company-box all-the-icons configuration --- modules/completion/company/config.el | 81 ++++++++++++++++------------ 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index 350b84d83..b247dddde 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -59,39 +59,54 @@ (setq company-box-show-single-candidate t company-box-backends-colors nil company-box-max-candidates 50 - company-box-icons-yasnippet (all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-green) - company-box-icons-unknown (all-the-icons-material "find_in_page" :height 0.8 :face 'all-the-icons-purple) - company-box-icons-elisp - (list (all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red) - (all-the-icons-material "check_circle" :height 0.8 :face 'all-the-icons-blue) - (all-the-icons-material "stars" :height 0.8 :face 'all-the-icons-orange) - (all-the-icons-material "format_paint" :height 0.8 :face 'all-the-icons-pink)) - company-box-icons-lsp - `((1 . ,(all-the-icons-material "text_fields" :height 0.8 :face 'all-the-icons-green)) ; text - (2 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; method - (3 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; function - (4 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; constructor - (5 . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) ; field - (6 . ,(all-the-icons-material "adjust" :height 0.8 :face 'all-the-icons-blue)) ; variable - (7 . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)) ; class - (8 . ,(all-the-icons-material "settings_input_component" :height 0.8 :face 'all-the-icons-red)) ; interface - (9 . ,(all-the-icons-material "view_module" :height 0.8 :face 'all-the-icons-red)) ; module - (10 . ,(all-the-icons-material "settings" :height 0.8 :face 'all-the-icons-red)) ; property - (11 . ,(all-the-icons-material "straighten" :height 0.8 :face 'all-the-icons-red)) ; unit - (12 . ,(all-the-icons-material "filter_1" :height 0.8 :face 'all-the-icons-red)) ; value - (13 . ,(all-the-icons-material "plus_one" :height 0.8 :face 'all-the-icons-red)) ; enum - (14 . ,(all-the-icons-material "filter_center_focus" :height 0.8 :face 'all-the-icons-red)) ; keyword - (15 . ,(all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-red)) ; snippet - (16 . ,(all-the-icons-material "color_lens" :height 0.8 :face 'all-the-icons-red)) ; color - (17 . ,(all-the-icons-material "insert_drive_file" :height 0.8 :face 'all-the-icons-red)) ; file - (18 . ,(all-the-icons-material "collections_bookmark" :height 0.8 :face 'all-the-icons-red)) ; reference - (19 . ,(all-the-icons-material "folder" :height 0.8 :face 'all-the-icons-red)) ; folder - (20 . ,(all-the-icons-material "people" :height 0.8 :face 'all-the-icons-red)) ; enumMember - (21 . ,(all-the-icons-material "pause_circle_filled" :height 0.8 :face 'all-the-icons-red)) ; constant - (22 . ,(all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) ; struct - (23 . ,(all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) ; event - (24 . ,(all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) ; operator - (25 . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red))))) + company-box-icons-alist 'company-box-icons-all-the-icons + company-box-icons-functions + '(+company-box-icons--yasnippet company-box-icons--lsp +company-box-icons--elisp company-box-icons--acphp) + company-box-icons-all-the-icons + `((Unknown . ,(all-the-icons-material "find_in_page" :height 0.8 :face 'all-the-icons-purple)) + (Text . ,(all-the-icons-material "text_fields" :height 0.8 :face 'all-the-icons-green)) + (Method . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) + (Function . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) + (Constructor . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) + (Field . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) + (Variable . ,(all-the-icons-material "adjust" :height 0.8 :face 'all-the-icons-blue)) + (Class . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)) + (Interface . ,(all-the-icons-material "settings_input_component" :height 0.8 :face 'all-the-icons-red)) + (Module . ,(all-the-icons-material "view_module" :height 0.8 :face 'all-the-icons-red)) + (Property . ,(all-the-icons-material "settings" :height 0.8 :face 'all-the-icons-red)) + (Unit . ,(all-the-icons-material "straighten" :height 0.8 :face 'all-the-icons-red)) + (Value . ,(all-the-icons-material "filter_1" :height 0.8 :face 'all-the-icons-red)) + (Enum . ,(all-the-icons-material "plus_one" :height 0.8 :face 'all-the-icons-red)) + (Keyword . ,(all-the-icons-material "filter_center_focus" :height 0.8 :face 'all-the-icons-red)) + (Snippet . ,(all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-red)) + (Color . ,(all-the-icons-material "color_lens" :height 0.8 :face 'all-the-icons-red)) + (File . ,(all-the-icons-material "insert_drive_file" :height 0.8 :face 'all-the-icons-red)) + (Reference . ,(all-the-icons-material "collections_bookmark" :height 0.8 :face 'all-the-icons-red)) + (Folder . ,(all-the-icons-material "folder" :height 0.8 :face 'all-the-icons-red)) + (EnumMember . ,(all-the-icons-material "people" :height 0.8 :face 'all-the-icons-red)) + (Constant . ,(all-the-icons-material "pause_circle_filled" :height 0.8 :face 'all-the-icons-red)) + (Struct . ,(all-the-icons-material "streetview" :height 0.8 :face 'all-the-icons-red)) + (Event . ,(all-the-icons-material "event" :height 0.8 :face 'all-the-icons-red)) + (Operator . ,(all-the-icons-material "control_point" :height 0.8 :face 'all-the-icons-red)) + (TypeParameter . ,(all-the-icons-material "class" :height 0.8 :face 'all-the-icons-red)) + ;; (Template . ,(company-box-icons-image "Template.png")))) + (Yasnippet . ,(all-the-icons-material "short_text" :height 0.8 :face 'all-the-icons-green)) + (ElispFunction . ,(all-the-icons-material "functions" :height 0.8 :face 'all-the-icons-red)) + (ElispVariable . ,(all-the-icons-material "check_circle" :height 0.8 :face 'all-the-icons-blue)) + (ElispFeature . ,(all-the-icons-material "stars" :height 0.8 :face 'all-the-icons-orange)) + (ElispFace . ,(all-the-icons-material "format_paint" :height 0.8 :face 'all-the-icons-pink)))) + + (defun +company-box-icons--yasnippet (candidate) + (when (get-text-property 0 'yas-annotation candidate) + 'Yasnippet)) + + (defun +company-box-icons--elisp (candidate) + (when (derived-mode-p 'emacs-lisp-mode) + (let ((sym (intern candidate))) + (cond ((fboundp sym) 'ElispFunction) + ((boundp sym) 'ElispVariable) + ((featurep sym) 'ElispFeature) + ((facep sym) 'ElispFace)))))) (def-package! company-dict From ff89a5f645302a98b67439f36f2c8acd2bd7da94 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Mar 2019 11:25:00 -0400 Subject: [PATCH 3978/4235] Remove redundant :commands The helpful package defines these as autoloads already. --- core/core-editor.el | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index ef2ef81be..1166880a4 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -271,11 +271,7 @@ savehist file." ;; `helpful' --- a better *help* buffer (def-package! helpful - :commands (helpful-callable - helpful-command - helpful-variable - helpful-key - helpful--read-symbol) + :defer t :init (define-key! [remap describe-function] #'helpful-callable From 6afe3d4115e2111ce92a99eae9cf4fc968f34368 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Mar 2019 11:25:48 -0400 Subject: [PATCH 3979/4235] Remove unneeded negation --- modules/lang/emacs-lisp/autoload.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index d96a87505..59847ec3d 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -128,6 +128,6 @@ library/userland functions" (defun +emacs-lisp-lookup-documentation (thing) "Lookup THING with `helpful-variable' if it's a variable, `helpful-callable' if it's callable, `apropos' otherwise." - (if (not thing) - (call-interactively #'doom/describe-symbol) - (doom/describe-symbol thing))) + (if thing + (doom/describe-symbol thing) + (call-interactively #'doom/describe-symbol))) From e1f4668c0bd80b4c899633901eb5adf7405cc7b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Mar 2019 11:31:25 -0400 Subject: [PATCH 3980/4235] Remove redundant :commands The elisp-demos package autoloads elisp-demos-advice-helpful-update --- modules/lang/emacs-lisp/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 7d383fc97..805505d3c 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -122,7 +122,7 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") (def-package! elisp-demos - :commands elisp-demos-advice-helpful-update + :defer t :init (advice-add 'helpful-update :after #'elisp-demos-advice-helpful-update)) From bca814cb7c300b15421be1401bf6a39406b4f946 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Mar 2019 11:47:52 -0400 Subject: [PATCH 3981/4235] Fix listp error when updating #1235 The async process wasn't mapping through doom-package-outdated-p, only filtered. Also ensure no less than two packages per thread are checked. --- core/autoload/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 085daadcc..51d510d72 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -326,7 +326,7 @@ Used by `doom-packages-update'." collect package)) ;; The bottleneck in this process is quelpa's version checks, so check them ;; asynchronously. - (cl-loop with partitions = (/ (length .quelpa) 4) + (cl-loop with partitions = (min 2 (/ (length .quelpa) 4)) for package-list in (seq-partition .quelpa partitions) do (doom-log "New thread for: %s" package-list) collect @@ -348,7 +348,7 @@ Used by `doom-packages-update'." (load ,(expand-file-name "autoload/packages.el" doom-core-dir)) (require 'package) (require 'quelpa) - (cl-remove-if-not #'doom-package-outdated-p ',package-list)))) + (delq nil (mapcar #'doom-package-outdated-p ',package-list))))) into futures finally return (append (delq nil (mapcar #'doom-package-outdated-p .elpa)) From 093dddff4a169f1f657b03d0bb83dea84f6fe1be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 12 Mar 2019 12:28:57 -0400 Subject: [PATCH 3982/4235] lang/clojure: minor refactor --- modules/lang/clojure/config.el | 202 +++++++++++++++++---------------- 1 file changed, 102 insertions(+), 100 deletions(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index e20a8ed9e..bc1a16beb 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -1,110 +1,112 @@ ;;; lang/clojure/config.el -*- lexical-binding: t; -*- ;; `clojure-mode' -(after! clojure-mode - (add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) +(add-hook 'clojure-mode-hook #'rainbow-delimiters-mode) - (def-package! cider - ;; NOTE: if you don't have an org directory set (the dir doesn't exist), - ;; cider jack in won't work. - :commands (cider-jack-in cider-jack-in-clojurescript) - :hook (clojure-mode-local-vars . cider-mode) - :init - (set-repl-handler! 'clojure-mode #'+clojure/repl) - (set-eval-handler! 'clojure-mode #'cider-eval-region) - (set-lookup-handlers! 'clojure-mode - :definition #'cider-find-dwim - :documentation #'cider-doc) - (add-hook 'cider-mode-hook #'eldoc-mode) - :config - (set-popup-rules! - '(("^\\*cider-error*" :ignore t) - ("^\\*cider-repl" :quit nil) - ("^\\*cider-repl-history" :vslot 2 :ttl nil))) - (setq nrepl-hide-special-buffers t - nrepl-log-messages nil - cider-font-lock-dynamically '(macro core function var) - cider-overlays-use-font-lock t - cider-prompt-for-symbol nil - cider-repl-display-help-banner nil - cider-repl-history-display-duplicates nil - cider-repl-history-display-style 'one-line - cider-repl-history-file (concat doom-cache-dir "cider-repl-history") - cider-repl-history-highlight-current-entry t - cider-repl-history-quit-action 'delete-and-restore - cider-repl-history-highlight-inserted-item t - cider-repl-history-size 1000 - cider-repl-pop-to-buffer-on-connect 'display-only - cider-repl-result-prefix ";; => " - cider-repl-print-length 100 - cider-repl-use-clojure-font-lock t - cider-repl-use-pretty-printing t - cider-repl-wrap-history nil - cider-stacktrace-default-filters '(tooling dup)) +(def-package! cider + ;; NOTE: if you don't have an org directory set (the dir doesn't exist), + ;; cider jack in won't work. + :commands (cider-jack-in cider-jack-in-clojurescript) + :hook (clojure-mode-local-vars . cider-mode) + :init + (set-repl-handler! 'clojure-mode #'+clojure/repl) + (set-eval-handler! 'clojure-mode #'cider-eval-region) + (set-lookup-handlers! 'clojure-mode + :definition #'cider-find-dwim + :documentation #'cider-doc) + (add-hook 'cider-mode-hook #'eldoc-mode) + :config + (set-popup-rules! + '(("^\\*cider-error*" :ignore t) + ("^\\*cider-repl" :quit nil) + ("^\\*cider-repl-history" :vslot 2 :ttl nil))) - (map! (:localleader - (:map clojure-mode-map - "'" #'cider-jack-in - "\"" #'cider-jack-in-clojurescript + (setq nrepl-hide-special-buffers t + nrepl-log-messages nil + cider-font-lock-dynamically '(macro core function var) + cider-overlays-use-font-lock t + cider-prompt-for-symbol nil + cider-repl-display-help-banner nil + cider-repl-history-display-duplicates nil + cider-repl-history-display-style 'one-line + cider-repl-history-file (concat doom-cache-dir "cider-repl-history") + cider-repl-history-highlight-current-entry t + cider-repl-history-quit-action 'delete-and-restore + cider-repl-history-highlight-inserted-item t + cider-repl-history-size 1000 + cider-repl-pop-to-buffer-on-connect 'display-only + cider-repl-result-prefix ";; => " + cider-repl-print-length 100 + cider-repl-use-clojure-font-lock t + cider-repl-use-pretty-printing t + cider-repl-wrap-history nil + cider-stacktrace-default-filters '(tooling dup)) - (:prefix ("e" . "eval") - "d" #'cider-eval-defun-at-point - "D" #'cider-insert-defun-in-repl - "e" #'cider-eval-last-sexp - "E" #'cider-insert-last-sexp-in-repl - "r" #'cider-eval-region - "R" #'cider-insert-region-in-repl - "u" #'cider-undef) - (:prefix ("g" . "go/jump") - "b" #'cider-pop-back - "g" #'cider-find-var - "n" #'cider-find-ns) - (:prefix ("h" . "help") - "n" #'cider-find-ns - "a" #'cider-apropos - "d" #'cider-doc - "g" #'cider-grimoire-web - "j" #'cider-javadoc) - (:prefix ("i" . "inspect") - "i" #'cider-inspect - "r" #'cider-inspect-last-result) - (:prefix ("m" . "macro") - "e" #'cider-macroexpand-1 - "E" #'cider-macroexpand-al) - (:prefix ("n" . "namespace") - "n" #'cider-browse-ns - "N" #'cider-browse-ns-all) - (:prefix ("r" . "repl") - "n" #'cider-repl-set-ns - "q" #'cider-quit - "r" #'cider-refresh - "R" #'cider-restart - "b" #'cider-switch-to-repl-buffer - "B" #'+clojure/cider-switch-to-repl-buffer-and-switch-ns - "c" #'cider-repl-clear-buffer))) + (map! (:localleader + (:map clojure-mode-map + "'" #'cider-jack-in + "\"" #'cider-jack-in-clojurescript - (:when (featurep! :feature evil +everywhere) - :map cider-repl-mode-map - :i [S-return] #'cider-repl-newline-and-indent - :map cider-repl-history-mode-map - :i [return] #'cider-repl-history-insert-and-quit - :i "q" #'cider-repl-history-quit - :i "l" #'cider-repl-history-occur - :i "s" #'cider-repl-history-search-forward - :i "r" #'cider-repl-history-search-backward - :i "U" #'cider-repl-history-undo-other-window))) + (:prefix ("e" . "eval") + "d" #'cider-eval-defun-at-point + "D" #'cider-insert-defun-in-repl + "e" #'cider-eval-last-sexp + "E" #'cider-insert-last-sexp-in-repl + "r" #'cider-eval-region + "R" #'cider-insert-region-in-repl + "u" #'cider-undef) + (:prefix ("g" . "go/jump") + "b" #'cider-pop-back + "g" #'cider-find-var + "n" #'cider-find-ns) + (:prefix ("h" . "help") + "n" #'cider-find-ns + "a" #'cider-apropos + "d" #'cider-doc + "g" #'cider-grimoire-web + "j" #'cider-javadoc) + (:prefix ("i" . "inspect") + "i" #'cider-inspect + "r" #'cider-inspect-last-result) + (:prefix ("m" . "macro") + "e" #'cider-macroexpand-1 + "E" #'cider-macroexpand-al) + (:prefix ("n" . "namespace") + "n" #'cider-browse-ns + "N" #'cider-browse-ns-all) + (:prefix ("r" . "repl") + "n" #'cider-repl-set-ns + "q" #'cider-quit + "r" #'cider-refresh + "R" #'cider-restart + "b" #'cider-switch-to-repl-buffer + "B" #'+clojure/cider-switch-to-repl-buffer-and-switch-ns + "c" #'cider-repl-clear-buffer))) - (def-package! clj-refactor - :hook (clojure-mode . clj-refactor-mode) - :init - (set-lookup-handlers! 'clojure-mode - :references #'cljr-find-usages) - :config - (map! :map clojure-mode-map - :localleader - :desc "refactor" "R" #'hydra-cljr-help-menu/body)) + (:when (featurep! :feature evil +everywhere) + :map cider-repl-mode-map + :i [S-return] #'cider-repl-newline-and-indent + :map cider-repl-history-mode-map + :i [return] #'cider-repl-history-insert-and-quit + :i "q" #'cider-repl-history-quit + :i "l" #'cider-repl-history-occur + :i "s" #'cider-repl-history-search-forward + :i "r" #'cider-repl-history-search-backward + :i "U" #'cider-repl-history-undo-other-window))) - (def-package! flycheck-joker - :when (featurep! :tools flycheck) - :after flycheck)) + +(def-package! clj-refactor + :hook (clojure-mode . clj-refactor-mode) + :init + (set-lookup-handlers! 'clojure-mode + :references #'cljr-find-usages) + :config + (map! :map clojure-mode-map + :localleader + :desc "refactor" "R" #'hydra-cljr-help-menu/body)) + + +(def-package! flycheck-joker + :when (featurep! :tools flycheck) + :after flycheck) From 89e91a02916347111f905a19938da3e5ccdae5c7 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Wed, 13 Mar 2019 06:44:39 +1000 Subject: [PATCH 3983/4235] Fix autoloading helpful for doom/describe-symbol --- 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 1166880a4..35eac8e18 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -271,7 +271,7 @@ savehist file." ;; `helpful' --- a better *help* buffer (def-package! helpful - :defer t + :commands helpful--read-symbol :init (define-key! [remap describe-function] #'helpful-callable From 84cea4feb022f624eb3f67e036dc81ae1b457e28 Mon Sep 17 00:00:00 2001 From: Huy Duong Date: Sun, 3 Mar 2019 10:24:27 +0700 Subject: [PATCH 3984/4235] Don't install robe if lsp is enabled Signed-off-by: Huy Duong --- modules/lang/ruby/packages.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/ruby/packages.el b/modules/lang/ruby/packages.el index c0b98741e..3c010a6e6 100644 --- a/modules/lang/ruby/packages.el +++ b/modules/lang/ruby/packages.el @@ -6,7 +6,8 @@ (package! enh-ruby-mode) (package! yard-mode) (package! inf-ruby) -(package! robe) +(unless (featurep! +lsp) + (package! robe)) (when (featurep! :completion company) (package! company-inf-ruby)) From 99a5ff2025b03ff260b468f34fa61c7e8e75ea22 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Wed, 13 Mar 2019 14:17:29 +1000 Subject: [PATCH 3985/4235] Fix loading of multiple-cursors configuration The package is split in a way that `multiple-cursors.el` is normally not required when autoloading from commands; `multiple-cursors-core.el` is always loaded. Unfortunately the `mc/list-file` location is still not being set properly, a fix has been submitted: magnars/multiple-cursors.el#355 --- modules/editor/multiple-cursors/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 8f70046f3..687a35b87 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -56,7 +56,7 @@ :evil-mc t)) -(after! multiple-cursors +(after! multiple-cursors-core (setq mc/list-file (concat doom-etc-dir "mc-lists.el")) ;; TODO multiple-cursors config for Emacs users? From 29277c9b02811ede71ff8090a63a8bdb884cd397 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 01:28:49 -0400 Subject: [PATCH 3986/4235] Disable indent guides in incompatible modes e.g. visual-line-mode & org-indent-mode --- modules/ui/indent-guides/config.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/ui/indent-guides/config.el b/modules/ui/indent-guides/config.el index bd6261dcf..202d6efa0 100644 --- a/modules/ui/indent-guides/config.el +++ b/modules/ui/indent-guides/config.el @@ -10,4 +10,11 @@ (defun +indent-guides-for-all-but-first-column (level responsive display) (unless (< level 1) (highlight-indent-guides--highlighter-default level responsive display))) - (setq highlight-indent-guides-highlighter-function #'+indent-guides-for-all-but-first-column)) + (setq highlight-indent-guides-highlighter-function #'+indent-guides-for-all-but-first-column) + + (defun +indent-guides|disable-maybe () + (when highlight-indent-guides + (highlight-indent-guides -1))) + ;; `highlight-indent-guides' breaks in `visual-line-mode' + (add-hook 'visual-line-mode-hook #'+indent-guides|disable-maybe) + (add-hook 'org-indent-mode-hook #'+indent-guides|disable-maybe)) From e50157bcecb2e06a5450a0cd35a72f354fa839e9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 01:35:46 -0400 Subject: [PATCH 3987/4235] Restore reverted ee6e4a8b Although Yevgnen/ivy-rich#51 was merged upstream, due to Melpa issues, it hasn't been pulled. I'll restore this under it has. --- modules/completion/ivy/config.el | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e07c7db23..e3389b867 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -93,7 +93,17 @@ immediately runs it on the current candidate (ending the ivy session)." (colplist (plist-get plist :columns)) (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) (when switch-buffer-alist - (setcar switch-buffer-alist '+ivy-rich-buffer-name)))) + (setcar switch-buffer-alist '+ivy-rich-buffer-name))) + + (defun +ivy*rich-counsel-function-docstring (candidate) + (let ((doc (replace-regexp-in-string + ":\\(\\(before\\|after\\)\\(-\\(whilte\\|until\\)\\)?\\|around\\|override\\|\\(filter-\\(args\\|return\\)\\)\\) advice:[ ]*‘.+?’[\r\n]+" + "" + (or (ignore-errors (documentation (intern-soft candidate))) "")))) + (if (string-match "^\\(.+\\)\\([\r\n]\\)?" doc) + (setq doc (match-string 1 doc)) + ""))) + (advice-add #'ivy-rich-counsel-function-docstring :override #'+ivy*rich-counsel-function-docstring)) (def-package! counsel From 5e5ae456bb63ccfd2c7ed181f7de5025bc50a9e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 01:37:55 -0400 Subject: [PATCH 3988/4235] Replace doom/what-face with describe-char describe-char produces the same information and much more. --- core/autoload/help.el | 34 -------------------------------- modules/config/default/config.el | 2 +- 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index da41b919b..8b04e3356 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -311,40 +311,6 @@ If prefix arg is prsent, refresh the cache." ((apropos (format "^%s\$" symbol))) ((apropos (format "%s" symbol)))))) -;;;###autoload -(defun doom/what-face (arg &optional pos) - "Shows all faces and overlay faces at point. - -Interactively prints the list to the echo area. Noninteractively, returns a list -whose car is the list of faces and cadr is the list of overlay faces." - (interactive "P") - (let* ((pos (or pos (point))) - (faces (let ((face (get-text-property pos 'face))) - (if (keywordp (car-safe face)) - (list face) - (cl-loop for f in (doom-enlist face) collect f)))) - (overlays (cl-loop for ov in (overlays-at pos (1+ pos)) - nconc (doom-enlist (overlay-get ov 'face))))) - (cond ((called-interactively-p 'any) - (message "%s %s\n%s %s" - (propertize "Faces:" 'face 'font-lock-comment-face) - (if faces - (cl-loop for face in faces - if (or (listp face) arg) - concat (format "'%s " face) - else - concat (concat (propertize (symbol-name face) 'face face) " ")) - "n/a ") - (propertize "Overlays:" 'face 'font-lock-comment-face) - (if overlays - (cl-loop for ov in overlays - if arg concat (concat (symbol-name ov) " ") - else concat (concat (propertize (symbol-name ov) 'face ov) " ")) - "n/a"))) - (t - (and (or faces overlays) - (list faces overlays)))))) - ;;;###autoload (defalias 'doom/help 'doom/open-manual) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 4ae830bee..79894872e 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -92,7 +92,7 @@ ;; Custom help keys -- these aren't under `+bindings' because they ought to be ;; universal. (map! :map help-map - "'" #'doom/what-face + "'" #'describe-char "a" #'apropos ; replaces `apropos-command' "A" #'doom/describe-autodefs "B" #'doom/open-bug-report From 5c7da455f8af22c0bd4d0875244714e2705448d1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 01:51:53 -0400 Subject: [PATCH 3989/4235] More help-map keys and remaps - Move profiler from 't' to 'T' (as not to override `help-with-tutorial', esp for non-evil users) - Replace C-c (describe-copying) with describe-coding-system - Bind doom/describe-symbol to 'h' - Bind `describe-key-briefly' to 'C-k' --- modules/config/default/config.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 79894872e..b545692ed 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -96,11 +96,13 @@ "a" #'apropos ; replaces `apropos-command' "A" #'doom/describe-autodefs "B" #'doom/open-bug-report + "C-c" #'describe-coding-system ; replaces `describe-copying' b/c not useful "d" #'doom/describe-module ; replaces `apropos-documentation' b/c `apropos' covers this "D" #'doom/open-manual "E" #'doom/open-vanilla-sandbox - "F" #'describe-face ; replaces `Info-got-emacs-command-node' b/c redundant w/ helpful - "h" #'helpful-at-point ; replaces `view-hello-file' b/c annoying + "F" #'describe-face ; replaces `Info-got-emacs-command-node' b/c redundant w/ `Info-goto-node' + "h" #'doom/describe-symbol ; replaces `view-hello-file' b/c annoying + "C-k" #'describe-key-briefly "L" #'global-command-log-mode ; replaces `describe-language-environment' b/c remapped to C-l "C-l" #'describe-language-environment "M" #'doom/describe-active-minor-mode @@ -109,7 +111,6 @@ "O" #'+lookup/online "p" #'doom/describe-package ; replaces `finder-by-keyword' "P" #'find-library ; replaces `describe-package' b/c redundant w/ `doom/describe-package' - "t" #'doom/toggle-profiler ; replaces `help-with-tutorial' b/c not useful for evil users "r" nil ; replaces `info-emacs-manual' b/c it's on C-m now (:prefix "r" "r" #'doom/reload @@ -117,6 +118,7 @@ "p" #'doom/reload-packages "f" #'doom/reload-font "P" #'doom/reload-project) + "T" #'doom/toggle-profiler "V" #'set-variable "C-v" #'doom/version "W" #'+default/man-or-woman) From d868f5fd1010277a16927d7335a245b1d46b471a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 01:55:50 -0400 Subject: [PATCH 3990/4235] Use new ;;;###package cookie This will later be used for doom/describe-packages to list all locations where a package is being configured (along with def-package! and after! blocks). --- core/core-keybinds.el | 2 +- core/core-ui.el | 19 ++++++++++--------- modules/lang/emacs-lisp/packages.el | 2 ++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index d9766e049..86fb7f6c0 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -208,7 +208,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (which-key-mode +1)) -;; `hydra' +;;;###package hydra (setq lv-use-seperator t) diff --git a/core/core-ui.el b/core/core-ui.el index 5b448b49c..f8df58b1b 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -322,11 +322,10 @@ read-only or not file-visiting." ;; ;;; Third party packages -;; `avy' +;;;###package avy (setq avy-all-windows nil avy-background t) -;; `all-the-icons' (def-package! all-the-icons :commands (all-the-icons-octicon all-the-icons-faicon all-the-icons-fileicon all-the-icons-wicon all-the-icons-material all-the-icons-alltheicon) @@ -342,25 +341,27 @@ read-only or not file-visiting." all-the-icons-wicon all-the-icons-alltheicon)) (advice-add fn :around #'doom*disable-all-the-icons-in-tty))) -;; `hide-mode-line-mode' +;;;###package hide-mode-line-mode (add-hook 'completion-list-mode-hook #'hide-mode-line-mode) (add-hook 'Man-mode-hook #'hide-mode-line-mode) -;; `highlight-numbers' --- better number literal fontification in code +;; Better fontification of number literals in code (def-package! highlight-numbers :hook ((prog-mode conf-mode) . highlight-numbers-mode) :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) -;; `highlight-escape-sequences' +;;;###package highlight-escape-sequences (def-package! highlight-escape-sequences :hook ((prog-mode conf-mode) . highlight-escape-sequences-mode)) -;; `rainbow-delimiters' --- helps us distinguish stacked delimiter pairs. -;; Especially in parentheses-drunk languages like Lisp. +;;;###package rainbow-delimiters +;; Helps us distinguish stacked delimiter pairs, especially in parentheses-drunk +;; languages like Lisp. (setq rainbow-delimiters-max-face-count 3) -;; `visual-fill-column' --- for a distractions-free-like UI, that dynamically -;; resizes margins and can center a buffer. +;;;###package visual-fill-column +;; For a distractions-free-like UI, that dynamically resizes margins and can +;; center a buffer. (setq visual-fill-column-center-text t visual-fill-column-width ;; take Emacs 26 line numbers into account diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el index 4509683e1..67b572ecd 100644 --- a/modules/lang/emacs-lisp/packages.el +++ b/modules/lang/emacs-lisp/packages.el @@ -1,6 +1,8 @@ ;; -*- no-byte-compile: t; -*- ;;; lang/emacs-lisp/packages.el +(package! elisp-mode :built-in t) + (package! auto-compile) (package! highlight-quoted) (package! macrostep) From a669406cad46f96ac842906f150391d5a5886ebf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 02:17:37 -0400 Subject: [PATCH 3991/4235] Remove doom/what-face unit tests --- core/test/test-autoload-help.el | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/core/test/test-autoload-help.el b/core/test/test-autoload-help.el index 1f80a8e73..8df3a9a3a 100644 --- a/core/test/test-autoload-help.el +++ b/core/test/test-autoload-help.el @@ -1,31 +1,10 @@ ;; -*- no-byte-compile: t; -*- ;;; core/test/test-autoload-help.el -(load! "autoload/help" doom-core-dir) +;; (load! "autoload/help" doom-core-dir) ;; -(describe "core/autoload/help" - :var (a) - (before-each (setq a (switch-to-buffer (get-buffer-create "a")))) - (after-each (kill-buffer a)) - - (describe "what-face" - (before-each - (insert (propertize "Hello " 'face 'font-lock-keyword-face)) - (insert "world")) - (it "returns list of faces at point" - (expect (doom/what-face nil (point-min)) :to-equal '((font-lock-keyword-face) ()))) - (it "returns nil if no faces at point" - (expect (doom/what-face nil (point-max)) :to-be nil))) - - (describe "what-face overlays" - (before-each - (insert "Hello world") - (let ((ov (make-overlay 1 6))) - (overlay-put ov 'face 'font-lock-keyword-face))) - - (it "returns list of overlays at point" - (expect (doom/what-face nil (point-min)) :to-equal '(() (font-lock-keyword-face)))) - (it "returns nil if no overlays at point" - (expect (doom/what-face nil (point-max)) :to-be nil)))) - +;; (describe "core/autoload/help" +;; :var (a) +;; (before-each (setq a (switch-to-buffer (get-buffer-create "a")))) +;; (after-each (kill-buffer a))) From 4715412b5ce00f25146e4fe556daa7a2860e24f3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 18:22:09 -0400 Subject: [PATCH 3992/4235] tools/vterm: remove use-emacs-theme-colors hack Causes invalid face errors. This will be resolved in doom-themes instead. --- modules/tools/vterm/config.el | 8 -------- 1 file changed, 8 deletions(-) diff --git a/modules/tools/vterm/config.el b/modules/tools/vterm/config.el index e3a8751f9..ab89ee5ee 100644 --- a/modules/tools/vterm/config.el +++ b/modules/tools/vterm/config.el @@ -12,14 +12,6 @@ ;; Automatically kill buffer when vterm exits. (add-to-list 'vterm-exit-functions (lambda (buffer) (if buffer (kill-buffer buffer)))) - (defun +vterm|use-emacs-theme-colors () - "Unset the black and white colors so that vterm's background and foreground -inherit from the `default' face." - (make-local-variable 'ansi-color-names-vector) - (setf (elt ansi-color-names-vector 0) nil) - (setf (elt ansi-color-names-vector 7) nil)) - (add-hook 'vterm-mode-hook #'+vterm|use-emacs-theme-colors) - (when (featurep! :feature evil) (evil-set-initial-state 'vterm-mode 'insert) ;; Go back to normal state but don't move cursor backwards. Moving cursor From 79ac04f0b1f82fdc10096342307c557de7eb7588 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 18:22:57 -0400 Subject: [PATCH 3993/4235] Fix default personal org-capture targets Supposed to resolve to {org-directory}/todo.org, but instead resolved to {default-directory}/todo.org. --- modules/lang/org/+capture.el | 4 +++- modules/lang/org/autoload/org-capture.el | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/lang/org/+capture.el b/modules/lang/org/+capture.el index af5725549..bec8bdf71 100644 --- a/modules/lang/org/+capture.el +++ b/modules/lang/org/+capture.el @@ -21,7 +21,7 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default Is relative to `org-directory' unless it is absolute. Is used in Doom's default `org-capture-templates'.") -(defvaralias '+org-capture-notes-file 'org-default-notes-file +(defvar +org-capture-notes-file "notes.org" "Default target for storing notes. Used as a fall back file for org-capture.el, for templates that do not specify a @@ -30,6 +30,8 @@ target file. Is relative to `org-directory', unless it is absolute. Is used in Doom's default `org-capture-templates'.") +(setq org-default-notes-file (expand-file-name +org-capture-notes-file org-directory)) + ;; ;;; Bootstrap diff --git a/modules/lang/org/autoload/org-capture.el b/modules/lang/org/autoload/org-capture.el index 046a8083f..e11d46d97 100644 --- a/modules/lang/org/autoload/org-capture.el +++ b/modules/lang/org/autoload/org-capture.el @@ -85,6 +85,18 @@ you're done. This can be called from an external shell script." (doom-project-root) (user-error "Couldn't detect a project"))))) +;;;###autoload +(defun +org-capture-todo-file () + "Expand `+org-capture-todo-file' from `org-directory'. +If it is an absolute path return `+org-capture-todo-file' verbatim." + (expand-file-name +org-capture-todo-file org-directory)) + +;;;###autoload +(defun +org-capture-notes-file () + "Expand `+org-capture-notes-file' from `org-directory'. +If it is an absolute path return `+org-capture-todo-file' verbatim." + (expand-file-name +org-capture-notes-file org-directory)) + ;;;###autoload (defun +org-capture-project-todo-file () "Find the nearest `+org-capture-todo-file' in a parent directory, otherwise, From 1ce2b29193dce0d9051250efce388450da9b5ef2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 18:46:06 -0400 Subject: [PATCH 3994/4235] ui/modeline: minor startup optimization Prevents project.el from being eager-loaded at startup. --- core/core-projects.el | 2 +- modules/ui/modeline/config.el | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index 6e293efc8..193e05724 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,7 +1,7 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile - :after-call (after-find-file dired-before-readin-hook) + :after-call (after-find-file dired-before-readin-hook minibuffer-setup-hook) :commands (projectile-project-root projectile-project-name projectile-project-p) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 26b94c4c3..34e961ad9 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -27,6 +27,16 @@ (add-hook '+doom-dashboard-mode-hook #'doom-modeline-set-project-modeline) + ;; Don't eager-load project.el. Doom only uses projectile anyway, for now. + (defun +modeline*project-root () + (or doom-modeline-project-root + (setq doom-modeline-project-root + (file-local-name + (if (featurep 'projectile) + (ignore-errors (projectile-project-root)) + default-directory))))) + (advice-add #'doom-modeline-project-root :override #'+modeline*project-root) + ;; Magit -- modeline only where it's useful (defun +modeline|hide-in-non-status-buffer () (if (eq major-mode 'magit-status-mode) From 1e1f725a55b542baef8e30dac7f9b668b702a13e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 19:20:07 -0400 Subject: [PATCH 3995/4235] ui/vc-gutter: remove redundant after-save hook git-gutter already adds one to after-save-hook. --- modules/ui/vc-gutter/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index f425dbf56..daed7ec42 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -40,7 +40,7 @@ to the right fringe.") (setq-local git-gutter:clear-function #'git-gutter:clear-diff-infos) (setq-local git-gutter:window-width 1)) (git-gutter-mode +1))) - (add-hook! (text-mode prog-mode conf-mode after-save) + (add-hook! (text-mode prog-mode conf-mode) #'+version-control|git-gutter-maybe) ;; standardize default fringe width (if (fboundp 'fringe-mode) (fringe-mode '4)) From 9b1b75f947360eafd22b4fe092df0d78f75324aa Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 19:20:37 -0400 Subject: [PATCH 3996/4235] Improve profiler popup integration Following profiler links will open in different window; also displays CPU/Memory reports side by side. --- modules/ui/popup/+hacks.el | 8 ++++++++ modules/ui/popup/config.el | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/+hacks.el b/modules/ui/popup/+hacks.el index deebf9b06..8b05cff9a 100644 --- a/modules/ui/popup/+hacks.el +++ b/modules/ui/popup/+hacks.el @@ -316,6 +316,14 @@ instead of switch-to-buffer-*." (set-popup-rule! "\\(^\\*Contents\\|'s annots\\*$\\)" :ignore t)) +;; `profiler' +(defun doom*profiler-report-find-entry-in-other-window (orig-fn function) + (cl-letf (((symbol-function 'find-function) + (symbol-function 'find-function-other-window))) + (funcall orig-fn function))) +(advice-add #'profiler-report-find-entry :around #'doom*profiler-report-find-entry-in-other-window) + + ;; `wgrep' (progn ;; close the popup after you're done with a wgrep buffer diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 0f4ab07f7..f3f257ddb 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -159,7 +159,9 @@ prevent the popup(s) from messing up the UI (or vice versa)." ;; `Info-mode' ("^\\*info\\*$" :slot 2 :vslot 2 :size 0.45 :select t))) - '(("^\\*Backtrace" :vslot 99 :size 0.4 :quit nil))) + '(("^\\*Backtrace" :vslot 99 :size 0.4 :quit nil) + ("^\\*CPU-Profiler-Report " :side bottom :vslot 100 :slot 1 :height 0.4 :width 0.5 :quit nil) + ("^\\*Memory-Profiler-Report " :side bottom :vslot 100 :slot 2 :height 0.4 :width 0.5 :quit nil))) (add-hook 'doom-init-ui-hook #'+popup-mode :append) From e116003162661e8d80d4ca19e00de7147da5ece8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 19:22:58 -0400 Subject: [PATCH 3997/4235] lang/python: start lsp later Allows file/dir local variables to affect lsp. --- modules/lang/python/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 572026117..62888bdf0 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -41,7 +41,7 @@ called.") :return "return" :yield "yield") (when (featurep! +lsp) - (add-hook 'python-mode-hook #'lsp!)) + (add-hook 'python-mode-local-vars-hook #'lsp!)) (define-key python-mode-map (kbd "DEL") nil) ; interferes with smartparens (sp-local-pair 'python-mode "'" nil From bd6233518b5715d749d96ad2c6a89c24dc5e3111 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 20:14:48 -0400 Subject: [PATCH 3998/4235] Fix doom|run-switch-window-hooks Using the wrong variable. --- core/core-ui.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index f8df58b1b..a112c6030 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -86,10 +86,10 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") (defvar doom--last-frame nil) (defun doom|run-switch-window-hooks () - (unless (or doom-inhibit-switch-buffer-hooks + (unless (or doom-inhibit-switch-window-hooks (eq doom--last-window (selected-window)) (minibufferp)) - (let ((doom-inhibit-switch-buffer-hooks t)) + (let ((doom-inhibit-switch-window-hooks t)) (run-hooks 'doom-switch-window-hook) (doom-log "Window switched to %s" (selected-window)) (setq doom--last-window (selected-window))))) From fa98551d19101877158fcee40ea348179eabe5c9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 20:20:19 -0400 Subject: [PATCH 3999/4235] tools/vterm: minor refactor Don't end warnings in punctuation, and throw error if modules support is missing. --- modules/tools/vterm/autoload.el | 4 ++++ modules/tools/vterm/config.el | 2 +- modules/tools/vterm/doctor.el | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/tools/vterm/autoload.el b/modules/tools/vterm/autoload.el index 52f663a73..d3b36d73a 100644 --- a/modules/tools/vterm/autoload.el +++ b/modules/tools/vterm/autoload.el @@ -5,6 +5,8 @@ "Open a terminal buffer in the current window. If ARG (universal argument) is non-nil, cd into the current project's root." (interactive "P") + (unless (fboundp 'module-load) + (user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm")) (let ((default-directory (if arg (or (doom-project-root) default-directory) @@ -16,6 +18,8 @@ non-nil, cd into the current project's root." "Open a terminal popup window. If ARG (universal argument) is non-nil, cd into the current project's root." (interactive "P") + (unless (fboundp 'module-load) + (user-error "Your build of Emacs lacks dynamic modules support and cannot load vterm")) (let ((default-directory (if arg (or (doom-project-root) default-directory) diff --git a/modules/tools/vterm/config.el b/modules/tools/vterm/config.el index ab89ee5ee..900678c4a 100644 --- a/modules/tools/vterm/config.el +++ b/modules/tools/vterm/config.el @@ -3,7 +3,7 @@ (def-package! vterm :when (fboundp 'module-load) :defer t - :init (setq vterm-install t) + :preface (setq vterm-install t) :config (set-env! "SHELL") (set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) diff --git a/modules/tools/vterm/doctor.el b/modules/tools/vterm/doctor.el index 866c4b62d..0700bafdb 100644 --- a/modules/tools/vterm/doctor.el +++ b/modules/tools/vterm/doctor.el @@ -1,13 +1,13 @@ ;;; tools/vterm/doctor.el -*- lexical-binding: t; -*- (unless (executable-find "vterm-ctrl") - (warn! "Couldn't find libvterm. Vterm module won't compile.")) + (warn! "Couldn't find libvterm. Vterm module won't compile")) (unless (executable-find "make") - (warn! "Couldn't find make command. Vterm module won't compile.")) + (warn! "Couldn't find make command. Vterm module won't compile")) (unless (executable-find "cmake") (warn! "Couldn't find cmake command. Vterm module won't compile")) (unless (fboundp 'module-load) - (warn! "Your emacs don't have MODULES support. Vterm module won't work.")) + (warn! "Your emacs doesn't have MODULES support. Vterm module won't work")) From cd64fb27f8e359ee1700a3efa58e9aabb6683b5b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 13 Mar 2019 23:59:13 -0400 Subject: [PATCH 4000/4235] Fix breaking commit 1ce2b291 Possible nil being passed into file-local-name was causing stringp errors all over the place. --- modules/ui/modeline/config.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 34e961ad9..f22be333c 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -32,9 +32,8 @@ (or doom-modeline-project-root (setq doom-modeline-project-root (file-local-name - (if (featurep 'projectile) - (ignore-errors (projectile-project-root)) - default-directory))))) + (or (and (featurep 'projectile) (ignore-errors (projectile-project-root))) + default-directory))))) (advice-add #'doom-modeline-project-root :override #'+modeline*project-root) ;; Magit -- modeline only where it's useful From fba7bf7748808d73315a1dde7dfe1a0f606fa261 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 00:03:12 -0400 Subject: [PATCH 4001/4235] lang/ruby: don't unset rspec-mode's keymaps No longer necessary, and is destructive for non-evil users. --- modules/lang/ruby/config.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index e3dd95005..0ca86ac83 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -121,10 +121,8 @@ ;; Rake (("task" "namespace") () "end"))) - (if (featurep! :feature evil) - (add-hook 'rspec-mode-hook #'evil-normalize-keymaps) - (setq rspec-verifiable-mode-keymap (make-sparse-keymap) - rspec-mode-keymap (make-sparse-keymap))) + (when (featurep! :feature evil) + (add-hook 'rspec-mode-hook #'evil-normalize-keymaps)) :config (map! :localleader :prefix "t" @@ -146,6 +144,7 @@ "v" #'rspec-dired-verify "s" #'rspec-dired-verify-single)) + (def-package! minitest :defer t :config From 60c965ded8f1f46eb5c7a82cdbc84fc0d1a49fb0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 00:31:59 -0400 Subject: [PATCH 4002/4235] Revert restored revert of ee6e4a8b Holy reverts Batman. --- modules/completion/ivy/config.el | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e3389b867..e07c7db23 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -93,17 +93,7 @@ immediately runs it on the current candidate (ending the ivy session)." (colplist (plist-get plist :columns)) (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) (when switch-buffer-alist - (setcar switch-buffer-alist '+ivy-rich-buffer-name))) - - (defun +ivy*rich-counsel-function-docstring (candidate) - (let ((doc (replace-regexp-in-string - ":\\(\\(before\\|after\\)\\(-\\(whilte\\|until\\)\\)?\\|around\\|override\\|\\(filter-\\(args\\|return\\)\\)\\) advice:[ ]*‘.+?’[\r\n]+" - "" - (or (ignore-errors (documentation (intern-soft candidate))) "")))) - (if (string-match "^\\(.+\\)\\([\r\n]\\)?" doc) - (setq doc (match-string 1 doc)) - ""))) - (advice-add #'ivy-rich-counsel-function-docstring :override #'+ivy*rich-counsel-function-docstring)) + (setcar switch-buffer-alist '+ivy-rich-buffer-name)))) (def-package! counsel From 90f36bceff8fe836008c22a7f2b606ee74fc7915 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 14:24:04 -0400 Subject: [PATCH 4003/4235] Undo 1f23eecd: un-homogenize TAB/RET/ESC This is more trouble than its worth. Better to deal with the old edge cases than the new ones this causes. Addresses #1218 --- modules/config/default/+evil-bindings.el | 82 +++++++++++++----------- modules/config/default/config.el | 11 +--- modules/lang/org/config.el | 6 +- 3 files changed, 49 insertions(+), 50 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 03512a7ad..e929ac74d 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -44,12 +44,6 @@ (fboundp 'evilmi-jump-items) 'evilmi-jump-items) - ;; Smarter RET in normal mode - :n "RET" (general-predicate-dispatch nil - (and (bound-and-true-p flyspell-mode) - (+flyspell-correction-at-point-p)) - 'flyspell-correct-word-generic) - ;; Smarter newlines :i [remap newline] #'newline-and-indent ; auto-indent on newline :i "C-j" #'+default/newline ; default behavior @@ -211,6 +205,7 @@ :m "[S" #'flyspell-correct-previous-word-generic (:map flyspell-mouse-map "RET" #'flyspell-correct-word-generic + [return] #'flyspell-correct-word-generic [mouse-1] #'flyspell-correct-word-generic)) (:when (featurep! :tools flycheck) @@ -218,11 +213,12 @@ :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)) + :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 + :n [return] #'flycheck-error-list-goto-error)) (:when (featurep! :feature workspaces) :n "gt" #'+workspace/switch-right @@ -271,6 +267,7 @@ ((featurep! :completion ivy) #'counsel-company)) "C-SPC" #'company-complete-common "TAB" #'company-complete-common-or-cycle + [tab] #'company-complete-common-or-cycle [backtab] #'company-select-previous) (:map company-search-map ; applies to `company-filter-map' too "C-n" #'company-select-next-or-abort @@ -280,7 +277,9 @@ "C-s" (λ! (company-search-abort) (company-filter-candidates)) "ESC" #'company-search-abort) ;; TAB auto-completion in term buffers - :map comint-mode-map "TAB" #'company-complete)) + (:map comint-mode-map + "TAB" #'company-complete + [tab] #'company-complete))) (:when (featurep! :completion ivy) (:map (help-mode-map helpful-mode-map) @@ -320,6 +319,7 @@ "C-b" #'backward-word ;; Swap TAB and C-z "TAB" #'helm-execute-persistent-action + [tab] #'helm-execute-persistent-action "C-z" #'helm-select-action) (:after swiper-helm :map swiper-helm-keymap [backtab] #'helm-ag-edit) @@ -355,29 +355,31 @@ (:when (featurep! :ui neotree) :after neotree :map neotree-mode-map - :n "g" nil - :n "TAB" #'neotree-quick-look - :n "RET" #'neotree-enter - :n "DEL" #'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) + :n "g" nil + :n "TAB" #'neotree-quick-look + :n "RET" #'neotree-enter + :n [tab] #'neotree-quick-look + :n [return] #'neotree-enter + :n "DEL" #'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) (:when (featurep! :ui popup) :n "C-`" #'+popup/toggle @@ -425,9 +427,10 @@ :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) + "M-d" #'evil-multiedit-match-and-next + "M-D" #'evil-multiedit-match-and-prev + "RET" #'evil-multiedit-toggle-or-restrict-region + [return] #'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))) @@ -459,7 +462,8 @@ (:when (featurep! :tools gist) :after gist :map gist-list-menu-mode-map - :n "RET" #'+gist/open-current + :n "RET" #'+gist/open-current + :n [return] #'+gist/open-current :n "b" #'gist-browse-current-url :n "c" #'gist-add-buffer :n "d" #'gist-kill-current diff --git a/modules/config/default/config.el b/modules/config/default/config.el index b545692ed..76cd083f9 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -33,13 +33,6 @@ ;; This section is dedicated to "fixing" certain keys so that they behave ;; sensibly (and consistently with similar contexts). -(defun +default|init-input-decode-map () - "Ensure TAB and [tab] are treated the same in TTY Emacs." - (define-key input-decode-map [tab] (kbd "TAB")) - (define-key input-decode-map [return] (kbd "RET")) - (define-key input-decode-map [escape] (kbd "ESC"))) -(add-hook 'tty-setup-hook #'+default|init-input-decode-map) - ;; Consistently use q to quit windows (after! tabulated-list (define-key tabulated-list-mode-map "q" #'quit-window)) @@ -76,8 +69,8 @@ :g "s-/" (λ! (save-excursion (comment-line 1))) :n "s-/" #'evil-commentary-line :v "s-/" #'evil-commentary - :gni "s-RET" #'+default/newline-below - :gni "s-S-RET" #'+default/newline-above + :gni [s-return] #'+default/newline-below + :gni [S-s-return] #'+default/newline-above :gi [s-backspace] #'doom/backward-kill-to-bol-and-indent :gi [s-left] #'doom/backward-to-bol-or-indent :gi [s-right] #'doom/forward-to-last-non-comment-or-eol diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index c3b042bd5..07e0bb357 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -386,8 +386,10 @@ between the two." :ni "C-S-k" #'org-metaup :ni "C-S-j" #'org-metadown ;; more intuitive RET keybinds - :i "RET" #'org-return-indent - :n "RET" #'+org/dwim-at-point + :i [return] #'org-return-indent + :i "RET" #'org-return-indent + :n [return] #'+org/dwim-at-point + :n "RET" #'+org/dwim-at-point ;; more vim-esque org motion keys (not covered by evil-org-mode) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) From 82622c2d8f516dbea061feb9970510202a073b8f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 14:27:33 -0400 Subject: [PATCH 4004/4235] Fix package.el command substitutions doom//autoremove and doom//install are more appropriate replacements for package-autoremove and package-install-selected-packages, respectively. --- core/autoload/packages.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/autoload/packages.el b/core/autoload/packages.el index 51d510d72..77fee86d9 100644 --- a/core/autoload/packages.el +++ b/core/autoload/packages.el @@ -540,8 +540,7 @@ calls." ;; Replace with Doom variants ;;;###autoload -(advice-add #'package-autoremove :override (λ! (doom-packages-autoremove current-prefix-arg))) +(advice-add #'package-autoremove :override #'doom//autoremove) ;;;###autoload -(advice-add #'package-install-selected-packages :override (λ! (doom-packages-install current-prefix-arg))) - +(advice-add #'package-install-selected-packages :override #'doom//install) From c707a966485f5a7ce09a02191c94b706af798f90 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 14:29:25 -0400 Subject: [PATCH 4005/4235] ui/modeline: use simple format for checker segment --- modules/ui/modeline/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index f22be333c..c4adbd6b3 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -14,7 +14,6 @@ doom-modeline-github nil doom-modeline-mu4e nil doom-modeline-persp-name nil - doom-modeline-checker-simple-format nil doom-modeline-minor-modes nil doom-modeline-major-mode-icon nil doom-modeline-buffer-file-name-style 'relative-from-project) From bb3f027ca26975aeb5dc493124e56576ceb89b2a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 17:13:56 -0400 Subject: [PATCH 4006/4235] Load projectile sooner in the startup process Projectile's use is so prolific in Doom that trying to lazy load it at startup is wasted breath. --- core/core-projects.el | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 193e05724..fb4d7ba33 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,8 +1,7 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile - :after-call (after-find-file dired-before-readin-hook minibuffer-setup-hook) - :commands (projectile-project-root projectile-project-name projectile-project-p) + :hook (doom-init-ui . projectile-mode) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) @@ -16,7 +15,6 @@ :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) (add-hook 'find-file-hook #'doom|init-project-mode) - (projectile-mode +1) (global-set-key [remap evil-jump-to-tag] #'projectile-find-tag) (global-set-key [remap find-tag] #'projectile-find-tag) From 8da2785141b2bac920de8198f9aa08c449021028 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 17:14:59 -0400 Subject: [PATCH 4007/4235] Remove doom-project file/dir local var support It didn't really work, and it's too Doom-specific to be useful. We'll need better heuristics. --- core/core-projects.el | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index fb4d7ba33..13e1320f0 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -14,7 +14,6 @@ :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) - (add-hook 'find-file-hook #'doom|init-project-mode) (global-set-key [remap evil-jump-to-tag] #'projectile-find-tag) (global-set-key [remap find-tag] #'projectile-find-tag) @@ -67,23 +66,10 @@ ;; ;; Project-based minor modes -(defvar-local doom-project nil - "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|init-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))))) - (cl-defmacro def-project-mode! (name &key modes files From 3e2779da39c14cec57628578ddff74e1f45f22ec Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 14 Mar 2019 18:38:51 -0400 Subject: [PATCH 4008/4235] Refactor leader/localleader keybinds - Some buffer-local commands were removed from leader binds - Some more commands were added to org's localleader - Reformatted some leader keys so that lower/upper case keys are grouped together, rather than apart. - Add SPC-s-c and SPC-s-e for creating/using temporary snippets (with auto-yasnippet). --- modules/config/default/+emacs-bindings.el | 11 ++----- modules/config/default/+evil-bindings.el | 40 ++++++++++++++--------- modules/lang/org/config.el | 14 +++++++- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 3a0690737..b6eee73a1 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -91,21 +91,16 @@ "o" nil ; we need to unbind it first as Org claims this (:prefix ("o". "org") - :desc "Do what I mean" "o" #'+org/dwim-at-point - :desc "Sync org caldav" "s" #'org-caldav-sync (:prefix ("a" . "org agenda") :desc "Agenda" "a" #'org-agenda :desc "Todo list" "t" #'org-todo-list :desc "Tags view" "m" #'org-tags-view :desc "View search" "v" #'org-search-view) + :desc "Switch org buffers" "b" #'org-switchb :desc "Capture" "c" #'org-capture :desc "Goto capture" "C" (λ! (require 'org-capture) (call-interactively #'org-capture-goto-target)) - :desc "Switch org buffers" "b" #'org-switchb - (:prefix ("e" . "org export") - :desc "Export beamer to latex" "l b" #'org-beamer-export-to-latex - :desc "Export beamer as latex" "l B" #'org-beamer-export-as-latex - :desc "Export beamer as pdf" "l P" #'org-beamer-export-to-pdf) - :desc "Link store" "l" #'org-store-link) + :desc "Link store" "l" #'org-store-link + :desc "Sync org caldav" "s" #'org-caldav-sync) (:prefix ("q" . "quit/restart") :desc "Quit Emacs" "q" #'kill-emacs diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index e929ac74d..406421bcc 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -525,10 +525,10 @@ (:when (featurep! :feature workspaces) (:prefix ("TAB" . "workspace") :desc "Display tab bar" "TAB" #'+workspace/display + :desc "Switch workspace" "." #'+workspace/switch-to :desc "New workspace" "n" #'+workspace/new :desc "Load workspace from file" "l" #'+workspace/load :desc "Save workspace to file" "s" #'+workspace/save - :desc "Switch workspace" "." #'+workspace/switch-to :desc "Delete session" "x" #'+workspace/kill-session :desc "Delete this workspace" "d" #'+workspace/delete :desc "Rename workspace" "r" #'+workspace/rename @@ -548,8 +548,6 @@ (:prefix ("b" . "buffer") :desc "Toggle narrowing" "-" #'doom/clone-and-narrow-buffer - :desc "New empty buffer" "N" #'evil-buffer-new - :desc "Sudo edit this file" "S" #'doom/sudo-this-file :desc "Previous buffer" "[" #'previous-buffer :desc "Next buffer" "]" #'next-buffer (:when (featurep! :feature workspaces) @@ -559,41 +557,44 @@ :desc "Switch buffer" "b" #'switch-to-buffer) :desc "Kill buffer" "k" #'kill-this-buffer :desc "Next buffer" "n" #'next-buffer + :desc "New empty buffer" "N" #'evil-buffer-new :desc "Kill other buffers" "o" #'doom/kill-other-buffers :desc "Previous buffer" "p" #'previous-buffer :desc "Save buffer" "s" #'save-buffer + :desc "Sudo edit this file" "S" #'doom/sudo-this-file :desc "Pop scratch buffer" "x" #'doom/open-scratch-buffer :desc "Bury buffer" "z" #'bury-buffer) (:prefix ("c" . "code") - :desc "Jump to references" "D" #'+lookup/references - :desc "Evaluate & replace region" "E" #'+eval:replace-region - :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines - :desc "Build tasks" "b" #'+eval/build + :desc "Compile project" "c" #'projectile-compile-project :desc "Jump to definition" "d" #'+lookup/definition + :desc "Jump to references" "D" #'+lookup/references :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region + :desc "Evaluate & replace region" "E" #'+eval:replace-region :desc "Format buffer/region" "f" #'+format/region-or-buffer :desc "Open REPL" "r" #'+eval/open-repl-other-window :desc "Delete trailing whitespace" "w" #'delete-trailing-whitespace + :desc "Delete trailing newlines" "W" #'doom/delete-trailing-newlines :desc "List errors" "x" #'flycheck-list-errors) (:prefix ("f" . "file") - :desc "Find file from here" "." (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file) + :desc "Find file" "." (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file) :desc "Find file in other project" ">" #'doom/browse-in-other-project :desc "Find file in project" "/" #'projectile-find-file :desc "Find file in other project" "?" #'doom/find-file-in-other-project - :desc "Browse emacs.d" "E" #'+default/browse-emacsd - :desc "Browse private config" "P" #'doom/open-private-config - :desc "Recent project files" "R" #'projectile-recentf - :desc "Delete this file" "X" #'doom/delete-this-file :desc "Find other file" "a" #'projectile-find-other-file :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig :desc "Find directory" "d" #'dired :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd + :desc "Browse emacs.d" "E" #'+default/browse-emacsd + :desc "Find file from here" "f" #'find-file :desc "Find file in private config" "p" #'doom/find-file-in-private-config + :desc "Browse private config" "P" #'doom/open-private-config :desc "Recent files" "r" #'recentf-open-files + :desc "Recent project files" "R" #'projectile-recentf :desc "Save file" "s" #'save-buffer :desc "Sudo find file" "S" #'doom/sudo-find-file + :desc "Delete this file" "X" #'doom/delete-this-file :desc "Yank filename" "y" #'+default/yank-buffer-filename) (:prefix ("g" . "git") @@ -653,10 +654,17 @@ :desc "Open deft" "d" #'deft :desc "Find file in notes" "n" #'+default/find-in-notes :desc "Browse notes" "N" #'+default/browse-notes - :desc "Org capture" "x" #'org-capture) + :desc "Pop scratch buffer" "s" #'doom/open-scratch-buffer + :desc "Org capture" "x" #'org-capture + :desc "Org store link" "l" #'org-store-link) (:prefix ("o" . "open") - :desc "Org agenda" "a" #'org-agenda + :desc "Org agenda" "A" #'org-agenda + (:prefix ("a" . "org agenda") + :desc "Agenda" "a" #'org-agenda + :desc "Todo list" "t" #'org-todo-list + :desc "Tags search" "m" #'org-tags-view + :desc "View search" "v" #'org-search-view) :desc "Default browser" "b" #'browse-url-of-file :desc "Debugger" "d" #'+debug/open :desc "REPL" "r" #'+eval/open-repl-other-window @@ -736,7 +744,9 @@ :desc "Jump to mode snippet" "/" #'yas-visit-snippet-file :desc "Jump to snippet" "s" #'+snippets/find-file :desc "Browse snippets" "S" #'+snippets/browse - :desc "Reload snippets" "r" #'yas-reload-all)) + :desc "Reload snippets" "r" #'yas-reload-all + :desc "Create temporary snippet" "c" #'aya-create + :desc "Use temporary snippet" "e" #'aya-expand)) (:prefix ("t" . "toggle") :desc "Flyspell" "s" #'flyspell-mode diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 07e0bb357..559087b1c 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -426,13 +426,25 @@ between the two." :localleader :map org-mode-map "d" #'org-deadline + "b" #'org-switchb "t" #'org-todo + "T" #'org-todo-list + "l" #'org-store-link (:prefix ("c" . "clock") "c" #'org-clock-in "C" #'org-clock-out "g" #'org-clock-goto "G" (λ! (org-clock-goto 'select)) - "x" #'org-clock-cancel))) + "x" #'org-clock-cancel) + (:prefix ("e" . "export") + :desc "to markdown" "m" #'org-md-export-to-markdown + :desc "to markdown & open" "M" #'org-md-export-as-markdown + :desc "to reveal.js" "r" #'org-reveal-export-to-html + :desc "to reveal.js & open" "R" #'org-reveal-export-to-html-and-browse + (:prefix ("b" . "from beamer") + :desc "to latex" "l" #'org-beamer-export-to-latex + :desc "to latex & open" "L" #'org-beamer-export-as-latex + :desc "as pdf" "p" #'org-beamer-export-to-pdf)))) (defun +org|setup-hacks () From d77237a9c4bbf88ef33063ee0870f66e5857d2ea Mon Sep 17 00:00:00 2001 From: Huy Duong Date: Fri, 15 Mar 2019 10:01:43 +0700 Subject: [PATCH 4009/4235] Correct missing bindings for rspec-mode Signed-off-by: Huy Duong --- modules/lang/ruby/config.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0ca86ac83..bf4384ca3 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -126,17 +126,18 @@ :config (map! :localleader :prefix "t" - :map (rspec-verifiable-mode-map rspec-dired-mode-map) + :map (rspec-verifiable-mode-map rspec-dired-mode-map rspec-mode-map) "a" #'rspec-verify-all "r" #'rspec-rerun - :map rspec-verifiable-mode-map + :map (rspec-verifiable-mode-map rspec-mode-map) "v" #'rspec-verify "c" #'rspec-verify-continue - "f" #'rspec-verify-method "l" #'rspec-run-last-failed - "m" #'rspec-verify-matching - "t" #'rspec-toggle-spec-and-target-find-example "T" #'rspec-toggle-spec-and-target + "t" #'rspec-toggle-spec-and-target-find-example + :map rspec-verifiable-mode-map + "f" #'rspec-verify-method + "m" #'rspec-verify-matching :map rspec-mode-map "s" #'rspec-verify-single "e" #'rspec-toggle-example-pendingness From 910bfc41ccfed54fc55e5360bbbd5e85d5e42b48 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Fri, 15 Mar 2019 13:49:11 +1000 Subject: [PATCH 4010/4235] Initialize dashboard later in window-setup-hook Since bb3f027c moved `projectile-mode` into `doom-init-ui-hook`, projectile was getting initialized after the dashboard. This means for non-evil users, the `C-c p p` binding is not shown, because it's not yet loaded. --- 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 f06158d7c..555d47e0f 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -114,7 +114,7 @@ PLIST can have the following properties: return t))) #'+doom-dashboard-initial-buffer)) -(add-hook 'window-setup-hook #'+doom-dashboard|init) +(add-hook! :append 'window-setup-hook #'+doom-dashboard|init) ;; From cd3346b7ec4edd215ebf3387872b36a8c16a79b7 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Fri, 15 Mar 2019 15:02:38 +1000 Subject: [PATCH 4011/4235] Add forward/back-button bindings in help-mode --- modules/config/default/+emacs-bindings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index b6eee73a1..2aeb0c1bb 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -311,7 +311,9 @@ :map help-mode-map "o" #'ace-link-help ">" #'help-go-forward - "<" #'help-go-back) + "<" #'help-go-back + "n" #'forward-button + "p" #'backward-button) (:after helpful :map helpful-mode-map "o" #'ace-link-help) From de2d6815677ca91e68a2089243ca6d7b4428f6f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Mar 2019 01:36:57 -0400 Subject: [PATCH 4012/4235] Initialize dashboard on doom-init-ui-hook --- 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 555d47e0f..0c2fb29ef 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -114,7 +114,7 @@ PLIST can have the following properties: return t))) #'+doom-dashboard-initial-buffer)) -(add-hook! :append 'window-setup-hook #'+doom-dashboard|init) +(add-hook 'doom-init-ui-hook #'+doom-dashboard|init) ;; From a37e1922da380e3c7931fd406cfb64d5ddd2d97f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Mar 2019 01:48:29 -0400 Subject: [PATCH 4013/4235] ui/treemacs: fix tab/ret keybinds in evil treemacs Fixes #1257 --- modules/ui/treemacs/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/ui/treemacs/config.el b/modules/ui/treemacs/config.el index 1d90509c8..b45958886 100644 --- a/modules/ui/treemacs/config.el +++ b/modules/ui/treemacs/config.el @@ -29,7 +29,12 @@ (def-package! treemacs-evil :when (featurep! :feature evil +everywhere) - :after treemacs) + :after treemacs + :config + (define-key! evil-treemacs-state-map + [return] #'treemacs-RET-action + [tab] #'treemacs-TAB-action + "TAB" #'treemacs-TAB-action)) (def-package! treemacs-projectile From 1081095a645621903238754a7eab90389375e6ab Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Fri, 15 Mar 2019 15:59:41 +1000 Subject: [PATCH 4014/4235] Initialize dashboard later on doom-init-ui-hook --- 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 0c2fb29ef..cfaa23df9 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -114,7 +114,7 @@ PLIST can have the following properties: return t))) #'+doom-dashboard-initial-buffer)) -(add-hook 'doom-init-ui-hook #'+doom-dashboard|init) +(add-hook 'doom-init-ui-hook #'+doom-dashboard|init 'append) ;; From 93d2a2212d38517104c207b95f8757ed77555e43 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Mar 2019 13:30:52 -0400 Subject: [PATCH 4015/4235] Restore projectile's :after-call If users open Emacs with a file argument, projectile will need to load sooner. --- core/core-projects.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-projects.el b/core/core-projects.el index 13e1320f0..6eb525ac2 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,6 +1,7 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile + :after-call (after-find-file dired-before-readin-hook) :hook (doom-init-ui . projectile-mode) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") From 784ae418da2f3c9dc85547bcb3b811914d11b1ee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Mar 2019 16:15:17 -0400 Subject: [PATCH 4016/4235] Fix wrong-type-argument on +emacs-lisp-eval When using +eval commands in file-less buffers, like the scratch buffer. --- 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 59847ec3d..e85c851ff 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -10,7 +10,7 @@ to a pop up buffer." (require 'pp) (let ((result (let ((debug-on-error t) - (doom--current-module (doom-module-from-path buffer-file-name))) + (doom--current-module (ignore-errors (doom-module-from-path buffer-file-name)))) (eval (read (concat "(progn " (buffer-substring-no-properties beg end) From d44c80c56527248edc093301f953a18541290ab7 Mon Sep 17 00:00:00 2001 From: yuhan0 Date: Sat, 16 Mar 2019 14:12:20 +0800 Subject: [PATCH 4017/4235] Update evil-mc "gzu" and "gzq" bindings --- modules/config/default/+evil-bindings.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 406421bcc..f5ce134b5 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -409,8 +409,9 @@ :nv "N" #'evil-mc-make-and-goto-last-cursor :nv "p" #'evil-mc-make-and-goto-prev-cursor :nv "P" #'evil-mc-make-and-goto-first-cursor + :nv "q" #'evil-mc-undo-all-cursors :nv "t" #'+multiple-cursors/evil-mc-toggle-cursors - :nv "u" #'evil-mc-undo-all-cursors + :nv "u" #'evil-mc-undo-last-added-cursor :nv "z" #'+multiple-cursors/evil-mc-make-cursor-here) (:after evil-mc :map evil-mc-key-map From b89f7e1127f9898f387e9fbe0caba996b8c4a809 Mon Sep 17 00:00:00 2001 From: yuhan0 Date: Sat, 16 Mar 2019 14:13:47 +0800 Subject: [PATCH 4018/4235] Disable evil-mc bar cursor on Mac OS and Windows --- modules/editor/multiple-cursors/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/editor/multiple-cursors/config.el b/modules/editor/multiple-cursors/config.el index 687a35b87..86ec2bb0c 100644 --- a/modules/editor/multiple-cursors/config.el +++ b/modules/editor/multiple-cursors/config.el @@ -17,6 +17,7 @@ (defvar evil-mc-key-map (make-sparse-keymap)) :config (global-evil-mc-mode +1) + (setq evil-mc-enable-bar-cursor (not (or IS-MAC IS-WINDOWS))) (after! smartparens ;; Make evil-mc cooperate with smartparens better From a086e6967e2bd4a3b62df23b6c04e4fa7c2b7021 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Sun, 17 Mar 2019 00:45:23 +1000 Subject: [PATCH 4019/4235] Fixes for doom/kill-this-buffer-in-all-windows This was erroring when run inside a popup (eg. `M-x ielm` `C-x k`) due to a missing check for `window-live-p`. We don't need to do anything if the window has already gone away. The real vs unreal check was backwards; we should only try `previous-buffer` if the current buffer is *not* real. --- core/autoload/buffers.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 2d0002714..8889e3b78 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -251,7 +251,8 @@ If DONT-SAVE, don't prompt to save modified buffers (discarding their changes)." (set-buffer-modified-p nil))) (kill-buffer buffer) (cl-loop for win in windows - if (doom-real-buffer-p (window-buffer win)) + if (and (window-live-p win) + (doom-unreal-buffer-p (window-buffer win))) do (with-selected-window win (previous-buffer))))) ;;;###autoload From 689a3bb4465398976366ac317c2ee063553b6800 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 15 Mar 2019 17:24:23 -0400 Subject: [PATCH 4020/4235] Remove :modules from private packages in doom/info Unnecessary bulk. --- 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 06c8164e8..cc7f177c9 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -62,7 +62,7 @@ ready to be pasted in a bug report on github." (or (ignore-errors (require 'use-package) (cl-loop for (name . plist) in (doom-find-packages :private t) - if (use-package-plist-delete (copy-sequence plist) :private) + if (use-package-plist-delete (copy-sequence plist) :modules) collect (format "%s" (cons name it)) else collect (symbol-name name))) From acf67244cac181cb6aa4e5861581e37297067520 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 14:01:26 -0400 Subject: [PATCH 4021/4235] Improve doom doctor + Bump Emacs version check to 25.3 + Fix doctor reporting missing packages that are user-disabled + Add Doom core checks for over-sized cache files (a possible cause of freezes/hangs) + Emit a backtrace from module doctor script errors + Fix doom doctor not respecting DEBUG envvar --- bin/doom-doctor | 53 +++++++++++++++++++++++++++++-------------------- core/doctor.el | 29 +++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 22 deletions(-) create mode 100644 core/doctor.el diff --git a/bin/doom-doctor b/bin/doom-doctor index ac162f863..2fe9c2241 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -4,17 +4,24 @@ ":"; [[ $VERSION == *\ 2[0-2].[0-1].[0-9] ]] && { echo "You're running $VERSION"; echo "That version is too old to run the doctor. Check your PATH"; echo; exit 2; } ":"; exec emacs --quick --script "$0"; exit 0 -;; Uses a couple simple heuristics to locate issues with your environment that -;; could interfere with running or setting up DOOM Emacs. +;; The Doom doctor is essentially one big, self-contained elisp shell script +;; that uses a series of simple heuristics to diagnose common issues on your +;; system. Issues that could intefere with Doom Emacs. +;; +;; Doom module may optionally have a doctor.el file to run their own heuristics +;; in. Doctor scripts may run in versions of Emacs as old as Emacs 23, so you +;; are limited to very basic standard library calls (e.g. avoid cl, subr-x, and +;; any Doom dependencies). -;; In case it isn't defined (in really old versions of Emacs, like the one that -;; ships with MacOS). +;; In really old versions of Emacs `user-emacs-directory' isn't defined (defvar user-emacs-directory (expand-file-name "../" (file-name-directory load-file-name))) (unless (file-directory-p user-emacs-directory) (error "Couldn't find a Doom config!")) (unless noninteractive (error "This script must not be run from an interactive session.")) +(when (getenv "DEBUG") + (setq debug-on-error t)) (require 'pp) @@ -117,10 +124,10 @@ ;; --- is emacs set up properly? ------------------------------ -(when (version< emacs-version "25.1") +(when (version< emacs-version "25.3") (error! "Important: Emacs %s detected [%s]" emacs-version (executable-find "emacs")) (explain! - "DOOM only supports >= 25.1. Perhaps your PATH wasn't set up properly." + "DOOM only supports >= 25.3. Perhaps your PATH wasn't set up properly." (when (eq system-type 'darwin) (concat "\nMacOS users should use homebrew (https://brew.sh) to install Emacs\n" " brew install emacs --with-modules --with-imagemagick --with-cocoa")))) @@ -166,7 +173,7 @@ font font-dest) (explain! "You can install it by running `M-x all-the-icons-install-fonts' within Emacs.\n\n" "This could also mean you've installed them in non-standard locations, in which " - "case, ignore this warning.")))))) + "case feel free to ignore this warning.")))))) ;; gnutls-cli & openssl (section! "Checking gnutls/openssl...") @@ -289,6 +296,9 @@ (or (cdr-safe ex) (car ex))) (setq doom-modules nil))) +(section! "Checking Doom core for irregularities...") +(load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage) + (when (bound-and-true-p doom-modules) (section! "Checking your enabled modules...") (let ((indent 4)) @@ -296,22 +306,21 @@ (maphash (lambda (key plist) (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) - (condition-case ex + (condition-case-unless-debug ex (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) - (packages-file (doom-module-path (car key) (cdr key) "packages.el")) - doom-packages) - (when (or (file-exists-p doctor-file) - (file-exists-p packages-file)) - (let ((doom--stage 'packages)) - (when (load packages-file t t) - (cl-loop for (name . plist) in doom-packages - unless (or (doom-package-prop name :disable) - (doom-package-prop name :ignore t) - (package-built-in-p name) - (package-installed-p name)) - do (error! "%s is not installed" name))) - (let ((doom--stage 'doctor)) - (load doctor-file t t))))) + (packages-file (doom-module-path (car key) (cdr key) "packages.el"))) + (cl-loop with doom--stage = 'packages + for name in (let (doom-packages + doom-disabled-packages) + (load packages-file 'noerror 'nomessage) + (mapcar #'car doom-packages)) + unless (or (doom-package-prop name :disable) + (doom-package-prop name :ignore t) + (package-built-in-p name) + (package-installed-p name)) + do (error! "%s is not installed" name)) + (let ((doom--stage 'doctor)) + (load doctor-file 'noerror 'nomessage))) (file-missing (error! "%s" (error-message-string ex))) (error (error! "Syntax error: %s" ex))))) doom-modules))) diff --git a/core/doctor.el b/core/doctor.el new file mode 100644 index 000000000..8487cf324 --- /dev/null +++ b/core/doctor.el @@ -0,0 +1,29 @@ +;;; core/doctor.el -*- lexical-binding: t; -*- + +(defun file-size (file &optional dir) + (setq file (expand-file-name file dir)) + (when (file-exists-p file) + (/ (nth 7 (file-attributes file)) + 1024.0))) + +;; Check for oversized problem files in cache that may cause unusual/tremendous +;; delays or freezing. This shouldn't happen often. +(dolist (file (list "savehist" + "projectile.cache")) + (let* ((path (expand-file-name file doom-core-dir)) + (size (file-size path))) + (when (and (numberp size) (> size 2000)) + (warn! "%s is too large (%.02fmb). This may cause freezes or odd startup delays" + (file-relative-name path doom-core-dir) + (/ size 1024)) + (explain! "Consider deleting it from your system (manually)")))) + +(when! (not (executable-find "fd")) + (warn! "Couldn't find the `fd' binary; project file searches will be slightly slower")) + +(let ((default-directory "~")) + (require 'projectile) + (when! (cl-find-if #'projectile-file-exists-p projectile-project-root-files-bottom-up) + (warn! "Your $HOME is recognized as a project root") + (explain! "Doom will disable bottom-up root search, which may reduce the accuracy of project\n" + "detection."))) From c9e3facb38d76b3935cf29ca6d5fac833e58f381 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 14:20:07 -0400 Subject: [PATCH 4022/4235] Revert bb3f027c After more testing (along with 1ce2b291), projectile can, in fact, be deferred until after startup. --- core/core-projects.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 6eb525ac2..d6c0b0bc1 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,8 +1,8 @@ ;;; core-projects.el -*- lexical-binding: t; -*- (def-package! projectile - :after-call (after-find-file dired-before-readin-hook) - :hook (doom-init-ui . projectile-mode) + :after-call (after-find-file dired-before-readin-hook minibuffer-setup-hook) + :commands (projectile-project-root projectile-project-name projectile-project-p) :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) @@ -15,6 +15,7 @@ :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) + (projectile-mode +1) (global-set-key [remap evil-jump-to-tag] #'projectile-find-tag) (global-set-key [remap find-tag] #'projectile-find-tag) From 7fd1497e88a2e3a6e54566124a85ddc2beeac1b5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 23:49:58 -0400 Subject: [PATCH 4023/4235] Ask to install all-the-icons fonts in doom quickstart --- core/cli/quickstart.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el index 8c89b10ec..dac3d13dd 100644 --- a/core/cli/quickstart.el +++ b/core/cli/quickstart.el @@ -60,6 +60,9 @@ packages and regenerates the autoloads file." (doom-packages-install doom-auto-accept) (print! "Regenerating autoloads files") (doom-reload-autoloads nil 'force-p) + (when (y-or-n-p "Download and install all-the-icon's fonts?") + (require 'all-the-icons) + (all-the-icons-install-fonts 'yes)) (print! (bold (green "\nFinished! Doom is ready to go!\n"))) (with-temp-buffer (doom-template-insert "QUICKSTART_INTRO") From 259590d54ef69728387d9a352d5d57ded28602c4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 23:55:56 -0400 Subject: [PATCH 4024/4235] Remove doom|protect-visible-buffer This behavior is now isolated to kill-this-buffer. --- core/autoload/buffers.el | 7 ++++--- core/core-ui.el | 7 ------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 8889e3b78..08bcc4889 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -227,9 +227,10 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original (doom-visible-buffers))) ;; if we end up back where we start (or previous-buffer ;; returns nil), we have nowhere left to go - (memq (previous-buffer) (list buf 'nil))) - (switch-to-buffer (doom-fallback-buffer)))) - (kill-buffer buf))) + (memq (switch-to-prev-buffer nil t) (list buf 'nil))) + (switch-to-buffer (doom-fallback-buffer))) + (unless (delq (selected-window) (get-buffer-window-list buf nil t)) + (kill-buffer buf))))) ((funcall orig-fn))))) diff --git a/core/core-ui.el b/core/core-ui.el index a112c6030..300bc26d9 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -121,12 +121,6 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") (setq doom-theme theme) (run-hooks 'doom-load-theme-hook))) -(defun doom|protect-visible-buffer () - "Don't kill the current buffer if it is visible in another window (bury it -instead). Meant for `kill-buffer-query-functions'." - (not (and (not (member (substring (buffer-name) 0 1) '(" " "*"))) - (delq (selected-window) (get-buffer-window-list nil nil t))))) - (defun doom|protect-fallback-buffer () "Don't kill the scratch buffer. Meant for `kill-buffer-query-functions'." (not (eq (current-buffer) (doom-fallback-buffer)))) @@ -527,7 +521,6 @@ frames, however. There's always `doom/reload-theme' if you need it!" (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook) (add-to-list 'kill-buffer-query-functions #'doom|protect-fallback-buffer nil 'eq) - (add-to-list 'kill-buffer-query-functions #'doom|protect-visible-buffer nil 'eq) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) ;; Reload theme if the display device has changed From a8532faf08bc9acbe1ff040aaac33e18adaf0d57 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 23:57:38 -0400 Subject: [PATCH 4025/4235] Improve set-popup-rule!'s signature --- modules/ui/popup/autoload/settings.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/popup/autoload/settings.el b/modules/ui/popup/autoload/settings.el index 56a092f61..ad4bead4f 100644 --- a/modules/ui/popup/autoload/settings.el +++ b/modules/ui/popup/autoload/settings.el @@ -166,7 +166,9 @@ PLIST can be made up of any of the following properties: An alist of custom window parameters. See `(elisp)Window Parameters'. If any of these are omitted, defaults derived from `+popup-defaults' will be -used." +used. + +\(fn PREDICATE &key IGNORE ACTIONS SIDE SIZE WIDTH HEIGHT SLOT VSLOT TTL QUIT SELECT MODELINE AUTOSAVE PARAMETERS)" (declare (indent defun)) (push (+popup--make predicate plist) +popup--display-buffer-alist) (when (bound-and-true-p +popup-mode) From 08c30336d2635073a2af48b69d85fdfd521ad66b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 23:58:14 -0400 Subject: [PATCH 4026/4235] Apply elisp-demos to describe-function-1 as well --- modules/lang/emacs-lisp/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 805505d3c..63faeb3bc 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -124,6 +124,7 @@ This marks a foldable marker for `outline-minor-mode' in elisp buffers.") (def-package! elisp-demos :defer t :init + (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) (advice-add 'helpful-update :after #'elisp-demos-advice-helpful-update)) From 13bac97c078cf4ec0fc4b5565a88849942b30aa9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 16 Mar 2019 23:58:43 -0400 Subject: [PATCH 4027/4235] feature/evil: update README & ex commands - Fix :sl[oad] and :ss[ave] - Disable MIA :debug +debug/run - Remove unnecessary comments --- modules/feature/evil/+commands.el | 10 +-- modules/feature/evil/README.org | 144 +++++++++++++++++++----------- 2 files changed, 96 insertions(+), 58 deletions(-) diff --git a/modules/feature/evil/+commands.el b/modules/feature/evil/+commands.el index 72ed9c464..82dedee36 100644 --- a/modules/feature/evil/+commands.el +++ b/modules/feature/evil/+commands.el @@ -66,10 +66,6 @@ buffers." ;; ;; Commands -;;; these are defined in feature/evil -;;(evil-ex-define-cmd "al[ign]" #'+evil:align) -;;(evil-ex-define-cmd "g[lobal]" #'+evil:global) - ;;; Custom commands ;; Editing (evil-ex-define-cmd "@" #'+evil:macro-on-all-lines) ; TODO Test me @@ -151,7 +147,7 @@ buffers." ;;; Project tools (evil-ex-define-cmd "compile" #'+evil:compile) (evil-ex-define-cmd "mak[e]" #'+evil:make) -(evil-ex-define-cmd "debug" #'+debug/run) +;; (evil-ex-define-cmd "debug" #'+debug/run) (evil-ex-define-cmd "er[rors]" #'flycheck-list-errors) ;;; File operations @@ -161,8 +157,8 @@ buffers." ;;; Sessions/tabs (evil-ex-define-cmd "sclear" #'+workspace/kill-session) -(evil-ex-define-cmd "sl[oad]" #'+workspace:load-session) -(evil-ex-define-cmd "ss[ave]" #'+workspace:save-session) +(evil-ex-define-cmd "sl[oad]" #'doom/quickload-session) +(evil-ex-define-cmd "ss[ave]" #'doom/quicksave-session) (evil-ex-define-cmd "tabc[lose]" #'+workspace:delete) (evil-ex-define-cmd "tabclear" #'doom/kill-all-buffers) (evil-ex-define-cmd "tabl[ast]" #'+workspace/switch-to-last) diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index b3b089d1d..b6f6bf5ed 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -4,26 +4,25 @@ #+STARTUP: inlineimages * Table of Contents :TOC_3:noexport: -- [[Description][Description]] - - [[Module Flags][Module Flags]] - - [[Plugins][Plugins]] - - [[Hacks][Hacks]] -- [[Prerequisites][Prerequisites]] -- [[Features][Features]] - - [[Ported vim plugins][Ported vim plugins]] - - [[Custom Text Objects][Custom Text Objects]] - - [[Custom Ex Commands][Custom Ex Commands]] - - [[A hybrid code-folding system][A hybrid code-folding system]] - - [[Differences from vim][Differences from vim]] -- [[Configuration][Configuration]] - - [[Removing evil-mode][Removing evil-mode]] +- [[#description][Description]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] + - [[#hacks][Hacks]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] + - [[#ported-vim-plugins][Ported vim plugins]] + - [[#custom-text-objects][Custom Text Objects]] + - [[#custom-ex-commands][Custom Ex Commands]] +- [[#configuration][Configuration]] + - [[#removing-evil-mode][Removing evil-mode]] + - [[#restoring-old-substitution-behavior-on-ss][Restoring old substitution behavior on s/S]] * Description This holy module brings the vim experience to Emacs. ** Module Flags -+ =+everywhere= Enables evilified keybinds everywhere possible, utilizing the - ~evil-collection~ plugin. ++ =+everywhere= Enables evilified keybinds everywhere possible. Uses the + [[https://github.com/emacs-evil/evil-collection][evil-collection]] plugin as a foundation. ** Plugins + [[https://github.com/emacs-evil/evil][evil]] @@ -48,10 +47,9 @@ This holy module brings the vim experience to Emacs. + When a window is split, the new window will be focused. + The o/O keys will respect and continue commented lines (can be disabled by setting ~+evil-want-o/O-to-continue-comments~ to ~nil~). -+ From visual mode, =*= and =#= will search for the current selection instead of ++ In visual mode, =*= and =#= will search for the current selection instead of the word-at-point. -+ The ~:g[lobal]~ ex command has been modified to highlight matches - incrementally. ++ The ~:g[lobal]~ ex command has been modified to highlight matches. + More of vim's filename modifiers are supported in ex commands (like ~:p~, ~:p:h~ or ~:t~) than vanilla evil-mode offers. + A custom filename modifier is available in Doom: ~:P~, which expands to the @@ -64,45 +62,77 @@ This module has no external prerequisites. ** Ported vim plugins The following vim plugins have been ported to evil: -| Vim Plugin | Emacs Plugin | Keybind(s) | -|-----------------------+--------------------------------+---------------------| -| vim-commentary | evil-commentary | omap =gc= | -| vim-easymotion | evil-easymotion | omap =gs= | -| vim-seek or vim-sneak | evil-snipe | mmap =s=/=S= | -| vim-surround | evil-embrace and evil-surround | vmap =S=, omap =ys= | +| Vim Plugin | Emacs Plugin | Keybind(s) | +|-----------------------+--------------------------------+--------------------------------------| +| vim-commentary | evil-commentary | omap =gc= | +| vim-easymotion | evil-easymotion | omap =gs= | +| vim-seek or vim-sneak | evil-snipe | mmap =s=/=S=, omap =z=/=Z= & =x=/=x= | +| vim-surround | evil-embrace and evil-surround | vmap =S=, omap =ys= | In other modules: -+ The tools/neotree & tools/treemacs modules contain a =NERDTree= equivalent. -+ The editor/multiple-cursors module contains: - + ~vim-multiedit~ => evil-multiedit - + ~vim-multiple-cursors~ => evil-mc ++ The tools/neotree & tools/treemacs modules provide a =NERDTree= equivalent. ++ The editor/multiple-cursors module contains functionality equal to the + following vim plugins: + + evil-multiedit => vim-multiedit + + evil-mc => vim-multiple-cursors ** Custom Text Objects -+ A list of new text objects: - + Blocks: ~B~ (from ~evil-textobj-anyblock~) - + Args: ~a~ (from ~evil-args~) - + Indentation: ~i~ / ~I~ / ~J~ (from ~evil-indent-plus~) +This module provides a couple extra text objects, along with the built-in ones. +For posterity, here are the built-in ones: + ++ =w W= words ++ =s= sentences ++ =p= paragraphs ++ =b= parenthesized blocks ++ =b ( ) { } [ ] < >= braces, parentheses and brackets ++ =' " `= quotes ++ =t= tags ++ =o= symbols + +And these are text objects added by this module: + ++ =B= any block delimited by braces, parentheses or backets (provided by + ~evil-textobj-anyblock~) ++ =a= C-style fucntion arguments (provided by ~evil-args~) ++ =i I J= By indentation (I includes on line above and J includes one line + below) (provided by ~evil-indent-plus~) ++ =x= XML attributes (provided by ~exato~) ** Custom Ex Commands -| Ex Command | Description | -|----------------------+----------------------------------------------------------------------------------| -| ~:al[ign][!] REGEXP~ | Align text to the first match of REGEXP. If BANG, align all matches on each line | -| ~:mv[!] NEWPATH~ | Move the current file to NEWPATH | -| ~:cp[!] NEWPATH~ | Copy the current file to NEWPATH | -| ~:rm[!] [PATH]~ | Delete the current buffer's file and buffer | - -** A hybrid code-folding system -This module combines ~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. - -** 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~). -+ =:g= will incrementally highlight buffer matches. +| Ex Command | Description | +|----------------------+--------------------------------------------------------------------------------------| +| ~:@~ | Apply macro on selected lines | +| ~:ag[!] REGEXP~ | Perform a project search with ag | +| ~:agcwd[!] REGEXP~ | Perform a project search with ag | +| ~:al[ign] REGEXP~ | Align text that matches REGEXP | +| ~:al[ign][!] REGEXP~ | Align text to the first match of REGEXP. If BANG, align all matches on each line | +| ~:cp[!] NEWPATH~ | Copy the current file to NEWPATH | +| ~:dash QUERY~ | Look up QUERY (or the symbol at point) in dash docsets | +| ~:dehtml [INPUT]~ | HTML decode selected text / inserts result if INPUT is given | +| ~:enhtml [INPUT]~ | HTML encode selected text / inserts result if INPUT is given | +| ~:grep[!]~ | Perform a project search with git-grep | +| ~:grepcwd[!]~ | Perform a project search with git-grep | +| ~:iedit REGEXP~ | Invoke iedit on all matches for REGEXP | +| ~:k[ill]all[!]~ | Kill all buffers (if BANG, affect buffer across workspaces) | +| ~:k[ill]b~ | Kill all buried buffers | +| ~:k[ill]m[!] REGEXP~ | Kill buffers whose name matches REGEXP (if BANG, affect buffers across workspaces) | +| ~:k[ill]o~ | Kill all other buffers besides the selected one | +| ~:k[ill]~ | Kill the current buffer | +| ~:lo[okup] QUERY~ | Look up QUERY on an online search engine | +| ~:mc REGEXP~ | Invoke multiple cursors on all matches for REGEXP | +| ~:mv[!] NEWPATH~ | Move the current file to NEWPATH | +| ~:na[rrow]~ | Narrow the buffer to the selection | +| ~:pad~ | Open a scratch pad for running code quickly | +| ~:pt[!]~ | Perform a project search with pt | +| ~:ptcwd[!]~ | Perform a project search with pt | +| ~:ral[ign] REGEXP~ | Right-align text that matches REGEXP | +| ~:repl~ | Open a REPL and/or copy the current selection to it | +| ~:retab~ | Convert indentation to the default within the selection | +| ~:rev[erse]~ | Reverse the selected lines | +| ~:rg[!]~ | Perform a project search with ripgrep | +| ~:rgcwd[!]~ | Perform a project search with rigprep | +| ~:rm[!] [PATH]~ | Delete the current buffer's file and buffer | +| ~:tcd[!]~ | Send =cd X= to tmux. X = the project root if BANG, X = ~default-directory~ otherwise | * Configuration ** Removing evil-mode @@ -125,3 +155,15 @@ ignored without evil present (and stripped out when byte-compiling). Unfortunately, since Doom was designed by a vimmer, for vimmers, little consideration into a keybinding scheme for vanilla Emacs users. + +** Restoring old substitution behavior on s/S +Doom replaces the =s= and =S= keys with the =evil-snipe= package (a port of +vim-seek/vim-sneak for 2-character versions of f/F/t/T). + +To disable evil-snipe on s/S, you can either: + +1. Disable ~evil-snipe-mode~ by adding ~(after! evil-snipe (evil-snipe-mode + -1))~ to =$DOOMDIR/config.el=, +2. Or disable =evil-snipe= completely with ~(package! evil-snipe :disable t)~ + added to =$DOOMDIR/packages.el=, but this will also disable incremental + highlighting for the f/F/t/T motions keys. From 82ef3e987b00d9853a1f024d04b85b65f6ea8165 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Mar 2019 00:16:22 -0400 Subject: [PATCH 4028/4235] Remove protect-visible-buffer tests --- core/test/test-core-ui.el | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/core/test/test-core-ui.el b/core/test/test-core-ui.el index fec4d57c6..0ace0bc73 100644 --- a/core/test/test-core-ui.el +++ b/core/test/test-core-ui.el @@ -4,32 +4,6 @@ (require 'core-ui) (describe "core/ui" - (describe "doom|protect-visible-buffer" - :var (kill-buffer-query-functions wconf a b) - (before-each - (setq a (switch-to-buffer (get-buffer-create "a")) - b (get-buffer-create "b") - kill-buffer-query-functions '(doom|protect-visible-buffer) - wconf (current-window-configuration)) - (delete-other-windows)) - - (after-each - (let (kill-buffer-query-functions kill-buffer-hook) - (kill-buffer a) - (kill-buffer b)) - (set-window-configuration wconf)) - - (it "shouldn't kill buffers that are visible in more than one window" - (with-temp-buffer-window - (switch-to-buffer a) (split-window) - (switch-to-buffer b) (split-window) - (switch-to-buffer a) - (expect (kill-buffer) :to-be nil) - - (select-window (get-buffer-window b)) - (expect (kill-buffer))))) - - (describe "doom|protect-fallback-buffer" :var (kill-buffer-query-functions a b) (before-all From 949d5ab34330acac8391e5c8187af84e0804f4bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 17 Mar 2019 23:19:55 -0400 Subject: [PATCH 4029/4235] Defer added hooks until doom-themes is loaded Fixes an issue where doom-themes-{org,neotree,treemacs}-config are called before doom-themes is loaded (which may never happen if you aren't using a doom-themes theme). --- modules/ui/doom/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/doom/config.el b/modules/ui/doom/config.el index 67f740e2b..26082e7e8 100644 --- a/modules/ui/doom/config.el +++ b/modules/ui/doom/config.el @@ -27,6 +27,7 @@ :init (unless doom-theme (setq doom-theme 'doom-one)) + :config ;; improve integration w/ org-mode (add-hook 'doom-load-theme-hook #'doom-themes-org-config) ;; more Atom-esque file icons for neotree/treemacs From 5e3c8c5f92ad724401f604802723467258de75b3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 18 Mar 2019 01:08:59 -0400 Subject: [PATCH 4030/4235] lang/javascript: fix documentation lookup Due to how tide-documentation-at-point is designed, it isn't compatible with lookup handlers. A better solution is needed. --- modules/lang/javascript/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index c31ae716f..a4b46b448 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -160,14 +160,15 @@ ;; navigation (set-lookup-handlers! 'tide-mode :async t :definition #'tide-jump-to-definition - :references #'tide-references - :documentation #'tide-documentation-at-point) + :references #'tide-references) ;; resolve to `doom-project-root' if `tide-project-root' fails (advice-add #'tide-project-root :override #'+javascript*tide-project-root) ;; cleanup tsserver when no tide buffers are left (add-hook! 'tide-mode-hook (add-hook 'kill-buffer-hook #'+javascript|cleanup-tide-processes nil t)) + (define-key tide-mode-map [remap +lookup/documentation] #'tide-documentation-at-point) + (map! :localleader :map tide-mode-map "R" #'tide-restart-server From 76f98043f16489277c32e03834722131bd2cdabc Mon Sep 17 00:00:00 2001 From: UndeadKernel Date: Mon, 18 Mar 2019 15:52:32 +0100 Subject: [PATCH 4031/4235] flyspell: allow enabling either aspell or hunspell * Previously, a user could not choose which spell checker to use. Instead, the first one found was used. * This PR adds the flags `+aspell` and `+hunspell` which allow a user to choose which spellchcker to use (even if both are installed). * Report an error if spell checking is enabled but no spell checker is found. --- modules/tools/flyspell/config.el | 61 +++++++++++++++++++------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index b80c0e54b..bb211be43 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -14,34 +14,45 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (after! ispell (setq-default ispell-dictionary "english") - (cond ((executable-find "aspell") - (setq ispell-program-name "aspell" - ispell-extra-args '("--sug-mode=ultra" "--run-together")) + (let ((no-flags (and (not (featurep! +aspell)) (not (featurep! +hunspell))))) + ;; Enable either aspell or hunspell. + ;; If no module flags are given, enable either aspell or hunspell if their + ;; ... binary is found. + ;; If one of the flags `+aspell' or `+hunspell' is given, try to only + ;; ... enable that spell checker and not the other. + (cond + ((and (or no-flags (featurep! +aspell)) + (executable-find "aspell")) + (setq ispell-program-name "aspell" + ispell-extra-args '("--sug-mode=ultra" "--run-together")) - (setq-hook! 'text-mode-hook - ispell-extra-args (remove "--run-together" ispell-extra-args)) + (setq-hook! 'text-mode-hook + ispell-extra-args (remove "--run-together" ispell-extra-args)) - (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) - (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) - (ispell-kill-ispell t) - (apply orig-fun args) - (ispell-kill-ispell t))) - (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) - (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) + (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) + (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) + (ispell-kill-ispell t) + (apply orig-fun args) + (ispell-kill-ispell t))) + (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) + (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) - ((executable-find "hunspell") - (setq ispell-program-name "hunspell" - ;; Don't use `ispell-cmd-args', it isn't respected with hunspell. - ;; Hack ispell-local-dictionary-alist instead. - ispell-dictionary-alist - `((,ispell-local-dictionary - "[[:alpha:]]" - "[^[:alpha:]]" - "[']" - nil - ("-d" ,ispell-local-dictionary) - nil - utf-8))))) + ((and (or no-flags (featurep! +hunspell)) + (executable-find "hunspell")) + (setq ispell-program-name "hunspell" + ;; Don't use `ispell-cmd-args', it isn't respected with hunspell. + ;; Hack ispell-local-dictionary-alist instead. + ispell-dictionary-alist + `((,ispell-local-dictionary + "[[:alpha:]]" + "[^[:alpha:]]" + "[']" + nil + ("-d" ,ispell-local-dictionary) + nil + utf-8)))) + + t (user-error "Spell checker not found. Either install `aspell' of `hunspell'"))) (add-to-list 'ispell-extra-args "--dont-tex-check-comments")) From 09a833338f3a2394a0049d9a9cb7a13817f05d60 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Thu, 21 Mar 2019 14:34:33 +1000 Subject: [PATCH 4032/4235] Fix +ivy-buffer-preview no longer ignoring virtuals Upstream updated `counsel--switch-buffer-update-fn` to check `ivy--virtual-buffers` instead of `ivy-use-virtual-buffers`. --- modules/completion/ivy/autoload/ivy.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index e416c7160..c05856ea0 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -35,7 +35,7 @@ temporary/special buffers in `font-lock-comment-face'." ;; Library (defun +ivy--switch-buffer-preview () - (let (ivy-use-virtual-buffers) + (let (ivy-use-virtual-buffers ivy--virtual-buffers) (counsel--switch-buffer-update-fn))) (defalias '+ivy--switch-buffer-preview-all #'counsel--switch-buffer-update-fn) From 47d09b3ef5666dcc52cb716653d274241b7a41c7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 20 Mar 2019 00:55:27 -0400 Subject: [PATCH 4033/4235] ui/popup: update README --- modules/ui/popup/README.org | 85 +++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 37 deletions(-) diff --git a/modules/ui/popup/README.org b/modules/ui/popup/README.org index 9a36b1270..3545e7f76 100644 --- a/modules/ui/popup/README.org +++ b/modules/ui/popup/README.org @@ -1,50 +1,59 @@ -#+TITLE: :feature popup +#+TITLE: :ui popup -This module provides a highly customizable popup window management system. +* Table of Contents :TOC: +- [[#description][Description]] + - [[#module-flags][Module Flags]] +- [[#prerequisites][Prerequisites]] +- [[#configuration][Configuration]] + - [[#set-popup-rule-and-set-popup-rules][~set-popup-rule!~ and ~set-popup-rules!~]] + - [[#disabling-aggressive-mode-line-hiding-in-popups][Disabling aggressive mode-line hiding in popups]] +- [[#appendix][Appendix]] + - [[#commands][Commands]] + - [[#library][Library]] + - [[#hacks][Hacks]] + +* Description +This module provides a customizable popup window management system. -#+begin_quote Not all windows are created equally. Some are less important. Some I want gone once they have served their purpose, like code output or a help buffer. Others I want to stick around, like a scratch buffer or org-capture popup. More than that, popups ought to be be the second class citizens of my editor; -spawned off to the side, discarded with the simple push of a button -(Escape/C-g), and easily restored if I want to see them again. Of course, this -system should clean up after itself and kill off buffers I mark as transient. -#+end_quote +spawned off to the side, discarded with the push of a button (e.g. =ESC= or +=C-g=), and easily restored if I want to see them again. Of course, this system +should clean up after itself and kill off buffers I mark as transient. -* Table of Contents :TOC: -- [[Configuration][Configuration]] - - [[~set-popup-rules!~][~set-popup-rules!~]] - - [[Disabling aggressive mode-line hiding in popups][Disabling aggressive mode-line hiding in popups]] -- [[Appendix][Appendix]] - - [[Commands][Commands]] - - [[Library][Library]] - - [[Hacks][Hacks]] +** Module Flags ++ =+all= Enables fallback rules to ensure all temporary/special buffers (whose + name begins with a space or asterix) are treated as popups. ++ =+defaults= Enables reasonable default popup rules for a variety of buffers. + +* Prerequisites +This module has no external prerequisites. * Configuration -** ~set-popup-rules!~ -This module has one setting for defining your own rules for popups: +** ~set-popup-rule!~ and ~set-popup-rules!~ +This module has two functions for defining your own rules for popups: #+BEGIN_SRC emacs-lisp +(set-popup-rule! PREDICATE &key IGNORE ACTIONS SIDE SIZE WIDTH HEIGHT SLOT VSLOT TTL QUIT SELECT MODELINE AUTOSAVE PARAMETERS) (set-popup-rules! &rest RULESETS) #+END_SRC -+ ~RULESETS~ consist of a function or regexp string that matches the buffer's - name, and a list of settings. See ~display-buffer~'s, - ~display-window-parameters~'s, and ~+popup-window-parameters~'s documentation - for what parameters are supported. +~PREDICATE~ is a predicate function or regexp string to match against the +buffer's name. To see what the other keywords do, check out the documentation +for ~set-popup-rule!~ (=SPC h f set-popup-rule!=). +#+begin_quote Rules are added to ~display-buffer-alist~, which instructs ~display-buffer~ calls on how to set up windows for buffers that meet certain conditions. -#+begin_quote The ~switch-to-buffer~ command (and its ~switch-to-buffer-*~ variants) are not affected by ~display-buffer-alist~. #+end_quote -Here are a couple example rules: - +e.g. #+BEGIN_SRC emacs-lisp (set-popup-rules! '(("^ \\*" :slot -1) ; fallback rule for special buffers @@ -57,25 +66,27 @@ Here are a couple example rules: #+END_SRC Omitted parameters in a ~set-popup-rules!~ will use the defaults set in -~+popup-default-alist~ and ~+popup-default-parameters~. +~+popup-defaults~. ** Disabling aggressive mode-line hiding in popups -There are two ways to go about this. You can turn on modelines by changing the -default ~'modeline~ window parameter in ~+popup-default-parameters~: +There are two ways to go about this. -#+BEGIN_SRC emacs-lisp -;; put in private/$USER/config.el -(map-put +popup-default-parameters 'modeline t) -#+END_SRC +1. Turn on modelines by changing the ~:modeline~ property in ~+popup-defaults~: -This will ensure all popups have a modeline /by default/, but allows you to override this on a per-popup basis. + #+BEGIN_SRC emacs-lisp + ;; put in private/$USER/config.el + (map-put +popup-defaults :modeline t) + #+END_SRC -*Alternatively*, you can disable modeline-hiding entirely: + This will ensure all popups have a modeline /by default/, but allows you to + override this on a per-popup basis. -#+BEGIN_SRC emacs-lisp -;; put in private/$USER/config.el -(remove-hook '+popup-buffer-mode-hook '+popup|set-modeline) -#+END_SRC +2. Disable modeline-hiding entirely: + + #+BEGIN_SRC emacs-lisp + ;; in ~/.doom.d/config.el + (remove-hook '+popup-buffer-mode-hook #'+popup|set-modeline-on-enable) + #+END_SRC * Appendix ** Commands From 5b1df6e7bb80e5929e3ab80b6e15b6547bf9a032 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 21 Mar 2019 16:56:53 -0400 Subject: [PATCH 4034/4235] Remove non-existent links in modules/README.org And correct :app's description. --- modules/README.org | 133 +++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 66 deletions(-) diff --git a/modules/README.org b/modules/README.org index 7a26494de..a660b4c6a 100644 --- a/modules/README.org +++ b/modules/README.org @@ -15,7 +15,7 @@ * :feature Broad modules that bring essential IDE functionality to Emacs. -+ [[file:feature/debugger/README.org][debugger]]: A (nigh-)universal debugger in Emacs ++ debugger: A (nigh-)universal debugger in Emacs + [[file:feature/eval/README.org][eval]]: REPL & code evaluation support for a variety of languages + [[file:feature/evil/README.org][evil]] =+everywhere=: Vim in Emacs + [[file:feature/file-templates/README.org][file-templates]]: Auto-inserted templates in blank new files @@ -27,8 +27,8 @@ Broad modules that bring essential IDE functionality to Emacs. Swappable completion modules for quickly narrowing down lists of candidates. + [[file:completion/company/README.org][company]] =+auto +childframe=: The ultimate code completion backend -+ [[file:completion/helm/README.org][helm]] =+fuzzy +childframe=: *Another* search engine for love and life -+ [[file:completion/ido/README.org][ido]]: The /other/ *other* search engine for love and life ++ helm =+fuzzy +childframe=: *Another* search engine for love and life ++ ido: The /other/ *other* search engine for love and life + [[file:completion/ivy/README.org][ivy]] =+fuzzy +childframe=: /The/ search engine for love and life * :ui @@ -39,18 +39,18 @@ Aesthetic modules that affect the Emacs interface or user experience. + [[file:ui/doom-dashboard/README.org][doom-dashboard]]: + [[file:ui/doom-quit/README.org][doom-quit]]: + [[file:ui/evil-goggles/README.org][evil-goggles]]: -+ [[file:ui/fci/README.org][fci]]: ++ fci: + [[file:ui/hl-todo/README.org][hl-todo]]: + [[file:ui/modeline/README.org][modeline]]: + [[file:ui/nav-flash/README.org][nav-flash]]: + [[file:ui/neotree/README.org][neotree]]: -+ [[file:ui/treemacs/README.org][treemacs]]: ++ treemacs: + [[file:ui/popup/README.org][popup]] =+all +defaults=: Makes temporary/disposable windows less intrusive -+ [[file:ui/pretty-code/README.org][pretty-code]]: ++ pretty-code: + [[file:ui/tabbar/README.org][tabbar]]: + [[file:ui/unicode/README.org][unicode]]: -+ [[file:ui/vc-gutter/README.org][vc-gutter]]: -+ [[file:ui/vi-tilde-fringe/README.org][vi-tilde-fringe]]: ++ vc-gutter: ++ vi-tilde-fringe: + [[file:ui/window-select/README.org][window-select]]: * :editor @@ -59,112 +59,113 @@ Modules that affect and augment your ability to write and edit text. + [[file:editor/fold/README.org][fold]]: universal code folding + [[file:editor/format/README.org][format]] =+onsave=: + [[file:editor/lispy/README.org][lispy]]: -+ [[file:editor/multiple-cursors/README.org][multiple-cursors]]: ++ multiple-cursors: + [[file:editor/parinfer/README.org][parinfer]]: -+ [[file:editor/rotate-text/README.org][rotate-text]]: ++ rotate-text: * :emacs Modules that reconfigure packages or features built into Emacs -+ [[file:emacs/dired/README.org][dired]] =+ranger +icons=: -+ [[file:emacs/electric/README.org][electric]]: -+ [[file:emacs/eshell/README.org][eshell]]: -+ [[file:emacs/imenu/README.org][imenu]]: -+ [[file:emacs/term/README.org][term]]: -+ [[file:emacs/vc/README.org][vc]]: ++ dired =+ranger +icons=: ++ electric: ++ eshell: ++ imenu: ++ term: ++ vc: * :tools Small modules that give Emacs access to external tools & services. -+ [[file:tools/ansible/README.org][ansible]]: -+ [[file:tools/docker/README.org][docker]]: ++ ansible: ++ docker: + [[file:tools/editorconfig/README.org][editorconfig]]: + [[file:tools/ein/README.org][ein]]: -+ [[file:tools/flyspell/README.org][flyspell]]: Spell checking -+ [[file:tools/flycheck/README.org][flycheck]]: Live error/warning highlights -+ [[file:tools/gist/README.org][gist]]: ++ flyspell: Spell checking ++ flycheck: Live error/warning highlights ++ gist: + [[file:tools/lsp/README.org][lsp]]: -+ [[file:tools/macos/README.org][macos]]: -+ [[file:tools/make/README.org][make]]: -+ [[file:tools/magit/README.org][magit]]: -+ [[file:tools/password-store/README.org][password-store]]: -+ [[file:tools/pdf/README.org][pdf]]: -+ [[file:tools/prodigy/README.md][prodigy]]: -+ [[file:tools/rgb/README.org][rgb]]: -+ [[file:tools/terraform/README.org][terraform]]: -+ [[file:tools/tmux/README.org][tmux]]: -+ [[file:tools/upload/README.org][upload]]: ++ macos: ++ make: ++ magit: ++ password-store: ++ pdf: ++ prodigy: ++ rgb: ++ terraform: ++ tmux: ++ upload: + [[file:tools/wakatime/README.org][wakatime]]: -+ [[file:tools/vterm/README.org][vterm]]: ++ vterm: * :lang Modules that bring support for a language or group of languages to Emacs. -+ [[file:lang/assembly/README.org][assembly]]: ++ assembly: + [[file:lang/cc/README.org][cc]] =+lsp=: -+ [[file:lang/clojure/README.org][clojure]]: -+ [[file:lang/common-lisp/README.org][common-lisp]]: ++ clojure: ++ common-lisp: + [[file:lang/coq/README.org][coq]]: -+ [[file:lang/crystal/README.org][crystal]]: ++ crystal: + [[file:lang/csharp/README.org][csharp]]: -+ [[file:lang/data/README.org][data]]: -+ [[file:lang/erlang/README.org][erlang]]: -+ [[file:lang/elixir/README.org][elixir]]: -+ [[file:lang/elm/README.org][elm]]: -+ [[file:lang/emacs-lisp/README.org][emacs-lisp]]: ++ data: ++ erlang: ++ elixir: ++ elm: ++ emacs-lisp: + [[file:lang/ess/README.org][ess]]: + [[file:lang/go/README.org][go]] =+lsp=: + [[file:lang/haskell/README.org][haskell]] =+intero +dante=: -+ [[file:lang/hy/README.org][hy]]: ++ hy: + [[file:lang/idris/README.org][idris]]: -+ [[file:lang/java/README.org][java]] =+meghanada=: ++ java =+meghanada=: + [[file:lang/javascript/README.org][javascript]] =+lsp=: -+ [[file:lang/julia/README.org][julia]]: ++ julia: + [[file:lang/latex/README.org][latex]]: -+ [[file:lang/ledger/README.org][ledger]]: -+ [[file:lang/lua/README.org][lua]]: -+ [[file:lang/markdown/README.org][markdown]]: ++ ledger: ++ lua: ++ markdown: + [[file:lang/nim/README.org][nim]]: -+ [[file:lang/nix/README.org][nix]]: ++ nix: + [[file:lang/ocaml/README.org][ocaml]] =+lsp=: + [[file:lang/org/README.org][org]] =+attach +babel +capture +export +present +ipython=: + [[file:lang/perl/README.org][perl]]: + [[file:lang/php/README.org][php]] =+lsp=: -+ [[file:lang/plantuml/README.org][plantuml]]: -+ [[file:lang/purescript/README.org][purescript]]: -+ [[file:lang/python/README.org][python]] =+lsp=: -+ [[file:lang/qt/README.org][qt]]: -+ [[file:lang/racket/README.org][racket]]: ++ plantuml: ++ purescript: ++ python =+lsp=: ++ qt: ++ racket: + [[file:lang/rest/README.org][rest]]: -+ [[file:lang/ruby/README.org][ruby]] =+lsp=: ++ ruby =+lsp=: + [[file:lang/rust/README.org][rust]] =+lsp=: -+ [[file:lang/scala/README.org][scala]]: ++ scala: + [[file:lang/sh/README.org][sh]] =+fish +lsp=: + [[file:lang/solidity/README.org][solidity]]: -+ [[file:lang/swift/README.org][swift]]: -+ [[file:lang/web/README.org][web]] =+lsp=: -+ [[file:lang/vala/README.org][vala]]: ++ swift: ++ web =+lsp=: ++ vala: * :app -Large, opinionated modules that transform and take over Emacs to serve +Large, opinionated modules that transform and take over Emacs, i.e. +Doom-specific porcelains. -+ [[file:app/calendar/README.org][calendar]]: ++ calendar: + [[file:app/email/README.org][email]] =+gmail=: + [[file:app/irc/README.org][irc]]: -+ [[file:app/regex/README.org][regex]]: -+ [[file:app/rss/README.org][rss]] =+org=: -+ [[file:app/twitter/README.org][twitter]]: ++ regex: ++ rss =+org=: ++ twitter: + [[file:app/write/README.org][write]] =+wordnut +langtool=: * :collab Modules that enable collaborative programming over the internet. -+ [[file:collab/floobits/README.org][floobits]]: -+ [[file:collab/impatient-mode/README.org][impatient-mode]]: ++ floobits: ++ impatient-mode: * :config Modules that configure Emacs one way or another, or focus on making it easier for you to customize it yourself. -+ [[file:config/literate/README.org][literate]]: ++ literate: + [[file:config/default/README.org][default]] =+bindings +smartparens=: From 5e88c23411dec4073c23a35dc946139db1e60e19 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Mar 2019 00:31:20 -0400 Subject: [PATCH 4035/4235] Add evil jumplist support to org-open-at-point --- modules/lang/org/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 559087b1c..9632f266b 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -76,6 +76,7 @@ (add-hook 'org-load-hook #'+org|setup-evil-keybinds) (add-hook 'evil-org-mode-hook #'evil-normalize-keymaps) :config + (add-hook 'org-open-at-point-functions #'evil-set-jump) ;; change `evil-org-key-theme' instead (advice-add #'evil-org-set-key-theme :override #'ignore) (def-package! evil-org-agenda From a934ade46e6298fb10a14a81af97e5d4e4f60287 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Mar 2019 00:32:30 -0400 Subject: [PATCH 4036/4235] feature/evil: update removal section in readme --- modules/feature/evil/README.org | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index b6f6bf5ed..a39ad4af9 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -139,22 +139,29 @@ And these are text objects added by this module: You must do two things to remove Evil: 1. Remove =:feature evil= from =~/.doom.d/init.el=, -2. Run ~bin/doom refresh~ to clean up lingering dependencies and refresh yuor +2. Run ~doom refresh~ to clean up lingering dependencies and refresh yuor autoloads files. -3. [OPTIONAL] You may want a new ~doom-leader-alt-key~ and - ~doom-localleader-alt-key~. By default, these are bound to =M-SPC= and =M-SPC - m=. +3. [OPTIONAL] You may want to assign new values to ~doom-leader-alt-key~ and + ~doom-localleader-alt-key~. These are bound to =C-c= and =C-c l= by default. #+begin_quote Ignore ~doom-leader-key~ and ~doom-localleader-key~, they don't apply to non-evil sessions. #+end_quote -Note that evil-specific configuration and keybinds (defined with ~map!~) will be -ignored without evil present (and stripped out when byte-compiling). +Evil-specific configuration and keybindings (defined with ~map!~) will be +ignored without =:feature evil= present (and omitted when byte-compiling). -Unfortunately, since Doom was designed by a vimmer, for vimmers, little -consideration into a keybinding scheme for vanilla Emacs users. +Keep in mind that, at the time of this writing, Doom was designed by a vimmer, +for vimmers. Little consideration has been put into designing a keybind scheme +for vanilla Emacs users (though it's being worked on!). + +That means that much of Doom's functionality will be orphaned in an evil-less +setup. You'll have to set your own keybinds. + +I suggest studying [[file:../../config/default/+emacs-bindings.el][config/default/+emacs-bindings.el]] to see what keybinds are +available for non-evil users. Otherwise, you may find inspiration [[file:../../../docs/example_configs.org][on the example +Doom configurations page]]. ** Restoring old substitution behavior on s/S Doom replaces the =s= and =S= keys with the =evil-snipe= package (a port of From d7e9b47266adc57787b7145e8b925bc572b0fff6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Mar 2019 14:11:59 -0400 Subject: [PATCH 4037/4235] Fix #1278 Refactors :after-call to not fmakunbound the transient hook function, as it may get executed multiple times before getting a chance to fully remove itself, causing void-function errors. --- core/core-modules.el | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 0542a0225..f91778076 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -248,17 +248,17 @@ non-nil, return paths of possible modules, activated or otherwise." `((fset ',fn (lambda (&rest _) (doom-log "Loading deferred package %s from %s" ',name ',fn) - (condition-case e (require ',name) + (condition-case e + (require ',name) ((debug error) (message "Failed to load deferred package %s: %s" ',name e))) - (dolist (hook (cdr (assq ',name doom--deferred-packages-alist))) - (if (functionp hook) - (advice-remove hook #',fn) - (remove-hook hook #',fn))) - (setq doom--deferred-packages-alist - (delq (assq ',name doom--deferred-packages-alist) - doom--deferred-packages-alist)) - (fmakunbound ',fn)))) + (when-let* ((deferral-list (assq ',name doom--deferred-packages-alist))) + (dolist (hook (cdr deferral-list)) + (if (functionp hook) + (advice-remove hook #',fn) + (remove-hook hook #',fn))) + (setq doom--deferred-packages-alist + (delq deferral-list doom--deferred-packages-alist)))))) (let (forms) (dolist (hook hooks forms) (push (if (functionp hook) From 9befc015bb7ea5ff413b719aba789547cc29fcbd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Mar 2019 14:13:35 -0400 Subject: [PATCH 4038/4235] Prompt to restart after doom//upgrade --- core/autoload/cli.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/cli.el b/core/autoload/cli.el index 166f68747..ec9481937 100644 --- a/core/autoload/cli.el +++ b/core/autoload/cli.el @@ -45,7 +45,9 @@ (defun doom//upgrade (&optional yes) "TODO" (interactive "P") - (doom--run "upgrade" yes)) + (doom--run "upgrade" yes) + (when (y-or-n-p "You must restart Emacs for the upgrade to take effect. Restart?") + (doom/restart-and-restore))) ;;;###autoload (defun doom//install (&optional yes) From cc20b28c263d3534d3e0111dfaaa3e65789e9947 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 22 Mar 2019 14:13:46 -0400 Subject: [PATCH 4039/4235] Restore session later on restart-and-restore So Doom has enough time to initialize before tryhing to restore the last session. --- core/autoload/sessions.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/autoload/sessions.el b/core/autoload/sessions.el index b617dedc5..1ba92fd85 100644 --- a/core/autoload/sessions.el +++ b/core/autoload/sessions.el @@ -52,7 +52,7 @@ ;;;###autoload (defun doom-restore-session-handler (&rest _) "TODO" - (doom-load-session)) + (add-hook 'window-setup-hook #'doom-load-session 'append)) ;;;###autoload (add-to-list 'command-switch-alist (cons "--restore" #'doom-restore-session-handler)) From d589f872535385e4754765098b2e0e7406c27bc1 Mon Sep 17 00:00:00 2001 From: Danny Navarro Date: Tue, 12 Mar 2019 17:50:45 +0000 Subject: [PATCH 4040/4235] Add maximize window key bindings This includes maximization for entire buffer, vertically and horizontally. --- core/autoload/ui.el | 22 ++++++++++++++++++++-- modules/config/default/+evil-bindings.el | 5 ++++- modules/lang/org/autoload/org-present.el | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/core/autoload/ui.el b/core/autoload/ui.el index f163e8019..05974196d 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -103,7 +103,7 @@ See `display-line-numbers' for what these values mean." (save-buffers-kill-emacs))) ;;;###autoload -(defun doom/window-zoom () +(defun doom/window-maximize-buffer () "Close other windows to focus on this one. Activate again to undo this. If the window changes before then, the undo expires. @@ -119,7 +119,7 @@ Alternatively, use `doom/window-enlargen'." ;;;###autoload (defun doom/window-enlargen () "Enlargen the current window to focus on this one. Does not close other -windows (unlike `doom/window-zoom') Activate again to undo." +windows (unlike `doom/window-maximize-buffer') Activate again to undo." (interactive) (setq doom--window-enlargened (if (and doom--window-enlargened @@ -143,6 +143,24 @@ windows (unlike `doom/window-zoom') Activate again to undo." (maximize-window)) t))) +;;;###autoload +(defun doom/window-maximize-horizontally () + "Delete all windows to the left and right of the current window." + (interactive) + (require 'windmove) + (save-excursion + (while (ignore-errors (windmove-left)) (delete-window)) + (while (ignore-errors (windmove-right)) (delete-window)))) + +;;;###autoload +(defun doom/window-maximize-vertically () + "Delete all windows above and below the current window." + (interactive) + (require 'windmove) + (save-excursion + (while (ignore-errors (windmove-up)) (delete-window)) + (while (ignore-errors (windmove-down)) (delete-window)))) + ;;;###autoload (defun doom/reload-font () "Reload `doom-font', `doom-variable-pitch-font', and `doom-unicode-font', if diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index f5ce134b5..1f1830370 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -95,11 +95,14 @@ "L" #'+evil/window-move-right "C-S-w" #'ace-swap-window ;; Window undo/redo + (:prefix "m" + "m" #'doom/window-maximize-buffer + "v" #'doom/window-maximize-vertically + "s" #'doom/window-maximize-horizontally) "u" #'winner-undo "C-u" #'winner-undo "C-r" #'winner-redo "o" #'doom/window-enlargen - "O" #'doom/window-zoom ;; Delete window "c" #'+workspace/close-window-or-workspace "C-C" #'ace-delete-window) diff --git a/modules/lang/org/autoload/org-present.el b/modules/lang/org/autoload/org-present.el index 45b31011f..598291052 100644 --- a/modules/lang/org/autoload/org-present.el +++ b/modules/lang/org/autoload/org-present.el @@ -44,7 +44,7 @@ ;;;###autoload (defun +org-present|init-org-tree-window () "Set up the org window for presentation." - (doom/window-zoom) + (doom/window-maximize-buffer) (let ((cwm-use-vertical-padding t) (cwm-frame-internal-border 110) (cwm-left-fringe-ratio -10) From ab93ee8e75698c8f834c73377ee6e5a4e565c6a8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 24 Mar 2019 12:35:38 -0400 Subject: [PATCH 4041/4235] feature/workspaces: don't unbind persp-activated-functions This was initially done to prevent eager-loading packages at startup, but +workspaces|init-frame happens early enough that nothing has been added to persp-activated-functions at this point anyway. Also addresses an issue where better-jumper couldn't initialize when main is created. --- modules/feature/workspaces/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index 32e15e33f..a18a57fb2 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -55,7 +55,7 @@ Uses `+workspaces-main' to determine the name of the main workspace." (unless persp-mode (persp-mode +1) (unless noninteractive - (let (persp-before-switch-functions persp-activated-functions) + (let (persp-before-switch-functions) (with-selected-frame frame ;; The default perspective persp-mode creates (`persp-nil-name') is ;; special and doesn't represent a real persp object, so buffers can't From c6daca8e949b0e855f0ea67cd544f154ca313013 Mon Sep 17 00:00:00 2001 From: xhcoding <30917129+xhcoding@users.noreply.github.com> Date: Mon, 25 Mar 2019 10:01:54 +0800 Subject: [PATCH 4042/4235] fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix Symbol’s value as variable is void: highlight-indent-guides --- modules/ui/indent-guides/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ui/indent-guides/config.el b/modules/ui/indent-guides/config.el index 202d6efa0..ec427dde4 100644 --- a/modules/ui/indent-guides/config.el +++ b/modules/ui/indent-guides/config.el @@ -13,8 +13,8 @@ (setq highlight-indent-guides-highlighter-function #'+indent-guides-for-all-but-first-column) (defun +indent-guides|disable-maybe () - (when highlight-indent-guides - (highlight-indent-guides -1))) + (when highlight-indent-guides-mode + (highlight-indent-guides-mode -1))) ;; `highlight-indent-guides' breaks in `visual-line-mode' (add-hook 'visual-line-mode-hook #'+indent-guides|disable-maybe) (add-hook 'org-indent-mode-hook #'+indent-guides|disable-maybe)) From 379c01ba1e2f5f6abe8790ee877f8ff2192a7c79 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 25 Mar 2019 01:28:29 -0400 Subject: [PATCH 4043/4235] ui/modeline: fix icons in daemon-spawned frames Fix modeline icons in daemon-spawned graphical frames. We have our own mechanism for disabling all-the-icons, so we don't need doom-modeline to do it for us. However, this may cause unwanted padding in the modeline in daemon-spawned terminal frames. If it bothers you, you may prefer `doom-modeline-icon' set to `nil'. --- modules/ui/modeline/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index c4adbd6b3..77680164e 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -17,6 +17,14 @@ doom-modeline-minor-modes nil doom-modeline-major-mode-icon nil doom-modeline-buffer-file-name-style 'relative-from-project) + + ;; Fix modeline icons in daemon-spawned graphical frames. We have our own + ;; mechanism for disabling all-the-icons, so we don't need doom-modeline to do + ;; it for us. However, this may cause unwanted padding in the modeline in + ;; daemon-spawned terminal frames. If it bothers you, you may prefer + ;; `doom-modeline-icon' set to `nil'. + (when (daemonp) + (setq doom-modeline-icon t)) :config (add-hook 'doom-modeline-mode-hook #'size-indication-mode) ; filesize in modeline (add-hook 'doom-modeline-mode-hook #'column-number-mode) ; cursor column in modeline From 115228bfc7a1dd0ebcf1f0d7cae32bb4b2a63443 Mon Sep 17 00:00:00 2001 From: Alex Iverson Date: Mon, 25 Mar 2019 14:50:41 -0600 Subject: [PATCH 4044/4235] adding a terra module. --- init.example.el | 1 + modules/lang/terra/autoload.el | 8 ++++++++ modules/lang/terra/config.el | 24 ++++++++++++++++++++++++ modules/lang/terra/packages.el | 8 ++++++++ 4 files changed, 41 insertions(+) create mode 100644 modules/lang/terra/autoload.el create mode 100644 modules/lang/terra/config.el create mode 100644 modules/lang/terra/packages.el diff --git a/init.example.el b/init.example.el index beeddd51d..d5e4f241c 100644 --- a/init.example.el +++ b/init.example.el @@ -129,6 +129,7 @@ (sh +fish) ; she sells (ba|z|fi)sh shells on the C xor ;;solidity ; do you need a blockchain? No. ;;swift ; who asked for emoji variables? + ;;terra ; Earth and Moon in alignment for performance. ;;web ; the tubes ;;vala ; GObjective-C diff --git a/modules/lang/terra/autoload.el b/modules/lang/terra/autoload.el new file mode 100644 index 000000000..0920c3e08 --- /dev/null +++ b/modules/lang/terra/autoload.el @@ -0,0 +1,8 @@ +;;; lang/terra/autoload.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +terra/open-repl () + "Open Terra REPL." + (interactive) + (terra-start-process "terra" "terra") + (pop-to-buffer terra-process-buffer)) diff --git a/modules/lang/terra/config.el b/modules/lang/terra/config.el new file mode 100644 index 000000000..44f74ee2b --- /dev/null +++ b/modules/lang/terra/config.el @@ -0,0 +1,24 @@ +;;; lang/lua/config.el -*- lexical-binding: t; -*- + +;; sp's default rules are obnoxious, so disable them +(provide 'smartparens-terra) + + +;; +;; Major modes + +(def-package! terra-mode + :defer t + :init + ;; lua-indent-level defaults to 3 otherwise. Madness. + (setq terra-indent-level tab-width) + :config + (set-lookup-handlers! 'terra-mode :documentation 'terra-search-documentation) + (set-electric! 'terra-mode :words '("else" "end")) + (set-repl-handler! 'terra-mode #'+terra/open-repl) + (set-company-backend! 'terra-mode '(company-lua company-yasnippet))) + + +;; +;; Frameworks + diff --git a/modules/lang/terra/packages.el b/modules/lang/terra/packages.el new file mode 100644 index 000000000..90115f396 --- /dev/null +++ b/modules/lang/terra/packages.el @@ -0,0 +1,8 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/lua/packages.el + +(package! terra-mode :recipe (:fetcher github :repo "StanfordLegion/terra-mode")) + +(when (featurep! :completion company) + (package! company-lua)) + From c2d0cae6a54516b6ffd321e143dd85eb24b0e3fc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Mar 2019 03:38:37 -0400 Subject: [PATCH 4045/4235] doom-project-find-file: avoid helm-projectile #1274 helm-projectile-find-file misbehaves as a workspace project-switch handler (likely because it runs asynchronously and misses the lexical value of `default-directory`), so we avoid it and use projectile-find-file directly (which still uses helm, just not the helm-projectile package). --- core/autoload/projects.el | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 157bd17b7..74a740f9b 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -86,19 +86,24 @@ they are absolute." ;;;###autoload (defun doom-project-find-file (dir) "Fuzzy-find a file under DIR." - (without-project-cache! - (let* ((default-directory (file-truename dir)) - projectile-project-root) - (call-interactively - ;; completion modules may remap this command - (or (command-remapping #'projectile-find-file) - #'projectile-find-file))))) + (unless (file-directory-p dir) + (error "Directory %S does not exist" dir)) + (let ((default-directory dir) + projectile-project-root) + (call-interactively + ;; Intentionally avoid `helm-projectile-find-file', because it runs + ;; asynchronously, and thus doesn't see the lexical `default-directory' + (if (featurep! :completion ivy) + #'counsel-projectile-find-file + #'projectile-find-file)))) ;;;###autoload (defun doom-project-browse (dir) "Traverse a file structure starting linearly from DIR." (let ((default-directory (file-truename dir))) (call-interactively - ;; completion modules may remap this command - (or (command-remapping #'find-file) - #'find-file)))) + (cond ((featurep! :completion ivy) + #'counsel-find-file) + ((featurep! :completion helm) + #'helm-find-files) + (#'find-file))))) From 2364415140f773c7e4ada17f49ef18004049507e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Mar 2019 03:42:32 -0400 Subject: [PATCH 4046/4235] Allow exec-path-from-shell config everywhere In case linux users install exec-path-from-shell themselves. However, it still won't be installed by default for anyone but Mac users. --- core/core-os.el | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/core/core-os.el b/core/core-os.el index 2f5046bbd..809c0bf27 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -19,9 +19,35 @@ ;; grokked from: http://stackoverflow.com/questions/15873346/elisp-rename-macro (advice-add #'evil-visual-update-x-selection :override #'ignore) +;; In case it is never defined: (defmacro set-env! (&rest _vars) "Inject VARS from your shell environment into Emacs.") +(when (or (daemonp) (display-graphic-p)) + ;; Syncs ns frame parameters with theme (and fixes mismatching text + ;; colr in the frame title) + (when (and IS-MAC (require 'ns-auto-titlebar nil t)) + (add-hook 'doom-load-theme-hook #'ns-auto-titlebar-mode)) + + ;; If you launch GUI Emacs from the wrong shell environment, Emacs will be + ;; gimped. This regularly happens on MacOS (or daemons started via launchctl + ;; or brew services): it runs in an isolated environment, so envvars will be + ;; wrong. That includes the PATH Emacs picks up. + ;; + ;; `exec-path-from-shell' tries to address this, but it is only set up to run + ;; for mac users. + (when (require 'exec-path-from-shell nil t) + (defun set-env! (&rest vars) + "Inject VARS from your shell environment into Emacs." + (exec-path-from-shell-copy-envs vars)) + (setq exec-path-from-shell-check-startup-files nil + exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments) + exec-path-from-shell-debug doom-debug-mode + exec-path-from-shell-variables + (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) + (exec-path-from-shell-initialize))) + + (cond (IS-MAC (setq mac-command-modifier 'super mac-option-modifier 'meta @@ -35,28 +61,7 @@ ns-use-native-fullscreen nil ;; Visit files opened outside of Emacs in existing frame, rather ;; than a new one - ns-pop-up-frames nil) - - (when (or (daemonp) (display-graphic-p)) - ;; Syncs ns frame parameters with theme (and fixes mismatching text - ;; colr in the frame title) - (when (require 'ns-auto-titlebar nil t) - (add-hook 'doom-load-theme-hook #'ns-auto-titlebar-mode)) - - ;; A known problem with GUI Emacs on MacOS (or daemons started via - ;; launchctl or brew services): it runs in an isolated - ;; environment, so envvars will be wrong. That includes the PATH - ;; Emacs picks up. `exec-path-from-shell' fixes this. - (when (require 'exec-path-from-shell nil t) - (defun set-env! (&rest vars) - "Inject VARS from your shell environment into Emacs." - (exec-path-from-shell-copy-envs vars)) - (setq exec-path-from-shell-check-startup-files nil - exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments) - exec-path-from-shell-debug doom-debug-mode - exec-path-from-shell-variables - (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) - (exec-path-from-shell-initialize)))) + ns-pop-up-frames nil)) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! From 820d77c5461f36ec168a7de48ff6d556ed5ab337 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 26 Mar 2019 03:43:23 -0400 Subject: [PATCH 4047/4235] tools/magit: bind TAB in more magit modes --- modules/tools/magit/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index 6ae496461..a939b770e 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -78,8 +78,9 @@ It is passed a user and repository name.") (evil-define-key* '(normal visual) magit-mode-map "zz" #'evil-scroll-line-to-center "%" #'magit-gitflow-popup) - ;; Don't use ESC to close magit - (evil-define-key* 'normal magit-status-mode-map [tab] #'magit-section-toggle) + (define-key! 'normal + (magit-status-mode-map magit-stash-mode-map magit-revision-mode-map) + [tab] #'magit-section-toggle) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) (when-let* ((desc (assoc (car key) evil-magit-rebase-commands-w-descriptions))) From 46a5be1e52bf7f718b5fb199244d7c72d7497113 Mon Sep 17 00:00:00 2001 From: Bryan Gilbert Date: Wed, 27 Mar 2019 14:34:30 -0400 Subject: [PATCH 4048/4235] Don't open `doom-fallback-buffer` on del workspace The `current-buffer` wasn't being updated after switching workspaces and was therefore failing the `doom-buffer-frame-predicate` check. --- modules/feature/workspaces/autoload/workspaces.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 5f10c9695..6dea52f23 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -255,7 +255,7 @@ workspace to delete." (if (+workspace-exists-p +workspace--last) +workspace--last (car (+workspace-list-names)))) - (unless (doom-buffer-frame-predicate (current-buffer)) + (unless (doom-buffer-frame-predicate (window-buffer)) (switch-to-buffer (doom-fallback-buffer)))) (t (+workspace-switch +workspaces-main t) From 2dc52bc9be810265e9c00f94374f1a0fceb427e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 00:06:10 -0400 Subject: [PATCH 4049/4235] :boom: Replace exec-path-from-shell w/ 'bin/doom env' IMPORTANT: This is a breaking update for Mac users, as your shell environment will no longer be inherited correctly (with the removal of exec-path-from-shell). The quick fix is: 'bin/doom env refresh'. Also, the set-env! autodef now does nothing (and is deprecated), be sure to remove calls to it in your config. Smaller changes: + This update also adds --no-* switches to doom quickstart + Includes general improvements to the documentation of several bin/doom commands. + Moves doom/reload* commands to core/autoload/config.el + doom/reload-project has been removed (it didn't actually do anything) The breaking change: This update adds an "envvar file" to Doom Emacs. This file is generated by `doom env refresh`, populated with variables scraped from your shell environment (from both non-interactive and interactive sessions). This file is then (inexpensively) loaded at startup, if it exists. + The file is manually generated with `doom env refresh`. + It can be regenerated automatically whenever `doom refresh` is run by running `doom env enable` (`doom env clear` will reverse this and delete the env file). + `doom quickstart` will ask if you want to auto-generate this envvar file. You won't need it if you're confident Emacs will always be started from the correct environment, however. + Your env file can be reloaded from a running Emacs session with `M-x doom/reload-env`. Note: this won't work if the Emacs session you're running it in doesn't have a correct SHELL set. i.e. don't use this to create your first env file! The idea isn't mine -- it's borrowed from Spacemacs -- and was introduced to me in #1053 by @yurimx. I was impressed with it. Prior to this, I was unhappy with exec-path-from-shell (no hate to the dev, I understand its necessity), and 'doom patch-macos' wasn't ideal for mac users (needed to be reapplied every time you update Emacs). What's more, many users (even Linux users) had to install exec-path-from-shell anyway. This solution suffers from none of their shortcomings. More reliable than patch-macos, more performant and complete than exec-path-from-shell, and easily handled by bin/doom. --- core/autoload/config.el | 79 +++++++++++++++---- core/autoload/debug.el | 3 + core/autoload/projects.el | 9 --- core/autoload/ui.el | 21 ----- core/cli/env.el | 95 ++++++++++++++++++++++ core/cli/quickstart.el | 105 +++++++++++++++---------- core/core-cli.el | 14 +++- core/core-os.el | 41 +++------- core/core.el | 12 +++ core/packages.el | 9 ++- modules/config/default/config.el | 2 +- modules/emacs/dired/config.el | 4 +- modules/emacs/term/config.el | 2 - modules/lang/go/config.el | 1 - modules/lang/python/config.el | 1 - modules/lang/ruby/config.el | 1 - modules/lang/rust/config.el | 1 - modules/tools/password-store/config.el | 1 - modules/tools/vterm/config.el | 1 - 19 files changed, 266 insertions(+), 136 deletions(-) create mode 100644 core/cli/env.el diff --git a/core/autoload/config.el b/core/autoload/config.el index 011904461..eebc23f5f 100644 --- a/core/autoload/config.el +++ b/core/autoload/config.el @@ -1,5 +1,9 @@ ;;; core/autoload/config.el -*- lexical-binding: t; -*- +;;;###autoload +(defvar doom-reloading-p nil + "TODO") + ;;;###autoload (defun doom/open-private-config () "TODO" @@ -14,25 +18,70 @@ (interactive) (doom-project-find-file doom-private-dir)) +;;;###autoload +(defun doom/open-env () + "TODO" + (interactive) + (when (and (not (file-exists-p doom-env-file)) + (y-or-n-p "User doesn't have an envvar file, generate one?")) + (doom/reload-env)) + (find-file doom-env-file)) + ;;;###autoload (defun doom/reload (&optional force-p) - "Reloads your config. This is experimental! + "Reloads your private config. -If called from a noninteractive session, this will try to communicate with a -live server (if one is found) to tell it to run this function. +This is experimental! It will try to do as `bin/doom refresh' does, but from +within this Emacs session. i.e. it reload autoloads files (if necessary), +reloads your package list, and lastly, reloads your private config.el. -If called from an interactive session, tries to reload autoloads files (if -necessary), reinistalize doom (via `doom-initialize') and reloads your private -init.el and config.el. Then runs `doom-reload-hook'." +Runs `doom-reload-hook' afterwards." (interactive "P") (require 'core-cli) - (doom-reload-autoloads force-p) - (setq load-path doom-site-load-path) - (let (doom-init-p) - (doom-initialize)) - (with-demoted-errors "PRIVATE CONFIG ERROR: %s" - (doom-initialize-modules 'force)) - (when (bound-and-true-p doom-packages) - (doom/reload-packages)) - (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook) + (let ((doom-reloading-p t)) + (when (getenv "DOOMENV") + (doom-reload-env-file 'force)) + (doom-reload-autoloads force-p) + (setq load-path doom-site-load-path) + (let (doom-init-p) + (doom-initialize)) + (with-demoted-errors "PRIVATE CONFIG ERROR: %s" + (doom-initialize-modules 'force)) + (when (bound-and-true-p doom-packages) + (doom/reload-packages)) + (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook)) (message "Finished!")) + +;;;###autoload +(defun doom/reload-env () + "Regenerates and reloads your shell environment. + +Uses the same mechanism as 'bin/doom env reload'." + (interactive) + (compile (format "%s env refresh" (expand-file-name "bin/doom" doom-emacs-dir))) + (while compilation-in-progress + (sit-for 1)) + (unless (file-readable-p doom-env-file) + (error "Failed to generate env file")) + (load-env-vars doom-env-file)) + +;;;###autoload +(defun doom/reload-font () + "Reload `doom-font', `doom-variable-pitch-font', and `doom-unicode-font', if +set." + (interactive) + (when doom-font + (set-frame-font doom-font t)) + (doom|init-fonts)) + +;;;###autoload +(defun doom/reload-theme () + "Reset the current color theme and fonts." + (interactive) + (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) + (when theme + (mapc #'disable-theme custom-enabled-themes)) + (when (and doom-theme (not (memq doom-theme custom-enabled-themes))) + (let (doom--prefer-theme-elc) + (load-theme doom-theme t))) + (doom|init-fonts))) diff --git a/core/autoload/debug.el b/core/autoload/debug.el index cc7f177c9..16c0f95d7 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -21,6 +21,7 @@ ready to be pasted in a bug report on github." "- System features: %s\n" "- Details:\n" " ```elisp\n" + " env bootstrapper: %s\n" " elc count: %s\n" " uname -a: %s\n" " modules: %s\n" @@ -36,6 +37,8 @@ ready to be pasted in a bug report on github." "n/a") (display-graphic-p) (daemonp) (bound-and-true-p system-configuration-features) + (cond ((file-exists-p doom-env-file) 'envvar-file) + ((featurep 'exec-path-from-shell) 'exec-path-from-shell)) ;; details (length (doom-files-in `(,@doom-modules-dirs ,doom-core-dir diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 74a740f9b..530deb0e0 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -28,15 +28,6 @@ they are absolute." ;; ;; Commands -;;;###autoload -(defun doom/reload-project () - "Reload the project root cache." - (interactive) - (projectile-invalidate-cache nil) - (setq-default projectile-project-root nil) - (dolist (fn projectile-project-root-files-functions) - (remhash (format "%s-%s" fn default-directory) projectile-project-root-cache))) - ;;;###autoload (defun doom/find-file-in-other-project (project-root) "Preforms `projectile-find-file' in a known project of your choosing." diff --git a/core/autoload/ui.el b/core/autoload/ui.el index 05974196d..dad427c58 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -81,18 +81,6 @@ See `display-line-numbers' for what these values mean." (`nil "disabled") (_ (symbol-name next)))))) -;;;###autoload -(defun doom/reload-theme () - "Reset the current color theme and fonts." - (interactive) - (let ((theme (or (car-safe custom-enabled-themes) doom-theme))) - (when theme - (mapc #'disable-theme custom-enabled-themes)) - (when (and doom-theme (not (memq doom-theme custom-enabled-themes))) - (let (doom--prefer-theme-elc) - (load-theme doom-theme t))) - (doom|init-fonts))) - ;;;###autoload (defun doom/delete-frame () "Delete the current frame, but ask for confirmation if it isn't empty." @@ -161,15 +149,6 @@ windows (unlike `doom/window-maximize-buffer') Activate again to undo." (while (ignore-errors (windmove-up)) (delete-window)) (while (ignore-errors (windmove-down)) (delete-window)))) -;;;###autoload -(defun doom/reload-font () - "Reload `doom-font', `doom-variable-pitch-font', and `doom-unicode-font', if -set." - (interactive) - (when doom-font - (set-frame-font doom-font t)) - (doom|init-fonts)) - ;;;###autoload (defun doom/set-frame-opacity (opacity) "Interactively change the current frame's opacity. diff --git a/core/cli/env.el b/core/cli/env.el new file mode 100644 index 000000000..55311a072 --- /dev/null +++ b/core/cli/env.el @@ -0,0 +1,95 @@ +;;; core/cli/env.el -*- lexical-binding: t; -*- + +(dispatcher! env + (let ((env-file (abbreviate-file-name doom-env-file))) + (pcase (car args) + ("refresh" + (doom-reload-env-file 'force)) + ("enable" + (setenv "DOOMENV" "1") + (print! (green "Enabling auto-reload of %S" env-file)) + (doom-reload-env-file 'force) + (print! (green "Done! `doom reload' will now refresh your envvar file."))) + ("clear" + (setenv "DOOMENV" nil) + (unless (file-exists-p env-file) + (user-error "%S does not exist to be cleared" env-file)) + (delete-file env-file) + (print! (green "Disabled envvar file by deleting %S" env-file))) + (_ + (message "No valid subcommand provided. See `doom help env`.")))) + "Manages your envvars file. + + env [SUBCOMMAND] + +Available subcommands: + + refresh Create or regenerate your envvar file + enable enable auto-reloading of your envvars file (on `doom refresh`) + clear deletes your envvar file (if it exists) and disables auto-reloading + +An envvars file (its location is controlled by the `doom-env-file' variable) +will contain a list of environment variables scraped from your shell environment +and loaded when Doom starts (if it exists). This is necessary when Emacs can't +be launched from your shell environment (e.g. on MacOS or certain app launchers +on Linux). + +To generate a file, run `doom env refresh`. If you'd like this file to be +auto-reloaded when running `doom refresh`, run `doom env enable` instead (only +needs to be run once).") + + +;; +;; Helpers + +(defvar doom-ignored-env-vars + '("DBUS_SESSION_BUS_ADDRESS" + "GPG_AGENT_INFO" + "SSH_AGENT_PID" + "SSH_AUTH_SOCK") + "Environment variables to not save in `doom-env-file'.") + +;; Borrows heavily from Spacemacs'`spacemacs//init-spacemacs-env'. +(defun doom-reload-env-file (&optional force-p) + "Generates `doom-env-file', if it doesn't exist (or FORCE-P is non-nil)." + (when (or force-p (not (file-exists-p doom-env-file))) + (with-temp-file doom-env-file + (message "%s envvars file at %S" + (if (file-exists-p doom-env-file) + "Regenerating" + "Generating") + (abbreviate-file-name doom-env-file)) + (insert + (concat + "# -*- mode: dotenv -*-\n" + "# ---------------------------------------------------------------------------\n" + "# This file was auto-generated by Doom. It contains all environment variables\n" + "# scraped from your default shell (excluding variables blacklisted in\n" + "# doom-ignored-env-vars).\n" + "#\n" + "# It is NOT safe to edit this file. Changes will be overwritten next time\n" + "# that `doom env reload` is executed. Alternatively, create your own env file\n" + "# in your DOOMDIR and load that with `(load-env-vars FILE)`.\n" + "#\n" + "# To auto-regenerate this file when `doom reload` is run, use `doom env enable'\n" + "# or set DOOMENV=1 in your shell environment/config.\n" + "# ---------------------------------------------------------------------------\n\n")) + (let ((env-point (point)) + (switches + (cond (IS-WINDOWS '("-c")) + ;; Execute twice, once in a non-interactive login shell and + ;; once in an interactive shell in order to capture all the + ;; init files possible. + ((or IS-MAC IS-LINUX) '("-lc" "-ic")))) + (executable (if IS-WINDOWS + "set" + (executable-find "env")))) + (dolist (shell-command-switch switches) + (insert (shell-command-to-string executable))) + ;; sort the environment variables + (sort-lines nil env-point (point-max)) + ;; remove adjacent duplicated lines + (delete-duplicate-lines env-point (point-max) nil t) + ;; remove ignored environment variables + (dolist (var doom-ignored-env-vars) + (flush-lines (concat "^" var "=") env-point (point-max))))))) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el index dac3d13dd..b0e78b3d1 100644 --- a/core/cli/quickstart.el +++ b/core/cli/quickstart.el @@ -1,68 +1,87 @@ ;;; core/cli/quickstart.el -*- lexical-binding: t; -*- -(dispatcher! (quickstart qs) (doom-quickstart) +(dispatcher! (quickstart qs) (apply #'doom-quickstart args) "Quickly deploy a private module and Doom. -This deploys a barebones config to ~/.doom.d. The destination can be changed -with the -p option, e.g. +This deploys a barebones config to ~/.doom.d (if it doesn't already exist). The +destination can be changed with the -p option, e.g. doom -p ~/.config/doom quickstart -This command will refuse to overwrite the private directory if it already -exists.") +Quickstart understands the following switches: + + --no-config Don't deploy dummy config to ~/.doom.d + --no-install Don't auto-install packages + --no-env Don't generate an envvars file (see `doom help env`) + --no-fonts Don't install (or prompt to install) all-the-icons fonts + +This command is idempotent and is safe to reuse.") ;; ;; Library -(defun doom-quickstart () +(defun doom-quickstart (&rest args) "Quickly deploy a private module and Doom. This deploys a barebones config to `doom-private-dir', installs all missing packages and regenerates the autoloads file." ;; Create `doom-private-dir' (let ((short-private-dir (abbreviate-file-name doom-private-dir))) - (if (file-directory-p doom-private-dir) - (print! (yellow "%s directory already exists. Skipping.") short-private-dir) - (print! "Creating %s" short-private-dir) - (make-directory doom-private-dir t) - (print! (green "Done!")) - ;; Create init.el, config.el & packages.el - (dolist (file (list (cons "init.el" - (lambda () - (insert-file-contents (expand-file-name "init.example.el" doom-emacs-dir)))) - (cons "config.el" - (lambda () - (insert (format ";;; %sconfig.el -*- lexical-binding: t; -*-\n\n" - short-private-dir) - ";; Place your private configuration here\n"))) - (cons "packages.el" - (lambda () - (insert (format ";; -*- no-byte-compile: t; -*-\n;;; %spackages.el\n\n" - short-private-dir) - ";;; Examples:\n" - ";; (package! some-package)\n" - ";; (package! another-package :recipe (:fetcher github :repo \"username/repo\"))\n" - ";; (package! builtin-package :disable t)\n"))))) - (cl-destructuring-bind (path . fn) file - (print! "Creating %s%s" short-private-dir path) - (with-temp-file (expand-file-name path doom-private-dir) - (funcall fn)) - (print! (green "Done!")))))) + (if (member "--no-config" args) + (print! (yellow "Not copying private config template, as requested")) + (if (file-directory-p doom-private-dir) + (print! (yellow "%s directory already exists. Skipping.") short-private-dir) + (print! "Creating %s" short-private-dir) + (make-directory doom-private-dir t) + (print! (green "Done!")) + + ;; Create init.el, config.el & packages.el + (dolist (file (list (cons "init.el" + (lambda () + (insert-file-contents (expand-file-name "init.example.el" doom-emacs-dir)))) + (cons "config.el" + (lambda () + (insert (format ";;; %sconfig.el -*- lexical-binding: t; -*-\n\n" + short-private-dir) + ";; Place your private configuration here\n"))) + (cons "packages.el" + (lambda () + (insert (format ";; -*- no-byte-compile: t; -*-\n;;; %spackages.el\n\n" + short-private-dir) + ";;; Examples:\n" + ";; (package! some-package)\n" + ";; (package! another-package :recipe (:fetcher github :repo \"username/repo\"))\n" + ";; (package! builtin-package :disable t)\n"))))) + (cl-destructuring-bind (path . fn) file + (print! "Creating %s%s" short-private-dir path) + (with-temp-file (expand-file-name path doom-private-dir) + (funcall fn)) + (print! (green "Done!"))))))) + ;; Ask if Emacs.app should be patched - (when IS-MAC - (message "MacOS detected") - (condition-case e - (doom-patch-macos nil (doom--find-emacsapp-path)) - (user-error (message "%s" (error-message-string e))))) + (if (member "--no-env" args) + (print! (yellow "Not generating envvars file, as requested")) + (when (or (file-exists-p doom-env-file) + (y-or-n-p "Would you like to generate an envvars file (see `doom help env` for details)?")) + (setenv "DOOMENV" "1") + (doom-reload-env-file 'force-p))) + ;; Install Doom packages - (print! "Installing plugins") - (doom-packages-install doom-auto-accept) + (if (member "--no-install" args) + (print! (yellow "Not installing plugins, as requested")) + (print! "Installing plugins") + (doom-packages-install doom-auto-accept)) + (print! "Regenerating autoloads files") (doom-reload-autoloads nil 'force-p) - (when (y-or-n-p "Download and install all-the-icon's fonts?") - (require 'all-the-icons) - (all-the-icons-install-fonts 'yes)) + + (if (member "--no-fonts" args) + (print! (yellow "Not installing fonts, as requested")) + (when (y-or-n-p "Download and install all-the-icon's fonts?") + (require 'all-the-icons) + (all-the-icons-install-fonts 'yes))) + (print! (bold (green "\nFinished! Doom is ready to go!\n"))) (with-temp-buffer (doom-template-insert "QUICKSTART_INTRO") diff --git a/core/core-cli.el b/core/core-cli.el index 52abc7ea6..8885a7ea6 100644 --- a/core/core-cli.el +++ b/core/core-cli.el @@ -107,7 +107,8 @@ best to run Doom out of ~/.emacs.d and ~/.doom.d.") (dispatcher! (doctor doc) :noop "Checks for issues with your environment & Doom config. -Also checks for missing dependencies for any enabled modules.") +Use the doctor to diagnose common problems or list missing dependencies in +enabled modules.") (dispatcher! (help h) :noop "Look up additional information about a command.") @@ -119,6 +120,7 @@ Also checks for missing dependencies for any enabled modules.") (load! "cli/autoloads") (load! "cli/byte-compile") (load! "cli/debug") +(load! "cli/env") (load! "cli/packages") (load! "cli/patch-macos") (load! "cli/quickstart") @@ -131,6 +133,8 @@ Also checks for missing dependencies for any enabled modules.") "Ensure Doom is in a working state by checking autoloads and packages, and recompiling any changed compiled files. This is the shotgun solution to most problems with doom." + (when (getenv "DOOMENV") + (doom-reload-env-file 'force)) (doom-reload-doom-autoloads force-p) (unwind-protect (progn @@ -142,7 +146,7 @@ problems with doom." (doom-byte-compile nil 'recompile))) (dispatcher! (refresh re) (doom-refresh 'force) - "Refresh Doom. Same as autoremove+install+autoloads. + "Refresh Doom. This is the equivalent of running autoremove, install, autoloads, then recompile. Run this whenever you: @@ -150,7 +154,11 @@ recompile. Run this whenever you: 1. Modify your `doom!' block, 2. Add or remove `package!' blocks to your config, 3. Add or remove autoloaded functions in module autoloaded files. - 4. Update Doom outside of Doom (e.g. with git)") + 4. Update Doom outside of Doom (e.g. with git) + +It will ensure that unneeded packages are removed, all needed packages are +installed, autoloads files are up-to-date and no byte-compiled files have gone +stale.") (provide 'core-cli) ;;; core-cli.el ends here diff --git a/core/core-os.el b/core/core-os.el index 809c0bf27..52ce8ae7a 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -1,5 +1,8 @@ ;;; core-os.el -*- lexical-binding: t; -*- +;; TODO Remove me later (deprecated) +(defmacro set-env! (&rest _)) + ;; clipboard (setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)) @@ -19,35 +22,6 @@ ;; grokked from: http://stackoverflow.com/questions/15873346/elisp-rename-macro (advice-add #'evil-visual-update-x-selection :override #'ignore) -;; In case it is never defined: -(defmacro set-env! (&rest _vars) - "Inject VARS from your shell environment into Emacs.") - -(when (or (daemonp) (display-graphic-p)) - ;; Syncs ns frame parameters with theme (and fixes mismatching text - ;; colr in the frame title) - (when (and IS-MAC (require 'ns-auto-titlebar nil t)) - (add-hook 'doom-load-theme-hook #'ns-auto-titlebar-mode)) - - ;; If you launch GUI Emacs from the wrong shell environment, Emacs will be - ;; gimped. This regularly happens on MacOS (or daemons started via launchctl - ;; or brew services): it runs in an isolated environment, so envvars will be - ;; wrong. That includes the PATH Emacs picks up. - ;; - ;; `exec-path-from-shell' tries to address this, but it is only set up to run - ;; for mac users. - (when (require 'exec-path-from-shell nil t) - (defun set-env! (&rest vars) - "Inject VARS from your shell environment into Emacs." - (exec-path-from-shell-copy-envs vars)) - (setq exec-path-from-shell-check-startup-files nil - exec-path-from-shell-arguments (delete "-i" exec-path-from-shell-arguments) - exec-path-from-shell-debug doom-debug-mode - exec-path-from-shell-variables - (nconc exec-path-from-shell-variables '("LC_CTYPE" "LC_ALL" "LANG"))) - (exec-path-from-shell-initialize))) - - (cond (IS-MAC (setq mac-command-modifier 'super mac-option-modifier 'meta @@ -61,7 +35,14 @@ ns-use-native-fullscreen nil ;; Visit files opened outside of Emacs in existing frame, rather ;; than a new one - ns-pop-up-frames nil)) + ns-pop-up-frames nil) + + ;; Syncs ns frame parameters with theme (and fixes mismatching text color + ;; in the frame title) + (when (and (or (daemonp) + (display-graphic-p)) + (require 'ns-auto-titlebar nil t)) + (add-hook 'doom-load-theme-hook #'ns-auto-titlebar-mode))) (IS-LINUX (setq x-gtk-use-system-tooltips nil ; native tooltips are ugly! diff --git a/core/core.el b/core/core.el index 1ab53ce60..a3264776e 100644 --- a/core/core.el +++ b/core/core.el @@ -76,6 +76,14 @@ XDG directory conventions if ~/.config/doom exists.") "Where `doom-reload-package-autoloads' will generate its package.el autoloads file.") +(defvar doom-env-file (concat doom-local-dir "env") + "The location of your env file, generated by `doom env refresh`. + +This file contains environment variables scraped from your non and interactive +shell environment, and is loaded at startup (if it exist)s. This is helpful if +Emacs can't (easily) be launched from the correct shell session (particular for +MacOS users).") + ;; ;; Doom core variables @@ -443,6 +451,10 @@ to least)." noninteractive) (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them")))) + ;; Load shell environment + (when (file-readable-p doom-env-file) + (load-env-vars doom-env-file)) + (require 'core-lib) (require 'core-modules) (require 'core-os) diff --git a/core/packages.el b/core/packages.el index e13d240d2..c2fc0b143 100644 --- a/core/packages.el +++ b/core/packages.el @@ -1,10 +1,13 @@ ;; -*- no-byte-compile: t; -*- ;;; core/packages.el +;; core.el +(package! load-env-vars) +(package! dotenv-mode) + ;; core-os.el -(package! xclip) -(when IS-MAC - (package! exec-path-from-shell) +(if (not IS-MAC) + (package! xclip) (package! osx-clipboard) (package! ns-auto-titlebar)) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 76cd083f9..8df99c464 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -110,7 +110,7 @@ "t" #'doom/reload-theme "p" #'doom/reload-packages "f" #'doom/reload-font - "P" #'doom/reload-project) + "e" #'doom/reload-env) "T" #'doom/toggle-profiler "V" #'set-variable "C-v" #'doom/version diff --git a/modules/emacs/dired/config.el b/modules/emacs/dired/config.el index 052bfcf66..bcfe7cc00 100644 --- a/modules/emacs/dired/config.el +++ b/modules/emacs/dired/config.el @@ -21,9 +21,7 @@ (when IS-BSD ;; Use GNU ls as `gls' from `coreutils' if available. Add `(setq ;; dired-use-ls-dired nil)' to your config to suppress the Dired warning - ;; when not using GNU ls. We must look for `gls' after - ;; `exec-path-from-shell' was initialized to make sure that `gls' is in - ;; `exec-path' + ;; when not using GNU ls. (if-let* ((gls (executable-find "gls"))) (setq insert-directory-program gls) (setq args (delete "--group-directories-first" args)) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index bc1f88337..ccaa0a858 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -6,7 +6,5 @@ ;; `term' (built-in) (after! term - (set-env! "SHELL") - (add-hook 'term-mode-hook #'doom|mark-buffer-as-real) (add-to-list 'doom-detect-indentation-excluded-modes 'term-mode nil #'eq)) diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 564aa4418..09b2a2c61 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -4,7 +4,6 @@ ;; Packages (after! go-mode - (set-env! "GOPATH" "GOROOT") (set-docsets! 'go-mode "Go") (set-repl-handler! 'go-mode #'gorepl-run) (set-lookup-handlers! 'go-mode diff --git a/modules/lang/python/config.el b/modules/lang/python/config.el index 62888bdf0..403071e64 100644 --- a/modules/lang/python/config.el +++ b/modules/lang/python/config.el @@ -18,7 +18,6 @@ called.") (setq python-environment-directory doom-cache-dir python-indent-guess-indent-offset-verbose nil) :config - (set-env! "PYTHONPATH" "PYENV_ROOT" "ANACONDA_HOME") (set-electric! 'python-mode :chars '(?:)) (set-repl-handler! 'python-mode #'+python/open-repl) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index bf4384ca3..eb251b688 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -15,7 +15,6 @@ (enh-ruby-mode) (ruby-mode))) :config - (set-env! "RBENV_ROOT") (set-electric! '(ruby-mode enh-ruby-mode) :words '("else" "end" "elsif")) (set-repl-handler! '(ruby-mode enh-ruby-mode) #'inf-ruby) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 8f3153e3e..502b0232e 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -1,7 +1,6 @@ ;;; lang/rust/config.el -*- lexical-binding: t; -*- (after! rust-mode - (set-env! "RUST_SRC_PATH") (set-docsets! 'rust-mode "Rust") (setq rust-indent-method-chain t) diff --git a/modules/tools/password-store/config.el b/modules/tools/password-store/config.el index 3ccfa5b5b..b161badae 100644 --- a/modules/tools/password-store/config.el +++ b/modules/tools/password-store/config.el @@ -25,7 +25,6 @@ ;; `pass' (after! pass - (set-env! "PASSWORD_STORE_DIR") (set-evil-initial-state! 'pass-mode 'emacs) (set-popup-rule! "^\\*Password-Store" :side 'left :size 0.25 :quit nil) (define-key! pass-mode-map diff --git a/modules/tools/vterm/config.el b/modules/tools/vterm/config.el index 900678c4a..2751cfdfe 100644 --- a/modules/tools/vterm/config.el +++ b/modules/tools/vterm/config.el @@ -5,7 +5,6 @@ :defer t :preface (setq vterm-install t) :config - (set-env! "SHELL") (set-popup-rule! "^vterm" :size 0.25 :vslot -4 :select t :quit nil :ttl 0) (add-hook 'vterm-mode-hook #'doom|mark-buffer-as-real) From 0a1de03ca1b70fd3e62de123758060c8d873a081 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 01:43:12 -0400 Subject: [PATCH 4050/4235] Remove eshell/term from dtrt excluded modes Unnecessary because their buffers don't make it through doom|detect-indentation's condition anyway. --- modules/emacs/eshell/config.el | 2 -- modules/emacs/term/config.el | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/emacs/eshell/config.el b/modules/emacs/eshell/config.el index 2665b6df9..42ed6a6ea 100644 --- a/modules/emacs/eshell/config.el +++ b/modules/emacs/eshell/config.el @@ -70,8 +70,6 @@ You should use `det-eshell-alias!' to change this.") eshell-glob-case-insensitive t eshell-error-if-no-glob t) - (add-to-list 'doom-detect-indentation-excluded-modes 'eshell-mode nil #'eq) - ;; Consider eshell buffers real (add-hook 'eshell-mode-hook #'doom|mark-buffer-as-real) diff --git a/modules/emacs/term/config.el b/modules/emacs/term/config.el index ccaa0a858..cf7b9a2b2 100644 --- a/modules/emacs/term/config.el +++ b/modules/emacs/term/config.el @@ -5,6 +5,4 @@ multi-term-switch-after-close 'PREVIOUS) ;; `term' (built-in) -(after! term - (add-hook 'term-mode-hook #'doom|mark-buffer-as-real) - (add-to-list 'doom-detect-indentation-excluded-modes 'term-mode nil #'eq)) +(add-hook 'term-mode-hook #'doom|mark-buffer-as-real) From 37525bb1bdfac1c63b8e661d8e6589a27cc74086 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 01:46:58 -0400 Subject: [PATCH 4051/4235] Fix clipboard support on Windows #1284 Windows uses UTF-16 for clipboard content. selection-coding-system is set correctly on Windows systems so we leave it to its default there. --- core/core.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index a3264776e..997dada7a 100644 --- a/core/core.el +++ b/core/core.el @@ -132,9 +132,9 @@ Doom was setup, which can cause problems.") (when (fboundp 'set-charset-priority) (set-charset-priority 'unicode)) ; pretty (prefer-coding-system 'utf-8) ; pretty -(setq selection-coding-system 'utf-8) ; pretty (setq locale-coding-system 'utf-8) ; please -(if IS-WINDOWS (set-w32-system-coding-system 'utf-8)) ; with sugar on top +(unless IS-WINDOWS + (setq selection-coding-system 'utf-8)) ; with sugar on top (setq-default ad-redefinition-action 'accept ; silence advised function warnings From b3d931d7ce21b4d8f64ff97baf7c5ec91666c854 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 01:53:15 -0400 Subject: [PATCH 4052/4235] Refactor undo-tree advice --- core/core-editor.el | 25 ++++++------------------- core/core.el | 1 + 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index 35eac8e18..c7ef92c04 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -233,32 +233,19 @@ savehist file." `(("." . ,(concat doom-cache-dir "undo-tree-hist/")))) (global-undo-tree-mode +1) - (defun doom*shut-up-undo-tree (&rest _) (message "")) - (advice-add #'undo-tree-load-history :after #'doom*shut-up-undo-tree) - ;; compress undo history with xz - (defun doom*undo-tree-make-history-save-file-name (file) - (cond ((executable-find "zstd") (concat file ".zst")) - ((executable-find "gzip") (concat file ".gz")) - (file))) - (advice-add #'undo-tree-make-history-save-file-name :filter-return - #'doom*undo-tree-make-history-save-file-name) + (and (fset 'doom*undo-tree-make-history-save-file-name + (cond ((executable-find "zstd") (lambda (file) (concat file ".zst"))) + ((executable-find "gzip") (lambda (file) (concat file ".gz"))))) + (advice-add #'undo-tree-make-history-save-file-name :filter-return + #'doom*undo-tree-make-history-save-file-name)) (defun doom*strip-text-properties-from-undo-history (&rest _) (dolist (item buffer-undo-list) (and (consp item) (stringp (car item)) (setcar item (substring-no-properties (car item)))))) - (advice-add #'undo-list-transfer-to-tree :before #'doom*strip-text-properties-from-undo-history) - - (defun doom*compress-undo-tree-history (orig-fn &rest args) - (cl-letf* ((jka-compr-verbose nil) - (old-write-region (symbol-function #'write-region)) - ((symbol-function #'write-region) - (lambda (start end filename &optional append _visit &rest args) - (apply old-write-region start end filename append 0 args)))) - (apply orig-fn args))) - (advice-add #'undo-tree-save-history :around #'doom*compress-undo-tree-history)) + (advice-add #'undo-list-transfer-to-tree :before #'doom*strip-text-properties-from-undo-history)) (def-package! command-log-mode diff --git a/core/core.el b/core/core.el index 997dada7a..1c04086b8 100644 --- a/core/core.el +++ b/core/core.el @@ -142,6 +142,7 @@ Doom was setup, which can cause problems.") auto-mode-case-fold nil autoload-compute-prefixes nil debug-on-error doom-debug-mode + jka-compr-verbose doom-debug-mode ; silence compression messages ffap-machine-p-known 'reject ; don't ping things that look like domain names find-file-visit-truename t ; resolve symlinks when opening files idle-update-delay 2 ; update ui less often From 5cdc2127be71001c05fd6b8083bba4317e77b161 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 01:59:25 -0400 Subject: [PATCH 4053/4235] Refactor config/literate module + Now recompiles literate config if you modify org files in DOOMDIR + Replaced +literate/compile with +literate/reload + Calls org-babel-tangle-file directly if org package is loaded + Change mtime check mechanism for literate tangling at startup --- modules/config/literate/autoload.el | 15 ++++++++--- modules/config/literate/init.el | 41 +++++++++++++++++------------ 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/modules/config/literate/autoload.el b/modules/config/literate/autoload.el index ecb096aa6..93880736a 100644 --- a/modules/config/literate/autoload.el +++ b/modules/config/literate/autoload.el @@ -1,7 +1,14 @@ ;;; config/literate/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +literate/compile (&optional load) - "TODO" - (interactive "P") - (+literate-compile load)) +(defalias '+literate/reload #'doom/reload) + +;;;###autoload +(defun +literate|recompile-maybe () + "Recompile config.org if we're editing an org file in our DOOMDIR. + +We assume any org file in `doom-private-dir' is connected to your literate +config, and should trigger a recompile if changed." + (when (and (eq major-mode 'org-mode) + (file-in-directory-p buffer-file-name doom-private-dir)) + (+literate-tangle 'force))) diff --git a/modules/config/literate/init.el b/modules/config/literate/init.el index ce02535b2..57133cc6d 100644 --- a/modules/config/literate/init.el +++ b/modules/config/literate/init.el @@ -4,34 +4,41 @@ (expand-file-name "config.org" doom-private-dir) "The file path of your literate config file.") -(defvar +literate-config-dest-file - (expand-file-name "config.el" doom-private-dir) +(defvar +literate-config-cache-file + (expand-file-name "literate-last-compile" doom-cache-dir) "The file path that `+literate-config-file' will be tangled to, then byte-compiled from.") ;; -(defun +literate-compile (&optional load) - "Tangles & compiles `+literate-config-file' if it has changed. If LOAD is -non-nil, load it too!" - (let ((org +literate-config-file) - (el +literate-config-dest-file)) - (when (file-newer-than-file-p org el) +(defun +literate-tangle (&optional force-p) + "Tangles `+literate-config-file' if it has changed." + (let ((default-directory doom-private-dir) + (org +literate-config-file)) + (when (or force-p (file-newer-than-file-p org +literate-config-cache-file)) (message "Compiling your literate config...") - ;; We tangle in a separate, blank process because loading it here would - ;; load all of :lang org (very expensive!). We only need ob-tangle. - (or (zerop (call-process - "emacs" nil nil nil - "-q" "--batch" "-l" "ob-tangle" "--eval" - (format "(org-babel-tangle-file \"%s\" \"%s\" \"emacs-lisp\")" - org el))) + (or (and (if (fboundp 'org-babel-tangle-file) + (org-babel-tangle-file org nil "emacs-lisp") + ;; We tangle in a separate, blank process because loading it here + ;; would load all of :lang org (very expensive!). + (zerop (call-process + "emacs" nil nil nil + "-q" "--batch" "-l" "ob-tangle" "--eval" + (format "(org-babel-tangle-file %S nil \"emacs-lisp\")" + org)))) + ;; Write the cache file to serve as our mtime cache + (with-temp-file +literate-config-cache-file t)) (warn "There was a problem tangling your literate config!")) (message "Done!")))) ;; Let 'er rip! -(+literate-compile) - +(+literate-tangle doom-reloading-p) ;; No need to load the resulting file. Doom will do this for us after all ;; modules have finished loading. + + +;; Recompile our literate config if we modify it +(after! org + (add-hook 'after-save-hook #'+literate|recompile-maybe)) From ddfcc4299c29180297baa3261d0f74d1ab696eb5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 02:01:38 -0400 Subject: [PATCH 4054/4235] bin/doom-doctor: minor refactor Also allow Doom init errors to be debugged. --- bin/doom-doctor | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 2fe9c2241..748193f75 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -213,8 +213,8 @@ ;; are certificates validated properly? (section! "Testing your root certificates...") -(cond ((not (string-match-p "\\_" system-configuration-features)) - (warn! "Warning: You didn't install Emacs with gnutls support") +(cond ((not (ignore-errors (gnutls-available-p))) + (warn! "Warning: Emacs wasn't installed with gnutls support") (explain! "This may cause 'pecular error' errors with the Doom doctor, and is likely to " "interfere with package management. Your mileage may vary." @@ -226,7 +226,7 @@ " brew install emacs-plus")))) ((not (fboundp 'url-retrieve-synchronously)) - (error! "Can't find url-retrieve-synchronously function. Are you running Emacs 24+?")) + (error! "Can't find url-retrieve-synchronously function. Are you sure you're on Emacs 24+?")) ((or (executable-find "gnutls-cli") (executable-find "openssl")) @@ -282,7 +282,7 @@ ;; --- are your modules set up properly? ---------------------- -(condition-case ex +(condition-case-unless-debug ex (let ((inhibit-message t) (after-init-time (current-time)) noninteractive) From 2f0ad0e2695d915daad062289a4b828a9b7bf146 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 02:24:19 -0400 Subject: [PATCH 4055/4235] Fix -y/--yes/YES in doom quickstart --- core/cli/quickstart.el | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el index b0e78b3d1..cc7833a15 100644 --- a/core/cli/quickstart.el +++ b/core/cli/quickstart.el @@ -62,9 +62,8 @@ packages and regenerates the autoloads file." ;; Ask if Emacs.app should be patched (if (member "--no-env" args) (print! (yellow "Not generating envvars file, as requested")) - (when (or (file-exists-p doom-env-file) - (y-or-n-p "Would you like to generate an envvars file (see `doom help env` for details)?")) - (setenv "DOOMENV" "1") + (when (or doom-auto-accept + (y-or-n-p "Generate an env file? (see `doom help env` for details)")) (doom-reload-env-file 'force-p))) ;; Install Doom packages @@ -78,7 +77,8 @@ packages and regenerates the autoloads file." (if (member "--no-fonts" args) (print! (yellow "Not installing fonts, as requested")) - (when (y-or-n-p "Download and install all-the-icon's fonts?") + (when (or doom-auto-accept + (y-or-n-p "Download and install all-the-icon's fonts?")) (require 'all-the-icons) (all-the-icons-install-fonts 'yes))) From 9b97631ddf50e34ddd8c5439e765cc0e9d6759df Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 02:25:28 -0400 Subject: [PATCH 4056/4235] Fix typo in env file template --- core/cli/env.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/cli/env.el b/core/cli/env.el index 55311a072..fa6c9f093 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -68,7 +68,7 @@ needs to be run once).") "# doom-ignored-env-vars).\n" "#\n" "# It is NOT safe to edit this file. Changes will be overwritten next time\n" - "# that `doom env reload` is executed. Alternatively, create your own env file\n" + "# that `doom env refresh` is executed. Alternatively, create your own env file\n" "# in your DOOMDIR and load that with `(load-env-vars FILE)`.\n" "#\n" "# To auto-regenerate this file when `doom reload` is run, use `doom env enable'\n" From eb1296387f145c7ccdfbf9c3e01b086e7908a332 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 13:15:08 -0400 Subject: [PATCH 4057/4235] Make load-env-vars a core package Fixes a race condition where the load-env-vars package is used before it was (or could be) installed. --- core/core-packages.el | 3 ++- core/core.el | 9 +++++---- core/packages.el | 1 - 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/core/core-packages.el b/core/core-packages.el index eac7f293a..de4376e88 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -41,7 +41,8 @@ package's name as a symbol, and whose CDR is the plist supplied to its `package!' declaration. Set by `doom-initialize-packages'.") -(defvar doom-core-packages '(persistent-soft use-package quelpa async) +(defvar doom-core-packages + '(persistent-soft use-package quelpa async load-env-vars) "A list of packages that must be installed (and will be auto-installed if missing) and shouldn't be deleted.") diff --git a/core/core.el b/core/core.el index 1c04086b8..0a75a04fc 100644 --- a/core/core.el +++ b/core/core.el @@ -450,11 +450,12 @@ to least)." (unless (or force-p (doom-initialize-autoloads doom-package-autoload-file) noninteractive) - (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them")))) + (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) - ;; Load shell environment - (when (file-readable-p doom-env-file) - (load-env-vars doom-env-file)) + ;; Load shell environment + (unless noninteractive + (when (file-readable-p doom-env-file) + (load-env-vars doom-env-file)))) (require 'core-lib) (require 'core-modules) diff --git a/core/packages.el b/core/packages.el index c2fc0b143..ad01ecc9a 100644 --- a/core/packages.el +++ b/core/packages.el @@ -2,7 +2,6 @@ ;;; core/packages.el ;; core.el -(package! load-env-vars) (package! dotenv-mode) ;; core-os.el From af37f9af58111d20ca3ee9d2b0b934f297d22308 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 13:21:37 -0400 Subject: [PATCH 4058/4235] Fix wrong-number-args error on doom env --- core/cli/env.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/cli/env.el b/core/cli/env.el index fa6c9f093..531433bb8 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -7,7 +7,7 @@ (doom-reload-env-file 'force)) ("enable" (setenv "DOOMENV" "1") - (print! (green "Enabling auto-reload of %S" env-file)) + (print! (green "Enabling auto-reload of %S") env-file) (doom-reload-env-file 'force) (print! (green "Done! `doom reload' will now refresh your envvar file."))) ("clear" @@ -15,7 +15,7 @@ (unless (file-exists-p env-file) (user-error "%S does not exist to be cleared" env-file)) (delete-file env-file) - (print! (green "Disabled envvar file by deleting %S" env-file))) + (print! (green "Disabled envvar file by deleting %S") env-file)) (_ (message "No valid subcommand provided. See `doom help env`.")))) "Manages your envvars file. From 92e604d0dc601a2dee27d74180ded99e6ca3029f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 14:32:16 -0400 Subject: [PATCH 4059/4235] config/literate: don't tangle file in this session org-babel-tangle-file has reportedly killed config.org buffers, despite them being visited. Since we're not doing anything with the return value, may as well keep it in a separate process. --- modules/config/literate/init.el | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modules/config/literate/init.el b/modules/config/literate/init.el index 57133cc6d..1062c0f61 100644 --- a/modules/config/literate/init.el +++ b/modules/config/literate/init.el @@ -18,15 +18,13 @@ byte-compiled from.") (when (or force-p (file-newer-than-file-p org +literate-config-cache-file)) (message "Compiling your literate config...") - (or (and (if (fboundp 'org-babel-tangle-file) - (org-babel-tangle-file org nil "emacs-lisp") - ;; We tangle in a separate, blank process because loading it here - ;; would load all of :lang org (very expensive!). - (zerop (call-process - "emacs" nil nil nil - "-q" "--batch" "-l" "ob-tangle" "--eval" - (format "(org-babel-tangle-file %S nil \"emacs-lisp\")" - org)))) + ;; We tangle in a separate, blank process because loading it here would + ;; load all of :lang org (very expensive!). + (or (and (zerop (call-process + "emacs" nil nil nil + "-q" "--batch" "-l" "ob-tangle" "--eval" + (format "(org-babel-tangle-file %S nil \"emacs-lisp\")" + org))) ;; Write the cache file to serve as our mtime cache (with-temp-file +literate-config-cache-file t)) (warn "There was a problem tangling your literate config!")) From 7b8a2fcff8a49d648619bbd163d06a580806c7cd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 14:47:31 -0400 Subject: [PATCH 4060/4235] Don't capture INSECURE, DEBUG & YES envvars They should be transient. --- core/cli/env.el | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/cli/env.el b/core/cli/env.el index 531433bb8..679dd4747 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -46,7 +46,11 @@ needs to be run once).") '("DBUS_SESSION_BUS_ADDRESS" "GPG_AGENT_INFO" "SSH_AGENT_PID" - "SSH_AUTH_SOCK") + "SSH_AUTH_SOCK" + ;; Doom envvars + "INSECURE" + "DEBUG" + "YES") "Environment variables to not save in `doom-env-file'.") ;; Borrows heavily from Spacemacs'`spacemacs//init-spacemacs-env'. From ece7b8fdcd899da16183751664d59d375f4b7536 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 15:07:14 -0400 Subject: [PATCH 4061/4235] Fix doom-project-find-file on non-project DIRs This function should be as DWIM as possible. --- core/autoload/projects.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 530deb0e0..c02778d36 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -76,11 +76,16 @@ they are absolute." ;;;###autoload (defun doom-project-find-file (dir) - "Fuzzy-find a file under DIR." + "Fuzzy-find a file under DIR. + +Will resolve to the nearest project root above DIR. If no project can be found, +the search will be rooted from DIR." (unless (file-directory-p dir) (error "Directory %S does not exist" dir)) - (let ((default-directory dir) - projectile-project-root) + (let* ((default-directory dir) + (projectile-project-root + (or (projectile-project-root) + dir))) (call-interactively ;; Intentionally avoid `helm-projectile-find-file', because it runs ;; asynchronously, and thus doesn't see the lexical `default-directory' From 132ad7d39128c2da3b3d885175d94c8bd8ab05b1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 15:07:39 -0400 Subject: [PATCH 4062/4235] Half-revert 92e604d0 + Fixes config.org buffer being killed when tangled + Tangle files in same session if ob-tangle is loaded (and in noninteractive sessions). i.e. only tangle quietly when starting up interactive Emacs. --- modules/config/literate/init.el | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/modules/config/literate/init.el b/modules/config/literate/init.el index 1062c0f61..ed551e0e3 100644 --- a/modules/config/literate/init.el +++ b/modules/config/literate/init.el @@ -18,21 +18,27 @@ byte-compiled from.") (when (or force-p (file-newer-than-file-p org +literate-config-cache-file)) (message "Compiling your literate config...") - ;; We tangle in a separate, blank process because loading it here would - ;; load all of :lang org (very expensive!). - (or (and (zerop (call-process - "emacs" nil nil nil - "-q" "--batch" "-l" "ob-tangle" "--eval" - (format "(org-babel-tangle-file %S nil \"emacs-lisp\")" - org))) + (setq org (file-truename +literate-config-file)) + (or (and (if (fboundp 'org-babel-tangle-file) + (org-babel-tangle-file org nil "emacs-lisp") + ;; We tangle in a separate, blank process because loading it + ;; here would load all of :lang org (very expensive!). + (zerop (call-process + "emacs" nil nil nil + "-q" "--batch" "-l" "ob-tangle" "--eval" + (format "(org-babel-tangle-file %S nil \"emacs-lisp\")" + org)))) ;; Write the cache file to serve as our mtime cache - (with-temp-file +literate-config-cache-file t)) - (warn "There was a problem tangling your literate config!")) + (with-temp-file +literate-config-cache-file + (message "Done!"))) + (warn "There was a problem tangling your literate config!"))))) - (message "Done!")))) ;; Let 'er rip! -(+literate-tangle doom-reloading-p) +(when noninteractive + (require 'ob-tangle nil t)) + +(+literate-tangle (or doom-reloading-p noninteractive)) ;; No need to load the resulting file. Doom will do this for us after all ;; modules have finished loading. From 9e24db7ed3d32d9ee7b5cbc3d8064658b3be2d3e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 16:41:21 -0400 Subject: [PATCH 4063/4235] Don't override embrace's default f pair #1285 This should really be resolved upstream, but until it is this should ensure our custom `f` pair for lisp doesn't end up deleting the global `f` pair. --- modules/feature/evil/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index 471f97899..c86f3fc5e 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -200,7 +200,12 @@ line with a linewise comment.") (embrace-add-pair-regexp ?l "\\[a-z]+{" "}" #'+evil--embrace-latex)) (defun +evil|embrace-lisp-mode-hook () - (embrace-add-pair-regexp ?f "([^ ]+ " ")" #'+evil--embrace-elisp-fn)) + (push (cons ?f (make-embrace-pair-struct + :key ?f + :read-function #'+evil--embrace-elisp-fn + :left-regexp "([^ ]+ " + :right-regexp ")")) + embrace--pairs-list)) ;; Add escaped-sequence support to embrace (setf (alist-get ?\\ (default-value 'embrace--pairs-list)) From 0085d089f3cd89b476e7c8b4d84fbbcb2034341e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 16:43:04 -0400 Subject: [PATCH 4064/4235] Refactor doom*projectile-locate-dominating-file --- core/core-projects.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index d6c0b0bc1..2a083add7 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -53,7 +53,8 @@ ;; TODO Is this still necessary? (defun doom*projectile-locate-dominating-file (orig-fn file name) "Don't traverse the file system if on a remote connection." - (unless (file-remote-p default-directory) + (when (and (stringp file) + (not (file-remote-p file))) (funcall orig-fn file name))) (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file) From 80ea315cca45c7847e9d58c5545c7d6b55ac6d44 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 16:39:15 -0400 Subject: [PATCH 4065/4235] Changed some wrong common-lisp bindings The Sly documentation which these were originally based off of is out of date, causing some of the bindings to have no longer defined functions. --- modules/lang/common-lisp/config.el | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 29348b8e1..1426966a2 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -199,35 +199,28 @@ bin/doom while packages at compile-time (not a runtime though)." "S" 'sly-db-show-frame-source "t" 'sly-db-toggle-details) (evil-define-key 'normal sly-inspector-mode-map - [backtab] 'sly-inspector-previous-inspectable-object - [mouse-1] 'sly-inspector-operate-on-click - [mouse-2] 'sly-inspector-operate-on-click - [mouse-6] 'sly-inspector-pop - [mouse-7] 'sly-inspector-next - [return] 'sly-inspector-operate-on-point - [(shift tab)] 'sly-inspector-previous-inspectable-object + [backtab] 'backward-button + [return] 'push-button + [(shift tab)] 'backward-button (kbd "") 'sly-mrepl-copy-part-to-repl - (kbd "C-i") 'sly-inspector-next-inspectable-object - (kbd "C-k") 'sly-inspector-pop - (kbd "C-m") 'sly-inspector-operate-on-point - "." 'sly-inspector-show-source - "D" 'sly-inspector-describe-inspectee + (kbd "C-i") 'next-button + (kbd "C-m") 'push-button "e" 'sly-inspector-eval "gb" 'sly-inspector-pop "gj" 'sly-inspector-next "gr" 'sly-inspector-reinspect "gR" 'sly-inspector-fetch-all "gv" 'sly-inspector-toggle-verbose - "j" 'sly-inspector-next "h" 'sly-inspector-history - "k" 'sly-inspector-previous-inspectable-object - "K" 'sly-inspector-describe - "p" 'sly-inspector-pprint + "k" 'backward-button + "K" 'sly-inspector-describe-inspectee + "p" 'sly-button-pretty-print "q" 'sly-inspector-quit) (evil-define-key 'normal sly-mode-map (kbd "C-t") 'sly-pop-find-definition-stack) (evil-define-key 'normal sly-popup-buffer-mode-map - (kbd "C-t") 'sly-pop-find-definition-stack) + (kbd "C-t") 'sly-pop-find-definition-stack + "q" 'quit-window) (evil-define-key 'normal sly-xref-mode-map [return] 'sly-goto-xref (kbd "S-") 'sly-show-xref From 9519003bcdda7365093c0b38d314f7e0190c9926 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 19:05:52 -0400 Subject: [PATCH 4066/4235] Fix common-lisp local leader prefix labels --- modules/lang/common-lisp/config.el | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 29348b8e1..4aa3098e3 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -77,9 +77,9 @@ bin/doom while packages at compile-time (not a runtime though)." (advice-add #'sly-check-version :before #'+common-lisp*refresh-sly-version) (map! :localleader - :map sly-mode-map + :map lisp-mode-map "'" #'sly - (:prefix "g" + (:prefix ("g" . "go") "b" #'sly-pop-find-definition-stack "d" #'sly-edit-definition "D" #'sly-edit-definition-other-window @@ -87,7 +87,7 @@ bin/doom while packages at compile-time (not a runtime though)." "N" #'sly-previous-note "s" #'sly-stickers-next-sticker "S" #'sly-stickers-prev-sticker) - (:prefix "h" + (:prefix ("h" . "help") "<" #'sly-who-calls ">" #'sly-calls-who "~" #'hyperspec-lookup-format @@ -102,36 +102,36 @@ bin/doom while packages at compile-time (not a runtime though)." "r" #'sly-who-references "s" #'sly-who-specializes "S" #'sly-who-sets) - (:prefix "c" + (:prefix ("c" . "compile") "c" #'sly-compile-file "C" #'sly-compile-and-load-file "f" #'sly-compile-defun "l" #'sly-load-file "n" #'sly-remove-notes "r" #'sly-compile-region) - (:prefix "e" + (:prefix ("e" . "evaluate") "b" #'sly-eval-buffer "e" #'sly-eval-last-expression "E" #'sly-eval-print-last-expression "f" #'sly-eval-defun "F" #'sly-undefine-function "r" #'sly-eval-region) - (:prefix "m" + (:prefix ("m" . "macro") "e" #'+common-lisp/macrostep/body "E" #'macrostep-expand) - (:prefix "r" + (:prefix ("r" . "repl") "c" #'sly-mrepl-clear-repl "q" #'sly-quit-lisp "r" #'sly-restart-inferior-lisp "s" #'sly-mrepl-sync) - (:prefix "s" + (:prefix ("s" . "stickers") "b" #'sly-stickers-toggle-break-on-stickers "c" #'sly-stickers-clear-defun-stickers "C" #'sly-stickers-clear-buffer-stickers "f" #'sly-stickers-fetch "r" #'sly-stickers-replay "s" #'sly-stickers-dwim) - (:prefix "t" + (:prefix ("t" . "trace") "t" #'sly-toggle-trace-fdefinition "T" #'sly-toggle-fancy-trace "u" #'sly-untrace-all)) @@ -243,7 +243,6 @@ bin/doom while packages at compile-time (not a runtime though)." "q" 'quit-window "r" 'sly-xref-retract))) - (def-package! sly-repl-ansi-color :defer t :init From a4364b3fea965d06ad2797fd6528cf3c33b6364b Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 19:17:32 -0400 Subject: [PATCH 4067/4235] Added a label for starting Sly. Also added a command for starting Sly with a choice for the implementation to use. --- modules/lang/common-lisp/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 4aa3098e3..fc566b540 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -78,7 +78,8 @@ bin/doom while packages at compile-time (not a runtime though)." (map! :localleader :map lisp-mode-map - "'" #'sly + :desc "Sly" "'" #'sly + :desc "Sly (ask)" ";" (λ! () (let ((current-prefix-arg '-)) (sly nil nil t))) (:prefix ("g" . "go") "b" #'sly-pop-find-definition-stack "d" #'sly-edit-definition From 2f356808457c02d9c9900aeb7886739b59f1eddc Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 19:56:00 -0400 Subject: [PATCH 4068/4235] Added labels for Sly bindings --- modules/lang/common-lisp/config.el | 111 ++++++++++++++--------------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index fc566b540..41a03e988 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -80,62 +80,61 @@ bin/doom while packages at compile-time (not a runtime though)." :map lisp-mode-map :desc "Sly" "'" #'sly :desc "Sly (ask)" ";" (λ! () (let ((current-prefix-arg '-)) (sly nil nil t))) - (:prefix ("g" . "go") - "b" #'sly-pop-find-definition-stack - "d" #'sly-edit-definition - "D" #'sly-edit-definition-other-window - "n" #'sly-next-note - "N" #'sly-previous-note - "s" #'sly-stickers-next-sticker - "S" #'sly-stickers-prev-sticker) - (:prefix ("h" . "help") - "<" #'sly-who-calls - ">" #'sly-calls-who - "~" #'hyperspec-lookup-format - "#" #'hyperspec-lookup-reader-macro - "a" #'sly-apropos - "b" #'sly-who-binds - "d" #'sly-disassemble-symbol - "h" #'sly-describe-symbol - "H" #'sly-hyperspec-lookup - "m" #'sly-who-macroexpands - "p" #'sly-apropos-package - "r" #'sly-who-references - "s" #'sly-who-specializes - "S" #'sly-who-sets) - (:prefix ("c" . "compile") - "c" #'sly-compile-file - "C" #'sly-compile-and-load-file - "f" #'sly-compile-defun - "l" #'sly-load-file - "n" #'sly-remove-notes - "r" #'sly-compile-region) - (:prefix ("e" . "evaluate") - "b" #'sly-eval-buffer - "e" #'sly-eval-last-expression - "E" #'sly-eval-print-last-expression - "f" #'sly-eval-defun - "F" #'sly-undefine-function - "r" #'sly-eval-region) - (:prefix ("m" . "macro") - "e" #'+common-lisp/macrostep/body - "E" #'macrostep-expand) - (:prefix ("r" . "repl") - "c" #'sly-mrepl-clear-repl - "q" #'sly-quit-lisp - "r" #'sly-restart-inferior-lisp - "s" #'sly-mrepl-sync) - (:prefix ("s" . "stickers") - "b" #'sly-stickers-toggle-break-on-stickers - "c" #'sly-stickers-clear-defun-stickers - "C" #'sly-stickers-clear-buffer-stickers - "f" #'sly-stickers-fetch - "r" #'sly-stickers-replay - "s" #'sly-stickers-dwim) - (:prefix ("t" . "trace") - "t" #'sly-toggle-trace-fdefinition - "T" #'sly-toggle-fancy-trace - "u" #'sly-untrace-all)) + (:prefix ("g" . "Go") + :desc "Go back" "b" #'sly-pop-find-definition-stack + :desc "Go to" "d" #'sly-edit-definition + :desc "Go to (other window)" "D" #'sly-edit-definition-other-window + :desc "Next note" "n" #'sly-next-note + :desc "Previous note" "N" #'sly-previous-note + :desc "Next sticker" "s" #'sly-stickers-next-sticker + :desc "Previous sticker" "S" #'sly-stickers-prev-sticker) + (:prefix ("h" . "Help") + :desc "Who calls" "<" #'sly-who-calls + :desc "Calls who" ">" #'sly-calls-who + :desc "Lookup format directive" "~" #'hyperspec-lookup-format + :desc "Lookup reader macro" "#" #'hyperspec-lookup-reader-macro + :desc "Apropos" "a" #'sly-apropos + :desc "Who binds" "b" #'sly-who-binds + :desc "Disassemble symbol" "d" #'sly-disassemble-symbol + :desc "Describe symbol" "h" #'sly-describe-symbol + :desc "HyperSpec lookup" "H" #'sly-hyperspec-lookup + :desc "Who macro-expands" "m" #'sly-who-macroexpands + :desc "Apropos package" "p" #'sly-apropos-package + :desc "Who references" "r" #'sly-who-references + :desc "Who specializes" "s" #'sly-who-specializes + :desc "Who sets" "S" #'sly-who-sets) + (:prefix ("c" . "Compile") + :desc "Compile file" "c" #'sly-compile-file + :desc "Compile/load file" "C" #'sly-compile-and-load-file + :desc "Compile toplevel form" "f" #'sly-compile-defun + :desc "Load file" "l" #'sly-load-file + :desc "Remove notes" "n" #'sly-remove-notes + :desc "Compile region" "r" #'sly-compile-region) + (:prefix ("e" . "Evaluate") + :desc "Evaulate buffer" "b" #'sly-eval-buffer + :desc "Evaluate last" "e" #'sly-eval-last-expression + :desc "Evaluate/print last" "E" #'sly-eval-print-last-expression + :desc "Evaluate defun" "f" #'sly-eval-defun + :desc "Undefine function" "F" #'sly-undefine-function + :desc "Evaluate region" "r" #'sly-eval-region) + (:prefix ("m" . "Macro") + :desc "Macrostep" "E" #'macrostep-expand) + (:prefix ("r" . "REPL") + :desc "Clear REPL" "c" #'sly-mrepl-clear-repl + :desc "Quit connection" "q" #'sly-quit-lisp + :desc "Restart connection" "r" #'sly-restart-inferior-lisp + :desc "Sync REPL" "s" #'sly-mrepl-sync) + (:prefix ("s" . "Stickers") + :desc "Toggle breaking stickers" "b" #'sly-stickers-toggle-break-on-stickers + :desc "Clear defun stickers" "c" #'sly-stickers-clear-defun-stickers + :desc "Clear buffer stickers" "C" #'sly-stickers-clear-buffer-stickers + :desc "Fetch stickers" "f" #'sly-stickers-fetch + :desc "Replay stickers" "r" #'sly-stickers-replay + :desc "Add/remove sticker" "s" #'sly-stickers-dwim) + (:prefix ("t" . "Trace") + :desc "Toggle" "t" #'sly-toggle-trace-fdefinition + :desc "Toggle (fancy)" "T" #'sly-toggle-fancy-trace + :desc "Untrace all" "u" #'sly-untrace-all)) (when (featurep! :feature evil +everywhere) (add-hook 'sly-mode-hook #'evil-normalize-keymaps) From c0b00327c25c64043dd95fa99e6f1bbae6b83b5d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 18:27:45 -0400 Subject: [PATCH 4069/4235] Purge excess from projectile's cache Bloated projectile caches can cause freezing and delays. This is especially so if you accidentally index $HOME or /, which will bloat them into the hundreds of MBs. + Adds purging of blacklisted, over-sized and non-projects from projectile's cache when Emacs is killed. + Projectile's project file cache will now expire after a week. + Corrects file paths in core/doctor's filesize checks. --- core/core-projects.el | 42 +++++++++++++++++++++++++++++++++++++++++- core/doctor.el | 2 +- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 2a083add7..367121c21 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -1,5 +1,19 @@ ;;; core-projects.el -*- lexical-binding: t; -*- +(defvar doom-projectile-cache-limit 25000 + "If any project cache surpasses this many files it is purged when quitting +Emacs.") + +(defvar doom-projectile-cache-blacklist '("~" "/tmp" "/") + "Directories that should never be cached.") + +(defvar doom-projectile-cache-purge-non-projects nil + "If non-nil, non-projects are purged from the cache on `kill-emacs-hook'.") + + +;; +;;; Packages + (def-package! projectile :after-call (after-find-file dired-before-readin-hook minibuffer-setup-hook) :commands (projectile-project-root projectile-project-name projectile-project-p) @@ -11,7 +25,8 @@ projectile-globally-ignored-files '(".DS_Store" "Icon " "TAGS") projectile-globally-ignored-file-suffixes '(".elc" ".pyc" ".o") projectile-ignored-projects '("~/" "/tmp") - projectile-kill-buffers-filter 'kill-only-files) + projectile-kill-buffers-filter 'kill-only-files + projectile-files-cache-expire 604800) ; expire after a week :config (add-hook 'dired-before-readin-hook #'projectile-track-known-projects-find-file-hook) @@ -35,6 +50,31 @@ ("less" "css") ("styl" "css")))) + ;; Accidentally indexing big directories like $HOME or / will massively bloat + ;; projectile's cache (into the hundreds of MBs). This purges those entries + ;; when exiting Emacs to prevent slowdowns/freezing when cache files are + ;; loaded or written to. + (defun doom|cleanup-project-cache () + "Purge projectile cache entries that: + +a) have too many files (see `doom-projectile-cache-limit'), +b) represent blacklised directories that are too big, change too often or are + private. (see `doom-projectile-cache-blacklist'), +c) are not valid projectile projects." + (cl-loop with blacklist = (mapcar #'file-truename doom-projectile-cache-blacklist) + for proot in (hash-table-keys projectile-projects-cache) + for len = (length (gethash proot projectile-projects-cache)) + if (or (>= len doom-projectile-cache-limit) + (member (substring proot 0 -1) blacklist) + (and doom-projectile-cache-purge-non-projects + (not (doom-project-p proot)))) + do (doom-log "Removed %S from projectile cache" proot) + and do (remhash proot projectile-projects-cache) + and do (remhash proot projectile-projects-cache-time) + and do (remhash proot projectile-project-type-cache)) + (projectile-serialize-cache)) + (add-hook 'kill-emacs-hook #'doom|cleanup-project-cache) + ;; It breaks projectile's project root resolution if HOME is a project (e.g. ;; it's a git repo). In that case, we disable bottom-up root searching to ;; prevent issues. This makes project resolution a little slower and less diff --git a/core/doctor.el b/core/doctor.el index 8487cf324..786a63914 100644 --- a/core/doctor.el +++ b/core/doctor.el @@ -10,7 +10,7 @@ ;; delays or freezing. This shouldn't happen often. (dolist (file (list "savehist" "projectile.cache")) - (let* ((path (expand-file-name file doom-core-dir)) + (let* ((path (expand-file-name file doom-cache-dir)) (size (file-size path))) (when (and (numberp size) (> size 2000)) (warn! "%s is too large (%.02fmb). This may cause freezes or odd startup delays" From 803ca2863a6daa505824ed4831d981f034c4e298 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 28 Mar 2019 18:29:50 -0400 Subject: [PATCH 4070/4235] Use resolved, absolute paths in doom-project api Ensures projectile caches files under the right key. --- core/autoload/projects.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index c02778d36..74c872a30 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -82,10 +82,10 @@ Will resolve to the nearest project root above DIR. If no project can be found, the search will be rooted from DIR." (unless (file-directory-p dir) (error "Directory %S does not exist" dir)) - (let* ((default-directory dir) + (let* ((default-directory (file-truename (expand-file-name dir))) (projectile-project-root (or (projectile-project-root) - dir))) + default-directory))) (call-interactively ;; Intentionally avoid `helm-projectile-find-file', because it runs ;; asynchronously, and thus doesn't see the lexical `default-directory' @@ -96,7 +96,7 @@ the search will be rooted from DIR." ;;;###autoload (defun doom-project-browse (dir) "Traverse a file structure starting linearly from DIR." - (let ((default-directory (file-truename dir))) + (let ((default-directory (file-truename (expand-file-name dir)))) (call-interactively (cond ((featurep! :completion ivy) #'counsel-find-file) From d77e1fa15fc2ac58f391feab357c0df28b12d861 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 20:00:50 -0400 Subject: [PATCH 4071/4235] Removed common-lisp macrostep hydra This can cause a variety of problems, and the actual macrostep mode toggle has the same keybindings, so no loss of functionality. --- modules/lang/common-lisp/autoload/hydras.el | 19 ------------------- modules/lang/common-lisp/config.el | 2 +- 2 files changed, 1 insertion(+), 20 deletions(-) delete mode 100644 modules/lang/common-lisp/autoload/hydras.el diff --git a/modules/lang/common-lisp/autoload/hydras.el b/modules/lang/common-lisp/autoload/hydras.el deleted file mode 100644 index 3257353a9..000000000 --- a/modules/lang/common-lisp/autoload/hydras.el +++ /dev/null @@ -1,19 +0,0 @@ -;;; lang/common-lisp/autoload/hydras.el -*- lexical-binding: t; -*- - -;;;###autoload (autoload '+common-lisp/macrostep/body "lang/common-lisp/autoload/hydras" nil nil) -(defhydra +common-lisp/macrostep (:exit nil :hint nil :foreign-keys run) - " -Macro Expansion -^^Definitions ^^Compiler Notes ^^Stickers -^^^^^^───────────────────────────────────────────────────────────────────────────────────── -[_e_] Expand -[_c_] Collapse -[_n_] Next level -[_N_] Previous level -[_q_] Exit -" - ("e" macrostep-expand) - ("c" macrostep-collapse) - ("n" macrostep-next-macro) - ("N" macrostep-prev-macro) - ("q" macrostep-collapse-all :exit t)) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 41a03e988..0b677a325 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -118,7 +118,7 @@ bin/doom while packages at compile-time (not a runtime though)." :desc "Undefine function" "F" #'sly-undefine-function :desc "Evaluate region" "r" #'sly-eval-region) (:prefix ("m" . "Macro") - :desc "Macrostep" "E" #'macrostep-expand) + :desc "Macrostep" "e" #'macrostep-expand) (:prefix ("r" . "REPL") :desc "Clear REPL" "c" #'sly-mrepl-clear-repl :desc "Quit connection" "q" #'sly-quit-lisp From 13f705dc0e4115009deeca18bd1436f8445d843d Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Fri, 29 Mar 2019 03:19:11 +0200 Subject: [PATCH 4072/4235] Add Kotlin module --- modules/lang/kotlin/autoload.el | 15 +++++++++++++++ modules/lang/kotlin/config.el | 16 ++++++++++++++++ modules/lang/kotlin/doctor.el | 4 ++++ modules/lang/kotlin/packages.el | 7 +++++++ 4 files changed, 42 insertions(+) create mode 100644 modules/lang/kotlin/autoload.el create mode 100644 modules/lang/kotlin/config.el create mode 100644 modules/lang/kotlin/doctor.el create mode 100644 modules/lang/kotlin/packages.el diff --git a/modules/lang/kotlin/autoload.el b/modules/lang/kotlin/autoload.el new file mode 100644 index 000000000..a15620fed --- /dev/null +++ b/modules/lang/kotlin/autoload.el @@ -0,0 +1,15 @@ +;;; lang/kotlin/autoload.el -*- lexical-binding: t; -*- + +;;;autoload +(defun +kotlin/locate-gradlew-file () + "Gradlew file location for this project." + (locate-dominating-file buffer-file-name "gradlew")) + +;;;###autoload +(defun +kotlin/run-gradlew (command) + "Run gradlew in this project." + (interactive "sCommand: ") + (let ((default-directory (+kotlin/locate-gradlew-file)) + (compilation-read-command nil) + (compile-command (format "sh gradlew %s" command))) + (call-interactively #'compile))) diff --git a/modules/lang/kotlin/config.el b/modules/lang/kotlin/config.el new file mode 100644 index 000000000..dc02f1035 --- /dev/null +++ b/modules/lang/kotlin/config.el @@ -0,0 +1,16 @@ +;;; lang/kotlin/config.el -*- lexical-binding: t; -*- + +(after! kotlin-mode + (set-docsets! 'kotlin-mode "Kotlin") + + (map! :map kotlin-mode-map + :localleader + :prefix ("b" . "build") + :desc "gradlew assemble" "a" (λ! (+kotlin/run-gradlew "assemble")) + :desc "gradlew build" "b" (λ! (+kotlin/run-gradlew "build")) + :desc "gradlew test" "t" (λ! (+kotlin/run-gradlew "test")))) + +(def-package! flycheck-kotlin + :when (featurep! :tools flycheck) + :after kotlin-mode + :config (add-hook 'kotlin-mode-hook #'flycheck-kotlin-setup)) diff --git a/modules/lang/kotlin/doctor.el b/modules/lang/kotlin/doctor.el new file mode 100644 index 000000000..7dd70d076 --- /dev/null +++ b/modules/lang/kotlin/doctor.el @@ -0,0 +1,4 @@ +;;; lang/kotlin/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "ktlint") + (warn "ktlint not found. flycheck-kotlin won't work.")) diff --git a/modules/lang/kotlin/packages.el b/modules/lang/kotlin/packages.el new file mode 100644 index 000000000..f7c3361dc --- /dev/null +++ b/modules/lang/kotlin/packages.el @@ -0,0 +1,7 @@ +;; -*- no-byte-compile: t; -*- +;;; lang/kotlin/packages.el + +(package! kotlin-mode) + +(when (featurep! :tools flycheck) + (package! flycheck-kotlin)) From 1c14b0bf17df3429cba89b03ba38ea94b201fffb Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Fri, 29 Mar 2019 03:27:39 +0200 Subject: [PATCH 4073/4235] Add lang/kotlin entry to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index beeddd51d..73638e4ca 100644 --- a/init.example.el +++ b/init.example.el @@ -102,6 +102,7 @@ ;;(java +meghanada) ; the poster child for carpal tunnel syndrome ;;javascript ; all(hope(abandon(ye(who(enter(here)))))) ;;julia ; a better, faster MATLAB + ;;kotlin ; a better, slicker Java(Script) ;;latex ; writing papers in Emacs has never been so fun ;;ledger ; an accounting system in Emacs ;;lua ; one-based indices? one-based indices From 275bea568e307e6f9f75e0f26e0821b1f01d1c7b Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 21:40:06 -0400 Subject: [PATCH 4074/4235] Added more bindings --- modules/lang/common-lisp/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 1426966a2..44b31b7ba 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -148,7 +148,10 @@ bin/doom while packages at compile-time (not a runtime though)." '(sly-db-mode sly-inspector-mode sly-popup-buffer-mode sly-xref-mode) 'normal) (evil-define-key 'insert sly-mrepl-mode-map - [S-return] #'newline-and-indent) + [S-return] #'newline-and-indent + [backspace] #'sp-backward-delete-char + [up] (λ! () (evil-goto-line) (comint-previous-input 1)) + [down] (λ! () (evil-goto-line) (comint-next-input 1))) (evil-define-key 'normal sly-parent-map (kbd "C-t") #'sly-pop-find-definition-stack) (evil-define-key 'normal sly-db-mode-map From 0b2f18542c83a26ceb6b024319114b9641593673 Mon Sep 17 00:00:00 2001 From: Michael Fiano Date: Thu, 28 Mar 2019 22:31:06 -0400 Subject: [PATCH 4075/4235] Fixed bug where sly-db-quit was not being called --- modules/lang/common-lisp/config.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index 44b31b7ba..8b0663047 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -154,9 +154,13 @@ bin/doom while packages at compile-time (not a runtime though)." [down] (λ! () (evil-goto-line) (comint-next-input 1))) (evil-define-key 'normal sly-parent-map (kbd "C-t") #'sly-pop-find-definition-stack) + (evil-define-key 'normal sly-popup-buffer-mode-map + (kbd "C-t") 'sly-pop-find-definition-stack + "q" 'quit-window) (evil-define-key 'normal sly-db-mode-map [follow-link] 'mouse-face [mouse-2] 'sly-db-default-action/mouse + [remap quit-window] 'sly-db-quit (kbd "C-i") 'sly-db-cycle (kbd "C-j") 'sly-db-down (kbd "C-k") 'sly-db-up @@ -221,9 +225,6 @@ bin/doom while packages at compile-time (not a runtime though)." "q" 'sly-inspector-quit) (evil-define-key 'normal sly-mode-map (kbd "C-t") 'sly-pop-find-definition-stack) - (evil-define-key 'normal sly-popup-buffer-mode-map - (kbd "C-t") 'sly-pop-find-definition-stack - "q" 'quit-window) (evil-define-key 'normal sly-xref-mode-map [return] 'sly-goto-xref (kbd "S-") 'sly-show-xref From 7488b51e9aa203ecdabfb71a14236b88d64b43d0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Mar 2019 01:51:36 -0400 Subject: [PATCH 4076/4235] Prevent void-function load-env-vars errors In case load-env-vars hasn't been autoloaded yet. --- core/core.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core.el b/core/core.el index 0a75a04fc..1ed09ef2d 100644 --- a/core/core.el +++ b/core/core.el @@ -453,9 +453,10 @@ to least)." (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) ;; Load shell environment - (unless noninteractive - (when (file-readable-p doom-env-file) - (load-env-vars doom-env-file)))) + (when (and (not noninteractive) + (file-readable-p doom-env-file) + (require 'load-env-vars nil t)) + (load-env-vars doom-env-file))) (require 'core-lib) (require 'core-modules) From 7eb479e3f79e81a32fd934ef3fe7ffc70ea95955 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Mar 2019 03:40:56 -0400 Subject: [PATCH 4077/4235] config/literate: set config.el as default target --- modules/config/literate/init.el | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/modules/config/literate/init.el b/modules/config/literate/init.el index ed551e0e3..4eb3b8d18 100644 --- a/modules/config/literate/init.el +++ b/modules/config/literate/init.el @@ -18,20 +18,21 @@ byte-compiled from.") (when (or force-p (file-newer-than-file-p org +literate-config-cache-file)) (message "Compiling your literate config...") - (setq org (file-truename +literate-config-file)) - (or (and (if (fboundp 'org-babel-tangle-file) - (org-babel-tangle-file org nil "emacs-lisp") - ;; We tangle in a separate, blank process because loading it - ;; here would load all of :lang org (very expensive!). - (zerop (call-process - "emacs" nil nil nil - "-q" "--batch" "-l" "ob-tangle" "--eval" - (format "(org-babel-tangle-file %S nil \"emacs-lisp\")" - org)))) - ;; Write the cache file to serve as our mtime cache - (with-temp-file +literate-config-cache-file - (message "Done!"))) - (warn "There was a problem tangling your literate config!"))))) + (let* ((org (file-truename +literate-config-file)) + (dest (concat (file-name-sans-extension org) ".el"))) + (or (and (if (fboundp 'org-babel-tangle-file) + (org-babel-tangle-file org dest "emacs-lisp") + ;; We tangle in a separate, blank process because loading it + ;; here would load all of :lang org (very expensive!). + (zerop (call-process + "emacs" nil nil nil + "-q" "--batch" "-l" "ob-tangle" "--eval" + (format "(org-babel-tangle-file %S %S \"emacs-lisp\")" + org dest)))) + ;; Write the cache file to serve as our mtime cache + (with-temp-file +literate-config-cache-file + (message "Done!"))) + (warn "There was a problem tangling your literate config!")))))) ;; Let 'er rip! From 99aefd6e022fc092c3c8e22a3c42b78cec0823d2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Mar 2019 03:52:24 -0400 Subject: [PATCH 4078/4235] Disable projectile cache during elfeed-db-compact --- modules/app/rss/autoload.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 982707c8d..14e633b5f 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -61,7 +61,10 @@ (defun +rss|cleanup () "Clean up after an elfeed session. Kills all elfeed and elfeed-org files." (interactive) - (elfeed-db-compact) + ;; `delete-file-projectile-remove-from-cache' slows down `elfeed-db-compact' + ;; tremendously, so we disable the projectile cache: + (let (projectile-enable-caching) + (elfeed-db-compact)) (let ((buf (previous-buffer))) (when (or (null buf) (not (doom-real-buffer-p buf))) (switch-to-buffer (doom-fallback-buffer)))) From 36919fedda568bd6891cd0b884be538e5361b71d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 29 Mar 2019 23:49:47 -0400 Subject: [PATCH 4079/4235] bin/org-capture: refactor & use -k switch --- bin/org-capture | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/org-capture b/bin/org-capture index ac70e247a..d04d2e971 100755 --- a/bin/org-capture +++ b/bin/org-capture @@ -3,9 +3,9 @@ # Open an org-capture popup frame from the shell. This opens a temporary emacs # daemon if emacs isn't already running. # -# Usage: org-capture [key] [message...] +# Usage: org-capture [-k KEY] [MESSAGE] # Examples: -# org-capture n "To the mind that is still, the whole universe surrenders." +# org-capture -k n "To the mind that is still, the whole universe surrenders." set -e @@ -21,8 +21,8 @@ if ! emacsclient -e nil; then fi # org-capture key mapped to argument flags -keys=$(emacsclient -e "(+org-capture-available-keys)" | cut -d '"' -f2) -while getopts $keys opt; do +# keys=$(emacsclient -e "(+org-capture-available-keys)" | cut -d '"' -f2) +while getopts hk opt; do key="\"$opt\"" break done @@ -33,7 +33,7 @@ shift $((OPTIND-1)) if [[ $daemon ]]; then emacsclient -a "" \ -c -F '((name . "org-capture") (width . 70) (height . 25) (transient . t))' \ - -e "(+org-capture/open-frame \"$str\" ${key:-nil} t)" + -e "(+org-capture/open-frame \"$str\" ${key:-nil})" else # Non-daemon servers flicker a lot if frames are created from terminal, so we # do it internally instead. From 49bbc7107f20663f350bdb27e5c68ef949ddefe2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Mar 2019 00:07:57 -0400 Subject: [PATCH 4080/4235] Disable fuzzy matching for counsel-rg #1292 --- modules/completion/ivy/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index e07c7db23..7b9a11898 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -229,6 +229,7 @@ immediately runs it on the current candidate (ending the ivy session)." :init (setq ivy-re-builders-alist '((counsel-ag . ivy--regex-plus) + (counsel-rg . ivy--regex-plus) (counsel-grep . ivy--regex-plus) (swiper . ivy--regex-plus) (t . ivy--regex-fuzzy)) From be6efd8dbff18c29953c4af8bfef88b8091added Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Mar 2019 00:09:12 -0400 Subject: [PATCH 4081/4235] Fix wrong-num-of-args on +eval/open-repl-same-window #1291 --- modules/feature/eval/autoload/repl.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 3bc558b8a..5d22b47cd 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -36,7 +36,7 @@ (point-max))) buffer))) -(defun +eval-open-repl (prompt-p other-window-p) +(defun +eval-open-repl (prompt-p &optional other-window-p) (let ((command (cdr (assq major-mode +eval-repls)))) (when (or (not command) prompt-p) (let* ((choices (or (cl-loop for sym being the symbols From da02fa8c38d52dd8ed98cc58d70c4b3e061cdc1a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Mar 2019 02:17:52 -0400 Subject: [PATCH 4082/4235] lang/markdown: add markdown-command check --- modules/lang/markdown/doctor.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/lang/markdown/doctor.el b/modules/lang/markdown/doctor.el index 353453365..00167df56 100644 --- a/modules/lang/markdown/doctor.el +++ b/modules/lang/markdown/doctor.el @@ -4,3 +4,8 @@ (when (featurep! +pandoc) (unless (executable-find "pandoc") (warn! "Couldn't find pandoc, markdown-mode may have issues"))) + +(when (require 'markdown-mode nil t) + (unless (executable-find markdown-command) + (warn! "Couldn't find %S, can't export markdown to html" + markdown-command))) From 838edcea5994133a5d1f8170eae9a22103f7a4d9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Mar 2019 02:18:33 -0400 Subject: [PATCH 4083/4235] Add org export-to-clipboard commands & ox-clip These work from markdown-mode as well as org-mode. Also adds +org/export-to-clipboard-as-rich-text for pasting org/markdown rendered as RTF. --- modules/lang/org/autoload/org-export.el | 49 +++++++++++++++++++++++++ modules/lang/org/packages.el | 1 + 2 files changed, 50 insertions(+) create mode 100644 modules/lang/org/autoload/org-export.el diff --git a/modules/lang/org/autoload/org-export.el b/modules/lang/org/autoload/org-export.el new file mode 100644 index 000000000..73ff7ea6f --- /dev/null +++ b/modules/lang/org/autoload/org-export.el @@ -0,0 +1,49 @@ +;;; lang/org/autoload/org-export.el -*- lexical-binding: t; -*- +;;;###if (featurep! +export) + +(defun +org--yank-html-buffer (buffer) + (with-current-buffer buffer + (require 'ox-clip) + (cond ((or IS-WINDOWS IS-MAC) + (shell-command-on-region + (point-min) + (point-max) + (cond (IS-WINDOWS ox-clip-w32-cmd) + (IS-MAC ox-clip-osx-cmd)))) + (IS-LINUX + (let ((html (buffer-string))) + (with-temp-file "/tmp/ox-clip-md.html" + (insert html)) + (apply + 'start-process "ox-clip" "*ox-clip*" + (split-string ox-clip-linux-cmd " "))))))) + + +;; +;;; Commands + +;;;###autoload +(defun +org/export-to-clipboard (backend) + "Exports the current buffer/selection to the clipboard. + +Prompts for what BACKEND to use. See `org-export-backends' for options." + (interactive + (list (intern (completing-read "Export to: " org-export-backends)))) + (let ((buffer (org-export-to-buffer backend "*Formatted Copy*" nil nil t t))) + (unwind-protect + (with-current-buffer buffer + (kill-new (buffer-string))) + (kill-buffer (current-buffer))))) + +;;;###autoload +(defun +org/export-to-clipboard-as-rich-text (beg end) + "Export the current buffer to HTML then copies it to clipboard as rich text. + +Supports org-mode, markdown-mode, and gfm-mode buffers. In any other mode, +htmlize is used (takes what you see in Emacs and converts it to html, text +properties and font-locking et all)." + (interactive "r") + (pcase major-mode + ((or `markdown-mode `gfm-mode) + (+org--yank-html-buffer (markdown))) + (_ (ox-clip-formatted-copy beg end)))) diff --git a/modules/lang/org/packages.el b/modules/lang/org/packages.el index a69d34e8b..8652ea769 100644 --- a/modules/lang/org/packages.el +++ b/modules/lang/org/packages.el @@ -48,6 +48,7 @@ (package! ob-rust))) (when (featurep! +export) + (package! ox-clip) (package! ox-pandoc) (package! htmlize)) From 5c159347332215efe9ef8d3f10613bdd7b804425 Mon Sep 17 00:00:00 2001 From: Jason Scott Date: Sat, 30 Mar 2019 11:19:40 +0100 Subject: [PATCH 4084/4235] fixes calfw calendar creation width --- modules/app/calendar/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 7a4af2477..f1bc4222c 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -16,6 +16,7 @@ (if (featurep! :feature workspaces) (progn (+workspace-switch "Calendar" t) + (doom/switch-to-scratch-buffer) (+calendar--init) (+workspace/display)) (setq +calendar--wconf (current-window-configuration)) From 1ca499bafbd672f095b1f4a4c16ccd10e7cc92a8 Mon Sep 17 00:00:00 2001 From: Jason Scott Date: Sat, 30 Mar 2019 16:05:33 +0100 Subject: [PATCH 4085/4235] adds to falsely branch in case invoked from splash --- modules/app/calendar/autoload.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index f1bc4222c..81530ca5f 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -21,6 +21,7 @@ (+workspace/display)) (setq +calendar--wconf (current-window-configuration)) (delete-other-windows) + (doom/switch-to-scratch-buffer) (+calendar--init))) ;;;###autoload From 848399fec1c1b6302251a942caa0e7250c2d0774 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Mar 2019 13:27:09 -0400 Subject: [PATCH 4086/4235] Add C-c C-e to invoke wgrep from project search To be consistent with helm-ag-edit --- modules/config/default/+emacs-bindings.el | 1 + modules/config/default/+evil-bindings.el | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index 2aeb0c1bb..cd14f0cdb 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -263,6 +263,7 @@ (:when (featurep! :completion ivy) (:after counsel :map counsel-ag-map + "C-c C-e" #'+ivy/wgrep-occur ; search/replace on results [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)) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 1f1830370..6aeb32a86 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -296,6 +296,7 @@ :map counsel-ag-map "C-SPC" #'ivy-call-and-recenter ; preview "C-l" #'ivy-done + "C-c C-e" #'+ivy/wgrep-occur ; search/replace on results [backtab] #'+ivy/wgrep-occur ; search/replace on results [C-return] (+ivy-do-action! #'+ivy-git-grep-other-window-action)) (:after swiper From 445673b0be9f50bf985f161dc218b2d211ac9629 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 30 Mar 2019 13:57:23 -0400 Subject: [PATCH 4087/4235] Remove reference to old variable in do-repeat! --- modules/config/default/+evil-bindings.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 6aeb32a86..ac1617fd7 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -776,9 +776,8 @@ whose CDR is for repeating backward. They should both be kbd-able strings.") (when +default-repeat-keys (defmacro do-repeat! (command next-func prev-func) - "Makes ; and , the universal repeat-keys in evil-mode. These keys can be -customized by changing `+default-repeat-forward-key' and -`+default-repeat-backward-key'." + "Makes ; and , the universal repeat-keys in evil-mode. +To change these keys see `+default-repeat-keys'." (let ((fn-sym (intern (format "+default*repeat-%s" (doom-unquote command))))) `(progn (defun ,fn-sym (&rest _) From ec76d9acb60bad35be6343888fe70ae2f918bfb0 Mon Sep 17 00:00:00 2001 From: Jeffrey Chu Date: Sun, 31 Mar 2019 12:38:42 -0700 Subject: [PATCH 4088/4235] Escape key regexps when building which-key leader prefix --- core/core-keybinds.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 86fb7f6c0..b8130b202 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -124,8 +124,8 @@ If any hook returns non-nil, all hooks after it are ignored.") (concat "\\(?:" (cl-loop for key in (append (list doom-leader-key doom-leader-alt-key) (where-is-internal 'doom/leader)) - if (stringp key) collect key into keys - else collect (key-description key) into keys + if (stringp key) collect (regexp-quote key) into keys + else collect (regexp-quote (key-description key)) into keys finally return (string-join keys "\\|")) "\\)")))) (add-hook 'doom-after-init-modules-hook #'doom|init-leader-keys) From 0cfbdc1f3c40fe5d2f6411defafcf11ab4f268c8 Mon Sep 17 00:00:00 2001 From: Arif Rezai Date: Mon, 1 Apr 2019 10:56:47 +0900 Subject: [PATCH 4089/4235] Add vterm-mode to evil-escape-excluded-major-modes `jk` doesn't work as expected in `vterm`. Do I need to also check for `vterm` feature flag? --- modules/feature/evil/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index c86f3fc5e..cd05498e8 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -221,7 +221,7 @@ line with a linewise comment.") :after-call (evil-normal-state-exit-hook) :init (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) - evil-escape-excluded-major-modes '(neotree-mode treemacs-mode term-mode) + evil-escape-excluded-major-modes '(neotree-mode treemacs-mode term-mode vterm-mode) evil-escape-key-sequence "jk" evil-escape-delay 0.25) (evil-define-key* '(insert replace visual operator) 'global "\C-g" #'evil-escape) From d974acfef1921197dfb5b04e650686503505ca71 Mon Sep 17 00:00:00 2001 From: Shanavas M Date: Mon, 1 Apr 2019 12:18:12 +0530 Subject: [PATCH 4090/4235] Use variable for `fd-find` binary name --- core/core-projects.el | 9 ++++++--- core/doctor.el | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/core-projects.el b/core/core-projects.el index 367121c21..0571cb5ce 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -10,6 +10,8 @@ Emacs.") (defvar doom-projectile-cache-purge-non-projects nil "If non-nil, non-projects are purged from the cache on `kill-emacs-hook'.") +(defvar doom-projectile-fd-binary "fd" + "name of `fd-find' executable binary") ;; ;;; Packages @@ -101,11 +103,12 @@ c) are not valid projectile projects." ;; If fd exists, use it for git and generic projects ;; fd is a rust program that is significantly faster. It also respects ;; .gitignore. This is recommended in the projectile docs - (when (executable-find "fd") - (setq projectile-git-command "fd . --type f -0 -H -E .git" + (when (executable-find doom-projectile-fd-binary) + (setq projectile-git-command (concat + doom-projectile-fd-binary + " . --type f -0 -H -E .git") projectile-generic-command projectile-git-command))) - ;; ;; Project-based minor modes diff --git a/core/doctor.el b/core/doctor.el index 786a63914..baf1de4a7 100644 --- a/core/doctor.el +++ b/core/doctor.el @@ -18,7 +18,7 @@ (/ size 1024)) (explain! "Consider deleting it from your system (manually)")))) -(when! (not (executable-find "fd")) +(when! (not (executable-find doom-projectile-fd-binary)) (warn! "Couldn't find the `fd' binary; project file searches will be slightly slower")) (let ((default-directory "~")) From bdd410cb9c8d8d697a677eede0423a575be15a91 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 31 Mar 2019 19:44:38 -0400 Subject: [PATCH 4091/4235] Refresh vc on-demand after quitting magit #1298 To avoid the long delay when you have many buffers open while quitting magit. --- modules/tools/magit/autoload.el | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index 5da8b6882..f29a1f24a 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -53,7 +53,20 @@ (when (fboundp 'vc-refresh-state) (vc-refresh-state)) (when (fboundp '+version-control|update-git-gutter) - (+version-control|update-git-gutter)))) + (+version-control|update-git-gutter)) + (setq +magit--vc-is-stale-p nil))) + +;;;###autoload +(defvar-local +magit--vc-is-stale-p nil) + +;;;###autoload +(defun +magit|refresh-vc-state-maybe () + "Update `vc' and `git-gutter' if out of date." + (when +magit--vc-is-stale-p + (+magit--refresh-vc-in-buffer (current-buffer)))) + +;;;###autoload +(add-hook 'doom-switch-buffer-hook #'+magit|refresh-vc-state-maybe) ;;;###autoload (defun +magit/quit (&optional _kill-buffer) @@ -68,13 +81,11 @@ control in buffers." (eq major-mode 'magit-status-mode))) (window-list)))) (mapc #'+magit--kill-buffer (magit-mode-get-buffers)) - (let ((buffers (doom-buffer-list))) - (if (not (fboundp 'make-thread)) - (mapc #'+magit--refresh-vc-in-buffer buffers) - (mapc #'+magit--refresh-vc-in-buffer (doom-visible-buffers buffers)) - ;; TODO Partition buffer list - (dolist (buffer (doom-buried-buffers buffers)) - (make-thread (lambda () (+magit--refresh-vc-in-buffer buffer)))))))) + (dolist (buffer (doom-buffer-list)) + (if (get-buffer-window buffer) + (+magit--refresh-vc-in-buffer buffer) + (with-current-buffer buffer + (setq +magit--vc-is-stale-p t)))))) (defun +magit--kill-buffer (buf) "TODO" From 5b43b2840b1df9742a4e310ed6ab8db65ac14e73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Apr 2019 12:58:23 -0400 Subject: [PATCH 4092/4235] Fix RET/TAB company keybinds in GUI Emacs --- modules/completion/company/config.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/company/config.el b/modules/completion/company/config.el index b247dddde..ee673fb91 100644 --- a/modules/completion/company/config.el +++ b/modules/completion/company/config.el @@ -38,7 +38,9 @@ (add-to-list 'company-frontends 'company-tng-frontend) (define-key! company-active-map "RET" nil + [return] nil "TAB" #'company-select-next + [tab] #'company-select-next [backtab] #'company-select-previous)) From a6cc66e21e718b26d3dbcb08451877178ac0413b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Apr 2019 13:15:15 -0400 Subject: [PATCH 4093/4235] Refresh exec-path & shell-file-name When loading envvars, since `load-env-vars` only affects the environment and not Emacs' variables. --- core/core.el | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/core.el b/core/core.el index 1ed09ef2d..8703e0260 100644 --- a/core/core.el +++ b/core/core.el @@ -453,10 +453,14 @@ to least)." (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) ;; Load shell environment - (when (and (not noninteractive) + (when (and (or (daemonp) (display-graphic-p)) (file-readable-p doom-env-file) (require 'load-env-vars nil t)) - (load-env-vars doom-env-file))) + (load-env-vars doom-env-file) + (setq exec-path (append (split-string (getenv "PATH") ":") + (list exec-directory)) + shell-file-name (or (getenv "SHELL") + shell-file-name)))) (require 'core-lib) (require 'core-modules) From 5bcab488a72f6515be8637bb8b0965db3538fa9a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Apr 2019 13:21:25 -0400 Subject: [PATCH 4094/4235] Add {vc,git-gutter}-mode checks to vc refresher --- modules/tools/magit/autoload.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/autoload.el b/modules/tools/magit/autoload.el index f29a1f24a..4b423ebc6 100644 --- a/modules/tools/magit/autoload.el +++ b/modules/tools/magit/autoload.el @@ -50,9 +50,10 @@ (defun +magit--refresh-vc-in-buffer (buffer) (with-current-buffer buffer - (when (fboundp 'vc-refresh-state) + (when (and vc-mode (fboundp 'vc-refresh-state)) (vc-refresh-state)) - (when (fboundp '+version-control|update-git-gutter) + (when (and (bound-and-true-p git-gutter-mode) + (fboundp '+version-control|update-git-gutter)) (+version-control|update-git-gutter)) (setq +magit--vc-is-stale-p nil))) From 390edee702f86d6f8c20d5934764a22c7b8959f8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Apr 2019 13:44:20 -0400 Subject: [PATCH 4095/4235] ui/fci -> fill-column: replace fci w/ hl-fill-column fci was buggy, slow and presented numerous incompatibilities with other modes. It is also unmaintained. Relevant to #1045 --- core/core-modules.el | 3 ++- init.example.el | 2 +- modules/ui/fci/autoload.el | 15 ------------- modules/ui/fci/config.el | 35 ------------------------------ modules/ui/fci/packages.el | 4 ---- modules/ui/fill-column/config.el | 4 ++++ modules/ui/fill-column/packages.el | 4 ++++ 7 files changed, 11 insertions(+), 56 deletions(-) delete mode 100644 modules/ui/fci/autoload.el delete mode 100644 modules/ui/fci/config.el delete mode 100644 modules/ui/fci/packages.el create mode 100644 modules/ui/fill-column/config.el create mode 100644 modules/ui/fill-column/packages.el diff --git a/core/core-modules.el b/core/core-modules.el index f91778076..5cd92540c 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -18,7 +18,8 @@ (:tools (rotate-text (:editor rotate-text))) (:emacs (electric-indent (:emacs electric)) (hideshow (:editor fold))) - (:ui (doom-modeline (:ui modeline)))) + (:ui (doom-modeline (:ui modeline))) + (:ui (fci (:ui fill-column)))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . MODULES). E.g. diff --git a/init.example.el b/init.example.el index beeddd51d..d796af67b 100644 --- a/init.example.el +++ b/init.example.el @@ -23,7 +23,7 @@ doom-dashboard ; a nifty splash screen for Emacs doom-quit ; DOOM quit-message prompts when you quit Emacs evil-goggles ; display visual hints when editing in evil - ;;fci ; a `fill-column' indicator + ;;fill-column ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags ;;indent-guides ; highlighted indent columns modeline ; snazzy, Atom-inspired modeline, plus API diff --git a/modules/ui/fci/autoload.el b/modules/ui/fci/autoload.el deleted file mode 100644 index f7af8865f..000000000 --- a/modules/ui/fci/autoload.el +++ /dev/null @@ -1,15 +0,0 @@ -;;; ui/fci/autoload.el -*- lexical-binding: t; -*- - -(defvar-local +fci-last-state nil) - -;;;###autoload -(defun +fci|disable-when-company-activates (&rest ignore) - "TODO" - (when (setq +fci-last-state (bound-and-true-p fci-mode)) - (fci-mode -1))) - -;;;###autoload -(defun +fci|enable-when-company-deactivates (&rest ignore) - "TODO" - (when +fci-last-state - (fci-mode 1))) diff --git a/modules/ui/fci/config.el b/modules/ui/fci/config.el deleted file mode 100644 index 77da05dd8..000000000 --- a/modules/ui/fci/config.el +++ /dev/null @@ -1,35 +0,0 @@ -;;; ui/fci/config.el -*- lexical-binding: t; -*- - -(defvar +fci-rule-color-function - (if EMACS26+ - (lambda () (face-foreground 'line-number)) - (lambda () (face-foreground 'font-lock-comment-face))) - "Color used to draw the fill-column rule. - -Accepts a color string or a function that returns a color. - -Changes to this variable do not take effect until `fci-mode' is restarted.") - - -;; -;; Packages - -(def-package! fill-column-indicator - :hook ((text-mode prog-mode conf-mode) . turn-on-fci-mode) - :config - ;; fci is broken in `org-mode' when `org-indent-mode' is active. org-indent is - ;; more important to me, so... - (add-hook 'org-mode-hook #'turn-off-fci-mode) - - (defun +fci|set-color () - "Automatically change `fci-rule-color' based on `+fci-rule-color-function's -return value. To disable this, either set `+fci-rule-color-function' to nil or -remove `+fci|set-color' from `fci-mode-hook'." - (when (functionp +fci-rule-color-function) - (setq fci-rule-color (funcall +fci-rule-color-function)))) - (add-hook 'fci-mode-hook #'+fci|set-color) - - (when (featurep! :completion company) - (add-hook 'company-completion-started-hook #'+fci|disable-when-company-activates) - (add-hook! '(company-completion-finished-hook company-completion-cancelled-hook) - #'+fci|enable-when-company-deactivates))) diff --git a/modules/ui/fci/packages.el b/modules/ui/fci/packages.el deleted file mode 100644 index 26d8b1335..000000000 --- a/modules/ui/fci/packages.el +++ /dev/null @@ -1,4 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ui/fci/packages.el - -(package! fill-column-indicator) diff --git a/modules/ui/fill-column/config.el b/modules/ui/fill-column/config.el new file mode 100644 index 000000000..3a2629e4f --- /dev/null +++ b/modules/ui/fill-column/config.el @@ -0,0 +1,4 @@ +;;; ui/fill-column/config.el -*- lexical-binding: t; -*- + +(def-package! hl-fill-column + :hook ((text-mode prog-mode conf-mode) . hl-fill-column-mode)) diff --git a/modules/ui/fill-column/packages.el b/modules/ui/fill-column/packages.el new file mode 100644 index 000000000..0117dad31 --- /dev/null +++ b/modules/ui/fill-column/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/fill-column/packages.el + +(package! hl-fill-column) From 79e8a466a3d245027ffd819d2cdad424574b9367 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Apr 2019 20:30:31 -0400 Subject: [PATCH 4096/4235] tools/flycheck: change idle delay behavior Flycheck will now wait longer to check for errors when the last check produced no errors, and quicker when there are. It will also avoid displaying flycheck-posframe if in insert mode (as it can disturb cursor positioning and change evil state in some edge cases). --- modules/tools/flycheck/config.el | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/modules/tools/flycheck/config.el b/modules/tools/flycheck/config.el index 57c98bfda..b7f79b7b7 100644 --- a/modules/tools/flycheck/config.el +++ b/modules/tools/flycheck/config.el @@ -5,14 +5,15 @@ ;; -;; Packages +;;; Packages (def-package! flycheck :commands (flycheck-list-errors flycheck-buffer) :after-call (doom-switch-buffer-hook after-find-file) :config - ;; Emacs feels snappier without checks on newline - (setq flycheck-check-syntax-automatically (delq 'new-line flycheck-check-syntax-automatically)) + ;; new-line checks are a mote excessive; idle checks are more than enough + (setq flycheck-check-syntax-automatically + (delq 'new-line flycheck-check-syntax-automatically)) (defun +flycheck|buffer () "Flycheck buffer on ESC in normal mode." @@ -21,11 +22,13 @@ nil)) (add-hook 'doom-escape-hook #'+flycheck|buffer t) - (after! evil - (setq-hook! 'evil-insert-state-entry-hook - flycheck-idle-change-delay 1.75) - (setq-hook! 'evil-insert-state-exit-hook - flycheck-idle-change-delay (default-value 'flycheck-idle-change-delay))) + (defun +flycheck|adjust-syntax-check-eagerness () + "Check for errors less often when there aren't any. +Done to reduce the load flycheck imposes on the current buffer." + (if flycheck-current-errors + (kill-local-variable 'flycheck-idle-change-delay) + (setq-local flycheck-idle-change-delay 3.0))) + (add-hook 'flycheck-after-syntax-check-hook #'+flycheck|adjust-syntax-check-eagerness) (global-flycheck-mode +1)) @@ -33,7 +36,12 @@ (def-package! flycheck-popup-tip :commands (flycheck-popup-tip-show-popup flycheck-popup-tip-delete-popup) :init (add-hook 'flycheck-mode-hook #'+flycheck|init-popups) - :config (setq flycheck-popup-tip-error-prefix "✕ ")) + :config + (setq flycheck-popup-tip-error-prefix "✕ ") + (after! evil + ;; Don't display errors while in insert mode, as it can affect the cursor's + ;; position or cause disruptive input delays. + (add-hook 'flycheck-posframe-inhibit-functions #'evil-insert-state-p))) (def-package! flycheck-posframe From 3eaa57c747832ca118a49688b70672d55ff81135 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 1 Apr 2019 20:31:58 -0400 Subject: [PATCH 4097/4235] Add packages.json to projectile root files #1295 --- modules/lang/javascript/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index a4b46b448..f74bb1da0 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -55,6 +55,7 @@ (set-repl-handler! 'js2-mode #'+javascript/open-repl) (after! projectile + (add-to-list 'projectile-project-root-files "packages.json") (add-to-list 'projectile-globally-ignored-directories "node_modules")) (map! :map js2-mode-map From 5c3188afd5fe67b919a03136ac42bc1c789cbbe2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 00:51:29 -0400 Subject: [PATCH 4098/4235] editor/format: fix +format/region-or-buffer The `r` interactive spec barfs an error if no mark is active, preventing this function from ever calling `+format/buffer`. Reported by @amosbird --- modules/editor/format/autoload/format.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 8152cdcd6..8cea65a04 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -204,13 +204,14 @@ snippets or single lines." (+format/buffer arg)))) ;;;###autoload -(defun +format/region-or-buffer (beg end &optional arg) +(defun +format/region-or-buffer () "Runs the active formatter on the selected region (or whole buffer, if nothing is selected)." - (interactive "rP") - (if (use-region-p) - (+format/region beg end arg) - (call-interactively #'+format/buffer))) + (interactive) + (call-interactively + (if (use-region-p) + #'+format/region + #'+format/buffer))) ;; From fd48329c36fb9af620440fb5dc616869933a0d30 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 00:55:43 -0400 Subject: [PATCH 4099/4235] Reset exec-path/shell-file-name on doom/reload-env --- core/autoload/config.el | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/autoload/config.el b/core/autoload/config.el index eebc23f5f..86759963a 100644 --- a/core/autoload/config.el +++ b/core/autoload/config.el @@ -63,7 +63,12 @@ Uses the same mechanism as 'bin/doom env reload'." (sit-for 1)) (unless (file-readable-p doom-env-file) (error "Failed to generate env file")) - (load-env-vars doom-env-file)) + (load-env-vars doom-env-file) + (setq-default + exec-path (append (split-string (getenv "PATH") ":") + (list exec-directory)) + shell-file-name (or (getenv "SHELL") + shell-file-name))) ;;;###autoload (defun doom/reload-font () From 5b890757e1c948f0baf35f7b31d56c9e1c58b19a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 02:42:38 -0400 Subject: [PATCH 4100/4235] Add which-key labels for leader/localleader keys --- modules/config/default/config.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 8df99c464..c8c341e03 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -117,6 +117,9 @@ "W" #'+default/man-or-woman) (after! which-key + (which-key-add-key-based-replacements doom-leader-key "") + (which-key-add-key-based-replacements doom-localleader-key "") + (which-key-add-key-based-replacements "C-h r" "reload") (when (featurep 'evil) (which-key-add-key-based-replacements (concat doom-leader-key " r") "reload") From a08e00c4d440ef3b78175a1e042f75f9a0f60047 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 14:03:27 -0400 Subject: [PATCH 4101/4235] Refactor aspell/hunspell initialization --- modules/tools/flyspell/config.el | 74 ++++++++++++++++---------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index bb211be43..f5783e86b 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -13,48 +13,48 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (after! ispell (setq-default ispell-dictionary "english") + (add-to-list 'ispell-extra-args "--dont-tex-check-comments") - (let ((no-flags (and (not (featurep! +aspell)) (not (featurep! +hunspell))))) - ;; Enable either aspell or hunspell. - ;; If no module flags are given, enable either aspell or hunspell if their - ;; ... binary is found. - ;; If one of the flags `+aspell' or `+hunspell' is given, try to only - ;; ... enable that spell checker and not the other. - (cond - ((and (or no-flags (featurep! +aspell)) - (executable-find "aspell")) - (setq ispell-program-name "aspell" - ispell-extra-args '("--sug-mode=ultra" "--run-together")) + ;; Enable either aspell or hunspell. + ;; If no module flags are given, enable either aspell or hunspell if their + ;; binary is found. + ;; If one of the flags `+aspell' or `+hunspell' is given, only enable that + ;; spell checker. + (pcase (cond ((featurep! +aspell) 'aspell) + ((featurep! +hunspell) 'hunspell) + ((executable-find "aspell") 'aspell) + ((executable-find "hunspell") 'hunspell)) + (`aspell + (setq ispell-program-name "aspell" + ispell-extra-args '("--sug-mode=ultra" "--run-together")) - (setq-hook! 'text-mode-hook - ispell-extra-args (remove "--run-together" ispell-extra-args)) + (defun +flyspell|remove-run-together-switch-for-aspell () + (setq-local ispell-extra-args (remove "--run-together" ispell-extra-args))) + (add-hook 'text-mode-hook #'+flyspell|remove-run-together-switch-for-aspell) - (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) - (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) - (ispell-kill-ispell t) - (apply orig-fun args) - (ispell-kill-ispell t))) - (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) - (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) + (defun +flyspell*setup-ispell-extra-args (orig-fun &rest args) + (let ((ispell-extra-args (remove "--run-together" ispell-extra-args))) + (ispell-kill-ispell t) + (apply orig-fun args) + (ispell-kill-ispell t))) + (advice-add #'ispell-word :around #'+flyspell*setup-ispell-extra-args) + (advice-add #'flyspell-auto-correct-word :around #'+flyspell*setup-ispell-extra-args)) - ((and (or no-flags (featurep! +hunspell)) - (executable-find "hunspell")) - (setq ispell-program-name "hunspell" - ;; Don't use `ispell-cmd-args', it isn't respected with hunspell. - ;; Hack ispell-local-dictionary-alist instead. - ispell-dictionary-alist - `((,ispell-local-dictionary - "[[:alpha:]]" - "[^[:alpha:]]" - "[']" - nil - ("-d" ,ispell-local-dictionary) - nil - utf-8)))) - - t (user-error "Spell checker not found. Either install `aspell' of `hunspell'"))) + (`hunspell + (setq ispell-program-name "hunspell" + ;; Don't use `ispell-cmd-args', it isn't respected with hunspell. + ;; Hack ispell-local-dictionary-alist instead. + ispell-dictionary-alist + `((,ispell-local-dictionary + "[[:alpha:]]" + "[^[:alpha:]]" + "[']" + nil + ("-d" ,ispell-local-dictionary) + nil + utf-8)))) - (add-to-list 'ispell-extra-args "--dont-tex-check-comments")) + (_ (warn "Spell checker not found. Either install `aspell' of `hunspell'")))) ;; `flyspell' (built-in) From 6a99d7840b09b0db15ca75ebab4e134249ead5f0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 14:04:10 -0400 Subject: [PATCH 4102/4235] Correct minor typo in warning message --- modules/tools/flyspell/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index f5783e86b..1fd57a4e9 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -54,7 +54,7 @@ Since spellchecking can be slow in some buffers, this can be disabled with: nil utf-8)))) - (_ (warn "Spell checker not found. Either install `aspell' of `hunspell'")))) + (_ (warn "Spell checker not found. Either install `aspell' or `hunspell'")))) ;; `flyspell' (built-in) From 1f1e4d8d831fce8ac816c5b904d4e9108560da70 Mon Sep 17 00:00:00 2001 From: chrunchyjesus Date: Tue, 2 Apr 2019 21:37:52 +0200 Subject: [PATCH 4103/4235] fix typo (#1303) --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index f74bb1da0..0a4e553d4 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -55,7 +55,7 @@ (set-repl-handler! 'js2-mode #'+javascript/open-repl) (after! projectile - (add-to-list 'projectile-project-root-files "packages.json") + (add-to-list 'projectile-project-root-files "package.json") (add-to-list 'projectile-globally-ignored-directories "node_modules")) (map! :map js2-mode-map From 3310f9dfe2348b11e6414d65ebbcecc3609cd8e8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 12:50:18 -0400 Subject: [PATCH 4104/4235] tools/gist: open gists in non-popups - Removes +gist/kill-cache (gist-list and gist-list-user with a universal argument already does this). - Removes +gist/open-current. No longer necessary when gists aren't opened in popups. - Makes keybinds more consistent with other "porcelains", like elfeed's or magit. --- modules/config/default/+evil-bindings.el | 9 ++++----- modules/tools/gist/autoload/gist.el | 16 ---------------- modules/tools/gist/config.el | 2 ++ 3 files changed, 6 insertions(+), 21 deletions(-) delete mode 100644 modules/tools/gist/autoload/gist.el diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ac1617fd7..56999ad4f 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -467,14 +467,13 @@ (:when (featurep! :tools gist) :after gist :map gist-list-menu-mode-map - :n "RET" #'+gist/open-current - :n [return] #'+gist/open-current - :n "b" #'gist-browse-current-url + :n "go" #'gist-browse-current-url + :n "gr" #'gist-list-reload :n "c" #'gist-add-buffer :n "d" #'gist-kill-current + :n "e" #'gist-edit-current-description :n "f" #'gist-fork - :n "q" #'quit-window - :n "r" #'gist-list-reload + :n "q" #'kill-this-buffer :n "s" #'gist-star :n "S" #'gist-unstar :n "y" #'gist-print-current-url)) diff --git a/modules/tools/gist/autoload/gist.el b/modules/tools/gist/autoload/gist.el deleted file mode 100644 index 1202b003a..000000000 --- a/modules/tools/gist/autoload/gist.el +++ /dev/null @@ -1,16 +0,0 @@ -;;; tools/gist/autoload/gist.el -*- lexical-binding: t; -*- - -;;;###autoload -(defun +gist/open-current () - (interactive) - (gist-fetch-current) - (when-let* ((win (get-buffer-window "*github:gists*"))) - (doom/popup-close win))) - -;;;###autoload -(defun +gist/kill-cache () - "Clears the gist cache. Necessary when a faulty cache causes gist.el to be -entirely unuseable." - (interactive) - (delete-directory (expand-file-name "gh" pcache-directory) t) - (message "gist.el cache cleared")) diff --git a/modules/tools/gist/config.el b/modules/tools/gist/config.el index 9fa0e730d..4e8f84b52 100644 --- a/modules/tools/gist/config.el +++ b/modules/tools/gist/config.el @@ -7,6 +7,8 @@ (after! gist (set-evil-initial-state! 'gist-list-mode 'normal) + (set-popup-rule! "^\\*gist-" :ignore t) + (defun +gist*list-render (orig-fn &rest args) (funcall orig-fn (car args) t) (unless (cadr args) From ca32f7b7d1016eb69728ff17a67ef62617d6008a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 12:52:00 -0400 Subject: [PATCH 4105/4235] app/rss: improve entry readability By not using variable-pitch fonts in the SHR-converted output and allowing images to be larger than 60% of the window's width. Also corrects the docstring for +rss|elfeed-wrap, promising to use `visual-fill-column-mode` when it doesn't (and never did). Also changes `=rss` to an alias. --- modules/app/rss/autoload.el | 9 ++++----- modules/app/rss/config.el | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/modules/app/rss/autoload.el b/modules/app/rss/autoload.el index 14e633b5f..bee317f78 100644 --- a/modules/app/rss/autoload.el +++ b/modules/app/rss/autoload.el @@ -1,10 +1,8 @@ ;;; app/rss/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun =rss () - "Activate (or switch to) `elfeed' in its workspace." - (interactive) - (call-interactively #'elfeed)) +(defalias '=rss #'elfeed + "Activate (or switch to) `elfeed' in its workspace.") ;;;###autoload (defun +rss/delete-pane () @@ -50,10 +48,11 @@ ;;;###autoload (defun +rss|elfeed-wrap () "Enhances an elfeed entry's readability by wrapping it to a width of -`fill-column' and centering it with `visual-fill-column-mode'." +`fill-column'." (let ((inhibit-read-only t) (inhibit-modification-hooks t)) (setq-local truncate-lines nil) + (setq-local shr-use-fonts nil) (setq-local shr-width 85) (set-buffer-modified-p nil))) diff --git a/modules/app/rss/config.el b/modules/app/rss/config.el index 2aedd9816..59cadfc6c 100644 --- a/modules/app/rss/config.el +++ b/modules/app/rss/config.el @@ -27,7 +27,7 @@ easier to scroll through.") elfeed-enclosure-default-dir (concat doom-local-dir "elfeed/enclosures/") elfeed-show-entry-switch #'pop-to-buffer elfeed-show-entry-delete #'+rss/delete-pane - shr-max-image-proportion 0.6) + shr-max-image-proportion 0.8) (set-popup-rule! "^\\*elfeed-entry" :size 0.75 :actions '(display-buffer-below-selected) From 2c81ee4d980d3e0cc032f6402fa42e4ccbb21095 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 15:33:03 -0400 Subject: [PATCH 4106/4235] tools/flyspell: minor refactor - Allow flyspell-correct-* packages to be disabled by the end-user without breaking errors. - Tie proselint detection to flycheck (which is what uses it) --- modules/tools/flyspell/config.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/tools/flyspell/config.el b/modules/tools/flyspell/config.el index 1fd57a4e9..2893f0b67 100644 --- a/modules/tools/flyspell/config.el +++ b/modules/tools/flyspell/config.el @@ -64,7 +64,8 @@ Since spellchecking can be slow in some buffers, this can be disabled with: (defun +flyspell|inhibit-duplicate-detection-maybe () "Don't mark duplicates when style/grammar linters are present. e.g. proselint and langtool." - (when (or (executable-find "proselint") + (when (or (and (bound-and-true-p flycheck-mode) + (executable-find "proselint")) (featurep 'langtool)) (setq-local flyspell-mark-duplications-flag nil))) (add-hook 'flyspell-mode-hook #'+flyspell|inhibit-duplicate-detection-maybe) @@ -84,10 +85,10 @@ e.g. proselint and langtool." :commands (flyspell-correct-word-generic flyspell-correct-previous-word-generic) :config - (cond ((featurep! :completion helm) - (require 'flyspell-correct-helm)) - ((featurep! :completion ivy) - (require 'flyspell-correct-ivy)) - ((require 'flyspell-correct-popup) + (cond ((and (featurep! :completion helm) + (require 'flyspell-correct-helm nil t))) + ((and (featurep! :completion ivy) + (require 'flyspell-correct-ivy nil t))) + ((require 'flyspell-correct-popup nil t) (setq flyspell-popup-correct-delay 0.8) (define-key popup-menu-keymap [escape] #'keyboard-quit)))) From a49a9fee3aa814d067e6dd985e6e1b7fba1187b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 18:21:34 -0400 Subject: [PATCH 4107/4235] lang/haskell: fix +haskell/open-repl REPL handlers must return a buffer but display-buffer returns a window. --- modules/lang/haskell/autoload.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/lang/haskell/autoload.el b/modules/lang/haskell/autoload.el index d3c36a20b..cfcd12be0 100644 --- a/modules/lang/haskell/autoload.el +++ b/modules/lang/haskell/autoload.el @@ -4,7 +4,11 @@ (defun +haskell/open-repl (&optional arg) "Opens a Haskell REPL." (interactive "P") - (display-buffer - (if (featurep! +intero) - (intero-repl-buffer arg) - (haskell-session-interactive-buffer (haskell-session))))) + (if-let* + ((window + (display-buffer + (if (featurep! +intero) + (intero-repl-buffer arg) + (haskell-session-interactive-buffer (haskell-session)))))) + (window-buffer window) + (error "Failed to display Haskell REPL"))) From ea857aa5538f7824c2fe3c6eea47cab37c777fbf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 18:22:01 -0400 Subject: [PATCH 4108/4235] feature/eval: improve REPL error handling Emit more informative error messages depending on the problem. --- modules/feature/eval/autoload/repl.el | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/feature/eval/autoload/repl.el b/modules/feature/eval/autoload/repl.el index 5d22b47cd..58fde8c07 100644 --- a/modules/feature/eval/autoload/repl.el +++ b/modules/feature/eval/autoload/repl.el @@ -24,9 +24,12 @@ (if (commandp command) (call-interactively command) (funcall command)))) - (unless (bufferp buffer) - (error "REPL command didn't return a buffer")) - (with-current-buffer buffer (+eval-repl-mode +1)) + (cond ((null buffer) + (error "REPL handler %S couldn't open the REPL buffer" command)) + ((not (bufferp buffer)) + (error "REPL handler %S failed to return a buffer" command))) + (with-current-buffer buffer + (+eval-repl-mode +1)) (puthash key buffer +eval-repl-buffers) buffer))) (with-current-buffer buffer From 34e398540952f7a9ad9274f1105450608d25d8d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 2 Apr 2019 20:09:44 -0400 Subject: [PATCH 4109/4235] Remove doom/open-env This file shouldn't be edited by hand anyway. --- core/autoload/config.el | 9 --------- 1 file changed, 9 deletions(-) diff --git a/core/autoload/config.el b/core/autoload/config.el index 86759963a..2e00de8ff 100644 --- a/core/autoload/config.el +++ b/core/autoload/config.el @@ -18,15 +18,6 @@ (interactive) (doom-project-find-file doom-private-dir)) -;;;###autoload -(defun doom/open-env () - "TODO" - (interactive) - (when (and (not (file-exists-p doom-env-file)) - (y-or-n-p "User doesn't have an envvar file, generate one?")) - (doom/reload-env)) - (find-file doom-env-file)) - ;;;###autoload (defun doom/reload (&optional force-p) "Reloads your private config. From 700cda370b92b8c0ffbe38171f7d5044632b1329 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Apr 2019 00:08:06 -0400 Subject: [PATCH 4110/4235] Refactor doom env - Limits process-environment during scraping - Add `doom-env-executable` and `doom-env-switches` variables - Announce what commands were run to produce your env var within env var file header --- core/cli/env.el | 100 ++++++++++++++++++++++++++++++------------------ core/core.el | 5 ++- 2 files changed, 66 insertions(+), 39 deletions(-) diff --git a/core/cli/env.el b/core/cli/env.el index 679dd4747..1fbc050f9 100644 --- a/core/cli/env.el +++ b/core/cli/env.el @@ -3,7 +3,7 @@ (dispatcher! env (let ((env-file (abbreviate-file-name doom-env-file))) (pcase (car args) - ("refresh" + ((or "refresh" "re") (doom-reload-env-file 'force)) ("enable" (setenv "DOOMENV" "1") @@ -42,7 +42,7 @@ needs to be run once).") ;; ;; Helpers -(defvar doom-ignored-env-vars +(defvar doom-env-ignored-vars '("DBUS_SESSION_BUS_ADDRESS" "GPG_AGENT_INFO" "SSH_AGENT_PID" @@ -53,9 +53,30 @@ needs to be run once).") "YES") "Environment variables to not save in `doom-env-file'.") -;; Borrows heavily from Spacemacs'`spacemacs//init-spacemacs-env'. +(defvar doom-env-executable + (if IS-WINDOWS + "set" + (executable-find "env")) + "The program to use to scrape your shell environment with. +It is rare that you'll need to change this.") + +(defvar doom-env-switches + (if IS-WINDOWS + '("-c") + ;; Execute twice, once in a non-interactive login shell and once in an + ;; interactive shell in order to capture all the init files possible. + '("-lc" "-ic")) + "The `shell-command-switch'es to use on `doom-env-executable'. +This is a list of strings. Each entry is run separately and in sequence with +`doom-env-executable' to scrape envvars from your shell environment.") + +;; Borrows heavily from Spacemacs' `spacemacs//init-spacemacs-env'. (defun doom-reload-env-file (&optional force-p) - "Generates `doom-env-file', if it doesn't exist (or FORCE-P is non-nil)." + "Generates `doom-env-file', if it doesn't exist (or FORCE-P is non-nil). + +Runs `doom-env-executable' X times, where X = length of `doom-env-switches', to +scrape the variables from your shell environment. Duplicates are removed. The +order of `doom-env-switches' determines priority." (when (or force-p (not (file-exists-p doom-env-file))) (with-temp-file doom-env-file (message "%s envvars file at %S" @@ -63,37 +84,40 @@ needs to be run once).") "Regenerating" "Generating") (abbreviate-file-name doom-env-file)) - (insert - (concat - "# -*- mode: dotenv -*-\n" - "# ---------------------------------------------------------------------------\n" - "# This file was auto-generated by Doom. It contains all environment variables\n" - "# scraped from your default shell (excluding variables blacklisted in\n" - "# doom-ignored-env-vars).\n" - "#\n" - "# It is NOT safe to edit this file. Changes will be overwritten next time\n" - "# that `doom env refresh` is executed. Alternatively, create your own env file\n" - "# in your DOOMDIR and load that with `(load-env-vars FILE)`.\n" - "#\n" - "# To auto-regenerate this file when `doom reload` is run, use `doom env enable'\n" - "# or set DOOMENV=1 in your shell environment/config.\n" - "# ---------------------------------------------------------------------------\n\n")) - (let ((env-point (point)) - (switches - (cond (IS-WINDOWS '("-c")) - ;; Execute twice, once in a non-interactive login shell and - ;; once in an interactive shell in order to capture all the - ;; init files possible. - ((or IS-MAC IS-LINUX) '("-lc" "-ic")))) - (executable (if IS-WINDOWS - "set" - (executable-find "env")))) - (dolist (shell-command-switch switches) - (insert (shell-command-to-string executable))) - ;; sort the environment variables - (sort-lines nil env-point (point-max)) - ;; remove adjacent duplicated lines - (delete-duplicate-lines env-point (point-max) nil t) - ;; remove ignored environment variables - (dolist (var doom-ignored-env-vars) - (flush-lines (concat "^" var "=") env-point (point-max))))))) + (let ((process-environment doom-site-process-environment)) + (insert + (concat + "# -*- mode: dotenv -*-\n" + "# ---------------------------------------------------------------------------\n" + "# This file was auto-generated by Doom by running:\n" + "#\n" + (cl-loop for switch in doom-env-switches + concat (format "# %s %s %s\n" + shell-file-name + switch + doom-env-executable)) + "#\n" + "# It contains all environment variables scraped from your default shell\n" + "# (excluding variables blacklisted in doom-env-ignored-vars).\n" + "#\n" + "# It is NOT safe to edit this file. Changes will be overwritten next time\n" + "# that `doom env refresh` is executed. Alternatively, create your own env file\n" + "# in your DOOMDIR and load that with `(load-env-vars FILE)`.\n" + "#\n" + "# To auto-regenerate this file when `doom reload` is run, use `doom env enable'\n" + "# or set DOOMENV=1 in your shell environment/config.\n" + "# ---------------------------------------------------------------------------\n\n")) + (let ((env-point (point))) + (dolist (shell-command-switch doom-env-switches) + (message "Scraping env from '%s %s %s'" + shell-file-name + shell-command-switch + doom-env-executable) + (insert (shell-command-to-string doom-env-executable))) + ;; sort the environment variables + (sort-lines nil env-point (point-max)) + ;; remove adjacent duplicated lines + (delete-duplicate-lines env-point (point-max) nil t) + ;; remove ignored environment variables + (dolist (var doom-env-ignored-vars) + (flush-lines (concat "^" var "=") env-point (point-max)))))))) diff --git a/core/core.el b/core/core.el index 8703e0260..ed75e94b5 100644 --- a/core/core.el +++ b/core/core.el @@ -99,7 +99,10 @@ MacOS users).") Doom was setup, which can cause problems.") (defvar doom-site-load-path load-path - "The starting load-path, before it is altered by `doom-initialize'.") + "The starting `load-path', before it is altered by `doom-initialize'.") + +(defvar doom-site-process-environment process-environment + "The starting `process-environment', before it is altered by `doom-initialize'.") (defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) (defvar doom--last-emacs-version nil) From 9648af6f3051e92c85cba5edf1289430b871dea7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Apr 2019 01:40:58 -0400 Subject: [PATCH 4111/4235] Fix keybinds to reflex helm-occur changes upstream See emacs-helm/helm@f0f17413 --- modules/config/default/+evil-bindings.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 56999ad4f..f56d08003 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -344,9 +344,9 @@ (:after helm-buffers :map helm-buffer-map [C-return] #'helm-buffer-switch-other-window) - (:after helm-regexp - :map helm-moccur-map - [C-return] #'helm-moccur-run-goto-line-ow) + (:after helm-occur + :map helm-occur-map + [C-return] #'helm-occur-run-goto-line-ow) (:after helm-grep :map helm-grep-map [C-return] #'helm-grep-run-other-window-action)))) From 2a079e273344a20dfee638a550025babbfb8a39d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Apr 2019 01:53:20 -0400 Subject: [PATCH 4112/4235] Load env even in tty Emacs Even if it matches the current shell (or doesn't), the env file should be the authority. --- core/core.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.el b/core/core.el index ed75e94b5..0dc7a8f4a 100644 --- a/core/core.el +++ b/core/core.el @@ -456,7 +456,7 @@ to least)." (user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them"))) ;; Load shell environment - (when (and (or (daemonp) (display-graphic-p)) + (when (and (not noninteractive) (file-readable-p doom-env-file) (require 'load-env-vars nil t)) (load-env-vars doom-env-file) From 4b631f07ef54a4d5b7bf12288068038b9da7936a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 3 Apr 2019 19:15:02 -0400 Subject: [PATCH 4113/4235] Apply smartparens config to all users Not just evil users. --- modules/config/default/+evil.el | 88 -------------------------------- modules/config/default/config.el | 88 ++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 88 deletions(-) diff --git a/modules/config/default/+evil.el b/modules/config/default/+evil.el index 5d624abed..e1c7eddb6 100644 --- a/modules/config/default/+evil.el +++ b/modules/config/default/+evil.el @@ -6,94 +6,6 @@ (add-hook 'evil-insert-state-exit-hook #'+default|disable-delete-selection-mode) -;; -;;; Smartparens config - -(when (featurep! +smartparens) - ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) - ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) - ;; or specific :post-handlers with: - ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) - (after! smartparens - ;; Autopair quotes more conservatively; if I'm next to a word/before another - ;; quote, I likely don't want to open a new pair. - (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)) - - ;; Expand {|} => { | } - ;; Expand {|} => { - ;; | - ;; } - (dolist (brace '("(" "{" "[")) - (sp-pair brace nil - :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) - ;; I likely don't want a new pair if adjacent to a word or opening brace - :unless '(sp-point-before-word-p sp-point-before-same-p))) - - ;; Major-mode specific fixes - (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" - :pre-handlers '(:rem sp-ruby-pre-handler) - :post-handlers '(:rem sp-ruby-post-handler)) - - ;; Don't do square-bracket space-expansion where it doesn't make sense to - (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) - "[" nil :post-handlers '(:rem ("| " "SPC"))) - - ;; Reasonable default pairs for HTML-style comments - (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) - "" - :unless '(sp-point-before-word-p sp-point-before-same-p) - :actions '(insert) :post-handlers '(("| " "SPC"))) - - ;; Disable electric keys in C modes because it interferes with smartparens - ;; and custom bindings. We'll do it ourselves (mostly). - (after! cc-mode - (c-toggle-electric-state -1) - (c-toggle-auto-newline -1) - (setq c-electric-flag nil) - (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) - (define-key c-mode-base-map key nil))) - - ;; Expand C-style doc comment blocks. Must be done manually because some of - ;; these languages use specialized (and deferred) parsers, whose state we - ;; can't access while smartparens is doing its thing. - (defun +default-expand-doc-comment-block (&rest _ignored) - (let ((indent (current-indentation))) - (newline-and-indent) - (save-excursion - (newline) - (insert (make-string indent 32) " */") - (delete-char 2)))) - (sp-local-pair - '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode - csharp-mode java-mode php-mode css-mode scss-mode less-css-mode - stylus-mode) - "/*" "*/" - :actions '(insert) - :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) - - ;; Highjacks backspace to: - ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) - ;; b) delete space-indented `tab-width' steps at a time - ;; c) close empty multiline brace blocks in one step: - ;; { - ;; | - ;; } - ;; becomes {|} - ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work - ;; even after a backspace. - ;; e) properly delete smartparen pairs when they are encountered, without - ;; the need for strict mode. - ;; f) do none of this when inside a string - (advice-add #'delete-backward-char :override #'+default*delete-backward-char) - - ;; Makes `newline-and-indent' continue comments (and more reliably) - (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) - - ;; ;;; Keybindings diff --git a/modules/config/default/config.el b/modules/config/default/config.el index c8c341e03..88b984898 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -27,6 +27,94 @@ epa-pinentry-mode 'loopback)) +;; +;;; Smartparens config + +(when (featurep! +smartparens) + ;; You can disable :unless predicates with (sp-pair "'" nil :unless nil) + ;; And disable :post-handlers with (sp-pair "{" nil :post-handlers nil) + ;; or specific :post-handlers with: + ;; (sp-pair "{" nil :post-handlers '(:rem ("| " "SPC"))) + (after! smartparens + ;; Autopair quotes more conservatively; if I'm next to a word/before another + ;; quote, I likely don't want to open a new pair. + (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)) + + ;; Expand {|} => { | } + ;; Expand {|} => { + ;; | + ;; } + (dolist (brace '("(" "{" "[")) + (sp-pair brace nil + :post-handlers '(("||\n[i]" "RET") ("| " "SPC")) + ;; I likely don't want a new pair if adjacent to a word or opening brace + :unless '(sp-point-before-word-p sp-point-before-same-p))) + + ;; Major-mode specific fixes + (sp-local-pair '(ruby-mode enh-ruby-mode) "{" "}" + :pre-handlers '(:rem sp-ruby-pre-handler) + :post-handlers '(:rem sp-ruby-post-handler)) + + ;; Don't do square-bracket space-expansion where it doesn't make sense to + (sp-local-pair '(emacs-lisp-mode org-mode markdown-mode gfm-mode) + "[" nil :post-handlers '(:rem ("| " "SPC"))) + + ;; Reasonable default pairs for HTML-style comments + (sp-local-pair (append sp--html-modes '(markdown-mode gfm-mode)) + "" + :unless '(sp-point-before-word-p sp-point-before-same-p) + :actions '(insert) :post-handlers '(("| " "SPC"))) + + ;; Disable electric keys in C modes because it interferes with smartparens + ;; and custom bindings. We'll do it ourselves (mostly). + (after! cc-mode + (c-toggle-electric-state -1) + (c-toggle-auto-newline -1) + (setq c-electric-flag nil) + (dolist (key '("#" "{" "}" "/" "*" ";" "," ":" "(" ")" "\177")) + (define-key c-mode-base-map key nil))) + + ;; Expand C-style doc comment blocks. Must be done manually because some of + ;; these languages use specialized (and deferred) parsers, whose state we + ;; can't access while smartparens is doing its thing. + (defun +default-expand-doc-comment-block (&rest _ignored) + (let ((indent (current-indentation))) + (newline-and-indent) + (save-excursion + (newline) + (insert (make-string indent 32) " */") + (delete-char 2)))) + (sp-local-pair + '(js2-mode typescript-mode rjsx-mode rust-mode c-mode c++-mode objc-mode + csharp-mode java-mode php-mode css-mode scss-mode less-css-mode + stylus-mode) + "/*" "*/" + :actions '(insert) + :post-handlers '(("| " "SPC") ("|\n*/[i][d-2]" "RET") (+default-expand-doc-comment-block "*"))) + + ;; Highjacks backspace to: + ;; a) balance spaces inside brackets/parentheses ( | ) -> (|) + ;; b) delete space-indented `tab-width' steps at a time + ;; c) close empty multiline brace blocks in one step: + ;; { + ;; | + ;; } + ;; becomes {|} + ;; d) refresh smartparens' :post-handlers, so SPC and RET expansions work + ;; even after a backspace. + ;; e) properly delete smartparen pairs when they are encountered, without + ;; the need for strict mode. + ;; f) do none of this when inside a string + (advice-add #'delete-backward-char :override #'+default*delete-backward-char) + + ;; Makes `newline-and-indent' continue comments (and more reliably) + (advice-add #'newline-and-indent :around #'+default*newline-indent-and-continue-comments))) + + ;; ;;; Keybinding fixes From bf2aedc5105e4baa8305d7d5def737507f8fef20 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 13:37:10 -0400 Subject: [PATCH 4114/4235] lang/org: rethink flyspell keybinds - Remove ]s/[s keybinds in org-mode (rebound to ]c/[c); they overwrote next/prev flyspell error commands (which are vim defaults) - Remove ]S/[S because z= already exists - Remove redundant ]s/[s global keybinds (already bound by evil) - Mention missing and evil's flyspell keybinds in a comment --- modules/config/default/+evil-bindings.el | 12 ++++++++---- modules/lang/org/config.el | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index f56d08003..ea2d3b352 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -202,10 +202,14 @@ [delete] #'+snippets/delete-forward-char-or-field))) (:when (featurep! :tools flyspell) - :m "]s" #'evil-next-flyspell-error - :m "[s" #'evil-prev-flyspell-error - :m "]S" #'flyspell-correct-word-generic - :m "[S" #'flyspell-correct-previous-word-generic + ;; Keybinds that have no Emacs+evil analogues (i.e. don't exist): + ;; zq - mark word at point as good word + ;; zw - mark word at point as bad + ;; zu{q,w} - undo last marking + ;; Keybinds that evil define: + ;; z= - correct flyspell word at point + ;; ]s - jump to previous spelling error + ;; [s - jump to next spelling error (:map flyspell-mouse-map "RET" #'flyspell-correct-word-generic [return] #'flyspell-correct-word-generic diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 9632f266b..a8dc41bf3 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -398,8 +398,8 @@ between the two." :m "[h" #'org-previous-visible-heading :m "]l" #'org-next-link :m "[l" #'org-previous-link - :m "]s" #'org-babel-next-src-block - :m "[s" #'org-babel-previous-src-block + :m "]c" #'org-babel-next-src-block + :m "[c" #'org-babel-previous-src-block :m "^" #'evil-org-beginning-of-line :m "0" (λ! (let (visual-line-mode) (org-beginning-of-line))) :n "gQ" #'org-fill-paragraph From 23467374f5d1426c88f4e414c3699b817ca77781 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 15:13:48 -0400 Subject: [PATCH 4115/4235] Fix doom/forward-to-last-non-comment-or-eol #1306 This command would no-op if used in major modes with "fake" comments. i.e. modes where "comments" are merely highlighted as comments, but have no comment entry in its syntax table. e.g. text-mode + git-commit-mode. --- core/autoload/text.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/autoload/text.el b/core/autoload/text.el index 51486d559..2dd0184e1 100644 --- a/core/autoload/text.el +++ b/core/autoload/text.el @@ -54,7 +54,9 @@ true end of the line. The opposite of `doom/backward-to-bol-or-indent'." (end-of-visual-line) (end-of-line)) (point)))) - (if (and (sp-point-in-comment) (not (= (point) eol))) + (if (or (and (< (point) eol) + (sp-point-in-comment)) + (not (sp-point-in-comment eol))) (goto-char eol) (let* ((bol (save-excursion (beginning-of-visual-line) (point))) (boc (or (save-excursion From d3784a00741d247f0ae4bc733ddae1e48d5036e1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 16:47:52 -0400 Subject: [PATCH 4116/4235] lang/markdown: remove opinionated formatting Don't adjust line-spacing or fill-column, this interferes with global defaults as is too opinionated. --- modules/lang/markdown/config.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/lang/markdown/config.el b/modules/lang/markdown/config.el index aca6c7333..c17879cc5 100644 --- a/modules/lang/markdown/config.el +++ b/modules/lang/markdown/config.el @@ -19,10 +19,6 @@ (set-lookup-handlers! '(markdown-mode gfm-mode) :file #'markdown-follow-thing-at-point) - (defun +markdown|set-fill-column-and-line-spacing () - (setq-local line-spacing 2) - (setq-local fill-column 80)) - (add-hook 'markdown-mode-hook #'+markdown|set-fill-column-and-line-spacing) (add-hook 'markdown-mode-hook #'auto-fill-mode) (sp-with-modes '(markdown-mode gfm-mode) From 3a47c27dd675690d94e0645b99e17d3e80b01318 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 17:15:58 -0400 Subject: [PATCH 4117/4235] lang/org: fix C-S-{h,l} in tables Supposed to create new column on the left and right, respectively. Instead, always created columns on the right. --- modules/lang/org/autoload/tables.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/autoload/tables.el b/modules/lang/org/autoload/tables.el index 7248f4625..be0067e50 100644 --- a/modules/lang/org/autoload/tables.el +++ b/modules/lang/org/autoload/tables.el @@ -41,13 +41,14 @@ re-align the table if necessary. (Necessary because org-mode has a (if (org-at-table-p) (org-table-previous-field) (org-beginning-of-line))) ;;;###autoload -(defun +org/table-append-field-or-shift-right () - (interactive) - (org-shiftmetaright) - (when (org-at-table-p) (org-metaright))) +(defalias '+org/table-append-field-or-shift-right #'org-shiftmetaright) ;;;###autoload (defun +org/table-prepend-field-or-shift-left () + "TODO" (interactive) - (if (org-at-table-p) (org-shiftmetaright) (org-shiftmetaleft))) - + (if (org-at-table-p) + (progn + (org-shiftmetaright) + (org-table-move-column-left)) + (org-shiftmetaleft))) From 6084b774b8641b22ce732f77f051e0b1c50f34f5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 18:47:40 -0400 Subject: [PATCH 4118/4235] lang/org: refactor and add keybinds for org tables This update focuses on improving the key UX of org tables. - Adds new table localleader keys under `SPC m s' - Adds new localleader keybinds - New `s` prefix for table commands - New `f`/`F` keybinds for footnotes - New `'` keybind for `org-edit-special` - New `r` keybind for `org-refile` - Bind localleader keys for both evil and non-evil users - Refactors org table API - For evil users: - Adds `zi` to toggle inline images - Finalize insert-mode keybind scheme for evil users (ala excel/gdocs) - C-{h,j,k,l} = move cursor between cells - C-M-{h,j,k,l} = insert cells in direction - C-M-S-{h,j,k,l} = swap cells in direction --- modules/lang/org/autoload/org.el | 4 +- modules/lang/org/autoload/tables.el | 65 +++++++--------- modules/lang/org/config.el | 110 +++++++++++++++++++--------- 3 files changed, 106 insertions(+), 73 deletions(-) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index c74c10821..214483465 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -361,8 +361,8 @@ another level of headings on each invocation." ;;;###autoload (defun +org|indent-maybe () - "Indent the current item (header or item), if possible. Made for -`org-tab-first-hook' in evil-mode." + "Indent the current item (header or item), if possible. +Made for `org-tab-first-hook' in evil-mode." (interactive) (cond ((or (not (bound-and-true-p evil-mode)) (not (eq evil-state 'insert))) diff --git a/modules/lang/org/autoload/tables.el b/modules/lang/org/autoload/tables.el index be0067e50..5e150917c 100644 --- a/modules/lang/org/autoload/tables.el +++ b/modules/lang/org/autoload/tables.el @@ -1,12 +1,7 @@ ;;; org/org/autoload/tables.el -*- lexical-binding: t; -*- -;;;###autoload -(defun +org/table-next-row () - "Go to the next row (same column) in the current table." - (interactive) - (if (org-at-table-p) - (org-table-next-row) - (org-down-element))) +;; +;;; Row/Column traversal ;;;###autoload (defun +org/table-previous-row () @@ -14,41 +9,37 @@ re-align the table if necessary. (Necessary because org-mode has a `org-table-next-row', but not `org-table-previous-row')" (interactive) - (if (org-at-table-p) - (progn - (org-table-maybe-eval-formula) - (org-table-maybe-recalculate-line) - (if (and org-table-automatic-realign - org-table-may-need-update) - (org-table-align)) - (let ((col (org-table-current-column))) - (beginning-of-line 0) - (when (or (not (org-at-table-p)) (org-at-table-hline-p)) - (beginning-of-line)) - (org-table-goto-column col) - (skip-chars-backward "^|\n\r") - (when (org-looking-at-p " ") (forward-char)))) - (org-up-element))) + (org-table-maybe-eval-formula) + (org-table-maybe-recalculate-line) + (if (and org-table-automatic-realign + org-table-may-need-update) + (org-table-align)) + (let ((col (org-table-current-column))) + (beginning-of-line 0) + (when (or (not (org-at-table-p)) (org-at-table-hline-p)) + (beginning-of-line)) + (org-table-goto-column col) + (skip-chars-backward "^|\n\r") + (when (org-looking-at-p " ") + (forward-char)))) + + +;; +;;; Row/Column insertion ;;;###autoload -(defun +org/table-next-field () +(defun +org/table-insert-column-left () + "Insert a new column right of the current column." (interactive) - (if (org-at-table-p) (org-table-next-field) (org-end-of-line))) + (org-table-insert-column) + (org-table-move-column-left)) ;;;###autoload -(defun +org/table-previous-field () +(defun +org/table-insert-row-below () + "Insert a new row below the current row." (interactive) - (if (org-at-table-p) (org-table-previous-field) (org-beginning-of-line))) + (org-table-insert-row 'below)) ;;;###autoload -(defalias '+org/table-append-field-or-shift-right #'org-shiftmetaright) - -;;;###autoload -(defun +org/table-prepend-field-or-shift-left () - "TODO" - (interactive) - (if (org-at-table-p) - (progn - (org-shiftmetaright) - (org-table-move-column-left)) - (org-shiftmetaleft))) +(defalias '+org/table-insert-row-above #'org-table-insert-row + "Insert a new row above the current row.") diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index a8dc41bf3..b2ddff45c 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -341,7 +341,54 @@ between the two." "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line - [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line)) + [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line + + :localleader + "d" #'org-deadline + "b" #'org-switchb + "f" #'org-footnote-new + "F" #'org-footnote-goto-definition + "t" #'org-todo + "T" #'org-todo-list + "l" #'org-insert-link + "L" #'org-store-link + "r" #'org-refile + "'" #'org-edit-special + (:prefix ("c" . "clock") + "c" #'org-clock-in + "C" #'org-clock-out + "g" #'org-clock-goto + "G" (λ! (org-clock-goto 'select)) + "x" #'org-clock-cancel) + (:prefix ("e" . "export") + :desc "to markdown" "m" #'org-md-export-to-markdown + :desc "to markdown & open" "M" #'org-md-export-as-markdown + :desc "to reveal.js" "r" #'org-reveal-export-to-html + :desc "to reveal.js & open" "R" #'org-reveal-export-to-html-and-browse + (:prefix ("b" . "from beamer") + :desc "to latex" "l" #'org-beamer-export-to-latex + :desc "to latex & open" "L" #'org-beamer-export-as-latex + :desc "as pdf" "p" #'org-beamer-export-to-pdf)) + (:prefix ("s" . "tables") + "a" #'org-table-align + "e" #'org-table-edit-field + "h" #'org-table-field-info + (:prefix ("i" . "insert") + "-" #'org-table-insert-hline + "h" #'+org/table-insert-column-left + "j" #'+org/table-insert-row-below + "k" #'+org/table-insert-row-above + "l" #'+org/table-insert-column-right) + (:prefix ("m" . "move") + "h" #'org-table-move-column-left + "j" #'org-table-move-row-down + "k" #'org-table-move-row-up + "l" #'org-table-move-column-right) + (:prefix ("f" . "formula") + "c" #'org-table-create + "r" #'org-table-recalculate + "e" #'org-table-edit-formulas + "=" #'org-table-eval-formulas)))) (defun +org|setup-evil-keybinds (&rest args) @@ -377,15 +424,32 @@ between the two." ;; dedent with shift-tab in insert mode :i [backtab] #'+org/dedent ;; navigate table cells (from insert-mode) - :i "C-l" #'+org/table-next-field - :i "C-h" #'+org/table-previous-field - :i "C-k" #'+org/table-previous-row - :i "C-j" #'+org/table-next-row - ;; expand tables or move fields - :ni "C-S-l" #'+org/table-append-field-or-shift-right - :ni "C-S-h" #'+org/table-prepend-field-or-shift-left - :ni "C-S-k" #'org-metaup - :ni "C-S-j" #'org-metadown + :i "C-l" (general-predicate-dispatch 'org-end-of-line + (org-at-table-p) 'org-table-next-field) + :i "C-h" (general-predicate-dispatch 'org-beginning-of-line + (org-at-table-p) 'org-table-previous-field) + :i "C-k" (general-predicate-dispatch 'org-up-element + (org-at-table-p) '+org/table-previous-row) + :i "C-j" (general-predicate-dispatch 'org-down-element + (org-at-table-p) 'org-table-next-row) + ;; expand tables (insert columns/rows) + :ni "C-S-l" (general-predicate-dispatch 'org-shiftmetaright + (org-at-table-p) 'org-table-insert-column) + :ni "C-S-h" (general-predicate-dispatch 'org-shiftmetaleft + (org-at-table-p) '+org/table-insert-column-left) + :ni "C-S-k" (general-predicate-dispatch 'org-shiftmetaup + (org-at-table-p) '+org/table-insert-row-above) + :ni "C-S-j" (general-predicate-dispatch 'org-shiftmetadown + (org-at-table-p) '+org/table-insert-row-below) + ;; shifting table rows/columns + :ni "C-M-S-l" (general-predicate-dispatch 'org-metaright + (org-at-table-p) 'org-table-move-column-right) + :ni "C-M-S-h" (general-predicate-dispatch 'org-metaleft + (org-at-table-p) 'org-table-move-column-left) + :ni "C-M-S-k" (general-predicate-dispatch 'org-metaup + (org-at-table-p) 'org-table-move-row-up) + :ni "C-M-S-j" (general-predicate-dispatch 'org-metadown + (org-at-table-p) 'org-table-move-row-down) ;; more intuitive RET keybinds :i [return] #'org-return-indent :i "RET" #'org-return-indent @@ -413,6 +477,7 @@ between the two." :n "zO" #'outline-show-subtree :n "zr" #'+org/show-next-fold-level :n "zR" #'outline-show-all + :n "zi" #'org-toggle-inline-images :map org-read-date-minibuffer-local-map "C-h" (λ! (org-eval-in-calendar '(calendar-backward-day 1))) @@ -422,30 +487,7 @@ between the two." "C-S-h" (λ! (org-eval-in-calendar '(calendar-backward-month 1))) "C-S-l" (λ! (org-eval-in-calendar '(calendar-forward-month 1))) "C-S-k" (λ! (org-eval-in-calendar '(calendar-backward-year 1))) - "C-S-j" (λ! (org-eval-in-calendar '(calendar-forward-year 1))) - - :localleader - :map org-mode-map - "d" #'org-deadline - "b" #'org-switchb - "t" #'org-todo - "T" #'org-todo-list - "l" #'org-store-link - (:prefix ("c" . "clock") - "c" #'org-clock-in - "C" #'org-clock-out - "g" #'org-clock-goto - "G" (λ! (org-clock-goto 'select)) - "x" #'org-clock-cancel) - (:prefix ("e" . "export") - :desc "to markdown" "m" #'org-md-export-to-markdown - :desc "to markdown & open" "M" #'org-md-export-as-markdown - :desc "to reveal.js" "r" #'org-reveal-export-to-html - :desc "to reveal.js & open" "R" #'org-reveal-export-to-html-and-browse - (:prefix ("b" . "from beamer") - :desc "to latex" "l" #'org-beamer-export-to-latex - :desc "to latex & open" "L" #'org-beamer-export-as-latex - :desc "as pdf" "p" #'org-beamer-export-to-pdf)))) + "C-S-j" (λ! (org-eval-in-calendar '(calendar-forward-year 1))))) (defun +org|setup-hacks () From 5a50820cd92716acf56c18380433bd70a5b90e87 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 18:53:04 -0400 Subject: [PATCH 4119/4235] Bind z= -> flyspell-correct-word-generic z= is a vim default. `flyspell-correct-word-generic` is superior to the original command bound to z= (ispell-word). --- modules/config/default/+evil-bindings.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ea2d3b352..eaad3cab4 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -67,6 +67,7 @@ :n "gp" #'+evil/reselect-paste :n "g=" #'widen :v "g=" #'+evil:narrow-buffer + :nv "z=" #'flyspell-correct-word-generic :nv "g@" #'+evil:apply-macro :nv "gc" #'evil-commentary :nv "gx" #'evil-exchange From 348ba8f7d05688c23d15bdb9b8620818516e9d98 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 18:54:27 -0400 Subject: [PATCH 4120/4235] Correct type in `bin/doom` help --- bin/doom | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/doom b/bin/doom index 92b66bd26..9178f630e 100755 --- a/bin/doom +++ b/bin/doom @@ -15,7 +15,7 @@ (bold "Usage:") (file-name-nondirectory load-file-name)) "\n" - "A command line interfacing for managing Doom Emacs; including\n" + "A command line interface for managing Doom Emacs; including\n" "package management, diagnostics, unit tests, and byte-compilation.\n" "\n" "This tool also makes it trivial to launch Emacs out of a different\n" From 31ca94f5b0d996385b54931a6cec332878fbe8bb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 19:00:43 -0400 Subject: [PATCH 4121/4235] lang/org: remove unnecessary alias --- modules/lang/org/autoload/tables.el | 4 ---- modules/lang/org/config.el | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/lang/org/autoload/tables.el b/modules/lang/org/autoload/tables.el index 5e150917c..ffe162e51 100644 --- a/modules/lang/org/autoload/tables.el +++ b/modules/lang/org/autoload/tables.el @@ -39,7 +39,3 @@ re-align the table if necessary. (Necessary because org-mode has a "Insert a new row below the current row." (interactive) (org-table-insert-row 'below)) - -;;;###autoload -(defalias '+org/table-insert-row-above #'org-table-insert-row - "Insert a new row above the current row.") diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index b2ddff45c..6e8947707 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -377,7 +377,7 @@ between the two." "-" #'org-table-insert-hline "h" #'+org/table-insert-column-left "j" #'+org/table-insert-row-below - "k" #'+org/table-insert-row-above + "k" #'org-table-insert-row "l" #'+org/table-insert-column-right) (:prefix ("m" . "move") "h" #'org-table-move-column-left @@ -438,7 +438,7 @@ between the two." :ni "C-S-h" (general-predicate-dispatch 'org-shiftmetaleft (org-at-table-p) '+org/table-insert-column-left) :ni "C-S-k" (general-predicate-dispatch 'org-shiftmetaup - (org-at-table-p) '+org/table-insert-row-above) + (org-at-table-p) 'org-table-insert-row) :ni "C-S-j" (general-predicate-dispatch 'org-shiftmetadown (org-at-table-p) '+org/table-insert-row-below) ;; shifting table rows/columns From 5cdb96888f675c033e0e6a4e9337a2a42a4dbe4f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 4 Apr 2019 22:38:46 -0400 Subject: [PATCH 4122/4235] config/default: refactor/reformat help keybinds Reduce internal usage of map! and improve readability of comments for help-map binds. --- modules/config/default/config.el | 81 ++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 88b984898..bbec88eba 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -172,37 +172,50 @@ ;; Custom help keys -- these aren't under `+bindings' because they ought to be ;; universal. -(map! :map help-map - "'" #'describe-char - "a" #'apropos ; replaces `apropos-command' - "A" #'doom/describe-autodefs - "B" #'doom/open-bug-report - "C-c" #'describe-coding-system ; replaces `describe-copying' b/c not useful - "d" #'doom/describe-module ; replaces `apropos-documentation' b/c `apropos' covers this - "D" #'doom/open-manual - "E" #'doom/open-vanilla-sandbox - "F" #'describe-face ; replaces `Info-got-emacs-command-node' b/c redundant w/ `Info-goto-node' - "h" #'doom/describe-symbol ; replaces `view-hello-file' b/c annoying - "C-k" #'describe-key-briefly - "L" #'global-command-log-mode ; replaces `describe-language-environment' b/c remapped to C-l - "C-l" #'describe-language-environment - "M" #'doom/describe-active-minor-mode - "C-m" #'info-emacs-manual - "n" #'doom/open-news ; replaces `view-emacs-news' b/c it's on C-n too - "O" #'+lookup/online - "p" #'doom/describe-package ; replaces `finder-by-keyword' - "P" #'find-library ; replaces `describe-package' b/c redundant w/ `doom/describe-package' - "r" nil ; replaces `info-emacs-manual' b/c it's on C-m now - (:prefix "r" - "r" #'doom/reload - "t" #'doom/reload-theme - "p" #'doom/reload-packages - "f" #'doom/reload-font - "e" #'doom/reload-env) - "T" #'doom/toggle-profiler - "V" #'set-variable - "C-v" #'doom/version - "W" #'+default/man-or-woman) +(define-key! help-map + ;; new keybinds + "'" #'describe-char + "A" #'doom/describe-autodefs + "B" #'doom/open-bug-report + "D" #'doom/open-manual + "E" #'doom/open-vanilla-sandbox + "M" #'doom/describe-active-minor-mode + "O" #'+lookup/online + "T" #'doom/toggle-profiler + "V" #'set-variable + "W" #'+default/man-or-woman + "C-k" #'describe-key-briefly + "C-l" #'describe-language-environment + "C-m" #'info-emacs-manual + "C-v" #'doom/version + + ;; replacement keybinds + ;; replaces `info-emacs-manual' b/c it's on C-m now + "r" nil + "rr" #'doom/reload + "rt" #'doom/reload-theme + "rp" #'doom/reload-packages + "rf" #'doom/reload-font + "re" #'doom/reload-env + + ;; replaces `apropos-command' + "a" #'apropos + ;; replaces `describe-copying' b/c not useful + "C-c" #'describe-coding-system + ;; replaces `apropos-documentation' b/c `apropos' covers this + "d" #'doom/describe-module + ;; replaces `Info-got-emacs-command-node' b/c redundant w/ `Info-goto-node' + "F" #'describe-face + ;; replaces `view-hello-file' b/c annoying + "h" #'doom/describe-symbol + ;; replaces `describe-language-environment' b/c remapped to C-l + "L" #'global-command-log-mode + ;; replaces `view-emacs-news' b/c it's on C-n too + "n" #'doom/open-news + ;; replaces `finder-by-keyword' + ;; "p" #'doom/describe-package + ;; replaces `describe-package' b/c redundant w/ `doom/describe-package' + "P" #'find-library) (after! which-key (which-key-add-key-based-replacements doom-leader-key "") @@ -223,9 +236,9 @@ ;; A Doom convention where C-s on popups and interactive searches will invoke ;; ivy/helm for their superior filtering. (define-key! :keymaps +default-minibuffer-maps - "C-s" (if (featurep! :completion ivy) - #'counsel-minibuffer-history - #'helm-minibuffer-history)) + "C-s" (if (featurep! :completion ivy) + #'counsel-minibuffer-history + #'helm-minibuffer-history)) ;; Smarter C-a/C-e for both Emacs and Evil. C-a will jump to indentation. ;; Pressing it again will send you to the true bol. Same goes for C-e, except From ea3d9e295779f29a354a6be8aeedfe8c901d0317 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 01:24:16 -0400 Subject: [PATCH 4123/4235] Refactor & optimize define-leader-key! - Provides a 10-30% boost in startup time - which-key advice is no longer needed --- core/core-keybinds.el | 97 ++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 66 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index b8130b202..a676a1bac 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -80,14 +80,35 @@ If any hook returns non-nil, all hooks after it are ignored.") (defalias 'define-key! #'general-def) (defalias 'unmap! #'general-unbind) -;; We avoid `general-create-definer' to ensure that :states, :wk-full-keys and -;; :keymaps cannot be overwritten. -(defmacro define-leader-key! (&rest args) - `(general-define-key - :states nil - :wk-full-keys nil - :keymaps 'doom-leader-map - ,@args)) +;; A `define-leader-key' defined with `general-create-definer' consumes 20-30% +;; of Doom's startup time, we reimplement it ourselves. +(defmacro define-leader-key! (&rest keys) + "Define a leader key on `doom-leader-key'." + (let (prefix forms wkforms) + (while keys + (let ((key (pop keys)) + (def (pop keys))) + (if (keywordp key) + (when (memq key '(:prefix :infix)) + (setq prefix def)) + (let ((unquoted-def (cdr-safe (doom-unquote def)))) + (when prefix + (setq key `(general--concat t ,prefix ,key))) + (when-let* ((desc (plist-get unquoted-def :which-key))) + (push `(which-key-add-key-based-replacements + (general--concat t doom-leader-key ,key) + ,desc) + wkforms)) + (push `(define-key doom-leader-map (general--kbd ,key) + ,(if (general--extended-def-p unquoted-def) + (plist-get unquoted-def :def) + def)) + forms))))) + (macroexp-progn + (append (nreverse forms) + (when wkforms + `((eval-after-load 'which-key + (lambda () ,@(nreverse wkforms))))))))) (general-create-definer define-localleader-key! :major-modes t @@ -124,68 +145,12 @@ If any hook returns non-nil, all hooks after it are ignored.") (concat "\\(?:" (cl-loop for key in (append (list doom-leader-key doom-leader-alt-key) (where-is-internal 'doom/leader)) - if (stringp key) collect (regexp-quote key) into keys - else collect (regexp-quote (key-description key)) into keys + for keystr = (if (stringp key) key (key-description key)) + collect (regexp-quote keystr) into keys finally return (string-join keys "\\|")) "\\)")))) (add-hook 'doom-after-init-modules-hook #'doom|init-leader-keys) -;; However, the prefix command approach (along with :wk-full-keys in -;; `define-leader-key!') means that which-key is only informed of the key -;; sequence minus `doom-leader-key'/`doom-leader-alt-key'. e.g. binding to `SPC -;; f s' creates a wildcard label for any key that ends in 'f s'. -;; -;; So we forcibly inject `doom-leader-key' and `doom-leader-alt-key' into the -;; which-key key replacement regexp for keybinds created on `doom-leader-map'. -;; This is a dirty hack, but I'd rather this than general being responsible for -;; 50% of Doom's startup time. -(defun doom*general-extended-def-:which-key (_state keymap key edef kargs) - (with-eval-after-load 'which-key - (let* ((wk (general--getf2 edef :which-key :wk)) - (major-modes (general--getf edef kargs :major-modes)) - (keymaps (plist-get kargs :keymaps)) - ;; index of keymap in :keymaps - (keymap-index (cl-dotimes (ind (length keymaps)) - (when (eq (nth ind keymaps) keymap) - (cl-return ind)))) - (mode (let ((mode (if (and major-modes (listp major-modes)) - (nth keymap-index major-modes) - major-modes))) - (if (eq mode t) - (general--remove-map keymap) - mode))) - (key (key-description key)) - (key-regexp (concat (if (general--getf edef kargs :wk-full-keys) - "\\`" - ;; Modification begin - (if (memq 'doom-leader-map keymaps) - (concat "\\`" doom-which-key-leader-prefix-regexp " "))) - ;; Modification end - (regexp-quote key) - "\\'")) - (prefix (plist-get kargs :prefix)) - (binding (or (when (and (plist-get edef :def) - (not (plist-get edef :keymp))) - (plist-get edef :def)) - (when (and prefix (string= key prefix)) - (plist-get kargs :prefix-command)))) - (replacement (cond ((stringp wk) - (cons nil wk)) - (wk))) - (match/replacement - (cons - (cons (when (general--getf edef kargs :wk-match-keys) - key-regexp) - (when (and (general--getf edef kargs :wk-match-binding) - binding - (symbolp binding)) - (symbol-name binding))) - replacement))) - (general--add-which-key-replacement mode match/replacement) - (when (and (consp replacement) (not (functionp replacement))) - (general--add-which-key-title-prefix mode key (cdr replacement)))))) -(advice-add #'general-extended-def-:which-key :override #'doom*general-extended-def-:which-key) - ;; ;;; Packages From e83a6cbaa1f1c8fb20b8e16aadd6df54dbe5d419 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 01:24:55 -0400 Subject: [PATCH 4124/4235] Turn comment headings into outline-mode headers Also reformats a few keybinds with incorrect indentation. --- modules/config/default/+evil-bindings.el | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index eaad3cab4..81c14525c 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -10,7 +10,7 @@ ;; -;; Global keybindings +;;; Global keybindings (map! (:map override ;; A little sandbox to run code in @@ -97,9 +97,9 @@ "C-S-w" #'ace-swap-window ;; Window undo/redo (:prefix "m" - "m" #'doom/window-maximize-buffer - "v" #'doom/window-maximize-vertically - "s" #'doom/window-maximize-horizontally) + "m" #'doom/window-maximize-buffer + "v" #'doom/window-maximize-vertically + "s" #'doom/window-maximize-horizontally) "u" #'winner-undo "C-u" #'winner-undo "C-r" #'winner-redo @@ -160,7 +160,7 @@ ;; -;; Module keybinds +;;; Module keybinds ;;; :feature (map! (:when (featurep! :feature debugger) @@ -492,7 +492,7 @@ ;; -;; +;;; (map! :leader :desc "Eval expression" ";" #'eval-expression @@ -770,7 +770,7 @@ ;; -;; Universal motion repeating keys +;;; Universal motion repeating keys (defvar +default-repeat-keys (cons ";" ",") "The keys to use for repeating motions. @@ -816,7 +816,7 @@ To change these keys see `+default-repeat-keys'." ;; -;; Universal evil integration +;;; Universal evil integration (when (featurep! :feature evil +everywhere) ;; Have C-u behave similarly to `doom/backward-to-bol-or-indent'. From fe6dfb08b6338a40507d3164b62808ca4250f717 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Sun, 17 Mar 2019 01:07:59 +1000 Subject: [PATCH 4125/4235] Add doom/kill-project-buffers command Prompts for an open project and kills all its buffers. This is useful for closing `.emacs.d` in an effort to get some *billable* work done. Added `doom-fixup-windows` and `doom-kill-buffer(s)-fixup-windows` helper functions for leaving affected windows on a real buffer or the fallback buffer. Fixed `doom/kill-this-buffer-in-all-windows` to properly "fixup" windows. --- core/autoload/buffers.el | 88 ++++++++++++++++++++++++++++++++++------ 1 file changed, 75 insertions(+), 13 deletions(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 08bcc4889..6df8d44c1 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -56,17 +56,32 @@ scratch buffer. See `doom-fallback-buffer-name' to change this." (defalias 'doom-buffer-list #'buffer-list) ;;;###autoload -(defun doom-project-buffer-list () - "Return a list of buffers belonging to the current project. +(defun doom-project-buffer-list (&optional project) + "Return a list of buffers belonging to the specified PROJECT. + +If PROJECT is nil, default to the current project. If no project is active, return all buffers." (let ((buffers (doom-buffer-list))) - (if-let* ((project-root (doom-project-root))) + (if-let* ((project-root + (if project (expand-file-name project) + (doom-project-root)))) (cl-loop for buf in buffers if (projectile-project-buffer-p buf project-root) collect buf) buffers))) +;;;###autoload +(defun doom-open-projects () + "Return a list of projects with open buffers." + (cl-loop with projects = (make-hash-table :test 'equal :size 8) + for buffer in (doom-buffer-list) + if (buffer-live-p buffer) + if (doom-real-buffer-p buffer) + if (with-current-buffer buffer (doom-project-root)) + do (puthash (abbreviate-file-name it) t projects) + finally return (hash-table-keys projects))) + ;;;###autoload (defun doom-dired-buffer-p (buf) "Returns non-nil if BUF is a dired buffer." @@ -181,6 +196,36 @@ If DERIVED-P, test with `derived-mode-p', otherwise use `eq'." (delete-window window))) (kill-buffer buffer)) +;;;###autoload +(defun doom-fixup-windows (windows) + "Ensure that each of WINDOWS is showing a real buffer or the fallback buffer." + (dolist (window windows) + (with-selected-window window + (when (doom-unreal-buffer-p (window-buffer)) + (previous-buffer) + (when (doom-unreal-buffer-p (window-buffer)) + (switch-to-buffer (doom-fallback-buffer))))))) + +;;;###autoload +(defun doom-kill-buffer-fixup-windows (buffer) + "Kill the BUFFER and ensure all the windows it was displayed in have switched +to a real buffer or the fallback buffer." + (let ((windows (get-buffer-window-list buffer))) + (kill-buffer buffer) + (doom-fixup-windows (cl-remove-if-not #'window-live-p windows)))) + +;;;###autoload +(defun doom-kill-buffers-fixup-windows (buffers) + "Kill the BUFFERS and ensure all the windows they were displayed in have +switched to a real buffer or the fallback buffer." + (let ((seen-windows (make-hash-table :test 'eq :size 8))) + (dolist (buffer buffers) + (let ((windows (get-buffer-window-list buffer))) + (kill-buffer buffer) + (dolist (window (cl-remove-if-not #'window-live-p windows)) + (puthash window t seen-windows)))) + (doom-fixup-windows (hash-table-keys seen-windows)))) + ;;;###autoload (defun doom-kill-matching-buffers (pattern &optional buffer-list) "Kill all buffers (in current workspace OR in BUFFER-LIST) that match the @@ -240,21 +285,16 @@ windows, switch to `doom-fallback-buffer'. Otherwise, delegate to original ;;;###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. +have switched to a real buffer or the fallback 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))) - (when (and (buffer-modified-p buffer) dont-save) - (with-current-buffer buffer - (set-buffer-modified-p nil))) - (kill-buffer buffer) - (cl-loop for win in windows - if (and (window-live-p win) - (doom-unreal-buffer-p (window-buffer win))) - do (with-selected-window win (previous-buffer))))) + (when (and (buffer-modified-p buffer) dont-save) + (with-current-buffer buffer + (set-buffer-modified-p nil))) + (doom-kill-buffer-fixup-windows buffer)) ;;;###autoload (defun doom/kill-all-buffers (&optional project-p) @@ -319,3 +359,25 @@ current project." (message "Killed %d buffer(s)" (- (length buffers) (length (cl-remove-if-not #'buffer-live-p buffers))))))) + +;;;###autoload +(defun doom/kill-project-buffers (project) + "Kill buffers for the specified PROJECT." + (interactive + (list (if-let* ((open-projects (doom-open-projects))) + (completing-read + "Kill buffers for project: " open-projects + nil t nil nil + (if-let* ((project-root (doom-project-root)) + (project-root (abbreviate-file-name project-root)) + ((member project-root open-projects))) + project-root)) + (message "No projects are open!") + nil))) + (when project + (let ((buffers (doom-project-buffer-list project))) + (doom-kill-buffers-fixup-windows buffers) + (when (called-interactively-p 'interactive) + (message "Killed %d buffer(s)" + (- (length buffers) + (length (cl-remove-if-not #'buffer-live-p buffers)))))))) From 3ba364a0a971a3862ad12451d22f132f3cc327b0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 02:15:23 -0400 Subject: [PATCH 4126/4235] Remove unnecessary config - smartparens-terra doesn't exist - terra-indent-level has a sensible initial value, so it doesn't need to be reset --- modules/lang/terra/config.el | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/modules/lang/terra/config.el b/modules/lang/terra/config.el index 44f74ee2b..27515edb6 100644 --- a/modules/lang/terra/config.el +++ b/modules/lang/terra/config.el @@ -1,24 +1,12 @@ ;;; lang/lua/config.el -*- lexical-binding: t; -*- -;; sp's default rules are obnoxious, so disable them -(provide 'smartparens-terra) - - ;; ;; Major modes (def-package! terra-mode :defer t - :init - ;; lua-indent-level defaults to 3 otherwise. Madness. - (setq terra-indent-level tab-width) :config (set-lookup-handlers! 'terra-mode :documentation 'terra-search-documentation) (set-electric! 'terra-mode :words '("else" "end")) (set-repl-handler! 'terra-mode #'+terra/open-repl) (set-company-backend! 'terra-mode '(company-lua company-yasnippet))) - - -;; -;; Frameworks - From 8cd0a31aef12a59739974736941109c547964803 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 02:18:16 -0400 Subject: [PATCH 4127/4235] Register terra-indent-level with editorconfig --- modules/tools/editorconfig/config.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index cff636d44..cfd4c67c8 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -26,7 +26,8 @@ (append '((mips-mode mips-tab-width) (haxor-mode haxor-tab-width) (nasm-mode nasm-basic-offset) - (enh-ruby-mode enh-ruby-indent-level)) + (enh-ruby-mode enh-ruby-indent-level) + (terra-mode terra-indent-level) editorconfig-indentation-alist))) (defun doom*editorconfig-smart-detection (orig-fn) From d6c9520d93bfb8bb56c8efbaffce51f0967914bf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 02:52:49 -0400 Subject: [PATCH 4128/4235] Don't bind missing commands to leader keys I don't want to litter config/default/+evil-bindings.el with conditions for every keybind whose module may or may not be enabled. It impacts its readability and is relatively expensive (due to the internals of map! and general). So instead, we no-op keybinds for commands that don't exist (and aren't autoloaded), so you don't see missing function errors when using these keys. --- core/core-keybinds.el | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index a676a1bac..d8264246f 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -99,11 +99,18 @@ If any hook returns non-nil, all hooks after it are ignored.") (general--concat t doom-leader-key ,key) ,desc) wkforms)) - (push `(define-key doom-leader-map (general--kbd ,key) - ,(if (general--extended-def-p unquoted-def) - (plist-get unquoted-def :def) - def)) - forms))))) + ;; Don't bind missing functions (so they don't throw errors when + ;; used). `fboundp' conveniently returns `t' for autoloaded + ;; functions as well as defined ones. + (let* ((fn (if (general--extended-def-p unquoted-def) + (plist-get unquoted-def :def) + def)) + (unquoted-fn (doom-unquote fn))) + (when (or (not (symbolp unquoted-fn)) + (fboundp unquoted-fn)) + (push `(define-key doom-leader-map (general--kbd ,key) + ,fn) + forms))))))) (macroexp-progn (append (nreverse forms) (when wkforms From dfc21e1157570fee0048a48eeb3da4e250b3425a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 03:14:13 -0400 Subject: [PATCH 4129/4235] tools/editorconfig: fix syntax error Typo introduced in 8cd0a31a --- modules/tools/editorconfig/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index cfd4c67c8..f8aab70ce 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -27,7 +27,7 @@ (haxor-mode haxor-tab-width) (nasm-mode nasm-basic-offset) (enh-ruby-mode enh-ruby-indent-level) - (terra-mode terra-indent-level) + (terra-mode terra-indent-level)) editorconfig-indentation-alist))) (defun doom*editorconfig-smart-detection (orig-fn) From cb5abcea0eefcf3119674ee74e23a458bcaee84f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 03:16:37 -0400 Subject: [PATCH 4130/4235] Add tools/direnv module --- init.example.el | 1 + modules/tools/direnv/config.el | 7 +++++++ modules/tools/direnv/doctor.el | 4 ++++ modules/tools/direnv/packages.el | 4 ++++ 4 files changed, 16 insertions(+) create mode 100644 modules/tools/direnv/config.el create mode 100644 modules/tools/direnv/doctor.el create mode 100644 modules/tools/direnv/packages.el diff --git a/init.example.el b/init.example.el index 86187556b..6269accf8 100644 --- a/init.example.el +++ b/init.example.el @@ -61,6 +61,7 @@ :tools ;;ansible + ;;direnv ;;docker ;;editorconfig ; let someone else argue about tabs vs spaces ;;ein ; tame Jupyter notebooks with emacs diff --git a/modules/tools/direnv/config.el b/modules/tools/direnv/config.el new file mode 100644 index 000000000..7715710fa --- /dev/null +++ b/modules/tools/direnv/config.el @@ -0,0 +1,7 @@ +;;; tools/direnv/config.el -*- lexical-binding: t; -*- + +(def-package! direnv + :after-call (after-find-file dired-initial-position-hook) + :config + (when (executable-find "direnv") + (direnv-mode +1))) diff --git a/modules/tools/direnv/doctor.el b/modules/tools/direnv/doctor.el new file mode 100644 index 000000000..223fcb967 --- /dev/null +++ b/modules/tools/direnv/doctor.el @@ -0,0 +1,4 @@ +;;; tools/direnv/doctor.el -*- lexical-binding: t; -*- + +(unless (executable-find "direnv") + (warn! "Couldn't find direnv executable")) diff --git a/modules/tools/direnv/packages.el b/modules/tools/direnv/packages.el new file mode 100644 index 000000000..a0c843e53 --- /dev/null +++ b/modules/tools/direnv/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; tools/direnv/packages.el + +(package! direnv) From 5be0e2be4a7ac99f20b18f1b43c81319697eb689 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 03:19:38 -0400 Subject: [PATCH 4131/4235] Omit private module on `doom compile` The private module won't be byte-compiled implicitly anymore, as it can cause unexpected problems with stale code and config portability. doom compile -> only compiles ~/.emacs.d doom compile :core -> ~/.emacs.d/core doom compile :plugins -> ~/.emacs.d/.local/packages/elpa doom compile :private -> ~/.doom.d --- core/cli/byte-compile.el | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index be1a509eb..8b45bb491 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -99,8 +99,11 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (doom-initialize-modules 'force)) ;; If no targets were supplied, then we use your module list. (unless modules - (setq targets (append (list doom-core-dir) - (doom-module-load-path)))) + (let ((doom-modules-dirs (delete (expand-file-name "modules/" doom-private-dir) + doom-modules-dirs))) + (setq targets + (append (list doom-core-dir) + (delete doom-private-dir (doom-module-load-path)))))) ;; Assemble el files we want to compile; taking into account that ;; MODULES may be a list of MODULE/SUBMODULE strings from the command ;; line. @@ -127,8 +130,7 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (eval pred t))))) use-package-defaults) ;; Always compile private init file - (push (expand-file-name "init.el" doom-private-dir) target-files) - (push (expand-file-name "init.el" doom-emacs-dir) target-files) + (push (expand-file-name "init.el" doom-emacs-dir) target-files) (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) (if (or (not recompile-p) (let ((elc-file (byte-compile-dest-file target))) From 9d65619d3e011e907c210311a0b0e4a7816b3044 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 03:43:27 -0400 Subject: [PATCH 4132/4235] Fix keybinds to keymaps being ignored --- core/core-keybinds.el | 1 + 1 file changed, 1 insertion(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index d8264246f..0dd356fcc 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -107,6 +107,7 @@ If any hook returns non-nil, all hooks after it are ignored.") def)) (unquoted-fn (doom-unquote fn))) (when (or (not (symbolp unquoted-fn)) + (symbolp fn) (fboundp unquoted-fn)) (push `(define-key doom-leader-map (general--kbd ,key) ,fn) From 035a0a50e62feeb8c1811a0b93421c7017b3a038 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 04:12:56 -0400 Subject: [PATCH 4133/4235] lang/org: change many org localleader keybinds - Moves `SPC m s' to `SPC m b' - Adds many new org-clock and org-goto keybinds - Replaces imenu/imenu-anywhere with goto and goto-all - Adds SPC m s -> org-schedule - Move SPC m b -> SPC m , (org-switchb) --- modules/lang/org/config.el | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 6e8947707..0b4501e51 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -342,24 +342,39 @@ between the two." "C-c C-i" #'org-toggle-inline-images [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line + [remap imenu] + (cond ((featurep! :completion ivy) + #'counsel-org-goto) + ((featurep! :completion helm) + #'helm-org-in-buffer-headings)) + [remap imenu-anywhere] + (cond ((featurep! :completion ivy) + #'counsel-org-goto-all) + ((featurep! :completion helm) + #'helm-org-agenda-files-headings)) :localleader + "," #'org-switchb "d" #'org-deadline - "b" #'org-switchb "f" #'org-footnote-new - "F" #'org-footnote-goto-definition "t" #'org-todo "T" #'org-todo-list "l" #'org-insert-link "L" #'org-store-link "r" #'org-refile + "s" #'org-schedule "'" #'org-edit-special (:prefix ("c" . "clock") "c" #'org-clock-in "C" #'org-clock-out + "d" #'org-clock-mark-default-task + "e" #'org-clock-modify-effort-estimate + "l" #'org-clock-in-last "g" #'org-clock-goto "G" (λ! (org-clock-goto 'select)) - "x" #'org-clock-cancel) + "x" #'org-clock-cancel + "=" #'org-clock-timestamps-up + "-" #'org-clock-timestamps-down) (:prefix ("e" . "export") :desc "to markdown" "m" #'org-md-export-to-markdown :desc "to markdown & open" "M" #'org-md-export-as-markdown @@ -369,7 +384,19 @@ between the two." :desc "to latex" "l" #'org-beamer-export-to-latex :desc "to latex & open" "L" #'org-beamer-export-as-latex :desc "as pdf" "p" #'org-beamer-export-to-pdf)) - (:prefix ("s" . "tables") + (:prefix ("g" . "goto") + "g" #'org-goto + (:when (featurep! :completion ivy) + "g" #'counsel-org-goto + "G" #'counsel-org-goto-all) + "a" #'org-agenda-goto + "A" #'org-agenda-clock-goto + "c" #'org-clock-goto + "C" (λ! (org-clock-goto 'select)) + "i" #'org-id-goto + "r" #'org-refile-goto-last-stored + "x" #'org-capture-goto-last-stored) + (:prefix ("b" . "tables") "a" #'org-table-align "e" #'org-table-edit-field "h" #'org-table-field-info From d947e15472e059245ccc22ccd9585967f39a4151 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 04:33:26 -0400 Subject: [PATCH 4134/4235] lang/org: add SPC m . and / keybinds for org-goto And remove imenu remaps, they weren't behaving correctly. --- modules/lang/org/config.el | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 0b4501e51..21d508ab2 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -342,19 +342,16 @@ between the two." "C-c C-i" #'org-toggle-inline-images [remap doom/backward-to-bol-or-indent] #'org-beginning-of-line [remap doom/forward-to-last-non-comment-or-eol] #'org-end-of-line - [remap imenu] - (cond ((featurep! :completion ivy) - #'counsel-org-goto) - ((featurep! :completion helm) - #'helm-org-in-buffer-headings)) - [remap imenu-anywhere] - (cond ((featurep! :completion ivy) - #'counsel-org-goto-all) - ((featurep! :completion helm) - #'helm-org-agenda-files-headings)) :localleader "," #'org-switchb + "." #'org-goto + (:when (featurep! :completion ivy) + "." #'counsel-org-goto + "/" #'counsel-org-goto-all) + (:when (featurep! :completion helm) + "." #'helm-org-in-buffer-headings + "/" #'helm-org-agenda-files-headings) "d" #'org-deadline "f" #'org-footnote-new "t" #'org-todo From b7585e37aa16ac964e0a45f04d4c57476897c31e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 05:26:54 -0400 Subject: [PATCH 4135/4235] Fix missing persp-switch-to-buffer keybind Because persp-mode hasn't been loaded by bind-time, nor was persp-switch-to-buffer autoloaded. --- modules/feature/workspaces/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/workspaces/config.el b/modules/feature/workspaces/config.el index a18a57fb2..2a7bc495a 100644 --- a/modules/feature/workspaces/config.el +++ b/modules/feature/workspaces/config.el @@ -35,7 +35,7 @@ stored in `persp-save-dir'.") ;; Packages (def-package! persp-mode - :defer t + :commands (persp-switch-to-buffer) :init (defun +workspaces|init () ;; Remove default buffer predicate so persp-mode can put in its own From df748e6cee8a5722b1c7a0237a111f3179e814fe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 14:22:25 -0400 Subject: [PATCH 4136/4235] tools/editorconfig: remove extra indent vars They were merged upstream in editorconfig/editorconfig-emacs#196 Relevant to: #1283, #1289 --- modules/tools/editorconfig/config.el | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/modules/tools/editorconfig/config.el b/modules/tools/editorconfig/config.el index f8aab70ce..e200d9fc0 100644 --- a/modules/tools/editorconfig/config.el +++ b/modules/tools/editorconfig/config.el @@ -20,16 +20,6 @@ (def-package! editorconfig :after-call (doom-switch-buffer-hook after-find-file) :config - ;; Register missing indent variables - (unless (assq 'mips-mode editorconfig-indentation-alist) - (setq editorconfig-indentation-alist - (append '((mips-mode mips-tab-width) - (haxor-mode haxor-tab-width) - (nasm-mode nasm-basic-offset) - (enh-ruby-mode enh-ruby-indent-level) - (terra-mode terra-indent-level)) - editorconfig-indentation-alist))) - (defun doom*editorconfig-smart-detection (orig-fn) "Retrieve the properties for the current file. If it doesn't have an extension, try to guess one." From 45c9fb982d066355039b0c8f6bd867505b961b3d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 22:50:09 -0400 Subject: [PATCH 4137/4235] Add docstring to switch-{buffer,window,frame} hooks --- core/core-ui.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 300bc26d9..37e10dc04 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -67,13 +67,13 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") `doom/reload-theme'.") (defvar doom-switch-buffer-hook nil - "TODO") + "A list of hooks run after changing the current buffer.") (defvar doom-switch-window-hook nil - "TODO") + "A list of hooks run after changing the focused windows.") (defvar doom-switch-frame-hook nil - "TODO") + "A list of hooks run after changing the focused frame.") (defvar doom-inhibit-switch-buffer-hooks nil "Letvar for inhibiting `doom-switch-buffer-hook'. Do not set this directly.") From 337c16cb68cdcc9b1768b43fc53833b834edbb7d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 5 Apr 2019 23:52:29 -0400 Subject: [PATCH 4138/4235] Dear byte-compiler, you drive me to drink, About Emacs Lisp that I have to rethink. The world could end, And humanity transcend, But you'd still be here raising a stink. --- core/core-ui.el | 15 +++++++-------- modules/completion/ivy/autoload/ivy.el | 4 ++-- modules/completion/ivy/config.el | 2 +- modules/feature/lookup/autoload/lookup.el | 6 +++--- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index 37e10dc04..d653e1140 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -95,14 +95,13 @@ behavior). Do not set this directly, this is let-bound in `doom|init-theme'.") (setq doom--last-window (selected-window))))) (defun doom|run-switch-frame-hooks (&rest _) - (let ((selected-frame (selected-frame))) - (unless (or doom-inhibit-switch-frame-hooks - (eq doom--last-frame (selected-frame)) - (frame-parameter nil 'parent-frame)) - (let ((doom-inhibit-switch-frame-hooks t)) - (run-hooks 'doom-switch-frame-hook) - (doom-log "Frame switched to %s" (selected-frame)) - (setq doom--last-frame (selected-frame)))))) + (unless (or doom-inhibit-switch-frame-hooks + (eq doom--last-frame (selected-frame)) + (frame-parameter nil 'parent-frame)) + (let ((doom-inhibit-switch-frame-hooks t)) + (run-hooks 'doom-switch-frame-hook) + (doom-log "Frame switched to %s" (selected-frame)) + (setq doom--last-frame (selected-frame))))) (defun doom*run-switch-buffer-hooks (orig-fn buffer-or-name &rest args) (if (or doom-inhibit-switch-buffer-hooks diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index c05856ea0..25c61be66 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -303,8 +303,8 @@ order. (projectile-project-name)) ((file-relative-name directory project-root)))))) (require 'counsel) - (let ((counsel-more-chars-alist - (if query '((t . 1)) counsel-more-chars-alist))) + (let ((ivy-more-chars-alist + (if query '((t . 1)) ivy-more-chars-alist))) (pcase engine ('grep (let ((args (if recursive " -R")) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 7b9a11898..4bc511fed 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -89,7 +89,7 @@ immediately runs it on the current candidate (ending the ivy session)." counsel-projectile-switch-to-buffer)) (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer)) ;; Use `+ivy-rich-buffer-name' to display buffer names - (let* ((plist (plist-get ivy-rich--display-transformers-list 'ivy-switch-buffer)) + (let* ((plist (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer)) (colplist (plist-get plist :columns)) (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) (when switch-buffer-alist diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 4a6c2c9b1..888a04a65 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -135,7 +135,7 @@ Otherwise, these properties are available to be set: (defun +lookup--jump-to (prop identifier &optional other-window) (let ((ret - (condition-case e + (condition-case _ (run-hook-wrapped (plist-get (list :definition '+lookup-definition-functions :references '+lookup-references-functions @@ -198,7 +198,7 @@ falling back to git-grep)." (+helm-file-search nil :query query) t)))))) -(defun +lookup-evil-goto-definition-backend (identifier) +(defun +lookup-evil-goto-definition-backend (_identifier) "Uses `evil-goto-definition' to conduct a text search for IDENTIFIER in the current buffer." (and (fboundp 'evil-goto-definition) @@ -272,7 +272,7 @@ search otherwise." ((error "Couldn't find references of '%s'" identifier)))) ;;;###autoload -(defun +lookup/documentation (identifier &optional arg) +(defun +lookup/documentation (identifier &optional _arg) "Show documentation for IDENTIFIER (defaults to symbol at point or selection. First attempts the :documentation handler specified with `set-lookup-handlers!' From 2b7c215aee3df99ebac9093cbbbefbc982f729b6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 00:11:32 -0400 Subject: [PATCH 4139/4235] Refactor byte-compile dispatchers And don't implicitly compile ~/.emacs.d/init.el unless :core (or no args) are passed. --- core/cli/byte-compile.el | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/core/cli/byte-compile.el b/core/cli/byte-compile.el index 8b45bb491..d053ccdab 100644 --- a/core/cli/byte-compile.el +++ b/core/cli/byte-compile.el @@ -85,9 +85,10 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "Byte-compile anyway?"))) (message "Aborting.") (cl-return-from 'byte-compile))) - (and (not recompile-p) - (or (null modules) (equal modules '(":core"))) - (doom-clean-byte-compiled-files)) + (when (and (not recompile-p) + (or (null modules) + (equal modules '(":core")))) + (doom-clean-byte-compiled-files)) (let (doom-emacs-changed-p noninteractive) ;; But first we must be sure that Doom and your private config have been @@ -107,9 +108,11 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." ;; Assemble el files we want to compile; taking into account that ;; MODULES may be a list of MODULE/SUBMODULE strings from the command ;; line. - (let ((target-files (doom-files-in targets :filter #'doom--byte-compile-ignore-file-p)) - (load-path load-path) - kill-emacs-hook kill-buffer-query-functions) + (let ((target-files (doom-files-in targets :filter #'doom--byte-compile-ignore-file-p))) + (when (or (not modules) + (member ":core" modules)) + (push (expand-file-name "init.el" doom-emacs-dir) + target-files)) (unless target-files (if targets (message "Couldn't find any valid targets") @@ -118,7 +121,9 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (require 'use-package) (condition-case e (let ((use-package-defaults use-package-defaults) - (use-package-expand-minimally t)) + (use-package-expand-minimally t) + (load-path load-path) + kill-emacs-hook kill-buffer-query-functions) ;; Prevent packages from being loaded at compile time if they ;; don't meet their own predicates. (push (list :no-require t @@ -129,8 +134,6 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." (when-let* ((pred (plist-get args :unless))) (eval pred t))))) use-package-defaults) - ;; Always compile private init file - (push (expand-file-name "init.el" doom-emacs-dir) target-files) (dolist (target (cl-delete-duplicates (mapcar #'file-truename target-files) :test #'equal)) (if (or (not recompile-p) (let ((elc-file (byte-compile-dest-file target))) @@ -171,10 +174,11 @@ If RECOMPILE-P is non-nil, only recompile out-of-date files." "Delete all the compiled elc files in your Emacs configuration and private module. This does not include your byte-compiled, third party packages.'" (cl-loop with default-directory = doom-emacs-dir - for path in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) - (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) - (doom-files-in doom-core-dir :match "\\.elc$") - (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) + for path + in (append (doom-files-in doom-emacs-dir :match "\\.elc$" :depth 0) + (doom-files-in doom-private-dir :match "\\.elc$" :depth 1) + (doom-files-in doom-core-dir :match "\\.elc$") + (doom-files-in doom-modules-dirs :match "\\.elc$" :depth 4)) for truepath = (file-truename path) if (file-exists-p path) do (delete-file path) From cfb3a6d137521cbd1383389789912fe0bd5e8ed6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 00:33:04 -0400 Subject: [PATCH 4140/4235] feature/evil: autoload evil-commentary-yank-line Relevant to #1308 --- modules/feature/evil/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/feature/evil/config.el b/modules/feature/evil/config.el index cd05498e8..aaa0a9e49 100644 --- a/modules/feature/evil/config.el +++ b/modules/feature/evil/config.el @@ -163,7 +163,10 @@ line with a linewise comment.") ;; Packages (def-package! evil-commentary - :commands (evil-commentary evil-commentary-yank evil-commentary-line) + :commands (evil-commentary + evil-commentary-yank + evil-commentary-yank-line + evil-commentary-line) :config (evil-commentary-mode 1)) From 72fb5603e7118e4deb0508c4dd2e688897c60efb Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 00:35:43 -0400 Subject: [PATCH 4141/4235] Minor, general refactor & reformatting Also swaps C-o and M-o in ivy And use new ;;;###package cookie (not used yet) --- modules/completion/ivy/config.el | 4 ++-- modules/config/default/+evil-bindings.el | 2 +- modules/lang/lua/config.el | 4 ++-- modules/lang/ruby/config.el | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 1bba70124..30422b53b 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -77,8 +77,8 @@ immediately runs it on the current candidate (ending the ivy session)." :commands (ivy-dispatching-done-hydra ivy--matcher-desc) :init (define-key! ivy-minibuffer-map - "C-o" #'+ivy-coo-hydra/body - "M-o" #'ivy-dispatching-done-hydra))) + "C-o" #'ivy-dispatching-done-hydra + "M-o" #'+ivy-coo-hydra/body))) (def-package! ivy-rich diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 81c14525c..65c7c8490 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -523,10 +523,10 @@ ;; Prefixed key groups (:prefix ("/" . "search") - :desc "Jump to symbol across buffers" "I" #'imenu-anywhere :desc "Search buffer" "b" #'swiper :desc "Search current directory" "d" #'+default/search-from-cwd :desc "Jump to symbol" "i" #'imenu + :desc "Jump to symbol across buffers" "I" #'imenu-anywhere :desc "Jump to link" "l" #'ace-link :desc "Look up online" "o" #'+lookup/online-select :desc "Search project" "p" #'+default/search-project) diff --git a/modules/lang/lua/config.el b/modules/lang/lua/config.el index ea6882fa1..99e148747 100644 --- a/modules/lang/lua/config.el +++ b/modules/lang/lua/config.el @@ -19,12 +19,12 @@ (set-company-backend! 'lua-mode '(company-lua company-yasnippet))) -;; `moonscript' +;;;###package moonscript (setq-hook! 'moonscript-mode-hook moonscript-indent-offset tab-width) ;; -;; Frameworks +;;; Frameworks (def-project-mode! +lua-love-mode :modes (lua-mode markdown-mode json-mode) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index eb251b688..0bc4b7d20 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -99,7 +99,7 @@ "e" #'bundle-exec "o" #'bundle-open)) -;; `rvm' +;;;###package `rvm' (setq rspec-use-rvm t) (after! rbenv From fa95984427d5c6a542dd921e6b598c0d94d00566 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 00:38:46 -0400 Subject: [PATCH 4142/4235] tools/lsp: add basic README --- modules/tools/lsp/README.org | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 modules/tools/lsp/README.org diff --git a/modules/tools/lsp/README.org b/modules/tools/lsp/README.org new file mode 100644 index 000000000..d68fde77d --- /dev/null +++ b/modules/tools/lsp/README.org @@ -0,0 +1,66 @@ +#+TITLE: tools/lsp +#+DATE: March 05, 2019 +#+SINCE: v2.1 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] +- [[#prerequisites][Prerequisites]] +- [[#features][Features]] +- [[#configuration][Configuration]] +- [[#troubleshooting][Troubleshooting]] + +* Description +This module integrate [[https://langserver.org/][language servers]] into Doom Emacs. They provide features +you'd expect from IDEs, like code completion, realtime linting, language-aware +imenu/xref integration, jump-to-definition/references support, and more. + +To get LSP working, you'll need two things: + +1. To install a language server appropriate for your targeted language (you'll + find a table mapping languages to available servers [[https://github.com/emacs-lsp/lsp-mode#supported-languages][in the lsp-mode project + README]]). +2. To enable this module and the LSP capabilities of the appropriate =:lang= + module with the =+lsp= flag. If your language's module doesn't have LSP + support, you'll have to configure your own (described in the Configuration + section). + +As of this writing, these Doom modules possess LSP support: + +| Module | Major modes | Default language server | +|------------------+---------------------------------------------------------+---------------------------------------------------------------| +| [[../../lang/cc/README.org][:lang cc]] | c-mode, c++-mode, objc-mode | ccls | +| [[../../lang/go/README.org][:lang go]] | go-mode | go-langserver | +| [[../../lang/javascript/README.org][:lang javascript]] | js2-mode, rjsx-mode, typescript-mode | typescript-language-server | +| [[../../lang/java/README.org][:lang java]] | java-mode | lsp-java | +| [[../../lang/ocaml/README.org][:lang ocaml]] | taureg-mode | ocaml-language-server | +| [[../../lang/php/README.org][:lang php]] | php-mode | php-language-server | +| [[../../lang/python/README.org][:lang python]] | python-mode | lsp-python-ms | +| [[../../lang/ruby/README.org][:lang ruby]] | ruby-mode, enh-ruby-mode | solargraph | +| [[../../lang/rust/README.org][:lang rust]] | rust-mode | rls | +| [[../../lang/sh/README.org][:lang sh]] | sh-mode | bash-language-server | +| [[../../lang/web/README.org][:lang web]] | web-mode, css-mode, scss-mode, sass-mode, less-css-mode | vscode-css-languageserver-bin, vscode-html-languageserver-bin | + +** Module Flags +This module provides no flags. + +** Plugins ++ [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] ++ [[https://github.com/emacs-lsp/lsp-ui][lsp-ui]] ++ [[https://github.com/tigersoldier/company-lsp][company-lsp]]* + +* Prerequisites +This module has no direct prerequisites, but to get LSP working, you'll need to +install language servers. + +You'll find a table that lists available language servers and how to install +them [[https://github.com/emacs-lsp/lsp-mode#supported-languages][in the lsp-mode project README]]. The documentation of the module for your +targeted language will contain brief instructions as well. + +* TODO Features + +* TODO Configuration + +* TODO Troubleshooting From 2514b7476ee0df107749b2d243a72fe136d35eb1 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 01:31:59 -0400 Subject: [PATCH 4143/4235] completion/ivy: refactor transformers - Mode icons will now fall back to fundamental-mode icon, rather than the blank file icon (whose irregular width ruins ivy's formatting) - Fixes project-based buffer name highlighting in switch-to-buffer - Fixes a void-variable ivy-rich--ivy-switch-buffer-transformer error Relevant to #1159 --- modules/completion/ivy/autoload/ivy.el | 31 +++++--- modules/completion/ivy/config.el | 98 ++++++++++---------------- 2 files changed, 57 insertions(+), 72 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 25c61be66..bb426b317 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -19,16 +19,27 @@ Displays buffers in other projects in `font-lock-doc-face', and temporary/special buffers in `font-lock-comment-face'." - (with-current-buffer (get-buffer candidate) - (propertize candidate - 'face (cond ((string-match-p "^ *\\*" candidate) - 'font-lock-comment-face) - ((not buffer-file-name) nil) - ((not (file-in-directory-p - buffer-file-name - (or (doom-project-root) - default-directory))) - 'font-lock-doc-face))))) + (propertize + candidate + 'face (cond ((string-match-p "^ *\\*" candidate) + 'font-lock-comment-face) + ((not (buffer-file-name (get-buffer candidate))) + nil) + ((not (projectile-project-buffer-p + (get-buffer candidate) + (doom-project-root))) + 'font-lock-doc-face)))) + +;;;###autoload +(defun +ivy-rich-buffer-icon (candidate) + "Display the icon for CANDIDATE buffer. + +Otherwise show the fundamental-mode icon." + (with-current-buffer candidate + (let ((icon (all-the-icons-icon-for-mode major-mode))) + (if (symbolp icon) + (all-the-icons-icon-for-mode 'fundamental-mode) + icon)))) ;; diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 30422b53b..0afe667d9 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -37,7 +37,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; -;; Packages +;;; Packages (def-package! ivy :defer 1 @@ -82,18 +82,40 @@ immediately runs it on the current candidate (ending the ivy session)." (def-package! ivy-rich - :after ivy + :hook (ivy-mode . ivy-rich-mode) :config - ;; Show more buffer information in other switch-buffer commands too - (dolist (cmd '(+ivy--switch-buffer - counsel-projectile-switch-to-buffer)) - (ivy-set-display-transformer cmd 'ivy-rich--ivy-switch-buffer-transformer)) - ;; Use `+ivy-rich-buffer-name' to display buffer names + (when +ivy-buffer-icons + (cl-pushnew '(+ivy-rich-buffer-icon (:width 2 :align right)) + (cadr (plist-get ivy-rich-display-transformers-list + 'ivy-switch-buffer))) + (after! counsel-projectile + (setq ivy-rich-display-transformers-list + (plist-put ivy-rich-display-transformers-list + 'counsel-projectile-switch-project + '(:columns + (((lambda (_) (all-the-icons-octicon "file-directory")) + (:width 2 :align right)) + (ivy-rich-candidate))))) + (setq ivy-rich-display-transformers-list + (plist-put ivy-rich-display-transformers-list + 'counsel-projectile-find-file + '(:columns + ((all-the-icons-icon-for-file (:width 2 :align right)) + (ivy-rich-candidate))))))) + + ;; Highlight buffers differently based on whether they're in the same project + ;; as the current project or not. (let* ((plist (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer)) - (colplist (plist-get plist :columns)) - (switch-buffer-alist (assq 'ivy-rich-candidate colplist))) + (switch-buffer-alist (assq 'ivy-rich-candidate (plist-get plist :columns)))) (when switch-buffer-alist - (setcar switch-buffer-alist '+ivy-rich-buffer-name)))) + (setcar switch-buffer-alist '+ivy-rich-buffer-name))) + + ;; Allow these transformers to apply to more switch-buffer commands + (let ((ivy-switch-buffer-transformer (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer))) + (dolist (cmd '(+ivy--switch-buffer counsel-projectile-switch-to-buffer)) + (setq ivy-rich-display-transformers-list + (plist-put ivy-rich-display-transformers-list + cmd ivy-switch-buffer-transformer))))) (def-package! counsel @@ -141,52 +163,6 @@ immediately runs it on the current candidate (ending the ivy session)." (target (read-file-name (format "%s %s to:" prompt source)))) (funcall cmd source target 1)))) - (when +ivy-buffer-icons - (defun +ivy-reload-icons () - (setq ivy-rich--display-transformers-list - (plist-put ivy-rich--display-transformers-list - 'ivy-switch-buffer - '(:columns - ((all-the-icons-icon-for-file (:width 2 :align right)) - ; return the icon for the file - (+ivy-rich-buffer-name (:width 30)) - ; return the candidate itself - (ivy-rich-switch-buffer-size (:width 7)) - ; return the buffer size - (ivy-rich-switch-buffer-indicators - (:width 4 :face error :align right)) - ; return the buffer indicators - (ivy-rich-switch-buffer-major-mode - (:width 12 :face warning)) - ; return the major mode info - (ivy-rich-switch-buffer-project - (:width 15 :face success)) - ; return project name using `projectile' - (ivy-rich-switch-buffer-path - (:width (lambda (x) - (ivy-rich-switch-buffer-shorten-path - x - (ivy-rich-minibuffer-width 0.3)))))) - ; return file path relative to project - ; root or `default-directory' if project - ; is nil - :predicate - (lambda (cand) (get-buffer cand))))) - (setq ivy-rich--display-transformers-list - (plist-put ivy-rich--display-transformers-list - 'counsel-projectile-find-file - '(:columns - ((all-the-icons-icon-for-file (:width 2 :align right)) - (ivy-rich-candidate))))) - (setq ivy-rich--display-transformers-list - (plist-put ivy-rich--display-transformers-list - 'counsel-projectile-switch-project - '(:columns - (((lambda (_) (all-the-icons-octicon "file-directory")) - (:width 2 :align right)) - (ivy-rich-candidate))))) - (ivy-rich-set-display-transformer))) - ;; Configure `counsel-find-file' (ivy-add-actions 'counsel-find-file @@ -210,9 +186,10 @@ immediately runs it on the current candidate (ending the ivy session)." 'counsel-ag ; also applies to `counsel-rg' & `counsel-pt' '(("O" +ivy-git-grep-other-window-action "open in other window")))) + (def-package! counsel-projectile :commands (counsel-projectile-find-file counsel-projectile-find-dir counsel-projectile-switch-to-buffer - counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) + counsel-projectile-grep counsel-projectile-ag counsel-projectile-switch-project) :init (map! [remap projectile-find-file] #'+ivy/projectile-find-file [remap projectile-find-dir] #'counsel-projectile-find-dir @@ -222,8 +199,7 @@ immediately runs it on the current candidate (ending the ivy session)." [remap projectile-switch-project] #'counsel-projectile-switch-project) :config ;; no highlighting visited files; slows down the filtering - (ivy-set-display-transformer #'counsel-projectile-find-file nil) - (when +ivy-buffer-icons (+ivy-reload-icons))) + (ivy-set-display-transformer #'counsel-projectile-find-file nil)) (def-package! wgrep @@ -266,9 +242,7 @@ immediately runs it on the current candidate (ending the ivy session)." ;; posframe doesn't work well with async sources (dolist (fn '(swiper counsel-ag counsel-grep counsel-git-grep)) - (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback)) - - (when +ivy-buffer-icons (+ivy-reload-icons))) + (setf (alist-get fn ivy-display-functions-alist) #'ivy-display-function-fallback))) (def-package! flx From 43bc14d38e57a2f586ef8ded0d5ff8afe6c586c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 11:01:24 -0400 Subject: [PATCH 4144/4235] Undo noop'ed leader binds for missing commands This was too magical and caused more confusion than the void-function and commandp errors before it. Addresses #1309, #1308 Relevant to #1217 --- core/core-keybinds.el | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 0dd356fcc..a676a1bac 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -99,19 +99,11 @@ If any hook returns non-nil, all hooks after it are ignored.") (general--concat t doom-leader-key ,key) ,desc) wkforms)) - ;; Don't bind missing functions (so they don't throw errors when - ;; used). `fboundp' conveniently returns `t' for autoloaded - ;; functions as well as defined ones. - (let* ((fn (if (general--extended-def-p unquoted-def) - (plist-get unquoted-def :def) - def)) - (unquoted-fn (doom-unquote fn))) - (when (or (not (symbolp unquoted-fn)) - (symbolp fn) - (fboundp unquoted-fn)) - (push `(define-key doom-leader-map (general--kbd ,key) - ,fn) - forms))))))) + (push `(define-key doom-leader-map (general--kbd ,key) + ,(if (general--extended-def-p unquoted-def) + (plist-get unquoted-def :def) + def)) + forms))))) (macroexp-progn (append (nreverse forms) (when wkforms From 182ab918b610805567d38a3dd429f9ad7c736876 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 11:11:53 -0400 Subject: [PATCH 4145/4235] Enable xterm-mouse-mode in tty Emacs --- core/core-os.el | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/core-os.el b/core/core-os.el index 52ce8ae7a..c84861c1d 100644 --- a/core/core-os.el +++ b/core/core-os.el @@ -17,6 +17,9 @@ (if (require 'xclip nil t) (xclip-mode)))) (add-hook 'tty-setup-hook #'doom|init-clipboard-in-tty-emacs) +;; Enable mouse in terminal Emacs +(add-hook 'tty-setup-hook #'xterm-mouse-mode) + ;; stop copying each visual state move to the clipboard: ;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on ;; grokked from: http://stackoverflow.com/questions/15873346/elisp-rename-macro From 1fab389d9e369e500213f6b30e9829b5e7b429e2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 6 Apr 2019 16:23:20 -0400 Subject: [PATCH 4146/4235] Fix #1310: use internal macro for leader binds Creates a separate doom--define-leader-key macro for internal use (in map!). define-leader-key! will continue to exist as a convenience macro for users who want a general.el interface to defining leader keys. Possibly relevant to: #1309 --- core/core-keybinds.el | 74 +++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index a676a1bac..b651d3a9c 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -80,10 +80,9 @@ If any hook returns non-nil, all hooks after it are ignored.") (defalias 'define-key! #'general-def) (defalias 'unmap! #'general-unbind) -;; A `define-leader-key' defined with `general-create-definer' consumes 20-30% -;; of Doom's startup time, we reimplement it ourselves. -(defmacro define-leader-key! (&rest keys) - "Define a leader key on `doom-leader-key'." +;; `map!' uses this instead of `define-leader-key!' because it consumes 20-30% +;; more startup time, so we reimplement it ourselves. +(defmacro doom--define-leader-key (&rest keys) (let (prefix forms wkforms) (while keys (let ((key (pop keys)) @@ -91,38 +90,53 @@ If any hook returns non-nil, all hooks after it are ignored.") (if (keywordp key) (when (memq key '(:prefix :infix)) (setq prefix def)) - (let ((unquoted-def (cdr-safe (doom-unquote def)))) - (when prefix - (setq key `(general--concat t ,prefix ,key))) - (when-let* ((desc (plist-get unquoted-def :which-key))) + (when prefix + (setq key `(general--concat t ,prefix ,key))) + (let* ((udef (doom-unquote def)) + (bdef (if (general--extended-def-p udef) + (general--extract-def (general--normalize-extended-def udef)) + def))) + (unless (eq bdef :ignore) + (push `(define-key doom-leader-map (general--kbd ,key) + ,bdef) + forms)) + (when-let* ((desc (plist-get udef :which-key))) (push `(which-key-add-key-based-replacements (general--concat t doom-leader-key ,key) ,desc) - wkforms)) - (push `(define-key doom-leader-map (general--kbd ,key) - ,(if (general--extended-def-p unquoted-def) - (plist-get unquoted-def :def) - def)) - forms))))) + wkforms)))))) (macroexp-progn (append (nreverse forms) (when wkforms - `((eval-after-load 'which-key - (lambda () ,@(nreverse wkforms))))))))) + `((with-eval-after-load 'which-key + ,@(nreverse wkforms)))))))) -(general-create-definer define-localleader-key! - :major-modes t - :prefix doom-localleader-alt-key) +(defmacro define-leader-key! (&rest args) + "Define keys. -;; :non-normal-prefix doesn't apply to non-evil sessions (only evil's emacs -;; state), so we must redefine `define-localleader-key!' to behave differently -;; where evil is present. -(after! evil - (general-create-definer define-localleader-key! - :states '(normal visual motion emacs) - :major-modes t - :prefix doom-localleader-key - :non-normal-prefix doom-localleader-alt-key)) +Uses `general-define-key' under the hood, but does not support :states, +:wk-full-keys or :keymaps." + `(general-define-key + :states nil + :wk-full-keys nil + :keymaps 'doom-leader-map + ,@args)) + +(defmacro define-localleader-key! (&rest args) + (if (featurep 'evil) + ;; :non-normal-prefix doesn't apply to non-evil sessions (only evil's + ;; emacs state), so we must redefine `define-localleader-key!' to behave + ;; differently where evil is present. + `(general-define-key + :states '(normal visual motion emacs) + :major-modes t + :prefix doom-localleader-key + :non-normal-prefix doom-localleader-alt-key + ,@args) + `(general-define-key + :major-modes t + :prefix doom-localleader-alt-key + ,@args))) ;; We use a prefix commands instead of general's :prefix/:non-normal-prefix ;; properties because general is incredibly slow binding keys en mass with them @@ -236,7 +250,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (pcase key (:leader (doom--map-commit) - (setq doom--map-fn 'define-leader-key!)) + (setq doom--map-fn 'doom--define-leader-key)) (:localleader (doom--map-commit) (setq doom--map-fn 'define-localleader-key!)) @@ -310,7 +324,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (cond ((and (listp def) (keywordp (car-safe (setq unquoted (doom-unquote def))))) (setq def (list 'quote (plist-put unquoted :which-key desc)))) - ((setq def (cons 'list + ((setq def (list 'quote (if (and (equal key "") (null def)) `(:ignore t :which-key ,desc) From e60b44d2555f068f0cfea4b4e7c8d214e7293b1e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2019 15:10:22 -0400 Subject: [PATCH 4147/4235] Fix #1311: remove project check in ivy transformer Also: minor refactor of `cond` fallback blocks --- modules/completion/ivy/autoload/ivy.el | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index bb426b317..a8e484aed 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -17,18 +17,11 @@ (defun +ivy-rich-buffer-name (candidate) "Display the buffer name. -Displays buffers in other projects in `font-lock-doc-face', and -temporary/special buffers in `font-lock-comment-face'." - (propertize - candidate - 'face (cond ((string-match-p "^ *\\*" candidate) - 'font-lock-comment-face) - ((not (buffer-file-name (get-buffer candidate))) - nil) - ((not (projectile-project-buffer-p - (get-buffer candidate) - (doom-project-root))) - 'font-lock-doc-face)))) +Buffers that are considered unreal (see `doom-real-buffer-p') are dimmed with +`font-lock-comment-face'." + (if (doom-real-buffer-p (get-buffer candidate)) + candidate + (propertize candidate 'face 'font-lock-comment-face))) ;;;###autoload (defun +ivy-rich-buffer-icon (candidate) @@ -66,16 +59,14 @@ Otherwise show the fundamental-mode icon." (current (setq prompt "Switch to buffer: " action #'ivy--switch-buffer-action)) - (t - (setq prompt "Switch to buffer in other window: " + ((setq prompt "Switch to buffer in other window: " action #'ivy--switch-buffer-other-window-action))) (when +ivy-buffer-preview (cond ((not (and ivy-use-virtual-buffers (eq +ivy-buffer-preview 'everything))) (setq update #'+ivy--switch-buffer-preview unwind #'+ivy--switch-buffer-unwind)) - (t - (setq update #'+ivy--switch-buffer-preview-all + ((setq update #'+ivy--switch-buffer-preview-all unwind #'+ivy--switch-buffer-unwind)))) (ivy-read prompt 'internal-complete-buffer :action action From 00bb00649b424de7fb658a5ef80234254828f8f9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2019 15:54:03 -0400 Subject: [PATCH 4148/4235] Fix #1065: add +ivy-buffer-unreal-face option --- modules/completion/ivy/autoload/ivy.el | 4 ++-- modules/completion/ivy/config.el | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index a8e484aed..33cd6cd2e 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -18,10 +18,10 @@ "Display the buffer name. Buffers that are considered unreal (see `doom-real-buffer-p') are dimmed with -`font-lock-comment-face'." +`+ivy-buffer-unreal-face'." (if (doom-real-buffer-p (get-buffer candidate)) candidate - (propertize candidate 'face 'font-lock-comment-face))) + (propertize candidate 'face +ivy-buffer-unreal-face))) ;;;###autoload (defun +ivy-rich-buffer-icon (candidate) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 0afe667d9..ded6ab898 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -26,6 +26,9 @@ silently ignored. If you want to already use git-grep or grep, set this to nil.") +(defvar +ivy-buffer-unreal-face 'font-lock-comment-face + "The face for unreal buffers in `ivy-switch-to-buffer'.") + (defmacro +ivy-do-action! (action) "Returns an interactive lambda that sets the current ivy action and immediately runs it on the current candidate (ending the ivy session)." From 3b2befe161faf1e72a9fcea1d8f63a0f0e820e8d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2019 15:56:30 -0400 Subject: [PATCH 4149/4235] Move evil helpful keybinds to +evil-bindings --- modules/config/default/+evil-bindings.el | 3 +++ modules/feature/evil/+everywhere.el | 6 ------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 65c7c8490..2359576a8 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -52,6 +52,9 @@ :map vc-annotate-mode-map [remap quit-window] #'kill-this-buffer) + (:map (help-mode-map helpful-mode-map) + :n "o" 'ace-link-help) + ;; misc :n "C-S-f" #'toggle-frame-fullscreen diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index f52e31202..55b901d2f 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -188,12 +188,6 @@ variable for an explanation of the defaults (in comments). See (add-transient-hook! 'occur-mode (+evil-collection-init (if EMACS26+ 'replace "replace"))) -(after! helpful - (evil-define-key* 'normal helpful-mode-map - "o" #'ace-link-help - "]l" #'forward-button - "[l" #'backward-button)) - (evil-define-key* 'normal process-menu-mode-map "q" #'kill-this-buffer "d" #'process-menu-delete-process) From a4283427f54799ec8da786c0b46ce0150bd44f5f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2019 16:06:52 -0400 Subject: [PATCH 4150/4235] Fix autoloaded hydras They weren't marked as interactive, making them unavailable for `M-x` or keybinds. --- core/autoload/hydras.el | 4 ++-- modules/completion/ivy/autoload/hydras.el | 2 +- modules/tools/ein/autoload.el | 2 +- modules/tools/rgb/autoload.el | 2 +- modules/ui/vc-gutter/autoload.el | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/autoload/hydras.el b/core/autoload/hydras.el index 450d5a95b..407289148 100644 --- a/core/autoload/hydras.el +++ b/core/autoload/hydras.el @@ -1,6 +1,6 @@ ;;; core/autoload/hydras.el -*- lexical-binding: t; -*- -;;;###autoload (autoload 'doom-text-zoom-hydra/body "core/autoload/hydras" nil nil) +;;;###autoload (autoload 'doom-text-zoom-hydra/body "core/autoload/hydras" nil t) (defhydra doom-text-zoom-hydra (:hint t :color red) " Text zoom: _j_:zoom in, _k_:zoom out, _0_:reset @@ -9,7 +9,7 @@ ("k" text-scale-decrease "out") ("0" (text-scale-set 0) "reset")) -;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil nil) +;;;###autoload (autoload 'doom-window-nav-hydra/body "core/autoload/hydras" nil t) (defhydra doom-window-nav-hydra (:hint nil) " Split: _v_ert _s_:horz diff --git a/modules/completion/ivy/autoload/hydras.el b/modules/completion/ivy/autoload/hydras.el index 36c1ff9c9..45647536c 100644 --- a/modules/completion/ivy/autoload/hydras.el +++ b/modules/completion/ivy/autoload/hydras.el @@ -1,6 +1,6 @@ ;;; completion/ivy/autoload/hydras.el -*- lexical-binding: t; -*- -;;;###autoload (autoload '+ivy-coo-hydra/body "completion/ivy/autoload/hydras" nil nil) +;;;###autoload (autoload '+ivy-coo-hydra/body "completion/ivy/autoload/hydras" nil t) (defhydra +ivy-coo-hydra (:hint nil :color pink) " Move ^^^^^^^^^^ | Call ^^^^ | Cancel^^ | Options^^ | Action _w_/_s_/_a_: %s(ivy-action-name) diff --git a/modules/tools/ein/autoload.el b/modules/tools/ein/autoload.el index 9d35fb093..0dd10d81a 100644 --- a/modules/tools/ein/autoload.el +++ b/modules/tools/ein/autoload.el @@ -23,7 +23,7 @@ (goto-char (1+ res)) (widget-button-press (point))))) -;;;###autoload (autoload '+ein-hydra/body "tools/ein/autoload" nil nil) +;;;###autoload (autoload '+ein-hydra/body "tools/ein/autoload" nil t) (defhydra +ein-hydra (:hint t :color red) " Operations on Cells^^^^^^ Other diff --git a/modules/tools/rgb/autoload.el b/modules/tools/rgb/autoload.el index 96647de20..5fdedbe29 100644 --- a/modules/tools/rgb/autoload.el +++ b/modules/tools/rgb/autoload.el @@ -1,6 +1,6 @@ ;;; tools/rgb/autoload.el -*- lexical-binding: t; -*- -;;;###autoload (autoload '+rgb-kurecolor-hydra/body "tools/rgb/autoload" nil nil) +;;;###autoload (autoload '+rgb-kurecolor-hydra/body "tools/rgb/autoload" nil t) (defhydra +rgb-kurecolor-hydra (:color pink :hint nil) " Inc/Dec _w_/_W_ brightness _d_/_D_ saturation _e_/_E_ hue " diff --git a/modules/ui/vc-gutter/autoload.el b/modules/ui/vc-gutter/autoload.el index def6ed45b..bac2c9e90 100644 --- a/modules/ui/vc-gutter/autoload.el +++ b/modules/ui/vc-gutter/autoload.el @@ -1,6 +1,6 @@ ;;; ui/vc-gutter/autoload.el -*- lexical-binding: t; -*- -;;;###autoload (autoload '+vc-gutter-hydra/body "ui/vc-gutter/autoload" nil nil) +;;;###autoload (autoload '+vc-gutter-hydra/body "ui/vc-gutter/autoload" nil t) (defhydra +vc-gutter-hydra (:body-pre (git-gutter-mode 1) :hint nil) " From ffe297bc7f49be3dd751b7a5ed1978a350d268ed Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2019 16:46:59 -0400 Subject: [PATCH 4151/4235] lang/haskell: rewrite README + minor refactor - Documents lsp-haskell - Use hie-wrapper on MacOS - Update tools/lsp README to include :lang haskell - Mention cabal-new-repl setting (#1140) --- modules/lang/haskell/+dante.el | 2 +- modules/lang/haskell/+lsp.el | 2 + modules/lang/haskell/README.org | 237 +++++++++++++++++++------------- modules/tools/lsp/README.org | 1 + 4 files changed, 146 insertions(+), 96 deletions(-) diff --git a/modules/lang/haskell/+dante.el b/modules/lang/haskell/+dante.el index 44908bc9a..2774b8a62 100644 --- a/modules/lang/haskell/+dante.el +++ b/modules/lang/haskell/+dante.el @@ -20,7 +20,7 @@ (set-company-backend! 'dante-mode #'dante-company) (defun +haskell*restore-modified-state (orig-fn &rest args) - "Dante quietly saves the current buffer (without triggering save hooks) before + "Dante quietly saves the current buffer (without triggering save hooks) before invoking flycheck, unexpectedly leaving the buffer in an unmodified state. This is annoying if we depend on save hooks to do work on the buffer (like reformatting), so we restore a (false) modified state." diff --git a/modules/lang/haskell/+lsp.el b/modules/lang/haskell/+lsp.el index 71967a30b..576e26e67 100644 --- a/modules/lang/haskell/+lsp.el +++ b/modules/lang/haskell/+lsp.el @@ -4,5 +4,7 @@ :after haskell-mode :init (add-hook 'haskell-mode-hook #'lsp!) :config + (when IS-MAC + (setq lsp-haskell-process-path-hie "hie-wrapper")) ;; Does some strange indentation if it pastes in the snippet (setq-hook! 'haskell-mode-hook yas-indent-line 'fixed)) diff --git a/modules/lang/haskell/README.org b/modules/lang/haskell/README.org index f29b189e2..9f8fe77e6 100644 --- a/modules/lang/haskell/README.org +++ b/modules/lang/haskell/README.org @@ -1,6 +1,25 @@ -#+TITLE: :lang haskell +#+TITLE: lang/haskell +#+DATE: January 16, 2017 +#+SINCE: v0.7 +#+STARTUP: inlineimages -This module adds [[https://www.haskell.org/][Haskell]] support, powered by either [[https://haskell-lang.org/intero][intero]] (the default) or [[https://github.com/jyp/dante][dante]]. +* Table of Contents :TOC: +- [[#description][Description]] + - [[#external-resources][External resources]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] +- [[#prerequisites][Prerequisites]] + - [[#stack][Stack]] + - [[#cabal][Cabal]] + - [[#lsp][LSP]] + - [[#haskell-packages][Haskell packages]] +- [[#configuration][Configuration]] + - [[#using-the-new-style-cabal-repl][Using the new-style cabal REPL]] +- [[#troubleshooting][Troubleshooting]] + +* Description +This module adds [[https://www.haskell.org/][Haskell]] support, powered by either [[https://haskell-lang.org/intero][intero]] (the default), [[https://github.com/jyp/dante][dante]] +or [[https://github.com/emacs-lsp/lsp-haskell][LSP]]. + Code completion (~company-ghc~) + Look up documentation (~hoogle~) @@ -10,102 +29,130 @@ This module adds [[https://www.haskell.org/][Haskell]] support, powered by eithe + Code navigation (~dante~) + [[https://github.com/hlissner/emacs-snippets/tree/master/haskell-mode][Snippets]] -#+begin_quote -Haskell contends with C and Ruby as my favorite language. My Haskell code will never save the world, but I'll reach for it for small projects and programming exercises (like projecteuler.com or exercism.io). - -I'd love to incorporate it into my machine learning work, but Python and Julia hold that crown. For now. -#+end_quote - -* Table of Contents :TOC: -- [[#install][Install]] - - [[#intero][Intero]] - - [[#dante][Dante]] -- [[#troubleshooting][Troubleshooting]] -- [[#resources][Resources]] - -* Install -This module has two submodules: *Intero* or *Dante*. To activate one, specify one or the other in your pubilc ~init.el~, e.g.: - -#+BEGIN_SRC emacs-lisp -(doom! :lang (haskell +intero)) -;; or -(doom! :lang (haskell +dante)) -#+END_SRC - -Your dependencies will change slightly, depending on which you choose: - -** Intero -*** Haskell -To get started you must install *stack*: - -**** MacOS -#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes") -brew install haskell-stack -stack setup -#+END_SRC - -**** Arch Linux -#+BEGIN_SRC sh :dir /sudo:: :tangle (if (doom-system-os 'arch) "yes") -sudo pacman --needed --noconfirm -S stack -# Replace pacaur with your AUR package manager of choice -pacaur --needed --noconfirm -S ncurses5-compat-lib -stack setup -#+END_SRC - -*** External dependencies -This module requires ~ghc-mod~. - -#+BEGIN_SRC sh -stack install ghc-mod -#+END_SRC - -Also ensure that ~\~/.local/bin~ is in ~PATH~: - -#+BEGIN_SRC sh -# place this in your profile file, like ~/.bash_profile or ~/.zshenv -export PATH="~/.local/bin:$PATH" -#+END_SRC - -** Dante -*** Haskell -To get started with Dante and Haskell, you must install cabal - -+ cabal (the haskell package builder) -+ ghc/ghci (the compiler, syntax checker & repl) - -**** MacOS -#+BEGIN_SRC sh -brew install cabal-install ghc -#+END_SRC - -**** Arch Linux -#+BEGIN_SRC sh -sudo pacman --needed --noconfirm -S cabal-install ghc -#+END_SRC - -*** External dependencies -Dante requires ~ghc-mod~ and ~hoogle~: - -#+BEGIN_SRC sh -cabal update -cabal install happy haskell-src-exts # ghc-mod/hoogle dependencies -cabal ghc-mod hoogle -#+END_SRC - -And add Cabal's bin path to $PATH: - -#+BEGIN_SRC sh -export PATH="$HOME/.cabal/bin:$PATH" -#+END_SRC - -* Troubleshooting -+ Stack users: a ~dist/setup-config~ in your project may cause [[ https://github.com/DanielG/ghc-mod/wiki#known-issues-related-to-stack][ghc-mod to not - work]]. - -* Resources +** External resources Here are a few resources I've found indespensible in my Haskell adventures: + [[http://learnyouahaskell.com/][Learn you a haskell for great good]] + [[http://haskellbook.com/][Haskell Programming from first principles]] + [[https://github.com/krispo/awesome-haskell][Awesome Haskell]]: an extensive list of haskell resources + [[https://docs.haskellstack.org/en/stable/README/][The Haskell Tool Stack docs]] + +** Module Flags ++ =+intero= Enables intero; a comprehensive, stack-based development environment + for Haskell. ++ =+dante= Enables dante; a fork of intero aimed at lightweightedness. It + doesn't depend on =stack=, supports both ~cabal~-only and ~stack~ projects, + but lacks eldoc support. ++ =+lsp= Enables lsp-haskell (this requires the ~:tools lsp~ to be enabled). + +** Plugins ++ [[https://github.com/haskell/haskell-mode][haskell-mode]] ++ =+dante= + + [[https://github.com/jyp/dante][dante]] + + [[https://github.com/jyp/attrap][attrap]] ++ =+intero= + + [[https://github.com/chrisdone/intero][intero]] ++ =+lsp= + + [[https://github.com/emacs-lsp/lsp-haskell][lsp-haskell]] + +* Prerequisites +Depending on whether you use Intero, Dante or LSP, your dependencies will +differ: + ++ Intero and LSP users need =stack= ++ Dante users need =cabal=, =ghc= and =ghc-mod= ++ LSP users need the =haskell-ide-engine= LSP server ++ All users will need the =hoogle= package + +** Stack +To use Intero, you need =stack=: + +*** MacOS +#+BEGIN_SRC sh +brew install haskell-stack +stack setup +#+END_SRC + +*** Arch Linux +#+BEGIN_SRC sh +sudo pacman -S stack +# Replace pacaur with your AUR package manager of choice +pacaur -S ncurses5-compat-lib +stack setup +#+END_SRC + +** Cabal +To use Dante, you need =cabal= (the haskell package builder) and =ghci= (the +compiler, syntax checker & repl): + +*** MacOS +#+BEGIN_SRC sh +brew install cabal-install ghc +#+END_SRC + +*** Arch Linux +#+BEGIN_SRC sh +sudo pacman -S cabal-install ghc +#+END_SRC + +** LSP +You will need =stack= and =git= installed. + +You will find a comprehensive [[https://github.com/haskell/haskell-ide-engine#installation][install guide for haskell-ide-engine on its +project page]], but here's a TL;DR: + +*** MacOS +haskell-ide-engine must be build and installed manually on MacOS, e.g. + +#+BEGIN_SRC emacs-lisp +git clone https://github.com/haskell/haskell-ide-engine +cd haskell-ide-engine +make +#+END_SRC + +*** Arch Linux +=haskell-ide-engine-git= is available on the AUR + +#+BEGIN_SRC emacs-lisp +yay -S haskell-ide-engine-git +#+END_SRC + +** Haskell packages +You'll need to install the following packages using ~stack~ or ~cabal~: + ++ (Dante users) =ghc-mod= + #+BEGIN_SRC sh + stack install ghc-mod + # or + cabal install ghc-mod + #+END_SRC ++ =hoogle= + #+BEGIN_SRC sh + cabal update + cabal install happy haskell-src-exts # ghc-mod/hoogle dependencies + cabal ghc-mod hoogle + # or + stack install ghc-mod + stack install hoogle + #+END_SRC + +And ensure the binaries for these packages are in your ~PATH~, e.g. + +#+BEGIN_SRC sh +# place this in your profile file, like ~/.bash_profile or ~/.zshenv +export PATH="~/.local/bin:$PATH" +#+END_SRC + +* Configuration +** Using the new-style cabal REPL +=haskell-mode= will typically detect what REPL to run based on your project +(e.g. stack, (old-style) cabal or ghc). If you want the new-style cabal REPL you +must set ~haskell-process-type~ manually: + +#+BEGIN_SRC emacs-lisp +(setq haskell-process-type 'cabal-new-repl) +#+END_SRC + +* Troubleshooting ++ Stack users: a ~dist/setup-config~ file in your project may cause [[https://github.com/DanielG/ghc-mod/wiki#known-issues-related-to-stack][ghc-mod to + not work]]. diff --git a/modules/tools/lsp/README.org b/modules/tools/lsp/README.org index d68fde77d..a94b4af7a 100644 --- a/modules/tools/lsp/README.org +++ b/modules/tools/lsp/README.org @@ -33,6 +33,7 @@ As of this writing, these Doom modules possess LSP support: |------------------+---------------------------------------------------------+---------------------------------------------------------------| | [[../../lang/cc/README.org][:lang cc]] | c-mode, c++-mode, objc-mode | ccls | | [[../../lang/go/README.org][:lang go]] | go-mode | go-langserver | +| [[../../lang/haskell/README.org][:lang haskell]] | haskell-mode | haskell-ide-engine | | [[../../lang/javascript/README.org][:lang javascript]] | js2-mode, rjsx-mode, typescript-mode | typescript-language-server | | [[../../lang/java/README.org][:lang java]] | java-mode | lsp-java | | [[../../lang/ocaml/README.org][:lang ocaml]] | taureg-mode | ocaml-language-server | From af4ca974a36c5a90aa0082f77dde47927f378045 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 7 Apr 2019 17:28:46 -0400 Subject: [PATCH 4152/4235] lang/org: add +protocol module #257 Adds lazy-loaded support for org-protocol as a basis for features to come. --- modules/lang/org/+protocol.el | 36 +++++++++++++++++++++++++++++++++++ modules/lang/org/config.el | 11 ++++++----- 2 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 modules/lang/org/+protocol.el diff --git a/modules/lang/org/+protocol.el b/modules/lang/org/+protocol.el new file mode 100644 index 000000000..9fd46fa50 --- /dev/null +++ b/modules/lang/org/+protocol.el @@ -0,0 +1,36 @@ +;;; lang/org/+protocol.el -*- lexical-binding: t; -*- + +;; Brings lazy-loaded support for org-protocol, so external programs (like +;; browsers) can invoke specialized behavior from Emacs. Normally you'd simply +;; require `org-protocol' and use it, but the package loads all of org for no +;; compelling reason, so... +(defun +org*server-visit-files (args) + "Advise `server-visit-flist' to invoke `org-protocol' lazily." + (cl-destructuring-bind (files proc &optional nowait) args + (catch 'greedy + (let ((flist (reverse files))) + (dolist (var flist) + (when (string-match-p ":/+" (car var)) + (require 'server) + (require 'org-protocol) + ;; `\' to `/' on windows + (let ((fname (org-protocol-check-filename-for-protocol + (expand-file-name (car var)) + (member var flist) + proc))) + (cond ((eq fname t) ; greedy? We need the t return value. + (setq files nil) + (throw 'greedy t)) + ((stringp fname) ; probably filename + (setcar var fname)) + ((setq files (delq var files))))))))) + (list files proc nowait))) +(advice-add #'server-visit-files :filter-args #'+org*server-visit-files) + +;; Disable built-in, clumsy advice +(after! org-protocol + (ad-disable-advice 'server-visit-files 'before 'org-protocol-detect-protocol-server)) + + +;; TODO org-board or better link grabbing support +;; TODO org-capture + org-protocol instead of bin/org-capture diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 21d508ab2..18c1063b7 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -49,11 +49,12 @@ :config ;; Sub-modules - (if (featurep! +attach) (load! "+attach")) - (if (featurep! +babel) (load! "+babel")) - (if (featurep! +capture) (load! "+capture")) - (if (featurep! +export) (load! "+export")) - (if (featurep! +present) (load! "+present"))) + (if (featurep! +attach) (load! "+attach")) + (if (featurep! +babel) (load! "+babel")) + (if (featurep! +capture) (load! "+capture")) + (if (featurep! +export) (load! "+export")) + (if (featurep! +present) (load! "+present")) + (if (featurep! +protocol) (load! "+protocol"))) ;; From 3b352143c0c640598007683229c19fbb31116765 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 14:06:18 -0400 Subject: [PATCH 4153/4235] Fix commandp errors on {local,}leader keys General would read (function ...) forms unevaluated, as a list, rather than a function symbol. --- core/core-keybinds.el | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index b651d3a9c..62fc7a3a8 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -92,7 +92,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (setq prefix def)) (when prefix (setq key `(general--concat t ,prefix ,key))) - (let* ((udef (doom-unquote def)) + (let* ((udef (cdr-safe (doom-unquote def))) (bdef (if (general--extended-def-p udef) (general--extract-def (general--normalize-extended-def udef)) def))) @@ -115,7 +115,9 @@ If any hook returns non-nil, all hooks after it are ignored.") "Define keys. Uses `general-define-key' under the hood, but does not support :states, -:wk-full-keys or :keymaps." +:wk-full-keys or :keymaps. Use `map!' for a more convenient interface. + +See `doom-leader-key' and `doom-leader-alt-key' to change the leader prefix." `(general-define-key :states nil :wk-full-keys nil @@ -123,10 +125,17 @@ Uses `general-define-key' under the hood, but does not support :states, ,@args)) (defmacro define-localleader-key! (&rest args) + "Define key. + +Uses `general-define-key' under the hood, but does not support :major-modes, +:states, :prefix or :non-normal-prefix. Use `map!' for a more convenient +interface. + +See `doom-localleader-key' and `doom-localleader-alt-key' to change the +localleader prefix." (if (featurep 'evil) ;; :non-normal-prefix doesn't apply to non-evil sessions (only evil's - ;; emacs state), so we must redefine `define-localleader-key!' to behave - ;; differently where evil is present. + ;; emacs state) `(general-define-key :states '(normal visual motion emacs) :major-modes t @@ -324,7 +333,7 @@ For example, :nvi will map to (list 'normal 'visual 'insert). See (cond ((and (listp def) (keywordp (car-safe (setq unquoted (doom-unquote def))))) (setq def (list 'quote (plist-put unquoted :which-key desc)))) - ((setq def (list 'quote + ((setq def (cons 'list (if (and (equal key "") (null def)) `(:ignore t :which-key ,desc) From 4a2d0bf955ad2e35c484e56426dc2fc803c2209d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 14:33:45 -0400 Subject: [PATCH 4154/4235] Add :lang org +protocol to init.example.el --- init.example.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 6269accf8..7046dd8e6 100644 --- a/init.example.el +++ b/init.example.el @@ -115,7 +115,8 @@ +babel ; running code in org +capture ; org-capture in and outside of Emacs +export ; Exporting org to whatever you want - +present) ; Emacs for presentations + +present ; Emacs for presentations + +protocol) ; Support for org-protocol:// links ;;perl ; write code no one else can comprehend ;;php ; perl's insecure younger brother ;;plantuml ; diagrams for confusing people more From 5f09c9c6340e3228033196a15b7230deede90df4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 15:27:20 -0400 Subject: [PATCH 4155/4235] Fix map! tests wrt 1fab389d --- core/test/test-core-keybinds.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/test/test-core-keybinds.el b/core/test/test-core-keybinds.el index 046f33ead..2db47792e 100644 --- a/core/test/test-core-keybinds.el +++ b/core/test/test-core-keybinds.el @@ -197,13 +197,13 @@ (it "uses leader definer" (expect '(map! :leader "a" #'a "b" #'b) :to-expand-into - '(define-leader-key! "a" #'a "b" #'b))) + '(doom--define-leader-key "a" #'a "b" #'b))) (it "it persists for nested keys" (expect '(map! :leader "a" #'a ("b" #'b)) :to-expand-into - '(progn (define-leader-key! "a" #'a) - (define-leader-key! "b" #'b))))) + '(progn (doom--define-leader-key "a" #'a) + (doom--define-leader-key "b" #'b))))) (describe ":localleader" (it "uses localleader definer" From f934f386272cd5dcf7b9c8fd23c32a5b30e4518d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 22:58:10 -0400 Subject: [PATCH 4156/4235] ui/doom-dashboard: general refactor Hopefully addresses #1170 --- modules/ui/doom-dashboard/autoload.el | 2 +- modules/ui/doom-dashboard/config.el | 113 +++++++++++++------------- 2 files changed, 58 insertions(+), 57 deletions(-) diff --git a/modules/ui/doom-dashboard/autoload.el b/modules/ui/doom-dashboard/autoload.el index 898ae8a4f..a116497ee 100644 --- a/modules/ui/doom-dashboard/autoload.el +++ b/modules/ui/doom-dashboard/autoload.el @@ -10,7 +10,7 @@ "Switch to the dashboard in the current window, of the current FRAME." (interactive (list (selected-frame))) (with-selected-frame frame - (switch-to-buffer (+doom-dashboard-initial-buffer)) + (switch-to-buffer (doom-fallback-buffer)) (+doom-dashboard-reload t))) ;;;###autoload diff --git a/modules/ui/doom-dashboard/config.el b/modules/ui/doom-dashboard/config.el index cfaa23df9..5444cb559 100644 --- a/modules/ui/doom-dashboard/config.el +++ b/modules/ui/doom-dashboard/config.el @@ -99,40 +99,56 @@ PLIST can have the following properties: ;; -;; Bootstrap +;;; Bootstrap -(setq doom-fallback-buffer-name +doom-dashboard-name - ;; Fixes #850: `emacs file.txt' opens two windows, one for file.txt and - ;; one for `initial-buffer-choice' (in `command-line-1'). We want one or - ;; the other, not both. - initial-buffer-choice - (when (or (daemonp) - (not (cl-loop for arg in (cdr command-line-args) - if (or (equal arg "--restore") - (and (string-match-p "^[^-]" arg) - (file-exists-p arg))) - return t))) - #'+doom-dashboard-initial-buffer)) +(defun +doom-dashboard|init () + "Initializes Doom's dashboard." + (unless noninteractive + ;; Ensure the dashboard is up-to-date whenever it is switched to or resized. + (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) + (add-hook 'window-size-change-functions #'+doom-dashboard|resize) + (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) + (add-hook 'doom-switch-buffer-hook #'+doom-dashboard|reload-on-kill) + (add-hook 'delete-frame-functions #'+doom-dashboard|reload-frame) -(add-hook 'doom-init-ui-hook #'+doom-dashboard|init 'append) + ;; `persp-mode' integration: update `default-directory' when switching perspectives + (add-hook 'persp-created-functions #'+doom-dashboard|record-project) + (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) + (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project) + + ;; Ensure the dashboard becomes Emacs' go-to buffer when there's nothing + ;; else to show. + (setq doom-fallback-buffer-name +doom-dashboard-name + initial-buffer-choice #'doom-fallback-buffer) + (when (equal (buffer-name) "*scratch*") + (switch-to-buffer (doom-fallback-buffer)) + (if (daemonp) + (add-hook 'after-make-frame-functions #'+doom-dashboard|reload-frame) + (+doom-dashboard-reload))))) + +(add-hook 'doom-init-ui-hook #'+doom-dashboard|init) ;; -;; Major mode +;;; Major mode (define-derived-mode +doom-dashboard-mode special-mode (format "DOOM v%s" doom-version) + "Major mode for the DOOM dashboard buffer." :syntax-table nil :abbrev-table nil - "Major mode for the DOOM dashboard buffer." (setq truncate-lines t) (setq-local whitespace-style nil) (setq-local show-trailing-whitespace nil) (setq-local hscroll-margin 0) (setq-local tab-width 2) + ;; Don't scroll to follow cursor + (setq-local scroll-preserve-screen-position nil) + (setq-local auto-hscroll-mode nil) (cl-loop for (car . _cdr) in fringe-indicator-alist collect (cons car nil) into alist finally do (setq fringe-indicator-alist alist)) + ;; Ensure point is always on a button (add-hook 'post-command-hook #'+doom-dashboard|reposition-point nil t)) (define-key! +doom-dashboard-mode-map @@ -175,13 +191,13 @@ PLIST can have the following properties: ;; -;; Hooks +;;; Hooks (defun +doom-dashboard|reposition-point () "Trap the point in the buttons." (when (region-active-p) (deactivate-mark t) - (when (bound-and-true-p evil-mode) + (when (bound-and-true-p evil-local-mode) (evil-change-to-previous-state))) (or (ignore-errors (if (button-at (point)) @@ -190,25 +206,12 @@ PLIST can have the following properties: (progn (goto-char (point-min)) (forward-button 1)))) -(defun +doom-dashboard|init () - "Initializes Doom's dashboard." - (unless noninteractive - (add-hook 'window-configuration-change-hook #'+doom-dashboard|resize) - (add-hook 'window-size-change-functions #'+doom-dashboard|resize) - (add-hook 'kill-buffer-query-functions #'+doom-dashboard|reload-on-kill) - (add-hook 'doom-switch-buffer-hook #'+doom-dashboard|reload-on-kill) - ;; `persp-mode' integration: update `default-directory' when switching - (add-hook 'persp-created-functions #'+doom-dashboard|record-project) - (add-hook 'persp-activated-functions #'+doom-dashboard|detect-project) - (add-hook 'persp-before-switch-functions #'+doom-dashboard|record-project)) - (if (daemonp) - (add-hook 'after-make-frame-functions #'+doom-dashboard|reload-frame) - (+doom-dashboard-reload t))) - (defun +doom-dashboard|reload-on-kill () - "A `kill-buffer-query-functions' hook. 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. + "A `kill-buffer-query-functions' hook. + +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 (let ((buf (current-buffer))) @@ -230,11 +233,13 @@ whose dimensions may not be fully initialized by the time this is run." "Recenter the dashboard, and reset its margins and fringes." (let ((windows (get-buffer-window-list (doom-fallback-buffer) nil t)) buffer-list-update-hook) - (dolist (win windows) - (set-window-start win 0) - (set-window-fringes win 0 0) - (set-window-margins - win (max 0 (/ (- (window-total-width win) +doom-dashboard--width) 2)))) + (let (window-configuration-change-hook + window-size-change-functions) + (dolist (win windows) + (set-window-start win 0) + (set-window-fringes win 0 0) + (set-window-margins + win (max 0 (/ (- (window-total-width win) +doom-dashboard--width) 2))))) (when windows (with-current-buffer (doom-fallback-buffer) (save-excursion @@ -271,12 +276,7 @@ project (which may be different across perspective)." ;; -;; Library - -(defun +doom-dashboard-initial-buffer () - "Returns buffer to display on startup. Designed for `initial-buffer-choice'." - (let (buffer-list-update-hook) - (get-buffer-create +doom-dashboard-name))) +;;; Library (defun +doom-dashboard-p (buffer) "Returns t if BUFFER is the dashboard buffer." @@ -303,15 +303,17 @@ controlled by `+doom-dashboard-pwd-policy'." force) (with-current-buffer (doom-fallback-buffer) (with-silent-modifications - (save-excursion + (let ((pt (point))) (unless (eq major-mode '+doom-dashboard-mode) (+doom-dashboard-mode)) (erase-buffer) - (run-hooks '+doom-dashboard-functions))) - (+doom-dashboard|resize) - (+doom-dashboard|detect-project) - (+doom-dashboard-update-pwd) - (current-buffer)))) + (run-hooks '+doom-dashboard-functions) + (goto-char pt) + (+doom-dashboard|reposition-point)) + (+doom-dashboard|resize) + (+doom-dashboard|detect-project) + (+doom-dashboard-update-pwd) + (current-buffer))))) ;; helpers (defun +doom-dashboard--center (len s) @@ -337,13 +339,12 @@ controlled by `+doom-dashboard-pwd-policy'." cwd))) ((eq policy 'last) lastcwd) - (t - (warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" + ((warn "`+doom-dashboard-pwd-policy' has an invalid value of '%s'" policy))))) ;; -;; Widgets +;;; Widgets (defun doom-dashboard-widget-banner () (let ((point (point))) From 742687a51e2e62ff6cf409403828270ac6e232cc Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 23:01:30 -0400 Subject: [PATCH 4157/4235] Add delq! and pushnew! macros And move projectile configs to their respective modules (and out of package configs). --- core/core-lib.el | 14 ++++++++++++++ core/core-projects.el | 13 +------------ modules/lang/cc/config.el | 11 ++++++----- modules/lang/javascript/config.el | 8 ++++---- modules/lang/web/+css.el | 8 ++++++++ 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 7f71cad74..6bc55a105 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -135,6 +135,20 @@ Accepts the same arguments as `message'." (defalias 'lambda! 'λ!) +(defmacro pushnew! (place &rest values) + "Like `cl-pushnew', but will prepend VALUES to PLACE. +The order VALUES is preserved." + `(dolist (--value-- (nreverse (list ,@values))) + (cl-pushnew --value-- ,place))) + +(defmacro delq! (elt list &optional fetcher) + "Delete ELT from LIST in-place." + `(setq ,list + (delq ,(if fetcher + `(funcall ,fetcher ,elt ,list) + elt) + ,list))) + (defmacro defer-until! (condition &rest body) "Run BODY when CONDITION is true (checks on `after-load-functions'). Meant to serve as a predicated alternative to `after!'." diff --git a/core/core-projects.el b/core/core-projects.el index 0571cb5ce..7734ee700 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -39,18 +39,7 @@ Emacs.") ;; a more generic project root file (push ".project" projectile-project-root-files-bottom-up) - - (setq projectile-globally-ignored-directories - (append projectile-globally-ignored-directories - (list (abbreviate-file-name doom-local-dir) ".sync" - "node_modules" "flow-typed")) - projectile-other-file-alist - (append projectile-other-file-alist - '(("css" "scss" "sass" "less" "styl") - ("scss" "css") - ("sass" "css") - ("less" "css") - ("styl" "css")))) + (push (abbreviate-file-name doom-local-dir) projectile-globally-ignored-directories) ;; Accidentally indexing big directories like $HOME or / will massively bloat ;; projectile's cache (into the hundreds of MBs). This purges those entries diff --git a/modules/lang/cc/config.el b/modules/lang/cc/config.el index c53273bea..e6f83ae1c 100644 --- a/modules/lang/cc/config.el +++ b/modules/lang/cc/config.el @@ -237,13 +237,14 @@ This is ignored by ccls.") (def-package! ccls :when (featurep! +lsp) :hook ((c-mode-local-vars c++-mode-local-vars objc-mode-local-vars) . +cc|init-ccls) + :init + (after! projectile + (add-to-list 'projectile-globally-ignored-directories ".ccls-cache") + (add-to-list 'projectile-project-root-files-bottom-up ".ccls-root") + (add-to-list 'projectile-project-root-files-top-down-recurring "compile_commands.json")) :config (defun +cc|init-ccls () (setq-local company-transformers nil) (setq-local company-lsp-async t) (setq-local company-lsp-cache-candidates nil) - (lsp)) - (after! projectile - (add-to-list 'projectile-globally-ignored-directories ".ccls-cache") - (add-to-list 'projectile-project-root-files-bottom-up ".ccls-root") - (add-to-list 'projectile-project-root-files-top-down-recurring "compile_commands.json"))) + (lsp))) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index 0a4e553d4..d38dfa03f 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -23,6 +23,10 @@ ;; Other :yield "import")) +(after! projectile + (pushnew! projectile-project-root-files "package.json") + (pushnew! projectile-globally-ignored-directories "node_modules" "flow-typed")) + ;; ;; Major modes @@ -54,10 +58,6 @@ (set-electric! 'js2-mode :chars '(?\} ?\) ?. ?:)) (set-repl-handler! 'js2-mode #'+javascript/open-repl) - (after! projectile - (add-to-list 'projectile-project-root-files "package.json") - (add-to-list 'projectile-globally-ignored-directories "node_modules")) - (map! :map js2-mode-map :localleader "S" #'+javascript/skewer-this-buffer)) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index 3d9635125..b10b9a0ed 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -12,6 +12,14 @@ "CSS" "HTML" "Bourbon" "Compass" ["Sass" (memq major-mode '(scss-mode sass-mode))])) +(after! projectile + (pushnew! projectile-project-root-files + '("css" "scss" "sass" "less" "styl") + '("scss" "css") + '("sass" "css") + '("less" "css") + '("styl" "css"))) + ;; ;; Major modes From f9b6f6746fac8dc12b87ec6b0db3f23b632bb4d6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 23:02:50 -0400 Subject: [PATCH 4158/4235] General, minor refactor/reformatting --- core/core-editor.el | 3 +-- core/core-modules.el | 2 -- core/core-projects.el | 27 ++++++++++++++------------- modules/completion/ivy/config.el | 10 +++++----- modules/lang/ruby/config.el | 3 ++- modules/tools/lsp/README.org | 6 +++--- 6 files changed, 25 insertions(+), 26 deletions(-) diff --git a/core/core-editor.el b/core/core-editor.el index c7ef92c04..3a5da8ef7 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -53,7 +53,6 @@ detected.") (setq-hook! '(eshell-mode-hook term-mode-hook) hscroll-margin 0) (defun doom*optimize-literal-mode-for-large-files (buffer) - "TODO" (with-current-buffer buffer (when find-file-literally (setq buffer-read-only t) @@ -233,7 +232,7 @@ savehist file." `(("." . ,(concat doom-cache-dir "undo-tree-hist/")))) (global-undo-tree-mode +1) - ;; compress undo history with xz + ;; compress undo history with xz/gzip (and (fset 'doom*undo-tree-make-history-save-file-name (cond ((executable-find "zstd") (lambda (file) (concat file ".zst"))) ((executable-find "gzip") (lambda (file) (concat file ".gz"))))) diff --git a/core/core-modules.el b/core/core-modules.el index 5cd92540c..140be24f7 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -59,11 +59,9 @@ session of Dooming. Will noop if used more than once, unless FORCE-P is non-nil." (when (or force-p (not doom-init-modules-p)) (setq doom-init-modules-p t) - (load! "init" doom-private-dir t) (unless doom-modules (setq doom-modules (make-hash-table :test 'equal))) - (maphash (lambda (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) diff --git a/core/core-projects.el b/core/core-projects.el index 7734ee700..e8a71725b 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -49,21 +49,22 @@ Emacs.") "Purge projectile cache entries that: a) have too many files (see `doom-projectile-cache-limit'), -b) represent blacklised directories that are too big, change too often or are +b) represent blacklisted directories that are too big, change too often or are private. (see `doom-projectile-cache-blacklist'), c) are not valid projectile projects." - (cl-loop with blacklist = (mapcar #'file-truename doom-projectile-cache-blacklist) - for proot in (hash-table-keys projectile-projects-cache) - for len = (length (gethash proot projectile-projects-cache)) - if (or (>= len doom-projectile-cache-limit) - (member (substring proot 0 -1) blacklist) - (and doom-projectile-cache-purge-non-projects - (not (doom-project-p proot)))) - do (doom-log "Removed %S from projectile cache" proot) - and do (remhash proot projectile-projects-cache) - and do (remhash proot projectile-projects-cache-time) - and do (remhash proot projectile-project-type-cache)) - (projectile-serialize-cache)) + (when (bound-and-true-p projectile-projects-cache) + (cl-loop with blacklist = (mapcar #'file-truename doom-projectile-cache-blacklist) + for proot in (hash-table-keys projectile-projects-cache) + for len = (length (gethash proot projectile-projects-cache)) + if (or (>= len doom-projectile-cache-limit) + (member (substring proot 0 -1) blacklist) + (and doom-projectile-cache-purge-non-projects + (not (doom-project-p proot)))) + do (doom-log "Removed %S from projectile cache" proot) + and do (remhash proot projectile-projects-cache) + and do (remhash proot projectile-projects-cache-time) + and do (remhash proot projectile-project-type-cache)) + (projectile-serialize-cache))) (add-hook 'kill-emacs-hook #'doom|cleanup-project-cache) ;; It breaks projectile's project root resolution if HOME is a project (e.g. diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index ded6ab898..fafaf372e 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -68,11 +68,11 @@ immediately runs it on the current candidate (ending the ivy session)." (after! yasnippet (add-to-list 'yas-prompt-functions #'+ivy-yas-prompt nil #'eq)) - (map! :map ivy-mode-map - [remap switch-to-buffer] #'+ivy/switch-buffer - [remap switch-to-buffer-other-window] #'+ivy/switch-buffer-other-window - [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer - [remap imenu-anywhere] #'ivy-imenu-anywhere) + (define-key! ivy-mode-map + [remap switch-to-buffer] #'+ivy/switch-buffer + [remap switch-to-buffer-other-window] #'+ivy/switch-buffer-other-window + [remap persp-switch-to-buffer] #'+ivy/switch-workspace-buffer + [remap imenu-anywhere] #'ivy-imenu-anywhere) (ivy-mode +1) diff --git a/modules/lang/ruby/config.el b/modules/lang/ruby/config.el index 0bc4b7d20..b2cba8e06 100644 --- a/modules/lang/ruby/config.el +++ b/modules/lang/ruby/config.el @@ -8,7 +8,8 @@ :mode ("\\.\\(?:rb\\|rake\\|rabl\\|ru\\|builder\\|gemspec\\|jbuilder\\|thor\\)\\'" . +ruby|init) :mode ("/\\(?:Berks\\|Cap\\|Gem\\|Guard\\|Pod\\|Puppet\\|Rake\\|Thor\\|Vagrant\\)file\\'" . +ruby|init) :preface - (after! ruby-mode (require 'enh-ruby-mode)) + (after! ruby-mode + (require 'enh-ruby-mode)) (defun +ruby|init () "Enable `enh-ruby-mode' if ruby is available, otherwise `ruby-mode'." (if (executable-find "ruby") diff --git a/modules/tools/lsp/README.org b/modules/tools/lsp/README.org index a94b4af7a..b7a30aac3 100644 --- a/modules/tools/lsp/README.org +++ b/modules/tools/lsp/README.org @@ -27,7 +27,7 @@ To get LSP working, you'll need two things: support, you'll have to configure your own (described in the Configuration section). -As of this writing, these Doom modules possess LSP support: +As of this writing, this is the state of LSP support in Doom Emacs: | Module | Major modes | Default language server | |------------------+---------------------------------------------------------+---------------------------------------------------------------| @@ -53,8 +53,8 @@ This module provides no flags. + [[https://github.com/tigersoldier/company-lsp][company-lsp]]* * Prerequisites -This module has no direct prerequisites, but to get LSP working, you'll need to -install language servers. +This module has no direct prerequisites, but major-modes require you to install +language servers. You'll find a table that lists available language servers and how to install them [[https://github.com/emacs-lsp/lsp-mode#supported-languages][in the lsp-mode project README]]. The documentation of the module for your From 6cf6825a4dd5a6591bb5e4f3ec01eec5383afad4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 23:07:29 -0400 Subject: [PATCH 4159/4235] lang/web: fix typo Pushing to the wrong variable! --- modules/lang/web/+css.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/web/+css.el b/modules/lang/web/+css.el index b10b9a0ed..ee987c085 100644 --- a/modules/lang/web/+css.el +++ b/modules/lang/web/+css.el @@ -13,7 +13,7 @@ ["Sass" (memq major-mode '(scss-mode sass-mode))])) (after! projectile - (pushnew! projectile-project-root-files + (pushnew! projectile-other-file-alist '("css" "scss" "sass" "less" "styl") '("scss" "css") '("sass" "css") From d2afd6928f0aaa5d1796f9dad1349105f5c59364 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 8 Apr 2019 23:15:22 -0400 Subject: [PATCH 4160/4235] ui/doom-dashboard: fix +doom-dashboard-p test --- modules/ui/doom-dashboard/test/test-doom-dashboard.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/ui/doom-dashboard/test/test-doom-dashboard.el b/modules/ui/doom-dashboard/test/test-doom-dashboard.el index 507c6c93a..a00d7709e 100644 --- a/modules/ui/doom-dashboard/test/test-doom-dashboard.el +++ b/modules/ui/doom-dashboard/test/test-doom-dashboard.el @@ -7,7 +7,9 @@ (describe "ui/doom-dashboard" :var (default-directory projectile-enable-caching) - (before-all (setq projectile-enable-caching nil)) + (before-all + (setq projectile-enable-caching nil + doom-fallback-buffer-name +doom-dashboard-name)) (before-each (projectile-mode +1)) (after-each (projectile-mode -1)) From 98e5ddc1e11012286d9ad6d619f364fb8bf31001 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 00:35:03 -0400 Subject: [PATCH 4161/4235] feature/evil: correct text objects in README --- modules/feature/evil/README.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index a39ad4af9..3f2f51ce6 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -91,10 +91,10 @@ For posterity, here are the built-in ones: And these are text objects added by this module: ++ =a= C-style fucntion arguments (provided by ~evil-args~) + =B= any block delimited by braces, parentheses or backets (provided by ~evil-textobj-anyblock~) -+ =a= C-style fucntion arguments (provided by ~evil-args~) -+ =i I J= By indentation (I includes on line above and J includes one line ++ =i j k= By indentation (=k= includes on line above and =j= includes one line below) (provided by ~evil-indent-plus~) + =x= XML attributes (provided by ~exato~) From d3a12a3914956e83040d50e52fa2ff5ee57081bd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 03:13:18 -0400 Subject: [PATCH 4162/4235] Refactor projects api Improves correctness of projectile project state. Namely, prevents projectile-project-root from poisoning the return value of doom-project-root or doom-project-p, which may be causing an elusive bug where doom-project-find-file is searching the wrong directory. --- core/autoload/projects.el | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index 74c872a30..e8ee56312 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -13,6 +13,7 @@ you want to interactive with a project other than the one you're in." `(let ((projectile-project-root-cache (make-hash-table :test 'equal)) projectile-project-name + projectile-project-root projectile-require-project-root) ,@body)) @@ -55,24 +56,33 @@ they are absolute." ;; Library ;;;###autoload -(defalias 'doom-project-p #'projectile-project-p) +(defun doom-project-p (&optional dir) + "Return t if DIR (defaults to `default-directory') is a valid project." + (and (doom-project-root dir) + t)) ;;;###autoload -(defalias 'doom-project-root #'projectile-project-root) +(defun doom-project-root (&optional dir) + "Return the project root of DIR (defaults to `default-directory'). +Returns nil if not in a project." + (let ((projectile-project-root (unless dir projectile-project-root)) + projectile-require-project-root) + (projectile-project-root dir))) ;;;###autoload (defun doom-project-name (&optional dir) - "Return the name of the current project." - (let ((project-root (or (projectile-project-root dir) - (if dir (expand-file-name dir))))) - (if project-root - (funcall projectile-project-name-function project-root) - "-"))) + "Return the name of the current project. + +Returns '-' if not in a valid project." + (if-let* ((project-root (or (doom-project-root dir) + (if dir (expand-file-name dir))))) + (funcall projectile-project-name-function project-root) + "-")) ;;;###autoload (defun doom-project-expand (name &optional dir) "Expand NAME to project root." - (expand-file-name name (projectile-project-root dir))) + (expand-file-name name (doom-project-root dir))) ;;;###autoload (defun doom-project-find-file (dir) @@ -82,10 +92,10 @@ Will resolve to the nearest project root above DIR. If no project can be found, the search will be rooted from DIR." (unless (file-directory-p dir) (error "Directory %S does not exist" dir)) - (let* ((default-directory (file-truename (expand-file-name dir))) - (projectile-project-root - (or (projectile-project-root) - default-directory))) + (let ((default-directory (file-truename (expand-file-name dir))) + (projectile-project-root + (or (doom-project-root dir) + default-directory))) (call-interactively ;; Intentionally avoid `helm-projectile-find-file', because it runs ;; asynchronously, and thus doesn't see the lexical `default-directory' From defd60b24b46a8e7972fc4ee3b18942b14d56ac5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 03:31:05 -0400 Subject: [PATCH 4163/4235] Fix `doom quickstart` not installing packages If the user had no ~/.doom.d/init.el to begin with, and never reads it after it's been created (by `doom quickstart`), then Doom can't possibly know what modules to install packages for, therefore no packages get installed! --- core/cli/quickstart.el | 4 ++++ core/core-modules.el | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/core/cli/quickstart.el b/core/cli/quickstart.el index cc7833a15..d67795fd4 100644 --- a/core/cli/quickstart.el +++ b/core/cli/quickstart.el @@ -59,6 +59,10 @@ packages and regenerates the autoloads file." (funcall fn)) (print! (green "Done!"))))))) + ;; In case no init.el was present the first time `doom-initialize-modules' was + ;; called in core.el (e.g. on first install) + (doom-initialize-modules) + ;; Ask if Emacs.app should be patched (if (member "--no-env" args) (print! (yellow "Not generating envvars file, as requested")) diff --git a/core/core-modules.el b/core/core-modules.el index 140be24f7..f2185c66d 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -57,11 +57,10 @@ before the user's private module.") "Loads the init.el in `doom-private-dir' and sets up hooks for a healthy session of Dooming. Will noop if used more than once, unless FORCE-P is non-nil." - (when (or force-p (not doom-init-modules-p)) + (when (and (or force-p + (not doom-init-modules-p)) + (load! "init" doom-private-dir t)) (setq doom-init-modules-p t) - (load! "init" doom-private-dir t) - (unless doom-modules - (setq doom-modules (make-hash-table :test 'equal))) (maphash (lambda (key plist) (let ((doom--current-module key) (doom--current-flags (plist-get plist :flags))) From 31eb845f6b4a13ca054909c8d225da9ea3df711c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 03:43:13 -0400 Subject: [PATCH 4164/4235] Reset more state on doom/module initialization Makes `doom/reload` a little more reliable and the side effects of `doom-initialize`/`doom-initialize-modules` a little more deterministic. --- core/autoload/config.el | 4 ++-- core/core-modules.el | 1 + core/core.el | 22 +++++++++++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/autoload/config.el b/core/autoload/config.el index 2e00de8ff..2c61d176e 100644 --- a/core/autoload/config.el +++ b/core/autoload/config.el @@ -33,11 +33,11 @@ Runs `doom-reload-hook' afterwards." (when (getenv "DOOMENV") (doom-reload-env-file 'force)) (doom-reload-autoloads force-p) - (setq load-path doom-site-load-path) (let (doom-init-p) (doom-initialize)) (with-demoted-errors "PRIVATE CONFIG ERROR: %s" - (doom-initialize-modules 'force)) + (let (doom-init-modules-p) + (doom-initialize-modules))) (when (bound-and-true-p doom-packages) (doom/reload-packages)) (run-hook-wrapped 'doom-reload-hook #'doom-try-run-hook)) diff --git a/core/core-modules.el b/core/core-modules.el index f2185c66d..75d6ed623 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -59,6 +59,7 @@ session of Dooming. Will noop if used more than once, unless FORCE-P is non-nil." (when (and (or force-p (not doom-init-modules-p)) + (not (setq doom-modules nil)) (load! "init" doom-private-dir t)) (setq doom-init-modules-p t) (maphash (lambda (key plist) diff --git a/core/core.el b/core/core.el index 0dc7a8f4a..e9a797283 100644 --- a/core/core.el +++ b/core/core.el @@ -98,11 +98,21 @@ MacOS users).") "If non-nil, the running version of Emacs is different from the first time Doom was setup, which can cause problems.") -(defvar doom-site-load-path load-path - "The starting `load-path', before it is altered by `doom-initialize'.") +(defvar doom-site-load-path (cons doom-core-dir load-path) + "The initial value of `load-path', before it was altered by +`doom-initialize'.") (defvar doom-site-process-environment process-environment - "The starting `process-environment', before it is altered by `doom-initialize'.") + "The initial value of `process-environment', before it was altered by +`doom-initialize'.") + +(defvar doom-site-exec-path exec-path + "The initial value of `exec-path', before it was altered by +`doom-initialize'.") + +(defvar doom-site-shell-file-name shell-file-name + "The initial value of `shell-file-name', before it was altered by +`doom-initialize'.") (defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el")) (defvar doom--last-emacs-version nil) @@ -431,6 +441,12 @@ to least)." (when (or force-p (not doom-init-p)) (setq doom-init-p t) ; Prevent infinite recursion + ;; Reset as much state as possible + (setq exec-path doom-site-exec-path + load-path doom-site-load-path + process-environment doom-site-process-environment + shell-file-name doom-site-shell-file-name) + ;; `doom-autoload-file' tells Emacs where to load all its autoloaded ;; functions from. This includes everything in core/autoload/*.el and all ;; the autoload files in your enabled modules. From 2c7f91769161faa49f0e0a1aa4bdf15e23f0fae4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 14:35:11 -0400 Subject: [PATCH 4165/4235] Fix #1315: blank modeline on `doom/reload` Default mode-line-format shouldn't be tampered with except at startup. --- modules/ui/modeline/config.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index 77680164e..e66bdeebd 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -5,8 +5,9 @@ (def-package! doom-modeline :hook (after-init . doom-modeline-mode) :init - ;; prevent flash of unstyled modeline at startup - (setq-default mode-line-format nil) + (unless after-init-time + ;; prevent flash of unstyled modeline at startup + (setq-default mode-line-format nil)) ;; We display project info in the modeline ourselves (setq projectile-dynamic-mode-line nil) ;; Set these early so they don't trigger variable watchers From ba23b63f5c4dded886b346d5d502f6dd26435d49 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 21:20:08 -0400 Subject: [PATCH 4166/4235] Fix +popup/raise for consecutive popups --- modules/ui/popup/autoload/popup.el | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 5529a4ae1..6105731b9 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -400,10 +400,11 @@ the message buffer in a popup window." (unless (+popup-window-p window) (user-error "Cannot raise a non-popup window")) (let ((buffer (current-buffer)) + (+popup--inhibit-transient t) +popup--remember-last) - (set-window-parameter window 'ttl nil) (+popup/close window 'force) - (display-buffer-pop-up-window buffer nil))) + (let (display-buffer-alist) + (pop-to-buffer buffer)))) ;;;###autoload (defun +popup/diagnose () From 138248ed03a0c4cfea5d4f8f9c2e5949f2054d95 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 9 Apr 2019 21:55:46 -0400 Subject: [PATCH 4167/4235] Don't auto-kill compilation log buffers #1316 --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index f3f257ddb..8861be67f 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -135,7 +135,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." ("^\\*Completions" :slot -1 :vslot -2 :ttl 0) ("^\\*Compil\\(?:ation\\|e-Log\\)" - :vslot -2 :size 0.3 :ttl 0 :quit t) + :vslot -2 :size 0.3 :ttl nil :quit t) ("^\\*\\(?:scratch\\|Messages\\)" :autosave t :ttl nil) ("^\\*Man " From 3da6c23d75cefec22751dc036c1641cabf60e5c5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 18:09:32 -0400 Subject: [PATCH 4168/4235] lang/org: restore org-shifttab on S-TAB For evil users --- modules/lang/org/config.el | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 18c1063b7..32def5a8b 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -446,8 +446,6 @@ between the two." (:when IS-MAC :ni [s-return] (λ! (+org/insert-item 'below)) :ni [s-S-return] (λ! (+org/insert-item 'above))) - ;; dedent with shift-tab in insert mode - :i [backtab] #'+org/dedent ;; navigate table cells (from insert-mode) :i "C-l" (general-predicate-dispatch 'org-end-of-line (org-at-table-p) 'org-table-next-field) From 653161fe2eb9964e77185b3b501c8556cdb651e5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 18:47:21 -0400 Subject: [PATCH 4169/4235] lang/org: refactor org config load order - No longer use org-load-hook; it was unnecessary and there were corner cases where org would get loaded before hooks were added to it. - Update comments - Remove config that was redundant with org's defaults (wrt org-file-apps) - Perform persp-mode check before using persp-mode API in +org|exclude-agenda-buffers-from-workspace advice. - Update outdated smartparens config and move it out of org-mode-hook (only needs to be run once, not everytime org-mode is enabled) - Autoload mode hooks --- modules/lang/org/+babel.el | 3 + modules/lang/org/autoload/org.el | 37 +++++- modules/lang/org/config.el | 212 ++++++++++++------------------- 3 files changed, 117 insertions(+), 135 deletions(-) diff --git a/modules/lang/org/+babel.el b/modules/lang/org/+babel.el index 1495a063f..14fa91882 100644 --- a/modules/lang/org/+babel.el +++ b/modules/lang/org/+babel.el @@ -28,6 +28,9 @@ at the first function to return non-nil.") org-src-window-setup 'current-window org-confirm-babel-evaluate nil) ; you don't need my permission +;; Use major-mode native TAB indentation in SRC blocks +(advice-add #'org-return-indent :after #'+org*fix-newline-and-indent-in-src-blocks) + (defun +org*babel-lazy-load-library (info) "Load babel libraries lazily when babel blocks are executed." (let* ((lang (nth 0 info)) diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 214483465..e6b74a67b 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -34,7 +34,7 @@ current file). Only scans first 2048 bytes of the document." ;; -;; Modes +;;; Modes ;;;###autoload (define-minor-mode +org-pretty-mode @@ -50,7 +50,7 @@ current file). Only scans first 2048 bytes of the document." ;; -;; Commands +;;; Commands ;;;###autoload (defun +org/dwim-at-point () @@ -334,7 +334,7 @@ another level of headings on each invocation." ;; -;; Hooks +;;; Hooks ;;;###autoload (defun +org|delete-backward-char-and-realign-table-maybe () @@ -440,9 +440,38 @@ with `org-cycle')." (org-remove-occur-highlights) t)) +;;;###autoload +(defun +org|unfold-to-2nd-level-or-point () + "My version of the 'overview' #+STARTUP option: expand first-level headings. +Expands the first level, but no further. If point was left somewhere deeper, +unfold to point on startup." + (unless org-agenda-inhibit-startup + (when (eq org-startup-folded t) + (outline-hide-sublevels 2)) + (when (outline-invisible-p) + (ignore-errors + (save-excursion + (outline-previous-visible-heading 1) + (org-show-subtree)))))) + +;;;###autoload +(defun +org|enable-auto-reformat-tables () + "Realign tables & update formulas when exiting insert mode (`evil-mode')." + (when (featurep 'evil) + (add-hook 'evil-insert-state-exit-hook #'+org|realign-table-maybe nil t) + (add-hook 'evil-replace-state-exit-hook #'+org|realign-table-maybe nil t) + (advice-add #'evil-replace :after #'+org*realign-table-maybe))) + +;;;###autoload +(defun +org|enable-auto-update-cookies () + "Update statistics cookies when saving or exiting insert mode (`evil-mode')." + (when (featurep 'evil) + (add-hook 'evil-insert-state-exit-hook #'+org|update-cookies nil t)) + (add-hook 'before-save-hook #'+org|update-cookies nil t)) + ;; -;; Advice +;;; Advice ;;;###autoload (defun +org*fix-newline-and-indent-in-src-blocks () diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 32def5a8b..cfb8050d8 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -15,48 +15,6 @@ )) -;; -;;; Bootstrap - -(def-package! org - :defer-incrementally - (calendar find-func format-spec org-macs org-compat org-faces org-entities - org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda - org-capture) - :init - (add-hook! 'org-load-hook - #'(+org|setup-ui - +org|setup-popup-rules - +org|setup-agenda - +org|setup-keybinds - +org|setup-hacks - +org|setup-pretty-code - +org|setup-custom-links)) - - (add-hook! 'org-mode-hook - #'(org-bullets-mode ; "prettier" bullets - org-indent-mode ; margin-based indentation - toc-org-enable ; auto-table of contents - auto-fill-mode ; line wrapping - ;; `show-paren-mode' causes flickering with indentation margins made by - ;; `org-indent-mode', so we simply turn off show-paren-mode altogether." - doom|disable-show-paren-mode - - +org|enable-auto-reformat-tables - +org|enable-auto-update-cookies - +org|smartparens-compatibility-config - +org|unfold-to-2nd-level-or-point)) - - :config - ;; Sub-modules - (if (featurep! +attach) (load! "+attach")) - (if (featurep! +babel) (load! "+babel")) - (if (featurep! +capture) (load! "+capture")) - (if (featurep! +export) (load! "+export")) - (if (featurep! +present) (load! "+present")) - (if (featurep! +protocol) (load! "+protocol"))) - - ;; ;;; Packages @@ -115,55 +73,6 @@ (add-hook 'kill-emacs-hook #'org-clock-save)) -;; -;;; `org-mode' hooks - -(defun +org|unfold-to-2nd-level-or-point () - "My version of the 'overview' #+STARTUP option: expand first-level headings. -Expands the first level, but no further. If point was left somewhere deeper, -unfold to point on startup." - (unless org-agenda-inhibit-startup - (when (eq org-startup-folded t) - (outline-hide-sublevels 2)) - (when (outline-invisible-p) - (ignore-errors - (save-excursion - (outline-previous-visible-heading 1) - (org-show-subtree)))))) - -(defun +org|smartparens-compatibility-config () - "Instruct `smartparens' not to impose itself in org-mode." - (after! smartparens - (defun +org-sp-point-in-checkbox-p (_id action _context) - (and (eq action 'insert) - (sp--looking-at-p "\\s-*]"))) - (defun +org-sp-point-at-bol-p (_id action _context) - (and (eq action 'insert) - (eq (char-before) ?*) - (sp--looking-back-p "^\\**" (line-beginning-position)))) - - ;; make delimiter auto-closing a little more conservative - (sp-with-modes 'org-mode - (sp-local-pair "*" nil :unless '(:add sp-point-before-word-p +org-sp-point-at-bol-p)) - (sp-local-pair "_" nil :unless '(:add sp-point-before-word-p)) - (sp-local-pair "/" nil :unless '(:add sp-point-before-word-p +org-sp-point-in-checkbox-p)) - (sp-local-pair "~" nil :unless '(:add sp-point-before-word-p)) - (sp-local-pair "=" nil :unless '(:add sp-point-before-word-p))))) - -(defun +org|enable-auto-reformat-tables () - "Realign tables & update formulas when exiting insert mode (`evil-mode')." - (when (featurep 'evil) - (add-hook 'evil-insert-state-exit-hook #'+org|realign-table-maybe nil t) - (add-hook 'evil-replace-state-exit-hook #'+org|realign-table-maybe nil t) - (advice-add #'evil-replace :after #'+org*realign-table-maybe))) - -(defun +org|enable-auto-update-cookies () - "Update statistics cookies when saving or exiting insert mode (`evil-mode')." - (when (featurep 'evil) - (add-hook 'evil-insert-state-exit-hook #'+org|update-cookies nil t)) - (add-hook 'before-save-hook #'+org|update-cookies nil t)) - - ;; ;;; `org-load' hooks @@ -182,25 +91,6 @@ unfold to point on startup." org-agenda-start-day "-3d")) -(defun +org|setup-popup-rules () - "Defines popup rules for org-mode (does nothing if :ui popup is disabled)." - (set-popup-rules! - '(("^\\*Org Links" :slot -1 :vslot -1 :size 2 :ttl 0) - ("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Export Dispatcher\\|Select\\)\\)" - :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) - ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) - ("^\\*Org Src" :size 0.3 :quit nil :select t :autosave t :ttl nil) - ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t :autosave t)))) - - -(defun +org|setup-pretty-code () - "Setup the default pretty symbols for" - (set-pretty-symbols! 'org-mode - :name "#+NAME:" - :src_block "#+BEGIN_SRC" - :src_block_end "#+END_SRC")) - - (defun +org|setup-custom-links () "Set up custom org links." (setq org-link-abbrev-alist @@ -417,12 +307,11 @@ between the two." (defun +org|setup-evil-keybinds (&rest args) - ;; In case this hook is used in an advice on `evil-org-set-key-theme', this - ;; prevents recursive requires. - (unless args (require 'evil-org)) + (unless args ; lookout for recursive requires + (require 'evil-org)) + ;; Only fold the current tree, rather than recursively (add-hook 'org-tab-first-hook #'+org|cycle-only-current-subtree t) - (advice-add #'org-return-indent :after #'+org*fix-newline-and-indent-in-src-blocks) ;; Fix o/O creating new list items in the middle of nested plain lists. Only ;; has an effect when `evil-org-special-o/O' has `item' in it (not the @@ -455,7 +344,7 @@ between the two." (org-at-table-p) '+org/table-previous-row) :i "C-j" (general-predicate-dispatch 'org-down-element (org-at-table-p) 'org-table-next-row) - ;; expand tables (insert columns/rows) + ;; expanding tables (prepend/append columns/rows) :ni "C-S-l" (general-predicate-dispatch 'org-shiftmetaright (org-at-table-p) 'org-table-insert-column) :ni "C-S-h" (general-predicate-dispatch 'org-shiftmetaleft @@ -517,6 +406,8 @@ between the two." "Getting org to behave." ;; Don't open separate windows (setf (alist-get 'file org-link-frame-setup) #'find-file) + ;; Open directory links in Emacs + (add-to-list 'org-file-apps '(directory . emacs)) (defun +org|delayed-recenter () "`recenter', but after a tiny delay. Necessary to prevent certain race @@ -524,8 +415,8 @@ conditions where a window's buffer hasn't changed at the time this hook is run." (run-at-time 0.1 nil #'recenter)) (add-hook 'org-follow-link-hook #'+org|delayed-recenter) - ;; Fix variable height org-level-N faces in the eldoc string - (defun +org*format-outline-path (orig-fn path &optional width prefix separator) + ;; Fix variable height text (e.g. org headings) in the eldoc string + (defun +org*strip-properties-from-outline (orig-fn path &optional width prefix separator) (let ((result (funcall orig-fn path width prefix separator)) (separator (or separator "/"))) (string-join @@ -535,19 +426,13 @@ conditions where a window's buffer hasn't changed at the time this hook is run." for face = (nth (% n org-n-level-faces) org-level-faces) collect (org-add-props part nil 'face `(:foreground ,(face-foreground face nil t) :weight bold))) separator))) - (advice-add #'org-format-outline-path :around #'+org*format-outline-path) - - (setq org-file-apps - `(("pdf" . default) - ("\\.x?html?\\'" . default) - ("/docs/" . emacs) - (auto-mode . emacs) - (directory . emacs) - (t . ,(cond (IS-MAC "open -R \"%s\"") - (IS-LINUX "xdg-open \"%s\""))))) + (advice-add #'org-format-outline-path :around #'+org*strip-properties-from-outline) + ;; Prevent from temporarily-opened agenda buffers from being associated with + ;; the current workspace, or being added to recentf. They haven't been opened + ;; interactively, so shouldn't be treated as if they were. (defun +org|exclude-agenda-buffers-from-workspace () - (when org-agenda-new-buffers + (when (and org-agenda-new-buffers (bound-and-true-p persp-mode)) (let (persp-autokill-buffer-on-remove) (persp-remove-buffer org-agenda-new-buffers (get-current-persp) @@ -562,7 +447,72 @@ conditions where a window's buffer hasn't changed at the time this hook is run." ;; -;;; In case org has already been loaded (or you're running `doom/reload') +;;; Bootstrap -(when (featurep 'org) - (run-hooks 'org-load-hook)) +(def-package! org + :defer-incrementally + (calendar find-func format-spec org-macs org-compat org-faces org-entities + org-list org-pcomplete org-src org-footnote org-macro ob org org-agenda + org-capture) + :init + (add-hook! 'org-mode-hook + #'(org-bullets-mode ; "prettier" bullets + org-indent-mode ; margin-based indentation + toc-org-enable ; auto-table of contents + auto-fill-mode ; line wrapping + ;; `show-paren-mode' causes flickering with indentation margins made by + ;; `org-indent-mode', so we simply turn off show-paren-mode altogether." + doom|disable-show-paren-mode + + +org|enable-auto-reformat-tables + +org|enable-auto-update-cookies + +org|unfold-to-2nd-level-or-point)) + + :config + (+org|setup-ui) + (+org|setup-agenda) + (+org|setup-keybinds) + (+org|setup-hacks) + (+org|setup-custom-links) + + + ;; Cross-module configuration + (set-popup-rules! + '(("^\\*Org Links" :slot -1 :vslot -1 :size 2 :ttl 0) + ("^\\*\\(?:Agenda Com\\|Calendar\\|Org \\(?:Export Dispatcher\\|Select\\)\\)" + :slot -1 :vslot -1 :size #'+popup-shrink-to-fit :ttl 0) + ("^\\*Org Agenda" :size 0.35 :select t :ttl nil) + ("^\\*Org Src" :size 0.3 :quit nil :select t :autosave t :ttl nil) + ("^CAPTURE.*\\.org$" :size 0.2 :quit nil :select t :autosave t))) + + (set-pretty-symbols! 'org-mode + :name "#+NAME:" + :src_block "#+BEGIN_SRC" + :src_block_end "#+END_SRC") + + (after! smartparens + (defun +org-sp-point-in-checkbox-p (_id action _context) + (and (eq action 'insert) + (sp--looking-at-p "\\s-*]"))) + + (defun +org-sp-point-at-bol-p (_id action _context) + (and (eq action 'insert) + (eq (char-before) ?*) + (sp--looking-back-p "^\\**" (line-beginning-position)))) + + ;; make delimiter auto-closing a little more conservative + (sp-with-modes 'org-mode + (sp-local-pair "*" "*" :unless '(:add sp-point-before-word-p +org-sp-point-at-bol-p)) + (sp-local-pair "_" "_" :unless '(:add sp-point-before-word-p)) + (sp-local-pair "/" "/" :unless '(:add sp-point-before-word-p +org-sp-point-in-checkbox-p)) + (sp-local-pair "~" "~" :unless '(:add sp-point-before-word-p)) + (sp-local-pair "=" "=" :unless '(:add sp-point-before-word-p)))) + + + ;; Sub-modules + (if (featurep! +attach) (load! "+attach")) + (if (featurep! +babel) (load! "+babel")) + (if (featurep! +capture) (load! "+capture")) + (if (featurep! +export) (load! "+export")) + (if (featurep! +present) (load! "+present")) + (if (featurep! +protocol) (load! "+protocol"))) From da34862e566365189a710e15aaa593fe2d941086 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 18:51:20 -0400 Subject: [PATCH 4170/4235] Fix TAB in magit-diff-mode --- modules/tools/magit/config.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/tools/magit/config.el b/modules/tools/magit/config.el index a939b770e..7ad1b5350 100644 --- a/modules/tools/magit/config.el +++ b/modules/tools/magit/config.el @@ -79,7 +79,10 @@ It is passed a user and repository name.") "zz" #'evil-scroll-line-to-center "%" #'magit-gitflow-popup) (define-key! 'normal - (magit-status-mode-map magit-stash-mode-map magit-revision-mode-map) + (magit-status-mode-map + magit-stash-mode-map + magit-revision-mode-map + magit-diff-mode-map) [tab] #'magit-section-toggle) (after! git-rebase (dolist (key '(("M-k" . "gk") ("M-j" . "gj"))) From 8e18b402ce916f595f24964682e19064175cb833 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 18:51:37 -0400 Subject: [PATCH 4171/4235] lang/rust: run cargo commands from Cargo.toml dir Instead of the current directory, which breaks file links in the compilation buffer. --- modules/lang/rust/autoload.el | 6 ++++++ modules/lang/rust/config.el | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/lang/rust/autoload.el b/modules/lang/rust/autoload.el index 71f98665e..b52ddae2b 100644 --- a/modules/lang/rust/autoload.el +++ b/modules/lang/rust/autoload.el @@ -6,3 +6,9 @@ (defun +rust-cargo-project-p () "Return t if this is a cargo project." (locate-dominating-file buffer-file-name "Cargo.toml")) + +;;;###autoload +(defun +rust-cargo-compile (command) + "TODO" + (let ((default-directory (+rust-cargo-project-p))) + (compile command))) diff --git a/modules/lang/rust/config.el b/modules/lang/rust/config.el index 502b0232e..1b8fceb9a 100644 --- a/modules/lang/rust/config.el +++ b/modules/lang/rust/config.el @@ -10,10 +10,10 @@ (map! :map rust-mode-map :localleader :prefix "b" - :desc "cargo build" "b" (λ! (compile "cargo build --color always")) - :desc "cargo check" "c" (λ! (compile "cargo check --color always")) - :desc "cargo run" "r" (λ! (compile "cargo run --color always")) - :desc "cargo test" "t" (λ! (compile "cargo test --color always")))) + :desc "cargo build" "b" (λ! (+rust-cargo-compile "cargo build --color always")) + :desc "cargo check" "c" (λ! (+rust-cargo-compile "cargo check --color always")) + :desc "cargo run" "r" (λ! (+rust-cargo-compile "cargo run --color always")) + :desc "cargo test" "t" (λ! (+rust-cargo-compile "cargo test --color always")))) (def-package! racer From 4aec51525b42a9c301e4617de40e07455c68eb83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 18:52:34 -0400 Subject: [PATCH 4172/4235] config/default: replace SPC c c with #'compile SPC p c exists for projectile-compile-project --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 2359576a8..2f4a7e8de 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -578,7 +578,7 @@ :desc "Bury buffer" "z" #'bury-buffer) (:prefix ("c" . "code") - :desc "Compile project" "c" #'projectile-compile-project + :desc "Compile" "c" #'compile :desc "Jump to definition" "d" #'+lookup/definition :desc "Jump to references" "D" #'+lookup/references :desc "Evaluate buffer/region" "e" #'+eval/buffer-or-region From 5e8687cd45875ffaed4dd5c4dc6b125e9a5b928b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 18:57:57 -0400 Subject: [PATCH 4173/4235] Add SPC * for project-searching symbol at point --- modules/config/default/+evil-bindings.el | 2 ++ modules/config/default/autoload/default.el | 24 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 2f4a7e8de..8232851d8 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -520,6 +520,8 @@ (cond ((featurep! :completion ivy) #'ivy-resume) ((featurep! :completion helm) #'helm-resume)) + :desc "Search for symbol in project" "*" #'+default/search-project-for-symbol-at-point + :desc "Find file in project" "SPC" #'projectile-find-file :desc "Blink cursor line" "DEL" #'+nav-flash/blink-cursor :desc "Jump to bookmark" "RET" #'bookmark-jump diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index dcdce7fb3..85cfb908b 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -235,8 +235,8 @@ If prefix ARG is set, prompt for a directory to search from." ;;;###autoload (defun +default/search-project (&optional arg) - "Conduct a text search in files under the project root. -If prefix ARG is set, prompt for a project to search from." + "Conduct a text search in the current project root. +If prefix ARG is set, prompt for a known project to search from." (interactive "P") (let ((default-directory (if arg @@ -249,3 +249,23 @@ If prefix ARG is set, prompt for a project to search from." (cond ((featurep! :completion ivy) #'+ivy/project-search) ((featurep! :completion helm) #'+helm/project-search) (#'rgrep))))) + +;;;###autoload +(defun +default/search-project-for-symbol-at-point (&optional arg symbol) + "Conduct a text search in the current project for symbol at point. +If prefix ARG is set, prompt for a known project to search from." + (interactive + (list current-prefix-arg + (thing-at-point 'symbol t))) + (let ((default-directory + (if arg + (if-let* ((projects (projectile-relevant-known-projects))) + (completing-read "Switch to project: " projects + nil t nil nil (doom-project-root)) + (user-error "There are no known projects")) + default-directory))) + (cond ((featurep! :completion ivy) + (+ivy/rg nil symbol)) + ((featurep! :completion helm) + (+helm/rg nil symbol)) + ((rgrep (regexp-opt symbol)))))) From 3ef2abfb22b4de967f00bd35715579ad88dcfefe Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 19:22:29 -0400 Subject: [PATCH 4174/4235] Improve ivy-switch-buffer transformer - Highlights remote/tramp files with ivy-remote face - Highlights non-file-visiting buffers with ivy-subdir face - Highlight modified buffers with ivy-modified-buffer face - Disable built-in ivy-switch-buffer transformer (redundant with our own transformer) --- modules/completion/ivy/autoload/ivy.el | 15 ++++++++++++--- modules/completion/ivy/config.el | 4 ++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 33cd6cd2e..055a64ea0 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -19,9 +19,18 @@ Buffers that are considered unreal (see `doom-real-buffer-p') are dimmed with `+ivy-buffer-unreal-face'." - (if (doom-real-buffer-p (get-buffer candidate)) - candidate - (propertize candidate 'face +ivy-buffer-unreal-face))) + (let ((b (get-buffer candidate))) + (cond ((ignore-errors + (file-remote-p + (buffer-local-value 'default-directory b))) + (ivy-append-face candidate 'ivy-remote)) + ((doom-unreal-buffer-p b) + (ivy-append-face candidate +ivy-buffer-unreal-face)) + ((not (buffer-file-name b)) + (ivy-append-face candidate 'ivy-subdir)) + ((buffer-modified-p b) + (ivy-append-face candidate 'ivy-modified-buffer)) + (candidate)))) ;;;###autoload (defun +ivy-rich-buffer-icon (candidate) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index fafaf372e..8fc54d88b 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -106,6 +106,10 @@ immediately runs it on the current candidate (ending the ivy session)." ((all-the-icons-icon-for-file (:width 2 :align right)) (ivy-rich-candidate))))))) + ;; Remove built-in coloring of buffer list; we do our own + (setq ivy-switch-buffer-faces-alist nil) + (ivy-set-display-transformer 'internal-complete-buffer nil) + ;; Highlight buffers differently based on whether they're in the same project ;; as the current project or not. (let* ((plist (plist-get ivy-rich-display-transformers-list 'ivy-switch-buffer)) From 500878c8826f850ff367b39f51587ad1bd8c82f6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 19:25:11 -0400 Subject: [PATCH 4175/4235] Enlargen command-log window slightly --- core/core-editor.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core-editor.el b/core/core-editor.el index 3a5da8ef7..e877da0d3 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -252,7 +252,8 @@ savehist file." :config (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode nil - command-log-mode-is-global t)) + command-log-mode-is-global t + command-log-mode-window-size 50)) ;; `helpful' --- a better *help* buffer From 3f751c117925c1cfd938f26d552619e474823e83 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 20:09:59 -0400 Subject: [PATCH 4176/4235] Correctly regexp-quote symbol on SPC * --- modules/config/default/autoload/default.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index 85cfb908b..d6a8a394b 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -265,7 +265,7 @@ If prefix ARG is set, prompt for a known project to search from." (user-error "There are no known projects")) default-directory))) (cond ((featurep! :completion ivy) - (+ivy/rg nil symbol)) + (+ivy/rg nil (rxt-quote-pcre symbol))) ((featurep! :completion helm) - (+helm/rg nil symbol)) - ((rgrep (regexp-opt symbol)))))) + (+helm/rg nil (rxt-quote-pcre symbol))) + ((rgrep (regexp-quote symbol)))))) From 3c01de887661ec597ea4bdf4747db73753442077 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 20:14:50 -0400 Subject: [PATCH 4177/4235] Fix #1320: generalize SPC * Was formerly using ripgrep, and only ripgrep. --- modules/completion/helm/autoload/helm.el | 10 ++++++---- modules/config/default/autoload/default.el | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 04cd60a1b..312820e53 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -178,7 +178,7 @@ order. return (intern (format format tool)))) ;;;###autoload -(defun +helm/project-search (&optional arg) +(defun +helm/project-search (&optional arg query) "Performs a project search from the project root. Uses the first available search backend from `+helm-project-search-engines'. If @@ -187,10 +187,11 @@ ones, in the search." (interactive "P") (funcall (or (+helm--get-command "+helm/%s") #'+helm/grep) - arg)) + arg + query)) ;;;###autoload -(defun +helm/project-search-from-cwd (&optional arg) +(defun +helm/project-search-from-cwd (&optional arg query) "Performs a project search recursively from the current directory. Uses the first available search backend from `+helm-project-search-engines'. If @@ -199,7 +200,8 @@ ones." (interactive "P") (funcall (or (+helm--get-command "+helm/%s-from-cwd") #'+helm/grep-from-cwd) - arg)) + arg + query)) ;; Relative to project root diff --git a/modules/config/default/autoload/default.el b/modules/config/default/autoload/default.el index d6a8a394b..f98f7ff7d 100644 --- a/modules/config/default/autoload/default.el +++ b/modules/config/default/autoload/default.el @@ -265,7 +265,7 @@ If prefix ARG is set, prompt for a known project to search from." (user-error "There are no known projects")) default-directory))) (cond ((featurep! :completion ivy) - (+ivy/rg nil (rxt-quote-pcre symbol))) + (+ivy/project-search nil (rxt-quote-pcre symbol))) ((featurep! :completion helm) - (+helm/rg nil (rxt-quote-pcre symbol))) + (+helm/project-search nil (rxt-quote-pcre symbol))) ((rgrep (regexp-quote symbol)))))) From 0c0aff60a1fead73070797307332f0c0b5861c90 Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 11 Apr 2019 10:16:10 +0300 Subject: [PATCH 4178/4235] [lang/kotlin] Use `warn!` macro in doctor.el --- modules/lang/kotlin/doctor.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/kotlin/doctor.el b/modules/lang/kotlin/doctor.el index 7dd70d076..63eabc017 100644 --- a/modules/lang/kotlin/doctor.el +++ b/modules/lang/kotlin/doctor.el @@ -1,4 +1,4 @@ ;;; lang/kotlin/doctor.el -*- lexical-binding: t; -*- (unless (executable-find "ktlint") - (warn "ktlint not found. flycheck-kotlin won't work.")) + (warn! "ktlint not found. flycheck-kotlin won't work.")) From 76fb819dfb8d838ec7796e87b332f19b23d7c70d Mon Sep 17 00:00:00 2001 From: Oleksii Filonenko Date: Thu, 11 Apr 2019 10:16:53 +0300 Subject: [PATCH 4179/4235] Rename non-interactive function `+kotlin-locate-gradlew-file` --- modules/lang/kotlin/autoload.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/lang/kotlin/autoload.el b/modules/lang/kotlin/autoload.el index a15620fed..2eee6cd90 100644 --- a/modules/lang/kotlin/autoload.el +++ b/modules/lang/kotlin/autoload.el @@ -1,7 +1,7 @@ ;;; lang/kotlin/autoload.el -*- lexical-binding: t; -*- ;;;autoload -(defun +kotlin/locate-gradlew-file () +(defun +kotlin-locate-gradlew-file () "Gradlew file location for this project." (locate-dominating-file buffer-file-name "gradlew")) @@ -9,7 +9,7 @@ (defun +kotlin/run-gradlew (command) "Run gradlew in this project." (interactive "sCommand: ") - (let ((default-directory (+kotlin/locate-gradlew-file)) + (let ((default-directory (+kotlin-locate-gradlew-file)) (compilation-read-command nil) (compile-command (format "sh gradlew %s" command))) (call-interactively #'compile))) From 83cba583a7a3730a7c2ba1f46236c8363b41eba3 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 10 Apr 2019 21:57:50 -0400 Subject: [PATCH 4180/4235] with-eval-after-load -> after! So :desc is ignored if which-key is disabled. --- core/core-keybinds.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index 62fc7a3a8..f35f6c1a4 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -108,7 +108,7 @@ If any hook returns non-nil, all hooks after it are ignored.") (macroexp-progn (append (nreverse forms) (when wkforms - `((with-eval-after-load 'which-key + `((after! which-key ,@(nreverse wkforms)))))))) (defmacro define-leader-key! (&rest args) From 4724d0a109dbb85136410f7d909c461aa53343fd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Apr 2019 15:15:05 -0400 Subject: [PATCH 4181/4235] Fix #1323: void-variable projectile-project-root --- core/autoload/projects.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index e8ee56312..b1d5a3ab2 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -1,5 +1,7 @@ ;;; core/autoload/projects.el -*- lexical-binding: t; -*- +(defvar projectile-project-root nil) + ;;;###autoload (autoload 'projectile-relevant-known-projects "projectile") From c1bc899e3459b2b2bfff612d51c8b06e6045983e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Apr 2019 15:22:24 -0400 Subject: [PATCH 4182/4235] config/default: add & change SPC p keybinds - Moved SPC p x to SPC p i (invalidate cache) - Add SPC x prefix for opening terminals/ielm at project root - Add SPC a and SPC d for adding/removing known projects - Add SPC f for finding a file in other projects - Add SPC b for switching project buffer (TODO improve ivy/helm support) - Add SPC k for killing project buffers --- modules/config/default/+evil-bindings.el | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8232851d8..e0a4e2ae1 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -725,12 +725,22 @@ :desc "Browse project" "." #'+default/browse-project :desc "Find file in project" "/" #'projectile-find-file :desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root - :desc "Compile project" "c" #'projectile-compile-project + :desc "Add new project" "a" #'projectile-add-known-project + :desc "Switch to project buffer" "b" #'projectile-switch-to-buffer + :desc "Compile in project" "c" #'projectile-compile-project + :desc "Remove known project" "d" #'projectile-remove-known-project + :desc "Find file in known project" "f" #'projectile-find-file-in-known-projects + :desc "Kill project buffers" "k" #'projectile-kill-buffers + :desc "Invalidate project cache" "i" #'projectile-invalidate-cache :desc "Find other file" "o" #'projectile-find-other-file :desc "Switch project" "p" #'projectile-switch-project - :desc "Recent project files" "r" #'projectile-recentf + :desc "Find recent project files" "r" #'projectile-recentf :desc "List project tasks" "t" #'+default/project-tasks - :desc "Invalidate cache" "x" #'projectile-invalidate-cache) + (:prefix ("x" . "terminal") + :desc "Open eshell in project" "e" #'projectile-run-eshell + :desc "Open ielm in project" "i" #'projectile-run-ielm + :desc "Open term in project" "t" #'projectile-run-term + :desc "Open shell in project" "s" #'projectile-run-shell)) (:prefix ("q" . "session") :desc "Quit Emacs" "q" #'evil-quit-all From 18a4f949c15a4578977a8f789997dff25aee1c5f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Apr 2019 19:20:20 -0400 Subject: [PATCH 4183/4235] feature/evil: update Ex commands listing in README --- modules/feature/evil/README.org | 67 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index 3f2f51ce6..87d671592 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -99,40 +99,39 @@ And these are text objects added by this module: + =x= XML attributes (provided by ~exato~) ** Custom Ex Commands -| Ex Command | Description | -|----------------------+--------------------------------------------------------------------------------------| -| ~:@~ | Apply macro on selected lines | -| ~:ag[!] REGEXP~ | Perform a project search with ag | -| ~:agcwd[!] REGEXP~ | Perform a project search with ag | -| ~:al[ign] REGEXP~ | Align text that matches REGEXP | -| ~:al[ign][!] REGEXP~ | Align text to the first match of REGEXP. If BANG, align all matches on each line | -| ~:cp[!] NEWPATH~ | Copy the current file to NEWPATH | -| ~:dash QUERY~ | Look up QUERY (or the symbol at point) in dash docsets | -| ~:dehtml [INPUT]~ | HTML decode selected text / inserts result if INPUT is given | -| ~:enhtml [INPUT]~ | HTML encode selected text / inserts result if INPUT is given | -| ~:grep[!]~ | Perform a project search with git-grep | -| ~:grepcwd[!]~ | Perform a project search with git-grep | -| ~:iedit REGEXP~ | Invoke iedit on all matches for REGEXP | -| ~:k[ill]all[!]~ | Kill all buffers (if BANG, affect buffer across workspaces) | -| ~:k[ill]b~ | Kill all buried buffers | -| ~:k[ill]m[!] REGEXP~ | Kill buffers whose name matches REGEXP (if BANG, affect buffers across workspaces) | -| ~:k[ill]o~ | Kill all other buffers besides the selected one | -| ~:k[ill]~ | Kill the current buffer | -| ~:lo[okup] QUERY~ | Look up QUERY on an online search engine | -| ~:mc REGEXP~ | Invoke multiple cursors on all matches for REGEXP | -| ~:mv[!] NEWPATH~ | Move the current file to NEWPATH | -| ~:na[rrow]~ | Narrow the buffer to the selection | -| ~:pad~ | Open a scratch pad for running code quickly | -| ~:pt[!]~ | Perform a project search with pt | -| ~:ptcwd[!]~ | Perform a project search with pt | -| ~:ral[ign] REGEXP~ | Right-align text that matches REGEXP | -| ~:repl~ | Open a REPL and/or copy the current selection to it | -| ~:retab~ | Convert indentation to the default within the selection | -| ~:rev[erse]~ | Reverse the selected lines | -| ~:rg[!]~ | Perform a project search with ripgrep | -| ~:rgcwd[!]~ | Perform a project search with rigprep | -| ~:rm[!] [PATH]~ | Delete the current buffer's file and buffer | -| ~:tcd[!]~ | Send =cd X= to tmux. X = the project root if BANG, X = ~default-directory~ otherwise | +| Ex Command | Description | +|-----------------------+--------------------------------------------------------------------------------------| +| ~:@~ | Apply macro on selected lines | +| ~:ag[!] REGEXP~ | Perform a project search with ag | +| ~:agcwd[!] REGEXP~ | Perform a project search with ag from the current directory | +| ~:al[ign][!] REGEXP~ | Align text to the first match of REGEXP. If BANG, align all matches on each line | +| ~:cp[!] NEWPATH~ | Copy the current file to NEWPATH | +| ~:dash QUERY~ | Look up QUERY (or the symbol at point) in dash docsets | +| ~:dehtml [INPUT]~ | HTML decode selected text / inserts result if INPUT is given | +| ~:enhtml [INPUT]~ | HTML encode selected text / inserts result if INPUT is given | +| ~:grep[!]~ | Perform a project search with git-grep | +| ~:grepcwd[!]~ | Perform a project search with git-grep from the current directory | +| ~:iedit REGEXP~ | Invoke iedit on all matches for REGEXP | +| ~:k[ill]all[!]~ | Kill all buffers (if BANG, affect buffer across workspaces) | +| ~:k[ill]b~ | Kill all buried buffers | +| ~:k[ill]m[!] REGEXP~ | Kill buffers whose name matches REGEXP (if BANG, affect buffers across workspaces) | +| ~:k[ill]o~ | Kill all other buffers besides the selected one | +| ~:k[ill]~ | Kill the current buffer | +| ~:lo[okup] QUERY~ | Look up QUERY on an online search engine | +| ~:mc REGEXP~ | Invoke multiple cursors on all matches for REGEXP | +| ~:mv[!] NEWPATH~ | Move the current file to NEWPATH | +| ~:na[rrow]~ | Narrow the buffer to the selection | +| ~:pad~ | Open a scratch pad for running code quickly | +| ~:pt[!]~ | Perform a project search with pt | +| ~:ptcwd[!]~ | Perform a project search with pt from the current directory | +| ~:ral[ign][!] REGEXP~ | Right-Align text that matches REGEXP. If BANG, align all matches on each line | +| ~:repl~ | Open a REPL and/or copy the current selection to it | +| ~:retab~ | Convert indentation to the default within the selection | +| ~:rev[erse]~ | Reverse the selected lines | +| ~:rg[!]~ | Perform a project search with ripgrep | +| ~:rgcwd[!]~ | Perform a project search with rigprep from the current directory | +| ~:rm[!] [PATH]~ | Delete the current buffer's file and buffer | +| ~:tcd[!]~ | Send =cd X= to tmux. X = the project root if BANG, X = ~default-directory~ otherwise | * Configuration ** Removing evil-mode From a1df75aa430dc861b8b6f5612e2d8bf87a872f9f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 11 Apr 2019 19:22:34 -0400 Subject: [PATCH 4184/4235] feature/evil: mention cl/cc in readme --- modules/feature/evil/README.org | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/feature/evil/README.org b/modules/feature/evil/README.org index 87d671592..0998398c0 100644 --- a/modules/feature/evil/README.org +++ b/modules/feature/evil/README.org @@ -173,3 +173,4 @@ To disable evil-snipe on s/S, you can either: 2. Or disable =evil-snipe= completely with ~(package! evil-snipe :disable t)~ added to =$DOOMDIR/packages.el=, but this will also disable incremental highlighting for the f/F/t/T motions keys. +3. Or use =cl= and =cc=, respectively; they do the same thing. From 94a2bc77ef8fea134f81852368c03623112a5c3e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Apr 2019 16:07:32 -0400 Subject: [PATCH 4185/4235] Unbind C-h in help-map It interferes with which-key help/paging for the SPC h prefix. --- modules/config/default/config.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/config/default/config.el b/modules/config/default/config.el index bbec88eba..47faefde4 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -189,6 +189,10 @@ "C-m" #'info-emacs-manual "C-v" #'doom/version + ;; Unbind `help-for-help'. Conflicts with which-key's help command for the + ;; h prefix. It's already on ? and F1 anyway. + "C-h" nil + ;; replacement keybinds ;; replaces `info-emacs-manual' b/c it's on C-m now "r" nil From b6611d215f369d2d4b85cb2500190bc719733078 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Apr 2019 13:36:56 -0400 Subject: [PATCH 4186/4235] Fix wrong-num-of-args error on SPC * Adds QUERY and DIRECTORY args to +{ivy,helm}/project-search --- modules/completion/helm/autoload/helm.el | 17 +++++++++-------- modules/completion/ivy/autoload/ivy.el | 19 +++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 312820e53..21a60525b 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -178,30 +178,31 @@ order. return (intern (format format tool)))) ;;;###autoload -(defun +helm/project-search (&optional arg query) +(defun +helm/project-search (&optional arg initial-query directory) "Performs a project search from the project root. Uses the first available search backend from `+helm-project-search-engines'. If -ALL-FILES-P (universal argument), include all files, even hidden or compressed -ones, in the search." +ARG (universal argument), include all files, even hidden or compressed ones, in +the search." (interactive "P") (funcall (or (+helm--get-command "+helm/%s") #'+helm/grep) arg - query)) + initial-query + directory)) ;;;###autoload -(defun +helm/project-search-from-cwd (&optional arg query) +(defun +helm/project-search-from-cwd (&optional arg initial-query directory) "Performs a project search recursively from the current directory. Uses the first available search backend from `+helm-project-search-engines'. If -ALL-FILES-P (universal argument), include all files, even hidden or compressed -ones." +ARG (universal argument), include all files, even hidden or compressed ones." (interactive "P") (funcall (or (+helm--get-command "+helm/%s-from-cwd") #'+helm/grep-from-cwd) arg - query)) + initial-query + directory)) ;; Relative to project root diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 055a64ea0..741bf7ae7 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -350,28 +350,31 @@ order. return (intern (format format tool)))) ;;;###autoload -(defun +ivy/project-search (&optional all-files-p) +(defun +ivy/project-search (&optional arg initial-query directory) "Performs a project search from the project root. Uses the first available search backend from `+ivy-project-search-engines'. If -ALL-FILES-P (universal argument), include all files, even hidden or compressed -ones, in the search." +ARG (universal argument), include all files, even hidden or compressed ones, in +the search." (interactive "P") (funcall (or (+ivy--get-command "+ivy/%s") #'+ivy/grep) - (or all-files-p current-prefix-arg))) + arg + initial-query + directory)) ;;;###autoload -(defun +ivy/project-search-from-cwd (&optional all-files-p) +(defun +ivy/project-search-from-cwd (&optional arg initial-query directory) "Performs a project search recursively from the current directory. Uses the first available search backend from `+ivy-project-search-engines'. If -ALL-FILES-P (universal argument), include all files, even hidden or compressed -ones." +ARG (universal argument), include all files, even hidden or compressed ones." (interactive "P") (funcall (or (+ivy--get-command "+ivy/%s-from-cwd") #'+ivy/grep-from-cwd) - (or all-files-p current-prefix-arg))) + arg + initial-query + directory)) ;; Relative to project root From 7885cbb4f70c692b2df6e2eacae13bb6e8040ea0 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Apr 2019 13:39:57 -0400 Subject: [PATCH 4187/4235] Merge sly db/inspector popup rule into others --- modules/lang/common-lisp/config.el | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/lang/common-lisp/config.el b/modules/lang/common-lisp/config.el index e9d76cc3a..816561db6 100644 --- a/modules/lang/common-lisp/config.el +++ b/modules/lang/common-lisp/config.el @@ -30,11 +30,10 @@ (set-popup-rules! '(("^\\*sly-mrepl" :vslot 2 :quit nil :ttl nil) ("^\\*sly-compilation" :vslot 3 :ttl nil) - ("^\\*sly-traces" :vslot 4 :ttl nil))) - - ;; Do not display debugger or inspector buffers in a popup window. - ;; These buffers are meant to be displayed with sufficient vertical space. - (set-popup-rule! "^\\*sly-\\(db\\|inspector\\)" :ignore t) + ("^\\*sly-traces" :vslot 4 :ttl nil) + ;; Do not display debugger or inspector buffers in a popup window. These + ;; buffers are meant to be displayed with sufficient vertical space. + ("^\\*sly-\\(?:db\\|inspector\\)" :ignore t))) (sp-with-modes '(sly-mrepl-mode) (sp-local-pair "'" "'" :actions nil) From 54d180b37674aa449275be80a6c1eca02a2d7284 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Apr 2019 03:47:24 -0400 Subject: [PATCH 4188/4235] Ensure user-emacs-directory in doctor Also allow it to be customized with EMACSDIR envvar --- bin/doom-doctor | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 748193f75..98144dcf3 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -13,8 +13,11 @@ ;; are limited to very basic standard library calls (e.g. avoid cl, subr-x, and ;; any Doom dependencies). -;; In really old versions of Emacs `user-emacs-directory' isn't defined -(defvar user-emacs-directory (expand-file-name "../" (file-name-directory load-file-name))) +;; Ensure Doom doctor always runs out of the current Emacs directory (optionally +;; specified by the EMACSDIR envvar) +(setq user-emacs-directory + (or (getenv "EMACSDIR") + (expand-file-name "../" (file-name-directory load-file-name)))) (unless (file-directory-p user-emacs-directory) (error "Couldn't find a Doom config!")) From e9f788cf67ba4c2c6dc749969a2bde153195d48f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Apr 2019 04:09:39 -0400 Subject: [PATCH 4189/4235] Remove redundant project-modeline hook Added upstream recently --- modules/ui/modeline/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index e66bdeebd..d67afce00 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -49,6 +49,7 @@ (if (eq major-mode 'magit-status-mode) (doom-modeline-set-project-modeline) (hide-mode-line-mode))) + (remove-hook 'magit-mode-hook #'doom-modeline-set-project-modeline) (add-hook 'magit-mode-hook #'+modeline|hide-in-non-status-buffer) ;; Show indentation style in modeline. I'm not using From 4a7b8219345c2191709f6b89cb0d02c5a699add7 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Apr 2019 14:16:45 -0400 Subject: [PATCH 4190/4235] Don't auto-kill scratch buffer popups --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 8861be67f..7caa21719 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -136,7 +136,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." :slot -1 :vslot -2 :ttl 0) ("^\\*Compil\\(?:ation\\|e-Log\\)" :vslot -2 :size 0.3 :ttl nil :quit t) - ("^\\*\\(?:scratch\\|Messages\\)" + ("^\\*\\(?:\\(?:doom:\\)?scratch\\|Messages\\)" :autosave t :ttl nil) ("^\\*Man " :size 0.45 :vslot -3 :ttl 0 :quit t :select t) From e3cd82016ea1d75924f428baa52482c1d5ba0d9e Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Tue, 16 Apr 2019 11:07:06 +1000 Subject: [PATCH 4191/4235] Disable fuzzy-matching for swiper-isearch --- modules/completion/ivy/config.el | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index 8fc54d88b..a4decf40b 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -261,6 +261,7 @@ immediately runs it on the current candidate (ending the ivy session)." (counsel-rg . ivy--regex-plus) (counsel-grep . ivy--regex-plus) (swiper . ivy--regex-plus) + (swiper-isearch . ivy--regex-plus) (t . ivy--regex-fuzzy)) ivy-initial-inputs-alist nil)) From ee11262acabfd24b4fbc044ed9ee1a35bc177df2 Mon Sep 17 00:00:00 2001 From: Andrew Whatson Date: Tue, 16 Apr 2019 23:31:23 +1000 Subject: [PATCH 4192/4235] Fix wrong-number-of-args in project-search-from-cwd --- modules/completion/helm/autoload/helm.el | 5 ++--- modules/completion/ivy/autoload/ivy.el | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index 21a60525b..b7b1729e1 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -192,7 +192,7 @@ the search." directory)) ;;;###autoload -(defun +helm/project-search-from-cwd (&optional arg initial-query directory) +(defun +helm/project-search-from-cwd (&optional arg initial-query) "Performs a project search recursively from the current directory. Uses the first available search backend from `+helm-project-search-engines'. If @@ -201,8 +201,7 @@ ARG (universal argument), include all files, even hidden or compressed ones." (funcall (or (+helm--get-command "+helm/%s-from-cwd") #'+helm/grep-from-cwd) arg - initial-query - directory)) + initial-query)) ;; Relative to project root diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index 741bf7ae7..db6fb2bd2 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -364,7 +364,7 @@ the search." directory)) ;;;###autoload -(defun +ivy/project-search-from-cwd (&optional arg initial-query directory) +(defun +ivy/project-search-from-cwd (&optional arg initial-query) "Performs a project search recursively from the current directory. Uses the first available search backend from `+ivy-project-search-engines'. If @@ -373,8 +373,7 @@ ARG (universal argument), include all files, even hidden or compressed ones." (funcall (or (+ivy--get-command "+ivy/%s-from-cwd") #'+ivy/grep-from-cwd) arg - initial-query - directory)) + initial-query)) ;; Relative to project root From 068a324fd1e872f1c7973ad819add422c9b6c499 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Mon, 15 Apr 2019 15:39:33 -0400 Subject: [PATCH 4193/4235] Fix which-key labels for alt leader key #1332 Also mentioned in #1240 --- core/core-keybinds.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/core-keybinds.el b/core/core-keybinds.el index f35f6c1a4..dee061219 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -101,6 +101,10 @@ If any hook returns non-nil, all hooks after it are ignored.") ,bdef) forms)) (when-let* ((desc (plist-get udef :which-key))) + (push `(which-key-add-key-based-replacements + (general--concat t doom-leader-alt-key ,key) + ,desc) + wkforms) (push `(which-key-add-key-based-replacements (general--concat t doom-leader-key ,key) ,desc) From e7e1383b0846fbac8ced6adddd4d304240aa3355 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Apr 2019 20:21:13 -0400 Subject: [PATCH 4194/4235] tools/lsp: replace lookup commands w/ lsp-ui-peek --- modules/tools/lsp/config.el | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index 723c4dfd2..a242dfdd7 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -4,8 +4,12 @@ lsp-auto-guess-root t lsp-keep-workspace-alive nil) -;; Don't prompt to restart LSP servers while quitting Emacs -(add-hook! 'kill-emacs-hook (setq lsp-restart 'ignore)) +(after! lsp-mode + (set-lookup-handlers! 'lsp-mode + :documentation #'lsp-describe-thing-at-point) + + ;; Don't prompt to restart LSP servers while quitting Emacs + (add-hook! 'kill-emacs-hook (setq lsp-restart 'ignore))) (def-package! lsp-ui @@ -15,12 +19,14 @@ lsp-ui-doc-max-height 8 lsp-ui-doc-max-width 35 lsp-ui-sideline-ignore-duplicate t) + (define-key! lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions - [remap xref-find-references] #'lsp-ui-peek-find-references) - (set-lookup-handlers! 'lsp-ui-mode - :definition #'lsp-ui-peek-find-definitions - :references #'lsp-ui-peek-find-references)) + [remap xref-find-references] #'lsp-ui-peek-find-references + ;; `set-lookup-handlers!' won't work for lsp-ui-peek commands, because they + ;; don't switch buffers + [remap +lookup/definition] #'lsp-ui-peek-find-definitions + [remap +lookup/references] #'lsp-ui-peek-find-references)) (def-package! company-lsp From 8a5af077a64d7bcaaea272f8b6ea9949c7af0539 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Apr 2019 20:22:17 -0400 Subject: [PATCH 4195/4235] feature/lookup: refactor lookup commands And move online-lookup commands to separate file --- modules/feature/lookup/autoload/lookup.el | 221 +++++++--------------- modules/feature/lookup/autoload/online.el | 65 +++++++ modules/feature/lookup/config.el | 7 +- 3 files changed, 142 insertions(+), 151 deletions(-) create mode 100644 modules/feature/lookup/autoload/online.el diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 888a04a65..67d686fc7 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -1,11 +1,10 @@ ;;; feature/lookup/autoload/lookup.el -*- lexical-binding: t; -*- -(defvar +lookup--last-provider nil) - (defvar +lookup--handler-alist nil) ;;;###autodef -(defun set-lookup-handlers! (modes &rest plist) +(cl-defun set-lookup-handlers! + (modes &rest plist &key definition references documentation file xref-backend async) "Define a jump target for major MODES. This overwrites previously defined handlers for MODES. If used on minor modes, @@ -37,67 +36,43 @@ Otherwise, these properties are available to be set: Indicates that the supplied handlers *after* this property are asynchronous. Note: async handlers do not fall back to the default handlers, due to their nature. To get around this, you must write specialized wrappers to wait for - the async response and return 'fallback. - -\(fn MODE-OR-MODES &key ASYNC DEFINITION REFERENCES DOCUMENTATION FILE XREF-BACKEND)" + the async response and return 'fallback." (declare (indent defun)) (dolist (mode (doom-enlist modes)) (let ((hook (intern (format "%s-hook" mode))) (fn (intern (format "+lookup|init-%s" mode)))) (cond ((null (car plist)) (remove-hook hook fn) - (setq +lookup--handler-alist - (delq (assq mode +lookup--handler-alist) - +lookup--handler-alist)) + (delq! mode +lookup--handler-alist 'assq) (unintern fn nil)) - ((let ((old-plist (cdr (assq mode +lookup--handler-alist))) - async) - (while plist - (let ((prop (pop plist)) - (fns (pop plist))) - (if (eq prop :async) - (setq async t) - (dolist (fn (doom-enlist fns)) - (put fn '+lookup-async async)) - (setq old-plist (plist-put old-plist prop fns))))) - (setq plist old-plist) - (setf (alist-get mode +lookup--handler-alist) plist)) - (fset fn + ((fset fn (lambda () (when (or (eq major-mode mode) (and (boundp mode) (symbol-value mode))) - (cl-destructuring-bind - (&key definition references documentation file xref-backend async) - plist - (when definition - (add-hook '+lookup-definition-functions definition nil t)) - (when references - (add-hook '+lookup-references-functions references nil t)) - (when documentation - (add-hook '+lookup-documentation-functions documentation nil t)) - (when file - (add-hook '+lookup-file-functions file nil t)) - (when xref-backend - (add-hook 'xref-backend-functions xref-backend nil t)))))) + (cl-mapc #'+lookup--set-handler + (list definition + references + documentation + file + xref-backend) + (list '+lookup-definition-functions + '+lookup-references-functions + '+lookup-documentation-functions + '+lookup-file-functions + 'xref-backend-functions))))) (add-hook hook fn)))))) ;; -;; Helpers +;;; Helpers -;; Helpers -(defun +lookup--online-provider (&optional force-p namespace) - (let ((key (or namespace major-mode))) - (or (and (not force-p) - (cdr (assq key +lookup--last-provider))) - (when-let* ((provider - (completing-read - "Search on: " - (mapcar #'car +lookup-provider-url-alist) - nil t))) - (setf (alist-get key +lookup--last-provider) provider) - provider)))) +(defun +lookup--set-handler (spec functions-var &optional async) + (when spec + (cl-destructuring-bind (fn . plist) + (doom-enlist spec) + (put fn '+lookup-plist (plist-put plist :async async)) + (add-hook functions-var fn nil t)))) (defun +lookup--symbol-or-region (&optional initial) (cond ((stringp initial) @@ -108,60 +83,60 @@ Otherwise, these properties are available to be set: ((require 'xref nil t) (xref-backend-identifier-at-point (xref-find-backend))))) -(defun +lookup--run-hooks (hook identifier origin &optional other-window) - (doom-log "Looking up '%s' with '%s'" identifier hook) - (condition-case-unless-debug e - (if (get hook '+lookup-async) - (progn - (when other-window - ;; If async, we can't catch the window change or destination buffer - ;; reliably, so we set up the new window ahead of time. - (switch-to-buffer-other-window (current-buffer)) - (goto-char (marker-position origin))) - (if (commandp hook) - (call-interactively hook) - (funcall hook identifier)) - t) - (save-window-excursion - (when (or (if (commandp hook) - (call-interactively hook) - (funcall hook identifier)) - (null origin) - (/= (point-marker) origin)) - (point-marker)))) - ((error user-error) - (message "%s" e) +(defun +lookup--run-handler (handler identifier) + (if (commandp handler) + (call-interactively handler) + (funcall handler identifier))) + +(defun +lookup--run-handlers (handler identifier origin &optional other-window) + (doom-log "Looking up '%s' with '%s'" identifier handler) + (condition-case e + (let ((plist (get handler '+lookup-plist))) + (cond ((plist-get plist :direct) + (+lookup--run-handler handler identifier) + t) + ((plist-get plist :async) + (when other-window + ;; If async, we can't catch the window change or destination + ;; buffer reliably, so we set up the new window ahead of time. + (switch-to-buffer-other-window (current-buffer)) + (goto-char (marker-position origin))) + (+lookup--run-handler handler identifier) + t) + ((save-window-excursion + (and (or (+lookup--run-handler handler identifier) + (null origin) + (/= (point-marker) origin)) + (point-marker)))))) + ((error user-error debug) + (message "Lookup handler %S: %s" handler e) nil))) (defun +lookup--jump-to (prop identifier &optional other-window) - (let ((ret - (condition-case _ - (run-hook-wrapped - (plist-get (list :definition '+lookup-definition-functions - :references '+lookup-references-functions - :documentation '+lookup-documentation-functions - :file '+lookup-file-functions) - prop) - '+lookup--run-hooks - identifier - (point-marker) - other-window) - (quit (user-error "Aborted %s lookup" prop))))) - (cond ((null ret) - (message "Could not find '%s'" identifier) - nil) - ((markerp ret) - (funcall (if other-window - #'switch-to-buffer-other-window - #'switch-to-buffer) - (marker-buffer ret)) - (goto-char ret) - (recenter) - t)))) + (let ((result + (run-hook-wrapped + (plist-get (list :definition '+lookup-definition-functions + :references '+lookup-references-functions + :documentation '+lookup-documentation-functions + :file '+lookup-file-functions) + prop) + #'+lookup--run-handlers + identifier + (point-marker) + other-window))) + (if (not (markerp result)) + (ignore (message "No lookup handler could find %S" identifier)) + (funcall (if other-window + #'switch-to-buffer-other-window + #'switch-to-buffer) + (marker-buffer result)) + (goto-char result) + (better-jumper-set-jump) + result))) ;; -;; Lookup backends +;;; Lookup backends (defun +lookup-xref-definitions-backend (identifier) "Non-interactive wrapper for `xref-find-definitions'" @@ -223,18 +198,9 @@ accessed via `+lookup/in-docsets'." (+lookup/in-docsets identifier docsets) t)))) -(defun +lookup-online-backend (identifier) - "Opens the browser and searches for IDENTIFIER online. - -Will prompt for which search engine to use the first time (or if the universal -argument is non-nil)." - (+lookup/online - identifier - (+lookup--online-provider (not current-prefix-arg)))) - ;; -;; Main commands +;;; Main commands ;;;###autoload (defun +lookup/definition (identifier &optional other-window) @@ -332,7 +298,7 @@ Otherwise, falls back on `find-file-at-point'." ;; -;; Source-specific commands +;;; Source-specific commands (defvar counsel-dash-docsets) (defvar helm-dash-docsets) @@ -356,47 +322,6 @@ DOCSETS is a list of docset strings. Docsets can be installed with (counsel-dash query)) ((user-error "No dash backend is installed, enable ivy or helm."))))) -;;;###autoload -(defun +lookup/online (search &optional provider) - "Looks up SEARCH (a string) in you browser using PROVIDER. - -PROVIDER should be a key of `+lookup-provider-url-alist'. - -When used interactively, it will prompt for a query and, for the first time, the -provider from `+lookup-provider-url-alist'. On consecutive uses, the last -provider will be reused. If the universal argument is supplied, always prompt -for the provider." - (interactive - (list (or (and (use-region-p) - (buffer-substring-no-properties (region-beginning) - (region-end))) - (read-string "Search for: " (thing-at-point 'symbol t))) - (+lookup--online-provider current-prefix-arg))) - (condition-case-unless-debug e - (let ((url (cdr (assoc provider +lookup-provider-url-alist)))) - (unless url - (user-error "'%s' is an invalid search engine" provider)) - (when (or (functionp url) (symbolp url)) - (setq url (funcall url))) - (cl-assert (and (stringp url) (not (string-empty-p url)))) - (when (string-empty-p search) - (user-error "The search query is empty")) - (funcall +lookup-open-url-fn (format url (url-encode-url search)))) - (error - (setq +lookup--last-provider - (delq (assq major-mode +lookup--last-provider) - +lookup--last-provider)) - (signal (car e) (cdr e))))) - -;;;###autoload -(defun +lookup/online-select () - "Runs `+lookup/online', but always prompts for the provider to use." - (interactive) - (let ((current-prefix-arg t)) - (call-interactively #'+lookup/online))) - - -;; (after! evil (evil-set-command-property '+lookup/definition :jump t) (evil-set-command-property '+lookup/references :jump t) diff --git a/modules/feature/lookup/autoload/online.el b/modules/feature/lookup/autoload/online.el new file mode 100644 index 000000000..8d088480f --- /dev/null +++ b/modules/feature/lookup/autoload/online.el @@ -0,0 +1,65 @@ +;;; feature/lookup/autoload/online.el -*- lexical-binding: t; -*- + +(defvar +lookup--last-provider nil) + +(defun +lookup--online-provider (&optional force-p namespace) + (let ((key (or namespace major-mode))) + (or (and (not force-p) + (cdr (assq key +lookup--last-provider))) + (when-let* ((provider + (completing-read + "Search on: " + (mapcar #'car +lookup-provider-url-alist) + nil t))) + (setf (alist-get key +lookup--last-provider) provider) + provider)))) + +(defun +lookup-online-backend (identifier) + "Opens the browser and searches for IDENTIFIER online. + +Will prompt for which search engine to use the first time (or if the universal +argument is non-nil)." + (+lookup/online + identifier + (+lookup--online-provider (not current-prefix-arg)))) + +;;;###autoload +(defun +lookup/online (search &optional provider) + "Looks up SEARCH (a string) in you browser using PROVIDER. + +PROVIDER should be a key of `+lookup-provider-url-alist'. + +When used interactively, it will prompt for a query and, for the first time, the +provider from `+lookup-provider-url-alist'. On consecutive uses, the last +provider will be reused. If the universal argument is supplied, always prompt +for the provider." + (interactive + (let ((provider (+lookup--online-provider current-prefix-arg))) + (list (or (and (use-region-p) + (buffer-substring-no-properties (region-beginning) + (region-end))) + (read-string (format "Search for (on %s): " provider) + (thing-at-point 'symbol t))) + provider))) + (condition-case-unless-debug e + (let ((url (cdr (assoc provider +lookup-provider-url-alist)))) + (unless url + (user-error "'%s' is an invalid search engine" provider)) + (when (or (functionp url) (symbolp url)) + (setq url (funcall url))) + (cl-assert (stringp url)) + (when (string-empty-p search) + (user-error "The search query is empty")) + (funcall +lookup-open-url-fn (format url (url-encode-url search)))) + (error + (setq +lookup--last-provider + (delq (assq major-mode +lookup--last-provider) + +lookup--last-provider)) + (signal (car e) (cdr e))))) + +;;;###autoload +(defun +lookup/online-select () + "Runs `+lookup/online', but always prompts for the provider to use." + (interactive) + (let ((current-prefix-arg t)) + (call-interactively #'+lookup/online))) diff --git a/modules/feature/lookup/config.el b/modules/feature/lookup/config.el index da3769116..701d98959 100644 --- a/modules/feature/lookup/config.el +++ b/modules/feature/lookup/config.el @@ -4,6 +4,7 @@ ;; ;; + `+lookup/definition': a jump-to-definition that should 'just work' ;; + `+lookup/references': find a symbol's references in the current project +;; + `+lookup/file': open the file referenced at point ;; + `+lookup/online'; look up a symbol on online resources ;; + `+lookup/in-docsets': look up in Dash docsets ;; @@ -81,7 +82,7 @@ argument: the identifier at point.") ;; -;; dumb-jump +;;; dumb-jump (def-package! dumb-jump :commands dumb-jump-result-follow @@ -95,7 +96,7 @@ argument: the identifier at point.") ;; -;; xref +;;; xref ;; By default, `etags--xref-backend' is the default xref backend. No need. We'll ;; set these up ourselves in other modules. @@ -121,7 +122,7 @@ argument: the identifier at point.") ;; -;; Dash docset integration +;;; Dash docset integration ;; Both packages depend on helm-dash, for now (def-package! helm-dash From f37b1342a2a6a24c78f392b61cb4db0c0c34f112 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Apr 2019 20:51:32 -0400 Subject: [PATCH 4196/4235] Don't show hostname in doom info or doctor output It doesn't help me, and some folks may not want it publicized. --- bin/doom-doctor | 2 +- core/autoload/debug.el | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 98144dcf3..3f30fb1fb 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -123,7 +123,7 @@ (color 31 " (mismatch)"))) (when (boundp 'system-configuration-features) (message "Compiled with:\n%s" (indented 2 system-configuration-features))) -(message "uname -a:\n%s\n" (indented 2 (sh "uname -a"))) +(message "uname -msrv:\n%s\n" (indented 2 (sh "uname -msrv"))) ;; --- is emacs set up properly? ------------------------------ diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 16c0f95d7..6638fb8de 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -47,7 +47,7 @@ ready to be pasted in a bug report on github." (if IS-WINDOWS "n/a" (with-temp-buffer - (unless (zerop (call-process "uname" nil t nil "-a")) + (unless (zerop (call-process "uname" nil t nil "-msrv")) (insert (format "%s" system-type))) (string-trim (buffer-string)))) (or (cl-loop with cat = nil From 20a63a35ab114b60fa32cc23d83a60304c7f8dc9 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Apr 2019 20:53:05 -0400 Subject: [PATCH 4197/4235] Reformat doctor output & add DOOMDIR check - Will now warn you if both .doom.d and .config/doom exists. - Include branch and last commit date in doctor/info, next to Doom version. - Issues in Doom core are now indented. --- bin/doom-doctor | 5 +++-- core/autoload/debug.el | 6 ++---- core/doctor.el | 8 ++++++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 3f30fb1fb..c4546b34c 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -114,7 +114,7 @@ "???") (if (and (executable-find "git") (file-directory-p (expand-file-name ".git" user-emacs-directory))) - (substring (sh "git rev-parse HEAD") 0 8) + (sh "git log -1 --format=\"%D %h %ci\"") "n/a")) (msg! "shell: %s%s" (getenv "SHELL") @@ -300,7 +300,8 @@ (setq doom-modules nil))) (section! "Checking Doom core for irregularities...") -(load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage) +(let ((indent 4)) + (load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage)) (when (bound-and-true-p doom-modules) (section! "Checking your enabled modules...") diff --git a/core/autoload/debug.el b/core/autoload/debug.el index 6638fb8de..d830ad4c6 100644 --- a/core/autoload/debug.el +++ b/core/autoload/debug.el @@ -16,7 +16,7 @@ ready to be pasted in a bug report on github." (format (concat "- OS: %s (%s)\n" "- Emacs: %s (%s)\n" - "- Doom: %s (%s %s)\n" + "- Doom: %s (%s)\n" "- Graphic display: %s (daemon: %s)\n" "- System features: %s\n" "- Details:\n" @@ -31,9 +31,7 @@ ready to be pasted in a bug report on github." system-type system-configuration emacs-version (format-time-string "%b %d, %Y" emacs-build-time) doom-version - (or (vc-git--symbolic-ref "core/core.el") - "n/a") - (or (vc-git-working-revision "core/core.el") + (or (string-trim (shell-command-to-string "git log -1 --format=\"%D %h %ci\"")) "n/a") (display-graphic-p) (daemonp) (bound-and-true-p system-configuration-features) diff --git a/core/doctor.el b/core/doctor.el index baf1de4a7..8ac64af99 100644 --- a/core/doctor.el +++ b/core/doctor.el @@ -27,3 +27,11 @@ (warn! "Your $HOME is recognized as a project root") (explain! "Doom will disable bottom-up root search, which may reduce the accuracy of project\n" "detection."))) + +;; There should only be one +(when! (and (file-equal-p doom-private-dir "~/.config/doom") + (file-directory-p "~/.doom.d")) + (warn! "Both %S and '~/.doom.d' exist on your system" + (abbreviate-file-name doom-private-dir)) + (explain! "Doom will only load one of these (~/.config/doom takes precedence). Since\n" + "it is rarely intentional that you have both, ~/.doom.d should be removed.")) From 6cd30c926b275d064fac7f0f29a82b2e87471df5 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Apr 2019 11:01:51 -0400 Subject: [PATCH 4198/4235] Persist scratch buffer across sessions - Adds doom/open-project-scratch-buffer (persistent project scratch buffers) - Prefix arg = open scratch buffer in current window, for both doom/open-scratch-buffer and doom/open-project-scratch-buffer. - Rename doom/delete-scratch-files -> doom/delete-persistent-scratch-file - Remove doom-scratch-buffer-display-fn - Rename doom-scratch-files-dir -> doom-scratch-dir - Add SPC p s keybind to open project scratch buffer --- core/autoload/scratch.el | 152 +++++++++++++++-------- modules/config/default/+evil-bindings.el | 1 + modules/ui/popup/config.el | 2 +- 3 files changed, 104 insertions(+), 51 deletions(-) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index 97a2ed206..95c731784 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -1,12 +1,12 @@ ;;; core/autoload/scratch.el -*- lexical-binding: t; -*- -(defvar doom-scratch-files-dir (concat doom-etc-dir "scratch/") - "Where to store project scratch files, created by -`doom/open-project-scratch-buffer'.") +(defvar doom-scratch-default-file "__default" + "The default file name for a project-less scratch buffer. -(defvar doom-scratch-buffer-display-fn #'display-buffer - "The function to use to display the scratch buffer. Must accept one argument: -the buffer to display.") +Will be saved in `doom-scratch-dir'.") + +(defvar doom-scratch-dir (concat doom-etc-dir "scratch") + "Where to save persistent scratch buffers.") (defvar doom-scratch-buffer-major-mode nil "What major mode to use in scratch buffers. This can be one of the @@ -16,77 +16,129 @@ following: nil Uses `fundamental-mode' MAJOR-MODE Any major mode symbol") +(defvar doom-scratch-buffers nil + "A list of active scratch buffers.") + +(defvar-local doom-scratch-current-project nil + "The name of the project associated with the current scratch buffer.") + (defvar doom-scratch-buffer-hook () - "The hooks to run after a scratch buffer is made.") + "The hooks to run after a scratch buffer is created.") + +(defun doom--load-persistent-scratch-buffer (name) + (let ((scratch-file (expand-file-name (or name doom-scratch-default-file) + doom-scratch-dir))) + (make-directory doom-scratch-dir t) + (if (not (file-readable-p scratch-file)) + nil + (erase-buffer) + (insert-file-contents scratch-file) + (set-auto-mode) + t))) + +;;;###autoload +(defun doom-scratch-buffer (&optional mode directory project-name) + "Return a scratchpad buffer in major MODE." + (let* ((buffer-name (if project-name + (format "*doom:scratch (%s)*" project-name) + "*doom:scratch*")) + (buffer (get-buffer buffer-name))) + (with-current-buffer (get-buffer-create buffer-name) + (unless buffer + (setq buffer (current-buffer) + default-directory directory + doom-scratch-current-project project-name) + (setq doom-scratch-buffers (cl-delete-if-not #'buffer-live-p doom-scratch-buffers)) + (cl-pushnew buffer doom-scratch-buffers) + (doom--load-persistent-scratch-buffer project-name) + (when (and (eq major-mode 'fundamental-mode) + (functionp mode)) + (funcall mode)) + (add-hook 'kill-buffer-hook #'doom|persist-scratch-buffer nil 'local) + (run-hooks 'doom-scratch-buffer-created-hook)) + buffer))) ;; -;; Library +;;; Persistent scratch buffer ;;;###autoload -(defun doom-scratch-buffer (&optional file mode text) - "Return a scratchpad buffer in major MODE with TEXT in it. +(defun doom|persist-scratch-buffer () + "Save the current buffer to `doom-scratch-dir'." + (write-region + (point-min) (point-max) + (expand-file-name (or doom-scratch-current-project doom-scratch-default-file) + doom-scratch-dir))) -If FILE is a valid path, open it as if it were a persistent scratchpad." - (if file (setq file (file-truename file))) - (let ((buffer - (if file - (with-current-buffer (find-file-noselect file) - (rename-buffer (format "*doom:scratch (%s)*" (file-name-nondirectory file))) - (current-buffer)) - (get-buffer-create "*doom:scratch*")))) +;;;###autoload +(defun doom|persist-scratch-buffers () + "Save all scratch buffers to `doom-scratch-dir'." + (dolist (buffer (cl-delete-if-not #'buffer-live-p doom-scratch-buffers)) (with-current-buffer buffer - (when (and (functionp mode) - (not (eq major-mode mode))) - (funcall mode)) - (when text - (insert text)) - (run-hooks 'doom-scratch-buffer-hook) - (current-buffer)))) + (doom|persist-scratch-buffer)))) ;;;###autoload -(defun doom/open-scratch-buffer (&optional arg) - "Opens a scratch pad window in the same major-mode. +(add-hook 'kill-emacs-hook #'doom|persist-scratch-buffers) -If ARG (universal argument), then open a persistent scratch pad buffer. You'll -be prompted for its name, or to open a previously created. These are stored in -`doom-scratch-files-dir'. -If a region is active, copy its contents to the scratch pad." +;; +;;; Commands + +;;;###autoload +(defun doom/open-scratch-buffer (&optional arg project-p) + "Opens the (persistent) scratch buffer in a popup. + +If ARG, switch to it in the current window." (interactive "P") (let (projectile-enable-caching) (funcall - doom-scratch-buffer-display-fn + (if arg + #'switch-to-buffer + #'pop-to-buffer) (doom-scratch-buffer - (when arg - (if-let* ((file (read-file-name "Open scratch file > " doom-scratch-files-dir "scratch"))) - file - (user-error "Aborting"))) (cond ((eq doom-scratch-buffer-major-mode t) (unless (or buffer-read-only (derived-mode-p 'special-mode) (string-match-p "^ ?\\*" (buffer-name))) major-mode)) - ((null doom-scratch-buffer-major-mode) nil) + ((null doom-scratch-buffer-major-mode) + nil) ((symbolp doom-scratch-buffer-major-mode) doom-scratch-buffer-major-mode)) - (and (region-active-p) - (buffer-substring-no-properties - (region-beginning) (region-end))))))) + default-directory + (when project-p + (doom-project-name)))))) ;;;###autoload -(defun doom/switch-to-scratch-buffer (&optional arg) - "Switches to a scratch pad buffer in the current window. +(defun doom/open-project-scratch-buffer (&optional arg) + "Opens the (persistent) project scratch buffer in a popup. -Otherwise, does exactly what `doom/open-scratch-buffer' does." +If ARG, switch to it in the current window." (interactive "P") - (let ((doom-scratch-buffer-display-fn #'switch-to-buffer)) - (doom/open-scratch-buffer arg))) + (doom/open-scratch-buffer arg 'project)) ;;;###autoload -(defun doom/delete-scratch-files () - "Deletes all scratch buffers in `doom-scratch-files-dir'." +(defun doom/revert-scratch-buffer () + "Revert scratch buffer to last persistent state." (interactive) - (dolist (file (directory-files doom-scratch-files-dir t "^[^.]" t)) - (delete-file file) - (message "Deleted '%s'" (file-name-nondirectory file)))) + (unless (string-match-p "^\\*doom:scratch" (buffer-name)) + (user-error "Not in a scratch buffer")) + (when (doom--load-persistent-scratch-buffer doom-scratch-current-project) + (message "Reloaded scratch buffer"))) + +;;;###autoload +(defun doom/delete-persistent-scratch-file (&optional arg) + "Deletes a scratch buffer file in `doom-scratch-dir'. + +If prefix ARG, delete all persistent scratches." + (interactive) + (if arg + (progn + (delete-directory doom-scratch-dir t) + (message "Cleared %S" (abbreviate-file-name doom-scratch-dir))) + (make-directory doom-scratch-dir t) + (let ((file (read-file-name "Delete scratch file > " doom-scratch-dir "scratch"))) + (if (not (file-exists-p file)) + (message "%S does not exist" (abbreviate-file-name file)) + (delete-file file) + (message "Successfully deleted %S" (abbreviate-file-name file)))))) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index e0a4e2ae1..ba9dd1d59 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -735,6 +735,7 @@ :desc "Find other file" "o" #'projectile-find-other-file :desc "Switch project" "p" #'projectile-switch-project :desc "Find recent project files" "r" #'projectile-recentf + :desc "Scratch buffer" "s" #'doom/open-project-scratch-buffer :desc "List project tasks" "t" #'+default/project-tasks (:prefix ("x" . "terminal") :desc "Open eshell in project" "e" #'projectile-run-eshell diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 7caa21719..8861be67f 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -136,7 +136,7 @@ prevent the popup(s) from messing up the UI (or vice versa)." :slot -1 :vslot -2 :ttl 0) ("^\\*Compil\\(?:ation\\|e-Log\\)" :vslot -2 :size 0.3 :ttl nil :quit t) - ("^\\*\\(?:\\(?:doom:\\)?scratch\\|Messages\\)" + ("^\\*\\(?:scratch\\|Messages\\)" :autosave t :ttl nil) ("^\\*Man " :size 0.45 :vslot -3 :ttl 0 :quit t :select t) From 0f8baf3f3e24fdbebb9cb86e30bd91333420b2d4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Apr 2019 11:19:22 -0400 Subject: [PATCH 4199/4235] Minor comment tweaks --- modules/completion/company/autoload.el | 6 +++--- modules/completion/helm/autoload/helm.el | 1 - modules/completion/ivy/autoload/ivy.el | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/completion/company/autoload.el b/modules/completion/company/autoload.el index 1d4c4a784..7d3177a54 100644 --- a/modules/completion/company/autoload.el +++ b/modules/completion/company/autoload.el @@ -49,7 +49,7 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; -;; Library +;;; Library (defun +company--backends () (append (cl-loop for (mode . rest) in +company-backend-alist @@ -65,7 +65,7 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; -;; Hooks +;;; Hooks ;;;###autoload (defun +company|init-backends () @@ -78,7 +78,7 @@ To have BACKENDS apply to any mode that is a parent of MODES, set MODES to ;; -;; Commands +;;; Commands ;;;###autoload (defun +company-has-completion-p () diff --git a/modules/completion/helm/autoload/helm.el b/modules/completion/helm/autoload/helm.el index b7b1729e1..d798b167c 100644 --- a/modules/completion/helm/autoload/helm.el +++ b/modules/completion/helm/autoload/helm.el @@ -204,7 +204,6 @@ ARG (universal argument), include all files, even hidden or compressed ones." initial-query)) -;; Relative to project root ;;;###autoload (autoload '+helm/rg "completion/helm/autoload/helm") ;;;###autoload (autoload '+helm/rg-from-cwd "completion/helm/autoload/helm") ;;;###autoload (autoload '+helm/ag "completion/helm/autoload/helm") diff --git a/modules/completion/ivy/autoload/ivy.el b/modules/completion/ivy/autoload/ivy.el index db6fb2bd2..9d5eb107b 100644 --- a/modules/completion/ivy/autoload/ivy.el +++ b/modules/completion/ivy/autoload/ivy.el @@ -376,7 +376,6 @@ ARG (universal argument), include all files, even hidden or compressed ones." initial-query)) -;; Relative to project root ;;;###autoload (autoload '+ivy/rg "completion/ivy/autoload/ivy") ;;;###autoload (autoload '+ivy/rg-from-cwd "completion/ivy/autoload/ivy") ;;;###autoload (autoload '+ivy/ag "completion/ivy/autoload/ivy") From 863fc1a6bb4ac79e4d1fd2770fe9ff419c200c04 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Apr 2019 11:29:41 -0400 Subject: [PATCH 4200/4235] Add buffer-live-p check to doom-real-buffer-p --- core/autoload/buffers.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/autoload/buffers.el b/core/autoload/buffers.el index 6df8d44c1..4c69ef253 100644 --- a/core/autoload/buffers.el +++ b/core/autoload/buffers.el @@ -129,7 +129,8 @@ If BUFFER-OR-NAME is omitted or nil, the current buffer is tested." (stringp buffer-or-name) (signal 'wrong-type-argument (list '(bufferp stringp) buffer-or-name))) (when-let* ((buf (get-buffer buffer-or-name))) - (and (not (doom-temp-buffer-p buf)) + (and (buffer-live-p buf) + (not (doom-temp-buffer-p buf)) (or (buffer-local-value 'doom-real-buffer-p buf) (run-hook-with-args-until-success 'doom-real-buffer-functions buf) (not (run-hook-with-args-until-success 'doom-unreal-buffer-functions buf)))))) From 1136e9f49b9655c6ce633270ea12faad1227a0ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Apr 2019 16:38:44 -0400 Subject: [PATCH 4201/4235] Improve doom/describe-module Opens module's README.org, if present, otherwise it prompts if you want to browse the module's root. --- core/autoload/help.el | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/autoload/help.el b/core/autoload/help.el index 8b04e3356..feba3d080 100644 --- a/core/autoload/help.el +++ b/core/autoload/help.el @@ -193,9 +193,15 @@ current file is in, or d) the module associated with the current major mode (see (intern (cadr key))))) (cl-check-type category symbol) (cl-check-type module symbol) - (or (doom-module-p category module) - (error "'%s %s' isn't a valid module" category module)) - (doom-project-browse (doom-module-path category module))) + (let ((path (doom-module-locate-path category module))) + (unless (file-readable-p path) + (error "'%s %s' isn't a valid module; it doesn't exist" category module)) + (if-let* ((readme-path (doom-module-locate-path category module "README.org"))) + (find-file readme-path) + (if (y-or-n-p (format "The '%s %s' module has no README file. Explore its directory?" + category module)) + (doom-project-browse path) + (user-error "Aborted module lookup"))))) (defun doom--describe-package-insert-button (label path &optional regexp) (declare (indent defun)) From 6afc8e5563a2cee7f2c924b1b2b88f4653ae0568 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Apr 2019 18:31:50 -0400 Subject: [PATCH 4202/4235] Add stale elc check to doctor And short-circuit internal checks if Doom fails to load. --- bin/doom-doctor | 86 +++++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index c4546b34c..0af4499ab 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -286,49 +286,59 @@ ;; --- are your modules set up properly? ---------------------- (condition-case-unless-debug ex - (let ((inhibit-message t) - (after-init-time (current-time)) - noninteractive) - (delq 'core features) - (load-file (concat user-emacs-directory "init.el")) - (require 'core-packages) - (doom-initialize-packages) - (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) + (progn + (let ((inhibit-message t) + (after-init-time (current-time)) + noninteractive) + (delq 'core features) + (load-file (concat user-emacs-directory "init.el")) + (require 'core-packages) + (doom-initialize-packages) + (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) + + (section! "Checking Doom core for irregularities...") + (let ((indent 4)) + (load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage)) + + (section! "Checking for stale elc files...") + (let ((elc-files (doom-files-in (list doom-emacs-dir doom-private-dir) + :match "\\.elc$" + :depth 2))) + (dolist (file elc-files) + (when (file-newer-than-file-p (concat (file-name-sans-extension file) ".el") + file) + (warn! "%s is out-of-date" (abbreviate-file-name file))))) + + (when (bound-and-true-p doom-modules) + (section! "Checking your enabled modules...") + (let ((indent 4)) + (advice-add #'require :around #'doom*shut-up) + (maphash + (lambda (key plist) + (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) + (condition-case-unless-debug ex + (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) + (packages-file (doom-module-path (car key) (cdr key) "packages.el"))) + (cl-loop with doom--stage = 'packages + for name in (let (doom-packages + doom-disabled-packages) + (load packages-file 'noerror 'nomessage) + (mapcar #'car doom-packages)) + unless (or (doom-package-prop name :disable) + (doom-package-prop name :ignore t) + (package-built-in-p name) + (package-installed-p name)) + do (error! "%s is not installed" name)) + (let ((doom--stage 'doctor)) + (load doctor-file 'noerror 'nomessage))) + (file-missing (error! "%s" (error-message-string ex))) + (error (error! "Syntax error: %s" ex))))) + doom-modules)))) (error (warn! "Attempt to load DOOM: failed\n %s\n" (or (cdr-safe ex) (car ex))) (setq doom-modules nil))) -(section! "Checking Doom core for irregularities...") -(let ((indent 4)) - (load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage)) - -(when (bound-and-true-p doom-modules) - (section! "Checking your enabled modules...") - (let ((indent 4)) - (advice-add #'require :around #'doom*shut-up) - (maphash - (lambda (key plist) - (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) - (condition-case-unless-debug ex - (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) - (packages-file (doom-module-path (car key) (cdr key) "packages.el"))) - (cl-loop with doom--stage = 'packages - for name in (let (doom-packages - doom-disabled-packages) - (load packages-file 'noerror 'nomessage) - (mapcar #'car doom-packages)) - unless (or (doom-package-prop name :disable) - (doom-package-prop name :ignore t) - (package-built-in-p name) - (package-installed-p name)) - do (error! "%s is not installed" name)) - (let ((doom--stage 'doctor)) - (load doctor-file 'noerror 'nomessage))) - (file-missing (error! "%s" (error-message-string ex))) - (error (error! "Syntax error: %s" ex))))) - doom-modules))) - ;; (message "\n") (dolist (msg (list (list doom-errors "error" 31) From cf7ef0f99ff03238c5660381d0e6ec918bd86e5f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Wed, 17 Apr 2019 21:24:17 -0400 Subject: [PATCH 4203/4235] Remove ref to better-jumper I'm experimenting with this package locally. --- modules/feature/lookup/autoload/lookup.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature/lookup/autoload/lookup.el b/modules/feature/lookup/autoload/lookup.el index 67d686fc7..af4d30c85 100644 --- a/modules/feature/lookup/autoload/lookup.el +++ b/modules/feature/lookup/autoload/lookup.el @@ -131,7 +131,7 @@ Otherwise, these properties are available to be set: #'switch-to-buffer) (marker-buffer result)) (goto-char result) - (better-jumper-set-jump) + (recenter) result))) From 0beb194e2361ded0e05e971259e01d3f8d748797 Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Thu, 18 Apr 2019 00:12:57 -0300 Subject: [PATCH 4204/4235] Document company +tng flag --- modules/completion/company/README.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/completion/company/README.org b/modules/completion/company/README.org index 48973f228..a3d97b899 100644 --- a/modules/completion/company/README.org +++ b/modules/completion/company/README.org @@ -30,6 +30,8 @@ https://assets.doomemacs.org/completion/company/overlay.png + =+childframe= Enables displaying completion candidates in a child frame, rather than an overlay or tooltip (among with other UI enhancements). *This requires GUI Emacs 26.1+.* ++ =+tng= Enables completion using only ~TAB~. Pressing ~TAB~ will select the + next completion suggestion, while ~S-TAB~ will select the previous one. ** Plugins + [[https://github.com/company-mode/company-mode][company-mode]] From 8cce11fc82970d6137e3dbf0ffbb5e711b91c8f5 Mon Sep 17 00:00:00 2001 From: "Thiago Kenji Okada (Nubank)" Date: Thu, 18 Apr 2019 20:58:09 -0300 Subject: [PATCH 4205/4235] Fix SPC m r c in clojure-mode Map it to 'cider-find-and-clear-repl-output instead of 'cider-repl-clear-buffer (that does not work inside Clojure buffer). --- modules/lang/clojure/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index bc1a16beb..11b29077a 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -82,7 +82,7 @@ "R" #'cider-restart "b" #'cider-switch-to-repl-buffer "B" #'+clojure/cider-switch-to-repl-buffer-and-switch-ns - "c" #'cider-repl-clear-buffer))) + "c" #'cider-find-and-clear-repl-output))) (:when (featurep! :feature evil +everywhere) :map cider-repl-mode-map From 3eb9caf1679443c8872394398cfbf37f2d8a1b63 Mon Sep 17 00:00:00 2001 From: "Thiago Kenji Okada (Nubank)" Date: Thu, 18 Apr 2019 20:59:46 -0300 Subject: [PATCH 4206/4235] Add some maps in cider-repl major mode --- modules/lang/clojure/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/lang/clojure/config.el b/modules/lang/clojure/config.el index 11b29077a..afca38fba 100644 --- a/modules/lang/clojure/config.el +++ b/modules/lang/clojure/config.el @@ -87,6 +87,12 @@ (:when (featurep! :feature evil +everywhere) :map cider-repl-mode-map :i [S-return] #'cider-repl-newline-and-indent + (:localleader + ("n" #'cider-repl-set-ns + "q" #'cider-quit + "r" #'cider-ns-refresh + "R" #'cider-restart + "c" #'cider-repl-clear-buffer)) :map cider-repl-history-mode-map :i [return] #'cider-repl-history-insert-and-quit :i "q" #'cider-repl-history-quit From 25a86c18c805e893ba247b442d3cf4aa88af354d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 13:30:39 -0400 Subject: [PATCH 4207/4235] Fix quiet! not returning BODY's return value --- core/core-lib.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/core-lib.el b/core/core-lib.el index 6bc55a105..e02c31abf 100644 --- a/core/core-lib.el +++ b/core/core-lib.el @@ -258,8 +258,7 @@ BODY is evaluated once TARGETS are loaded. TARGETS can either be: ,@forms) ((let ((inhibit-message t) (save-silently t)) - ,@forms - (message ""))))) + (prog1 ,@forms (message "")))))) (defmacro add-transient-hook! (hook-or-function &rest forms) "Attaches a self-removing function to HOOK-OR-FUNCTION. From 0caf0abcbb3565c6281ad544ae8854656f5f5b63 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 13:31:27 -0400 Subject: [PATCH 4208/4235] Major refactor of the Doctor - Reorganize tests into logical groups - Report Doom initialization with more granularity - Make better use of whitespace and indentation in output - Use backquotes for quoting symbols in pcase (for backward compatibility) - Initialize Doom completely and manually (less maintanence headache and more certain to work across Doom updates). --- bin/doom-doctor | 441 +++++++++++++++++++++++++++--------------------- 1 file changed, 244 insertions(+), 197 deletions(-) diff --git a/bin/doom-doctor b/bin/doom-doctor index 0af4499ab..626742601 100755 --- a/bin/doom-doctor +++ b/bin/doom-doctor @@ -8,10 +8,11 @@ ;; that uses a series of simple heuristics to diagnose common issues on your ;; system. Issues that could intefere with Doom Emacs. ;; -;; Doom module may optionally have a doctor.el file to run their own heuristics -;; in. Doctor scripts may run in versions of Emacs as old as Emacs 23, so you -;; are limited to very basic standard library calls (e.g. avoid cl, subr-x, and -;; any Doom dependencies). +;; Doom modules may optionally have a doctor.el file to run their own heuristics +;; in. Doctor scripts may run in versions of Emacs as old as Emacs 23, so make +;; no assumptions about the standard library limited to very basic standard +;; library (e.g. avoid cl/cl-lib, subr-x, map, seq, etc). + ;; Ensure Doom doctor always runs out of the current Emacs directory (optionally ;; specified by the EMACSDIR envvar) @@ -28,7 +29,8 @@ (require 'pp) -;; + +;;; Helpers (defvar doom-init-p nil) (defvar doom-warnings 0) (defvar doom-errors 0) @@ -83,6 +85,13 @@ (defmacro explain! (&rest args) `(message (indented (+ indent 2) (autofill ,@args)))) +(defun elc-check-dir (dir) + (dolist (file (directory-files-recursively dir "\\.elc$")) + (when (file-newer-than-file-p (concat (file-name-sans-extension file) ".el") + file) + (warn! "%s is out-of-date" (abbreviate-file-name file))))) + + ;;; Polyfills ;; early versions of emacs won't have this (unless (fboundp 'string-match-p) @@ -103,14 +112,14 @@ (msg! (color 1 "Doom Doctor")) (msg! "Emacs v%s" emacs-version) (msg! "Doom v%s (%s)" - (or (and (file-exists-p (expand-file-name "core/core.el" user-emacs-directory)) - (with-temp-buffer - (insert-file-contents-literally - (expand-file-name "core/core.el" user-emacs-directory)) - (goto-char (point-min)) - (when (re-search-forward "doom-version") - (forward-char) - (sexp-at-point)))) + (or (let ((core-file (expand-file-name "core/core.el" user-emacs-directory))) + (and (file-exists-p core-file) + (with-temp-buffer + (insert-file-contents-literally core-file) + (goto-char (point-min)) + (when (re-search-forward "doom-version" nil t) + (forward-char) + (sexp-at-point))))) "???") (if (and (executable-find "git") (file-directory-p (expand-file-name ".git" user-emacs-directory))) @@ -125,217 +134,255 @@ (message "Compiled with:\n%s" (indented 2 system-configuration-features))) (message "uname -msrv:\n%s\n" (indented 2 (sh "uname -msrv"))) + ;; --- is emacs set up properly? ------------------------------ -(when (version< emacs-version "25.3") - (error! "Important: Emacs %s detected [%s]" emacs-version (executable-find "emacs")) - (explain! - "DOOM only supports >= 25.3. Perhaps your PATH wasn't set up properly." - (when (eq system-type 'darwin) - (concat "\nMacOS users should use homebrew (https://brew.sh) to install Emacs\n" - " brew install emacs --with-modules --with-imagemagick --with-cocoa")))) +(section! "Checking Emacs") +(let ((indent 4)) + (section! "Checking your Emacs version is 25.3 or newer...") + (when (version< emacs-version "25.3") + (error! "Important: Emacs %s detected [%s]" emacs-version (executable-find "emacs")) + (explain! + "DOOM only supports >= 25.3. Perhaps your PATH wasn't set up properly." + (when (eq system-type 'darwin) + (concat "\nMacOS users should use homebrew (https://brew.sh) to install Emacs\n" + " brew install emacs --with-modules --with-imagemagick --with-cocoa")))) -(let ((xdg-dir (concat (or (getenv "XDG_CONFIG_HOME") - "~/.config") - "/doom/")) - (doom-dir "~/.doom.d/")) - (when (and (file-directory-p xdg-dir) - (file-directory-p doom-dir)) - (warn! "Detected two private configs, in %s and %s" - (abbreviate-file-name xdg-dir) - doom-dir) - (explain! "The second directory will be ignored, as it has lower precedence."))) + (section! "Checking if your version of Emacs has changed recently...") + (let ((version-file (expand-file-name ".local/emacs-version.el" user-emacs-directory)) + doom--last-emacs-version) + (when (and (load version-file 'noerror 'nomessage 'nosuffix) + (not (equal emacs-version doom--last-emacs-version))) + (warn! "Your version of Emacs has changed from %S to %S. Recompile your packages!" + doom--last-emacs-version + emacs-version) + (explain! "Byte-code compiled in one version of Emacs may not work in another version." + "It is recommended that you reinstall your plugins or recompile them with" + "`bin/doom compile :plugins'."))) + + (section! "Checking for private config conflicts...") + (let ((xdg-dir (concat (or (getenv "XDG_CONFIG_HOME") + "~/.config") + "/doom/")) + (doom-dir (or (getenv "DOOMDIR") + "~/.doom.d/"))) + (when (and (not (file-equal-p xdg-dir doom-dir)) + (file-directory-p xdg-dir) + (file-directory-p doom-dir)) + (warn! "Detected two private configs, in %s and %s" + (abbreviate-file-name xdg-dir) + doom-dir) + (explain! "The second directory will be ignored, as it has lower precedence."))) + + (section! "Checking for stale elc files...") + (elc-check-dir user-emacs-directory)) ;; --- is the environment set up properly? -------------------- -;; on windows? -(section! "Checking your OS...") -(when (memq system-type '(windows-nt ms-dos cygwin)) - (warn! "Warning: Windows detected") - (explain! "DOOM was designed for MacOS and Linux. Expect a bumpy ride!")) +(section! "Checking your system...") +(let ((indent 4)) + ;; on windows? + (when (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? -(section! "Checking your fonts...") -(if (not (fboundp 'find-font)) - (progn - (warn! "Warning: unable to detect font") - (explain! "The `find-font' function is missing. This could indicate the incorrect " - "version of Emacs is being used!")) - ;; all-the-icons fonts - (let ((font-dest (pcase system-type - ('gnu/linux (concat (or (getenv "XDG_DATA_HOME") - "~/.local/share") - "/fonts/")) - ('darwin "~/Library/Fonts/")))) - (when (and font-dest (require 'all-the-icons nil t)) - (dolist (font all-the-icons-font-names) - (if (file-exists-p (expand-file-name font font-dest)) - (success! "Found font %s" font) - (warn! "Warning: couldn't find %s font in %s" - font font-dest) - (explain! "You can install it by running `M-x all-the-icons-install-fonts' within Emacs.\n\n" - "This could also mean you've installed them in non-standard locations, in which " - "case feel free to ignore this warning.")))))) + ;; are all default fonts present? + (section! "Checking your fonts...") + (if (not (fboundp 'find-font)) + (progn + (warn! "Warning: unable to detect font") + (explain! "The `find-font' function is missing. This could indicate the incorrect " + "version of Emacs is being used!")) + ;; all-the-icons fonts + (let ((font-dest (pcase system-type + (`gnu/linux (concat (or (getenv "XDG_DATA_HOME") + "~/.local/share") + "/fonts/")) + (`darwin "~/Library/Fonts/")))) + (when (and font-dest (require 'all-the-icons nil t)) + (dolist (font all-the-icons-font-names) + (if (file-exists-p (expand-file-name font font-dest)) + (success! "Found font %s" font) + (warn! "Warning: couldn't find %s font in %s" + font font-dest) + (explain! "You can install it by running `M-x all-the-icons-install-fonts' within Emacs.\n\n" + "This could also mean you've installed them in non-standard locations, in which " + "case feel free to ignore this warning.")))))) -;; gnutls-cli & openssl -(section! "Checking gnutls/openssl...") -(cond ((executable-find "gnutls-cli")) - ((executable-find "openssl") - (let* ((output (sh "openssl ciphers -v")) - (protocols - (let (protos) - (mapcar (lambda (row) - (add-to-list 'protos (cadr (split-string row " " t)))) - (split-string (sh "openssl ciphers -v") "\n")) - (delq nil protos)))) - (unless (or (member "TLSv1.1" protocols) - (member "TLSv1.2" protocols)) - (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 " - "vulnerabilities in the SSL2/3 & TLS1.0 protocols. You should use " - "TLS 1.1+, which wasn't introduced until OpenSSL v1.0.1.\n\n" + ;; gnutls-cli & openssl + (section! "Checking gnutls/openssl...") + (cond ((executable-find "gnutls-cli")) + ((executable-find "openssl") + (let* ((output (sh "openssl ciphers -v")) + (protocols + (let (protos) + (mapcar (lambda (row) + (add-to-list 'protos (cadr (split-string row " " t)))) + (split-string (sh "openssl ciphers -v") "\n")) + (delq nil protos)))) + (unless (or (member "TLSv1.1" protocols) + (member "TLSv1.2" protocols)) + (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 " + "vulnerabilities in the SSL2/3 & TLS1.0 protocols. You should use " + "TLS 1.1+, which wasn't introduced until OpenSSL v1.0.1.\n\n" - "Please consider updating (or install gnutls-cli, which is preferred)."))))) - (t - (error! "Important: couldn't find either gnutls-cli nor openssl") - (explain! - "You won't be able to install/update packages because Emacs won't be able to " - "verify HTTPS ELPA sources. Install gnutls-cli or openssl v1.0.0+. If for some " - "reason you can't, you can bypass this verification with the INSECURE flag:\n\n" + "Please consider updating (or install gnutls-cli, which is preferred)."))))) + (t + (error! "Important: couldn't find either gnutls-cli nor openssl") + (explain! + "You won't be able to install/update packages because Emacs won't be able to " + "verify HTTPS ELPA sources. Install gnutls-cli or openssl v1.0.0+. If for some " + "reason you can't, you can bypass this verification with the INSECURE flag:\n\n" - " INSECURE=1 make install\n\n" + " INSECURE=1 make install\n\n" - "Or change `package-archives' to use non-https sources.\n\n" + "Or change `package-archives' to use non-https sources.\n\n" - "But remember that you're leaving your security in the hands of your " - "network, provider, government, neckbearded mother-in-laws, geeky roommates, " - "or just about anyone who knows more about computers than you do!"))) + "But remember that you're leaving your security in the hands of your " + "network, provider, government, neckbearded mother-in-laws, geeky roommates, " + "or just about anyone who knows more about computers than you do!"))) -;; are certificates validated properly? -(section! "Testing your root certificates...") -(cond ((not (ignore-errors (gnutls-available-p))) - (warn! "Warning: Emacs wasn't installed with gnutls support") - (explain! - "This may cause 'pecular error' errors with the Doom doctor, and is likely to " - "interfere with package management. Your mileage may vary." - (when (eq system-type 'darwin) - (concat "\nMacOS users are advised to install Emacs via homebrew with one of the following:\n" - " brew install emacs --with-gnutls" - " or" - " brew tap d12frosted/emacs-plus" - " brew install emacs-plus")))) + ;; are certificates validated properly? + (section! "Testing your root certificates...") + (cond ((not (ignore-errors (gnutls-available-p))) + (warn! "Warning: Emacs wasn't installed with gnutls support") + (explain! + "This may cause 'pecular error' errors with the Doom doctor, and is likely to " + "interfere with package management. Your mileage may vary." + (when (eq system-type 'darwin) + (concat "\nMacOS users are advised to install Emacs via homebrew with one of the following:\n" + " brew install emacs --with-gnutls" + " or" + " brew tap d12frosted/emacs-plus" + " brew install emacs-plus")))) - ((not (fboundp 'url-retrieve-synchronously)) - (error! "Can't find url-retrieve-synchronously function. Are you sure you're on Emacs 24+?")) + ((not (fboundp 'url-retrieve-synchronously)) + (error! "Can't find url-retrieve-synchronously function. Are you sure you're on 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")) - (when! (condition-case-unless-debug e - (unless (let ((inhibit-message t)) (url-retrieve-synchronously 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) - (explain! (pp-to-string it)))))) - (dolist (url '("https://self-signed.badssl.com" - "https://wrong.host.badssl.com/")) - (when! (condition-case-unless-debug e - (if (let ((inhibit-message t)) (url-retrieve-synchronously url)) - t - 'empty) - ('timed-out 'timeout) - ('error)) - (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))))))) + ((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")) + (when! (condition-case-unless-debug e + (unless (let ((inhibit-message t)) (url-retrieve-synchronously 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) + (explain! (pp-to-string it)))))) + (dolist (url '("https://self-signed.badssl.com" + "https://wrong.host.badssl.com/")) + (when! (condition-case-unless-debug e + (if (let ((inhibit-message t)) (url-retrieve-synchronously url)) + t + 'empty) + ('timed-out 'timeout) + ('error)) + (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))))))) - ((error! "Nope!"))) + ((error! "Nope!"))) -;; which variant of tar is on your system? bsd or gnu tar? -(section! "Checking for GNU/BSD tar...") -(let ((tar-bin (or (executable-find "gtar") - (executable-find "tar")))) - (if tar-bin - (unless (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 " - "expects GNU tar. BSD tar *could* cause errors during package installation or " - "updating from non-ELPA sources." - (when (eq system-type 'darwin) - (concat "\nMacOS users can install gnu-tar via homebrew:\n" - " brew install gnu-tar")))) - (error! "Important: Couldn't find tar") - (explain! - "This is required by package.el and QUELPA to build packages and will " - "prevent you from installing & updating packages."))) + ;; which variant of tar is on your system? bsd or gnu tar? + (section! "Checking for GNU/BSD tar...") + (let ((tar-bin (or (executable-find "gtar") + (executable-find "tar")))) + (if tar-bin + (unless (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 " + "expects GNU tar. BSD tar *could* cause errors during package installation or " + "updating from non-ELPA sources." + (when (eq system-type 'darwin) + (concat "\nMacOS users can install gnu-tar via homebrew:\n" + " brew install gnu-tar")))) + (error! "Important: Couldn't find tar") + (explain! + "This is required by package.el and QUELPA to build packages and will " + "prevent you from installing & updating packages.")))) -;; --- are your modules set up properly? ---------------------- +;; --- is Doom Emacs set up correctly? ------------------------ (condition-case-unless-debug ex - (progn - (let ((inhibit-message t) - (after-init-time (current-time)) - noninteractive) - (delq 'core features) - (load-file (concat user-emacs-directory "init.el")) - (require 'core-packages) - (doom-initialize-packages) - (success! "Attempt to load DOOM: success! Loaded v%s" doom-version)) + (let ((after-init-time (current-time)) + noninteractive) + (section! "Checking DOOM Emacs...") + (load (concat user-emacs-directory "core/core.el") nil t) + (unless (file-directory-p doom-private-dir) + (error "No DOOMDIR was found, did you run `doom quickstart` yet?")) - (section! "Checking Doom core for irregularities...") (let ((indent 4)) - (load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage)) + ;; Make sure everything is loaded + (require 'core-cli) + (require 'core-keybinds) + (require 'core-ui) + (require 'core-projects) + (require 'core-editor) + (require 'core-packages) + (success! "Loaded Doom Emacs %s" doom-version) - (section! "Checking for stale elc files...") - (let ((elc-files (doom-files-in (list doom-emacs-dir doom-private-dir) - :match "\\.elc$" - :depth 2))) - (dolist (file elc-files) - (when (file-newer-than-file-p (concat (file-name-sans-extension file) ".el") - file) - (warn! "%s is out-of-date" (abbreviate-file-name file))))) + ;; ...and initialized + (doom-initialize) + (success! "Initialized Doom Emacs" doom-version) - (when (bound-and-true-p doom-modules) - (section! "Checking your enabled modules...") - (let ((indent 4)) - (advice-add #'require :around #'doom*shut-up) - (maphash - (lambda (key plist) - (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) - (condition-case-unless-debug ex - (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) - (packages-file (doom-module-path (car key) (cdr key) "packages.el"))) - (cl-loop with doom--stage = 'packages - for name in (let (doom-packages - doom-disabled-packages) - (load packages-file 'noerror 'nomessage) - (mapcar #'car doom-packages)) - unless (or (doom-package-prop name :disable) - (doom-package-prop name :ignore t) - (package-built-in-p name) - (package-installed-p name)) - do (error! "%s is not installed" name)) - (let ((doom--stage 'doctor)) - (load doctor-file 'noerror 'nomessage))) - (file-missing (error! "%s" (error-message-string ex))) - (error (error! "Syntax error: %s" ex))))) - doom-modules)))) + (doom-initialize-modules) + (if (hash-table-p doom-modules) + (success! "Initialized %d modules" (hash-table-count doom-modules)) + (warn! "Failed to load any modules. Do you have an private init.el?")) + + (doom-initialize-packages) + (success! "Initialized %d packages" (length doom-packages)) + + (section! "Checking Doom core for irregularities...") + (let ((indent (+ indent 2))) + (load (expand-file-name "doctor.el" doom-core-dir) nil 'nomessage)) + + (section! "Checking for stale elc files in your DOOMDIR...") + (when (file-directory-p doom-private-dir) + (let ((indent (+ indent 2))) + (elc-check-dir doom-private-dir))) + + (when doom-modules + (section! "Checking your enabled modules...") + (let ((indent (+ indent 2))) + (advice-add #'require :around #'doom*shut-up) + (maphash + (lambda (key plist) + (let ((prefix (format "%s" (color 1 "(%s %s) " (car key) (cdr key))))) + (condition-case-unless-debug ex + (let ((doctor-file (doom-module-path (car key) (cdr key) "doctor.el")) + (packages-file (doom-module-path (car key) (cdr key) "packages.el"))) + (cl-loop with doom--stage = 'packages + for name in (let (doom-packages + doom-disabled-packages) + (load packages-file 'noerror 'nomessage) + (mapcar #'car doom-packages)) + unless (or (doom-package-prop name :disable) + (doom-package-prop name :ignore t) + (package-built-in-p name) + (package-installed-p name)) + do (error! "%s is not installed" name)) + (let ((doom--stage 'doctor)) + (load doctor-file 'noerror 'nomessage))) + (file-missing (error! "%s" (error-message-string ex))) + (error (error! "Syntax error: %s" ex))))) + doom-modules))))) (error - (warn! "Attempt to load DOOM: failed\n %s\n" + (warn! "Attempt to load DOOM failed\n %s\n" (or (cdr-safe ex) (car ex))) (setq doom-modules nil))) From ad9d8b20e758b03bdf79c80f80f76618a9d524a7 Mon Sep 17 00:00:00 2001 From: Pedro Vanzella Date: Fri, 19 Apr 2019 15:16:26 -0400 Subject: [PATCH 4209/4235] Add documentation for JS module keymaps --- modules/lang/javascript/README.org | 77 ++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/modules/lang/javascript/README.org b/modules/lang/javascript/README.org index 2bb3f4b6c..442514a84 100644 --- a/modules/lang/javascript/README.org +++ b/modules/lang/javascript/README.org @@ -11,10 +11,10 @@ This module adds Javascript support. + Jump-to-definitions and references support (xref) * Table of Contents :TOC: -- [[Install][Install]] - - [[Node & NPM][Node & NPM]] -- [[Appendix][Appendix]] - - [[Commands][Commands]] +- [[#install][Install]] + - [[#node--npm][Node & NPM]] +- [[#appendix][Appendix]] + - [[#commands][Commands]] * Install ** Node & NPM @@ -32,7 +32,76 @@ sudo pacman --needed --noconfirm -S nodejs npm * Appendix ** Commands +*** JS2-mode | command | key / ex command | description | |----------------------------------+------------------+------------------------------------------------------------| | ~+javascript/open-repl~ | =:repl= | Open the NodeJS REPL (or send the current selection to it) | | ~+javascript/skewer-this-buffer~ | =SPC m S= | Attaches a browser to the current buffer | +*** Tide +| command | key / ex command | description | +|-------------------------+------------------+------------------------| +| ~tide-restart-server~ | =SPC m R= | Restart tide server | +| ~tide-reformat~ | =SPC m f= | Reformat region | +| ~tide-rename-symbol~ | =SPC m r s= | Rename symbol at point | +| ~tide-organize-imports~ | =SPC m r o i= | Organize imports | +*** Refactoring (js2-refactor-mode) +| command | key / ex command | description | +|---------------------------------------------------+------------------+--------------------------------------------------------------------------------------------------------------------| +| ~js2r-expand-node-at-point~ | =SPC m r e e= | Expand bracketed list according to node type at point | +| ~js2r-contract-node-at-point~ | =SPC m r c c= | Contract bracketed list according to node type at point | +| ~js2r-extract-function~ | =SPC m r e f= | Extracts the marked expressions out into a new named function. | +| ~js2r-extract-method~ | =SPC m r e m= | Extracts the marked expressions out into a new named method in an object literal. | +| ~js2r-toggle-function-expression-and-declaration~ | =SPC m r t f= | Toggle between function name() {} and var name = function (); | +| ~js2r-toggle-arrow-function-and-expression~ | =SPC m r t a= | Toggle between function expression to arrow function. | +| ~js2r-toggle-function-async~ | =SPC m r t s= | Toggle between an async and a regular function. | +| ~js2r-introduce-parameter~ | =SPC m r i p= | Changes the marked expression to a parameter in a local function. | +| ~js2r-localize-parameter~ | =SPC m r l p= | Changes a parameter to a local var in a local function. | +| ~js2r-wrap-buffer-in-iife~ | =SPC m r w i= | Wraps the entire buffer in an immediately invoked function expression | +| ~js2r-inject-global-in-iife~ | =SPC m r i g= | Creates a shortcut for a marked global by injecting it in the wrapping immediately invoked function expression | +| ~js2r-add-to-globals-annotation~ | =SPC m r a g= | Creates a /*global */ annotation if it is missing, and adds the var at point to it. | +| ~js2r-extract-var~ | =SPC m r e v= | Takes a marked expression and replaces it with a var. | +| ~js2r-extract-let~ | =SPC m r e l= | Similar to extract-var but uses a let-statement. | +| ~js2r-extract-const~ | =SPC m r e c= | Similar to extract-var but uses a const-statement. | +| ~js2r-inline-var~ | =SPC m r i v= | Replaces all instances of a variable with its initial value. | +| ~js2r-rename-var~ | =SPC m r r v= | Renames the variable on point and all occurrences in its lexical scope. | +| ~js2r-var-to-this~ | =SPC m r v t= | Changes local var a to be this.a instead. | +| ~js2r-arguments-to-object~ | =SPC m r a o= | Replaces arguments to a function call with an object literal of named arguments. | +| ~js2r-ternary-to-if~ | =SPC m r 3 i= | Converts ternary operator to if-statement. | +| ~js2r-split-var-declaration~ | =SPC m r s v= | Splits a var with multiple vars declared, into several var statements. | +| ~js2r-split-string~ | =SPC m r s s= | Splits a string. | +| ~js2r-string-to-template~ | =SPC m r s t= | Converts a string into a template string. | +| ~js2r-unwrap~ | =SPC m r u w= | Replaces the parent statement with the selected region. | +| ~js2r-log-this~ | =SPC m r l t= | Adds a console.log() statement for what is at point (or region). With a prefix argument, use JSON pretty-printing. | +| ~js2r-debug-this~ | =SPC m r d t= | Adds a debug() statement for what is at point (or region). | +| ~js2r-forward-slurp~ | =SPC m r s l= | Moves the next statement into current function, if-statement, for-loop or while-loop. | +| ~js2r-forward-barf~ | =SPC m r b a= | Moves the last child out of current function, if-statement, for-loop or while-loop. | +| ~js2r-kill~ | =SPC m r k= | Kills to the end of the line, but does not cross semantic boundaries. | +*** skewer-mode +**** general +| command | key / ex command | description | +|-------------------------------+------------------+---------------------------------------| +| ~skewer-eval-last-expression~ | =SPC m s E= | Evaluate last expression | +| ~skewer-eval-defun~ | =SPC m s e= | Evaluate function definition at point | +| ~skewer-load-buffer~ | =SPC m s f= | Load buffer into REPL | +**** css +| command | key / ex command | description | +|---------------------------------------+------------------+-------------------------------| +| ~skewer-css-eval-current-declaration~ | =SPC m s e= | Evaluate declaration at point | +| ~skewer-css-eval-current-rule~ | =SPC m s r= | Evaluate rule at point | +| ~skewer-css-eval-buffer~ | =SPC m s b= | Evaluate buffer | +| ~skewer-css-clear-all~ | =SPC m s c= | Clear all rules | +**** html +| command | key / ex command | description | +|------------------------+------------------+-----------------------| +| ~skewer-html-eval-tag~ | =SPC m s e= | Evaluate tag at point | +*** npm-mode +| command | key / ex command | description | +|---------------------------------+------------------+------------------------------------------------------------------| +| ~npm-mode-npm-init~ | =SPC m n n= | Initialize npm project | +| ~npm-mode-npm-install~ | =SPC m n i= | Install npm package | +| ~npm-mode-npm-install-save~ | =SPC m n s= | Install npm package and save to package.json | +| ~npm-mode-npm-install-save-dev~ | =SPC m n d= | Install npm package and save to package.json as a dev dependency | +| ~npm-mode-npm-uninstall~ | =SPC m n u= | Uninstall npm package | +| ~npm-mode-npm-list~ | =SPC m n l= | List npm packages | +| ~npm-mode-npm-run~ | =SPC m n r= | Run npm task | +| ~npm-mode-visit-project-file~ | =SPC m n v= | Find file in npm project | From e75b7f520a6c76e1be89a3e6b0cd8f03d328f88a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 17:06:36 -0400 Subject: [PATCH 4210/4235] Add :lang agda to init.example.el --- init.example.el | 1 + 1 file changed, 1 insertion(+) diff --git a/init.example.el b/init.example.el index 8096291c9..d65856947 100644 --- a/init.example.el +++ b/init.example.el @@ -83,6 +83,7 @@ ;;vterm ; another terminals in Emacs :lang + ;;agda ; types of types of types of types... ;;assembly ; assembly for fun or debugging ;;(cc +irony +rtags); C/C++/Obj-C madness ;;clojure ; java with a lisp From 79ee09d65b7f396bfd6b9e4c22f9873a912c3a38 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 17:26:26 -0400 Subject: [PATCH 4211/4235] Replace :ui evil-goggles w/ :ui ophints Now offers op hinting for non-evil users. --- core/core-modules.el | 3 ++- init.example.el | 4 ++-- modules/ui/evil-goggles/README.org | 16 ------------- modules/ui/evil-goggles/packages.el | 5 ---- modules/ui/ophints/README.org | 23 +++++++++++++++++++ .../ui/{evil-goggles => ophints}/config.el | 12 +++++++++- modules/ui/ophints/packages.el | 6 +++++ 7 files changed, 44 insertions(+), 25 deletions(-) delete mode 100644 modules/ui/evil-goggles/README.org delete mode 100644 modules/ui/evil-goggles/packages.el create mode 100644 modules/ui/ophints/README.org rename modules/ui/{evil-goggles => ophints}/config.el (57%) create mode 100644 modules/ui/ophints/packages.el diff --git a/core/core-modules.el b/core/core-modules.el index 75d6ed623..46ba3d029 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -19,7 +19,8 @@ (:emacs (electric-indent (:emacs electric)) (hideshow (:editor fold))) (:ui (doom-modeline (:ui modeline))) - (:ui (fci (:ui fill-column)))) + (:ui (fci (:ui fill-column))) + (:ui (evil-goggles (:ui ophints)))) "An alist of deprecated modules, mapping deprecated modules to an optional new location (which will create an alias). Each CAR and CDR is a (CATEGORY . MODULES). E.g. diff --git a/init.example.el b/init.example.el index d65856947..b38fd7718 100644 --- a/init.example.el +++ b/init.example.el @@ -22,17 +22,17 @@ doom ; what makes DOOM look the way it does doom-dashboard ; a nifty splash screen for Emacs doom-quit ; DOOM quit-message prompts when you quit Emacs - evil-goggles ; display visual hints when editing in evil ;;fill-column ; a `fill-column' indicator hl-todo ; highlight TODO/FIXME/NOTE tags ;;indent-guides ; highlighted indent columns modeline ; snazzy, Atom-inspired modeline, plus API nav-flash ; blink the current line after jumping ;;neotree ; a project drawer, like NERDTree for vim - treemacs ; a project drawer, like neotree but cooler + ophints ; highlight the region an operation acts on (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules + treemacs ; a project drawer, like neotree but cooler ;;pretty-code ; replace bits of code with pretty symbols ;;tabbar ; FIXME an (incomplete) tab bar for Emacs ;;unicode ; extended unicode support for various languages diff --git a/modules/ui/evil-goggles/README.org b/modules/ui/evil-goggles/README.org deleted file mode 100644 index a358d75be..000000000 --- a/modules/ui/evil-goggles/README.org +++ /dev/null @@ -1,16 +0,0 @@ -#+TITLE: :ui evil-goggles - -This module uses ~evil goggles~ to displays visual hints when editing with evil. - -* Table of Contents :TOC: -- [[#install][Install]] -- [[#configure][Configure]] - -* Install -This module requires: - -+ ~evil~ (inherently tied to evil mode) - -* Configure -By default, ~evil-goggles~ will be enabled by default and requires no additional configuration. - diff --git a/modules/ui/evil-goggles/packages.el b/modules/ui/evil-goggles/packages.el deleted file mode 100644 index a4140cf69..000000000 --- a/modules/ui/evil-goggles/packages.el +++ /dev/null @@ -1,5 +0,0 @@ -;; -*- no-byte-compile: t; -*- -;;; ui/evil-goggles/packages.el - -(when (featurep! :feature evil) - (package! evil-goggles)) diff --git a/modules/ui/ophints/README.org b/modules/ui/ophints/README.org new file mode 100644 index 000000000..49868b9b0 --- /dev/null +++ b/modules/ui/ophints/README.org @@ -0,0 +1,23 @@ +#+TITLE: ui/ophints +#+DATE: June 4, 2017 +#+SINCE: v2.0 +#+STARTUP: inlineimages + +* Table of Contents :TOC_3:noexport: +- [[#description][Description]] + - [[#module-flags][Module Flags]] + - [[#plugins][Plugins]] + +* Description +This module provides op-hints (operation hinting), i.e. visual feedback for +certain operations. It highlights regions of text that the last operation (like +yank) acted on. + +Uses ~evil-goggles~ for evil users and ~volatile-highlights~ otherwise. + +** Module Flags +This module provides no flags. + +** Plugins ++ [[https://github.com/edkolev/evil-goggles/][evil-goggles]]* ++ [[https://github.com/k-talo/volatile-highlights.el][volatile-highlights]]* diff --git a/modules/ui/evil-goggles/config.el b/modules/ui/ophints/config.el similarity index 57% rename from modules/ui/evil-goggles/config.el rename to modules/ui/ophints/config.el index df185ac11..1382822d5 100644 --- a/modules/ui/evil-goggles/config.el +++ b/modules/ui/ophints/config.el @@ -1,4 +1,4 @@ -;;; ui/evil-goggles/config.el -*- lexical-binding: t; -*- +;;; ui/ophints/config.el -*- lexical-binding: t; -*- (def-package! evil-goggles :when (featurep! :feature evil) @@ -12,3 +12,13 @@ evil-goggles-enable-change nil) :config (evil-goggles-mode +1)) + + +(def-package! volatile-highlights + :unless (featurep! :feature evil) + :after-call pre-command-hook + :config + (volatile-highlights-mode) + (after! undo-tree + (vhl/define-extension 'undo-tree 'undo-tree-yank 'undo-tree-move) + (vhl/install-extension 'undo-tree))) diff --git a/modules/ui/ophints/packages.el b/modules/ui/ophints/packages.el new file mode 100644 index 000000000..44502c727 --- /dev/null +++ b/modules/ui/ophints/packages.el @@ -0,0 +1,6 @@ +;; -*- no-byte-compile: t; -*- +;;; ui/ophints/packages.el + +(if (featurep! :feature evil) + (package! evil-goggles) + (package! volatile-highlights)) From d5b0ee14bc2faee8acdead1cb1c489e703f0ad7e Mon Sep 17 00:00:00 2001 From: Eric Solomon Date: Fri, 19 Apr 2019 18:34:25 -0500 Subject: [PATCH 4212/4235] Update Go module README --- modules/lang/go/README.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/go/README.org b/modules/lang/go/README.org index 39f9c2832..53cbe4192 100644 --- a/modules/lang/go/README.org +++ b/modules/lang/go/README.org @@ -64,7 +64,7 @@ This module requires a valid ~GOPATH~, and the following Go packages: #+BEGIN_SRC sh export GOPATH=~/work/go -go get -u github.com/motemen/gore +go get -u github.com/motemen/gore/cmd/gore go get -u github.com/mdempsky/gocode go get -u golang.org/x/tools/cmd/godoc go get -u golang.org/x/tools/cmd/goimports From 99c26e2fc25e17a130afd257c015fe56b412717b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 17:30:47 -0400 Subject: [PATCH 4213/4235] Allow doom-project-find-file on arbitrary paths - If DIR is not in a valid project, index it as normal and do projectile-find-file from current directory (but do not cache). - If DIR is a valid project, but not the project root, fall back to different mechanism for exploring it (project-find-file, counsel-file-jump, or find-file). - If DIR is a valid project AND is the project root, use projectile-find-file as normal. This is to make doom-project-find-file more do-what-I-mean. --- core/autoload/projects.el | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/core/autoload/projects.el b/core/autoload/projects.el index b1d5a3ab2..a27778ec1 100644 --- a/core/autoload/projects.el +++ b/core/autoload/projects.el @@ -88,22 +88,32 @@ Returns '-' if not in a valid project." ;;;###autoload (defun doom-project-find-file (dir) - "Fuzzy-find a file under DIR. + "Jump to a file in DIR (searched recursively). -Will resolve to the nearest project root above DIR. If no project can be found, -the search will be rooted from DIR." +If DIR is not a project, it will be indexed (but not cached)." (unless (file-directory-p dir) (error "Directory %S does not exist" dir)) - (let ((default-directory (file-truename (expand-file-name dir))) - (projectile-project-root - (or (doom-project-root dir) - default-directory))) - (call-interactively - ;; Intentionally avoid `helm-projectile-find-file', because it runs - ;; asynchronously, and thus doesn't see the lexical `default-directory' - (if (featurep! :completion ivy) - #'counsel-projectile-find-file - #'projectile-find-file)))) + (let* ((default-directory (file-truename (expand-file-name dir))) + (project-root (doom-project-root default-directory)) + (projectile-project-root default-directory) + (projectile-enable-caching projectile-enable-caching)) + (cond ((and project-root (file-equal-p project-root projectile-project-root)) + (unless (doom-project-p projectile-project-root) + ;; Disable caching if this is not a real project; caching + ;; non-projects easily has the potential to inflate the projectile + ;; cache beyond reason. + (setq projectile-enable-caching nil)) + (call-interactively + ;; Intentionally avoid `helm-projectile-find-file', because it runs + ;; asynchronously, and thus doesn't see the lexical `default-directory' + (if (featurep! :completion ivy) + #'counsel-projectile-find-file + #'projectile-find-file))) + ((fboundp 'project-find-file-in) ; emacs 26.1+ only + (project-find-file-in nil (list default-directory) nil)) + ((fboundp 'counsel-file-jump) ; ivy only + (call-interactively #'counsel-file-jump)) + ((call-interactively #'find-file))))) ;;;###autoload (defun doom-project-browse (dir) From d6839fc4c6bfd775e869f9666eb1e0414e00770c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 19:54:14 -0400 Subject: [PATCH 4214/4235] Remove references to old scratch buffer functions --- modules/app/calendar/autoload.el | 2 +- modules/config/default/+emacs-bindings.el | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/app/calendar/autoload.el b/modules/app/calendar/autoload.el index 81530ca5f..3aa68053d 100644 --- a/modules/app/calendar/autoload.el +++ b/modules/app/calendar/autoload.el @@ -21,7 +21,7 @@ (+workspace/display)) (setq +calendar--wconf (current-window-configuration)) (delete-other-windows) - (doom/switch-to-scratch-buffer) + (switch-to-buffer (doom-fallback-buffer)) (+calendar--init))) ;;;###autoload diff --git a/modules/config/default/+emacs-bindings.el b/modules/config/default/+emacs-bindings.el index cd14f0cdb..201a55890 100644 --- a/modules/config/default/+emacs-bindings.el +++ b/modules/config/default/+emacs-bindings.el @@ -52,10 +52,10 @@ ;;; Leader keys (map! :leader - :desc "Find file in project" "C-f" #'projectile-find-file - :desc "Evaluate line/region" "e" #'+eval/line-or-region - :desc "Pop up scratch buffer" "x" #'doom/open-to-scratch-buffer - :desc "Switch to scratch buffer" "X" #'doom/switch-to-scratch-buffer + :desc "Find file in project" "C-f" #'projectile-find-file + :desc "Evaluate line/region" "e" #'+eval/line-or-region + :desc "Open scratch buffer" "x" #'doom/open-scratch-buffer + :desc "Open project scratch buffer" "X" #'doom/open-project-scratch-buffer (:when (featurep! :emacs term) :desc "Terminal" "`" #'+term/open From 123f7174ed61981b7be9ede1d1d26e3fca646e27 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 19:55:25 -0400 Subject: [PATCH 4215/4235] Revise docstrings for scratch buffer commands --- core/autoload/scratch.el | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/autoload/scratch.el b/core/autoload/scratch.el index 95c731784..660ad30d0 100644 --- a/core/autoload/scratch.el +++ b/core/autoload/scratch.el @@ -88,7 +88,9 @@ following: (defun doom/open-scratch-buffer (&optional arg project-p) "Opens the (persistent) scratch buffer in a popup. -If ARG, switch to it in the current window." +If passed the prefix ARG, switch to it in the current window. +If PROJECT-P is non-nil, open a persistent scratch buffer associated with the + current project." (interactive "P") (let (projectile-enable-caching) (funcall @@ -113,7 +115,7 @@ If ARG, switch to it in the current window." (defun doom/open-project-scratch-buffer (&optional arg) "Opens the (persistent) project scratch buffer in a popup. -If ARG, switch to it in the current window." +If passed the prefix ARG, switch to it in the current window." (interactive "P") (doom/open-scratch-buffer arg 'project)) From c849495849e0ff9110aebc5c97ef131d091879ce Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 20:51:09 -0400 Subject: [PATCH 4216/4235] SPC q q = quit normally; SPC q Q = force quit --- modules/config/default/+evil-bindings.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index ba9dd1d59..e67822207 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -744,8 +744,8 @@ :desc "Open shell in project" "s" #'projectile-run-shell)) (:prefix ("q" . "session") - :desc "Quit Emacs" "q" #'evil-quit-all - :desc "Save and quit Emacs" "Q" #'evil-save-and-quit + :desc "Quit Emacs" "q" #'save-buffers-kill-terminal + :desc "Quit Emacs without saving" "Q" #'evil-quit-all-with-error-code :desc "Quick save current session" "s" #'doom/quicksave-session :desc "Restore last session" "l" #'doom/quickload-session :desc "Save session to file" "S" #'doom/save-session From d1ab86c38c83b5ec867fc09e4fef112b56472c6e Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 20:53:22 -0400 Subject: [PATCH 4217/4235] Revise project & general find-file keybinds Changes - SPC f . -> Browse files from here - SPC f / -> Find file from here (recursive) Moves - SPC f > -> SPC p > (Find file in another project) - SPC f ? -> SPC p ? (Browse files in another project w/ find-file) --- modules/config/default/+evil-bindings.el | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index e67822207..af7e47840 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -592,11 +592,11 @@ :desc "List errors" "x" #'flycheck-list-errors) (:prefix ("f" . "file") - :desc "Find file" "." (if (fboundp 'counsel-file-jump) #'counsel-file-jump #'find-file) - :desc "Find file in other project" ">" #'doom/browse-in-other-project - :desc "Find file in project" "/" #'projectile-find-file - :desc "Find file in other project" "?" #'doom/find-file-in-other-project - :desc "Find other file" "a" #'projectile-find-other-file + :desc "Find file" "." #'find-file + :desc "Find file from here" "/" + (if (featurep! :completion ivy) + #'counsel-file-jump + (λ! (doom-project-find-file nil (list default-directory) nil))) :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig :desc "Find directory" "d" #'dired :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd @@ -723,13 +723,14 @@ (:prefix ("p" . "project") :desc "Browse project" "." #'+default/browse-project + :desc "Find file in other project" ">" #'doom/find-file-in-other-project :desc "Find file in project" "/" #'projectile-find-file + :desc "Browse other project" "?" #'doom/browse-in-other-project :desc "Run cmd in project root" "!" #'projectile-run-shell-command-in-root :desc "Add new project" "a" #'projectile-add-known-project :desc "Switch to project buffer" "b" #'projectile-switch-to-buffer :desc "Compile in project" "c" #'projectile-compile-project :desc "Remove known project" "d" #'projectile-remove-known-project - :desc "Find file in known project" "f" #'projectile-find-file-in-known-projects :desc "Kill project buffers" "k" #'projectile-kill-buffers :desc "Invalidate project cache" "i" #'projectile-invalidate-cache :desc "Find other file" "o" #'projectile-find-other-file From d811f58ed2af9ff06dde927b81f9da34befbf4ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 20:55:44 -0400 Subject: [PATCH 4218/4235] +lookup/documentation -> lsp-describe-thing-at-point More reliable in lsp-mode --- modules/tools/lsp/config.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/lsp/config.el b/modules/tools/lsp/config.el index a242dfdd7..87305a95f 100644 --- a/modules/tools/lsp/config.el +++ b/modules/tools/lsp/config.el @@ -5,8 +5,8 @@ lsp-keep-workspace-alive nil) (after! lsp-mode - (set-lookup-handlers! 'lsp-mode - :documentation #'lsp-describe-thing-at-point) + (define-key lsp-mode-map + [remap +lookup/documentation] #'lsp-describe-thing-at-point) ;; Don't prompt to restart LSP servers while quitting Emacs (add-hook! 'kill-emacs-hook (setq lsp-restart 'ignore))) From 37cd50ac804ebdbab96d1280622c633cf142d3cf Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 19 Apr 2019 20:57:02 -0400 Subject: [PATCH 4219/4235] Revert e9f788cf The hook is harmless. --- modules/ui/modeline/config.el | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/ui/modeline/config.el b/modules/ui/modeline/config.el index d67afce00..e66bdeebd 100644 --- a/modules/ui/modeline/config.el +++ b/modules/ui/modeline/config.el @@ -49,7 +49,6 @@ (if (eq major-mode 'magit-status-mode) (doom-modeline-set-project-modeline) (hide-mode-line-mode))) - (remove-hook 'magit-mode-hook #'doom-modeline-set-project-modeline) (add-hook 'magit-mode-hook #'+modeline|hide-in-non-status-buffer) ;; Show indentation style in modeline. I'm not using From ee754362a2976d93ce695420110a5cb60e6f566b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 02:13:56 -0400 Subject: [PATCH 4220/4235] Fix SPC f / for non-ivy users Incorrect function signature for doom-project-find-file --- modules/config/default/+evil-bindings.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index af7e47840..6c9097944 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -596,7 +596,7 @@ :desc "Find file from here" "/" (if (featurep! :completion ivy) #'counsel-file-jump - (λ! (doom-project-find-file nil (list default-directory) nil))) + (λ! (doom-project-find-file default-directory))) :desc "Open project editorconfig" "c" #'editorconfig-find-current-editorconfig :desc "Find directory" "d" #'dired :desc "Find file in emacs.d" "e" #'+default/find-in-emacsd From 7e7d6ae5a2a2dc14483e6bd45c989ad334f29998 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 02:15:14 -0400 Subject: [PATCH 4221/4235] Fix hydra-ivy keybind on M-o #1342 --- modules/completion/ivy/autoload/hydras.el | 58 +++++++++-------------- modules/completion/ivy/config.el | 7 ++- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/modules/completion/ivy/autoload/hydras.el b/modules/completion/ivy/autoload/hydras.el index 45647536c..afe09e393 100644 --- a/modules/completion/ivy/autoload/hydras.el +++ b/modules/completion/ivy/autoload/hydras.el @@ -1,43 +1,31 @@ ;;; completion/ivy/autoload/hydras.el -*- lexical-binding: t; -*- -;;;###autoload (autoload '+ivy-coo-hydra/body "completion/ivy/autoload/hydras" nil t) -(defhydra +ivy-coo-hydra (:hint nil :color pink) - " +;;;###autoload +(after! ivy-hydra + (defhydra+ hydra-ivy (:hint nil :color pink) + " Move ^^^^^^^^^^ | Call ^^^^ | Cancel^^ | Options^^ | Action _w_/_s_/_a_: %s(ivy-action-name) ----------^^^^^^^^^^-+--------------^^^^-+-------^^-+--------^^-+--------------------------------- _g_ ^ ^ _k_ ^ ^ _u_ | _f_orward _o_ccur | _i_nsert | _c_alling: %-7s(if ivy-calling \"on\" \"off\") _C_ase-fold: %-10`ivy-case-fold-search ^↨^ _h_ ^+^ _l_ ^↕^ | _RET_ done ^^ | _q_uit | _m_atcher: %-7s(ivy--matcher-desc) _t_runcate: %-11`truncate-lines _G_ ^ ^ _j_ ^ ^ _d_ | _TAB_ alt-done ^^ | ^ ^ | _<_/_>_: shrink/grow " - ;; arrows - ("j" ivy-next-line) - ("k" ivy-previous-line) - ("l" ivy-alt-done) - ("h" ivy-backward-delete-char) - ("g" ivy-beginning-of-buffer) - ("G" ivy-end-of-buffer) - ("d" ivy-scroll-up-command) - ("u" ivy-scroll-down-command) - ("e" ivy-scroll-down-command) - ;; actions - ("q" keyboard-escape-quit :exit t) - ("C-g" keyboard-escape-quit :exit t) - ("" keyboard-escape-quit :exit t) - ("C-o" nil) - ("i" nil) - ("TAB" ivy-alt-done :exit nil) - ("C-j" ivy-alt-done :exit nil) - ("RET" ivy-done :exit t) - ("C-m" ivy-done :exit t) - ("C-SPC" ivy-call-and-recenter :exit nil) - ("f" ivy-call) - ("c" ivy-toggle-calling) - ("m" ivy-toggle-fuzzy) - (">" ivy-minibuffer-grow) - ("<" ivy-minibuffer-shrink) - ("w" ivy-prev-action) - ("s" ivy-next-action) - ("a" ivy-read-action) - ("t" (setq truncate-lines (not truncate-lines))) - ("C" ivy-toggle-case-fold) - ("o" ivy-occur :exit t)) + ;; arrows + ("l" ivy-alt-done) + ("h" ivy-backward-delete-char) + ("g" ivy-beginning-of-buffer) + ("G" ivy-end-of-buffer) + ("d" ivy-scroll-up-command) + ("u" ivy-scroll-down-command) + ("e" ivy-scroll-down-command) + ;; actions + ("q" keyboard-escape-quit :exit t) + ("" keyboard-escape-quit :exit t) + ("TAB" ivy-alt-done :exit nil) + ("RET" ivy-done :exit t) + ("C-SPC" ivy-call-and-recenter :exit nil) + ("f" ivy-call) + ("c" ivy-toggle-calling) + ("m" ivy-toggle-fuzzy) + ("t" (setq truncate-lines (not truncate-lines))) + ("o" ivy-occur :exit t))) diff --git a/modules/completion/ivy/config.el b/modules/completion/ivy/config.el index a4decf40b..992b8aac2 100644 --- a/modules/completion/ivy/config.el +++ b/modules/completion/ivy/config.el @@ -77,11 +77,14 @@ immediately runs it on the current candidate (ending the ivy session)." (ivy-mode +1) (def-package! ivy-hydra - :commands (ivy-dispatching-done-hydra ivy--matcher-desc) + :commands (ivy-dispatching-done-hydra ivy--matcher-desc ivy-hydra/body) :init (define-key! ivy-minibuffer-map "C-o" #'ivy-dispatching-done-hydra - "M-o" #'+ivy-coo-hydra/body))) + "M-o" #'hydra-ivy/body) + :config + ;; ivy-hydra rebinds this, so we have to do so again + (define-key ivy-minibuffer-map (kbd "M-o") #'hydra-ivy/body))) (def-package! ivy-rich From 3e74b339c7456fe2b7edeae088ee38f962ef8987 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 02:17:51 -0400 Subject: [PATCH 4222/4235] Revise featurep! docstring & error message --- core/core-modules.el | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 46ba3d029..5873a1309 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -427,8 +427,9 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." ,category ',module)))) (defmacro featurep! (category &optional module flag) - "Returns t if CATEGORY MODULE is enabled. If FLAG is provided, returns t if -CATEGORY MODULE has FLAG enabled. + "Returns t if CATEGORY MODULE is enabled. + +If FLAG is provided, returns t if CATEGORY MODULE has FLAG enabled. (featurep! :config default) @@ -437,8 +438,8 @@ Module FLAGs are set in your config's `doom!' block, typically in :config (default +flag1 -flag2) -When this macro is used from inside a module, CATEGORY and MODULE can be -omitted. eg. (featurep! +flag1)" +CATEGORY and MODULE can be omitted When this macro is used from inside a module +(except your DOOMDIR, which is a special moduel). e.g. (featurep! +flag)" (and (cond (flag (memq flag (doom-module-get category module :flags))) (module (doom-module-p category module)) (doom--current-flags (memq category doom--current-flags)) @@ -446,7 +447,7 @@ omitted. eg. (featurep! +flag1)" (or doom--current-module (doom-module-from-path (FILE!))))) (unless module-pair - (error "featurep! couldn't detect what module its in! (in %s)" (FILE!))) + (error "featurep! call couldn't auto-detect what module its in (from %s)" (FILE!))) (memq category (doom-module-get (car module-pair) (cdr module-pair) :flags))))) t)) From f61e0aa00cfa64ff867254a5e46f17fb60606db6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 02:18:17 -0400 Subject: [PATCH 4223/4235] Use outline-mode comment headings in core.el --- core/core.el | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/core/core.el b/core/core.el index e9a797283..2df7dd7e5 100644 --- a/core/core.el +++ b/core/core.el @@ -11,7 +11,7 @@ line or use --debug-init to enable this.") ;; -;; Constants +;;; Constants (defconst doom-version "2.0.9" "Current version of DOOM emacs.") @@ -86,7 +86,7 @@ MacOS users).") ;; -;; Doom core variables +;;; Doom core variables (defvar doom-init-p nil "Non-nil if `doom-initialize' has run.") @@ -121,7 +121,7 @@ Doom was setup, which can cause problems.") ;; -;; Custom error types +;;; Custom error types (define-error 'doom-error "Error in Doom Emacs core") (define-error 'doom-hook-error "Error in a Doom startup hook" 'doom-error) @@ -132,14 +132,14 @@ Doom was setup, which can cause problems.") ;; -;; Custom hooks +;;; Custom hooks (defvar doom-reload-hook nil "A list of hooks to run when `doom/reload' is called.") ;; -;; Emacs core configuration +;;; Emacs core configuration ;; UTF-8 as the default coding system (when (fboundp 'set-charset-priority) @@ -260,7 +260,7 @@ never triggered." ;; -;; Incremental lazy-loading +;;; Incremental lazy-loading (defvar doom-incremental-packages '(t) "A list of packages to load incrementally after startup. Any large packages @@ -327,7 +327,7 @@ If this is a daemon session, load them all immediately instead." ;; -;; Bootstrap helpers +;;; Bootstrap helpers (defun doom-try-run-hook (hook) "Run HOOK (a hook function), but handle errors better, to make debugging @@ -395,10 +395,6 @@ If RETURN-P, return the message as a string instead of displaying it." 'window-setup-hook)) (run-hook-wrapped hook #'doom-try-run-hook))) - -;; -;; Bootstrap functions - (defun doom-initialize-autoloads (file) "Tries to load FILE (an autoloads file). Return t on success, throws an error in interactive sessions, nil otherwise (but logs a warning)." @@ -494,7 +490,7 @@ to least)." ;; -;; Bootstrap Doom +;;; Bootstrap Doom (eval-and-compile (require 'subr-x) From fc2e0e3970da6f3e1e5c06cff9e943f984948a61 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 11:43:46 -0400 Subject: [PATCH 4224/4235] Update modules/README.org And alphabetize treemacs in init.example.el --- init.example.el | 2 +- modules/README.org | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/init.example.el b/init.example.el index b38fd7718..32c4f4c32 100644 --- a/init.example.el +++ b/init.example.el @@ -32,9 +32,9 @@ (popup ; tame sudden yet inevitable temporary windows +all ; catch all popups that start with an asterix +defaults) ; default popup rules - treemacs ; a project drawer, like neotree but cooler ;;pretty-code ; replace bits of code with pretty symbols ;;tabbar ; FIXME an (incomplete) tab bar for Emacs + treemacs ; a project drawer, like neotree but cooler ;;unicode ; extended unicode support for various languages vc-gutter ; vcs diff in the fringe vi-tilde-fringe ; fringe tildes to mark beyond EOB diff --git a/modules/README.org b/modules/README.org index a660b4c6a..5f404b293 100644 --- a/modules/README.org +++ b/modules/README.org @@ -38,16 +38,17 @@ Aesthetic modules that affect the Emacs interface or user experience. + [[file:ui/doom/README.org][doom]]: + [[file:ui/doom-dashboard/README.org][doom-dashboard]]: + [[file:ui/doom-quit/README.org][doom-quit]]: -+ [[file:ui/evil-goggles/README.org][evil-goggles]]: -+ fci: ++ fill-column: + [[file:ui/hl-todo/README.org][hl-todo]]: ++ indent-guides: + [[file:ui/modeline/README.org][modeline]]: + [[file:ui/nav-flash/README.org][nav-flash]]: + [[file:ui/neotree/README.org][neotree]]: -+ treemacs: ++ [[file:ui/ophints/README.org][ophints]]: + [[file:ui/popup/README.org][popup]] =+all +defaults=: Makes temporary/disposable windows less intrusive + pretty-code: + [[file:ui/tabbar/README.org][tabbar]]: ++ treemacs: + [[file:ui/unicode/README.org][unicode]]: + vc-gutter: + vi-tilde-fringe: @@ -80,13 +81,13 @@ Small modules that give Emacs access to external tools & services. + docker: + [[file:tools/editorconfig/README.org][editorconfig]]: + [[file:tools/ein/README.org][ein]]: -+ flyspell: Spell checking + flycheck: Live error/warning highlights ++ flyspell: Spell checking + gist: + [[file:tools/lsp/README.org][lsp]]: + macos: -+ make: + magit: ++ make: + password-store: + pdf: + prodigy: @@ -100,6 +101,7 @@ Small modules that give Emacs access to external tools & services. * :lang Modules that bring support for a language or group of languages to Emacs. ++ agda: + assembly: + [[file:lang/cc/README.org][cc]] =+lsp=: + clojure: @@ -120,6 +122,7 @@ Modules that bring support for a language or group of languages to Emacs. + java =+meghanada=: + [[file:lang/javascript/README.org][javascript]] =+lsp=: + julia: ++ kotlin: + [[file:lang/latex/README.org][latex]]: + ledger: + lua: @@ -142,6 +145,7 @@ Modules that bring support for a language or group of languages to Emacs. + [[file:lang/sh/README.org][sh]] =+fish +lsp=: + [[file:lang/solidity/README.org][solidity]]: + swift: ++ terra: + web =+lsp=: + vala: @@ -152,7 +156,6 @@ Doom-specific porcelains. + calendar: + [[file:app/email/README.org][email]] =+gmail=: + [[file:app/irc/README.org][irc]]: -+ regex: + rss =+org=: + twitter: + [[file:app/write/README.org][write]] =+wordnut +langtool=: From 4278eb683fdbcdf37adabb2962c7848bdd54b139 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 15:29:34 -0400 Subject: [PATCH 4225/4235] Autoload projectile-add-known-projects This should be PRed upstream at some point --- core/core-projects.el | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core-projects.el b/core/core-projects.el index e8a71725b..a52bcbc95 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -18,7 +18,10 @@ Emacs.") (def-package! projectile :after-call (after-find-file dired-before-readin-hook minibuffer-setup-hook) - :commands (projectile-project-root projectile-project-name projectile-project-p) + :commands (projectile-project-root + projectile-project-name + projectile-project-p + projectile-add-known-project) ; TODO PR autoload upstream :init (setq projectile-cache-file (concat doom-cache-dir "projectile.cache") projectile-enable-caching (not noninteractive) From fa197115426ffea7323e1cf6bfba5f5be7ab64ef Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 16:20:59 -0400 Subject: [PATCH 4226/4235] Improve comment header for init.example.el --- init.example.el | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/init.example.el b/init.example.el index 32c4f4c32..c7cb7c8aa 100644 --- a/init.example.el +++ b/init.example.el @@ -1,5 +1,12 @@ ;;; init.el -*- lexical-binding: t; -*- -;; Copy me to ~/.doom.d/init.el or ~/.config/doom/init.el, then edit me! + +;; Copy this file to ~/.doom.d/init.el or ~/.config/doom/init.el ('doom +;; quickstart' will do this for you). The `doom!' block below controls what +;; modules are enabled and in what order they will be loaded. Remember to run +;; 'doom refresh' after modifying it. +;; +;; More information about these modules (and what flags they support) can be +;; found in modules/README.org. (doom! :feature ;;debugger ; FIXME stepping through code, to help you add bugs From a8c46e3136433788cd08b7cf381bf049fa5c444a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 20 Apr 2019 22:20:43 -0400 Subject: [PATCH 4227/4235] Update evil-collection-mode-list Adds disk-usage, omnisharp and process-menu --- modules/feature/evil/+everywhere.el | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/modules/feature/evil/+everywhere.el b/modules/feature/evil/+everywhere.el index 55b901d2f..71c2e09e2 100644 --- a/modules/feature/evil/+everywhere.el +++ b/modules/feature/evil/+everywhere.el @@ -2,10 +2,10 @@ ;; We load evil-collection ourselves for these reasons: ;; -;; 1. To truly lazy load it. Some of its modules, like the elisp-mode and -;; buff-menu ones are loaded immediately, because Emacs loads them -;; immediately, pulling in all of evil-collection and sometimes other -;; packages. +;; 1. To truly lazy load it. Some of its modules, like +;; evil-collection-{elisp-mode,buff-menu} are loaded immediately, because +;; Emacs loads their packages immediately, which pulls in all of +;; evil-collection (and other packages with it, sometimes). ;; 2. This ensures a predictable load order, versus lazy loading using :defer or ;; :after-call. This means users can use (after! org ...) and be sure that ;; their changes will override evil-collection's. @@ -42,6 +42,8 @@ variable for an explanation of the defaults (in comments). See `evil-collection-mode-list' for a list of available options.") +(defvar evil-collection-setup-minibuffer nil) + ;; This has to be defined here since evil-collection doesn't autoload its own. ;; It must be updated whenever evil-collection updates theirs. (defvar evil-collection-mode-list @@ -66,6 +68,7 @@ variable for an explanation of the defaults (in comments). See debug diff-mode dired + disk-usage doc-view ebib edbi @@ -112,14 +115,15 @@ variable for an explanation of the defaults (in comments). See man magit magit-todos - ,@(if (bound-and-true-p evil-collection-setup-minibuffer) '(minibuffer)) + ,@(when evil-collection-setup-minibuffer '(minibuffer)) mu4e mu4e-conversation neotree notmuch nov ;; occur is in replace.el which was built-in before Emacs 26. - (occur ,(if EMACS26+ 'replace "replace")) + (occur ,(if (<= emacs-major-version 25) "replace" 'replace)) + omnisharp outline p4 (package-menu package) @@ -127,6 +131,7 @@ variable for an explanation of the defaults (in comments). See (pdf pdf-view) popup proced + process-menu prodigy profiler python From 4e0802ee01a3d08af386919eb7e2a9fd34bab1b4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Apr 2019 00:03:44 -0400 Subject: [PATCH 4228/4235] Fix windows surviving creation of new workspaces Particularly windows that resist `delete-window`, like treemacs, when a new workspace is switched to. Relevant to #1348 --- modules/feature/workspaces/autoload/workspaces.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/feature/workspaces/autoload/workspaces.el b/modules/feature/workspaces/autoload/workspaces.el index 6dea52f23..61b602f36 100644 --- a/modules/feature/workspaces/autoload/workspaces.el +++ b/modules/feature/workspaces/autoload/workspaces.el @@ -137,7 +137,9 @@ Otherwise return t on success, nil otherwise." (let ((persp (persp-add-new name)) (+popup--inhibit-transient t)) (save-window-excursion - (delete-other-windows) + (let ((ignore-window-parameters t) + (+popup--inhibit-transient t)) + (delete-other-windows)) (switch-to-buffer (doom-fallback-buffer)) (setf (persp-window-conf persp) (funcall persp-window-state-get-function (selected-frame)))) From b7c02d5c0aa67c6f67c06490e3f8ab32edebd79b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Apr 2019 13:25:33 -0400 Subject: [PATCH 4229/4235] Half-revert ba23b63 #1349 --- modules/ui/popup/autoload/popup.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/ui/popup/autoload/popup.el b/modules/ui/popup/autoload/popup.el index 6105731b9..82c64c71c 100644 --- a/modules/ui/popup/autoload/popup.el +++ b/modules/ui/popup/autoload/popup.el @@ -403,8 +403,7 @@ the message buffer in a popup window." (+popup--inhibit-transient t) +popup--remember-last) (+popup/close window 'force) - (let (display-buffer-alist) - (pop-to-buffer buffer)))) + (display-buffer-pop-up-window buffer nil))) ;;;###autoload (defun +popup/diagnose () From cce55db6edfcc0aa8ce6e05c2955bb478402fd96 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Apr 2019 13:32:22 -0400 Subject: [PATCH 4230/4235] Remove display-buffer-reuse-window from default actions This would cause +popup/raise to reuse non-popup windows when raising popups. If this doesn't work, it may be necessary to write a specialized display-buffer-reuse-window to only reuse popups, specifically. --- modules/ui/popup/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/popup/config.el b/modules/ui/popup/config.el index 8861be67f..6f7b308f5 100644 --- a/modules/ui/popup/config.el +++ b/modules/ui/popup/config.el @@ -5,7 +5,7 @@ Modifying this has no effect, unless done before ui/popup loads.") (defvar +popup-default-display-buffer-actions - '(display-buffer-reuse-window +popup-display-buffer-stacked-side-window) + '(+popup-display-buffer-stacked-side-window) "The functions to use to display the popup buffer.") (defvar +popup-default-alist From 03b76e1789c9e05d9ef517a65b8c490888328977 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Apr 2019 16:57:35 -0400 Subject: [PATCH 4231/4235] Fix deprecated modules not passing on their flags Also fixes redundant deprecated-module warnings from 'bin/doom refresh'. --- core/core-modules.el | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 5873a1309..433fcc4cb 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -11,6 +11,9 @@ doom-modules-dir) "A list of module root directories. Order determines priority.") +(defvar doom-inhibit-module-warnings (not noninteractive) + "If non-nil, don't emit deprecated or missing module warnings at startup.") + (defconst doom-obsolete-modules '((:feature (version-control (:emacs vc) (:ui vc-gutter)) (spellcheck (:tools flyspell)) @@ -309,7 +312,8 @@ to least)." (make-hash-table :test 'equal :size (if modules (length modules) 150) :rehash-threshold 1.0))) - (let (category m) + (let ((inhibit-message doom-inhibit-module-warnings) + category m) (while modules (setq m (pop modules)) (cond ((keywordp m) (setq category m)) @@ -321,16 +325,22 @@ to least)." (new (assq module obsolete))) (let ((newkeys (cdr new))) (if (null newkeys) - (message "Warning: the %s module is deprecated" key) - (message "Warning: the %s module is deprecated. Use %s instead." + (message "WARNING %s is deprecated" key) + (message "WARNING %s is deprecated, enabling %s instead" (list category module) newkeys) (push category modules) (dolist (key newkeys) - (setq modules (append key modules))) + (push (if flags + (nconc (cdr key) flags) + (cdr key)) + modules) + (push (car key) modules)) (throw 'doom-modules t)))) (if-let* ((path (doom-module-locate-path category module))) (doom-module-set category module :flags flags :path path) - (message "Warning: couldn't find the %s %s module" category module)))))))) + (message "WARNING Couldn't find the %s %s module" category module)))))))) + (when noninteractive + (setq doom-inhibit-module-warnings t)) `(setq doom-modules ',doom-modules)) (defvar doom-disabled-packages) From ff42cf076741fffefc5b05058d4344233127c613 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 21 Apr 2019 19:35:27 -0400 Subject: [PATCH 4232/4235] Rewrite require! and change depends-on! depends-on! was changed to no longer load a specified module's packages.el, but to preform a module-enabled assertion. It emits an error if the linked module isn't (or specified flags aren't) enabled. --- core/core-modules.el | 29 ++++++++++++++++++----------- core/core-packages.el | 31 +++++++++++++++++++------------ 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/core/core-modules.el b/core/core-modules.el index 433fcc4cb..8fb3f5c7d 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -409,22 +409,29 @@ to have them return non-nil (or exploit that to overwrite Doom's config)." (substring (symbol-name when) 1))) ,@body))) -(defmacro require! (category module &rest plist) - "Loads the module specified by CATEGORY (a keyword) and MODULE (a symbol)." - `(let ((module-path (doom-module-locate-path ,category ',module))) +(defmacro require! (category module &rest flags) + "Loads the CATEGORY MODULE module with FLAGS. + +CATEGORY is a keyword, MODULE is a symbol and FLAGS are symbols. + + (require! :lang php +lsp) + +This is for testing and internal use. This is not the correct way to enable a +module." + `(let ((doom-modules ,doom-modules) + (module-path (doom-module-locate-path ,category ',module))) (doom-module-set ,category ',module - ,@(when plist - (let ((old-plist (doom-module-get category module))) - (unless (plist-member plist :flags) - (plist-put plist :flags (plist-get old-plist :flags))) - (unless (plist-member plist :path) - (plist-put plist :path (or (plist-get old-plist :path) - (doom-module-locate-path category module))))) + ,@(let ((plist (doom-module-get category module))) + (when flags + (plist-put plist :flags flags)) + (unless (plist-member plist :path) + (plist-put plist :path (doom-module-locate-path category module))) plist)) (if (directory-name-p module-path) (condition-case-unless-debug ex - (let ((doom--current-module ',(cons category module))) + (let ((doom--current-module ',(cons category module)) + (doom--current-flags ',flags)) (load! "init" module-path :noerror) (let ((doom--stage 'config)) (load! "config" module-path :noerror))) diff --git a/core/core-packages.el b/core/core-packages.el index de4376e88..d237c0e9d 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -215,8 +215,7 @@ elsewhere." (not (memq ',name doom-disabled-packages))))))) (defmacro packages! (&rest packages) - "A convenience macro like `package!', but allows you to declare multiple -packages at once. + "A convenience macro for `package!' for declaring multiple packages at once. Only use this macro in a module's packages.el file." (doom--assert-stage-p 'packages #'packages!) @@ -234,19 +233,27 @@ Only use this macro in a module's packages.el file." (cl-loop for pkg in packages collect (macroexpand `(package! ,pkg :disable t))))) -(defmacro depends-on! (module submodule &optional flags) - "Declares that this module depends on another. +(defmacro depends-on! (category module &rest flags) + "Declares that this CATEGORY depends on another. -Only use this macro in a module's packages.el file. +Emits a warning if CATEGORY MODULE isn't enabled, or is enabled without FLAGS. -MODULE is a keyword, and SUBMODULE is a symbol. Under the hood, this simply -loads MODULE SUBMODULE's packages.el file." +Only use this macro in a CATEGORY's packages.el file." (doom--assert-stage-p 'packages #'depends-on!) - `(let ((doom-modules ,doom-modules) - (flags ,flags)) - (when flags - (doom-module-put ,module ',submodule :flags flags)) - (load! "packages" ,(doom-module-locate-path module submodule) t))) + `(let ((desired-flags ',flags)) + (unless (doom-module-locate-path ,category ',module) + (error "The '%s %s' module is required, but doesn't exist" + ,category ',module)) + (unless (doom-module-p ,category ',module) + (error "The '%s %s' module is required, but disabled" + ,category ',module)) + (let ((flags (doom-module-get ,category ',module :flags))) + (when (and desired-flags + (/= (length (cl-intersection flags desired-flags)) + (length desired-flags))) + (error "The '%s %s' module is missing the required %S flag(s)" + ,category ',module + (cl-set-difference desired-flags flags)))))) (provide 'core-packages) ;;; core-packages.el ends here From 4944668dfdc2c33be7a08f7cc6caa18a74d71c1b Mon Sep 17 00:00:00 2001 From: Alex Ragone Date: Sat, 13 Apr 2019 17:18:11 +1200 Subject: [PATCH 4233/4235] feat: added org-habit module Added a simple way to make the org-habit consistency graphs align to the right margin as well as being responsive to the width of the window. --- init.example.el | 1 + modules/lang/org/+habit.el | 29 +++++++++++++++++++++++++++++ modules/lang/org/config.el | 1 + 3 files changed, 31 insertions(+) create mode 100644 modules/lang/org/+habit.el diff --git a/init.example.el b/init.example.el index c7cb7c8aa..6117947ba 100644 --- a/init.example.el +++ b/init.example.el @@ -124,6 +124,7 @@ +babel ; running code in org +capture ; org-capture in and outside of Emacs +export ; Exporting org to whatever you want + +habit ; Keep track of your habits +present ; Emacs for presentations +protocol) ; Support for org-protocol:// links ;;perl ; write code no one else can comprehend diff --git a/modules/lang/org/+habit.el b/modules/lang/org/+habit.el new file mode 100644 index 000000000..352b96a72 --- /dev/null +++ b/modules/lang/org/+habit.el @@ -0,0 +1,29 @@ +;;; lang/org/+habit.el -*- lexical-binding: t; -*- + +(require 'org-habit) + +(defvar +org-habit-graph-padding 2 + "The padding added to the end of the consistency graph") + +(defvar +org-habit-min-width 30 + "Hides the consistency graph if the `org-habit-graph-column' is less than this value") + +(defvar +org-habit-graph-window-ratio 0.3 + "The ratio of the consistency graphs relative to the window width") + +(defun +org-habit-resize-graph() + "Right align and resize the consistency graphs based on `+org-habit-graph-window-ratio'" + (let* ((total-days (float (+ org-habit-preceding-days org-habit-following-days))) + (preceding-days-ratio (/ org-habit-preceding-days total-days)) + (graph-width (floor (* (window-width) +org-habit-graph-window-ratio))) + (preceding-days (floor (* graph-width preceding-days-ratio))) + (following-days (- graph-width preceding-days)) + (graph-column (- (window-width) (+ preceding-days following-days))) + (graph-column-adjusted (if (> graph-column +org-habit-min-width) + (- graph-column +org-habit-graph-padding) + nil))) + (setq-local org-habit-preceding-days preceding-days) + (setq-local org-habit-following-days following-days) + (setq-local org-habit-graph-column graph-column-adjusted))) + +(add-hook! 'org-agenda-mode-hook #'+org-habit-resize-graph) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index cfb8050d8..18ee476a3 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -514,5 +514,6 @@ conditions where a window's buffer hasn't changed at the time this hook is run." (if (featurep! +babel) (load! "+babel")) (if (featurep! +capture) (load! "+capture")) (if (featurep! +export) (load! "+export")) + (if (featurep! +habit) (load! "+habit")) (if (featurep! +present) (load! "+present")) (if (featurep! +protocol) (load! "+protocol"))) From ae0c0f283727d6ccd754fa6a12026eacefa9a13d Mon Sep 17 00:00:00 2001 From: Alex Ragone Date: Mon, 22 Apr 2019 17:14:28 +1200 Subject: [PATCH 4234/4235] refactor: lazy load and use conventions for hooks --- modules/lang/org/+habit.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/lang/org/+habit.el b/modules/lang/org/+habit.el index 352b96a72..02963d06d 100644 --- a/modules/lang/org/+habit.el +++ b/modules/lang/org/+habit.el @@ -1,7 +1,5 @@ ;;; lang/org/+habit.el -*- lexical-binding: t; -*- -(require 'org-habit) - (defvar +org-habit-graph-padding 2 "The padding added to the end of the consistency graph") @@ -11,8 +9,9 @@ (defvar +org-habit-graph-window-ratio 0.3 "The ratio of the consistency graphs relative to the window width") -(defun +org-habit-resize-graph() +(defun +org-habit|resize-graph() "Right align and resize the consistency graphs based on `+org-habit-graph-window-ratio'" + (require 'org-habit) (let* ((total-days (float (+ org-habit-preceding-days org-habit-following-days))) (preceding-days-ratio (/ org-habit-preceding-days total-days)) (graph-width (floor (* (window-width) +org-habit-graph-window-ratio))) @@ -26,4 +25,4 @@ (setq-local org-habit-following-days following-days) (setq-local org-habit-graph-column graph-column-adjusted))) -(add-hook! 'org-agenda-mode-hook #'+org-habit-resize-graph) +(add-hook 'org-agenda-mode-hook #'+org-habit|resize-graph) From 040cd18573bc050e9080b530f791e45dbd13c43d Mon Sep 17 00:00:00 2001 From: Eric Solomon Date: Tue, 23 Apr 2019 11:17:29 -0500 Subject: [PATCH 4235/4235] Correct Javascript module tide format mapping --- modules/lang/javascript/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d38dfa03f..dd2e2fa31 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -173,7 +173,7 @@ (map! :localleader :map tide-mode-map "R" #'tide-restart-server - "f" #'tide-reformat + "f" #'tide-format "rs" #'tide-rename-symbol "roi" #'tide-organize-imports))